new-doxa-monorepo

This commit is contained in:
kankys committed 2026-08-07 09:48:59 +02:00
1 parent b4401527a3
commit 5eacbb0182
162 files changed
+21820 -2

No files matched your search

+1
View File
@@ -0,0 +1 @@
.vibe/
+25
View File
@@ -0,0 +1,25 @@
# Manifest digitální suverenity a minimalistického myšlení
### Záměr projektu:
Vytvořit absolutně nezávislé, bezpečné a minimalistické prostředí pro uchovávání lidských myšlenek, poznámek a životních reflexí. V souladu se základními principy osobní svobody a soběstačnosti aplikace vědomě odmítá cloudové databáze, servery třetích stran a centralizovaná API. DOXA věří, že lidská mysl nepotřebuje být sledována algoritmy, aby mohla růst.
### 1. Radikální Local-First Filozofie
Aplikace funguje na principu absolutní decentralizace. Běží na tvém zařízení a tam také umírá i žije.
* Žádný backend, žádné API: DOXA vědomě neobsahuje žádný kód pro odesílání dat na vzdálené servery. Tím je eliminováno riziko úniku dat, výpadku serveru nebo změny obchodních podmínek poskytovatele.
* Absolutní soukromí: Data jsou uložena výhradně v tvém prohlížeči (localStorage) nebo lokálním souboru. Co napíšeš, to zůstává tvým výhradním vlastnictvím.
## 2. Formát JSON: Trvanlivost napříč dekádami
Data jsou strukturována do otevřeného, čistého a lidsky čitelného formátu JSON. Žádné proprietární databáze.
* Tvá data ti patří. Díky možnosti manuálního exportu si můžeš svůj myšlenkový fond odnést kamkoli – uložit si ho na svůj bezpečný lokální disk, nahrát na vlastní Git (GitHub/Gitea), nebo jej synchronizovat skrze cloudovou službu, kterou ty sám uznáš za bezpečnou.
* Čistota formátu zaručuje, že tvé poznámky budou čitelné i za dvacet let na jakémkoli zařízení, bez ohledu na to, zda DOXA bude stále existovat.
## 3. Technická čistota a minimalismus (Vanilla Stack)
Pro zachování maximální rychlosti, nezávislosti a nulových externích závislostí je aplikace postavena výhradně na čistých webových standardech:
* Frontend (HTML5/CSS3): Minimalistické rozhraní, které nezatěžuje mysl barevným chaosem a vizuálním balastem moderního internetu.
*
* Logika (Vanilla JavaScript ES6+): Žádné těžkopádné frameworky (React/Vue), které podléhají módním trendům a neustálým změnám.
**Čistý kód je trvanlivý jako tesání do kamene. „Nezáleží na tom, jak složité jsou okolnosti kolem tebe. Když stavíš vlastní chrám myšlenek, začínáš od prvního kamene. Tento kód a tvá data jsou tvým vlastním, nedobytným hradem.“**— Stoický odkaz pro svobodné myslitele
+64
View File
@@ -0,0 +1,64 @@
# Návod k použití — DOXA (v26.07.01)
### Vytvoření nové poznámky
Klikni na tlačítko ➕ Nová poznámka a zadej název.
Položka se objeví v seznamu. Klikem načteš název a obsah do editoru nahoře.
Uprav obsah a klikni Uložit nyní.
## Tagy
Tagy jsou slova nebo fráze, která popisuje obsah poznámky. V aplikaci Doxa díky nim můžete filtrovat poznámky podle tagu.
* Klikni do pole tagy a zadej název tagu (uloží se stejně s poznámkou).
* Poznámku pomocí tagu pak vyhledáš v poli s lupou Filtrovat poznámky podle tagu....
### Editace a mazání
* Inline: klikni na poznámku, uprav obsah a stiskni Uložit nyní.
* Modal: klikni na ikonu ✎ vedle položky pro pokročilou editaci v modal okně.
* Mazání: ikona 🗑 u položky — po potvrzení se poznámka smaže.
### Přesouvání pořadí poznámek
Použij šipky ↑ / ↓ u položek.
Nebo přetahuj položky (drag & drop) na požadované místo — při přetažení se ukáže indikátor vložení.
### Přepínání vzhledu
V horním menu najdeš tlačítko pro přepínání vzhledu. Aplikace podporuje tři režimy:
* Světlý — ikona: ☀️
* Tmavý — ikona: 🌙
* Respektovat systém — ikona: 🌓 — aplikace bude sledovat systémovou volbu (prefers-color-scheme) a automaticky se přepne, pokud se změní systémový motiv.
Kliknutím na tlačítko v menu cyklíš mezi režimy (Light → Dark → System). Vybraná volba se uloží do localStorage pod klíčem doxa_theme a přetrvá mezi stránkami a obnovami. Pokud chceš volbu resetovat, otevři konzoli prohlížeče a spusť: localStorage.removeItem('doxa_theme') nebo vymaž storage v nástrojích pro vývojáře.
### Automatické ukládání
Aplikace nyní automaticky ukládá změny poznámek lokálně během psaní (autosave). V běžném prohlížeči se změny ukládají do localStorage (klíč doxa_notes_v1) bez nutnosti manuálního ukládání — data se uloží po krátké prodlevě. Pokud aplikaci spouštíš v Electron/Node režimu, změny se zapisují přímo do lokálního souboru.
**Průběžně si úkládej i JSON soubor manuálně!!**
### Manuální uložení
Vedle editoru najdeš tlačítko Uložit nyní. I když autosave ukládá průběžně, tlačítko je užitečné v těchto případech:
Okamžité uložení — provede persist bez čekání na autosave (užitečné před zavřením aplikace nebo pokud chcete rychlou jistotu, že jsou změny zapsány).
Vizuální potvrzení — po uložení se zobrazí stav „Uloženo“, což dává uživateli okamžitou zpětnou vazbu.
Bez stažení — tlačítko Uložit poznámku neprovádí stažení souboru; pokud chcete stáhnout JSON, použijte tlačítko Exportovat JSON.
Pro přenos dat mezi zařízeními použijte tlačítko Exportovat JSON (stáhne soubor doxa.json), nebo z konzole spusťte saveNotesToFile(true).
### Import / Export
Pro import klikni Importovat JSON a vyber soubor. Podporované formáty:
Objekt s polem notes: { "notes": [ ... ] }
Přímo pole: [ { ... }, { ... } ]
Export je nyní dostupný přes tlačítko Exportovat JSON (vedle tlačítka Uložit). Aplikace zároveň provádí autosave lokálně — nic neztratíte, pokud zapomenete manuálně uložit. Chcete-li stáhnout JSON přes skript, můžete také spustit v konzoli saveNotesToFile(true).
### Bezpečnost a zálohy
Výchozí režim je local‑first: data zůstávají ve tvém prohlížeči (localStorage) nebo lokálním souboru, aplikace je sama neodesílá.
+32
View File
@@ -0,0 +1,32 @@
# Instalace
### Rychlý start - pouze pro variantu spouštění aplikace u sebe lokalně
Pokud aplikaci spouštíš z webu https://doxa-notes.org/ tento návod není validní!
1.Stáhni/klonuj repozitář a přejdi do složky aplikace:
**cd doxa/wep_app**
Spusť jednoduchý lokální server (doporučeno):
**python3 -m http.server 8000**
a otevři v prohlížeči: **http://localhost:8000**
2. Alternativně můžeš použít Node.js a pomocí npm install nainstaluj live-server a následně spusť pomocí příkazu: **live-server** ve složce aplikace.
### Desktop App
1. Stáhni si desktop verzi aplikace z [Codeberg uložiště projektu](https://codeberg.org/Kankys/doxa/releases)
2. Staženou aplikaci spustíš spustíš otevřením souboru windows Dlinux - .AppImage
3. Soubory aplikací najdeš ve složce:
```bash
Na tvém Linuxu: ~/.config/doxa/
```
**Nezapomeň si dělat pravidélné zálohy JSON (exportovat JSON)**
**Nezapomeň si pravidelně aktualizovat aplikaci, abys mohl mít nejnovější verzi.**
Desktop app: nevycházejí s pravidelností jako web app, z důvodu buildu a náročnosti na zdroje. Desktop app bude vydáván pouze po větších funkčních změnách.
+23
View File
@@ -0,0 +1,23 @@
# Bugs
Nalezené chyby prosím hlašte na Gitu projektu (kde naleznete hlášené či nevyřešené bugy) [Link na hlášení chyb](https://codeberg.org/Kankys/doxa/issues)
# Repozitář
Pokud chcete přispět svým kódem budu velice rád, ale je tu několik pravidel:
* před větší feature, vždy zvažte jestli úprava je vhodná, případně ji nejdříve prodiskutujme. Škoda zahodit Pull Request z důvodu směřování projektu jiným směrem.
* Vždy si odpíchněte větev z master. Do master nikdy nic ne push(ovat)!! Vždy udělejte Pull Request do masteru.
* Do souboru PR.md vždy před Pull Request vložte do tabulky název větve, stručný popis změn a jméno.
# Automatizované testy
* Testy jsou psané v Playwright a v TypeScript
* Využíváme POM
* Pokud je to možné s novou funkcionalitou úprávýme řádně testy
# Podporovatelé a přispěvovatelé
+25
View File
@@ -0,0 +1,25 @@
## Release notes:
| Branch | Change | Version|Name |
| --- | --- | --- | --- |
| dokumentace01 | Vytvoření struktury dokumentace a první kód aplikace | Kankys |
|update_app |dark/light mode, oprv textací, rozšíření návodu, přídaní markdown a tlačítek| 26.O6.01.beta|Kankys |
| dokumentace02 | oprava issue https://codeberg.org/Kankys/doxa/issues/3, textové editace, přidání baneru | 26.06.02.beta|Kankys |
| dokumentace03 | smazani server casti, oprava textaci, vytvoření manifest | 26.6.02.beta|Kankys |
| desktop_app_electron | vytvoření app pro **windows a linux**, upravené návody |26.06.03.beta |Kankys |
|new_project_doxa|přejmenování projektu na Doxa, nový repozitář, new css style návrh | 26.06.04.beta|Kankys |
| tags |přidání tagů do poznámek | 26.06.05.beta|Kankys |
| first_stable | nová doména doxa-notes.org, první stabilní vydání, rychlá volba /, funkce náhledu poznámek, rozdělení doxa-notes.org na web app a desktop app | 26.07.01|Kankys |
|bug-H1| oprava bugu v h1| 26.07.01.|Kankys |
|wiki| přidání wiki stránky (mkdocs)| 26.07.02.|Kankys |
| playwright| založení playwright testů, úprava SEO | 26.07.03.| Kankys |
|web_zalozky | přidání systému složek, rozšíření hledání|26.07.04| kankys|
|playwright-configuration| konfigurace playwright, aktualizace package.json, upravit AppPage.ts| 26.07.04| Kankys|
|en_wiki + roller| přidání wiki stránky (mkdocs) v EN + roller| 26.07.05.|Kankys |
Verze: se označují rok.měsíc.verze (26.06.03.beta)
První ostrá verze výjde jako (předpoklad): 26.07.01
Desktop app: nevycházejí s pravidelností jako web app, z důvodu buildu a náročnosti na zdroje. Desktop app bude vydáván pouze po větších funkčních změnách.
Desktop aplikace pro Linux a Windows jsou zabaleny do instalátorů AppImage - Linux a exe (Windows).
+9
View File
@@ -0,0 +1,9 @@
# TODO
- [x] Desktop app linux
- [ ] Desktop app macOS
- [X] Export poznámky do Markdown
- [ ] Lokalizace do AJ
- [X] tagy
- [X] rychlé vyhledávaní
- [X] vlastní doména
+18
View File
@@ -0,0 +1,18 @@
MIT License
Copyright (c) 2026 Kankys
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.
+116
View File
@@ -0,0 +1,116 @@
# 🇬🇧 DOXA Notes PROJECT
##### 🇨🇿 [Czech Version](#czech-version)
#### Technical and architectural manifesto of a minimalist note-taking application
**Project goal:** To create an absolutely independent, secure and minimalist environment for storing people's
thoughts, notes and life reflections. In accordance with the liberal principles of self-sufficiency, the application does not rely on
third-party cloud databases, but operates fully locally with the open JSON format on its own server
backend.
## 1. TECHNICAL ARCHITECTURE
To maintain maximum speed, code purity and zero external dependencies, the application will be built on a pure
web standard (so-called Vanilla stack):
Frontend: Semantic HTML5 for structure, CSS3 for a minimalist interface that does not burden the mind with colorful chaos.
Client logic: Pure JavaScript (ES6+) without frameworks (React/Vue). Everything runs natively in the browser.
Data layer: Standardized JSON format. Notes are structured as an array of objects, where each
item has a unique identifier, timestamp, and text content.
Desktop applications for Linux and Windows are packaged in AppImage installers - Linux and exe (Windows).
## 2. DATA FORMAT STRUCTURE (JSON)
Data purity ensures that your thoughts will be readable even in twenty years on any device. The basic schema of one note is as follows:
```json
{
"notes": [
{
"id": "1719147600000",
"title": "Morning reflection",
"content": "Digital illusion denied today. Mind is calm and steady.",
"created_at": "2026-06-23T08:00:00Z",
"updated_at": "2026-06-23T08:00:00Z"}
]}
```
## 3. VPS DEPLOYMENT STRATEGY (DOXA.LUKAN.CZ)
Since the application (web version) will run on its own virtual private network (VPS) with the architecture:
### **Architecture (Purely client-side)**
**Technical data storage solution** - The application runs on a subdomain, but the data is stored in the browser (LocalStorage / IndexedDB) with option to manually export/import JSON file.
**Security aspect** - Absolute security. No data leaves your browser to the network.
## License
The application is open-source and licensed under the MIT license.
--
"It doesn't matter how complex the circumstances around you are. When you build your own temple of ideas, you start from the first stone. This code is your first stone." — Stoic reference from Kankys
---
<div id="czech-version"></div>
# 🇨🇿 PROJEKT DOXA Notes
#### Technický a architektonický manifest minimalistické poznámkové aplikace
**Záměr projektu:** Vytvořit absolutně nezávislé, bezpečné a minimalistické prostředí pro uchovávání lidských
myšlenek, poznámek a životních reflexí. V souladu se liberálními principy soběstačnosti aplikace nespoléhá na
cloudové databáze třetích stran, nýbrž operuje plně lokálně s otevřeným formátem JSON na vlastním serverovém
zázemí.
## 1. TECHNICKÁ ARCHITEKTURA
Pro zachování maximální rychlosti, čistoty kódu a nulových externích závislostí bude aplikace postavena na čistém
webovém standardu (tzv. Vanilla stack):
Frontend: Sémantické HTML5 pro strukturu, CSS3 pro minimalistické rozhraní, které nezatěžuje mysl
barevným chaosem.
Klientská logika: Čistý JavaScript (ES6+) bez frameworků (React/Vue). Vše běží nativně v prohlížeči.
Datová vrstva: Standardizovaný formát JSON. Poznámky jsou strukturovány jako pole objektů, kde každá
položka má jednoznačný identifikátor, časové razítko a textový obsah.
Desktop aplikace pro Linux a Windows jsou zabaleny do instalátorů AppImage - Linux a exe (Windows).
## 2. STRUKTURA DATOVÉHO FORMÁTU (JSON)
Čistota dat zaručuje, že tvé myšlenky budou čitelné i za dvacet let na jakémkoli zařízení. Základní schéma jedné
poznámky vypadá následovně:
```json
{
"notes": [
{
"id": "1719147600000",
"title": "Ranní reflexe",
"content": "Dnes odepřena digitální iluze. Mysl je klidná a pevná.",
"created_at": "2026-06-23T08:00:00Z",
"updated_at": "2026-06-23T08:00:00Z"
}
]
}
```
## 3. STRATEGIE NASAZENÍ NA VPS (DOXA.LUKAN.CZ)
Jelikož aplikace (webová verze) bude běží na vlastní virtuální privátní síti (VPS) s architekturou:
### **Architektura (Čistě klientská)**
**Technické řešení ukládání dat** - Aplikace běží na subdoméně, ale data se ukládají v prohlížeči (LocalStorage / IndexedDB) s možností manuálního exportu/importu JSON souboru.
**Bezpečnostní aspekt** - Absolutní bezpečnost. Žádná data neodcházejí z tvého prohlížeči na síť.
## Licence
Aplikace je open-source a licencována pod MIT licencí.
--
"Nezáleží na tom, jak složité jsou okolnosti kolem tebe. Když stavíš vlastní chrám myšlenek, začínáš od prvního kamene. Tento kód je tvým prvním kamenem." — Stoický odkaz od Kankyse
+104
View File
@@ -0,0 +1,104 @@
<!doctype html>
<html lang="cs">
<head>
<meta charset="UTF-8" />
<title>O projektu — DOXA</title>
<link rel="stylesheet" href="assets/style/style.css" />
<link rel="shortcut icon" href="assets/img/brain-solid-full.svg" />
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/default.min.css"
/>
<script src="https://cdn.jsdelivr.net/npm/markdown-it/dist/markdown-it.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
</head>
<body>
<div class="container">
<nav class="top-nav">
<a href="index.html">Domů</a>
<a href="navod.html">Návod</a>
<a href="privacy.html">Ochrana soukromí</a>
<a href="about.html">O projektu</a>
<button
id="themeToggle"
class="theme-toggle"
aria-label="Přepnout motiv"
>
🌙
</button>
</nav>
<h1>O projektu — DOXA</h1>
<p><img src="assets/img/doxa.png" alt="Doxa notes" width="50%" height="auto" style="display: block; margin: 0 auto;" /></p>
<h2>Manifest digitální suverenity a minimalistického myšlení</h2>
<p><strong>Záměr projektu:</strong></p>
<p>Vytvořit absolutně nezávislé, bezpečné a minimalistické prostředí pro uchovávání lidských myšlenek, poznámek a životních reflexí. V souladu se základními principy osobní svobody a soběstačnosti aplikace vědomě odmítá cloudové databáze, servery třetích stran a centralizovaná API. Doxa věří, že lidská mysl nepotřebuje být sledována algoritmy, aby mohla růst.</p>
<h3>1. Radikální Local-First Filozofie</h3>
<p>Aplikace funguje na principu absolutní decentralizace. Běží na tvém zařízení a tam také umírá i žije.</p>
<ul>
<li>Žádný backend, žádné API: Doxa vědomě neobsahuje žádný kód pro odesílání dat na vzdálené servery. Tím je eliminováno riziko úniku dat, výpadku serveru nebo změny obchodních podmínek poskytovatele.</li>
<li>Absolutní soukromí: Data jsou uložena výhradně v tvém prohlížeči (localStorage) nebo lokálním souboru. Co napíšeš, to zůstává tvým výhradním vlastnictvím.</li>
</ul>
<h3>2. Formát JSON: Trvanlivost napříč dekádami</h3>
<p>Data jsou strukturována do otevřeného, čistého a lidsky čitelného formátu JSON. Žádné proprietární databáze.</p>
<ul>
<li>Tvá data ti patří. Díky možnosti manuálního exportu si můžeš svůj myšlenkový fond odnést kamkoli – uložit si ho na svůj bezpečný lokální disk, nahrát na vlastní Git (GitHub/Gitea), nebo jej synchronizovat skrze cloudovou službu, kterou ty sám uznáš za bezpečnou.</li>
<li>Čistota formátu zaručuje, že tvé poznámky budou čitelné i za dvacet let na jakémkoli zařízení, bez ohledu na to, zda Doxa bude stále existovat.</li>
</ul>
<h3>3. Technická čistota a minimalismus (Vanilla Stack)</h3>
<p>Pro zachování maximální rychlosti, nezávislosti a nulových externích závislostí je aplikace postavena výhradně na čistých webových standardech: </p>
<ul>
<li>Frontend (HTML5/CSS3): Minimalistické rozhraní, které nezatěžuje mysl barevným chaosem a vizuálním balastem moderního internetu.</li>
<li>Logika (Vanilla JavaScript ES6+): Žádné těžkopádné frameworky (React/Vue), které podléhají módním trendům a neustálým změnám. Čistý kód je trvanlivý jako tesání do kamene.</li>
</ul>
<p>„Nezáleží na tom, jak složité jsou okolnosti kolem tebe. Když stavíš vlastní chrám myšlenek, začínáš od prvního kamene. Tento kód a tvá data jsou tvým vlastním, nedobytným hradem.“
— Stoický odkaz pro svobodné myslitele</p>
<hr>
<h2>Architektura</h2>
<ul>
<li>Frontend: čisté HTML/CSS/JS (bez frameworků).</li>
<li>Datový formát: otevřený JSON — trvanlivý a přenosný.</li>
<li>
Local‑first: data jsou lokální (localStorage nebo soubor).
</li>
</ul>
<h2>Co bylo přidáno naposledy</h2>
<li>Podpora více poznámek v jednom JSON (název + obsah).</li>
<li>Přidání, editace (inline + modal), mazání poznámek.</li>
<li>Přesouvání pořadí (šípky + drag & drop).</li>
<li>
Import / Export JSON a fallback mezi localStorage a lokálním
souborem (Electron).
</li>
<li>Přidána Markdown podpora</li>
</ul>
<h2>Další plány</h2>
<ul>
<li>Rozšíření UI (hledání, tagy, historie/undo).</li>
</ul>
<hr>
<p>
Projekt najdeš v repozitáři
<a href="https://codeberg.org/kankys/doxa" target="_blank"
>Codeberg</a
>. Pokud chceš přispět, otevři issue nebo PR.
</p>
<p>Web autora, další projekty a podpora: <a href="https://lukaskanka.cz/" target="_blank">Lukáš Kanka</a></p>
<p>Aplikace je open-source a licencována pod MIT licencí.</p>
<br/>
<p><a href="index.html">Zpět na hlavní stránku</a></p>
</div>
<footer><p class="copyright">&copy;2026 Doxa Notes - <a href="https://lukaskanka.cz/" target="_blank">Kankys</a></p></a</footer>
<script src="assets/js/script.js"></script>
</body>
</html>
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path d="M184 120C184 89.1 209.1 64 240 64L264 64C281.7 64 296 78.3 296 96L296 544C296 561.7 281.7 576 264 576L232 576C202.2 576 177.1 555.6 170 528C169.3 528 168.7 528 168 528C123.8 528 88 492.2 88 448C88 430 94 413.4 104 400C84.6 385.4 72 362.2 72 336C72 305.1 89.6 278.2 115.2 264.9C108.1 252.9 104 238.9 104 224C104 179.8 139.8 144 184 144L184 120zM456 120L456 144C500.2 144 536 179.8 536 224C536 239 531.9 253 524.8 264.9C550.5 278.2 568 305 568 336C568 362.2 555.4 385.4 536 400C546 413.4 552 430 552 448C552 492.2 516.2 528 472 528C471.3 528 470.7 528 470 528C462.9 555.6 437.8 576 408 576L376 576C358.3 576 344 561.7 344 544L344 96C344 78.3 358.3 64 376 64L400 64C430.9 64 456 89.1 456 120z"/></svg>

After

Width:  |  Height:  |  Size: 920 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 KiB

@@ -0,0 +1,3 @@
{
"notes": []
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,382 @@
/* Theme variables */
:root {
--bg: #fafafa;
--text: #333333;
--muted: #666666;
--button-bg: #333333;
--button-text: #ffffff;
--note-bg: #ffffff;
--note-border: #dddddd;
--note-hover: #f5f5f5;
--accent: #0b63d6;
--modal-bg: #ffffff;
--modal-overlay: rgba(0, 0, 0, 0.45);
--active-bg: #e6f0ff;
--active-border: #a6c8ff;
}
/* Dark theme overrides */
body.dark {
--bg: #0b1220;
--text: #e6eef8;
--muted: #9aa6b2;
--button-bg: #1f2937;
--button-text: #ffffff;
--note-bg: #071022;
--note-border: #263046;
--note-hover: #092033;
--accent: #3b82f6;
--modal-bg: #0b1220;
--modal-overlay: rgba(0, 0, 0, 0.6);
--active-bg: rgba(59, 130, 246, 0.14);
--active-border: #60a5fa;
}
/* Base */
body {
font-family: monospace;
background: var(--bg);
padding: 40px;
color: var(--text);
transition:
background 200ms ease,
color 200ms ease;
}
.top-nav {
display: flex;
gap: 8px;
margin-bottom: 12px;
align-items: center;
flex-wrap: wrap;
}
.top-nav a,
.top-nav .theme-toggle {
background: var(--button-bg);
color: var(--button-text);
text-decoration: none;
padding: 8px 12px;
border-radius: 4px;
font-family: monospace;
font-size: 14px;
border: none;
cursor: pointer;
}
.top-nav a:hover,
.top-nav .theme-toggle:hover {
background: #555;
}
.top-nav a.active {
background: var(--accent);
}
.container {
max-width: 600px;
margin: 0 auto;
}
#noteTitle {
width: 100%;
padding: 10px;
margin-bottom: 8px;
font-family: monospace;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
}
textarea {
width: 100%;
height: 150px;
padding: 10px;
margin-bottom: 10px;
font-family: monospace;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
}
button {
background: var(--button-bg);
color: var(--button-text);
border: none;
padding: 10px 20px;
cursor: pointer;
font-family: monospace;
}
button:hover {
background: #555;
}
#notesContainer {
margin-top: 10px;
border-top: 1px solid var(--note-border);
padding-top: 10px;
display: flex;
flex-direction: column;
gap: 6px;
}
.note-item {
padding: 8px;
border: 1px solid var(--note-border);
cursor: pointer;
background: var(--note-bg);
}
.note-item:hover {
background: var(--note-hover);
}
.note-item.active {
background: var(--active-bg);
border-color: var(--active-border);
}
.no-notes {
color: var(--muted);
font-style: italic;
padding: 6px;
}
/* Note list layout */
.note-item {
display: flex;
align-items: center;
justify-content: space-between;
}
.note-left {
flex: 1 1 auto;
padding-right: 10px;
cursor: pointer;
}
.note-title {
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-preview {
font-size: 12px;
color: var(--muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-controls {
display: flex;
gap: 6px;
align-items: center;
}
.note-controls button {
background: transparent;
border: none;
padding: 6px 8px;
cursor: pointer;
font-family: monospace;
border-radius: 4px;
color: var(--text);
}
.note-controls button:hover {
background: rgba(255, 255, 255, 0.03);
}
.note-item.drag-over {
border-style: dashed;
}
.note-item.drag-after {
box-shadow: inset 0 -3px 0 0 rgba(0, 123, 255, 0.25);
}
.note-item.dragging {
opacity: 0.5;
}
/* Modal */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--modal-overlay);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal-overlay.hidden {
display: none;
}
.modal {
background: var(--modal-bg);
padding: 16px;
border-radius: 8px;
width: 92%;
max-width: 720px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
position: relative;
}
.modal .modal-close {
position: absolute;
right: 8px;
top: 8px;
border: none;
background: transparent;
font-size: 16px;
cursor: pointer;
}
.modal input,
.modal textarea {
width: 100%;
padding: 8px;
margin-bottom: 8px;
font-family: monospace;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
}
.modal-actions {
display: flex;
gap: 8px;
justify-content: flex-end;
}
@media (min-width: 800px) {
.container {
max-width: 900px;
}
}
.notes-hint {
margin-top: 8px;
color: var(--muted);
font-size: 13px;
}
/* Editor toolbar & preview */
.editor-toolbar {
display: flex;
gap: 6px;
margin-bottom: 8px;
flex-wrap: wrap;
}
.editor-toolbar button {
background: transparent;
border: 1px solid var(--note-border);
color: var(--text);
padding: 6px 8px;
cursor: pointer;
border-radius: 4px;
font-family: monospace;
}
.editor-toolbar button:hover {
background: var(--note-hover);
}
/* active toolbar button */
.editor-toolbar button.active {
background: var(--accent);
color: var(--button-text);
}
.editor-wrap {
display: flex;
gap: 12px;
align-items: flex-start;
}
.editor-wrap textarea {
flex: 1 1 60%;
min-height: 160px;
}
.preview {
flex: 1 1 40%;
border: 1px solid var(--note-border);
background: var(--note-bg);
padding: 10px;
border-radius: 4px;
overflow: auto;
max-height: 320px;
}
.hidden {
display: none;
}
.editor-actions {
margin-top: 8px;
display: flex;
gap: 8px;
align-items: center;
}
.save-status {
margin-left: 8px;
font-size: 13px;
color: var(--muted);
min-width: 80px;
}
/* Rendered markdown styles */
.preview h1,
.preview h2,
.preview h3 {
margin: 6px 0;
}
.preview pre {
background: rgba(0, 0, 0, 0.04);
padding: 8px;
overflow: auto;
}
.preview code {
background: rgba(0, 0, 0, 0.06);
padding: 2px 4px;
border-radius: 4px;
}
@media (max-width: 800px) {
.editor-wrap {
flex-direction: column;
}
.preview {
max-height: 240px;
}
}
footer {
margin-top: 16px;
text-align: center;
font-size: 13px;
color: var(--muted);
}
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path d="M184 120C184 89.1 209.1 64 240 64L264 64C281.7 64 296 78.3 296 96L296 544C296 561.7 281.7 576 264 576L232 576C202.2 576 177.1 555.6 170 528C169.3 528 168.7 528 168 528C123.8 528 88 492.2 88 448C88 430 94 413.4 104 400C84.6 385.4 72 362.2 72 336C72 305.1 89.6 278.2 115.2 264.9C108.1 252.9 104 238.9 104 224C104 179.8 139.8 144 184 144L184 120zM456 120L456 144C500.2 144 536 179.8 536 224C536 239 531.9 253 524.8 264.9C550.5 278.2 568 305 568 336C568 362.2 555.4 385.4 536 400C546 413.4 552 430 552 448C552 492.2 516.2 528 472 528C471.3 528 470.7 528 470 528C462.9 555.6 437.8 576 408 576L376 576C358.3 576 344 561.7 344 544L344 96C344 78.3 358.3 64 376 64L400 64C430.9 64 456 89.1 456 120z"/></svg>

After

Width:  |  Height:  |  Size: 920 B

+180
View File
@@ -0,0 +1,180 @@
<!doctype html>
<html lang="cs">
<head>
<meta charset="UTF-8" />
<title>Doxa</title>
<meta property="og:type" content="website" />
<meta property="og:url" content="https://doxa.lukan.cz/" />
<meta
property="og:title"
content="Doxa je navržena jako local‑first aplikace — soukromí je primární designový princip."
/>
<meta
property="og:description"
content="Krátké shrnutí: Doxa je minimalistická, local‑first poznámková aplikace založená na otevřeném JSON formátu. Data zůstávají lokálně (localStorage nebo soubor) — aplikace nic sama neodesílá."
/>
<meta name="twitter:card" content="summary_large_image" />
<meta
name="twitter:title"
content="Doxa je navržena jako local‑first aplikace — soukromí je primární designový princip."
/>
<meta
name="twitter:description"
content="Doxa je navržena jako local‑first aplikace — soukromí je primární designový princip."
/>
<meta
name="Doxa"
content="Doxa je navržena jako local‑first aplikace — soukromí je primární designový princip."
/>
<link rel="stylesheet" href="assets/style/style.css" />
<link rel="shortcut icon" href="assets/img/brain-solid-full.svg" />
<!-- Markdown and sanitization libraries (used for preview). CDN fallback; if offline, preview will be disabled. -->
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/default.min.css"
/>
<script src="https://cdn.jsdelivr.net/npm/markdown-it/dist/markdown-it.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
</head>
<body>
<div class="container">
<nav class="top-nav">
<a href="index.html">Domů</a>
<a href="navod.html">Návod</a>
<a href="privacy.html">Ochrana soukromí</a>
<a href="about.html">O projektu</a>
<button
id="themeToggle"
class="theme-toggle"
aria-label="Přepnout motiv"
>
🌙
</button>
</nav>
<h1>Doxa</h1>
<input id="noteTitle" placeholder="Název poznámky" />
<div class="editor-toolbar" id="editorToolbar">
<button type="button" data-action="h1" title="Nadpis H1">
H1
</button>
<button type="button" data-action="h2" title="Nadpis H2">
H2
</button>
<button type="button" data-action="h3" title="Nadpis H3">
H3
</button>
<button type="button" data-action="bold" title="Tučné (Ctrl+B)">
<strong>B</strong>
</button>
<button
type="button"
data-action="italic"
title="Kurzíva (Ctrl+I)"
>
<em>I</em>
</button>
<button type="button" data-action="strike" title="Přeškrtnutí">
S
</button>
<button type="button" data-action="ul" title="Odrážkový seznam">
•
</button>
<button type="button" data-action="ol" title="Číslovaný seznam">
1.
</button>
<button
type="button"
data-action="task"
title="Úkol (checkbox)"
>
☐
</button>
<button type="button" data-action="quote" title="Citace">
❝
</button>
<button type="button" data-action="hr" title="Vodorovná čára">
—
</button>
<button type="button" data-action="code" title="Inline kód">
`kód`
</button>
<button type="button" data-action="codeblock" title="Blok kódu">
&lt;/&gt;
</button>
<button type="button" data-action="link" title="Vložit odkaz">
🔗
</button>
<button
type="button"
data-action="image"
title="Vložit obrázek"
>
🖼
</button>
<button
type="button"
data-action="table"
title="Vložit tabulku"
>
▦
</button>
<button
type="button"
id="livePreviewToggle"
title="Živý náhled"
>
Live
</button>
<button type="button" id="togglePreviewMain" title="Náhled">
Náhled
</button>
</div>
<div class="editor-wrap">
<textarea
id="noteInput"
placeholder="Zapiš poznámku..."
></textarea>
<div
id="notePreview"
class="preview hidden"
aria-hidden="true"
></div>
</div>
<div class="editor-actions">
<button
onclick="saveCurrentNote()"
title="Uložit nyní (manuální uložení)"
aria-label="Uložit nyní"
>
Uložit nyní
</button>
<button onclick="saveNotesToFile(true)">Exportovat JSON</button>
<button onclick="importujPoznamky()">Importovat JSON</button>
<button id="newNoteButton">➕ Nová poznámka</button>
<span
id="saveStatus"
class="save-status"
aria-live="polite"
></span>
</div>
<div id="notesContainer"></div>
<div id="notesHint" class="notes-hint">
Přetáhněte poznámky pro změnu pořadí nebo použijte šipky vedle
položek.
</div>
</div>
<script src="assets/js/script.js"></script>
</body>
</html>
+32
View File
@@ -0,0 +1,32 @@
const { app, BrowserWindow } = require('electron');
const path = require('path');
function createWindow() {
const win = new BrowserWindow({
width: 1200,
height: 800,
icon: path.join(__dirname, 'brain-solid-full.svg'), // Pokud máš ikonu, jinak můžeš řádek smazat
webPreferences: {
nodeIntegration: false,
contextIsolation: true
}
});
// Načte tvůj hlavní HTML soubor webu
win.loadFile('index.html');
// Skryje horní menu (File, Edit atd.) pro čistý, minimalistický vzhled
win.setMenu(null);
}
app.whenReady().then(() => {
createWindow();
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
+164
View File
@@ -0,0 +1,164 @@
<!doctype html>
<html lang="cs">
<head>
<meta charset="UTF-8" />
<title>Návod — Doxa</title>
<link rel="stylesheet" href="assets/style/style.css" />
<link rel="shortcut icon" href="assets/img/brain-solid-full.svg" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/default.min.css" />
<script src="https://cdn.jsdelivr.net/npm/markdown-it/dist/markdown-it.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
</head>
<body>
<div class="container">
<nav class="top-nav">
<a href="index.html">Domů</a>
<a href="navod.html">Návod</a>
<a href="privacy.html">Ochrana soukromí</a>
<a href="about.html">O projektu</a>
<button id="themeToggle" class="theme-toggle" aria-label="Přepnout motiv">🌙</button>
</nav>
<h1>Návod k použití — Doxa (v26.6.04.beta)</h1>
<p>Krátké shrnutí: Doxa je minimalistická, <strong>local‑first</strong> poznámková aplikace založená na otevřeném JSON formátu s podporou Markdown. Data zůstávají lokálně (localStorage nebo soubor) — aplikace nic sama neodesílá.</p>
<h2>Rychlý start - pouze pro variantu spouštění aplikace u sebe lokalně</h2>
<p>Pokud aplikaci spouštíš z webu <strong>https://doxa.lukan.cz/</strong> pokračuj dalším bodem!</p>
<ol>
<li>Stáhni/klonuj repozitář a přejdi do složky aplikace:
<pre><strong>cd doxa/web_app</strong></pre>
</li>
<li>Spusť jednoduchý lokální server (doporučeno):
<pre><strong>python3 -m http.server 8000</strong></pre>
a otevři v prohlížeči: <code><strong>http://localhost:8000</strong></code>
</li>
<li>alternativně můžeš použít Node.js a pomocí npm install nainstaluj live-server a následně spusť pomocí příkazu: <code><strong>live-server</strong></code> ve složce aplikace.
</li>
</ol>
<h2>Desktová aplikace</h2>
<p>1. Desktová aplikace je dostupná pro Windows a Linux. Stačí si ji stáhnout z <a href="https://codeberg.org/Kankys/doxa/releases" target="_blank">Codeberg</a> a spustit.</p>
<p>2. Staženou aplikaci spustíš spustíš otevřením souboru linux - .AppImage</p>
<p>3. Soubory aplikací najdeš ve složce:</p>
<p><strong>Linux:</strong> <code>~/.config/doxa/</code></p>
<p><strong>Nezapomeň si dělat pravidélné zálohy JSON (exportovat JSON)</strong></p>
<p><strong>Nezapomeň si pravidelně aktualizovat aplikaci, abys mohl mít nejnovější verzi.</strong></p>
<p><strong>POZOR: v desktop verzi se nachází chyba s přidáváním nových poznámek. Aby jste mohli přidat novou poznámku, musíte nejprve kliknout na jinou záložku v menu a poté zpět na záložku poznámek.</strong></p>
<hr>
<h2>Vytvoření nové poznámky</h2>
<ol>
<li>Klikni na tlačítko <strong>➕ Nová poznámka</strong> a zadej název.</li>
<li>Položka se objeví v seznamu. Klikem načteš název a obsah do editoru nahoře.</li>
<li>Uprav obsah a klikni <strong>Uložit nyní</strong>.</li>
</ol>
<h2>Editace a mazání</h2>
<ul>
<li>Inline: klikni na poznámku, uprav obsah a stiskni <strong>Uložit nyní</strong>.</li>
<li>Modal: klikni na ikonu ✎ vedle položky pro pokročilou editaci v modal okně.</li>
<li>Mazání: ikona 🗑 u položky — po potvrzení se poznámka smaže.</li>
</ul>
<h2>Přesouvání pořadí poznámek</h2>
<ul>
<li>Použij šipky ↑ / ↓ u položek.</li>
<li>Nebo přetahuj položky (drag & drop) na požadované místo — při přetažení se ukáže indikátor vložení.</li>
</ul>
<h2>Přepínání vzhledu</h2>
<p>V horním menu najdeš tlačítko pro přepínání vzhledu. Aplikace podporuje tři režimy:
<ul>
<li><strong>Světlý</strong> — ikona: ☀️</li>
<li><strong>Tmavý</strong> — ikona: 🌙</li>
<li><strong>Respektovat systém</strong> — ikona: 🌓 — aplikace bude sledovat systémovou volbu (prefers-color-scheme) a automaticky se přepne, pokud se změní systémový motiv.</li>
</ul>
Kliknutím na tlačítko v menu cyklíš mezi režimy (Light → Dark → System). Vybraná volba se uloží do <code>localStorage</code> pod klíčem <code>doxa_theme</code> a přetrvá mezi stránkami a obnovami. Pokud chceš volbu resetovat, otevři konzoli prohlížeče a spusť: <code>localStorage.removeItem('doxa_theme')</code> nebo vymaž storage v nástrojích pro vývojáře.</p>
<h2>Automatické ukládání</h2>
<p>Aplikace nyní automaticky ukládá změny poznámek lokálně během psaní (autosave). V běžném prohlížeči se změny ukládají do <code>localStorage</code> (klíč <code>doxa_notes_v1</code>) bez nutnosti manuálního ukládání — data se uloží po krátké prodlevě. Pokud aplikaci spouštíš v Electron/Node režimu, změny se zapisují přímo do lokálního souboru.</p>
<p style="color: red;"><strong>Průběžně si úkládej i JSON soubor manuálně!!</strong></p>
<h2>Manuální uložení</h2>
<p>Vedle editoru najdeš tlačítko <strong>Uložit nyní</strong>. I když autosave ukládá průběžně, tlačítko je užitečné v těchto případech:</p>
<ul>
<li><strong>Okamžité uložení</strong> — provede persist bez čekání na autosave (užitečné před zavřením aplikace nebo pokud chcete rychlou jistotu, že jsou změny zapsány).</li>
<li><strong>Vizuální potvrzení</strong> — po uložení se zobrazí stav „Uloženo“, což dává uživateli okamžitou zpětnou vazbu.</li>
<li><strong>Bez stažení</strong> — tlačítko <strong>Uložit poznámku</strong> neprovádí stažení souboru; pokud chcete stáhnout JSON, použijte tlačítko <strong>Exportovat JSON</strong>.</li>
</ul>
<p>Pro přenos dat mezi zařízeními použijte tlačítko <strong>Exportovat JSON</strong> (stáhne soubor <code>doxa.json</code>), nebo z konzole spusťte <code>saveNotesToFile(true)</code>.</p>
<h2>Import / Export</h2>
<p>Pro import klikni <strong>Importovat JSON</strong> a vyber soubor. Podporované formáty:
<ul>
<li>Objekt s polem <code>notes</code>: <code>{ "notes": [ ... ] }</code></li>
<li>Přímo pole: <code>[ { ... }, { ... } ]</code></li>
</ul>
Export je nyní dostupný přes tlačítko <strong>Exportovat JSON</strong> (vedle tlačítka Uložit). Aplikace zároveň provádí autosave lokálně — nic neztratíte, pokud zapomenete manuálně uložit. Chcete-li stáhnout JSON přes skript, můžete také spustit v konzoli <code>saveNotesToFile(true)</code>.</p>
<h2>Bezpečnost a zálohy</h2>
<p>Výchozí režim je <strong>local‑first</strong>: data zůstávají ve tvém prohlížeči (localStorage) nebo lokálním souboru, aplikace je sama neodesílá.</p>
<hr>
<h2>Editor používá Markdown</h2>
<p>Editor pracuje s <strong>Markdown</strong> syntaxí. Všechny úpravy se ukládají jako Markdown (čistý text) — náhled ukazuje vykreslené HTML. Níže základní příklady (vložte je přímo do editoru nebo použijte tlačítka v toolbaru):</p>
<pre><code>Tučné: **tučný text**
Kurzíva: *kurzíva*
Přeškrtnutí: ~~přeškrtnuté~~
Inline kód: `kód`
Kódový blok:
```
console.log('hello')
```
Nadpisy:
# Nadpis H1
## Nadpis H2
### Nadpis H3
Seznam (odrážky):
- položka 1
- položka 2
Číslovaný seznam:
1. první
2. druhý
Citace:
> Toto je citace
Tabulka:
| Sloupec 1 | Sloupec 2 |
| --- | --- |
| bunka 1 | bunka 2 |
| bunka 3 | bunka 4 |
Obrázek (referenční URL):
![alt text](https://example.com/obrazek.png)
Odkaz:
[text](https://example.com)
Úkoly (task list):
- [ ] nedokončeno
- [x] hotovo
</code></pre>
<p>Důležité tipy:</p>
<ul>
<li>Kliknutím na tlačítka v toolbaru vložíte potřebné Markdown tokeny automaticky.</li>
<li>Stiskněte <kbd>Ctrl/Cmd+B</kbd> pro tučné, <kbd>Ctrl/Cmd+I</kbd> pro kurzívu a <kbd>Ctrl/Cmd+`</kbd> pro inline kód.</li>
<li>Tlačítko <strong>Náhled</strong> přepne vykreslení Markdownu; používejte jej k ověření výsledku.</li>
<li>Tlačítko <strong>Live</strong> zapne průběžný živý náhled — preview se automaticky aktualizuje během psaní a zobrazí se, pokud nebyl ručně skrytý.</li>
<li>Tlačítko <strong>Tabulka</strong> (▦) vloží šablonu tabulky a během vložení vás vyzve na počet sloupců a řádků.</li>
<li>Obrázky vkládejte jako URL — aplikace obrázky nesynchronizuje ani nahrává.</li>
<li>Markdown je přenosný: poznámky zůstávají čitelné i bez aplikace (export/import).</li>
</ul>
<h2>Časté problémy</h2>
<ul>
<li>Při otevírání přes <code>file://</code> může fetch statického JSONu selhávat — použij lokální server nebo Electron.</li>
<li>Přenos dat mezi zařízeními? Stáhni JSON a importuj ho na druhém zařízení.</li>
</ul>
<p><a href="index.html">Zpět na hlavní stránku</a></p>
</div>
<footer><p class="copyright">&copy;2026 Doxa Notes - <a href="https://lukaskanka.cz/" target="_blank">Kankys</a></p></a</footer>
<script src="assets/js/script.js"></script>
</body>
</html>
@@ -0,0 +1,29 @@
{
"name": "doxa",
"version": "1.0.0",
"description": "Ostrovy myšlenek v moři chaosu",
"author": "Kankys",
"main": "main.js",
"scripts": {
"start": "npx electron .",
"dist": "electron-builder"
},
"devDependencies": {
"electron": "30.5.1",
"electron-builder": "^24.13.0"
},
"allowScripts": {
"electron": true
},
"build": {
"appId": "cz.lukan.doxa",
"productName": "Doxa.26.06.03.beta",
"electronVersion": "30.5.1",
"win": {
"target": ["nsis"]
},
"linux": {
"target": ["AppImage"]
}
}
}
@@ -0,0 +1,93 @@
<!doctype html>
<html lang="cs">
<head>
<meta charset="UTF-8" />
<title>Ochrana soukromí — Doxa</title>
<link rel="stylesheet" href="assets/style/style.css" />
<link rel="shortcut icon" href="assets/img/brain-solid-full.svg" />
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/default.min.css"
/>
<script src="https://cdn.jsdelivr.net/npm/markdown-it/dist/markdown-it.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
</head>
<body>
<div class="container">
<nav class="top-nav">
<a href="index.html">Domů</a>
<a href="navod.html">Návod</a>
<a href="privacy.html">Ochrana soukromí</a>
<a href="about.html">O projektu</a>
<button
id="themeToggle"
class="theme-toggle"
aria-label="Přepnout motiv"
>
🌙
</button>
</nav>
<h1>Ochrana soukromí</h1>
<p>
Doxa je navržena jako <strong>local‑first</strong> aplikace
— soukromí je primární designový princip. Níže shrnutí, jak
zacházím s daty v aktuálním stavu projektu.
</p>
<h2>Co aplikace ukládá</h2>
<ul>
<li>
Poznámky: <code>id</code>, <code>name</code>,
<code>content</code>, <code>created_at</code>,
<code>modified_at</code> (pokud existuje).
</li>
<li>
Žádné automatické telemetry ani sledování není
implementováno.
</li>
</ul>
<h2>Kde jsou data uložena</h2>
<ul>
<li>
V prohlížeči: <strong>localStorage</strong> (klíč
<code>Doxa_notes_v1</code>).
</li>
<li>
V Electron/Node režimu: soubor na disku (např.
<code>assets/js/data/doxa.json</code>).
</li>
<li>
Export/import: uživatel může stáhnout JSON a nahrát ho na
jiném zařízení — je to manuální proces.
</li>
</ul>
<h2>Co aplikace NEODESÍLÁ</h2>
<ul>
<li>
Výchozí instalace neposílá poznámky na žádný vzdálený
server.
</li>
<li>
Bez implementace serverové synchronizace nejsou data
odesílána ani zálohována vůči třetím stranám.
</li>
</ul
<h2>Odpovědnost uživatele</h2>
<p>
Protože data jsou lokální, odpovědnost za zálohy a bezpečnou
konfiguraci serveru (pokud použita) nese vlastník instalace.
Doporučuji pravidelné exporty a bezpečné úložiště záloh.
</p>
<p><a href="index.html">Zpět na hlavní stránku</a></p>
</div>
<footer><p class="copyright">&copy;2026 Doxa Notes - <a href="https://lukaskanka.cz/" target="_blank">Kankys</a></p></a</footer>
<script src="assets/js/script.js"></script>
</body>
</html>
+135
View File
@@ -0,0 +1,135 @@
# SEO a Playwright Testy - Audit a Plán Zlepšení
## Problémy Identifikované
### 🔴 SEO - Web (doxa-notes.org)
#### Kritické problémy:
1. **Chybějící Open Graph obrázek v index.html**
- `og:image` není specifikován, pouze Twitter image
- Bez OG image se socmédia nezobrazí korektně
2. **Chybějící meta tags pro mobily**
- Chybí `viewport` meta tag (nemá měřítko a zoomu)
- Dopad: špatné zobrazení na mobilech, horší SEO ranking
3. **Nejednotný formát title tagů**
- index.html: "DOXA Notes — Local-First poznámky..."
- about.html: "O projektu — Doxa" (bez "DOXA Notes")
- privacy.html: "Ochrana soukromí — DOXA Notes"
- Nejednotnost není ideální, měly by být konsistentní
4. **Chybí meta description na web_app/index.html**
- Web app má `robots: noindex, nofollow` (správně)
- Ale chybí base meta description, jen title
5. **Canonical URL - web_app/index.html**
- Chybí canonical tag na app stránce (jen na webu)
6. **Nejednotné sociální meta tags**
- O projektu a privacy nemají OG image, Twitter image
- Neúplné Twitter card metadata
7. **Missing lang attribute na web_app**
- web_app/index.html má `lang="cs"`, ale chybí OG locale
8. **robots.txt nedostatky**
- Sitemap odkazuje jen na wiki, ne na hlavní web
- Chybí explicit allow/disallow pro jednotlivé web stránky
### 🔴 SEO - Web App
1. **robots.txt správně blokuje web_app (noindex)**
- Správně: `Disallow: /web_app/`
2. **Chybějící Open Graph metadata**
- Není `og:*` tags vůbec
- Twitter card není definován
3. **Nedostatečný JSON-LD schema**
- Na web_app není vůbec strukturovaná data
- Jen na index.html SoftwareApplication schema
### 🔴 Playwright Testy - Problémy
1. **Chybí test pro Web App SEO**
- noteApp.test.ts nemá žádné SEO testy
- Měl by testovat noindex/nofollow, title, meta description
2. **Chybí testy pro OG tagy**
- HomePage.ts nemá metodu `getOGImage()`, `getOGTitle()`
- Chybí testy pro Twitter card
3. **Nevyhovující test abecedy menu**
- textHelpers nemá "Návod" v menu (ale existuje na webu)
- Neúplný seznam očekávaných textů
4. **Chybí accessibility testy (a11y)**
- Žádné testy pro ARIA labels, heading struktura
- Nejednotné heading struktura (h1, h2, h3)
5. **Chybí performance/lighthouse testy**
- Žádné testy pro load time, Core Web Vitals
- Žádné testy pro lazy loading obrázků
6. **Playwright config - omezený scope**
- Jen chromium, chybí firefox, webkit
- Reporter je jen HTML, žádné JSON/JUnit
7. **Chybí testy pro 404/error stránky**
- Žádné testy pro chybové strany
- Žádné testy pro chybné CSS/JS asety
8. **AppPage POM - nedostatečné selektory**
- Závisí na ID selektorech, měly by být odolnější
- Chybí error handling v navigate()
9. **Chybí data-testid atributy**
- HTML nemá `data-testid` pro stabilní test selektory
- Zranitelné na změny CSS/stylů
10. **Testy neuklízí state**
- Testy nevymazávají localStorage mezi spuštěním
- Chybí cleanup po testech
## Pracovní Plán
### Fáze 1: SEO Optimalizace (Primární)
- [ ] Přidat meta viewport tag do všech HTML
- [ ] Přidat Open Graph obrázek do všech stran
- [ ] Unifikovat title tagy podle formátu
- [ ] Doplnit meta descriptions na chybějící stránky
- [ ] Přidat OG locale pro Czech
- [ ] Doplnit Twitter Card tagy na všechny stránky
- [ ] Vytvořit sitemap.xml pro web (ne jen wiki)
- [ ] Zlepšit robots.txt
### Fáze 2: Web App Metadata
- [ ] Přidat OG tagy na web_app (s noindex varováním)
- [ ] Přidat JSON-LD schema pro WebApplication
- [ ] Ověřit noindex direktiva na web_app
### Fáze 3: Playwright Testy - SEO
- [ ] Přidat testy pro OG metadata
- [ ] Přidat testy pro Twitter Card
- [ ] Přidat testy pro meta descriptions
- [ ] Vytvořit SEO utility metody v HomePage.ts
- [ ] Vytvořit Web App SEO testy
### Fáze 4: Playwright Testy - Rozšíření
- [ ] Přidat a11y testy (ARIA, heading struktura)
- [ ] Přidat testy pro mobile viewport
- [ ] Přidat Firefox a WebKit do playwright.config
- [ ] Přidat data-testid atributy do HTML
- [ ] Přidat AppPage testy pro error states
- [ ] Přidat cleanup/setup hooks
### Fáze 5: Další Vylepšení
- [ ] Přidat lighthouse integration testy
- [ ] Přidat JSON reporter k playwright
- [ ] Přidat CI/CD integration
## Poznámky
- Zaměření primárně na SEO (dle požadavku)
- Web vs Web App: Web je SEO friendly, App je noindex (správně)
- Playwright testy potřebují kompletní refresh
+19
View File
@@ -0,0 +1,19 @@
# Testovací plán projektu DOXA
## 1. Web (Landing page)
- [x] Ověření viditelnosti všech položek menu.
- [x] Navigace na vnitřní stránky (O projektu, Ochrana soukromí).
- [x] Kontrola funkčnosti externího odkazu na aplikaci.
- [x] **SEO testy:** Validace `title`, `meta description` a `canonical link` na všech stránkách.
- [ ] *Doporučení:* Přidat test na responsivitu (zobrazení na mobilu/tabletu).
## 2. Aplikace (Editor poznámek)
- [x] Vytvoření, editace a uložení poznámky včetně tagů.
- [x] Ověření zobrazení `Slash Commands` menu po napsání "/".
- [ ] **Validace vstupů:** Test uložení prázdné poznámky.
- [ ] **Správa tagů:** Test smazání tagu z existující poznámky.
- [ ] **Persistence:** (Pokud lze) Ověřit, že po znovunačtení stránky poznámka zůstala.
## 3. Infrastruktura a kvalita
- [ ] Implementovat testy na `Accessibility` (přístupnost) pomocí `@axe-core/playwright`.
- [ ] Přidat vizuální regresní testy (snapshot testing) pro editor.
+194
View File
@@ -0,0 +1,194 @@
# 📋 Plán rozšíření automatizovaných testů pro DOXA Notes
## 1. Analýza současného stavu vs. Cíl
* **Současný stav:** Testuje se pouze viditelnost menu a navigace na webu `https://doxa-notes.org`. Core aplikace (`https://app.doxa-notes.org` / `web_app`) nemá žádné testy.
* **Cíl:** Vytvořit robustní e2e testy, které pokryjí kompletní životní cyklus poznámky (CRUD), tagy, drag-and-drop, exporty, motivy vzhledu a rychlé příkazy (Slash Commands) na lokálně běžícím serveru.
---
## 2. Navržené testovací scénáře (Test Suite)
### Oblast A: Jádro aplikace (složka `test/playwright/tests/app/`)
Tato část bude testovat funkčnost v `web_app/index.html`.
1. **Správa poznámek (CRUD)**
* **Vytvoření:** Kliknutí na `➕ Nová poznámka`, zadání názvu do promptu, ověření, že se přidala do seznamu a otevřela v editoru.
* **Editace:** Zápis textu do editoru, uložení pomocí tlačítka `Uložit nyní` a ověření stavu „Uloženo“.
* **Smazání:** Kliknutí na 🗑, potvrzení dialogu (`page.on('dialog')`) a ověření, že poznámka zmizela.
* **Pokročilá editace:** Otevření modálu přes ikonu ✎, změna textu, uložení a ověření.
2. **Tagování a vyhledávání**
* **Přidání tagů:** Vyplnění pole `#noteTags` a ověření, že se tagy uložily k poznámce v seznamu.
* **Filtrování:** Zadání tagu do vyhledávacího pole a ověření, že se zobrazí pouze poznámky s tímto tagem.
3. **Markdown a Náhled (Live Preview)**
* **Formátování:** Vložení formátování přes tlačítka v toolbaru (Bold, Italic, Nadpisy) a ověření, zda se v textu objevily správné Markdown znaky (`**`, `*`, `#`).
* **Náhled:** Přepnutí do režimu „Náhled“ a ověření, že se text správně vyrenderoval do HTML (např. `<strong>` pro tučný text).
4. **Přesouvání poznámek (Reordering)**
* **Šipky:** Kliknutí na šipku dolů/nahoru u poznámky a ověření, zda se změnilo její pořadí v seznamu.
* **Drag & Drop:** Simulace přetažení jedné poznámky na druhou a ověření nového pořadí.
5. **Import & Export**
* **Export do Markdownu:** Kliknutí na `Exportovat do Markdown`, zachycení staženého souboru (`page.waitForEvent('download')`) a ověření jeho obsahu.
* **Export JSON:** Ověření stažení souboru `doxa.json`.
6. **Slash Commands (Rychlá volba `/`)**
* **Zobrazení menu:** Napsání znaku `/` do editoru a ověření zobrazení slash menu.
* **Filtrování:** Napsání `/da` a ověření, že v menu zůstala pouze možnost `/date`.
* **Vložení:** Výběr příkazu (Enter/klik) a ověření, že se na pozici kurzoru vložilo např. dnešní datum.
---
## 3. Architektura testů (Page Object Model)
Pro udržení čistoty kódu vytvoříme nový Page Object `AppPage.ts` a přesuneme spouštění aplikací na lokální server v configu.
### Krok 1: Úprava `playwright.config.ts`
Chceme, aby testy běžely nezávisle na produkční síti. Nakonfigurujeme lokální webserver:
```typescript
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests',
fullyParallel: true,
reporter: 'html',
use: {
baseURL: 'http://localhost:8080', // Lokální adresa pro testy
trace: 'on-first-retry',
},
webServer: {
command: 'npx http-server ../../web_app -p 8080', // Spustí web_app lokálně
url: 'http://localhost:8080',
reuseExistingServer: !process.env.CI,
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
],
});
```
### Krok 2: Vytvoření Page Object Modelu (`tests/app/pages/AppPage.ts`)
```typescript
import { Page, Locator, expect } from '@playwright/test';
export class AppPage {
readonly page: Page;
readonly newNoteButton: Locator;
readonly noteTitleInput: Locator;
readonly noteTagsInput: Locator;
readonly noteEditor: Locator;
readonly saveButton: Locator;
readonly notesContainer: Locator;
readonly searchTagInput: Locator;
readonly slashMenu: Locator;
constructor(page: Page) {
this.page = page;
this.newNoteButton = page.locator('#newNoteButton');
this.noteTitleInput = page.locator('#noteTitle');
this.noteTagsInput = page.locator('#noteTags');
this.noteEditor = page.locator('#noteInput');
this.saveButton = page.getByRole('button', { name: 'Uložit nyní' });
this.notesContainer = page.locator('#notesContainer');
this.searchTagInput = page.locator('#searchTagInput');
this.slashMenu = page.locator('#slashCommandMenu');
}
async navigate() {
await this.page.goto('/');
}
async createNewNote(name: string) {
// Zachytíme nativní JS prompt
this.page.once('dialog', async dialog => {
await dialog.accept(name);
});
await this.newNoteButton.click();
}
async fillNote(content: string, tags?: string) {
await this.noteEditor.fill(content);
if (tags) {
await this.noteTagsInput.fill(tags);
}
await this.saveButton.click();
}
async getNoteList() {
return this.notesContainer.locator('.note-item');
}
}
```
### Krok 3: Vzorový test (`tests/app/noteApp.test.ts`)
```typescript
import { test, expect } from '@playwright/test';
import { AppPage } from './pages/AppPage';
test.describe('DOXA Web App - Core Functionality', () => {
let appPage: AppPage;
test.beforeEach(async ({ page }) => {
appPage = new AppPage(page);
await appPage.navigate();
});
test('Vytvoření, editace a ověření poznámky s tagy', async () => {
// 1. Vytvoření nové poznámky
const noteName = 'Moje Stoická Poznámka';
await appPage.createNewNote(noteName);
// Ověříme, že se poznámka objevila v seznamu jako aktivní
const notes = await appPage.getNoteList();
await expect(notes.first()).toContainText(noteName);
await expect(notes.first()).toHaveClass(/active/);
// 2. Editace poznámky a tagů
await appPage.fillNote('Dnes odepřena digitální iluze.', 'filozofie, stoicismus');
// 3. Ověření uložení a zobrazení tagu
await expect(notes.first().locator('.note-preview-tags')).toContainText('🏷️ filozofie, stoicismus');
});
test('Slash Commands menu se zobrazí po napsání /', async () => {
const noteName = 'Test slash příkazů';
await appPage.createNewNote(noteName);
// Klikneme do editoru a napíšeme "/"
await appPage.noteEditor.focus();
await appPage.page.keyboard.type('/');
// Ověříme, že se menu zobrazilo
await expect(appPage.slashMenu).toBeVisible();
await expect(appPage.slashMenu).toContainText('Vložit dnešní datum');
});
});
```
---
## 4. Postup implementace (Roadmap)
1. **Fáze 1: Příprava prostředí**
* Nainstalovat `http-server` jako dev dependency do rootu nebo využít playwright webServer (`npm install --save-dev http-server`).
* Aktualizovat `playwright.config.ts`.
2. **Fáze 2: Základní POM a CRUD**
* Vytvořit soubor `AppPage.ts`.
* Pokrýt základní chování (vytvoření, uložení, smazání poznámky).
3. **Fáze 3: Pokročilé interakce**
* Přidat testy na Drag & Drop řazení poznámek.
* Přidat testy na klávesové zkratky a Slash Command menu.
4. **Fáze 4: Výstupy a Integrace (CI)**
* Pokrýt stahování a nahrávání JSON záloh.
* Zapojit testy do GitHub Actions/Codeberg CI tak, aby automaticky běžely při každém Pull Requestu.
Pokud se ti tento plán líbí, mohu rovnou začít s přípravou konfigurace a implementací prvního testovacího balíčku pro samotnou aplikaci! Dej mi vědět, jak chceš pokračovat.
plansCopilot
+70
View File
@@ -0,0 +1,70 @@
1. Upravit `plawright.config.ts` (doxa)
2. Do `package.json` přidat script BASE_URL (doxa)
3. Upravit HomePage.ts a další dle (doxa)
---
## Spuštění testů
- local `npx playwright test --ui` nebo `npx playwright test`
- prod `test:prod` nebo dle nastavení script v `package.json`
---
script package.json:
```
"scripts": {
"test": "playwright test",
"test:prod": "BASE_URL=https://doxa-notes.org playwright test homePage.test.ts",
"test:prodapp": "BASE_URL=https://app.doxa-notes.org playwright test noteApp.test.ts "
}
```
playwright.config.ts:
```
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests',
fullyParallel: true,
reporter: 'html',
use: {
// Pokud v terminálu nastavíš BASE_URL, použije ho. Jinak použije localhost.
baseURL: process.env.BASE_URL || 'http://localhost:8080',
trace: 'on-first-retry',
},
webServer: {
// WebServer se spustí pouze tehdy, pokud NENÍ nastavena jiná BASE_URL
// (nechceme spouštět lokální server, když testujeme produkci)
command: process.env.BASE_URL ? undefined : 'npx http-server ../../ -p 8080',
url: process.env.BASE_URL || 'http://localhost:8080',
reuseExistingServer: !process.env.CI,
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
],
});
```
HomePage.test.ts:
```
readonly page: Page;
constructor(page: Page) {
this.page = page;
}
// Přidej metodu pro navigaci na konkrétní soubor
async navigate(file: string = 'index.html') {
// Pokud jsme na lokálu, přidáme složku /web/
// Pokud jsme na produkci, předpokládáme root /
const prefix = process.env.BASE_URL?.includes('doxa-notes.org') ? '' : 'web/';
await this.page.goto(`${prefix}${file}`);
}
```
View File
Whitespace-only changes.
+8
View File
@@ -0,0 +1,8 @@
# Playwright
node_modules/
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
/playwright/.auth/
+727
View File
@@ -0,0 +1,727 @@
{
"name": "playwright",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "playwright",
"version": "1.0.0",
"license": "ISC",
"devDependencies": {
"@playwright/test": "^1.61.1",
"@types/node": "^26.1.1",
"http-server": "^14.1.1"
}
},
"node_modules/@playwright/test": {
"version": "1.61.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz",
"integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"playwright": "1.61.1"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
}
},
"node_modules/@types/node": {
"version": "26.1.1",
"resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz",
"integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~8.3.0"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/async": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"dev": true,
"license": "MIT"
},
"node_modules/basic-auth": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
"integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
"dev": true,
"license": "MIT",
"dependencies": {
"safe-buffer": "5.1.2"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/call-bound": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
"integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"get-intrinsic": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"license": "MIT"
},
"node_modules/corser": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
"integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
"integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"dev": true,
"license": "MIT"
},
"node_modules/follow-redirects": {
"version": "1.16.0",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
"integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
"integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
"dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true,
"license": "MIT",
"bin": {
"he": "bin/he"
}
},
"node_modules/html-encoding-sniffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
"integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
"dev": true,
"license": "MIT",
"dependencies": {
"whatwg-encoding": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/http-proxy": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"eventemitter3": "^4.0.0",
"follow-redirects": "^1.0.0",
"requires-port": "^1.0.0"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/http-server": {
"version": "14.1.1",
"resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz",
"integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==",
"dev": true,
"license": "MIT",
"dependencies": {
"basic-auth": "^2.0.1",
"chalk": "^4.1.2",
"corser": "^2.0.1",
"he": "^1.2.0",
"html-encoding-sniffer": "^3.0.0",
"http-proxy": "^1.18.1",
"mime": "^1.6.0",
"minimist": "^1.2.6",
"opener": "^1.5.1",
"portfinder": "^1.0.28",
"secure-compare": "3.0.1",
"union": "~0.5.0",
"url-join": "^4.0.1"
},
"bin": {
"http-server": "bin/http-server"
},
"engines": {
"node": ">=12"
}
},
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true,
"license": "MIT",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true,
"license": "MIT"
},
"node_modules/object-inspect": {
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/opener": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
"dev": true,
"license": "(WTFPL OR MIT)",
"bin": {
"opener": "bin/opener-bin.js"
}
},
"node_modules/playwright": {
"version": "1.61.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz",
"integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"playwright-core": "1.61.1"
},
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=18"
},
"optionalDependencies": {
"fsevents": "2.3.2"
}
},
"node_modules/playwright-core": {
"version": "1.61.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz",
"integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"playwright-core": "cli.js"
},
"engines": {
"node": ">=18"
}
},
"node_modules/portfinder": {
"version": "1.0.38",
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz",
"integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==",
"dev": true,
"license": "MIT",
"dependencies": {
"async": "^3.2.6",
"debug": "^4.3.6"
},
"engines": {
"node": ">= 10.12"
}
},
"node_modules/qs": {
"version": "6.15.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz",
"integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"es-define-property": "^1.0.1",
"side-channel": "^1.1.1"
},
"engines": {
"node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true,
"license": "MIT"
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true,
"license": "MIT"
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
"license": "MIT"
},
"node_modules/secure-compare": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz",
"integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==",
"dev": true,
"license": "MIT"
},
"node_modules/side-channel": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
"integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"object-inspect": "^1.13.4",
"side-channel-list": "^1.0.1",
"side-channel-map": "^1.0.1",
"side-channel-weakmap": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-list": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
"integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"object-inspect": "^1.13.4"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-map": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.5",
"object-inspect": "^1.13.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel-weakmap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.5",
"object-inspect": "^1.13.3",
"side-channel-map": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/undici-types": {
"version": "8.3.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
"integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
"dev": true,
"license": "MIT"
},
"node_modules/union": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz",
"integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==",
"dev": true,
"dependencies": {
"qs": "^6.4.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/url-join": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
"integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
"dev": true,
"license": "MIT"
},
"node_modules/whatwg-encoding": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
"integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
"deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
"dev": true,
"license": "MIT",
"dependencies": {
"iconv-lite": "0.6.3"
},
"engines": {
"node": ">=12"
}
}
}
}
+21
View File
@@ -0,0 +1,21 @@
{
"name": "playwright",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {},
"keywords": [],
"author": "",
"license": "ISC",
"type": "commonjs",
"devDependencies": {
"@playwright/test": "^1.61.1",
"@types/node": "^26.1.1",
"http-server": "^14.1.1"
},
"scripts": {
"test": "playwright test",
"test:prod": "BASE_URL=https://doxa-notes.org playwright test homePage.test.ts",
"test:prodapp": "BASE_URL=https://app.doxa-notes.org playwright test noteApp.test.ts "
}
}
@@ -0,0 +1,25 @@
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests',
fullyParallel: true,
reporter: 'html',
use: {
// Pokud v terminálu nastavíš BASE_URL, použije ho. Jinak použije localhost.
baseURL: process.env.BASE_URL || 'http://localhost:8080',
trace: 'on-first-retry',
},
webServer: {
// WebServer se spustí pouze tehdy, pokud NENÍ nastavena jiná BASE_URL
// (nechceme spouštět lokální server, když testujeme produkci)
command: process.env.BASE_URL ? undefined : 'npx http-server ../../ -p 8080',
url: process.env.BASE_URL || 'http://localhost:8080',
reuseExistingServer: !process.env.CI,
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
],
});
@@ -0,0 +1,41 @@
import { test, expect } from '@playwright/test';
import { AppPage } from '../pages/AppPage';
test.describe('DOXA Web App - Core Functionality', () => {
let appPage: AppPage;
test.beforeEach(async ({ page }) => {
appPage = new AppPage(page);
await appPage.navigate();
});
test('Vytvoření, editace a ověření poznámky s tagy', async () => {
// 1. Vytvoření nové poznámky
const noteName = 'Moje Stoická Poznámka';
await appPage.createNewNote(noteName);
// Ověříme, že se poznámka objevila v seznamu jako aktivní
const notes = await appPage.getNoteList();
await expect(notes.first()).toContainText(noteName);
await expect(notes.first()).toHaveClass(/active/);
// 2. Editace poznámky a tagů
await appPage.fillNote('Dnes odepřena digitální iluze.', 'filozofie, stoicismus');
// 3. Ověření uložení a zobrazení tagu
await expect(notes.first().locator('.note-preview-tags')).toContainText('🏷️ filozofie, stoicismus');
});
test('Slash Commands menu se zobrazí po napsání /', async () => {
const noteName = 'Test slash příkazů';
await appPage.createNewNote(noteName);
// Klikneme do editoru a napíšeme "/"
await appPage.noteEditor.focus();
await appPage.page.keyboard.type('/');
// Ověříme, že se menu zobrazilo
await expect(appPage.slashMenu).toBeVisible();
await expect(appPage.slashMenu).toContainText('Vložit dnešní datum');
});
});
@@ -0,0 +1,6 @@
export const expectedMenuTexts = [
"Domů",
"Wiki",
"Ochrana soukromí",
"O projektu",
];
@@ -0,0 +1,65 @@
import { Page, Locator, expect } from '@playwright/test';
export class AppPage {
readonly page: Page;
readonly newNoteButton: Locator;
readonly noteTitleInput: Locator;
readonly noteTagsInput: Locator;
readonly noteEditor: Locator;
readonly saveButton: Locator;
readonly notesContainer: Locator;
readonly searchTagInput: Locator;
readonly slashMenu: Locator;
constructor(page: Page) {
this.page = page;
this.newNoteButton = page.locator('#newNoteButton');
this.noteTitleInput = page.locator('#noteTitle');
this.noteTagsInput = page.locator('#noteTags');
this.noteEditor = page.locator('#noteInput');
this.saveButton = page.getByRole('button', { name: 'Uložit nyní' });
this.notesContainer = page.locator('#notesContainer');
this.searchTagInput = page.locator('#searchTagInput');
this.slashMenu = page.locator('#slashCommandMenu');
}
// Přidej metodu pro navigaci na konkrétní soubor
async navigate(file: string = 'index.html') {
// Pokud jsme na lokálu, přidáme složku /web/
// Pokud jsme na produkci, předpokládáme root /
const prefix = process.env.BASE_URL?.includes('app.doxa-notes.org') ? '' : 'web_app/';
await this.page.goto(`${prefix}${file}`);
}
// async navigate() {
// await this.page.goto(this.path);
// }
async createNewNote(name: string) {
// Zachytíme nativní JS prompt
this.page.once('dialog', async dialog => {
await dialog.accept(name);
});
await this.newNoteButton.click();
}
async fillNote(content: string, tags?: string) {
await this.noteEditor.fill(content);
if (tags) {
await this.noteTagsInput.fill(tags);
}
await this.saveButton.click();
}
async getNoteList() {
return this.notesContainer.locator('.note-item');
}
}
@@ -0,0 +1,49 @@
import { expect, type Locator, type Page } from '@playwright/test';
export class HomePage {
readonly page: Page;
constructor(page: Page) {
this.page = page;
}
// Přidej metodu pro navigaci na konkrétní soubor
async navigate(file: string = 'index.html') {
// Pokud jsme na lokálu, přidáme složku /web/
// Pokud jsme na produkci, předpokládáme root /
const prefix = process.env.BASE_URL?.includes('doxa-notes.org') ? '' : 'web/';
await this.page.goto(`${prefix}${file}`);
}
// Otestování, zda jsou všechny odkazy v menu viditelné
async checkMenuTexts(expectedTexts: string[]) {
for (const text of expectedTexts) {
const item = this.page.getByText(text, { exact: true });
await expect(item).toBeVisible();
}
}
// test externí odkazy
async getPageTitle(): Promise<string> {
return await this.page.title();
}
async getMetaDescription(): Promise<string | null> {
const meta = this.page.locator('meta[name="description"]');
return await meta.getAttribute('content');
}
async getCanonical(): Promise<string | null> {
const link = this.page.locator('link[rel="canonical"]');
return await link.getAttribute('href');
}
// test kliku na externí odkaz
async clickExternalLink(text: string) {
await this.page.locator(text).click();
}
}
@@ -0,0 +1,68 @@
import { test, expect } from '@playwright/test';
import { HomePage } from '../pages/HomePage';
import { expectedMenuTexts } from '../assets/text/textHelpers';
test.describe('DOXA Notes HomePage - POM', () => {
let homePage: HomePage;
// Před každým testem vytvoříme novou instanci stránky
test.beforeEach(async ({ page }) => {
homePage = new HomePage(page);
await homePage.navigate();
});
test.describe('navigate', () => {
test('check all menu items visibility', async () => {
await homePage.checkMenuTexts(expectedMenuTexts);
});
test('navigation to Ochrana soukromí', async () => {
await homePage.navigate('privacy.html'); // Naviguje správně podle prostředí
await expect(homePage.page).toHaveURL(/\/privacy\.html$/); // Odolné testování URL
});
test('navigation to O projektu', async () => {
await homePage.navigate('about.html');
await expect(homePage.page).toHaveURL(/\/about\.html$/);
});
test('externí odkaz do DOXA app', async ({ page }) => {
await homePage.clickExternalLink('.btnHomePage');
const newPage = await page.waitForEvent('popup');
const newpage = await newPage.waitForLoadState();
expect(await newPage.url()).toBe('https://app.doxa-notes.org/');
})
});
test.describe('SEO - Search Engine Optimization', () => {
test('check title, meta description and canonical link on home page', async () => {
const title = await homePage.getPageTitle();
expect(title).toBe('DOXA Notes — Local-First poznámky a minimalistický Markdown editor');
const desc = await homePage.getMetaDescription();
expect(desc).toBe('DOXA Notes je minimalistická, local‑first poznámková aplikace s podporou Markdownu a otevřeným formátem JSON. Absolutní soukromí pro vaše myšlenky.');
const canonical = await homePage.getCanonical();
expect(canonical).toBe('https://doxa-notes.org/index.html');
});
test('check title and canonical link on O projektu page', async ({ page }) => {
await homePage.navigate('O projektu');
await expect(page).toHaveTitle('O projektu — DOXA Notes');
const canonical = await page.locator('link[rel="canonical"]').getAttribute('href');
expect(canonical).toBe('https://doxa-notes.org/about.html');
});
test('check title and canonical link on Ochrana soukromí page', async ({ page }) => {
await homePage.navigate('privacy.html');
await expect(homePage.page).toHaveTitle('Ochrana soukromí — DOXA Notes');
const canonical = await page.locator('link[rel="canonical"]').getAttribute('href');
expect(canonical).toBe('https://doxa-notes.org/privacy.html');
});
});
});
+135
View File
@@ -0,0 +1,135 @@
<!doctype html>
<html lang="cs">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title data-i18n-key="about.pageTitle">O projektu — DOXA Notes</title>
<meta name="description" data-i18n-key="about.pageDescription" data-i18n-attr="content"
content="Přečtěte si manifest a filozofické i technické cíle projektu DOXA Notes. Technická suverenita, local-first přístup a bezpečné ukládání myšlenek." />
<link rel="canonical" href="https://doxa-notes.org/about.html" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://doxa-notes.org/about.html" />
<meta property="og:title" data-i18n-key="about.ogTitle" data-i18n-attr="content" content="O projektu — DOXA Notes" />
<meta property="og:description" data-i18n-key="about.ogDescription" data-i18n-attr="content" content="Manifest a filozofické cíle projektu DOXA Notes. Technická suverenita, local-first přístup a bezpečné ukládání myšlenek." />
<meta property="og:image" content="https://doxa-notes.org/assets/img/doxa.png" />
<meta property="og:image:alt" content="DOXA Notes - Local-First Notes & Sovereignty" />
<meta property="og:locale" data-i18n-key="ogLocale" data-i18n-attr="content" content="cs_CZ" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" data-i18n-key="about.twitterTitle" data-i18n-attr="content" content="O projektu — DOXA Notes" />
<meta name="twitter:description" data-i18n-key="about.twitterDescription" data-i18n-attr="content" content="Manifest a filozofické cíle projektu DOXA Notes." />
<meta name="twitter:image" content="https://doxa-notes.org/assets/img/doxa.png" />
<meta name="twitter:image:alt" content="DOXA Notes - Local-First Notes & Sovereignty" />
<link rel="stylesheet" href="assets/style/style.css" />
<link rel="shortcut icon" href="assets/img/brain-solid-full.svg" />
</head>
<body>
<div class="container">
<nav class="top-nav">
<a href="index.html" data-i18n-key="nav.home">Domů</a>
<a href="https://wiki.doxa-notes.org/index.html" target="_blank" data-i18n-key="nav.wiki">Wiki</a>
<a href="privacy.html" data-i18n-key="nav.privacy">Ochrana soukromí</a>
<a href="about.html" data-i18n-key="nav.about">O projektu</a>
<button id="langToggle" class="theme-toggle" title="Přepnout jazyk / Switch language">
🇬🇧 / 🇨🇿
</button>
<button id="themeToggle" class="theme-toggle" data-i18n-key="nav.themeToggle" data-i18n-attr="aria-label" aria-label="Přepnout motiv">
🌙
</button>
</nav>
<h1 data-i18n-key="about.mainTitle">O projektu — Doxa</h1>
<p><img src="assets/img/doxa.png" alt="Doxa" width="70%" height="auto"
style="display: block; margin: 0 auto;border-radius: 10px;" /></p>
<br>
<h2 style="text-align: center;" data-i18n-key="manifest.title">Manifest digitální suverenity a minimalistického myšlení</h2>
<br>
<p><strong data-i18n-key="manifest.projectIntent.title">Záměr projektu:</strong></p>
<p data-i18n-key="manifest.projectIntent.body">Vytvořit absolutně nezávislé, bezpečné a minimalistické prostředí pro uchovávání lidských myšlenek, poznámek
a životních reflexí. V souladu se základními principy osobní svobody a soběstačnosti aplikace vědomě odmítá
cloudové databáze, servery třetích stran a centralizovaná API. Doxa věří, že lidská mysl nepotřebuje být
sledována algoritmy, aby mohla růst.</p>
<br>
<h3 data-i18n-key="manifest.localFirst.title">1. Radikální Local-First Filozofie</h3>
<p data-i18n-key="manifest.localFirst.subtitle">Aplikace funguje na principu absolutní decentralizace. Běží na tvém zařízení a tam také umírá i žije.</p>
<ul>
<li data-i18n-key="manifest.localFirst.noBackend">Žádný backend, žádné API: Doxa vědomě neobsahuje žádný kód pro odesílání dat na vzdálené servery. Tím je
eliminováno riziko úniku dat, výpadku serveru nebo změny obchodních podmínek poskytovatele.</li>
<li data-i18n-key="manifest.localFirst.privacy">Absolutní soukromí: Data jsou uložena výhradně v tvém prohlížeči (localStorage) nebo lokálním souboru.
Co napíšeš, to zůstává tvým výhradním vlastnictvím.</li>
</ul>
<br>
<h3 data-i18n-key="manifest.jsonFormat.title">2. Formát JSON: Trvanlivost napříč dekádami</h3>
<p data-i18n-key="manifest.jsonFormat.subtitle">Data jsou strukturována do otevřeného, čistého a lidsky čitelného formátu JSON. Žádné proprietární databáze.</p>
<ul>
<li data-i18n-key="manifest.jsonFormat.ownership">Tvá data ti patří. Díky možnosti manuálního exportu si můžeš svůj myšlenkový fond odnést kamkoli –
uložit si ho na svůj bezpečný lokální disk, nahrát na vlastní Git (GitHub/Gitea), nebo jej
synchronizovat skrze cloudovou službu, kterou ty sám uznáš za bezpečnou.</li>
<li data-i18n-key="manifest.jsonFormat.longevity">Čistota formátu zaručuje, že tvé poznámky budou čitelné i za dvacet let na jakémkoli zařízení, bez
ohledu na to, zda Doxa bude stále existovat.</li>
</ul>
<br>
<h3 data-i18n-key="manifest.vanillaStack.title">3. Technická čistota a minimalismus (Vanilla Stack)</h3>
<p data-i18n-key="manifest.vanillaStack.subtitle">Pro zachování maximální rychlosti, nezávislosti a nulových externích závislostí je aplikace postavena
výhradně na čistých webových standardech: </p>
<ul>
<li data-i18n-key="manifest.vanillaStack.frontend">Frontend (HTML5/CSS3): Minimalistické rozhraní, které nezatěžuje mysl barevným chaosem a vizuálním
balastem moderního internetu.</li>
<li data-i18n-key="manifest.vanillaStack.logic">Logika (Vanilla JavaScript ES6+): Žádné těžkopádné frameworky (React/Vue), které podléhají módním
trendům a neustálým změnám. Čistý kód je trvanlivý jako tesání do kamene.</li>
</ul>
<blockquote style="white-space: pre-wrap;">
<p data-i18n-key="manifest.quote">„Nezáleží na tom, jak složité jsou okolnosti kolem tebe. Když stavíš vlastní chrám myšlenek, začínáš od prvního kamene. Tento kód a tvá data jsou tvým vlastním, nedobytným hradem.“</p>
<footer data-i18n-key="manifest.quote.author">— Stoický odkaz pro svobodné myslitele</footer>
</blockquote>
<br>
<hr id="lineHR">
<br>
<h2 data-i18n-key="about.architecture.title">Architektura</h2>
<ul>
<li data-i18n-key="about.architecture.item1">Frontend: čisté HTML/CSS/JS (bez frameworků).</li>
<li data-i18n-key="about.architecture.item2">Datový formát: otevřený JSON — trvanlivý a přenosný.</li>
<li data-i18n-key="about.architecture.item3">Local‑first: data jsou lokální (localStorage nebo soubor).</li>
<li data-i18n-key="about.architecture.item4">Desktop aplikace pro Linux je zabalena do instalátorů AppImage.</li>
</ul>
<br>
<h2 data-i18n-key="about.recent.title">Co bylo přidáno naposledy</h2>
<ul>
<li data-i18n-key="about.recent.item1">Podpora více poznámek v jednom JSON (název + obsah).</li>
<li data-i18n-key="about.recent.item2">Přidání, editace (inline + modal), mazání poznámek.</li>
<li data-i18n-key="about.recent.item3">Přesouvání pořadí (šípky + drag & drop).</li>
<li data-i18n-key="about.recent.item4">Import / Export JSON a fallback mezi localStorage a lokálním souborem (Electron).</li>
<li data-i18n-key="about.recent.item5">Přidána Markdown podpora</li>
<li data-i18n-key="about.recent.item6">Desktop aplikace pro Linux</li>
<li data-i18n-key="about.recent.item7">Přidání tagů do poznámek</li>
</ul>
<br>
<h2 data-i18n-key="about.plans.title">Další plány</h2>
<ul>
<li data-i18n-key="about.plans.item1">Rozšíření UI (hledání, historie/undo).</li>
</ul>
<br>
<hr id="lineHR">
<br>
<p data-i18n-key="about.repo.text" style="white-space: pre-wrap;">Projekt najdeš v repozitáři
<a id="links" href="https://codeberg.org/kankys/doxa" target="_blank">&nbsp;Codeberg</a>. Pokud chceš přispět,
otevři issue nebo PR.</p>
<p data-i18n-key="about.author.text" style="white-space: pre-wrap;">Web autora, další projekty a podpora: <a id="links" href="https://lukaskanka.cz/" target="_blank">Lukáš Kaňka</a></p>
<p data-i18n-key="about.license.text">Aplikace je open-source a licencována pod MIT licencí.</p>
<br />
</div>
<footer>
<p class="copyright" data-i18n-key="footer.copyright">&copy; 2026 Doxa Notes | Local-First & Freedom 🦅</p>
</footer>
<script src="assets/js/i18n.js"></script>
<script src="assets/js/script.js"></script>
</body>
</html>
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path d="M184 120C184 89.1 209.1 64 240 64L264 64C281.7 64 296 78.3 296 96L296 544C296 561.7 281.7 576 264 576L232 576C202.2 576 177.1 555.6 170 528C169.3 528 168.7 528 168 528C123.8 528 88 492.2 88 448C88 430 94 413.4 104 400C84.6 385.4 72 362.2 72 336C72 305.1 89.6 278.2 115.2 264.9C108.1 252.9 104 238.9 104 224C104 179.8 139.8 144 184 144L184 120zM456 120L456 144C500.2 144 536 179.8 536 224C536 239 531.9 253 524.8 264.9C550.5 278.2 568 305 568 336C568 362.2 555.4 385.4 536 400C546 413.4 552 430 552 448C552 492.2 516.2 528 472 528C471.3 528 470.7 528 470 528C462.9 555.6 437.8 576 408 576L376 576C358.3 576 344 561.7 344 544L344 96C344 78.3 358.3 64 376 64L400 64C430.9 64 456 89.1 456 120z"/></svg>

