style(design): FINDING-004 — htmx vendorizat local, nu din CDN (offline-first)
Dashboard-ul incarca htmx din unpkg.com. Gateway-ul ruleaza offline (LXC/VPS + Cloudflare Tunnel); cand CDN-ul e blocat/inaccesibil, htmx nu se incarca si dashboard-ul ramane static: zero polling (banner alerta blocate, coada, mapari), butoanele de mapare nu trimit. Aceeasi decizie offline-first ca fontul UI (FINDING-002, fara dependinta CDN). Fix: vendorizez htmx.org@1.9.12 minificat in app/web/static/, montez StaticFiles la /static in main.py, base.html refera /static/htmx.min.js. Verificat live: window.htmx.version=1.9.12, fragment polls 200, zero regresie vizuala. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -10,10 +10,12 @@ from __future__ import annotations
|
|||||||
|
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from fastapi import FastAPI, Request
|
from fastapi import FastAPI, Request
|
||||||
from fastapi.exceptions import RequestValidationError
|
from fastapi.exceptions import RequestValidationError
|
||||||
from fastapi.responses import JSONResponse, PlainTextResponse
|
from fastapi.responses import JSONResponse, PlainTextResponse
|
||||||
|
from fastapi.staticfiles import StaticFiles
|
||||||
|
|
||||||
from . import __version__
|
from . import __version__
|
||||||
from .api.v1.router import router as api_v1_router
|
from .api.v1.router import router as api_v1_router
|
||||||
@@ -46,6 +48,13 @@ async def validation_exception_handler(request: Request, exc: RequestValidationE
|
|||||||
return JSONResponse(status_code=422, content={"detail": cleaned})
|
return JSONResponse(status_code=422, content={"detail": cleaned})
|
||||||
|
|
||||||
|
|
||||||
|
# Assets servite local (htmx vendorizat), NU din CDN: gateway-ul ruleaza
|
||||||
|
# offline (LXC/VPS, Cloudflare Tunnel). Fara asta, dashboard-ul ramane static
|
||||||
|
# (zero polling banner/coada) cand unpkg e blocat/inaccesibil. Aceeasi decizie
|
||||||
|
# offline-first ca fontul UI (fara dependinta CDN).
|
||||||
|
_STATIC_DIR = Path(__file__).resolve().parent / "web" / "static"
|
||||||
|
app.mount("/static", StaticFiles(directory=str(_STATIC_DIR)), name="static")
|
||||||
|
|
||||||
app.include_router(api_v1_router)
|
app.include_router(api_v1_router)
|
||||||
app.include_router(web_router)
|
app.include_router(web_router)
|
||||||
|
|
||||||
|
|||||||
1
app/web/static/htmx.min.js
vendored
Normal file
1
app/web/static/htmx.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -4,7 +4,7 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>{% block title %}Gateway RAR AUTOPASS{% endblock %}</title>
|
<title>{% block title %}Gateway RAR AUTOPASS{% endblock %}</title>
|
||||||
<script src="https://unpkg.com/htmx.org@1.9.12"></script>
|
<script src="/static/htmx.min.js"></script>
|
||||||
<style>
|
<style>
|
||||||
:root { --bg:#0f1115; --card:#181b22; --ink:#e6e9ef; --muted:#8b93a7; --line:#262b36;
|
:root { --bg:#0f1115; --card:#181b22; --ink:#e6e9ef; --muted:#8b93a7; --line:#262b36;
|
||||||
--ok:#3ecf8e; --warn:#e6b34a; --err:#e5605e; --accent:#5b8def; }
|
--ok:#3ecf8e; --warn:#e6b34a; --err:#e5605e; --accent:#5b8def; }
|
||||||
|
|||||||
Reference in New Issue
Block a user