SlideShare a Scribd company logo
1 of 20
Download to read offline
CSS Paged Media aneb
Gutenberg v prohlížeči
Jirka Kosek
Konference Devel
1. dubna 2017
1. dubna 2017Jirka KosekKonference Devel
1/20CSS Paged Media aneb Gutenberg v prohlížeči
Papír stále ještě není mrtev
• knížky
• tištěné katalogy
• tiskové výstupy z aplikací (např. faktury)
1. dubna 2017Jirka KosekKonference Devel
2/20CSS Paged Media aneb Gutenberg v prohlížeči
HTML everywhere
• HTML se stává nejpoužívanějším formátem
nejen na webu
• elektronické knihy EPUB/MOBI jsou jen archiv
obsahující HTML+CSS
• uživatelské rozhraní dnes většinou běží
v prohlížeči a je to opět HTML+CSS
1. dubna 2017Jirka KosekKonference Devel
3/20CSS Paged Media aneb Gutenberg v prohlížeči
Kacířská myšlenka?
Budeme HTML+CSS používat i pro
generování tiskového výstupu (PDF)
• nemusíme se učit další technologii („CSS umí
každý“)
• nebude potřeba konvertovat dokumenty/data
1. dubna 2017Jirka KosekKonference Devel
4/20CSS Paged Media aneb Gutenberg v prohlížeči
Co potřebujeme nevíc oproti CSS
v prohlížeči
• definice rozměrů a layoutu stránky
• záhlaví a zápatí
• generový obsah, číslování, odkazy
• kontrolu zlomu stránek a řádek
• dělení slov
• poznámky pod čarou
• obsah, rejstřík
• záložky
1. dubna 2017Jirka KosekKonference Devel
5/20CSS Paged Media aneb Gutenberg v prohlížeči
Rozměry a layout stránky
@page { size: a5 landscape; }
/* Rozdílné nastavení pro první, sudou/lichou stránku */
@page :first { … }
@page :left { … }
@page :right { … }
1. dubna 2017Jirka KosekKonference Devel
6/20CSS Paged Media aneb Gutenberg v prohlížeči
Záhlaví a zápatí
@page {
size: a4;
@top-left {
content: "Ze života hmyzu";
}
@bottom-right {
content: counter(page);
}
}
1. dubna 2017Jirka KosekKonference Devel
7/20CSS Paged Media aneb Gutenberg v prohlížeči
Živé záhlaví/zápatí
<section class="kapitola">
<h3>Nadpis</h3>
…
section.kapitola h3 {
string-set: kapitola contents();
}
…
@top-left {
content: string(kapitola);
}
1. dubna 2017Jirka KosekKonference Devel
8/20CSS Paged Media aneb Gutenberg v prohlížeči
Automatické číslování
<section class="kapitola">
<h3>Nadpis</h3>
…
section.kapitola h3 {
counter-increment: kapitola;
}
section.kapitola h3::before {
content: "Kapitola " counter(kapitola);
}
1. dubna 2017Jirka KosekKonference Devel
9/20CSS Paged Media aneb Gutenberg v prohlížeči
Kontrola zlomu
• dokument se sází automaticky bez možnosti
ruční korekce
• pomocí podmínek můžeme zajistit, že se
stránky zalomí na vhodných místech
• vlastnosti: page-break-before, page-
break-after a page-break-inside
• hodnoty: auto, always, avoid, left a right
/* Stránka se nesmí zalomit za nadpisem */
h2 + p { page-break-before: avoid }
1. dubna 2017Jirka KosekKonference Devel
10/20CSS Paged Media aneb Gutenberg v prohlížeči
Obsah a rejstřík
• CSS neumí samo vygenerovat
• lze vytvořit ručně, pomocí XSLT, JS, …
• CSS umí vyhodnotit odkazy a nahradit je číslem
strany nebo obsahem cílového elementu
1. dubna 2017Jirka KosekKonference Devel
11/20CSS Paged Media aneb Gutenberg v prohlížeči
Odkazy
<h3 id="last">Závěr<h3>
…
<a href="#last" class="pageref">Poslední kapitola na straně</a>
ukončuje text.
…
a.pageref::after {
content: " " target-counter(attr(href url), page);
}
1. dubna 2017Jirka KosekKonference Devel
12/20CSS Paged Media aneb Gutenberg v prohlížeči
Dělení slov
<html lang="cs">
…
html {
hyphens: auto;
}
1. dubna 2017Jirka KosekKonference Devel
13/20CSS Paged Media aneb Gutenberg v prohlížeči
Záložky
h1 { bookmark-level: 1; }
h2 { bookmark-level: 2; }
h3 { bookmark-level: 3; }
1. dubna 2017Jirka KosekKonference Devel
14/20CSS Paged Media aneb Gutenberg v prohlížeči
Poznámky pod čarou
<p>Text obsahujcící<span class="poznamka">Poznámku
pod čarou.</span> něco.</p>
…
.poznamka { float: footnote; }
1. dubna 2017Jirka KosekKonference Devel
15/20CSS Paged Media aneb Gutenberg v prohlížeči
Výplně
• dynamické vyplnění volného místa
<ul class="toc">
<li><a href="#uvod">Úvod</a></li>
<li><a href="#stat">Stať</a></li>
<li><a href="#zaver">Závěr</a></li>
…
/* Přidání teček a čísla strany do obsahu */
.toc a::after {
content: leader(dotted) " " target-counter(attr(href, url), page);
}
1. dubna 2017Jirka KosekKonference Devel
16/20CSS Paged Media aneb Gutenberg v prohlížeči
Implementace
• Antenna House Formatter
• Prince
• PDFreactor
• Vivliostyle
• Weasy Print
1. dubna 2017Jirka KosekKonference Devel
17/20CSS Paged Media aneb Gutenberg v prohlížeči
Velcí uživatelé
• Nakladatelství O'Reilly
◦ HTMLBook – rozšíření HTML pro psaní
knih
◦ Atlas – publikační platforma používající
HTMLBook
• Nakladatelství Hachette Livre
◦ ročně vydají několik tisíc knih vysázených
pomocí CSS
1. dubna 2017Jirka KosekKonference Devel
18/20CSS Paged Media aneb Gutenberg v prohlížeči
Problémy
• pomalá standardizace
• neexistence kvalitní open-source implementace
• neumí vše co XSL-FO
1. dubna 2017Jirka KosekKonference Devel
19/20CSS Paged Media aneb Gutenberg v prohlížeči
Další informace
• CSS Generated Content for Paged Media
Module
• CSS Paged Media Module Level 3
• http://www.kosek.cz/xml/2017devel/
• PDF verze slidů
1. dubna 2017Jirka KosekKonference Devel
20/20CSS Paged Media aneb Gutenberg v prohlížeči