After

Width:  |  Height:  |  Size: 920 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 KiB

+3
View File
@@ -0,0 +1,3 @@
{
"notes": []
}
+72
View File
@@ -0,0 +1,72 @@
// Tento skript by měl být v HTML vložen PŘED hlavním script.js
// Globální překladová funkce, kterou bude používat i script.js
let translations = {};
window.t = (key, params = {}) => {
let text = translations[key] || key;
for (const p in params) {
text = text.replace(`{${p}}`, params[p]);
}
return text;
};
/**
* Načte překlady pro daný jazyk a aplikuje je na DOM.
* @param {string} lang - Kód jazyka (např. 'en', 'cs').
*/
window.setLanguage = async function(lang) {
// 1. Uloží preferenci uživatele
localStorage.setItem('doxa_lang', lang);
// Nastaví atribut 'lang' na <html> elementu
document.documentElement.lang = lang;
// 2. Načte a uloží překlady
try {
const response = await fetch(`assets/locales/${lang}.json`);
if (!response.ok) {
console.error(`Chyba: Nepodařilo se načíst soubor s překlady: ${lang}.json`);
translations = {};
} else {
translations = await response.json();
}
} catch (error) {
console.error(`Chyba při načítání překladů pro jazyk ${lang}:`, error);
translations = {};
}
// 3. Přeloží všechny statické prvky v DOM
document.querySelectorAll('[data-i18n-key]').forEach(el => {
const key = el.getAttribute('data-i18n-key');
const translation = window.t(key);
// Přeloží specifický atribut (např. placeholder, title), pokud je definován
const attr = el.getAttribute('data-i18n-attr');
if (attr) {
el.setAttribute(attr, translation);
} else {
// Jinak přeloží obsah elementu
el.innerHTML = translation;
}
});
// 4. DŮLEŽITÉ: Znovu inicializuje části aplikace, které používají dynamický text
if (typeof window.updateDynamicUIText === 'function') {
window.updateDynamicUIText();
}
}
document.addEventListener('DOMContentLoaded', () => {
const userLang = localStorage.getItem('doxa_lang') || navigator.language.split('-')[0];
const langToLoad = ['en', 'cs'].includes(userLang) ? userLang : 'cs';
window.setLanguage(langToLoad);
const langToggleBtn = document.getElementById('langToggle');
if (langToggleBtn) {
langToggleBtn.addEventListener('click', () => {
const currentLang = localStorage.getItem('doxa_lang') || 'cs';
const nextLang = currentLang === 'cs' ? 'en' : 'cs';
window.setLanguage(nextLang);
});
}
});
+85
View File
@@ -0,0 +1,85 @@
(function () {
"use strict";
const THEME_KEY = "doxa_theme";
let systemMediaQuery = null;
let systemMediaListener = null;
function applyTheme(theme) {
try {
if (systemMediaQuery && systemMediaListener) {
try {
if (systemMediaQuery.removeEventListener)
systemMediaQuery.removeEventListener("change", systemMediaListener);
else systemMediaQuery.removeListener(systemMediaListener);
} catch (e) {}
systemMediaQuery = null;
systemMediaListener = null;
}
if (theme === "dark") {
document.body.classList.add("dark");
} else if (theme === "light") {
document.body.classList.remove("dark");
} else {
try {
const mql = window.matchMedia("(prefers-color-scheme: dark)");
if (mql.matches) document.body.classList.add("dark");
else document.body.classList.remove("dark");
systemMediaQuery = mql;
systemMediaListener = function (e) {
if (e.matches) document.body.classList.add("dark");
else document.body.classList.remove("dark");
updateThemeButton();
};
if (mql.addEventListener)
mql.addEventListener("change", systemMediaListener);
else mql.addListener(systemMediaListener);
} catch (e) {
document.body.classList.remove("dark");
}
}
} catch (e) {}
updateThemeButton();
}
function updateThemeButton() {
const btn = document.getElementById("themeToggle");
if (!btn) return;
const theme = getStoredTheme() || "system";
let icon = "🌓";
if (theme === "dark") {
icon = "🌙";
} else if (theme === "light") {
icon = "☀️";
}
btn.textContent = icon;
}
function getStoredTheme() {
try {
return localStorage.getItem(THEME_KEY);
} catch (e) { return null; }
}
function setStoredTheme(value) {
try {
localStorage.setItem(THEME_KEY, value);
} catch (e) {}
}
function toggleTheme() {
const stored = getStoredTheme() || "system";
const order = ["light", "dark", "system"];
let idx = order.indexOf(stored);
if (idx === -1) idx = 2;
const next = order[(idx + 1) % order.length];
setStoredTheme(next);
applyTheme(next);
}
document.addEventListener("DOMContentLoaded", () => {
const themeBtn = document.getElementById("themeToggle");
if (themeBtn) themeBtn.addEventListener("click", toggleTheme);
applyTheme(getStoredTheme() || "system");
});
})();
+82
View File
@@ -0,0 +1,82 @@
{
"ogLocale": "cs_CZ",
"nav.home": "Domů",
"nav.wiki": "Wiki",
"nav.privacy": "Ochrana soukromí",
"nav.about": "O projektu",
"nav.themeToggle": "Přepnout motiv",
"footer.copyright": "Doxa Notes &copy; 2026 | Local-First & Svoboda 🦅",
"index.pageTitle": "DOXA Notes — Local-First poznámky a minimalistický Markdown editor",
"index.pageDescription": "DOXA Notes je minimalistická, local‑first poznámková aplikace s podporou Markdownu a otevřeným formátem JSON. Absolutní soukromí pro vaše myšlenky.",
"index.ogTitle": "DOXA Notes — Local-First poznámky a minimalistický Markdown editor",
"index.ogDescription": "DOXA Notes je minimalistická, local‑first poznámková aplikace založená na otevřeném JSON formátu. Data zůstávají plně pod vaší kontrolou.",
"index.twitterTitle": "DOXA Notes — Local-First poznámky a minimalistický Markdown editor",
"index.twitterDescription": "DOXA Notes je minimalistická, local‑first poznámková aplikace založená na otevřeném JSON formátu.",
"index.mainTitle": "DOXA Notes",
"index.subtitle": "Local-First Notes & Sovereignty",
"index.intro": "DOXA Notes: Markdown editor, nezávislé, bezpečné a minimalistické prostředí pro uchovávání lidských myšlenek, poznámek a životních reflexí. V souladu se základními principy osobní svobody a soběstačnosti aplikace vědomě odmítá cloudové databáze, servery třetích stran a centralizovaná API. Doxa věří, že lidská mysl nepotřebuje být sledována algoritmy, aby mohla růst.",
"index.philosophy": "„Základní myšlenka zůstává nekompromisní: Radikální Local-First přístup, čistá data v JSON formátu a absolutní digitální soukromí bez korporátního cloudu a API.“",
"index.appButton": "Vstoupit do DOXA Notes &rarr;",
"about.pageTitle": "O projektu — DOXA Notes",
"about.pageDescription": "Přečtěte si manifest a filozofické i technické cíle projektu DOXA Notes. Technická suverenita, local-first přístup a bezpečné ukládání myšlenek.",
"about.ogTitle": "O projektu — DOXA Notes",
"about.ogDescription": "Manifest a filozofické cíle projektu DOXA Notes. Technická suverenita, local-first přístup a bezpečné ukládání myšlenek.",
"about.twitterTitle": "O projektu — DOXA Notes",
"about.twitterDescription": "Manifest a filozofické cíle projektu DOXA Notes.",
"about.mainTitle": "O projektu — Doxa",
"about.architecture.title": "Architektura",
"about.architecture.item1": "Frontend: čisté HTML/CSS/JS (bez frameworků).",
"about.architecture.item2": "Datový formát: otevřený JSON — trvanlivý a přenosný.",
"about.architecture.item3": "Local-first: data jsou lokální (localStorage nebo soubor).",
"about.architecture.item4": "Desktop aplikace pro Linux je zabalena do instalátorů AppImage.",
"about.recent.title": "Co bylo přidáno naposledy",
"about.recent.item1": "Podpora více poznámek v jednom JSON (název + obsah).",
"about.recent.item2": "Přidání, editace (inline + modal), mazání poznámek.",
"about.recent.item3": "Přesouvání pořadí (šípky + drag & drop).",
"about.recent.item4": "Import / Export JSON a fallback mezi localStorage a lokálním souborem (Electron).",
"about.recent.item5": "Přidána Markdown podpora",
"about.recent.item6": "Desktop aplikace pro Linux",
"about.recent.item7": "Přidání tagů do poznámek",
"about.plans.title": "Další plány",
"about.plans.item1": "Rozšíření UI (hledání, historie/undo).",
"about.repo.text": "Projekt najdeš v repozitáři <a id=\"links\" href=\"https://codeberg.org/kankys/doxa\" target=\"_blank\">Codeberg</a>. Pokud chceš přispět,\n otevři issue nebo PR.",
"about.author.text": "Web autora, další projekty a podpora: <a id=\"links\" href=\"https://lukaskanka.cz/\" target=\"_blank\">Lukáš Kaňka</a>",
"about.license.text": "Aplikace je open-source a licencována pod MIT licencí.",
"privacy.pageTitle": "Ochrana soukromí — DOXA Notes",
"privacy.pageDescription": "Zásady ochrany osobních údajů a soukromí v aplikaci DOXA Notes. Žádná data neodcházejí na servery třetích stran, vše zůstává u vás.",
"privacy.ogTitle": "Ochrana soukromí — DOXA Notes",
"privacy.ogDescription": "Zásady ochrany osobních údajů a soukromí v aplikaci DOXA Notes. Žádná data neodcházejí na servery třetích stran.",
"privacy.twitterTitle": "Ochrana soukromí — DOXA Notes",
"privacy.twitterDescription": "Zásady ochrany osobních údajů a soukromí v aplikaci DOXA Notes.",
"privacy.mainTitle": "Ochrana soukromí",
"privacy.intro": "Doxa je navržena jako <strong>local‑first</strong> aplikace\n — soukromí je primární designový princip. Níže shrnutí, jak\n zacházím s daty v aktuálním stavu projektu.",
"privacy.stores.title": "Co aplikace ukládá",
"privacy.stores.item1": "Poznámky: <code>id</code>, <code>name</code>,\n <code>content</code>, <code>created_at</code>,\n <code>modified_at</code> (pokud existuje).",
"privacy.stores.item2": "Žádné automatické telemetry ani sledování není\n implementováno.",
"privacy.where.title": "Kde jsou data uložena",
"privacy.where.item1": "V prohlížeči: <strong>localStorage</strong> (klíč\n <code>doxa_notes_v1</code>).",
"privacy.where.item2": "V Electron/Node režimu: soubor na disku (např.\n <code>assets/js/data/doxa.json</code>).",
"privacy.where.item3": "Export/import: uživatel může stáhnout JSON a nahrát ho na\n jiném zařízení — je to manuální proces.",
"privacy.notSent.title": "Co aplikace NEODESÍLÁ",
"privacy.notSent.item1": "Výchozí instalace neposílá poznámky na žádný vzdálený\n server.",
"privacy.notSent.item2": "Bez implementace serverové synchronizace nejsou data\n odesílána ani zálohována vůči třetím stranám.",
"privacy.responsibility.title": "Odpovědnost uživatele",
"privacy.responsibility.body": "Protože data jsou lokální, odpovědnost za zálohy a bezpečnou\n konfiguraci serveru (pokud použita) nese vlastník instalace.\n Doporučuji pravidelné exporty a bezpečné úložiště záloh.",
"manifest.title": "Manifest digitální suverenity a minimalistického myšlení",
"manifest.projectIntent.title": "Záměr projektu:",
"manifest.projectIntent.body": "Vytvořit absolutně nezávislé, bezpečné a minimalistické prostředí pro uchovávání lidských myšlenek, poznámek a životních reflexí. V souladu se základními principy osobní svobody a soběstačnosti aplikace vědomě odmítá cloudové databáze, servery třetích stran a centralizovaná API. Doxa věří, že lidská mysl nepotřebuje být sledována algoritmy, aby mohla růst.",
"manifest.localFirst.title": "1. Radikální Local-First Filozofie",
"manifest.localFirst.subtitle": "Aplikace funguje na principu absolutní decentralizace. Běží na tvém zařízení a tam také umírá i žije.",
"manifest.localFirst.noBackend": "Žádný backend, žádné API: Doxa vědomě neobsahuje žádný kód pro odesílání dat na vzdálené servery. Tím je eliminováno riziko úniku dat, výpadku serveru nebo změny obchodních podmínek poskytovatele.",
"manifest.localFirst.privacy": "Absolutní soukromí: Data jsou uložena výhradně v tvém prohlížeči (localStorage) nebo lokálním souboru. Co napíšeš, to zůstává tvým výhradním vlastnictvím.",
"manifest.jsonFormat.title": "2. Formát JSON: Trvanlivost napříč dekádami",
"manifest.jsonFormat.subtitle": "Data jsou strukturována do otevřeného, čistého a lidsky čitelného formátu JSON. Žádné proprietární databáze.",
"manifest.jsonFormat.ownership": "Tvá data ti patří. Díky možnosti manuálního exportu si můžeš svůj myšlenkový fond odnést kamkoli – uložit si ho na svůj bezpečný lokální disk, nahrát na vlastní Git (GitHub/Gitea), nebo jej synchronizovat skrze cloudovou službu, kterou ty sám uznáš za bezpečnou.",
"manifest.jsonFormat.longevity": "Čistota formátu zaručuje, že tvé poznámky budou čitelné i za dvacet let na jakémkoli zařízení, bez ohledu na to, zda Doxa bude stále existovat.",
"manifest.vanillaStack.title": "3. Technická čistota a minimalismus (Vanilla Stack)",
"manifest.vanillaStack.subtitle": "Pro zachování maximální rychlosti, nezávislosti a nulových externích závislostí je aplikace postavena výhradně na čistých webových standardech:",
"manifest.vanillaStack.frontend": "Frontend (HTML5/CSS3): Minimalistické rozhraní, které nezatěžuje mysl barevným chaosem a vizuálním balastem moderního internetu.",
"manifest.vanillaStack.logic": "Logika (Vanilla JavaScript ES6+): Žádné těžkopádné frameworky (React/Vue), které podléhají módním trendům a neustálým změnám.",
"manifest.quote": "„Nezáleží na tom, jak složité jsou okolnosti kolem tebe. Když stavíš vlastní chrám myšlenek, začínáš od prvního kamene. Tento kód a tvá data jsou tvým vlastním, nedobytným hradem.“",
"manifest.quote.author": "— Stoický odkaz pro svobodné myslitele"
}
+82
View File
@@ -0,0 +1,82 @@
{
"ogLocale": "en_US",
"nav.home": "Home",
"nav.wiki": "Wiki",
"nav.privacy": "Privacy",
"nav.about": "About",
"nav.themeToggle": "Toggle theme",
"footer.copyright": "Doxa Notes &copy; 2026 | Local-First & Freedom 🦅",
"index.pageTitle": "DOXA Notes — Local-First Notes & Minimalist Markdown Editor",
"index.pageDescription": "DOXA Notes is a minimalist, local-first note-taking app with Markdown support and an open JSON format. Absolute privacy for your thoughts.",
"index.ogTitle": "DOXA Notes — Local-First Notes & Minimalist Markdown Editor",
"index.ogDescription": "DOXA Notes is a minimalist, local-first note-taking app based on an open JSON format. Your data remains fully under your control.",
"index.twitterTitle": "DOXA Notes — Local-First Notes & Minimalist Markdown Editor",
"index.twitterDescription": "DOXA Notes is a minimalist, local-first note-taking app based on an open JSON format.",
"index.mainTitle": "DOXA Notes",
"index.subtitle": "Local-First Notes & Sovereignty",
"index.intro": "DOXA Notes: A Markdown editor, an independent, secure, and minimalist environment for storing human thoughts, notes, and life reflections. In line with the fundamental principles of personal freedom and self-sufficiency, the application consciously rejects cloud databases, third-party servers, and centralized APIs. Doxa believes that the human mind does not need to be monitored by algorithms to grow.",
"index.philosophy": "\"The core idea remains uncompromising: A radical Local-First approach, clean data in JSON format, and absolute digital privacy without corporate clouds and APIs.\"",
"index.appButton": "Enter DOXA Notes &rarr;",
"about.pageTitle": "About — DOXA Notes",
"about.pageDescription": "Read the manifesto and the philosophical and technical goals of the DOXA Notes project. Technical sovereignty, local-first approach, and secure storage of thoughts.",
"about.ogTitle": "About — DOXA Notes",
"about.ogDescription": "The manifesto and philosophical goals of the DOXA Notes project. Technical sovereignty, local-first approach, and secure storage of thoughts.",
"about.twitterTitle": "About — DOXA Notes",
"about.twitterDescription": "The manifesto and philosophical goals of the DOXA Notes project.",
"about.mainTitle": "About — Doxa",
"about.architecture.title": "Architecture",
"about.architecture.item1": "Frontend: pure HTML/CSS/JS (no frameworks).",
"about.architecture.item2": "Data format: open JSON — durable and portable.",
"about.architecture.item3": "Local-first: data is local (localStorage or file).",
"about.architecture.item4": "The desktop application for Linux is packaged in AppImage installers.",
"about.recent.title": "What was added recently",
"about.recent.item1": "Support for multiple notes in one JSON (title + content).",
"about.recent.item2": "Adding, editing (inline + modal), and deleting notes.",
"about.recent.item3": "Reordering (arrows + drag & drop).",
"about.recent.item4": "Import / Export JSON and fallback between localStorage and local file (Electron).",
"about.recent.item5": "Markdown support added",
"about.recent.item6": "Desktop application for Linux",
"about.recent.item7": "Added tags to notes",
"about.plans.title": "Future plans",
"about.plans.item1": "UI enhancements (search, history/undo).",
"about.repo.text": "You can find the project in the <a id=\"links\" href=\"https://codeberg.org/kankys/doxa\" target=\"_blank\">Codeberg</a> repository. If you want to contribute,\n open an issue or PR.",
"about.author.text": "Author's website, other projects, and support: <a id=\"links\" href=\"https://lukaskanka.cz/\" target=\"_blank\">Lukáš Kaňka</a>",
"about.license.text": "The application is open-source and licensed under the MIT license.",
"privacy.pageTitle": "Privacy Policy — DOXA Notes",
"privacy.pageDescription": "Privacy policy for the DOXA Notes application. No data is sent to third-party servers; everything stays with you.",
"privacy.ogTitle": "Privacy Policy — DOXA Notes",
"privacy.ogDescription": "Privacy policy for the DOXA Notes application. No data is sent to third-party servers.",
"privacy.twitterTitle": "Privacy Policy — DOXA Notes",
"privacy.twitterDescription": "Privacy policy for the DOXA Notes application.",
"privacy.mainTitle": "Privacy Policy",
"privacy.intro": "Doxa is designed as a <strong>local-first</strong> application\n — privacy is a primary design principle. Below is a summary of how\n I handle data in the current state of the project.",
"privacy.stores.title": "What the application stores",
"privacy.stores.item1": "Notes: <code>id</code>, <code>name</code>,\n <code>content</code>, <code>created_at</code>,\n <code>modified_at</code> (if it exists).",
"privacy.stores.item2": "No automatic telemetry or tracking is\n implemented.",
"privacy.where.title": "Where the data is stored",
"privacy.where.item1": "In the browser: <strong>localStorage</strong> (key\n <code>doxa_notes_v1</code>).",
"privacy.where.item2": "In Electron/Node mode: a file on the disk (e.g.,\n <code>assets/js/data/doxa.json</code>).",
"privacy.where.item3": "Export/import: the user can download a JSON file and upload it on\n another device — this is a manual process.",
"privacy.notSent.title": "What the application DOES NOT SEND",
"privacy.notSent.item1": "The default installation does not send notes to any remote\n server.",
"privacy.notSent.item2": "Without server-side synchronization, data is not\n sent to or backed up by third parties.",
"privacy.responsibility.title": "User's responsibility",
"privacy.responsibility.body": "Because the data is local, the responsibility for backups and secure\n server configuration (if used) lies with the owner of the installation.\n I recommend regular exports and secure storage of backups.",
"manifest.title": "Manifesto of Digital Sovereignty and Minimalist Thinking",
"manifest.projectIntent.title": "Project Intent:",
"manifest.projectIntent.body": "To create a completely independent, secure, and minimalist environment for storing human thoughts, notes, and life reflections. In line with the fundamental principles of personal freedom and self-sufficiency, the application consciously rejects cloud databases, third-party servers, and centralized APIs. DOXA believes that the human mind does not need to be monitored by algorithms to grow.",
"manifest.localFirst.title": "1. Radical Local-First Philosophy",
"manifest.localFirst.subtitle": "The application operates on the principle of absolute decentralization. It lives and dies on your device.",
"manifest.localFirst.noBackend": "No backend, no API: DOXA intentionally contains no code for sending data to remote servers. This eliminates the risk of data leaks, server outages, or changes in the provider's terms of service.",
"manifest.localFirst.privacy": "Absolute Privacy: Data is stored exclusively in your browser (localStorage) or a local file. What you write remains your exclusive property.",
"manifest.jsonFormat.title": "2. JSON Format: Durability Across Decades",
"manifest.jsonFormat.subtitle": "Data is structured in an open, clean, and human-readable JSON format. No proprietary databases.",
"manifest.jsonFormat.ownership": "Your data belongs to you. Thanks to the manual export option, you can take your repository of thoughts anywhere – save it to your secure local drive, upload it to your own Git (GitHub/Gitea), or synchronize it through a cloud service that you yourself deem secure.",
"manifest.jsonFormat.longevity": "The purity of the format ensures that your notes will be readable even in twenty years on any device, regardless of whether DOXA still exists.",
"manifest.vanillaStack.title": "3. Technical Purity and Minimalism (Vanilla Stack)",
"manifest.vanillaStack.subtitle": "To maintain maximum speed, independence, and zero external dependencies, the application is built exclusively on clean web standards:",
"manifest.vanillaStack.frontend": "Frontend (HTML5/CSS3): A minimalist interface that does not burden the mind with the colorful chaos and visual clutter of the modern internet.",
"manifest.vanillaStack.logic": "Logic (Vanilla JavaScript ES6+): No cumbersome frameworks (React/Vue) that are subject to fashion trends and constant changes.",
"manifest.quote": "\"It does not matter how complex the circumstances around you are. When you build your own temple of thoughts, you start with the first stone. This code and your data are your own, impregnable castle.\"",
"manifest.quote.author": "— A Stoic message for free thinkers"
}
+500
View File
@@ -0,0 +1,500 @@
/* --- STOICKÝ DESIGN PRO DOXA NOTES --- */
:root {
/* Světlý motiv - Inspirovaný antickým mramorem a pergamenem */
--bg: #f5f4f0;
--text: #2c2e30;
--muted: #73797e;
--button-bg: #e5e2da;
--button-text: #2c2e30;
--note-bg: #ffffff;
--note-border: #dcd8cd;
--note-hover: #edeae2;
--accent: #b3893e; /* Tlumená bronzová */
--accent-hover: #967131;
--modal-bg: #ffffff;
--modal-overlay: rgba(44, 46, 48, 0.4);
--active-bg: #fdfbf7;
--active-border: #b3893e;
}
/* Tmavý motiv - Hluboká noc a bronz (Výchozí pro landing page) */
body.dark {
--bg: #1a1c1e;
--text: #e2e4e9;
--muted: #9ba1a6;
--button-bg: #2d3135;
--button-text: #e2e4e9;
--note-bg: #222529;
--note-border: #2e3238;
--note-hover: #2b2e33;
--accent: #c5a059; /* Jasnější stoická bronzová */
--accent-hover: #dfba73;
--modal-bg: #222529;
--modal-overlay: rgba(0, 0, 0, 0.6);
--active-bg: rgba(197, 160, 89, 0.05);
--active-border: #c5a059;
}
/* Základní nastavení */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, monospace, sans-serif;
background: var(--bg);
color: var(--text);
padding: 40px 20px;
line-height: 1.6;
transition: background 250ms ease, color 250ms ease;
}
.container {
max-width: 900px;
margin: 0 auto;
}
/* Navigace */
.top-nav {
display: flex;
gap: 10px;
margin-bottom: 30px;
align-items: center;
flex-wrap: wrap;
border-bottom: 1px solid var(--note-border);
padding-bottom: 15px;
}
.top-nav a,
.top-nav .theme-toggle {
background: var(--button-bg);
color: var(--button-text);
text-decoration: none;
padding: 8px 16px;
border-radius: 4px;
font-size: 14px;
font-weight: 500;
border: 1px solid transparent;
cursor: pointer;
transition: background 0.2s, border-color 0.2s;
}
.top-nav a:hover,
.top-nav .theme-toggle:hover {
background: var(--note-hover);
border-color: var(--accent);
}
.top-nav a.active {
background: var(--accent);
color: #111;
font-weight: bold;
}
/* Nadpisy */
h1 {
font-size: 2.2rem;
margin-bottom: 20px;
letter-spacing: 0.5px;
display: flex;
align-items: center;
gap: 10px;
}
h1::after {
content: " 🦅";
font-size: 1.5rem;
}
/* Formulářové prvky */
#noteTitle {
width: 100%;
padding: 12px 16px;
margin-bottom: 12px;
font-size: 1.1rem;
font-weight: 600;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
transition: border-color 0.2s;
}
#noteTitle:focus {
border-color: var(--accent);
}
textarea {
width: 100%;
height: 220px;
padding: 14px;
margin-bottom: 12px;
font-family: monospace;
font-size: 14px;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
resize: vertical;
line-height: 1.5;
}
textarea:focus {
border-color: var(--accent);
}
/* Tlačítka */
button {
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--note-border);
padding: 10px 18px;
border-radius: 4px;
cursor: pointer;
font-weight: 500;
transition: background 0.2s, border-color 0.2s;
}
button:hover {
background: var(--note-hover);
border-color: var(--accent);
}
/* Editor toolbar */
.editor-toolbar {
display: flex;
gap: 6px;
margin-bottom: 12px;
flex-wrap: wrap;
background: var(--note-bg);
padding: 6px;
border-radius: 4px;
border: 1px solid var(--note-border);
}
.editor-toolbar button {
background: transparent;
border: none;
color: var(--text);
padding: 6px 10px;
cursor: pointer;
border-radius: 3px;
font-size: 13px;
}
.editor-toolbar button:hover {
background: var(--note-hover);
color: var(--accent);
}
.editor-toolbar button.active {
background: var(--accent);
color: #111;
font-weight: bold;
}
/* Layout editoru a náhledu */
.editor-wrap {
display: flex;
gap: 16px;
align-items: flex-start;
}
.editor-wrap textarea {
flex: 1 1 55%;
min-height: 250px;
}
.preview {
flex: 1 1 45%;
border: 1px solid var(--note-border);
background: var(--note-bg);
padding: 16px;
border-radius: 4px;
/*overflow-auto;*/
min-height: 250px;
max-height: 400px;
font-size: 0.95rem;
}
.hidden {
display: none;
}
/* Akce pod editorem */
.editor-actions {
margin: 15px 0;
display: flex;
gap: 10px;
align-items: center;
flex-wrap: wrap;
}
#newNoteButton {
background: var(--accent);
color: #111;
font-weight: bold;
border: 1px solid transparent;
}
#newNoteButton:hover {
background: var(--accent-hover);
}
.save-status {
margin-left: auto;
font-size: 13px;
color: var(--accent);
font-weight: 500;
}
/* Seznam poznámek */
#notesContainer {
margin-top: 25px;
border-top: 1px solid var(--note-border);
padding-top: 20px;
display: flex;
flex-direction: column;
gap: 8px;
}
.note-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
border: 1px solid var(--note-border);
border-radius: 6px;
background: var(--note-bg);
transition: transform 0.15s, border-color 0.15s;
}
.note-item:hover {
background: var(--note-hover);
border-color: rgba(197, 160, 89, 0.4);
}
.note-item.active {
background: var(--active-bg);
border-color: var(--active-border);
box-shadow: 0 0 10px rgba(197, 160, 89, 0.05);
}
.note-left {
flex: 1 1 auto;
padding-right: 15px;
cursor: pointer;
overflow: hidden;
}
.note-title {
font-weight: 600;
font-size: 1.05rem;
margin-bottom: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-preview {
font-size: 13px;
color: var(--muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-controls {
display: flex;
gap: 4px;
align-items: center;
}
.note-controls button {
background: transparent;
border: none;
padding: 6px 10px;
color: var(--text);
opacity: 0.6;
transition: opacity 0.2s, color 0.2s;
}
.note-controls button:hover {
background: var(--button-bg);
opacity: 1;
}
.note-controls button.delete:hover {
color: #ff6b6b;
}
.no-notes {
color: var(--muted);
font-style: italic;
padding: 15px;
text-align: center;
}
.notes-hint {
margin-top: 10px;
color: var(--muted);
font-size: 12px;
text-align: center;
}
/* Drag & Drop styly */
.note-item.drag-over {
border-style: dashed;
border-color: var(--accent);
}
.note-item.drag-after {
box-shadow: inset 0 -3px 0 0 var(--accent);
}
.note-item.dragging {
opacity: 0.4;
}
/* Modální okno */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--modal-overlay);
backdrop-filter: blur(2px);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal {
background: var(--modal-bg);
padding: 24px;
border-radius: 8px;
width: 95%;
max-width: 800px;
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.4);
position: relative;
border: 1px solid var(--note-border);
}
.modal h2 {
margin-bottom: 15px;
font-size: 1.4rem;
}
.modal .modal-close {
position: absolute;
right: 16px;
top: 16px;
border: none;
background: transparent;
font-size: 18px;
color: var(--muted);
cursor: pointer;
}
.modal .modal-close:hover {
color: var(--text);
}
.modal-actions {
display: flex;
gap: 10px;
justify-content: flex-end;
margin-top: 10px;
}
#modalSaveBtn {
background: var(--accent);
color: #111;
font-weight: bold;
}
#modalSaveBtn:hover {
background: var(--accent-hover);
}
/* Styly pro renderovaný Markdown */
.preview h1, .preview h2, .preview h3 {
margin: 14px 0 8px 0;
color: var(--text);
}
.preview p {
margin-bottom: 10px;
}
.preview pre {
background: rgba(0, 0, 0, 0.15);
padding: 12px;
border-radius: 4px;
overflow: auto;
border: 1px solid var(--note-border);
margin: 10px 0;
}
body:not(.dark) .preview pre {
background: #f0ede6;
}
.preview code {
font-family: monospace;
background: rgba(197, 160, 89, 0.15);
padding: 2px 5px;
border-radius: 3px;
font-size: 0.9em;
}
.preview ul, .preview ol {
margin-left: 20px;
margin-bottom: 10px;
}
.preview blockquote {
border-left: 3px solid var(--accent);
padding-left: 12px;
font-style: italic;
color: var(--muted);
margin: 12px 0;
}
.preview table {
width: 100%;
border-collapse: collapse;
margin: 15px 0;
}
.preview th, .preview td {
border: 1px solid var(--note-border);
padding: 8px 12px;
text-align: left;
}
.preview th {
background: var(--button-bg);
}
/* Responzivita */
@media (max-width: 800px) {
body {
padding: 20px 10px;
}
.editor-wrap {
flex-direction: column;
}
.preview {
width: 100%;
min-height: 150px;
}
}
+387
View File
@@ -0,0 +1,387 @@
/* Theme variables */
:root {
--bg: #fafafa;
--text: #333333;
--muted: #666666;
--button-bg: #333333;
--button-text: #ffffff;
--note-bg: #ffffff;
--note-border: #dddddd;
--note-hover: #f5f5f5;
--accent: #0b63d6;
--modal-bg: #ffffff;
--modal-overlay: rgba(0, 0, 0, 0.45);
--active-bg: #e6f0ff;
--active-border: #a6c8ff;
}
/* Dark theme overrides */
body.dark {
--bg: #0b1220;
--text: #e6eef8;
--muted: #9aa6b2;
--button-bg: #1f2937;
--button-text: #ffffff;
--note-bg: #071022;
--note-border: #263046;
--note-hover: #092033;
--accent: #3b82f6;
--modal-bg: #0b1220;
--modal-overlay: rgba(0, 0, 0, 0.6);
--active-bg: rgba(59, 130, 246, 0.14);
--active-border: #60a5fa;
}
/* Base */
body {
font-family: monospace;
background: var(--bg);
padding: 40px;
color: var(--text);
transition:
background 200ms ease,
color 200ms ease;
}
.top-nav {
display: flex;
gap: 8px;
margin-bottom: 12px;
align-items: center;
flex-wrap: wrap;
}
.top-nav a,
.top-nav .theme-toggle {
background: var(--button-bg);
color: var(--button-text);
text-decoration: none;
padding: 8px 12px;
border-radius: 4px;
font-family: monospace;
font-size: 14px;
border: none;
cursor: pointer;
}
.top-nav a:hover,
.top-nav .theme-toggle:hover {
background: #555;
}
.top-nav a.active {
background: var(--accent);
}
h1::after {
content: " 🦅";
font-size: 1.5rem;
}
.container {
max-width: 600px;
margin: 0 auto;
}
#noteTitle {
width: 100%;
padding: 10px;
margin-bottom: 8px;
font-family: monospace;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
}
textarea {
width: 100%;
height: 150px;
padding: 10px;
margin-bottom: 10px;
font-family: monospace;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
}
button {
background: var(--button-bg);
color: var(--button-text);
border: none;
padding: 10px 20px;
cursor: pointer;
font-family: monospace;
}
button:hover {
background: #555;
}
#notesContainer {
margin-top: 10px;
border-top: 1px solid var(--note-border);
padding-top: 10px;
display: flex;
flex-direction: column;
gap: 6px;
}
.note-item {
padding: 8px;
border: 1px solid var(--note-border);
cursor: pointer;
background: var(--note-bg);
}
.note-item:hover {
background: var(--note-hover);
}
.note-item.active {
background: var(--active-bg);
border-color: var(--active-border);
}
.no-notes {
color: var(--muted);
font-style: italic;
padding: 6px;
}
/* Note list layout */
.note-item {
display: flex;
align-items: center;
justify-content: space-between;
}
.note-left {
flex: 1 1 auto;
padding-right: 10px;
cursor: pointer;
}
.note-title {
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-preview {
font-size: 12px;
color: var(--muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-controls {
display: flex;
gap: 6px;
align-items: center;
}
.note-controls button {
background: transparent;
border: none;
padding: 6px 8px;
cursor: pointer;
font-family: monospace;
border-radius: 4px;
color: var(--text);
}
.note-controls button:hover {
background: rgba(255, 255, 255, 0.03);
}
.note-item.drag-over {
border-style: dashed;
}
.note-item.drag-after {
box-shadow: inset 0 -3px 0 0 rgba(0, 123, 255, 0.25);
}
.note-item.dragging {
opacity: 0.5;
}
/* Modal */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--modal-overlay);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal-overlay.hidden {
display: none;
}
.modal {
background: var(--modal-bg);
padding: 16px;
border-radius: 8px;
width: 92%;
max-width: 720px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
position: relative;
}
.modal .modal-close {
position: absolute;
right: 8px;
top: 8px;
border: none;
background: transparent;
font-size: 16px;
cursor: pointer;
}
.modal input,
.modal textarea {
width: 100%;
padding: 8px;
margin-bottom: 8px;
font-family: monospace;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
}
.modal-actions {
display: flex;
gap: 8px;
justify-content: flex-end;
}
@media (min-width: 800px) {
.container {
max-width: 900px;
}
}
.notes-hint {
margin-top: 8px;
color: var(--muted);
font-size: 13px;
}
/* Editor toolbar & preview */
.editor-toolbar {
display: flex;
gap: 6px;
margin-bottom: 8px;
flex-wrap: wrap;
}
.editor-toolbar button {
background: transparent;
border: 1px solid var(--note-border);
color: var(--text);
padding: 6px 8px;
cursor: pointer;
border-radius: 4px;
font-family: monospace;
}
.editor-toolbar button:hover {
background: var(--note-hover);
}
/* active toolbar button */
.editor-toolbar button.active {
background: var(--accent);
color: var(--button-text);
}
.editor-wrap {
display: flex;
gap: 12px;
align-items: flex-start;
}
.editor-wrap textarea {
flex: 1 1 60%;
min-height: 160px;
}
.preview {
flex: 1 1 40%;
border: 1px solid var(--note-border);
background: var(--note-bg);
padding: 10px;
border-radius: 4px;
overflow: auto;
max-height: 320px;
}
.hidden {
display: none;
}
.editor-actions {
margin-top: 8px;
display: flex;
gap: 8px;
align-items: center;
}
.save-status {
margin-left: 8px;
font-size: 13px;
color: var(--muted);
min-width: 80px;
}
/* Rendered markdown styles */
.preview h1,
.preview h2,
.preview h3 {
margin: 6px 0;
}
.preview pre {
background: rgba(0, 0, 0, 0.04);
padding: 8px;
overflow: auto;
}
.preview code {
background: rgba(0, 0, 0, 0.06);
padding: 2px 4px;
border-radius: 4px;
}
@media (max-width: 800px) {
.editor-wrap {
flex-direction: column;
}
.preview {
max-height: 240px;
}
}
footer {
margin-top: 16px;
text-align: center;
font-size: 13px;
color: var(--muted);
}
+604
View File
@@ -0,0 +1,604 @@
/* --- STOICKÝ DESIGN PRO DOXA NOTES --- */
:root {
/* Světlý motiv - Inspirovaný antickým mramorem a pergamenem */
--bg: #f5f4f0;
--text: #2c2e30;
--muted: #73797e;
--button-bg: #e5e2da;
--button-text: #2c2e30;
--note-bg: #ffffff;
--note-border: #dcd8cd;
--note-hover: #edeae2;
--accent: #b3893e; /* Tlumená bronzová */
--accent-hover: #967131;
--modal-bg: #ffffff;
--modal-overlay: rgba(44, 46, 48, 0.4);
--active-bg: #fdfbf7;
--active-border: #b3893e;
/* --card-bg: #222529;*/
}
/* Tmavý motiv - Hluboká noc a bronz (Výchozí pro landing page) */
body.dark {
--bg: #1a1c1e;
--text: #e2e4e9;
--muted: #9ba1a6;
--button-bg: #2d3135;
--button-text: #e2e4e9;
--note-bg: #222529;
--note-border: #2e3238;
--note-hover: #2b2e33;
--accent: #c5a059; /* Jasnější stoická bronzová */
--accent-hover: #dfba73;
--modal-bg: #222529;
--modal-overlay: rgba(0, 0, 0, 0.6);
--active-bg: rgba(197, 160, 89, 0.05);
--active-border: #c5a059;
}
/* Základní nastavení */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, monospace, sans-serif;
background: var(--bg);
color: var(--text);
padding: 40px 20px;
line-height: 1.6;
transition: background 250ms ease, color 250ms ease;
}
.container {
max-width: 900px;
margin: 0 auto;
background-color: var(--card-bg);
padding: 40px;
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
text-align: center;
border: 1px solid rgba(197, 160, 89, 0.1);
}
/* Navigace */
.top-nav {
display: flex;
gap: 10px;
margin-bottom: 30px;
align-items: center;
flex-wrap: wrap;
border-bottom: 1px solid var(--note-border);
padding-bottom: 15px;
}
.top-nav a,
.top-nav .theme-toggle {
background: var(--button-bg);
color: var(--button-text);
text-decoration: none;
padding: 8px 16px;
border-radius: 4px;
font-size: 14px;
font-weight: 500;
border: 1px solid transparent;
cursor: pointer;
transition: background 0.2s, border-color 0.2s;
}
.top-nav a:hover,
.top-nav .theme-toggle:hover {
background: var(--note-hover);
border-color: var(--accent);
}
.top-nav a.active {
background: var(--accent);
color: #111;
font-weight: bold;
align-items: center;
}
/* Nadpisy */
h1 {
font-size: 2.2rem;
/*margin-bottom: 20px;*/
letter-spacing: 0.5px;
/*display: flex;*/
align-items: center;
gap: 10px;
text-align: center;
}
h1::after {
content: " 🦅";
font-size: 1.5rem;
}
/* Formulářové prvky */
#noteTitle {
width: 100%;
padding: 12px 16px;
margin-bottom: 12px;
font-size: 0.9rem;
font-weight: 600;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
transition: border-color 0.2s;
}
#noteTitle:focus {
border-color: var(--accent);
}
#noteTags {
width: 100%;
padding: 12px 16px;
margin-bottom: 12px;
font-size: 0.9rem;
font-weight: 600;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
transition: border-color 0.2s;
}
#noteTags:focus {
border-color: var(--accent);
}
textarea {
width: 100%;
height: 220px;
padding: 14px;
margin-bottom: 12px;
font-family: monospace;
font-size: 14px;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
resize: vertical;
line-height: 1.5;
}
textarea:focus {
border-color: var(--accent);
}
/* Tlačítka */
button {
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--note-border);
padding: 10px 18px;
border-radius: 4px;
cursor: pointer;
font-weight: 500;
transition: background 0.2s, border-color 0.2s;
}
button:hover {
background: var(--note-hover);
border-color: var(--accent);
}
/* Editor toolbar */
.editor-toolbar {
display: flex;
gap: 6px;
margin-bottom: 12px;
flex-wrap: wrap;
background: var(--note-bg);
padding: 6px;
border-radius: 4px;
border: 1px solid var(--note-border);
}
.editor-toolbar button {
background: transparent;
border: none;
color: var(--text);
padding: 6px 10px;
cursor: pointer;
border-radius: 3px;
font-size: 13px;
}
.editor-toolbar button:hover {
background: var(--note-hover);
color: var(--accent);
}
.editor-toolbar button.active {
background: var(--accent);
color: #111;
font-weight: bold;
}
/* Layout editoru a náhledu */
.editor-wrap {
display: flex;
gap: 16px;
align-items: flex-start;
}
.editor-wrap textarea {
flex: 1 1 55%;
min-height: 250px;
}
.preview {
flex: 1 1 45%;
border: 1px solid var(--note-border);
background: var(--note-bg);
padding: 16px;
border-radius: 4px;
overflow: auto;
min-height: 250px;
max-height: 400px;
font-size: 0.95rem;
}
.hidden {
display: none;
}
/* Akce pod editorem */
.editor-actions {
margin: 15px 0;
display: flex;
gap: 10px;
align-items: center;
flex-wrap: wrap;
}
#newNoteButton {
background: var(--accent);
color: #111;
font-weight: bold;
border: 1px solid transparent;
}
#newNoteButton:hover {
background: var(--accent-hover);
}
.save-status {
margin-left: auto;
font-size: 13px;
color: var(--accent);
font-weight: 500;
}
#searchTagInput {
width: 100%;
padding: 12px 16px;
margin-bottom: 12px;
font-size: 0.9rem;
font-weight: 600;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
transition: border-color 0.2s;
}
#searchTagInput:focus {
border-color: var(--accent);
}
/* Seznam poznámek */
#notesContainer {
margin-top: 25px;
border-top: 1px solid var(--note-border);
padding-top: 20px;
display: flex;
flex-direction: column;
gap: 8px;
}
.note-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
border: 1px solid var(--note-border);
border-radius: 6px;
background: var(--note-bg);
transition: transform 0.15s, border-color 0.15s;
}
.note-item:hover {
background: var(--note-hover);
border-color: rgba(197, 160, 89, 0.4);
}
.note-item.active {
background: var(--active-bg);
border-color: var(--active-border);
box-shadow: 0 0 10px rgba(197, 160, 89, 0.05);
}
.note-left {
flex: 1 1 auto;
padding-right: 15px;
cursor: pointer;
overflow: hidden;
}
.note-title {
font-weight: 600;
font-size: 1.05rem;
margin-bottom: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-preview {
font-size: 13px;
color: var(--muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-controls {
display: flex;
gap: 4px;
align-items: center;
}
.note-controls button {
background: transparent;
border: none;
padding: 6px 10px;
color: var(--text);
opacity: 0.6;
transition: opacity 0.2s, color 0.2s;
}
.note-controls button:hover {
background: var(--button-bg);
opacity: 1;
}
.note-controls button.delete:hover {
color: #ff6b6b;
}
.no-notes {
color: var(--muted);
font-style: italic;
padding: 15px;
text-align: center;
}
.notes-hint {
margin-top: 10px;
color: var(--muted);
font-size: 12px;
text-align: center;
}
/* Drag & Drop styly */
.note-item.drag-over {
border-style: dashed;
border-color: var(--accent);
}
.note-item.drag-after {
box-shadow: inset 0 -3px 0 0 var(--accent);
}
.note-item.dragging {
opacity: 0.4;
}
/* Modální okno */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--modal-overlay);
backdrop-filter: blur(2px);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal {
background: var(--modal-bg);
padding: 24px;
border-radius: 8px;
width: 95%;
max-width: 800px;
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.4);
position: relative;
border: 1px solid var(--note-border);
}
.modal h2 {
margin-bottom: 15px;
font-size: 1.4rem;
}
.modal .modal-close {
position: absolute;
right: 16px;
top: 16px;
border: none;
background: transparent;
font-size: 18px;
color: var(--muted);
cursor: pointer;
}
.modal .modal-close:hover {
color: var(--text);
}
.modal-actions {
display: flex;
gap: 10px;
justify-content: flex-end;
margin-top: 10px;
}
#modalSaveBtn {
background: var(--accent);
color: #111;
font-weight: bold;
}
#modalSaveBtn:hover {
background: var(--accent-hover);
}
/* Styly pro renderovaný Markdown */
.preview h1, .preview h2, .preview h3 {
margin: 14px 0 8px 0;
color: var(--text);
}
.preview p {
margin-bottom: 10px;
}
.preview pre {
background: rgba(0, 0, 0, 0.15);
padding: 12px;
border-radius: 4px;
overflow: auto;
border: 1px solid var(--note-border);
margin: 10px 0;
}
body:not(.dark) .preview pre {
background: #f0ede6;
}
.preview code {
font-family: monospace;
background: rgba(197, 160, 89, 0.15);
padding: 2px 5px;
border-radius: 3px;
font-size: 0.9em;
}
.preview ul, .preview ol {
margin-left: 20px;
margin-bottom: 10px;
}
.preview blockquote {
border-left: 3px solid var(--accent);
padding-left: 12px;
font-style: italic;
color: var(--muted);
margin: 12px 0;
}
.preview table {
width: 100%;
border-collapse: collapse;
margin: 15px 0;
}
.preview th, .preview td {
border: 1px solid var(--note-border);
padding: 8px 12px;
text-align: left;
}
.preview th {
background: var(--button-bg);
}
/* Responzivita */
@media (max-width: 800px) {
body {
padding: 20px 10px;
}
.editor-wrap {
flex-direction: column;
}
.preview {
width: 100%;
min-height: 150px;
}
}
#links {
color: var(--accent);
}
#lineHR {
border: none;
border-top: 1px solid var(--accent);
}
footer {
margin-top: 26px;
text-align: center;
font-size: 13px;
color: var(--muted);
}
/* Homepage card*/
.new-name {
color: var(--accent-bronze);
font-weight: 700;
}
.philosophy {
font-style: italic;
border-left: 2px solid var(--accent-bronze);
padding-left: 15px;
text-align: left;
margin: 30px 0;
font-size: 0.95rem;
}
.btnHomePage {
display: inline-block;
background-color: var(--accent-bronze);
color: #e0961f;
text-decoration: none;
padding: 14px 28px;
border-radius: 4px;
font-weight: bold;
font-size: 1.1rem;
transition: background-color 0.2s ease, transform 0.1s ease;
box-shadow: 0 8px 16px rgba(197, 160, 89, 0.2);
}
.btnHomePage:hover {
background-color: var(--accent-hover);
transform: translateY(-1px);
}
.btnHomePage:active {
transform: translateY(1px);
}
ul {
list-style-type: none;
padding-left: 0;
}
+86
View File
@@ -0,0 +1,86 @@
<!doctype html>
<html lang="cs">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title data-i18n-key="index.pageTitle">DOXA Notes — Local-First poznámky a minimalistický Markdown editor</title>
<meta name="description" data-i18n-key="index.pageDescription" data-i18n-attr="content"
content="DOXA Notes je minimalistická, local‑first poznámková aplikace s podporou Markdownu a otevřeným formátem JSON. Absolutní soukromí pro vaše myšlenky." />
<link rel="canonical" href="https://doxa-notes.org/index.html" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://doxa-notes.org/" />
<meta property="og:title" data-i18n-key="index.ogTitle" data-i18n-attr="content" content="DOXA Notes — Local-First poznámky a minimalistický Markdown editor" />
<meta property="og:description" data-i18n-key="index.ogDescription" data-i18n-attr="content"
content="DOXA Notes je minimalistická, local‑first poznámková aplikace založená na otevřeném JSON formátu. Data zůstávají plně pod vaší kontrolou." />
<meta property="og:image" content="https://doxa-notes.org/assets/img/doxa.png" />
<meta property="og:image:alt" content="DOXA Notes - Local-First Notes & Sovereignty" />
<meta property="og:locale" data-i18n-key="ogLocale" data-i18n-attr="content" content="cs_CZ" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" data-i18n-key="index.twitterTitle" data-i18n-attr="content" content="DOXA Notes — Local-First poznámky a minimalistický Markdown editor" />
<meta name="twitter:description" data-i18n-key="index.twitterDescription" data-i18n-attr="content"
content="DOXA Notes je minimalistická, local‑first poznámková aplikace založená na otevřeném JSON formátu." />
<meta name="twitter:image" content="https://doxa-notes.org/assets/img/doxa.png" />
<meta name="twitter:image:alt" content="DOXA Notes - Local-First Notes & Sovereignty" />
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "DOXA Notes",
"operatingSystem": "Windows, Linux, Web",
"applicationCategory": "UtilitiesApplication",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "CZK"
},
"license": "https://opensource.org/licenses/MIT",
"description": "Minimalistická local-first poznámková aplikace běžící plně v prohlížeči, s daty v otevřeném formátu JSON a podporou Markdownu.",
"mainEntityOfPage": "https://doxa-notes.org/"
}
</script>
<link rel="stylesheet" href="assets/style/style.css" />
<link rel="shortcut icon" href="assets/img/logo.jpg" />
<script defer src="https://analytics.lukan.cz/script.js"
data-website-id="3bfbabf3-f3ef-4275-86f5-3dc3e4e2084b"></script>
</head>
<body>
<div class="container">
<nav class="top-nav">
<a href="index.html" data-i18n-key="nav.home">Domů</a>
<a href="https://wiki.doxa-notes.org/index.html" target="_blank" data-i18n-key="nav.wiki">Wiki</a>
<a href="privacy.html" data-i18n-key="nav.privacy">Ochrana soukromí</a>
<a href="about.html" data-i18n-key="nav.about">O projektu</a>
<button id="langToggle" class="theme-toggle" title="Přepnout jazyk / Switch language">
🇬🇧 / 🇨🇿
</button>
<button id="themeToggle" class="theme-toggle" data-i18n-key="nav.themeToggle" data-i18n-attr="aria-label" aria-label="Přepnout motiv">
🌙
</button>
</nav>
<h1 data-i18n-key="index.mainTitle">DOXA Notes</h1>
<p style="color: var(--muted); margin-bottom: 30px;margin-top: 2px; font-size: 0.95rem;" data-i18n-key="index.subtitle">Local-First Notes & Sovereignty</p>
<p data-i18n-key="index.intro">DOXA Notes: Markdown editor, nezávislé, bezpečné a minimalistické prostředí pro uchovávání lidských myšlenek, poznámek a životních reflexí. V souladu se základními principy osobní svobody a soběstačnosti aplikace vědomě odmítá cloudové databáze, servery třetích stran a centralizovaná API. Doxa věří, že lidská mysl nepotřebuje být sledována algoritmy, aby mohla růst.</p>
<div class="philosophy" data-i18n-key="index.philosophy">
„Základní myšlenka zůstává nekompromisní: Radikální Local-First přístup, čistá data v JSON formátu a absolutní digitální soukromí bez korporátního cloudu a API.“
</div>
<a href="https://app.doxa-notes.org" class="btnHomePage" target="_blank" data-i18n-key="index.appButton">Vstoupit do DOXA Notes &rarr;</a>
<p style="margin-bottom: 30px;margin-top: 35px; font-size: 0.95rem;"><a id="links" href="https://cli.doxa-notes.org" target="_blank">DOXA-CLI (Notes) - terminal version in GO language</a></p>
<p style="margin-bottom: 30px;margin-top: 35px; font-size: 0.95rem;"><a id="links" href="https://secret.doxa-notes.org" target="_blank">DOXA-SECRET - secure offline command-line tool for encrypting and decrypting messages</a></p>
</div>
<footer>
<p class="copyright" data-i18n-key="footer.copyright">Doxa Notes &copy; 2026 | Local-First & Freedom 🦅</p>
</footer>
<script src="assets/js/i18n.js"></script>
<script src="assets/js/script.js"></script>
</body>
</html>
+108
View File
@@ -0,0 +1,108 @@
<!doctype html>
<html lang="cs">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title data-i18n-key="privacy.pageTitle">Ochrana soukromí — DOXA Notes</title>
<meta name="description" data-i18n-key="privacy.pageDescription" data-i18n-attr="content"
content="Zásady ochrany osobních údajů a soukromí v aplikaci DOXA Notes. Žádná data neodcházejí na servery třetích stran, vše zůstává u vás." />
<link rel="canonical" href="https://doxa-notes.org/privacy.html" />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://doxa-notes.org/privacy.html" />
<meta property="og:title" data-i18n-key="privacy.ogTitle" data-i18n-attr="content" content="Ochrana soukromí — DOXA Notes" />
<meta property="og:description" data-i18n-key="privacy.ogDescription" data-i18n-attr="content" content="Zásady ochrany osobních údajů a soukromí v aplikaci DOXA Notes. Žádná data neodcházejí na servery třetích stran." />
<meta property="og:image" content="https://doxa-notes.org/assets/img/doxa.png" />
<meta property="og:image:alt" content="DOXA Notes - Local-First Notes & Sovereignty" />
<meta property="og:locale" data-i18n-key="ogLocale" data-i18n-attr="content" content="cs_CZ" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" data-i18n-key="privacy.twitterTitle" data-i18n-attr="content" content="Ochrana soukromí — DOXA Notes" />
<meta name="twitter:description" data-i18n-key="privacy.twitterDescription" data-i18n-attr="content" content="Zásady ochrany osobních údajů a soukromí v aplikaci DOXA Notes." />
<meta name="twitter:image" content="https://doxa-notes.org/assets/img/doxa.png" />
<meta name="twitter:image:alt" content="DOXA Notes - Local-First Notes & Sovereignty" />
<link rel="stylesheet" href="assets/style/style.css" />
<link rel="shortcut icon" href="assets/img/brain-solid-full.svg" />
</head>
<body>
<div class="container">
<nav class="top-nav">
<a href="index.html" data-i18n-key="nav.home">Domů</a>
<a href="https://wiki.doxa-notes.org/index.html" target="_blank" data-i18n-key="nav.wiki">Wiki</a>
<a href="privacy.html" data-i18n-key="nav.privacy">Ochrana soukromí</a>
<a href="about.html" data-i18n-key="nav.about">O projektu</a>
<button id="langToggle" class="theme-toggle" title="Přepnout jazyk / Switch language">
🇬🇧 / 🇨🇿
</button>
<button id="themeToggle" class="theme-toggle" data-i18n-key="nav.themeToggle" data-i18n-attr="aria-label" aria-label="Přepnout motiv">
🌙
</button>
</nav>
<h1 data-i18n-key="privacy.mainTitle">Ochrana soukromí</h1>
<p data-i18n-key="privacy.intro">
Doxa je navržena jako <strong>local‑first</strong> aplikace
— soukromí je primární designový princip. Níže shrnutí, jak
zacházím s daty v aktuálním stavu projektu.
</p>
<br>
<h2 data-i18n-key="privacy.stores.title">Co aplikace ukládá</h2>
<ul>
<li data-i18n-key="privacy.stores.item1">
Poznámky: <code>id</code>, <code>name</code>,
<code>content</code>, <code>created_at</code>,
<code>modified_at</code> (pokud existuje).
</li>
<li data-i18n-key="privacy.stores.item2">
Žádné automatické telemetry ani sledování není
implementováno.
</li>
</ul>
<br>
<h2 data-i18n-key="privacy.where.title">Kde jsou data uložena</h2>
<ul>
<li data-i18n-key="privacy.where.item1">
V prohlížeči: <strong>localStorage</strong> (klíč
<code>doxa_notes_v1</code>).
</li>
<li data-i18n-key="privacy.where.item2">
V Electron/Node režimu: soubor na disku (např.
<code>assets/js/data/doxa.json</code>).
</li>
<li data-i18n-key="privacy.where.item3">
Export/import: uživatel může stáhnout JSON a nahrát ho na
jiném zařízení — je to manuální proces.
</li>
</ul>
<br>
<h2 data-i18n-key="privacy.notSent.title">Co aplikace NEODESÍLÁ</h2>
<ul>
<li data-i18n-key="privacy.notSent.item1">
Výchozí instalace neposílá poznámky na žádný vzdálený
server.
</li>
<li data-i18n-key="privacy.notSent.item2">
Bez implementace serverové synchronizace nejsou data
odesílána ani zálohována vůči třetím stranám.
</li>
</ul>
<br>
<h2 data-i18n-key="privacy.responsibility.title">Odpovědnost uživatele</h2>
<p data-i18n-key="privacy.responsibility.body">
Protože data jsou lokální, odpovědnost za zálohy a bezpečnou
konfiguraci serveru (pokud použita) nese vlastník instalace.
Doporučuji pravidelné exporty a bezpečné úložiště záloh.
</p>
</div>
<footer>
<p class="copyright" data-i18n-key="footer.copyright">&copy; 2026 Doxa Notes | Local-First & Freedom 🦅</p>
</footer>
<script src="assets/js/i18n.js"></script>
<script src="assets/js/script.js"></script>
</body>
</html>
+13
View File
@@ -0,0 +1,13 @@
User-agent: *
Allow: /
Allow: /index.html
Allow: /about.html
Allow: /privacy.html
Allow: /wiki/
Disallow: /web_app/
Disallow: /desktop_app_dev/
Disallow: /test/
Disallow: /docs/
Sitemap: https://doxa-notes.org/sitemap.xml
+33
View File
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://doxa-notes.org/</loc>
<lastmod>2026-07-04</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://doxa-notes.org/index.html</loc>
<lastmod>2026-07-04</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://doxa-notes.org/about.html</loc>
<lastmod>2026-07-04</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://doxa-notes.org/privacy.html</loc>
<lastmod>2026-07-04</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://doxa-notes.org/navod.html</loc>
<lastmod>2026-07-04</lastmod>
<changefreq>weekly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path d="M184 120C184 89.1 209.1 64 240 64L264 64C281.7 64 296 78.3 296 96L296 544C296 561.7 281.7 576 264 576L232 576C202.2 576 177.1 555.6 170 528C169.3 528 168.7 528 168 528C123.8 528 88 492.2 88 448C88 430 94 413.4 104 400C84.6 385.4 72 362.2 72 336C72 305.1 89.6 278.2 115.2 264.9C108.1 252.9 104 238.9 104 224C104 179.8 139.8 144 184 144L184 120zM456 120L456 144C500.2 144 536 179.8 536 224C536 239 531.9 253 524.8 264.9C550.5 278.2 568 305 568 336C568 362.2 555.4 385.4 536 400C546 413.4 552 430 552 448C552 492.2 516.2 528 472 528C471.3 528 470.7 528 470 528C462.9 555.6 437.8 576 408 576L376 576C358.3 576 344 561.7 344 544L344 96C344 78.3 358.3 64 376 64L400 64C430.9 64 456 89.1 456 120z"/></svg>

