Files
rar-autopass/app/web/templates/_acasa.html
Claude Agent c9f9a1ca0e feat(5.16+5.17): tipografie/antet branded + tipuri cont, planuri si enforcement
PRD 5.16 — propagare design finalizata (system font stack, fara IBM Plex self-hostat):
- US-001/002/008: tokeni --font-ui/--font-mono (system stack) + scala --fs-*; zero
  @font-face si zero /static/fonts/; landing aliniat la acelasi stack
- US-003: RAR online = dot compact in antet + meniu burger; banda rosie DOAR pe blocat
  (invariant zero-silent-failures pastrat)
- US-010: antet "ROMFAST AUTOPASS" + nume service + /login brandeit 2 coloane + badge plan;
  meniu burger cu separatoare; gate strict pe is_authenticated
- US-011: selector tema pill icon+eticheta (reuse THEMES)
- US-004/005/006/007: bug-fix editor prestatii (picker cod+denumire, add_extra in mod
  operatii, cod ales se salveaza fara "+", Renunta inchide via closest)
- US-012/013: landing Autentificare->/login; wizard import colapsat + 4 pasi pe tokeni
- fix VERIFY E2E: contoare duplicate pe 390px (inline display:flex batea @media) -> CSS + test-lock

PRD 5.17 — tipuri de cont + trial Pro 30z + enforcement DUR:
- US-001/002/008: accounts.tier + trial_until (migrare aditiva defensiva); app/plans.py
  sursa unica (PLANS, FREE_MONTHLY_LIMIT=60, effective_tier(now injectabil), monthly_usage,
  CONSUMED_STATUSES); create_account trial Pro 30z; CLI set-tier (protejat id=1, audit)
- US-003/004/005: enforce volum 60/luna INAINTE de build_key pe ambele canale
  (PLAN_LIMITA_LUNARA, 3 niveluri + log_event); gate API Pro+ (PLAN_FARA_API 403 actionabil);
  valideaza/nomenclator raman permise; downgrade lazy; flag AUTOPASS_ENFORCE_PLANS (kill-switch)
- US-006: badge plan antet + linie burger + consum N/60 + warn>=80% + 6 stari + copy RO
  pluralizat + banner one-time trial->Gratuit + pagina Cont

Regresie: 1380 passed, 0 failed, 1 deselected (live). E2E browser pe 390/1280 confirmat.
Backend trimitere (worker/masina stari/idempotenta/contract RAR) NEATINS. Lucrul 5.18
(corpus kNN) ramane separat, necomis.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 06:02:40 +00:00

80 lines
3.6 KiB
HTML

<div id="acasa-section">
{# === Banner ne-blocant: cont incomplet (US-002) ===
Apare cand accounts.name / email / CUI sunt necompletate (conturi legacy sau create din CLI).
NU blocheaza importul sau uploadul — doar orienteaza operatorul sa completeze datele.
Dispare automat dupa ce contul devine complet (re-render la urmatoarea navigare/reload).
#}
{% if cont_incomplet %}
<div class="card banner" style="border-color:var(--warn); background:color-mix(in srgb, var(--warn) 12%, var(--card)); margin-bottom:14px; padding:10px 14px; font-size:13px;">
<strong>Completeaza datele firmei (email / CUI).</strong>
Contul tau nu are inca email de contact si CUI configurate.
<a href="/?tab=cont" style="margin-left:6px;">Completeaza acum &rarr;</a>
</div>
{% endif %}
{# === Container colapsabil: stepper + upload intr-un singur element <details> (US-006).
Serverul seteaza atributul `open` din are_trimiteri:
are_trimiteri=False (first-run) → open (importul e vizibil imediat, fara JS)
are_trimiteri=True (returning) → colapsat (nu ocupa ecranul, dar e accesibil la click)
Degradare fara JS: corecta pe ambele ramuri.
In timpul fluxului (mapcoloane/preview), HTMX face swap pe #import-section (descendentul
intern) → <details> ramane neatins → containerul ramane deschis intre pasi. === #}
<details id="import-details"{% if not are_trimiteri %} open{% endif %}>
<summary>+ Importa fisier (XLSX / CSV)</summary>
{% include '_upload.html' %}
</details>
{# === Subordonat: primii pasi pe un singur rand compact === #}
{% set toti_esentiali = are_creds and are_trimiteri %}
{% if not toti_esentiali %}
<div class="card" style="margin-top:14px; padding:12px 16px;">
<div style="display:flex; gap:20px; flex-wrap:wrap; align-items:center; font-size:13px;">
<span class="muted" style="font-weight:600;">Primii pasi:</span>
{# Pas 1: Cont RAR (esential) #}
<span style="display:inline-flex; align-items:center; gap:6px;">
{% if are_creds %}
<span class="s-sent" aria-hidden="true" style="font-weight:bold;">&#10003;</span>
{% else %}
<span class="muted" aria-hidden="true">&#9675;</span>
{% endif %}
<a href="/?tab=cont">Cont RAR</a>
</span>
{# Pas 2: Cheie API (optional) #}
<span style="display:inline-flex; align-items:center; gap:6px;">
{% if are_cheie_folosita %}
<span class="s-sent" aria-hidden="true" style="font-weight:bold;">&#10003;</span>
{% else %}
<span class="muted" aria-hidden="true">&#9675;</span>
{% endif %}
<a href="/?tab=cont">Cheie API</a>
<span class="muted">(optional)</span>
</span>
{# Pas 3: Import (esential) — marcat ca pas curent #}
<span style="display:inline-flex; align-items:center; gap:6px;">
{% if are_trimiteri %}
<span class="s-sent" aria-hidden="true" style="font-weight:bold;">&#10003;</span>
{% else %}
<span class="s-queued" aria-hidden="true" style="font-weight:bold;">&#9679;</span>
{% endif %}
<strong>Import</strong> <span class="muted">(incarca fisierul sus)</span>
</span>
</div>
</div>
{% endif %}
{# Sectiunea Trimiteri, permanenta sub upload.
La first-run (zero trimiteri), randam un placeholder <section> gol/ascuns — necesar
ca OOB swap-ul de la confirma sa gaseasca tinta valida in DOM si sa injecteze
_coada.html fara reload complet. Fara placeholder, HTMX ignora silentios OOB-ul. #}
{% if are_trimiteri %}
{% include '_coada.html' %}
{% else %}
<section id="trimiteri-section" hidden></section>
{% endif %}
</div>