More Related Content

More from Develcz

Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...
Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...
Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...Develcz
 
Štěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmysl
Štěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmyslŠtěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmysl
Štěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmyslDevelcz
 
Tomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQL
Tomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQLTomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQL
Tomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQLDevelcz
 
Tomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikací
Tomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikacíTomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikací
Tomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikacíDevelcz
 
Jakub Vrána: Dokazatelná bezpečnost
Jakub Vrána: Dokazatelná bezpečnostJakub Vrána: Dokazatelná bezpečnost
Jakub Vrána: Dokazatelná bezpečnostDevelcz
 
Roman Schejbal: From Madness To Reason
Roman Schejbal: From Madness To ReasonRoman Schejbal: From Madness To Reason
Roman Schejbal: From Madness To ReasonDevelcz
 
Michal Illich: Zuri aneb Vývojáři staví letadlo
Michal Illich: Zuri aneb Vývojáři staví letadloMichal Illich: Zuri aneb Vývojáři staví letadlo
Michal Illich: Zuri aneb Vývojáři staví letadloDevelcz
 
Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...
Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...
Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...Develcz
 
David Majda: Autoformátování kódu
David Majda: Autoformátování kóduDavid Majda: Autoformátování kódu
David Majda: Autoformátování kóduDevelcz
 
David Grudl: Open source: The Good, the Bad and the Ugly
David Grudl: Open source: The Good, the Bad and the UglyDavid Grudl: Open source: The Good, the Bad and the Ugly
David Grudl: Open source: The Good, the Bad and the UglyDevelcz
 
Ondřej Machulda: Začíná zlatá doba end-to-end testů!
Ondřej Machulda: Začíná zlatá doba end-to-end testů!Ondřej Machulda: Začíná zlatá doba end-to-end testů!
Ondřej Machulda: Začíná zlatá doba end-to-end testů!Develcz
 
