commit e9b3977c77e7e152c14bcf075eaf0eb74063a520 Author: Azita Rahimi Date: Sat Jun 13 18:03:22 2026 +0330 contactus diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..b30cd2a --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,15 @@ +{ + "permissions": { + "allow": [ + "mcp__claude_ai_Figma__get_screenshot", + "mcp__claude_ai_Figma__get_design_context", + "Bash(python *)", + "Bash(python3 -c \"import json; data=json.load\\(open\\(r'C:\\\\Users\\\\front\\\\.claude\\\\projects\\\\C--Users-front-Desktop-inova-contactus\\\\755e9ec7-7b43-4816-9ef8-598d32a0795e\\\\tool-results\\\\mcp-claude_ai_Figma-get_design_context-1781008336660.txt'\\)\\); print\\(len\\(data\\), [d['type'] for d in data[:5]]\\)\")", + "Bash(py -3 -c \"import json; data=json.load\\(open\\(r'C:\\\\Users\\\\front\\\\.claude\\\\projects\\\\C--Users-front-Desktop-inova-contactus\\\\755e9ec7-7b43-4816-9ef8-598d32a0795e\\\\tool-results\\\\mcp-claude_ai_Figma-get_design_context-1781008336660.txt'\\)\\); print\\(len\\(data\\), [d['type'] for d in data[:5]]\\)\")", + "PowerShell($data = Get-Content 'C:\\\\Users\\\\front\\\\.claude\\\\projects\\\\C--Users-front-Desktop-inova-contactus\\\\755e9ec7-7b43-4816-9ef8-598d32a0795e\\\\tool-results\\\\mcp-claude_ai_Figma-get_design_context-1781008336660.txt' -Raw | ConvertFrom-Json; Write-Host \"Count: $\\($data.Count\\)\"; $data | Select-Object -First 5 | ForEach-Object { Write-Host \"type=$\\($_.type\\) textLen=$\\($_.text.Length\\)\" })", + "PowerShell(Out-File *)", + "PowerShell($data = Get-Content 'C:\\\\Users\\\\front\\\\.claude\\\\projects\\\\C--Users-front-Desktop-inova-contactus\\\\755e9ec7-7b43-4816-9ef8-598d32a0795e\\\\tool-results\\\\figma_text0.txt' -Raw; $totalLines = \\($data -split \"`n\"\\).Count; Write-Host \"Total lines: $totalLines\")", + "Bash(npx vite *)" + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..44da05a --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/settings.json +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..7cfa00f --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +dist/ +node_modules/ +public/ +*.min.js \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..bd686c7 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,13 @@ +{ + "semi": true, + "trailingComma": "es5", + "singleQuote": true, + "printWidth": 100, + "tabWidth": 2, + "useTabs": false, + "bracketSpacing": true, + "arrowParens": "always", + "endOfLine": "lf", + "embeddedLanguageFormatting": "auto", + "htmlWhitespaceSensitivity": "css" +} \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..2ff0d26 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["esbenp.prettier-vscode"], + "unwantedRecommendations": [] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..1be65d1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,19 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "editor.formatOnPaste": true, + "editor.tabSize": 2, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "files.associations": { + "*.xml": "html", + "*.svg": "html" + } +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..84a935f --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,150 @@ +# Inova Frontend + +Persian (RTL) frontend for the Inova WordPress theme. Pages are built as standalone HTML/CSS/JS in Vite, then ported to WordPress. No JS framework. + +## Stack + +- **Build:** Vite 8.x (multi-page, ES modules) +- **Formatter:** Prettier 3.x — singleQuote, semi, 2-space indent, LF +- **Font:** Yekan Bakh FaNum Pro (Persian, 8 weights) +- **Language:** Persian, RTL-first (`lang="fa" dir="rtl"`) + +## Folder Structure + +``` +src/ + core/ + fonts/yekanbakhpro/woff/ & woff2/ ← webfont files (8 weights each) + stylesheet/core.css ← PRIMARY source of truth for all styling + javascript/core.js ← shared JS utilities + assets/ + icons/ ← SVG icons + images/ + css/[page].css ← page layout styles + css/[page]-responsive.css ← page breakpoint overrides + js/[page].js ← page-specific JS + components/ ← reusable HTML components + templates/ ← page templates +``` + +## Core CSS — Source of Truth + +`src/core/stylesheet/core.css` defines everything global. **Always load it first**, before any page CSS. + +### Color Tokens + +```css +--color-primary: #0274b3 /* primary blue */ +--color-title: #1a1a2e /* headings */ +--color-text: #505068 /* paragraph text */ +--color-body-text: #6a6a6a /* secondary body text */ +--bg-gray: #f9f9f9 /* light gray backgrounds */ +--color-pastel-main: #c5d7ec /* pastel blue accent */ + +/* Blue scale */ +--blue-50 … --blue-800 /* lightest → darkest */ +--blue-500: #1796dc /* default link color */ +--blue-600: #0274b3 /* = --color-primary */ +``` + +### Typography Scale + +| Tag | Desktop | Mobile (≤767px) | Color | +|-----|---------|-----------------|-------| +| h1 | 36px | 24px | `--color-title` | +| h2 | 24px | 22px | `--color-title` | +| h3 | 22px | 18px | `--color-title` | +| h4 | 20px | 16px | `--color-title` | +| h5 | 15px | 14px | `--color-title` | +| p | 15px / line-height 1.75 | — | `--color-text` | +| a | color `--blue-500`, no underline | — | — | + +Font family and `direction: rtl` are applied globally — never redeclare them in page CSS. + +### Utility Classes (defined in core) + +- `.no-scrollbar` — hides scrollbar cross-browser + +### What Core Already Handles (do not repeat in page CSS) + +- `@font-face` declarations +- `box-sizing: border-box` universal reset +- `margin: 0; padding: 0` reset +- `direction: rtl` on all elements +- `scroll-behavior: smooth` +- `button` reset (no border/outline/background) +- `::selection` brand color +- Number input spinner removal +- Custom scrollbar styling + +## Adding a New Page + +1. Create `[page].html` in the project root +2. Create `src/assets/css/[page].css` and `[page]-responsive.css` +3. Create `src/assets/js/[page].js` +4. Register in `vite.config.js → build.rollupOptions.input` +5. Use this import order in HTML: + +```html + + + + +``` + +## CSS Conventions + +**Naming:** BEM-like, kebab-case — `.block-name`, `.block-element`, `.block--modifier` + +**Container pattern:** every section wraps content in `.container`: +```css +.container { + max-width: 1240px; + padding: 0 20px; + margin: 0 auto; +} +``` + +**Breakpoints** (use raw px values in `@media` — no CSS variable support in media queries): + +| Alias | Value | +|-------|--------| +| xxl | 1400px | +| xl | 1200px | +| lg | 992px | +| md | 768px | +| sm | 576px | + +Pre-stub all 5 breakpoints in the responsive file, even if empty. + +**Section comments** use `═══` ASCII dividers. + +**Tokens to use — and their correct names:** + +| Correct | Wrong (do not use) | +|---------|--------------------| +| `var(--color-title)` | `var(--clr-title)` | +| `var(--color-text)` | `var(--clr-text)` | +| `16px` (raw value) | `var(--sp-16)` — not defined | +| inherited font | `var(--font-primary)` — not defined | + +## Vite Path Aliases + +```js +@ → src/ +@core → src/core/ +@components → src/components/ +``` + +## HTML Conventions + +- `` +- `
` wraps `
` in page HTML +- Decorative elements get `aria-hidden="true"` +- Section comments inside HTML use `═══` ASCII dividers + +## Known Issues + +1. `contactus.css` uses undefined variables (`--sp-16`, `--font-primary`, `--clr-title`, `--clr-text`) — use the correct core token names above. +2. `@font-face` URLs for weights 800/900/950 in `core.css` have incorrect filenames with spaces — those font weights currently fail to load. +3. `contactus.html` is registered as key `"footer"` in `vite.config.js` — should be `"contactus"`. diff --git a/README.md b/README.md new file mode 100644 index 0000000..74077bc --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# Inova - Frontend + +فرانت‌اند قالب وردپرس پروژه Inova + +## درباره پروژه + +این ریپوزیتوری بخش فرانت‌اند قالب وردپرس پروژه اصلی است. اینجا تمام طراحی‌ها، کامپوننت‌ها و assetها با استفاده از Vite توسعه داده می‌شود. + +## نحوه راه‌اندازی پروژه + +### پیش‌نیازها + +- Node.js نسخه 18 یا بالاتر (نسخه 22 پیشنهاد میشه) +- ادیتور Vs Code +- نصب بودن اکستنشن prettier روی vs code +- نصب بودن git روی سیستم عامل + +### نصب و اجرا + +```bash +# کلون کردن پروژه +git clone https://dev.novindiyar.com/Inova-Agency/inova-frontend.git + +# ورود به پوشه +cd inova-frontend + +# نصب وابستگی‌ها +npm install + +# اجرای محیط توسعه +npm run dev +``` diff --git a/contactus.html b/contactus.html new file mode 100644 index 0000000..64a0d9b --- /dev/null +++ b/contactus.html @@ -0,0 +1,557 @@ + + + + + + + + + + تماس با ما - اینوا + + +
+
+ +
+
+
+ + + + + +
+

دغدغه و مسئله از شما، ایده و راه‌حل از ما!

+

+ دعوتید به یک چای گرم در دفتر اینوا تا دغدغه‌های کسب‌وکارتان را بررسی کنیم و با + رویکردی خلاقانه و داده‌محور، برایشان راه‌حل‌های اجرایی پیدا کنیم. +

+
+
+
+
+ + +
+
+
+ +
+
+

برای شروع همکاری آماده‌اید؟

+

+ در کمتر از ۲۴ ساعت ما با شما تماس خواهیم گرفت +

+
+ +
+
+
+ + + +
+ +
+ +
+
+ درخواست پروژه + + + + + + +
+
    +
  • درخواست پروژه
  • +
  • جلسه مشاوره
  • +
  • همکاری با اینوا
  • +
  • سایر موارد
  • +
+
+
+ +
+ + + +
+ +
+ + + +
+ +
+ + +
+ + +
+ +
+ +

درخواست شما با موفقیت ثبت شد

+

+ کارشناسان ما حداکثر تا ۲۴ ساعت آینده با شما تماس خواهند گرفت. جزئیات جلسه نیز + از طریق پیامک و ایمیل برای شما ارسال می‌شود. +

+ +
+ +
+
+ مورد تایید برندهای خلاق +
+
+
+
+ + + + + + + + +
+
+
+
+ + +
+ + +
+
+

راه‌های ارتباطی با ما

+

+ در هر زمان که نیاز داشتید، از طریق تلفن، ایمیل یا شبکه‌های اجتماعی با ما در + ارتباط باشید. +

+
+ +
+ +
+ +
+
+
+ تماس مستقیم با ما + + 021-91096311 | ساعت پاسخگویی: شنبه تا چهارشنبه: ۸ صبح تا + ۵ عصر + +
+ +
+
+ + +
+ +
+
+
+ ایمیل + Info@inova-agency.com +
+ +
+
+ +
+
+ +
+
+
+ کد پستی + 1518633969 +
+ +
+
+ +
+
+ +
+
+
+ آدرس شرکت + + تهران، بلوار نلسون ماندلا (جردن)، پایین‌تر از جهان کودک، خیابان ناوک، پلاک + ۱۲، طبقه سوم + +
+ +
+
+
+ +
+

ما را در شبکه‌های اجتماعی دنبال کنید

+ +
+
+
+
+
+ + +
+
+
+

مسیر ساده شروع همکاری با اینوا

+

+ از ثبت درخواست جلسه تا آغاز همکاری، در چند مرحله کوتاه و شفاف کنار شما هستیم تا + بهترین مسیر برای رشد کسب‌وکارتان را مشخص کنیم. +

+
+ +
+
+ +
+
+
+ + مرحله اول +
+

ثبت درخواست جلسه

+
+

+ از طریق فرم درخواست جلسه، اطلاعات اولیه پروژه یا کسب‌وکار خود را برای ما ارسال + می‌کنید تا تیم اینوا دید اولیه‌ای نسبت به نیازها و اهداف شما داشته باشد. +

+
+ + +
+
+
+ + مرحله دوم +
+

تماس و بررسی اولیه

+
+

+ پس از دریافت درخواست، تیم ما با شما تماس می‌گیرد تا جزئیات بیشتری درباره نیازها، + اهداف و شرایط پروژه بررسی شود و زمان مناسب برای جلسه طبق بازه شما شکل گیرد. +

+
+
+ +
+ +
+
+
+ + مرحله سوم +
+

برگزاری جلسه مشاوره

+
+

+ در جلسه مشاوره، وضعیت فعلی کسب‌وکار شما، فرصت‌های رشد و راهکارهای پیشنهادی اینوا + بررسی می‌شود تا بهترین مسیر همکاری مشخص گردد. +

+
+ + +
+
+
+ + مرحله چهارم +
+

نهایی‌سازی و شروع همکاری

+
+

+ پس از توافق بر سر استراتژی و خدمات مورد نیاز، قرارداد همکاری تنظیم شده و پروژه + به صورت رسمی آغاز می‌شود. +

+
+
+
+
+
+ + +
+ +
+
+
+ + diff --git a/index.html b/index.html new file mode 100644 index 0000000..6f6b375 --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + + + + Inova + + +
+

سلام دنیا

+
+ + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bfe917c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,889 @@ +{ + "name": "inova-frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "inova-frontend", + "version": "0.0.0", + "devDependencies": { + "prettier": "^3.8.3", + "vite": "^8.0.4" + } + }, + "node_modules/@emnapi/core": { + "version": "1.9.2", + "resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.9.2.tgz", + "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.9.2", + "resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.9.2.tgz", + "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.124.0", + "resolved": "https://registry.npmmirror.com/@oxc-project/types/-/types-0.124.0.tgz", + "integrity": "sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.15.tgz", + "integrity": "sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.15.tgz", + "integrity": "sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.15.tgz", + "integrity": "sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.15.tgz", + "integrity": "sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.15.tgz", + "integrity": "sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.15.tgz", + "integrity": "sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.9.2", + "@emnapi/runtime": "1.9.2", + "@napi-rs/wasm-runtime": "^1.1.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.15.tgz", + "integrity": "sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.15.tgz", + "integrity": "sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "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.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "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.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "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.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "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.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "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.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "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.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "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.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "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.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "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.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "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.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "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.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "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/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.10", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "dev": true, + "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/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/rolldown": { + "version": "1.0.0-rc.15", + "resolved": "https://registry.npmmirror.com/rolldown/-/rolldown-1.0.0-rc.15.tgz", + "integrity": "sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.124.0", + "@rolldown/pluginutils": "1.0.0-rc.15" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.15", + "@rolldown/binding-darwin-x64": "1.0.0-rc.15", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.15", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.15", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.15", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.15", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.15", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.15", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.15" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/vite": { + "version": "8.0.8", + "resolved": "https://registry.npmmirror.com/vite/-/vite-8.0.8.tgz", + "integrity": "sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.15", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..44bcb07 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "inova-frontend", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "devDependencies": { + "prettier": "^3.8.3", + "vite": "^8.0.4" + } +} diff --git a/public/.gitkeep b/public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/public/images/.gitkeep b/public/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/public/images/Map.png b/public/images/Map.png new file mode 100644 index 0000000..1eb7a3d Binary files /dev/null and b/public/images/Map.png differ diff --git a/public/images/logo 4.png b/public/images/logo 4.png new file mode 100644 index 0000000..a6fc1f4 Binary files /dev/null and b/public/images/logo 4.png differ diff --git a/public/images/logo 5.png b/public/images/logo 5.png new file mode 100644 index 0000000..6aa2cfc Binary files /dev/null and b/public/images/logo 5.png differ diff --git a/public/images/logo 6.png b/public/images/logo 6.png new file mode 100644 index 0000000..b4fe5d6 Binary files /dev/null and b/public/images/logo 6.png differ diff --git a/public/images/logo1.png b/public/images/logo1.png new file mode 100644 index 0000000..954a3fa Binary files /dev/null and b/public/images/logo1.png differ diff --git a/public/images/logo2.png b/public/images/logo2.png new file mode 100644 index 0000000..e40b847 Binary files /dev/null and b/public/images/logo2.png differ diff --git a/public/images/logo3.png b/public/images/logo3.png new file mode 100644 index 0000000..0cd21a7 Binary files /dev/null and b/public/images/logo3.png differ diff --git a/public/images/logo7.png b/public/images/logo7.png new file mode 100644 index 0000000..48854cd Binary files /dev/null and b/public/images/logo7.png differ diff --git a/public/images/logo8.png b/public/images/logo8.png new file mode 100644 index 0000000..d243e30 Binary files /dev/null and b/public/images/logo8.png differ diff --git a/src/assets/css/contactus-responsive.css b/src/assets/css/contactus-responsive.css new file mode 100644 index 0000000..bc80544 --- /dev/null +++ b/src/assets/css/contactus-responsive.css @@ -0,0 +1,174 @@ +/* ═══════════════════════════════════════════════════════ + xxl — 1400px +═══════════════════════════════════════════════════════ */ +@media screen and (max-width: 1400px) { +} + +/* ═══════════════════════════════════════════════════════ + xl — 1200px +═══════════════════════════════════════════════════════ */ +@media screen and (max-width: 1200px) { + .hero-content { + width: 90%; + max-width: 673px; + } + + .contact-info { + width: 460px; + } +} + +/* ═══════════════════════════════════════════════════════ + lg — 992px +═══════════════════════════════════════════════════════ */ +@media screen and (max-width: 992px) { + .hero-card { + height: auto; + min-height: 240px; + padding: 40px 24px; + } + + .hero-h1 { + font-size: 28px; + line-height: 42px; + } + + .contact-grid { + flex-direction: column; + gap: 32px; + } + + .contact-info { + width: 100%; + } + + .contact-form-wrapper { + width: 100%; + } + + .steps-row { + flex-direction: column; + gap: 16px; + } + + .step-card__title { + white-space: normal; + } +} + +/* ═══════════════════════════════════════════════════════ + md — 768px +═══════════════════════════════════════════════════════ */ +@media screen and (max-width: 768px) { + .hero-h1 { + font-size: 22px; + line-height: 36px; + } + + .hero-sub { + font-size: 14px; + } + + .contact-form-title__h2 { + font-size: 20px; + line-height: 30px; + } + + .form-row { + flex-direction: column; + gap: 16px; + } + + .steps-header__title { + font-size: 20px; + } + + .map-card { + height: 300px; + border-radius: 24px; + } + + .map-card__img { + border-radius: 24px; + } + + .map-card__nav { + right: 16px; + bottom: 16px; + gap: 8px; + } + + .map-nav-btn { + padding: 6px 10px; + } +} + +/* ═══════════════════════════════════════════════════════ + sm — 576px +═══════════════════════════════════════════════════════ */ +@media screen and (max-width: 576px) { + .hero-section { + padding-top: 24px; + padding-bottom: 32px; + } + + .hero-content { + width: 100%; + } + + .hero-h1 { + font-size: 20px; + line-height: 32px; + } + + .contact-item__label { + font-size: 13px; + } + + .contact-item__value { + font-size: 12px; + } + + .contact-social__icons { + flex-wrap: wrap; + justify-content: flex-start; + } + + .form-submit-btn { + width: 100%; + justify-content: center; + } + + .form-submit-row { + justify-content: stretch; + } + + .steps-grid { + gap: 16px; + } + + .step-card { + padding: 16px; + } + + .map-card { + height: 240px; + border-radius: 16px; + } + + .map-card__img { + border-radius: 16px; + } + + .map-nav-btn span { + display: none; + } + + .map-card__nav { + gap: 6px; + } + + .map-nav-btn { + padding: 8px; + } +} diff --git a/src/assets/css/contactus.css b/src/assets/css/contactus.css new file mode 100644 index 0000000..1250a2c --- /dev/null +++ b/src/assets/css/contactus.css @@ -0,0 +1,960 @@ +/* ═══════════════════════════════════════════════════════ + CONTAINER OVERRIDE +═══════════════════════════════════════════════════════ */ +.container { + max-width: 1240px; + padding: 0 20px; + margin: 0 auto; +} + +main { + padding-bottom: 80px; +} + +/* ═══════════════════════════════════════════════════════ + HERO +═══════════════════════════════════════════════════════ */ +.hero-section { + padding-top: 80px; + padding-bottom: 50px; +} + +.hero-card { + position: relative; + width: 100%; + height: 303px; + background-color: #eff6ff; + border-radius: 10px; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; +} + + +.hero-content { + position: relative; + z-index: 1; + width: 673px; + display: flex; + flex-direction: column; + gap: 16px; + text-align: center; +} + +.hero-h1 { + font-size: 36px; + font-weight: 700; + line-height: 54px; + color: var(--color-primary); +} + +.hero-sub { + font-size: 15px; + font-weight: 400; + line-height: 26px; + color: var(--color-text); +} + +.hero-circles { + position: absolute; + top: -59%; + right: 50%; + transform: translate(50%, -50%); + pointer-events: none; +} + +.circle { + position: absolute; + border-radius: 50%; + top: 50%; + right: 50%; + transform: translate(50%, -50%); +} +.circle--1 { width: 698px; height: 698px; background-color:rgba(216, 233, 255, 0.2);} +.circle--2 { width: 616px; height: 616px; background-color: rgba(216, 233, 255, 0.4); } +.circle--3 { width: 534px; height: 534px; background-color: rgba(216, 233, 255, 0.6); } +.circle--4 { width: 452px; height: 452px; background-color: rgba(216, 233, 255, 0.8); } + + +.hero-hollow { + position: absolute; + width: 403px; + height: 403px; + border-radius: 50%; + background-color: rgba(2, 116, 179, 0.12); + top: 75%; + transform: translateY(-50%); + pointer-events: none; + filter: blur(250px); +} +.hero-hollow--left { + left: -290px; +} +.hero-hollow--right { + right: -290px; + } + +.hero-dot-pattern { + position: absolute; + inset: 0; + background-image: radial-gradient(circle, var(--color-pastel-main) 1px, transparent 1px); + background-size: 24px 24px; + pointer-events: none; + opacity: 0.4; +} +.contactus-hands{ + position: absolute; + top: 50%; + right: 50%; + transform: translate(50%, -50%); +} + + + +/* ═══════════════════════════════════════════════════════ + CONTACT SECTION +═══════════════════════════════════════════════════════ */ +.contact-section { + margin-bottom: 100px; +} + +.contact-grid { + display: flex; + gap: 32px; + align-items: flex-start; +} + +/* ── Contact Info (left column) ── */ +.contact-info { + width: 550px; + flex-shrink: 0; + display: flex; + flex-direction: column; + gap: 24px; + padding-top: 24px; +} + +.contact-info__header { + display: flex; + flex-direction: column; + gap: 8px; + text-align: right; +} + +.contact-info__title { + font-size: 22px; + font-weight: 700; + line-height: 34px; + color: var(--color-title); +} + +.contact-info__subtitle { + font-size: 15px; + font-weight: 400; + line-height: 26px; + color: var(--color-text); +} + +.contact-items { + display: flex; + flex-direction: column; + gap: 16px; + padding-bottom: 16px; + border-bottom: 1px dashed #bdbdbd; +} + +.contact-item { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background-color: #f0f5fe; + border-radius: 10px; + text-decoration: none; + color: inherit; + transition: opacity 0.2s; + overflow: hidden; + min-height: 64px; +} + +.contact-item:hover { + opacity: 0.85; +} + +.contact-item--tall { + align-items: flex-start; + padding-top: 12px; + padding-bottom: 12px; +} + +.contact-item__link-btn { + flex-shrink: 0; + width: 24px; + height: 24px; + border-radius: 1000px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} + + +.contact-item__body { + flex: 1; + display: flex; + align-items: center; + gap: 8px; + min-width: 0; +} + +.contact-item__body--top { + align-items: center; +} + +.contact-item__texts { + flex: 1; + display: flex; + flex-direction: column; + gap: 4px; + text-align: right; + min-width: 0; +} + +.contact-item__label { + font-size: 14px; + font-weight: 700; + line-height: 22px; + color: var(--color-title); +} + +.contact-item__value { + font-size: 13px; + font-weight: 400; + line-height: 24px; + color: var(--color-body-text); +} + +.contact-item__value strong { + font-weight: 700; +} + +.contact-item__icon { + flex-shrink: 0; + width: 48px; + height: 48px; + background-color: var(--color-primary); + border-radius: 11px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; +} + +.contact-item__icon img { + width: 32px; + height: 32px; + object-fit: contain; +} + +/* ── Social Media ── */ +.contact-social { + display: flex; + flex-direction: column; + gap: 16px; + align-items:flex-start ; +} + +.contact-social__label { + font-size: 14px; + font-weight: 700; + line-height: 22px; + color: var(--color-text); + text-align: right; +} + +.contact-social__icons { + display: flex; + gap: 16px; + align-items: center; + justify-content: flex-end; +} + +.social-icon { + flex-shrink: 0; + width: 32px; + height: 32px; + background-color: #f3f8ff; + border-radius: 150px; + display: flex; + align-items: center; + justify-content: center; + overflow: hidden; + transition: background-color 0.2s; +} + +.social-icon:hover { + background-color: var(--color-pastel-main); +} + +.social-icon img { + width: 24px; + height: 24px; + object-fit: contain; +} + +/* ── Contact Form (right column) ── */ +.contact-form-wrapper { + flex: 1; + min-width: 0; + background-color: #fafcff; + padding: 24px; + display: flex; + flex-direction: column; + gap: 24px; +} + +.contact-form-title { + display: flex; + flex-direction: column; + gap: 9px; + text-align: right; +} + +.contact-form-title__h2 { + font-size: 24px; + font-weight: 700; + line-height: 36px; + color: var(--color-primary); +} + +.contact-form-title__sub { + font-size: 15px; + font-weight: 400; + line-height: 26px; + color: var(--color-text); +} + +.form-input input, +.form-text textarea { + border: 1px solid #ccc; + outline: none; + transition: all 0.3s ease; +} + +.form-input input:focus, +.form-text textarea:focus { + border-color: var(--color-primary); + background-color: #EAF7FF; +} +.error-message { + color: #DC2626; + font-size: 13px; + margin-top: 6px; + display: block; +} + +.input-error { + background-color: #FFEBEB !important; + border-color: #ef4444 !important; +} + + +/* ── Brands logos scroll ── */ +.form-brands { + display: flex; + flex-direction: column; + gap: 12px; +} + +.form-brands__header { + display: flex; + align-items: center; + gap: 12px; + margin-top: 24px; +} + +.form-brands__line { + flex: 1; + height: 1px; + background-color: #e0e0e0; +} + +.form-brands__label { + font-size: 14px; + font-weight: 700; + line-height: 22px; + color: var(--color-text); + white-space: nowrap; + text-align: right; +} + +.form-brands__logos { + height: 32px; + overflow: hidden; + position: relative; + + mask-image: linear-gradient( + 90deg, + transparent 0%, + black 8%, + black 92%, + transparent 100% + ); + + -webkit-mask-image: linear-gradient( + 90deg, + transparent 0%, + black 8%, + black 92%, + transparent 100% + ); +} + +.logos-track { + display: flex; + align-items: center; + gap: 40px; + justify-content: right; + animation: logos-scroll 18s linear infinite; + white-space: transform; + width: max-content; +} + +.logos-track img { + width: auto; + object-fit: contain; + flex-shrink: 0; + filter: grayscale(0.3); +} + +@keyframes logos-scroll { + from { transform: translateX(-1%); } + to { transform: translateX(50%); } +} + + + + + + + + + + + + + + + +form { + display: flex; + flex-wrap: wrap; + gap: 16px; +} +.form-input label, +.required-label { + font-size: 14px; + margin-bottom: 8px; + display: block; + color: #1a1a2e; +} +.required-label::after { + content: '*'; + color: #ff0000; + margin-left: 4px; +} +input, +.select-box, +textarea { + width: 100%; + border: 1px solid #dbdbdb; + border-radius: 8px; + padding: 0px 12px; + height: 38px; + font-size: 14px; + font-weight: 400; + line-height: 1.8; + color: var(--color-title); + background-color: #f9f9f9; +} +textarea { + min-height: 114px; + resize: vertical; +} +.form-input { + flex-basis: 48%; + position: relative; +} +.label { + display: block; + margin-bottom: 10px; + font-size: 18px; + font-weight: 500; + color: #222; +} +.custom-select { + position: relative; + width: 100%; + user-select: none; +} +.select-box { + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; + transition: 0.25s; +} +.selected-text { + font-size: 14px; + color: #222; + font-weight: 500; +} +.arrow { + display: flex; + transition: 0.25s; +} +.custom-select.active .arrow { + transform: rotate(180deg); +} +.options { + position: absolute; + right: 0; + width: 100%; + border-radius: 8px; + overflow: hidden; + list-style: none; + border: 1px solid #dbdbdb; + opacity: 0; + visibility: hidden; + z-index: 100; +} +.custom-select.active .options { + opacity: 1; + visibility: visible; +} +.option { + padding: 0px 12px; + height: 38px; + font-size: 17px; + transition: 0.2s; + background-color: #f9f9f9; + display: flex; + align-items: center; +} +.option.active { + background: var(--color-primary); + color: #fff; +} +.form-text { + flex-basis: 98%; +} +.form-btn { + background-color: var(--color-primary); + border: none; + border-radius: 10px; + padding: 10px 12px 10px 10px; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + cursor: pointer; + transition: 0.3s ease; +} +.form-btn-icon { + display: none; + align-items: center; + justify-content: center; + color: #000; +} +.form-btn.loading .btn-icon-default { + display: none; +} +.form-btn.loading .btn-icon-loading { + display: flex; +} +.btn-icon-default { + display: flex; +} +.spinner { + width: 24px; + height: 24px; + border: 4px solid #c5d7ec; + border-top-color: transparent; + border-radius: 50%; + box-sizing: border-box; + animation: spin 300ms linear infinite; +} +@keyframes spin { + to { + transform: rotate(360deg); + } +} +.btn-text { + color: #ffffff; + font-size: 16px; + font-weight: 400; +} +.form-section-right { + flex: 0 1 45%; +} +.form-section-text h2 { + margin-bottom: 16px; +} +.form-section-text p { + font-size: 15px; + font-weight: 400; + line-height: 1.7; + color: var(--color-body-text); +} +.form-img { + position: relative; +} +.form-img p { + position: absolute; + top: 28%; + right: 16%; + font-size: 56px; + font-weight: 700; + color: #c8dff9; +} +.form-img img { + max-width: 100%; + height: auto; + display: block; +} +.end-form-img { + left: 184px; + top: -28px; +} +.success-message { + display: none; +} +.success-message p { + margin-top: 16px; +} +.success-message h3 { + margin-top: 24px; +} +.success-btn { + margin-top: 24px; + border: none; + border-radius: 10px; + background-color: var(--color-primary); + color: #ffffff; + font-size: 16px; + font-weight: 500; + cursor: pointer; + padding: 10px 24px; + display: inline-flex; + align-items: center; + justify-content: center; +} +.success-message.visible { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; +} + + +/* ═══════════════════════════════════════════════════════ + PROCESS STEPS +═══════════════════════════════════════════════════════ */ +.steps-section { + padding-bottom: 100px; + +} + +.steps-header { + display: flex; + flex-direction: column; + gap: 8px; + text-align: center; + margin-bottom: 32px; +} + +.steps-header__title { + font-size: 24px; + font-weight: 700; + line-height: 36px; + color: var(--color-title); +} + +.steps-header__sub { + font-size: 15px; + font-weight: 400; + line-height: 26px; + color: var(--color-body-text); +} + +.steps-grid { + display: flex; + flex-direction: column; + gap: 22px; +} + +.steps-row { + display: flex; + gap: 24px; +} + +/* ─── Card base ─────────────────────────────────── */ +.step-card { + flex: 1; + position: relative; + display: flex; + flex-direction: column; + gap: 12px; + padding: 24px; + background-color: #f0f4fd; + border-radius: 16px; + overflow: hidden; + text-align: right; + transition: background-color 0.3s ease, color 0.3s ease; + background-image: url(/src/img/Vector\(1\).png); + z-index: 1; +} +/* .step-card::before { + content: ""; + position: absolute; + inset: 0; + + background: var(--color-primary); + + clip-path: polygon(100% 100%, 100% 100%, 100% 100%, 100% 100%); + transition: clip-path 0.6s cubic-bezier(0.22, 1, 0.36, 1); + + z-index: 0; +} + +.step-card:hover::before { + clip-path: polygon(30% 0, 100% 0, 100% 100%, 0 100%); +} */ + .step-card::before { + content: ""; + position: absolute; + + width: 400%; + height: 400%; + + right: -200%; + bottom: -200%; + + background: var(--color-primary); + border-radius: 50%; + + transform: scale(0); + transform-origin: bottom right; + + transition: transform 1.5s cubic-bezier(0.22, 1, 0.36, 1); + z-index: 0; +} + +.step-card:hover::before { + transform: scale(1); +} + + +.step-card > * { + position: relative; + z-index: 2; +} +/* ─── Badge (default) ───────────────────────────── */ +.step-card__badge { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 5px 10px; + border-radius: 32px; + font-size: 13px; + font-weight: 400; + line-height: 24px; + border: 1px solid var(--color-primary); + color: var(--color-primary); + white-space: nowrap; + transition: border-color 0.3s ease, color 0.3s ease; +} + +.step-card__icon { + width: 32px; + height: 32px; + object-fit: contain; + flex-shrink: 0; +} + +/* ─── Top wrapper ───────────────────────────────── */ +.step-card__top { + display: flex; + flex-direction: column; + gap: 8px; +} + +.step-card__meta { + display: flex; + align-items: center; + justify-content: space-between; +} + +/* ─── Title & description (default) ────────────── */ +.step-card__title { + font-size: 18px; + font-weight: 700; + line-height: 28px; + color: var(--color-text); + white-space: nowrap; + transition: color 0.3s ease; +} + +.step-card__desc { + font-size: 15px; + font-weight: 400; + line-height: 26px; + color: var(--color-body-text); + transition: color 0.3s ease; +} + +/* ─── Hover: ALL cards turn blue ────────────────── */ + +.step-card:hover::after { + opacity: 0.15; /* dim the pattern so it doesn't clash with the blue bg */ +} +.step-card__meta svg { + color: var(--color-primary) ; +} +.step-card:hover .step-card__meta svg { + color: #ffffff; +} +.step-card:hover .step-card__badge { + border-color: #ffffff; + color: #ffffff; +} + +.step-card:hover .step-card__title { + color: #ffffff; +} + +.step-card:hover .step-card__desc { + color: #ffffff; +} + +/* ═══════════════════════════════════════════════════════ + MAP +═══════════════════════════════════════════════════════ */ +.map-section { + padding-bottom: 80px; +} + +.map-card { + position: relative; + width: 100%; + height: 428px; + border-radius: 48px; + overflow: hidden; + box-shadow: + 0px 9.5px 15.8px 6.3px rgba(255, 255, 255, 0.05), + 0px 3.2px 4.7px 0px rgba(0, 0, 0, 0.1); + border: 1px solid rgba(255, 255, 255, 0.02); +} + +.map-card__img { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + display: block; + object-fit: cover; + border-radius: 48px; + pointer-events: none; +} + +.map-card__location { + position: absolute; + left: 56%; + top: 50%; + transform: translate(-40%, -50%); + width: 44px; + height: 44px; + display: flex; + align-items: center; + justify-content: center; + +} + +.map-location-dot { + position: relative; + display: block; + width: 12px; + height: 12px; + background-color: #0274B3; + border-radius: 50%; + border: 2.2px solid #ffffff; + z-index: 100; +} +.map-card__location::before, +.map-card__location::after { + content: ""; + position: absolute; + left: 50%; + top: 50%; + width: 12px; + height: 12px; + border-radius: 50%; + transform: translate(-50%, -50%); + background: #0274B3; + z-index: -1; + animation: locationPulse 2s infinite ease-out; + filter: blur(2px); +} +.map-location-dot::after { + animation-delay: 0s; +} +.map-card__location::after { + animation-delay: 0s; +} +@keyframes locationPulse { + 0% { + transform: translate(-50%, -50%) scale(1); + opacity: 0.9; + } + + 100% { + transform: translate(-50%, -50%) scale(5); + opacity: 0; + } +} +.map-card__nav { + position: absolute; + right: 40px; + bottom: 40px; + display: flex; + gap: 16px; + align-items: center; +} + +.map-nav-btn { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background-color: #ffffff; + border-radius: 10px; + text-decoration: none; + font-size: 13px; + font-weight: 400; + line-height: 24px; + color: var(--color-primary); + transition: box-shadow 0.2s; + white-space: nowrap; +} + +.map-nav-btn:hover { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12); +} + +.map-nav-btn img { + width: 20px; + height: 20px; + object-fit: contain; + flex-shrink: 0; +} diff --git a/src/assets/icons/portfolioGallery.svg b/src/assets/icons/portfolioGallery.svg new file mode 100644 index 0000000..bbe4b26 --- /dev/null +++ b/src/assets/icons/portfolioGallery.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/portfolioP.svg b/src/assets/icons/portfolioP.svg new file mode 100644 index 0000000..4d0a97a --- /dev/null +++ b/src/assets/icons/portfolioP.svg @@ -0,0 +1,15394 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/assets/images/.gitkeep b/src/assets/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/js/contactus.js b/src/assets/js/contactus.js new file mode 100644 index 0000000..a562055 --- /dev/null +++ b/src/assets/js/contactus.js @@ -0,0 +1,109 @@ +// ===================================فرم================================== + +const form = document.getElementById('contactForm'); +const submitBtn = document.getElementById('submitBtn'); +const backBtn = document.getElementById('backBtn'); +const successMessage = document.getElementById('successMessage'); +const submitBtnText = submitBtn.querySelector('.btn-text'); + +form.addEventListener('submit', function (event) { + event.preventDefault(); + + submitBtn.classList.add('loading'); + submitBtnText.textContent = 'درحال ارسال فرم'; + submitBtn.disabled = true; + + setTimeout(() => { + form.style.display = 'none'; + + successMessage.classList.add('visible'); + }, 1500); +}); + +backBtn.addEventListener('click', function () { + successMessage.classList.remove('visible'); + + form.style.display = 'flex'; + + submitBtn.disabled = false; + submitBtn.classList.remove('loading'); + submitBtnText.textContent = 'ثبت درخواست'; + + form.reset(); +}); + +const customSelect = document.getElementById('customSelect'); +const selectBox = customSelect.querySelector('.select-box'); +const options = customSelect.querySelectorAll('.option'); +const selectedText = customSelect.querySelector('.selected-text'); + +selectBox.addEventListener('click', () => { + customSelect.classList.toggle('active'); +}); + +options.forEach((option) => { + option.addEventListener('click', () => { + options.forEach((item) => { + item.classList.remove('active'); + }); + + option.classList.add('active'); + selectedText.textContent = option.textContent; + customSelect.classList.remove('active'); + }); +}); + +document.addEventListener('click', (e) => { + if (!customSelect.contains(e.target)) { + customSelect.classList.remove('active'); + } +}); + +const nameInput = document.getElementById('name'); +const nameError = document.getElementById('nameError'); + +nameInput.addEventListener('input', function () { + const hasNumber = /\d/.test(this.value); + + if (hasNumber) { + this.classList.add('input-error'); + nameError.textContent = '* فقط حروف فارسی و انگلیسی مجاز است'; + } else { + this.classList.remove('input-error'); + nameError.textContent = ''; + } +}); + +const phoneInput = document.getElementById('phone'); +const phoneError = document.getElementById('phoneError'); + +phoneInput.addEventListener('input', function () { + const hasLetter = /[a-zA-Zآ-ی]/.test(this.value); + + if (hasLetter) { + this.classList.add('input-error'); + phoneError.textContent = 'فقط عدد مجاز است'; + } else { + this.classList.remove('input-error'); + phoneError.textContent = ''; + } + this.value = this.value.replace(/\D/g, ''); +}); + +const emailInput = document.getElementById('email'); +const emailError = document.getElementById('emailError'); + +emailInput.addEventListener('input', function () { + if (this.value !== '' && !this.value.includes('@')) { + this.classList.add('input-error'); + emailError.textContent = 'ایمیل باید شامل @ باشد'; + } else { + this.classList.remove('input-error'); + emailError.textContent = ''; + } +}); + +// ==================اسکرول لوگو======================= + + const track = document.querySelector('.logos-track'); + track.innerHTML += track.innerHTML; diff --git a/src/components/.gitkeep b/src/components/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Black.woff b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Black.woff new file mode 100644 index 0000000..8cdd87a Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Black.woff differ diff --git a/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Bold.woff b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Bold.woff new file mode 100644 index 0000000..97c2ba6 Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Bold.woff differ diff --git a/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-ExtraBlack.woff b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-ExtraBlack.woff new file mode 100644 index 0000000..6ba65e5 Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-ExtraBlack.woff differ diff --git a/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-ExtraBold.woff b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-ExtraBold.woff new file mode 100644 index 0000000..ea45bdf Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-ExtraBold.woff differ diff --git a/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Light.woff b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Light.woff new file mode 100644 index 0000000..c9895eb Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Light.woff differ diff --git a/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Regular.woff b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Regular.woff new file mode 100644 index 0000000..1cedfdf Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Regular.woff differ diff --git a/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-SemiBold.woff b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-SemiBold.woff new file mode 100644 index 0000000..2032742 Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-SemiBold.woff differ diff --git a/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Thin.woff b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Thin.woff new file mode 100644 index 0000000..44ac03a Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Thin.woff differ diff --git a/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Black.woff2 b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Black.woff2 new file mode 100644 index 0000000..4e9fe01 Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Black.woff2 differ diff --git a/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Bold.woff2 b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Bold.woff2 new file mode 100644 index 0000000..19b4bb3 Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Bold.woff2 differ diff --git a/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-ExtraBlack.woff2 b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-ExtraBlack.woff2 new file mode 100644 index 0000000..4791333 Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-ExtraBlack.woff2 differ diff --git a/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-ExtraBold.woff2 b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-ExtraBold.woff2 new file mode 100644 index 0000000..c4f86ee Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-ExtraBold.woff2 differ diff --git a/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Light.woff2 b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Light.woff2 new file mode 100644 index 0000000..530dfcf Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Light.woff2 differ diff --git a/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Regular.woff2 b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Regular.woff2 new file mode 100644 index 0000000..fd16033 Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Regular.woff2 differ diff --git a/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-SemiBold.woff2 b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-SemiBold.woff2 new file mode 100644 index 0000000..7d070d8 Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-SemiBold.woff2 differ diff --git a/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Thin.woff2 b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Thin.woff2 new file mode 100644 index 0000000..19c44b9 Binary files /dev/null and b/src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Thin.woff2 differ diff --git a/src/core/javascript/core.js b/src/core/javascript/core.js new file mode 100644 index 0000000..e69de29 diff --git a/src/core/stylesheet/core.css b/src/core/stylesheet/core.css new file mode 100644 index 0000000..3b94478 --- /dev/null +++ b/src/core/stylesheet/core.css @@ -0,0 +1,232 @@ +@font-face { + font-family: Yekan Bakh FaNum; + font-style: normal; + font-weight: 100; + src: + url('../fonts/yekanbakhpro/woff/YekanBakhFaNum-thin.woff') format('woff'), + url('../fonts/yekanbakhpro/woff2/YekanBakhFaNum-thin.woff2') format('woff2'); +} + +@font-face { + font-family: Yekan Bakh FaNum; + font-style: normal; + font-weight: 300; + src: + url('../fonts/yekanbakhpro/woff/YekanBakhFaNum-Light.woff') format('woff'), + url('../fonts/yekanbakhpro/woff2/YekanBakhFaNum-Light.woff2') format('woff2'); +} + +@font-face { + font-family: Yekan Bakh FaNum; + font-style: normal; + font-weight: normal; + src: + url('../fonts/yekanbakhpro/woff/YekanBakhFaNum-Regular.woff') format('woff'), + url('../fonts/yekanbakhpro/woff2/YekanBakhFaNum-Regular.woff2') format('woff2'); +} + +@font-face { + font-family: Yekan Bakh FaNum; + font-style: normal; + font-weight: 600; + src: + url('../fonts/yekanbakhpro/woff/YekanBakhFaNum-SemiBold.woff') format('woff'), + url('../fonts/yekanbakhpro/woff2/YekanBakhFaNum-SemiBold.woff2') format('woff2'); +} + +@font-face { + font-family: Yekan Bakh FaNum; + font-style: normal; + font-weight: bold; + src: + url('../fonts/yekanbakhpro/woff/YekanBakhFaNum-Bold.woff') format('woff'), + url('../fonts/yekanbakhpro/woff2/YekanBakhFaNum-Bold.woff2') format('woff2'); +} + +@font-face { + font-family: Yekan Bakh FaNum; + font-style: normal; + font-weight: 800; + src: + url('../fonts/yekanbakhpro/woff/Yekan Bakh FaNum-ExtraBold.woff') format('woff'), + url('../fonts/yekanbakhpro/woff2/Yekan Bakh FaNum-ExtraBold.woff2') format('woff2'); +} + +@font-face { + font-family: Yekan Bakh FaNum; + font-style: normal; + font-weight: 900; + src: + url('../fonts/yekanbakhpro/woff/Yekan Bakh FaNum-Black.woff') format('woff'), + url('../fonts/yekanbakhpro/woff2/Yekan Bakh FaNum-Black.woff2') format('woff2'); +} + +@font-face { + font-family: Yekan Bakh FaNum; + font-style: normal; + font-weight: 950; + src: + url('../fonts/yekanbakhpro/woff/Yekan Bakh FaNum-ExtraBlack.woff') format('woff'), + url('../fonts/yekanbakhpro/woff2/Yekan Bakh FaNum-ExtraBlack.woff2') format('woff2'); +} +:root { + --color-primary: #0274b3; + --color-title: #1a1a2e; + --color-text: #505068; + --color-body-text: #6a6a6a; + --bg-gray: #f9f9f9; + --color-pastel-main: #c5d7ec; + + --blue-50: #eaf7ff; + --blue-100: #c5eaff; + --blue-150: #a1ddff; + --blue-200: #7cd0ff; + --blue-300: #57c3ff; + --blue-400: #32b6ff; + --blue-500: #1796dc; + --blue-600: #0274b3; /* همان primary */ + --blue-700: #00598a; + --blue-800: #003f61; + + /* Breakpoints */ + /* --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --breakpoint-xxl: 1400px; */ +} +* { + margin: 0; + padding: 0; + direction: rtl; + box-sizing: border-box; + font-family: 'Yekan Bakh FaNum', sans-serif; + font-weight: normal; +} +html { + scroll-behavior: smooth; + /* scrollbar-gutter: stable; */ +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: bold; + line-height: 1.5; + color: var(--color-title); +} +h1 { + font-size: 36px; +} +h2 { + font-size: 24px; +} +h3 { + font-size: 22px; +} +h4 { + font-size: 20px; +} +h5 { + font-size: 15px; +} +p { + line-height: 1.75; + font-size: 15px; + color: var(--color-text); +} +a { + text-decoration: none; + line-height: 1.75; + color: var(--blue-500); +} +div, +span, +button, +a, +li { + line-height: inherit; +} +i { + font-style: normal; +} +/* برای Chrome، Edge و Safari */ + +@media (max-width: 767px) { + h1 { + font-size: 24px; + } + h2 { + font-size: 22px; + } + h3 { + font-size: 18px; + } + h4 { + font-size: 16px; + } + h5 { + font-size: 14px; + } +} + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + *::-webkit-scrollbar { + width: 10px; + } + + *::-webkit-scrollbar-track { + background: #fff; + } + + *::-webkit-scrollbar-thumb { + background-color: var(--color-primary); + border-radius: 10px; + border: 3px solid #fff; + } +} + +/* برای Firefox */ +@-moz-document url-prefix() { + * { + scrollbar-width: thin; + scrollbar-color: var(--color-primary) #fff; + } +} + +::selection { + background: var(--color-primary); + color: #fff; +} + +/* Hide number arrows */ + +/* Chrome, Safari, Edge, Opera */ +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +/* Firefox */ +input[type='number'] { + -moz-appearance: textfield; +} +button { + border: none; + outline: none; + background: none; + cursor: pointer; +} +/* Hide scrollbar for Chrome, Safari and Opera */ +.no-scrollbar::-webkit-scrollbar { + display: none; +} + +/* Hide scrollbar for IE, Edge and Firefox */ +.no-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} diff --git a/src/img/Vector(1).png b/src/img/Vector(1).png new file mode 100644 index 0000000..b638cb5 Binary files /dev/null and b/src/img/Vector(1).png differ diff --git a/src/img/massage-send.svg b/src/img/massage-send.svg new file mode 100644 index 0000000..675042a --- /dev/null +++ b/src/img/massage-send.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/templates/.gitkeep b/src/templates/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..572b0ba --- /dev/null +++ b/vite.config.js @@ -0,0 +1,28 @@ +import { defineConfig } from 'vite'; +import { resolve } from 'path'; + +export default defineConfig({ + resolve: { + alias: { + '@': resolve(__dirname, 'src'), // @ → src/ + '@core': resolve(__dirname, 'src/core'), + '@components': resolve(__dirname, 'src/components'), + }, + }, + + build: { + rollupOptions: { + input: { + main: resolve(__dirname, 'index.html'), + contactus: resolve(__dirname, 'contactus.html'), + }, + }, + manifest: true, + cssCodeSplit: true, + }, + + server: { + open: true, + port: 5173, + }, +});