Exit / eject
aion-marketing · tryb aion · ostatni skan :root · klient / team · domyślny--accent = var(--accent-op); [data-role="client"] przełącza na var(--accent-cl). Kontrast (AA, tekst 11 px na --card): muted 6,5 · ok 5,1 · warn 5,0 · critical 6,5 · accent-op 12,0 · accent-cl 6,8.
[data-theme="operator"] · operator · wariant świadomy--accent = var(--accent-op). Kontrast na --card: muted 6,4 · ok 7,1 · warn 5,3 · critical 5,0 · accent-op 10,6 · accent-cl 7,4. Tekst na primary CTA = --bg (11,3).
Lewa kolumna: kolor. Prawa: filter:grayscale(1). Primary CTA i badge warn muszą różnić się jasnością, nie tylko odcieniem. Jasny: accent-op (lum 0,04) vs warn (0,16) → stosunek 2,4. Ciemny: accent-op (0,65) vs warn (0,30) → 2,0. Wynik: przechodzi w obu motywach i obu rolach.
color-mix(in srgb, var(--token) N%, transparent)--accent 12% tło aktywnej pozycji menu--warn 12% / 30% tło i obrys badge warn--critical 10% / 30% badge critical · chip missing--ok 12% linia diff „+” · --critical 10% linia „−”Brak tokenów tintowych. Procenty stałe: tło 10–12 %, obrys 30 %, scrim 24 % --text, focus ring 40 % --accent. Przy nowym tincie mierzyć kontrast osobno — nie kopiować procentu.
ID · hash · czas · kod · subject · host · slug · wartości modules.json. Nigdy dla etykiet, tytułów, opisów.
aion-marketing·https://id.aionflow.pl/application/o/hub|andrzejniemiec52@gmail.com_astro/hoisted.ab12cd.jsOstatni skanwszystko OKh1).LIVE, SEO, ZIP, URL zostają skrótami w treści..status-tile ok · warn · fail · unknown — OK bez badge’a, każdy z linią weryfikacji.badge · .state · .verify — status = ikona + tekst + LIVE hh:mm / UNVERIFIED.btn — primary / focus / secondary / active / ghost / danger / disabled (kreskowany + powód) / loading.gate-table — blockery per rekord, deep link do Directusa; wiersz OK = cisza| Rekord | Blockery | Autor | |
|---|---|---|---|
lejek-dwustopniowy | missing descriptionmissing canonical | andrzej-niemiec | Directus |
intencja-nie-keyword | missing Article JSON-LD | aion-niemiec | Directus |
nie-sprzedajemy-pakietow | bez blockerów | andrzej-niemiec | Directus |
koszt-pozyskania-klienta-cac | missing sources | aion-niemiec | Directus |
.conceal — ukryty · pokaż 5 s · rotacja · brakAION_TENANT_KEY· ukrytyAION_TENANT_KEY· pokazany na 5 sAION_TENANT_KEY· rotacja w tokuPEXELS_API_KEY· brak.mode-badge aion | standaloneaiontryb standalonew stopce menu systemu; w standalone znikają quota, tenant key, Chaos seed.kill-lock + .toggleaios-commerceBLOCKEDprofiles: [] · werdykt Discovery.diff-panel — JSON przed/pomodules.jsonmodules.json{ "mode": "aion", "tenant_id": "aion-marketing", "plugins": [ "aios-seo", "aios-articles", "aios-images", "aios-webmcp", "aios-tracking" ], "profiles": [], "hub": { "usage_url": "https://hub.aionflow.pl/api/usage" }}
{ "mode": "standalone", "tenant_id": null, "plugins": [ "aios-seo", "aios-articles", "aios-images", "aios-webmcp", "aios-tracking" ], "profiles": [], "usage": { "sink": "directus:usage_log" } }
.event-stream — czas mono · ikona · treść · źródłodata → seo-gate → astro build → pagefind · 41 spipelinedist/exit-harnesscost_usd_month 41,20 / 50usage-metermodules.json · packs +content-credentialsoperatorlejek-dwustopniowy-hero.jpg · tor A · 4 wariantyaios-images.empty-checklist — co widać → dlaczego → kroki runbooka → jedna CTAdist/ExitHarness czyta artefakty builda. Zbuduj stronę, a wynik pojawi się tu z czasem weryfikacji.
curl directus/server/healthnpm run buildnpm run exit-harness -- apps/starter/dist.skeleton — shimmer przez przesuwany blok (bez gradientu, bez opacity).blocked-banner · .banner--error · .banner--warn.wizard / .step — done · active · fail · lock; kto możestandaloneoperator · ownermodules.json: "mode": "standalone", "tenant_id": nullmode=standaloneusage_log; brak quoty hub*.aionflow.pl w dist/clients.json · po kroku 5.stat-card — kolor tylko na lewej krawędzi i liczbie.chart-bars — czyste div-y, linia quoty, brak danych = surface-3.tabs (aktywny = tekst + pasek --text, nie akcent) · .form / .input / .segaion-marketing.drawer — panel boczny 360 px; w widoku: nad treścią, pod topbar, na lewo od AionLineNowy AION_TENANT_KEY zostanie wygenerowany w hub. Stary klucz działa jeszcze 24 h — w tym czasie zaktualizuj .env w repo tenanta i zrób rebuild.
.status-tile ok · warn · fail · unknown — OK bez badge’a, każdy z linią weryfikacji.badge · .state · .verify — status = ikona + tekst + LIVE hh:mm / UNVERIFIED.btn — primary / focus / secondary / active / ghost / danger / disabled (kreskowany + powód) / loading.gate-table — blockery per rekord, deep link do Directusa; wiersz OK = cisza| Rekord | Blockery | Autor | |
|---|---|---|---|
lejek-dwustopniowy | missing descriptionmissing canonical | andrzej-niemiec | Directus |
intencja-nie-keyword | missing Article JSON-LD | aion-niemiec | Directus |
nie-sprzedajemy-pakietow | bez blockerów | andrzej-niemiec | Directus |
koszt-pozyskania-klienta-cac | missing sources | aion-niemiec | Directus |
.conceal — ukryty · pokaż 5 s · rotacja · brakAION_TENANT_KEY· ukrytyAION_TENANT_KEY· pokazany na 5 sAION_TENANT_KEY· rotacja w tokuPEXELS_API_KEY· brak.mode-badge aion | standaloneaiontryb standalonew stopce menu systemu; w standalone znikają quota, tenant key, Chaos seed.kill-lock + .toggleaios-commerceBLOCKEDprofiles: [] · werdykt Discovery.diff-panel — JSON przed/pomodules.jsonmodules.json{ "mode": "aion", "tenant_id": "aion-marketing", "plugins": [ "aios-seo", "aios-articles", "aios-images", "aios-webmcp", "aios-tracking" ], "profiles": [], "hub": { "usage_url": "https://hub.aionflow.pl/api/usage" }}
{ "mode": "standalone", "tenant_id": null, "plugins": [ "aios-seo", "aios-articles", "aios-images", "aios-webmcp", "aios-tracking" ], "profiles": [], "usage": { "sink": "directus:usage_log" } }
.event-stream — czas mono · ikona · treść · źródłodata → seo-gate → astro build → pagefind · 41 spipelinedist/exit-harnesscost_usd_month 41,20 / 50usage-metermodules.json · packs +content-credentialsoperatorlejek-dwustopniowy-hero.jpg · tor A · 4 wariantyaios-images.empty-checklist — co widać → dlaczego → kroki runbooka → jedna CTAdist/ExitHarness czyta artefakty builda. Zbuduj stronę, a wynik pojawi się tu z czasem weryfikacji.
curl directus/server/healthnpm run buildnpm run exit-harness -- apps/starter/dist.skeleton — shimmer przez przesuwany blok (bez gradientu, bez opacity).blocked-banner · .banner--error · .banner--warn.wizard / .step — done · active · fail · lock; kto możestandaloneoperator · ownermodules.json: "mode": "standalone", "tenant_id": nullmode=standaloneusage_log; brak quoty hub*.aionflow.pl w dist/clients.json · po kroku 5.stat-card — kolor tylko na lewej krawędzi i liczbie.chart-bars — czyste div-y, linia quoty, brak danych = surface-3.tabs (aktywny = tekst + pasek --text, nie akcent) · .form / .input / .segaion-marketing.drawer — panel boczny 360 px; w widoku: nad treścią, pod topbar, na lewo od AionLineNowy AION_TENANT_KEY zostanie wygenerowany w hub. Stary klucz działa jeszcze 24 h — w tym czasie zaktualizuj .env w repo tenanta i zrób rebuild.
[data-theme="operator"], operator, menu zwinięte 64 + AionLine rozsunięty 200..mode-badge + build ok · 12 min.--accent poza primary CTA i focus ring (tło 12 % + pasek 3 px).--critical) · wiadomości + obecność (kropka --ok) · profil · wyloguj · rozsuń.LIVE · hh:mm. Wiersz GateTable bez blockerów = .state--ok „bez blockerów” (ikona + tekst, bez tła).--ok) wolno użyć tylko z dowodem: tooltip title na .verify niesie komendę lub endpoint.--text; krok aktywny wizardu = krawędź --text; linki = podkreślenie --line; ikony neutralne.--accent-op jasny = ciemny miód 4a3208, ciemny = jasny bursztyn f7cd78. Oba oddalone jasnością od --warn (test desaturacji ≥ 2,0).--accent-cl = stalowy niebieski, nie teal (--teal zostaje w kontrakcie nieużyty).| Etykieta | Komponent | Wygląd |
|---|---|---|
| LIVE | .verify--live | ikona check-c + LIVE (tekst) + · hh:mm mono; tooltip = komenda/endpoint. Jedyny stan, w którym StatusTile może być ok. |
| UNVERIFIED | .verify + .status-tile--unknown + .badge--unknown „brak pomiaru” | ikona help, kolor --muted, krawędź kreskowana. Nigdy zielony. |
| STALE | .badge--stale + .banner--warn | ikona history, obrys kreskowany --warn 45 %, czas ostatniego pomyślnego odczytu obowiązkowy. |
| BLOCKED / LOCAL-GATED | .blocked-banner + .badge--blocked + .kill-lock + .step--lock | kłódka, --muted, obrys kreskowany, zawsze powód + jedna CTA. To nie błąd (--critical) i nie „partial done”. |
| FAIL (błąd pomiaru) | .badge--critical + .banner--error + .error-panel | ikona x-c, --critical, log w pre, przycisk „Spróbuj ponownie”. |
--ok/--warn/--critical wyłącznie na: badge, ikona stanu, lewa krawędź StatusTile/StatCard/banner, słupek ≥ 80 % quoty, linia diff. Nigdy tło karty..state, .badge).opacity: --muted + obrys kreskowany + etykieta (disabled, lock, unknown).--bg → --card → --surface-2) i odstęp (sekcje 40 px, w sekcji 8–12 px). Obrys 1 px tylko interaktywne i wiersze..conceal: •••• + „Pokaż 5 s” (countdown mono) + „Kopiuj” (po kliknięciu) + „Rotuj” (drawer potwierdzenia, stary klucz 24 h). Wartość nigdy w DOM stanu ukrytego.DIRECTUS_* tylko operator — owner widzi .blocked-banner „tylko operator”, nie pusty formularz.--font-ui.--dur) tylko hover/focus; skeleton shimmer 1200 ms = przesuwany blok --surface-3 (bez gradientu i opacity); spinner 1200 ms na loading..status-tile · .gate-table · .conceal · .mode-badge · .kill-lock · .diff-panel · .event-stream · .empty-checklist · .skeleton · .blocked-banner · .stat-card · .chart-bars · .tabs · .drawer — plus pomocnicze: .badge .state .verify .btn .wizard/.step .toggle .chk .form/.input/.seg .banner .error-panel.