After

Width:  |  Height:  |  Size: 920 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 658 KiB

Whitespace-only changes.
@@ -0,0 +1,3 @@
{
"notes": []
}
Whitespace-only changes.
+72
View File
@@ -0,0 +1,72 @@
// Tento skript by měl být v HTML vložen PŘED hlavním script.js
// Globální překladová funkce, kterou bude používat i script.js
let translations = {};
window.t = (key, params = {}) => {
let text = translations[key] || key;
for (const p in params) {
text = text.replace(`{${p}}`, params[p]);
}
return text;
};
/**
* Načte překlady pro daný jazyk a aplikuje je na DOM.
* @param {string} lang - Kód jazyka (např. 'en', 'cs').
*/
window.setLanguage = async function(lang) {
// 1. Uloží preferenci uživatele
localStorage.setItem('doxa_lang', lang);
// Nastaví atribut 'lang' na <html> elementu
document.documentElement.lang = lang;
// 2. Načte a uloží překlady
try {
const response = await fetch(`assets/locales/${lang}.json`);
if (!response.ok) {
console.error(`Chyba: Nepodařilo se načíst soubor s překlady: ${lang}.json`);
translations = {};
} else {
translations = await response.json();
}
} catch (error) {
console.error(`Chyba při načítání překladů pro jazyk ${lang}:`, error);
translations = {};
}
// 3. Přeloží všechny statické prvky v DOM
document.querySelectorAll('[data-i18n-key]').forEach(el => {
const key = el.getAttribute('data-i18n-key');
const translation = window.t(key);
// Přeloží specifický atribut (např. placeholder, title), pokud je definován
const attr = el.getAttribute('data-i18n-attr');
if (attr) {
el.setAttribute(attr, translation);
} else {
// Jinak přeloží obsah elementu
el.innerHTML = translation;
}
});
// 4. DŮLEŽITÉ: Znovu inicializuje části aplikace, které používají dynamický text
if (typeof window.updateDynamicUIText === 'function') {
window.updateDynamicUIText();
}
}
document.addEventListener('DOMContentLoaded', () => {
const userLang = localStorage.getItem('doxa_lang') || navigator.language.split('-')[0];
const langToLoad = ['en', 'cs'].includes(userLang) ? userLang : 'cs';
window.setLanguage(langToLoad);
const langToggleBtn = document.getElementById('langToggle');
if (langToggleBtn) {
langToggleBtn.addEventListener('click', () => {
const currentLang = localStorage.getItem('doxa_lang') || 'cs';
const nextLang = currentLang === 'cs' ? 'en' : 'cs';
window.setLanguage(nextLang);
});
}
});
File diff suppressed because it is too large. Load diff
+83
View File
@@ -0,0 +1,83 @@
{
"webTitle": "DOXA Notes — Workspace",
"ogLocale": "cs_CZ",
"navLink": "Web DOXA Notes, Návody, Manifest",
"themeToggleLabel": "Přepnout motiv",
"mainTitle": "DOXA Notes 🦅",
"mainSubtitle": "Local-First Notes & Sovereignty",
"noteTitlePlaceholder": "Název poznámky",
"noteTagsPlaceholder": "Tagy (oddělujte čárkou, např: práce, citaty)",
"noteFolderPlaceholder": "Složka (nepovinné)",
"toolbarH1": "Nadpis H1",
"toolbarH2": "Nadpis H2",
"toolbarH3": "Nadpis H3",
"toolbarBold": "Tučné (Ctrl+B)",
"toolbarItalic": "Kurzíva (Ctrl+I)",
"toolbarStrike": "Přeškrtnutí",
"toolbarUl": "Odrážkový seznam",
"toolbarOl": "Číslovaný seznam",
"toolbarTask": "Úkol (checkbox)",
"toolbarQuote": "Citace",
"toolbarHr": "Vodorovná čára",
"toolbarCode": "Inline kód",
"toolbarCodeblock": "Blok kódu",
"toolbarLink": "Vložit odkaz",
"toolbarImage": "Vložit obrázek",
"toolbarTable": "Vložit tabulku",
"toolbarPreview": "Náhled",
"noteInputPlaceholder": "Zapiš poznámku... Použij / pro rychlé vyhledávání příkazů",
"saveNowButton": "Uložit nyní",
"exportJsonButton": "Exportovat JSON",
"exportMarkdownButton": "Exportovat do Markdown",
"importJsonButton": "Importovat JSON",
"newNoteButton": "➕ Nová poznámka",
"filterAllFolders": "📁 Všechny složky",
"searchInputPlaceholder": "🔍 Vyhledat podle názvu, obsahu, tagu nebo složky...",
"dragHint": "Přetáhněte poznámky pro změnu pořadí nebo použijte šipky vedle položek.",
"slashDate": "📅 Vložit datum",
"slashTime": "🕚 Vložit čas",
"slashCode": "📝 Vložit kód",
"slashCodeblock": "📄 Vložit blok kódu",
"slashLink": "🔗 Vložit odkaz",
"slashImage": "🖼️ Vložit obrázek",
"slashTable": "📊 Vložit tabulku",
"slashQuote": "❝ Vložit citaci",
"slashHr": "🖋️ Vodorovná čára",
"slashTask": "☑️ Vložit úkol",
"slashList": "📋 Vložit seznam",
"slashH1": "Nadpis H1",
"slashH2": "Nadpis H2",
"slashH3": "Nadpis H3",
"notesSavedAlert": "Poznámky byly úspěšně uloženy.",
"saveErrorAlert": "Chyba při ukládání: {message}",
"confirmDeleteNote": "Opravdu chcete smazat poznámku \"{noteName}\"?",
"alertNoTitle": "Poznámka musí mít název!",
"noNotes": "Žádné poznámky k zobrazení.",
"noNotesForFilter": "Žádné poznámky neodpovídají vašemu hledání.",
"noteNameDefault": "Poznámka {index}",
"noteMoveUp": "Posunout nahoru",
"noteMoveDown": "Posunout dolů",
"noteEditModal": "Upravit v okně",
"noteDelete": "Smazat",
"promptNewNote": "Zadejte název nové poznámky:",
"importInvalidJson": "Neplatný formát JSON souboru.",
"importReadError": "Chyba při čtení souboru: {message}",
"exportEmptyAlert": "Nelze exportovat prázdnou poznámku!",
"previewUnavailable": "Náhled není k dispozici.",
"promptUrl": "Zadejte URL adresu:",
"promptImageUrl": "Zadejte URL adresu obrázku:",
"promptImageAlt": "Popis obrázku (alt):",
"promptTableCols": "Počet sloupců:",
"promptTableRows": "Počet řádků:",
"tableHeaderDefault": "Hlavička {index}",
"modalClose": "Zavřít",
"modalTitle": "Upravit poznámku",
"modalSave": "Uložit změny",
"modalCancel": "Zrušit",
"statusSaved": "Uloženo",
"themeCurrentDark": "tmavý",
"themeCurrentLight": "světlý",
"themeAriaSystem": "Motiv: systémový (aktuálně {current})",
"themeAriaDark": "Motiv: tmavý",
"themeAriaLight": "Motiv: světlý"
}
+83
View File
@@ -0,0 +1,83 @@
{
"webTitle": "DOXA Notes — Workspace",
"ogLocale": "en_US",
"navLink": "Web DOXA Notes, Guides, Manifesto",
"themeToggleLabel": "Toggle theme",
"mainTitle": "DOXA Notes 🦅",
"mainSubtitle": "Local-First Notes & Sovereignty",
"noteTitlePlaceholder": "Note title",
"noteTagsPlaceholder": "Tags (comma separated, e.g: work, quotes)",
"noteFolderPlaceholder": "Folder (optional)",
"toolbarH1": "Heading H1",
"toolbarH2": "Heading H2",
"toolbarH3": "Heading H3",
"toolbarBold": "Bold (Ctrl+B)",
"toolbarItalic": "Italic (Ctrl+I)",
"toolbarStrike": "Strikethrough",
"toolbarUl": "Unordered list",
"toolbarOl": "Ordered list",
"toolbarTask": "Task (checkbox)",
"toolbarQuote": "Quote",
"toolbarHr": "Horizontal line",
"toolbarCode": "Inline code",
"toolbarCodeblock": "Code block",
"toolbarLink": "Insert link",
"toolbarImage": "Insert image",
"toolbarTable": "Insert table",
"toolbarPreview": "Preview",
"noteInputPlaceholder": "Write a note... Use / for quick command search",
"saveNowButton": "Save now",
"exportJsonButton": "Export JSON",
"exportMarkdownButton": "Export to Markdown",
"importJsonButton": "Import JSON",
"newNoteButton": "➕ New note",
"filterAllFolders": "📁 All folders",
"searchInputPlaceholder": "🔍 Search by title, content, tag, or folder...",
"dragHint": "Drag and drop notes to reorder or use the arrows next to the items.",
"slashDate": "📅 Insert date",
"slashTime": "🕚 Insert time",
"slashCode": "📝 Insert code",
"slashCodeblock": "📄 Insert code block",
"slashLink": "🔗 Insert link",
"slashImage": "🖼️ Insert image",
"slashTable": "📊 Insert table",
"slashQuote": "❝ Insert quote",
"slashHr": "🖋️ Horizontal line",
"slashTask": "☑️ Insert task",
"slashList": "📋 Insert list",
"slashH1": "Heading H1",
"slashH2": "Heading H2",
"slashH3": "Heading H3",
"notesSavedAlert": "Notes successfully saved.",
"saveErrorAlert": "Error saving: {message}",
"confirmDeleteNote": "Are you sure you want to delete note \"{noteName}\"?",
"alertNoTitle": "Note must have a title!",
"noNotes": "No notes to display.",
"noNotesForFilter": "No notes match your search.",
"noteNameDefault": "Note {index}",
"noteMoveUp": "Move up",
"noteMoveDown": "Move down",
"noteEditModal": "Edit in window",
"noteDelete": "Delete",
"promptNewNote": "Enter name for the new note:",
"importInvalidJson": "Invalid JSON file format.",
"importReadError": "Error reading file: {message}",
"exportEmptyAlert": "Cannot export an empty note!",
"previewUnavailable": "Preview unavailable.",
"promptUrl": "Enter URL address:",
"promptImageUrl": "Enter image URL address:",
"promptImageAlt": "Image description (alt):",
"promptTableCols": "Number of columns:",
"promptTableRows": "Number of rows:",
"tableHeaderDefault": "Header {index}",
"modalClose": "Close",
"modalTitle": "Edit note",
"modalSave": "Save changes",
"modalCancel": "Cancel",
"statusSaved": "Saved",
"themeCurrentDark": "dark",
"themeCurrentLight": "light",
"themeAriaSystem": "Theme: system (currently {current})",
"themeAriaDark": "Theme: dark",
"themeAriaLight": "Theme: light"
}
+500
View File
@@ -0,0 +1,500 @@
/* --- STOICKÝ DESIGN PRO DOXA NOTES --- */
:root {
/* Světlý motiv - Inspirovaný antickým mramorem a pergamenem */
--bg: #f5f4f0;
--text: #2c2e30;
--muted: #73797e;
--button-bg: #e5e2da;
--button-text: #2c2e30;
--note-bg: #ffffff;
--note-border: #dcd8cd;
--note-hover: #edeae2;
--accent: #b3893e; /* Tlumená bronzová */
--accent-hover: #967131;
--modal-bg: #ffffff;
--modal-overlay: rgba(44, 46, 48, 0.4);
--active-bg: #fdfbf7;
--active-border: #b3893e;
}
/* Tmavý motiv - Hluboká noc a bronz (Výchozí pro landing page) */
body.dark {
--bg: #1a1c1e;
--text: #e2e4e9;
--muted: #9ba1a6;
--button-bg: #2d3135;
--button-text: #e2e4e9;
--note-bg: #222529;
--note-border: #2e3238;
--note-hover: #2b2e33;
--accent: #c5a059; /* Jasnější stoická bronzová */
--accent-hover: #dfba73;
--modal-bg: #222529;
--modal-overlay: rgba(0, 0, 0, 0.6);
--active-bg: rgba(197, 160, 89, 0.05);
--active-border: #c5a059;
}
/* Základní nastavení */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, monospace, sans-serif;
background: var(--bg);
color: var(--text);
padding: 40px 20px;
line-height: 1.6;
transition: background 250ms ease, color 250ms ease;
}
.container {
max-width: 900px;
margin: 0 auto;
}
/* Navigace */
.top-nav {
display: flex;
gap: 10px;
margin-bottom: 30px;
align-items: center;
flex-wrap: wrap;
border-bottom: 1px solid var(--note-border);
padding-bottom: 15px;
}
.top-nav a,
.top-nav .theme-toggle {
background: var(--button-bg);
color: var(--button-text);
text-decoration: none;
padding: 8px 16px;
border-radius: 4px;
font-size: 14px;
font-weight: 500;
border: 1px solid transparent;
cursor: pointer;
transition: background 0.2s, border-color 0.2s;
}
.top-nav a:hover,
.top-nav .theme-toggle:hover {
background: var(--note-hover);
border-color: var(--accent);
}
.top-nav a.active {
background: var(--accent);
color: #111;
font-weight: bold;
}
/* Nadpisy */
h1 {
font-size: 2.2rem;
margin-bottom: 20px;
letter-spacing: 0.5px;
display: flex;
align-items: center;
gap: 10px;
}
h1::after {
content: " 🦅";
font-size: 1.5rem;
}
/* Formulářové prvky */
#noteTitle {
width: 100%;
padding: 12px 16px;
margin-bottom: 12px;
font-size: 1.1rem;
font-weight: 600;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
transition: border-color 0.2s;
}
#noteTitle:focus {
border-color: var(--accent);
}
textarea {
width: 100%;
height: 220px;
padding: 14px;
margin-bottom: 12px;
font-family: monospace;
font-size: 14px;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
resize: vertical;
line-height: 1.5;
}
textarea:focus {
border-color: var(--accent);
}
/* Tlačítka */
button {
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--note-border);
padding: 10px 18px;
border-radius: 4px;
cursor: pointer;
font-weight: 500;
transition: background 0.2s, border-color 0.2s;
}
button:hover {
background: var(--note-hover);
border-color: var(--accent);
}
/* Editor toolbar */
.editor-toolbar {
display: flex;
gap: 6px;
margin-bottom: 12px;
flex-wrap: wrap;
background: var(--note-bg);
padding: 6px;
border-radius: 4px;
border: 1px solid var(--note-border);
}
.editor-toolbar button {
background: transparent;
border: none;
color: var(--text);
padding: 6px 10px;
cursor: pointer;
border-radius: 3px;
font-size: 13px;
}
.editor-toolbar button:hover {
background: var(--note-hover);
color: var(--accent);
}
.editor-toolbar button.active {
background: var(--accent);
color: #111;
font-weight: bold;
}
/* Layout editoru a náhledu */
.editor-wrap {
display: flex;
gap: 16px;
align-items: flex-start;
}
.editor-wrap textarea {
flex: 1 1 55%;
min-height: 250px;
}
.preview {
flex: 1 1 45%;
border: 1px solid var(--note-border);
background: var(--note-bg);
padding: 16px;
border-radius: 4px;
/*overflow-auto;*/
min-height: 250px;
max-height: 400px;
font-size: 0.95rem;
}
.hidden {
display: none;
}
/* Akce pod editorem */
.editor-actions {
margin: 15px 0;
display: flex;
gap: 10px;
align-items: center;
flex-wrap: wrap;
}
#newNoteButton {
background: var(--accent);
color: #111;
font-weight: bold;
border: 1px solid transparent;
}
#newNoteButton:hover {
background: var(--accent-hover);
}
.save-status {
margin-left: auto;
font-size: 13px;
color: var(--accent);
font-weight: 500;
}
/* Seznam poznámek */
#notesContainer {
margin-top: 25px;
border-top: 1px solid var(--note-border);
padding-top: 20px;
display: flex;
flex-direction: column;
gap: 8px;
}
.note-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
border: 1px solid var(--note-border);
border-radius: 6px;
background: var(--note-bg);
transition: transform 0.15s, border-color 0.15s;
}
.note-item:hover {
background: var(--note-hover);
border-color: rgba(197, 160, 89, 0.4);
}
.note-item.active {
background: var(--active-bg);
border-color: var(--active-border);
box-shadow: 0 0 10px rgba(197, 160, 89, 0.05);
}
.note-left {
flex: 1 1 auto;
padding-right: 15px;
cursor: pointer;
overflow: hidden;
}
.note-title {
font-weight: 600;
font-size: 1.05rem;
margin-bottom: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-preview {
font-size: 13px;
color: var(--muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-controls {
display: flex;
gap: 4px;
align-items: center;
}
.note-controls button {
background: transparent;
border: none;
padding: 6px 10px;
color: var(--text);
opacity: 0.6;
transition: opacity 0.2s, color 0.2s;
}
.note-controls button:hover {
background: var(--button-bg);
opacity: 1;
}
.note-controls button.delete:hover {
color: #ff6b6b;
}
.no-notes {
color: var(--muted);
font-style: italic;
padding: 15px;
text-align: center;
}
.notes-hint {
margin-top: 10px;
color: var(--muted);
font-size: 12px;
text-align: center;
}
/* Drag & Drop styly */
.note-item.drag-over {
border-style: dashed;
border-color: var(--accent);
}
.note-item.drag-after {
box-shadow: inset 0 -3px 0 0 var(--accent);
}
.note-item.dragging {
opacity: 0.4;
}
/* Modální okno */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--modal-overlay);
backdrop-filter: blur(2px);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal {
background: var(--modal-bg);
padding: 24px;
border-radius: 8px;
width: 95%;
max-width: 800px;
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.4);
position: relative;
border: 1px solid var(--note-border);
}
.modal h2 {
margin-bottom: 15px;
font-size: 1.4rem;
}
.modal .modal-close {
position: absolute;
right: 16px;
top: 16px;
border: none;
background: transparent;
font-size: 18px;
color: var(--muted);
cursor: pointer;
}
.modal .modal-close:hover {
color: var(--text);
}
.modal-actions {
display: flex;
gap: 10px;
justify-content: flex-end;
margin-top: 10px;
}
#modalSaveBtn {
background: var(--accent);
color: #111;
font-weight: bold;
}
#modalSaveBtn:hover {
background: var(--accent-hover);
}
/* Styly pro renderovaný Markdown */
.preview h1, .preview h2, .preview h3 {
margin: 14px 0 8px 0;
color: var(--text);
}
.preview p {
margin-bottom: 10px;
}
.preview pre {
background: rgba(0, 0, 0, 0.15);
padding: 12px;
border-radius: 4px;
overflow: auto;
border: 1px solid var(--note-border);
margin: 10px 0;
}
body:not(.dark) .preview pre {
background: #f0ede6;
}
.preview code {
font-family: monospace;
background: rgba(197, 160, 89, 0.15);
padding: 2px 5px;
border-radius: 3px;
font-size: 0.9em;
}
.preview ul, .preview ol {
margin-left: 20px;
margin-bottom: 10px;
}
.preview blockquote {
border-left: 3px solid var(--accent);
padding-left: 12px;
font-style: italic;
color: var(--muted);
margin: 12px 0;
}
.preview table {
width: 100%;
border-collapse: collapse;
margin: 15px 0;
}
.preview th, .preview td {
border: 1px solid var(--note-border);
padding: 8px 12px;
text-align: left;
}
.preview th {
background: var(--button-bg);
}
/* Responzivita */
@media (max-width: 800px) {
body {
padding: 20px 10px;
}
.editor-wrap {
flex-direction: column;
}
.preview {
width: 100%;
min-height: 150px;
}
}
+387
View File
@@ -0,0 +1,387 @@
/* Theme variables */
:root {
--bg: #fafafa;
--text: #333333;
--muted: #666666;
--button-bg: #333333;
--button-text: #ffffff;
--note-bg: #ffffff;
--note-border: #dddddd;
--note-hover: #f5f5f5;
--accent: #0b63d6;
--modal-bg: #ffffff;
--modal-overlay: rgba(0, 0, 0, 0.45);
--active-bg: #e6f0ff;
--active-border: #a6c8ff;
}
/* Dark theme overrides */
body.dark {
--bg: #0b1220;
--text: #e6eef8;
--muted: #9aa6b2;
--button-bg: #1f2937;
--button-text: #ffffff;
--note-bg: #071022;
--note-border: #263046;
--note-hover: #092033;
--accent: #3b82f6;
--modal-bg: #0b1220;
--modal-overlay: rgba(0, 0, 0, 0.6);
--active-bg: rgba(59, 130, 246, 0.14);
--active-border: #60a5fa;
}
/* Base */
body {
font-family: monospace;
background: var(--bg);
padding: 40px;
color: var(--text);
transition:
background 200ms ease,
color 200ms ease;
}
.top-nav {
display: flex;
gap: 8px;
margin-bottom: 12px;
align-items: center;
flex-wrap: wrap;
}
.top-nav a,
.top-nav .theme-toggle {
background: var(--button-bg);
color: var(--button-text);
text-decoration: none;
padding: 8px 12px;
border-radius: 4px;
font-family: monospace;
font-size: 14px;
border: none;
cursor: pointer;
}
.top-nav a:hover,
.top-nav .theme-toggle:hover {
background: #555;
}
.top-nav a.active {
background: var(--accent);
}
h1::after {
content: " 🦅";
font-size: 1.5rem;
}
.container {
max-width: 600px;
margin: 0 auto;
}
#noteTitle {
width: 100%;
padding: 10px;
margin-bottom: 8px;
font-family: monospace;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
}
textarea {
width: 100%;
height: 150px;
padding: 10px;
margin-bottom: 10px;
font-family: monospace;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
}
button {
background: var(--button-bg);
color: var(--button-text);
border: none;
padding: 10px 20px;
cursor: pointer;
font-family: monospace;
}
button:hover {
background: #555;
}
#notesContainer {
margin-top: 10px;
border-top: 1px solid var(--note-border);
padding-top: 10px;
display: flex;
flex-direction: column;
gap: 6px;
}
.note-item {
padding: 8px;
border: 1px solid var(--note-border);
cursor: pointer;
background: var(--note-bg);
}
.note-item:hover {
background: var(--note-hover);
}
.note-item.active {
background: var(--active-bg);
border-color: var(--active-border);
}
.no-notes {
color: var(--muted);
font-style: italic;
padding: 6px;
}
/* Note list layout */
.note-item {
display: flex;
align-items: center;
justify-content: space-between;
}
.note-left {
flex: 1 1 auto;
padding-right: 10px;
cursor: pointer;
}
.note-title {
font-weight: bold;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-preview {
font-size: 12px;
color: var(--muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-controls {
display: flex;
gap: 6px;
align-items: center;
}
.note-controls button {
background: transparent;
border: none;
padding: 6px 8px;
cursor: pointer;
font-family: monospace;
border-radius: 4px;
color: var(--text);
}
.note-controls button:hover {
background: rgba(255, 255, 255, 0.03);
}
.note-item.drag-over {
border-style: dashed;
}
.note-item.drag-after {
box-shadow: inset 0 -3px 0 0 rgba(0, 123, 255, 0.25);
}
.note-item.dragging {
opacity: 0.5;
}
/* Modal */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--modal-overlay);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal-overlay.hidden {
display: none;
}
.modal {
background: var(--modal-bg);
padding: 16px;
border-radius: 8px;
width: 92%;
max-width: 720px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
position: relative;
}
.modal .modal-close {
position: absolute;
right: 8px;
top: 8px;
border: none;
background: transparent;
font-size: 16px;
cursor: pointer;
}
.modal input,
.modal textarea {
width: 100%;
padding: 8px;
margin-bottom: 8px;
font-family: monospace;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
}
.modal-actions {
display: flex;
gap: 8px;
justify-content: flex-end;
}
@media (min-width: 800px) {
.container {
max-width: 900px;
}
}
.notes-hint {
margin-top: 8px;
color: var(--muted);
font-size: 13px;
}
/* Editor toolbar & preview */
.editor-toolbar {
display: flex;
gap: 6px;
margin-bottom: 8px;
flex-wrap: wrap;
}
.editor-toolbar button {
background: transparent;
border: 1px solid var(--note-border);
color: var(--text);
padding: 6px 8px;
cursor: pointer;
border-radius: 4px;
font-family: monospace;
}
.editor-toolbar button:hover {
background: var(--note-hover);
}
/* active toolbar button */
.editor-toolbar button.active {
background: var(--accent);
color: var(--button-text);
}
.editor-wrap {
display: flex;
gap: 12px;
align-items: flex-start;
}
.editor-wrap textarea {
flex: 1 1 60%;
min-height: 160px;
}
.preview {
flex: 1 1 40%;
border: 1px solid var(--note-border);
background: var(--note-bg);
padding: 10px;
border-radius: 4px;
overflow: auto;
max-height: 320px;
}
.hidden {
display: none;
}
.editor-actions {
margin-top: 8px;
display: flex;
gap: 8px;
align-items: center;
}
.save-status {
margin-left: 8px;
font-size: 13px;
color: var(--muted);
min-width: 80px;
}
/* Rendered markdown styles */
.preview h1,
.preview h2,
.preview h3 {
margin: 6px 0;
}
.preview pre {
background: rgba(0, 0, 0, 0.04);
padding: 8px;
overflow: auto;
}
.preview code {
background: rgba(0, 0, 0, 0.06);
padding: 2px 4px;
border-radius: 4px;
}
@media (max-width: 800px) {
.editor-wrap {
flex-direction: column;
}
.preview {
max-height: 240px;
}
}
footer {
margin-top: 16px;
text-align: center;
font-size: 13px;
color: var(--muted);
}
+725
View File
@@ -0,0 +1,725 @@
/* --- STOICKÝ DESIGN PRO DOXA NOTES --- */
:root {
/* Světlý motiv - Inspirovaný antickým mramorem a pergamenem */
--bg: #f5f4f0;
--text: #2c2e30;
--muted: #73797e;
--button-bg: #e5e2da;
--button-text: #2c2e30;
--note-bg: #ffffff;
--note-border: #dcd8cd;
--note-hover: #edeae2;
--accent: #b3893e; /* Tlumená bronzová */
--accent-hover: #967131;
--modal-bg: #ffffff;
--modal-overlay: rgba(44, 46, 48, 0.4);
--active-bg: #fdfbf7;
--active-border: #b3893e;
}
/* Tmavý motiv - Hluboká noc a bronz (Výchozí pro landing page) */
body.dark {
--bg: #1a1c1e;
--text: #e2e4e9;
--muted: #9ba1a6;
--button-bg: #2d3135;
--button-text: #e2e4e9;
--note-bg: #222529;
--note-border: #2e3238;
--note-hover: #2b2e33;
--accent: #c5a059; /* Jasnější stoická bronzová */
--accent-hover: #dfba73;
--modal-bg: #222529;
--modal-overlay: rgba(0, 0, 0, 0.6);
--active-bg: rgba(197, 160, 89, 0.05);
--active-border: #c5a059;
}
/* Základní nastavení */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, monospace, sans-serif;
background: var(--bg);
color: var(--text);
padding: 40px 20px;
line-height: 1.6;
transition: background 250ms ease, color 250ms ease;
}
.container {
max-width: 900px;
margin: 0 auto;
}
/* Navigace */
.top-nav {
display: flex;
gap: 10px;
margin-bottom: 30px;
align-items: center;
flex-wrap: wrap;
border-bottom: 1px solid var(--note-border);
padding-bottom: 15px;
}
.top-nav a,
.top-nav .theme-toggle {
background: var(--button-bg);
color: var(--button-text);
text-decoration: none;
padding: 8px 16px;
border-radius: 4px;
font-size: 14px;
font-weight: 500;
border: 1px solid transparent;
cursor: pointer;
transition: background 0.2s, border-color 0.2s;
}
.top-nav a:hover,
.top-nav .theme-toggle:hover {
background: var(--note-hover);
border-color: var(--accent);
}
.top-nav a.active {
background: var(--accent);
color: #111;
font-weight: bold;
}
/* Nadpisy */
h1 {
font-size: 2.2rem;
/*margin-bottom: 20px;*/
letter-spacing: 0.5px;
display: flex;
align-items: center;
gap: 10px;
}
/* Formulářové prvky */
#noteTitle {
width: 100%;
padding: 12px 16px;
margin-bottom: 12px;
font-size: 0.9rem;
font-weight: 600;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
transition: border-color 0.2s;
}
#noteTitle:focus {
border-color: var(--accent);
}
.meta-row {
display: flex;
gap: 8px;
align-items: center;
margin-bottom: 12px;
}
#noteTags {
flex: 1 1 auto;
padding: 10px 14px;
font-size: 0.9rem;
font-weight: 600;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
transition: border-color 0.2s;
}
#noteTags:focus {
border-color: var(--accent);
}
textarea {
width: 100%;
height: 220px;
padding: 14px;
margin-bottom: 12px;
font-family: monospace;
font-size: 14px;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
resize: vertical;
line-height: 1.5;
}
/* Složka - malé pole vedle tagů */
#noteFolder {
flex: 0 0 180px;
padding: 10px 12px;
font-size: 0.9rem;
color: var(--text);
background: linear-gradient(180deg, var(--button-bg), var(--note-bg));
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
}
#noteFolder:focus {
border-color: var(--accent);
}
/* Filtr složek jako tlačítko (velké jako ostatní tlačítka) */
#folderFilter {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
background: var(--accent);
color: #111;
border: 1px solid transparent;
padding: 10px 16px;
border-radius: 4px;
cursor: pointer;
font-weight: 600;
height: 44px;
display: inline-flex;
align-items: center;
}
#folderFilter:hover {
background: var(--accent-hover);
}
/* Ensure filter-row alignment */
.filter-row {
display: flex;
gap: 8px;
align-items: center;
margin-top: 20px;
margin-bottom: 10px;
}
/* remove bottom margin for search input inside filter-row */
.filter-row #searchTagInput {
margin-bottom: 0;
flex: 1 1 auto;
}
/* Zobrazení složky v seznamu poznámek - ikona vždy viditelná */
.note-preview-folder {
display: flex;
gap: 6px;
align-items: center;
font-size: 0.75rem;
color: var(--muted);
margin-top: 4px;
font-family: monospace;
}
.note-preview-folder .folder-icon {
flex: 0 0 auto;
}
.note-preview-folder .folder-name {
flex: 1 1 auto;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
@media (max-width: 800px) {
.meta-row {
flex-direction: column;
}
#noteFolder {
flex: 1 1 auto;
width: 100%;
}
#folderFilter {
width: 100%;
}
}
@media (max-width: 800px) {
.meta-row {
flex-direction: column;
}
#noteFolder {
flex: 1 1 auto;
width: 100%;
}
#folderFilter {
width: 100%;
}
}
textarea:focus {
border-color: var(--accent);
}
/* Tlačítka */
button {
background: var(--button-bg);
color: var(--button-text);
border: 1px solid var(--note-border);
padding: 10px 18px;
border-radius: 4px;
cursor: pointer;
font-weight: 500;
transition: background 0.2s, border-color 0.2s;
}
button:hover {
background: var(--note-hover);
border-color: var(--accent);
}
/* Editor toolbar */
.editor-toolbar {
display: flex;
gap: 6px;
margin-bottom: 12px;
flex-wrap: wrap;
background: var(--note-bg);
padding: 6px;
border-radius: 4px;
border: 1px solid var(--note-border);
}
.editor-toolbar button {
background: transparent;
border: none;
color: var(--text);
padding: 6px 10px;
cursor: pointer;
border-radius: 3px;
font-size: 13px;
}
.editor-toolbar button:hover {
background: var(--note-hover);
color: var(--accent);
}
.editor-toolbar button.active {
background: var(--accent);
color: #111;
font-weight: bold;
}
/* Layout editoru a náhledu */
.editor-wrap {
display: flex;
gap: 16px;
align-items: flex-start;
}
.editor-wrap textarea {
flex: 1 1 100%;
min-height: 250px;
}
.preview {
flex: 1 1 100%;
border: 1px solid var(--note-border);
background: var(--note-bg);
padding: 16px;
border-radius: 4px;
overflow: auto;
min-height: 250px;
max-height: 600px;
font-size: 0.95rem;
}
.hidden {
display: none !important;
}
/* Akce pod editorem */
.editor-actions {
margin: 15px 0;
display: flex;
gap: 10px;
align-items: center;
flex-wrap: wrap;
}
#newNoteButton {
background: var(--accent);
color: #111;
font-weight: bold;
border: 1px solid transparent;
}
#newNoteButton:hover {
background: var(--accent-hover);
}
.save-status {
margin-left: auto;
font-size: 13px;
color: var(--accent);
font-weight: 500;
}
#searchTagInput {
width: 100%;
padding: 12px 16px;
margin-bottom: 12px;
font-size: 0.9rem;
font-weight: 600;
color: var(--text);
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
outline: none;
transition: border-color 0.2s;
}
#searchTagInput:focus {
border-color: var(--accent);
}
/* Seznam poznámek */
#notesContainer {
margin-top: 25px;
border-top: 1px solid var(--note-border);
padding-top: 20px;
display: flex;
flex-direction: column;
gap: 8px;
}
.note-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
border: 1px solid var(--note-border);
border-radius: 6px;
background: var(--note-bg);
transition: transform 0.15s, border-color 0.15s;
}
.note-item:hover {
background: var(--note-hover);
border-color: rgba(197, 160, 89, 0.4);
}
.note-item.active {
background: var(--active-bg);
border-color: var(--active-border);
box-shadow: 0 0 10px rgba(197, 160, 89, 0.05);
}
.note-left {
flex: 1 1 auto;
padding-right: 15px;
cursor: pointer;
overflow: hidden;
}
.note-title {
font-weight: 600;
font-size: 1.05rem;
margin-bottom: 2px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-preview {
font-size: 13px;
color: var(--muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.note-controls {
display: flex;
gap: 4px;
align-items: center;
}
.note-controls button {
background: transparent;
border: none;
padding: 6px 10px;
color: var(--text);
opacity: 0.6;
transition: opacity 0.2s, color 0.2s;
}
.note-controls button:hover {
background: var(--button-bg);
opacity: 1;
}
.note-controls button.delete:hover {
color: #ff6b6b;
}
.no-notes {
color: var(--muted);
font-style: italic;
padding: 15px;
text-align: center;
}
.notes-hint {
margin-top: 10px;
color: var(--muted);
font-size: 12px;
text-align: center;
}
/* Drag & Drop styly */
.note-item.drag-over {
border-style: dashed;
border-color: var(--accent);
}
.note-item.drag-after {
box-shadow: inset 0 -3px 0 0 var(--accent);
}
.note-item.dragging {
opacity: 0.4;
}
/* Modální okno */
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--modal-overlay);
backdrop-filter: blur(2px);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal {
background: var(--modal-bg);
padding: 24px;
border-radius: 8px;
width: 95%;
max-width: 800px;
box-shadow: 0 15px 40px rgba(0, 0, 0, 0.4);
position: relative;
border: 1px solid var(--note-border);
}
.modal h2 {
margin-bottom: 15px;
font-size: 1.4rem;
}
.modal .modal-close {
position: absolute;
right: 16px;
top: 16px;
border: none;
background: transparent;
font-size: 18px;
color: var(--muted);
cursor: pointer;
}
.modal .modal-close:hover {
color: var(--text);
}
.modal-actions {
display: flex;
gap: 10px;
justify-content: flex-end;
margin-top: 10px;
}
#modalSaveBtn {
background: var(--accent);
color: #111;
font-weight: bold;
}
#modalSaveBtn:hover {
background: var(--accent-hover);
}
/* Styly pro renderovaný Markdown */
.preview h1, .preview h2, .preview h3 {
margin: 14px 0 8px 0;
color: var(--text);
}
.preview p {
margin-bottom: 10px;
}
.preview pre {
background: rgba(0, 0, 0, 0.15);
padding: 12px;
border-radius: 4px;
overflow: auto;
border: 1px solid var(--note-border);
margin: 10px 0;
}
body:not(.dark) .preview pre {
background: #f0ede6;
}
.preview code {
font-family: monospace;
background: rgba(197, 160, 89, 0.15);
padding: 2px 5px;
border-radius: 3px;
font-size: 0.9em;
}
.preview ul, .preview ol {
margin-left: 20px;
margin-bottom: 10px;
}
.preview blockquote {
border-left: 3px solid var(--accent);
padding-left: 12px;
font-style: italic;
color: var(--muted);
margin: 12px 0;
}
.preview table {
width: 100%;
border-collapse: collapse;
margin: 15px 0;
}
.preview th, .preview td {
border: 1px solid var(--note-border);
padding: 8px 12px;
text-align: left;
}
.preview th {
background: var(--button-bg);
}
/* Responzivita */
@media (max-width: 800px) {
body {
padding: 20px 10px;
}
.editor-wrap {
flex-direction: column;
}
.preview {
width: 100%;
min-height: 150px;
}
}
#links {
color: var(--accent);
}
#lineHR {
border: none;
border-top: 1px solid var(--accent);
}
/* Slash command menu */
#slashCommandMenu {
position: fixed;
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
z-index: 1000;
max-height: 280px;
overflow-y: auto;
min-width: 200px;
max-width: 300px;
}
#slashCommandMenu.hidden {
display: none !important;
}
.slash-command-item {
padding: 8px 12px;
cursor: pointer;
color: var(--text);
font-size: 13px;
border-bottom: 1px solid var(--note-border);
transition: background 0.1s;
}
.slash-command-item:last-child {
border-bottom: none;
}
.slash-command-item:hover,
.slash-command-item.active {
background: var(--note-hover);
color: var(--accent);
font-weight: bold;
}
/* Suggestions dropdown (tags & folders) */
.suggestions {
position: absolute;
top: 100%;
left: 0;
right: 0;
background: var(--note-bg);
border: 1px solid var(--note-border);
border-radius: 4px;
box-shadow: 0 6px 20px rgba(0,0,0,0.12);
z-index: 1200;
max-height: 220px;
overflow-y: auto;
margin-top: 6px;
}
.suggestion-item {
padding: 8px 10px;
cursor: pointer;
color: var(--text);
font-size: 14px;
border-bottom: 1px solid var(--note-border);
}
.suggestion-item:last-child { border-bottom: none; }
.suggestion-item:hover, .suggestion-item.active { background: var(--note-hover); color: var(--accent); font-weight: 600; }
/* ensure suggestions look ok on small screens */
@media (max-width: 800px) {
.suggestions { max-height: 160px; }
}
footer {
margin-top: 26px;
text-align: center;
font-size: 13px;
color: var(--muted);
}
View File
Whitespace-only changes.
View File
Whitespace-only changes.
+163
View File
@@ -0,0 +1,163 @@
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title data-i18n-key="webTitle">DOXA Notes — Workspace</title>
<meta name="robots" content="noindex, nofollow" />
<meta name="description" data-i18n-key="webDescription" data-i18n-attr="content" content="DOXA Notes Workspace — Local-first poznámková aplikace s podporou Markdown. Vaše data zůstávají pod vaší kontrolou." />
<link rel="canonical" href="https://app.doxa-notes.org/" />
<meta property="og:type" content="webapp" />
<meta property="og:url" content="https://app.doxa-notes.org/" />
<meta property="og:title" data-i18n-key="ogTitle" data-i18n-attr="content" content="DOXA Notes — Workspace" />
<meta property="og:description" data-i18n-key="ogDescription" data-i18n-attr="content" content="Local-first poznámková aplikace s podporou Markdown. Vaše data zůstávají pod vaší kontrolou." />
<meta property="og:image" content="https://doxa-notes.org/assets/img/doxa.png" />
<meta property="og:image:alt" content="DOXA Notes - Local-First Notes & Sovereignty" />
<meta property="og:locale" data-i18n-key="ogLocale" data-i18n-attr="content" content="cs_CZ" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" data-i18n-key="twitterTitle" data-i18n-attr="content" content="DOXA Notes — Workspace" />
<meta name="twitter:description" data-i18n-key="twitterDescription" data-i18n-attr="content" content="Local-first poznámková aplikace s podporou Markdown." />
<meta name="twitter:image" content="https://doxa-notes.org/assets/img/doxa.png" />
<meta name="twitter:image:alt" content="DOXA Notes - Local-First Notes & Sovereignty" />
<link rel="stylesheet" href="assets/style/style.css" />
<style>
#notesContainer {
max-height: 520px; /* Výška pro cca 6 náhledů, aby se stránka neprodlužovala */
overflow-y: auto; /* Povolí vertikální rolování, pokud je obsah vyšší */
border: 1px solid var(--note-border);
border-radius: 8px;
padding: 10px;
margin-bottom: 1rem; /* Malý odstup pod kontejnerem */
transition: border-color 0.2s ease-in-out; /* Plynulý přechod pro zvýraznění */
}
#notesContainer:hover {
border-color: var(--accent); /* Zvýraznění při najetí myší */
}
</style>
<link rel="shortcut icon" href="assets/img/brain-solid-full.svg" />
<!-- Markdown and sanitization libraries (used for preview). CDN fallback; if offline, preview will be disabled. -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/default.min.css" />
<script src="https://cdn.jsdelivr.net/npm/markdown-it/dist/markdown-it.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
</head>
<body>
<div class="container">
<nav class="top-nav">
<a href="https://doxa-notes.org/index.html" target="_blank" data-i18n-key="navLink">Web DOXA Notes, Návody, Manifest</a>
<button id="langToggle" class="theme-toggle" title="Přepnout jazyk / Switch language">
🇬🇧 / 🇨🇿 </button>
<button id="themeToggle" class="theme-toggle" data-i18n-key="themeToggleLabel" data-i18n-attr="aria-label" aria-label="Přepnout motiv">
🌙
</button>
</nav>
<h1 data-i18n-key="mainTitle">DOXA Notes 🦅</h1>
<p style="color: var(--muted); margin-bottom: 30px;margin-top: 2px; font-size: 0.95rem;" data-i18n-key="mainSubtitle">Local-First Notes &
Sovereignty</p>
<div id="slashCommandMenu" class="hidden"></div>
<input id="noteTitle" data-i18n-key="noteTitlePlaceholder" data-i18n-attr="placeholder" placeholder="Název poznámky" />
<div class="meta-row">
<input id="noteTags" data-i18n-key="noteTagsPlaceholder" data-i18n-attr="placeholder" placeholder="Tagy (oddělujte čárkou, např: práce, citaty)" autocomplete="off" />
<div style="position:relative; display:inline-block;">
<input id="noteFolder" data-i18n-key="noteFolderPlaceholder" data-i18n-attr="placeholder" placeholder="Složka (nepovinné)" list="foldersList" autocomplete="off" />
<datalist id="foldersList"></datalist>
</div>
</div>
<div class="editor-toolbar" id="editorToolbar">
<button type="button" data-action="h1" data-i18n-key="toolbarH1" data-i18n-attr="title" title="Nadpis H1">
H1
</button>
<button type="button" data-action="h2" data-i18n-key="toolbarH2" data-i18n-attr="title" title="Nadpis H2">
H2
</button>
<button type="button" data-action="h3" data-i18n-key="toolbarH3" data-i18n-attr="title" title="Nadpis H3">
H3
</button>
<button type="button" data-action="bold" data-i18n-key="toolbarBold" data-i18n-attr="title" title="Tučné (Ctrl+B)">
<strong>B</strong>
</button>
<button type="button" data-action="italic" data-i18n-key="toolbarItalic" data-i18n-attr="title" title="Kurzíva (Ctrl+I)">
<em>I</em>
</button>
<button type="button" data-action="strike" data-i18n-key="toolbarStrike" data-i18n-attr="title" title="Přeškrtnutí">
S
</button>
<button type="button" data-action="ul" data-i18n-key="toolbarUl" data-i18n-attr="title" title="Odrážkový seznam">
•
</button>
<button type="button" data-action="ol" data-i18n-key="toolbarOl" data-i18n-attr="title" title="Číslovaný seznam">
1.
</button>
<button type="button" data-action="task" data-i18n-key="toolbarTask" data-i18n-attr="title" title="Úkol (checkbox)">
☐
</button>
<button type="button" data-action="quote" data-i18n-key="toolbarQuote" data-i18n-attr="title" title="Citace">
❝
</button>
<button type="button" data-action="hr" data-i18n-key="toolbarHr" data-i18n-attr="title" title="Vodorovná čára">
—
</button>
<button type="button" data-action="code" data-i18n-key="toolbarCode" data-i18n-attr="title" title="Inline kód">
`kód`
</button>
<button type="button" data-action="codeblock" data-i18n-key="toolbarCodeblock" data-i18n-attr="title" title="Blok kódu">
&lt;/&gt;
</button>
<button type="button" data-action="link" data-i18n-key="toolbarLink" data-i18n-attr="title" title="Vložit odkaz">
🔗
</button>
<button type="button" data-action="image" data-i18n-key="toolbarImage" data-i18n-attr="title" title="Vložit obrázek">
🖼
</button>
<button type="button" data-action="table" data-i18n-key="toolbarTable" data-i18n-attr="title" title="Vložit tabulku">
▦
</button>
<button type="button" id="togglePreviewMain" data-i18n-key="toolbarPreview" data-i18n-attr="title" title="Náhled">
Náhled
</button>
</div>
<div class="editor-wrap">
<textarea id="noteInput" data-i18n-key="noteInputPlaceholder" data-i18n-attr="placeholder" placeholder="Zapiš poznámku... Použij / pro rychlé vyhledávání příkazů"></textarea>
<div id="notePreview" class="preview hidden" aria-hidden="true"></div>
</div>
<div class="editor-actions">
<button onclick="saveCurrentNote()" data-i18n-key="saveNowButton">
Uložit nyní
</button>
<button onclick="saveNotesToFile(true)" data-i18n-key="exportJsonButton">Exportovat JSON</button>
<button onclick="exportToMarkdown()" data-i18n-key="exportMarkdownButton">Exportovat do Markdown</button>
<button onclick="importujPoznamky()" data-i18n-key="importJsonButton">Importovat JSON</button>
<button id="newNoteButton" data-i18n-key="newNoteButton">➕ Nová poznámka</button>
<span id="saveStatus" class="save-status" aria-live="polite"></span>
</div>
<div class="filter-row">
<select id="folderFilter" aria-label="Filtrovat podle složky">
<option value="all" data-i18n-key="filterAllFolders">📁 Všechny složky</option>
</select>
<input id="searchTagInput" data-i18n-key="searchInputPlaceholder" data-i18n-attr="placeholder" placeholder="🔍 Vyhledat podle názvu, obsahu, tagu nebo složky..." />
</div>
<div id="notesContainer"></div>
<div id="notesHint" class="notes-hint" data-i18n-key="dragHint">
Přetáhněte poznámky pro změnu pořadí nebo použijte šipky vedle
položek.
</div>
</div>
<script src="assets/js/i18n.js"></script>
<script src="assets/js/script.js"></script>
</body>
</html>
+167
View File
@@ -0,0 +1,167 @@
<!DOCTYPE html>
<html lang="en" data-bs-theme="light">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="/img/favicon.ico">
<title>DOXA Notes 🦅</title>
<link href="/css/bootstrap.min.css" rel="stylesheet">
<link href="/css/fontawesome.min.css" rel="stylesheet">
<link href="/css/brands.min.css" rel="stylesheet">
<link href="/css/solid.min.css" rel="stylesheet">
<link href="/css/v4-font-face.min.css" rel="stylesheet">
<link href="/css/base.css" rel="stylesheet">
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" >
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
</head>
<body>
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="/.">DOXA Notes 🦅</a>
<!-- Expander button -->
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Expanded navigation -->
<div id="navbar-collapse" class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav">
<li class="nav-item">
<a href="/." class="nav-link">Home</a>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - Česky</a>
<ul class="dropdown-menu">
<li>
<a href="/install/" class="dropdown-item">Instalace</a>
</li>
<li>
<a href="/editor/" class="dropdown-item">DOXA editor</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - English</a>
<ul class="dropdown-menu">
<li>
<a href="/install_en/" class="dropdown-item">Install</a>
</li>
<li>
<a href="/editor_en/" class="dropdown-item">DOXA editor</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav ms-md-auto">
<li class="nav-item">
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal">
<i class="fa fa-search"></i> Search
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="row-fluid">
<div id="main-content" class="span12">
<h1 id="404-page-not-found" style="text-align: center">404</h1>
<p style="text-align: center"><strong>Page not found</strong></p>
</div>
</div>
</div>
</div>
<footer class="col-md-12">
<hr>
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
</footer>
<script src="/js/bootstrap.bundle.min.js"></script>
<script>
var base_url = "/",
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
</script>
<script src="/js/base.js"></script>
<script src="/search/main.js"></script>
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="searchModalLabel">Search</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>From here you can search these documents. Enter your search terms below.</p>
<form>
<div class="form-group">
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here">
</div>
</form>
<div id="mkdocs-search-results" data-no-results-text="No results found"></div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th style="width: 20%;">Keys</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="help shortcut"><kbd>?</kbd></td>
<td>Open this help</td>
</tr>
<tr>
<td class="next shortcut"><kbd>n</kbd></td>
<td>Next page</td>
</tr>
<tr>
<td class="prev shortcut"><kbd>p</kbd></td>
<td>Previous page</td>
</tr>
<tr>
<td class="search shortcut"><kbd>s</kbd></td>
<td>Search</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
</body>
</html>
+366
View File
@@ -0,0 +1,366 @@
html {
/* The nav header is 3.5rem high, plus 20px for the margin-top of the
main container. */
scroll-padding-top: calc(3.5rem + 20px);
}
/* Replacement for `body { background-attachment: fixed; }`, which has
performance issues when scrolling on large displays. See #1394. */
body::before {
content: ' ';
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
background-color: var(--bs-body-bg);
background: url(../img/grid.png) repeat-x;
will-change: transform;
z-index: -1;
}
body > .container {
margin-top: 20px;
min-height: 400px;
}
.navbar.fixed-top {
position: -webkit-sticky;
position: sticky;
}
.source-links {
float: right;
}
.col-md-9 img {
max-width: 100%;
display: inline-block;
padding: 4px;
line-height: 1.428571429;
background-color: var(--bs-secondary-bg-subtle);
border: 1px solid var(--bs-secondary-border-subtle);
border-radius: 4px;
margin: 20px auto 30px auto;
}
h1 {
color: inherit;
font-weight: 400;
font-size: 42px;
}
h2, h3, h4, h5, h6 {
color: inherit;
font-weight: 300;
}
hr {
border-top: 1px solid #aaa;
opacity: 1;
}
pre, .rst-content tt {
max-width: 100%;
background-color: var(--bs-body-bg);
border: solid 1px var(--bs-border-color);
color: var(--bs-body-color);
overflow-x: auto;
}
code.code-large, .rst-content tt.code-large {
font-size: 90%;
}
code {
padding: 2px 5px;
background-color: rgba(var(--bs-body-bg-rgb), 0.75);
border: solid 1px var(--bs-border-color);
color: var(--bs-body-color);
white-space: pre-wrap;
word-wrap: break-word;
}
pre code {
display: block;
border: none;
white-space: pre;
word-wrap: normal;
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 12px;
}
kbd {
padding: 2px 4px;
font-size: 90%;
color: var(--bs-secondary-text-emphasis);
background-color: var(--bs-secondary-bg-subtle);
border-radius: 3px;
-webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
}
a code {
color: inherit;
}
a:hover code, a:focus code {
color: inherit;
}
footer {
margin-top: 30px;
margin-bottom: 10px;
text-align: center;
font-weight: 200;
}
.modal-dialog {
margin-top: 60px;
}
/*
* Side navigation
*
* Scrollspy and affixed enhanced navigation to highlight sections and secondary
* sections of docs content.
*/
.bs-sidebar.affix {
position: -webkit-sticky;
position: sticky;
/* The nav header is 3.5rem high, plus 20px for the margin-top of the
main container. */
top: calc(3.5rem + 20px);
}
.bs-sidebar.card {
padding: 0;
max-height: 90%;
overflow-y: auto;
}
/* Toggle (vertically flip) sidebar collapse icon */
.bs-sidebar .navbar-toggler span {
-moz-transform: scale(1, -1);
-webkit-transform: scale(1, -1);
-o-transform: scale(1, -1);
-ms-transform: scale(1, -1);
transform: scale(1, -1);
}
.bs-sidebar .navbar-toggler.collapsed span {
-moz-transform: scale(1, 1);
-webkit-transform: scale(1, 1);
-o-transform: scale(1, 1);
-ms-transform: scale(1, 1);
transform: scale(1, 1);
}
/* First level of nav */
.bs-sidebar > .navbar-collapse > .nav {
padding-top: 10px;
padding-bottom: 10px;
border-radius: 5px;
width: 100%;
}
/* All levels of nav */
.bs-sidebar .nav > li > a {
display: block;
padding: 5px 20px;
z-index: 1;
}
.bs-sidebar .nav > li > a:hover,
.bs-sidebar .nav > li > a:focus {
text-decoration: none;
border-right: 1px solid;
}
.bs-sidebar .nav > li > a.active,
.bs-sidebar .nav > li > a.active:hover,
.bs-sidebar .nav > li > a.active:focus {
font-weight: bold;
background-color: transparent;
border-right: 1px solid;
}
.bs-sidebar .nav .nav .nav {
margin-left: 1em;
}
.bs-sidebar .nav > li > a {
font-weight: bold;
}
.bs-sidebar .nav .nav > li > a {
font-weight: normal;
}
.headerlink {
font-family: FontAwesome;
font-size: 14px;
display: none;
padding-left: .5em;
text-decoration: none;
vertical-align: middle;
}
h1:hover .headerlink, h2:hover .headerlink, h3:hover .headerlink, h4:hover .headerlink, h5:hover .headerlink, h6:hover .headerlink {
display:inline-block;
}
blockquote {
padding-left: 10px;
border-left: 4px solid #e6e6e6;
}
.admonition, details {
padding: 15px;
margin-bottom: 20px;
border: 1px solid transparent;
border-radius: 4px;
text-align: left;
}
.admonition.note, details.note {
color: var(--bs-primary-text-emphasis);
background-color: var(--bs-primary-bg-subtle);
border-color: var(--bs-primary-border-subtle);
}
.admonition.note h1, .admonition.note h2, .admonition.note h3,
.admonition.note h4, .admonition.note h5, .admonition.note h6,
details.note h1, details.note h2, details.note h3,
details.note h4, details.note h5, details.note h6 {
color: var(--bs-primary-text-emphasis);
}
.admonition.info, details.info {
color: var(--bs-info-text-emphasis);
background-color: var(--bs-info-bg-subtle);
border-color: var(--bs-info-border-subtle);
}
.admonition.info h1, .admonition.info h2, .admonition.info h3,
.admonition.info h4, .admonition.info h5, .admonition.info h6,
details.info h1, details.info h2, details.info h3,
details.info h4, details.info h5, details.info h6 {
color: var(--bs-info-text-emphasis);
}
.admonition.warning, details.warning {
color: var(--bs-warning-text-emphasis);
background-color: var(--bs-warning-bg-subtle);
border-color: var(--bs-warning-border-subtle);
}
.admonition.warning h1, .admonition.warning h2, .admonition.warning h3,
.admonition.warning h4, .admonition.warning h5, .admonition.warning h6,
details.warning h1, details.warning h2, details.warning h3,
details.warning h4, details.warning h5, details.warning h6 {
color: var(--bs-warning-text-emphasis);
}
.admonition.danger, details.danger {
color: var(--bs-danger-text-emphasis);
background-color: var(--bs-danger-bg-subtle);
border-color: var(--bs-danger-border-subtle);
}
.admonition.danger h1, .admonition.danger h2, .admonition.danger h3,
.admonition.danger h4, .admonition.danger h5, .admonition.danger h6,
details.danger h1, details.danger h2, details.danger h3,
details.danger h4, details.danger h5, details.danger h6 {
color: var(--bs-danger-text-emphasis);
}
.admonition, details {
color: var(--bs-light-text-emphasis);
background-color: var(--bs-light-bg-subtle);
border-color: var(--bs-light-border-subtle);
}
.admonition h1, .admonition h2, .admonition h3,
.admonition h4, .admonition h5, .admonition h6,
details h1, details h2, details h3,
details h4, details h5, details h6 {
color: var(--bs-light-text-emphasis);
}
.admonition-title, summary {
font-weight: bold;
text-align: left;
}
.admonition>p:last-child, details>p:last-child {
margin-bottom: 0;
}
@media (max-width: 991.98px) {
.navbar-collapse.show {
overflow-y: auto;
max-height: calc(100vh - 3.5rem);
}
}
.dropdown-item.open {
color: var(--bs-dropdown-link-active-color);
background-color: var(--bs-dropdown-link-active-bg);
}
.dropdown-submenu > .dropdown-menu {
margin: 0 0 0 1.5rem;
padding: 0;
border-width: 0;
}
.dropdown-submenu > a::after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: var(--bs-dropdown-link-active-color);
margin-top: 5px;
margin-right: -10px;
}
.dropdown-submenu:hover > a::after {
border-left-color: var(--bs-dropdown-link-active-color);
}
@media (min-width: 992px) {
.dropdown-menu {
overflow-y: auto;
max-height: calc(100vh - 3.5rem);
}
.dropdown-submenu {
position: relative;
}
.dropdown-submenu > .dropdown-menu {
position: fixed !important;
margin-top: -9px;
margin-left: -2px;
border-width: 1px;
padding: 0.5rem 0;
}
.dropdown-submenu.pull-left {
float: none;
}
.dropdown-submenu.pull-left > .dropdown-menu {
left: -100%;
margin-left: 10px;
}
}
@media print {
/* Remove sidebar when print */
.col-md-3 { display: none; }
}
+12
View File
@@ -0,0 +1,12 @@
@charset "UTF-8";/*!
* Bootswatch v5.3.2 (https://bootswatch.com)
* Theme: cerulean
* Copyright 2012-2023 Thomas Park
* Licensed under MIT
* Based on Bootstrap
*//*!
* Bootstrap v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2023 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/:root,[data-bs-theme=light]{--bs-blue:#033c73;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#c71c22;--bs-orange:#fd7e14;--bs-yellow:#dd5600;--bs-green:#73a839;--bs-teal:#20c997;--bs-cyan:#2fa4e7;--bs-black:#000;--bs-white:#fff;--bs-gray:#868e96;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#868e96;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#2fa4e7;--bs-secondary:#e9ecef;--bs-success:#73a839;--bs-info:#033c73;--bs-warning:#dd5600;--bs-danger:#c71c22;--bs-light:#f8f9fa;--bs-dark:#343a40;--bs-primary-rgb:47,164,231;--bs-secondary-rgb:233,236,239;--bs-success-rgb:115,168,57;--bs-info-rgb:3,60,115;--bs-warning-rgb:221,86,0;--bs-danger-rgb:199,28,34;--bs-light-rgb:248,249,250;--bs-dark-rgb:52,58,64;--bs-primary-text-emphasis:#13425c;--bs-secondary-text-emphasis:#5d5e60;--bs-success-text-emphasis:#2e4317;--bs-info-text-emphasis:#01182e;--bs-warning-text-emphasis:#582200;--bs-danger-text-emphasis:#500b0e;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#d5edfa;--bs-secondary-bg-subtle:#fbfbfc;--bs-success-bg-subtle:#e3eed7;--bs-info-bg-subtle:#cdd8e3;--bs-warning-bg-subtle:#f8ddcc;--bs-danger-bg-subtle:#f4d2d3;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#acdbf5;--bs-secondary-border-subtle:#f6f7f9;--bs-success-border-subtle:#c7dcb0;--bs-info-border-subtle:#9ab1c7;--bs-warning-border-subtle:#f1bb99;--bs-danger-border-subtle:#e9a4a7;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#495057;--bs-body-color-rgb:73,80,87;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(73, 80, 87, 0.75);--bs-secondary-color-rgb:73,80,87;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(73, 80, 87, 0.5);--bs-tertiary-color-rgb:73,80,87;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:#2fa4e7;--bs-link-color:#2fa4e7;--bs-link-color-rgb:47,164,231;--bs-link-decoration:underline;--bs-link-hover-color:#2683b9;--bs-link-hover-color-rgb:38,131,185;--bs-code-color:#e83e8c;--bs-highlight-color:#495057;--bs-highlight-bg:#f8ddcc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(47, 164, 231, 0.25);--bs-form-valid-color:#73a839;--bs-form-valid-border-color:#73a839;--bs-form-invalid-color:#c71c22;--bs-form-invalid-border-color:#c71c22}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#82c8f1;--bs-secondary-text-emphasis:#f2f4f5;--bs-success-text-emphasis:#abcb88;--bs-info-text-emphasis:#688aab;--bs-warning-text-emphasis:#eb9a66;--bs-danger-text-emphasis:#dd777a;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#09212e;--bs-secondary-bg-subtle:#2f2f30;--bs-success-bg-subtle:#17220b;--bs-info-bg-subtle:#010c17;--bs-warning-bg-subtle:#2c1100;--bs-danger-bg-subtle:#280607;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#1c628b;--bs-secondary-border-subtle:#8c8e8f;--bs-success-border-subtle:#456522;--bs-info-border-subtle:#022445;--bs-warning-border-subtle:#853400;--bs-danger-border-subtle:#771114;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inheriLine truncated
/*# sourceMappingURL=bootstrap.min.css.map */
@@ -0,0 +1 @@
{"version":3,"sources":["dist/cerulean/bootstrap.css"],"names":[],"mappings":"iBACA;;;;;;AAOA;;;;AAKA,MACA,sBACE,UAAW,QACX,YAAa,QACb,YAAa,QACb,UAAW,QACX,SAAU,QACV,YAAa,QACb,YAAa,QACb,WAAY,QACZ,UAAW,QACX,UAAW,QACX,WAAY,KACZ,WAAY,KACZ,UAAW,QACX,eAAgB,QAChB,cAAe,QACf,cAAe,QACf,cAAe,QACf,cAAe,QACf,cAAe,QACf,cAAe,QACf,cAAe,QACf,cAAe,QACf,cAAe,QACf,aAAc,QACd,eAAgB,QAChB,aAAc,QACd,UAAW,QACX,aAAc,QACd,YAAa,QACb,WAAY,QACZ,UAAW,QACX,iBAAkB,EAAE,CAAE,GAAG,CAAE,IAC3B,mBAAoB,GAAG,CAAE,GAAG,CAAE,IAC9B,iBAAkB,GAAG,CAAE,GAAG,CAAE,GAC5B,cAAe,CAAC,CAAE,EAAE,CAAE,IACtB,iBAAkB,GAAG,CAAE,EAAE,CAAE,EAC3B,gBAAiB,GAAG,CAAE,EAAE,CAAE,GAC1B,eAAgB,GAAG,CAAE,GAAG,CAAE,IAC1B,cAAe,EAAE,CAAE,EAAE,CAAE,GACvB,2BAA4B,QAC5B,6BAA8B,QAC9B,2BAA4B,QAC5B,wBAAyB,QACzB,2BAA4B,QAC5B,0BAA2B,QAC3B,yBAA0B,QAC1B,wBAAyB,QACzB,uBAAwB,QACxB,yBAA0B,QAC1B,uBAAwB,QACxB,oBAAqB,QACrB,uBAAwB,QACxB,sBAAuB,QACvB,qBAAsB,QACtB,oBAAqB,QACrB,2BAA4B,QAC5B,6BAA8B,QAC9B,2BAA4B,QAC5B,wBAAyB,QACzB,2BAA4B,QAC5B,0BAA2B,QAC3B,yBAA0B,QAC1B,wBAAyB,QACzB,eAAgB,GAAG,CAAE,GAAG,CAAE,IAC1B,eAAgB,CAAC,CAAE,CAAC,CAAE,EACtB,qBAAsB,SAAS,CAAE,aAAa,CAAE,UAAU,CAAE,MAAM,CAAE,gBAAgB,CAAE,WAAW,CAAE,iBAAiB,CAAE,KAAK,CAAE,UAAU,CAAE,mBAAmB,CAAE,gBAAgB,CAAE,iBAAiB,CAAE,mBACnM,oBAAqB,cAAc,CAAE,KAAK,CAAE,MAAM,CAAE,QAAQ,CAAE,iBAAiB,CAAE,aAAa,CAAE,UAChG,cAAe,2EACf,sBAAuB,0BACvB,oBAAqB,KACrB,sBAAuB,IACvB,sBAAuB,IACvB,gBAAiB,QACjB,oBAAqB,EAAE,CAAE,EAAE,CAAE,GAC7B,aAAc,KACd,iBAAkB,GAAG,CAAE,GAAG,CAAE,IAC5B,oBAAqB,KACrB,wBAAyB,CAAC,CAAE,CAAC,CAAE,EAC/B,qBAAsB,uBACtB,yBAA0B,EAAE,CAAE,EAAE,CAAE,GAClC,kBAAmB,QACnB,sBAAuB,GAAG,CAAE,GAAG,CAAE,IACjC,oBAAqB,sBACrB,wBAAyB,EAAE,CAAE,EAAE,CAAE,GACjC,iBAAkB,QAClB,qBAAsB,GAAG,CAAE,GAAG,CAAE,IAChC,mBAAoB,QACpB,gBAAiB,QACjB,oBAAqB,EAAE,CAAE,GAAG,CAAE,IAC9B,qBAAsB,UACtB,sBAAuB,QACvB,0BAA2B,EAAE,CAAE,GAAG,CAAE,IACpC,gBAAiB,QACjB,qBAAsB,QACtB,kBAAmB,QACnB,kBAAmB,IACnB,kBAAmB,MACnB,kBAAmB,QACnB,8BAA+B,qBAC/B,mBAAoB,SACpB,sBAAuB,QACvB,sBAAuB,OACvB,sBAAuB,KACvB,uBAAwB,KACxB,uBAAwB,4BACxB,wBAAyB,MACzB,gBAAiB,EAAE,OAAO,KAAK,oBAC/B,mBAAoB,EAAE,SAAS,QAAQ,qBACvC,mBAAoB,EAAE,KAAK,KAAK,qBAChC,sBAAuB,MAAM,EAAE,IAAI,IAAI,qBACvC,sBAAuB,QACvB,wBAAyB,KACzB,sBAAuB,yBACvB,sBAAuB,QACvB,6BAA8B,QAC9B,wBAAyB,QACzB,+BAAgC,QAGlC,qBACE,aAAc,KACd,gBAAiB,QACjB,oBAAqB,GAAG,CAAE,GAAG,CAAE,IAC/B,aAAc,QACd,iBAAkB,EAAE,CAAE,EAAE,CAAE,GAC1B,oBAAqB,KACrB,wBAAyB,GAAG,CAAE,GAAG,CAAE,IACnC,qBAAsB,0BACtB,yBAA0B,GAAG,CAAE,GAAG,CAAE,IACpC,kBAAmB,QACnB,sBAAuB,EAAE,CAAE,EAAE,CAAE,GAC/B,oBAAqB,yBACrB,wBAAyB,GAAG,CAAE,GAAG,CAAE,IACnC,iBAAkB,QAClB,qBAAsB,EAAE,CAAE,EAAE,CAAE,GAC9B,2BAA4B,QAC5B,6BAA8B,QAC9B,2BAA4B,QAC5B,wBAAyB,QACzB,2BAA4B,QAC5B,0BAA2B,QAC3B,yBAA0B,QAC1B,wBAAyB,QACzB,uBAAwB,QACxB,yBAA0B,QAC1B,uBAAwB,QACxB,oBAAqB,QACrB,uBAAwB,QACxB,sBAAuB,QACvB,qBAAsB,QACtB,oBAAqB,QACrB,2BAA4B,QAC5B,6BAA8B,QAC9B,2BAA4B,QAC5B,wBAAyB,QACzB,2BAA4B,QAC5B,0BAA2B,QAC3B,yBAA0B,QAC1B,wBAAyB,QACzB,mBAAoB,QACpB,gBAAiB,QACjB,sBAAuB,QACvB,oBAAqB,GAAG,CAAE,GAAG,CAAE,IAC/B,0BAA2B,GAAG,CAAE,GAAG,CAAE,IACrC,gBAAiB,QACjB,qBAAsB,QACtB,kBAAmB,QACnB,kBAAmB,QACnB,8BAA+B,0BAC/B,sBAAuB,QACvB,6BAA8B,QAC9B,wBAAyB,QACzB,+BAAgC,QAGlC,EAEA,QADA,SAEE,WAAY,WAGd,8CACE,MACE,gBAAiB,QAIrB,KACE,OAAQ,EACR,YAAa,2BACb,UAAW,yBACX,YAAa,2BACb,YAAa,2BACb,MAAO,qBACP,WAAY,0BACZ,iBAAkB,kBAClB,yBAA0B,KAC1B,4BAA6B,YAG/B,GACE,OAAQ,KAAK,EACb,MAAO,QACP,OAAQ,EACR,WAAY,uBAAuB,MACnC,QAAS,IAGsC,IAAT,IAAT,IAAT,IAAT,IAAT,IAAyC,GAAT,GAAT,GAAT,GAAT,GAAT,GACE,WAAY,EACZ,cAAe,MACf,YAAa,IACb,YAAa,IACb,MAAO,wBAGL,IAAJ,GACE,UAAW,uBAEb,0BACM,IAAJ,GACE,UAAW,QAIX,IAAJ,GACE,UAAW,sBAEb,0BACM,IAAJ,GACE,UAAW,MAIX,IAAJ,GACE,UAAW,oBAEb,0BACM,IAAJ,GACE,UAAW,SAIX,IAAJ,GACE,UAAW,sBAEb,0BACM,IAAJ,GACE,UAAW,QAIX,IAAJ,GACE,UAAW,QAGT,IAAJ,GACE,UAAW,KAGb,EACE,WAAY,EACZ,cAAe,KAGjB,YACE,wBAAyB,UAAU,OACnC,gBAAiB,UAAU,OAC3B,OAAQ,KACR,iCAAkC,KAClC,yBAA0B,KAG5B,QACE,cAAe,KACf,WAAY,OACZ,YAAa,QAGf,GACA,GACE,aAAc,KAKhB,GAFA,GACA,GAEE,WAAY,EACZ,cAAe,KAGjB,MAEA,MACA,MAFA,MAGE,cAAe,EAGjB,GACE,YAAa,IAGf,GACE,cAAe,MACf,YAAa,EAGf,WACE,OAAQ,EAAE,EAAE,KAGd,EACA,OACE,YAAa,OAGR,OAAP,MACE,UAAW,OAGP,MAAN,KACE,QAAS,QACT,MAAO,0BACP,iBAAkB,uBAGpB,IACA,IACE,SAAU,SACV,UAAW,MACX,YAAa,EACb,eAAgB,SAGlB,IACE,OAAQ,OAGV,IACE,IAAK,MAGP,EACE,MAAO,wDACP,gBAAiB,UAEnB,QACE,oBAAqB,+BAGvB,2BAA4B,iCAC1B,MAAO,QACP,gBAAiB,KAInB,KACA,IAFA,IAGA,KACE,YAAa,yBACb,UAAW,IAGb,IACE,QAAS,MACT,WAAY,EACZ,cAAe,KACf,SAAU,KACV,UAAW,OAEb,SACE,UAAW,QACX,MAAO,QACP,WAAY,OAGd,KACE,UAAW,OACX,MAAO,qBACP,UAAW,WAEb,OACE,MAAO,QAGT,IACE,QAAS,SAAU,QACnB,UAAW,OACX,MAAO,kBACP,iBAAkB,qBAClB,cAAe,OAEjB,QACE,QAAS,EACT,UAAW,IAGb,OACE,OAAQ,EAAE,EAAE,KAGd,IACA,IACE,eAAgB,OAGlB,MACE,aAAc,OACd,gBAAiB,SAGnB,QACE,YAAa,MACb,eAAgB,MAChB,MAAO,0BACP,WAAY,KAGd,GACE,WAAY,QACZ,WAAY,qBAId,MAGA,GAFA,MAGA,GALA,MAGA,GAGE,aAAc,QACd,aAAc,MACd,aAAc,EAGhB,MACE,QAAS,aAGX,OACE,cAAe,EAGjB,iCACE,QAAS,EAIX,OADA,MAGA,SADA,OAEA,SACE,OAAQ,EACR,YAAa,QACb,UAAW,QACX,YAAa,QAGf,OACA,OACE,eAAgB,KAGlB,cACE,OAAQ,QAGV,OACE,UAAW,OAEb,gBACE,QAAS,EAGX,0IACE,QAAS,eAIX,cACA,aACA,cAHA,OAIE,mBAAoB,OAGtB,6BACA,4BACA,6BAHA,sBAIE,OAAQ,QAGV,mBACE,QAAS,EACT,aAAc,KAGhB,SACE,OAAQ,SAGV,SACE,UAAW,EACX,QAAS,EACT,OAAQ,EACR,Line truncated
+6
View File
@@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2023 Fonticons, Inc.
*/
:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{contLine truncated
+9
View File
@@ -0,0 +1,9 @@
/*!
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2023 Fonticons, Inc.
*/
.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animatLine truncated
.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57Line truncated
.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}
+6
View File
@@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2023 Fonticons, Inc.
*/
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}
+6
View File
@@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2023 Fonticons, Inc.
*/
@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
+395
View File
@@ -0,0 +1,395 @@
<!DOCTYPE html>
<html lang="en" data-bs-theme="light">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../img/favicon.ico">
<title>DOXA editor - DOXA Notes 🦅</title>
<link href="../css/bootstrap.min.css" rel="stylesheet">
<link href="../css/fontawesome.min.css" rel="stylesheet">
<link href="../css/brands.min.css" rel="stylesheet">
<link href="../css/solid.min.css" rel="stylesheet">
<link href="../css/v4-font-face.min.css" rel="stylesheet">
<link href="../css/base.css" rel="stylesheet">
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" >
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
</head>
<body>
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="..">DOXA Notes 🦅</a>
<!-- Expander button -->
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Expanded navigation -->
<div id="navbar-collapse" class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav">
<li class="nav-item">
<a href=".." class="nav-link">Home</a>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle active" aria-current="page" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - Česky</a>
<ul class="dropdown-menu">
<li>
<a href="../install/" class="dropdown-item">Instalace</a>
</li>
<li>
<a href="./" class="dropdown-item active" aria-current="page">DOXA editor</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - English</a>
<ul class="dropdown-menu">
<li>
<a href="../install_en/" class="dropdown-item">Install</a>
</li>
<li>
<a href="../editor_en/" class="dropdown-item">DOXA editor</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav ms-md-auto">
<li class="nav-item">
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal">
<i class="fa fa-search"></i> Search
</a>
</li>
<li class="nav-item">
<a rel="prev" href="../install/" class="nav-link">
<i class="fa fa-arrow-left"></i> Previous
</a>
</li>
<li class="nav-item">
<a rel="next" href="../install_en/" class="nav-link">
Next <i class="fa fa-arrow-right"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3"><div class="navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
<div class="navbar-header">
<button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target="#toc-collapse" title="Table of Contents">
<span class="fa fa-angle-down"></span>
</button>
</div>
<div id="toc-collapse" class="navbar-collapse collapse card bg-body-tertiary">
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="2"><a href="#vytvoreni-nove-poznamky" class="nav-link">Vytvoření nové poznámky</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#slash-command-rychla-napoveda-prikazu" class="nav-link">Slash Command - Rychlá nápověda příkazú</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#tagy" class="nav-link">Tagy</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#editace-a-mazani" class="nav-link">Editace a mazání</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#presouvani-poradi-poznamek" class="nav-link">Přesouvání pořadí poznámek</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#prepinani-vzhledu" class="nav-link">Přepínání vzhledu</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#automaticke-ukladani" class="nav-link">Automatické ukládání</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#manualni-ulozeni" class="nav-link">Manuální uložení</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#import-export" class="nav-link">Import / Export</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#export-do-markdown" class="nav-link">Export do Markdown</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#vyhledavani-filtrace" class="nav-link">Vyhledávání (Filtrace)</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#slozky" class="nav-link">Složky</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#bezpecnost-a-zalohy" class="nav-link">Bezpečnost a zálohy</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#caste-problemy" class="nav-link">Časté problémy</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#markdown" class="nav-link">Markdown</a>
<ul class="nav flex-column">
</ul>
</li>
</ul>
</div>
</div></div>
<div class="col-md-9" role="main">
<h2 id="vytvoreni-nove-poznamky">Vytvoření nové poznámky</h2>
<ul>
<li>Klikni na tlačítko ➕ Nová poznámka a zadej název.</li>
<li>Položka se objeví v seznamu. Klikem načteš název a obsah do editoru nahoře.</li>
<li>Uprav obsah a klikni Uložit nyní.</li>
</ul>
<h2 id="slash-command-rychla-napoveda-prikazu">Slash Command - Rychlá nápověda příkazú</h2>
<pre><code>1. Napíšete / v editoru → objeví se menu s příkazy
2. Filtrování Menu se filtruje podle dalšího textu (např. `/da` zobrazí `/date`)
3. Navigace:
↓↑ = Pohyb nahoru/dolů v menu
Enter/Tab = Výběr aktuálního příkazu
Escape = Zavření menu
4. Kliknutí na příkaz Vložení na místo kurzoru
5. Automatické zavření když kliknete mimo
</code></pre>
<p>Dostupné slash commands:</p>
<pre><code> /date - Vložit dnešní datum (📅)
/time - Vložit čas (🕐)
/code - Inline kód (💻)
/codeblock - Blok kódu (📝)
/link - Vložit odkaz (🔗)
/image - Vložit obrázek (🖼)
/table - Vložit tabulku (▦)
/quote - Citace (❝)
/hr - Vodorovná čára (—)
/task - Úkol/checkbox (☐)
/list - Odrážkový seznam (•)
/h1 - H1 Nadpis
/h2 - H2 Nadpis
/h3 - H3 Nadpis
</code></pre>
<h2 id="tagy">Tagy</h2>
<p>Tagy jsou slova nebo fráze, která popisuje obsah poznámky. V aplikaci Doxa díky nim můžete filtrovat poznámky podle tagu.</p>
<p>Klikni do pole tagy a zadej název tagu (uloží se stejně s poznámkou).</p>
<p>Poznámku pomocí tagu pak vyhledáš v poli s lupou <strong>Filtrovat poznámky podle tagu...</strong></p>
<h2 id="editace-a-mazani">Editace a mazání</h2>
<p>Inline: klikni na poznámku, uprav obsah a stiskni Uložit nyní.</p>
<p>Modal: klikni na ikonu ✎ vedle položky pro pokročilou editaci v modal okně.</p>
<p>Mazání: ikona 🗑 u položky — po potvrzení se poznámka smaže.</p>
<h2 id="presouvani-poradi-poznamek">Přesouvání pořadí poznámek</h2>
<p>Použij šipky <strong>↑ / ↓</strong> u položek.</p>
<p>Nebo přetahuj položky (drag &amp; drop) na požadované místo — při přetažení se ukáže indikátor vložení.</p>
<h2 id="prepinani-vzhledu">Přepínání vzhledu</h2>
<p>V horním menu najdeš tlačítko pro přepínání vzhledu. Aplikace podporuje tři režimy:</p>
<ul>
<li>Světlý — ikona: ☀️</li>
<li>Tmavý — ikona: 🌙</li>
<li>Respektovat systém — ikona: 🌓 — aplikace bude sledovat systémovou volbu (prefers-color-scheme) a automaticky se přepne, pokud se změní systémový motiv.</li>
</ul>
<p>Kliknutím na tlačítko v menu cyklíš mezi režimy <strong>(Light → Dark → System)</strong>. Vybraná volba se uloží do localStorage pod klíčem doxa_theme a přetrvá mezi stránkami a obnovami. Pokud chceš volbu resetovat, otevři konzoli prohlížeče a spusť: localStorage.removeItem('doxa_theme') nebo vymaž storage v nástrojích pro vývojáře.</p>
<h2 id="automaticke-ukladani">Automatické ukládání</h2>
<p>Aplikace nyní automaticky ukládá změny poznámek lokálně během psaní (autosave). V běžném prohlížeči se změny ukládají do localStorage (klíč doxa_notes_v1) bez nutnosti manuálního ukládání — data se uloží po krátké prodlevě. Pokud aplikaci spouštíš v Electron/Node režimu, změny se zapisují přímo do lokálního souboru.</p>
<p><strong>Průběžně si úkládej i JSON soubor manuálně!!</strong></p>
<h2 id="manualni-ulozeni">Manuální uložení</h2>
<p>Vedle editoru najdeš tlačítko Uložit nyní. I když autosave ukládá průběžně, tlačítko je užitečné v těchto případech:</p>
<ul>
<li><strong>Okamžité uložení</strong> — provede persist bez čekání na autosave (užitečné před zavřením aplikace nebo pokud chcete rychlou jistotu, že jsou změny zapsány).</li>
<li><strong>Vizuální potvrzení</strong> — po uložení se zobrazí stav „Uloženo“, což dává uživateli okamžitou zpětnou vazbu.</li>
<li><strong>Bez stažení</strong> — tlačítko Uložit poznámku neprovádí stažení souboru; pokud chcete stáhnout JSON, použijte tlačítko Exportovat JSON.</li>
</ul>
<p>Pro přenos dat mezi zařízeními použijte tlačítko Exportovat JSON (stáhne soubor doxa.json), nebo z konzole spusťte saveNotesToFile(true).</p>
<h2 id="import-export">Import / Export</h2>
<p>Pro import klikni Importovat JSON a vyber soubor. Podporované formáty:</p>
<ul>
<li>Objekt s polem notes: { "notes": [ ... ] }</li>
<li>Přímo pole: [ { ... }, { ... } ]</li>
</ul>
<p>Export je nyní dostupný přes tlačítko Exportovat JSON (vedle tlačítka Uložit). Aplikace zároveň provádí autosave lokálně — nic neztratíte, pokud zapomenete manuálně uložit. Chcete-li stáhnout JSON přes skript, můžete také spustit v konzoli saveNotesToFile(true).</p>
<ul>
<li>Od verze 26.07.04 Import/Export: pole folder se ukládá do JSONu, zpětně kompatibilní se staršími daty (prázdné pole).</li>
</ul>
<h2 id="export-do-markdown">Export do Markdown</h2>
<p>Jednotlivou poznámku si můžete exportovat do Markdown.</p>
<p>Export je v formátu názevPoznámky.md</p>
<h2 id="vyhledavani-filtrace">Vyhledávání (Filtrace)</h2>
<ul>
<li>Filtrace: rozbalovač „📁 Všechny složky“ omezuje seznam pouze na vybranou složku.</li>
<li>Vyhledávání: pole vyhledává v názvu, obsahu, tagách i názvu složky (fulltext).</li>
</ul>
<h2 id="slozky">Složky</h2>
<ul>
<li>Složky: u poznámky vyplňte pole "Složka" nebo do obsahu napište řádek ve tvaru folder: Název (pole má nativní návrhy — seznam existujících složek).</li>
<li>Přiřazení lze také upravit ručně v poli Složka; změny se ukládají automaticky.</li>
</ul>
<h2 id="bezpecnost-a-zalohy">Bezpečnost a zálohy</h2>
<p>Výchozí režim je local‑first: data zůstávají ve tvém prohlížeči (localStorage) nebo lokálním souboru, aplikace je sama neodesílá.</p>
<h2 id="caste-problemy">Časté problémy</h2>
<ul>
<li>Při otevírání přes file:// může fetch statického JSONu selhávat — použij lokální server nebo Electron.</li>
<li>Přenos dat mezi zařízeními? Stáhni JSON a importuj ho na druhém zařízení.</li>
</ul>
<hr />
<h2 id="markdown">Markdown</h2>
<h3 id="editor-pouziva-markdown">Editor používá Markdown</h3>
<p>Editor pracuje s Markdown syntaxí. Všechny úpravy se ukládají jako Markdown (čistý text) — náhled ukazuje vykreslené HTML. Níže základní příklady (vložte je přímo do editoru nebo použijte tlačítka v toolbaru):</p>
<pre><code class="language-md">Tučné: **tučný text**
Kurzíva: *kurzíva*
Přeškrtnutí: ~~přeškrtnuté~~
Inline kód: `kód`
Kódový blok:
</code></pre>
<p>console.log('hello')</p>
<pre><code>Nadpisy:
# Nadpis H1
## Nadpis H2
### Nadpis H3
Seznam (odrážky):
- položka 1
- položka 2
Číslovaný seznam:
1. první
2. druhý
Citace:
&gt; Toto je citace
Tabulka:
| Sloupec 1 | Sloupec 2 |
| --- | --- |
| bunka 1 | bunka 2 |
| bunka 3 | bunka 4 |
Obrázek (referenční URL):
![alt text](https://example.com/obrazek.png)
Odkaz:
[text](https://example.com)
Úkoly (task list):
- [ ] nedokončeno
- [x] hotovo
</code></pre>
<h4 id="dulezite-tipy">Důležité tipy:</h4>
<ul>
<li>Kliknutím na tlačítka v toolbaru vložíte potřebné Markdown tokeny automaticky.</li>
<li>Stiskněte Ctrl/Cmd+B pro tučné, Ctrl/Cmd+I pro kurzívu a Ctrl/Cmd+` pro inline kód.</li>
<li>Tlačítko Náhled přepne vykreslení Markdownu; používejte jej k ověření výsledku.</li>
<li>Tlačítko Tabulka (▦) vloží šablonu tabulky a během vložení vás vyzve na počet sloupců a řádků.</li>
<li>Obrázky vkládejte jako URL — aplikace obrázky nesynchronizuje ani nahrává.</li>
<li>Markdown je přenosný: poznámky zůstávají čitelné i bez aplikace (export/import).</li>
</ul></div>
</div>
</div>
<footer class="col-md-12">
<hr>
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
</footer>
<script src="../js/bootstrap.bundle.min.js"></script>
<script>
var base_url = "..",
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
</script>
<script src="../js/base.js"></script>
<script src="../search/main.js"></script>
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="searchModalLabel">Search</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>From here you can search these documents. Enter your search terms below.</p>
<form>
<div class="form-group">
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here">
</div>
</form>
<div id="mkdocs-search-results" data-no-results-text="No results found"></div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th style="width: 20%;">Keys</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="help shortcut"><kbd>?</kbd></td>
<td>Open this help</td>
</tr>
<tr>
<td class="next shortcut"><kbd>n</kbd></td>
<td>Next page</td>
</tr>
<tr>
<td class="prev shortcut"><kbd>p</kbd></td>
<td>Previous page</td>
</tr>
<tr>
<td class="search shortcut"><kbd>s</kbd></td>
<td>Search</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
</body>
</html>
+396
View File
@@ -0,0 +1,396 @@
<!DOCTYPE html>
<html lang="en" data-bs-theme="light">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../img/favicon.ico">
<title>DOXA editor - DOXA Notes 🦅</title>
<link href="../css/bootstrap.min.css" rel="stylesheet">
<link href="../css/fontawesome.min.css" rel="stylesheet">
<link href="../css/brands.min.css" rel="stylesheet">
<link href="../css/solid.min.css" rel="stylesheet">
<link href="../css/v4-font-face.min.css" rel="stylesheet">
<link href="../css/base.css" rel="stylesheet">
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" >
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
</head>
<body>
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="..">DOXA Notes 🦅</a>
<!-- Expander button -->
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Expanded navigation -->
<div id="navbar-collapse" class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav">
<li class="nav-item">
<a href=".." class="nav-link">Home</a>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - Česky</a>
<ul class="dropdown-menu">
<li>
<a href="../install/" class="dropdown-item">Instalace</a>
</li>
<li>
<a href="../editor/" class="dropdown-item">DOXA editor</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle active" aria-current="page" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - English</a>
<ul class="dropdown-menu">
<li>
<a href="../install_en/" class="dropdown-item">Install</a>
</li>
<li>
<a href="./" class="dropdown-item active" aria-current="page">DOXA editor</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav ms-md-auto">
<li class="nav-item">
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal">
<i class="fa fa-search"></i> Search
</a>
</li>
<li class="nav-item">
<a rel="prev" href="../install_en/" class="nav-link">
<i class="fa fa-arrow-left"></i> Previous
</a>
</li>
<li class="nav-item">
<a rel="next" class="nav-link disabled">
Next <i class="fa fa-arrow-right"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3"><div class="navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
<div class="navbar-header">
<button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target="#toc-collapse" title="Table of Contents">
<span class="fa fa-angle-down"></span>
</button>
</div>
<div id="toc-collapse" class="navbar-collapse collapse card bg-body-tertiary">
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="2"><a href="#create-a-new-note" class="nav-link">Create a new note</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#slash-command-quick-command-help" class="nav-link">Slash Command - Quick command help</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#tags" class="nav-link">Tags</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#editing-and-deleting" class="nav-link">Editing and deleting</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#moving-the-order-of-notes" class="nav-link">Moving the order of notes</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#switching-the-appearance" class="nav-link">Switching the appearance</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#autosave" class="nav-link">Autosave</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#manual-saving" class="nav-link">Manual saving</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#import-export" class="nav-link">Import / Export</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#export-to-markdown" class="nav-link">Export to Markdown</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#search-filtration" class="nav-link">Search (Filtration)</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#folders" class="nav-link">Folders</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#security-and-backups" class="nav-link">Security and backups</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#common-problems" class="nav-link">Common problems</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#markdown" class="nav-link">Markdown</a>
<ul class="nav flex-column">
</ul>
</li>
</ul>
</div>
</div></div>
<div class="col-md-9" role="main">
<h2 id="create-a-new-note">Create a new note</h2>
<ul>
<li>Click the ➕ New note button and enter a name.</li>
<li>The item will appear in the list. Click to load the name and content into the editor above.</li>
<li>Edit the content and click Save now.</li>
</ul>
<h2 id="slash-command-quick-command-help">Slash Command - Quick command help</h2>
<ol>
<li>Type / in the editor → a menu with commands will appear</li>
<li>Filtering The menu is filtered by the next text (e.g. <code>/da</code> will display <code>/date</code>)</li>
<li>Navigation:
↓↑ = Move up/down in the menu
Enter/Tab = Select the current command
Escape = Close the menu</li>
<li>Click on the command Insert at the cursor position</li>
<li>Automatically close when clicking outside</li>
</ol>
<p>Available slash commands:</p>
<pre><code>/date - Insert today's date (📅)
/time - Insert time (🕐)
/code - Inline code (💻)
/codeblock - Code block (📝)
/link - Insert link (🔗)
/image - Insert image (🖼)
/table - Insert table (▦)
/quote - Quote (❝)
/hr - Horizontal line (—)
/task - Task/checkbox (☐)
/list - Bulleted list (•)
/h1 - H1 Heading
/h2 - H2 Heading
/h3 - H3 Heading
</code></pre>
<h2 id="tags">Tags</h2>
<p>Tags are words or phrases that describe the content of a note. In the Doxa application, they allow you to filter notes by tag.</p>
<p>Click in the tags field and enter the name of the tag (it will be saved with the note).</p>
<p>You can then search for a note using the tag in the magnifying glass field <strong>Filter notes by tag...</strong></p>
<h2 id="editing-and-deleting">Editing and deleting</h2>
<p>Inline: click on the note, edit the content and press Save now.</p>
<p>Modal: click on the ✎ icon next to the item for advanced editing in the modal window.</p>
<p>Deleting: the 🗑 icon next to the item — after confirmation, the note will be deleted.</p>
<h2 id="moving-the-order-of-notes">Moving the order of notes</h2>
<p>Use the <strong>↑ / ↓</strong> arrows on the items.</p>
<p>Or drag and drop items to the desired location — the insertion indicator will appear when dragging.</p>
<h2 id="switching-the-appearance">Switching the appearance</h2>
<p>You will find a button for switching the appearance in the top menu. The application supports three modes:</p>
<ul>
<li>Light — icon: ☀️</li>
<li>Dark — icon: 🌙</li>
<li>Respect system — icon: 🌓 — the application will follow the system choice (prefers-color-scheme) and will automatically switch if the system theme changes.</li>
</ul>
<p>By clicking the button in the menu you can cycle between modes <strong>(Light → Dark → System)</strong>. The selected option is saved in localStorage under the doxa_theme key and persists between pages and refreshes. If you want to reset the option, open the browser console and run: localStorage.removeItem('doxa_theme') or clear the storage in the developer tools.</p>
<h2 id="autosave">Autosave</h2>
<p>The application now automatically saves changes to notes locally while writing (autosave). In a regular browser, changes are saved to localStorage (doxa_notes_v1 key) without the need for manual saving — the data is saved after a short delay. If you run the application in Electron/Node mode, changes are written directly to the local file.</p>
<p><strong>Save the JSON file manually as you go!!</strong></p>
<h2 id="manual-saving">Manual saving</h2>
<p>Next to the editor you will find a Save Now button. Even though autosave saves continuously, the button is useful in the following cases:</p>
<ul>
<li><strong>Immediate save</strong> — will persist without waiting for autosave (useful before closing the application or if you want a quick confirmation that the changes are written).</li>
<li><strong>Visual confirmation</strong> — after saving, the status "Saved" will be displayed, giving the user immediate feedback.</li>
<li><strong>No download</strong> — the Save note button does not download the file; if you want to download JSON, use the Export JSON button.</li>
</ul>
<p>To transfer data between devices, use the Export JSON button (which will download the doxa.json file), or run saveNotesToFile(true) from the console.</p>
<h2 id="import-export">Import / Export</h2>
<p>To import, click Import JSON and select a file. Supported formats:</p>
<ul>
<li>Object with notes field: { "notes": [ ... ] }</li>
<li>Direct field: [ { ... }, { ... } ]</li>
</ul>
<p>Export is now available via the Export JSON button (next to the Save button). The application also performs autosave locally — you won't lose anything if you forget to save manually. To download JSON via a script, you can also run saveNotesToFile(true) in the console.</p>
<ul>
<li>Since version 26.07.04 Import/Export: the folder field is saved in JSON, backward compatible with older data (empty field).</li>
</ul>
<h2 id="export-to-markdown">Export to Markdown</h2>
<p>You can export an individual note to Markdown.</p>
<p>The export is in the format názevPoznamky.md</p>
<h2 id="search-filtration">Search (Filtration)</h2>
<ul>
<li>Filtering: the "📁 All folders" drop-down limits the list to only the selected folder.</li>
<li>Search: the field searches in the name, content, tags and folder name (fulltext).</li>
</ul>
<h2 id="folders">Folders</h2>
<ul>
<li>Folders: fill in the "Folder" field for the note or write a line in the content in the form folder: Name (the field has native suggestions — a list of existing folders).</li>
<li>Assignments can also be edited manually in the Folder field; changes are saved automatically.</li>
</ul>
<h2 id="security-and-backups">Security and backups</h2>
<p>The default mode is local-first: data remains in your browser (localStorage) or a local file, the application does not send it itself.</p>
<h2 id="common-problems">Common problems</h2>
<ul>
<li>When opening via file://, fetching static JSON may fail — use a local server or Electron.</li>
<li>Transferring data between devices? Download JSON and import it on the second device.</li>
</ul>
<hr />
<h2 id="markdown">Markdown</h2>
<h3 id="editor-uses-markdown">Editor uses Markdown</h3>
<p>The editor works with Markdown syntax. All edits are saved as Markdown (plain text) — the preview shows the rendered HTML. Below are basic examples (paste them directly into the editor or use the buttons in the toolbar):</p>
<pre><code class="language-md">Bold: **bold text**
Italic: *italic*
Strikethrough: ~~strikethrough~~
Inline code: `code`
Code block:
</code></pre>
<p>console.log('hello')</p>
<pre><code>Headings:
# Heading H1
## Heading H2
### Heading H3
List (bullets):
- item 1
- item 2
Numbered list:
1. first
2. second
Quote:
&gt; This is a quote
Table:
| Column 1 | Column 2 |
| --- | --- |
| cell 1 | cell 2 |
| cell 3 | cell 4 |
Image (reference URL):
![alt text](https://example.com/image.png)
Link:
[text](https://example.com)
Task list:
- [ ] not completed
- [x] done
</code></pre>
<h4 id="important-tips">Important tips:</h4>
<ul>
<li>Click the toolbar buttons to insert the necessary Markdown tokens automatically.</li>
<li>Press Ctrl/Cmd+B for bold, Ctrl/Cmd+I for italic, and Ctrl/Cmd+` for inline code.</li>
<li>The Preview button toggles Markdown rendering; use it to verify the result.</li>
<li>The Table button (▦) inserts a table template and prompts you for a number of characters during insertion columns and rows.</li>
<li>Insert images as URLs — the app does not sync or upload images.</li>
<li>Markdown is portable: notes remain readable even without the app (export/import).</li>
</ul></div>
</div>
</div>
<footer class="col-md-12">
<hr>
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
</footer>
<script src="../js/bootstrap.bundle.min.js"></script>
<script>
var base_url = "..",
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
</script>
<script src="../js/base.js"></script>
<script src="../search/main.js"></script>
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="searchModalLabel">Search</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>From here you can search these documents. Enter your search terms below.</p>
<form>
<div class="form-group">
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here">
</div>
</form>
<div id="mkdocs-search-results" data-no-results-text="No results found"></div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th style="width: 20%;">Keys</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="help shortcut"><kbd>?</kbd></td>
<td>Open this help</td>
</tr>
<tr>
<td class="next shortcut"><kbd>n</kbd></td>
<td>Next page</td>
</tr>
<tr>
<td class="prev shortcut"><kbd>p</kbd></td>
<td>Previous page</td>
</tr>
<tr>
<td class="search shortcut"><kbd>s</kbd></td>
<td>Search</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

+208
View File
@@ -0,0 +1,208 @@
<!DOCTYPE html>
<html lang="en" data-bs-theme="light">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="None">
<link rel="shortcut icon" href="img/favicon.ico">
<title>DOXA Notes 🦅</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/fontawesome.min.css" rel="stylesheet">
<link href="css/brands.min.css" rel="stylesheet">
<link href="css/solid.min.css" rel="stylesheet">
<link href="css/v4-font-face.min.css" rel="stylesheet">
<link href="css/base.css" rel="stylesheet">
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" >
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
</head>
<body class="homepage">
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href=".">DOXA Notes 🦅</a>
<!-- Expander button -->
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Expanded navigation -->
<div id="navbar-collapse" class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav">
<li class="nav-item">
<a href="." class="nav-link active" aria-current="page">Home</a>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - Česky</a>
<ul class="dropdown-menu">
<li>
<a href="install/" class="dropdown-item">Instalace</a>
</li>
<li>
<a href="editor/" class="dropdown-item">DOXA editor</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - English</a>
<ul class="dropdown-menu">
<li>
<a href="install_en/" class="dropdown-item">Install</a>
</li>
<li>
<a href="editor_en/" class="dropdown-item">DOXA editor</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav ms-md-auto">
<li class="nav-item">
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal">
<i class="fa fa-search"></i> Search
</a>
</li>
<li class="nav-item">
<a rel="prev" class="nav-link disabled">
<i class="fa fa-arrow-left"></i> Previous
</a>
</li>
<li class="nav-item">
<a rel="next" href="install/" class="nav-link">
Next <i class="fa fa-arrow-right"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3"><div class="navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
<div class="navbar-header">
<button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target="#toc-collapse" title="Table of Contents">
<span class="fa fa-angle-down"></span>
</button>
</div>
<div id="toc-collapse" class="navbar-collapse collapse card bg-body-tertiary">
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="1"><a href="#doxa-notes-knowledge-base" class="nav-link">DOXA Notes Knowledge Base 🦅</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="1"><a href="#znalostni-databaze-doxa-notes" class="nav-link">Znalostní databáze DOXA Notes 🦅</a>
<ul class="nav flex-column">
</ul>
</li>
</ul>
</div>
</div></div>
<div class="col-md-9" role="main">
<h1 id="doxa-notes-knowledge-base">DOXA Notes Knowledge Base 🦅</h1>
<p><strong>Welcome to the DOXA Notes Knowledge Base / Wiki 🦅.</strong></p>
<p>You can find all the instructions in the Wiki section. The database is gradually expanding with more features.</p>
<h3 id="go-back-to-web"><a href="https://doxa-notes.org/index.html">Go back to WEB</a></h3>
<h3 id="go-to-app"><a href="https://app.doxa-notes.org/">Go to app</a></h3>
<h1 id="znalostni-databaze-doxa-notes">Znalostní databáze DOXA Notes 🦅</h1>
<p><strong>Vítám tě v Znalostní databázy / Wiki DOXA Notes 🦅.</strong></p>
<p>Všechny návody najdeš v sekci Wiki. Databáze se postupně rozšiřuje z přibívajícími funkcemi.</p>
<h3 id="jit-zpet-na-web"><a href="https://doxa-notes.org/index.html">Jít zpět na WEB</a></h3>
<h3 id="jit-do-aplikace"><a href="https://app.doxa-notes.org/">Jít do aplikace</a></h3></div>
</div>
</div>
<footer class="col-md-12">
<hr>
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
</footer>
<script src="js/bootstrap.bundle.min.js"></script>
<script>
var base_url = ".",
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
</script>
<script src="js/base.js"></script>
<script src="search/main.js"></script>
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="searchModalLabel">Search</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>From here you can search these documents. Enter your search terms below.</p>
<form>
<div class="form-group">
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here">
</div>
</form>
<div id="mkdocs-search-results" data-no-results-text="No results found"></div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th style="width: 20%;">Keys</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="help shortcut"><kbd>?</kbd></td>
<td>Open this help</td>
</tr>
<tr>
<td class="next shortcut"><kbd>n</kbd></td>
<td>Next page</td>
</tr>
<tr>
<td class="prev shortcut"><kbd>p</kbd></td>
<td>Previous page</td>
</tr>
<tr>
<td class="search shortcut"><kbd>s</kbd></td>
<td>Search</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
</body>
</html>
<!--
MkDocs version : 1.6.1
Build Date UTC : 2026-07-26 16:00:45.320551+00:00
-->
+224
View File
@@ -0,0 +1,224 @@
<!DOCTYPE html>
<html lang="en" data-bs-theme="light">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../img/favicon.ico">
<title>Instalace - DOXA Notes 🦅</title>
<link href="../css/bootstrap.min.css" rel="stylesheet">
<link href="../css/fontawesome.min.css" rel="stylesheet">
<link href="../css/brands.min.css" rel="stylesheet">
<link href="../css/solid.min.css" rel="stylesheet">
<link href="../css/v4-font-face.min.css" rel="stylesheet">
<link href="../css/base.css" rel="stylesheet">
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" >
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
</head>
<body>
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="..">DOXA Notes 🦅</a>
<!-- Expander button -->
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Expanded navigation -->
<div id="navbar-collapse" class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav">
<li class="nav-item">
<a href=".." class="nav-link">Home</a>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle active" aria-current="page" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - Česky</a>
<ul class="dropdown-menu">
<li>
<a href="./" class="dropdown-item active" aria-current="page">Instalace</a>
</li>
<li>
<a href="../editor/" class="dropdown-item">DOXA editor</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - English</a>
<ul class="dropdown-menu">
<li>
<a href="../install_en/" class="dropdown-item">Install</a>
</li>
<li>
<a href="../editor_en/" class="dropdown-item">DOXA editor</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav ms-md-auto">
<li class="nav-item">
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal">
<i class="fa fa-search"></i> Search
</a>
</li>
<li class="nav-item">
<a rel="prev" href=".." class="nav-link">
<i class="fa fa-arrow-left"></i> Previous
</a>
</li>
<li class="nav-item">
<a rel="next" href="../editor/" class="nav-link">
Next <i class="fa fa-arrow-right"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3"><div class="navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
<div class="navbar-header">
<button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target="#toc-collapse" title="Table of Contents">
<span class="fa fa-angle-down"></span>
</button>
</div>
<div id="toc-collapse" class="navbar-collapse collapse card bg-body-tertiary">
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="1"><a href="#instalace" class="nav-link">Instalace</a>
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="2"><a href="#rychly-start-pouze-pro-variantu-spousteni-aplikace-u-sebe-lokalne" class="nav-link">Rychlý start - pouze pro variantu spouštění aplikace u sebe lokalně</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#desktop-aplikace" class="nav-link">Desktop aplikace</a>
<ul class="nav flex-column">
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div></div>
<div class="col-md-9" role="main">
<h1 id="instalace">Instalace</h1>
<h2 id="rychly-start-pouze-pro-variantu-spousteni-aplikace-u-sebe-lokalne">Rychlý start - pouze pro variantu spouštění aplikace u sebe lokalně</h2>
<p>Pokud aplikaci spouštíš z webu https://doxa-notes.org/ pokračuj dalším bodem!</p>
<p><a href="https://codeberg.org/Kankys/doxa">Stáhni/klonuj repozitář</a> a přejdi do složky aplikace:</p>
<pre><code class="language-bash">cd doxa/web_app
</code></pre>
<p>Spusť jednoduchý lokální server (doporučeno):</p>
<pre><code class="language-bash">python3 -m http.server 8000
</code></pre>
<p>a otevři v prohlížeči: <code>http://localhost:8000</code> alternativně můžeš použít Node.js a pomocí npm install nainstaluj live-server a následně spusť pomocí příkazu: <code>live-server</code> ve složce aplikace.</p>
<h2 id="desktop-aplikace">Desktop aplikace</h2>
<ol>
<li>
<p>Desktop aplikace je dostupná pro <strong>Linux</strong>. Stačí si ji stáhnout z <a href="https://codeberg.org/Kankys/doxa/releases">Codeberg sekce releases</a> a spustit.</p>
</li>
<li>
<p>Staženou aplikaci spustíš spustíš otevřením souboru AppImage</p>
</li>
<li>
<p>Soubory aplikací najdeš ve složce:</p>
</li>
</ol>
<pre><code class="language-bash">Linux: ~/.config/doxa/
</code></pre>
<p><strong>Nezapomeň si dělat pravidélné zálohy JSON (exportovat JSON).</strong></p>
<p>Nezapomeň si pravidelně aktualizovat aplikaci, abys mohl mít nejnovější verzi.</p>
<p>POZOR: v desktop verzi se nachází chyba s přidáváním nových poznámek. Aby jste mohli přidat novou poznámku, musíte nejprve kliknout na jinou záložku v menu a poté zpět na záložku poznámek!</p>
<p>Desktop app: nevycházejí s pravidelností jako web app, z důvodu buildu a náročnosti na zdroje. Desktop app bude vydáván pouze po větších funkčních změnách.</p></div>
</div>
</div>
<footer class="col-md-12">
<hr>
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
</footer>
<script src="../js/bootstrap.bundle.min.js"></script>
<script>
var base_url = "..",
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
</script>
<script src="../js/base.js"></script>
<script src="../search/main.js"></script>
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="searchModalLabel">Search</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>From here you can search these documents. Enter your search terms below.</p>
<form>
<div class="form-group">
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here">
</div>
</form>
<div id="mkdocs-search-results" data-no-results-text="No results found"></div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th style="width: 20%;">Keys</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="help shortcut"><kbd>?</kbd></td>
<td>Open this help</td>
</tr>
<tr>
<td class="next shortcut"><kbd>n</kbd></td>
<td>Next page</td>
</tr>
<tr>
<td class="prev shortcut"><kbd>p</kbd></td>
<td>Previous page</td>
</tr>
<tr>
<td class="search shortcut"><kbd>s</kbd></td>
<td>Search</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
</body>
</html>
+224
View File
@@ -0,0 +1,224 @@
<!DOCTYPE html>
<html lang="en" data-bs-theme="light">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="../img/favicon.ico">
<title>Install - DOXA Notes 🦅</title>
<link href="../css/bootstrap.min.css" rel="stylesheet">
<link href="../css/fontawesome.min.css" rel="stylesheet">
<link href="../css/brands.min.css" rel="stylesheet">
<link href="../css/solid.min.css" rel="stylesheet">
<link href="../css/v4-font-face.min.css" rel="stylesheet">
<link href="../css/base.css" rel="stylesheet">
<link id="hljs-light" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github.min.css" >
<link id="hljs-dark" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/styles/github-dark.min.css" disabled>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.8.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
</head>
<body>
<div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="..">DOXA Notes 🦅</a>
<!-- Expander button -->
<button type="button" class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navbar-collapse" aria-controls="navbar-collapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Expanded navigation -->
<div id="navbar-collapse" class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav">
<li class="nav-item">
<a href=".." class="nav-link">Home</a>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - Česky</a>
<ul class="dropdown-menu">
<li>
<a href="../install/" class="dropdown-item">Instalace</a>
</li>
<li>
<a href="../editor/" class="dropdown-item">DOXA editor</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle active" aria-current="page" role="button" data-bs-toggle="dropdown" aria-expanded="false">Wiki - English</a>
<ul class="dropdown-menu">
<li>
<a href="./" class="dropdown-item active" aria-current="page">Install</a>
</li>
<li>
<a href="../editor_en/" class="dropdown-item">DOXA editor</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav ms-md-auto">
<li class="nav-item">
<a href="#" class="nav-link" data-bs-toggle="modal" data-bs-target="#mkdocs_search_modal">
<i class="fa fa-search"></i> Search
</a>
</li>
<li class="nav-item">
<a rel="prev" href="../editor/" class="nav-link">
<i class="fa fa-arrow-left"></i> Previous
</a>
</li>
<li class="nav-item">
<a rel="next" href="../editor_en/" class="nav-link">
Next <i class="fa fa-arrow-right"></i>
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3"><div class="navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
<div class="navbar-header">
<button type="button" class="navbar-toggler collapsed" data-bs-toggle="collapse" data-bs-target="#toc-collapse" title="Table of Contents">
<span class="fa fa-angle-down"></span>
</button>
</div>
<div id="toc-collapse" class="navbar-collapse collapse card bg-body-tertiary">
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="1"><a href="#installation" class="nav-link">Installation</a>
<ul class="nav flex-column">
<li class="nav-item" data-bs-level="2"><a href="#quick-start-only-for-the-option-of-running-the-application-locally" class="nav-link">Quick start - only for the option of running the application locally</a>
<ul class="nav flex-column">
</ul>
</li>
<li class="nav-item" data-bs-level="2"><a href="#desktop-application" class="nav-link">Desktop application</a>
<ul class="nav flex-column">
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div></div>
<div class="col-md-9" role="main">
<h1 id="installation">Installation</h1>
<h2 id="quick-start-only-for-the-option-of-running-the-application-locally">Quick start - only for the option of running the application locally</h2>
<p>If you are running the application from the website https://doxa-notes.org/, continue with the next point!</p>
<p><a href="https://codeberg.org/Kankys/doxa">Download/clone the repository</a> and go to the application folder:</p>
<pre><code class="language-bash">cd doxa/web_app
</code></pre>
<p>Start a simple local server (recommended):</p>
<pre><code class="language-bash">python3 -m http.server 8000
</code></pre>
<p>and open in the browser: <code>http://localhost:8000</code> alternatively you can use Node.js and install live-server using npm install and then run it using the command: <code>live-server</code> in the application folder.</p>
<h2 id="desktop-application">Desktop application</h2>
<ol>
<li>
<p>The desktop application is available for <strong>Linux</strong>. Just download it from <a href="https://codeberg.org/Kankys/doxa/releases">Codeberg releases section</a> and run it.</p>
</li>
<li>
<p>Run the downloaded application by opening the AppImage file</p>
</li>
<li>
<p>You can find the application files in the folder:</p>
</li>
</ol>
<pre><code class="language-bash">Linux: ~/.config/doxa/
</code></pre>
<p><strong>Don't forget to make regular JSON backups (export JSON).</strong></p>
<p>Don't forget to update the application regularly to have the latest version.</p>
<p>ATTENTION: there is a bug in the desktop version with adding new notes. To be able to add a new note, you must first click on another tab in the menu and then back to the notes tab!</p>
<p>Desktop app: they do not come out as regularly as the web app, due to build and resource requirements. The desktop app will only be released after major functional changes.</p></div>
</div>
</div>
<footer class="col-md-12">
<hr>
<p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
</footer>
<script src="../js/bootstrap.bundle.min.js"></script>
<script>
var base_url = "..",
shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
</script>
<script src="../js/base.js"></script>
<script src="../search/main.js"></script>
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="searchModalLabel">Search</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>From here you can search these documents. Enter your search terms below.</p>
<form>
<div class="form-group">
<input type="search" class="form-control" placeholder="Search..." id="mkdocs-search-query" title="Type search term here">
</div>
</form>
<div id="mkdocs-search-results" data-no-results-text="No results found"></div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table">
<thead>
<tr>
<th style="width: 20%;">Keys</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td class="help shortcut"><kbd>?</kbd></td>
<td>Open this help</td>
</tr>
<tr>
<td class="next shortcut"><kbd>n</kbd></td>
<td>Next page</td>
</tr>
<tr>
<td class="prev shortcut"><kbd>p</kbd></td>
<td>Previous page</td>
</tr>
<tr>
<td class="search shortcut"><kbd>s</kbd></td>
<td>Search</td>
</tr>
</tbody>
</table>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
</body>
</html>
+287
View File
@@ -0,0 +1,287 @@
function getSearchTerm() {
var sPageURL = window.location.search.substring(1);
var sURLVariables = sPageURL.split('&');
for (var i = 0; i < sURLVariables.length; i++) {
var sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] == 'q') {
return sParameterName[1];
}
}
}
function applyTopPadding() {
// Update various absolute positions to match where the main container
// starts. This is necessary for handling multi-line nav headers, since
// that pushes the main container down.
var container = document.querySelector('body > .container');
var offset = container.offsetTop;
document.documentElement.style.scrollPaddingTop = offset + 'px';
document.querySelectorAll('.bs-sidebar.affix').forEach(function(sidebar) {
sidebar.style.top = offset + 'px';
});
}
document.addEventListener("DOMContentLoaded", function () {
var search_term = getSearchTerm();
var search_modal = new bootstrap.Modal(document.getElementById('mkdocs_search_modal'));
var keyboard_modal = new bootstrap.Modal(document.getElementById('mkdocs_keyboard_modal'));
if (search_term) {
search_modal.show();
}
// make sure search input gets autofocus every time modal opens.
document.getElementById('mkdocs_search_modal').addEventListener('shown.bs.modal', function() {
document.getElementById('mkdocs-search-query').focus();
});
// Close search modal when result is selected
// The links get added later so listen to parent
document.getElementById('mkdocs-search-results').addEventListener('click', function(e) {
if (e.target.tagName === 'A') {
search_modal.hide();
}
});
// Populate keyboard modal with proper Keys
document.querySelector('.help.shortcut kbd').innerHTML = keyCodes[shortcuts.help];
document.querySelector('.prev.shortcut kbd').innerHTML = keyCodes[shortcuts.previous];
document.querySelector('.next.shortcut kbd').innerHTML = keyCodes[shortcuts.next];
document.querySelector('.search.shortcut kbd').innerHTML = keyCodes[shortcuts.search];
// Keyboard navigation
document.addEventListener("keydown", function(e) {
if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return true;
var key = e.which || e.keyCode || window.event && window.event.keyCode;
var page;
switch (key) {
case shortcuts.next:
page = document.querySelector('.navbar a[rel="next"]');
break;
case shortcuts.previous:
page = document.querySelector('.navbar a[rel="prev"]');
break;
case shortcuts.search:
e.preventDefault();
keyboard_modal.hide();
search_modal.show();
document.getElementById('mkdocs-search-query').focus();
break;
case shortcuts.help:
search_modal.hide();
keyboard_modal.show();
break;
default: break;
}
if (page && page.hasAttribute('href')) {
keyboard_modal.hide();
window.location.href = page.getAttribute('href');
}
});
document.querySelectorAll('table').forEach(function(table) {
table.classList.add('table', 'table-striped', 'table-hover');
});
function showInnerDropdown(item) {
var popup = item.nextElementSibling;
popup.classList.add('show');
item.classList.add('open');
// First, close any sibling dropdowns.
var container = item.parentElement.parentElement;
container.querySelectorAll(':scope > .dropdown-submenu > a').forEach(function(el) {
if (el !== item) {
hideInnerDropdown(el);
}
});
var popupMargin = 10;
var maxBottom = window.innerHeight - popupMargin;
var bounds = item.getBoundingClientRect();
popup.style.left = bounds.right + 'px';
if (bounds.top + popup.clientHeight > maxBottom &&
bounds.top > window.innerHeight / 2) {
popup.style.top = (bounds.bottom - popup.clientHeight) + 'px';
popup.style.maxHeight = (bounds.bottom - popupMargin) + 'px';
} else {
popup.style.top = bounds.top + 'px';
popup.style.maxHeight = (maxBottom - bounds.top) + 'px';
}
}
function hideInnerDropdown(item) {
var popup = item.nextElementSibling;
popup.classList.remove('show');
item.classList.remove('open');
popup.scrollTop = 0;
var menu = popup.querySelector('.dropdown-menu');
if (menu) {
menu.scrollTop = 0;
}
var dropdown = popup.querySelector('.dropdown-submenu > a');
if (dropdown) {
dropdown.classList.remove('open');
}
}
document.querySelectorAll('.dropdown-submenu > a').forEach(function(item) {
item.addEventListener('click', function(e) {
if (item.nextElementSibling.classList.contains('show')) {
hideInnerDropdown(item);
} else {
showInnerDropdown(item);
}
e.stopPropagation();
e.preventDefault();
});
});
document.querySelectorAll('.dropdown-menu').forEach(function(menu) {
menu.parentElement.addEventListener('hide.bs.dropdown', function() {
menu.scrollTop = 0;
var dropdown = menu.querySelector('.dropdown-submenu > a');
if (dropdown) {
dropdown.classList.remove('open');
}
menu.querySelectorAll('.dropdown-menu .dropdown-menu').forEach(function(submenu) {
submenu.classList.remove('show');
});
});
});
applyTopPadding();
});
window.addEventListener('resize', applyTopPadding);
var scrollSpy = new bootstrap.ScrollSpy(document.body, {
target: '.bs-sidebar'
});
/* Prevent disabled links from causing a page reload */
document.querySelectorAll("li.disabled a").forEach(function(item) {
item.addEventListener("click", function(event) {
event.preventDefault();
});
});
// See https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes
// We only list common keys below. Obscure keys are omitted and their use is discouraged.
var keyCodes = {
8: 'backspace',
9: 'tab',
13: 'enter',
16: 'shift',
17: 'ctrl',
18: 'alt',
19: 'pause/break',
20: 'caps lock',
27: 'escape',
32: 'spacebar',
33: 'page up',
34: 'page down',
35: 'end',
36: 'home',
37: '&larr;',
38: '&uarr;',
39: '&rarr;',
40: '&darr;',
45: 'insert',
46: 'delete',
48: '0',
49: '1',
50: '2',
51: '3',
52: '4',
53: '5',
54: '6',
55: '7',
56: '8',
57: '9',
65: 'a',
66: 'b',
67: 'c',
68: 'd',
69: 'e',
70: 'f',
71: 'g',
72: 'h',
73: 'i',
74: 'j',
75: 'k',
76: 'l',
77: 'm',
78: 'n',
79: 'o',
80: 'p',
81: 'q',
82: 'r',
83: 's',
84: 't',
85: 'u',
86: 'v',
87: 'w',
88: 'x',
89: 'y',
90: 'z',
91: 'Left Windows Key / Left ⌘',
92: 'Right Windows Key',
93: 'Windows Menu / Right ⌘',
96: 'numpad 0',
97: 'numpad 1',
98: 'numpad 2',
99: 'numpad 3',
100: 'numpad 4',
101: 'numpad 5',
102: 'numpad 6',
103: 'numpad 7',
104: 'numpad 8',
105: 'numpad 9',
106: 'multiply',
107: 'add',
109: 'subtract',
110: 'decimal point',
111: 'divide',
112: 'f1',
113: 'f2',
114: 'f3',
115: 'f4',
116: 'f5',
117: 'f6',
118: 'f7',
119: 'f8',
120: 'f9',
121: 'f10',
122: 'f11',
123: 'f12',
124: 'f13',
125: 'f14',
126: 'f15',
127: 'f16',
128: 'f17',
129: 'f18',
130: 'f19',
131: 'f20',
132: 'f21',
133: 'f22',
134: 'f23',
135: 'f24',
144: 'num lock',
145: 'scroll lock',
186: '&semi;',
187: '&equals;',
188: '&comma;',
189: '&hyphen;',
190: '&period;',
191: '&quest;',
192: '&grave;',
219: '&lsqb;',
220: '&bsol;',
221: '&rsqb;',
222: '&apos;',
};
+7
View File
@@ -0,0 +1,7 @@
/*!
* Bootstrap v5.3.2 (https://getbootstrap.com/)
* Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slLine truncated
//# sourceMappingURL=bootstrap.bundle.min.js.map
@@ -0,0 +1 @@
{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","triggerTransitionEnd","dispatchEvent","Event","isElement","object","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","Object","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","call","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","toString","JSON","parse","decodeURIComponent","normalizeDataKey","chr","toLowerCase","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","prototype","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEvenLine truncated
+65
View File
@@ -0,0 +1,65 @@
function setColorMode(mode) {
// Switch between light/dark theme. `mode` is a string value of either 'dark' or 'light'.
var hljs_light = document.getElementById('hljs-light'),
hljs_dark = document.getElementById('hljs-dark');
document.documentElement.setAttribute('data-bs-theme', mode);
if (mode == 'dark') {
hljs_light.disabled = true;
hljs_dark.disabled = false;
} else {
hljs_dark.disabled = true;
hljs_light.disabled = false;
}
}
function updateModeToggle(mode) {
// Update icon and toggle checkmarks of color mode selector.
var menu = document.getElementById('theme-menu');
document.querySelectorAll('[data-bs-theme-value]')
.forEach(function(toggle) {
if (mode == toggle.getAttribute('data-bs-theme-value')) {
toggle.setAttribute('aria-pressed', 'true');
toggle.lastElementChild.classList.remove('d-none');
menu.firstElementChild.setAttribute('class', toggle.firstElementChild.getAttribute('class'));
} else {
toggle.setAttribute('aria-pressed', 'false');
toggle.lastElementChild.classList.add('d-none');
}
});
}
function onSystemColorSchemeChange(event) {
// Update site color mode to match system color mode.
setColorMode(event.matches ? 'dark' : 'light');
}
var mql = window.matchMedia('(prefers-color-scheme: dark)'),
defaultMode = document.documentElement.getAttribute('data-bs-theme'),
storedMode = localStorage.getItem('mkdocs-colormode');
if (storedMode && storedMode != 'auto') {
setColorMode(storedMode);
updateModeToggle(storedMode);
} else if (storedMode == 'auto' || defaultMode == 'auto') {
setColorMode(mql.matches ? 'dark' : 'light');
updateModeToggle('auto');
mql.addEventListener('change', onSystemColorSchemeChange);
} else {
setColorMode(defaultMode);
updateModeToggle(defaultMode);
}
document.querySelectorAll('[data-bs-theme-value]')
.forEach(function(toggle) {
toggle.addEventListener('click', function (e) {
var mode = e.currentTarget.getAttribute('data-bs-theme-value');
localStorage.setItem('mkdocs-colormode', mode);
if (mode == 'auto') {
setColorMode(mql.matches ? 'dark' : 'light');
mql.addEventListener('change', onSystemColorSchemeChange);
} else {
setColorMode(mode);
mql.removeEventListener('change', onSystemColorSchemeChange);
}
updateModeToggle(mode);
});
});
File diff suppressed because it is too large. Load diff
+109
View File
@@ -0,0 +1,109 @@
function getSearchTermFromLocation() {
var sPageURL = window.location.search.substring(1);
var sURLVariables = sPageURL.split('&');
for (var i = 0; i < sURLVariables.length; i++) {
var sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] == 'q') {
return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20'));
}
}
}
function joinUrl (base, path) {
if (path.substring(0, 1) === "/") {
// path starts with `/`. Thus it is absolute.
return path;
}
if (base.substring(base.length-1) === "/") {
// base ends with `/`
return base + path;
}
return base + "/" + path;
}
function escapeHtml (value) {
return value.replace(/&/g, '&amp;')
.replace(/"/g, '&quot;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
}
function formatResult (location, title, summary) {
return '<article><h3><a href="' + joinUrl(base_url, location) + '">'+ escapeHtml(title) + '</a></h3><p>' + escapeHtml(summary) +'</p></article>';
}
function displayResults (results) {
var search_results = document.getElementById("mkdocs-search-results");
while (search_results.firstChild) {
search_results.removeChild(search_results.firstChild);
}
if (results.length > 0){
for (var i=0; i < results.length; i++){
var result = results[i];
var html = formatResult(result.location, result.title, result.summary);
search_results.insertAdjacentHTML('beforeend', html);
}
} else {
var noResultsText = search_results.getAttribute('data-no-results-text');
if (!noResultsText) {
noResultsText = "No results found";
}
search_results.insertAdjacentHTML('beforeend', '<p>' + noResultsText + '</p>');
}
}
function doSearch () {
var query = document.getElementById('mkdocs-search-query').value;
if (query.length > min_search_length) {
if (!window.Worker) {
displayResults(search(query));
} else {
searchWorker.postMessage({query: query});
}
} else {
// Clear results for short queries
displayResults([]);
}
}
function initSearch () {
var search_input = document.getElementById('mkdocs-search-query');
if (search_input) {
search_input.addEventListener("keyup", doSearch);
}
var term = getSearchTermFromLocation();
if (term) {
search_input.value = term;
doSearch();
}
}
function onWorkerMessage (e) {
if (e.data.allowSearch) {
initSearch();
} else if (e.data.results) {
var results = e.data.results;
displayResults(results);
} else if (e.data.config) {
min_search_length = e.data.config.min_search_length-1;
}
}
if (!window.Worker) {
console.log('Web Worker API not supported');
// load index in main thread
$.getScript(joinUrl(base_url, "search/worker.js")).done(function () {
console.log('Loaded worker');
init();
window.postMessage = function (msg) {
onWorkerMessage({data: msg});
};
}).fail(function (jqxhr, settings, exception) {
console.error('Could not load worker.js');
});
} else {
// Wrap search in a web worker
var searchWorker = new Worker(joinUrl(base_url, "search/worker.js"));
searchWorker.postMessage({init: true});
searchWorker.onmessage = onWorkerMessage;
}
+1
View File
@@ -0,0 +1 @@
{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"DOXA Notes Knowledge Base \ud83e\udd85 Welcome to the DOXA Notes Knowledge Base / Wiki \ud83e\udd85. You can find all the instructions in the Wiki section. The database is gradually expanding with more features. Go back to WEB Go to app Znalostn\u00ed datab\u00e1ze DOXA Notes \ud83e\udd85 V\u00edt\u00e1m t\u011b v Znalostn\u00ed datab\u00e1zy / Wiki DOXA Notes \ud83e\udd85. V\u0161echny n\u00e1vody najde\u0161 v sekci Wiki. Datab\u00e1ze se postupn\u011b roz\u0161i\u0159uje z p\u0159ib\u00edvaj\u00edc\u00edmi funkcemi. J\u00edt zp\u011bt na WEB J\u00edt do aplikace","title":"Home"},{"location":"#doxa-notes-knowledge-base","text":"Welcome to the DOXA Notes Knowledge Base / Wiki \ud83e\udd85. You can find all the instructions in the Wiki section. The database is gradually expanding with more features.","title":"DOXA Notes Knowledge Base \ud83e\udd85"},{"location":"#go-back-to-web","text":"","title":"Go back to WEB"},{"location":"#go-to-app","text":"","title":"Go to app"},{"location":"#znalostni-databaze-doxa-notes","text":"V\u00edt\u00e1m t\u011b v Znalostn\u00ed datab\u00e1zy / Wiki DOXA Notes \ud83e\udd85. V\u0161echny n\u00e1vody najde\u0161 v sekci Wiki. Datab\u00e1ze se postupn\u011b roz\u0161i\u0159uje z p\u0159ib\u00edvaj\u00edc\u00edmi funkcemi.","title":"Znalostn\u00ed datab\u00e1ze DOXA Notes \ud83e\udd85"},{"location":"#jit-zpet-na-web","text":"","title":"J\u00edt zp\u011bt na WEB"},{"location":"#jit-do-aplikace","text":"","title":"J\u00edt do aplikace"},{"location":"editor/","text":"Vytvo\u0159en\u00ed nov\u00e9 pozn\u00e1mky Klikni na tla\u010d\u00edtko \u2795 Nov\u00e1 pozn\u00e1mka a zadej n\u00e1zev. Polo\u017eka se objev\u00ed v seznamu. Klikem na\u010dte\u0161 n\u00e1zev a obsah do editoru naho\u0159e. Uprav obsah a klikni Ulo\u017eit nyn\u00ed. Slash Command - Rychl\u00e1 n\u00e1pov\u011bda p\u0159\u00edkaz\u00fa 1. Nap\u00ed\u0161ete / v editoru \u2192 objev\u00ed se menu s p\u0159\u00edkazy 2. Filtrov\u00e1n\u00ed Menu se filtruje podle dal\u0161\u00edho textu (nap\u0159. `/da` zobraz\u00ed `/date`) 3. Navigace: \u2193\u2191 = Pohyb nahoru/dol\u016f v menu Enter/Tab = V\u00fdb\u011br aktu\u00e1ln\u00edho p\u0159\u00edkazu Escape = Zav\u0159en\u00ed menu 4. Kliknut\u00ed na p\u0159\u00edkaz Vlo\u017een\u00ed na m\u00edsto kurzoru 5. Automatick\u00e9 zav\u0159en\u00ed kdy\u017e kliknete mimo Dostupn\u00e9 slash commands: /date - Vlo\u017eit dne\u0161n\u00ed datum (\ud83d\udcc5) /time - Vlo\u017eit \u010das (\ud83d\udd50) /code - Inline k\u00f3d (\ud83d\udcbb) /codeblock - Blok k\u00f3du (\ud83d\udcdd) /link - Vlo\u017eit odkaz (\ud83d\udd17) /image - Vlo\u017eit obr\u00e1zek (\ud83d\uddbc) /table - Vlo\u017eit tabulku (\u25a6) /quote - Citace (\u275d) /hr - Vodorovn\u00e1 \u010d\u00e1ra (\u2014) /task - \u00dakol/checkbox (\u2610) /list - Odr\u00e1\u017ekov\u00fd seznam (\u2022) /h1 - H1 Nadpis /h2 - H2 Nadpis /h3 - H3 Nadpis Tagy Tagy jsou slova nebo fr\u00e1ze, kter\u00e1 popisuje obsah pozn\u00e1mky. V aplikaci Doxa d\u00edky nim m\u016f\u017eete filtrovat pozn\u00e1mky podle tagu. Klikni do pole tagy a zadej n\u00e1zev tagu (ulo\u017e\u00ed se stejn\u011b s pozn\u00e1mkou). Pozn\u00e1mku pomoc\u00ed tagu pak vyhled\u00e1\u0161 v poli s lupou Filtrovat pozn\u00e1mky podle tagu... Editace a maz\u00e1n\u00ed Inline: klikni na pozn\u00e1mku, uprav obsah a stiskni Ulo\u017eit nyn\u00ed. Modal: klikni na ikonu \u270e vedle polo\u017eky pro pokro\u010dilou editaci v modal okn\u011b. Maz\u00e1n\u00ed: ikona \ud83d\uddd1 u polo\u017eky \u2014 po potvrzen\u00ed se pozn\u00e1mka sma\u017ee. P\u0159esouv\u00e1n\u00ed po\u0159ad\u00ed pozn\u00e1mek Pou\u017eij \u0161ipky \u2191 / \u2193 u polo\u017eek. Nebo p\u0159etahuj polo\u017eky (drag & drop) na po\u017eadovan\u00e9 m\u00edsto \u2014 p\u0159i p\u0159eta\u017een\u00ed se uk\u00e1\u017ee indik\u00e1tor vlo\u017een\u00ed. P\u0159ep\u00edn\u00e1n\u00ed vzhledu V horn\u00edm menu najde\u0161 tla\u010d\u00edtko pro p\u0159ep\u00edn\u00e1n\u00ed vzhledu. Aplikace podporuje t\u0159i re\u017eimy: Sv\u011btl\u00fd \u2014 ikona: \u2600\ufe0f Tmav\u00fd \u2014 ikona: \ud83c\udf19 Respektovat syst\u00e9m \u2014 ikona: \ud83c\udf13 \u2014 aplikace bude sledovat syst\u00e9movou volbu (prefers-color-scheme) a automaticky se p\u0159epne, pokud se zm\u011bn\u00ed syst\u00e9mov\u00fd motiv. Kliknut\u00edm na tla\u010d\u00edtko v menu cykl\u00ed\u0161 mezi re\u017eimy (Light \u2192 Dark \u2192 System) . Vybran\u00e1 volba se ulo\u017e\u00ed do localStorage pod kl\u00ed\u010dem doxa_theme a p\u0159etrv\u00e1 mezi str\u00e1nkami a obnovami. Pokud chce\u0161 volbu resetovat, otev\u0159i konzoli prohl\u00ed\u017ee\u010de a spus\u0165: localStorage.removeItem('doxa_theme') nebo vyma\u017e storage v n\u00e1stroj\u00edch pro v\u00fdvoj\u00e1\u0159e. Automatick\u00e9 ukl\u00e1d\u00e1n\u00ed Aplikace nyn\u00ed automaticky ukl\u00eLine truncated
+133
View File
@@ -0,0 +1,133 @@
var base_path = 'function' === typeof importScripts ? '.' : '/search/';
var allowSearch = false;
var index;
var documents = {};
var lang = ['en'];
var data;
function getScript(script, callback) {
console.log('Loading script: ' + script);
$.getScript(base_path + script).done(function () {
callback();
}).fail(function (jqxhr, settings, exception) {
console.log('Error: ' + exception);
});
}
function getScriptsInOrder(scripts, callback) {
if (scripts.length === 0) {
callback();
return;
}
getScript(scripts[0], function() {
getScriptsInOrder(scripts.slice(1), callback);
});
}
function loadScripts(urls, callback) {
if( 'function' === typeof importScripts ) {
importScripts.apply(null, urls);
callback();
} else {
getScriptsInOrder(urls, callback);
}
}
function onJSONLoaded () {
data = JSON.parse(this.responseText);
var scriptsToLoad = ['lunr.js'];
if (data.config && data.config.lang && data.config.lang.length) {
lang = data.config.lang;
}
if (lang.length > 1 || lang[0] !== "en") {
scriptsToLoad.push('lunr.stemmer.support.js');
if (lang.length > 1) {
scriptsToLoad.push('lunr.multi.js');
}
if (lang.includes("ja") || lang.includes("jp")) {
scriptsToLoad.push('tinyseg.js');
}
for (var i=0; i < lang.length; i++) {
if (lang[i] != 'en') {
scriptsToLoad.push(['lunr', lang[i], 'js'].join('.'));
}
}
}
loadScripts(scriptsToLoad, onScriptsLoaded);
}
function onScriptsLoaded () {
console.log('All search scripts loaded, building Lunr index...');
if (data.config && data.config.separator && data.config.separator.length) {
lunr.tokenizer.separator = new RegExp(data.config.separator);
}
if (data.index) {
index = lunr.Index.load(data.index);
data.docs.forEach(function (doc) {
documents[doc.location] = doc;
});
console.log('Lunr pre-built index loaded, search ready');
} else {
index = lunr(function () {
if (lang.length === 1 && lang[0] !== "en" && lunr[lang[0]]) {
this.use(lunr[lang[0]]);
} else if (lang.length > 1) {
this.use(lunr.multiLanguage.apply(null, lang)); // spread operator not supported in all browsers: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator#Browser_compatibility
}
this.field('title');
this.field('text');
this.ref('location');
for (var i=0; i < data.docs.length; i++) {
var doc = data.docs[i];
this.add(doc);
documents[doc.location] = doc;
}
});
console.log('Lunr index built, search ready');
}
allowSearch = true;
postMessage({config: data.config});
postMessage({allowSearch: allowSearch});
}
function init () {
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", onJSONLoaded);
var index_path = base_path + '/search_index.json';
if( 'function' === typeof importScripts ){
index_path = 'search_index.json';
}
oReq.open("GET", index_path);
oReq.send();
}
function search (query) {
if (!allowSearch) {
console.error('Assets for search still loading');
return;
}
var resultDocuments = [];
var results = index.search(query);
for (var i=0; i < results.length; i++){
var result = results[i];
doc = documents[result.ref];
doc.summary = doc.text.substring(0, 200);
resultDocuments.push(doc);
}
return resultDocuments;
}
if( 'function' === typeof importScripts ) {
onmessage = function (e) {
if (e.data.init) {
init();
} else if (e.data.query) {
postMessage({ results: search(e.data.query) });
} else {
console.error("Worker - Unrecognized message: " + e);
}
};
}
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
</urlset>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loaded 100 of 162 files, more files were not shown because too many files have changed in this diff. Show more