commit 48bd4c18782619361876b612f58efd61c09216d6 Author: Azita Rahimi Date: Wed Jun 17 13:17:47 2026 +0330 Initial commit 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/archive.html b/archive.html new file mode 100644 index 0000000..1af391d --- /dev/null +++ b/archive.html @@ -0,0 +1,785 @@ + + + + + + + + + + + + + +
+ + +
+
+
+
+ + + + +
+

+ هر پروژه یک داستان است؛ داستانی که شما +
+ قهرمان آن هستید. +

+ +

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

+
+
+ 0 + +
پروژه موفق
+
+ +
+ 0 + +
رضایت کارفرمایان
+
+ +
+ 0 + +
تعداد مشتریان
+
+ +
+ 0 + +
افزایش رشد/فروش مشتریان
+
+
+
+
+
+
+
+ + + +
+ + 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/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/src/assets/css/archive-responsive.css b/src/assets/css/archive-responsive.css new file mode 100644 index 0000000..352a2c5 --- /dev/null +++ b/src/assets/css/archive-responsive.css @@ -0,0 +1,43 @@ +@media screen and (max-width: 1400px) { +} +@media screen and (max-width: 1200px) { +} +@media screen and (max-width: 992px) { +} +@media screen and (max-width: 768px) { + .hero-card { + height: 546px; + } + .container-hero-section { + padding: 0; + } + .hero-content { + padding: 0 20px; + margin-top: 62px; + } + .hero-title { + font-size: 24px; + } + .hero-txt { + font-size: 15px; + margin-bottom: 0; + } + .stats { + grid-template-columns: repeat(2, 1fr); + } +.counter{ + font-size:28px; +} + .stat-item::after { + display: none; + } + + .stat-item { + border: none; + } + .filter-toggle-btn{ + padding: 7px 20px 7px 20px; + } +} +@media screen and (max-width: 576px) { +} diff --git a/src/assets/css/archive.css b/src/assets/css/archive.css new file mode 100644 index 0000000..8faa44f --- /dev/null +++ b/src/assets/css/archive.css @@ -0,0 +1,1089 @@ +.container { + max-width: 1240px; + padding: 0 20px; + margin: 0 auto; +} + /* ==============================================هیرو سکشن================================= */ + .hero-section { + 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: 458px; + background-color: #eff6ff; + border-radius: 10px; + overflow: hidden; + display: flex; + justify-content: center; +} +.hero-content { + margin-top: 80px; + display: inline-flex; + flex-direction: column; + text-align: center; + 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; + margin-bottom: 16px; +} +.hero-txt { + color: var(--color-text); + font-size: 16px; + font-weight: 400; + margin-bottom: 24px; +} +.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; +} + +.stats{ + display:grid; + grid-template-columns:repeat(4,1fr); + margin-bottom: 24px; +} + +.stat-item{ + text-align:center; + padding:24px 12px; + position:relative; +} + +.stat-item:not(:last-child)::after{ + content:""; + position:absolute; + left:0; + top:10%; + width:1px; + height:80%; + background:#dfe7f1; +} + +.counter{ + color:var(--color-primary); + font-size:40px; + font-weight:bold; + margin-bottom:8px; + display:block; + direction: ltr; +} + +.stat-text{ + color:var(--color-text); + font-size:14px; +} +/* ============================================== آرشیو سکشن================================= */ +.gallery-section-header{ + width: 100%; + text-align: center; + margin-bottom: 24px; +} +.gallery-section-header p{ +font-size:14px; +margin-top: 8; +} +.gallery-section { + margin: 100px 0; +} +.gallery-section .tabs { + display: flex; + gap: 1rem; + margin-top: 16px; +} +.gallery-section .tabs button { + display: flex; + align-items: center; + justify-content: center; + height: 36px; + padding: 0 13px; + border-radius: 10px; + border: 1px solid #505068; + color: #505068; +} +.gallery-section .tabs button .txt { + font-size: 14px; + color: inherit; +} +.gallery-section .tabs button:hover { + border-color: #0274b3; + color: #0274b3; +} +.gallery-section .tabs button.current { + border-color: #0274b3; + background-color: #0274b3; + color: #fff; +} +.gallery-section .gallery-thumbnail { + margin: 24px 0 32px; +} +.gallery-section .gallery-thumbnail p { + display: none; +} +.gallery-section .gallery-thumbnail .thumbnail { + position: relative; + max-width: 720px; + margin: 0 auto; + border-radius: 16px; + overflow: hidden; + cursor: pointer; +} +.gallery-section .gallery-thumbnail .thumbnail::before { + content: ''; + position: absolute; + inset: 0; + pointer-events: none; + background-image: linear-gradient(#00000000, #000000); + opacity: 0; + transition: opacity 200ms; +} +.gallery-section .gallery-thumbnail .thumbnail:hover::before { + opacity: 1; +} +.gallery-section .gallery-thumbnail .thumbnail img { + display: block; + width: 100%; + height: auto; + aspect-ratio: 16 / 9; + object-fit: cover; +} +.gallery-section .gallery-thumbnail .thumbnail .expand-icon { + position: absolute; + right: 50%; + bottom: 0; + transform: translateX(50%); + + display: grid; + place-items: center; + width: 48px; + height: 48px; + border-radius: 6px 6px 0 0; + background-color: #fff; +} +.gallery-section .gallery-thumbnail .thumbnail .expand-icon svg { + width: 32px; + height: 32px; + transition: scale 200ms; +} +.gallery-section .gallery-thumbnail .thumbnail .cta { + position: absolute; + bottom: 50%; + right: 50%; + transform: translate(50%, 50%); +height: 40px; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 4px 12px 4px 10px; + background-color: #eaf7ff; + border-radius: 8px; + opacity: 0; + transition: opacity 200ms; +} +.gallery-section .gallery-thumbnail .thumbnail .cta .txt { + font-size: 14px; + color: #0274b3; +} +.gallery-section .gallery-thumbnail .thumbnail .cta svg { + width: 20px; + height: 20px; + stroke: #0274b3; +} +.gallery-section .gallery-thumbnail .thumbnail:hover .expand-icon svg { + scale: 1.15; +} +.gallery-section .gallery-thumbnail .thumbnail:hover .cta { + opacity: 1; + height: 40px; + font-size: 15px; +} +.gallery-section .gallery-items { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 24px 16px; + list-style-type: none; +} +.gallery-section .gallery-items li { + position: relative; + border-radius: 10px; + overflow: hidden; + cursor: pointer; +} +.gallery-section .gallery-items li::before { + content: ''; + position: absolute; + inset: 0; + background-image: linear-gradient(#00141f00, #00141f); + opacity: 0; + transition: opacity 200ms; +} +.gallery-section .gallery-items li img { + display: block; + width: 100%; + height: auto; + aspect-ratio: 4 / 3; + object-fit: cover; +} +.gallery-section .gallery-items li .title { + position: absolute; + bottom: 0; + right: 0; + left: 0; + padding: 0px 12px 16px; + display: flex; + opacity: 0; + transition: opacity 200ms; +} +.gallery-section .gallery-items li .title .txt { + font-size: 15px; + line-height: 1.7; + font-weight: bold; + color: #fff; +} +.gallery-section .gallery-items li .title svg { + width: 24px; + height: 24px; + stroke: #fff; + margin-right: auto; +} +.gallery-section .gallery-items li:hover .title { + opacity: 1; +} +.gallery-section .gallery-items li:hover::before { + opacity: 1; +} +.gallery-section .b-cta { + height: 40px; + background-color: var(--color-primary); + border-radius: 10px; + padding: 0 12px; + + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + + width: fit-content; + margin: 32px auto 0; +} +.gallery-section .b-cta .txt { + font-size: 15px; + color: #ffffff; + font-weight: 400; +} +.gallery-section .b-cta svg { + width: 20px; + height: 20px; + stroke: #fff; +} +.pagination { + margin-top: 32px; +} +.pagination ul { + list-style-type: none; + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + margin: initial; +} +.pagination ul a { + width: 32px; + height: 32px; + display: grid; + place-items: center; + border-radius: 8px; + font-size: 16px; + font-weight: normal; + border: none; + color: #000; + transform: none; + line-height: normal; + transition: none; + box-shadow: 2px 10px 20px 0 #595c6018; +} +.pagination ul a svg { + width: 16px; + height: 16px; + stroke: #505068; +} +.pagination ul li:not(.current):hover a { + background-color: #e5efff; +} +.pagination ul li:not(.current):hover a svg { + stroke: var(--color-primary); +} +.pagination ul .current a { + background-color: var(--color-primary); + color: #fff; +} +@media screen and (max-width: 768px) { + .gallery-section .gallery-items { + grid-template-columns: repeat(1, 1fr); + } + .gallery-section .gallery-thumbnail .thumbnail { + margin: 0 -20px; + border-radius: 0; + } + .gallery-section .gallery-thumbnail p { + display: inline-block; + font-size: 15px; + font-weight: bold; + margin-top: 16px; + color: var(--color-title); + } + .gallery-section .gallery-items li:hover::before, + .gallery-section .gallery-items li .title svg { + display: none; + } + .gallery-section .gallery-items li .title { + position: static; + padding: initial; + opacity: 1 !important; + } + .gallery-section .gallery-items li .title .txt { + font-size: 15px; + font-weight: bold; + margin-top: 8px; + color: var(--color-title); + } + .gallery-section .gallery-items li { + overflow: visible; + } + .gallery-section .gallery-items li img { + border-radius: 10px; + } +} + +.related-header { + display: flex; + justify-content: space-between; + gap: 100px; + padding-bottom: 24px; +} +.related-title { + margin-bottom: 8px; +} +.related-button { + display: flex; + gap: 8px; + height: 40px; + align-self: center; + align-items: center; +} +.related-button span { + font-size: 15px; + font-weight: normal; + line-height: 1.6; +} +.related-button svg { + fill: var(--color-title); +} +.related-button span { + color: var(--color-title); +} +.related-button:hover svg { + fill: var(--color-primary); +} +.related-button:hover span { + color: var(--color-primary); +} +.related-button-mobile { + display: none; +} +.related-button:hover svg { + transform: translateX(-4px); +} + +.related-boxes { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 389px)); + gap: 16px; +margin-top: 24px; + justify-content: center; +} +.related-card { + width: 100%; + aspect-ratio: 4 / 3; +} +.related-image { + width: 100%; + height: 292px; + border-radius: 10px; + overflow: hidden; + position: relative; + object-fit: cover; +} +.media-container { + width: 100%; + height: 100%; +} +.related-image img, +.media-container video { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + transition: transform 0.5s ease; +} +.related-content { + margin-top: 16px; +} +.related-content h3 { + font-size: 15px; + margin-bottom: 8px; +} +.related-content p { + font-size: 12px; +} +.down-txt { + display: none; + margin-top: 8px; +} +.down-txt span { + font-size: 15px; + font-weight: bold; +} +.overlay-layer { + position: absolute; + inset: 0; + background-image: url(/src/img/overlay.svg); + border-radius: 10px; + display: flex; + align-items: flex-end; + opacity: 0; + visibility: hidden; + transition: + opacity 0.35s ease, + visibility 0.35s ease; + z-index: 2; +} +.related-card:hover .overlay-layer { + opacity: 1; + visibility: visible; +} +.button-overlay { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + z-index: 3; + padding: 12px 12px 16px 12px; +} +.button-overlay svg { + width: 24px; + height: 24px; + fill: white; + transition: 0.3s; +} +.date { + color: #ffffff; + font-size: 13px; + font-weight: normal; +} +.namepopup { + color: #ffffff; + font-size: 18px; + font-weight: bold; + line-height: 1.4; +} +.play-btn { + position: absolute; + top: 12px; + left: 12px; + border-radius: 50%; + border: none; + opacity: 0; + display: flex; + justify-content: center; + align-items: center; + z-index: 10; + width: 32px; + height: 32px; +} +.progress-ring { + position: absolute; + top: 13px; + left: 13px; + overflow: visible; + z-index: 20; + transform: rotate(180deg); +} +.progress-circle { + fill: transparent; + stroke: white; + stroke-width: 2; + stroke-linecap: round; +} +.play-icon { + width: 100%; + height: 100%; + fill: white; + position: absolute; + z-index: 3; + transition: + opacity 0.25s ease, + transform 0.25s ease; +} +.icon-play { + opacity: 1; +} +.icon-pause { + opacity: 0; +} +.related-card:hover .icon-pause { + opacity: 1; +} +.related-card:hover .icon-play { + opacity: 0; +} +.is-video .play-btn { + opacity: 1; +} +.is-image .play-btn { + display: none; +} + +.media-section { + width: 100%; + overflow: hidden; +} +.media { + height: 100%; + width: 100%; + object-fit: cover; + object-position: center; + display: block; +} + +/* ====================فیلتر============================== */ + +/* ================================================ + FILTER STICKY BAR + ================================================ */ + +.filter-sticky-wrapper { + position: sticky; + top: 100px; + z-index: 100; + margin-bottom: 24px; + + width: 100%; + padding-left: max(calc((100vw - 1240px) / 2), 20px); + box-sizing: border-box; + margin: auto 0 0 0; +} + +.filter-bar { + border-radius: 12px; +} + +.filter-bar-inner { + display: flex; + align-items: center; + flex-wrap: wrap; + position: relative; + +} + +/* ---- Toggle Button ---- */ +.filter-toggle-btn { + display: flex; + align-items: center; + gap: 8px; + height: 40px; + padding: 7px 120px 7px 24px; + border-radius: 10px 0 0 10px; + color: #ffffff; + background: #0274B3; + font-size: 14px; + cursor: pointer; + white-space: nowrap; + transition: + border-radius .25s ease, + background-color .2s ease, + color .2s ease; + flex-shrink: 0; +} +.filter-bar-inner:has(.filter-controls.is-open) .filter-toggle-btn { + border-radius: 0; +} +/* ---- Desktop Filter Controls ---- */ +.filter-controls { + display: flex; + opacity: 0; + visibility: hidden; + transform: scaleX(0.95); + transform-origin: right center; + max-width: 0; + /* overflow: hidden; */ + transition: + opacity 1.25s ease, + transform 1.25s ease; + align-items: center; + gap: 8px; + flex: 1; + flex-wrap: wrap; +padding-right: 8px; + background-color:#0274B3; + border-radius: 10px 0 0 10px; + height: 40px; +} + +.filter-controls.is-open { + display: flex; + opacity: 1; + visibility: visible; + transform: translateX(0); + max-width: 100vw; +} + +/* ---- Filter Group (accordion trigger) ---- */ +.filter-group { + position: relative; +} + +.filter-group-btn { + display: flex; + align-items: center; + gap: 6px; + height: 32px; + padding: 7px 12px; + border-radius: 10px; + border: 1px solid #DFDFDF; + color: var(--color-primary); + background-color: #DBEFFF; + font-size: 14px; + cursor: pointer; + white-space: nowrap; + transition: border-color 0.2s, color 0.2s; +} + +.filter-group-btn:hover, +.filter-group-btn.is-active { + border-color: #0274b3; + color: #0274b3; +} + +.filter-group-btn .chevron-icon { + transition: transform 0.25s; + flex-shrink: 0; +} + +.filter-group-btn.is-active .chevron-icon { + transform: rotate(180deg); +} + +/* ---- Tag Count Badge ---- */ +.filter-badge { + display: none; + justify-content: center; + width: 20px; + height: 20px; + padding: 5px; + border-radius: 50%; + background: var(--color-primary); + color: #ffffff; + font-size: 12px; + font-weight: bold; + line-height: 1; +} + +.tag-txt{ + margin-left: 8px; +} +/* ---- Dropdown Panel ---- */ +.filter-dropdown { + position: absolute; + top: calc(100% + 8px); + right: 0; + min-width: 190px; + background: #ffffff; + border-radius: 10px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12); + padding: 6px; + display: none; + z-index: 200; + animation: dropFadeIn 0.18s ease; +} + +.filter-dropdown.is-open { + display: block; +} + +@keyframes dropFadeIn { + from { opacity: 0; transform: translateY(-6px); } + to { opacity: 1; transform: translateY(0); } +} + +/* ---- Checkbox Row ---- */ +.filter-check-item { + display: flex; + align-items: center; + gap: 10px; + padding:8px ; + border-radius: 6px; + cursor: pointer; + font-size: 14px; + color: var(--color-text); + transition: background-color 0.15s; + direction: rtl; + user-select: none; +} + + +.filter-check-item:hover .filter-checkbox:not(:checked) { + background: #C5EAFF; + border-color: #C5EAFF; +} + +.filter-checkbox:checked { + background: #0274B3; + border-color: #0274B3; +} + +.filter-checkbox { + appearance:none; + width: 18px; + height: 18px; + border:1px solid #999; + border-radius:4px; + margin:0; + accent-color: var(--color-primary); + cursor: pointer; + flex-shrink: 0; + position: relative; +} + + +.filter-checkbox:checked::after { + content: ""; + position: absolute; + top: 0; + left: 30%; + transform: translate(-50%, -50%); + width: 5px; + height: 11px; + border: solid white; + border-width: 0 3px 3px 0; + transform: rotate(45deg); +} + +/* ---- Clear Button ---- */ +.filter-clear-btn { + display: flex; + align-items: center; + gap: 6px; + height: 32px; + padding: 0 12px; + border-radius: 8px; + color: #ffffff; + background: transparent; + font-size: 14px; + cursor: pointer; + font-weight: 400; + white-space: nowrap; + transition: background-color 0.2s, color 0.2s; +} + +.filter-clear-btn:disabled { + color: #015F93; + opacity: .5; + cursor: not-allowed; +} +.filter-clear-btn:disabled svg { + stroke: #015F93; + transition: stroke 0.2s; +} +.filter-clear-btn svg { + stroke: #ffffff; + transition: stroke 0.2s; +} + +.filter-clear-btn:hover svg { + stroke: #ffffff; +} + +/* ---- Project Count ---- */ +.filter-count-text { + font-size: 13px; + color: #CCE3F0; + margin-right: auto; + padding-left: 16px; + white-space: nowrap; +} + +/* ================================================ + MOBILE POPUP + ================================================ */ + +.filter-mobile-overlay { + display: none; + position: fixed; + inset: 0; + z-index: 1000; + background: rgba(0, 0, 0, 0.45); + animation: overlayFadeIn 0.22s ease; +} + +.filter-mobile-overlay.is-open { + display: flex; + align-items: stretch; +} + +@keyframes overlayFadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +.filter-mobile-popup { + background: #ffffff; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + animation: popupSlideIn 0.28s ease; + border-radius: 16px 16px 0 0; +} + +@keyframes popupSlideIn { + from { transform: translateX(100%); } + to { transform: translateX(0); } +} + +/* ---- Header ---- */ +.filter-mobile-header { + display: flex; + align-items: center; + padding: 24px 20px 26px 20px; + border-bottom: 1px solid #eeeeee; + gap: 8px; + direction: rtl; + flex-shrink: 0; +} + +.filter-mobile-title { + flex: 1; + font-size: 18px; + font-weight: bold; + color: #171637; + text-align: right; + margin: 0; +} + +.filter-mobile-back, +.filter-mobile-close { + display: flex; + align-items: center; + justify-content: center; +align-items: flex-start; + border: none; + background: transparent; + border-radius: 8px; + cursor: pointer; + flex-shrink: 0; + transition: background-color 0.15s; +} +.filter-mobile-back span{ + font-size: 16px; + padding-left: 8px; + font-weight: 400; +} +.filter-mobile-back:hover, +.filter-mobile-close:hover { + background: #f5f5f5; +} + +/* ---- Main List ---- */ +.filter-mobile-main { + flex: 1; + overflow-y: auto; + display: none; + direction: rtl; +} + +.filter-mobile-main.is-visible { + display: block; +} + +.filter-mobile-option-btn { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + border: none; + border-bottom: 1px solid #f0f0f0; + background: transparent; + font-size: 14px; + color: var(--color-text); + cursor: pointer; + direction: rtl; + transition: background-color 0.15s; +} + +.filter-mobile-option-btn:hover { + background: #f9f9f9; +} + +/* ---- Sub Views (category / tags) ---- */ +.filter-mobile-sub { + flex: 1; + overflow-y: auto; + display: none; + direction: rtl; +} + +.filter-mobile-sub.is-visible { + display: block; +} + +.filter-mobile-sub .filter-check-item { + padding: 15px 20px; + border-radius: 0; + border-bottom: 1px solid #f5f5f5; +} + +/* ---- Footer Buttons ---- */ +.filter-mobile-footer { + display: flex; + gap: 12px; + padding: 16px 20px; + border-top: 1px solid #eeeeee; + direction: rtl; + flex-shrink: 0; +} + +.filter-mobile-apply { + flex: 1; + padding: 8px 12px; + border-radius: 10px; + border: none; + background: var(--color-primary); + color: #ffffff; + font-size: 15px; + font-weight: 400; + cursor: pointer; + transition: background-color 0.2s, opacity 0.2s; +} + +.filter-mobile-apply:disabled { + opacity: 0.35; + cursor: not-allowed; +} + +.filter-mobile-apply:not(:disabled):hover { + background: #025d91; +} + +.filter-mobile-clear { + flex: 1; +padding: 8px 16px ; + border-radius: 10px; + border: 1px solid var(--color-primary); + + color: var(--color-primary); + font-size: 15px; + font-weight: 400; + cursor: pointer; + transition: background-color 0.2s, color 0.2s, opacity 0.2s; +} + +.filter-mobile-clear:disabled { + opacity: 0.35; + cursor: not-allowed; +} + +.filter-mobile-clear:not(:disabled):hover { + background: #e74c3c; + color: #ffffff; +} + +/* ================================================ + RESPONSIVE OVERRIDES + ================================================ */ + +@media screen and (max-width: 768px) { + /* دسکتاپ کنترل‌ها روی موبایل نمایش داده نمی‌شن */ + .filter-controls { + display: none !important; + } +} + +@media screen and (min-width: 769px) { + /* پاپ‌آپ موبایل روی دسکتاپ نمایش داده نمی‌شه */ + .filter-mobile-overlay { + display: none !important; + } +} \ No newline at end of file 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..51be676 --- /dev/null +++ b/src/assets/icons/portfolioP.svg @@ -0,0 +1,1252 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/assets/images/.gitkeep b/src/assets/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/js/archive.js b/src/assets/js/archive.js new file mode 100644 index 0000000..d12f650 --- /dev/null +++ b/src/assets/js/archive.js @@ -0,0 +1,495 @@ +// ==============================================هیرو سکشن================================= +const counters = document.querySelectorAll('.counter'); + +const observer = new IntersectionObserver( + (entries) => { + entries.forEach((entry) => { + if (!entry.isIntersecting) return; + + const counter = entry.target; + const target = parseFloat(counter.dataset.target); + const prefix = counter.dataset.prefix || ''; + const suffix = counter.dataset.suffix || ''; + const duration = 2000; + let startTime = null; + + function animate(currentTime) { + if (!startTime) startTime = currentTime; + + const progress = Math.min((currentTime - startTime) / duration, 1); + const currentValue = progress * target; + + let displayValue; + + if (target % 1 !== 0) { + displayValue = currentValue.toFixed(1); + } else { + displayValue = Math.floor(currentValue); + } + + counter.textContent = prefix + displayValue + suffix; + + if (progress < 1) { + requestAnimationFrame(animate); + } else { + counter.textContent = prefix + target + suffix; + } + } + + requestAnimationFrame(animate); + + observer.unobserve(counter); + }); + }, + { + threshold: 0.5, + } +); + +counters.forEach((counter) => { + observer.observe(counter); +}); + +// ==============================================آرشیو سکشن ================================= +function initRelatedSection(section) { + const cards = section.querySelectorAll('.related-card'); + + cards.forEach((card) => { + const container = card.querySelector('.media-container'); + + if (!container) return; + if (container.dataset.initialized === 'true') return; + container.dataset.initialized = 'true'; + + const progressCircle = card.querySelector('.progress-circle'); + const type = container.dataset.type; + const src = container.dataset.src; + + if (!type || !src) return; + + card.classList.add(type === 'video' ? 'is-video' : 'is-image'); + if (type === 'video') { + const ext = src.split('.').pop().toLowerCase(); + const video = document.createElement('video'); + video.muted = true; + video.playsInline = true; + video.preload = 'metadata'; + + const source = document.createElement('source'); + source.src = src; + source.type = `video/${ext}`; + + video.appendChild(source); + container.appendChild(video); + + if (!progressCircle) return; + const radius = progressCircle.r.baseVal.value; + const circumference = 2 * Math.PI * radius; + progressCircle.style.strokeDasharray = circumference; + progressCircle.style.strokeDashoffset = circumference; + + let stopTimeout; + + card.addEventListener('mouseenter', async () => { + clearTimeout(stopTimeout); + + try { + video.currentTime = 0; + + await video.play(); + + progressCircle.style.transition = 'none'; + progressCircle.style.strokeDashoffset = circumference; + + requestAnimationFrame(() => { + progressCircle.style.transition = 'stroke-dashoffset 5s linear'; + + progressCircle.style.strokeDashoffset = 0; + }); + + stopTimeout = setTimeout(() => { + video.pause(); + video.currentTime = 0; + + progressCircle.style.transition = 'none'; + progressCircle.style.strokeDashoffset = circumference; + }, 5000); + } catch (err) { + console.error(err); + } + }); + + card.addEventListener('mouseleave', () => { + clearTimeout(stopTimeout); + + video.pause(); + video.currentTime = 0; + + progressCircle.style.transition = 'none'; + progressCircle.style.strokeDashoffset = circumference; + }); + card.addEventListener('click', () => { + if (type === 'video') { + openVideoPopup(src); + } else { + openImagePopup(src); + } + }); + } else if (type === 'image') { + const img = document.createElement('img'); + img.src = src; + img.alt = 'portfolio'; + + container.appendChild(img); + } + }); +} +function initGalleryFilter(section) { + const tabs = section.querySelectorAll('.tabs button'); + const cards = section.querySelectorAll('.related-card'); + + tabs.forEach((tab) => { + tab.addEventListener('click', () => { + tabs.forEach((btn) => { + btn.classList.remove('current'); + }); + + tab.classList.add('current'); + + const text = tab.querySelector('.txt')?.textContent.trim(); + cards.forEach((card) => { + const media = card.querySelector('.media-container'); + if (!media) return; + + const type = media.dataset.type; + if (text === 'همه') { + card.style.display = ''; + } else if (text === 'ویدیو') { + if (type === 'video') { + card.style.display = ''; + } else { + card.style.display = 'none'; + } + } else if (text === 'تصاویر') { + if (type === 'image') { + card.style.display = ''; + } else { + card.style.display = 'none'; + } + } + }); + }); + }); +} + +document.querySelectorAll('.related-content p').forEach((item) => { + item.addEventListener('click', (e) => { + e.preventDefault(); + e.stopPropagation(); + }); +}); +document.addEventListener('DOMContentLoaded', () => { + document.querySelectorAll('[data-related-section]').forEach((section) => { + initRelatedSection(section); + initGalleryFilter(section); + }); +}); + +// =========================فیلتر============================ +function initFilterSystem(section) { + // ---- Selectors ---- + const toggleBtn = document.getElementById('filterToggleBtn'); + const toggleText = document.getElementById('filterToggleText'); + const filterControls = document.getElementById('filterControls'); + const categoryBtn = document.getElementById('categoryBtn'); + const tagsBtn = document.getElementById('tagsBtn'); + const categoryDrop = document.getElementById('categoryDropdown'); + const tagsDrop = document.getElementById('tagsDropdown'); + const clearBtn = document.getElementById('filterClearBtn'); + const tagBadge = document.getElementById('tagBadge'); + + const mobileOverlay = document.getElementById('filterMobileOverlay'); + const mobileBack = document.getElementById('filterMobileBack'); + const mobileClose = document.getElementById('filterMobileClose'); + const mobileTitle = document.getElementById('filterMobileTitle'); + const mobileMain = document.getElementById('filterMobileMain'); + const mobileCatSub = document.getElementById('filterMobileCategorySub'); + const mobileTagsSub = document.getElementById('filterMobileTagsSub'); + const mobileCatBtn = document.getElementById('mobileCategoryBtn'); + const mobileTagsBtn2 = document.getElementById('mobileTagsBtn'); + const mobileApply = document.getElementById('filterMobileApply'); + const mobileClear2 = document.getElementById('filterMobileClear'); + + const isMobile = () => window.innerWidth <= 768; + const categoryBadge = document.getElementById('categoryBadge'); + + const mobileCategoryBadge = document.getElementById('mobileCategoryBadge'); + + const mobileTagBadge = document.getElementById('mobileTagBadge'); + + // ================================================ + // DESKTOP: باز / بسته کردن فیلتر بار + // ================================================ + let filterOpen = false; + + toggleBtn.addEventListener('click', () => { + if (isMobile()) { + openMobilePopup(); + return; + } + + filterOpen = !filterOpen; + filterControls.classList.toggle('is-open', filterOpen); + toggleText.textContent = filterOpen ? 'بستن' : 'فیلتر کردن'; + + if (!filterOpen) { + closeAllDropdowns(); + } + }); + + // ================================================ + // DESKTOP: اکاردئون دسته‌بندی + // ================================================ + categoryBtn.addEventListener('click', (e) => { + e.stopPropagation(); + const isOpen = categoryDrop.classList.contains('is-open'); + closeAllDropdowns(); + if (!isOpen) { + categoryDrop.classList.add('is-open'); + categoryBtn.classList.add('is-active'); + } + }); + + // ================================================ + // DESKTOP: اکاردئون تگ‌ها + // ================================================ + tagsBtn.addEventListener('click', (e) => { + e.stopPropagation(); + const isOpen = tagsDrop.classList.contains('is-open'); + closeAllDropdowns(); + if (!isOpen) { + tagsDrop.classList.add('is-open'); + tagsBtn.classList.add('is-active'); + } + }); + + function closeAllDropdowns() { + categoryDrop.classList.remove('is-open'); + tagsDrop.classList.remove('is-open'); + categoryBtn.classList.remove('is-active'); + tagsBtn.classList.remove('is-active'); + } + + // بستن دراپ‌داون با کلیک خارج از آن + document.addEventListener('click', (e) => { + if (!e.target.closest('.filter-group')) { + closeAllDropdowns(); + } + }); + + // ================================================ + // DESKTOP: فیلتر کردن کارت‌ها + // ================================================ + // اسکرول بعد از برداشتن تیک چک باکس====== + function scrollToSectionTop() { + section.scrollIntoView({ + behavior: 'smooth', + block: 'start', + }); + } + + // اسکرول بعد از زدن تیک =========== + function scrollToSectionTop() { + section.scrollIntoView({ + behavior: 'smooth', + block: 'start', + }); + } + + function applyDesktopFilter() { + const selCats = [...section.querySelectorAll('.category-checkbox:checked')].map((c) => c.value); + const selTags = [...section.querySelectorAll('.tag-checkbox:checked')].map((c) => c.value); + filterCards(section, selCats, selTags); + } + + // ================================================ + // DESKTOP: شمارنده بج تگ‌ها + // ================================================ + function updateBadges() { + // Desktop + const desktopTagCount = section.querySelectorAll('.tag-checkbox:checked').length; + + const desktopCategoryCount = section.querySelectorAll('.category-checkbox:checked').length; + + // Mobile + const mobileTagCount = section.querySelectorAll('.mob-tag-cb:checked').length; + + const mobileCategoryCount = section.querySelectorAll('.mob-cat-cb:checked').length; + + updateBadge(tagBadge, desktopTagCount); + + updateBadge(categoryBadge, desktopCategoryCount); + + updateBadge(mobileTagBadge, mobileTagCount); + + updateBadge(mobileCategoryBadge, mobileCategoryCount); + } + function updateDesktopClearButton() { + const hasAny = + section.querySelectorAll('.category-checkbox:checked, .tag-checkbox:checked').length > 0; + clearBtn.disabled = !hasAny; + } + function updateBadge(el, count) { + if (!el) return; + + el.textContent = count; + el.style.display = count > 0 ? 'inline-flex' : 'none'; + } + + section.querySelectorAll('.category-checkbox').forEach((cb) => { + cb.addEventListener('change', () => { + updateBadges(); + updateDesktopClearButton(); + applyDesktopFilter(); + + scrollToSectionTop(); + }); + }); + + section.querySelectorAll('.tag-checkbox').forEach((cb) => { + cb.addEventListener('change', () => { + updateBadges(); + updateDesktopClearButton(); + applyDesktopFilter(); + + scrollToSectionTop(); + }); + }); + + // ================================================ + // DESKTOP: حذف فیلتر + // ================================================ + clearBtn.addEventListener('click', () => { + section + .querySelectorAll('.category-checkbox, .tag-checkbox') + .forEach((cb) => (cb.checked = false)); + updateBadges(); + updateDesktopClearButton(); + scrollToSectionTop(); + filterCards(section, [], []); + }); + + // ================================================ + // فیلتر کارت‌ها (مشترک بین دسکتاپ و موبایل) + // ================================================ + function filterCards(sec, cats, tags) { + sec.querySelectorAll('.related-card').forEach((card) => { + const text = card.querySelector('.related-content p')?.textContent || ''; + const passCategory = cats.length === 0 || cats.some((c) => text.includes(c)); + const passTag = tags.length === 0 || tags.some((t) => text.includes(t)); + card.style.display = passCategory && passTag ? '' : 'none'; + }); + } + + // ================================================ + // MOBILE: باز کردن پاپ‌آپ + // ================================================ + function openMobilePopup() { + mobileOverlay.classList.add('is-open'); + document.body.style.overflow = 'hidden'; + showMobileMain(); + } + + function closeMobilePopup() { + mobileOverlay.classList.remove('is-open'); + document.body.style.overflow = ''; + } + + mobileClose.addEventListener('click', closeMobilePopup); + + // ================================================ + // MOBILE: نمای اصلی / زیرمنوها + // ================================================ + function showMobileMain() { + mobileMain.classList.add('is-visible'); + mobileCatSub.classList.remove('is-visible'); + mobileTagsSub.classList.remove('is-visible'); + mobileTitle.textContent = 'فیلتر کردن'; + mobileBack.style.display = 'none'; + mobileClose.style.display = 'flex'; + mobileApply.textContent = 'اعمال فیلتر'; + updateMobileFooter(); + } + + function showMobileCategory() { + mobileMain.classList.remove('is-visible'); + mobileCatSub.classList.add('is-visible'); + mobileTagsSub.classList.remove('is-visible'); + mobileTitle.textContent = 'دسته بندی'; + mobileBack.style.display = 'flex'; + mobileClose.style.display = 'none'; + updateMobileFooter(); + } + + function showMobileTags() { + mobileMain.classList.remove('is-visible'); + mobileCatSub.classList.remove('is-visible'); + mobileTagsSub.classList.add('is-visible'); + mobileTitle.textContent = 'تگ‌ها'; + mobileBack.style.display = 'flex'; + mobileClose.style.display = 'none'; + updateMobileFooter(); + } + + mobileBack.addEventListener('click', showMobileMain); + mobileCatBtn.addEventListener('click', showMobileCategory); + mobileTagsBtn2.addEventListener('click', showMobileTags); + + // ================================================ + // MOBILE: فعال/غیرفعال کردن دکمه‌های footer + // ================================================ + function updateMobileFooter() { + const hasAny = section.querySelectorAll('.mob-cat-cb:checked, .mob-tag-cb:checked').length > 0; + mobileApply.disabled = false; + mobileClear2.disabled = !hasAny; + } + + section.querySelectorAll('.mob-cat-cb, .mob-tag-cb').forEach((cb) => { + cb.addEventListener('change', () => { + updateMobileFooter(); + updateBadges(); + }); + }); + // ================================================ + // MOBILE: اعمال و حذف فیلتر + // ================================================ + mobileApply.addEventListener('click', () => { + const selCats = [...section.querySelectorAll('.mob-cat-cb:checked')].map((c) => c.value); + const selTags = [...section.querySelectorAll('.mob-tag-cb:checked')].map((c) => c.value); + filterCards(section, selCats, selTags); + closeMobilePopup(); + }); + + mobileClear2.addEventListener('click', () => { + section.querySelectorAll('.mob-cat-cb, .mob-tag-cb').forEach((cb) => (cb.checked = false)); + + updateMobileFooter(); + updateBadges(); + + filterCards(section, [], []); + }); + + mobileOverlay.addEventListener('click', (e) => { + if (e.target === mobileOverlay) closeMobilePopup(); + }); + updateBadges(); + updateDesktopClearButton(); +} + +document.addEventListener('DOMContentLoaded', () => { + document.querySelectorAll('[data-related-section]').forEach((section) => { + initRelatedSection(section); + initGalleryFilter(section); + initFilterSystem(section); + }); +}); 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..3901064 --- /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, 'archive.html'), + }, + }, + manifest: true, + cssCodeSplit: true, + }, + + server: { + open: true, + port: 5173, + }, +});