aboutus-prefinal
25
.gitignore
vendored
Normal 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
@@ -0,0 +1,4 @@
|
||||
dist/
|
||||
node_modules/
|
||||
public/
|
||||
*.min.js
|
||||
13
.prettierrc.json
Normal 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
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"recommendations": ["esbenp.prettier-vscode"],
|
||||
"unwantedRecommendations": []
|
||||
}
|
||||
19
.vscode/settings.json
vendored
Normal 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
@@ -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
14
index.html
Normal 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
@@ -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
@@ -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
0
public/images/.gitkeep
Normal file
BIN
public/images/1.png
Normal file
|
After Width: | Height: | Size: 253 KiB |
BIN
public/images/2.png
Normal file
|
After Width: | Height: | Size: 199 KiB |
BIN
public/images/3.png
Normal file
|
After Width: | Height: | Size: 454 KiB |
BIN
public/images/4.png
Normal file
|
After Width: | Height: | Size: 241 KiB |
BIN
public/images/ali.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
public/images/amr.png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
public/images/armn.png
Normal file
|
After Width: | Height: | Size: 9.3 KiB |
BIN
public/images/azta.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
public/images/blure-effect 1.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
public/images/ftme.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
public/images/hamkaran.png
Normal file
|
After Width: | Height: | Size: 890 B |
BIN
public/images/hesabdari.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
public/images/ipka.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
public/images/liveinova.png
Normal file
|
After Width: | Height: | Size: 344 KiB |
BIN
public/images/mhdi.png
Normal file
|
After Width: | Height: | Size: 8.5 KiB |
BIN
public/images/mhmd.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
BIN
public/images/mhsn.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
public/images/mlka.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
public/images/nil.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/images/petboom.png
Normal file
|
After Width: | Height: | Size: 1016 B |
BIN
public/images/pic1.png
Normal file
|
After Width: | Height: | Size: 174 KiB |
BIN
public/images/pic2.png
Normal file
|
After Width: | Height: | Size: 176 KiB |
BIN
public/images/pic3.png
Normal file
|
After Width: | Height: | Size: 241 KiB |
BIN
public/images/prof.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
public/images/sepidar.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
public/images/snap.png
Normal file
|
After Width: | Height: | Size: 862 B |
BIN
public/images/thumb.png
Normal file
|
After Width: | Height: | Size: 473 KiB |
BIN
public/images/videotest.mp4
Normal file
BIN
public/images/zabanmehr (1).png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
public/images/zabanmehr (3).png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
public/images/zarin.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
public/images/zndi.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
323
src/assets/css/aboutus-responsive.css
Normal 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
77
src/assets/icons/portfolioGallery.svg
Normal 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 |
1475
src/assets/icons/portfolioP.svg
Normal file
|
After Width: | Height: | Size: 91 KiB |
0
src/assets/images/.gitkeep
Normal file
BIN
src/assets/images/pic2.png
Normal file
|
After Width: | Height: | Size: 814 KiB |
BIN
src/assets/images/pic3.png
Normal file
|
After Width: | Height: | Size: 692 KiB |
BIN
src/assets/images/pic4.png
Normal file
|
After Width: | Height: | Size: 899 KiB |
BIN
src/assets/images/pic5.webp
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
src/assets/images/pic6.png
Normal file
|
After Width: | Height: | Size: 763 KiB |
811
src/assets/js/aboutus.js
Normal 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
BIN
src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Black.woff
Normal file
BIN
src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Bold.woff
Normal file
BIN
src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-ExtraBlack.woff
Normal file
BIN
src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-ExtraBold.woff
Normal file
BIN
src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Light.woff
Normal file
BIN
src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Regular.woff
Normal file
BIN
src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-SemiBold.woff
Normal file
BIN
src/core/fonts/yekanbakhpro/woff/YekanBakhFaNum-Thin.woff
Normal file
BIN
src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Black.woff2
Normal file
BIN
src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Bold.woff2
Normal file
BIN
src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-ExtraBold.woff2
Normal file
BIN
src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Light.woff2
Normal file
BIN
src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Regular.woff2
Normal file
BIN
src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-SemiBold.woff2
Normal file
BIN
src/core/fonts/yekanbakhpro/woff2/YekanBakhFaNum-Thin.woff2
Normal file
0
src/core/javascript/core.js
Normal file
232
src/core/stylesheet/core.css
Normal 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
28
vite.config.js
Normal 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,
|
||||
},
|
||||
});
|
||||