commit 43438deca7fbeb8d59bb9e5a2f608eb30c8012fb Author: Azita Rahimi Date: Wed Jun 17 17:50:11 2026 +0330 aboutus-prefinal 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/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/aboutus.html b/aboutus.html new file mode 100644 index 0000000..ea8d0af --- /dev/null +++ b/aboutus.html @@ -0,0 +1,1011 @@ + + + + + + + + + + + + + +
+
+ +
+
+
+
+ + + + +
+
درباره ما
+
آژانس راهکارهای بازاریابی اینوا
+
+
+ +
+
+ thumbnail + +
+ + + +
+ +
+ +

آشنایی با تیم و مجموعه اینوا

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

تایم‌لاین

+ +
+
+ +
+ بهمن ۱۳۹۸ +
+ + +
+

شروع با نوین دیار

+

+ اولین قدم با نام «نوین دیار» برداشته شد. یک تیم کوچک از بوشهر که تصمیم داشت به + کسب‌وکارهای کوچک و متوسط کمک کند در فضای دیجیتال دیده شوند و رشد کنند. منابع‌مان + محدود بود، تجربه‌ها تازه داشتند شکل می‌گرفتند اما انگیزه برای ساختن چیزی ارزشمند + از همان روز اول وجود داشت. +

+ +
+ + +
+ بهار ۱۳۹۹ +
+ + +
+

شکل‌گیری تیم

+

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

+ +
+ + +
+ شهریور ۱۴۰۱ +
+ + +
+

تهران و افق‌های تازه

+

+ یکی از مهم‌ترین تصمیم‌های مسیر گرفته شد؛ مهاجرت از بوشهر به تهران. این جابه‌جایی + فقط برای حضور در یک بازار بزرگ‌تر نبود. تهران فرصتی بود برای یادگیری، شبکه‌سازی و + مواجهه با تجربه‌های جدید. حضور در دوره‌های کارآفرینی، آشنایی با فعالان اکوسیستم + کسب‌وکار و گذراندن دوره جامع تبلیغات بادکوبه، نگاه ما را به بازاریابی و رشد + کسب‌وکار عمیق‌تر کرد. +

+ +
+ + +
+ ۱۴۰۱ تا 1403 +
+ + +
+

سال‌های عمر

+

+ سه سالی که گذشت، فرصتی بود برای یادگیری از نزدیک و در مقیاسی بزرگ‌تر. تجربه کار در + شرکت‌هایی مانند زبان مهر، سپیدار همکاران سیستم و اسنپ‌دکتر فرصتی فراهم کرد تا این + جوان بوشهری چالش‌های واقعی رشد، بازاریابی و توسعه کسب‌وکار را از نزدیک لمس کند. در + همین سال‌ها، نوین دیار همچنان به مسیر خود ادامه داد و هم‌زمان پروژه‌های جدیدی نیز + متولد شدند. یکی از مهم‌ترین آن‌ها «پت‌بوم» بود؛ محصولی که از دل همین تجربه‌ها شکل + گرفت و به بخشی از مسیر یادگیری و ساختن ما تبدیل شد. +

+ +
+ + +
+ بهمن ۱۴۰۳ +
+ + +
+

تولد اینوا

+

+ با بزرگ‌تر شدن تیم، پیچیده‌تر شدن پروژه‌ها و روشن‌تر شدن چشم‌انداز آینده، زمان آن + رسیده بود که کارمان هویت تازه‌ای شکل بگیرد. نوین دیار به «اینوا» تبدیل شد. تغییری + که فقط در نام خلاصه نمی‌شد؛ بلکه بازتابی از بلوغ تیم، تجربه‌های به‌دست‌آمده و نگاه + بلندمدت‌تری بود که برای آینده داشتیم. هم‌زمان اولین دفتر رسمی اینوا در تهران شکل + گرفت و فصل جدیدی آغاز شد. +

+ +
+ + +
+ اردیبهشت ۱۴۰۴ +
+ + +
+

درِ اینوا باز شد

+

+ دفتر آماده بود، تیم دور هم جمع شده بود و اینوا رسماً وارد مرحله تازه‌ای از مسیر + رشد خود شد. البته که گذر از این سال، آسان نبود. چالش‌های زیادی داشتیم که هر کدام + برایمان یک درس تازه به همراه داشتند. فرآیندها کاربردی‌تر شدند، خدمات دقیق‌تر و + ساختارمندتر شد و تیم یاد گرفت که چگونه در شرایط سخت، منسجم‌تر و قدرتمندتر حرکت + کند. +

+ +
+ + +
+ فروردین 1405 +
+ + +
+

کاوشگران اینوا

+

+ امروز اینجا ایستاده‌ایم؛ با تجربه بیشتر، نگاه عمیق‌تر و تصویری روشن‌تر از مسیری که + پیش رو داریم. اما اگر بخواهیم صادقانه بگوییم، اینوا هیچ‌وقت حاصل تلاش یک نفر نبوده + است. آنچه اینوا را ساخته و زنده نگه داشته، تیم آن است. کسانی که همیشه ایده‌های + تازه‌ای در سر دارند و با خلق نتیجه‌ای واقعی روزشان را به پایان می‌رسانند. افرادی + که وقتی راهی وجود ندارد، منتظر نمی‌مانند و راهی می‌سازند، هرچند سخت و دشوار. ما + آن‌ها را «کاوشگران اینوا» می‌نامیم. نه به‌خاطر یک عنوان سازمانی، بلکه چون + روحیه‌شان دقیقاً همین است؛ جست‌وجوگر، خلاق، مسئولیت‌پذیر و متعهد به ساختن. نفس + اینوا به همین آدم‌ها گرم است... ما باور داریم بهترین فصل این داستان هنوز نوشته + نشده. +

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

اهداف و ماموریتی که اینوا به آن متعهد است

+

+ در اینوا، هر تصمیم بر پایه داده، تجربه و تمرکز بر نتیجه می‌شود تا کسب‌وکار شما + به‌صورت پایدار رشد کند. +

+
+ + +
+
+
+ +
+

هر پروژه، یک راه‌حل خلاقانه

+

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

+
+ + +
+
+ + +
+

تمرکز بر نتیجه واقعی

+

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

+
+ + +
+
+ + +
+

ترکیب داده و طراحی

+

+ تصمیمات ما بر اساس تحلیل داده، تجربه کاربری و خلاقیت شکل می‌گیرد تا بهترین نتیجه + حاصل شود. +

+
+ + +
+
+ + +
+

ساخت تجربه‌های ماندگار

+

+ ما تلاش می‌کنیم تجربه‌هایی بسازیم که در ذهن مخاطبان ماندگار بماند و برند شما را از + رقبا متمایز کند. +

+
+ + +
+
+ + +
+

همکاری بلندمدت با برندها

+

+ ما پروژه‌ها را به چشم یک همکاری بلندمدت می‌بینیم و در کنار برندها برای رشد پایدار + آن‌ها حرکت می‌کنیم. +

+
+
+
+
+ + +
+
+
+

به جمع بیش از 300 پروژه موفق بپیوندید

+ +

+ کیفیت ما از زبان کارفرمایان شرکت‌های بزرگ و کوچک موفق بشنوید +

+
+ +
+
+
+ 1.5X +

افزایش رشد/فروش

+
+ +
+ 45+ +

تعداد مشتریان

+
+ +
+ 92% +

رضایت کارفرمایان

+
+ +
+ 300+ +

پروژه موفق

+
+
+ +
+
+ 1.5X +

افزایش رشد/فروش

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

+ تخصص در طراحی معماری نرم‌افزارهای مقیاس‌پذیر و توسعه سیستم‌های پردازش داده‌های + بزرگ. +

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

+ تخصص در طراحی معماری نرم‌افزارهای مقیاس‌پذیر و توسعه سیستم‌های پردازش داده‌های + بزرگ. +

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

+ تخصص در طراحی معماری نرم‌افزارهای مقیاس‌پذیر و توسعه سیستم‌های پردازش داده‌های + بزرگ. +

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

+ تخصص در طراحی معماری نرم‌افزارهای مقیاس‌پذیر و توسعه سیستم‌های پردازش داده‌های + بزرگ. +

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

+ تخصص در طراحی معماری نرم‌افزارهای مقیاس‌پذیر و توسعه سیستم‌های پردازش داده‌های + بزرگ. +

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

+ تخصص در طراحی معماری نرم‌افزارهای مقیاس‌پذیر و توسعه سیستم‌های پردازش داده‌های + بزرگ. +

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

+ تخصص در طراحی معماری نرم‌افزارهای مقیاس‌پذیر و توسعه سیستم‌های پردازش داده‌های + بزرگ. +

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

+ تخصص در طراحی معماری نرم‌افزارهای مقیاس‌پذیر و توسعه سیستم‌های پردازش داده‌های + بزرگ. +

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

تیمی به گستره‌ی ایران

+

