e7b6d5013b
Osobna warstwa prezentacji: dodanie pliku bazy i zapytanie o interpretację urodzeniową. Nic więcej. OSOBNA USŁUGA, NIE KONTO Z OGRANICZENIAMI. Mechanizm uprawnień z PRE-27 umiałby to ukryć w pełnej aplikacji, ale ukrycie a nieobecność to dwie różne rzeczy: tutaj pozostałych funkcji NIE MA W OBRAZIE — nie ma tras, nie ma szablonów, nie ma nawet metod w kliencie warstwy logicznej. Demo można komuś oddać, nie oddając przy okazji kodu reszty programu. Test porównuje zbiór tras aplikacji i zbiór metod klienta z listą dokładną, więc dopisanie czegokolwiek zapala się od razu. WGRANIE I WŁĄCZENIE TO JEDNA CZYNNOŚĆ. W pełnej aplikacji to dwie osobne decyzje (DAN-27), bo tam ktoś nad tym panuje. Tutaj „dodać plik do bazy" musi znaczyć, że plik od razu bierze udział w wyszukiwaniu — inaczej po wgraniu nic by się nie zmieniło i demo wyglądałoby na zepsute. Walidacja zostaje: plik o złym układzie nie wchodzi do użytku, ale też NIE JEST tracony, a komunikat nie zdradza reguł, bo te zna wyłącznie administrator. Osobny test szuka w komunikacie śladów mechanizmu. KONTO OSOBNE (DEMO_USER/DEMO_PASSWORD), nie współdzielone z główną aplikacją. Demo pracuje na TEJ SAMEJ warstwie danych co produkcja — świadoma decyzja właściciela — więc kto ma do niego dostęp, czyta oryginalne bazy, a jego wgrania trafiają do produkcyjnego zbioru. Własne poświadczenia pozwalają odciąć demo jedną zmienną, bez ruszania kont głównej aplikacji i bez zmiany hasła komukolwiek. Zapisane wprost w README usługi i w manifeście, nie tylko w tej wiadomości. Rozmowa z warstwą logiczną idzie tym samym szyfrowanym łączem (PRE-16) i pod tym samym tokenem międzywarstwowym (LOG-32) — demo nie jest furtką omijającą ochronę. Automatyczna dokumentacja wyłączona, jak w pełnej aplikacji: /docs wypisałoby komplet tras, a demo ma nie zdradzać nawet własnej powierzchni. Zależności celowo krótsze niż w prezentacji: bez Excela, bez stref czasowych z lokalizacji, bez niczego pod kosmogram. Każda zbędna zależność w obrazie demo to kolejna rzecz do pilnowania. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
52 lines
2.3 KiB
CSS
52 lines
2.3 KiB
CSS
/* astroklient — arkusz CELOWO minimalny. Nie kopiujemy stylów pełnej aplikacji:
|
|
demo ma dwa formularze i tabelę wyników, a każda przeniesiona klasa niosłaby
|
|
nazwy funkcji, których tu nie ma. */
|
|
:root {
|
|
--bg: #11121b; --panel: #191b26; --line: #2b2e3d;
|
|
--fg: #e8e9f0; --muted: #9aa0b4; --accent: #8ab4ff;
|
|
}
|
|
* { box-sizing: border-box; }
|
|
body {
|
|
margin: 0; background: var(--bg); color: var(--fg);
|
|
font: 15px/1.5 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
}
|
|
main { max-width: 880px; margin: 0 auto; padding: 1.5rem 1rem 3rem; }
|
|
.topbar { padding: .5rem 0 1rem; border-bottom: 1px solid var(--line); }
|
|
h1 { margin: 0; font-size: 1.4rem; letter-spacing: .5px; }
|
|
h2 { margin: 0 0 .3rem; font-size: 1.05rem; }
|
|
h3 { margin: 0 0 .5rem; font-size: 1rem; }
|
|
|
|
.card {
|
|
margin-top: 1.25rem; padding: 1rem 1.25rem;
|
|
background: var(--panel); border: 1px solid var(--line); border-radius: 12px;
|
|
}
|
|
.row { display: flex; gap: .75rem; flex-wrap: wrap; align-items: flex-end; margin-top: .6rem; }
|
|
label { display: flex; flex-direction: column; gap: .25rem; color: var(--muted); font-size: .85rem; flex: 1; min-width: 10rem; }
|
|
input {
|
|
width: 100%; padding: .45rem .6rem; background: #0e0f18; color: var(--fg);
|
|
border: 1px solid var(--line); border-radius: 8px; font: inherit;
|
|
}
|
|
button {
|
|
padding: .5rem 1.25rem; background: var(--accent); color: #10121a;
|
|
border: none; border-radius: 8px; font: inherit; font-weight: 600; cursor: pointer;
|
|
}
|
|
|
|
table { width: 100%; border-collapse: collapse; margin-top: .3rem; }
|
|
td { padding: .35rem .5rem; border-bottom: 1px solid var(--line); vertical-align: top; font-size: .92rem; }
|
|
td.key { color: var(--accent); white-space: nowrap; padding-right: 1rem; }
|
|
tr:last-child td { border-bottom: none; }
|
|
|
|
.sig { margin-top: .75rem; }
|
|
.sig-head { color: var(--muted); font-size: .85rem; }
|
|
.meta { color: var(--muted); margin: 1.5rem 0 .5rem; font-size: .9rem; }
|
|
.muted { color: var(--muted); }
|
|
.small { font-size: .85rem; }
|
|
.foot { margin-top: 2.5rem; color: var(--muted); font-size: .8rem; }
|
|
|
|
.alert, .ok {
|
|
margin: 1rem 0; padding: .6rem .9rem; border-radius: 8px; font-size: .92rem;
|
|
border: 1px solid var(--line); border-left-width: 4px;
|
|
}
|
|
.alert { border-left-color: #b8860b; background: rgba(184, 134, 11, .1); }
|
|
.ok { border-left-color: var(--accent); background: rgba(138, 180, 255, .08); }
|