contactus
15
.claude/settings.local.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"mcp__claude_ai_Figma__get_screenshot",
|
||||
"mcp__claude_ai_Figma__get_design_context",
|
||||
"Bash(python *)",
|
||||
"Bash(python3 -c \"import json; data=json.load\\(open\\(r'C:\\\\Users\\\\front\\\\.claude\\\\projects\\\\C--Users-front-Desktop-inova-contactus\\\\755e9ec7-7b43-4816-9ef8-598d32a0795e\\\\tool-results\\\\mcp-claude_ai_Figma-get_design_context-1781008336660.txt'\\)\\); print\\(len\\(data\\), [d['type'] for d in data[:5]]\\)\")",
|
||||
"Bash(py -3 -c \"import json; data=json.load\\(open\\(r'C:\\\\Users\\\\front\\\\.claude\\\\projects\\\\C--Users-front-Desktop-inova-contactus\\\\755e9ec7-7b43-4816-9ef8-598d32a0795e\\\\tool-results\\\\mcp-claude_ai_Figma-get_design_context-1781008336660.txt'\\)\\); print\\(len\\(data\\), [d['type'] for d in data[:5]]\\)\")",
|
||||
"PowerShell($data = Get-Content 'C:\\\\Users\\\\front\\\\.claude\\\\projects\\\\C--Users-front-Desktop-inova-contactus\\\\755e9ec7-7b43-4816-9ef8-598d32a0795e\\\\tool-results\\\\mcp-claude_ai_Figma-get_design_context-1781008336660.txt' -Raw | ConvertFrom-Json; Write-Host \"Count: $\\($data.Count\\)\"; $data | Select-Object -First 5 | ForEach-Object { Write-Host \"type=$\\($_.type\\) textLen=$\\($_.text.Length\\)\" })",
|
||||
"PowerShell(Out-File *)",
|
||||
"PowerShell($data = Get-Content 'C:\\\\Users\\\\front\\\\.claude\\\\projects\\\\C--Users-front-Desktop-inova-contactus\\\\755e9ec7-7b43-4816-9ef8-598d32a0795e\\\\tool-results\\\\figma_text0.txt' -Raw; $totalLines = \\($data -split \"`n\"\\).Count; Write-Host \"Total lines: $totalLines\")",
|
||||
"Bash(npx vite *)"
|
||||
]
|
||||
}
|
||||
}
|
||||
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"
|
||||
}
|
||||
}
|
||||
150
CLAUDE.md
Normal file
@@ -0,0 +1,150 @@
|
||||
# Inova Frontend
|
||||
|
||||
Persian (RTL) frontend for the Inova WordPress theme. Pages are built as standalone HTML/CSS/JS in Vite, then ported to WordPress. No JS framework.
|
||||
|
||||
## Stack
|
||||
|
||||
- **Build:** Vite 8.x (multi-page, ES modules)
|
||||
- **Formatter:** Prettier 3.x — singleQuote, semi, 2-space indent, LF
|
||||
- **Font:** Yekan Bakh FaNum Pro (Persian, 8 weights)
|
||||
- **Language:** Persian, RTL-first (`lang="fa" dir="rtl"`)
|
||||
|
||||
## Folder Structure
|
||||
|
||||
```
|
||||
src/
|
||||
core/
|
||||
fonts/yekanbakhpro/woff/ & woff2/ ← webfont files (8 weights each)
|
||||
stylesheet/core.css ← PRIMARY source of truth for all styling
|
||||
javascript/core.js ← shared JS utilities
|
||||
assets/
|
||||
icons/ ← SVG icons
|
||||
images/
|
||||
css/[page].css ← page layout styles
|
||||
css/[page]-responsive.css ← page breakpoint overrides
|
||||
js/[page].js ← page-specific JS
|
||||
components/ ← reusable HTML components
|
||||
templates/ ← page templates
|
||||
```
|
||||
|
||||
## Core CSS — Source of Truth
|
||||
|
||||
`src/core/stylesheet/core.css` defines everything global. **Always load it first**, before any page CSS.
|
||||
|
||||
### Color Tokens
|
||||
|
||||
```css
|
||||
--color-primary: #0274b3 /* primary blue */
|
||||
--color-title: #1a1a2e /* headings */
|
||||
--color-text: #505068 /* paragraph text */
|
||||
--color-body-text: #6a6a6a /* secondary body text */
|
||||
--bg-gray: #f9f9f9 /* light gray backgrounds */
|
||||
--color-pastel-main: #c5d7ec /* pastel blue accent */
|
||||
|
||||
/* Blue scale */
|
||||
--blue-50 … --blue-800 /* lightest → darkest */
|
||||
--blue-500: #1796dc /* default link color */
|
||||
--blue-600: #0274b3 /* = --color-primary */
|
||||
```
|
||||
|
||||
### Typography Scale
|
||||
|
||||
| Tag | Desktop | Mobile (≤767px) | Color |
|
||||
|-----|---------|-----------------|-------|
|
||||
| h1 | 36px | 24px | `--color-title` |
|
||||
| h2 | 24px | 22px | `--color-title` |
|
||||
| h3 | 22px | 18px | `--color-title` |
|
||||
| h4 | 20px | 16px | `--color-title` |
|
||||
| h5 | 15px | 14px | `--color-title` |
|
||||
| p | 15px / line-height 1.75 | — | `--color-text` |
|
||||
| a | color `--blue-500`, no underline | — | — |
|
||||
|
||||
Font family and `direction: rtl` are applied globally — never redeclare them in page CSS.
|
||||
|
||||
### Utility Classes (defined in core)
|
||||
|
||||
- `.no-scrollbar` — hides scrollbar cross-browser
|
||||
|
||||
### What Core Already Handles (do not repeat in page CSS)
|
||||
|
||||
- `@font-face` declarations
|
||||
- `box-sizing: border-box` universal reset
|
||||
- `margin: 0; padding: 0` reset
|
||||
- `direction: rtl` on all elements
|
||||
- `scroll-behavior: smooth`
|
||||
- `button` reset (no border/outline/background)
|
||||
- `::selection` brand color
|
||||
- Number input spinner removal
|
||||
- Custom scrollbar styling
|
||||
|
||||
## Adding a New Page
|
||||
|
||||
1. Create `[page].html` in the project root
|
||||
2. Create `src/assets/css/[page].css` and `[page]-responsive.css`
|
||||
3. Create `src/assets/js/[page].js`
|
||||
4. Register in `vite.config.js → build.rollupOptions.input`
|
||||
5. Use this import order in HTML:
|
||||
|
||||
```html
|
||||
<link rel="stylesheet" href="./src/core/stylesheet/core.css" />
|
||||
<link rel="stylesheet" href="./src/assets/css/[page].css" />
|
||||
<link rel="stylesheet" href="./src/assets/css/[page]-responsive.css" />
|
||||
<script type="module" src="./src/assets/js/[page].js" defer></script>
|
||||
```
|
||||
|
||||
## CSS Conventions
|
||||
|
||||
**Naming:** BEM-like, kebab-case — `.block-name`, `.block-element`, `.block--modifier`
|
||||
|
||||
**Container pattern:** every section wraps content in `.container`:
|
||||
```css
|
||||
.container {
|
||||
max-width: 1240px;
|
||||
padding: 0 20px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
```
|
||||
|
||||
**Breakpoints** (use raw px values in `@media` — no CSS variable support in media queries):
|
||||
|
||||
| Alias | Value |
|
||||
|-------|--------|
|
||||
| xxl | 1400px |
|
||||
| xl | 1200px |
|
||||
| lg | 992px |
|
||||
| md | 768px |
|
||||
| sm | 576px |
|
||||
|
||||
Pre-stub all 5 breakpoints in the responsive file, even if empty.
|
||||
|
||||
**Section comments** use `═══` ASCII dividers.
|
||||
|
||||
**Tokens to use — and their correct names:**
|
||||
|
||||
| Correct | Wrong (do not use) |
|
||||
|---------|--------------------|
|
||||
| `var(--color-title)` | `var(--clr-title)` |
|
||||
| `var(--color-text)` | `var(--clr-text)` |
|
||||
| `16px` (raw value) | `var(--sp-16)` — not defined |
|
||||
| inherited font | `var(--font-primary)` — not defined |
|
||||
|
||||
## Vite Path Aliases
|
||||
|
||||
```js
|
||||
@ → src/
|
||||
@core → src/core/
|
||||
@components → src/components/
|
||||
```
|
||||
|
||||
## HTML Conventions
|
||||
|
||||
- `<html lang="fa" dir="rtl">`
|
||||
- `<div id="root">` wraps `<main>` in page HTML
|
||||
- Decorative elements get `aria-hidden="true"`
|
||||
- Section comments inside HTML use `═══` ASCII dividers
|
||||
|
||||
## Known Issues
|
||||
|
||||
1. `contactus.css` uses undefined variables (`--sp-16`, `--font-primary`, `--clr-title`, `--clr-text`) — use the correct core token names above.
|
||||
2. `@font-face` URLs for weights 800/900/950 in `core.css` have incorrect filenames with spaces — those font weights currently fail to load.
|
||||
3. `contactus.html` is registered as key `"footer"` in `vite.config.js` — should be `"contactus"`.
|
||||
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
|
||||
```
|
||||
557
contactus.html
Normal file
@@ -0,0 +1,557 @@
|
||||
<!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/contactus.css" />
|
||||
<link rel="stylesheet" href="./src/assets/css/contactus-responsive.css" />
|
||||
<script type="module" src="./src/assets/js/contactus.js" defer></script>
|
||||
<title>تماس با ما - اینوا</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root">
|
||||
<main>
|
||||
<!-- ═══════════════════════════════════════════
|
||||
HERO
|
||||
═══════════════════════════════════════════ -->
|
||||
<section class="hero-section">
|
||||
<div class="container">
|
||||
<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>
|
||||
<svg class="contactus-hands" aria-hidden="true" width="977px" height="303px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#contactus-hands"></use>
|
||||
</svg>
|
||||
<div class="hero-content">
|
||||
<h1 class="hero-h1">دغدغه و مسئله از شما، ایده و راهحل از ما!</h1>
|
||||
<p class="hero-sub">
|
||||
دعوتید به یک چای گرم در دفتر اینوا تا دغدغههای کسبوکارتان را بررسی کنیم و با
|
||||
رویکردی خلاقانه و دادهمحور، برایشان راهحلهای اجرایی پیدا کنیم.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════
|
||||
CONTACT INFO + FORM
|
||||
═══════════════════════════════════════════ -->
|
||||
<section class="contact-section">
|
||||
<div class="container">
|
||||
<div class="contact-grid">
|
||||
<!-- Right column: Contact Form -->
|
||||
<div class="contact-form-wrapper">
|
||||
<div class="contact-form-title">
|
||||
<h2 class="contact-form-title__h2">برای شروع همکاری آمادهاید؟</h2>
|
||||
<p class="contact-form-title__sub">
|
||||
در کمتر از ۲۴ ساعت ما با شما تماس خواهیم گرفت
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="form-section-left">
|
||||
<form id="contactForm">
|
||||
<div class="form-input">
|
||||
<label class="required-label">نام و نام خانوادگی </label>
|
||||
<input type="text" id="name" placeholder="مثال: آرمان بزرگی" required />
|
||||
<small id="nameError" class="error-message"></small>
|
||||
</div>
|
||||
|
||||
<div class="form-input">
|
||||
<label class="label"> موضوع </label>
|
||||
<div class="custom-select" id="customSelect">
|
||||
<div class="select-box">
|
||||
<span class="selected-text"> درخواست پروژه </span>
|
||||
|
||||
<span class="arrow">
|
||||
<svg width="24" height="24" focusable="false">
|
||||
<use href="./src/assets/icons/portfolioP.svg#down-arr"></use>
|
||||
</svg>
|
||||
</span>
|
||||
</div>
|
||||
<ul class="options">
|
||||
<li class="option active">درخواست پروژه</li>
|
||||
<li class="option">جلسه مشاوره</li>
|
||||
<li class="option">همکاری با اینوا</li>
|
||||
<li class="option">سایر موارد</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-input">
|
||||
<label class="required-label">شماره تماس </label>
|
||||
<input type="tel" id="phone" placeholder="33 22 111 0912" required />
|
||||
<small id="phoneError" class="error-message"></small>
|
||||
</div>
|
||||
|
||||
<div class="form-input">
|
||||
<label>ایمیل</label>
|
||||
<input type="email" id="email" placeholder="inova@gmail.com" />
|
||||
<small id="emailError" class="error-message"></small>
|
||||
</div>
|
||||
|
||||
<div class="form-text">
|
||||
<label class="required-label">متن درخواست </label>
|
||||
<textarea id="message"></textarea>
|
||||
</div>
|
||||
|
||||
<button type="submit" class="form-btn" id="submitBtn">
|
||||
<span class="btn-text">ثبت درخواست</span>
|
||||
|
||||
<span class="form-btn-icon btn-icon-default" aria-hidden="true">
|
||||
<svg width="24" height="24" focusable="false" color="white">
|
||||
<use href="./src/assets/icons/portfolioP.svg#arrow-left"></use>
|
||||
</svg>
|
||||
</span>
|
||||
|
||||
<span class="form-btn-icon btn-icon-loading" aria-hidden="true">
|
||||
<span class="spinner"></span>
|
||||
</span>
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<div class="success-message" id="successMessage">
|
||||
<img src="./src/img/massage-send.svg" class="end-form-img" />
|
||||
<h3>درخواست شما با موفقیت ثبت شد</h3>
|
||||
<p>
|
||||
کارشناسان ما حداکثر تا ۲۴ ساعت آینده با شما تماس خواهند گرفت. جزئیات جلسه نیز
|
||||
از طریق پیامک و ایمیل برای شما ارسال میشود.
|
||||
</p>
|
||||
<button type="button" class="success-btn" id="backBtn">
|
||||
<span class="btn-text">بازگشت به فرم</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="form-brands">
|
||||
<div class="form-brands__header">
|
||||
<span class="form-brands__label">مورد تایید برندهای خلاق</span>
|
||||
<div class="form-brands__line"></div>
|
||||
</div>
|
||||
<div class="form-brands__logos">
|
||||
<div class="logos-track">
|
||||
<img src="./public/images/logo 4.png" />
|
||||
<img src="./public/images/logo 5.png" />
|
||||
<img src="./public/images/logo 6.png" />
|
||||
<img src="./public/images/logo1.png" />
|
||||
<img src="./public/images/logo2.png" />
|
||||
<img src="./public/images/logo3.png" />
|
||||
<img src="./public/images/logo7.png" />
|
||||
<img src="./public/images/logo8.png" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <form class="contact-form" novalidate>
|
||||
<div class="form-row">
|
||||
<div class="form-field">
|
||||
<label class="form-label" for="fullname">
|
||||
نام و نام خانوادگی <span class="form-required">*</span>
|
||||
</label>
|
||||
<input
|
||||
class="form-input"
|
||||
type="text"
|
||||
id="fullname"
|
||||
name="fullname"
|
||||
placeholder="آرمان بزرگی"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<label class="form-label" for="subject">موضوع</label>
|
||||
<div class="form-select-wrapper">
|
||||
<span class="form-select-arrow" aria-hidden="true">
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/0bdc64a3-5ca5-45c8-aacb-6ee14fdaccd4"
|
||||
alt=""
|
||||
/>
|
||||
</span>
|
||||
<select class="form-select" id="subject" name="subject">
|
||||
<option value="cooperation">درخواست همکاری</option>
|
||||
<option value="consultation">مشاوره</option>
|
||||
<option value="project">پروژه جدید</option>
|
||||
<option value="other">سایر</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-field">
|
||||
<label class="form-label" for="phone">
|
||||
شماره تماس <span class="form-required">*</span>
|
||||
</label>
|
||||
<input
|
||||
class="form-input"
|
||||
type="tel"
|
||||
id="phone"
|
||||
name="phone"
|
||||
placeholder="09xxxxxxxxx"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div class="form-field">
|
||||
<label class="form-label" for="email">ایمیل</label>
|
||||
<input
|
||||
class="form-input"
|
||||
type="email"
|
||||
id="email"
|
||||
name="email"
|
||||
placeholder="example@email.com"
|
||||
/>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="form-field form-field--full">
|
||||
<label class="form-label" for="message">
|
||||
متن درخواست <span class="form-required">*</span>
|
||||
</label>
|
||||
<textarea class="form-textarea" id="message" name="message" required></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-submit-row">
|
||||
<button type="submit" class="form-submit-btn">
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/0b1c5271-d257-46ec-a5c4-c4a7a5d264e9"
|
||||
alt=""
|
||||
aria-hidden="true"
|
||||
/>
|
||||
ارسال درخواست
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="form-brands">
|
||||
<div class="form-brands__header">
|
||||
<div class="form-brands__line"></div>
|
||||
<span class="form-brands__label">مورد تایید برندهای خلاق</span>
|
||||
</div>
|
||||
<div class="form-brands__logos">
|
||||
<div class="logos-track">
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/73fb7ac0-b82c-41f9-88a7-8610925e446f"
|
||||
alt="اسنپ"
|
||||
/>
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/2e5ac459-bcbb-4c9a-bd04-ca614129ab4c"
|
||||
alt="لوگو"
|
||||
/>
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/2cea5865-ff49-4e42-88c6-a4713d8cab00"
|
||||
alt="فرداد"
|
||||
/>
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/639f3aa9-7a2a-4885-bd44-c5afd2d44005"
|
||||
alt="انیل"
|
||||
/>
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/ce88af7c-35b5-4aaf-a6f3-4cb67792e589"
|
||||
alt="زبانمهر"
|
||||
/>
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/73fb7ac0-b82c-41f9-88a7-8610925e446f"
|
||||
alt="اسنپ"
|
||||
/>
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/2e5ac459-bcbb-4c9a-bd04-ca614129ab4c"
|
||||
alt="لوگو"
|
||||
/>
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/2cea5865-ff49-4e42-88c6-a4713d8cab00"
|
||||
alt="فرداد"
|
||||
/>
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/639f3aa9-7a2a-4885-bd44-c5afd2d44005"
|
||||
alt="انیل"
|
||||
/>
|
||||
<img
|
||||
src="https://www.figma.com/api/mcp/asset/ce88af7c-35b5-4aaf-a6f3-4cb67792e589"
|
||||
alt="زبانمهر"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form> -->
|
||||
</div>
|
||||
|
||||
<!-- Left column: Contact Info -->
|
||||
<div class="contact-info">
|
||||
<div class="contact-info__header">
|
||||
<h2 class="contact-info__title">راههای ارتباطی با ما</h2>
|
||||
<p class="contact-info__subtitle">
|
||||
در هر زمان که نیاز داشتید، از طریق تلفن، ایمیل یا شبکههای اجتماعی با ما در
|
||||
ارتباط باشید.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="contact-items">
|
||||
<a href="tel:02191096311" class="contact-item">
|
||||
<div class="contact-item__icon">
|
||||
<svg aria-hidden="true" width="48px" height="48px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#contact-phone"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="contact-item__body">
|
||||
<div class="contact-item__texts">
|
||||
<span class="contact-item__label">تماس مستقیم با ما</span>
|
||||
<span class="contact-item__value">
|
||||
<strong>021-91096311</strong> | ساعت پاسخگویی: شنبه تا چهارشنبه: ۸ صبح تا
|
||||
۵ عصر
|
||||
</span>
|
||||
</div>
|
||||
<div class="contact-item__link-btn" aria-hidden="true">
|
||||
<svg aria-hidden="true" width="24px" height="24px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#arr-contactus"></use>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<a href="mailto:Info@inova-agency.com" class="contact-item">
|
||||
<div class="contact-item__icon">
|
||||
<svg aria-hidden="true" width="48px" height="48px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#contact-mail"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="contact-item__body">
|
||||
<div class="contact-item__texts">
|
||||
<span class="contact-item__label">ایمیل</span>
|
||||
<span class="contact-item__value">Info@inova-agency.com</span>
|
||||
</div>
|
||||
<div class="contact-item__link-btn" aria-hidden="true">
|
||||
<svg aria-hidden="true" width="24px" height="24px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#arr-contactus"></use>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
<div class="contact-item">
|
||||
<div class="contact-item__icon">
|
||||
<svg aria-hidden="true" width="48px" height="48px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#contact-post"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="contact-item__body">
|
||||
<div class="contact-item__texts">
|
||||
<span class="contact-item__label">کد پستی</span>
|
||||
<span class="contact-item__value">1518633969</span>
|
||||
</div>
|
||||
<div class="contact-item__link-btn" aria-hidden="true">
|
||||
<svg aria-hidden="true" width="24px" height="24px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#arr-contactus"></use>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="contact-item contact-item--tall">
|
||||
<div class="contact-item__icon">
|
||||
<svg aria-hidden="true" width="48px" height="48px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#contact-loc"></use>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="contact-item__body contact-item__body--top">
|
||||
<div class="contact-item__texts">
|
||||
<span class="contact-item__label">آدرس شرکت</span>
|
||||
<span class="contact-item__value">
|
||||
تهران، بلوار نلسون ماندلا (جردن)، پایینتر از جهان کودک، خیابان ناوک، پلاک
|
||||
۱۲، طبقه سوم
|
||||
</span>
|
||||
</div>
|
||||
<div class="contact-item__link-btn" aria-hidden="true">
|
||||
<svg aria-hidden="true" width="24px" height="24px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#arr-contactus"></use>
|
||||
</svg>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="contact-social">
|
||||
<p class="contact-social__label">ما را در شبکههای اجتماعی دنبال کنید</p>
|
||||
<div class="contact-social__icons">
|
||||
<a href="#" class="social-icon">
|
||||
<svg aria-hidden="true" width="32px" height="32px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#instagram1"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="#" class="social-icon">
|
||||
<svg aria-hidden="true" width="32px" height="32px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#linkedin1"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="#" class="social-icon">
|
||||
<svg aria-hidden="true" width="20px" height="20px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#bale"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="#" class="social-icon">
|
||||
<svg aria-hidden="true" width="32px" height="32px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#youtube1"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="#" class="social-icon">
|
||||
<svg aria-hidden="true" width="32px" height="32px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#telegram1"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="#" class="social-icon">
|
||||
<svg aria-hidden="true" width="32px" height="32px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#twitter1"></use>
|
||||
</svg>
|
||||
</a>
|
||||
<a href="#" class="social-icon">
|
||||
<svg aria-hidden="true" width="24px" height="24px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#aparat1"></use>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════
|
||||
PROCESS STEPS
|
||||
═══════════════════════════════════════════ -->
|
||||
<section class="steps-section">
|
||||
<div class="container">
|
||||
<div class="steps-header">
|
||||
<h2 class="steps-header__title">مسیر ساده شروع همکاری با اینوا</h2>
|
||||
<p class="steps-header__sub">
|
||||
از ثبت درخواست جلسه تا آغاز همکاری، در چند مرحله کوتاه و شفاف کنار شما هستیم تا
|
||||
بهترین مسیر برای رشد کسبوکارتان را مشخص کنیم.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="steps-grid">
|
||||
<div class="steps-row">
|
||||
<!-- Step 1 -->
|
||||
<div class="step-card">
|
||||
<div class="step-card__top">
|
||||
<div class="step-card__meta">
|
||||
<svg aria-hidden="true" width="32px" height="32px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#file-spreadsheet"></use>
|
||||
</svg>
|
||||
<span class="step-card__badge">مرحله اول</span>
|
||||
</div>
|
||||
<p class="step-card__title">ثبت درخواست جلسه</p>
|
||||
</div>
|
||||
<p class="step-card__desc">
|
||||
از طریق فرم درخواست جلسه، اطلاعات اولیه پروژه یا کسبوکار خود را برای ما ارسال
|
||||
میکنید تا تیم اینوا دید اولیهای نسبت به نیازها و اهداف شما داشته باشد.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Step 2 -->
|
||||
<div class="step-card">
|
||||
<div class="step-card__top">
|
||||
<div class="step-card__meta">
|
||||
<svg aria-hidden="true" width="32px" height="32px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#phone-32"></use>
|
||||
</svg>
|
||||
<span class="step-card__badge">مرحله دوم</span>
|
||||
</div>
|
||||
<p class="step-card__title">تماس و بررسی اولیه</p>
|
||||
</div>
|
||||
<p class="step-card__desc">
|
||||
پس از دریافت درخواست، تیم ما با شما تماس میگیرد تا جزئیات بیشتری درباره نیازها،
|
||||
اهداف و شرایط پروژه بررسی شود و زمان مناسب برای جلسه طبق بازه شما شکل گیرد.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="steps-row">
|
||||
<!-- Step 3 -->
|
||||
<div class="step-card">
|
||||
<div class="step-card__top">
|
||||
<div class="step-card__meta">
|
||||
<svg aria-hidden="true" width="32px" height="32px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#dis"></use>
|
||||
</svg>
|
||||
<span class="step-card__badge">مرحله سوم</span>
|
||||
</div>
|
||||
<p class="step-card__title">برگزاری جلسه مشاوره</p>
|
||||
</div>
|
||||
<p class="step-card__desc">
|
||||
در جلسه مشاوره، وضعیت فعلی کسبوکار شما، فرصتهای رشد و راهکارهای پیشنهادی اینوا
|
||||
بررسی میشود تا بهترین مسیر همکاری مشخص گردد.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Step 4 -->
|
||||
<div class="step-card">
|
||||
<div class="step-card__top">
|
||||
<div class="step-card__meta">
|
||||
<svg aria-hidden="true" width="32px" height="32px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#rocket"></use>
|
||||
</svg>
|
||||
<span class="step-card__badge">مرحله چهارم</span>
|
||||
</div>
|
||||
<p class="step-card__title">نهاییسازی و شروع همکاری</p>
|
||||
</div>
|
||||
<p class="step-card__desc">
|
||||
پس از توافق بر سر استراتژی و خدمات مورد نیاز، قرارداد همکاری تنظیم شده و پروژه
|
||||
به صورت رسمی آغاز میشود.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ═══════════════════════════════════════════
|
||||
MAP
|
||||
═══════════════════════════════════════════ -->
|
||||
<section class="map-section">
|
||||
<div class="container">
|
||||
<div class="map-card">
|
||||
<img
|
||||
class="map-card__img"
|
||||
src="./public/images/Map.png"
|
||||
alt="نقشه دفتر اینوا - خیابان ناوک، تهران"
|
||||
/>
|
||||
|
||||
<div class="map-card__location" aria-hidden="true">
|
||||
<span class="map-location-dot"></span>
|
||||
</div>
|
||||
|
||||
<div class="map-card__nav">
|
||||
<a href="#" class="map-nav-btn" target="_blank" rel="noopener">
|
||||
<svg aria-hidden="true" width="24px" height="24px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#map"></use>
|
||||
</svg>
|
||||
<span>گوگل</span>
|
||||
</a>
|
||||
|
||||
<a href="#" class="map-nav-btn" target="_blank" rel="noopener">
|
||||
<span>نشان</span>
|
||||
<svg aria-hidden="true" width="24px" height="24px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#neshan"></use>
|
||||
</svg>
|
||||
</a>
|
||||
|
||||
<a href="#" class="map-nav-btn" target="_blank" rel="noopener">
|
||||
<span>بلد</span>
|
||||
<svg aria-hidden="true" width="20px" height="20px">
|
||||
<use href="./src/assets/icons/portfolioP.svg#balad"></use>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
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/Map.png
Normal file
|
After Width: | Height: | Size: 417 KiB |
BIN
public/images/logo 4.png
Normal file
|
After Width: | Height: | Size: 658 B |
BIN
public/images/logo 5.png
Normal file
|
After Width: | Height: | Size: 860 B |
BIN
public/images/logo 6.png
Normal file
|
After Width: | Height: | Size: 810 B |
BIN
public/images/logo1.png
Normal file
|
After Width: | Height: | Size: 671 B |
BIN
public/images/logo2.png
Normal file
|
After Width: | Height: | Size: 755 B |
BIN
public/images/logo3.png
Normal file
|
After Width: | Height: | Size: 88 B |
BIN
public/images/logo7.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
public/images/logo8.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
174
src/assets/css/contactus-responsive.css
Normal file
@@ -0,0 +1,174 @@
|
||||
/* ═══════════════════════════════════════════════════════
|
||||
xxl — 1400px
|
||||
═══════════════════════════════════════════════════════ */
|
||||
@media screen and (max-width: 1400px) {
|
||||
}
|
||||
|
||||
/* ═══════════════════════════════════════════════════════
|
||||
xl — 1200px
|
||||
═══════════════════════════════════════════════════════ */
|
||||
@media screen and (max-width: 1200px) {
|
||||
.hero-content {
|
||||
width: 90%;
|
||||
max-width: 673px;
|
||||
}
|
||||
|
||||
.contact-info {
|
||||
width: 460px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ═══════════════════════════════════════════════════════
|
||||
lg — 992px
|
||||
═══════════════════════════════════════════════════════ */
|
||||
@media screen and (max-width: 992px) {
|
||||
.hero-card {
|
||||
height: auto;
|
||||
min-height: 240px;
|
||||
padding: 40px 24px;
|
||||
}
|
||||
|
||||
.hero-h1 {
|
||||
font-size: 28px;
|
||||
line-height: 42px;
|
||||
}
|
||||
|
||||
.contact-grid {
|
||||
flex-direction: column;
|
||||
gap: 32px;
|
||||
}
|
||||
|
||||
.contact-info {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.contact-form-wrapper {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.steps-row {
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.step-card__title {
|
||||
white-space: normal;
|
||||
}
|
||||
}
|
||||
|
||||
/* ═══════════════════════════════════════════════════════
|
||||
md — 768px
|
||||
═══════════════════════════════════════════════════════ */
|
||||
@media screen and (max-width: 768px) {
|
||||
.hero-h1 {
|
||||
font-size: 22px;
|
||||
line-height: 36px;
|
||||
}
|
||||
|
||||
.hero-sub {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.contact-form-title__h2 {
|
||||
font-size: 20px;
|
||||
line-height: 30px;
|
||||
}
|
||||
|
||||
.form-row {
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.steps-header__title {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.map-card {
|
||||
height: 300px;
|
||||
border-radius: 24px;
|
||||
}
|
||||
|
||||
.map-card__img {
|
||||
border-radius: 24px;
|
||||
}
|
||||
|
||||
.map-card__nav {
|
||||
right: 16px;
|
||||
bottom: 16px;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.map-nav-btn {
|
||||
padding: 6px 10px;
|
||||
}
|
||||
}
|
||||
|
||||
/* ═══════════════════════════════════════════════════════
|
||||
sm — 576px
|
||||
═══════════════════════════════════════════════════════ */
|
||||
@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;
|
||||
}
|
||||
|
||||
.contact-item__label {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.contact-item__value {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.contact-social__icons {
|
||||
flex-wrap: wrap;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.form-submit-btn {
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.form-submit-row {
|
||||
justify-content: stretch;
|
||||
}
|
||||
|
||||
.steps-grid {
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.step-card {
|
||||
padding: 16px;
|
||||
}
|
||||
|
||||
.map-card {
|
||||
height: 240px;
|
||||
border-radius: 16px;
|
||||
}
|
||||
|
||||
.map-card__img {
|
||||
border-radius: 16px;
|
||||
}
|
||||
|
||||
.map-nav-btn span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.map-card__nav {
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.map-nav-btn {
|
||||
padding: 8px;
|
||||
}
|
||||
}
|
||||
960
src/assets/css/contactus.css
Normal file
@@ -0,0 +1,960 @@
|
||||
/* ═══════════════════════════════════════════════════════
|
||||
CONTAINER OVERRIDE
|
||||
═══════════════════════════════════════════════════════ */
|
||||
.container {
|
||||
max-width: 1240px;
|
||||
padding: 0 20px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
main {
|
||||
padding-bottom: 80px;
|
||||
}
|
||||
|
||||
/* ═══════════════════════════════════════════════════════
|
||||
HERO
|
||||
═══════════════════════════════════════════════════════ */
|
||||
.hero-section {
|
||||
padding-top: 80px;
|
||||
padding-bottom: 50px;
|
||||
}
|
||||
|
||||
.hero-card {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 303px;
|
||||
background-color: #eff6ff;
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
|
||||
.hero-content {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
width: 673px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.hero-h1 {
|
||||
font-size: 36px;
|
||||
font-weight: 700;
|
||||
line-height: 54px;
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
.hero-sub {
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
line-height: 26px;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.hero-circles {
|
||||
position: absolute;
|
||||
top: -59%;
|
||||
right: 50%;
|
||||
transform: translate(50%, -50%);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.circle {
|
||||
position: absolute;
|
||||
border-radius: 50%;
|
||||
top: 50%;
|
||||
right: 50%;
|
||||
transform: translate(50%, -50%);
|
||||
}
|
||||
.circle--1 { width: 698px; height: 698px; background-color:rgba(216, 233, 255, 0.2);}
|
||||
.circle--2 { width: 616px; height: 616px; background-color: rgba(216, 233, 255, 0.4); }
|
||||
.circle--3 { width: 534px; height: 534px; background-color: rgba(216, 233, 255, 0.6); }
|
||||
.circle--4 { width: 452px; height: 452px; background-color: rgba(216, 233, 255, 0.8); }
|
||||
|
||||
|
||||
.hero-hollow {
|
||||
position: absolute;
|
||||
width: 403px;
|
||||
height: 403px;
|
||||
border-radius: 50%;
|
||||
background-color: rgba(2, 116, 179, 0.12);
|
||||
top: 75%;
|
||||
transform: translateY(-50%);
|
||||
pointer-events: none;
|
||||
filter: blur(250px);
|
||||
}
|
||||
.hero-hollow--left {
|
||||
left: -290px;
|
||||
}
|
||||
.hero-hollow--right {
|
||||
right: -290px;
|
||||
}
|
||||
|
||||
.hero-dot-pattern {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background-image: radial-gradient(circle, var(--color-pastel-main) 1px, transparent 1px);
|
||||
background-size: 24px 24px;
|
||||
pointer-events: none;
|
||||
opacity: 0.4;
|
||||
}
|
||||
.contactus-hands{
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
right: 50%;
|
||||
transform: translate(50%, -50%);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ═══════════════════════════════════════════════════════
|
||||
CONTACT SECTION
|
||||
═══════════════════════════════════════════════════════ */
|
||||
.contact-section {
|
||||
margin-bottom: 100px;
|
||||
}
|
||||
|
||||
.contact-grid {
|
||||
display: flex;
|
||||
gap: 32px;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
/* ── Contact Info (left column) ── */
|
||||
.contact-info {
|
||||
width: 550px;
|
||||
flex-shrink: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 24px;
|
||||
padding-top: 24px;
|
||||
}
|
||||
|
||||
.contact-info__header {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.contact-info__title {
|
||||
font-size: 22px;
|
||||
font-weight: 700;
|
||||
line-height: 34px;
|
||||
color: var(--color-title);
|
||||
}
|
||||
|
||||
.contact-info__subtitle {
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
line-height: 26px;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.contact-items {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
padding-bottom: 16px;
|
||||
border-bottom: 1px dashed #bdbdbd;
|
||||
}
|
||||
|
||||
.contact-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 8px 12px;
|
||||
background-color: #f0f5fe;
|
||||
border-radius: 10px;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
transition: opacity 0.2s;
|
||||
overflow: hidden;
|
||||
min-height: 64px;
|
||||
}
|
||||
|
||||
.contact-item:hover {
|
||||
opacity: 0.85;
|
||||
}
|
||||
|
||||
.contact-item--tall {
|
||||
align-items: flex-start;
|
||||
padding-top: 12px;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
.contact-item__link-btn {
|
||||
flex-shrink: 0;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border-radius: 1000px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
.contact-item__body {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.contact-item__body--top {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.contact-item__texts {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
text-align: right;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.contact-item__label {
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
line-height: 22px;
|
||||
color: var(--color-title);
|
||||
}
|
||||
|
||||
.contact-item__value {
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
line-height: 24px;
|
||||
color: var(--color-body-text);
|
||||
}
|
||||
|
||||
.contact-item__value strong {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.contact-item__icon {
|
||||
flex-shrink: 0;
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
background-color: var(--color-primary);
|
||||
border-radius: 11px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.contact-item__icon img {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
/* ── Social Media ── */
|
||||
.contact-social {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
align-items:flex-start ;
|
||||
}
|
||||
|
||||
.contact-social__label {
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
line-height: 22px;
|
||||
color: var(--color-text);
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.contact-social__icons {
|
||||
display: flex;
|
||||
gap: 16px;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.social-icon {
|
||||
flex-shrink: 0;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
background-color: #f3f8ff;
|
||||
border-radius: 150px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
transition: background-color 0.2s;
|
||||
}
|
||||
|
||||
.social-icon:hover {
|
||||
background-color: var(--color-pastel-main);
|
||||
}
|
||||
|
||||
.social-icon img {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
/* ── Contact Form (right column) ── */
|
||||
.contact-form-wrapper {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
background-color: #fafcff;
|
||||
padding: 24px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
.contact-form-title {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 9px;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.contact-form-title__h2 {
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
line-height: 36px;
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
.contact-form-title__sub {
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
line-height: 26px;
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.form-input input,
|
||||
.form-text textarea {
|
||||
border: 1px solid #ccc;
|
||||
outline: none;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.form-input input:focus,
|
||||
.form-text textarea:focus {
|
||||
border-color: var(--color-primary);
|
||||
background-color: #EAF7FF;
|
||||
}
|
||||
.error-message {
|
||||
color: #DC2626;
|
||||
font-size: 13px;
|
||||
margin-top: 6px;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.input-error {
|
||||
background-color: #FFEBEB !important;
|
||||
border-color: #ef4444 !important;
|
||||
}
|
||||
|
||||
|
||||
/* ── Brands logos scroll ── */
|
||||
.form-brands {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.form-brands__header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.form-brands__line {
|
||||
flex: 1;
|
||||
height: 1px;
|
||||
background-color: #e0e0e0;
|
||||
}
|
||||
|
||||
.form-brands__label {
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
line-height: 22px;
|
||||
color: var(--color-text);
|
||||
white-space: nowrap;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.form-brands__logos {
|
||||
height: 32px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
|
||||
mask-image: linear-gradient(
|
||||
90deg,
|
||||
transparent 0%,
|
||||
black 8%,
|
||||
black 92%,
|
||||
transparent 100%
|
||||
);
|
||||
|
||||
-webkit-mask-image: linear-gradient(
|
||||
90deg,
|
||||
transparent 0%,
|
||||
black 8%,
|
||||
black 92%,
|
||||
transparent 100%
|
||||
);
|
||||
}
|
||||
|
||||
.logos-track {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 40px;
|
||||
justify-content: right;
|
||||
animation: logos-scroll 18s linear infinite;
|
||||
white-space: transform;
|
||||
width: max-content;
|
||||
}
|
||||
|
||||
.logos-track img {
|
||||
width: auto;
|
||||
object-fit: contain;
|
||||
flex-shrink: 0;
|
||||
filter: grayscale(0.3);
|
||||
}
|
||||
|
||||
@keyframes logos-scroll {
|
||||
from { transform: translateX(-1%); }
|
||||
to { transform: translateX(50%); }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 16px;
|
||||
}
|
||||
.form-input label,
|
||||
.required-label {
|
||||
font-size: 14px;
|
||||
margin-bottom: 8px;
|
||||
display: block;
|
||||
color: #1a1a2e;
|
||||
}
|
||||
.required-label::after {
|
||||
content: '*';
|
||||
color: #ff0000;
|
||||
margin-left: 4px;
|
||||
}
|
||||
input,
|
||||
.select-box,
|
||||
textarea {
|
||||
width: 100%;
|
||||
border: 1px solid #dbdbdb;
|
||||
border-radius: 8px;
|
||||
padding: 0px 12px;
|
||||
height: 38px;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
line-height: 1.8;
|
||||
color: var(--color-title);
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
textarea {
|
||||
min-height: 114px;
|
||||
resize: vertical;
|
||||
}
|
||||
.form-input {
|
||||
flex-basis: 48%;
|
||||
position: relative;
|
||||
}
|
||||
.label {
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
color: #222;
|
||||
}
|
||||
.custom-select {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
user-select: none;
|
||||
}
|
||||
.select-box {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
cursor: pointer;
|
||||
transition: 0.25s;
|
||||
}
|
||||
.selected-text {
|
||||
font-size: 14px;
|
||||
color: #222;
|
||||
font-weight: 500;
|
||||
}
|
||||
.arrow {
|
||||
display: flex;
|
||||
transition: 0.25s;
|
||||
}
|
||||
.custom-select.active .arrow {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
.options {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
width: 100%;
|
||||
border-radius: 8px;
|
||||
overflow: hidden;
|
||||
list-style: none;
|
||||
border: 1px solid #dbdbdb;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
z-index: 100;
|
||||
}
|
||||
.custom-select.active .options {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
.option {
|
||||
padding: 0px 12px;
|
||||
height: 38px;
|
||||
font-size: 17px;
|
||||
transition: 0.2s;
|
||||
background-color: #f9f9f9;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.option.active {
|
||||
background: var(--color-primary);
|
||||
color: #fff;
|
||||
}
|
||||
.form-text {
|
||||
flex-basis: 98%;
|
||||
}
|
||||
.form-btn {
|
||||
background-color: var(--color-primary);
|
||||
border: none;
|
||||
border-radius: 10px;
|
||||
padding: 10px 12px 10px 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
cursor: pointer;
|
||||
transition: 0.3s ease;
|
||||
}
|
||||
.form-btn-icon {
|
||||
display: none;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #000;
|
||||
}
|
||||
.form-btn.loading .btn-icon-default {
|
||||
display: none;
|
||||
}
|
||||
.form-btn.loading .btn-icon-loading {
|
||||
display: flex;
|
||||
}
|
||||
.btn-icon-default {
|
||||
display: flex;
|
||||
}
|
||||
.spinner {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
border: 4px solid #c5d7ec;
|
||||
border-top-color: transparent;
|
||||
border-radius: 50%;
|
||||
box-sizing: border-box;
|
||||
animation: spin 300ms linear infinite;
|
||||
}
|
||||
@keyframes spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
.btn-text {
|
||||
color: #ffffff;
|
||||
font-size: 16px;
|
||||
font-weight: 400;
|
||||
}
|
||||
.form-section-right {
|
||||
flex: 0 1 45%;
|
||||
}
|
||||
.form-section-text h2 {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
.form-section-text p {
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
line-height: 1.7;
|
||||
color: var(--color-body-text);
|
||||
}
|
||||
.form-img {
|
||||
position: relative;
|
||||
}
|
||||
.form-img p {
|
||||
position: absolute;
|
||||
top: 28%;
|
||||
right: 16%;
|
||||
font-size: 56px;
|
||||
font-weight: 700;
|
||||
color: #c8dff9;
|
||||
}
|
||||
.form-img img {
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
}
|
||||
.end-form-img {
|
||||
left: 184px;
|
||||
top: -28px;
|
||||
}
|
||||
.success-message {
|
||||
display: none;
|
||||
}
|
||||
.success-message p {
|
||||
margin-top: 16px;
|
||||
}
|
||||
.success-message h3 {
|
||||
margin-top: 24px;
|
||||
}
|
||||
.success-btn {
|
||||
margin-top: 24px;
|
||||
border: none;
|
||||
border-radius: 10px;
|
||||
background-color: var(--color-primary);
|
||||
color: #ffffff;
|
||||
font-size: 16px;
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
padding: 10px 24px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.success-message.visible {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
/* ═══════════════════════════════════════════════════════
|
||||
PROCESS STEPS
|
||||
═══════════════════════════════════════════════════════ */
|
||||
.steps-section {
|
||||
padding-bottom: 100px;
|
||||
|
||||
}
|
||||
|
||||
.steps-header {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
text-align: center;
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
|
||||
.steps-header__title {
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
line-height: 36px;
|
||||
color: var(--color-title);
|
||||
}
|
||||
|
||||
.steps-header__sub {
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
line-height: 26px;
|
||||
color: var(--color-body-text);
|
||||
}
|
||||
|
||||
.steps-grid {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 22px;
|
||||
}
|
||||
|
||||
.steps-row {
|
||||
display: flex;
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
/* ─── Card base ─────────────────────────────────── */
|
||||
.step-card {
|
||||
flex: 1;
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
padding: 24px;
|
||||
background-color: #f0f4fd;
|
||||
border-radius: 16px;
|
||||
overflow: hidden;
|
||||
text-align: right;
|
||||
transition: background-color 0.3s ease, color 0.3s ease;
|
||||
background-image: url(/src/img/Vector\(1\).png);
|
||||
z-index: 1;
|
||||
}
|
||||
/* .step-card::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
|
||||
background: var(--color-primary);
|
||||
|
||||
clip-path: polygon(100% 100%, 100% 100%, 100% 100%, 100% 100%);
|
||||
transition: clip-path 0.6s cubic-bezier(0.22, 1, 0.36, 1);
|
||||
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.step-card:hover::before {
|
||||
clip-path: polygon(30% 0, 100% 0, 100% 100%, 0 100%);
|
||||
} */
|
||||
.step-card::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
|
||||
width: 400%;
|
||||
height: 400%;
|
||||
|
||||
right: -200%;
|
||||
bottom: -200%;
|
||||
|
||||
background: var(--color-primary);
|
||||
border-radius: 50%;
|
||||
|
||||
transform: scale(0);
|
||||
transform-origin: bottom right;
|
||||
|
||||
transition: transform 1.5s cubic-bezier(0.22, 1, 0.36, 1);
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
.step-card:hover::before {
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
|
||||
.step-card > * {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
/* ─── Badge (default) ───────────────────────────── */
|
||||
.step-card__badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 5px 10px;
|
||||
border-radius: 32px;
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
line-height: 24px;
|
||||
border: 1px solid var(--color-primary);
|
||||
color: var(--color-primary);
|
||||
white-space: nowrap;
|
||||
transition: border-color 0.3s ease, color 0.3s ease;
|
||||
}
|
||||
|
||||
.step-card__icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
object-fit: contain;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
/* ─── Top wrapper ───────────────────────────────── */
|
||||
.step-card__top {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.step-card__meta {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
/* ─── Title & description (default) ────────────── */
|
||||
.step-card__title {
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
line-height: 28px;
|
||||
color: var(--color-text);
|
||||
white-space: nowrap;
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
.step-card__desc {
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
line-height: 26px;
|
||||
color: var(--color-body-text);
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
/* ─── Hover: ALL cards turn blue ────────────────── */
|
||||
|
||||
.step-card:hover::after {
|
||||
opacity: 0.15; /* dim the pattern so it doesn't clash with the blue bg */
|
||||
}
|
||||
.step-card__meta svg {
|
||||
color: var(--color-primary) ;
|
||||
}
|
||||
.step-card:hover .step-card__meta svg {
|
||||
color: #ffffff;
|
||||
}
|
||||
.step-card:hover .step-card__badge {
|
||||
border-color: #ffffff;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.step-card:hover .step-card__title {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.step-card:hover .step-card__desc {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
/* ═══════════════════════════════════════════════════════
|
||||
MAP
|
||||
═══════════════════════════════════════════════════════ */
|
||||
.map-section {
|
||||
padding-bottom: 80px;
|
||||
}
|
||||
|
||||
.map-card {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 428px;
|
||||
border-radius: 48px;
|
||||
overflow: hidden;
|
||||
box-shadow:
|
||||
0px 9.5px 15.8px 6.3px rgba(255, 255, 255, 0.05),
|
||||
0px 3.2px 4.7px 0px rgba(0, 0, 0, 0.1);
|
||||
border: 1px solid rgba(255, 255, 255, 0.02);
|
||||
}
|
||||
|
||||
.map-card__img {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: block;
|
||||
object-fit: cover;
|
||||
border-radius: 48px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.map-card__location {
|
||||
position: absolute;
|
||||
left: 56%;
|
||||
top: 50%;
|
||||
transform: translate(-40%, -50%);
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
}
|
||||
|
||||
.map-location-dot {
|
||||
position: relative;
|
||||
display: block;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
background-color: #0274B3;
|
||||
border-radius: 50%;
|
||||
border: 2.2px solid #ffffff;
|
||||
z-index: 100;
|
||||
}
|
||||
.map-card__location::before,
|
||||
.map-card__location::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background: #0274B3;
|
||||
z-index: -1;
|
||||
animation: locationPulse 2s infinite ease-out;
|
||||
filter: blur(2px);
|
||||
}
|
||||
.map-location-dot::after {
|
||||
animation-delay: 0s;
|
||||
}
|
||||
.map-card__location::after {
|
||||
animation-delay: 0s;
|
||||
}
|
||||
@keyframes locationPulse {
|
||||
0% {
|
||||
transform: translate(-50%, -50%) scale(1);
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translate(-50%, -50%) scale(5);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
.map-card__nav {
|
||||
position: absolute;
|
||||
right: 40px;
|
||||
bottom: 40px;
|
||||
display: flex;
|
||||
gap: 16px;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.map-nav-btn {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 8px 12px;
|
||||
background-color: #ffffff;
|
||||
border-radius: 10px;
|
||||
text-decoration: none;
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
line-height: 24px;
|
||||
color: var(--color-primary);
|
||||
transition: box-shadow 0.2s;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.map-nav-btn:hover {
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
.map-nav-btn img {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
object-fit: contain;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
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 |
15394
src/assets/icons/portfolioP.svg
Normal file
|
After Width: | Height: | Size: 823 KiB |
0
src/assets/images/.gitkeep
Normal file
109
src/assets/js/contactus.js
Normal file
@@ -0,0 +1,109 @@
|
||||
// ===================================فرم==================================
|
||||
|
||||
const form = document.getElementById('contactForm');
|
||||
const submitBtn = document.getElementById('submitBtn');
|
||||
const backBtn = document.getElementById('backBtn');
|
||||
const successMessage = document.getElementById('successMessage');
|
||||
const submitBtnText = submitBtn.querySelector('.btn-text');
|
||||
|
||||
form.addEventListener('submit', function (event) {
|
||||
event.preventDefault();
|
||||
|
||||
submitBtn.classList.add('loading');
|
||||
submitBtnText.textContent = 'درحال ارسال فرم';
|
||||
submitBtn.disabled = true;
|
||||
|
||||
setTimeout(() => {
|
||||
form.style.display = 'none';
|
||||
|
||||
successMessage.classList.add('visible');
|
||||
}, 1500);
|
||||
});
|
||||
|
||||
backBtn.addEventListener('click', function () {
|
||||
successMessage.classList.remove('visible');
|
||||
|
||||
form.style.display = 'flex';
|
||||
|
||||
submitBtn.disabled = false;
|
||||
submitBtn.classList.remove('loading');
|
||||
submitBtnText.textContent = 'ثبت درخواست';
|
||||
|
||||
form.reset();
|
||||
});
|
||||
|
||||
const customSelect = document.getElementById('customSelect');
|
||||
const selectBox = customSelect.querySelector('.select-box');
|
||||
const options = customSelect.querySelectorAll('.option');
|
||||
const selectedText = customSelect.querySelector('.selected-text');
|
||||
|
||||
selectBox.addEventListener('click', () => {
|
||||
customSelect.classList.toggle('active');
|
||||
});
|
||||
|
||||
options.forEach((option) => {
|
||||
option.addEventListener('click', () => {
|
||||
options.forEach((item) => {
|
||||
item.classList.remove('active');
|
||||
});
|
||||
|
||||
option.classList.add('active');
|
||||
selectedText.textContent = option.textContent;
|
||||
customSelect.classList.remove('active');
|
||||
});
|
||||
});
|
||||
|
||||
document.addEventListener('click', (e) => {
|
||||
if (!customSelect.contains(e.target)) {
|
||||
customSelect.classList.remove('active');
|
||||
}
|
||||
});
|
||||
|
||||
const nameInput = document.getElementById('name');
|
||||
const nameError = document.getElementById('nameError');
|
||||
|
||||
nameInput.addEventListener('input', function () {
|
||||
const hasNumber = /\d/.test(this.value);
|
||||
|
||||
if (hasNumber) {
|
||||
this.classList.add('input-error');
|
||||
nameError.textContent = '* فقط حروف فارسی و انگلیسی مجاز است';
|
||||
} else {
|
||||
this.classList.remove('input-error');
|
||||
nameError.textContent = '';
|
||||
}
|
||||
});
|
||||
|
||||
const phoneInput = document.getElementById('phone');
|
||||
const phoneError = document.getElementById('phoneError');
|
||||
|
||||
phoneInput.addEventListener('input', function () {
|
||||
const hasLetter = /[a-zA-Zآ-ی]/.test(this.value);
|
||||
|
||||
if (hasLetter) {
|
||||
this.classList.add('input-error');
|
||||
phoneError.textContent = 'فقط عدد مجاز است';
|
||||
} else {
|
||||
this.classList.remove('input-error');
|
||||
phoneError.textContent = '';
|
||||
}
|
||||
this.value = this.value.replace(/\D/g, '');
|
||||
});
|
||||
|
||||
const emailInput = document.getElementById('email');
|
||||
const emailError = document.getElementById('emailError');
|
||||
|
||||
emailInput.addEventListener('input', function () {
|
||||
if (this.value !== '' && !this.value.includes('@')) {
|
||||
this.classList.add('input-error');
|
||||
emailError.textContent = 'ایمیل باید شامل @ باشد';
|
||||
} else {
|
||||
this.classList.remove('input-error');
|
||||
emailError.textContent = '';
|
||||
}
|
||||
});
|
||||
|
||||
// ==================اسکرول لوگو=======================
|
||||
|
||||
const track = document.querySelector('.logos-track');
|
||||
track.innerHTML += track.innerHTML;
|
||||
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 */
|
||||
}
|
||||
BIN
src/img/Vector(1).png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
17
src/img/massage-send.svg
Normal file
|
After Width: | Height: | Size: 20 KiB |
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'),
|
||||
contactus: resolve(__dirname, 'contactus.html'),
|
||||
},
|
||||
},
|
||||
manifest: true,
|
||||
cssCodeSplit: true,
|
||||
},
|
||||
|
||||
server: {
|
||||
open: true,
|
||||
port: 5173,
|
||||
},
|
||||
});
|
||||