aboutus-prefinal

This commit is contained in:
2026-06-17 17:50:11 +03:30
commit 43438deca7
76 changed files with 6362 additions and 0 deletions

25
.gitignore vendored Normal file
View File

@@ -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?

4
.prettierignore Normal file
View File

@@ -0,0 +1,4 @@
dist/
node_modules/
public/
*.min.js

13
.prettierrc.json Normal file
View File

@@ -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"
}

4
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,4 @@
{
"recommendations": ["esbenp.prettier-vscode"],
"unwantedRecommendations": []
}

19
.vscode/settings.json vendored Normal file
View File

@@ -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"
}
}

32
README.md Normal file
View File

@@ -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
```

1011
aboutus.html Normal file

File diff suppressed because it is too large Load Diff

14
index.html Normal file
View File

@@ -0,0 +1,14 @@
<!doctype html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="./src/core/stylesheet/core.css" />
<title>Inova</title>
</head>
<body>
<main>
<h1>سلام دنیا</h1>
</main>
</body>
</html>

889
package-lock.json generated Normal file
View File

@@ -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
}
}
}
}
}

15
package.json Normal file
View File

@@ -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"
}
}

0
public/.gitkeep Normal file
View File

0
public/images/.gitkeep Normal file
View File

BIN
public/images/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 KiB

BIN
public/images/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

BIN
public/images/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

BIN
public/images/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

BIN
public/images/ali.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

BIN
public/images/amr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

BIN
public/images/armn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

BIN
public/images/azta.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
public/images/ftme.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
public/images/hamkaran.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 890 B

BIN
public/images/hesabdari.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
public/images/ipka.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
public/images/liveinova.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

BIN
public/images/mhdi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
public/images/mhmd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
public/images/mhsn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
public/images/mlka.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
public/images/nil.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/images/petboom.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1016 B

BIN
public/images/pic1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
public/images/pic2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

BIN
public/images/pic3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

BIN
public/images/prof.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

BIN
public/images/sepidar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
public/images/snap.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

BIN
public/images/thumb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 KiB

BIN
public/images/videotest.mp4 Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
public/images/zarin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
public/images/zndi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -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;
}
}

1390
src/assets/css/aboutus.css Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,77 @@
<svg>
<symbol id="expand" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M28 28L20 20M21.6 28H28V21.6M10.4 28H4V21.6M4 28L12 20M21.6 4H28V10.4M28 4L20 12M10.4 4H4V10.4M4 4L12 12"
stroke="#1A1A2E"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</symbol>
<symbol id="eye" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M2.06202 12.348C1.97868 12.1235 1.97868 11.8765 2.06202 11.652C2.87372 9.68385 4.25153 8.00103 6.02079 6.81689C7.79004 5.63275 9.87106 5.00061 12 5.00061C14.129 5.00061 16.21 5.63275 17.9792 6.81689C19.7485 8.00103 21.1263 9.68385 21.938 11.652C22.0214 11.8765 22.0214 12.1235 21.938 12.348C21.1263 14.3161 19.7485 15.999 17.9792 17.1831C16.21 18.3672 14.129 18.9994 12 18.9994C9.87106 18.9994 7.79004 18.3672 6.02079 17.1831C4.25153 15.999 2.87372 14.3161 2.06202 12.348Z"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
<path
d="M12 15C13.6569 15 15 13.6568 15 12C15 10.3431 13.6569 8.99999 12 8.99999C10.3432 8.99999 9.00002 10.3431 9.00002 12C9.00002 13.6568 10.3432 15 12 15Z"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</symbol>
<symbol id="play" viewBox="0 0 11 13" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M0.75001 2.12914C0.749322 1.88513 0.809349 1.64531 0.92393 1.43432C1.03851 1.22332 1.20352 1.04874 1.40201 0.928505C1.6005 0.808269 1.82533 0.746706 2.05341 0.750136C2.2815 0.753566 2.50462 0.821866 2.69987 0.948024L9.12272 5.06888C9.31394 5.19079 9.47227 5.36374 9.58223 5.57079C9.69219 5.77783 9.75 6.01187 9.75 6.25C9.75 6.48812 9.69219 6.72217 9.58223 6.92921C9.47227 7.13626 9.31394 7.3092 9.12272 7.43112L2.69987 11.552C2.50453 11.6782 2.28129 11.7465 2.05309 11.7499C1.8249 11.7532 1.59998 11.6916 1.40145 11.5712C1.20291 11.4508 1.03793 11.276 0.923441 11.0648C0.808953 10.8536 0.749093 10.6136 0.75001 10.3695V2.12914Z"
fill="white"
stroke="white"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
</symbol>
<symbol id="t-blank" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M17 7H7V17M7 7L17 17"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
</symbol>
<symbol xmlns="http://www.w3.org/2000/svg" id="pause" viewBox="0 0 24 24">
<path d="M6.5,0A3.5,3.5,0,0,0,3,3.5v17a3.5,3.5,0,0,0,7,0V3.5A3.5,3.5,0,0,0,6.5,0Z" />
<path d="M17.5,0A3.5,3.5,0,0,0,14,3.5v17a3.5,3.5,0,0,0,7,0V3.5A3.5,3.5,0,0,0,17.5,0Z" />
</symbol>
<symbol id="left" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10 12L6 8L10 4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
</symbol>
<symbol id="chevrons-left" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M7.33333 11.3332L4 7.99984L7.33333 4.6665M12 11.3332L8.66667 7.99984L12 4.6665"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
</symbol>
<symbol id="chevrons-right" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M4 11.3332L7.33333 7.99984L4 4.6665M8.66667 11.3332L12 7.99984L8.66667 4.6665"
stroke-width="1.5"
stroke-linecap="round"
stroke-linejoin="round"
/>
</symbol>
<symbol id="right" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6 12L10 8L6 4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
</symbol>
<symbol id="arrow-left" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M10.0001 4.16675L4.16675 10.0001L10.0001 15.8334M4.16675 10.0001H15.8334"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 91 KiB

View File

BIN
src/assets/images/pic2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 KiB

BIN
src/assets/images/pic3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 692 KiB

BIN
src/assets/images/pic4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 899 KiB

BIN
src/assets/images/pic5.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
src/assets/images/pic6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 763 KiB

811
src/assets/js/aboutus.js Normal file
View File

@@ -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 = `
<span>${slide.number}</span>
<h2>
${slide.title}
</h2>
<p>
${slide.description}
</p>
`;
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();

0
src/components/.gitkeep Normal file
View File

View File

View File

@@ -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 */
}

0
src/templates/.gitkeep Normal file
View File

28
vite.config.js Normal file
View File

@@ -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,
},
});