Remove legacy vanilla frontend, clarify web/ vs web-ui/ in CLAUDE.md
- Delete web/static/index.html and design-system.css (replaced by Next.js) - Remove GET / HTML route and StaticFiles import from app.py - CLAUDE.md: document that web/ = FastAPI API, web-ui/ = Next.js frontend Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -84,7 +84,12 @@
|
|||||||
│ ├── training/ ← 4 החלטות לאימון (DOCX)
|
│ ├── training/ ← 4 החלטות לאימון (DOCX)
|
||||||
│ ├── exports/ ← טיוטות DOCX מיוצאות
|
│ ├── exports/ ← טיוטות DOCX מיוצאות
|
||||||
│ └── cases/{case-number}/ ← תיקי עררים (מבנה שטוח, סטטוס ב-DB)
|
│ └── cases/{case-number}/ ← תיקי עררים (מבנה שטוח, סטטוס ב-DB)
|
||||||
├── web/ ← UI + API + integration clients
|
├── web/ ← FastAPI backend (Python): 75 API endpoints
|
||||||
|
│ ├── app.py ← API ראשי
|
||||||
|
│ ├── paperclip_client.py ← אינטגרציית Paperclip
|
||||||
|
│ └── gitea_client.py ← אינטגרציית Gitea
|
||||||
|
├── web-ui/ ← Next.js frontend (TypeScript/React): ממשק המשתמש
|
||||||
|
│ └── next.config.ts ← proxy: /api/* → FastAPI :8000
|
||||||
├── mcp-server/ ← MCP server + services + tools
|
├── mcp-server/ ← MCP server + services + tools
|
||||||
└── scripts/ ← סקריפטים וכלי עזר (ראה scripts/SCRIPTS.md)
|
└── scripts/ ← סקריפטים וכלי עזר (ראה scripts/SCRIPTS.md)
|
||||||
└── .archive/ ← סקריפטים שהושלמו (לא להריץ)
|
└── .archive/ ← סקריפטים שהושלמו (לא להריץ)
|
||||||
|
|||||||
11
web/app.py
11
web/app.py
@@ -22,7 +22,6 @@ import zipfile
|
|||||||
|
|
||||||
from fastapi import FastAPI, File, Form, HTTPException, UploadFile
|
from fastapi import FastAPI, File, Form, HTTPException, UploadFile
|
||||||
from fastapi.responses import FileResponse, StreamingResponse
|
from fastapi.responses import FileResponse, StreamingResponse
|
||||||
from fastapi.staticfiles import StaticFiles
|
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
|
|
||||||
import asyncpg
|
import asyncpg
|
||||||
@@ -63,20 +62,12 @@ async def lifespan(app: FastAPI):
|
|||||||
|
|
||||||
app = FastAPI(title="העלאת מסמכים משפטיים", lifespan=lifespan)
|
app = FastAPI(title="העלאת מסמכים משפטיים", lifespan=lifespan)
|
||||||
|
|
||||||
STATIC_DIR = Path(__file__).parent / "static"
|
|
||||||
|
|
||||||
|
|
||||||
# ── API Endpoints ──────────────────────────────────────────────────
|
# ── API Endpoints ──────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
@app.get("/")
|
@app.get("/")
|
||||||
async def index():
|
async def index():
|
||||||
return FileResponse(STATIC_DIR / "index.html")
|
return {"status": "ok", "frontend": "https://legal-ai-next.nautilus.marcusgroup.org"}
|
||||||
|
|
||||||
|
|
||||||
@app.get("/design-system.css")
|
|
||||||
async def design_system_css():
|
|
||||||
return FileResponse(STATIC_DIR / "design-system.css", media_type="text/css")
|
|
||||||
|
|
||||||
|
|
||||||
@app.post("/api/upload")
|
@app.post("/api/upload")
|
||||||
|
|||||||
@@ -1,369 +0,0 @@
|
|||||||
/* ════════════════════════════════════════════════════════════
|
|
||||||
* Ezer Mishpati — Design System
|
|
||||||
* Editorial/Judicial aesthetic for a Hebrew RTL judicial tool.
|
|
||||||
*
|
|
||||||
* Typography: Frank Ruhl Libre (display) + Assistant (body)
|
|
||||||
* Palette: Navy #0f172a + Cream #f5f1e8 + Gold #a97d3a
|
|
||||||
* ════════════════════════════════════════════════════════════ */
|
|
||||||
|
|
||||||
@import url('https://fonts.googleapis.com/css2?family=Heebo:wght@300;400;500;600;700;800;900&display=swap');
|
|
||||||
|
|
||||||
:root {
|
|
||||||
/* ── Colors ─────────────────────────────────────────── */
|
|
||||||
--color-navy: #0f172a;
|
|
||||||
--color-navy-soft: #1e293b;
|
|
||||||
--color-navy-dim: #334155;
|
|
||||||
|
|
||||||
--color-cream: #f5f1e8;
|
|
||||||
--color-cream-deep: #ede8d8;
|
|
||||||
--color-parchment: #fbf8f0;
|
|
||||||
|
|
||||||
--color-gold: #a97d3a;
|
|
||||||
--color-gold-deep: #8b6428;
|
|
||||||
--color-gold-soft: #c89a56;
|
|
||||||
--color-gold-wash: #fdf6e8;
|
|
||||||
|
|
||||||
--color-ink: #1a1a2e;
|
|
||||||
--color-ink-soft: #3a3a52;
|
|
||||||
--color-ink-muted: #6b7280;
|
|
||||||
--color-ink-light: #9ca3af;
|
|
||||||
|
|
||||||
--color-rule: #e5dfd0; /* cream-toned hairline */
|
|
||||||
--color-rule-soft: #f0ead8;
|
|
||||||
|
|
||||||
--color-surface: #ffffff;
|
|
||||||
--color-surface-raised: #fbf8f0;
|
|
||||||
--color-bg: var(--color-cream);
|
|
||||||
|
|
||||||
/* Status colors — tuned to the palette */
|
|
||||||
--color-success: #4a7c59;
|
|
||||||
--color-success-bg: #e8efe7;
|
|
||||||
--color-warn: #b8894a;
|
|
||||||
--color-warn-bg: #faf0dc;
|
|
||||||
--color-danger: #a54242;
|
|
||||||
--color-danger-bg: #f5e6e6;
|
|
||||||
--color-info: #4e6a8c;
|
|
||||||
--color-info-bg: #e6ecf3;
|
|
||||||
|
|
||||||
/* ── Typography — Heebo (Google's primary Hebrew font) ─── */
|
|
||||||
--font-display: 'Heebo', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
||||||
--font-body: 'Heebo', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
||||||
--font-mono: ui-monospace, 'Cascadia Code', 'SF Mono', Menlo, monospace;
|
|
||||||
|
|
||||||
--text-xs: 0.75rem;
|
|
||||||
--text-sm: 0.85rem;
|
|
||||||
--text-base: 0.95rem;
|
|
||||||
--text-md: 1.05rem;
|
|
||||||
--text-lg: 1.2rem;
|
|
||||||
--text-xl: 1.45rem;
|
|
||||||
--text-2xl: 1.8rem;
|
|
||||||
--text-3xl: 2.3rem;
|
|
||||||
--text-4xl: 2.9rem;
|
|
||||||
|
|
||||||
--leading-tight: 1.25;
|
|
||||||
--leading-snug: 1.4;
|
|
||||||
--leading-body: 1.65;
|
|
||||||
--leading-prose: 1.8;
|
|
||||||
|
|
||||||
--weight-light: 300;
|
|
||||||
--weight-normal: 400;
|
|
||||||
--weight-medium: 500;
|
|
||||||
--weight-semi: 600;
|
|
||||||
--weight-bold: 700;
|
|
||||||
--weight-display: 900;
|
|
||||||
|
|
||||||
/* ── Spacing scale (8px grid) ───────────────────────── */
|
|
||||||
--space-1: 4px;
|
|
||||||
--space-2: 8px;
|
|
||||||
--space-3: 12px;
|
|
||||||
--space-4: 16px;
|
|
||||||
--space-5: 20px;
|
|
||||||
--space-6: 24px;
|
|
||||||
--space-7: 32px;
|
|
||||||
--space-8: 40px;
|
|
||||||
--space-9: 56px;
|
|
||||||
--space-10: 72px;
|
|
||||||
|
|
||||||
/* ── Radii ──────────────────────────────────────────── */
|
|
||||||
--radius-sm: 4px;
|
|
||||||
--radius: 6px;
|
|
||||||
--radius-md: 8px;
|
|
||||||
--radius-lg: 12px;
|
|
||||||
--radius-xl: 16px;
|
|
||||||
--radius-pill: 999px;
|
|
||||||
|
|
||||||
/* ── Shadows — soft, editorial ──────────────────────── */
|
|
||||||
--shadow-xs: 0 1px 2px rgba(15, 23, 42, 0.05);
|
|
||||||
--shadow-sm: 0 1px 3px rgba(15, 23, 42, 0.06), 0 1px 2px rgba(15, 23, 42, 0.04);
|
|
||||||
--shadow: 0 2px 6px rgba(15, 23, 42, 0.06), 0 1px 2px rgba(15, 23, 42, 0.04);
|
|
||||||
--shadow-md: 0 4px 12px rgba(15, 23, 42, 0.08), 0 2px 4px rgba(15, 23, 42, 0.04);
|
|
||||||
--shadow-lg: 0 10px 30px rgba(15, 23, 42, 0.12), 0 2px 6px rgba(15, 23, 42, 0.05);
|
|
||||||
--shadow-gold: 0 0 0 3px var(--color-gold-wash);
|
|
||||||
|
|
||||||
/* ── Transitions ────────────────────────────────────── */
|
|
||||||
--ease-out: cubic-bezier(0.16, 1, 0.3, 1);
|
|
||||||
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
|
|
||||||
--t-fast: 120ms var(--ease-out);
|
|
||||||
--t: 180ms var(--ease-out);
|
|
||||||
--t-slow: 280ms var(--ease-out);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Dark theme overrides ────────────────────────────── */
|
|
||||||
body.dark {
|
|
||||||
--color-navy: #f5f1e8;
|
|
||||||
--color-navy-soft: #e8e0c8;
|
|
||||||
--color-navy-dim: #c7bc9a;
|
|
||||||
|
|
||||||
--color-cream: #0a0f1c;
|
|
||||||
--color-cream-deep: #121a2e;
|
|
||||||
--color-parchment: #161f36;
|
|
||||||
|
|
||||||
--color-gold: #d4a55a;
|
|
||||||
--color-gold-deep: #e8bc6f;
|
|
||||||
--color-gold-soft: #c89a56;
|
|
||||||
--color-gold-wash: rgba(212, 165, 90, 0.08);
|
|
||||||
|
|
||||||
--color-ink: #f5f1e8;
|
|
||||||
--color-ink-soft: #d8d2c0;
|
|
||||||
--color-ink-muted: #9a9380;
|
|
||||||
--color-ink-light: #6a6458;
|
|
||||||
|
|
||||||
--color-rule: #2a3352;
|
|
||||||
--color-rule-soft: #1e2a45;
|
|
||||||
|
|
||||||
--color-surface: #141b2f;
|
|
||||||
--color-surface-raised: #1a2238;
|
|
||||||
--color-bg: #0a0f1c;
|
|
||||||
|
|
||||||
--color-success: #5a9a6a;
|
|
||||||
--color-success-bg: rgba(90, 154, 106, 0.12);
|
|
||||||
--color-warn: #c79956;
|
|
||||||
--color-warn-bg: rgba(199, 153, 86, 0.12);
|
|
||||||
--color-danger: #c16565;
|
|
||||||
--color-danger-bg: rgba(193, 101, 101, 0.12);
|
|
||||||
--color-info: #6d8bab;
|
|
||||||
--color-info-bg: rgba(109, 139, 171, 0.12);
|
|
||||||
|
|
||||||
--shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.3);
|
|
||||||
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.35), 0 1px 2px rgba(0, 0, 0, 0.25);
|
|
||||||
--shadow: 0 2px 6px rgba(0, 0, 0, 0.4), 0 1px 2px rgba(0, 0, 0, 0.25);
|
|
||||||
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.45), 0 2px 4px rgba(0, 0, 0, 0.25);
|
|
||||||
--shadow-lg: 0 10px 30px rgba(0, 0, 0, 0.5), 0 2px 6px rgba(0, 0, 0, 0.3);
|
|
||||||
}
|
|
||||||
|
|
||||||
body.dark header {
|
|
||||||
background: #060a18;
|
|
||||||
border-bottom-color: var(--color-gold);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Base overrides ──────────────────────────────────── */
|
|
||||||
|
|
||||||
html { font-size: 16px; }
|
|
||||||
|
|
||||||
body {
|
|
||||||
font-family: var(--font-body);
|
|
||||||
font-weight: var(--weight-normal);
|
|
||||||
font-size: var(--text-base);
|
|
||||||
line-height: var(--leading-body);
|
|
||||||
color: var(--color-ink);
|
|
||||||
background: var(--color-bg);
|
|
||||||
direction: rtl;
|
|
||||||
text-align: right;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
font-feature-settings: "kern", "liga", "clig", "calt";
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Display typography — serif for headings */
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
font-family: var(--font-display);
|
|
||||||
font-weight: var(--weight-bold);
|
|
||||||
line-height: var(--leading-tight);
|
|
||||||
color: var(--color-navy);
|
|
||||||
letter-spacing: -0.01em;
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 { font-size: var(--text-3xl); font-weight: var(--weight-display); }
|
|
||||||
h2 { font-size: var(--text-2xl); }
|
|
||||||
h3 { font-size: var(--text-xl); }
|
|
||||||
h4 { font-size: var(--text-lg); }
|
|
||||||
h5 { font-size: var(--text-md); }
|
|
||||||
h6 { font-size: var(--text-base); }
|
|
||||||
|
|
||||||
/* Prose paragraphs — justify both sides for Hebrew legal text */
|
|
||||||
p,
|
|
||||||
.prose {
|
|
||||||
text-align: justify;
|
|
||||||
text-justify: inter-word;
|
|
||||||
hyphens: auto;
|
|
||||||
line-height: var(--leading-body);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Text that should NOT justify (short labels, meta) */
|
|
||||||
.no-justify, .meta, .label, .caption,
|
|
||||||
th, td, button, input, select, label, nav {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Links */
|
|
||||||
a {
|
|
||||||
color: var(--color-gold-deep);
|
|
||||||
text-decoration: none;
|
|
||||||
transition: color var(--t-fast);
|
|
||||||
}
|
|
||||||
a:hover { color: var(--color-gold); }
|
|
||||||
|
|
||||||
/* Focus rings — gold, subtle */
|
|
||||||
*:focus-visible {
|
|
||||||
outline: 2px solid var(--color-gold);
|
|
||||||
outline-offset: 2px;
|
|
||||||
border-radius: var(--radius-sm);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Selection */
|
|
||||||
::selection {
|
|
||||||
background: var(--color-gold-wash);
|
|
||||||
color: var(--color-navy);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Utility classes ─────────────────────────────────── */
|
|
||||||
|
|
||||||
.text-display { font-family: var(--font-display); }
|
|
||||||
.text-body { font-family: var(--font-body); }
|
|
||||||
.text-mono { font-family: var(--font-mono); }
|
|
||||||
|
|
||||||
.text-xs { font-size: var(--text-xs); }
|
|
||||||
.text-sm { font-size: var(--text-sm); }
|
|
||||||
.text-base { font-size: var(--text-base); }
|
|
||||||
.text-md { font-size: var(--text-md); }
|
|
||||||
.text-lg { font-size: var(--text-lg); }
|
|
||||||
.text-xl { font-size: var(--text-xl); }
|
|
||||||
.text-2xl { font-size: var(--text-2xl); }
|
|
||||||
.text-3xl { font-size: var(--text-3xl); }
|
|
||||||
|
|
||||||
.text-muted { color: var(--color-ink-muted); }
|
|
||||||
.text-light { color: var(--color-ink-light); }
|
|
||||||
.text-gold { color: var(--color-gold-deep); }
|
|
||||||
.text-navy { color: var(--color-navy); }
|
|
||||||
|
|
||||||
.weight-light { font-weight: var(--weight-light); }
|
|
||||||
.weight-normal { font-weight: var(--weight-normal); }
|
|
||||||
.weight-medium { font-weight: var(--weight-medium); }
|
|
||||||
.weight-bold { font-weight: var(--weight-bold); }
|
|
||||||
|
|
||||||
.justify { text-align: justify; text-justify: inter-word; }
|
|
||||||
.start { text-align: right; } /* RTL start */
|
|
||||||
.end { text-align: left; } /* RTL end */
|
|
||||||
.center { text-align: center; }
|
|
||||||
|
|
||||||
.ornament {
|
|
||||||
display: block;
|
|
||||||
text-align: center;
|
|
||||||
color: var(--color-gold);
|
|
||||||
font-family: var(--font-display);
|
|
||||||
letter-spacing: 0.3em;
|
|
||||||
margin: var(--space-6) 0;
|
|
||||||
}
|
|
||||||
.ornament::before { content: "❦"; font-size: 1.3em; }
|
|
||||||
|
|
||||||
.divider {
|
|
||||||
border: 0;
|
|
||||||
height: 1px;
|
|
||||||
background: linear-gradient(
|
|
||||||
to left,
|
|
||||||
transparent 0%,
|
|
||||||
var(--color-rule) 20%,
|
|
||||||
var(--color-rule) 80%,
|
|
||||||
transparent 100%
|
|
||||||
);
|
|
||||||
margin: var(--space-6) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.divider-gold {
|
|
||||||
border: 0;
|
|
||||||
height: 2px;
|
|
||||||
background: linear-gradient(
|
|
||||||
to left,
|
|
||||||
transparent 0%,
|
|
||||||
var(--color-gold) 50%,
|
|
||||||
transparent 100%
|
|
||||||
);
|
|
||||||
margin: var(--space-6) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Loading skeleton ───────────────────────────────── */
|
|
||||||
.skeleton {
|
|
||||||
background: linear-gradient(
|
|
||||||
100deg,
|
|
||||||
var(--color-cream-deep) 30%,
|
|
||||||
var(--color-parchment) 50%,
|
|
||||||
var(--color-cream-deep) 70%
|
|
||||||
);
|
|
||||||
background-size: 200% 100%;
|
|
||||||
animation: skeleton-shimmer 1.4s linear infinite;
|
|
||||||
border-radius: var(--radius);
|
|
||||||
color: transparent;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
@keyframes skeleton-shimmer {
|
|
||||||
from { background-position: 100% 0; }
|
|
||||||
to { background-position: -100% 0; }
|
|
||||||
}
|
|
||||||
.skeleton-line {
|
|
||||||
height: 0.9em;
|
|
||||||
margin: 4px 0;
|
|
||||||
border-radius: var(--radius-sm);
|
|
||||||
}
|
|
||||||
.skeleton-line.short { width: 40%; }
|
|
||||||
.skeleton-line.medium { width: 70%; }
|
|
||||||
|
|
||||||
/* ── Print — optimized for Dafna printing the portrait ─ */
|
|
||||||
@media print {
|
|
||||||
:root {
|
|
||||||
--color-bg: #fff;
|
|
||||||
--color-surface: #fff;
|
|
||||||
--color-navy: #000;
|
|
||||||
--color-ink: #000;
|
|
||||||
--color-ink-muted: #444;
|
|
||||||
}
|
|
||||||
body { background: #fff; color: #000; font-size: 11pt; }
|
|
||||||
header, .status-bar, .process-panel, .toast, .btn, nav,
|
|
||||||
#navDiagnostics, .home-sidebar, .home-hero-actions,
|
|
||||||
#processPanel, #trainingAnalysisCard, #trainingTasksCard {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
.main { max-width: 100% !important; padding: 0 !important; }
|
|
||||||
.page { display: none !important; }
|
|
||||||
.page.active { display: block !important; }
|
|
||||||
.portrait-card, .card {
|
|
||||||
box-shadow: none !important;
|
|
||||||
border: 1px solid #ccc !important;
|
|
||||||
page-break-inside: avoid;
|
|
||||||
margin-bottom: 16px !important;
|
|
||||||
}
|
|
||||||
.portrait-headline {
|
|
||||||
background: #fafafa !important;
|
|
||||||
border-right: 3px solid #000 !important;
|
|
||||||
color: #000 !important;
|
|
||||||
}
|
|
||||||
h1, h2, h3 { color: #000 !important; page-break-after: avoid; }
|
|
||||||
.growth-curve, .donut, .hero-timeline { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
|
|
||||||
.phrase-filters, .btn, button { display: none !important; }
|
|
||||||
/* Force expand all details */
|
|
||||||
details { display: block !important; }
|
|
||||||
summary::marker, summary::-webkit-details-marker { display: none; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── Responsive (desktop-first, minimal mobile) ────── */
|
|
||||||
@media (max-width: 900px) {
|
|
||||||
.main { padding: var(--space-5) var(--space-4); }
|
|
||||||
header { padding: 14px 20px; flex-wrap: wrap; gap: 10px; }
|
|
||||||
header nav { gap: 2px; }
|
|
||||||
header nav a { padding: 6px 10px; font-size: 0.82em; }
|
|
||||||
.home-hero-title { font-size: 2em; }
|
|
||||||
.style-report-header h1 { font-size: 2em; }
|
|
||||||
.portrait-card { padding: var(--space-6) var(--space-5); }
|
|
||||||
.portrait-hero .hero-body { grid-template-columns: 1fr; }
|
|
||||||
.hero-donut-wrap { justify-content: center; }
|
|
||||||
.process-panel { width: 280px; }
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user