Adam Kudrna: Headless WordPress/Drupal
Adam Kudrna: Headless WordPress/DrupalAdam Kudrna: Headless WordPress/Drupal
Adam Kudrna: Headless WordPress/DrupalDevelcz
 
Jaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světě
Jaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světěJaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světě
Jaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světěDevelcz
 
Martin Michálek: Bootstrap 4 - Jednou to muselo přijít
Martin Michálek: Bootstrap 4 - Jednou to muselo přijítMartin Michálek: Bootstrap 4 - Jednou to muselo přijít
Martin Michálek: Bootstrap 4 - Jednou to muselo přijítDevelcz
 
Ondřej Mirtes: Usnadněte si práci silně typovaným kódem a statickou analýzou!
Ondřej Mirtes: Usnadněte si práci silně typovaným kódem a statickou analýzou!Ondřej Mirtes: Usnadněte si práci silně typovaným kódem a statickou analýzou!
Ondřej Mirtes: Usnadněte si práci silně typovaným kódem a statickou analýzou!Develcz
 
Karel Smutný: Jak se samo-organizujeme v Brand Embassy
Karel Smutný: Jak se samo-organizujeme v Brand EmbassyKarel Smutný: Jak se samo-organizujeme v Brand Embassy
Karel Smutný: Jak se samo-organizujeme v Brand EmbassyDevelcz
 
Martin Šimeček: Chytré boty do každé rodiny
Martin Šimeček: Chytré boty do každé rodinyMartin Šimeček: Chytré boty do každé rodiny
Martin Šimeček: Chytré boty do každé rodinyDevelcz
 
Richard Fridrich: Třesení stromem v JavaScriptu
Richard Fridrich: Třesení stromem v JavaScriptuRichard Fridrich: Třesení stromem v JavaScriptu
Richard Fridrich: Třesení stromem v JavaScriptuDevelcz
 
Bára Bühnová: Naučte se taktizovat s pomocí bad code smells a quality tactics
Bára Bühnová: Naučte se taktizovat s pomocí bad code smells a quality tacticsBára Bühnová: Naučte se taktizovat s pomocí bad code smells a quality tactics
Bára Bühnová: Naučte se taktizovat s pomocí bad code smells a quality tacticsDevelcz
 
Michal Kovařík: Multiplayer ve Factoriu
Michal Kovařík: Multiplayer ve FactoriuMichal Kovařík: Multiplayer ve Factoriu
Michal Kovařík: Multiplayer ve FactoriuDevelcz
 

More from Develcz (20)

Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...
Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...
Patrick Zandl: Open source software, hardware, 3D tiskárny a tvrdý business -...
 
Štěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmysl
Štěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmyslŠtěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmysl
Štěpán Bechynský: Hardware pro IoT projekty nejen pro hobby, ale i pro průmysl
 
Tomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQL
Tomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQLTomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQL
Tomáš Vondra: Paralelizace dotazu a partitioning v PostgreSQL
 
Tomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikací
Tomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikacíTomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikací
Tomáš Zvěřina: Flutter.io - multiplatformní vývoj mobilních aplikací
 
Jakub Vrána: Dokazatelná bezpečnost
Jakub Vrána: Dokazatelná bezpečnostJakub Vrána: Dokazatelná bezpečnost
Jakub Vrána: Dokazatelná bezpečnost
 
Roman Schejbal: From Madness To Reason
Roman Schejbal: From Madness To ReasonRoman Schejbal: From Madness To Reason
Roman Schejbal: From Madness To Reason
 
Michal Illich: Zuri aneb Vývojáři staví letadlo
Michal Illich: Zuri aneb Vývojáři staví letadloMichal Illich: Zuri aneb Vývojáři staví letadlo
Michal Illich: Zuri aneb Vývojáři staví letadlo
 
Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...
Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...
Ondřej Šika: Docker, Traefik a CI - Mějte nasazené všeny větve na kterých pra...
 
David Majda: Autoformátování kódu
David Majda: Autoformátování kóduDavid Majda: Autoformátování kódu
David Majda: Autoformátování kódu
 
