Decyzje projektowe — Obrazy
- Kolejka jest tabelą, nie siatką miniatur. Operator porównuje hashe, tory i licencje pionowo; miniatura 40 px to tylko kotwica wzroku. Galeria zostaje w Directus files — panel nie duplikuje jej.
- Kolumna „Plik → descriptive filename” pokazuje wynik nazwy jako tytuł wiersza, a oryginał (IMG_4821.jpg) w mono pod nim. Nazwa opisowa jest tym, co trafi do HTML i sitemap obrazów — jest ważniejsza od źródła.
- Warianty jako lista szerokości w mono, bieżąca (użyta w og:image) obrysowana. Bez pasków postępu — ingest trwa sekundy, a lista mówi dokładnie, czego brakuje.
- Tory A/B/C to trzy karty na tym samym poziomie; A jest zawsze „on” i zablokowany (toggle z przerywanym obrysem), B/C przełącza tylko operator. Klient (01) widzi te same karty z notką „tylko operator” — ta sama IA, mniej uprawnień.
- ConcealField dla kluczy stock: stan „skonfigurowany” to cisza (muted check) +
LIVE · 03:05; brak klucza to warn, nie critical — ingest plików własnych działa dalej. BOT_STOCK_URL nie jest sekretem i jest widoczny.
- Edytor sidecar jako
.drawer nad treścią (board 01 — owner edytuje alt/caption/creator/copyright/keywords), nie w Directus: pola żyją w .json obok pliku. Drawer zajmuje 480 px prawej strony .main, nie wypycha AionLine. Board 02 pokazuje ten sam widok z zamkniętym drawerem — operator przełącza tory.
Co jest badge'em, co ciszą
| Sygnał | Forma | Dowód |
| Plik gotowy | cisza: muted check „gotowe · LIVE” | IngestResult.variants.length > 0 |
| W toku | status warn „w toku · 2/4 wariantów” | kolejka ingestu |
| Czeka na licencję | status critical (blokuje publikację) | meta.license puste |
| Tor B wyłączony | status warn na karcie B + w wierszu pliku | enableTorB: false |
| Tor C bez providera | status unknown „UNVERIFIED” — nie mierzymy | aiFn: undefined |
| Klucz stock OK | ConcealField •••• + cisza | env obecny (nie wartość) |
| Brak wszystkich kluczy | blocked-banner „BLOCKED · UNVERIFIED” | standalone bez BYOK |
Dane LIVE / UNVERIFIED na planszy
| Element | Źródło | Etykieta |
| tiery A/B/C, pola sidecar, hashe sha256 | packages/images/src/ingest.ts (ImageMeta, IngestTier) | LIVE |
| nazwy env stock, BOT_STOCK_URL | packages/images/src/stock-client.ts | LIVE |
| slugi rekordów (lejek-dwustopniowy…) | BRIEF §6 | LIVE |
| nazwy plików, szerokości wariantów, wartości hash | przykład redakcyjny | UNVERIFIED |
| liczby w pasku (7 / 5 / 2 z 3) | snapshot planszy | UNVERIFIED |
| „Cedepe hala produkcyjna” (realizacje) | nazwa klienta z Hub (Sesja 02.09) | UNVERIFIED |
Tokeny — decyzja koloru akcentu
--accent-op = ciemny miód (jasny motyw) / jasne złoto (operator). Różni się od --warn (ochra) jasnością, nie tylko odcieniem — po desaturacji primary CTA i badge warn nie zlewają się. --accent-cl = głęboki granat (jasny) / jasny błękit (operator), różny od --teal. --purple zadeklarowany, nieużyty.
--accent-op
--warn
--accent-cl
--teal
--ok
--critical
--blue
--muted
Użycie --accent na planszy: aktywna pozycja menu systemu, primary CTA, focus ring. Nic więcej. Aktywna zakładka i toggle „on” idą przez --text, żeby akcent nie konkurował ze statusem.
Shell — AIONLINE-CONTRACT
Menu systemu 244 px po lewej (brand „AIOS Admin”, tenant switcher tylko dla operatora, 12 pozycji IA §1, stopka: ModeBadge + build). AionLine 56 px po prawej: systemy Hub · Discovery · Panel · Create, inbox ekosystemu, obecność, profil, wyloguj, rozsuń. Topbar produktu bez dzwonka i profilu. Commerce w menu z kłódką i tooltipem „kill-gate Discovery”.
Board 01 = rola client/owner (jasny, tenant statyczny, brak akcji operatorskich). Board 02 = operator (data-theme="operator", switcher tenantów, pełne akcje). Ta sama IA w obu — różnią się tylko uprawnieniami.
Komponenty użyte (BRIEF §5) i hierarchia
.status-tile ×4 · .tbl (wariant .gate-table dla kolejki) · .tabs · .conceal ×4 (stock BYOK + BOT_STOCK_URL) · .mode-badge (stopka menu, karta BOT_STOCK_URL) · .drawer (edytor sidecar) · .skeleton · .empty-checklist · .blocked-banner · toggle (.toggle--locked dla A i dla B/C u klienta). Nieużyte celowo: .kill-lock (tylko menu Commerce), .chart-bars (wykres ingestu zmieściłby się dopiero pod 1280 px — trafi do Puls), .event-stream, .diff-panel.
Hierarchia: kolejka na pełnej szerokości nad zgięciem (7 wierszy × 44 px — siedem kolumn potrzebuje 1040 px), pod nią tory A/B/C (lewo) i stock BYOK (prawo). Sekrety w osobnej karcie, bo decydują o tym, czy kolejka w ogóle może pobierać ze stocka. Kolor statusu wyłącznie w kolumnie „Status”, na lewej krawędzi StatusTile i na liczniku menu (Obrazy 2 · warn). Tło kart bez obrysu; obrys 1 px tylko na wierszach, polach, toggle'ach i miniaturach.