+ «هر چه از شروع فعالیت اینوا گذشت، مجموعه بزرگ‌تر شد و آدم‌های متخصص و جدیدی بهمون + اضافه شدن. البته که توی این مسیر جای خالی دوستانی که ازمون جدا شدن، همیشه حس میشه و + یادشون به ماست. تیم اینوا دور هم جمع شدن و همین اتحاد از راه دور رمز اصلی موفقیت و + قدرت تیمی ما در اینواست.» +

+
+ + +
+
+ +

تیم راهبری اینوا

+
+
+
+
+ علیرضا زندی +
+
+

علیرضا زندی

+

مدیرعامل اینوا

+
+
+
+
+ + +
+
+ +

تیم توسعه

+
+
+
+
+ محسن +
+
+

محسن

+

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

+
+
+
+
+ آریتا رحیمی +
+
+

آریتا رحیمی

+

برنامه نویس فرانت

+
+
+
+
+ آرمان بزرگی +
+
+

آرمان بزرگی

+

پروداکت دیزاینر و فلاتر

+
+
+
+
+ + +
+
+ +

تیم ویدیو

+
+
+
+
+ مهدی غلامی +
+
+

مهدی غلامی

+

فیلمبردار و تدوینگر

+
+
+
+
+ علی سید +
+
+

علی سید

+

فیلمبردار

+
+
+
+
+ + +
+
+ +

تحریریه اینوا

+
+
+
+
+ فاطمه محمد بیگی +
+
+

فاطمه محمد بیگی

+

کارشناس ارشد تولید محتوا

+
+
+
+
+ + +
+
+ +

سئو

+
+
+
+
+ ملیکا هلالی +
+
+

ملیکا هلالی

+

مسئول تیم سئو

+
+
+
+
+ امیرعلی ندائی +
+
+

امیرعلی ندائی

+

سئو

+
+
+
+
+ + +
+
+ +

امور مالی و حقوقی شرکت

+
+
+
+
+ محمدعلی محفوظی +
+
+

محمدعلی محفوظی

+

حسابداری

+
+
+
+
+
+
+ +
+
+
+

زندگی در اینوا

+ +

اینوا فراتر از یک میز کار؛ جایی برای زیستن

+ +

+ ما توی اینوا باور داریم که تخصص و خلاقیت، فقط وقتی جوونه می‌زنه که حالِ دلمون خوب + باشه. برای همین، اینجا همه‌چیز توی کد زدن و جلسه خلاصه نمی‌شه؛ از گپ‌ و‌ گفت‌های + رفاقتی کنار قهوه گرفته تا کل‌کل‌های وسط بازی و تفریح، همه‌شون بخش جدانشدنیِ روزهای + ما هستن. راستش رو بخوای، ما فکر می‌کنیم همین انرژیِ مثبت و رفاقت‌هاست که موتور محرک + موفقیت‌های تیمیه. دنیای پشت‌ صحنه‌ی اینوا پر از داستان‌های باحال و تجربه‌هاییه که + هویت ما رو می‌سازه. اگه دوست داری توی این لحظه‌ها و حالِ خوب با ما شریک باشی، + اینستاگراممون رو دنبال کن. +