David Grudl: Open source: The Good, the Bad and the Ugly
David Grudl: Open source: The Good, the Bad and the UglyDavid Grudl: Open source: The Good, the Bad and the Ugly
David Grudl: Open source: The Good, the Bad and the Ugly
 
Ondřej Machulda: Začíná zlatá doba end-to-end testů!
Ondřej Machulda: Začíná zlatá doba end-to-end testů!Ondřej Machulda: Začíná zlatá doba end-to-end testů!
Ondřej Machulda: Začíná zlatá doba end-to-end testů!
 
Adam Kudrna: Headless WordPress/Drupal
Adam Kudrna: Headless WordPress/DrupalAdam Kudrna: Headless WordPress/Drupal
Adam Kudrna: Headless WordPress/Drupal
 
Jaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světě
Jaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světěJaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světě
Jaroslav Tulach: GraalVM - z vývoje nejrychlejšího virtuálního stroje na světě
 
Martin Michálek: Bootstrap 4 - Jednou to muselo přijít
Martin Michálek: Bootstrap 4 - Jednou to muselo přijítMartin Michálek: Bootstrap 4 - Jednou to muselo přijít
Martin Michálek: Bootstrap 4 - Jednou to muselo přijít
 
Ondřej Mirtes: Usnadněte si práci silně typovaným kódem a statickou analýzou!
Ondřej Mirtes: Usnadněte si práci silně typovaným kódem a statickou analýzou!Ondřej Mirtes: Usnadněte si práci silně typovaným kódem a statickou analýzou!
Ondřej Mirtes: Usnadněte si práci silně typovaným kódem a statickou analýzou!
 
Karel Smutný: Jak se samo-organizujeme v Brand Embassy
Karel Smutný: Jak se samo-organizujeme v Brand EmbassyKarel Smutný: Jak se samo-organizujeme v Brand Embassy
Karel Smutný: Jak se samo-organizujeme v Brand Embassy
 
Martin Šimeček: Chytré boty do každé rodiny
Martin Šimeček: Chytré boty do každé rodinyMartin Šimeček: Chytré boty do každé rodiny
Martin Šimeček: Chytré boty do každé rodiny
 
Richard Fridrich: Třesení stromem v JavaScriptu
Richard Fridrich: Třesení stromem v JavaScriptuRichard Fridrich: Třesení stromem v JavaScriptu
Richard Fridrich: Třesení stromem v JavaScriptu
 
Bára Bühnová: Naučte se taktizovat s pomocí bad code smells a quality tactics
Bára Bühnová: Naučte se taktizovat s pomocí bad code smells a quality tacticsBára Bühnová: Naučte se taktizovat s pomocí bad code smells a quality tactics
Bára Bühnová: Naučte se taktizovat s pomocí bad code smells a quality tactics
 
Michal Kovařík: Multiplayer ve Factoriu
Michal Kovařík: Multiplayer ve FactoriuMichal Kovařík: Multiplayer ve Factoriu
Michal Kovařík: Multiplayer ve Factoriu
 

