--- title: "FrontKec #9" tags: frontendisti, frontkec --- <!-- {% základ %} --> {%hackmd KXd2iUBpSjq7Ib2Z4h3LMg %} <!-- {% zelená %} --> {%hackmd TKLAeY1xQF2LHJgIuJub0A %} # FrontKec #9 <br> 26. února 2026 --- ## CSS Grid Lanes (masonry v CSS) **Základní syntaxe:** ```css .container { display: grid; display: grid-lanes; /* podporováno-li, přetíží řádek nad */ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 16px; } ``` <!--.element: class="c-text-xs fragment" --> --- #### CSS Grid Lanes **Feature detection (fallback):** ```css @supports (display: grid-lanes) { .gallery { display: grid-lanes; } } @supports not (display: grid-lanes) { .gallery { /* fallback – CSS columns nebo klasický grid */ } } ``` <!--.element: class="c-text-xs fragment" --> note: - finální syntaxe je `display: grid-lanes` – ne `display: masonry`, ne `grid-template-rows: masonry` - **Debata trvala 5 let** (2020–2025). Mozilla první prototypovala v r. 2020, WebKit (Apple) přebral od 2022, Chrome experimentoval s alternativním `display: masonry` - **Rozhodnutí CSSWG** 31. ledna 2025 – shodli se na znovupoužití grid-* properties pro masonry layout - **Spec:** CSS Grid Layout Module Level 3 (publikováno 28. 3. 2025) - **Proč "grid-lanes" a ne "masonry"?** Příliš mnoho JS knihoven už název "masonry" používá – vyhnout se kolizím - jako progressive enhancement, fallback třeba do `grid-auto-flow: row dense;` --- #### CSS Grid Lanes **Podpora v prohlížečích:** - Safari Technology Preview 234+ (finální syntaxe, od 12/2025) - Chrome/Edge 140 (experimentální za flagou, od 07/2025) – Chromium tým aktualizuje implementaci - Firefox – má starší prototyp (`grid-template-*: masonry`), přechod na `grid-lanes` v přípravě (Nightly) - **Realistický produkční timeline:** polovina 2026 <!--.element: class="c-text-sm" --> note: **Zdroje:** - [Jen Simmons, Elika Etemad, Brandon Stewart: *Introducing CSS Grid Lanes*](https://webkit.org/blog/17660/introducing-css-grid-lanes/) - [*When will CSS Grid Lanes arrive?*](https://webkit.org/blog/17758/when-will-css-grid-lanes-arrive-how-long-until-we-can-use-it/) - [CSS-Tricks: *Masonry Layout is Now grid-lanes*](https://css-tricks.com/masonry-layout-is-now-grid-lanes/) - [Smashing Magazine: *Masonry: Things You Won't Need A Library For Anymore*](https://www.smashingmagazine.com/2025/12/masonry-things-you-wont-need-library-anymore/) - [Nowwwinky – téma probíráno v 05/2025 (CSS Masonry) a 06/2023 (grid masonry)](https://nowwwinky.koutik.cz/) --- #### CSS Grid Lanes **Výhody oproti JS knihovně Masonry.js:** - neblokuje renderingu (Masonry.js = 24 KB, 600 ms na pomalém 4G) - nepřeskládává se při resize – CSS nativně, JS knihovna animuje položky - přístupnější – obsah se řadí přes _lanes_ (jako pruhy v dopravě), ne dolů celým sloupcem => tabulátorem projde viditelný obsah - infinite scroll bez JS – layout funguje čistě v CSS - **Plná síla CSS Gridu:** `grid-template-*` pro definici lanes, spanning přes lanes, subgrid, explicitní umístění <!--.element: class="c-text-sm" --> note: - **"Konečně!"** – 5 let debat, ale výsledek je čistý. Zajímavé pozadí: Chrome vs. Safari vs. Firefox – každý měl jinou syntaxi. Jak to, že se nakonec dohodli? - **Masonry.js je mrtvé?** Ne hned – potřeba fallback pro starší prohlížeče. Ale nové projekty mohou progresivně nasazovat `grid-lanes` s JS polyfill jako zálohou - **Performance argument** – 600 ms blokování na pomalém 4G za JS knihovnu vs. nula za nativní CSS. Co to znamená pro LCP? - **Kdo z vás to už vyzkoušel?** Safari TP je ke stažení, Chrome za flagou – lze si hrát teď --- ## Temporal API - `Temporal` je globální namespace (jako `Math` nebo `Intl`), kompletní náhrada za `Date` - **Proč?** `Date` objekt pochází z r. 1995, kopíruje špatně navržený `java.util.Date`. Mutabilní, špatný parsing, zmatené měsíce (0 = leden), žádná podpora časových zón - **TC39 Stage 3** – finalizace na Stage 4 se očekává na TC39 plenárním zasedání v březnu 2026 <!--.element: class="c-text-sm" --> note: - Java (od které opisovali autoři JS) svůj `Date` zahodila už 2 r. poté… --- #### Temporal API **Podpora:** - Firefox 139 (květen 2025) – **první prohlížeč** s nativní podporou - Chrome 144 (leden 2026) – nativní podpora - Safari – v Technology Preview za flagou (`useTemporal`) - Edge – experimentální v betě - **v praxi nutný polyfill** (~20 KB gzip, stále menší než Moment.js 47 KB) <!--.element: class="c-text-sm" --> --- #### Temporal API **Klíčové typy:** | Typ | Popis | |-----|-------| | `Temporal.PlainDate` | Datum bez času a zóny | | `Temporal.PlainTime` | Čas bez data | | `Temporal.PlainDateTime` | Datum + čas, bez zóny | | `Temporal.ZonedDateTime` | Datum + čas + časová zóna | | `Temporal.Instant` | Bod v čase (UTC, nanosekundy) | | `Temporal.Duration` | Rozdíl mezi dvěma body | <!--.element: class="c-text-sm " --> --- #### Temporal API ### Příklady kódu: staré vs. nové **1. Vytvoření data – měsíce od nuly vs. od jedničky:** ```js // ❌ Starý Date – měsíc 2 = BŘEZEN (!) new Date(2026, 2, 15) // March 15 // ✅ Temporal – měsíc 3 = BŘEZEN Temporal.PlainDate.from({ year: 2026, month: 3, day: 15 }) ``` <!--.element: class="c-text-xs fragment" --> --- #### Temporal API **2. Neplatné datum – tichá chyba vs. výjimka:** ```js // ❌ Date – tiše "opraví" na 1. března new Date('2026-02-29') // 2026 není přestupný rok → March 1 // ✅ Temporal – vyhodí RangeError Temporal.PlainDate.from('2026-02-29') // RangeError: invalid date ``` <!--.element: class="c-text-xs fragment" --> --- #### Temporal API **3. Imutabilita:** ```js // ❌ Moment.js – mutuje originál const date = moment('2026-03-15'); date.add(1, 'day'); // změní původní objekt! // ✅ Temporal – vrací nový objekt const date = Temporal.PlainDate.from('2026-03-15'); const tomorrow = date.add({ days: 1 }); // nový objekt // date je stále March 15 ``` <!--.element: class="c-text-xs fragment" --> --- #### Temporal API **4. Časové zóny – konverze bez knihovny:** ```js // ❌ Starý způsob (moment-timezone) import moment from 'moment-timezone'; const ny = moment.tz('2026-03-15 14:00', 'America/New_York'); const tokyo = ny.clone().tz('Asia/Tokyo'); // ✅ Temporal – nativní const ny = Temporal.ZonedDateTime.from({ year: 2026, month: 3, day: 15, hour: 14, timeZone: 'America/New_York' }); const tokyo = ny.withTimeZone('Asia/Tokyo'); // "2026-03-16T04:00:00+09:00[Asia/Tokyo]" ``` <!--.element: class="c-text-xs fragment" --> --- #### Temporal API **5. Lokalizace – rozdíl mezi daty s různými kalendáři:** ```js // Temporal podporuje nejen Gregorian, ale i další kalendáře const date = Temporal.PlainDate.from('2026-03-15'); const islamic = date.withCalendar('islamic'); console.log(islamic.toString()); // "2447-09-15[u-ca=islamic]" // Rozdíl mezi daty s Intl formátováním const start = Temporal.PlainDate.from('2026-01-01'); const end = Temporal.PlainDate.from('2026-09-15'); const diff = start.until(end, { largestUnit: 'month' }); console.log(`${diff.months} měsíců, ${diff.days} dní`); // "8 měsíců, 14 dní" ``` <!--.element: class="c-text-xs fragment" --> --- #### Temporal API **6. Typický problém s DST (letní čas):** ```js // Temporal automaticky řeší přechod na letní čas const before = Temporal.ZonedDateTime.from({ year: 2026, month: 3, day: 29, hour: 1, minute: 30, timeZone: 'Europe/Prague' }); const after = before.add({ hours: 2 }); // Korektně přeskočí z 2:00 na 3:00 CET → CEST ``` <!--.element: class="c-text-xs fragment" --> note: - **30 let rozbitých dat v JS.** Rob Palmer (TC39 delegate) řekl, že Temporal je podle mnoha metrik „vůbec největší změna v JavaScriptu." Souhlasíte? - **Můžeme to už používat?** Firefox + Chrome = většina uživatelů. S polyfill (~20 KB) je to menší než Moment.js. Stojí za to začít migrovat? - **Performance:** Benchmarky ukazují, že Date je u jednoduchých operací o ~3% rychlejší, u složitějších cca 2× rychlejší. Ale Temporal se zlepšuje a klarita kódu to vyváží - **Migrace v praxi:** `grep -r "moment\|date-fns\|dayjs\|luxon" src/` – najdi, co nahradit - **V8 implementace používá `temporal_rs`** – Rust knihovnu z Boa JS engine. Zajímavý příklad cross-engine spolupráce --- #### Temporal API ### 3 knihovny, které se stanou obsolete: 1. **Moment.js** (~47 KB gzip) – sami autoři ho označili za legacy 2. **date-fns** (~32 KB při plném importu) – modulární, ale Temporal nabízí totéž nativně 3. **Day.js** (~2 KB) – malý, ale po Temporal zbytečný <!--.element: class="c-text-sm fragment" --> note: **Zdroje:** - [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal) - [TC39 proposal](https://github.com/tc39/proposal-temporal) - [InfoQ: *Chrome 144 Ships Temporal API*](https://www.infoq.com/news/2026/02/chrome-temporal-date-api/) - [Bryntum: *JavaScript Temporal in 2026*](https://bryntum.com/blog/javascript-temporal-is-it-finally-here/) - [socket.dev: *Temporal API Ships in Chrome 144*](https://socket.dev/blog/temporal-api-ships-in-chrome-144-major-shift-for-javascript-date-handling) - [DEV.to: *7 Date Library Patterns It Replaces*](https://dev.to/jsgurujobs/chrome-144-just-shipped-the-temporal-api-here-are-7-date-library-patterns-it-replaces-with-native-ge7) - [Nowwwinky – téma probíráno v 05/2025 a 06/2025](https://nowwwinky.koutik.cz/) --- ## AI agent skill: [CSS First](https://skills.sh/luko248/css-first-skill/css-first) od Lukáše Chylíka - skill, který poskytuje **CSS-first řešení** pro UI implementační úlohy - Integruje se s **MDN dokumentací** – hledá relevantní CSS vlastnosti, zjišťuje browser support - **Klíčové funkce:** - Analyzuje popis UI úlohy a navrhne relevantní CSS vlastnosti z MDN - Kontrola browser support pro navrhované CSS vlastnosti - Mechanismus "user consent" – ptá se, zda chceš pokračovat s danou CSS vlastností - Příklady kódu, best practices, fallback strategie <!--.element: class="c-text-sm fragment" --> note: **O autorovi:** - Lukáš Chylík – frontend vývojář z Brna - AI frontend dev lead & VIGo Design System lead developer u AIS Servis - moderátor i přednášející brněnských srazů spolku Frontendisti - Filosofie: "JavaScript není řešení na všechno" – CSS first přístup - zakladatel discordové skupiny [CSS Czechoslovakia](https://discord.gg/ayKc3xT9) --- #### CSS First **Použití** - prompt: "Potřebuju tooltip, který se zobrazí při hoveru nad tlačítkem" <!--.element: class="c-text-sm fragment" --> - výstup: CSS First server navrhne: `anchor positioning` + `popover` + browser support info <!--.element: class="c-text-sm fragment" --> note: - Místo aby AI rovnou sáhlo po JS/React knihovně, **nejprve zkusí čisté CSS řešení** - **"CSS first" jako filosofie:** Kolik z nás automaticky sáhne po JS/React komponentě, i když čisté CSS řešení existuje? Dialog, popover, carousel – to vše je dnes nativní CSS - **Praktická ukázka by byla super** – live demo: zeptat se AI na UI úlohu, nechat CSS First navrhnout řešení - **MCP jako trend:** GitHub, Slack, Asana – všichni mají MCP servery. Ale CSS First je krásný příklad **komunitního** MCP serveru z ČR/SR - **Spojitost s ostatními tématy podcastu:** Grid Lanes, Temporal, Interop – CSS a webová platforma se posouvají kupředu. CSS First pomáhá AI držet krok s tím, co je nativně možné - **Lukáš je z Brna** – shoutout pro brněnské Frontendisti! **Zdroje:** - [NPM](https://www.npmjs.com/package/@depthark/css-first) - [GitHub](https://github.com/Luko248/css-first (autor: Luko248)) - [Glama listing](https://glama.ai/mcp/servers/@Luko248/css-first) - [Lukáš Chylík, LinkedIn](https://www.linkedin.com/in/lukas-chylik/ – AI frontend dev lead, VIGo Design System, host Frontendisti Brno) - [Nowwwinky – podcast únor 2026](https://nowwwinky.koutik.cz/) --- ## CSS 2025: shrnutí **1. Customizable Components** - **Customizable `<select>`** – `appearance: base-select`, `::picker(select)`, `<selectedcontent>`. Po dekádách konečně plně stylovatelný! - **Invoker Commands** – `commandfor` + `command` na buttonech → dialog, popover bez JS (Chrome 135+) - **Dialog Light Dismiss** – `closedby="any"` na `<dialog>` (Chrome 134+) - **`popover=hint`** – ephemeral UI (tooltipy) bez zavírání ostatních popoverů - **`::scroll-marker` / `::scroll-button()`** – nativní CSS karusely. Pinterest case study: 90% redukce kódu (2000 řádků JS → 200 řádků CSS) - **`scroll-target-group`** – scroll-spy navigace v čistém CSS - **Anchored Container Queries** – styl podle aktuálního anchor fallbacku - **Interest Invokers** – `interestfor` pro hover/focus popovers. **Pozor: Apple/WebKit je proti!** CSS-Tricks: "likely DOA" <!--.element: class="c-text-xs " --> note: **Zdroje:** - [Chrome.dev interactive site](https://chrome.dev/css-wrapped-2025/) - [Blog post](https://developer.chrome.com/blog/css-wrapped-2025) - [Smashing Magazine](https://www.smashingmagazine.com/2025/12/state-logic-native-power-css-wrapped-2025/) - [CSS-Tricks](https://css-tricks.com/css-wrapped-2025/) - [prezentace Zuzany Fatrdla (Šumlanské)](https://docs.google.com/presentation/d/1iR-wzeusP9ZAtvmIwI84qGehPQaHpNLRKCIYe6P7v34/edit) --- #### CSS 2025: shrnutí **2. Next-gen Interactions** - **Scroll-state Queries** – `container-type: scroll-state` + `@container scroll-state(stuck: top)` (Chrome 133+) - **`sibling-index()` / `sibling-count()`** – pozice elementu a počet sourozenců → staggered animace bez JS custom properties - **`scrollIntoView()` container option** – `container: "nearest"` zabrání nežádoucímu scrollu rodičů - **Nested View Transition Groups** – zachování 3D transformací při přechodech - **`moveBefore()` DOM API** – přesun elementu v DOM bez ztráty stavu (iframe, video, CSS animace) <!--.element: class="c-text-xs " --> --- #### CSS 2025: shrnutí **3. Optimized Ergonomics** - **CSS `if()` funkce** – první explicitní podmínkový konstrukt v CSS (ternární operátor) - **CSS Custom Functions (`@function`)** – uživatelské funkce s argumenty - **`shape()` funkce** – komplexní tvary s příkazy (line, move, curve) - **Advanced `attr()`** – typované návratové hodnoty (barvy, čísla, délky) - **`text-box`** – odstranění extra whitespace nad/pod textem - **`corner-shape`** – squircles, scooped corners, beveled corners - **`stretch` keyword** – nové klíčové slovo pro sizing - **Rozšířená range syntax** - **`ToggleEvent.source`** <!--.element: class="c-text-xs " --> note: ### (b) Diskuzní body - **CSS jako programovací jazyk:** `if()`, `@function`, `sibling-index()`, typovaný `attr()` – CSS má podmínky, funkce, počítání, typovou konverzi. Potřebujeme unit testy pro CSS? - **Pinterest: 2000 → 200 řádků** – masivní argument pro nativní CSS karusely. Kdo z nás pořád tahá Swiper.js? - **`<select>` styling – konečně!** Kolik custom dropdown knihoven to nahradí? - **Apple blokuje Interest Invokers** – nová éra Chrome-only features? Nebo se dohodnou? - **State of CSS 2025:** `:has()` je nejpoužívanější I nejoblíbenější CSS fičura. Trigonometrické funkce nejméně oblíbené - **"Co se naučit první?"** Pokud máte 2 hodiny: customizable `<select>` (univerzální potřeba), scroll-state queries (okamžitý UX benefit), nebo `@function` (architekturní budoucnost)? --- ## Interop 2026 **Co je Interop:** - Roční spolupráce výrobců prohlížečů (Apple, Google, Microsoft, Mozilla + Igalia) na konzistentní implementaci webových standardů - Měří se průchodností WPT (Web Platform Tests) – výsledky na veřejném dashboardu <!--.element: class="c-text-xs " --> **Interop 2025 – výsledky:** - Overall score: **25 → 95** (za rok!) - Safari: 43 → 99, Firefox: 46 → 99 - Nově Baseline: CSS Anchor Positioning, same-document View Transitions, CSS `@scope`, Navigation API, URLPattern API <!--.element: class="c-text-xs " --> note: – Interop 2026: 20 oblastí (33 návrhů) + 4 oblasti výzkumu --- #### Interop 2026 - **`attr()`** – rozšíření: jakákoli property může číst HTML atributy jakéhokoli typu - **Container Style Queries** – `@container` se `style()` funkcí, styly na základě computed values custom properties - **`contrast-color()`** – CSS funkce pro zaručený kontrast barvy - **Custom Highlights** – stylování libovolných textových rozsahů bez extra DOM elementů - **`shape()`** – komplexní tvary pro `clip-path` (přichází ze Safari 18.4) <!--.element: class="c-text-xs fragment" --> note: --- #### Interop 2026 **Layout a positioning:** - **Anchor Positioning** – pokračování z 2025, edge case opravy - **Scroll Snap** – opravy konzistence chování <!--.element: class="c-text-xs" --> **View Transitions:** - **Rozšíření o cross-document view transitions** – přechody mezi stránkami bez JS <!--.element: class="c-text-xs" --> **Dialog a Popover:** - Sbírka návrhů kolem `<dialog>`, `popover`, pseudo-třídy `:open` <!--.element: class="c-text-xs" --> --- #### Interop 2026 **JavaScript/Web API:** - **`fetch()`** – ReadableStream v body, FormData, Range header - **IndexedDB** – `getAllRecords()` pro rychlé čtení velkých datasetů - **JSPI** (JavaScript Promise Integration API) – Wasm + asynchronní JS <!--.element: class="c-text-xs" --> **Web Compat (opravy existujících problémů):** - ESM module loading (cyklické moduly, multiple top-level awaits) - Timing scroll events vs. animation events - `user-select` (bez `-webkit-` prefixu) - **WebRTC** – pokračuje z 2025 (91.6% pass rate) - **CSS Zoom** – pokračování z 2025 <!--.element: class="c-text-xs" --> --- #### Interop 2026 **Investigation areas (příprava pro budoucí roky):** 1. **Accessibility testing** – konzistentní accessibility trees 2. **JPEG XL** – testovatelnost formátu (Mozilla experimentuje s Rust dekodérem!) 3. **Mobile testing** – dynamické viewport changes 4. **WebVTT** – opravy testů a spec pro titulky <!--.element: class="c-text-xs" --> note: ### (b) Diskuzní body - **25 → 95 za rok!** Interop 2025 byl masivní úspěch. Pamatujete dobu, kdy každý prohlížeč dělal věci jinak? IE6 flashbacky - **Edge transparentnost:** Microsoft v blogu otevřeně říká, že výběrový proces je pro vývojáře neprůhledný a chtějí to zlepšit - **Mozilla vs. "miliardáři":** Mozilla v blogu vtipně poznamenala, že jejich engine je jediný, který nevlastní miliardáři – a přesto se zavázali k většímu scope než ostatní - **Od jednotlivých fičur se dá odrazit dál:** Container Style Queries → design tokeny v CSS; `attr()` → dynamická HTML; cross-doc View Transitions → SPA-like UX bez SPA - **JPEG XL drama:** Není focus area, ale investigation. Mozilla experimentuje s Rust dekodérem, Chrome s dekodérem od Google Research. Stojí za sledování - **Co chybí?** Grid Lanes není v Interop 2026 (ještě nedostatečně testovatelné). Může být v 2027 **Zdroje:** - [web.dev (Google)](https://web.dev/blog/interop-2026) - [Mozilla Hacks](https://hacks.mozilla.org/2026/02/launching-interop-2026/) - [WebKit (Apple)](https://webkit.org/blog/17818/announcing-interop-2026/) - [Microsoft Edge blog](https://blogs.windows.com/msedgedev/2026/02/12/microsoft-edge-and-interop-2026/) - [Igalia](https://www.igalia.com/news/interop-2026.html) - [CSS-Tricks](https://css-tricks.com/interop-2026/) - [GitHub repo](https://github.com/web-platform-tests/interop) - [Dashboard](https://wpt.fyi/interop-2026?stable) - [Nowwwinky – Interop probíráno v 03/2025](https://nowwwinky.koutik.cz/)