+ + + لحظات ما رو دنبال کنید + + + +
+ +
+
+
+
+ + 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/1.png b/public/images/1.png new file mode 100644 index 0000000..6103de6 Binary files /dev/null and b/public/images/1.png differ diff --git a/public/images/2.png b/public/images/2.png new file mode 100644 index 0000000..28a0433 Binary files /dev/null and b/public/images/2.png differ diff --git a/public/images/3.png b/public/images/3.png new file mode 100644 index 0000000..c739eab Binary files /dev/null and b/public/images/3.png differ diff --git a/public/images/4.png b/public/images/4.png new file mode 100644 index 0000000..f034a41 Binary files /dev/null and b/public/images/4.png differ diff --git a/public/images/ali.png b/public/images/ali.png new file mode 100644 index 0000000..51efbfc Binary files /dev/null and b/public/images/ali.png differ diff --git a/public/images/amr.png b/public/images/amr.png new file mode 100644 index 0000000..c3a10b0 Binary files /dev/null and b/public/images/amr.png differ diff --git a/public/images/armn.png b/public/images/armn.png new file mode 100644 index 0000000..87b8660 Binary files /dev/null and b/public/images/armn.png differ diff --git a/public/images/azta.png b/public/images/azta.png new file mode 100644 index 0000000..b8a764e Binary files /dev/null and b/public/images/azta.png differ diff --git a/public/images/blure-effect 1.png b/public/images/blure-effect 1.png new file mode 100644 index 0000000..68745ce Binary files /dev/null and b/public/images/blure-effect 1.png differ diff --git a/public/images/ftme.png b/public/images/ftme.png new file mode 100644 index 0000000..124ff19 Binary files /dev/null and b/public/images/ftme.png differ diff --git a/public/images/hamkaran.png b/public/images/hamkaran.png new file mode 100644 index 0000000..70def58 Binary files /dev/null and b/public/images/hamkaran.png differ diff --git a/public/images/hesabdari.png b/public/images/hesabdari.png new file mode 100644 index 0000000..4c92ff1 Binary files /dev/null and b/public/images/hesabdari.png differ diff --git a/public/images/ipka.png b/public/images/ipka.png new file mode 100644 index 0000000..bf99ebd Binary files /dev/null and b/public/images/ipka.png differ diff --git a/public/images/liveinova.png b/public/images/liveinova.png new file mode 100644 index 0000000..9478776 Binary files /dev/null and b/public/images/liveinova.png differ diff --git a/public/images/mhdi.png b/public/images/mhdi.png new file mode 100644 index 0000000..d46af5a Binary files /dev/null and b/public/images/mhdi.png differ diff --git a/public/images/mhmd.png b/public/images/mhmd.png new file mode 100644 index 0000000..0744a53 Binary files /dev/null and b/public/images/mhmd.png differ diff --git a/public/images/mhsn.png b/public/images/mhsn.png new file mode 100644 index 0000000..6895c2e Binary files /dev/null and b/public/images/mhsn.png differ diff --git a/public/images/mlka.png b/public/images/mlka.png new file mode 100644 index 0000000..0eaadda Binary files /dev/null and b/public/images/mlka.png differ diff --git a/public/images/nil.png b/public/images/nil.png new file mode 100644 index 0000000..5a5f42c Binary files /dev/null and b/public/images/nil.png differ diff --git a/public/images/petboom.png b/public/images/petboom.png new file mode 100644 index 0000000..ef9baf1 Binary files /dev/null and b/public/images/petboom.png differ diff --git a/public/images/pic1.png b/public/images/pic1.png new file mode 100644 index 0000000..b81ff66 Binary files /dev/null and b/public/images/pic1.png differ diff --git a/public/images/pic2.png b/public/images/pic2.png new file mode 100644 index 0000000..8b9e1b7 Binary files /dev/null and b/public/images/pic2.png differ diff --git a/public/images/pic3.png b/public/images/pic3.png new file mode 100644 index 0000000..f034a41 Binary files /dev/null and b/public/images/pic3.png differ diff --git a/public/images/prof.png b/public/images/prof.png new file mode 100644 index 0000000..767eee8 Binary files /dev/null and b/public/images/prof.png differ diff --git a/public/images/sepidar.png b/public/images/sepidar.png new file mode 100644 index 0000000..77d1184 Binary files /dev/null and b/public/images/sepidar.png differ diff --git a/public/images/snap.png b/public/images/snap.png new file mode 100644 index 0000000..1b0cc9f Binary files /dev/null and b/public/images/snap.png differ diff --git a/public/images/thumb.png b/public/images/thumb.png new file mode 100644 index 0000000..42db6fc Binary files /dev/null and b/public/images/thumb.png differ diff --git a/public/images/videotest.mp4 b/public/images/videotest.mp4 new file mode 100644 index 0000000..d4f3e65 Binary files /dev/null and b/public/images/videotest.mp4 differ diff --git a/public/images/zabanmehr (1).png b/public/images/zabanmehr (1).png new file mode 100644 index 0000000..bdf4d71 Binary files /dev/null and b/public/images/zabanmehr (1).png differ diff --git a/public/images/zabanmehr (3).png b/public/images/zabanmehr (3).png new file mode 100644 index 0000000..1643195 Binary files /dev/null and b/public/images/zabanmehr (3).png differ diff --git a/public/images/zarin.png b/public/images/zarin.png new file mode 100644 index 0000000..8d9590f Binary files /dev/null and b/public/images/zarin.png differ diff --git a/public/images/zndi.png b/public/images/zndi.png new file mode 100644 index 0000000..d7f0870 Binary files /dev/null and b/public/images/zndi.png differ diff --git a/src/assets/css/aboutus-responsive.css b/src/assets/css/aboutus-responsive.css new file mode 100644 index 0000000..5b9f358 --- /dev/null +++ b/src/assets/css/aboutus-responsive.css @@ -0,0 +1,323 @@ +@media screen and (max-width: 1400px) { +} +@media screen and (max-width: 1200px) { + .hero-content { + width: 90%; + max-width: 673px; + } + .contact-info { + width: 460px; + } + .picteam-track-wrapper { + height: 380px; + } +} +@media screen and (max-width: 992px) { + + .hero-h1 { + font-size: 28px; + line-height: 42px; + } + .video-wrapper { + width: 80%; + } + .live-section > .container { + flex-direction: column-reverse; +} + .live-button { + width: 100%; + height: 50px; + } + .live-gallery { + flex: 0 0 100%; + margin-bottom: 24px; +} +.picteam-track-wrapper { + height: 310px; + } + .picteam-caption{ + font-size: 15px; + } +} +@media screen and (max-width: 768px) { +.showcase-section > .container-showcase { + height: calc(var(--slides-count) * 100dvh); + } + .showcase-sticky { + height: 100vh; + } + .showcase-inner { + position: relative; + width: 100%; + height: 100vh; + display: block; + } + .showcase-media-side, + .showcase-text-side { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + } + .showcase-media-wrapper { + width: 100%; + height: 100%; + max-width: unset; + border-radius: 0; + } + .media-item { + position: absolute; + inset: 0; + opacity: 0; + transform: translateY(80px); + transition: + opacity 0.9s ease, + transform 0.9s ease; + } + .media-item.active { + opacity: 1; + transform: translateY(0); + z-index: 2; + } + .mobile-pos-one img, + .mobile-pos-one video, + .mobile-pos-two img, + .mobile-pos-two video, + .mobile-pos-three img, + .mobile-pos-three video { + width: 100%; + height: 100%; + object-fit: cover; + } + .media-item::after { + content: ''; + position: absolute; + inset: 0; + z-index: 1; + } + .gradient-one::after, + .gradient-two::after, + .gradient-three::after { + background: linear-gradient( + 0deg, + rgba(0, 20, 31, 0.9) 6.09%, + rgba(0, 20, 31, 0.8) 17.54%, + rgba(0, 20, 31, 0.7) 26.09%, + rgba(0, 20, 31, 0.6) 36.3%, + rgba(0, 20, 31, 0.5) 43.43%, + rgba(0, 63, 97, 0) 87.09% + ); + } + .showcase-text-side { + z-index: 5; + overflow: hidden; + pointer-events: none; + } + .text-track { + position: absolute; + inset: 0; + } + .text-item { + position: absolute; + inset: 0; + height: 100vh; + display: flex; + flex-direction: column; + justify-content: flex-end; + padding: 0 24px calc(env(safe-area-inset-bottom) + 48px); + color: white; + opacity: 0; + visibility: hidden; + pointer-events: none; + z-index: 1; + transform: translateY(60px); + transition: + transform 0.6s ease, + opacity 0.6s ease, + visibility 0.6s ease; + } + .text-item.active { + opacity: 1; + visibility: visible; + z-index: 5; + transform: translateY(0); + } + + .text-item span { + color: #aebcc5; + font-size: 14px; + margin-bottom: 8px; + } + .text-item span::before { + background-color: #aebcc5; + +} + .text-item h2 { + color: #ffffff; + font-size: 22px; + margin-bottom: 16px; + } + .text-item p { + color: #E6E7E8; + + } + .container-showcase { + padding: 0; + margin: 0 auto; + } + .showcase-text-side::after { + display: none; + } + .op-box { + margin-top: 24px; + } + + .op-pagination { + margin-top: 16px; + padding-bottom: 4px; + } + .desktop1 { + display: none; + } + + .mobile-stat { + display: flex; + } + .container-hero-section{ + padding: 0 ; +} +.hero-card { + height: 400px; + border-radius: 0; +} + .video-wrapper { + top: 89%; + width: 70%; + } + .hero-title{ + font-size: 24px; +} +.video-title { + font-size: 20px; + bottom: 9px; +} + .timeline-card { + flex: 0 0 90%; + min-width: 0; + } + .timeline-viewport { + padding: 0 20px; + + overflow: visible; + } + .goal-item:nth-child(4)::before, + .goal-item:nth-child(5)::before { + content: none; + } + .goal-item2{ + border-right: none ; + border-left: none ; +} + .live-title { + font-size: 48px; + } + .live-subtitle { + font-size: 22px; +line-height: 1.5; + } + .live-text { + font-size: 15px; + } + .goal-title { + font-size: 22px; + } + .goal-grid { + grid-template-columns: repeat(2, 1fr); + row-gap: 24px; + column-gap: 20px; + } + .goal-item { + grid-column: span 1 !important; + padding: 0 4px; + } + + .goal-item:last-child { + grid-column: 1 / -1 !important; + } + .goal-item-title { + font-size: 15px; + } + + .goal-item-desc { + font-size: 13px; + } + .team-grid { + grid-template-columns: repeat(2, 1fr); + } + .team-card { + flex-direction: column; + align-items: center; + justify-content: center; + } + .team-card-info { + align-items: center; + } + .team-main-title { + font-size: 22px; + } + .team-card-role { + font-size: 13px; + } + .team-card-name { + font-size: 15px; + } + .team-group-title { + font-size: 18px; + } + .team-main-desc { + font-size: 14px; + } +.picteam-mobile-slide .picteam-accent-line{ + display: none; +} + .picteam-track-wrapper, + .picteam-btn { + display: none ; + } + .picteam-mobile-wrapper { + display: block; + } +} +@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; + } + .video-title { + font-size: 20px; + } + .play-btn-about svg { + width: 60px; + height: 60px; + } + .arrow-btn-about svg { + width: 72px; + height: 70px; + } + .video-wrapper { + top: 85%; + width: 90%; + } + .timeline-section { + padding: 48px 0px; +} +} \ No newline at end of file diff --git a/src/assets/css/aboutus.css b/src/assets/css/aboutus.css new file mode 100644 index 0000000..9f0e303 --- /dev/null +++ b/src/assets/css/aboutus.css @@ -0,0 +1,1390 @@ +.container { + max-width: 1240px; + padding: 0 20px; + margin: 0 auto; +} +/* ═══════════════════════════════════════════════════════ + HERO +═══════════════════════════════════════════════════════ */ +.hero-section { + padding-bottom: 50px; + margin-bottom: 100px; +} +.container-hero-section { + max-width: 1240px; + padding: 0 20px; + margin: 0 auto; +} +.hero-section-wrapper { + position: relative; +} +.hero-card { + position: relative; + width: 100%; + height: 620px; + background-color: #eff6ff; + border-radius: 10px; + overflow: hidden; + display: flex; + justify-content: center; +} +.hero-content { + margin-top: 100px; + display: inline-flex; + flex-direction: column; + gap: 16px; + align-items: center; + position: absolute; + z-index: 5; +} +.hero-circles { + position: absolute; + top: -29%; + 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-title { + color: var(--color-primary); + font-size: 36px; + font-weight: bold; +} +.hero-txt { + color: var(--color-primary); + border: 1px solid var(--color-primary); + border-radius: 20px; + padding: 5px 24px; + font-size: 13px; + font-weight: 400; +} +.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; +} +.video-wrapper { + width: 100%; + max-width: 720px; + max-height: 389px; + position: absolute; + top: 75%; + right: 50%; + transform: translate(50%, -50%); +} + +.video-thumbnail { + position: relative; + cursor: pointer; + max-width: 720px; + width: 100%; + max-height: 389px; +} + +.thumb-img { + border-radius: 8px; + width: 100%; + display: block; + object-fit: cover; + height: auto; + + aspect-ratio: 16 / 9; +} + +.overlay { + position: absolute; + top: 12px; + bottom: 12px; + right: 8px; + left: 8px; + z-index: 2; + border-radius: 8px; + background: rgba(255, 255, 255, 0.05); + backdrop-filter: blur(53.86px); +} + +.play-btn-about { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 10; +} +.play-btn-about svg { + width: 95px; + height: 95px; +} + +.arrow-btn-about { + position: absolute; + top: 37%; + right: 18%; + z-index: 10; +} +.arrow-btn-about svg { + width: 97px; + height: 120px; +} +.inova-about-logo { + position: absolute; + top: 3%; + right: 3%; + z-index: 10; +} +.video-title { + position: absolute; + bottom: 33px; + color: #fff; + font-size: 42px; + font-weight: bold; + z-index: 2; + display: flex; + justify-content: center; + width: 100%; +} + +.video-player { + display: none; + width: 100%; + border-radius: 24px; + aspect-ratio: 16 / 9; + height: auto; + object-fit: cover; +} +/* ═══════════════════════════════════════════════════════ + showcase +═══════════════════════════════════════════════════════ */ +.container-showcase { + max-width: 1240px; + padding: 0 20px; + margin: 0 auto; +} +.showcase-section > .container-showcase { + height: 200vh; +} +.showcase-sticky { + position: sticky; + top: 0; + width: 100%; + height: 100dvh; + overflow: hidden; +} +.showcase-inner { + height: 100%; + display: flex; + align-items: center; + gap: 40px; + height: 100dvh; +} +.showcase-media-side { + flex-basis: 58%; + display: flex; + align-items: center; + justify-content: center; +} +.showcase-media-wrapper { + width: 100%; + max-width: 679px; + aspect-ratio: 1/1; + position: relative; + overflow: hidden; + border-radius: 8px; +} +.media-item { + position: absolute; + inset: 0; + opacity: 0; + transition: + opacity 0.8s ease, + transform 1.4s ease; + will-change: opacity, transform; +} +.media-item.active { + opacity: 1; + z-index: 2; +} +.media-item img, +.media-item video { + display: block; + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 8px; +} +.showcase-text-side { + flex-basis: 40%; + height: 90%; + overflow: visible; + position: relative; +} +.text-track { + position: absolute; + top: 0; + left: 0; + width: 100%; +} +.text-item { + height: 60dvh; + display: flex; + flex-direction: column; + justify-content: flex-end; + align-items: flex-start; + opacity: 1; + transform: translateY(0); + filter: blur(0); + transition: + opacity 0.4s linear, + transform 0.4s linear, + filter 0.4s linear; + will-change: transform, opacity, filter; +} +.text-item span { + display: flex; + align-items: center; + gap: 8px; + font-size: 14px; + color: var(--color-primary); + margin-bottom: 4px; + font-weight: 400; +} +.text-item span::before { + content: ''; + width: 32px; + height: 1px; + background-color: var(--color-primary); + display: block; +} +.text-item h2 { + font-size: 22px; + color: var(--color-title); + line-height: 1.5; + margin-bottom: 16px; +} +.text-item p { + color: var(--color-body-text); + line-height: 1.7; + font-size: 15px; +} +/* ═══════════════════════════════════════════════════════ + timeline +═══════════════════════════════════════════════════════ */ + +.timeline-section { + position: relative; + overflow: hidden; + padding: 48px 120px; + background: #0b7fbf; + margin-top: 50px; +} + +.timeline-bg-circle, +.timeline-bg-circle2 { + position: absolute; + + width: 356px; + height: 356px; + border-radius: 50%; + background-color: #1e8ecb; +} +.timeline-bg-circle { + bottom: -207px; + left: -207px; +} +.timeline-bg-circle2 { + top: -207px; + right: -207px; +} +.timeline-title { + text-align: right; + color: #54a5d2; + font-size: 64px; + font-weight: bold; + position: absolute; + padding: 0 20px; + z-index: 1; +} + +.timeline-viewport { + position: relative; + overflow: hidden; +} + +.timeline-track { + display: flex; + flex-direction: row; + gap: 32px; + transition: transform 0.45s cubic-bezier(0.4, 0, 0.2, 1); + will-change: transform; + touch-action: pan-y; + user-select: none; + margin-top: 100px; +} + +.timeline-card { + flex: 0 0 28%; + min-width: 200px; + color: #ffffff; + display: flex; + flex-direction: column; +} + +.timeline-card__date { + font-size: 20px; + font-weight: bold; + color: #ffffff; + margin-bottom: 12px; +} + +.timeline-card__dot-row { + display: flex; + align-items: center; + margin-bottom: 16px; + gap: 16px; +} + +.timeline-card__dot { + width: 12px; + height: 12px; + border-radius: 4px; + background: #ffffff; + flex-shrink: 0; + position: relative; + z-index: 1; +} + +.timeline-card__line { + flex: 1; + height: 0.5px; + background: #ffffff; +} + +.timeline-card__heading { + font-size: 16px; + color: #ffffff; + font-weight: bold; + margin-bottom: 16px; +} + +.timeline-card__body { + font-size: 13px; + font-weight: 400; + line-height: 24px; + color: #ffffff; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 6; + flex: 1; +} + +.timeline-card__body.is-expanded { + display: block; + -webkit-line-clamp: unset; +} + +.timeline-card__toggle { + background: none; + border: none; + color: #ffffff; + font-size: 15px; + cursor: pointer; + padding: 6px 0 0; + display: none; + gap: 8px; + opacity: 0.8; + transition: opacity 0.2s; +} + +.timeline-card__toggle.is-visible { + display: flex; +} + +.timeline-card__toggle:hover { + opacity: 1; +} + +.timeline-card__toggle-icon { + font-size: 15px; +} +.timeline-card__toggle-label { + font-size: 15px; +} + +/* ───── Nav buttons ───── */ +.timeline-nav { + display: flex; + justify-content: center; + gap: 14px; + margin-top: 36px; + position: relative; + z-index: 2; +} + +.timeline-nav__btn { + width: 48px; + height: 48px; + + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; +} + +.timeline-nav__btn:disabled { + opacity: 0.35; + cursor: default; +} + +/* ═══════════════════════════════════════════════════════ + goal +═══════════════════════════════════════════════════════ */ +.goal-section { + margin: 100px 0; +} + +.goal-container { + max-width: 1200px; + margin: 0 auto; + padding: 0 40px; +} + +.goal-header { + text-align: center; + margin-bottom: 68px; +} + +.goal-title { + font-size: 24px; + font-weight: bold; + line-height: 36px; + margin-bottom: 16px; + color: var(--color-title); +} + +.goal-subtitle { + font-size: 15px; + font-weight: 400; + color: var(--color-text); +} + +.goal-grid { + display: grid; + grid-template-columns: repeat(6, 1fr); + row-gap: 24px; + column-gap: 24px; +} +.grid-divider { + grid-column: 2 / -2; + height: 1px; + background: #ddd; +} + +.goal-item { + grid-column: span 2; + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: 24px 16px; +} +.goal-item2 { + border-right: 1px inset; + border-left: 1px ridge; +} +.goal-item:nth-child(4), +.goal-item:nth-child(5) { + position: relative; +} + +.goal-item:nth-child(4)::before, +.goal-item:nth-child(5)::before { + content: ''; + position: absolute; + top: -12px; + left: -24px; + right: 0; + height: 1px; + background: #ddd; +} + +.goal-item:nth-child(4) { + grid-column: 2 / 4; +} + +.goal-item:nth-child(5) { + grid-column: 4 / 6; +} + +.goal-icon-wrap { + width: 48px; + height: 48px; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 12px; +} + +.goal-item-title { + font-size: 16px; + font-weight: bold; + color: var(--color-title); + margin-bottom: 12px; + line-height: 24px; +} + +.goal-item-desc { + font-size: 15px; + font-weight: 400; + color: var(--color-body-text); + line-height: 26px; +} + +/* ═══════════════════════════════════════════════════════ + 300project +═══════════════════════════════════════════════════════ */ + +.comments-section-header { + display: flex; + flex-direction: column; + text-align: center; + margin-bottom: 24px; +} + +.comments-section-title { + font-size: 24px; + font-weight: bold; + color: var(--color-title); + margin-bottom: 8px; +} + +.comments-section-description { + font-size: 15px; + font-weight: 400; + color: var(--color-body-text); +} + +.stats-container { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 24px; + margin-bottom: 48px; +} + +.stat-box { + padding: 12px 16px; + border: 1px solid var(--color-pastel-main); + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; +} + +.stat-box p { + color: var(--color-body-text); + font-size: 16px; +} + +.stat-number { + color: var(--color-primary); + font-size: 24px; + font-weight: bold; +} + +.mobile-stat { + display: none; + border: 1px solid var(--color-pastel-main); + border-radius: 8px; + padding: 12px 16px; + align-items: center; + justify-content: center; + text-align: center; + overflow: hidden; +} + +.mobile-content { + display: flex; + gap: 8px; + opacity: 1; + align-items: center; + transform: translateY(0); + transition: + opacity 0.5s ease, + transform 0.5s ease; +} + +.mobile-content.fade-out { + opacity: 0; + transform: translateY(10px); +} + +.mobile-content.fade-in { + opacity: 1; + transform: translateY(0); +} + +.mobile-stat span { + display: block; + color: var(--color-primary); + font-size: 24px; + font-weight: bold; +} + +.mobile-stat p { + font-size: 16px; + font-weight: 400; + color: var(--color-text); +} + +.logo-slider::before, +.logo-slider::after { + content: ''; + position: absolute; + top: 0; + width: 120px; + height: 100%; + z-index: 10; + pointer-events: none; +} + +.logo-slider::before { + left: 0; + background: linear-gradient(to right, #fff 0%, rgba(255, 255, 255, 0) 100%); +} +.logo-slider::after { + right: 0; + background: linear-gradient(to left, #fff 0%, rgba(255, 255, 255, 0) 100%); +} +.logo-slider { + overflow: hidden; + width: 100%; + margin: 16px 0; + position: relative; + direction: ltr; +} + +.slider-track { + display: flex; + gap: 8px; + width: max-content; + will-change: transform; +} + +.slider-right .slider-track { + animation: logo-slide-left 40s linear infinite; +} + +.slider-left .slider-track { + animation: logo-slide-right 40s linear infinite; +} + +.logo-slider:hover .slider-track { + animation-play-state: paused; +} + +@keyframes logo-slide-left { + from { + transform: translateX(0); + } + to { + transform: translateX(-50%); + } +} + +@keyframes logo-slide-right { + from { + transform: translateX(-50%); + } + to { + transform: translateX(0); + } +} + +.logo { + width: 124px; + height: 48px; + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + border-radius: 10px; + background: #fafafa; +} + +.logo img { + max-height: 28px; +} + +.logo-slider:hover .logo img { + filter: grayscale(100%); + opacity: 0.4; +} + +.logo:hover img { + filter: grayscale(0) !important; + opacity: 1 !important; +} +/* ===================op-section=================================== */ + +.op-section { + margin: auto; + + display: flex; + flex-direction: column; + gap: 24px; + box-sizing: border-box; +} + +.op-section-title { + text-align: right; + display: flex; + flex-direction: column; + gap: 8px; +} + +.op-section-title h2 { + font-size: 20px; + font-weight: 700; + color: #424242; + line-height: 30px; +} +.op-section-title p { + font-size: 14px; + font-weight: 400; + line-height: 26px; + color: #424242; +} +.op-box { + overflow-x: auto; + scroll-behavior: smooth; + scrollbar-width: none; + -webkit-user-select: none; + user-select: none; + margin-top: 48px; + direction: ltr; + touch-action: pan-y; + -webkit-overflow-scrolling: touch; +} +.op-track { + display: flex; + flex-direction: row-reverse; + gap: 20px; + width: max-content; + min-width: 100%; +} +.op-box::-webkit-scrollbar { + height: 6px; +} + +.op-box::-webkit-scrollbar-thumb { + background: #ccc; + border-radius: 10px; + display: none; +} + +.op-card { + flex: 0 0 auto; + height: 243px; + border-radius: 16px; + padding: 24px 16px; + position: relative; + border: #d1d5db solid 1px; + overflow: hidden; + display: flex; + flex-direction: column; + gap: 16px; + direction: rtl; +} + +.op-card::before { + content: ''; + position: absolute; + inset: 0; + background-image: radial-gradient(rgba(40, 80, 120, 0.05) 1px, transparent 2px); + background-size: 20px 20px; + pointer-events: none; +} +.op-card::after { + content: ''; + position: absolute; + width: 403px; + height: 403px; + bottom: 0px; + right: 20px; + border-radius: 50%; + background: rgba(2, 116, 179, 0.15); + filter: blur(80px); + pointer-events: none; +} +.op-card-text { + font-size: 14px; + font-weight: 400; + line-height: 26px; + color: #424242; + height: 104px; + position: relative; +} + +.op-stars { + display: flex; + gap: 5px; + align-items: center; + height: 20px; +} + +.op-user { + display: flex; + align-items: center; + justify-content: space-between; +} + +.user-info { + display: flex; + gap: 8px; +} + +.avatar { + width: 40px; + height: 40px; + border-radius: 50%; + overflow: hidden; +} + +.avatar img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.user-name { + font-weight: 700; + font-size: 14px; + color: #424242; + padding-left: 4px; +} + +.user-txt { + font-size: 12px; + color: #6e7a86; + font-weight: 400; + line-height: 18px; +} + +.op-pagination { + display: flex; + direction: rtl; + justify-content: center; + align-items: center; + gap: 8px; + margin-top: 20px; + position: relative; + z-index: 2; + width: 100%; + flex-shrink: 0; +} + +.op-dot { + width: 8px; + height: 8px; + border: none; + padding: 0; + border-radius: 50%; + background: #d1d5db; + margin: 0 4px; + cursor: pointer; + transition: 0.3s; +} + +.op-dot.active { + width: 24px; + border-radius: 10px; + background: #0066ff; +} + +/* ═══════════════════════════════════════════════════════ + pic +═══════════════════════════════════════════════════════ */ + +/* ─── SECTION ─── */ +.picteam-section { + position: relative; + width: 100%; + overflow: hidden; + padding: 0; + margin-top: 100px; +} + +/* ─── DESKTOP TRACK ─── */ +.picteam-track-wrapper { + position: relative; + width: 100%; + display: flex; + align-items: center; + justify-content: center; + max-height: 522px; + aspect-ratio: 16 / 9; + overflow: hidden; +} + +.picteam-track { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + position: relative; + gap: 20px; + /* transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); */ + transition: transform 250ms ease-out 1ms; +} + + +/* Each slide on desktop */ +.picteam-slide { + position: absolute; + top: 0; + height: 100%; + overflow: hidden; + transition: opacity 250ms ease-out; + cursor: pointer; +} + +/* CENTER slide */ +.picteam-slide.active { + width: 60%; + right: 20%; + z-index: 3; + filter: none; + border-radius: 16px; +} + +/* PREV slide (right side in RTL) */ +.picteam-slide.prev { + width: 19%; + right: 0; + z-index: 2; + filter: blur(1.5px); + border-radius: 16px 0 0 16px; +} + +/* NEXT slide (left side in RTL) */ +.picteam-slide.next { + width: 19%; + left: 0; + right: auto; + z-index: 2; + filter: blur(1.5px); + border-radius: 0 16px 16px 0; +} + +.picteam-slide.hidden { + opacity: 0; + pointer-events: none; + z-index: 1; +} + +.picteam-slide img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +/* Overlay gradient on all slides */ +.picteam-slide::after { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient( + to top, + rgba(0, 0, 0, 0.65) 0%, + rgba(0, 0, 0, 0.1) 50%, + transparent 100% + ); + z-index: 1; +} + +/* ─── CAPTION ─── */ +.picteam-caption { + position: absolute; + bottom: 40px; + right: 39px; + z-index: 4; + color: #ffffff; + font-size: 24px; + font-weight: bold; + + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.7); + pointer-events: none; + opacity: 0; + transform: translateY(20px); + transition: + opacity 0.45s ease 0.1s, + transform 0.45s ease 0.1s; +} + +.picteam-caption.visible { + opacity: 1; + transform: translateY(0); +} + +/* Vertical accent line */ +.picteam-slide .picteam-accent-line { + position: absolute; + bottom: 32px; + right: 23px; + width: 0.5px; + height: 52px; + background: #dfdfdf; + z-index: 5; + border-radius: 2px; +} + +/* ─── NAV BUTTONS (desktop) ─── */ +.picteam-btn { + position: absolute; + top: 50%; + transform: translateY(-50%); + z-index: 10; + width: 44px; + height: 80px; + background: rgba(26, 143, 227, 0.85); + border: none; + color: #fff; + font-size: 22px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + border-radius: 4px; + transition: background 0.2s; + outline: none; +} + +.picteam-btn:hover { + background: rgba(26, 143, 227, 1); +} + +.picteam-btn-prev { + right: 0; +} + +.picteam-btn-next { + left: 0; +} + +/* ─── MOBILE SLIDER ─── */ +.picteam-mobile-wrapper { + display: none; + position: relative; + width: 100%; + overflow: hidden; +} + +.picteam-mobile-track { + display: flex; + transition: transform 0.45s cubic-bezier(0.4, 0, 0.2, 1); +} + +.picteam-mobile-slide { + flex: 0 0 100%; + width: 100%; + position: relative; +} + +.picteam-mobile-slide img { + width: 100%; + min-height: 220px; + object-fit: cover; + display: block; +} + +.picteam-mobile-slide::after { + content: ''; + position: absolute; + inset: 0; + background: linear-gradient(to top, rgba(0, 0, 0, 0.65) 0%, transparent 55%); + z-index: 1; +} + +.picteam-mobile-caption { + position: absolute; + bottom: 25px; + left: 0; + width: 100%; + text-align: center; + z-index: 4; + color: #fff; + font-size: 15px; + font-weight: bold; + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.7); + opacity: 0; + transform: translateY(8px); + transition: + opacity 0.45s ease 0.1s, + transform 0.45s ease 0.1s; +} + +.picteam-mobile-caption.visible { + opacity: 1; + /* transform: translateY(0); */ +} + +.picteam-mobile-slide .picteam-accent-line { + position: absolute; + bottom: 10px; + right: 6px; + width: 3px; + height: 30px; + background: #1a8fe3; + z-index: 5; + border-radius: 2px; +} + +/* Pagination dots */ +.picteam-dots { + display: flex; + justify-content: center; + gap: 8px; + padding-top: 16px; +} + +.picteam-dot { + width: 10px; + height: 10px; + border-radius: 50%; + background: #dfdfdf; + border: none; + cursor: pointer; + transition: + background 0.25s, + width 0.25s; + outline: none; + padding: 0; +} + +.picteam-dot.active { + background: var(--color-primary); + width: 24px; + border-radius: 8px; +} + +/* ═══════════════════════════════════════════════════════ + team +═══════════════════════════════════════════════════════ */ +.team-section { + padding: 100px 0; +} + +.team-header { + text-align: center; + margin-bottom: 32px; +} + +.team-main-title { + font-size: 24px; + font-weight: bold; + color: var(--color-title); + margin-bottom: 8px; +} + +.team-main-desc { + font-size: 15px; + color: var(--color-text); + line-height: 1.7; +} + +.team-group { + margin-bottom: 32px; +} +.team-group-header { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 32px; +} + +.team-group-dot { + width: 9px; + height: 9px; + background: var(--color-primary); + border-radius: 50%; + flex-shrink: 0; +} + +.team-group-title { + font-size: 22px; + font-weight: bold; + color: var(--color-title); +} + +.team-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 24px; +} + +/* ─── Card ─── */ +.team-card { + display: flex; + align-items: stretch; + border-radius: 8px; + overflow: hidden; + min-height: 96px; +} +.team-card-info { + flex: 1; + padding: 8px; + display: flex; + flex-direction: column; +} + +.team-card-name { + font-size: 16px; + font-weight: bold; + color: var(--color-title); + margin-bottom: 8px; +} + +.team-card-role { + font-size: 13px; + color: var(--color-body-text); + line-height: 1.8; +} + +.team-card-photo { + width: 124px; + height: 124px; + flex-shrink: 0; + overflow: hidden; + background: linear-gradient(180deg, #eff6ff 0%, rgba(239, 246, 255, 0) 179.03%); + border-radius: 16px; +} + +.team-card-photo img { + width: 100%; + height: 100%; + object-fit: cover; + object-position: center top; + filter: grayscale(100%); + display: block; +} + +/* ═══════════════════════════════════════════════════════ + live in inova +═══════════════════════════════════════════════════════ */ +.live-section { + padding-bottom: 20px; + background: #ffffff; + direction: rtl; + overflow: hidden; +} + +.live-section > .container { + width: 100%; + display: flex; + align-items: flex-end; + justify-content: space-between; +} + +.live-gallery { + flex: 0 0 52%; + align-self: center; +} + +.live-gallery-image { + width: 100%; + height: auto; +} + +.live-content { + flex: 0 0 50%; + text-align: right; +} + +.live-title { + font-size: 64px; + font-weight: bold; + color: #cce3f0; +} + +.live-subtitle { + margin-bottom: 24px; + font-size: 24px; + line-height: 24px; + font-weight: bold; + color: var(--color-title); +} + +.live-text { + margin-bottom: 24px; + font-size: 16px; + font-weight: 400; + color: var(--color-text); +} + +.live-button { + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 10px 24px 10px 20px; + border-radius: 10px; + background: var(--color-primary); + color: #ffffff; + text-decoration: none; + font-size: 16px; + font-weight: 500; +} + +.live-button svg { + 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..af46ac6 --- /dev/null +++ b/src/assets/icons/portfolioP.svg @@ -0,0 +1,1475 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/assets/images/.gitkeep b/src/assets/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/images/pic2.png b/src/assets/images/pic2.png new file mode 100644 index 0000000..082f50d Binary files /dev/null and b/src/assets/images/pic2.png differ diff --git a/src/assets/images/pic3.png b/src/assets/images/pic3.png new file mode 100644 index 0000000..15351b4 Binary files /dev/null and b/src/assets/images/pic3.png differ diff --git a/src/assets/images/pic4.png b/src/assets/images/pic4.png new file mode 100644 index 0000000..4f21ea9 Binary files /dev/null and b/src/assets/images/pic4.png differ diff --git a/src/assets/images/pic5.webp b/src/assets/images/pic5.webp new file mode 100644 index 0000000..1e7352e Binary files /dev/null and b/src/assets/images/pic5.webp differ diff --git a/src/assets/images/pic6.png b/src/assets/images/pic6.png new file mode 100644 index 0000000..a387f4b Binary files /dev/null and b/src/assets/images/pic6.png differ diff --git a/src/assets/js/aboutus.js b/src/assets/js/aboutus.js new file mode 100644 index 0000000..095a7b6 --- /dev/null +++ b/src/assets/js/aboutus.js @@ -0,0 +1,811 @@ +// ========================= هیرو سکشن============== +const thumbnail = document.getElementById('videoThumbnail'); +const video = document.getElementById('aboutVideo'); + +thumbnail.addEventListener('click', () => { + thumbnail.style.display = 'none'; + + video.style.display = 'block'; + + video.play(); +}); + + + +// ========================= اسلایدر سکشن دوم============== +const slides = [ + { + type: 'image', + src: 'src/assets/images/pic2.png', + number: 'شروع داستان', + title: 'اکثر کسب‌وکارها با یک ایده جذاب شروع می‌شوند ولی اینوا با یک شکست آغاز کرد!', + description: + 'چند سال پیش، یک جوان بوشهری با این هدف وارد دنیای کسب‌وکار شد که فقط به فکر خلق درآمد نباشد. این جوان می‌خواست مسئله‌ای را حل کند، ارزشی ایجاد کند و محصول را به دست کسانی برساند که به آن نیاز دارند. اولین قدمش شد راه‌اندازی یک فروشگاه آنلاین خرما؛ محصولی اصیل، باکیفیت و ریشه‌دار.', + gradientClass: 'gradient-one', + mobilePositionClass: 'mobile-pos-one', + }, + { + type: 'image', + src: 'src/assets/images/pic4.png', + number: 'درس اول', + title: 'موفقیت فقط به کیفیت محصول وابسته نیست.', + description: + 'اما واقعیت بازار با چیزی که تصور می‌کرد متفاوت بود. محصول خوب بود، اما نمی‌فروخت. نه چون کسی خرما نمی‌خواست بلکه کسی خرمای این فروشگاه آنلاین را نمی‌دید. همان‌جا بود که جوان، درس اول را یاد گرفت: موفقیت فقط به کیفیت محصول وابسته نیست. اگر کسی از وجودت خبر نداشته باشد، بهترین محصول دنیا هم روی قفسه‌های دیجیتال خاک می‌خورد.', + gradientClass: 'gradient-two', + mobilePositionClass: 'mobile-pos-two', + }, + { + type: 'image', + src: 'src/assets/images/pic5.webp', + number: 'زمینه شکل گیری ', + title: 'پیدا کردن مشکل و راه‌حل آن', + description: + 'نه جا زد، نه ناامید شد؛ شروع کرد دنبال دلیل گشتن و آموختن بیشتر و بیشتر: از طراحی سایت و سئو گرفته تا تولید محتوا، تبلیغات دیجیتال، برندینگ و تجربه کاربری. هر پروژه، هر تجربه و هر ساعتِ یادگیری یک واقعیت را برایش روشن‌تر می‌کرد: دیده نشدن فقط مشکل او نبود. هزاران کسب‌وکار، استارتاپ و برند کوچک وجود داشتند که محصولات و خدمات ارزشمندی ارائه می‌کردند، اما نمی‌توانستند به مخاطبان درست دسترسی پیدا کنند.', + gradientClass: 'gradient-three', + mobilePositionClass: 'mobile-pos-three', + }, + { + type: 'image', + src: 'src/assets/images/pic6.png', + number: ' تولد اینوا', + title: 'اینوا از دل همین نیاز متولد شد!', + description: + 'اینوا باور دارد که رشد کسب‌وکارها نباید فقط در اختیار برندهای بزرگ با بودجه‌های سنگین باشد. هر ایده ارزشمند، هر محصول خوب و هر کسب‌وکاری که برای مشتریانش ارزش خلق می‌کند، شایسته دیده شدن است.', + gradientClass: 'gradient-three', + mobilePositionClass: 'mobile-pos-three', + }, + { + type: 'image', + src: 'src/assets/images/pic3.png', + number: ' هدف اینوا ', + title: 'اینوا در خدمت کسب و کارها', + description: + 'اینوا اینجاست تا به کسب‌وکارها کمک کند که هویت برند قدرتمندتری بسازند، مخاطبان خود را پیدا کرده و مسیر رشدشان را سریع‌تر طی کنند. چون ما از نزدیک تجربه کرده‌ایم که گاهی فاصله بین یک ایده عالی و یک کسب‌وکار موفق، فقط دیده شدن است. و این دقیقاً همان فاصله‌ای است که اینوا به‌درستی آن را پرخواهد کرد ', + gradientClass: 'gradient-three', + mobilePositionClass: 'mobile-pos-three', + }, +]; + +const showcase = document.getElementById('showcase'); +const mediaWrapper = document.getElementById('showcasemediaWrapper'); +const textTrack = document.getElementById('textTrack'); +function renderMedia() { + slides.forEach((slide, index) => { + const item = document.createElement('div'); + + item.className = ` + media-item + ${slide.gradientClass || ''} + ${slide.mobilePositionClass || ''} +`; + + if (index === 0) { + item.classList.add('active'); + } + if (slide.type === 'image' || slide.type === 'gif') { + const img = document.createElement('img'); + img.src = slide.src; + item.appendChild(img); + } + + if (slide.type === 'video') { + const video = document.createElement('video'); + + video.src = slide.src; + + video.autoplay = true; + video.loop = true; + video.muted = true; + video.playsInline = true; + + item.appendChild(video); + } + mediaWrapper.appendChild(item); + }); +} +function renderTexts() { + slides.forEach((slide) => { + const item = document.createElement('div'); + item.className = 'text-item'; + item.innerHTML = ` + ${slide.number} +

+ ${slide.title} +

+

+ ${slide.description} +

+ `; + textTrack.appendChild(item); + }); +} +renderMedia(); + +renderTexts(); + +const mediaItems = document.querySelectorAll('.media-item'); +const textItems = document.querySelectorAll('.text-item'); +const totalSlides = slides.length; +const showcaseScrollContainer = showcase.querySelector('.container-showcase'); + +document.documentElement.style.setProperty('--slides-count', slides.length); + +function setActiveSlide(current) { + mediaItems.forEach((item, index) => { + item.classList.toggle('active', index === current); + }); + + textItems.forEach((item, index) => { + item.classList.toggle('active', index === current); + }); +} + +function resetTextItemInlineStyles() { + textItems.forEach((item) => { + item.style.opacity = ''; + item.style.filter = ''; + }); +} +function updateScrollScene() { + const isMobile = window.innerWidth <= 768; + const rect = showcase.getBoundingClientRect(); + const sectionTop = window.scrollY + rect.top; + const scrollInside = window.scrollY - sectionTop; + const scrollHeight = showcaseScrollContainer?.offsetHeight ?? showcase.offsetHeight; + const maxScroll = Math.max(scrollHeight - window.innerHeight, 1); + const progress = Math.min(Math.max(scrollInside / maxScroll, 0), 1); + const exactIndex = progress * (totalSlides - 1); + const current = Math.round(exactIndex); + + if (isMobile) { + textTrack.style.transform = 'translateY(0)'; + resetTextItemInlineStyles(); + setActiveSlide(current); + + return; + } + + textTrack.style.transform = `translateY(-${exactIndex * 60}vh)`; + + textItems.forEach((item) => { + item.classList.remove('active'); + }); + + textItems.forEach((item, index) => { + const offset = index - exactIndex; + + let blur = 0; + let opacity = 1; + + if (offset > 0) { + const enterProgress = Math.min(offset, 1); + + blur = Math.max((enterProgress - 0.35) * 14, 0); + + opacity = Math.min(1.2 - enterProgress, 1); + } + + item.style.filter = `blur(${blur}px)`; + + item.style.opacity = opacity; + }); + + setActiveSlide(current); +} + +window.addEventListener('scroll', updateScrollScene); + +window.addEventListener('resize', updateScrollScene); + +updateScrollScene(); + +// =========================================== 300پروژه ================================================ + +document.addEventListener('DOMContentLoaded', () => { + const stats = [ + { number: '1.5X', text: 'افزایش رشد/فروش' }, + { number: '45+', text: 'تعداد مشتریان' }, + { number: '91%', text: 'رضایت کارفرمایان' }, + { number: '300+', text: 'پروژه موفق' }, + ]; + + const numberEl = document.getElementById('mobileNumber'); + const textEl = document.getElementById('mobileText'); + const content = document.querySelector('.mobile-content'); + + let index = 0; + + setInterval(() => { + content.classList.add('fade-out'); + + setTimeout(() => { + index = (index + 1) % stats.length; + + numberEl.textContent = stats[index].number; + textEl.textContent = stats[index].text; + + content.classList.remove('fade-out'); + }, 500); + }, 3000); +}); + +//op-box + +function initOpSlider() { + const slider = document.querySelector('.op-box'); + const pagination = document.querySelector('.op-pagination'); + + if (!slider || !pagination) { + return; + } + + let track = slider.querySelector('.op-track'); + + if (!track) { + track = document.createElement('div'); + track.className = 'op-track'; + + while (slider.firstChild) { + track.appendChild(slider.firstChild); + } + + slider.appendChild(track); + } + + const cards = track.querySelectorAll('.op-card'); + + if (!cards.length) { + return; + } + + let cardWidth = 0; + let cardsPerPage = 1; + let totalPages = 1; + + function getCardsPerPage() { + const width = slider.clientWidth; + + if (width <= 768) { + return 1; + } + + if (width <= 1099) { + return 2; + } + + return 3; + } + + function getMaxScroll() { + return Math.max(0, slider.scrollWidth - slider.clientWidth); + } + + function getScrollOffset() { + const max = getMaxScroll(); + + return Math.max(0, max - slider.scrollLeft); + } + + function getCurrentPage() { + if (!cardWidth) { + return 0; + } + + const max = getMaxScroll(); + + if (max <= 0) { + return 0; + } + + const offset = getScrollOffset(); + + if (offset <= 8) { + return 0; + } + + if (offset >= max - 8) { + return totalPages - 1; + } + + return Math.min(Math.round(offset / (cardWidth * cardsPerPage)), totalPages - 1); + } + + function scrollToPage(page) { + const max = getMaxScroll(); + const target = max - Math.min(page * cardsPerPage * cardWidth, max); + + slider.scrollTo({ + left: target, + behavior: 'smooth', + }); + } + + function updateDots() { + const page = getCurrentPage(); + + pagination.querySelectorAll('.op-dot').forEach((dot, dotIndex) => { + dot.classList.toggle('active', dotIndex === page); + }); + } + + function setupSlider() { + const gap = parseFloat(window.getComputedStyle(track).gap) || 20; + const previousPage = cardWidth ? getCurrentPage() : 0; + + cardsPerPage = getCardsPerPage(); + + const cardBasis = + cardsPerPage === 1 + ? Math.min(358, slider.clientWidth - 48) + : (slider.clientWidth - gap * (cardsPerPage - 1)) / cardsPerPage; + + cards.forEach((card) => { + card.style.flex = `0 0 ${cardBasis}px`; + card.style.width = `${cardBasis}px`; + card.style.maxWidth = `${cardBasis}px`; + }); + + cardWidth = cardBasis + gap; + totalPages = Math.ceil(cards.length / cardsPerPage); + + pagination.innerHTML = ''; + + for (let i = 0; i < totalPages; i++) { + const dot = document.createElement('button'); + dot.type = 'button'; + dot.classList.add('op-dot'); + dot.setAttribute('aria-label', `اسلاید ${i + 1}`); + + dot.addEventListener('click', () => { + scrollToPage(i); + }); + + pagination.appendChild(dot); + } + + const max = getMaxScroll(); + slider.scrollLeft = max - Math.min(previousPage * cardsPerPage * cardWidth, max); + updateDots(); + } + + setupSlider(); + window.addEventListener('resize', setupSlider); + slider.addEventListener('scroll', () => requestAnimationFrame(updateDots), { passive: true }); + + const DRAG_THRESHOLD = 40; + + let isDown = false; + let startX = 0; + let startScroll = 0; + let startPage = 0; + + slider.addEventListener('pointerdown', (e) => { + if ('mouse' === e.pointerType && 0 !== e.button) { + return; + } + + isDown = true; + startX = e.clientX; + startScroll = slider.scrollLeft; + startPage = getCurrentPage(); + slider.setPointerCapture(e.pointerId); + slider.style.scrollBehavior = 'auto'; + slider.style.cursor = 'grabbing'; + }); + + slider.addEventListener('pointermove', (e) => { + if (!isDown) { + return; + } + + e.preventDefault(); + slider.scrollLeft = startScroll - (e.clientX - startX); + }); + + function endDrag(e) { + if (!isDown) { + return; + } + + isDown = false; + slider.style.scrollBehavior = ''; + slider.style.cursor = 'grab'; + + const delta = e.clientX - startX; + let targetPage = startPage; + + if (delta > DRAG_THRESHOLD) { + targetPage = startPage + 1; + } else if (delta < -DRAG_THRESHOLD) { + targetPage = startPage - 1; + } + + scrollToPage(Math.max(0, Math.min(totalPages - 1, targetPage))); + } + + slider.addEventListener('pointerup', endDrag); + slider.addEventListener('pointercancel', endDrag); + + slider.style.cursor = 'grab'; +} + +document.addEventListener('DOMContentLoaded', initOpSlider); + +// ================scroll logos======================== +document.querySelectorAll('.slider-track').forEach((track) => { + const items = Array.from(track.children); + items.forEach((item) => track.appendChild(item.cloneNode(true))); +}); + +// =========================================== تایم لاین================================================ +(function () { + const track = document.getElementById('timelineTrack'); + const viewport = document.getElementById('timelineViewport'); + const btnPrev = document.getElementById('timelinePrev'); + const btnNext = document.getElementById('timelineNext'); + + let currentIndex = 0; // how many cards we've "shifted" from start + const MOBILE_BP = 768; + + /* ── helpers ── */ + function isMobile() { + return window.innerWidth <= MOBILE_BP; + } + + function getCardWidth() { + const firstCard = track.querySelector('.timeline-card'); + if (!firstCard) return 0; + const style = getComputedStyle(firstCard); + const gap = parseFloat(getComputedStyle(track).gap) || 24; + return firstCard.offsetWidth + gap; + } + + function totalCards() { + return track.querySelectorAll('.timeline-card').length; + } + + function visibleCount() { + if (window.innerWidth <= 768) return 1; + if (window.innerWidth <= 1024) return 2; + return 3; + } + + function maxIndex() { + return Math.max(0, totalCards() - visibleCount()); + } + + /* RTL: positive translate moves content right (shows earlier cards). + We invert: moving "next" (newer) shifts track to the right => translateX positive */ + function applyTransform() { + const shift = currentIndex * getCardWidth(); + // RTL: shifting positive moves older cards into view (goes left visually) + track.style.transform = `translateX(${shift}px)`; + } + + function updateButtons() { + btnPrev.disabled = currentIndex <= 0; + btnNext.disabled = currentIndex >= maxIndex(); + } + + function goTo(index) { + currentIndex = Math.max(0, Math.min(index, maxIndex())); + applyTransform(); + updateButtons(); + } + + /* ── nav click ── */ + btnPrev.addEventListener('click', () => goTo(currentIndex - 1)); + btnNext.addEventListener('click', () => goTo(currentIndex + 1)); + + /* ── touch / swipe ── */ + let touchStartX = 0; + let touchStartY = 0; + let isDragging = false; + + track.addEventListener( + 'touchstart', + (e) => { + touchStartX = e.touches[0].clientX; + touchStartY = e.touches[0].clientY; + isDragging = false; + }, + { passive: true } + ); + + track.addEventListener( + 'touchmove', + (e) => { + const dx = e.touches[0].clientX - touchStartX; + const dy = e.touches[0].clientY - touchStartY; + if (!isDragging && Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > 8) { + isDragging = true; + } + if (isDragging) e.preventDefault(); + }, + { passive: false } + ); + + track.addEventListener('touchend', (e) => { + if (!isDragging) return; + const dx = e.changedTouches[0].clientX - touchStartX; + const threshold = 50; + if (dx > threshold) goTo(currentIndex - 1); + if (dx < -threshold) goTo(currentIndex + 1); + isDragging = false; + }); + + /* ── resize ── */ + let resizeTimer; + window.addEventListener('resize', () => { + clearTimeout(resizeTimer); + resizeTimer = setTimeout(() => { + currentIndex = Math.min(currentIndex, maxIndex()); + applyTransform(); + updateButtons(); + initToggleVisibility(); + }, 120); + }); + + /* ── show/hide "بیشتر" only when text actually overflows 6 lines ── */ + function initToggleVisibility() { + track.querySelectorAll('.timeline-card__body').forEach((body) => { + const index = body.id.replace('body-', ''); + const toggle = document.getElementById(`toggle-${index}`); + if (!toggle) return; + + // Temporarily remove clamp to measure full natural height + body.style.webkitLineClamp = 'unset'; + body.style.display = 'block'; + const fullHeight = body.scrollHeight; + + // Re-apply clamp and measure clamped height + body.style.webkitLineClamp = ''; + body.style.display = ''; + const clampedHeight = body.clientHeight; + + // If already expanded, keep button visible regardless + if (body.classList.contains('is-expanded')) { + toggle.classList.add('is-visible'); + return; + } + + // Show button only if content is taller than what's visible + if (fullHeight > clampedHeight + 2) { + toggle.classList.add('is-visible'); + } else { + toggle.classList.remove('is-visible'); + } + }); + } + + /* ── init ── */ + updateButtons(); + // Run after fonts/layout settle + if (document.fonts && document.fonts.ready) { + document.fonts.ready.then(initToggleVisibility); + } else { + setTimeout(initToggleVisibility, 200); + } + + /* ── expose toggleCard globally ── */ + window.toggleCard = function (index) { + const body = document.getElementById(`body-${index}`); + const toggle = document.getElementById(`toggle-${index}`); + const icon = toggle.querySelector('.timeline-card__toggle-icon'); + const label = toggle.querySelector('.timeline-card__toggle-label'); + const expanded = body.classList.toggle('is-expanded'); + icon.textContent = expanded ? '−' : '+'; + label.textContent = expanded ? 'کمتر' : 'بیشتر'; + toggle.setAttribute('aria-expanded', expanded); + }; +})(); + +// ================ pic team======================== + +const picteamSlides = [ + { + src: './public/images/pic2.png', + caption:'خانواده خلاق اینوا', + }, + { + src: './public/images/pic1.png', + caption: ' جلسات گروهی برای خلق ایده های ناب ', + }, + { + src: './public/images/pic3.png', + caption: ' جادوی سینما به سبک اینوا ', + }, +]; + +const total = picteamSlides.length; +let current = 0; +let captionVisible = false; + +/* ─── BUILD DESKTOP ─── */ +const track = document.getElementById('picteamTrack'); + +picteamSlides.forEach((s, i) => { + const slide = document.createElement('div'); + slide.className = 'picteam-slide'; + slide.dataset.index = i; + + const img = document.createElement('img'); + img.src = s.src; + img.alt = s.caption; + img.loading = 'lazy'; + + const line = document.createElement('div'); + line.className = 'picteam-accent-line'; + + const caption = document.createElement('div'); + caption.className = 'picteam-caption'; + caption.textContent = s.caption; + + slide.appendChild(img); + slide.appendChild(line); + slide.appendChild(caption); + track.appendChild(slide); + +slide.addEventListener('mouseenter', () => { + if (slide.classList.contains('active') && !captionVisible) { + captionVisible = true; + const cap = slide.querySelector('.picteam-caption'); + setTimeout(() => cap.classList.add('visible'), 80); + } +}); + +}); + +function mod(n, m) { + return ((n % m) + m) % m; +} + +function updateDesktop(animate) { + const slides = track.querySelectorAll('.picteam-slide'); + const prevIdx = mod(current - 1, total); + const nextIdx = mod(current + 1, total); + + slides.forEach((slide, i) => { + const caption = slide.querySelector('.picteam-caption'); + slide.className = 'picteam-slide'; + caption.className = 'picteam-caption'; + + if (i === current) { + slide.classList.add('active'); + if (captionVisible) { + // small delay so transition is visible + setTimeout(() => caption.classList.add('visible'), 150); + } + } else if (i === prevIdx) { + slide.classList.add('prev'); + } else if (i === nextIdx) { + slide.classList.add('next'); + } else { + slide.classList.add('hidden'); + } + }); +} + +document.getElementById('picteamPrev').addEventListener('click', () => { + current = mod(current - 1, total); + captionVisible = true; + updateDesktop(true); + updateMobile(); +}); + +document.getElementById('picteamNext').addEventListener('click', () => { + current = mod(current + 1, total); + captionVisible = true; + updateDesktop(true); + updateMobile(); +}); + +/* ─── BUILD MOBILE ─── */ +const mobileTrack = document.getElementById('picteamMobileTrack'); +const dotsContainer = document.getElementById('picteamDots'); + +picteamSlides.forEach((s, i) => { + // slide + const slide = document.createElement('div'); + slide.className = 'picteam-mobile-slide'; + + const img = document.createElement('img'); + img.src = s.src; + img.alt = s.caption; + img.loading = 'lazy'; + + const line = document.createElement('div'); + line.className = 'picteam-accent-line'; + + const caption = document.createElement('div'); + caption.className = 'picteam-mobile-caption'; + caption.textContent = s.caption; + + slide.appendChild(img); + slide.appendChild(line); + slide.appendChild(caption); + mobileTrack.appendChild(slide); + + // dot + const dot = document.createElement('button'); + dot.className = 'picteam-dot' + (i === 0 ? ' active' : ''); + dot.setAttribute('aria-label', `اسلاید ${i + 1}`); + dot.addEventListener('click', () => { + current = i; + updateMobile(); + updateDesktop(true); + }); + dotsContainer.appendChild(dot); +}); + +function updateMobile() { + mobileTrack.style.transform = `translateX(${current * 100}%)`; + + // dots + const dots = dotsContainer.querySelectorAll('.picteam-dot'); + dots.forEach((d, i) => d.classList.toggle('active', i === current)); + + // captions + const mobileCaptions = mobileTrack.querySelectorAll('.picteam-mobile-caption'); + mobileCaptions.forEach((c, i) => { + c.className = 'picteam-mobile-caption'; + if (i === current && captionVisible) { + setTimeout(() => c.classList.add('visible'), 150); + } + }); +} + +/* RTL swipe: drag right = prev, drag left = next */ +let touchStartX = 0; +let touchEndX = 0; + +const mobileWrapper = document.getElementById('picteamMobileWrapper'); + +mobileWrapper.addEventListener( + 'touchstart', + (e) => { + touchStartX = e.changedTouches[0].clientX; + }, + { passive: true } +); + +mobileWrapper.addEventListener( + 'touchend', + (e) => { + touchEndX = e.changedTouches[0].clientX; + const diff = touchStartX - touchEndX; + if (Math.abs(diff) > 40) { + if (diff > 0) { + // swipe left → next (in LTR terms) → in RTL = previous slide + current = mod(current - 1, total); + } else { + // swipe right → prev (in LTR terms) → in RTL = next slide + current = mod(current + 1, total); + } + updateMobile(); + updateDesktop(true); + } + }, + { passive: true } +); + +/* ─── INTERSECTION OBSERVER (scroll reveal captions) ─── */ +const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (entry.isIntersecting && !captionVisible) { + // captionVisible = true; + // updateDesktop(false); + // updateMobile(); + observer.unobserve(entry.target); + } + }); + }, + { threshold: 0.4 } +); + +observer.observe(document.getElementById('picteam')); + +/* ─── INIT ─── */ +updateDesktop(false); +updateMobile(); 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/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..fbfb7f0 --- /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'), + footer: resolve(__dirname, 'aboutus.html'), + }, + }, + manifest: true, + cssCodeSplit: true, + }, + + server: { + open: true, + port: 5173, + }, +});