[{"data":1,"prerenderedAt":77},["ShallowReactive",2],{"blog-count-pl":3,"blog-page-pl-1":4},8,[5,17,28,36,45,52,60,69],{"path":6,"title":7,"description":8,"date":9,"tags":10,"kind":14,"image":15,"art":16},"\u002Fpl\u002Fwpisy\u002F2026\u002Favif-webp-jpg-png-i-picture","AVIF, WebP, JPG czy PNG? I kiedy warto użyć \u003Cpicture>","Poradnik z pomiarem – te same obrazki w czterech formatach i czterech szerokościach. Który format wybrać, po co mniejsze wersje i kiedy \u003Cpicture> z kilkoma \u003Csource> ma sens, a kiedy tylko powiększa stronę.","2026-10-20",[11,12,13],"performance","html","images","post",null,"\u002Fart\u002Fblog\u002Fformaty-obrazkow.svg",{"path":18,"title":19,"description":20,"date":21,"tags":22,"kind":26,"image":15,"art":27},"\u002Fpl\u002Fwpisy\u002F2026\u002Fnaglowki-agrestapp","Nagłówki AgrestApp: 36 px dla myszy, 44 px dla palca","Jak w jeden dzień przepisałem nagłówek strony i panelu AgrestApp – jedno przesuwane menu, rozmiary zależne od sposobu obsługi i wysokość nagłówka w zmiennej CSS zamiast liczb wpisanych w kilku plikach.","2026-10-17",[23,24,25],"tailwind","vue","accessibility","case-study","\u002Fart\u002Fblog\u002Fnaglowki-agrestapp.svg",{"path":29,"title":30,"description":31,"date":32,"tags":33,"kind":26,"image":15,"art":35},"\u002Fpl\u002Fwpisy\u002F2026\u002Fmigracja-na-tailwind-v4","Tailwind v4 w dużym projekcie: 76 plików zamiast 339","Jak przeniosłem AgrestApp z Tailwinda 3 na 4 bez przepisywania szablonów – stare wartości w @theme, trzy zmiany w klasach i porządek w warstwach CSS.","2026-08-29",[23,34],"css","\u002Fart\u002Fblog\u002Fmigracja-na-tailwind-v4.svg",{"path":37,"title":38,"description":39,"date":40,"tags":41,"kind":14,"image":15,"art":44},"\u002Fpl\u002Fwpisy\u002F2026\u002Fosiem-ifow-i-jedna-mapa","Osiem ifów i jedna mapa","Jak zamienić długą listę warunków „jeśli akcja to X, otwórz okno X” na prosty obiekt w Vue 3 – i kiedy lepiej zostać przy zwykłym if.","2026-05-28",[24,42,43],"javascript","code-review","\u002Fart\u002Fblog\u002Fosiem-ifow.svg",{"path":46,"title":47,"description":48,"date":49,"tags":50,"kind":26,"image":15,"art":51},"\u002Fpl\u002Fwpisy\u002F2026\u002Ftabela-jak-arkusz","Tabela jak arkusz: Shift + klik i Enter","Dwa skróty znane z arkusza kalkulacyjnego w panelu AgrestApp – zaznaczanie zakresu wierszy przez Shift + klik i Enter, który przenosi do tego samego pola w wierszu niżej.","2026-03-14",[24,42],"\u002Fart\u002Fblog\u002Ftabela-jak-arkusz.svg",{"path":53,"title":54,"description":55,"date":56,"tags":57,"kind":14,"image":15,"art":59},"\u002Fpl\u002Fwpisy\u002F2026\u002Fjeden-modal-kilkanascie-kopii","Jeden modal, kilkanaście kopii","Ta sama funkcja do otwierania okna skopiowana do kilkunastu widoków – jak zebrać ją w jeden composable i udostępnić tabelom przez provide\u002Finject.","2026-03-02",[24,42,58],"composables","\u002Fart\u002Fblog\u002Fjeden-modal.svg",{"path":61,"title":62,"description":63,"date":64,"tags":65,"kind":14,"image":15,"art":68},"\u002Fpl\u002Fwpisy\u002F2024\u002Fpokedex-kilkadziesiat-zapytan-zamiast-tysiaca","Pokedex – kilkadziesiąt zapytań zamiast ponad tysiąca","Jak w czystym JavaScripcie zbudowałem Pokedex na ponad 1000 pokemonów – z kolejnością pobierania danych z PokéAPI i małą bazą w przeglądarce.","2024-03-20",[42,66,67],"pokeapi","projekt","\u002Fart\u002Fblog\u002Fpokedex.svg",{"path":70,"title":71,"description":72,"date":73,"tags":74,"kind":14,"image":15,"art":76},"\u002Fpl\u002Fwpisy\u002F2024\u002Ftrzy-ebooki-z-przepisami-i-jedna-zakladka","Trzy ebooki z przepisami i jedna zakładka w przeglądarce","Jak kilka ebooków z przepisami na kawę zamieniłem w jedną stronę z wyszukiwaniem po składnikach – i czego nauczyłem się przy tym o Vue 3 i TypeScripcie.","2024-02-12",[24,75,67],"typescript","\u002Fart\u002Fblog\u002Fcoffee-recipes.svg",1792530551683]