Initial commit

This commit is contained in:
2026-06-17 13:17:47 +03:30
commit 48bd4c1878
43 changed files with 5016 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
```

785
archive.html Normal file
View File

@@ -0,0 +1,785 @@
<!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" />
<link rel="stylesheet" href="./src/assets/css/archive.css" />
<link rel="stylesheet" href="./src/assets/css/archive-responsive.css" />
<script type="module" src="./src/assets/js/archive.js" defer></script>
<title></title>
</head>
<body>
<div id="root">
<!-- ==============================================هیرو سکشن================================= -->
<section class="hero-section">
<div class="container-hero-section">
<div class="hero-section-wrapper">
<div class="hero-card">
<div class="hero-circles" aria-hidden="true">
<div class="circle circle--1"></div>
<div class="circle circle--2"></div>
<div class="circle circle--3"></div>
<div class="circle circle--4"></div>
</div>
<div class="hero-hollow hero-hollow--left" aria-hidden="true"></div>
<div class="hero-hollow hero-hollow--right" aria-hidden="true"></div>
<div class="hero-dot-pattern" aria-hidden="true"></div>
<div class="hero-content">
<h2 class="hero-title">
هر پروژه یک داستان است؛ داستانی که شما
<br />
قهرمان آن هستید.
</h2>
<p class="hero-txt">
هر پروژه داستانی از صیقل خوردن یک ایده و تبدیل آن به یک موفقیت تجاری است.
نمونه‌های منتخب ما را تماشا کنید.
</p>
<div class="stats">
<div class="stat-item">
<span class="counter" data-target="300" data-prefix="+">0</span>
<div class="stat-text">پروژه موفق</div>
</div>
<div class="stat-item">
<span class="counter" data-target="92" data-suffix="%">0</span>
<div class="stat-text">رضایت کارفرمایان</div>
</div>
<div class="stat-item">
<span class="counter" data-target="45" data-suffix="+">0</span>
<div class="stat-text">تعداد مشتریان</div>
</div>
<div class="stat-item">
<span class="counter" data-target="1.5" data-suffix="x">0</span>
<div class="stat-text">افزایش رشد/فروش مشتریان</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- ============================================== آرشیوسکشن================================= -->
<section
class="gallery-section related-section"
data-related-section="gallery"
data-nav-title="گالری"
>
<header class="gallery-section-header">
<h2>جدیدترین نمونه‌کارها</h2>
<p>به این سبک پروژه‌ها علاقه دارید؟ پس پروژه‌های زیر را ببینید</p>
</header>
<!-- ===== STICKY FILTER BAR ===== -->
<div class="filter-sticky-wrapper">
<div class="filter-bar" id="filterBar">
<div class="filter-bar-inner">
<!-- دکمه فیلتر کردن / بستن -->
<button class="filter-toggle-btn" id="filterToggleBtn" type="button">
<span id="filterToggleText">فیلتر کردن</span>
</button>
<!-- کنترل‌های دسکتاپ (بعد از باز شدن نمایش داده می‌شه) -->
<div class="filter-controls" id="filterControls">
<!-- دسته بندی‌ها -->
<div class="filter-group">
<button class="filter-group-btn" id="categoryBtn" type="button">
<svg aria-hidden="true" width="20" height="20">
<use href="./src/assets/icons/portfolioP.svg#filter"></use>
</svg>
دسته بندی‌ها
<span class="filter-badge" id="categoryBadge">0</span>
<svg aria-hidden="true" width="20" height="20">
<use href="./src/assets/icons/portfolioP.svg#down-blue-more"></use>
</svg>
</button>
<div class="filter-dropdown" id="categoryDropdown">
<label class="filter-check-item">
<input
type="checkbox"
class="filter-checkbox category-checkbox"
value="طراحی سایت"
/>
<span>طراحی سایت</span>
</label>
<label class="filter-check-item">
<input
type="checkbox"
class="filter-checkbox category-checkbox"
value="گیمیفیکیشن"
/>
<span>گیمیفیکیشن</span>
</label>
<label class="filter-check-item">
<input
type="checkbox"
class="filter-checkbox category-checkbox"
value="سئو"
/>
<span>سئو</span>
</label>
<label class="filter-check-item">
<input
type="checkbox"
class="filter-checkbox category-checkbox"
value="برندینگ"
/>
<span>برندینگ</span>
</label>
</div>
</div>
<!-- تگ‌ها -->
<div class="filter-group">
<button class="filter-group-btn" id="tagsBtn" type="button">
<svg aria-hidden="true" width="20" height="20">
<use href="./src/assets/icons/portfolioP.svg#tag"></use>
</svg>
تگ‌ها
<span class="filter-badge" id="tagBadge">0</span>
<svg aria-hidden="true" width="20" height="20">
<use href="./src/assets/icons/portfolioP.svg#down-blue-more"></use>
</svg>
</button>
<div class="filter-dropdown" id="tagsDropdown">
<label class="filter-check-item">
<input type="checkbox" class="filter-checkbox tag-checkbox" value="تگ 1" />
<span>تگ 1</span>
</label>
<label class="filter-check-item">
<input type="checkbox" class="filter-checkbox tag-checkbox" value="تگ 2" />
<span>تگ 2</span>
</label>
<label class="filter-check-item">
<input type="checkbox" class="filter-checkbox tag-checkbox" value="تگ 3" />
<span>تگ 3</span>
</label>
</div>
</div>
<!-- حذف فیلتر -->
<button class="filter-clear-btn" id="filterClearBtn" type="button" disabled>
<svg aria-hidden="true" width="20" height="20">
<use href="./src/assets/icons/portfolioP.svg#trash"></use>
</svg>
حذف فیلتر
</button>
<!-- تعداد پروژه‌ها -->
<span class="filter-count-text">150 پروژه</span>
</div>
</div>
</div>
</div>
<!-- ===== MOBILE POPUP ===== -->
<div class="filter-mobile-overlay" id="filterMobileOverlay">
<div class="filter-mobile-popup">
<div class="filter-mobile-header">
<h3 class="filter-mobile-title" id="filterMobileTitle">فیلتر کردن</h3>
<button class="filter-mobile-close" id="filterMobileClose" type="button">
<svg aria-hidden="true" width="24" height="24">
<use href="./src/assets/icons/portfolioP.svg#close"></use>
</svg>
</button>
<button class="filter-mobile-back" id="filterMobileBack" type="button">
<span>برگشت</span>
<svg aria-hidden="true" width="20" height="20">
<use href="./src/assets/icons/portfolioP.svg#back"></use>
</svg>
</button>
</div>
<!-- نمای اصلی -->
<div class="filter-mobile-main" id="filterMobileMain">
<button class="filter-mobile-option-btn" id="mobileCategoryBtn" type="button">
<div>
<span class="tag-txt">دسته بندی‌ها</span>
<span class="filter-badge" id="mobileCategoryBadge">0</span>
</div>
<svg aria-hidden="true" width="24" height="24">
<use href="./src/assets/icons/portfolioP.svg#chevron-left"></use>
</svg>
</button>
<button class="filter-mobile-option-btn" id="mobileTagsBtn" type="button">
<div>
<span class="tag-txt">تگ‌ها</span>
<span class="filter-badge" id="mobileTagBadge">0</span>
</div>
<svg aria-hidden="true" width="24" height="24">
<use href="./src/assets/icons/portfolioP.svg#chevron-left"></use>
</svg>
</button>
</div>
<!-- زیرمنو: دسته‌بندی -->
<div class="filter-mobile-sub" id="filterMobileCategorySub">
<label class="filter-check-item">
<input type="checkbox" class="filter-checkbox mob-cat-cb" value="طراحی سایت" /><span
>طراحی سایت</span
>
</label>
<label class="filter-check-item">
<input type="checkbox" class="filter-checkbox mob-cat-cb" value="گیمیفیکیشن" /><span
>گیمیفیکیشن</span
>
</label>
<label class="filter-check-item">
<input type="checkbox" class="filter-checkbox mob-cat-cb" value="سئو" /><span
>سئو</span
>
</label>
<label class="filter-check-item">
<input type="checkbox" class="filter-checkbox mob-cat-cb" value="برندینگ" /><span
>برندینگ</span
>
</label>
</div>
<!-- زیرمنو: تگ‌ها -->
<div class="filter-mobile-sub" id="filterMobileTagsSub">
<label class="filter-check-item">
<input type="checkbox" class="filter-checkbox mob-tag-cb" value="تگ 1" /><span
>تگ 1</span
>
</label>
<label class="filter-check-item">
<input type="checkbox" class="filter-checkbox mob-tag-cb" value="تگ 2" /><span
>تگ 2</span
>
</label>
<label class="filter-check-item">
<input type="checkbox" class="filter-checkbox mob-tag-cb" value="تگ 3" /><span
>تگ 3</span
>
</label>
</div>
<div class="filter-mobile-footer">
<button class="filter-mobile-apply" id="filterMobileApply" type="button">
اعمال فیلتر
</button>
<button class="filter-mobile-clear" id="filterMobileClear" type="button" disabled>
حذف فیلترها
</button>
</div>
</div>
</div>
<div class="container">
<div class="related-boxes">
<a class="related-card" href="">
<div class="related-image">
<div
data-type="video"
class="media-container"
data-src="./public/images/videotest.mp4"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی وبسایت حسابداری فرداد</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="image"
class="media-container"
data-src="./public/images/2.png"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی وبسایت زبان مهر</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="image"
class="media-container"
data-src="./public/images/3.png"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی صفحه گیمیفیکیشن زبان مهر</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="video"
class="media-container"
data-src="./public/images/videotest.mp4"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی وبسایت حسابداری فرداد</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="image"
class="media-container"
data-src="./public/images/2.png"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی وبسایت زبان مهر</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="image"
class="media-container"
data-src="./public/images/3.png"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی صفحه گیمیفیکیشن زبان مهر</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="video"
class="media-container"
data-src="./public/images/videotest.mp4"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی وبسایت حسابداری فرداد</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="image"
class="media-container"
data-src="./public/images/2.png"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی وبسایت زبان مهر</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="image"
class="media-container"
data-src="./public/images/3.png"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی صفحه گیمیفیکیشن زبان مهر</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="video"
class="media-container"
data-src="./public/images/videotest.mp4"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی وبسایت حسابداری فرداد</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="image"
class="media-container"
data-src="./public/images/2.png"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی وبسایت زبان مهر</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
<a class="related-card" href="">
<div class="related-image">
<div
data-type="image"
class="media-container"
data-src="./public/images/3.png"
></div>
<button class="play-btn" aria-label="play-video">
<svg class="progress-ring" width="22" height="22">
<circle class="progress-circle" cx="22" cy="22" r="11" />
</svg>
<svg class="play-icon icon-play" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#play-icon"></use>
</svg>
<svg class="play-icon icon-pause" aria-hidden="true">
<use href="./src/assets/icons/portfolioP.svg#pause-icon"></use>
</svg>
</button>
<div class="overlay-layer">
<div class="button-overlay">
<span class="date">23 آذر 1404</span>
<svg aria-hidden="true" height="24" width="24">
<use href="./src/assets/icons/portfolioP.svg#up-left-arr"></use>
</svg>
</div>
</div>
</div>
<div class="related-content">
<h3>طراحی صفحه گیمیفیکیشن زبان مهر</h3>
<p>طراحی سایت | گیمیفیکیشن</p>
</div>
</a>
</div>
<nav class="pagination">
<ul>
<li>
<a href="#" class="item">
<svg aria-hidden="true" width="16" height="16">
<use href="./src/assets/icons/portfolioGallery.svg#chevrons-right"></use>
</svg>
</a>
</li>
<li>
<a href="#" class="item">
<svg aria-hidden="true" width="16" height="16">
<use href="./src/assets/icons/portfolioGallery.svg#right"></use>
</svg>
</a>
</li>
<li class="current">
<a href="#" class="item"> 1 </a>
</li>
<li>
<a href="#" class="item"> 2 </a>
</li>
<li>
<span class="item"></span>
</li>
<li>
<a href="#" class="item"> 8 </a>
</li>
<li>
<a href="#" class="item">
<svg aria-hidden="true" width="16" height="16">
<use href="./src/assets/icons/portfolioGallery.svg#left"></use>
</svg>
</a>
</li>
<li>
<a href="#" class="item">
<svg aria-hidden="true" width="16" height="16">
<use href="./src/assets/icons/portfolioGallery.svg#chevrons-left"></use>
</svg>
</a>
</li>
</ul>
</nav>
</div>
</section>
</div>
</body>
</html>

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/videotest.mp4 Normal file

Binary file not shown.

View File

@@ -0,0 +1,43 @@
@media screen and (max-width: 1400px) {
}
@media screen and (max-width: 1200px) {
}
@media screen and (max-width: 992px) {
}
@media screen and (max-width: 768px) {
.hero-card {
height: 546px;
}
.container-hero-section {
padding: 0;
}
.hero-content {
padding: 0 20px;
margin-top: 62px;
}
.hero-title {
font-size: 24px;
}
.hero-txt {
font-size: 15px;
margin-bottom: 0;
}
.stats {
grid-template-columns: repeat(2, 1fr);
}
.counter{
font-size:28px;
}
.stat-item::after {
display: none;
}
.stat-item {
border: none;
}
.filter-toggle-btn{
padding: 7px 20px 7px 20px;
}
}
@media screen and (max-width: 576px) {
}

1089
src/assets/css/archive.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: 69 KiB

View File

495
src/assets/js/archive.js Normal file
View File

@@ -0,0 +1,495 @@
// ==============================================هیرو سکشن=================================
const counters = document.querySelectorAll('.counter');
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (!entry.isIntersecting) return;
const counter = entry.target;
const target = parseFloat(counter.dataset.target);
const prefix = counter.dataset.prefix || '';
const suffix = counter.dataset.suffix || '';
const duration = 2000;
let startTime = null;
function animate(currentTime) {
if (!startTime) startTime = currentTime;
const progress = Math.min((currentTime - startTime) / duration, 1);
const currentValue = progress * target;
let displayValue;
if (target % 1 !== 0) {
displayValue = currentValue.toFixed(1);
} else {
displayValue = Math.floor(currentValue);
}
counter.textContent = prefix + displayValue + suffix;
if (progress < 1) {
requestAnimationFrame(animate);
} else {
counter.textContent = prefix + target + suffix;
}
}
requestAnimationFrame(animate);
observer.unobserve(counter);
});
},
{
threshold: 0.5,
}
);
counters.forEach((counter) => {
observer.observe(counter);
});
// ==============================================آرشیو سکشن =================================
function initRelatedSection(section) {
const cards = section.querySelectorAll('.related-card');
cards.forEach((card) => {
const container = card.querySelector('.media-container');
if (!container) return;
if (container.dataset.initialized === 'true') return;
container.dataset.initialized = 'true';
const progressCircle = card.querySelector('.progress-circle');
const type = container.dataset.type;
const src = container.dataset.src;
if (!type || !src) return;
card.classList.add(type === 'video' ? 'is-video' : 'is-image');
if (type === 'video') {
const ext = src.split('.').pop().toLowerCase();
const video = document.createElement('video');
video.muted = true;
video.playsInline = true;
video.preload = 'metadata';
const source = document.createElement('source');
source.src = src;
source.type = `video/${ext}`;
video.appendChild(source);
container.appendChild(video);
if (!progressCircle) return;
const radius = progressCircle.r.baseVal.value;
const circumference = 2 * Math.PI * radius;
progressCircle.style.strokeDasharray = circumference;
progressCircle.style.strokeDashoffset = circumference;
let stopTimeout;
card.addEventListener('mouseenter', async () => {
clearTimeout(stopTimeout);
try {
video.currentTime = 0;
await video.play();
progressCircle.style.transition = 'none';
progressCircle.style.strokeDashoffset = circumference;
requestAnimationFrame(() => {
progressCircle.style.transition = 'stroke-dashoffset 5s linear';
progressCircle.style.strokeDashoffset = 0;
});
stopTimeout = setTimeout(() => {
video.pause();
video.currentTime = 0;
progressCircle.style.transition = 'none';
progressCircle.style.strokeDashoffset = circumference;
}, 5000);
} catch (err) {
console.error(err);
}
});
card.addEventListener('mouseleave', () => {
clearTimeout(stopTimeout);
video.pause();
video.currentTime = 0;
progressCircle.style.transition = 'none';
progressCircle.style.strokeDashoffset = circumference;
});
card.addEventListener('click', () => {
if (type === 'video') {
openVideoPopup(src);
} else {
openImagePopup(src);
}
});
} else if (type === 'image') {
const img = document.createElement('img');
img.src = src;
img.alt = 'portfolio';
container.appendChild(img);
}
});
}
function initGalleryFilter(section) {
const tabs = section.querySelectorAll('.tabs button');
const cards = section.querySelectorAll('.related-card');
tabs.forEach((tab) => {
tab.addEventListener('click', () => {
tabs.forEach((btn) => {
btn.classList.remove('current');
});
tab.classList.add('current');
const text = tab.querySelector('.txt')?.textContent.trim();
cards.forEach((card) => {
const media = card.querySelector('.media-container');
if (!media) return;
const type = media.dataset.type;
if (text === 'همه') {
card.style.display = '';
} else if (text === 'ویدیو') {
if (type === 'video') {
card.style.display = '';
} else {
card.style.display = 'none';
}
} else if (text === 'تصاویر') {
if (type === 'image') {
card.style.display = '';
} else {
card.style.display = 'none';
}
}
});
});
});
}
document.querySelectorAll('.related-content p').forEach((item) => {
item.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
});
});
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('[data-related-section]').forEach((section) => {
initRelatedSection(section);
initGalleryFilter(section);
});
});
// =========================فیلتر============================
function initFilterSystem(section) {
// ---- Selectors ----
const toggleBtn = document.getElementById('filterToggleBtn');
const toggleText = document.getElementById('filterToggleText');
const filterControls = document.getElementById('filterControls');
const categoryBtn = document.getElementById('categoryBtn');
const tagsBtn = document.getElementById('tagsBtn');
const categoryDrop = document.getElementById('categoryDropdown');
const tagsDrop = document.getElementById('tagsDropdown');
const clearBtn = document.getElementById('filterClearBtn');
const tagBadge = document.getElementById('tagBadge');
const mobileOverlay = document.getElementById('filterMobileOverlay');
const mobileBack = document.getElementById('filterMobileBack');
const mobileClose = document.getElementById('filterMobileClose');
const mobileTitle = document.getElementById('filterMobileTitle');
const mobileMain = document.getElementById('filterMobileMain');
const mobileCatSub = document.getElementById('filterMobileCategorySub');
const mobileTagsSub = document.getElementById('filterMobileTagsSub');
const mobileCatBtn = document.getElementById('mobileCategoryBtn');
const mobileTagsBtn2 = document.getElementById('mobileTagsBtn');
const mobileApply = document.getElementById('filterMobileApply');
const mobileClear2 = document.getElementById('filterMobileClear');
const isMobile = () => window.innerWidth <= 768;
const categoryBadge = document.getElementById('categoryBadge');
const mobileCategoryBadge = document.getElementById('mobileCategoryBadge');
const mobileTagBadge = document.getElementById('mobileTagBadge');
// ================================================
// DESKTOP: باز / بسته کردن فیلتر بار
// ================================================
let filterOpen = false;
toggleBtn.addEventListener('click', () => {
if (isMobile()) {
openMobilePopup();
return;
}
filterOpen = !filterOpen;
filterControls.classList.toggle('is-open', filterOpen);
toggleText.textContent = filterOpen ? 'بستن' : 'فیلتر کردن';
if (!filterOpen) {
closeAllDropdowns();
}
});
// ================================================
// DESKTOP: اکاردئون دسته‌بندی
// ================================================
categoryBtn.addEventListener('click', (e) => {
e.stopPropagation();
const isOpen = categoryDrop.classList.contains('is-open');
closeAllDropdowns();
if (!isOpen) {
categoryDrop.classList.add('is-open');
categoryBtn.classList.add('is-active');
}
});
// ================================================
// DESKTOP: اکاردئون تگ‌ها
// ================================================
tagsBtn.addEventListener('click', (e) => {
e.stopPropagation();
const isOpen = tagsDrop.classList.contains('is-open');
closeAllDropdowns();
if (!isOpen) {
tagsDrop.classList.add('is-open');
tagsBtn.classList.add('is-active');
}
});
function closeAllDropdowns() {
categoryDrop.classList.remove('is-open');
tagsDrop.classList.remove('is-open');
categoryBtn.classList.remove('is-active');
tagsBtn.classList.remove('is-active');
}
// بستن دراپ‌داون با کلیک خارج از آن
document.addEventListener('click', (e) => {
if (!e.target.closest('.filter-group')) {
closeAllDropdowns();
}
});
// ================================================
// DESKTOP: فیلتر کردن کارت‌ها
// ================================================
// اسکرول بعد از برداشتن تیک چک باکس======
function scrollToSectionTop() {
section.scrollIntoView({
behavior: 'smooth',
block: 'start',
});
}
// اسکرول بعد از زدن تیک ===========
function scrollToSectionTop() {
section.scrollIntoView({
behavior: 'smooth',
block: 'start',
});
}
function applyDesktopFilter() {
const selCats = [...section.querySelectorAll('.category-checkbox:checked')].map((c) => c.value);
const selTags = [...section.querySelectorAll('.tag-checkbox:checked')].map((c) => c.value);
filterCards(section, selCats, selTags);
}
// ================================================
// DESKTOP: شمارنده بج تگ‌ها
// ================================================
function updateBadges() {
// Desktop
const desktopTagCount = section.querySelectorAll('.tag-checkbox:checked').length;
const desktopCategoryCount = section.querySelectorAll('.category-checkbox:checked').length;
// Mobile
const mobileTagCount = section.querySelectorAll('.mob-tag-cb:checked').length;
const mobileCategoryCount = section.querySelectorAll('.mob-cat-cb:checked').length;
updateBadge(tagBadge, desktopTagCount);
updateBadge(categoryBadge, desktopCategoryCount);
updateBadge(mobileTagBadge, mobileTagCount);
updateBadge(mobileCategoryBadge, mobileCategoryCount);
}
function updateDesktopClearButton() {
const hasAny =
section.querySelectorAll('.category-checkbox:checked, .tag-checkbox:checked').length > 0;
clearBtn.disabled = !hasAny;
}
function updateBadge(el, count) {
if (!el) return;
el.textContent = count;
el.style.display = count > 0 ? 'inline-flex' : 'none';
}
section.querySelectorAll('.category-checkbox').forEach((cb) => {
cb.addEventListener('change', () => {
updateBadges();
updateDesktopClearButton();
applyDesktopFilter();
scrollToSectionTop();
});
});
section.querySelectorAll('.tag-checkbox').forEach((cb) => {
cb.addEventListener('change', () => {
updateBadges();
updateDesktopClearButton();
applyDesktopFilter();
scrollToSectionTop();
});
});
// ================================================
// DESKTOP: حذف فیلتر
// ================================================
clearBtn.addEventListener('click', () => {
section
.querySelectorAll('.category-checkbox, .tag-checkbox')
.forEach((cb) => (cb.checked = false));
updateBadges();
updateDesktopClearButton();
scrollToSectionTop();
filterCards(section, [], []);
});
// ================================================
// فیلتر کارت‌ها (مشترک بین دسکتاپ و موبایل)
// ================================================
function filterCards(sec, cats, tags) {
sec.querySelectorAll('.related-card').forEach((card) => {
const text = card.querySelector('.related-content p')?.textContent || '';
const passCategory = cats.length === 0 || cats.some((c) => text.includes(c));
const passTag = tags.length === 0 || tags.some((t) => text.includes(t));
card.style.display = passCategory && passTag ? '' : 'none';
});
}
// ================================================
// MOBILE: باز کردن پاپ‌آپ
// ================================================
function openMobilePopup() {
mobileOverlay.classList.add('is-open');
document.body.style.overflow = 'hidden';
showMobileMain();
}
function closeMobilePopup() {
mobileOverlay.classList.remove('is-open');
document.body.style.overflow = '';
}
mobileClose.addEventListener('click', closeMobilePopup);
// ================================================
// MOBILE: نمای اصلی / زیرمنوها
// ================================================
function showMobileMain() {
mobileMain.classList.add('is-visible');
mobileCatSub.classList.remove('is-visible');
mobileTagsSub.classList.remove('is-visible');
mobileTitle.textContent = 'فیلتر کردن';
mobileBack.style.display = 'none';
mobileClose.style.display = 'flex';
mobileApply.textContent = 'اعمال فیلتر';
updateMobileFooter();
}
function showMobileCategory() {
mobileMain.classList.remove('is-visible');
mobileCatSub.classList.add('is-visible');
mobileTagsSub.classList.remove('is-visible');
mobileTitle.textContent = 'دسته بندی';
mobileBack.style.display = 'flex';
mobileClose.style.display = 'none';
updateMobileFooter();
}
function showMobileTags() {
mobileMain.classList.remove('is-visible');
mobileCatSub.classList.remove('is-visible');
mobileTagsSub.classList.add('is-visible');
mobileTitle.textContent = 'تگ‌ها';
mobileBack.style.display = 'flex';
mobileClose.style.display = 'none';
updateMobileFooter();
}
mobileBack.addEventListener('click', showMobileMain);
mobileCatBtn.addEventListener('click', showMobileCategory);
mobileTagsBtn2.addEventListener('click', showMobileTags);
// ================================================
// MOBILE: فعال/غیرفعال کردن دکمه‌های footer
// ================================================
function updateMobileFooter() {
const hasAny = section.querySelectorAll('.mob-cat-cb:checked, .mob-tag-cb:checked').length > 0;
mobileApply.disabled = false;
mobileClear2.disabled = !hasAny;
}
section.querySelectorAll('.mob-cat-cb, .mob-tag-cb').forEach((cb) => {
cb.addEventListener('change', () => {
updateMobileFooter();
updateBadges();
});
});
// ================================================
// MOBILE: اعمال و حذف فیلتر
// ================================================
mobileApply.addEventListener('click', () => {
const selCats = [...section.querySelectorAll('.mob-cat-cb:checked')].map((c) => c.value);
const selTags = [...section.querySelectorAll('.mob-tag-cb:checked')].map((c) => c.value);
filterCards(section, selCats, selTags);
closeMobilePopup();
});
mobileClear2.addEventListener('click', () => {
section.querySelectorAll('.mob-cat-cb, .mob-tag-cb').forEach((cb) => (cb.checked = false));
updateMobileFooter();
updateBadges();
filterCards(section, [], []);
});
mobileOverlay.addEventListener('click', (e) => {
if (e.target === mobileOverlay) closeMobilePopup();
});
updateBadges();
updateDesktopClearButton();
}
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('[data-related-section]').forEach((section) => {
initRelatedSection(section);
initGalleryFilter(section);
initFilterSystem(section);
});
});

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, 'archive.html'),
},
},
manifest: true,
cssCodeSplit: true,
},
server: {
open: true,
port: 5173,
},
});