# Homeopatický prostor — úplný popis chování > Tento soubor popisuje chování aplikace v kódu k 14. 11. 2026 (rozsah A–M a rozšíření fází N–R v repozitáři). Není to plán všech budoucích fází, právní posouzení ani bezpečnostní audit. Kratší přehled je v https://aplikace.homeopatiepisek.cz/llms.txt. Aplikace běží na https://aplikace.homeopatiepisek.cz/. ## 1. Účel a hranice produktu Homeopatický prostor je česká jednostránková webová aplikace. Slouží ke studiu pojmů a k evidenci vlastních záznamů, domácích balení a podkladů, které si uživatel sám vybere pro konzultaci. Dělá toto: - eviduje texty, časy, epizody, štítky, čísla ukazatelů, balení, užití a výdaje; - organizuje je do trezoru v prohlížeči; - vyhledává lokálně; - ukazuje souhrny, osu, kalendář dnů a pruhový graf zadaných čísel; - vysvětluje omezený slovník pojmů dvěma studijními texty; - připraví soubory a tisk, které uživatel sám stáhne nebo vytiskne. Nedělá toto: - neurčuje nemoc; - nerozhoduje, jak je péče naléhavá; - nevybírá léčbu, potenci ani dávku; - nevyhodnocuje, jestli se někomu ulevilo díky přípravku; - nenahrazuje vyšetření; - neposílá osobní text do účtu, cloudu ani do AI; - nevyžaduje e-mail ani registraci; - nezobrazuje reklamu a neposílá analytiku. Celé rozhraní, nápověda, chybové věty a exporty jsou česky. Identifikátory v datech jsou technické (anglické názvy typů), uživatel je v běžném UI nepotřebuje. Verze v manifestu a sestavení zůstává označená jako předběžná. Viditelný disclaimer je v patičce: „Vaše záznamy zůstávají v tomto prohlížeči. Aplikace neurčuje diagnózu, lék ani dávkování a nenahrazuje péči odborníka.“ ## 2. Rozvržení stránky Dokument má `lang="cs"`. Název karty je „Homeopatický prostor“. V hlavičce je viditelný nadpis „Aplikace“ a odkaz na web poradny. Popis pro vyhledávače: „Homeopatický prostor — studium pojmů a soukromý záznam v prohlížeči na aplikace.homeopatiepisek.cz. Bez diagnózy a dávkování.“ Kanonická adresa je `https://aplikace.homeopatiepisek.cz/`. V hlavičce HTML je odkaz na `/manifest.webmanifest` a `theme-color` `#3a7a45`. Manifest má ikony 192, 512 a maskable 512. Obecné kroky instalace na plochu jsou v dialogu Nápověda a nejsou předkládané jako ověřené na každém zařízení. Hlavní stránka, `llms.txt` a `full-llms.txt` jsou v `sitemap.xml`. Vzorník `/vzornik.html` má `noindex` a do mapy webu nepatří. V hlavičce jsou štítek trezoru (`#vault-chip`), tlačítko vzhledu, přepínač **Klidný režim** (`hps-calm-mode`, skryje graf ukazatele a některé pobídky třídou `calm-hidden`), ikona Nápovědy a tlačítko „Zamknout“ (jen u trezoru chráněného heslem a jen když je odemčený). Pořadí na stránce: 1. Odkaz „Přeskočit na obsah“ (viditelný při fokusu klávesnicí). 2. Hlavička s ovládacími prvky (viz výše). 3. Pruh sítě `#network-banner`, skrytý, když je prohlížeč online; volitelný pruh varování nečinnosti `#idle-warning`; toast `#toast`. 4. Blok **Začínáme** (`#onboarding`) — tři kroky a odkaz na obnovu zálohy; po prvním úspěšném zápisu se skryje (třída `calm-hidden` v klidném režimu). 5. Navigace **čtyř** hlavních panelů (tablist). 6. Nápověda `#app-locked-hint`: „Deník a lékárnička se otevřou po odemčení trezoru. Studovna je dostupná vždy.“ (Jen u trezoru s heslem, dokud není odemčený.) 7. Právě jeden viditelný panel (`role="tabpanel"`). 8. Sbalené „Informace o prohlížeči (volitelné)“ (`#tech-diagnostics`, výchozí `hidden`). 9. Patička s disclaimerem. 10. Dialogy: obnova režimu trezoru (`#restore-vault-mode`), Nápověda (`#app-guide`). 11. Štít soukromí při skrytí karty — jen u trezoru chráněného heslem a odemčené relace. Stavová věta `#status` má na začátku „Připraveno.“ a je označená `sr-only` (pro čtečky, ne jako viditelný pruh). Všechny formuláře při odeslání klávesou Enter stránku neodešlou. Akce jdou přes tlačítka. Když systém požádá o méně pohybu (`prefers-reduced-motion`), animace se zklidní. Aplikace nepoužívá vzdálené fonty. Tlačítko vzhledu přepíná světlou a tmavou paletu a uloží ji do localStorage jako `hps-theme` (`light` nebo `dark`). Popisek tlačítka je opak aktuálního vzhledu: „Tmavý vzhled“, nebo „Světlý vzhled“. Když klíč není, platí `prefers-color-scheme`. Na kořeni dokumentu je pak `data-theme`. Hlavní navigace je `role="tablist"`, tlačítka `role="tab"` s `aria-selected` a panely `role="tabpanel"`. `#status` a `#network-banner` mají `role="status"` a `aria-live="polite"`. Varování nečinnosti je samostatná oblast, aby nepřepsala větu o uložení. ## 3. Návod v aplikaci Dialog `#app-guide` má nadpis „Nápověda“. Otevře ho ikona v hlavičce (`aria-label` „Nápověda“), zavře křížek nebo Escape. Úvodní věta říká, že Studovna jde hned a osobní části až po trezoru; níže je popis celé aplikace a návod k částem. Při otevření je vždy rozbalená sekce **O aplikaci** (`data-guide="o-aplikaci"`) s popisem účelu (soukromá PWA, bez účtu a cloudu osobních dat), seznamem funkcí (Deník, Lékárnička, Studovna, Nastavení), pěti typickými scénáři použití, odkazem na blok Začínáme a větou o limitech (bez diagnózy, dávkování, synchronizace; záloha a volitelné heslo). Kromě toho se rozbalí jen část odpovídající vybrané záložce (`data-guide` = `data-app-panel`: `denik`, `lekarnicka`, `studovna`, `nastaveni`, `plocha`) s textem „právě otevřená“. Sekce Instalace na plochu zůstává sbalená, dokud ji uživatel nerozbalí. | Část | Text | |---|---| | O aplikaci | Celkový popis, funkce, typické využití, limity a odkaz na Začínáme. | | Deník | Zápisy, přehled (kalendář, graf, časová osa), epizody, štítky, koš, rozpracované ve filtru seznamu, hromadné operace s náhledem. | | Lékárnička | Balíček, expirace, datum otevření, užití jako evidence, výdaje ve stejné měně, cestovní seznam. | | Studovna | Slovník, materiály, podklady na konzultaci; poznámky a tisk až po trezoru. Odkaz Objednat konzultaci na web poradny. | | Nastavení | Heslo (volitelné), záloha, export, smazání trezoru z prohlížeče; více karet a zálohování. | | Instalace na plochu | Obecné kroky pro Android (Chrome), iPhone/iPad (Safari) a počítač (Chrome/Edge), bez tvrzení, že postup je ověřený na každém zařízení. Offline může běžet obal a veřejný obsah Studovny; trezor zůstává v prohlížeči. | ## 4. Síť, mezipaměť a obnova verze V produkčním sestavení se registruje service worker `/sw.js`. Uloží si seznam souborů z `/precache-manifest.json` a obsluhuje jen GET požadavky na stejný původ bez query řetězce. Osobní data trezoru v této mezipaměti nejsou; ta jsou v IndexedDB. Když prohlížeč přejde do stavu offline, pruh říká: „Jste bez sítě. Aplikace může běžet z paměti tohoto zařízení, trezor zůstává jen v tomto prohlížeči. Slovník a materiály ve Studovně jsou k dispozici, pokud už jste je jednou načetli.“ Soubory `content/glossary-v1.json` a `content/study-materials-v1.json` jsou v precache manifestu z buildu. Návrat online pruh schová. Aplikace netvrdí, že offline režim je ověřený na všech telefonech a prohlížečích. Při vytvoření a při odemčení trezoru se zavolá `navigator.storage.persist()`, pokud ho prohlížeč má. Návratová hodnota se v UI nevypisuje jako úspěch; diagnostika později řekne, jestli úložiště drží. První převzetí stránky service workerem stránku nenačítá znovu. Až další výměna workeru se aktivuje a stránka se znovu načte, když trezor není odemčený. Odemčená relace se kvůli čekající aktualizaci sama nenačítá znovu. Po zamčení se čekající aktualizace může aktivovat. Studovna načítá veřejný obsah paralelně: `fetch('/content/glossary-v1.json')` a `fetch('/content/study-materials-v1.json')`. Neúspěch slovníku: „Slovník se nepodařilo načíst.“ Neúspěch materiálů: „Studijní materiály se nepodařilo načíst.“ Výjimka sítě u obou: „Obsah Studovny není dostupný offline — zkuste obnovit stránku po instalaci.“ ## 5. Navigace panelů Hlavní navigace má **čtyři** tlačítka (pořadí v UI: Deník, Lékárnička, Studovna, Nastavení): | Tlačítko | `data-app-panel` | Id panelu | Přístup | |---|---|---|---| | Deník | denik | `#panel-zapisnik` | Po prvním zápisu / obnově je trezor připravený; u trezoru **s heslem** je Deník zamčený, dokud uživatel neodemkne v Nastavení. U výchozího trezoru **bez hesla** je Deník dostupný hned po automatickém odemčení. | | Lékárnička | lekarnicka | `#panel-lekarnicka` | Stejná pravidla jako Deník. | | Studovna | studovna | `#panel-studovna` | Vždy dostupná (slovník a materiály). Poznámky a podklady na konzultaci chtějí odemčený trezor. | | Nastavení | nastaveni | `#panel-nastaveni` | Vždy dostupné: záloha, obnova, export (sbalený), ochrana heslem, smazání. | Viditelný je vždy jen jeden panel. Hlavní záložka má `aria-selected="true"`. Vnitřní navigace Deníku, Lékárničky a Studovny používá `aria-current` / `aria-selected`. Výchozí panel po načtení stránky je **Studovna**. Po ručním odemčení trezoru s heslem nebo po obnově zálohy se typicky přepne na Studovnu; po vytvoření trezoru heslem z Nastavení může cílit na Deník. Po zamčení (jen režim s heslem) se osobní panely vyprázdní, položky Deníku a Lékárničky dostanou třídu `is-locked`, a znovu se ukáže Studovna. Klik na zamčený Deník nebo Lékárničku u trezoru s heslem vypíše do `#status`: „Nejdřív odemkněte trezor.“ Štítek trezoru v hlavičce přepne na panel Nastavení. ## 6. Karta, která smí zapisovat Při startu se aplikace pokusí získat výhradní Web Lock `hps-p0-writer`. - Získá ho: „Tato karta zapisuje.“ Ukládání je povolené. - Lock drží jiná karta: „Tato karta nezapisuje. Pro úpravy použijte jednu hlavní kartu.“ Každý zápis skončí: „Z této karty teď nelze zapisovat. Otevřete aplikaci v jedné hlavní kartě prohlížeči.“ - Prohlížeč Web Locks nemá: „Zápis není v tomto prohlížeči plně dostupný; čtení a stažení zálohy ano.“ Zápis je odmítnutý stejnou větou o kartě. Čtení odemčeného trezoru a vytvoření souboru zálohy na zapisující kartě nejsou totéž: záloha v kódu vyžaduje odemčenou relaci, ne roli zapisující karty. Obnova, vytvoření trezoru, změna hesla, smazání trezoru a všechny úpravy entit zapisující kartu vyžadují. Když se operace přeruší výjimkou úložiště, stavová věta je: „Uložení se nepovedlo. Záznam se neuložil.“ ## 7. Skrytí obrazovky Posluchač `visibilitychange` a návrat z bfcache (`pageshow` s `persisted`): - Karta skrytá a trezor s heslem odemčený: osobní panely se vyprázdní, pole hesel a hesla zálohy se vymažou, případný text ve sbaleném bloku „Starší poznámka“ (`#personal`) se vyčistí, ukáže se „Trezor je teď skrytý. Vraťte se prosím do aplikace.“ Relace zůstává otevřená. U trezoru bez hesla se štít neukáže (skrytí karty osobní text stejně nesundá z obrazovky stejným mechanismem). - Karta znovu viditelná a relace pořád platí: štít zmizí a panely se znovu načtou z trezoru. - Trezor zamčený: štít se neukáže. Ruční „Zamknout“ (jen trezor s heslem) relaci ukončí, vyčistí vyhledávací index v paměti, schová formulář změny hesla, vymaže pole změny hesla a osobní text. Tlačítka jsou v hlavičce (`#lock-quick`) a v panelu Nastavení (`#lock`). Když byl trezor otevřený, text stavu je „Trezor je zamčený. Osobní text na stránce není zobrazený.“ Jinak „Trezor je zamčený.“ U trezoru bez hesla se ruční zámek ani samovolná nečinnost neukazují — data zůstávají v relaci, dokud uživatel nezavře prohlížeč nebo nesmaže trezor. Časovač nečinnosti platí jen pro trezor s heslem: 14 minut klid = varování „Za minutu se trezor zamkne…“ 15 minut = zámek „Trezor se zamkl po 15 minutách nečinnosti.“ Samotné čtení bez pohybu čas neobnovuje. Zámek se pošle i do ostatních karet (BroadcastChannel `hps-vault-lock`). Zkratka Alt+Shift+L. U hesel je tlačítko Zobrazit/Skrýt. ## 8. Nastavení — trezor, heslo, smazání Veškerá správa trezoru je v panelu **Nastavení** (`#panel-nastaveni`), ne jako samostatná záložka. Na zařízení je v kartě nejvýše jeden vybraný trezor. Id se ukládá v `sessionStorage` (`hps-p0-active-vault-id`). Heslo se neukládá. Po zavření prohlížeče je trezor s heslem zamčený; trezor bez hesla se po načtení stránky znovu automaticky odemkne (`unlockDeviceVault`). ### Výchozí trezor bez hesla (device vault) Při prvním uložení zápisu, balíčku nebo studijní poznámky zavolá aplikace `ensureVaultForWrite()`: vytvoří trezor bez hesla, hned ho odemkne a staví „Trezor je připravený. Data jsou v tomto prohlížeči zašifrovaná.“ Nad formulářem v Nastavení: „Trezor se vytvoří sám, až uložíte první zápis, balíček nebo poznámku. Nebo ho obnovíte ze zálohy níže.“ a nápověda „Záznamy se při prvním uložení zašifrují v tomto prohlížeči. Heslo je volitelné.“ Po odemčení banner „Režim: bez hesla“ a upozornění, že při sdíleném zařízení lze přidat heslo v sekci **Ochrana heslem**. ### Trezor s heslem Uživatel zvolí **Chránit heslem** (nové heslo dvakrát) u běžícího trezoru bez hesla, nebo obnoví zálohu a v dialogu zvolí „Ano, chránit heslem“. Staré tlačítko „Vytvořit trezor“ s heslem je v aktuálním UI skryté (legacy); běžná cesta je auto-trezor → volitelné heslo. Odemčení: pole „Heslo trezoru“, tlačítko „Odemknout“. Prázdné heslo: „Heslo nesmí být prázdné. Mezery se samy neořežou.“ Špatné heslo: „Heslo nesouhlasí, nebo jsou data poškozená…“ Úspěch: „Trezor je odemčený.“ a doplnění hesla souboru zálohy. Banner „Režim: s heslem“. Skrytá pole `username` (hodnota „Homeopatický prostor“) jsou kvůli správcům hesel prohlížeče. Kryptografie nového trezoru s heslem: profil `pbkdf2-sha256-aes256gcm-v1`, 600 000 iterací PBKDF2-SHA-256 (v hlavičce zálohy; starší soubory 600 000–2 000 000). Při vytvoření i odemčení `navigator.storage.persist()`. ### Změna hesla Formulář je skrytý, dokud není trezor odemčený. Nadpis „Změna hesla trezoru“. Nápověda: „Trezor musí být odemčený. Všechna data se znovu zašifrují — nechte kartu otevřenou až do dokončení.“ Pole: Současné heslo, Nové heslo, Nové heslo znovu. Tlačítko „Změnit heslo“. Neshoda nových hesel: „Nové heslo se neshoduje s kontrolním zadáním.“ Úspěch vymaže tři pole změny, dosadí nové heslo do pole hesla trezoru i hesla souboru zálohy a napíše: „Heslo trezoru bylo změněno. Zálohujte znovu s novým heslem.“ Staré soubory zálohy zůstávají čitelné starým heslem. Nová záloha chce nové heslo. ### Odstranit trezor z tohoto prohlížeče Sbalený blok. Texty: - „Smaže šifrovaná data v prohlížeči na tomto zařízení. Soubory zálohy (.hpsbackup) mimo prohlížeč tím nezmizí — můžete je stále mít uložené jinde.“ - „Nejdřív trezor zamkněte. Pak zadejte heslo pro potvrzení.“ Podmínky tlačítka „Odstranit trezor z prohlížeče“: - karta smí zapisovat; - trezor je zamčený (odemčený: „Nejdřív trezor zamkněte. Odstranění lze jen u zamčeného trezoru.“); - nějaký trezor je vybraný (jinak: „Na tomto zařízení není vybraný trezor k odstranění.“); - zaškrtnuto „Chci trvale odstranit trezor z tohoto prohlížeče“ (jinak: „Potvrďte zaškrtnutím, že chcete trezor z tohoto prohlížeče odstranit.“); - heslo souhlasí. Úspěch smaže id ze sessionStorage, vyčistí pole, smaže lokální záznam o stažení a ověření zálohy a napíše: „Trezor byl odstraněn z tohoto prohlížeče. Externí soubory zálohy tím nezmizí.“ Nad formulářem: „Trezor z tohoto prohlížeče byl odstraněn. Můžete vytvořit nový nebo obnovit ze zálohy.“ ### Starší poznámka Sbalený blok „Starší poznámka“ (`#p0-legacy-panel`, výchozí `hidden`, zobrazí se jen při migraci starých dat). Text: „Text z dřívější verze. Můžete ho převést do zápisu, nebo smazat.“ Ukládá JournalEntry v1; při odemčení se jednou převede na zápis v2. ## 9. Záloha, ověření a obnova Oddíl „Záloha a obnova“ v **Nastavení**. Úvodní věta: trezor musí být odemčený; obnova vytvoří novou kopii. U trezoru s heslem: heslo souboru zálohy = heslo trezoru (prázdné pole stažení se doplní z hesla trezoru). U trezoru bez hesla uživatel heslo zálohy zadá dvakrát (`Heslo souboru zálohy` / „znovu“) — tím otevře soubor na jiném zařízení. Pole `#backup-phrase` má popisek „Heslo souboru zálohy“. Obnova používá `#restore-phrase` („Heslo zálohy“). Chybějící heslo u stažení (režim s heslem): hláška o zadání hesla trezoru nebo hesla zálohy. Ověření bez hesla: „Zadejte frázi (stejnou jako heslo trezoru).“ (doslovná věta v kódu ověření.) Soubor se vybírá v „Soubor zálohy“ s filtrem `.hpsbackup`. Bez souboru u ověření: „Nejdřív vyberte soubor .hpsbackup.“ Bez souboru u obnovy: „Vyberte soubor zálohy (.hpsbackup).“ ### Stáhnout zálohu Jen z odemčené relace. Jinak: „Nejdřív odemkněte trezor. Zálohu lze vytvořit jen z odemčeného trezoru.“ Prohlížeč nabídne soubor `homeopaticky-prostor-zaloha.hpsbackup`. Stav: „Záloha byla nabídnuta ke stažení. Uložte soubor na bezpečné místo.“ Do localStorage se zapíše čas stažení. Nabídnutí stažení neověřuje, kam si uživatel soubor uložil. ### Ověřit soubor (bez obnovy) Dešifruje a zkontroluje soubor, do trezoru nezapíše. Úspěch do `#verify-backup-result`: „Soubor zálohy je v pořádku (payload v{verze}, {počet} entit). Obnova nebyla spuštěna.“ a stav odpovídající zadanému heslu. Když je v kartě vybraný trezor, zapíše se čas ověření k tomuto trezoru (ne k trezoru uvnitř souboru). ### Obnovit ze zálohy Chce zapisující kartu. Vznikne nový trezor v IndexedDB. Při chybě se původní trezor nemění: „Soubor zálohy se nepodařilo použít. Původní trezor zůstal beze změny.“ Po úspěchu aplikace napíše, jestli původní trezor zůstal beze změny, nebo že se oproti očekávání změnil a je potřeba zkontrolovat obě kopie. Když se při obnově uklidily nedokončené staging kopie, přidá se „Odstraněno {n} nedokončených staging trezorů.“ Pak se nový trezor vybere, odemkne heslem zálohy a otevře se Studovna. Stav: „Obnova skončila. Pracujete v obnovené kopii trezoru.“ a „Obnovený trezor je aktivní.“ Když se kopie uloží, ale hned neotevře: „Obnovený trezor je uložený, ale nepodařilo se ho hned otevřít.“ ### Stav zálohy v prohlížeči Text `#backup-status`: - bez vybraného trezoru: „Trezor na tomto zařízení zatím není vybraný.“ - vždy, když je trezor vybraný: „Od poslední zálohy: {žádná nová změna | 1 změna | 2–4 změny | 5 a více změn}.“ - nic nezapsáno o časech: „V tomto prohlížeči zatím není zaznamenané stažení ani ověření zálohy. To neověřuje soubor na disku mimo prohlížeč.“ - jinak věty „Stažení zálohy z aplikace: {datum a čas cs-CZ}.“ a „Ověření souboru zálohy (bez obnovy): {datum a čas}.“ - na konci vždy „Neznamená to bezpečné uložení mimo toto zařízení.“ Počítadlo `mutationCount` se zvedne po úspěšném uložení nebo smazání entity. Hromadné vložení při obnově ho nezvedá. Stažení zálohy zapíše `backedUpMutationCount` na tehdejší počet. Rozdíl je to, co stav ukazuje. Ověření souboru počet nemění. Klíč v localStorage je `hps-backup-local-` plus id trezoru. Když localStorage nejde použít, časy zůstanou jen v paměti karty. ### Formát souboru Soubor začíná textem `HPSBKP01`, pak délkou hlavičky a hlavičkou JSON s `formatVersion` 1, `cryptoProfile`, `iterations`, `saltB64url`, `ivB64url`, a potom šifrovaným obsahem. Hlavička smí mít nejvýše 4 096 B. Otevřený obsah nejvýše 64 MiB. Payload verze 1 nejvýše 20 entit. Payload verze 2 nejvýše 5 000 entit. Payload verze 1 (`backupPayloadVersion: 1`, `appVersion: "0.0.0-p0"`) nese jen JournalEntry verze 1 a prázdné přílohy, preference a odkazy na obsah. Payload verze 2 nese entity schémat: - JournalEntry 2 - Episode 1 - Tag 1 - MetricDefinition 1 - Measurement 1 - ProductPackage 1 - UseEvent 1 - StudyNote 1 - PackageExpense 1 Přílohy, preference a contentReferences jsou prázdné. Před zápisem se kontroluje, že odkazy mezi entitami dávají smysl (epizoda, štítek, ukazatel). Neznámý profil: „Tato verze aplikace tento typ trezoru neotevře.“ Obnova umí profil `pbkdf2-sha256-aes256gcm-v1` i starší `pbkdf2-sha256-aes256gcm-exp1`. ## 10. Databáze v prohlížeči Úložiště je IndexedDB přes jeden aplikační port. Rozhraní nevolá IndexedDB přímo. Osobní entity se ukládají zašifrované. Technická metadata trezoru (že trezor existuje a jaký má profil) v prohlížeči jsou, aby šel vybrat a odemknout. Typy entit v trezoru: | Typ | K čemu je | |---|---| | JournalEntry v1 | krátký text mimo zápisník | | JournalEntry v2 | zápis, rozpracovaný zápis, položka koše | | Episode | pojmenované seskupení zápisů | | Tag | vlastní štítek | | MetricDefinition | název a rozsah ukazatele, verze významu | | Measurement | hodnota ukazatele u jednoho zápisu, nebo prázdno | | ProductPackage | balíček v lékárničce | | UseEvent | záznam užití se snímkem názvu | | StudyNote | poznámka k pojmu slovníku | | PackageExpense | výdaj v jedné měně | Neznámá entita, která schématu neodpovídá, se při čtení nepřijme jako platný záznam. Konflikt revize (očekávané číslo nesedí): „Záznam mezitím někdo upravil. Obnovte detail a zkuste to znovu.“ Odkaz na neexistující epizodu, štítek nebo ukazatel: „Data odkazují na epizodu, štítek nebo ukazatel, který už neexistuje.“ Místo v prohlížeči: „V úložišti prohlížeče není dost místa. Záznam se neuložil.“ ## 11. Čas události Typ `UncertainTime` má šest podob. Chybějící přesnost se nevymýšlí. | Podoba | Data | Text v UI | |---|---|---| | unknown | — | Neznámý čas události | | day | `YYYY-MM-DD` | Den {datum} | | month | `YYYY-MM` | Měsíc {měsíc} | | year | rok 1000–9999 | Rok {rok} | | range | dva dny, od ≤ do | Období {od} – {do}; když jsou stejné, „Den {od}“ | | instant | text ISO do 40 znaků | Okamžik {iso} | Klíč řazení: neznámý čas `9999`, měsíc `{měsíc}-15`, rok `{rok}-07-01`, období podle prvního dne, okamžik podle ISO textu. Seznam zápisů i časová osa řadí sestupně, proto je neznámý čas (klíč `9999`) před datovanými položkami. Graf řadí body vzestupně, od staršího klíče. Pro filtr období a kalendář se čas převede na rozsah dnů: - den: ten jeden den; - okamžik: prvních 10 znaků, pokud je to datum; - měsíc: od 1. do posledního dne měsíce; - rok: 1. leden až 31. prosinec; - období: od–do; - neznámý: do filtru ani kalendáře nevstoupí. Záznam se ve filtru od–do ukáže, když se jeho rozsah dnů s filtrem překrývá. Nevyplněné „od“ znamená začátek, nevyplněné „do“ znamená konec. Čas zápisu `recordedAt` je vždy okamžik uložení v ISO a je na detailu zvlášť jako „Čas zápisu“. Není to čas, kdy se věc stala. ## 12. Studovna — slovník a materiály Vnitřní navigace Studovny: „Slovník“, „Materiály“, „Podklady na konzultaci“. Výchozí je slovník. Slovník a materiály fungují i bez odemčeného trezoru. Stav uložení poznámky u pojmu: prázdné / „Ukládám…“ / „Uloženo.“ / text chyby. Slovník je soubor `public/content/glossary-v1.json`: - `packageId`: `hps-glossary-cs-v1` - `contentSchemaVersion`: 1 - `language`: cs - provenience zobrazená v UI: „Syntetické studijní texty aplikace Homeopatický prostor. Nejsou to skeny knih ani materia medica. Slouží k orientaci v pojmech.“ Hledání `termMatchesQuery`: ořízne mezery, převede na malá písmena podle češtiny, sundá diakritiku (NFD a značky) a hledá podřetězec v nadpisu, aliasech a literárním shrnutí. Prázdný dotaz propustí všechny pojmy. Pole se při psaní překreslí a ponechá rozepsaný dotaz. Žádná shoda: „Žádný pojem neodpovídá hledání.“ Načítání: „Načítám slovník…“. Seznam vykreslí prvních 100 pojmů. Když jich je víc, je „Načíst další (n)“ a každé kliknutí přidá 100. Nový dotaz počet vrátí na 100. Řádek seznamu je nadpis a kategorie. Klik otevře detail. „← Slovník“ se vrátí. Detail: - nadpis; - kategorie a aliasy oddělené čárkou, pokud nějaké jsou; - sekce „V literatuře“ = `literatureSummary`; - sekce „Jak to bere tato aplikace“ = `contemporaryNote`; - řádek „Kde je nejistota: …“, jen když `uncertainty` není null; - „Moje poznámka“. Bez odemčení: „Poznámku uložíte po odemčení trezoru v Nastavení.“ S odemčením: textové pole max. 10 000 znaků a „Uložit poznámku“. Uložení chce zapisující kartu. Úspěch: „Poznámka ke studiu je uložená v trezoru.“ Na jeden `termId` je jedna poznámka; další uložení ji aktualizuje. Prázdný text poznámku přepíše prázdným obsahem (pole jde vymazat uložením). ### Pojmy v slovníku Balíček obsahuje **34 pojmů** (`ids` v pořadí souboru): repertorium, rubrika, materia-medica, potence, similimum, proving, modalita, epizoda, vital-force, single-remedy, nosode, sarcodes, aggravation, amelioration, keynote, constitution, miasm, repertorization, avogadro, totality, generals-particulars, locality, concomitant, similia-principle, organon-historical, mother-tincture, lm-scale, pathogenesis, complementary-remedy, inimical-remedy, isopathy, globule, alternation, antidote-term. Úplné texty (literatura, současná orientace, nejistota) jsou v JSON; UI zobrazuje stejnou strukturu jako u původního jádra slovníku. Kategorie v UI: - pojem → „Pojmy“ - repertorium → „Repertorium a rubriky“ - latina → „Kategorie látek“ - praxe → „Praxe a záznamy“ ### Studijní materiály Soubor `public/content/study-materials-v1.json` (**6 listů** v češtině; technické `packageId` je v JSON, v UI se nezobrazuje): dual-perspective, rubrics-and-modifiers, potency-labels, journal-vs-literature, safe-study, using-study-room. Seznam má nadpis, shrnutí a hledání v nadpisu, shrnutí a těle sekcí (`materialMatchesQuery`). Detail listu: sekce s nadpisy odstavců, volitelně tlačítka „Související pojmy ve slovníku“ (přepne na detail pojmu). „← Materiály“ se vrátí na seznam. ## 13. Studovna — podklady na konzultaci Bez odemčeného trezoru: nadpis „Připravit podklady na konzultaci“ a „Nejdřív odemkněte trezor. Pak si můžete z vlastních záznamů připravit jednostránkový přehled k tisku. Nic se nikam neodesílá.“ S trezorem nadpis „Připravit podklady na konzultaci“ a „Vyberte, co chcete mít na papíře. Náhled i tisk zůstanou u vás v prohlížeči.“ Pole: - „Téma návštěvy“, text, max. 300, při čtení se oříznou krajní mezery. - „Vlastní otázky“, textarea, max. 5 000, krajní mezery se oříznou. - Skupina hotových zápisů (ne drafty, ne koš). Každý řádek: čas události, pomlčka, nadpis nebo „bez nadpisu“. Když žádné nejsou: „Zatím nejsou hotové zápisy k výběru.“ - Skupina aktivních balíčků, jen když nějaké jsou. Archivované v nabídce nejsou. - Zaškrtávátko „Přidat až 5 nedávných záznamů užití“. Tlačítko „Náhled obsahu“ vypíše odrážky: - Téma: text, nebo „—“. - Otázky: „ano“, nebo „neuvedeno“. - Vybrané zápisy: počet. - až 8 řádků „· {čas} — {nadpis}“. - „Balíčky v seznamu: {n}“, jen když je nějaký vybraný. - „Nedávná užití: max. 5 položek v tisku“, jen když je volba zapnutá. - „Není diagnóza ani doporučení léčby.“ „Náhled tisku“ odmítne prázdný výběr: „Vyberte alespoň jeden zápis, balíček nebo záznamy užití.“ Jinak vloží HTML do skrytého rámce `#hps-print-frame` a po načtení zavolá tisk. Když se rámec neotevře: „Prohlížeč zablokoval okno — povolte vyskakovací okna pro náhled tisku.“ Pod formulářem je odkaz **Objednat konzultaci** na `https://homeopatiepisek.cz/kontakt/` (`target="_blank"`, `rel="noopener"`). Tiskový dokument: - titulek „Podklady na konzultaci“; - „Vytvořeno {ISO čas}. Jen vámi vybraný obsah — ne diagnóza ani doporučení léčby.“ - sekce tématu, nebo „— neuvedeno —“; - vlastní otázky, pokud jsou; - nejvýše 8 zápisů, u každého nadpis, čas a nejvýše 600 znaků těla, delší text má trojtečku; - vybrané aktivní balíčky jako název a případně „ — {místo uložení}“; - nejvýše 5 záznamů užití v pořadí, v jakém jsou uložené: čas a název ze snapshotu; - sazba A4, okraj 12 mm, písmo „Segoe UI“, system-ui, sans-serif, čeština. Aplikace na otázky neodpovídá a dokument nikam neposílá. ## 14. Deník — obrazovky Panel má nadpis **Deník**. Po připraveném trezoru se načtou entity. Stav uložení (`#journal-save-state`) je prázdný, „Ukládám…“, „Uloženo.“, nebo text chyby (třída `error`). V panelu může být připomínka zálohy (`#backup-reminder`). Vnitřní navigace (`aria-label` „Deník“): **Zápisy**, **Přehled**, **Epizody a štítky**, **Koš**, plus tlačítko **Nový zápis** (`#journal-new-btn`). ### Zápisy (seznam) Nadpis „Seznam zápisů“. Filtry: - „Hledat v textu“ — `type="search"`, bez autocomplete, při každém vstupu překreslí seznam a kurzor zůstane v novém poli (hodnota se do filtru uloží). - „Epizoda“ — „— vše —“ plus všechny epizody. - „Štítek“ — „— vše —“ plus všechny štítky. - „Období od (den)“ a „Období do (den)“; - zaškrtávátko **Rozpracované** (`#journal-filter-drafts`) — místo samostatné záložky Rozpracované. Hledaný text se ořízne, převede na malá písmena (`cs`) a sundá diakritiku stejně jako slovník. Shoda je podřetězec nadpisu, těla nebo oddílů kontext, průběh a poznámky. „epizoda“ tedy najde „epizódu“. V1 krátký text se bere jako tělo. Seznam ukáže 100 řádků a „Načíst další (n)“. Změna filtru počet vrátí na 100. Filtr epizody a štítku propustí jen JournalEntry v2 s daným id. Období používá překryv dnů z oddílu 11. V1 záznam při vyplněném období vypadne, protože nemá čas v2. Prázdný výsledek: „Žádné zápisy neodpovídají filtru.“ Řádek je náhled: nadpis v2, jinak tělo oříznuté na 80 znaků plus „…“. Klik otevře detail. **Hromadný výběr (J18):** tlačítko „Hromadný výběr“, zaškrtnutí, operace přiřadit štítek / epizodu / přesunout do koše, náhled rozsahu, tlačítko „Provést operaci“ až po náhledu; změna operace nebo výběru náhled zruší. Vyhledávací index je v paměti karty a při zámku se smaže. Po odemčení se staví znovu z dešifrovaných dat. Dotaz na server neodchází. Rozpracované zápisy se zobrazí ve filtru seznamu; řádek má „(rozpracované)“. Prázdný filtr: „Žádné rozpracované zápisy.“ ### Editor Nadpis podle situace: „Nový zápis“, „Pokračovat v rozpracovaném“, nebo „Upravit zápis“. Pole: - „Nadpis (nepovinný)“, max. 300. - „Hlavní text“, 6 řádků, max. 20 000 (kontrola schématu). - Skupina „Podrobný zápis (nepovinné oddíly)“: - „Kontext / předcházející stav“ - „Průběh“ - „Poznámky“ - každý oddíl max. 10 000 znaků; prázdný se neukládá jako vyplněný. - „Okolnosti (volitelné)“, textarea max. 10 000 — vlastní popis okolností (J12). - „Současná péče (volitelné)“, textarea max. 10 000 — paralelní péče mimo homeopatii (J14). - Skupina „Čas události“, přepínače `journal-time`: - Neznámý (výchozí u nového); - Den + `input type="date"`; - Měsíc + `type="month"`; - Rok + číslo 1000–9999, placeholder 2026; - Období (od–do), dvě data, popisky „Od“ a „Do“ jsou jen pro čtečky; - Okamžik (ISO), text, placeholder `2026-10-31T12:00:00.000Z`. - „Epizoda“, výběr „— žádná —“ nebo název. - „Štítky“, zaškrtávací pole. Bez štítků: „Nejdřív vytvořte štítek ve správě.“ Tlačítka u nového a u draftu: „Uložit jako hotový zápis“, „Uložit rozpracované“, „Zpět“. U úpravy hotového: „Uložit zápis“ a „Zpět“. „Zpět“ zruší čekající automatické uložení. Když je vybraný zápis, vrátí jeho detail, jinak seznam. Z editoru nového zápisu a z rozpracovaného (tam se výběr maže) tedy „Zpět“ otevře seznam, ne záložku Rozpracované. U nového zápisu a u rozpracovaného se při psaní do hlavního textu po 900 ms od posledního znaku samo uloží draft. Uloží se nadpis (jak je v poli v tu chvíli) a tělo. Oddíly, čas, epizoda a štítky se při tomto automatickém kroku nezapisují. Úplně nový draft vznikne s časem události „neznámý“. Úprava hotového zápisu se po 900 ms neukládá. Když se v ní něco změnilo (`beforeunload`), prohlížeč při zavření nebo obnovení karty zobrazí vlastní varování. Vlastní českou větu do toho dialogu aplikace nedostane. Hotový zápis vyžaduje neprázdné tělo: „Text zápisu nesmí být prázdný.“ Zvolený čas musí být vyplněný, jinak se hotový zápis neuloží: - den: „Vyplňte platné datum u volby „Den“, nebo zvolte „Neznámý“.“ - měsíc: „Vyplňte platný měsíc u volby „Měsíc“, nebo zvolte „Neznámý“.“ - rok: „Vyplňte platný rok (1000–9999) u volby „Rok“, nebo zvolte „Neznámý“.“ - okamžik: „U volby „Okamžik“ vyplňte text času, nebo zvolte jiný typ.“ (v přepínači je popisek „Okamžik (ISO)“; text smí mít 1–40 znaků) - období bez dat: „U volby „Období“ vyplňte platná data od a do, nebo zvolte jiný typ.“ - období s pozdějším začátkem: „Datum „od“ nesmí být později než „do“.“ Přepínač i validační věty používají „Neznámý“. Hotový zápis dostane `isDraft: false`. Rozpracovaný `isDraft: true` a v seznamu hotových není. `recordedAt` se nastaví při vytvoření. Revize začíná na 1 a při uložení roste. Když se změní nadpis, tělo nebo oddíly, dosavadní znění se připojí do `contentRevisions` (nejvýše 20, starší se z pole zahodí). Změna epizody, štítků, času nebo koše historii textu nepřidá. Prázdné oddíly se ořežou a když jsou všechny prázdné, `sections` se neuloží. Úspěch: „Zápis je uložený.“ a otevře se detail toho id. ### Detail Když nic není vybrané: „Vyberte zápis ze seznamu.“ Když id není v2: „Zápis nebyl nalezen.“ Zobrazí se: - nadpis, nebo „Zápis bez nadpisu“; - „Čas události: …“; - „Čas zápisu: {ISO}“; - „Revize: {číslo}“; - „Epizoda: …“, jen když je; - „Štítky: …“, čárkami, jen známé názvy; - tělo; - nadpisy „Kontext“, „Průběh“, „Poznámky k zápisu“, jen u neprázdných oddílů; - „Okolnosti“ a „Současná péče“, jen u neprázdných polí; - sbalená historie, jen když existuje; - „Ukazatele“. Historie: `details` s „Historie úprav textu ({počet})“. Položky od nejnovější. Řádek „Revize {n} ({savedAt}) — {nadpis}“ a tělo oříznuté na 400 znaků. Ukazatele: pro každou definici číslo s min a max aktuální `definitionVersion`, placeholder „prázdné = chybí“. Když definice nejsou: „Nejdřív vytvořte ukazatel ve správě.“ Mimo koš je „Uložit ukazatele“. Prázdné pole uloží `value: null`, což není nula. Hodnota se váže na id definice a na její aktuální verzi. Měření starší verze škály se v tomto formuláři neukáže jako vyplněné číslo aktuální verze. Mimo koš: „Upravit“, „Přesunout do koše“ (stav „Zápis je v koši.“), „Zpět“ (na seznam). V koši: „Obnovit ze koše“ („Zápis je obnovený.“), „Trvale smazat“ (nejdřív „Trvale smazat tento zápis včetně jeho ukazatelů? Tuto akci nelze vrátit.“, po potvrzení „Zápis byl trvale odstraněn.“ a návrat do koše), „Zpět“ (do koše). Ukazatele v koši uložit nejdou. Úspěch ukazatelů: „Ukazatele jsou uložené.“ Prázdné pole je `null`, ne nula. Nečíslo: „Neplatná hodnota ukazatele.“ Mimo min–max: ve stavu „Hodnota musí být mezi {min} a {max}, nebo prázdná.“ a ve stavové větě „Hodnota ukazatele mimo rozsah {min}–{max}.“ ### Koš Nadpis „Koš“. „Zápisy v koši nejsou v seznamu ani exportu. Obnovte je, nebo trvale smažte.“ Prázdný: „Koš je prázdný.“ Položky jsou hotové zápisy s `deletedAt`. Draft se sem tímto postupem neukládá. Obnova smaže `deletedAt`. Trvalé smazání odstraní zápis a jeho měření. Čas přesunu do koše je ISO v `deletedAt`. **Hromadný výběr (J18b):** tlačítko „Hromadný výběr“, zaškrtnutí zápisů, operace obnova nebo trvalé smazání, náhled rozsahu a potvrzení před provedením (stejný vzor jako u seznamu hotových zápisů). ### Epizody, štítky, ukazatele Nadpis „Správa“. Epizody: seznam, u aktivní „Upravit“ a „Archivovat“. Formulář úpravy: název max. 200, poznámka max. 5 000, „Uložit epizodu“, „Zrušit“. Nová: „Nová epizoda“, „Poznámka“, „Přidat epizodu“. Prázdný seznam: „Zatím žádná epizoda.“ Archiv nastaví `archivedAt` a není označením uzdravení. Zápisy s `episodeId` zůstanou. Epizoda se v této verzi nemaže natrvalo, jen archivuje. Štítky: název max. 80, „Přidat štítek“, u každého „Odebrat štítek“. Prázdné: „Zatím žádný štítek.“ Před odebráním: „Odebrat štítek ze všech zápisů? Text zápisů zůstane. Štítek samotný zmizí.“ Po potvrzení se štítek smaže a z každého zápisu se vyhodí jeho id. Text zápisu zůstane. Ukazatele: název max. 120, „Minimum“ výchozí 0, „Maximum“ výchozí 10, „Přidat ukazatel“. Prázdný název: „Název ukazatele nesmí být prázdný.“ Stejná věta platí u revize škály. Minimum musí být menší než maximum a hodnota musí ležet v rozsahu, jinak: „Rozsah ukazatele nesedí. Minimum musí být menší než maximum a hodnota musí ležet v rozsahu, nebo zůstat prázdná.“ To není věta o odmítnutém souboru zálohy. Úspěšná revize: „Ukazatel má novou verzi škály ({číslo}).“ Prázdný název epizody: „Název epizody nesmí být prázdný.“ Prázdný štítek: „Název štítku nesmí být prázdný.“ V seznamu je „{název} {min}–{max} (verze {n})“ a „Revize škály“. Revize má název, min, max, „Uložit revizi škály“, „Zrušit“. Nová verze zvýší `definitionVersion`. Stará měření zůstávají u starého čísla verze. Graf a formulář detailu používají jen aktuální verzi. Prázdné: „Zatím žádný ukazatel.“ ## 15. Přehled v Deníku (záložka Přehled) Přehled není samostatný hlavní panel — je vnitřní záložka Deníku (`data-view="prehled"`, mount `overview-ui` v `#journal-view` / overview pane). Nahoře může být souhrnný řádek (`formatVaultSummaryLine`) — např. skloňované počty hotových zápisů, rozpracovaných a aktivních balíčků; prázdný řádek se skryje. Filtr „Od (den, volitelné)“ a „Do (den, volitelné)“. Špatné pořadí: „Datum „Od“ nesmí být později než „Do“.“ Filtr platí pro časovou osu a graf; zápisy s neznámým časem při filtru období nejsou na ose. V klidném režimu je skrytý blok s grafem ukazatele (kalendář a časová osa zůstávají); nápověda: „Klidný režim skrývá graf. Kalendář a časová osa zůstanou.“ Funkce `computeCompleteness` / `completenessHints` a `buildVaultAudit` jsou v kódu a testech, ale **v aktuálním UI se nevykreslují** (dřívější bloky „Úplnost“ a „Audit vlastních dat“). Logika souhrnu mezer pro referenci: - hotové zápisy; - rozpracované; - v koši; - hotové zápisy v2 s neznámým časem; - aktivní balíčky a počet všech užití (věta „{n} aktivních balíčků · {m} záznamů užití“). „Úplnost záznamů“. Nápověda: „Informativní souhrn mezer — bez hodnocení vás jako uživatele.“ Věty: - „Zatím nejsou hotové ani rozpracované zápisy.“ když jsou oba počty 0. - Skloňovaná věta o hotových zápisech bez času události (např. „1 hotový zápis nemá…“, „2 hotové zápisy nemá…“, „5 hotových zápisů nemá…“). - Skloňovaná věta o rozpracovaných zápisech (např. „1 rozpracovaný zápis čeká…“, „3 rozpracované zápisy čekají…“). - „{n} zápisů je v koši.“ - když žádná mezera a existuje hotový zápis: „U hotových zápisů je čas události vyplněný u všech zobrazených položek v tomto souhrnu.“ „Audit vlastních dat“. Nápověda: „Počty kategorií v trezoru — ne bezpečnostní audit.“ Řádky: - Hotové zápisy - Rozpracované zápisy (draft bez deletedAt) - Zápisy v koši - Epizody (včetně archivovaných) - Štítky - Ukazatele - Měření ukazatelů - Balíčky lékárničky (aktivní i archiv) - Záznamy užití - Studijní poznámky - Evidence výdajů - Zápisy s historií úprav Pod tím „{n} uložených entit celkem · {přílohy} příloh“. Přílohy jsou 0. Doplňky: „Přílohy v této verzi nejsou implementované (počet 0).“ a „Údaje jsou v prohlížeči šifrované; tento přehled neznamená bezpečnostní audit.“ „Kalendář zápisů“. „Počty podle dne události. Neznamená výskyt nemoci.“ Pole měsíc, výchozí aktuální měsíc prohlížeče, a tlačítka „Předchozí měsíc“ a „Další měsíc“ (posun přes `Date.UTC`). Seznam není mřížka: jen dny, které mají aspoň jeden hotový zápis nebo užití. Text „{den}: {n} zápisů, {m} užití“. Vícedenní rozsah se přičte ke každému dni. Rozsah delší než 400 dnů se utne. Prázdné: „V tomto měsíci nejsou zápisy ani užití s určeným dnem.“ Nadpis „Časová osa“. Začíná na 40 položkách. Když výsledek má přesně délku limitu, je „Dalších 40“. Zápis: tlačítko „otevřít“ přepne Deník na detail zápisu. Prázdné: „V zvoleném období zatím nic k zobrazení.“ „Ukazatel v čase“ — graf z vlastních čísel, bez diagnózy. Bez definic: „Nejdřív si v deníku vytvořte ukazatel.“ Bez bodů: „U tohoto ukazatele v období zatím nejsou vyplněné hodnoty.“ „Tabulka ke grafu“. Sloupce Popisek, Hodnota, Rozsah. „Stáhnout data grafu (CSV)“ stáhne stejné body do souboru `homeopaticky-prostor-graf.csv`. Soubor začíná znakem U+FEFF. Hlavička: ukazatel, čas události, popisek, hodnota, min, max. Čas události v CSV grafu je řadící klíč (u měsíce tedy `{měsíc}-15`, u roku `{rok}-07-01`), ne nutně text z obrazovky. Buňky mají stejnou ochranu jako export CSV. Bez vybraného ukazatele: „Nejdřív vyberte ukazatel v přehledu.“ Bez bodů: „Pro stažení CSV nejsou v období žádná data grafu.“ Úspěch: „CSV s daty grafu bylo nabídnuto ke stažení.“ ## 16. Lékárnička Záložky: „Přehled balíčků“, „Cestovní seznam“, „Výdaje“, „Nový balíček“. Stav uložení stejný jako u zápisníku. Po odemčení se otevře seznam balíčků. Po návratu na skrytou kartu a zpět se seznam také otevře znovu (rozepsaný formulář, který byl jen v DOM, zmizí). ### Seznam a detail Nadpis „Balíčky“. Řádek je název, u archivovaného „ (archiv)“. Klik otevře detail. Detail: - název; - „Stav: aktivní“ nebo „archivovaný“; - výrobce, forma, potence, šarže, expirace, „Otevřeno: {YYYY-MM-DD}“, umístění, poznámka — jen když jsou vyplněné; - „Historie užití“; - bez užití: „Zatím žádné zaznamenané užití.“; - řádek užití: čas, název ze snapshotu, a pokud je popis, „: {popis}“. Množství / poznámka k balení (`quantityText`) je ve formuláři úpravy, na detailu se v této verzi nezobrazuje. Aktivní balíček: „Upravit balíček“, „Zaznamenat užití“, „Archivovat“, „Zpět“. Archivovaný: jen „Zpět“. Archivace nastaví stav `archived` a čas `archivedAt`. Stará užití zůstávají. Nové užití ani úprava u archivu v UI nejsou. Hláška: „Balíček je archivovaný.“ ### Nový balíček - „Název balíčku“, max. 200, povinný po oříznutí. Prázdný: „Název nesmí být prázdný.“ - „Výrobce (nepovinné)“, max. 200. - „Forma (nepovinné)“, max. 120. - „Potence / text (nepovinné)“, max. 120. Jde o text z obalu, ne o volbu aplikace. - „Šarže (nepovinné)“, max. 120. - Expirace: přepínače Neuvedeno, Den, Měsíc, Rok (číslo, placeholder 2026). Neplatná hodnota se uloží jako neuvedeno. - „Datum otevření balení (nepovinné)“, `type="date"`. Uloží se jen `YYYY-MM-DD`. - „Místo uložení (nepovinné)“, max. 200. „Uložit“ a „Zpět“. Úspěch: „Balíček je uložený.“ a otevře se detail. Šarže, expirace, otevření a místo se po vytvoření zapíší druhým uložením, když jsou vyplněné. ### Úprava „Upravit balíček“ má navíc „Množství / poznámka k balení“ (max. 200) a „Poznámka“. Ostatní pole jako při vytvoření, předvyplněná. „Uložit změny“, „Zpět“. ### Užití „Zaznamenat užití“. „Volitelný popis množství — bez interpretace aplikace.“ Čas: Neznámý (výchozí), Den, Měsíc. Rok, období a okamžik tady nejsou. „Popis (nepovinné)“, max. 500. „Uložit užití“, „Zpět“. Vznikne UseEvent: čas, `recordedAt` teď, `packageId`, snapshot `{displayName, manufacturer, form, dilutionText}` z balíčku v okamžiku uložení, `userAmountText`, `journalEntryId` null (formulář zápis se zápisem nespojuje). Hláška: „Užití je zaznamenané (včetně tehdejšího stavu balíčku).“ Pozdější přejmenování balíčku snapshot nemění. ### Cestovní seznam „Cestovní seznam“. Zaškrtávací seznam balíčků podle `displayName` (včetně archivovaných, seznam bere balíčky, které UI vykreslí — v kódu seznamu jsou všechny `productPackages`). „Náhled tisku seznamu“. Tisk: - titulek „Cestovní seznam — lékárnička“; - „Vytvořeno {ISO}. Jen váš přehled, ne rada k dávkování.“; - u položky: název, forma, text potence, „místo: …“, „exp.: {text času}“ — jen neprázdné části oddělené „ · “; - nic nevybráno: „— žádný balíček nebyl vybrán —“. ### Výdaje „Evidence výdajů“. Nahoře součty po měnách, například „Součet CZK: 199,50 Kč“. Nula a chybějící měna se nevypíší. Když nic není: „Zatím žádné zaznamenané výdaje.“ Měny se nesčítají dohromady a nepřepočítávají. Formulář: - „Den nákupu“, `type="date"`, povinný tvar `YYYY-MM-DD`. - „Popis“, max. 200. - „Částka“, text, `inputmode="decimal"`, placeholder „např. 199,50“. Čárka i tečka jsou desetinné znaménko. Ukládá se jako celé číslo nejmenších jednotek (haléře, centy). - „Měna“: CZK, EUR, USD. - „Balíček (volitelné)“: „— žádný —“ nebo aktivní/vypsané balíčky. - „Poznámka“, max. 2 000. - „Uložit výdaj“. Seznam má u položky „Smazat“. Nejdřív: „Smazat tento výdaj? Tuto akci nelze vrátit.“ Po potvrzení se odstraní jen ten výdaj. Seznam balíčků ukáže 100 řádků a „Načíst další (n)“. ## 17. Export, CSV, Markdown, tisk, ICS V **Nastavení** ve sbaleném bloku `details` „Export a tisk“ (`#vault-export-details`, nadpis `#export-nadpis`). Vnitřní text „Přenositelný výpis“ a věta, že soubory vznikají jen v prohlížeči. UI mountuje `#export-root`. ### Rozsah Výchozí zaškrtnutí: | Pole | Id | Výchozí | |---|---|---| | Hotové zápisy | export-journal | ano | | Rozpracované zápisy | export-drafts | ne | | Epizody | export-episodes | ano | | Štítky | export-tags | ano | | Ukazatele a měření | export-metrics | ano | | Balíčky lékárničky | export-cabinet | ano | | Výdaje lékárničky | export-expenses | ano | | Záznamy užití | export-use | ano | | Studijní poznámky | export-notes | ne | | Obecné popisky místo názvů | export-pseudonym | ne | Nápověda u obecných popisků: „Pseudonymizace mění jen názvy balíčků a zápisů — texty těla zůstávají beze změny.“ Při zapnutí se do náhledu přidá věta, že režim neslibuje anonymitu a citlivé údaje mohou zůstat v textu. Obecný popisek zápisu je „Zápis {pořadí}“, balíčku „Balíček {pořadí}“, výdaje „Výdaj {pořadí}“. Co se skutečně přepíše: - CSV: nadpis zápisu, název balíčku, popis výdaje. Snapshot užití (`productSnapshot.displayName`) se nemění. - Markdown: nadpis zápisu a popis výdaje. Název balíčku v Markdownu zůstává původní. Tělo zápisu zůstává. Oddíly kontext/průběh/poznámky Markdown neobsahuje, jen hlavní text. - JSON: entity zůstanou s původními texty. V `exportSchemaDescription` se připojí věta o režimu a v `scope.pseudonymize` je `true`. - Tisk výpisu názvy nemění. Když ve zvoleném rozsahu nic není, v tisku je „V zvoleném rozsahu nejsou žádné položky.“ „Od (den, volitelné)“, „Do (den, volitelné)“. Alespoň jedna kategorie: jinak „Vyberte alespoň jednu kategorii v rozsahu exportu.“ Špatné pořadí dat: „Datum „Od“ nesmí být později než „Do“.“ Koš se neexportuje. Studijní poznámky jdou do výpisu jen se zaškrtnutím `export-notes`. Období je nefiltruje. Obecný režim jejich text nemění. V `.hpsbackup` jsou vždy. „Náhled rozsahu“ vypíše `previewLines` dokumentu (počty a rozsah). Když trezor není otevřený: „Trezor není odemčený.“ ### JSON Soubor `homeopaticky-prostor-vypis.json`, `application/json`. Obsah: - `exportSchemaVersion`: 1 - `exportSchemaDescription`: „Přenositelný výpis z aplikace Homeopatický prostor. JSON obsahuje přesná data; CSV je zjednodušená tabulka s ochranou před spuštěním vzorců v tabulkovém editoru. Není léčebný výpis ani diagnóza.“ a při obecných popiscích ještě věta o anonymitě - `generatedAt`: ISO - `scope`: přesně to, co bylo zaškrtnuté, včetně dnů a `pseudonymize` - `entities`: filtrované zápisy, epizody, štítky, definice, měření, balíčky, výdaje, užití a při zaškrtnutí i studijní poznámky Stav: „Soubor JSON byl nabídnut ke stažení.“ ### CSV Soubor `homeopaticky-prostor-vypis.csv`, `text/csv;charset=utf-8`. Na začátku je znak U+FEFF. Hlavička: typ, id, název, čas události, text. Řádky: - JournalEntry: typ, id, nadpis (nebo obecný popisek), text času, tělo. - ProductPackage: typ, id, název nebo „Balíček n“, stav `active`/`archived`, poznámka. - UseEvent: typ, id, název snapshotu, text času, popis množství. - PackageExpense: typ, id, popis nebo „Výdaj n“, den nákupu, částka s měnou a případně „ — {poznámka}“. - StudyNote, jen když je zaškrtnutá: typ, id, id pojmu, čas záznamu, text. `csvSafeCell`: když hodnota začíná `=`, `+`, `-`, `@`, tabulátorem nebo koncem řádku, předřadí se tabulátor. Když obsahuje uvozovku, čárku nebo konec řádku, obalí se uvozovkami a uvozovky se zdvojí. ### Markdown Soubor `homeopaticky-prostor-vypis.md`. Čitelný text s časem vytvoření, rozsahem a sekcemi podle vybraných dat. Obecný režim přidá upozornění, že nejde o slib anonymity. ### Tisk výpisu „Náhled tisku“ otevře HTML se stejnými filtrovanými daty, českou sazbou a datem vytvoření ve skrytém rámci `#hps-print-frame`. Titulek je „Výpis — Homeopatický prostor“, nadpis „Přenositelný výpis“, věta „Není diagnóza ani doporučení léčby.“ Písmo je „Segoe UI“, system-ui, sans-serif. Když se rámec neotevře, náhled se vloží pod tlačítka a stav řekne: „Blokátor oken — náhled tisku je zobrazen níže. Použijte tisk stránky prohlížeče.“ Obecný režim popisků se v tomto HTML neprojeví. Zaškrtnuté studijní poznámky v tisku jsou. ### ICS Tlačítko „Stáhnout kalendář (.ics)“ nezávisí na zaškrtnutí rozsahu exportu. Bere všechny hotové zápisy mimo koš. Soubor `homeopaticky-prostor-zapisy.ics`, `text/calendar;charset=utf-8`. Kalendář: - `BEGIN:VCALENDAR`, `VERSION:2.0`, `PRODID:-//Homeopaticky prostor//CS`, `CALSCALE:GREGORIAN` - `X-HPS-DISCLAIMER` říká, že nejde o klinickou událost ani diagnózu a že import může synchronizovat s jiným kalendářem - událost jen když čas je jeden den, jeden okamžik, nebo rozsah s jediným dnem - měsíc, rok, vícedenní období a neznámý čas se vynechají - `SUMMARY` je vždy „Záznam — Homeopatický prostor“ - `DESCRIPTION` začíná „Osobní záznam z aplikace. Ne diagnóza.“, pak nadpis do 120 znaků a tělo do 500; diakritika zůstává - texty v události escapují `\`, `;`, čárku a konce řádků podle RFC 5545 - `DTSTAMP` je u každé události - `UID` je `{id}@hps-local` - celodenní `DTSTART;VALUE=DATE`, okamžik v UTC Nápověda pod tlačítky: „Soubor .ics lze otevřít v kalendáři. Může se synchronizovat s jinými zařízeními nebo službami — obsahuje vámi zvolené časy událostí, ne diagnózu.“ Stav po stažení začíná „Soubor ICS byl nabídnut ke stažení.“ a pokračuje tou samou nápovědou. ## 18. Diagnostika prohlížeče Sbalený blok vypíše řádky „Web Crypto“, „IndexedDB“, „Web Locks“, „Service worker“, „BroadcastChannel“ s hodnotou „dostupné“ nebo „chybí“, „Verze sestavení: {razítko buildu}“ a odhad úložiště. Odhad je „Úložiště prohlížeče: využito {usage} z {quota} (prohlížeč úložiště drží|nepotvrdil|trvalost neznámá).“ Bajty do 1024 jsou „N B“, do 1 MB „N.N kB“, výš „N.N MB“. Když API chybí: „Odhad velikosti úložiště teď není dostupný.“ Při chybě: „Úložiště prohlížeče: odhad se nepodařilo načíst.“ Jde o technickou informaci, ne o zdravotní údaj. Blok data trezoru nemění. ## 19. Přesné limity polí | Pole | Maximum | |---|---| | Heslo | nesmí být prázdné; neořezává se | | Krátký text v1 | 20 000 znaků | | Nadpis zápisu | 300 | | Tělo zápisu | 20 000 | | Oddíl zápisu | 10 000 | | Historie textu | 20 snímků, náhled 400 znaků | | Název epizody | 200 | | Poznámka epizody | 5 000 | | Název štítku | 80 | | Název ukazatele | 120 | | Název balíčku | 200, nesmí být prázdný | | Výrobce, místo | 200 | | Forma, potence, šarže | 120 | | Množství balení | 200 | | Popis užití | 500 | | Popis výdaje | 200 | | Poznámka výdaje | 2 000 | | Studijní poznámka | 10 000 | | Téma konzultace | 300 | | Otázky konzultace | 5 000 | | Zápisy v tisku konzultace | 8 | | Tělo zápisu v tisku konzultace | 600 znaků | | Užití v tisku konzultace | 5 | | Osa přehledu | 40 řádků | | Kalendář, rozvinutí rozsahu | 400 dnů | | Záloha, entity v2 | 5 000 | | Záloha, entity v1 | 20 | | Záloha, otevřený obsah | 64 MiB | | Hlavička zálohy | 4 096 B | | Id entity | do 80 znaků | | ISO okamžik ve schématu času | do 40 znaků | | Rok | 1000–9999 | ## 20. Hlášky stavu a chyb (doslovně) - „Připraveno.“ - „Trezor je vytvořený a odemčený.“ - „Trezor je vytvořený. Heslo si uschovejte — bez něj data neotevřete.“ - „Trezor na tomto zařízení už existuje — zadejte heslo a odemkněte.“ - „V této kartě ještě není vybraný trezor. Nejdřív vytvořte trezor tlačítkem níže.“ - „Trezor je odemčený.“ - „Trezor je zamčený. Osobní text na stránce není zobrazený.“ - „Trezor je zamčený.“ - „Heslo trezoru bylo změněno. Zálohujte znovu s novým heslem.“ - „Nejdřív odemkněte trezor.“ - „Nové heslo se neshoduje s kontrolním zadáním.“ - „Záznam je uložený.“ - „Nejdřív odemkněte trezor. Zálohu lze vytvořit jen z odemčeného trezoru.“ - „Zadejte heslo trezoru nebo frázi zálohy (musí být stejná).“ - „Záloha byla nabídnuta ke stažení. Uložte soubor na bezpečné místo.“ - „Nejdřív vyberte soubor .hpsbackup.“ - „Zadejte frázi (stejnou jako heslo trezoru).“ - „Soubor zálohy je v pořádku (payload v…, … entit). Obnova nebyla spuštěna.“ - „Ověření zálohy proběhlo — soubor odpovídá frázi.“ - „Nejdřív trezor zamkněte. Odstranění lze jen u zamčeného trezoru.“ - „Na tomto zařízení není vybraný trezor k odstranění.“ - „Potvrďte zaškrtnutím, že chcete trezor z tohoto prohlížeče odstranit.“ - „Trezor byl odstraněn z tohoto prohlížeče. Externí soubory zálohy tím nezmizí.“ - „Trezor z tohoto prohlížeče byl odstraněn. Můžete vytvořit nový nebo obnovit ze zálohy.“ - „Vyberte soubor zálohy (.hpsbackup).“ - „Zadejte frázi ze zálohy (stejnou jako heslo trezoru při vytvoření zálohy).“ - „Původní trezor v této kartě nebyl porovnán.“ - „Původní trezor v prohlížeči zůstal beze změny.“ - „Původní trezor se oproti očekávání změnil — zkontrolujte obě kopie.“ - „Obnovený trezor je uložený, ale nepodařilo se ho hned otevřít.“ - „Obnovený trezor je aktivní.“ - „Obnova skončila. Pracujete v obnovené kopii trezoru.“ - „Trezor je teď skrytý. Vraťte se prosím do aplikace.“ - „Nejdřív odemkněte trezor.“ - „Tato karta zapisuje.“ - „Tato karta nezapisuje. Pro úpravy použijte jednu hlavní kartu.“ - „Zápis není v tomto prohlížeči plně dostupný; čtení a stažení zálohy ano.“ - „Heslo nesouhlasí, nebo jsou data poškozená. U zálohy musí jít o stejné heslo, jakým byl soubor vytvořen.“ - „Uložení se nepovedlo. Záznam se neuložil.“ - „V úložišti prohlížeče není dost místa. Záznam se neuložil.“ - „Z této karty teď nelze zapisovat. Otevřete aplikaci v jedné hlavní kartě prohlížeči.“ - „Soubor zálohy se nepodařilo použít. Původní trezor zůstal beze změny.“ - „Tato verze aplikace tento typ trezoru neotevře.“ - „Relace už neplatí. Nejdřív trezor znovu odemkněte.“ - „Heslo nesmí být prázdné. Mezery se samy neořežou.“ - „Hesla se neshodují. Záleží i na mezerách a velikosti písmen.“ - „Tento prohlížeč neumí vše, co trezor potřebuje. Zkuste aktuální Chrome nebo Edge.“ - „Záznam mezitím někdo upravil. Obnovte detail a zkuste to znovu.“ - „Data odkazují na epizodu, štítek nebo ukazatel, který už neexistuje.“ - „Jste bez sítě. Aplikace může běžet z paměti tohoto zařízení, trezor zůstává jen v tomto prohlížeči. Slovník a materiály ve Studovně jsou k dispozici, pokud už jste je jednou načetli.“ - „Slovník se nepodařilo načíst.“ - „Slovník není dostupný offline — zkuste obnovit stránku po instalaci.“ - „Poznámka ke studiu je uložená v trezoru.“ - „Poznámku uložíte po odemčení trezoru v Nastavení.“ - „Vyberte alespoň jeden zápis, balíček nebo záznamy užití.“ - „Prohlížeč zablokoval okno — povolte vyskakovací okna pro náhled tisku.“ - „Zápis je uložený.“ - „Název nesmí být prázdný.“ - „Balíček je uložený.“ - „Balíček je archivovaný.“ - „Užití je zaznamenané (včetně tehdejšího stavu balíčku).“ - „Datum „Od“ nesmí být později než „Do“.“ - „Vyberte alespoň jednu kategorii v rozsahu exportu.“ - „Trezor není odemčený.“ - „Soubor JSON byl nabídnut ke stažení.“ / „Soubor CSV byl nabídnut ke stažení.“ / „Soubor Markdown byl nabídnut ke stažení.“ - „Soubor ICS byl nabídnut ke stažení. “ a hned za tím nápověda o kalendáři a synchronizaci. - „CSV s daty grafu bylo nabídnuto ke stažení.“ - „Nejdřív vyberte ukazatel v přehledu.“ - „Pro stažení CSV nejsou v období žádná data grafu.“ - „Blokátor oken — náhled tisku je zobrazen níže. Použijte tisk stránky prohlížeče.“ - „Žádný pojem neodpovídá hledání.“ - „Žádné zápisy neodpovídají filtru.“ - „Žádné rozpracované zápisy.“ - „Koš je prázdný.“ - „Zápisy v koši nejsou v seznamu ani exportu. Obnovte je, nebo trvale smažte.“ - „Nejdřív si v deníku vytvořte ukazatel.“ - „Nejdřív vytvořte ukazatel ve správě.“ - „Nejdřív vytvořte štítek ve správě.“ - „U tohoto ukazatele v období zatím nejsou vyplněné hodnoty.“ - „V zvoleném období zatím nic k zobrazení.“ - „V tomto měsíci nejsou zápisy ani záznamy užití s konkrétním dnem.“ - „Zatím žádné zaznamenané užití.“ - „Zatím žádné zaznamenané výdaje.“ - „Ukládám…“ - „Uloženo.“ ## 21. Názvy stahovaných souborů - `homeopaticky-prostor-zaloha.hpsbackup` — úplná záloha trezoru - `homeopaticky-prostor-vypis.json` - `homeopaticky-prostor-vypis.csv` - `homeopaticky-prostor-vypis.md` - `homeopaticky-prostor-zapisy.ics` - `homeopaticky-prostor-graf.csv` — data pruhového grafu z Přehledu ## 22. Vzorník `/vzornik.html` má titulek „Vzorník — Homeopatický prostor“, pruh „Ukázka vzhledu — neukládá osobní data.“ a větu „Příliš žluťoučký kůň úpěl ďábelské ódy.“ Slouží ke kontrole písma a tlačítka. Na trezor není napojený. `robots` je `noindex, nofollow`. Odkaz „Zpět do aplikace“ vede na `/`. ## 23. Co uživatel v této verzi nenajde Není tu účet, přihlášení e-mailem, synchronizace mezi zařízeními (kromě ručního přenosu souboru zálohy), reklama, analytika, vzdálená AI, návrh léku podle textu, výpočet potence, OCR, čtení čárového kódu, fotografie obalu, přílohy souborů, import CSV nebo JSON zpět do trezoru, vlastní šablony zápisu, mapa těla, zvukové poznámky, rodinný trezor, rodičovský režim, evidence cizích klientů, plná knihovna, repertorium k procházení, fulltext materia medica, více oddělených grafů, porovnání období a slučování dvou souborů zálohy. Hromadné operace nad zápisy (štítek, epizoda, koš, obnova z koše) **jsou** — vždy s náhledem rozsahu a potvrzením. Instalace na plochu má technický manifest; obecné kroky jsou v dialogu Nápověda. Sbalené „Informace o prohlížeči“ na konci stránky (výchozí skryté) — bez tvrzení o certifikaci. Samostatný panel „Přehled trezoru“ a hlavní záložka „Export“ už v navigaci nejsou — přehled je v Deníku, export v Nastavení. Service worker v produkci stránku umí podržet v mezipaměti, ale aplikace to nepředkládá jako ověřený návod instalace pro všechny systémy. Přenos na jiný prohlížeč nebo počítač je ruční: stáhnout `.hpsbackup` a na druhém místě použít „Obnovit ze zálohy“ se stejným heslem zálohy. Obnova založí novou kopii, původní v prvním prohlížeči nemaže.