Diane, poznámka do spisu. Všechno, co se schránce dá říct.
Návod.
Dva řádky HTML — a pak asi tucet věcí, které se hodí vědět, když má schránka dělat něco trochu jinak. Kromě první sekce je všechno tady nepovinné.
- Nastavení
- Který web, která stránka
- Atributy
- Weby s vlastním routováním
- Vzhled
- Jazyk
- Proč komentář neprojde
- Sto komentářů
- Moderace
- Co se ukládá
- Content Security Policy
- Když se nic neukáže
- Co Diane nedělá
Nastavení
- Přihlaste se na admin.diane.to Googlem.
- Přidejte doménu. Jeden řádek na jeden hostname:
www.example.comaexample.comjsou jeden web,blog.example.comse registruje zvlášť. - Vložte do stránky tyhle dva řádky:
<script async defer src="https://diane.to/w.js"></script> <to-diane></to-diane>
Skript může být v hlavičce i na konci stránky — je async defer,
takže vykreslování nezdrží ani v jednom případě. Element patří přesně tam,
kde má schránka být.
V tom kódu není žádný klíč, žádné id webu a žádné nastavení pro jednotlivou stránku. Je to záměr: nic ve veřejném HTML není tajné, takže id by bylo směrování vydávané za bezpečnost. Web se pozná podle hlavičky Origin, stránka podle své adresy.
Který web, která stránka
Web se pozná z hlavičky Origin, kterou
prohlížeč připojí ke každému požadavku mimo vlastní doménu a kterou
JavaScript na stránce nepodvrhne. Porovnává se přesně s tím, co máte
zaregistrované; jediná výjimka je jedno úvodní www., které
se odřízne. Každá další subdoména je samostatný web s vlastní
registrací.
Stránku hledá widget na třech místech, v tomto pořadí:
- atribut
post-slug, pokud ho nastavíte, - cesta z
<link rel="canonical">, - aktuální
location.pathname.
Výsledek se na obou stranách upravuje stejným kódem: pryč jde query
string, fragment, zdvojená i koncová lomítka, a delší než 200 znaků se
odmítne. /post, /post/ a /post?utm_source=rss jsou proto jedno vlákno.
Z toho plyne obojí, co občas potřebujete: dva elementy na jedné stránce
s různým post-slug drží dvě samostatná vlákna, a kanonický
odkaz mířící jinam slije přetištěné kopie článku do jednoho vlákna, aniž
byste museli cokoliv nastavovat.
Atributy
| Atribut | K čemu je |
|---|---|
post-slug | Identifikátor vlákna, když nemá být odvozený z adresy. Libovolný řetězec do 200 znaků. |
lang | Jazyk popisků, když nemá být převzatý z <html lang>. |
<to-diane post-slug="/blog/twin-peaks"></to-diane>
Oba jsou nepovinné a žádné další nejsou.
Weby s vlastním routováním
Změnu adresy si widget hlídá sám: poslouchá popstate, používá
Navigation API, a kde ho prohlížeč nemá, jednou za sekundu porovná location.href. history.pushState záměrně
nepřepisuje — dělají to měřicí skripty, funguje to, ale sahat do cizí
stránky je přesně to, co tenhle widget slibuje nedělat.
Běžná single-page aplikace tedy nepotřebuje nic. Pokud se ale vlákno neurčuje adresou, nastavte při změně route atribut:
document.querySelector("to-diane").setAttribute("post-slug", nextSlug) Odpověď, která dorazí až po odchodu na jiný článek, se zahodí, takže rychlé proklikání nenechá na obrazovce komentáře z předchozí stránky. Rozepsaný komentář se při přechodu smaže: patřil k článku, pod kterým vznikl.
Vzhled
Widget si z vaší stránky vezme jedinou barvu — barvu textu — a zbytek si
z ní namíchá. prefers-color-scheme záměrně ignoruje: vložená
schránka má ladit se stránkou, ve které sedí, ne s operačním systémem
návštěvníka, jinak by světlý web vypadal rozbitě každému, kdo má počítač
přepnutý do tmavého režimu. Na většině webů se proto nenastavuje nic.
Když přece, nastavte na elementu custom properties:
to-diane {
--td-font: Georgia, serif;
--td-radius: 4px;
--td-gap: 24px;
/* A solid brand button instead of the default tinted one */
--td-button-bg: #7c2d12;
--td-button-fg: #fff;
} | Vlastnost | Výchozí | Co ovlivní |
|---|---|---|
--td-font | systémový bezpatkový font | písmo celé schránky |
--td-gap | 16px | rozestupy |
--td-radius | 8px | rohy polí a tlačítka |
--td-bubble-radius | 14px | rohy bublin s komentáři |
--td-surface | 11 % barvy textu | pozadí komentáře |
--td-border | 24 % barvy textu | rámečky polí a tlačítka |
--td-muted | 62 % barvy textu | jména, data, vedlejší text |
--td-button-bg | 13 % barvy textu | pozadí tlačítka |
--td-button-bg-hover | 20 % barvy textu | tlačítko pod myší |
--td-button-fg | barva textu stránky | text tlačítka |
--td-danger | #e5484d | chybové hlášky |
Ven jsou vystavené dvě části: ::part(root) je celý blok
a ::part(powered) podpis „Powered by diane.to“ pod
formulářem. Podpis dědí tlumenou barvu, dá se přebarvit, nebo schovat:
to-diane::part(powered) {
display: none;
} Všechno ostatní je uvnitř shadow rootu a ze stránky se na to nedosáhne —
právě proto vypadá widget stejně na každém webu, kde je vložený. Velikost
na stránce je vaše: element je display: block, takže mu
klidně dejte max-width.
Jazyk
Popisky se berou z <html lang> vaší stránky, stejně
jako barva. Atribut na elementu to přebije:
<to-diane lang="cs"></to-diane>
Dnes umí widget anglicky a česky. Neznámý jazyk dostane anglické popisky,
ale data zůstanou v locale stránky, takže německý web má německá data a
anglické popisky, ne obojí špatně. Počty procházejí přes Intl.PluralRules, aby čeština dostala tři tvary tam, kde
angličtina potřebuje dva. Chybí vám jazyk? Napište na hello@diane.to, je to jedna položka
v tabulce.
Proč komentář neprojde
Žádná CAPTCHA. Místo ní čtyři laciné vrstvy — a každá se pozná podle toho, co uvidíte:
- Skrytá past. Ve formuláři je pole, které člověk nevidí a nedosáhne na něj tabulátorem. Když se vyplní, server odpoví, jako by se komentář uložil, a neuloží nic. Robot, kterému řeknete, že selhal, se totiž naučí selhávat míň.
- Podepsaný jednorázový klíč. Vydá se při načtení vlákna a platí od 3 sekund do 2 hodin. Odeslání hned po načtení dostane „dejte tomu chvilku“, stránka otevřená od včera „načtěte ji prosím znovu“.
- Omezení počtu. Nejvýš 3 komentáře z jedné IP adresy za 10 minut.
- Limity. 80 znaků jméno, 4000 znaků komentář, nejvýš 3 odkazy, 32 kB tělo požadavku.
Chybové hlášky se návštěvníkovi ukazují v jazyce widgetu.
Sto komentářů
Bezplatný účet unese sto živých komentářů na jeden web. Nad limit server další komentáře odmítne a schránka řekne, že je plná — čtení běží dál, protože plný limit není důvod schovávat, co už je napsané.
Smazané komentáře se do limitu nepočítají, takže moderováním se místo zase uvolní. A protože mazání je vratné, není to rozhodnutí na jednu stranu. Ve vlákně se zobrazí nejvýš 500 komentářů.
Moderace
Všechno je v konzoli na admin.diane.to: společná schránka se všemi komentáři od nejnovějšího, detail webu rozpadlý po vláknech, přepínač pro zobrazení smazaných, mazání a obnovení, přejmenování webu a vypínač, kterým celý web umlčíte — widget pak na té doméně nevykreslí nic a návštěvník žádnou chybu neuvidí.
Schvalovací fronta neexistuje. Komentář se objeví hned, jak ho někdo odešle, a moderuje se až potom.
Co se ukládá
Jméno, které návštěvník napsal, text, čas a nesolený otisk SHA-256 jeho IP adresy. Otisk se jen porovnává na shodu kvůli omezení počtu a nevrací ho žádný endpoint. Widget na vašem webu nenastaví ani nepřečte jedinou cookie a nenačte nic z třetí strany.
Komentáře se ukládají přesně tak, jak přišly, a vykreslují se jako text,
ne jako HTML: žádný Markdown, žádné automatické odkazy — a a < b zůstane a < b. Podrobnosti jsou na
stránce Soukromí.
Content Security Policy
Pokud váš web posílá CSP, týkají se widgetu tři direktivy:
script-src https://diane.to connect-src https://diane.to style-src 'unsafe-inline'
script-src kvůli souboru, connect-src kvůli
volání API. style-src proto, že styly widgetu jsou element <style> uvnitř jeho shadow rootu, kam se nonce
nedostane. Nic dalšího se povolovat nemusí: widget nenačítá fonty,
obrázky ani nic cizího.
Když se nic neukáže
Chybu v nastavení widget návštěvníkovi nikdy neukáže — nevykreslí nic a
napíše do konzole prohlížeče hlášku s předponou [to-diane].
Takže první krok je otevřít konzoli.
- „… is not registered“ — Origin neodpovídá žádné
zaregistrované doméně. Zkontrolujte subdomény:
blog.je jiný web než holá doména,www.ne. - V konzoli nic a na stránce nic — nenačetl se skript. Nejčastěji CSP nebo blokovač reklam.
- Na ostrém webu to jde, u sebe ne — prosté http se
přijímá jen pro
localhosta127.0.0.1. Ty si zaregistrujte jako každou jinou doménu a vývoj běží. - Komentář hned po načtení neprojde — třísekundové pravidlo z klíče.
- Špatné vlákno v SPA — adresa se mění způsobem, který
widget nevidí. Nastavte
post-slug.
Co Diane nedělá
Nemá vlákna odpovědí, hlasování, úpravu odeslaného komentáře, schvalovací frontu, notifikace, Markdown, avatary ani účty pro čtenáře. Každá z těch věcí by byla víc kódu než všechno ostatní dohromady, a widget má 24 kB. Jestli je zrovna jedna z nich rozdíl mezi „použiju“ a „nepoužiju“, napište na hello@diane.to — dobré vědět, i když odpověď bude ne.