feat: enhance landing page, Telegram webhook, SEO suite, and cookie consent banner
This commit is contained in:
@@ -0,0 +1,14 @@
|
|||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
# AyrisLegal Çevre Değişkenleri (.env.local)
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
# Telegram Bot Bildirim Ayarları
|
||||||
|
# 1. @BotFather üzerinden yeni bot açıp token alın:
|
||||||
|
TELEGRAM_BOT_TOKEN="123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ"
|
||||||
|
|
||||||
|
# 2. Bildirimin geleceği sohbet veya grup ID'si (Örn: @userinfobot veya grup ID):
|
||||||
|
TELEGRAM_CHAT_ID="-1001234567890"
|
||||||
|
|
||||||
|
# Veritabanı & Demo Ayarları
|
||||||
|
DATABASE_URL="postgresql://user:password@localhost:5432/ayrislegal"
|
||||||
|
USE_MOCK=true
|
||||||
@@ -32,6 +32,7 @@ yarn-error.log*
|
|||||||
|
|
||||||
# env files (can opt-in for committing if needed)
|
# env files (can opt-in for committing if needed)
|
||||||
.env*
|
.env*
|
||||||
|
!.env.example
|
||||||
|
|
||||||
# vercel
|
# vercel
|
||||||
.vercel
|
.vercel
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"buildPath": "code"
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
target: app
|
||||||
|
total_score: 18
|
||||||
|
max_score: 24
|
||||||
|
na_heuristics: 7,10
|
||||||
|
p0_count: 0
|
||||||
|
p1_count: 2
|
||||||
|
timestamp: 2026-08-16T01-13-38Z
|
||||||
|
slug: app
|
||||||
|
---
|
||||||
|
# Design Critique: app (AyrisLegal Web Application & Landing Surface)
|
||||||
|
|
||||||
|
**Method:** dual-agent (A: `e6f7d208-1fbc-4daa-b3a3-962cc0a92ccc` · B: `a945c7f8-9c10-46ce-aeef-f16ddea465de`)
|
||||||
|
**Target:** `app` (`app/[locale]/page.tsx`, `components/contact-form.tsx`, `app/globals.css`)
|
||||||
|
**Design Reference:** `DESIGN.md` ("The Modern Jurist Studio") & `PRODUCT.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Design Health Score
|
||||||
|
|
||||||
|
Mode: **Persuade** (Marketing & Conversion Landing Surface). *Heuristics 7 & 10 scored n/a per mode-applicability rules.*
|
||||||
|
|
||||||
|
| # | Heuristic | Score | Key Finding / Rationale |
|
||||||
|
|---|---|:---:|---|
|
||||||
|
| **1** | Visibility of System Status | **3/4** | Clear "Gönderiliyor…" and confirmation states on form; live pulse in hero. Minor gap: no inline field-level entry feedback. |
|
||||||
|
| **2** | Match System / Real World | **4/4** | **Exceptional.** Speaks authentic Turkish legal terminology (*Tensip zaptı, Esas/Karar, Bilirkişi raporu, Çelişki tespiti, UDF/UYAP*). Zero generic fluff. |
|
||||||
|
| **3** | User Control and Freedom | **3/4** | Annual/monthly pricing toggle is smooth and reversible; clear section navigation. Success state lacks in-place reset. |
|
||||||
|
| **4** | Consistency and Standards | **2/4** | Severe token drift between `globals.css` (Dark Navy/Teal), `page.tsx` (White/Red), and `login` (Blue). Form placement rule violated on home page. |
|
||||||
|
| **5** | Error Prevention | **2/4** | Contact form has `noValidate` with no client-side regex or length validation. Unrestricted phone input formatting. |
|
||||||
|
| **6** | Recognition Rather Than Recall | **3/4** | Clear side-by-side pricing tier inclusions and visible document artifact previews. |
|
||||||
|
| **7** | Flexibility and Efficiency | **n/a** | *Mode: Persuade.* Accelerators and power-user shortcuts are not applicable to a landing page. |
|
||||||
|
| **8** | Aesthetic & Minimalist Design | **3/4** | Strong typographic hierarchy with Archivo and JetBrains Mono. Undersized text (<11px) and repetitive eyebrow kickers add minor noise. |
|
||||||
|
| **9** | Error Recovery | **1/4** | Critical gap in `ContactForm`: API 400 errors collapse into a generic message without field-level error highlights or recovery guidance. |
|
||||||
|
| **10** | Help and Documentation | **n/a** | *Mode: Persuade.* In-depth app docs not applicable; key questions handled in SSS accordion. |
|
||||||
|
| **Total** | | **18/24** | **Good (75%)** *(Renormalized over 8 applicable heuristics)* |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Design Specificity Verdict
|
||||||
|
|
||||||
|
- **Domain Specificity:** High. Real Turkish judicial procedural artifacts (*Kira Tespiti Bilirkişi Raporu, 2024/100 Esas Tensip Zaptı, Yargıtay Ceza Genel Kurulu*) anchor the product deeply in authentic attorney workflows.
|
||||||
|
- **Architectural Clichés Identified:** Repetitive uppercase eyebrow chips above 5 headings, numbered `01 / 02 / 03` section tags, and an abrupt full-dark section inversion (`bg-zinc-950`) in the security module.
|
||||||
|
- **Deterministic Scan Summary:** 14 findings detected. True issues confirmed for `gradient-text`, legacy `codex-grid-background` in `globals.css`, undersized UI text (<11px in document badges), `low-contrast` text (`text-zinc-400` @ 2.59:1), and generic `blue-600` styling in `login/page.tsx`.
|
||||||
|
- **False Positives Dismissed:** Deep ambient card shadows (`0 30px 70px -25px rgba(...)`) and the `LivePulse` red status dot were verified as intentional tokens documented in `DESIGN.md`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Priority Issues
|
||||||
|
|
||||||
|
1. **[P1] Architecture & Scope Violation: Contact Form embedded on Homepage instead of dedicated `/iletisim`**
|
||||||
|
- *Why it matters:* Violates explicit project rules in `AGENTS.md` and `PRODUCT.md` (*"İletişim formu sadece /iletisim sayfasında — ana sayfada olmaz"*), cluttering homepage conversion and eliminating dedicated landing routes.
|
||||||
|
- *Fix:* Create `app/[locale]/iletisim/page.tsx` with the complete lead form; replace the homepage bottom section with an editorial CTA card linking to `/iletisim`.
|
||||||
|
- *Suggested Command:* `/impeccable layout app/[locale]/page.tsx`
|
||||||
|
|
||||||
|
2. **[P1] Contact Form Payload Mismatch & Error Recovery Breakdown**
|
||||||
|
- *Why it matters:* In `contact-form.tsx`, `org` is sent as `barNo` and `phone` as `message`. Furthermore, `noValidate` bypasses browser validation and API 400 responses swallow field-specific feedback.
|
||||||
|
- *Fix:* Align payload keys with backend schema, implement accessible inline validation, visible focus rings, and `aria-live` alert regions.
|
||||||
|
- *Suggested Command:* `/impeccable harden components/contact-form.tsx`
|
||||||
|
|
||||||
|
3. **[P2] Design System Token & Palette Schism (`globals.css` vs `DESIGN.md` vs `login`)**
|
||||||
|
- *Why it matters:* `globals.css` configures Dark Navy + Teal, while `DESIGN.md` and `page.tsx` use Paper White + Zinc + Ayris Red, and `login` uses generic `blue-600`.
|
||||||
|
- *Fix:* Align `globals.css` `:root` tokens directly with `DESIGN.md` (`--primary: #E61919`, `--background: #FFFFFF`, `--border: #E4E4E7`, `--muted-foreground: #71717A`), purge unused teal/orb styles, and update `login/page.tsx`.
|
||||||
|
- *Suggested Command:* `/impeccable typeset app/globals.css`
|
||||||
|
|
||||||
|
4. **[P2] Mobile Loss of Core Feature Demonstration (*Çelişki Avcısı*) & Legibility Deficits**
|
||||||
|
- *Why it matters:* The signature *Çelişki Avcısı* card is hidden on mobile screens (`hidden sm:block`), depriving mobile lawyers of the primary differentiator. Additionally, multiple metadata tags use undersized text (<10px) and low-contrast `zinc-400`.
|
||||||
|
- *Fix:* Inline the contradiction detection callout into the mobile document stream, enforce a minimum 11px font size floor, and update `text-zinc-400` to WCAG-compliant `text-zinc-500`.
|
||||||
|
- *Suggested Command:* `/impeccable adapt app/[locale]/page.tsx`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Persona Red Flags
|
||||||
|
|
||||||
|
- **"Jordan" (Confused First-Timer Attorney):** Hero CTA promises *"Ücretsiz Deneyin"* (implies self-serve trial), but links to a form stating *"Kurucu ekipten biri sizi arar — 15 dakikalık canlı demo"*. This creates expectation mismatch and friction.
|
||||||
|
- **"Casey" (Distracted Mobile Attorney on the go):** Loses the entire *Çelişki Avcısı* demonstration on screens under 640px. Pricing toggle buttons have tight touch targets.
|
||||||
|
- **"Av. Mehmet" (Litigation Lawyer):** Sees only tenancy disputes (*Kira Tespit Davası*) in previews; wants proof that AyrisLegal handles complex criminal or heavy commercial court dockets.
|
||||||
@@ -0,0 +1,289 @@
|
|||||||
|
{
|
||||||
|
"schemaVersion": 2,
|
||||||
|
"generatedAt": "2026-08-16T04:11:00.000Z",
|
||||||
|
"title": "Design System: AyrisLegal",
|
||||||
|
"extensions": {
|
||||||
|
"colorMeta": {
|
||||||
|
"primary": {
|
||||||
|
"role": "primary",
|
||||||
|
"displayName": "Ayris Legal Red",
|
||||||
|
"canonical": "#E61919",
|
||||||
|
"tonalRamp": [
|
||||||
|
"#4A0404",
|
||||||
|
"#700707",
|
||||||
|
"#9E0B0B",
|
||||||
|
"#B8140F",
|
||||||
|
"#E61919",
|
||||||
|
"#F87171",
|
||||||
|
"#FCA5A5",
|
||||||
|
"#FDEEEC"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"primary-dark": {
|
||||||
|
"role": "primary",
|
||||||
|
"displayName": "Deep Crimson",
|
||||||
|
"canonical": "#B8140F",
|
||||||
|
"tonalRamp": [
|
||||||
|
"#3D0303",
|
||||||
|
"#5C0606",
|
||||||
|
"#8A0909",
|
||||||
|
"#B8140F",
|
||||||
|
"#E61919",
|
||||||
|
"#EF4444",
|
||||||
|
"#F87171",
|
||||||
|
"#FDEEEC"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"primary-soft": {
|
||||||
|
"role": "neutral",
|
||||||
|
"displayName": "Soft Rose Tint",
|
||||||
|
"canonical": "#FDEEEC",
|
||||||
|
"tonalRamp": [
|
||||||
|
"#B8140F",
|
||||||
|
"#E61919",
|
||||||
|
"#F87171",
|
||||||
|
"#FCA5A5",
|
||||||
|
"#FECACA",
|
||||||
|
"#FEE2E2",
|
||||||
|
"#FDEEEC",
|
||||||
|
"#FFF5F5"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"neutral-bg": {
|
||||||
|
"role": "neutral",
|
||||||
|
"displayName": "Paper White",
|
||||||
|
"canonical": "#FFFFFF",
|
||||||
|
"tonalRamp": [
|
||||||
|
"#09090B",
|
||||||
|
"#18181B",
|
||||||
|
"#27272A",
|
||||||
|
"#71717A",
|
||||||
|
"#A1A1AA",
|
||||||
|
"#E4E4E7",
|
||||||
|
"#FAFAFA",
|
||||||
|
"#FFFFFF"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"neutral-surface": {
|
||||||
|
"role": "neutral",
|
||||||
|
"displayName": "Subtle Surface Tint",
|
||||||
|
"canonical": "#FAFAFA",
|
||||||
|
"tonalRamp": [
|
||||||
|
"#09090B",
|
||||||
|
"#18181B",
|
||||||
|
"#3F3F46",
|
||||||
|
"#71717A",
|
||||||
|
"#D4D4D8",
|
||||||
|
"#E4E4E7",
|
||||||
|
"#F4F4F5",
|
||||||
|
"#FAFAFA"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"neutral-border": {
|
||||||
|
"role": "neutral",
|
||||||
|
"displayName": "Hairline Border Zinc",
|
||||||
|
"canonical": "#E4E4E7",
|
||||||
|
"tonalRamp": [
|
||||||
|
"#18181B",
|
||||||
|
"#27272A",
|
||||||
|
"#52525B",
|
||||||
|
"#71717A",
|
||||||
|
"#A1A1AA",
|
||||||
|
"#D4D4D8",
|
||||||
|
"#E4E4E7",
|
||||||
|
"#F4F4F5"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"neutral-muted": {
|
||||||
|
"role": "neutral",
|
||||||
|
"displayName": "Muted Caption Slate",
|
||||||
|
"canonical": "#71717A",
|
||||||
|
"tonalRamp": [
|
||||||
|
"#18181B",
|
||||||
|
"#27272A",
|
||||||
|
"#3F3F46",
|
||||||
|
"#52525B",
|
||||||
|
"#71717A",
|
||||||
|
"#A1A1AA",
|
||||||
|
"#D4D4D8",
|
||||||
|
"#E4E4E7"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"neutral-text": {
|
||||||
|
"role": "neutral",
|
||||||
|
"displayName": "Deep Ink Black",
|
||||||
|
"canonical": "#09090B",
|
||||||
|
"tonalRamp": [
|
||||||
|
"#09090B",
|
||||||
|
"#18181B",
|
||||||
|
"#27272A",
|
||||||
|
"#3F3F46",
|
||||||
|
"#52525B",
|
||||||
|
"#71717A",
|
||||||
|
"#A1A1AA",
|
||||||
|
"#E4E4E7"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"typographyMeta": {
|
||||||
|
"display": {
|
||||||
|
"displayName": "Display",
|
||||||
|
"purpose": "Hero headlines and commanding value propositions."
|
||||||
|
},
|
||||||
|
"headline": {
|
||||||
|
"displayName": "Headline",
|
||||||
|
"purpose": "Section headings and core feature titles."
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"displayName": "Title",
|
||||||
|
"purpose": "Card titles, module headers, and modal names."
|
||||||
|
},
|
||||||
|
"body": {
|
||||||
|
"displayName": "Body",
|
||||||
|
"purpose": "Long-form explanations, case summaries, and narrative text."
|
||||||
|
},
|
||||||
|
"label": {
|
||||||
|
"displayName": "Label / Mono",
|
||||||
|
"purpose": "Case numbers, dates, badge pills, and legal metadata."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shadows": [
|
||||||
|
{
|
||||||
|
"name": "card-float",
|
||||||
|
"value": "0 30px 70px -25px rgba(24, 24, 27, 0.25)",
|
||||||
|
"purpose": "Applied to hero browser preview frames and featured product mockups for dramatic physical lift."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "overlay-pop",
|
||||||
|
"value": "0 20px 45px -15px rgba(24, 24, 27, 0.20)",
|
||||||
|
"purpose": "Applied to offset badges (e.g. Çelişki Avcısı pill) and floating status widgets."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "form-card",
|
||||||
|
"value": "0 20px 60px -30px rgba(24, 24, 27, 0.20)",
|
||||||
|
"purpose": "Applied to interactive inquiry and lead generation forms on /iletisim."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"motion": [
|
||||||
|
{
|
||||||
|
"name": "ease-out-smooth",
|
||||||
|
"value": "cubic-bezier(0.16, 1, 0.3, 1)",
|
||||||
|
"purpose": "Spring transitions for scroll reveals and card entry animations."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "magnetic-spring",
|
||||||
|
"value": "spring(stiffness: 150, damping: 15, mass: 0.5)",
|
||||||
|
"purpose": "Subtle cursor attraction physics on primary CTA buttons."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"breakpoints": [
|
||||||
|
{ "name": "sm", "value": "640px" },
|
||||||
|
{ "name": "md", "value": "768px" },
|
||||||
|
{ "name": "lg", "value": "1024px" },
|
||||||
|
{ "name": "xl", "value": "1280px" },
|
||||||
|
{ "name": "2xl", "value": "1400px" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"components": [
|
||||||
|
{
|
||||||
|
"name": "Primary Action Button",
|
||||||
|
"kind": "button",
|
||||||
|
"refersTo": "button-primary",
|
||||||
|
"description": "High-intent primary conversion button with pill geometry and crimson hover state.",
|
||||||
|
"html": "<a href=\"#iletisim\" class=\"ds-btn-primary\">Ücretsiz Deneyin <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/></svg></a>",
|
||||||
|
"css": ".ds-btn-primary { display: inline-flex; align-items: center; justify-content: center; gap: 8px; border-radius: 9999px; background: #E61919; color: #FFFFFF; font-family: 'Archivo', sans-serif; font-size: 15px; font-weight: 600; padding: 14px 28px; text-decoration: none; border: none; cursor: pointer; transition: background 0.15s ease, transform 0.15s ease; } .ds-btn-primary:hover { background: #B8140F; } .ds-btn-primary:active { transform: scale(0.98); }"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Outline Secondary Button",
|
||||||
|
"kind": "button",
|
||||||
|
"refersTo": "button-outline",
|
||||||
|
"description": "Secondary exploratory button with hairline border and subtle zinc hover tone.",
|
||||||
|
"html": "<a href=\"#tanisin\" class=\"ds-btn-outline\">Nasıl Çalışır?</a>",
|
||||||
|
"css": ".ds-btn-outline { display: inline-flex; align-items: center; justify-content: center; gap: 8px; border-radius: 9999px; background: #FFFFFF; color: #18181B; border: 1.5px solid #E4E4E7; font-family: 'Archivo', sans-serif; font-size: 15px; font-weight: 600; padding: 14px 28px; text-decoration: none; cursor: pointer; transition: background 0.15s ease; } .ds-btn-outline:hover { background: #FAFAFA; border-color: #D4D4D8; }"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Elevated Browser Mock Card",
|
||||||
|
"kind": "card",
|
||||||
|
"refersTo": "card-elevated",
|
||||||
|
"description": "Floating browser frame mockup with window chrome dots and deep ambient drop shadow.",
|
||||||
|
"html": "<div class=\"ds-browser-card\"><div class=\"ds-browser-header\"><span class=\"ds-dot\"></span><span class=\"ds-dot\"></span><span class=\"ds-dot\"></span><span class=\"ds-browser-url\">ayrislegal.com</span></div><div class=\"ds-browser-body\"><div class=\"ds-file-item\"><span class=\"ds-file-name\">Bilirkişi Raporu - Kira Tespiti</span><span class=\"ds-file-date\">15.01.2026</span></div></div></div>",
|
||||||
|
"css": ".ds-browser-card { width: 100%; border-radius: 28px; border: 1px solid rgba(228, 228, 231, 0.7); background: #FFFFFF; box-shadow: 0 30px 70px -25px rgba(24, 24, 27, 0.25); overflow: hidden; font-family: 'Archivo', sans-serif; } .ds-browser-header { display: flex; align-items: center; gap: 8px; padding: 12px 16px; background: #FAFAFA; border-bottom: 1px solid #E4E4E7; } .ds-dot { width: 10px; height: 10px; border-radius: 50%; background: #D4D4D8; } .ds-browser-url { flex: 1; text-align: center; font-size: 12px; color: #A1A1AA; font-family: 'JetBrains Mono', monospace; } .ds-browser-body { padding: 20px; } .ds-file-item { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; border: 1px solid #F4F4F5; border-radius: 16px; } .ds-file-name { font-size: 13.5px; font-weight: 600; color: #3F3F46; } .ds-file-date { font-size: 11.5px; color: #A1A1AA; font-family: 'JetBrains Mono', monospace; }"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Lead Input Field",
|
||||||
|
"kind": "input",
|
||||||
|
"refersTo": "input-field",
|
||||||
|
"description": "Comfortable 46px text field with 12px corners and Ayris Red focus stroke transition.",
|
||||||
|
"html": "<div class=\"ds-field-wrap\"><label class=\"ds-field-label\">Ad Soyad <span style=\"color:#E61919;\">*</span></label><input type=\"text\" class=\"ds-field-input\" placeholder=\"Av. Ayşe Yılmaz\" /></div>",
|
||||||
|
"css": ".ds-field-wrap { display: flex; flex-direction: column; gap: 6px; font-family: 'Archivo', sans-serif; } .ds-field-label { font-size: 13px; font-weight: 600; color: #09090B; } .ds-field-input { width: 100%; min-height: 46px; border-radius: 12px; border: 1.5px solid #E4E4E7; background: #FFFFFF; padding: 10px 16px; font-size: 14px; color: #09090B; outline: none; transition: border-color 0.15s ease; box-sizing: border-box; } .ds-field-input:focus { border-color: #E61919; }"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Accent Chip Badge",
|
||||||
|
"kind": "chip",
|
||||||
|
"refersTo": "badge-accent",
|
||||||
|
"description": "Soft rose pill badge with deep crimson text for feature category callouts.",
|
||||||
|
"html": "<span class=\"ds-chip-badge\"><svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"><path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z\"/></svg> Avukatlar için yapay zeka destekli hukuki asistan</span>",
|
||||||
|
"css": ".ds-chip-badge { display: inline-flex; align-items: center; gap: 8px; border-radius: 9999px; background: #FDEEEC; color: #B8140F; font-family: 'Archivo', sans-serif; font-size: 13px; font-weight: 600; padding: 6px 14px; }"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Live Indicator Pulse",
|
||||||
|
"kind": "custom",
|
||||||
|
"refersTo": "live-pulse",
|
||||||
|
"description": "Concentric pulsing status indicator for live document analysis and courtroom feeds.",
|
||||||
|
"html": "<span class=\"ds-pulse-wrap\"><span class=\"ds-pulse-ring\"></span><span class=\"ds-pulse-dot\"></span></span>",
|
||||||
|
"css": ".ds-pulse-wrap { position: relative; display: inline-flex; width: 8px; height: 8px; } .ds-pulse-ring { position: absolute; width: 100%; height: 100%; border-radius: 50%; background: #E61919; opacity: 0.6; animation: ds-ping 1.6s cubic-bezier(0, 0, 0.2, 1) infinite; } .ds-pulse-dot { position: relative; display: inline-flex; width: 8px; height: 8px; border-radius: 50%; background: #E61919; } @keyframes ds-ping { 0% { transform: scale(1); opacity: 0.6; } 100% { transform: scale(2.4); opacity: 0; } }"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"narrative": {
|
||||||
|
"northStar": "The Modern Jurist Studio",
|
||||||
|
"overview": "The AyrisLegal design system embodies rigorous editorial precision, surgical focus, and high-trust clarity. Built for Turkish lawyers navigating dense case dockets, precedent archives, and evidentiary records, the interface rejects noisy SaaS clichés in favor of stark white-and-zinc architectural surfaces punctuated by deliberate, high-contrast Ayris Red accents.\n\nThe aesthetic philosophy bridges judicial gravitas with cutting-edge analytical intelligence. Typographic hierarchy is tight, bold, and authoritative. Cards, preview frames, and case documents float cleanly above the canvas with deep ambient drop shadows, giving digital artifacts physical substance and scanability.",
|
||||||
|
"keyCharacteristics": [
|
||||||
|
"Stark editorial canvas: pure white (#FFFFFF) and architectural zinc neutrals (#FAFAFA, #F4F4F5, #E4E4E7, #09090B).",
|
||||||
|
"Singular, surgical accent: high-contrast Ayris Legal Red (#E61919) used strictly for high-intent actions, critical alerts, and focal insights.",
|
||||||
|
"Authoritative typography: Archivo with tight tracking (-0.03em) and heavy weights for display, paired with JetBrains Mono for dates, case numbers, and system badges.",
|
||||||
|
"Confident tactile geometry: pill-shaped primary action buttons (rounded-full), generous 24px container corners, and layered floating cards with deep ambient shadows.",
|
||||||
|
"Zero fluff: no decorative gradient text, no floating particle meshes, and no icon-stuffed bento boxes."
|
||||||
|
],
|
||||||
|
"rules": [
|
||||||
|
{
|
||||||
|
"name": "The Rarity Rule",
|
||||||
|
"body": "The Ayris Red accent is applied to ≤5% of any viewport. Its scarcity is what commands immediate cognitive attention when flagging legal conflicts or driving conversion.",
|
||||||
|
"section": "colors"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "The Hairline Rule",
|
||||||
|
"body": "All borders use crisp, unblurred 1px to 1.5px solid strokes (#E4E4E7). Borders define geometry; they never glow or carry colored stroke gradients.",
|
||||||
|
"section": "colors"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "The Editorial Lead Rule",
|
||||||
|
"body": "Hero and section headlines lead with stark monochrome ink (#09090B) and isolate key thesis statements with solid accent color—never split across multi-stop gradients.",
|
||||||
|
"section": "typography"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "The Monospace Docket Rule",
|
||||||
|
"body": "Every date, file reference, and courtroom docket timestamp is typeset in JetBrains Mono to reinforce authentic document reality.",
|
||||||
|
"section": "typography"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "The Tonal Lift Rule",
|
||||||
|
"body": "Shadows are always neutral carbon/zinc tinted (rgba(24, 24, 27, ...)). Never use colored or saturated drop shadows under buttons or cards.",
|
||||||
|
"section": "elevation"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dos": [
|
||||||
|
"Do maintain extreme typographic hierarchy with tight tracking (-0.03em) on Archivo display headings.",
|
||||||
|
"Do reserve Ayris Red (#E61919) strictly for primary conversion actions, conflict detection badges, and focus indicators.",
|
||||||
|
"Do typeset dates, docket IDs, and file timestamps in JetBrains Mono (label token).",
|
||||||
|
"Do pair crisp hairline borders (#E4E4E7) with deep ambient zinc drop shadows on floating card mockups.",
|
||||||
|
"Do keep lead capture and demo inquiries strictly on /iletisim."
|
||||||
|
],
|
||||||
|
"donts": [
|
||||||
|
"Don't use multi-color gradient text, rainbow highlights, or glowing neon outlines.",
|
||||||
|
"Don't use generic blue corporate SaaS styling or unbranded generic templates.",
|
||||||
|
"Don't clutter views with icon-stuffed bento boxes; let real case file structures and legal workflows lead.",
|
||||||
|
"Don't use colored or saturated drop shadows under buttons or cards.",
|
||||||
|
"Don't place the full contact form on the home page."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
---
|
||||||
|
name: AyrisLegal
|
||||||
|
description: AI-Powered Strategic Workspace for Legal Professionals
|
||||||
|
colors:
|
||||||
|
primary: "#E61919"
|
||||||
|
primary-dark: "#B8140F"
|
||||||
|
primary-soft: "#FDEEEC"
|
||||||
|
neutral-bg: "#FFFFFF"
|
||||||
|
neutral-surface: "#FAFAFA"
|
||||||
|
neutral-card: "#FFFFFF"
|
||||||
|
neutral-border: "#E4E4E7"
|
||||||
|
neutral-muted: "#71717A"
|
||||||
|
neutral-text: "#09090B"
|
||||||
|
typography:
|
||||||
|
display:
|
||||||
|
fontFamily: "Archivo, ui-sans-serif, system-ui, sans-serif"
|
||||||
|
fontSize: "clamp(2.375rem, 5.5vw, 3.75rem)"
|
||||||
|
fontWeight: 800
|
||||||
|
lineHeight: 1.03
|
||||||
|
letterSpacing: "-0.03em"
|
||||||
|
headline:
|
||||||
|
fontFamily: "Archivo, ui-sans-serif, system-ui, sans-serif"
|
||||||
|
fontSize: "clamp(1.75rem, 3.5vw, 2.5rem)"
|
||||||
|
fontWeight: 800
|
||||||
|
lineHeight: 1.12
|
||||||
|
letterSpacing: "-0.025em"
|
||||||
|
title:
|
||||||
|
fontFamily: "Archivo, ui-sans-serif, system-ui, sans-serif"
|
||||||
|
fontSize: "1.25rem"
|
||||||
|
fontWeight: 700
|
||||||
|
lineHeight: 1.35
|
||||||
|
letterSpacing: "-0.015em"
|
||||||
|
body:
|
||||||
|
fontFamily: "Archivo, ui-sans-serif, system-ui, sans-serif"
|
||||||
|
fontSize: "1.0625rem"
|
||||||
|
fontWeight: 400
|
||||||
|
lineHeight: 1.625
|
||||||
|
letterSpacing: "normal"
|
||||||
|
label:
|
||||||
|
fontFamily: "JetBrains Mono, monospace"
|
||||||
|
fontSize: "0.8125rem"
|
||||||
|
fontWeight: 600
|
||||||
|
lineHeight: 1.4
|
||||||
|
letterSpacing: "0.02em"
|
||||||
|
rounded:
|
||||||
|
sm: "8px"
|
||||||
|
md: "12px"
|
||||||
|
lg: "16px"
|
||||||
|
xl: "24px"
|
||||||
|
full: "9999px"
|
||||||
|
spacing:
|
||||||
|
xs: "4px"
|
||||||
|
sm: "8px"
|
||||||
|
md: "16px"
|
||||||
|
lg: "24px"
|
||||||
|
xl: "32px"
|
||||||
|
2xl: "48px"
|
||||||
|
3xl: "64px"
|
||||||
|
components:
|
||||||
|
button-primary:
|
||||||
|
backgroundColor: "{colors.primary}"
|
||||||
|
textColor: "{colors.neutral-bg}"
|
||||||
|
rounded: "{rounded.full}"
|
||||||
|
padding: "14px 28px"
|
||||||
|
button-primary-hover:
|
||||||
|
backgroundColor: "{colors.primary-dark}"
|
||||||
|
button-outline:
|
||||||
|
backgroundColor: "{colors.neutral-bg}"
|
||||||
|
textColor: "{colors.neutral-text}"
|
||||||
|
rounded: "{rounded.full}"
|
||||||
|
padding: "14px 28px"
|
||||||
|
card-elevated:
|
||||||
|
backgroundColor: "{colors.neutral-card}"
|
||||||
|
textColor: "{colors.neutral-text}"
|
||||||
|
rounded: "{rounded.xl}"
|
||||||
|
padding: "24px"
|
||||||
|
input-field:
|
||||||
|
backgroundColor: "{colors.neutral-bg}"
|
||||||
|
textColor: "{colors.neutral-text}"
|
||||||
|
rounded: "{rounded.md}"
|
||||||
|
padding: "10px 16px"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Design System: AyrisLegal
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
**Creative North Star: "The Modern Jurist Studio"**
|
||||||
|
|
||||||
|
The AyrisLegal design system embodies rigorous editorial precision, surgical focus, and high-trust clarity. Built for Turkish lawyers navigating dense case dockets, precedent archives, and evidentiary records, the interface rejects noisy SaaS clichés in favor of stark white-and-zinc architectural surfaces punctuated by deliberate, high-contrast Ayris Red accents.
|
||||||
|
|
||||||
|
The aesthetic philosophy bridges judicial gravitas with cutting-edge analytical intelligence. Typographic hierarchy is tight, bold, and authoritative. Cards, preview frames, and case documents float cleanly above the canvas with deep ambient drop shadows, giving digital artifacts physical substance and scanability.
|
||||||
|
|
||||||
|
**Key Characteristics:**
|
||||||
|
- Stark editorial canvas: pure white (`#FFFFFF`) and architectural zinc neutrals (`#FAFAFA`, `#F4F4F5`, `#E4E4E7`, `#09090B`).
|
||||||
|
- Singular, surgical accent: high-contrast Ayris Legal Red (`#E61919`) used strictly for high-intent actions, critical alerts, and focal insights.
|
||||||
|
- Authoritative typography: Archivo with tight tracking (`-0.03em`) and heavy weights for display, paired with JetBrains Mono for dates, case numbers, and system badges.
|
||||||
|
- Confident tactile geometry: pill-shaped primary action buttons (`rounded-full`), generous 24px container corners, and layered floating cards with deep ambient shadows.
|
||||||
|
- Zero fluff: no decorative gradient text, no floating particle meshes, and no icon-stuffed bento boxes.
|
||||||
|
|
||||||
|
## Colors
|
||||||
|
|
||||||
|
The palette is restrained, high-contrast, and purposeful: a surgical scarlet accent grounded upon an immaculate monochrome zinc foundation.
|
||||||
|
|
||||||
|
### Primary
|
||||||
|
- **Ayris Legal Red** (`#E61919` / `oklch(0.58 0.23 27)`): The sole high-energy accent. Reserved exclusively for primary conversion CTAs, critical case conflict highlights (*Çelişki Avcısı*), and active status pulses.
|
||||||
|
- **Deep Crimson** (`#B8140F` / `oklch(0.48 0.21 27)`): Hover and active interaction state for primary red elements.
|
||||||
|
- **Soft Rose Tint** (`#FDEEEC` / `oklch(0.96 0.03 27)`): Low-contrast background wash for accent badges, selection states, and success callouts.
|
||||||
|
|
||||||
|
### Neutral
|
||||||
|
- **Paper White** (`#FFFFFF`): Primary page canvas and elevated card surface background.
|
||||||
|
- **Subtle Surface Tint** (`#FAFAFA`): Secondary container background and alternating table rows.
|
||||||
|
- **Hairline Border Zinc** (`#E4E4E7` / `zinc-200`): Structural boundary for cards, input controls, and divider rules.
|
||||||
|
- **Muted Caption Slate** (`#71717A` / `zinc-500`): Supporting explanatory text, timestamps, and secondary metadata.
|
||||||
|
- **Deep Ink Black** (`#09090B` / `zinc-950`): High-contrast headline text, primary typography, and dark framing accents.
|
||||||
|
|
||||||
|
### Named Rules
|
||||||
|
**The Rarity Rule.** The Ayris Red accent is applied to ≤5% of any viewport. Its scarcity is what commands immediate cognitive attention when flagging legal conflicts or driving conversion.
|
||||||
|
|
||||||
|
**The Hairline Rule.** All borders use crisp, unblurred 1px to 1.5px solid strokes (`#E4E4E7`). Borders define geometry; they never glow or carry colored stroke gradients.
|
||||||
|
|
||||||
|
## Typography
|
||||||
|
|
||||||
|
**Display Font:** Archivo (with `ui-sans-serif, system-ui, sans-serif` fallback)
|
||||||
|
**Body Font:** Archivo (with `ui-sans-serif, system-ui, sans-serif` fallback)
|
||||||
|
**Label / Mono Font:** JetBrains Mono (with `ui-monospace, SFMono-Regular, monospace` fallback)
|
||||||
|
|
||||||
|
**Character:** Archivo delivers heavyweight editorial punch with geometric discipline and condensed proportions. JetBrains Mono anchors legal docket numbers, case dates, and live status feeds with courtroom precision.
|
||||||
|
|
||||||
|
### Hierarchy
|
||||||
|
- **Display** (800 / Extrabold, `clamp(2.375rem, 5.5vw, 3.75rem)`, line-height `1.03`, tracking `-0.03em`): Hero headlines and commanding value propositions.
|
||||||
|
- **Headline** (800 / Extrabold, `clamp(1.75rem, 3.5vw, 2.5rem)`, line-height `1.12`, tracking `-0.025em`): Section headings and core feature titles.
|
||||||
|
- **Title** (700 / Bold, `1.25rem` / 20px, line-height `1.35`, tracking `-0.015em`): Card titles, module headers, and modal names.
|
||||||
|
- **Body** (400 / Regular & 500 / Medium, `1.0625rem` / 17px, line-height `1.625`): Long-form explanations, case summaries, and narrative paragraphs (optimal line length 52–65ch).
|
||||||
|
- **Label / Mono** (600 / SemiBold, `0.8125rem` / 13px, tracking `0.02em`): Case numbers, dates, badge pills, and legal metadata.
|
||||||
|
|
||||||
|
### Named Rules
|
||||||
|
**The Editorial Lead Rule.** Hero and section headlines lead with stark monochrome ink (`#09090B`) and isolate key thesis statements with solid accent color—never split across multi-stop gradients.
|
||||||
|
|
||||||
|
**The Monospace Docket Rule.** Every date, file reference, and courtroom docket timestamp is typeset in JetBrains Mono to reinforce authentic document reality.
|
||||||
|
|
||||||
|
## Layout
|
||||||
|
|
||||||
|
The spatial model uses an asymmetric, content-driven rhythm optimized for fast legal triage:
|
||||||
|
|
||||||
|
- **Max Container Width:** 1400px with generous lateral gutters (`px-5` on mobile, `px-16` on desktop).
|
||||||
|
- **Vertical Spacing Rhythm:** 64px to 96px between major sections; 16px to 24px between internal card groups.
|
||||||
|
- **Asymmetric Composition:** Two-column hero layouts pairing left-aligned bold copy with right-aligned floating interactive browser frames and offset accent overlays.
|
||||||
|
- **Density:** High density within document/file preview modules (compact line items, clear borders), balanced by expansive white breathing space around high-level messaging.
|
||||||
|
|
||||||
|
## Elevation & Depth
|
||||||
|
|
||||||
|
Surfaces are clean and physical. Depth is communicated through layered white cards floating over light zinc backgrounds, separated by crisp hairline strokes and deep, diffuse ambient shadows.
|
||||||
|
|
||||||
|
### Shadow Vocabulary
|
||||||
|
- **Card Float Ambient** (`box-shadow: 0 30px 70px -25px rgba(24, 24, 27, 0.25)`): Applied to hero browser preview frames and featured product mockups to create dramatic physical lift.
|
||||||
|
- **Overlay Pop** (`box-shadow: 0 20px 45px -15px rgba(24, 24, 27, 0.20)`): Applied to offset badges (e.g. *Çelişki Avcısı* pill) and floating status widgets.
|
||||||
|
- **Form Card Base** (`box-shadow: 0 20px 60px -30px rgba(24, 24, 27, 0.20)`): Applied to interactive inquiry and lead generation forms on `/iletisim`.
|
||||||
|
|
||||||
|
### Named Rules
|
||||||
|
**The Tonal Lift Rule.** Shadows are always neutral carbon/zinc tinted (`rgba(24, 24, 27, ...)`). Never use colored or saturated drop shadows under buttons or cards.
|
||||||
|
|
||||||
|
## Shapes
|
||||||
|
|
||||||
|
- **Primary Action Buttons:** Full pill geometry (`rounded-full` / `border-radius: 9999px`) creating distinct, unmistakable call-to-action touchpoints.
|
||||||
|
- **Containers & Framing Cards:** Generous 24px to 28px rounded corners (`rounded-3xl` / `rounded-[1.75rem]`), softening structural grids.
|
||||||
|
- **Input Fields & Micro-cards:** 12px to 16px rounded corners (`rounded-xl` / `rounded-2xl`) for comfortable form completion.
|
||||||
|
- **Dividers & Strokes:** 1px to 1.5px solid hairline borders in `#E4E4E7`.
|
||||||
|
|
||||||
|
## Components
|
||||||
|
|
||||||
|
### Buttons
|
||||||
|
- **Shape:** Pill (`border-radius: 9999px`)
|
||||||
|
- **Primary:** Ayris Legal Red background (`#E61919`), white text (`#FFFFFF`), padding `14px 28px`, font-size 15px, font-weight 600.
|
||||||
|
- **Hover / Focus:** Deep crimson (`#B8140F`), subtle spring physics or magnetic cursor tracking, active scale `0.98`. Focus ring in `#E61919`.
|
||||||
|
- **Secondary / Outline:** White background (`#FFFFFF`), dark zinc text (`#18181B`), 1.5px border (`#E4E4E7`), hover background `#FAFAFA`.
|
||||||
|
|
||||||
|
### Cards & Document Containers
|
||||||
|
- **Corner Style:** 24px to 28px rounded corners (`rounded-3xl`).
|
||||||
|
- **Background:** Crisp white (`#FFFFFF`) with 1px border (`#E4E4E7`).
|
||||||
|
- **Internal Padding:** 20px to 32px depending on viewport and data density.
|
||||||
|
- **Header:** Embedded browser chrome bar (three control dots + URL slug) or clean docket category banner.
|
||||||
|
|
||||||
|
### Inputs & Lead Fields
|
||||||
|
- **Style:** Minimum height 46px, 12px rounded corners (`rounded-xl`), 1.5px solid border in `#E4E4E7`, background `#FFFFFF`.
|
||||||
|
- **Focus:** Border transitions directly to Ayris Red (`#E61919`) with no harsh outline glow.
|
||||||
|
- **Labels:** 13px semi-bold in `#09090B` with red asterisk for mandatory inputs.
|
||||||
|
|
||||||
|
### Badges & Chips
|
||||||
|
- **Style:** Pill-shaped (`rounded-full`), padding `6px 14px`, font-size 13px, font-weight 600.
|
||||||
|
- **Accent Badge:** Soft rose tint background (`#FDEEEC`) with deep crimson text (`#B8140F`).
|
||||||
|
- **Status Live Pulse:** 8px solid red dot with concentric pulsing ping animation.
|
||||||
|
|
||||||
|
## Do's and Don'ts
|
||||||
|
|
||||||
|
### Do:
|
||||||
|
- **Do** maintain extreme typographic hierarchy with tight tracking (`-0.03em`) on Archivo display headings.
|
||||||
|
- **Do** reserve Ayris Red (`#E61919`) strictly for primary conversion actions, conflict detection badges, and focus indicators.
|
||||||
|
- **Do** typeset dates, docket IDs, and file timestamps in JetBrains Mono (`label` token).
|
||||||
|
- **Do** pair crisp hairline borders (`#E4E4E7`) with deep ambient zinc drop shadows on floating card mockups.
|
||||||
|
- **Do** keep lead capture and demo inquiries strictly on `/iletisim`.
|
||||||
|
|
||||||
|
### Don't:
|
||||||
|
- **Don't** use multi-color gradient text, rainbow highlights, or glowing neon outlines.
|
||||||
|
- **Don't** use generic blue corporate SaaS styling or unbranded generic templates.
|
||||||
|
- **Don't** clutter views with icon-stuffed bento boxes; let real case file structures and legal workflows lead.
|
||||||
|
- **Don't** use colored or tinted drop shadows under buttons or cards.
|
||||||
|
- **Don't** place the full contact form on the home page.
|
||||||
+50
@@ -0,0 +1,50 @@
|
|||||||
|
# Product
|
||||||
|
|
||||||
|
<!-- impeccable:product-schema 1 -->
|
||||||
|
|
||||||
|
## Platform
|
||||||
|
|
||||||
|
web
|
||||||
|
|
||||||
|
## Users
|
||||||
|
Türk hukuk profesyonelleri (dava avukatları, solo çalışan avukatlar, butik ve orta ölçekli hukuk bürosu ortakları ve stajyer avukatlar). Yüzlerce sayfalık tensip zabıtlarını, bilirkişi raporlarını ve tanık ifadelerini inceleyen, duruşma öncesi delil/ifade çelişkilerini tespit eden, 18M+ içtihat taraması yapan ve UYAP uyumlu dilekçe üreten hukukçular.
|
||||||
|
|
||||||
|
## Product Purpose
|
||||||
|
AyrisLegal, Türk avukatları için geliştirilmiş masaüstü ve mobil entegre yapay zekâ hukuki çalışma alanıdır. Avukatın yerine geçen pasif bir sohbet botu değil; dava dosyalarının derinlemesine analizi (Çelişki Avcısı, Dosya Röntgeni, Dava Stratejisi, Müzakere Simülatörü), 18M+ emsal içtihat ve 26.900+ mevzuat taraması, canlı duruşma nokta atışı (Dijital Stajyer) ve doğal `.udf` / Word / PDF dilekçe üretimi sunan aktif bir düşünce ortağıdır.
|
||||||
|
|
||||||
|
## Positioning
|
||||||
|
Pasif bir mevzuat arama motoru veya jenerik bir dil modeli değil; Türk yargı pratiğine, UYAP/UDF ekosistemine, HMK/CMK usul kurallarına ve dava dosyalarındaki çapraz sorgu mantığına göre özelleşmiş, yerel öncelikli hukuki çalışma alanı.
|
||||||
|
|
||||||
|
## Operating Context
|
||||||
|
- Yoğun duruşma takvimi, onlarca sayfalık tensip zaptı, bilirkişi raporu ve tanık beyanı inceleme süreci.
|
||||||
|
- Masaüstü ofis içi derin dosya incelemesi + UYAP Tarayıcı Eklentisi ile tek tıkla dosya aktarımı + Mobil adliye/duruşma anında hızlı erişim.
|
||||||
|
- Tanıtım Web Sitesi: Ürünün gerçek yeteneklerini (12 dava analiz modülü, UDF motoru, 18M içtihat, duruşma simülatörü) somut delillerle hissettiren ve `/iletisim` üzerinden canlı demo talebi toplayan vitrin.
|
||||||
|
|
||||||
|
## Capabilities and Constraints
|
||||||
|
- **Temel Yetenekler:**
|
||||||
|
- **12 Dava Analiz Modülü:** Yapay Zeka Özeti, Dosya Röntgeni (Usul Taraması), İfade & Çelişki Avcısı, Dava Stratejisi & Kazanma Planı, Müzakere & Arabuluculuk Simülatörü, Belgeler (Yerel OCR), Dilekçe Stüdyosu (10 Kategori, 50+ Tür), Duruşma & Süreler, CaseChat (Dosya İçi Arama), Dijital Stajyer (Canlı Duruşma Nokta Atışı), Duruşma Simülatörü (Hakim / Karşı Taraf Rolü).
|
||||||
|
- **18 Milyon+ İçtihat Havuzu & 26.900+ Madde Mevzuat:** Yargıtay, Danıştay, AYM, BAM, UYAP Emsaller, Sigorta Tahkim, KİK, KVKK, BDDK kararları üzerinde doğal dille semantik arama ve argüman uyum puanı.
|
||||||
|
- **Doğal UDF Motoru:** UYAP Doküman Editörü (.udf) dosyalarını doğrudan okuma ve editörden tek tıkla UDF, Word (DOCX) veya PDF olarak dışa aktarma.
|
||||||
|
- **Yerel Öncelikli Veri Güvenliği:** Yerel depolama, sıfır model eğitimi (müvekkil verileriyle model eğitilmez), Google Drive şifreli yedekleme.
|
||||||
|
- **Kapsam ve Kısıtlar:**
|
||||||
|
- Tanıtım web sitesi Next.js 16 App Router üzerinde çalışır.
|
||||||
|
- İletişim ve demo talebi formu ana sayfada değil, yalnızca `/iletisim` sayfasında yer alır.
|
||||||
|
- Footer alanında "Created by ayris.tech" bağlantısı zorunludur.
|
||||||
|
|
||||||
|
## Brand Commitments
|
||||||
|
- **İsim:** AyrisLegal
|
||||||
|
- **Kurumsal Kimlik:** "The Modern Jurist Studio" — Güven veren, ciddi, profesyonel, abartısız ve Türk adli ciddiyetine uygun dil.
|
||||||
|
- **Görsel Kimlik:** AyrisLegal marka logosu, Paper White & Zinc taban, Ayris Kırmızısı (`#E61919`) aksanlar, Archivo başlıklar, JetBrains Mono dosya/tarih etiketleri.
|
||||||
|
|
||||||
|
## Evidence on Hand
|
||||||
|
- Kapsamlı Uygulama Özellikleri, Buton & Prompt Rehberi ([`docs/detay.md`](file:///Users/mstfyldz/github/ayrislegal/docs/detay.md))
|
||||||
|
- Tanıtım sitesi PRD dokümanı ([`docs/marketing-website-prd.md`](file:///Users/mstfyldz/github/ayrislegal/docs/marketing-website-prd.md))
|
||||||
|
- Mimari ve proje kuralları ([`AGENTS.md`](file:///Users/mstfyldz/github/ayrislegal/AGENTS.md))
|
||||||
|
|
||||||
|
## Product Principles
|
||||||
|
1. **Düşünce Ortağı, Arama Motoru Değil:** Temel değer; avukatın yerine geçmek değil, avukatın argümanını güçlendiren analitik ve stratejik bir ortak olmaktır.
|
||||||
|
2. **Somut Delil ve Dosya Gerçekliği:** Soyut pazarlama vaatleri yerine gerçek Türk yargı evrakları (tensip zaptı, bilirkişi raporu, UDF dosyası, HMK/CMK maddeleri) ile çalışılır.
|
||||||
|
3. **Veri Egemenliği ve Sır Saklama:** Dosyalar yerel cihazda kalır, kamuya açık modeller eğitilmez, nihai hukuki imza ve yetki daima avukattadır.
|
||||||
|
|
||||||
|
## Accessibility & Inclusion
|
||||||
|
Modern web erişilebilirlik standartları (WCAG AA kontrast, net tipografik hiyerarşi, klavye navigasyonu, reduced-motion desteği).
|
||||||
@@ -2,74 +2,82 @@
|
|||||||
|
|
||||||
import { signOut } from 'next-auth/react'
|
import { signOut } from 'next-auth/react'
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import { usePathname } from 'next/navigation'
|
import Image from 'next/image'
|
||||||
|
import { usePathname, useParams } from 'next/navigation'
|
||||||
import { LayoutDashboard, Users, Settings, LogOut, Menu, X } from 'lucide-react'
|
import { LayoutDashboard, Users, Settings, LogOut, Menu, X } from 'lucide-react'
|
||||||
import { useState } from 'react'
|
import { useState } from 'react'
|
||||||
|
|
||||||
export default function AdminLayout({ children }: { children: React.ReactNode }) {
|
export default function AdminLayout({ children }: { children: React.ReactNode }) {
|
||||||
const pathname = usePathname()
|
const pathname = usePathname()
|
||||||
|
const params = useParams()
|
||||||
|
const locale = (params?.locale as string) || 'tr'
|
||||||
const [sidebarOpen, setSidebarOpen] = useState(false)
|
const [sidebarOpen, setSidebarOpen] = useState(false)
|
||||||
|
|
||||||
const navigation = [
|
const navigation = [
|
||||||
{ name: 'Dashboard', href: '/admin', icon: LayoutDashboard },
|
{ name: 'Dashboard', href: `/${locale}/admin`, icon: LayoutDashboard },
|
||||||
{ name: 'Kullanıcılar', href: '/admin/users', icon: Users },
|
{ name: 'Kullanıcılar', href: `/${locale}/admin/users`, icon: Users },
|
||||||
{ name: 'Ayarlar', href: '/admin/settings', icon: Settings },
|
{ name: 'Ayarlar', href: `/${locale}/admin/settings`, icon: Settings },
|
||||||
]
|
]
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-gray-50 dark:bg-gray-900 flex">
|
<div className="min-h-screen bg-zinc-50 flex">
|
||||||
{/* Mobile sidebar backdrop */}
|
{/* Mobile sidebar backdrop */}
|
||||||
{sidebarOpen && (
|
{sidebarOpen && (
|
||||||
<div
|
<div
|
||||||
className="fixed inset-0 z-40 bg-gray-900/80 lg:hidden"
|
className="fixed inset-0 z-40 bg-zinc-950/60 lg:hidden"
|
||||||
onClick={() => setSidebarOpen(false)}
|
onClick={() => setSidebarOpen(false)}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Sidebar */}
|
{/* Sidebar */}
|
||||||
<div className={`
|
<div className={`
|
||||||
fixed inset-y-0 left-0 z-50 w-64 bg-white dark:bg-gray-950 border-r border-gray-200 dark:border-gray-800
|
fixed inset-y-0 left-0 z-50 w-64 bg-white border-r border-zinc-200
|
||||||
transform transition-transform duration-200 ease-in-out lg:translate-x-0 lg:static lg:inset-0
|
transform transition-transform duration-200 ease-in-out lg:translate-x-0 lg:static lg:inset-0
|
||||||
${sidebarOpen ? 'translate-x-0' : '-translate-x-full'}
|
${sidebarOpen ? 'translate-x-0' : '-translate-x-full'}
|
||||||
`}>
|
`}>
|
||||||
<div className="h-full flex flex-col">
|
<div className="h-full flex flex-col justify-between">
|
||||||
<div className="h-16 flex items-center px-6 border-b border-gray-200 dark:border-gray-800">
|
<div>
|
||||||
<h1 className="text-lg font-bold text-gray-900 dark:text-white">Admin Paneli</h1>
|
<div className="h-16 flex items-center justify-between px-6 border-b border-zinc-100">
|
||||||
<button
|
<Link href={`/${locale}`} className="flex items-center gap-2">
|
||||||
className="ml-auto lg:hidden text-gray-500"
|
<Image src="/logo.png" alt="AyrisLegal" width={110} height={22} className="h-5 w-auto object-contain" priority />
|
||||||
onClick={() => setSidebarOpen(false)}
|
</Link>
|
||||||
>
|
<button
|
||||||
<X className="h-5 w-5" />
|
className="lg:hidden text-zinc-500 hover:text-zinc-900"
|
||||||
</button>
|
onClick={() => setSidebarOpen(false)}
|
||||||
|
aria-label="Menüyü Kapat"
|
||||||
|
>
|
||||||
|
<X className="h-5 w-5" />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<nav className="px-4 py-6 space-y-1 overflow-y-auto">
|
||||||
|
{navigation.map((item) => {
|
||||||
|
const isActive = pathname === item.href || (item.href !== `/${locale}/admin` && pathname.startsWith(item.href))
|
||||||
|
return (
|
||||||
|
<Link
|
||||||
|
key={item.name}
|
||||||
|
href={item.href}
|
||||||
|
className={`
|
||||||
|
flex items-center px-3.5 py-2.5 text-sm font-semibold rounded-xl transition-all
|
||||||
|
${isActive
|
||||||
|
? 'bg-[#FDEEEC] text-[#B8140F]'
|
||||||
|
: 'text-zinc-600 hover:bg-zinc-100/70 hover:text-zinc-900'}
|
||||||
|
`}
|
||||||
|
>
|
||||||
|
<item.icon className={`mr-3 flex-shrink-0 h-4 w-4 ${isActive ? 'text-[#B8140F]' : 'text-zinc-500'}`} />
|
||||||
|
{item.name}
|
||||||
|
</Link>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<nav className="flex-1 px-4 py-6 space-y-1 overflow-y-auto">
|
<div className="p-4 border-t border-zinc-100">
|
||||||
{navigation.map((item) => {
|
|
||||||
const isActive = pathname.endsWith(item.href)
|
|
||||||
return (
|
|
||||||
<Link
|
|
||||||
key={item.name}
|
|
||||||
href={item.href}
|
|
||||||
className={`
|
|
||||||
flex items-center px-3 py-2.5 text-sm font-medium rounded-md transition-colors
|
|
||||||
${isActive
|
|
||||||
? 'bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-white'
|
|
||||||
: 'text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-gray-900 dark:hover:text-white'}
|
|
||||||
`}
|
|
||||||
>
|
|
||||||
<item.icon className={`mr-3 flex-shrink-0 h-5 w-5 ${isActive ? 'text-gray-900 dark:text-white' : 'text-gray-400'}`} />
|
|
||||||
{item.name}
|
|
||||||
</Link>
|
|
||||||
)
|
|
||||||
})}
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
<div className="p-4 border-t border-gray-200 dark:border-gray-800">
|
|
||||||
<button
|
<button
|
||||||
onClick={() => signOut({ callbackUrl: '/' })}
|
onClick={() => signOut({ callbackUrl: `/${locale}` })}
|
||||||
className="flex w-full items-center px-3 py-2.5 text-sm font-medium text-red-600 dark:text-red-400 rounded-md hover:bg-red-50 dark:hover:bg-red-950/30 transition-colors"
|
className="flex w-full items-center px-3.5 py-2.5 text-sm font-semibold text-zinc-700 hover:text-[#B8140F] rounded-xl hover:bg-[#FDEEEC] transition-colors"
|
||||||
>
|
>
|
||||||
<LogOut className="mr-3 h-5 w-5" />
|
<LogOut className="mr-3 h-4 w-4" />
|
||||||
Çıkış Yap
|
Çıkış Yap
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -78,17 +86,19 @@ export default function AdminLayout({ children }: { children: React.ReactNode })
|
|||||||
|
|
||||||
{/* Main content */}
|
{/* Main content */}
|
||||||
<div className="flex-1 flex flex-col min-w-0 overflow-hidden">
|
<div className="flex-1 flex flex-col min-w-0 overflow-hidden">
|
||||||
<header className="h-16 flex items-center lg:hidden bg-white dark:bg-gray-950 border-b border-gray-200 dark:border-gray-800 px-4">
|
<header className="h-16 flex items-center justify-between lg:hidden bg-white border-b border-zinc-200 px-4">
|
||||||
<button
|
<button
|
||||||
onClick={() => setSidebarOpen(true)}
|
onClick={() => setSidebarOpen(true)}
|
||||||
className="text-gray-500 hover:text-gray-900 dark:hover:text-white focus:outline-none"
|
className="text-zinc-600 hover:text-zinc-900 focus:outline-none"
|
||||||
|
aria-label="Menüyü Aç"
|
||||||
>
|
>
|
||||||
<Menu className="h-6 w-6" />
|
<Menu className="h-6 w-6" />
|
||||||
</button>
|
</button>
|
||||||
<span className="ml-4 text-lg font-bold text-gray-900 dark:text-white">Admin Paneli</span>
|
<span className="text-sm font-bold text-zinc-900">Admin Paneli</span>
|
||||||
|
<div className="w-6" />
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main className="flex-1 overflow-y-auto p-4 sm:p-6 lg:p-8">
|
<main className="flex-1 overflow-y-auto p-5 sm:p-8 max-w-[1400px]">
|
||||||
{children}
|
{children}
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+16
-19
@@ -4,41 +4,38 @@ export default async function AdminDashboardPage() {
|
|||||||
const session = await auth()
|
const session = await auth()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-6">
|
<div className="space-y-8">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-2xl font-bold tracking-tight text-gray-900 dark:text-white">Dashboard</h2>
|
<h1 className="text-2xl font-extrabold tracking-tight text-zinc-950">Yönetim Paneli</h1>
|
||||||
<p className="text-gray-500 dark:text-gray-400 mt-2">
|
<p className="text-zinc-600 text-sm mt-1.5">
|
||||||
Hoş geldiniz, {session?.user?.name || session?.user?.email}. İşte projenizin genel görünümü.
|
Hoş geldiniz, <span className="font-semibold text-zinc-900">{session?.user?.name || session?.user?.email}</span>. İşte platformun genel görünümü.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
||||||
{/* Placeholder Stat Cards */}
|
|
||||||
{[
|
{[
|
||||||
{ name: 'Toplam Kullanıcı', stat: '1,245' },
|
{ name: 'Toplam Demo Talebi', stat: '28' },
|
||||||
{ name: 'Aktif Oturumlar', stat: '42' },
|
{ name: 'Aktif Pilot Bürolar', stat: '14' },
|
||||||
{ name: 'Yeni Kayıtlar', stat: '8' },
|
{ name: 'Haftalık Analiz Sayısı', stat: '342' },
|
||||||
{ name: 'Sistem Durumu', stat: 'Online' },
|
{ name: 'Sistem Durumu', stat: 'Aktif / Çevrimiçi' },
|
||||||
].map((item) => (
|
].map((item) => (
|
||||||
<div
|
<div
|
||||||
key={item.name}
|
key={item.name}
|
||||||
className="overflow-hidden rounded-lg bg-white dark:bg-gray-950 border border-gray-200 dark:border-gray-800 px-4 py-5 shadow-sm sm:p-6"
|
className="overflow-hidden rounded-2xl bg-white border border-zinc-200/80 p-5 shadow-sm"
|
||||||
>
|
>
|
||||||
<dt className="truncate text-sm font-medium text-gray-500 dark:text-gray-400">{item.name}</dt>
|
<dt className="truncate text-xs font-bold uppercase tracking-wide text-zinc-500">{item.name}</dt>
|
||||||
<dd className="mt-1 text-3xl font-semibold tracking-tight text-gray-900 dark:text-white">
|
<dd className="mt-2 text-2xl font-extrabold tracking-tight text-zinc-950 font-mono">
|
||||||
{item.stat}
|
{item.stat}
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="rounded-lg bg-white dark:bg-gray-950 border border-gray-200 dark:border-gray-800 shadow-sm">
|
<div className="rounded-2xl bg-white border border-zinc-200/80 p-6 shadow-sm">
|
||||||
<div className="p-6">
|
<h2 className="text-base font-bold text-zinc-950">Son Aktiviteler & Demo Başvuruları</h2>
|
||||||
<h3 className="text-lg font-medium text-gray-900 dark:text-white">Son Aktiviteler</h3>
|
<div className="mt-4 border-t border-zinc-100 divide-y divide-zinc-100">
|
||||||
<div className="mt-4 border-t border-gray-100 dark:border-gray-800">
|
<div className="py-4 text-sm text-zinc-500">
|
||||||
<div className="py-4 text-sm text-gray-500">
|
Henüz bekleyen aktivite kaydı bulunmuyor. Yeni talepler anlık olarak burada listelenecektir.
|
||||||
Henüz aktivite kaydı bulunmuyor.
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -0,0 +1,125 @@
|
|||||||
|
import type { Metadata } from 'next'
|
||||||
|
import Link from 'next/link'
|
||||||
|
import Image from 'next/image'
|
||||||
|
import { ArrowLeft, ShieldCheck, Lock, Sparkles, CheckCircle2, Clock } from 'lucide-react'
|
||||||
|
import ContactForm from '@/components/contact-form'
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: 'Demo Talep Edin | AyrisLegal',
|
||||||
|
description: 'AyrisLegal kurucu ekibiyle 15 dakikalık birebir canlı demo planlayın. Dava dosyası analizi, çelişki tespiti ve içtihat arama yeteneklerini kendi çalışma pratiğinizde test edin.',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function ContactPage({
|
||||||
|
params,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ locale: string }>
|
||||||
|
}) {
|
||||||
|
const { locale } = await params
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="min-h-[100dvh] bg-white text-zinc-900 flex flex-col justify-between">
|
||||||
|
{/* ══════════════════════════════ TOP NAV ═════════════════════════════ */}
|
||||||
|
<header className="sticky top-0 z-30 border-b border-zinc-100 bg-white/90 px-5 py-4 backdrop-blur-md md:px-16">
|
||||||
|
<div className="mx-auto flex max-w-[1400px] items-center justify-between">
|
||||||
|
<Link href={`/${locale}`} className="flex items-center gap-2 group">
|
||||||
|
<Image src="/logo.png" alt="AyrisLegal" width={120} height={24} className="h-6 w-auto object-contain" priority />
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
href={`/${locale}`}
|
||||||
|
className="inline-flex items-center gap-1.5 text-sm font-semibold text-zinc-600 transition-colors hover:text-zinc-950"
|
||||||
|
>
|
||||||
|
<ArrowLeft size={15} strokeWidth={2} aria-hidden="true" />
|
||||||
|
Ana Sayfaya Dön
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{/* ══════════════════════════════ MAIN CONTENT ════════════════════════ */}
|
||||||
|
<main className="mx-auto w-full max-w-[1280px] px-5 py-12 md:px-16 md:py-20 flex-1">
|
||||||
|
<div className="grid grid-cols-1 gap-12 lg:grid-cols-[1.1fr_1fr] lg:gap-16 items-start">
|
||||||
|
{/* Sol Kolon: Değer Önerisi ve Güven Taahhütleri */}
|
||||||
|
<div>
|
||||||
|
<span className="inline-flex items-center gap-2 rounded-full px-4 py-1.5 text-[13px] font-semibold bg-[#FDEEEC] text-[#B8140F]">
|
||||||
|
<Sparkles size={14} strokeWidth={2.5} aria-hidden="true" /> Birebir Kurucu Demosu
|
||||||
|
</span>
|
||||||
|
<h1 className="mt-5 text-[clamp(32px,4.5vw,52px)] font-extrabold leading-[1.08] tracking-tight text-zinc-950">
|
||||||
|
Kendi dava dosyalarınızla{' '}
|
||||||
|
<span className="text-[#E61919]">15 dakikada</span> test edin.
|
||||||
|
</h1>
|
||||||
|
<p className="mt-5 max-w-[50ch] text-base leading-relaxed text-zinc-600">
|
||||||
|
AyrisLegal genel bir sohbet botu değil; dava dosyalarındaki tanık ve bilirkişi çelişkilerini yakalayan aktif bir düşünce ortağıdır. Formu doldurun, kurucu ekiple canlı demoda büronuza özel ihtiyaçları birlikte inceleyelim.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
{/* Adım Adım Süreç */}
|
||||||
|
<div className="mt-10 space-y-6 border-t border-zinc-100 pt-8">
|
||||||
|
<div className="flex items-start gap-4">
|
||||||
|
<div className="flex h-9 w-9 shrink-0 items-center justify-center rounded-xl bg-zinc-100 text-zinc-900 font-bold text-sm font-mono">
|
||||||
|
1
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h2 className="text-sm font-bold text-zinc-900">15 Dakikalık Canlı Demo</h2>
|
||||||
|
<p className="mt-1 text-sm leading-relaxed text-zinc-600">
|
||||||
|
Büronuzun baktığı temel dava türlerine (Kira, Ticaret, İş, Ceza) göre dosya analizi ve çelişki tespitini canlı olarak gösteriyoruz.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex items-start gap-4">
|
||||||
|
<div className="flex h-9 w-9 shrink-0 items-center justify-center rounded-xl bg-zinc-100 text-zinc-900 font-bold text-sm font-mono">
|
||||||
|
2
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h2 className="text-sm font-bold text-zinc-900">Pilot Erişim Kurulumu</h2>
|
||||||
|
<p className="mt-1 text-sm leading-relaxed text-zinc-600">
|
||||||
|
Masaüstü (Electron) ve Mobil (Expo) uygulamalarımıza pilot erişim yetkisi tanımlanır.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex items-start gap-4">
|
||||||
|
<div className="flex h-9 w-9 shrink-0 items-center justify-center rounded-xl bg-zinc-100 text-zinc-900 font-bold text-sm font-mono">
|
||||||
|
3
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h2 className="text-sm font-bold text-zinc-900">Doğrudan Mühendislik Desteği</h2>
|
||||||
|
<p className="mt-1 text-sm leading-relaxed text-zinc-600">
|
||||||
|
Pilot sürecinde karşılaştığınız her özel format veya içtihat gereksinimi için doğrudan kurucu ekiple iletişimde kalırsınız.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Güven Güvencesi */}
|
||||||
|
<div className="mt-10 rounded-2xl border border-zinc-200/80 bg-zinc-50/80 p-5 flex items-start gap-3.5">
|
||||||
|
<ShieldCheck size={20} className="text-zinc-900 shrink-0 mt-0.5" aria-hidden="true" />
|
||||||
|
<div className="text-xs leading-relaxed text-zinc-600">
|
||||||
|
<span className="font-bold text-zinc-900 block mb-0.5">Sıkı Veri Mahremiyeti:</span>
|
||||||
|
Dosyalarınız kamuya açık yapay zekâ modellerini eğitmek amacıyla kullanılmaz. Yerel şifreli çalışma prensibi esastır.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* Sağ Kolon: Form */}
|
||||||
|
<div className="w-full lg:sticky lg:top-24">
|
||||||
|
<ContactForm />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
{/* ══════════════════════════════ FOOTER ══════════════════════════════ */}
|
||||||
|
<footer className="border-t border-zinc-100 bg-white py-8 px-5 md:px-16 text-center text-xs text-zinc-500">
|
||||||
|
<div className="mx-auto flex max-w-[1400px] flex-col items-center justify-between gap-3 sm:flex-row">
|
||||||
|
<span>© {new Date().getFullYear()} AyrisLegal. Tüm hakları saklıdır.</span>
|
||||||
|
<a
|
||||||
|
href="https://ayris.tech"
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="font-medium text-zinc-700 underline-offset-4 hover:underline"
|
||||||
|
>
|
||||||
|
Created by ayris.tech
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
+169
-13
@@ -1,9 +1,10 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import { Archivo } from "next/font/google";
|
import { Archivo, JetBrains_Mono } from "next/font/google";
|
||||||
import { NextIntlClientProvider } from 'next-intl';
|
import { NextIntlClientProvider } from 'next-intl';
|
||||||
import { getMessages, setRequestLocale } from 'next-intl/server';
|
import { getMessages, setRequestLocale } from 'next-intl/server';
|
||||||
import { notFound } from 'next/navigation';
|
import { notFound } from 'next/navigation';
|
||||||
import { routing } from '@/i18n/routing';
|
import { routing } from '@/i18n/routing';
|
||||||
|
import CookieBanner from '@/components/cookie-banner';
|
||||||
import "../globals.css";
|
import "../globals.css";
|
||||||
|
|
||||||
const archivo = Archivo({
|
const archivo = Archivo({
|
||||||
@@ -12,38 +13,82 @@ const archivo = Archivo({
|
|||||||
display: "swap",
|
display: "swap",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const jetbrainsMono = JetBrains_Mono({
|
||||||
|
subsets: ["latin"],
|
||||||
|
variable: "--font-jetbrains-mono",
|
||||||
|
display: "swap",
|
||||||
|
});
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
|
metadataBase: new URL("https://ayrislegal.com"),
|
||||||
title: {
|
title: {
|
||||||
default: "AyrisLegal — Hukuki Düşünce Ortağınız",
|
default: "AyrisLegal — Avukatlar İçin Yapay Zekâ Destekli Hukuk Çalışma Alanı",
|
||||||
template: "%s | AyrisLegal",
|
template: "%s | AyrisLegal",
|
||||||
},
|
},
|
||||||
description:
|
description:
|
||||||
"AyrisLegal, solo ve küçük büro avukatları için yapay zeka destekli hukuki asistanıdır. Dosya analizi, çok turlu hukuki sohbet ve emsal karar arama tek bir platformda.",
|
"AyrisLegal; dava dosyası analizi, tanık ve bilirkişi çelişkisi tespiti, 18M+ emsal içtihat taraması, duruşma simülasyonu ve doğrudan UYAP uyumlu UDF dilekçe üretim platformudur.",
|
||||||
keywords: ["avukat yazılımı", "hukuki yapay zeka", "emsal karar arama", "hukuk ofisi yönetim", "AyrisLegal"],
|
keywords: [
|
||||||
authors: [{ name: "ayris.tech", url: "https://ayris.tech" }],
|
"avukat programı",
|
||||||
creator: "ayris.tech",
|
"hukuki yapay zeka",
|
||||||
|
"çelişki avcısı",
|
||||||
|
"emsal içtihat arama",
|
||||||
|
"udf dilekçe hazırlama",
|
||||||
|
"uyap eklentisi",
|
||||||
|
"hukuk bürosu otomasyonu",
|
||||||
|
"tensip zaptı analizi",
|
||||||
|
"yargıtay emsal kararlar",
|
||||||
|
"hukuk çalışma alanı",
|
||||||
|
"AyrisLegal"
|
||||||
|
],
|
||||||
|
authors: [{ name: "Ayris Tech", url: "https://ayris.tech" }],
|
||||||
|
creator: "Ayris Tech",
|
||||||
|
publisher: "Ayris Tech",
|
||||||
|
alternates: {
|
||||||
|
canonical: "https://ayrislegal.com/tr",
|
||||||
|
languages: {
|
||||||
|
"tr-TR": "https://ayrislegal.com/tr",
|
||||||
|
"en-US": "https://ayrislegal.com/en",
|
||||||
|
},
|
||||||
|
},
|
||||||
openGraph: {
|
openGraph: {
|
||||||
type: "website",
|
type: "website",
|
||||||
locale: "tr_TR",
|
locale: "tr_TR",
|
||||||
|
url: "https://ayrislegal.com",
|
||||||
siteName: "AyrisLegal",
|
siteName: "AyrisLegal",
|
||||||
title: "AyrisLegal — Hukuki Düşünce Ortağınız",
|
title: "AyrisLegal — Avukatlar İçin Yapay Zekâ Destekli Hukuk Çalışma Alanı",
|
||||||
description:
|
description:
|
||||||
"Pasif araştırma değil, aktif düşünce ortağı. Avukatlar için yapay zeka destekli hukuki asistan.",
|
"Pasif araştırma değil, aktif düşünce ortağı. Dava analizi, çelişki tespiti, 18M+ içtihat ve UDF dilekçe motoru.",
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: "/og-image.jpg",
|
||||||
|
width: 1200,
|
||||||
|
height: 630,
|
||||||
|
alt: "AyrisLegal Hukuk Çalışma Alanı",
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
twitter: {
|
twitter: {
|
||||||
card: "summary_large_image",
|
card: "summary_large_image",
|
||||||
title: "AyrisLegal — Hukuki Düşünce Ortağınız",
|
title: "AyrisLegal — Avukatlar İçin Yapay Zekâ Destekli Hukuk Çalışma Alanı",
|
||||||
description:
|
description:
|
||||||
"Pasif araştırma değil, aktif düşünce ortağı. Avukatlar için yapay zeka destekli hukuki asistan.",
|
"Dava analizi, çelişki tespiti, 18M+ içtihat ve UDF dilekçe motoru tek ekranda.",
|
||||||
|
images: ["/og-image.jpg"],
|
||||||
},
|
},
|
||||||
robots: {
|
robots: {
|
||||||
index: true,
|
index: true,
|
||||||
follow: true,
|
follow: true,
|
||||||
|
googleBot: {
|
||||||
|
index: true,
|
||||||
|
follow: true,
|
||||||
|
"max-video-preview": -1,
|
||||||
|
"max-image-preview": "large",
|
||||||
|
"max-snippet": -1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export function generateStaticParams() {
|
export function generateStaticParams() {
|
||||||
return routing.locales.map((locale) => ({locale}));
|
return routing.locales.map((locale) => ({ locale }));
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function RootLayout({
|
export default async function RootLayout({
|
||||||
@@ -62,14 +107,125 @@ export default async function RootLayout({
|
|||||||
setRequestLocale(locale);
|
setRequestLocale(locale);
|
||||||
const messages = await getMessages();
|
const messages = await getMessages();
|
||||||
|
|
||||||
|
// Schema.org JSON-LD Yapılandırılmış Verileri
|
||||||
|
const softwareSchema = {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "SoftwareApplication",
|
||||||
|
"name": "AyrisLegal",
|
||||||
|
"operatingSystem": "Windows, macOS, Linux, iOS, Android",
|
||||||
|
"applicationCategory": "BusinessApplication",
|
||||||
|
"applicationSubCategory": "Legal Practice Management Software",
|
||||||
|
"description": "Türk avukatları için yapay zekâ destekli dava analizi, 18M+ emsal içtihat arama ve UYAP UDF dilekçe üretim platformu.",
|
||||||
|
"offers": {
|
||||||
|
"@type": "Offer",
|
||||||
|
"price": "30000",
|
||||||
|
"priceCurrency": "TRY",
|
||||||
|
"priceValidUntil": "2027-12-31",
|
||||||
|
"availability": "https://schema.org/InStock",
|
||||||
|
},
|
||||||
|
"publisher": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "Ayris Tech",
|
||||||
|
"url": "https://ayris.tech",
|
||||||
|
"logo": "https://ayrislegal.com/logo.png",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const organizationSchema = {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "AyrisLegal",
|
||||||
|
"url": "https://ayrislegal.com",
|
||||||
|
"logo": "https://ayrislegal.com/logo.png",
|
||||||
|
"sameAs": [
|
||||||
|
"https://ayris.tech"
|
||||||
|
],
|
||||||
|
"contactPoint": {
|
||||||
|
"@type": "ContactPoint",
|
||||||
|
"contactType": "Customer Support",
|
||||||
|
"email": "info@ayris.tech",
|
||||||
|
"availableLanguage": ["Turkish", "English"]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const faqSchema = {
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "FAQPage",
|
||||||
|
"mainEntity": [
|
||||||
|
{
|
||||||
|
"@type": "Question",
|
||||||
|
"name": "Müvekkil dosyalarım nerede saklanıyor, kim görebilir?",
|
||||||
|
"acceptedAnswer": {
|
||||||
|
"@type": "Answer",
|
||||||
|
"text": "Belgeleriniz cihazınızda yerel şifreli depolamada tutulur. Yedeklemeler merkezi sunucularımıza değil, büronuzun kendi Google Drive hesabına şifreli olarak aktarılır. Başka bir avukat veya üçüncü tarafla kesinlikle paylaşılmaz ve kamuya açık modellerin eğitiminde kullanılmaz."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "Question",
|
||||||
|
"name": "UYAP şifremi veya e-imzamı AyrisLegal ile paylaşmam gerekiyor mu?",
|
||||||
|
"acceptedAnswer": {
|
||||||
|
"@type": "Answer",
|
||||||
|
"text": "Hayır. UYAP Tarayıcı Eklentisi sisteminizde zaten açık olan güvenli oturumunuzu kullanır; kimlik, e-imza veya şifre bilgileriniz hiçbir zaman AyrisLegal sunucularına iletilmez."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "Question",
|
||||||
|
"name": "Yapay zekâ yanlış bir çıkarım yaparsa sorumluluk kimde?",
|
||||||
|
"acceptedAnswer": {
|
||||||
|
"@type": "Answer",
|
||||||
|
"text": "AyrisLegal bir karar organı değildir; analitik bir düşünce ortağıdır. Ürettiği tüm emsal kararlar gerçek mahkeme esas ve karar numaralarıyla sunulur ve doğrulanabilir bağlantılar içerir. Nihai hukuki değerlendirme ve imza sorumluluğu daima avukata aittir."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "Question",
|
||||||
|
"name": "Dilekçeleri doğrudan UYAP Doküman Editörü (.udf) formatında indirebilir miyim?",
|
||||||
|
"acceptedAnswer": {
|
||||||
|
"@type": "Answer",
|
||||||
|
"text": "Evet. AyrisLegal bünyesindeki yerel UDF motoru, editörde yazılan dilekçeleri tek tıkla resmi Adalet Bakanlığı UYAP formatına (.udf), Word (.docx) veya PDF formatına dönüştürür."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "Question",
|
||||||
|
"name": "İnternet bağlantısı olmadığında çevrimdışı çalışabilir miyim?",
|
||||||
|
"acceptedAnswer": {
|
||||||
|
"@type": "Answer",
|
||||||
|
"text": "Evet. Önceden taranmış dava dosyaları, yerel arşivi ve 26.900+ kanun maddesi internetsiz ortamda bile anında görüntülenebilir ve aranabilir."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"@type": "Question",
|
||||||
|
"name": "Büromdaki diğer avukatlarla aynı anda ortak dava havuzunu kullanabilir miyim?",
|
||||||
|
"acceptedAnswer": {
|
||||||
|
"@type": "Answer",
|
||||||
|
"text": "Evet. Hukuk Bürosu planı kapsamında büro içi çoklu avukat ve stajyer lisansı, ortak emsal havuzu ve paylaşımlı dava çalışma alanı sunulmaktadır."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<html
|
<html
|
||||||
lang={locale}
|
lang={locale}
|
||||||
className={`${archivo.variable} h-full antialiased`}
|
className={`${archivo.variable} ${jetbrainsMono.variable} h-full antialiased`}
|
||||||
>
|
>
|
||||||
<body className="min-h-full flex flex-col" suppressHydrationWarning>
|
<head>
|
||||||
|
<script
|
||||||
|
type="application/ld+json"
|
||||||
|
dangerouslySetInnerHTML={{ __html: JSON.stringify(softwareSchema) }}
|
||||||
|
/>
|
||||||
|
<script
|
||||||
|
type="application/ld+json"
|
||||||
|
dangerouslySetInnerHTML={{ __html: JSON.stringify(organizationSchema) }}
|
||||||
|
/>
|
||||||
|
<script
|
||||||
|
type="application/ld+json"
|
||||||
|
dangerouslySetInnerHTML={{ __html: JSON.stringify(faqSchema) }}
|
||||||
|
/>
|
||||||
|
</head>
|
||||||
|
<body className="min-h-full flex flex-col font-sans" suppressHydrationWarning>
|
||||||
<NextIntlClientProvider messages={messages}>
|
<NextIntlClientProvider messages={messages}>
|
||||||
{children}
|
{children}
|
||||||
|
<CookieBanner />
|
||||||
</NextIntlClientProvider>
|
</NextIntlClientProvider>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import type { Metadata } from 'next'
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: 'Yönetici Girişi',
|
||||||
|
description: 'AyrisLegal yönetim paneli erişim sayfası.',
|
||||||
|
robots: {
|
||||||
|
index: false,
|
||||||
|
follow: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function LoginLayout({
|
||||||
|
children,
|
||||||
|
}: {
|
||||||
|
children: React.ReactNode
|
||||||
|
}) {
|
||||||
|
return <>{children}</>
|
||||||
|
}
|
||||||
+35
-16
@@ -2,10 +2,15 @@
|
|||||||
|
|
||||||
import { useState } from 'react'
|
import { useState } from 'react'
|
||||||
import { signIn } from 'next-auth/react'
|
import { signIn } from 'next-auth/react'
|
||||||
import { useRouter } from 'next/navigation'
|
import { useRouter, useParams } from 'next/navigation'
|
||||||
|
import Link from 'next/link'
|
||||||
|
import Image from 'next/image'
|
||||||
|
import { Lock, ArrowLeft } from 'lucide-react'
|
||||||
|
|
||||||
export default function LoginPage() {
|
export default function LoginPage() {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
const params = useParams()
|
||||||
|
const locale = (params?.locale as string) || 'tr'
|
||||||
const [email, setEmail] = useState('')
|
const [email, setEmail] = useState('')
|
||||||
const [password, setPassword] = useState('')
|
const [password, setPassword] = useState('')
|
||||||
const [error, setError] = useState('')
|
const [error, setError] = useState('')
|
||||||
@@ -26,29 +31,39 @@ export default function LoginPage() {
|
|||||||
setError('Geçersiz e-posta veya şifre')
|
setError('Geçersiz e-posta veya şifre')
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
} else {
|
} else {
|
||||||
router.push('/admin')
|
router.push(`/${locale}/admin`)
|
||||||
router.refresh()
|
router.refresh()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen flex items-center justify-center bg-gray-50 dark:bg-gray-900 px-4">
|
<div className="min-h-[100dvh] flex flex-col justify-between bg-zinc-50/80 px-4 py-8">
|
||||||
<div className="w-full max-w-md bg-white dark:bg-gray-800 rounded-xl shadow-lg border border-gray-100 dark:border-gray-800 overflow-hidden">
|
<div>
|
||||||
<div className="p-8">
|
<Link
|
||||||
|
href={`/${locale}`}
|
||||||
|
className="inline-flex items-center gap-1.5 text-xs font-semibold text-zinc-500 hover:text-zinc-900 transition-colors"
|
||||||
|
>
|
||||||
|
<ArrowLeft size={14} /> Ana Sayfaya Dön
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="w-full max-w-md mx-auto bg-white rounded-3xl shadow-[0_20px_60px_-30px_rgba(24,24,27,0.15)] border border-zinc-200/80 overflow-hidden">
|
||||||
|
<div className="p-8 sm:p-10">
|
||||||
<div className="text-center mb-8">
|
<div className="text-center mb-8">
|
||||||
<h1 className="text-2xl font-bold text-gray-900 dark:text-white">Admin Girişi</h1>
|
<Image src="/logo.png" alt="AyrisLegal" width={120} height={24} className="h-6 w-auto mx-auto object-contain mb-5" priority />
|
||||||
<p className="text-sm text-gray-500 mt-2">Yönetim paneline erişmek için giriş yapın</p>
|
<h1 className="text-2xl font-extrabold tracking-tight text-zinc-950">Yönetici Girişi</h1>
|
||||||
|
<p className="text-xs font-medium text-zinc-500 mt-1.5">Yönetim paneline erişmek için giriş yapın</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{error && (
|
{error && (
|
||||||
<div className="bg-red-50 text-red-600 p-3 rounded-md text-sm mb-6 border border-red-100">
|
<div role="alert" className="bg-red-50 text-red-700 p-3.5 rounded-xl text-xs font-semibold mb-6 border border-red-200">
|
||||||
{error}
|
{error}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<form onSubmit={handleSubmit} className="space-y-5">
|
<form onSubmit={handleSubmit} className="space-y-4" noValidate>
|
||||||
<div>
|
<div>
|
||||||
<label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1" htmlFor="email">
|
<label className="block text-xs font-bold text-zinc-900 mb-1.5" htmlFor="email">
|
||||||
E-posta
|
E-posta
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
@@ -57,12 +72,12 @@ export default function LoginPage() {
|
|||||||
value={email}
|
value={email}
|
||||||
onChange={(e) => setEmail(e.target.value)}
|
onChange={(e) => setEmail(e.target.value)}
|
||||||
required
|
required
|
||||||
className="w-full px-4 py-2 border border-gray-300 dark:border-gray-700 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-900 text-gray-900 dark:text-white transition-colors"
|
className="w-full min-h-[44px] px-4 py-2.5 border border-zinc-200 rounded-xl focus:outline-none focus:border-[#E61919] focus:ring-2 focus:ring-[#E61919]/20 bg-white text-zinc-900 text-sm transition-all"
|
||||||
placeholder="admin@ayris.tech"
|
placeholder="admin@ayris.tech"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1" htmlFor="password">
|
<label className="block text-xs font-bold text-zinc-900 mb-1.5" htmlFor="password">
|
||||||
Şifre
|
Şifre
|
||||||
</label>
|
</label>
|
||||||
<input
|
<input
|
||||||
@@ -71,24 +86,28 @@ export default function LoginPage() {
|
|||||||
value={password}
|
value={password}
|
||||||
onChange={(e) => setPassword(e.target.value)}
|
onChange={(e) => setPassword(e.target.value)}
|
||||||
required
|
required
|
||||||
className="w-full px-4 py-2 border border-gray-300 dark:border-gray-700 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500 bg-white dark:bg-gray-900 text-gray-900 dark:text-white transition-colors"
|
className="w-full min-h-[44px] px-4 py-2.5 border border-zinc-200 rounded-xl focus:outline-none focus:border-[#E61919] focus:ring-2 focus:ring-[#E61919]/20 bg-white text-zinc-900 text-sm transition-all"
|
||||||
placeholder="••••••••"
|
placeholder="••••••••"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
className="w-full bg-blue-600 hover:bg-blue-700 text-white font-medium py-2.5 px-4 rounded-md transition-colors disabled:opacity-70 disabled:cursor-not-allowed"
|
className="w-full bg-[#E61919] hover:bg-[#B8140F] text-white font-bold py-3.5 px-4 rounded-full text-sm transition-all disabled:opacity-60 disabled:cursor-not-allowed active:scale-[0.98] shadow-sm mt-2"
|
||||||
>
|
>
|
||||||
{loading ? 'Giriş yapılıyor...' : 'Giriş Yap'}
|
{loading ? 'Giriş yapılıyor...' : 'Giriş Yap'}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div className="mt-6 text-center text-xs text-gray-400">
|
<div className="mt-8 text-center text-xs font-mono text-zinc-500 bg-zinc-50 p-2.5 rounded-xl border border-zinc-100">
|
||||||
Demo credentials: admin@ayris.tech / admin
|
Demo: admin@ayris.tech / admin
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="text-center text-xs text-zinc-500">
|
||||||
|
© {new Date().getFullYear()} AyrisLegal · <a href="https://ayris.tech" target="_blank" rel="noopener noreferrer" className="hover:underline">Created by ayris.tech</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+906
-489
File diff suppressed because it is too large
Load Diff
@@ -1,92 +1,154 @@
|
|||||||
import React from 'react';
|
import type { Metadata } from 'next'
|
||||||
|
import Link from 'next/link'
|
||||||
|
import Image from 'next/image'
|
||||||
|
import { ArrowLeft, Lock } from 'lucide-react'
|
||||||
|
|
||||||
export default function PrivacyPolicy() {
|
export const metadata: Metadata = {
|
||||||
|
title: 'Masaüstü Uygulaması Gizlilik Politikası | AyrisLegal',
|
||||||
|
description: 'AyrisLegal masaüstü uygulaması ve web platformu gizlilik politikası, veri işleme ve KVKK aydınlatma metni.',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function AppPrivacyPolicyPage({
|
||||||
|
params,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ locale: string }>
|
||||||
|
}) {
|
||||||
|
const { locale } = await params
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="container mx-auto px-4 py-16 max-w-4xl">
|
<div className="min-h-[100dvh] bg-white text-zinc-900 flex flex-col justify-between selection:bg-[#FDEEEC] selection:text-[#B8140F]">
|
||||||
<h1 className="text-4xl font-bold mb-8">Gizlilik Politikası</h1>
|
{/* ══════════════════════════════ TOP NAV ═════════════════════════════ */}
|
||||||
<p className="mb-6 text-gray-500">Son Güncellenme Tarihi: 11 Ağustos 2026</p>
|
<header className="sticky top-0 z-30 border-b border-zinc-100 bg-white/90 px-5 py-4 backdrop-blur-md md:px-16">
|
||||||
|
<div className="mx-auto flex max-w-[1400px] items-center justify-between">
|
||||||
|
<Link href={`/${locale}`} className="flex items-center gap-2">
|
||||||
|
<Image src="/logo.png" alt="AyrisLegal" width={120} height={24} className="h-6 w-auto object-contain" priority />
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
href={`/${locale}`}
|
||||||
|
className="inline-flex items-center gap-1.5 text-sm font-semibold text-zinc-600 transition-colors hover:text-zinc-950"
|
||||||
|
>
|
||||||
|
<ArrowLeft size={15} strokeWidth={2} aria-hidden="true" />
|
||||||
|
Ana Sayfaya Dön
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
<div className="prose max-w-none">
|
{/* ══════════════════════════════ MAIN CONTENT ════════════════════════ */}
|
||||||
<section className="mb-8">
|
<main className="mx-auto w-full max-w-[860px] px-5 py-12 md:px-8 md:py-20 flex-1">
|
||||||
<h2 className="text-2xl font-semibold mb-4">1. Giriş</h2>
|
<div className="mb-10 border-b border-zinc-100 pb-8">
|
||||||
<p className="mb-4">
|
<span className="inline-flex items-center gap-1.5 rounded-full px-3.5 py-1 text-xs font-mono font-semibold bg-zinc-100 text-zinc-700">
|
||||||
AyrisLegal ("biz", "bizim" veya "bize"), gizliliğinize saygı duymakta ve kişisel verilerinizi korumayı taahhüt etmektedir. Bu Gizlilik Politikası, ayrislegal.com tanıtım web sitesini ve AyrisLegal masaüstü uygulamasını ("Uygulama") kullandığınızda kişisel bilgilerinizi nasıl işlediğimizi açıklar.
|
<Lock size={14} className="text-zinc-600" aria-hidden="true" />
|
||||||
|
Masaüstü & Mobil Uygulama
|
||||||
|
</span>
|
||||||
|
<h1 className="mt-4 text-[clamp(28px,3.8vw,42px)] font-extrabold leading-[1.1] tracking-tight text-zinc-950">
|
||||||
|
Gizlilik Politikası
|
||||||
|
</h1>
|
||||||
|
<p className="mt-2.5 font-mono text-xs text-zinc-500">
|
||||||
|
Son Güncelleme: 11 Ağustos 2026
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</div>
|
||||||
|
|
||||||
|
<div className="space-y-10 text-sm leading-relaxed text-zinc-600">
|
||||||
|
<section>
|
||||||
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">1. Giriş</h2>
|
||||||
|
<p>
|
||||||
|
AyrisLegal ("biz", "bizim" veya "bize"), gizliliğinize saygı duymakta ve kişisel verilerinizi korumayı taahhüt etmektedir. Bu Gizlilik Politikası, ayrislegal.com tanıtım web sitesini ve AyrisLegal masaüstü uygulamasını ("Uygulama") kullandığınızda kişisel bilgilerinizi nasıl işlediğimizi açıklar.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">2. Web Sitesi — Demo Talebi Formu</h2>
|
||||||
|
<p>
|
||||||
|
İletişim/demo talebi formunu doldurduğunuzda ad soyad, e-posta, (varsa) büro/kurum adı ve telefon bilgilerinizi topluyoruz. Bu bilgiler yalnızca talebinizi değerlendirmek ve sizinle iletişime geçmek amacıyla kullanılır; üçüncü taraflara satılmaz veya pazarlama amacıyla aktarılmaz.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section className="mb-8">
|
<section>
|
||||||
<h2 className="text-2xl font-semibold mb-4">2. Web Sitesi — Demo Talebi Formu</h2>
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">3. Uygulama — Hesap Bilgileri</h2>
|
||||||
<p className="mb-4">
|
<p>
|
||||||
İletişim/demo talebi formunu doldurduğunuzda ad soyad, e-posta, (varsa) büro/kurum adı ve telefon bilgilerinizi topluyoruz. Bu bilgiler yalnızca talebinizi değerlendirmek ve sizinle iletişime geçmek amacıyla kullanılır; üçüncü taraflara satılmaz veya pazarlama amacıyla aktarılmaz.
|
AyrisLegal'a kayıt olurken ad soyad, e-posta ve (varsa) baro sicil bilginizi işleriz. Bu bilgiler kimlik doğrulama ve hesabınızı yönetmek amacıyla kullanılır.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="mb-8">
|
<section>
|
||||||
<h2 className="text-2xl font-semibold mb-4">3. Uygulama — Hesap Bilgileri</h2>
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">4. Uygulama — Dava Dosyası ve Belge İçeriği</h2>
|
||||||
<p className="mb-4">
|
<p className="mb-3">
|
||||||
AyrisLegal'a kayıt olurken ad soyad, e-posta ve (varsa) baro sicil bilginizi işleriz. Bu bilgiler kimlik doğrulama ve hesabınızı yönetmek amacıyla kullanılır.
|
AyrisLegal'ın temel işlevi, yüklediğiniz dava dosyalarını ve belgeleri yapay zeka ile analiz etmek, içtihat aramak ve dilekçe taslağı üretmektir. Bu analiz, yapay zeka servis sağlayıcıları aracılığıyla gerçekleştirilir; yani yüklediğiniz belge içeriği, analiz işlemi sırasında bu servislere iletilir.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
<p>
|
||||||
|
Belgeleriniz yalnızca sizin analizinizi üretmek için kullanılır, başka kullanıcılarla veya üçüncü taraflarla paylaşılmaz. Kullandığımız yapay zeka altyapısı zaman içinde değişebilir; hassas veya gizlilik dereceli belgeleri yüklerken bu konuda dikkatli olmanızı öneririz.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section className="mb-8">
|
<section>
|
||||||
<h2 className="text-2xl font-semibold mb-4">4. Uygulama — Dava Dosyası ve Belge İçeriği</h2>
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">5. Lisans ve Cihaz Bilgileri</h2>
|
||||||
<p className="mb-4">
|
<p>
|
||||||
AyrisLegal'ın temel işlevi, yüklediğiniz dava dosyalarını ve belgeleri yapay zeka ile analiz etmek, içtihat aramak ve dilekçe taslağı üretmektir. Bu analiz, yapay zeka servis sağlayıcıları aracılığıyla gerçekleştirilir; yani yüklediğiniz belge içeriği, analiz işlemi sırasında bu servislere iletilir.
|
Uygulamanın aktivasyonu için bir lisans anahtarı ve cihazınıza özgü, rastgele üretilmiş bir cihaz kimliği kullanılır. Bu bilgiler bilgisayarınızda, işletim sisteminizin kendi güvenli depolama katmanı (macOS Keychain / Windows DPAPI) ile şifrelenerek saklanır.
|
||||||
</p>
|
</p>
|
||||||
<p className="mb-4">
|
</section>
|
||||||
Belgeleriniz yalnızca sizin analizinizi üretmek için kullanılır, başka kullanıcılarla veya üçüncü taraflarla paylaşılmaz. Kullandığımız yapay zeka altyapısı zaman içinde değişebilir; hassas veya gizlilik dereceli belgeleri yüklerken bu konuda dikkatli olmanızı öneririz.
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section className="mb-8">
|
<section>
|
||||||
<h2 className="text-2xl font-semibold mb-4">5. Lisans ve Cihaz Bilgileri</h2>
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">6. Yedekleme</h2>
|
||||||
<p className="mb-4">
|
<p>
|
||||||
Uygulamanın aktivasyonu için bir lisans anahtarı ve cihazınıza özgü, rastgele üretilmiş bir cihaz kimliği kullanılır. Bu bilgiler bilgisayarınızda, işletim sisteminizin kendi güvenli depolama katmanı (macOS Keychain / Windows DPAPI) ile şifrelenerek saklanır.
|
Uygulama içinde isteğe bağlı olarak açabileceğiniz otomatik yedekleme özelliği, dosyalarınızı bizim sunucularımıza değil, doğrudan sizin kendi Google Drive hesabınıza yükler. Bu özellik varsayılan olarak kapalıdır ve yalnızca siz açtığınızda, sizin izninizle çalışır.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="mb-8">
|
<section>
|
||||||
<h2 className="text-2xl font-semibold mb-4">6. Yedekleme</h2>
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">7. Hata Bildirimleri</h2>
|
||||||
<p className="mb-4">
|
<p>
|
||||||
Uygulama içinde isteğe bağlı olarak açabileceğiniz otomatik yedekleme özelliği, dosyalarınızı bizim sunucularımıza değil, doğrudan sizin kendi Google Drive hesabınıza yükler. Bu özellik varsayılan olarak kapalıdır ve yalnızca siz açtığınızda, sizin izninizle çalışır.
|
Uygulama bir teknik hatayla karşılaştığında, sorunu çözebilmemiz için anonim bir hata raporu gönderebilir. Bu raporlar; dava dosyası, müvekkil bilgisi, belge içeriği veya başka bir kişisel veri İÇERMEZ — yalnızca hatanın teknik ayrıntılarını (hangi modülde, hangi tür hata) kapsar. Bu bildirimi Ayarlar > Gizlilik menüsünden tamamen kapatabilirsiniz.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="mb-8">
|
<section>
|
||||||
<h2 className="text-2xl font-semibold mb-4">7. Hata Bildirimleri</h2>
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">8. Veri Güvenliği</h2>
|
||||||
<p className="mb-4">
|
<p>
|
||||||
Uygulama bir teknik hatayla karşılaştığında, sorunu çözebilmemiz için anonim bir hata raporu gönderebilir. Bu raporlar; dava dosyası, müvekkil bilgisi, belge içeriği veya başka bir kişisel veri İÇERMEZ — yalnızca hatanın teknik ayrıntılarını (hangi modülde, hangi tür hata) kapsar. Bu bildirimi Ayarlar > Gizlilik menüsünden tamamen kapatabilirsiniz.
|
Hassas veriler (lisans bilgisi, kimlik doğrulama bilgileri) cihazınızda şifreli olarak saklanır. Uygulama, geçerli bir lisansı olmayan kişiler tarafından aktive edilemez. Sunucu tarafı altyapımız erişim kontrolleriyle korunmaktadır.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="mb-8">
|
<section>
|
||||||
<h2 className="text-2xl font-semibold mb-4">8. Veri Güvenliği</h2>
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">9. Haklarınız (KVKK)</h2>
|
||||||
<p className="mb-4">
|
<p>
|
||||||
Hassas veriler (lisans bilgisi, kimlik doğrulama bilgileri) cihazınızda şifreli olarak saklanır. Uygulama, geçerli bir lisansı olmayan kişiler tarafından aktive edilemez. Sunucu tarafı altyapımız erişim kontrolleriyle korunmaktadır.
|
6698 sayılı Kişisel Verilerin Korunması Kanunu ("KVKK") kapsamında; verilerinizin işlenip işlenmediğini öğrenme, işlenmişse buna ilişkin bilgi talep etme, düzeltme veya silinmesini isteme haklarına sahipsiniz. Bu haklarınızı kullanmak için aşağıdaki iletişim adresinden bize ulaşabilirsiniz.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="mb-8">
|
<section>
|
||||||
<h2 className="text-2xl font-semibold mb-4">9. Haklarınız</h2>
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">10. Değişiklikler</h2>
|
||||||
<p className="mb-4">
|
<p>
|
||||||
6698 sayılı Kişisel Verilerin Korunması Kanunu ("KVKK") kapsamında; verilerinizin işlenip işlenmediğini öğrenme, işlenmişse buna ilişkin bilgi talep etme, düzeltme veya silinmesini isteme haklarına sahipsiniz. Bu haklarınızı kullanmak için aşağıdaki iletişim adresinden bize ulaşabilirsiniz.
|
Bu Gizlilik Politikasını zaman zaman güncelleyebiliriz. Herhangi bir değişiklik durumunda bu sayfada yeni tarihi belirterek sizi bilgilendireceğiz.
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="mb-8">
|
<section className="rounded-2xl border border-zinc-200/80 bg-zinc-50/70 p-6">
|
||||||
<h2 className="text-2xl font-semibold mb-4">10. Değişiklikler</h2>
|
<h2 className="text-base font-bold text-zinc-950 mb-2">11. İletişim</h2>
|
||||||
<p className="mb-4">
|
<p className="text-xs leading-relaxed text-zinc-600">
|
||||||
Bu Gizlilik Politikasını zaman zaman güncelleyebiliriz. Herhangi bir değişiklik durumunda bu sayfada yeni tarihi belirterek sizi bilgilendireceğiz.
|
Bu Gizlilik Politikası hakkında veya veri güvenliği ile ilgili sorularınız varsa, lütfen{' '}
|
||||||
</p>
|
<a href="mailto:info@ayris.tech" className="font-semibold text-zinc-900 underline underline-offset-4 hover:text-[#E61919]">
|
||||||
</section>
|
info@ayris.tech
|
||||||
|
</a>{' '}
|
||||||
|
adresi üzerinden bizimle iletişime geçin.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
<section className="mb-8">
|
{/* ══════════════════════════════ FOOTER ══════════════════════════════ */}
|
||||||
<h2 className="text-2xl font-semibold mb-4">11. İletişim</h2>
|
<footer className="border-t border-zinc-100 bg-white py-8 px-5 md:px-16 text-xs text-zinc-500">
|
||||||
<p className="mb-4">
|
<div className="mx-auto flex max-w-[1400px] flex-col items-center justify-between gap-3 sm:flex-row">
|
||||||
Bu Gizlilik Politikası hakkında veya veri güvenliği ile ilgili sorularınız varsa, lütfen <strong>info@ayris.tech</strong> adresi üzerinden bizimle iletişime geçin.
|
<span>© {new Date().getFullYear()} AyrisLegal — Ayris Tech'in bir ürünüdür.</span>
|
||||||
</p>
|
<a
|
||||||
</section>
|
href="https://ayris.tech"
|
||||||
</div>
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="font-medium text-zinc-700 underline-offset-4 hover:underline"
|
||||||
|
>
|
||||||
|
Created by ayris.tech
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+120
-52
@@ -1,59 +1,127 @@
|
|||||||
import React from 'react';
|
import type { Metadata } from 'next'
|
||||||
|
import Link from 'next/link'
|
||||||
|
import Image from 'next/image'
|
||||||
|
import { ArrowLeft, ShieldCheck } from 'lucide-react'
|
||||||
|
|
||||||
export default function PrivacyPolicy() {
|
export const metadata: Metadata = {
|
||||||
|
title: 'Gizlilik Politikası (Chrome Eklentisi) | AyrisLegal',
|
||||||
|
description: 'AyrisLegal UYAP Evrak İndirici Chrome eklentisi gizlilik ve veri güvenliği taahhütleri.',
|
||||||
|
}
|
||||||
|
|
||||||
|
export default async function PrivacyPolicyPage({
|
||||||
|
params,
|
||||||
|
}: {
|
||||||
|
params: Promise<{ locale: string }>
|
||||||
|
}) {
|
||||||
|
const { locale } = await params
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="container mx-auto px-4 py-16 max-w-4xl">
|
<div className="min-h-[100dvh] bg-white text-zinc-900 flex flex-col justify-between selection:bg-[#FDEEEC] selection:text-[#B8140F]">
|
||||||
<h1 className="text-4xl font-bold mb-8">Gizlilik Politikası (Privacy Policy)</h1>
|
{/* ══════════════════════════════ TOP NAV ═════════════════════════════ */}
|
||||||
<p className="mb-6 text-gray-500">Son Güncellenme Tarihi: 10 Ağustos 2026</p>
|
<header className="sticky top-0 z-30 border-b border-zinc-100 bg-white/90 px-5 py-4 backdrop-blur-md md:px-16">
|
||||||
|
<div className="mx-auto flex max-w-[1400px] items-center justify-between">
|
||||||
<div className="prose max-w-none">
|
<Link href={`/${locale}`} className="flex items-center gap-2">
|
||||||
<section className="mb-8">
|
<Image src="/logo.png" alt="AyrisLegal" width={120} height={24} className="h-6 w-auto object-contain" priority />
|
||||||
<h2 className="text-2xl font-semibold mb-4">1. Giriş</h2>
|
</Link>
|
||||||
<p className="mb-4">
|
<Link
|
||||||
AyrisLegal ("biz", "bizim" veya "bize"), gizliliğinize saygı duymakta ve kişisel verilerinizi korumayı taahhüt etmektedir. Bu Gizlilik Politikası, AyrisLegal UYAP Evrak İndirici Chrome eklentisini ve ilgili hizmetlerimizi ("Eklenti") kullandığınızda kişisel bilgilerinizi nasıl işlediğimizi ve koruduğumuzu açıklar.
|
href={`/${locale}`}
|
||||||
|
className="inline-flex items-center gap-1.5 text-sm font-semibold text-zinc-600 transition-colors hover:text-zinc-950"
|
||||||
|
>
|
||||||
|
<ArrowLeft size={15} strokeWidth={2} aria-hidden="true" />
|
||||||
|
Ana Sayfaya Dön
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{/* ══════════════════════════════ MAIN CONTENT ════════════════════════ */}
|
||||||
|
<main className="mx-auto w-full max-w-[860px] px-5 py-12 md:px-8 md:py-20 flex-1">
|
||||||
|
<div className="mb-10 border-b border-zinc-100 pb-8">
|
||||||
|
<span className="inline-flex items-center gap-1.5 rounded-full px-3.5 py-1 text-xs font-mono font-semibold bg-zinc-100 text-zinc-700">
|
||||||
|
<ShieldCheck size={14} className="text-zinc-600" aria-hidden="true" />
|
||||||
|
UYAP Evrak İndirici Chrome Eklentisi
|
||||||
|
</span>
|
||||||
|
<h1 className="mt-4 text-[clamp(28px,3.8vw,42px)] font-extrabold leading-[1.1] tracking-tight text-zinc-950">
|
||||||
|
Gizlilik Politikası
|
||||||
|
</h1>
|
||||||
|
<p className="mt-2.5 font-mono text-xs text-zinc-500">
|
||||||
|
Son Güncelleme: 10 Ağustos 2026
|
||||||
</p>
|
</p>
|
||||||
</section>
|
</div>
|
||||||
|
|
||||||
<section className="mb-8">
|
<div className="space-y-10 text-sm leading-relaxed text-zinc-600">
|
||||||
<h2 className="text-2xl font-semibold mb-4">2. Toplanan Veriler ve Kullanımı</h2>
|
<section>
|
||||||
<p className="mb-4">Eklentimiz, Google hesabınızla giriş yapmanızı (OAuth) gerektirir. Bu bağlamda yalnızca aşağıdaki temel bilgiler işlenir:</p>
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">1. Giriş</h2>
|
||||||
<ul className="list-disc pl-6 mb-4 space-y-2">
|
<p>
|
||||||
<li><strong>Google Kullanıcı Verileri:</strong> E-posta adresi ve temel profil bilgileriniz yalnızca kimlik doğrulama amacıyla kullanılır. Bu bilgiler dış sunucularımıza kaydedilmez, yalnızca oturum yönetimi için istemci (tarayıcı) tarafında tutulur.</li>
|
AyrisLegal ("biz", "bizim" veya "bize"), gizliliğinize saygı duymakta ve kişisel verilerinizi korumayı taahhüt etmektedir. Bu Gizlilik Politikası, AyrisLegal UYAP Evrak İndirici Chrome eklentisini ve ilgili hizmetlerimizi ("Eklenti") kullandığınızda kişisel bilgilerinizi nasıl işlediğimizi ve koruduğumuzu açıklar.
|
||||||
<li><strong>UYAP Evrak Verileri:</strong> Eklenti, UYAP portalından indirdiğiniz belgeleri <strong>sadece kendi bilgisayarınıza (yerel ağınıza)</strong> kaydeder veya aktarır. Hiçbir yasal belge, dosya detayı veya kişisel veri AyrisLegal sunucularına gönderilmez, saklanmaz veya üçüncü taraflarla paylaşılmaz.</li>
|
</p>
|
||||||
</ul>
|
</section>
|
||||||
</section>
|
|
||||||
|
<section>
|
||||||
<section className="mb-8">
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">2. Toplanan Veriler ve Kullanımı</h2>
|
||||||
<h2 className="text-2xl font-semibold mb-4">3. Veri Paylaşımı ve İfşası (Chrome Web Store Beyanları)</h2>
|
<p className="mb-3">
|
||||||
<p className="mb-4">Google Chrome Web Mağazası politikaları gereği şunları taahhüt ederiz:</p>
|
Eklentimiz, Google hesabınızla giriş yapmanızı (OAuth) gerektirir. Bu bağlamda yalnızca aşağıdaki temel bilgiler işlenir:
|
||||||
<ul className="list-disc pl-6 mb-4 space-y-2">
|
</p>
|
||||||
<li>Kullanıcı verilerini üçüncü şahıslara satmıyoruz veya aktarmıyoruz.</li>
|
<ul className="space-y-3 pl-4 list-disc marker:text-zinc-400">
|
||||||
<li>Kullanıcı verilerini onaylanmış (single purpose) kullanım amacı dışında kullanmıyor veya aktarmıyoruz.</li>
|
<li>
|
||||||
<li>Kullanıcı verilerini kredi notu belirlemek veya borç verme amaçlarıyla kullanmıyor veya aktarmıyoruz.</li>
|
<strong className="text-zinc-900 font-semibold">Google Kullanıcı Verileri:</strong> E-posta adresi ve temel profil bilgileriniz yalnızca kimlik doğrulama amacıyla kullanılır. Bu bilgiler dış sunucularımıza kaydedilmez, yalnızca oturum yönetimi için istemci (tarayıcı) tarafında tutulur.
|
||||||
</ul>
|
</li>
|
||||||
</section>
|
<li>
|
||||||
|
<strong className="text-zinc-900 font-semibold">UYAP Evrak Verileri:</strong> Eklenti, UYAP portalından indirdiğiniz belgeleri <strong className="text-zinc-900 font-semibold">sadece kendi bilgisayarınıza (yerel ağınıza)</strong> kaydeder veya aktarır. Hiçbir yasal belge, dosya detayı veya kişisel veri AyrisLegal sunucularına gönderilmez, saklanmaz veya üçüncü taraflarla paylaşılmaz.
|
||||||
<section className="mb-8">
|
</li>
|
||||||
<h2 className="text-2xl font-semibold mb-4">4. Veri Güvenliği</h2>
|
</ul>
|
||||||
<p className="mb-4">
|
</section>
|
||||||
Eklentinin tüm veri alışverişi doğrudan sizin bilgisayarınız (tarayıcınız) ile resmi hedefler (UYAP vb.) arasında gerçekleşir. Kişisel bilgilerinizin güvenliğini korumak için endüstri standartlarında önlemler uyguluyoruz.
|
|
||||||
</p>
|
<section>
|
||||||
</section>
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">3. Veri Paylaşımı ve İfşası (Chrome Web Store Beyanları)</h2>
|
||||||
|
<p className="mb-3">Google Chrome Web Mağazası politikaları gereği şunları taahhüt ederiz:</p>
|
||||||
|
<ul className="space-y-2 pl-4 list-disc marker:text-zinc-400">
|
||||||
|
<li>Kullanıcı verilerini üçüncü şahıslara satmıyoruz veya aktarmıyoruz.</li>
|
||||||
|
<li>Kullanıcı verilerini onaylanmış (single purpose) kullanım amacı dışında kullanmıyor veya aktarmıyoruz.</li>
|
||||||
|
<li>Kullanıcı verilerini kredi notu belirlemek veya borç verme amaçlarıyla kullanmıyor veya aktarmıyoruz.</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">4. Veri Güvenliği</h2>
|
||||||
|
<p>
|
||||||
|
Eklentinin tüm veri alışverişi doğrudan sizin bilgisayarınız (tarayıcınız) ile resmi hedefler (UYAP vb.) arasında gerçekleşir. Kişisel bilgilerinizin güvenliğini korumak için endüstri standartlarında teknik ve idari güvenlik önlemleri uygulanmaktadır.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2 className="text-lg font-bold text-zinc-950 mb-3">5. Değişiklikler</h2>
|
||||||
|
<p>
|
||||||
|
Bu Gizlilik Politikasını zaman zaman güncelleyebiliriz. Herhangi bir değişiklik durumunda bu sayfada yeni tarihi belirterek sizi bilgilendireceğiz.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
<section className="mb-8">
|
<section className="rounded-2xl border border-zinc-200/80 bg-zinc-50/70 p-6">
|
||||||
<h2 className="text-2xl font-semibold mb-4">5. Değişiklikler</h2>
|
<h2 className="text-base font-bold text-zinc-950 mb-2">6. İletişim</h2>
|
||||||
<p className="mb-4">
|
<p className="text-xs leading-relaxed text-zinc-600">
|
||||||
Bu Gizlilik Politikasını zaman zaman güncelleyebiliriz. Herhangi bir değişiklik durumunda bu sayfada yeni tarihi belirterek sizi bilgilendireceğiz.
|
Bu Gizlilik Politikası hakkında veya veri güvenliği ile ilgili her türlü sorunuz için lütfen{' '}
|
||||||
</p>
|
<a href="mailto:info@ayris.tech" className="font-semibold text-zinc-900 underline underline-offset-4 hover:text-[#E61919]">
|
||||||
</section>
|
info@ayris.tech
|
||||||
|
</a>{' '}
|
||||||
|
adresi üzerinden bizimle iletişime geçin.
|
||||||
|
</p>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
<section className="mb-8">
|
{/* ══════════════════════════════ FOOTER ══════════════════════════════ */}
|
||||||
<h2 className="text-2xl font-semibold mb-4">6. İletişim</h2>
|
<footer className="border-t border-zinc-100 bg-white py-8 px-5 md:px-16 text-xs text-zinc-500">
|
||||||
<p className="mb-4">
|
<div className="mx-auto flex max-w-[1400px] flex-col items-center justify-between gap-3 sm:flex-row">
|
||||||
Bu Gizlilik Politikası hakkında veya veri güvenliği ile ilgili sorularınız varsa, lütfen <strong>info@ayris.tech</strong> adresi üzerinden bizimle iletişime geçin.
|
<span>© {new Date().getFullYear()} AyrisLegal — Ayris Tech'in bir ürünüdür.</span>
|
||||||
</p>
|
<a
|
||||||
</section>
|
href="https://ayris.tech"
|
||||||
</div>
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="font-medium text-zinc-700 underline-offset-4 hover:underline"
|
||||||
|
>
|
||||||
|
Created by ayris.tech
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
);
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+82
-14
@@ -2,7 +2,7 @@ import { NextRequest, NextResponse } from 'next/server'
|
|||||||
|
|
||||||
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
||||||
|
|
||||||
// Basit in-memory rate limiting (MVP — production'da Redis kullan)
|
// Basit in-memory rate limiting
|
||||||
const ipRequestMap = new Map<string, { count: number; resetAt: number }>()
|
const ipRequestMap = new Map<string, { count: number; resetAt: number }>()
|
||||||
const RATE_LIMIT = 5 // maksimum istek
|
const RATE_LIMIT = 5 // maksimum istek
|
||||||
const WINDOW_MS = 60_000 // 1 dakika
|
const WINDOW_MS = 60_000 // 1 dakika
|
||||||
@@ -22,6 +22,69 @@ function checkRateLimit(ip: string): boolean {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function escapeHtml(str: string): string {
|
||||||
|
return str
|
||||||
|
.replace(/&/g, '&')
|
||||||
|
.replace(/</g, '<')
|
||||||
|
.replace(/>/g, '>')
|
||||||
|
.replace(/"/g, '"')
|
||||||
|
}
|
||||||
|
|
||||||
|
async function sendTelegramNotification({
|
||||||
|
name,
|
||||||
|
email,
|
||||||
|
org,
|
||||||
|
phone,
|
||||||
|
ip,
|
||||||
|
}: {
|
||||||
|
name: string
|
||||||
|
email: string
|
||||||
|
org?: string | null
|
||||||
|
phone?: string | null
|
||||||
|
ip: string
|
||||||
|
}) {
|
||||||
|
const botToken = process.env.TELEGRAM_BOT_TOKEN
|
||||||
|
const chatId = process.env.TELEGRAM_CHAT_ID
|
||||||
|
|
||||||
|
if (!botToken || !chatId) {
|
||||||
|
console.warn('[AyrisLegal] Telegram bildirim ayarları eksik (TELEGRAM_BOT_TOKEN veya TELEGRAM_CHAT_ID ortam değişkeni tanımlanmamış).')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const now = new Date().toLocaleString('tr-TR', { timeZone: 'Europe/Istanbul' })
|
||||||
|
|
||||||
|
const text =
|
||||||
|
`🎯 <b>Yeni AyrisLegal Demo Talebi!</b>\n\n` +
|
||||||
|
`👤 <b>Ad Soyad:</b> ${escapeHtml(name)}\n` +
|
||||||
|
`📧 <b>E-posta:</b> <code>${escapeHtml(email)}</code>\n` +
|
||||||
|
`🏢 <b>Büro / Kurum:</b> ${org ? escapeHtml(org) : '<i>Belirtilmedi</i>'}\n` +
|
||||||
|
`📞 <b>Telefon:</b> ${phone ? `<code>${escapeHtml(phone)}</code>` : '<i>Belirtilmedi</i>'}\n` +
|
||||||
|
`🌐 <b>IP Adresi:</b> <code>${escapeHtml(ip)}</code>\n` +
|
||||||
|
`⏰ <b>Tarih & Saat:</b> ${now}`
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({
|
||||||
|
chat_id: chatId,
|
||||||
|
text,
|
||||||
|
parse_mode: 'HTML',
|
||||||
|
disable_web_page_preview: true,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!res.ok) {
|
||||||
|
const errText = await res.text()
|
||||||
|
console.error('[AyrisLegal] Telegram API yanıt hatası:', errText)
|
||||||
|
} else {
|
||||||
|
console.log('[AyrisLegal] ✅ Telegram bildirimi başarıyla iletildi.')
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('[AyrisLegal] Telegram gönderim hatası:', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function POST(request: NextRequest) {
|
export async function POST(request: NextRequest) {
|
||||||
try {
|
try {
|
||||||
// IP tespiti
|
// IP tespiti
|
||||||
@@ -31,51 +94,56 @@ export async function POST(request: NextRequest) {
|
|||||||
// Rate limit
|
// Rate limit
|
||||||
if (!checkRateLimit(ip)) {
|
if (!checkRateLimit(ip)) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{ success: false, error: 'Çok fazla istek. Lütfen bir dakika bekleyip tekrar deneyin.' },
|
{ success: false, error: 'Çok fazla istek gönderildi. Lütfen bir dakika bekleyip tekrar deneyin.' },
|
||||||
{ status: 429 }
|
{ status: 429 }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const body = await request.json()
|
const body = await request.json()
|
||||||
const { name, email, barNo, message, _hp } = body
|
const { name, email, org, phone, barNo, message, _hp } = body
|
||||||
|
|
||||||
// Honeypot kontrolü
|
// Honeypot kontrolü (Bot engelleme)
|
||||||
if (_hp) {
|
if (_hp) {
|
||||||
// Bot — 200 döndür ama işleme
|
|
||||||
return NextResponse.json({ success: true })
|
return NextResponse.json({ success: true })
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zorunlu alan doğrulaması
|
// Zorunlu alan doğrulaması
|
||||||
if (!name || typeof name !== 'string' || name.trim().length < 2) {
|
if (!name || typeof name !== 'string' || name.trim().length < 2) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{ success: false, error: 'Ad Soyad zorunludur (en az 2 karakter).' },
|
{ success: false, error: 'Lütfen ad ve soyadınızı belirtin (en az 2 karakter).' },
|
||||||
{ status: 400 }
|
{ status: 400 }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!email || typeof email !== 'string' || !EMAIL_REGEX.test(email.trim())) {
|
if (!email || typeof email !== 'string' || !EMAIL_REGEX.test(email.trim())) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{ success: false, error: 'Geçerli bir e-posta adresi giriniz.' },
|
{ success: false, error: 'Lütfen geçerli bir e-posta adresi girin.' },
|
||||||
{ status: 400 }
|
{ status: 400 }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MVP: Konsola yaz
|
const leadData = {
|
||||||
// TODO: Resend/SendGrid veya Prisma leads tablosu eklenebilir
|
|
||||||
console.log('[AyrisLegal] 🎯 Yeni Demo Talebi:', {
|
|
||||||
timestamp: new Date().toISOString(),
|
|
||||||
name: name.trim(),
|
name: name.trim(),
|
||||||
email: email.trim().toLowerCase(),
|
email: email.trim().toLowerCase(),
|
||||||
barNo: barNo?.trim() || null,
|
org: org?.trim() || barNo?.trim() || null,
|
||||||
message: message?.trim() || null,
|
phone: phone?.trim() || message?.trim() || null,
|
||||||
ip,
|
ip,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Konsol logu
|
||||||
|
console.log('[AyrisLegal] 🎯 Yeni Demo Talebi Alındı:', {
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
...leadData,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Telegram Botuna Anlık Bildirim Gönder (Hata durumunda form akışını kesmez)
|
||||||
|
await sendTelegramNotification(leadData)
|
||||||
|
|
||||||
return NextResponse.json({ success: true }, { status: 200 })
|
return NextResponse.json({ success: true }, { status: 200 })
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error('[AyrisLegal] Contact API hatası:', err)
|
console.error('[AyrisLegal] Contact API hatası:', err)
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{ success: false, error: 'Sunucu hatası oluştu.' },
|
{ success: false, error: 'Sunucu hatası oluştu. Lütfen tekrar deneyin.' },
|
||||||
{ status: 500 }
|
{ status: 500 }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+44
-129
@@ -8,7 +8,7 @@
|
|||||||
--color-background: var(--background);
|
--color-background: var(--background);
|
||||||
--color-foreground: var(--foreground);
|
--color-foreground: var(--foreground);
|
||||||
--font-sans: var(--font-archivo);
|
--font-sans: var(--font-archivo);
|
||||||
--font-mono: var(--font-geist-mono);
|
--font-mono: var(--font-jetbrains-mono);
|
||||||
--font-heading: var(--font-archivo);
|
--font-heading: var(--font-archivo);
|
||||||
--color-sidebar-ring: var(--sidebar-ring);
|
--color-sidebar-ring: var(--sidebar-ring);
|
||||||
--color-sidebar-border: var(--sidebar-border);
|
--color-sidebar-border: var(--sidebar-border);
|
||||||
@@ -39,89 +39,69 @@
|
|||||||
--color-popover: var(--popover);
|
--color-popover: var(--popover);
|
||||||
--color-card-foreground: var(--card-foreground);
|
--color-card-foreground: var(--card-foreground);
|
||||||
--color-card: var(--card);
|
--color-card: var(--card);
|
||||||
--radius-sm: calc(var(--radius) * 0.6);
|
--radius-sm: 8px;
|
||||||
--radius-md: calc(var(--radius) * 0.8);
|
--radius-md: 12px;
|
||||||
--radius-lg: var(--radius);
|
--radius-lg: 16px;
|
||||||
--radius-xl: calc(var(--radius) * 1.4);
|
--radius-xl: 24px;
|
||||||
--radius-2xl: calc(var(--radius) * 1.8);
|
--radius-full: 9999px;
|
||||||
--radius-3xl: calc(var(--radius) * 2.2);
|
|
||||||
--radius-4xl: calc(var(--radius) * 2.6);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ─── AyrisLegal Marka Renk Sistemi (Lacivert + Teal) ─────────────── */
|
/* ─── AyrisLegal Design System: "The Modern Jurist Studio" ─────────── */
|
||||||
:root {
|
:root {
|
||||||
/* Lacivert (navy) arka plan / teal vurgu — dark-first marka */
|
/* Editorial Paper White & Architectural Zinc */
|
||||||
--background: oklch(0.18 0.055 243); /* Derin lacivert */
|
--background: #FFFFFF;
|
||||||
--foreground: oklch(0.95 0.012 240); /* Neredeyse beyaz */
|
--foreground: #09090B;
|
||||||
|
|
||||||
--card: oklch(0.22 0.05 243); /* Biraz açık lacivert kart */
|
--card: #FFFFFF;
|
||||||
--card-foreground: oklch(0.95 0.012 240);
|
--card-foreground: #09090B;
|
||||||
|
|
||||||
--popover: oklch(0.22 0.05 243);
|
--popover: #FFFFFF;
|
||||||
--popover-foreground: oklch(0.95 0.012 240);
|
--popover-foreground: #09090B;
|
||||||
|
|
||||||
/* Teal ana renk */
|
/* Ayris Legal Red (Primary Conversion Accent) */
|
||||||
--primary: oklch(0.63 0.14 183); /* Teal */
|
--primary: #E61919;
|
||||||
--primary-foreground: oklch(0.98 0.008 183);
|
--primary-foreground: #FFFFFF;
|
||||||
|
--primary-dark: #B8140F;
|
||||||
|
--primary-soft: #FDEEEC;
|
||||||
|
|
||||||
--secondary: oklch(0.28 0.05 243); /* Orta lacivert */
|
--secondary: #FAFAFA;
|
||||||
--secondary-foreground: oklch(0.90 0.012 240);
|
--secondary-foreground: #18181B;
|
||||||
|
|
||||||
--muted: oklch(0.25 0.04 243);
|
--muted: #FAFAFA;
|
||||||
--muted-foreground: oklch(0.60 0.035 240);
|
--muted-foreground: #71717A;
|
||||||
|
|
||||||
--accent: oklch(0.68 0.13 183); /* Açık teal vurgu */
|
--accent: #FDEEEC;
|
||||||
--accent-foreground: oklch(0.18 0.055 243);
|
--accent-foreground: #B8140F;
|
||||||
|
|
||||||
--destructive: oklch(0.577 0.245 27.325);
|
--destructive: #DC2626;
|
||||||
|
--destructive-foreground: #FFFFFF;
|
||||||
|
|
||||||
--border: oklch(0.32 0.045 243);
|
--border: #E4E4E7;
|
||||||
--input: oklch(0.28 0.045 243);
|
--input: #E4E4E7;
|
||||||
--ring: oklch(0.63 0.14 183); /* Teal focus ring */
|
--ring: #E61919;
|
||||||
|
|
||||||
--chart-1: oklch(0.63 0.14 183);
|
--radius: 1rem;
|
||||||
--chart-2: oklch(0.55 0.12 200);
|
|
||||||
--chart-3: oklch(0.45 0.09 220);
|
|
||||||
--chart-4: oklch(0.38 0.07 230);
|
|
||||||
--chart-5: oklch(0.30 0.05 240);
|
|
||||||
|
|
||||||
--radius: 0.75rem;
|
--sidebar: #FAFAFA;
|
||||||
|
--sidebar-foreground: #09090B;
|
||||||
|
--sidebar-primary: #E61919;
|
||||||
|
--sidebar-primary-foreground: #FFFFFF;
|
||||||
|
--sidebar-accent: #F4F4F5;
|
||||||
|
--sidebar-accent-foreground: #18181B;
|
||||||
|
--sidebar-border: #E4E4E7;
|
||||||
|
--sidebar-ring: #E61919;
|
||||||
|
|
||||||
--sidebar: oklch(0.20 0.055 243);
|
caret-color: #E61919;
|
||||||
--sidebar-foreground: oklch(0.90 0.012 240);
|
|
||||||
--sidebar-primary: oklch(0.63 0.14 183);
|
|
||||||
--sidebar-primary-foreground: oklch(0.98 0.008 183);
|
|
||||||
--sidebar-accent: oklch(0.25 0.05 243);
|
|
||||||
--sidebar-accent-foreground: oklch(0.90 0.012 240);
|
|
||||||
--sidebar-border: oklch(0.30 0.045 243);
|
|
||||||
--sidebar-ring: oklch(0.63 0.14 183);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Admin/login sayfaları için açık tema (opsiyonel override) */
|
::selection {
|
||||||
.light {
|
background: #FDEEEC;
|
||||||
--background: oklch(0.98 0.005 240);
|
color: #B8140F;
|
||||||
--foreground: oklch(0.18 0.055 243);
|
|
||||||
--card: oklch(1 0 0);
|
|
||||||
--card-foreground: oklch(0.18 0.055 243);
|
|
||||||
--popover: oklch(1 0 0);
|
|
||||||
--popover-foreground: oklch(0.18 0.055 243);
|
|
||||||
--primary: oklch(0.55 0.14 183);
|
|
||||||
--primary-foreground: oklch(0.98 0.008 183);
|
|
||||||
--secondary: oklch(0.93 0.02 240);
|
|
||||||
--secondary-foreground: oklch(0.22 0.05 243);
|
|
||||||
--muted: oklch(0.95 0.015 240);
|
|
||||||
--muted-foreground: oklch(0.50 0.04 240);
|
|
||||||
--accent: oklch(0.90 0.06 183);
|
|
||||||
--accent-foreground: oklch(0.25 0.05 243);
|
|
||||||
--destructive: oklch(0.577 0.245 27.325);
|
|
||||||
--border: oklch(0.88 0.02 240);
|
|
||||||
--input: oklch(0.88 0.02 240);
|
|
||||||
--ring: oklch(0.55 0.14 183);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@layer base {
|
@layer base {
|
||||||
* {
|
* {
|
||||||
@apply border-border outline-ring/50;
|
@apply border-border;
|
||||||
}
|
}
|
||||||
body {
|
body {
|
||||||
@apply bg-background text-foreground;
|
@apply bg-background text-foreground;
|
||||||
@@ -131,68 +111,3 @@
|
|||||||
scroll-behavior: smooth;
|
scroll-behavior: smooth;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ─── AyrisLegal Premium Background Effects ─────────────────────────── */
|
|
||||||
|
|
||||||
.orb {
|
|
||||||
position: fixed;
|
|
||||||
border-radius: 50%;
|
|
||||||
filter: blur(110px);
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 0;
|
|
||||||
will-change: transform;
|
|
||||||
}
|
|
||||||
|
|
||||||
.orb-1 {
|
|
||||||
width: 700px;
|
|
||||||
height: 700px;
|
|
||||||
background: radial-gradient(circle, rgba(45,212,191,0.22) 0%, transparent 70%);
|
|
||||||
top: -180px;
|
|
||||||
left: -120px;
|
|
||||||
animation: orb-float 14s ease-in-out infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
.orb-2 {
|
|
||||||
width: 550px;
|
|
||||||
height: 550px;
|
|
||||||
background: radial-gradient(circle, rgba(99,102,241,0.16) 0%, transparent 70%);
|
|
||||||
top: 38%;
|
|
||||||
right: -120px;
|
|
||||||
animation: orb-float 18s ease-in-out infinite reverse;
|
|
||||||
animation-delay: -6s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.orb-3 {
|
|
||||||
width: 420px;
|
|
||||||
height: 420px;
|
|
||||||
background: radial-gradient(circle, rgba(45,212,191,0.12) 0%, transparent 70%);
|
|
||||||
bottom: 15%;
|
|
||||||
left: 28%;
|
|
||||||
animation: orb-float 11s ease-in-out infinite;
|
|
||||||
animation-delay: -9s;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes orb-float {
|
|
||||||
0%, 100% { transform: translate(0, 0) scale(1); }
|
|
||||||
33% { transform: translate(35px, -50px) scale(1.06); }
|
|
||||||
66% { transform: translate(-25px, 25px) scale(0.95); }
|
|
||||||
}
|
|
||||||
|
|
||||||
.grid-overlay {
|
|
||||||
position: fixed;
|
|
||||||
inset: 0;
|
|
||||||
background-image:
|
|
||||||
linear-gradient(rgba(255,255,255,0.022) 1px, transparent 1px),
|
|
||||||
linear-gradient(90deg, rgba(255,255,255,0.022) 1px, transparent 1px);
|
|
||||||
background-size: 60px 60px;
|
|
||||||
pointer-events: none;
|
|
||||||
z-index: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Gradient text utility */
|
|
||||||
.text-gradient-teal {
|
|
||||||
background: linear-gradient(135deg, #2DD4BF 0%, #67E8F9 100%);
|
|
||||||
-webkit-background-clip: text;
|
|
||||||
-webkit-text-fill-color: transparent;
|
|
||||||
background-clip: text;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { MetadataRoute } from 'next'
|
||||||
|
|
||||||
|
export default function robots(): MetadataRoute.Robots {
|
||||||
|
const baseUrl = 'https://ayrislegal.com'
|
||||||
|
|
||||||
|
return {
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
userAgent: '*',
|
||||||
|
allow: '/',
|
||||||
|
disallow: ['/api/', '/admin/', '/login', '/*/login', '/*/admin', '/_next/', '/private/'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
sitemap: `${baseUrl}/sitemap.xml`,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
import { MetadataRoute } from 'next'
|
||||||
|
|
||||||
|
export default function sitemap(): MetadataRoute.Sitemap {
|
||||||
|
const baseUrl = 'https://ayrislegal.com'
|
||||||
|
const locales = ['tr', 'en']
|
||||||
|
const now = new Date()
|
||||||
|
|
||||||
|
const routes = [
|
||||||
|
{ path: '', priority: 1.0, changeFrequency: 'weekly' as const },
|
||||||
|
{ path: '/iletisim', priority: 0.9, changeFrequency: 'monthly' as const },
|
||||||
|
{ path: '/privacy', priority: 0.3, changeFrequency: 'yearly' as const },
|
||||||
|
]
|
||||||
|
|
||||||
|
const entries: MetadataRoute.Sitemap = []
|
||||||
|
|
||||||
|
for (const locale of locales) {
|
||||||
|
for (const route of routes) {
|
||||||
|
const url = `${baseUrl}/${locale}${route.path}`
|
||||||
|
entries.push({
|
||||||
|
url,
|
||||||
|
lastModified: now,
|
||||||
|
changeFrequency: route.changeFrequency,
|
||||||
|
priority: route.priority,
|
||||||
|
alternates: {
|
||||||
|
languages: {
|
||||||
|
tr: `${baseUrl}/tr${route.path}`,
|
||||||
|
en: `${baseUrl}/en${route.path}`,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return entries
|
||||||
|
}
|
||||||
+201
-30
@@ -1,102 +1,273 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { useState } from 'react'
|
import React, { useState } from 'react'
|
||||||
import { CheckCircle2 } from 'lucide-react'
|
import { CheckCircle2, AlertCircle, ArrowRight, RotateCcw } from 'lucide-react'
|
||||||
|
|
||||||
type FormState = 'idle' | 'loading' | 'success' | 'error'
|
type FormState = 'idle' | 'loading' | 'success' | 'error'
|
||||||
|
|
||||||
|
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
||||||
const ACCENT = '#E61919'
|
const ACCENT = '#E61919'
|
||||||
const ACCENT_DARK = '#B8140F'
|
const ACCENT_DARK = '#B8140F'
|
||||||
const ACCENT_SOFT = '#FDEEEC'
|
const ACCENT_SOFT = '#FDEEEC'
|
||||||
|
|
||||||
export default function ContactForm() {
|
export default function ContactForm() {
|
||||||
const [state, setState] = useState<FormState>('idle')
|
const [state, setState] = useState<FormState>('idle')
|
||||||
|
const [errorMessage, setErrorMessage] = useState<string>('')
|
||||||
const [form, setForm] = useState({ name: '', org: '', email: '', phone: '', _hp: '' })
|
const [form, setForm] = useState({ name: '', org: '', email: '', phone: '', _hp: '' })
|
||||||
|
const [touched, setTouched] = useState<{ [key: string]: boolean }>({})
|
||||||
|
const [fieldErrors, setFieldErrors] = useState<{ [key: string]: string }>({})
|
||||||
|
|
||||||
const set = (k: keyof typeof form) => (e: React.ChangeEvent<HTMLInputElement>) =>
|
const validate = () => {
|
||||||
setForm(p => ({ ...p, [k]: e.target.value }))
|
const errors: { [key: string]: string } = {}
|
||||||
|
if (!form.name.trim() || form.name.trim().length < 2) {
|
||||||
|
errors.name = 'Lütfen ad ve soyadınızı belirtin (en az 2 karakter).'
|
||||||
|
}
|
||||||
|
if (!form.email.trim() || !EMAIL_REGEX.test(form.email.trim())) {
|
||||||
|
errors.email = 'Lütfen geçerli bir e-posta adresi girin.'
|
||||||
|
}
|
||||||
|
setFieldErrors(errors)
|
||||||
|
return Object.keys(errors).length === 0
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleBlur = (field: string) => () => {
|
||||||
|
setTouched(prev => ({ ...prev, [field]: true }))
|
||||||
|
validate()
|
||||||
|
}
|
||||||
|
|
||||||
|
const set = (k: keyof typeof form) => (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
|
const value = e.target.value
|
||||||
|
setForm(p => ({ ...p, [k]: value }))
|
||||||
|
if (fieldErrors[k]) {
|
||||||
|
setFieldErrors(prev => ({ ...prev, [k]: '' }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const resetForm = () => {
|
||||||
|
setForm({ name: '', org: '', email: '', phone: '', _hp: '' })
|
||||||
|
setTouched({})
|
||||||
|
setFieldErrors({})
|
||||||
|
setState('idle')
|
||||||
|
setErrorMessage('')
|
||||||
|
}
|
||||||
|
|
||||||
const handleSubmit = async (e: React.FormEvent) => {
|
const handleSubmit = async (e: React.FormEvent) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
setTouched({ name: true, org: true, email: true, phone: true })
|
||||||
if (form._hp) return
|
if (form._hp) return
|
||||||
|
|
||||||
|
if (!validate()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
setState('loading')
|
setState('loading')
|
||||||
|
setErrorMessage('')
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await fetch('/api/contact', {
|
const res = await fetch('/api/contact', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
body: JSON.stringify({ name: form.name, email: form.email, barNo: form.org, message: form.phone }),
|
body: JSON.stringify({
|
||||||
|
name: form.name.trim(),
|
||||||
|
email: form.email.trim(),
|
||||||
|
org: form.org.trim(),
|
||||||
|
phone: form.phone.trim(),
|
||||||
|
_hp: form._hp,
|
||||||
|
}),
|
||||||
})
|
})
|
||||||
setState(res.ok ? 'success' : 'error')
|
|
||||||
|
const data = await res.json().catch(() => ({}))
|
||||||
|
|
||||||
|
if (res.ok && data.success) {
|
||||||
|
setState('success')
|
||||||
|
} else {
|
||||||
|
setState('error')
|
||||||
|
setErrorMessage(data.error || 'Talep iletilirken bir sorun oluştu. Lütfen tekrar deneyin.')
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
setState('error')
|
setState('error')
|
||||||
|
setErrorMessage('Bağlantı hatası oluştu. Lütfen internet bağlantınızı kontrol edip tekrar deneyin.')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state === 'success') {
|
if (state === 'success') {
|
||||||
return (
|
return (
|
||||||
<div className="rounded-3xl border border-zinc-200/70 p-10 text-center" style={{ background: ACCENT_SOFT }}>
|
<div
|
||||||
<div className="mx-auto mb-4 flex h-12 w-12 items-center justify-center rounded-full text-white" style={{ background: ACCENT }}>
|
role="status"
|
||||||
<CheckCircle2 size={22} strokeWidth={2.5} />
|
aria-live="polite"
|
||||||
|
className="rounded-3xl border border-zinc-200/80 p-8 sm:p-12 text-center shadow-[0_20px_60px_-30px_rgba(24,24,27,0.15)] bg-white"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="mx-auto mb-5 flex h-14 w-14 items-center justify-center rounded-full text-white shadow-sm"
|
||||||
|
style={{ background: ACCENT }}
|
||||||
|
>
|
||||||
|
<CheckCircle2 size={26} strokeWidth={2.5} aria-hidden="true" />
|
||||||
</div>
|
</div>
|
||||||
<h3 className="text-xl font-extrabold tracking-tight text-zinc-950">Talebiniz alındı!</h3>
|
<h3 className="text-2xl font-extrabold tracking-tight text-zinc-950">
|
||||||
<p className="mt-2 text-sm text-zinc-500">Kurucu ekipten kısa süre içinde size dönüş yapılacak.</p>
|
Demo Talebiniz Alındı
|
||||||
|
</h3>
|
||||||
|
<p className="mt-3 max-w-[44ch] mx-auto text-sm leading-relaxed text-zinc-600">
|
||||||
|
Kurucu ekibimiz 24 saat içinde sizinle iletişime geçerek 15 dakikalık birebir canlı demo oturumunuzu planlayacaktır.
|
||||||
|
</p>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={resetForm}
|
||||||
|
className="mt-7 inline-flex items-center gap-2 rounded-full border border-zinc-200 bg-white px-5 py-2.5 text-sm font-semibold text-zinc-800 transition-colors hover:bg-zinc-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-zinc-950"
|
||||||
|
>
|
||||||
|
<RotateCcw size={14} aria-hidden="true" /> Yeni Talep Gönder
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const inputClass = 'w-full min-h-[46px] rounded-xl border-[1.5px] border-zinc-200 bg-white px-4 py-2.5 text-sm text-zinc-900 outline-none transition-colors focus:border-[var(--accent)]'
|
const baseInput =
|
||||||
|
'w-full min-h-[46px] rounded-xl border bg-white px-4 py-2.5 text-sm text-zinc-900 placeholder:text-zinc-400 outline-none transition-all'
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<form
|
<form
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
className="grid grid-cols-1 gap-4 rounded-3xl border border-zinc-200/70 bg-white p-8 shadow-[0_20px_60px_-30px_rgba(24,24,27,0.2)] sm:grid-cols-2"
|
className="grid grid-cols-1 gap-5 rounded-3xl border border-zinc-200/80 bg-white p-6 sm:p-10 shadow-[0_20px_60px_-30px_rgba(24,24,27,0.2)] sm:grid-cols-2"
|
||||||
style={{ ['--accent' as string]: ACCENT }}
|
|
||||||
noValidate
|
noValidate
|
||||||
>
|
>
|
||||||
<div aria-hidden="true" className="hidden">
|
<div aria-hidden="true" className="hidden">
|
||||||
<input type="text" name="_hp" value={form._hp} onChange={set('_hp')} autoComplete="off" tabIndex={-1} />
|
<input
|
||||||
|
type="text"
|
||||||
|
name="_hp"
|
||||||
|
value={form._hp}
|
||||||
|
onChange={set('_hp')}
|
||||||
|
autoComplete="off"
|
||||||
|
tabIndex={-1}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="sm:col-span-1">
|
<div className="sm:col-span-1">
|
||||||
<label className="mb-1.5 block text-[13px] font-semibold text-zinc-900" htmlFor="af_name">
|
<label className="mb-1.5 block text-xs font-bold text-zinc-900" htmlFor="af_name">
|
||||||
Ad Soyad <span style={{ color: ACCENT }}>*</span>
|
Ad Soyad <span style={{ color: ACCENT }}>*</span>
|
||||||
</label>
|
</label>
|
||||||
<input id="af_name" type="text" required placeholder="Av. Ayşe Yılmaz" value={form.name} onChange={set('name')} className={inputClass} />
|
<input
|
||||||
|
id="af_name"
|
||||||
|
type="text"
|
||||||
|
required
|
||||||
|
autoComplete="name"
|
||||||
|
placeholder="Av. Ayşe Yılmaz"
|
||||||
|
value={form.name}
|
||||||
|
onChange={set('name')}
|
||||||
|
onBlur={handleBlur('name')}
|
||||||
|
aria-invalid={!!fieldErrors.name}
|
||||||
|
aria-describedby={fieldErrors.name ? 'af_name_error' : undefined}
|
||||||
|
className={`${baseInput} ${
|
||||||
|
fieldErrors.name && touched.name
|
||||||
|
? 'border-red-500 focus-visible:border-red-600 focus-visible:ring-2 focus-visible:ring-red-500/20'
|
||||||
|
: 'border-zinc-200 hover:border-zinc-300 focus-visible:border-[#E61919] focus-visible:ring-2 focus-visible:ring-[#E61919]/20'
|
||||||
|
}`}
|
||||||
|
/>
|
||||||
|
{fieldErrors.name && touched.name && (
|
||||||
|
<p id="af_name_error" className="mt-1.5 text-xs font-semibold text-red-600 flex items-center gap-1">
|
||||||
|
<AlertCircle size={12} aria-hidden="true" /> {fieldErrors.name}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-1.5 block text-[13px] font-semibold text-zinc-900" htmlFor="af_org">Büro / Kurum</label>
|
<label className="mb-1.5 block text-xs font-bold text-zinc-900" htmlFor="af_org">
|
||||||
<input id="af_org" type="text" placeholder="Yılmaz Hukuk Bürosu" value={form.org} onChange={set('org')} className={inputClass} />
|
Büro / Kurum
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="af_org"
|
||||||
|
type="text"
|
||||||
|
autoComplete="organization"
|
||||||
|
placeholder="Yılmaz Hukuk Bürosu"
|
||||||
|
value={form.org}
|
||||||
|
onChange={set('org')}
|
||||||
|
className={`${baseInput} border-zinc-200 hover:border-zinc-300 focus-visible:border-[#E61919] focus-visible:ring-2 focus-visible:ring-[#E61919]/20`}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-1.5 block text-[13px] font-semibold text-zinc-900" htmlFor="af_email">
|
<label className="mb-1.5 block text-xs font-bold text-zinc-900" htmlFor="af_email">
|
||||||
E-posta <span style={{ color: ACCENT }}>*</span>
|
E-posta <span style={{ color: ACCENT }}>*</span>
|
||||||
</label>
|
</label>
|
||||||
<input id="af_email" type="email" required placeholder="ayse@buro.com" value={form.email} onChange={set('email')} className={inputClass} />
|
<input
|
||||||
|
id="af_email"
|
||||||
|
type="email"
|
||||||
|
required
|
||||||
|
autoComplete="email"
|
||||||
|
placeholder="avukat@buro.com"
|
||||||
|
value={form.email}
|
||||||
|
onChange={set('email')}
|
||||||
|
onBlur={handleBlur('email')}
|
||||||
|
aria-invalid={!!fieldErrors.email}
|
||||||
|
aria-describedby={fieldErrors.email ? 'af_email_error' : undefined}
|
||||||
|
className={`${baseInput} ${
|
||||||
|
fieldErrors.email && touched.email
|
||||||
|
? 'border-red-500 focus-visible:border-red-600 focus-visible:ring-2 focus-visible:ring-red-500/20'
|
||||||
|
: 'border-zinc-200 hover:border-zinc-300 focus-visible:border-[#E61919] focus-visible:ring-2 focus-visible:ring-[#E61919]/20'
|
||||||
|
}`}
|
||||||
|
/>
|
||||||
|
{fieldErrors.email && touched.email && (
|
||||||
|
<p id="af_email_error" className="mt-1.5 text-xs font-semibold text-red-600 flex items-center gap-1">
|
||||||
|
<AlertCircle size={12} aria-hidden="true" /> {fieldErrors.email}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label className="mb-1.5 block text-[13px] font-semibold text-zinc-900" htmlFor="af_phone">Telefon</label>
|
<label className="mb-1.5 block text-xs font-bold text-zinc-900" htmlFor="af_phone">
|
||||||
<input id="af_phone" type="tel" placeholder="0532 000 00 00" value={form.phone} onChange={set('phone')} className={inputClass} />
|
Telefon <span className="text-zinc-500 font-normal">(opsiyonel)</span>
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
id="af_phone"
|
||||||
|
type="tel"
|
||||||
|
autoComplete="tel"
|
||||||
|
placeholder="0532 000 00 00"
|
||||||
|
value={form.phone}
|
||||||
|
onChange={set('phone')}
|
||||||
|
className={`${baseInput} border-zinc-200 hover:border-zinc-300 focus-visible:border-[#E61919] focus-visible:ring-2 focus-visible:ring-[#E61919]/20`}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{state === 'error' && (
|
{state === 'error' && (
|
||||||
<div className="text-[13px] text-red-600 sm:col-span-2">
|
<div
|
||||||
Bir hata oluştu. Lütfen tekrar deneyin veya{' '}
|
role="alert"
|
||||||
<a href="mailto:info@ayris.tech" className="underline">info@ayris.tech</a> adresine yazın.
|
aria-live="assertive"
|
||||||
|
className="rounded-xl border border-red-200 bg-red-50/80 p-3.5 text-sm font-medium text-red-800 sm:col-span-2 flex items-start gap-2.5"
|
||||||
|
>
|
||||||
|
<AlertCircle size={17} className="text-red-600 shrink-0 mt-0.5" aria-hidden="true" />
|
||||||
|
<div>
|
||||||
|
<span>{errorMessage}</span>
|
||||||
|
<span className="block mt-1 text-xs text-red-700">
|
||||||
|
Alternatif olarak doğrudan{' '}
|
||||||
|
<a href="mailto:info@ayris.tech" className="underline font-semibold hover:text-red-900">
|
||||||
|
info@ayris.tech
|
||||||
|
</a>{' '}
|
||||||
|
adresine e-posta gönderebilirsiniz.
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
disabled={state === 'loading'}
|
disabled={state === 'loading'}
|
||||||
className="mt-1 flex items-center justify-center gap-2 rounded-full py-3.5 text-[15px] font-bold text-white transition-colors disabled:cursor-not-allowed disabled:opacity-70 sm:col-span-2"
|
aria-busy={state === 'loading'}
|
||||||
|
className="mt-2 flex items-center justify-center gap-2 rounded-full py-4 text-sm font-bold text-white transition-all disabled:cursor-not-allowed disabled:opacity-60 sm:col-span-2 focus-visible:outline-none focus-visible:ring-3 focus-visible:ring-[#E61919]/40 active:scale-[0.99]"
|
||||||
style={{ background: ACCENT }}
|
style={{ background: ACCENT }}
|
||||||
onMouseEnter={e => { if (state !== 'loading') (e.currentTarget as HTMLElement).style.background = ACCENT_DARK }}
|
onMouseEnter={e => {
|
||||||
onMouseLeave={e => { if (state !== 'loading') (e.currentTarget as HTMLElement).style.background = ACCENT }}
|
if (state !== 'loading') (e.currentTarget as HTMLElement).style.background = ACCENT_DARK
|
||||||
|
}}
|
||||||
|
onMouseLeave={e => {
|
||||||
|
if (state !== 'loading') (e.currentTarget as HTMLElement).style.background = ACCENT
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
{state === 'loading' ? 'Gönderiliyor…' : 'Demo Talep Et →'}
|
{state === 'loading' ? (
|
||||||
|
<span className="inline-flex items-center gap-2">
|
||||||
|
<span className="h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent" />
|
||||||
|
Talebiniz İletiliyor…
|
||||||
|
</span>
|
||||||
|
) : (
|
||||||
|
<span className="inline-flex items-center gap-2">
|
||||||
|
15 Dk Canlı Demo Talep Edin <ArrowRight size={16} strokeWidth={2.5} aria-hidden="true" />
|
||||||
|
</span>
|
||||||
|
)}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,97 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
import React, { useState, useEffect } from 'react'
|
||||||
|
import Link from 'next/link'
|
||||||
|
import { useParams } from 'next/navigation'
|
||||||
|
import { Cookie, X, ShieldCheck } from 'lucide-react'
|
||||||
|
|
||||||
|
export default function CookieBanner() {
|
||||||
|
const [mounted, setMounted] = useState(false)
|
||||||
|
const [visible, setVisible] = useState(false)
|
||||||
|
const params = useParams()
|
||||||
|
const locale = (params?.locale as string) || 'tr'
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setMounted(true)
|
||||||
|
const consent = localStorage.getItem('ayris_cookie_consent')
|
||||||
|
if (!consent) {
|
||||||
|
// Sayfa yüklendikten kısa bir süre sonra pürüzsüzce aç
|
||||||
|
const timer = setTimeout(() => {
|
||||||
|
setVisible(true)
|
||||||
|
}, 1000)
|
||||||
|
return () => clearTimeout(timer)
|
||||||
|
}
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const handleAcceptAll = () => {
|
||||||
|
localStorage.setItem('ayris_cookie_consent', 'accepted_all')
|
||||||
|
setVisible(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleAcceptEssential = () => {
|
||||||
|
localStorage.setItem('ayris_cookie_consent', 'essential_only')
|
||||||
|
setVisible(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mounted || !visible) return null
|
||||||
|
|
||||||
|
return (
|
||||||
|
<aside
|
||||||
|
aria-label="Çerez ve Gizlilik Bildirimi"
|
||||||
|
role="region"
|
||||||
|
className="fixed bottom-4 left-4 right-4 z-50 mx-auto max-w-[540px] animate-in fade-in slide-in-from-bottom-5 duration-300 sm:bottom-6 sm:right-6 sm:left-auto"
|
||||||
|
>
|
||||||
|
<div className="rounded-2xl border border-zinc-200/90 bg-white/95 p-5 shadow-[0_20px_50px_-15px_rgba(24,24,27,0.2)] backdrop-blur-md">
|
||||||
|
<div className="flex items-start gap-3.5">
|
||||||
|
<div className="flex h-9 w-9 shrink-0 items-center justify-center rounded-xl bg-[#FDEEEC] text-[#B8140F]">
|
||||||
|
<Cookie size={18} strokeWidth={2.2} aria-hidden="true" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="flex-1">
|
||||||
|
<div className="flex items-center justify-between gap-2">
|
||||||
|
<h3 className="text-sm font-bold text-zinc-950 flex items-center gap-1.5">
|
||||||
|
Çerez ve Veri Politikası
|
||||||
|
</h3>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={handleAcceptEssential}
|
||||||
|
aria-label="Bildirimi Kapat"
|
||||||
|
className="rounded-lg p-1 text-zinc-400 hover:bg-zinc-100 hover:text-zinc-700 transition-colors"
|
||||||
|
>
|
||||||
|
<X size={15} />
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p className="mt-1.5 text-xs leading-relaxed text-zinc-600">
|
||||||
|
Sitemizde gezinme deneyiminizi iyileştirmek, temel işlevleri sunmak ve güvenliği sağlamak amacıyla çerezler kullanılmaktadır. Ayrıntılı bilgi için{' '}
|
||||||
|
<Link
|
||||||
|
href={`/${locale}/privacy`}
|
||||||
|
className="font-semibold text-zinc-900 underline underline-offset-2 hover:text-[#E61919]"
|
||||||
|
>
|
||||||
|
Gizlilik Politikası
|
||||||
|
</Link>
|
||||||
|
'nı inceleyebilirsiniz.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="mt-4 flex flex-wrap items-center gap-2">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={handleAcceptAll}
|
||||||
|
className="flex-1 rounded-full bg-[#E61919] px-4 py-2 text-xs font-bold text-white shadow-sm transition-all hover:bg-[#B8140F] active:scale-[0.98] sm:flex-initial"
|
||||||
|
>
|
||||||
|
Tümünü Kabul Et
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={handleAcceptEssential}
|
||||||
|
className="flex-1 rounded-full border border-zinc-200 bg-white px-3.5 py-2 text-xs font-semibold text-zinc-700 transition-all hover:bg-zinc-50 hover:text-zinc-950 active:scale-[0.98] sm:flex-initial"
|
||||||
|
>
|
||||||
|
Yalnızca Zorunlular
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</aside>
|
||||||
|
)
|
||||||
|
}
|
||||||
+554
@@ -0,0 +1,554 @@
|
|||||||
|
# AyrisLegal (LawOS) — Kapsamlı Uygulama Özellikleri, Buton & Prompt Rehberi
|
||||||
|
|
||||||
|
Bu belge, **AyrisLegal (LawOS)** masaüstü hukuk otomasyonu ve yapay zeka işletim sisteminin tüm sayfalarını, modüllerini, butonlarını, işlevlerini, yapay zeka promptlarını ve yerel entegrasyonlarını en ince ayrıntısına kadar açıklayan eksiksiz teknik ve kullanıcı kılavuzudur.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📑 İÇİNDEKİLER
|
||||||
|
|
||||||
|
1. [Sistem Mimarisi ve Temel Yetenekler](#1-sistem-mimarisi-ve-temel-yetenekler)
|
||||||
|
2. [Global Arayüz Bileşenleri ve Kısayollar](#2-global-arayüz-bileşenleri-ve-kısayollar)
|
||||||
|
- [2.1. Kenar Çubuğu (Sidebar) & Marka Alanı](#21-kenar-çubuğu-sidebar--marka-alanı)
|
||||||
|
- [2.2. Hızlı Arama & Komut Paleti (Spotlight / Cmd+K)](#22-hızlı-arama--komut-paleti-cmdk)
|
||||||
|
- [2.3. Hızlı Başlangıç Rehberi (Onboarding Modal)](#23-hızlı-başlangıç-rehberi-onboarding-modal)
|
||||||
|
- [2.4. Video Eğitimleri & Akademi Modalı](#24-video-eğitimleri--akademi-modalı)
|
||||||
|
- [2.5. Tema Değiştirici (Dark / Light Mode)](#25-tema-değiştirici-dark--light-mode)
|
||||||
|
3. [Sayfa ve Modül Detay İncelemesi](#3-sayfa-ve-modül-detay-incelemesi)
|
||||||
|
- [3.1. Genel Bakış (Komuta Merkezi)](#31-genel-bakış-komuta-merkezi)
|
||||||
|
- [3.2. Dava Dosyaları (Arşiv & Yönetim)](#32-dava-dosyaları-arşiv--yönetim)
|
||||||
|
- [3.3. Dava Detay Paneli (12 Alt Modül)](#33-dava-detay-paneli-12-alt-modül)
|
||||||
|
- [3.3.1. Genel Bakış](#331-genel-bakış)
|
||||||
|
- [3.3.2. Yapay Zeka Özeti](#332-yapay-zeka-özeti)
|
||||||
|
- [3.3.3. Dosya Röntgeni (Usul & Eksiklik Taraması)](#333-dosya-röntgeni-usul--eksiklik-taraması)
|
||||||
|
- [3.3.4. İfade & Çelişki Avcısı (Çapraz Sorgu)](#334-ifade--çelişki-avcısı-çapraz-sorgu)
|
||||||
|
- [3.3.5. Dava Stratejisi & Kazanma Planı](#335-dava-stratejisi--kazanma-planı)
|
||||||
|
- [3.3.6. Müzakere & Arabuluculuk Simülatörü](#336-müzakere--arabuluculuk-simülatörü)
|
||||||
|
- [3.3.7. Belgeler & Ekler (OCR, Filtreleme, Detay)](#337-belgeler--ekler-ocr-filtreleme-detay)
|
||||||
|
- [3.3.8. Dilekçeler (Taslak Yönetimi)](#338-dilekçeler-taslak-yönetimi)
|
||||||
|
- [3.3.9. Duruşma & Süreler (Dosya Takvimi)](#339-duruşma--süreler-dosya-takvimi)
|
||||||
|
- [3.3.10. AyrisLegal'e Sor (CaseChat - Dosya İçi RAG)](#3310-ayrislegale-sor-casechat---dosya-içi-rag)
|
||||||
|
- [3.3.11. Dijital Stajyer (Canlı Duruşma Nokta Atışı)](#3311-dijital-stajyer-canlı-duruşma-nokta-atışı)
|
||||||
|
- [3.3.12. Duruşma Simülatörü (Hakim / Karşı Taraf)](#3312-duruşma-simülatörü-hakim--karşı-taraf)
|
||||||
|
- [3.4. İçtihat ve Mevzuat Arama](#34-i̇çtihat-ve-mevzuat-arama)
|
||||||
|
- [3.4.1. Emsal İçtihatlar (18M+ Yargıtay, Danıştay, AYM, BAM)](#341-emsal-i̇çtihatlar-18m-yargıtay-danıştay-aym-bam)
|
||||||
|
- [3.4.2. Mevzuat & Kanun Maddeleri (26.900+ Madde & Çevrimdışı Depo)](#342-mevzuat--kanun-maddeleri-26900-madde--çevrimdışı-depo)
|
||||||
|
- [3.5. Dilekçe Hazırlama Stüdyosu (Drafting Studio)](#35-dilekçe-hazırlama-stüdyosu-drafting-studio)
|
||||||
|
- [3.5.1. Kategori & Dilekçe Türü Seçimi](#351-kategori--dilekçe-türü-seçimi)
|
||||||
|
- [3.5.2. Yapay Zeka Dilekçe Oluşturma Akışı](#352-yapay-zeka-dilekçe-oluşturma-akışı)
|
||||||
|
- [3.5.3. Tiptap Zengin Metin Editörü & Araç Çubuğu](#353-tiptap-zengin-metin-editörü--araç-çubuğu)
|
||||||
|
- [3.5.4. Kanun Maddesi Ekleme Modalı](#354-kanun-maddesi-ekleme-modalı)
|
||||||
|
- [3.5.5. Dışa Aktarma: UDF, Word (DOCX), PDF](#355-dışa-aktarma-udf-word-docx-pdf)
|
||||||
|
- [3.6. Duruşma Takvimi (Calendar)](#36-duruşma-takvimi-calendar)
|
||||||
|
- [3.7. Belge & Dilekçe Şablonları (Templates)](#37-belge--dilekçe-şablonları-templates)
|
||||||
|
- [3.8. Müvekkiller & Cari Bakiye Takibi (Clients)](#38-müvekkiller--cari-bakiye-takibi-clients)
|
||||||
|
- [3.9. Global Hukuk Asistanı (Sohbet / Chat)](#39-global-hukuk-asistanı-sohbet--chat)
|
||||||
|
- [3.10. Ayarlar (Settings)](#310-ayarlar-settings)
|
||||||
|
- [3.10.1. Kullanıcı Profili & Şifre Değiştirme](#3101-kullanıcı-profili--şifre-değiştirme)
|
||||||
|
- [3.10.2. Abonelik & Lisans Yönetimi](#3102-abonelik--lisans-yönetimi)
|
||||||
|
- [3.10.3. Google Drive Otomatik Yedekleme & Geri Yükleme](#3103-google-drive-otomatik-yedekleme--geri-yükleme)
|
||||||
|
- [3.10.4. Destek Talebi & Hata Bildirimi](#3104-destek-talebi--hata-bildirimi)
|
||||||
|
- [3.10.5. Gizlilik, Güvenlik & Güvenli Mod (Safe Mode)](#3105-gizlilik-güvenlik--güvenli-mod-safe-mode)
|
||||||
|
- [3.10.6. Görünüm & Tema](#3106-görünüm--tema)
|
||||||
|
- [3.10.7. Oturum Kapatma](#3107-oturum-kapatma)
|
||||||
|
4. [Tüm Yapay Zeka Promptları & Sistem Motoru Mimarisi](#4-tüm-yapay-zeka-promptları--sistem-motoru-mimarisi)
|
||||||
|
5. [UYAP Entegrasyonu, UDF Formatı ve Masaüstü Köprüsü](#5-uyap-entegrasyonu-udf-formatı-ve-masaüstü-köprüsü)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 1. Sistem Mimarisi ve Temel Yetenekler
|
||||||
|
|
||||||
|
AyrisLegal, modern hukuk bürolarının tüm operasyonel ihtiyaçlarını karşılamak üzere geliştirilmiş, **Electron + Next.js (App Router) + TypeScript + TailwindCSS / Vanilla CSS** tabanlı bir masaüstü hukuk işletim sistemidir.
|
||||||
|
|
||||||
|
* **Yerel Öncelikli Veri Modeli (Local-First):** Dava evrakları, UDF belgeleri, OCR metinleri ve önbelleğe alınan içtihatlar istemcinin yerel diskinde (SQLite / Local Data Store) güvenli bir şekilde saklanır.
|
||||||
|
* **UYAP Chrome Eklentisi Köprüsü:** UYAP Avukat Portalındaki dava dosyaları, tensip tutanakları, evraklar, tebligatlar ve duruşma listeleri tek tıkla masaüstü uygulamasına aktarılır.
|
||||||
|
* **Çok Modelli Yapay Zeka Altyapısı (Hybrid RAG):** Büyük dava dosyalarını semantik vektörleştirme ve bağlam sıkıştırma teknikleriyle analiz ederek delil değerlendirmesi, çapraz sorgu, strateji ve dilekçe üretimi yapar.
|
||||||
|
* **Doğal UDF Motoru:** UYAP Doküman Editörü (.udf) dosyalarını doğrudan ayrıştırır, okur ve Tiptap editöründen tek tıkla UYAP uyumlu `.udf` formatında dışa aktarır.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2. Global Arayüz Bileşenleri ve Kısayollar
|
||||||
|
|
||||||
|
## 2.1. Kenar Çubuğu (Sidebar) & Marka Alanı
|
||||||
|
|
||||||
|
Sol sütunda yer alan sabit veya daraltılabilir gezinti panelidir.
|
||||||
|
|
||||||
|
| Arayüz Unsuru / Buton | İşlev ve Davranış | Arka Plandaki Eylem |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| **Logo & Marka Alanı** | Sol üstte AyrisLegal logosunu ve başlığını gösterir. | Genişletilmiş durumda "AyrisLegal" yazar, daraltılmış durumda sadece logo simgesi kalır. |
|
||||||
|
| **Daralt / Genişlet Butonu (`Icon.chevL` / `Icon.chevR`)** | Kenar çubuğunun genişliğini 252px ile 64px arasında değiştirir. | Tercihi `localStorage ('ayrislegal-sidebar-collapsed')` içinde saklar. |
|
||||||
|
| **Hızlı Ara... (Spotlight Butonu)** | Arama simgesi ve "⌘K" etiketi barındıran buton. | Tıklandığında Spotlight / Command Palette modalını açar. |
|
||||||
|
| **Menü Butonları (`NAV_ITEMS`)** | 9 ana sekmeye tek tıkla geçiş sağlar: Genel Bakış, Sohbet/Asistan, Dava Dosyaları, İçtihat Arama, Dilekçe Hazırlama, Duruşma Takvimi, Belge Şablonları, Müvekkiller, Ayarlar. | Ziyaret edilen görünümleri bellekte (`visitedViews`) canlı tutar, arka plandaki AI akışları veya arama sonuçları kaybolmaz. |
|
||||||
|
| **🚀 Başlangıç Rehberi Butonu** | Kenar çubuğunun alt kısmında mavi vurgulu buton. | `open-onboarding` olayını tetikler ve 4 adımlı büro kurulum sihirbazını açar. |
|
||||||
|
| **🎓 Eğitim Videoları Butonu** | Mor vurgulu Akademi butonu. | `open-tutorials` olayını tetikler ve video dersler modalını açar. |
|
||||||
|
| **Koyu Mod / Aydınlık Mod Butonu** | Güneş/Ay ikonlu buton. | `html[data-theme]` değerini `dark` veya `light` olarak değiştirir ve `localStorage ('ayrislegal-theme')` kaydeder. |
|
||||||
|
| **Kullanıcı Profil Avatarı & Çıkış** | Kullanıcının adının baş harflerini gösterir. | Genişletilmiş modda "Çıkış Yap" butonu, daraltılmış modda avatara tıklandığında `supabase.auth.signOut()` çağrılır. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.2. Hızlı Arama & Komut Paleti (Cmd+K)
|
||||||
|
|
||||||
|
Klavyeden `⌘ + K` (Mac) veya `Ctrl + K` (Windows/Linux) tuşlarına basıldığında ya da sol menüdeki arama butonuna tıklandığında açılır.
|
||||||
|
|
||||||
|
* **Arama Girdisi:** Yazılan metne göre anında eşleşen sayfaları, modülleri ve eylemleri filtreler.
|
||||||
|
* **Yukarı / Aşağı Ok Tuşları (`ArrowUp` / `ArrowDown`):** Liste öğeleri arasında gezinir.
|
||||||
|
* **Enter Tuşu:** Seçili komutu veya sayfayı anında çalıştırır/açar.
|
||||||
|
* **Escape Tuşu:** Paleti kapatır.
|
||||||
|
* **Desteklenen Hızlı Komutlar:**
|
||||||
|
* 📊 `Genel Bakış (Komuta Merkezi)` -> `overview`
|
||||||
|
* 📁 `Dava Dosyaları & Arşiv` -> `cases`
|
||||||
|
* 🔍 `İçtihat Arama (Yargıtay, Danıştay, BAM)` -> `research`
|
||||||
|
* ✍️ `Dilekçe Hazırlama Stüdyosu` -> `drafting`
|
||||||
|
* 📅 `Duruşma Takvimi & Süreler` -> `calendar`
|
||||||
|
* 📝 `Hukuki Belge & Dilekçe Şablonları` -> `templates`
|
||||||
|
* 👥 `Müvekkiller & Cari Hesaplar` -> `clients`
|
||||||
|
* 💬 `AyrisLegal Hukuki Yapay Zeka Sohbeti` -> `chat`
|
||||||
|
* ⚙️ `Uygulama Ayarları & Tercihler` -> `settings`
|
||||||
|
* 🎨 `Açık / Koyu Tema Değiştir` -> `toggleTheme()`
|
||||||
|
* 🚪 `Oturumu Kapat` -> `handleSignOut()`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.3. Hızlı Başlangıç Rehberi (Onboarding Modal)
|
||||||
|
|
||||||
|
İlk girişte otomatik açılan, istendiğinde kenar çubuğundan tekrar çağrılabilen 4 adımlı büro kurulum sihirbazıdır.
|
||||||
|
|
||||||
|
1. **Adım 1 - Büro Profili & Uzmanlık Alanları:**
|
||||||
|
* Avukat Adı/Soyadı, Hukuk Bürosu Adı giriş alanları.
|
||||||
|
* Uzmanlık Alanı Seçicileri: *Ceza Hukuku, İş & Tazminat, Ticaret & Şirketler, Aile & Boşanma, İcra & İflas, Gayrimenkul & Kira, İdare & Vergi, Fikri & Sınai Mülkiyet, Tüketici & Sözleşmeler*.
|
||||||
|
2. **Adım 2 - UYAP Chrome Eklentisi Entegrasyonu:**
|
||||||
|
* "Chrome Web Mağazası'nda Aç" butonu ile resmi eklenti sayfasına yönlendirme.
|
||||||
|
* Canlı handshake dinleyicisi (`ayris-chrome-extension` mesajı algılandığında eklenti durumu "Yüklendi" yeşil onayına geçer).
|
||||||
|
3. **Adım 3 - Temel Özellikler Turu:**
|
||||||
|
* 18 Milyon İçtihat Arama, Tensip Zaptı Analizi, AI Dilekçe Motoru, Dijital Stajyer tanıtımları.
|
||||||
|
4. **Adım 4 - Başlangıç & Yönlendirme:**
|
||||||
|
* "Komuta Merkezine Git" veya "Yeni Dava Dosyası Ekle" butonlarıyla sistemi başlatır.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.4. Video Eğitimleri & Akademi Modalı
|
||||||
|
|
||||||
|
Uygulamanın gelişmiş yeteneklerini görsel olarak anlatan YouTube destekli video eğitim merkezidir.
|
||||||
|
|
||||||
|
* **Kategori Filtreleme Butonları:** *Tümü, 🚀 Hızlı Başlangıç, ⚖️ UYAP & Eklenti, 🤖 AI Dilekçe & Savunma, 🔍 18M İçtihat, 📑 Dava & Tensip Analizi, 📚 Şablonlar & Mevzuat*.
|
||||||
|
* **Video Oynatıcı Kartı:** Seçilen videonun yerleşik oynatıcısı, süresi, video açıklaması ve öne çıkan başlıklar listesi.
|
||||||
|
* **"Modüle Git" Eylem Butonu:** Videoda anlatılan ilgili sayfaya (örneğin dilekçe yazımı veya içtihat arama) kullanıcıyı doğrudan yönlendirir.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 3. Sayfa ve Modül Detay İncelemesi
|
||||||
|
|
||||||
|
## 3.1. Genel Bakış (Komuta Merkezi)
|
||||||
|
|
||||||
|
Uygulamanın ana kumanda merkezidir. Canlı UYAP bildirim akışı, yaklaşan duruşmalar ve acil hukuki işlemler burada toplanır.
|
||||||
|
|
||||||
|
### Arayüz Öğeleri ve Butonlar:
|
||||||
|
* **`AYRIS AI: CANLI` Durum Rozeti:** Sağ üstte yapay zeka servislerinin operasyonel olduğunu gösteren yeşil neon nabız göstergesi.
|
||||||
|
* **Stat Kartı 1: `AKTİF DAVA DOSYALARI`**
|
||||||
|
* Toplam aktif dava sayısını ve ilerleme çubuğunu gösterir.
|
||||||
|
* Tıklandığında doğrudan `cases` (Dava Dosyaları) sayfasına geçer.
|
||||||
|
* **Stat Kartı 2: `EN YAKIN DURUŞMA GÜNÜ`**
|
||||||
|
* Yaklaşan duruşma sayısını ve en yakın duruşmanın gün/saat bilgisini gösterir.
|
||||||
|
* Tıklandığında doğrudan `calendar` (Duruşma Takvimi) sayfasına geçer.
|
||||||
|
* **`Bildirimler (Canlı UYAP Akışı)` Paneli:**
|
||||||
|
* UYAP Chrome Eklentisi üzerinden aktarılan dosya hareketlerini listeler.
|
||||||
|
* *Kategori İkonları ve Rozetleri:* 🩺 Bilirkişi Raporu, ⚖️ Mahkeme Kararı / Tensip, 💰 İcra Tahsilat / Reddiyat, 📬 Tebligat / Müzekkere, ✍️ Dilekçe / İtiraz, 👤 Taraf / Vekalet Kaydı.
|
||||||
|
* Tıklanan bildirim kartı doğrudan ilgili dava dosyasına yönlendirir.
|
||||||
|
* **`Acil İşlemler` Paneli:**
|
||||||
|
* Önümüzdeki 7 gün içindeki duruşmaları ve süresi yaklaşan ara kararları filtreler.
|
||||||
|
* *Öncelik Rozetleri:* `BUGÜN DURUŞMA VAR` (Kırmızı), `SÜRESİ YAKLAŞIYOR` (Turuncu), `7 GÜN İÇİNDE` (Mavi).
|
||||||
|
* **"Tüm Dosya Görevlerini Görüntüle →" Butonu:** Dava arşivine yönlendirir.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.2. Dava Dosyaları (Arşiv & Yönetim)
|
||||||
|
|
||||||
|
Kayıtlı tüm dava dosyalarının listelendiği, arandığı ve yeni davaların açıldığı ana arşiv ekranıdır.
|
||||||
|
|
||||||
|
### Butonlar ve İşlevler:
|
||||||
|
1. **`DOSYA VEYA TARAF ARA...` Arama Girdisi:**
|
||||||
|
* Esas numarasına veya taraf isimlerine göre anlık Türkçe karakter duyarlı (`normalizeTr`) arama yapar.
|
||||||
|
* `✕` Butonu: Arama filtresini temizler.
|
||||||
|
2. **`Yeni Dosya (+)` Butonu:**
|
||||||
|
* Yeni Dava Dosyası Ekleme Modalı'nı açar.
|
||||||
|
* *Modal İçi Girdiler:* Dosya Adı / Esas No (Örn: `2024/145 E. Kozmos vs. Demirtaş`).
|
||||||
|
* *Modal Butonları:* "İptal" (kapatır), "Dosya Oluştur" (`POST /api/cases` çağırır ve listeyi günceller).
|
||||||
|
3. **Tablo Satırı:**
|
||||||
|
* Herhangi bir satıra tıklandığında o davanın kapsamlı `CaseDetail` görünümü açılır.
|
||||||
|
4. **`Sil (Çöp Kutusu)` Butonu:**
|
||||||
|
* Dava dosyasını, bağlı tüm evrakları, analizleri ve sohbet geçmişini kalıcı olarak silmek için onay diyaloğu (`useToast.confirm`) çıkarır ve onaylanırsa `DELETE /api/cases/:id` çağrısı yapar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.3. Dava Detay Paneli (12 Alt Modül)
|
||||||
|
|
||||||
|
Dava Detay görünümü, sol tarafta 3 ana grupta toplanmış 12 alt sekme içeren tam teşekküllü bir dava yönetim ve yapay zeka çalışma ortamıdır.
|
||||||
|
|
||||||
|
### Sol Navigasyon Grupları:
|
||||||
|
* **Dava Yönetimi:** Genel Bakış, Belgeler & Ekler, Dilekçeler, Duruşma & Süreler
|
||||||
|
* **Yapay Zeka & Analiz:** Yapay Zeka Özeti, Dosya Röntgeni, İfade & Çelişki Avcısı, Dava Stratejisi, Müzakere & Arabuluculuk
|
||||||
|
* **Asistan & Araçlar:** AyrisLegal'e Sor, Dijital Stajyer, Duruşma Simülatörü
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.1. Genel Bakış
|
||||||
|
* **`Dosyalara dön (←)` Butonu:** Dava arşiv listesine geri döner.
|
||||||
|
* **Esas No ve `ANALİZ EDİLDİ` Rozeti:** Dosya kimliğini gösterir.
|
||||||
|
* **4 Ana Hızlı Aksiyon Kartı:**
|
||||||
|
* `Duruşma Öncesi İncele` -> AI özetine yönlendirir.
|
||||||
|
* `Röntgen & Usul Taraması` -> Röntgen sekmesine aktarır.
|
||||||
|
* `Çapraz Sorgu & İfade Analizi` -> İfade & Çelişki sekmesine aktarır.
|
||||||
|
* `Dilekçe Hazırla` -> Dilekçeler sekmesine aktarır.
|
||||||
|
* **`Dijital Kenar Notu` Paneli:** Dosyaya ilişkin tespit edilen kritik uyarılar, süreler ve kanun maddeleri.
|
||||||
|
* **`Dosya İstatistikleri`:** Toplam taranan belge sayısı, OCR metin oranı ve dosya boyutu.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.2. Yapay Zeka Özeti
|
||||||
|
* **`Yeniden Analiz Et` Butonu:** Dosyadaki tüm güncel evrakları yeniden tarayarak yapay zeka özetleme motorunu (`POST /api/cases/:id/summarize`) tetikler.
|
||||||
|
* **İlerleme Günlüğü (Progress Log):** Evrakların okunması, kronolojik olay örgüsünün kurulması ve delil haritasının çıkarılması adımlarını canlı loglar.
|
||||||
|
* **Rapor Çıktısı (Markdown):**
|
||||||
|
* *Taraflar ve Talepler:* Davacı, davalı, vekiller ve netice-i talep dökümü.
|
||||||
|
* *Kronolojik Olay Örgüsü:* Olayların tarih sırasına göre gelişimi.
|
||||||
|
* *Hukuki Nitelendirme & Kanun Maddeleri:* İlgili mevzuat hükümleri.
|
||||||
|
* *Deliller & İspat Durumu:* Mevcut delillerin hukuki kuvveti.
|
||||||
|
* *Hukuki Riskler ve Tavsiyeler:* Dava sürecindeki muhtemel riskler.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.3. Dosya Röntgeni (Usul & Eksiklik Taraması)
|
||||||
|
* **`Dosya Röntgenini Çek` Butonu:** HMK / CMK usul hükümlerine göre davanın usul röntgenini başlatır (`POST /api/cases/:id/deficiency-analysis`).
|
||||||
|
* **Çıktı Kartları:**
|
||||||
|
* *Mevcut Yargılama Aşaması:* (Örn: Dilekçeler Teatisi, Ön İnceleme, Tahkikat, Hüküm).
|
||||||
|
* *Eksiklikler & Usul Hataları:* Tebligat eksiklikleri, harç tamamlama ihtarları, bilirkişi itiraz süreleri (Aciliyet derecesine göre: Yüksek/Kırmızı, Orta/Sarı, Düşük/Mavi).
|
||||||
|
* *Tamamlanan Usul Adımları:* Yeşil onay işaretli tamamlanmış aşamalar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.4. İfade & Çelişki Avcısı (Çapraz Sorgu)
|
||||||
|
* **`İfadeleri Getir (Önizleme)` Butonu:** Dosya içerisindeki şüpheli, sanık, müşteki, mağdur ve tanık beyanlarını içeren evrakları tespit edip listeler.
|
||||||
|
* **`Çelişkileri ve İfadeleri Analiz Et` Butonu:** Seçilen ifade evraklarını karşılaştırmalı analiz motoruna gönderir (`POST /api/cases/:id/statement-analysis`).
|
||||||
|
* **Çıktı Analizi:**
|
||||||
|
* Kişi bazında kimlik ve rol (Örn: Sanık A, Tanık B).
|
||||||
|
* Farklı aşamalardaki beyanların özeti (Kolluk, Savcılık, Sorgu Hakimliği, Mahkeme Duruşması).
|
||||||
|
* **Tespit Edilen Çelişkiler:** İfadeler arasındaki zaman, yer, eylem tutarsızlıkları ve çapraz sorguda sorulması gereken kilit sorular.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.5. Dava Stratejisi & Kazanma Planı
|
||||||
|
* **Müvekkil Adı / Taraf Seçimi:** Stratejinin hangi müvekkil adına kurulacağını belirler.
|
||||||
|
* **`Strateji Analizini Başlat` Butonu:** Kapsamlı dava kazanma planını üretir (`POST /api/cases/:id/strategy-analysis`).
|
||||||
|
* **Çıktı Bölümleri:**
|
||||||
|
* *Temel Hedef ve Rol:* Müvekkilin savunma veya alacak hedefi.
|
||||||
|
* *Ana Strateji & Kazanma Adımları:* Adım adım izlenecek yol haritası.
|
||||||
|
* *Lehe Hukuki Dayanaklar & Yargıtay Kararları:* Davayı destekleyen kanun maddeleri ve içtihatlar.
|
||||||
|
* *Zayıf Yönler & Karşı Tarafın İtiraz İhtimalleri:* Savunmadaki açık noktalar.
|
||||||
|
* *Gerekli Deliller & Karşı Hamleler:* Mahkemeden istenmesi gereken müzekkereler ve delil toplama talepleri.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.6. Müzakere & Arabuluculuk Simülatörü
|
||||||
|
* **`Kazanma İhtimali ve Tazminat Aralığını Hesapla` Butonu:** Dava riskini ve tahmini mali sonucu modeller (`POST /api/cases/:id/mediation-analysis`).
|
||||||
|
* **Çıktı Göstergeleri:**
|
||||||
|
* *Kazanma Olasılığı Yüzdesi:* (Örn: `%75 - %85`).
|
||||||
|
* *Tahmini Tazminat / Kazanım Aralığı:* Minimum, Maksimum ve En Olası Tutar (TL) + Güven Skoru.
|
||||||
|
* *Masadan Kalkış Noktası (Walk-Away Point):* Kabul edilmemesi gereken alt sınır.
|
||||||
|
* *Önerilen Teklif Stratejisi:* Arabuluculuk masasında sunulacak ilk teklif ve müzakere adımları.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.7. Belgeler & Ekler (OCR, Filtreleme, Detay)
|
||||||
|
* **`Akıllı Görünüm (Filtre)` Butonu:** Tebligat mazbataları, tahsilat makbuzları ve harç pulları gibi tali evrakları gizleyerek sadece ana dilekçe, rapor ve zabıtları gösterir.
|
||||||
|
* **`Sıralama Seçici`:** Tarihe Göre (Yeniden Eskiye / Eskiden Yeniye), İsim Sırasına Göre, Kategoriye Göre.
|
||||||
|
* **`Yeniden Tara / İçe Aktar` Butonları:** Yerel klasördeki yeni eklenen UDF/PDF dosyalarını içe aktarır.
|
||||||
|
* **Belge Önizleme & OCR Detay Modalı:**
|
||||||
|
* Belgenin tam OCR metnini görüntüler.
|
||||||
|
* "Metni Kopyala" butonu ile panoya alır.
|
||||||
|
* Belgeye özel yapay zeka özetini gösterir.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.8. Dilekçeler (Taslak Yönetimi)
|
||||||
|
* **`Yeni Dilekçe Oluştur` Butonu:** Dilekçe Stüdyosunu bu dosya bağlamında açar.
|
||||||
|
* **Hızlı Şablon Butonları:** *Cevap Dilekçesi, Beyan Dilekçesi, İstinaf Başvuru Dilekçesi, Bilirkişi İtiraz Dilekçesi*.
|
||||||
|
* **Kayıtlı Taslaklar Listesi:**
|
||||||
|
* **Düzenle:** Tiptap editöründe açar.
|
||||||
|
* **UDF İndir:** UYAP Doküman Editörü formatında indirir.
|
||||||
|
* **Word (DOCX) İndir:** Düzenlenebilir Word formatında indirir.
|
||||||
|
* **PDF İndir:** A4 standartlarında çıktısını alır.
|
||||||
|
* **Sil:** Taslağı siler.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.9. Duruşma & Süreler (Dosya Takvimi)
|
||||||
|
* Dosyaya özel duruşma günlerini, kesin süreleri ve ara karar tarihlerini gösterir.
|
||||||
|
* "Yeni Etkinlik Ekle" butonu ile bu dosyaya bağlı duruşma veya hatırlatma kaydı oluşturur.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.10. AyrisLegal'e Sor (CaseChat - Dosya İçi RAG)
|
||||||
|
* Sadece bu dava dosyasındaki tüm evraklar, bilirkişi raporları ve zabıtlar üzerinde semantik arama yaparak soruları yanıtlar.
|
||||||
|
* **`Geçmişi Temizle` Butonu:** Dosya sohbet geçmişini sıfırlar.
|
||||||
|
* **Örnek Soru Önerileri:**
|
||||||
|
* "Bilirkişi raporunda hesaplanan asıl alacak ve faiz tutarı nedir?"
|
||||||
|
* "Davacı tanığı olay anı hakkında ne ifade vermiştir?"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.11. Dijital Stajyer (Canlı Duruşma Nokta Atışı)
|
||||||
|
Duruşma esnasında avukatın saniyeler içinde dosya evraklarından net tarih, saat, sayfa ve alıntı çekmesini sağlayan ultra-hızlı duruşma asistanıdır.
|
||||||
|
|
||||||
|
* **Hazır Nokta Atışı Butonları:**
|
||||||
|
* 🏥 *Hastane ve adli tıp raporu hangi tarihteydi?*
|
||||||
|
* 📜 *Sanığın kolluktaki ifadesi saat kaçta alınmış?*
|
||||||
|
* 🚗 *Olay yeri inceleme raporunda ne yazıyor?*
|
||||||
|
* 📞 *HTS & Baz istasyonu kayıt tarihleri nelerdir?*
|
||||||
|
* ⚖️ *Görgü tanıklarının beyanlarındaki tarihler?*
|
||||||
|
* 📋 *İddianamede geçen ilk sevk maddesi nedir?*
|
||||||
|
* **Çıktı Kartı Yapısı:**
|
||||||
|
* 📌 `NOKTA ATIŞI DURUŞMA YANITI`
|
||||||
|
* 📅 Tarih / Saat bilgisi
|
||||||
|
* 📄 İlgili Evrak Adı ve Sayfa No
|
||||||
|
* 🟢 Güven Skoru (`%95+`)
|
||||||
|
* 💬 İlgili metinden doğrudan tırnak içi alıntı
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.3.12. Duruşma Simülatörü (Hakim / Karşı Taraf)
|
||||||
|
Duruşmaya girmeden önce savunmanın açıklarını test etmek için geliştirilmiş rol yapma simülatörüdür.
|
||||||
|
|
||||||
|
* **Persona Seçim Butonları:**
|
||||||
|
* `⚖️ Hakim Rolü`: Usul kurallarına, kesin sürelere ve ispat yüküne odaklanır, avukatı çapraz sorguya çeker.
|
||||||
|
* `💼 Karşı Taraf Avukatı Rolü`: Dilekçedeki en zayıf noktaları, çelişkileri ve zamanaşımı açıklarını yüzünüze vurur.
|
||||||
|
* **Hızlı Başlatıcılar:**
|
||||||
|
* "Hakimim, Duruşma Açıldı: Sorguyu Başlat"
|
||||||
|
* "Usul ve İspat Yükü Açısından Çapraz Sorgula"
|
||||||
|
* "Karşı Taraf Ol: Savunmamın Açıklarını Bul"
|
||||||
|
* "Çelişkileri Ve Zayıf Karnı Yüzüme Vur"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.4. İçtihat ve Mevzuat Arama
|
||||||
|
|
||||||
|
### 3.4.1. Emsal İçtihatlar (18M+ Yargıtay, Danıştay, AYM, BAM)
|
||||||
|
* **Arama Çubuğu:** Dava konusu, kavram veya anahtar kelimelerle arama yapar.
|
||||||
|
* **Mahkeme Seçim Filtreleri (Checklist):**
|
||||||
|
* *Yargıtay, Danıştay, Anayasa Mahkemesi (AYM), İstinaf (BAM), Yerel Mahkemeler, Uyuşmazlık Mahkemesi, Sayıştay, Kanun Yararına Bozma (KYB), GİB Özelgeleri, KİK, KVKK, Rekabet Kurumu, BDDK, BTK, Sigorta Tahkim, UYAP Emsaller*.
|
||||||
|
* **Popüler Arama Önerileri:**
|
||||||
|
* *Kıdem & İhbar Tazminatında İspat Yükü*
|
||||||
|
* *Kiralananın Tahliyesi (Konut İhtiyacı)*
|
||||||
|
* *Trafik Kazası Araç Değer Kaybı*
|
||||||
|
* *İşe İade Davası & Geçersiz Fesih*
|
||||||
|
* **Sonuç Listesi & Detay Görüntüleyici:**
|
||||||
|
* Daire, Esas No, Karar No, Karar Tarihi ve Karar Özeti.
|
||||||
|
* Karara tıklandığında sağ panelde tam metin açılır.
|
||||||
|
* **"Metni Kopyala" Butonu:** Karar metnini panoya kopyalar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.4.2. Mevzuat & Kanun Maddeleri (26.900+ Madde & Çevrimdışı Depo)
|
||||||
|
* **Popüler Kanun Hızlı Seçim Butonları:**
|
||||||
|
* `HMK (6100)`, `TCK (5237)`, `CMK (5271)`, `TMK (4721)`, `TBK (6098)`, `İİK (2004)`, `İYUK (2577)`, `İŞK (4857)`, `TTK (6102)`.
|
||||||
|
* **Madde No Filtresi:** Doğrudan madde numarası girilerek anında ilgili maddeye gider.
|
||||||
|
* **Metin İçi Arama:** Kanun maddelerinin içeriğinde arama yapar.
|
||||||
|
* **Çevrimdışı Mod:** İnternet bağlantısı olmasa dahi daha önce açılan maddeleri yerel depodan anında getirir.
|
||||||
|
* **"Bu Maddeye İlişkin İçtihat Ara" Butonu:** Tek tıkla ilgili kanun maddesini emsal içtihat motorunda aratır.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.5. Dilekçe Hazırlama Stüdyosu (Drafting Studio)
|
||||||
|
|
||||||
|
Profesyonel, mevzuata ve Yargıtay standartlarına tam uyumlu dilekçelerin üretildiği ve düzenlendiği ortamdır.
|
||||||
|
|
||||||
|
### 3.5.1. Kategori & Dilekçe Türü Seçimi
|
||||||
|
* **10 Ana Hukuk Kategorisi:**
|
||||||
|
1. Hukuk Yargılaması (HMK)
|
||||||
|
2. Ceza Yargılaması (CMK & TCK)
|
||||||
|
3. İcra ve İflas Hukuku (İİK)
|
||||||
|
4. İdare ve Vergi Yargılaması (İYUK)
|
||||||
|
5. İş ve Sosyal Güvenlik Hukuku
|
||||||
|
6. Aile ve Kişiler Hukuku (TMK)
|
||||||
|
7. Ticaret, Şirketler ve Tüketici Hukuku
|
||||||
|
8. Gayrimenkul ve Eşya Hukuku (TBK)
|
||||||
|
9. Anayasa Mahkemesi ve Uluslararası Yargı (AYM / AİHM)
|
||||||
|
10. Genel Usul, Kalem ve Duruşma Talepleri
|
||||||
|
* **50+ Dilekçe Türü Kataloğu:** Dava dilekçesi, cevap, replik, düplik, istinaf, temyiz, ihtiyati tedbir, suç duyurusu, KYOK itiraz, tutukluluğa itiraz, ödeme emrine itiraz, menfi tespit, yürütmeyi durdurma, işe iade, anlaşmalı boşanma protokolü, tahliye davası vb.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.5.2. Yapay Zeka Dilekçe Oluşturma Akışı
|
||||||
|
* **Dava Dosyası Seçimi:** Dilekçenin hangi davanın delil ve taraf verileriyle besleneceğini belirler.
|
||||||
|
* **Büro Şablonu Seçimi (Opsiyonel):** Büroya ait özel bir şablon formatı kullanılmak istenirse seçilir.
|
||||||
|
* **Avukatın Notları & Özel Talepleri:** Özel talepler, talep edilen tazminat miktarı, faiz türü vb.
|
||||||
|
* **`Dilekçe Taslağı Üret (⚡)` Butonu:** Yapay zeka motorunu çalıştırır ve Tiptap editörüne yapılandırılmış dilekçeyi akıtır.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.5.3. Tiptap Zengin Metin Editörü & Araç Çubuğu
|
||||||
|
* **Metin Stilleri:** Kalın (`Ctrl+B`), İtalik (`Ctrl+I`), Altı Çizili (`Ctrl+U`), Üstü Çizili.
|
||||||
|
* **Başlıklar:** Başlık 1 (Mahkeme Başlığı), Başlık 2 (Bölüm Başlıkları), Paragraf.
|
||||||
|
* **Hizalama:** Sola Hizala, Ortala (Mahkeme Başlığı için), Sağa Hizala, İki Yana Yasla (Resmi dilekçe gövdesi için).
|
||||||
|
* **Listeler:** Sırasız Liste (Madde İmleri), Numaralı Liste (Sıralı Deliller).
|
||||||
|
* **Alıntı Bloğu (Quote):** Yargıtay emsal kararlarını ve tanık beyanlarını kutu içine almak için.
|
||||||
|
* **Geri Al / Yinele:** `Undo` / `Redo`.
|
||||||
|
* **Biçimlendirmeyi Temizle:** Yapıştırılan metinlerdeki bozuk stilleri sıfırlar.
|
||||||
|
* **`📚 Kanun Maddesi Ekle` Butonu:** Mevzuat ekleme modalını açar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.5.4. Kanun Maddesi Ekleme Modalı
|
||||||
|
* Editörün araç çubuğundaki "Kanun Maddesi Ekle" butonuna basıldığında açılır.
|
||||||
|
* Kanun (HMK, TCK, TBK vb.) ve Madde No seçilir.
|
||||||
|
* "Dilekçeye Ekle" butonuna basıldığında, ilgili kanun maddesi imlecin bulunduğu yere otomatik olarak yasal formatta eklenir.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3.5.5. Dışa Aktarma: UDF, Word (DOCX), PDF
|
||||||
|
* **`UYAP (.udf) İndir`:** UYAP Doküman Editöründe doğrudan açılan, imzalanmaya hazır orijinal `.udf` dosyası üretir.
|
||||||
|
* **`Word (.docx) İndir`:** Kenar boşlukları ve yazı tipleri ayarlanmış Word dosyası üretir.
|
||||||
|
* **`PDF (.pdf) İndir`:** Doğrudan yazdırmaya ve müvekkile sunmaya hazır PDF oluşturur.
|
||||||
|
* **`Taslağı Kaydet` Butonu:** Üzerinde çalışılan metni davanın dilekçeler havuzuna kalıcı olarak kaydeder.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.6. Duruşma Takvimi (Calendar)
|
||||||
|
|
||||||
|
* **Görünüm Seçicileri:** `Ay`, `Hafta`, `Liste`.
|
||||||
|
* **Otomatik UYAP Duruşma Senkronizasyonu:** UYAP eklentisinden çekilen duruşmalar otomatik olarak takvime işlenir.
|
||||||
|
* **`Yeni Etkinlik Ekle (+)` Butonu:**
|
||||||
|
* Başlık, Tür (*Duruşma, Görüşme, Süre/Son Gün*), Tarih/Saat, Konum/Mahkeme.
|
||||||
|
* **Etkinlik Detay Modalı & Dışa Aktarma:**
|
||||||
|
* **Google Calendar'a Ekle:** Tek tıkla Google Takvim etkinliği oluşturur.
|
||||||
|
* **Apple / Outlook (.ics) İndir:** Takvim dosyası indirerek yerel takvimle eşitler.
|
||||||
|
* **Sil Butonu:** Etkinliği takvimden kaldırır.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.7. Belge & Dilekçe Şablonları (Templates)
|
||||||
|
|
||||||
|
Büronun sık kullandığı sözleşmeler, ihtarnameler, protokoller ve vekaletnameleri yönettiği şablon havuzudur.
|
||||||
|
|
||||||
|
* **Kategori Filtreleri:** *Tümü, Dava Dilekçeleri, Sözleşmeler, İhtarnameler, İcra Belgeleri, Protokoller*.
|
||||||
|
* **Arama Kutusu:** Şablon adı veya açıklamasında arama yapar.
|
||||||
|
* **`Yeni Şablon Yükle` Butonu:**
|
||||||
|
* Şablon Adı, Kategori, Açıklama ve Dosya Yükleme (PDF, DOCX, TXT, UDF).
|
||||||
|
* Yüklenen dosyanın metni OCR ile çıkarılarak AI dilekçe motorunun kullanımına sunulur.
|
||||||
|
* **Şablon Kartı Butonları:**
|
||||||
|
* *İncele & Düzenle:* Şablon metnini görüntüleme ve güncelleme.
|
||||||
|
* *Metni Kopyala:* Panoya alma.
|
||||||
|
* *İndir:* Orijinal dosyayı indirme.
|
||||||
|
* *Sil:* Şablonu arşivden kaldırma.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.8. Müvekkiller & Cari Bakiye Takibi (Clients)
|
||||||
|
|
||||||
|
Müvekkil portföyünün ve büro mali hareketlerinin yönetildiği CRM ve cari hesap modülüdür.
|
||||||
|
|
||||||
|
* **Tür Filtresi:** `Tümü`, `Kurumsal`, `Bireysel`.
|
||||||
|
* **Arama Kutusu:** Müvekkil adı veya notlarında anında filtreleme yapar.
|
||||||
|
* **`Yeni Müvekkil Ekle` Butonu:** Ad/Soyad/Unvan, Tür (Bireysel/Kurumsal), Özel Notlar.
|
||||||
|
* **Müvekkil Detay Görünümü (`ClientDetail`):**
|
||||||
|
* **Notlar Alanı:** Müvekkile özel notlar ve "Notu Kaydet" butonu.
|
||||||
|
* **Bakiye Kartı:** Toplam Alacak, Tahsil Edilen Ödeme ve Güncel Bakiye (TL).
|
||||||
|
* **Yeni Cari Hareket Formu:** Tarih, Tür (*Alacak / Hizmet Bedeli* veya *Ödeme / Tahsilat*), Tutar (₺), Açıklama ve "+ Ekle" butonu.
|
||||||
|
* **Cari Hareketler Tablosu:** Tüm finansal hareketlerin dökümü ve silme butonu.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.9. Global Hukuk Asistanı (Sohbet / Chat)
|
||||||
|
|
||||||
|
Genel hukuki araştırmalar, mevzuat yorumları, doküman incelemeleri ve beyin fırtınası için kullanılan çoklu oturumlu AI asistanıdır.
|
||||||
|
|
||||||
|
* **Sol Panel - Sohbet Oturumları (Threads):**
|
||||||
|
* `+ Yeni Sohbet` Butonu: Temiz bir yapay zeka oturumu başlatır.
|
||||||
|
* Sohbet Listesi: Geçmiş konulara göre isimlendirilmiş oturumlar ve her oturumun silme (`Çöp Kutusu`) butonu.
|
||||||
|
* **Dosya Eki Yükleme (`Ataş` İkonu):**
|
||||||
|
* PDF, Word veya metin belgesi yükleyerek dosya üzerinde anlık analiz isteme.
|
||||||
|
* **Öneri Kartları (Hızlı Başlatıcılar):**
|
||||||
|
* 📄 *Dilekçe Taslağı Oluştur*
|
||||||
|
* 🔍 *İçtihat Araştır*
|
||||||
|
* 📋 *Belge Analizi*
|
||||||
|
* ⚖️ *Hukuki Değerlendirme*
|
||||||
|
* **Girdi Alanı ve `Gönder` Butonu:**
|
||||||
|
* Enter tuşu ile gönderir (Shift+Enter yeni satır).
|
||||||
|
* AI yanıtları gerçek zamanlı akış (streaming) ile ekrana yansır.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3.10. Ayarlar (Settings)
|
||||||
|
|
||||||
|
7 alt kategoriden oluşan sistem yapılandırma merkezidir:
|
||||||
|
|
||||||
|
### 3.10.1. Kullanıcı Profili & Şifre Değiştirme
|
||||||
|
* Ad-Soyad, Baro Adı, Baro Sicil No güncelleme ve "Profili Kaydet" butonu.
|
||||||
|
* Yeni Şifre ve Şifre Tekrarı alanları ile "Şifreyi Değiştir" butonu.
|
||||||
|
|
||||||
|
### 3.10.2. Abonelik & Lisans Yönetimi
|
||||||
|
* Lisans Durumu (*Aktif, Deneme, Süresi Doldu*), Bitiş Tarihi ve Maksimum Cihaz Sayısı göstergesi.
|
||||||
|
* "Lisansı Yenile / Yükselt" butonu.
|
||||||
|
|
||||||
|
### 3.10.3. Google Drive Otomatik Yedekleme & Geri Yükleme
|
||||||
|
* **Google Drive Bağlantısı:** "Google Drive'ı Bağla" butonu ile OAuth yetkilendirmesi.
|
||||||
|
* **Otomatik Yedekleme Servisi:** Belirlenen aralıklarla (Örn: her 15 dakikada bir) dava dosyalarını ve yerel SQLite verilerini şifreli olarak buluta yedekler.
|
||||||
|
* **"Şimdi Yedekle" Butonu:** Manuel tam yedekleme tetikler.
|
||||||
|
* **"Buluttan Geri Yükle" Butonu:** Yeni bir bilgisayara geçildiğinde tüm dava dosyalarını Drive'dan tek tıkla geri yükler.
|
||||||
|
|
||||||
|
### 3.10.4. Destek Talebi & Hata Bildirimi
|
||||||
|
* Destek Kategorisi: *Hata Bildirimi, Geri Bildirim, Soru, Diğer*.
|
||||||
|
* Konu, Mesaj ve Ekran Görüntüsü / Dosya Yükleme alanı.
|
||||||
|
* "Destek Talebini Gönder" butonu (Talepler anında teknik ekibin destek paneline iletilir).
|
||||||
|
* Geçmiş Destek Talepleri Listesi ve durum takibi.
|
||||||
|
|
||||||
|
### 3.10.5. Gizlilik, Güvenlik & Güvenli Mod (Safe Mode)
|
||||||
|
* **Otomatik Hata Raporlama (Crash Reporter):** Uygulama çökmelerinde anonim hata logu gönderme açma/kapama anahtarı.
|
||||||
|
* **Güvenli Mod (Safe Mode):** Ağır dosya yüklemelerinde veya bellek kısıtlarında eklentileri devre dışı bırakan kararlı mod.
|
||||||
|
|
||||||
|
### 3.10.6. Görünüm & Tema
|
||||||
|
* Koyu Tema (Cyber-Juris Dark) veya Aydınlık Tema seçimi.
|
||||||
|
|
||||||
|
### 3.10.7. Oturum Kapatma
|
||||||
|
* "Oturumu Kapat" butonu ile güvenli çıkış.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 4. Tüm Yapay Zeka Promptları & Sistem Motoru Mimarisi
|
||||||
|
|
||||||
|
AyrisLegal bünyesinde çalışan yapay zeka ajanlarının sistem talimatları Türk Hukuk terminolojisine ve yargılama usullerine göre özelleştirilmiştir:
|
||||||
|
|
||||||
|
### 1. Dava Özeti ve Olay Örgüsü Promptu:
|
||||||
|
> *"Sen Türk Hukukunda uzman kıdemli bir avukatsın. Sana verilen dava dosyası evraklarını incele; tarafları, dava konusunu, harca esas değeri, kronolojik olay örgüsünü, toplanan delillerin ispat gücünü, mevzuat maddelerini ve davanın hukuki risklerini maddeler halinde kapsamlı bir rapor olarak hazırla."*
|
||||||
|
|
||||||
|
### 2. Dosya Röntgeni & Usul Eksiklikleri Promptu:
|
||||||
|
> *"HMK ve CMK usul hükümlerine göre dava dosyasını tara. Tebligat usulsüzlükleri, kaçırılan hak düşürücü süreler, eksik harçlar, yerine getirilmemiş ara kararlar ve bilirkişi itiraz sürelerini aciliyet derecesiyle (Yüksek, Orta, Düşük) tespit et."*
|
||||||
|
|
||||||
|
### 3. İfade & Çelişki Avcısı Promptu:
|
||||||
|
> *"Dosyadaki şüpheli, sanık, mağdur ve tanık beyanlarını karşılaştır. Kişilerin kolluk, savcılık ve mahkeme aşamalarındaki ifadeleri arasındaki zaman, mekân ve eylem çelişkilerini çıkar. Çapraz sorguda yöneltilecek can alıcı soruları listele."*
|
||||||
|
|
||||||
|
### 4. Duruşma Simülatörü Promptu:
|
||||||
|
> *(Hakim Modu)*: *"Sen duruşmayı yöneten, usul ve ispat yükü kurallarına son derece katı bir Mahkeme Başkanısın. Avukatın iddia ve savunmalarını HMK/CMK çerçevesinde sorgula, delil açıklarını sor."*
|
||||||
|
> *(Karşı Taraf Modu)*: *"Sen karşı taraf vekilisin. Dilekçedeki zayıf noktaları, zamanaşımı itirazlarını ve çelişkileri agresif bir şekilde ileri sür."*
|
||||||
|
|
||||||
|
### 5. Dijital Stajyer Nokta Atışı Promptu:
|
||||||
|
> *"Duruşma salonundaki avukatın sorusuna saniyeler içinde cevap ver. Yanıtın başında net tarih/saat, ilgili evrak adı, güven skoru ve evraktan doğrudan yapılan tırnak içi alıntıyı JSON/nokta atışı formatında sun."*
|
||||||
|
|
||||||
|
### 6. Dilekçe Üretim Kataloğu Motoru:
|
||||||
|
> *Seçilen dilekçe türünün yasal dayanağını (Örn: HMK m. 119, HMK m. 129, CMK m. 268), mahkeme başlığını, zorunlu unsurlarını, delil listesini ve Netice-i Talep fıkrasını eksiksiz kurgulayan prompt şablonu.*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 5. UYAP Entegrasyonu, UDF Formatı ve Masaüstü Köprüsü
|
||||||
|
|
||||||
|
* **UYAP Eklentisi (Chrome Extension):**
|
||||||
|
* UYAP Avukat Portalında açık olan dosyanın safahatını, evrak listesini ve duruşma günlerini tek tıkla yakalar.
|
||||||
|
* Yerel köprü sunucusu (`127.0.0.1:49152+`) üzerinden Electron ana sürecine veri aktarır.
|
||||||
|
* **UDF Ayrıştırıcı ve Üretici (`parseUdf.js` / `generateUdf.js`):**
|
||||||
|
* Adalet Bakanlığı UYAP Doküman Editörü XML/ZIP formatını yerel olarak çözer ve metin katmanını çıkarır.
|
||||||
|
* Tiptap editöründe yazılan dilekçeleri doğrudan UYAP uyumlu `.udf` dosyasına dönüştürür.
|
||||||
|
* **Yerel OCR & Metin Çıkarma (`extractText.js`):**
|
||||||
|
* Taranmış PDF ve resim evraklarını yerel Tesseract / PDF.js motorlarıyla işleyerek aranabilir metne dönüştürür.
|
||||||
|
* **Çevrimdışı SQLite Deposu (`localDb.js` / `localDataStore.js`):**
|
||||||
|
* Dava evraklarını ve mevzuat maddelerini yerel veritabanında saklayarak internet kesintilerinde bile anında erişim sağlar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Belge Sürümü: v2.4.0 — AyrisLegal LawOS Desktop*
|
||||||
Generated
+9
-10
@@ -2311,14 +2311,14 @@
|
|||||||
"version": "5.22.0",
|
"version": "5.22.0",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz",
|
||||||
"integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==",
|
"integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/@prisma/engines": {
|
"node_modules/@prisma/engines": {
|
||||||
"version": "5.22.0",
|
"version": "5.22.0",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz",
|
||||||
"integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==",
|
"integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -2332,14 +2332,14 @@
|
|||||||
"version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2",
|
"version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz",
|
||||||
"integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==",
|
"integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/@prisma/fetch-engine": {
|
"node_modules/@prisma/fetch-engine": {
|
||||||
"version": "5.22.0",
|
"version": "5.22.0",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz",
|
||||||
"integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==",
|
"integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/debug": "5.22.0",
|
"@prisma/debug": "5.22.0",
|
||||||
@@ -2351,7 +2351,7 @@
|
|||||||
"version": "5.22.0",
|
"version": "5.22.0",
|
||||||
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz",
|
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz",
|
||||||
"integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==",
|
"integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/debug": "5.22.0"
|
"@prisma/debug": "5.22.0"
|
||||||
@@ -3026,7 +3026,7 @@
|
|||||||
"version": "19.2.17",
|
"version": "19.2.17",
|
||||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz",
|
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz",
|
||||||
"integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==",
|
"integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"csstype": "^3.2.2"
|
"csstype": "^3.2.2"
|
||||||
@@ -4526,7 +4526,7 @@
|
|||||||
"version": "3.2.3",
|
"version": "3.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
|
||||||
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
|
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/damerau-levenshtein": {
|
"node_modules/damerau-levenshtein": {
|
||||||
@@ -5905,7 +5905,6 @@
|
|||||||
"version": "2.3.3",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||||
"dev": true,
|
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
@@ -8649,7 +8648,7 @@
|
|||||||
"version": "5.22.0",
|
"version": "5.22.0",
|
||||||
"resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz",
|
"resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz",
|
||||||
"integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==",
|
"integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -10076,7 +10075,7 @@
|
|||||||
"version": "5.9.3",
|
"version": "5.9.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
||||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||||
"dev": true,
|
"devOptional": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsc": "bin/tsc",
|
"tsc": "bin/tsc",
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 521 KiB |
Reference in New Issue
Block a user