Jirka Kosek: CSS Paged Media aneb Gutenberg v prohlížeči

  • 1. CSS Paged Media aneb Gutenberg v prohlížeči Jirka Kosek Konference Devel 1. dubna 2017 1. dubna 2017Jirka KosekKonference Devel 1/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 2. Papír stále ještě není mrtev • knížky • tištěné katalogy • tiskové výstupy z aplikací (např. faktury) 1. dubna 2017Jirka KosekKonference Devel 2/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 3. HTML everywhere • HTML se stává nejpoužívanějším formátem nejen na webu • elektronické knihy EPUB/MOBI jsou jen archiv obsahující HTML+CSS • uživatelské rozhraní dnes většinou běží v prohlížeči a je to opět HTML+CSS 1. dubna 2017Jirka KosekKonference Devel 3/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 4. Kacířská myšlenka? Budeme HTML+CSS používat i pro generování tiskového výstupu (PDF) • nemusíme se učit další technologii („CSS umí každý“) • nebude potřeba konvertovat dokumenty/data 1. dubna 2017Jirka KosekKonference Devel 4/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 5. Co potřebujeme nevíc oproti CSS v prohlížeči • definice rozměrů a layoutu stránky • záhlaví a zápatí • generový obsah, číslování, odkazy • kontrolu zlomu stránek a řádek • dělení slov • poznámky pod čarou • obsah, rejstřík • záložky 1. dubna 2017Jirka KosekKonference Devel 5/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 6. Rozměry a layout stránky @page { size: a5 landscape; } /* Rozdílné nastavení pro první, sudou/lichou stránku */ @page :first { … } @page :left { … } @page :right { … } 1. dubna 2017Jirka KosekKonference Devel 6/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 7. Záhlaví a zápatí @page { size: a4; @top-left { content: "Ze života hmyzu"; } @bottom-right { content: counter(page); } } 1. dubna 2017Jirka KosekKonference Devel 7/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 8. Živé záhlaví/zápatí <section class="kapitola"> <h3>Nadpis</h3> … section.kapitola h3 { string-set: kapitola contents(); } … @top-left { content: string(kapitola); } 1. dubna 2017Jirka KosekKonference Devel 8/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 9. Automatické číslování <section class="kapitola"> <h3>Nadpis</h3> … section.kapitola h3 { counter-increment: kapitola; } section.kapitola h3::before { content: "Kapitola " counter(kapitola); } 1. dubna 2017Jirka KosekKonference Devel 9/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 10. Kontrola zlomu • dokument se sází automaticky bez možnosti ruční korekce • pomocí podmínek můžeme zajistit, že se stránky zalomí na vhodných místech • vlastnosti: page-break-before, page- break-after a page-break-inside • hodnoty: auto, always, avoid, left a right /* Stránka se nesmí zalomit za nadpisem */ h2 + p { page-break-before: avoid } 1. dubna 2017Jirka KosekKonference Devel 10/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 11. Obsah a rejstřík • CSS neumí samo vygenerovat • lze vytvořit ručně, pomocí XSLT, JS, … • CSS umí vyhodnotit odkazy a nahradit je číslem strany nebo obsahem cílového elementu 1. dubna 2017Jirka KosekKonference Devel 11/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 12. Odkazy <h3 id="last">Závěr<h3> … <a href="#last" class="pageref">Poslední kapitola na straně</a> ukončuje text. … a.pageref::after { content: " " target-counter(attr(href url), page); } 1. dubna 2017Jirka KosekKonference Devel 12/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 13. Dělení slov <html lang="cs"> … html { hyphens: auto; } 1. dubna 2017Jirka KosekKonference Devel 13/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 14. Záložky h1 { bookmark-level: 1; } h2 { bookmark-level: 2; } h3 { bookmark-level: 3; } 1. dubna 2017Jirka KosekKonference Devel 14/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 15. Poznámky pod čarou <p>Text obsahujcící<span class="poznamka">Poznámku pod čarou.</span> něco.</p> … .poznamka { float: footnote; } 1. dubna 2017Jirka KosekKonference Devel 15/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 16. Výplně • dynamické vyplnění volného místa <ul class="toc"> <li><a href="#uvod">Úvod</a></li> <li><a href="#stat">Stať</a></li> <li><a href="#zaver">Závěr</a></li> … /* Přidání teček a čísla strany do obsahu */ .toc a::after { content: leader(dotted) " " target-counter(attr(href, url), page); } 1. dubna 2017Jirka KosekKonference Devel 16/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 17. Implementace • Antenna House Formatter • Prince • PDFreactor • Vivliostyle • Weasy Print 1. dubna 2017Jirka KosekKonference Devel 17/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 18. Velcí uživatelé • Nakladatelství O'Reilly ◦ HTMLBook – rozšíření HTML pro psaní knih ◦ Atlas – publikační platforma používající HTMLBook • Nakladatelství Hachette Livre ◦ ročně vydají několik tisíc knih vysázených pomocí CSS 1. dubna 2017Jirka KosekKonference Devel 18/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 19. Problémy • pomalá standardizace • neexistence kvalitní open-source implementace • neumí vše co XSL-FO 1. dubna 2017Jirka KosekKonference Devel 19/20CSS Paged Media aneb Gutenberg v prohlížeči
  • 20. Další informace • CSS Generated Content for Paged Media Module • CSS Paged Media Module Level 3 • http://www.kosek.cz/xml/2017devel/ • PDF verze slidů 1. dubna 2017Jirka KosekKonference Devel 20/20CSS Paged Media aneb Gutenberg v prohlížeči