[{"data":1,"prerenderedAt":560},["ShallowReactive",2],{"i-lucide:arrow-right":3,"i-simple-icons:linkedin":8,"i-simple-icons:github":11,"i-lucide:file-text":13,"i-lucide:arrow-up":15,"home-pl":17,"i-lucide:download":520,"i-lucide:panels-top-left":522,"i-lucide:arrow-up-right":524,"i-lucide:layout-template":526,"i-lucide:shopping-bag":528,"i-lucide:credit-card":530,"i-lucide:check":532,"i-lucide:life-buoy":534,"i-lucide:sparkles":536,"i-lucide:loader-circle":538,"i-lucide:database":540,"i-lucide:webhook":542,"i-lucide:lock":544,"i-lucide:circle-check":546,"i-lucide:arrow-down":548,"i-simple-icons:laravel":550,"i-simple-icons:livewire":552,"i-simple-icons:vuedotjs":554,"i-simple-icons:typescript":556,"i-lucide:plus":558},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7l7 7l-7 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9,"hidden":10},"\u003Cpath fill=\"currentColor\" d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z\"\u002F>",true,{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":12},"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":14},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"\u002F>\u003Cpath d=\"M14 2v5a1 1 0 0 0 1 1h5M10 9H8m8 4H8m8 4H8\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":16},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m5 12l7-7l7 7m-7 7V5\"\u002F>",{"home":18,"projects":218},{"id":19,"ai":20,"contact":22,"extension":25,"faq":26,"hero":44,"meta":49,"nda":50,"services":51,"stack":81,"stem":160,"story":161,"__hash__":217},"home_pl\u002Fpl\u002Fhome.yml",{"title":21},"Kod piszę razem z Claude Code",{"title":23,"lead":24},"Napisz do mnie.","Opisz w kilku zdaniach, co chcesz zbudować albo poprawić. Zwykle odpisuję w ciągu jednego dnia roboczego.","yml",{"title":27,"items":28},"Zanim napiszesz",[29,32,35,38,41],{"q":30,"a":31},"Jak się rozliczamy?","Godzinowo, na fakturę VAT. Przed startem dostajesz wycenę, ile godzin zajmie ustalony zakres.",{"q":33,"a":34},"Ile czeka się na wycenę?","Zwykle 2–3 dni robocze od ustalenia zakresu.",{"q":36,"a":37},"Pracujesz zdalnie?","Tak, tylko zdalnie.",{"q":39,"a":40},"Co po wdrożeniu?","Mogę zająć się utrzymaniem w miesięcznym pakiecie, czyli stałą liczbą godzin na poprawki, aktualizacje i rozwój.",{"q":42,"a":43},"Przejmujesz istniejące projekty?","Zwykle nie. Biorę projekty, które buduję od początku, bo wtedy odpowiadam za całość.",{"title":45,"highlight":46,"lead":47,"since":48},"Sklepy i panele","z płatnościami i API.","Od 2020 roku piszę w Laravelu i Vue. Robię sklepy i strony z panelem, w którym klient sam zmienia treści.",2020,{},"Reszta mojej pracy to systemy klientów objęte NDA. Nie pokażę ich tutaj, ale chętnie opowiem, czym się w nich zajmuję.",{"title":52,"items":53},"Co mogę dla Ciebie zrobić",[54,61,67,76],{"icon":55,"title":56,"text":57,"points":58},"lucide:layout-template","Strona z panelem CMS","Strona firmowa z panelem, w którym sam zmieniasz teksty, zdjęcia i podstrony.",[59,60],"Usunięta podstrona trafia do kosza i da się ją przywrócić","Sitemap i przekierowania po zmianie adresu robią się same",{"icon":62,"title":63,"text":64,"points":65},"lucide:shopping-bag","Sklep internetowy","Sklep w Laravelu, z frontem w Vue i Nuxt albo w Blade i Livewire. Do tego płatności online i maile do klientów.",[66],"Połączenie z Allegro przez jego API",{"icon":68,"title":69,"text":70,"points":71},"lucide:credit-card","Płatności i integracje","Podpinam bramki płatności i usługi zewnętrzne do aplikacji, którą buduję.",[72,73,74,75],"BLIK i przelewy przez bramkę, której używasz, na przykład ING Pay","Webhooki ze sprawdzaniem podpisu i ponawianiem odrzuconej płatności","Dane firmy uzupełniane po wpisaniu NIP-u","REST API z OAuth dla aplikacji i partnerów",{"icon":77,"title":78,"text":79,"points":80},"lucide:life-buoy","Utrzymanie","Po wdrożeniu mogę zostać przy projekcie. Co miesiąc mamy ustaloną liczbę godzin i wydajemy je na to, co akurat jest potrzebne, od aktualizacji po nowe funkcje.",[],[82,108,128,139],{"group":83,"items":84},"Backend",[85,88,92,96,99,102,105],{"name":86,"icon":87},"PHP","simple-icons:php",{"name":89,"icon":90,"featured":10,"note":91},"Laravel","simple-icons:laravel","Backend, API i kolejki",{"name":93,"icon":94,"featured":10,"note":95},"Livewire","simple-icons:livewire","Panele bez osobnego SPA",{"name":97,"icon":98},"MySQL \u002F MariaDB","simple-icons:mariadb",{"name":100,"icon":101},"PostgreSQL","simple-icons:postgresql",{"name":103,"icon":104},"Redis","simple-icons:redis",{"name":106,"icon":107},"Kolejki i workery","lucide:layers",{"group":109,"items":110},"Frontend",[111,115,118,122,125],{"name":112,"icon":113,"featured":10,"note":114},"Vue","simple-icons:vuedotjs","Frontend i panele SPA",{"name":116,"icon":117},"Nuxt","simple-icons:nuxt",{"name":119,"icon":120,"featured":10,"note":121},"TypeScript","simple-icons:typescript","Typowany frontend w Vue i Nuxt",{"name":123,"icon":124},"Tailwind CSS","simple-icons:tailwindcss",{"name":126,"icon":127},"Vite","simple-icons:vite",{"group":129,"items":130},"Integracje",[131,134,137],{"name":132,"icon":133},"REST API","lucide:webhook",{"name":135,"icon":136},"Systemy kolejkowe","lucide:workflow",{"name":138,"icon":68},"Bramki płatności",{"group":140,"items":141},"Narzędzia",[142,145,148,151,154,157],{"name":143,"icon":144},"Git","simple-icons:git",{"name":146,"icon":147},"GitHub Actions","simple-icons:githubactions",{"name":149,"icon":150},"Bun","simple-icons:bun",{"name":152,"icon":153},"Cloudflare","simple-icons:cloudflare",{"name":155,"icon":156},"PhpStorm","simple-icons:phpstorm",{"name":158,"icon":159},"Claude Code","simple-icons:claude","pl\u002Fhome",{"lead":162,"stages":163,"scenario":176},"Przykład z LeatherMaster, zapisy na szkolenia z płatnością BLIK.",[164,167,170,173],{"title":165,"text":166},"Polecenie","Opisuję funkcję prostym językiem i ustalam plan.",{"title":168,"text":169},"Kod","Claude pisze kod według ustalonego planu.",{"title":171,"text":172},"Testy","Testy przechodzą, a ja czytam i klikam zmianę.",{"title":174,"text":175},"Wdrożenie","Automatycznie, ze smoke testem na produkcji.",{"prompt":177,"steps":178,"preview":196,"layers":205},"Dodaj zapisy na szkolenia z płatnością BLIK",[179,181,184,187,190,193],{"text":180},"Plan: model, formularz, płatność",{"text":182,"reveals":183},"Model TrainingBooking i migracja","content",{"text":185,"reveals":186},"Formularz zapisu w Livewire","controls",{"text":188,"reveals":189},"Płatność BLIK przez ING Pay","action",{"text":191,"reveals":192},"Testy: 200+ passed","tests",{"text":194,"reveals":195},"Wdrożono na produkcję","deploy",{"url":197,"title":198,"fields":199,"tests":203,"toast":204},"leathermaster.pl\u002Fszkolenia","Szkolenie: renowacja skóry",[200,201,202],"Imię i nazwisko","E-mail","Zapłać BLIK","200+ testów","Zapis potwierdzony",{"api":206,"db":207,"table":208,"rows":209,"requests":213},"API","Baza danych","training_bookings",[210,211,212],"#1042 · Anna K. · opłacone","#1043 · Piotr W. · opłacone","#1044 · Ewa M. · oczekuje",[214,215,216],"POST \u002Fbookings → 201","POST \u002Fpayments\u002Fblik → 202","POST \u002Fwebhooks\u002Fing-pay → 200","CYwxNcWtFpTFtWFZVZyEf3fei8CDkaAdhEB-H_jsHUw",[219,408],{"id":220,"title":221,"body":222,"description":313,"extension":326,"facts":327,"gallery":340,"highlights":365,"image":379,"meta":382,"navigation":10,"order":383,"path":384,"role":385,"screens":386,"seo":398,"stack":399,"stem":404,"summary":405,"url":307,"year":406,"__hash__":407},"projects_pl\u002Fprojekty\u002Fleathermaster.md","LeatherMaster",{"type":223,"value":224,"toc":312},"minimark",[225,230,234,238,241,245,250,258,261,265,268,275,279,286,290,297,301],[226,227,229],"h2",{"id":228},"zadanie","Zadanie",[231,232,233],"p",{},"Zakład z Dąbrówki pod Poznaniem potrzebował strony, która pokaże usługi i metamorfozy przed i po, przyjmie zapisy na szkolenia z płatnością online i da się edytować bez programisty.",[226,235,237],{"id":236},"co-zrobiłem","Co zrobiłem",[231,239,240],{},"Wszystko sam. Rozmawiałem z właścicielem, zaprojektowałem stronę, napisałem backend w Laravelu, front w Blade i Tailwindzie oraz panel w Livewire, podpiąłem płatności i ustawiłem CI\u002FCD.",[226,242,244],{"id":243},"szczegóły","Szczegóły",[246,247,249],"h3",{"id":248},"zapisy-i-płatności","Zapisy i płatności",[231,251,252,253,257],{},"Jednym zapisem można zarezerwować kilka miejsc i podać nazwisko każdego uczestnika. Rezerwacja ma licznik czasu i po nim wygasa, a po opłaceniu klient dostaje plik ",[254,255,256],"code",{},".ics"," do kalendarza. Dane firmy wypełniają się same po wpisaniu NIP-u. Biorę je z białej listy VAT i trzymam w cache przez 24 godziny, bo API ma dzienny limit zapytań.",[231,259,260],{},"Płatności idą przez ING Pay, BLIK-iem albo przelewem. Webhook sprawdza podpis, a odrzuconą lub wygasłą płatność klient może ponowić. Sandbox w kilku miejscach zachowuje się inaczej, niż mówi dokumentacja, więc zapisałem to w README.",[246,262,264],{"id":263},"panel","Panel",[231,266,267],{},"Usunięte rzeczy leżą w koszu panelu przez 30 dni i można je przywrócić. Każdy rekord ma historię zmian, ekrany wyszukuje się pod ⌘K, a na telefonie menu jest w dolnym pasku.",[231,269,270],{},[271,272],"img",{"alt":273,"src":274},"Pulpit panelu LeatherMaster: najbliższe terminy szkoleń z liczbą zajętych miejsc i ostatnie zapisy ze statusem płatności (dane przykładowe)","\u002Fimages\u002Fprojects\u002Fleathermaster-panel.webp",[246,276,278],{"id":277},"bezpieczeństwo","Bezpieczeństwo",[231,280,281,282,285],{},"Do panelu loguje się passkeyem i kodem 2FA. Identyfikatory passkeyów podpisuję osobnym sekretem, żeby zmiana ",[254,283,284],{},"APP_KEY"," ich nie unieważniła.",[246,287,289],{"id":288},"seo","SEO",[231,291,292,293,296],{},"Sitemap i dane strukturalne generują się same. Gdy zmieni się adres podstrony, stary przekierowuje 301 na nowy, a wyłączona strona odpowiada 503 z nagłówkiem ",[254,294,295],{},"Retry-After",".",[226,298,300],{"id":299},"efekt","Efekt",[231,302,303,304,311],{},"Strona działa pod adresem ",[305,306,310],"a",{"href":307,"rel":308},"https:\u002F\u002Fwww.leathermaster.pl",[309],"nofollow","leathermaster.pl",". Właściciel sam zmienia treści i dodaje terminy szkoleń, a zapisy obsługuje w panelu bez mojej pomocy.",{"title":313,"searchDepth":314,"depth":314,"links":315},"",2,[316,317,318,325],{"id":228,"depth":314,"text":229},{"id":236,"depth":314,"text":237},{"id":243,"depth":314,"text":244,"children":319},[320,322,323,324],{"id":248,"depth":321,"text":249},3,{"id":263,"depth":321,"text":264},{"id":277,"depth":321,"text":278},{"id":288,"depth":321,"text":289},{"id":299,"depth":314,"text":300},"md",[328,331,334,337],{"value":329,"label":330},"BLIK","płatność za szkolenie przez ING Pay",{"value":332,"label":333},"Passkey","logowanie do panelu, do tego 2FA",{"value":335,"label":336},"250+","testów przy każdym pushu",{"value":338,"label":339},"30 dni","na przywrócenie usuniętej treści",[341,346,351,355,360],{"src":342,"alt":343,"title":344,"text":345},"\u002Fimages\u002Fprojects\u002Fleathermaster-training.webp","Strona szkolenia LeatherMaster: zdjęcie z zajęć, najbliższy termin, cena za osobę i przycisk zapisu","Strona szkolenia.","Najbliższy termin, cena za osobę i forma zajęć. Stąd klient przechodzi do zapisów.",{"src":347,"alt":348,"title":349,"text":350},"\u002Fimages\u002Fprojects\u002Fleathermaster-booking.webp","Formularz zapisu na szkolenie w trzech krokach, z podsumowaniem terminu i ceny obok","Zapis na termin.","Trzy kroki, czyli dane, płatność i potwierdzenie. Dane firmy uzupełniają się po wpisaniu NIP-u.",{"src":274,"alt":352,"title":353,"text":354},"Pulpit panelu LeatherMaster: najbliższe terminy szkoleń i ostatnie zapisy ze statusem płatności (dane przykładowe)","Pulpit.","Po zalogowaniu właściciel widzi najbliższe terminy, wolne miejsca i to, czy ostatnie zapisy są opłacone.",{"src":356,"alt":357,"title":358,"text":359},"\u002Fimages\u002Fprojects\u002Fleathermaster-terms.webp","Kalendarz terminów w panelu z listą terminów grupowych i indywidualnych oraz przełącznikiem widoczności","Terminy i zapisy.","Kalendarz z terminami grupowymi i indywidualnymi. Każdy termin chowa się ze strony jednym przełącznikiem.",{"src":361,"alt":362,"title":363,"text":364},"\u002Fimages\u002Fprojects\u002Fleathermaster-editor.webp","Edycja szkolenia w panelu: edytor opisu, zdjęcie z ustawianym kadrem i przycisk zapisu","Edycja szkolenia.","Opis w edytorze, zdjęcie z ustawianym kadrem i zapis skrótem ⌘S.",[366,368,372,375],{"icon":68,"title":249,"text":367},"Rezerwacja miejsc na szkolenia i płatność BLIK przez ING Pay, z weryfikacją webhooków i ponowieniem płatności.",{"icon":369,"title":370,"text":371},"lucide:layout-dashboard","Panel w Livewire 4","Przejścia bez przeładowań, wyszukiwarka ⌘K, historia zmian i kosz z przywracaniem.",{"icon":373,"title":278,"text":374},"lucide:key-round","Logowanie passkey i 2FA, Content Security Policy, limity formularzy i Turnstile.",{"icon":376,"title":377,"text":378},"lucide:git-branch","CI\u002FCD","Testy i analiza statyczna przy każdym pushu, deploy z wersją CalVer i smoke testem.",{"src":380,"alt":381},"\u002Fimages\u002Fprojects\u002Fleathermaster.webp","Strona główna LeatherMaster: nagłówek z ofertą renowacji skóry i przyciskiem kontaktu",{},"1","\u002Fprojekty\u002Fleathermaster","Projekt, backend, frontend, wdrożenie",[387,393],{"label":388,"path":389,"src":380,"mobile":390,"alt":381,"title":391,"text":392},"Strona","\u002F","\u002Fimages\u002Fprojects\u002Fleathermaster-mobile.webp","Klient zapisuje się i płaci.","Wybiera termin szkolenia, wpisuje dane i płaci BLIK-iem albo przelewem.",{"label":264,"path":394,"src":274,"mobile":395,"alt":352,"title":396,"text":397},"\u002Fpanel","\u002Fimages\u002Fprojects\u002Fleathermaster-panel-mobile.webp","Właściciel widzi to w panelu.","Zapis trafia na pulpit razem ze statusem płatności, obok najbliższych terminów.",{"title":221,"description":313},[400,401,402,403,146,152],"Laravel 13","Livewire 4","Tailwind CSS 4","MySQL","projekty\u002Fleathermaster","Strona i własny panel CMS dla zakładu renowacji tapicerki skórzanej. Klienci zapisują się na szkolenia i płacą online, a właściciel sam zmienia treści w panelu.","2026","cWkq2EUvqy4eUws6BN33gbeu-Xajd1VspzCtdWf2PIE",{"id":409,"title":410,"body":411,"description":313,"extension":326,"facts":477,"gallery":490,"highlights":491,"image":504,"meta":507,"navigation":10,"order":508,"path":509,"role":510,"screens":490,"seo":511,"stack":512,"stem":516,"summary":517,"url":518,"year":406,"__hash__":519},"projects_pl\u002Fprojekty\u002Fportfolio.md","Portfolio",{"type":223,"value":412,"toc":466},[413,415,418,420,423,427,431,434,438,441,445,448,452,455,458,460],[226,414,229],{"id":228},[231,416,417],{},"Potrzebowałem strony, która w 30 sekund pokaże, że dowożę produkcyjne systemy, i da prostą drogę do kontaktu. Do tego dwa języki i CV, które nie rozjedzie się ze stroną.",[226,419,237],{"id":236},[231,421,422],{},"Plan, architekturę i teksty ustaliłem sam, kod pisałem z Claude Code. Każdą zmianę czytałem i sprawdzałem w przeglądarce, zanim trafiła na produkcję.",[226,424,426],{"id":425},"decyzje","Decyzje",[246,428,430],{"id":429},"statyczny-html","Statyczny HTML",[231,432,433],{},"Strony są prerenderowane, więc nie ma serwera do utrzymania. Jedyny endpoint to formularz kontaktowy, który działa jako funkcja na Cloudflare.",[246,435,437],{"id":436},"animacje-w-css","Animacje w CSS",[231,439,440],{},"Nagłówek, oś doświadczenia i wejścia sekcji działają na animacjach sterowanych scrollem, bez JavaScriptu. Przy ograniczeniu ruchu się wyłączają.",[246,442,444],{"id":443},"e-mail-składany-w-przeglądarce","E-mail składany w przeglądarce",[231,446,447],{},"Pełnego adresu nie ma ani w HTML-u, ani w bundlu, więc boty zbierające adresy go nie znajdą.",[226,449,451],{"id":450},"co-poprawiałem-po-drodze","Co poprawiałem po drodze",[231,453,454],{},"Treść sekcji czekała na hydratację i przy wolnym łączu mogła zostać niewidoczna. Odsłanianie przeniosłem do CSS i jednego obserwatora, niezależnego od ładowania sekcji.",[231,456,457],{},"Rok w stopce i w liczbie lat rozjeżdżał się po Nowym Roku między HTML-em a przeglądarką. Teraz trafia do payloadu z buildu.",[226,459,300],{"id":299},[231,461,303,462,465],{},[305,463,464],{"href":389},"adriannita.pl",". Każdy push przechodzi lint, typy, testy i build, a po wdrożeniu smoke test sprawdza stronę i formularz.",{"title":313,"searchDepth":314,"depth":314,"links":467},[468,469,470,475,476],{"id":228,"depth":314,"text":229},{"id":236,"depth":314,"text":237},{"id":425,"depth":314,"text":426,"children":471},[472,473,474],{"id":429,"depth":321,"text":430},{"id":436,"depth":321,"text":437},{"id":443,"depth":321,"text":444},{"id":450,"depth":314,"text":451},{"id":299,"depth":314,"text":300},[478,481,484,487],{"value":479,"label":480},"1 dzień","od pierwszego commita do wdrożenia",{"value":482,"label":483},"CSP","nagłówki bezpieczeństwa na Cloudflare",{"value":485,"label":486},"PL \u002F EN","dwie wersje językowe",{"value":488,"label":489},"1 JSON","z niego powstaje strona i CV w PDF",null,[492,495,499,502],{"icon":493,"title":437,"text":494},"lucide:sparkles","Nagłówek, oś doświadczenia i przejścia między stronami na animacjach sterowanych scrollem i View Transitions.",{"icon":496,"title":497,"text":498},"lucide:shield-check","CSP i nagłówki","Content Security Policy z hashami skryptów inline i nagłówki bezpieczeństwa na Cloudflare.",{"icon":500,"title":289,"text":501},"lucide:search","Schema.org ProfilePage, hreflang, sitemap i obrazki OG generowane przy buildzie.",{"icon":376,"title":377,"text":503},"Lint, typy, testy i build przy każdym pushu, smoke test po wdrożeniu i wydania CalVer.",{"src":505,"alt":506},"\u002Fimages\u002Fprojects\u002Fportfolio.webp","Strona główna portfolio: nagłówek o sklepach i panelach z płatnościami i API",{},"2","\u002Fprojekty\u002Fportfolio","Projekt, kod z Claude Code, wdrożenie",{"title":410,"description":313},[513,112,119,402,514,515],"Nuxt 4","Nuxt Content","Cloudflare Pages","projekty\u002Fportfolio","Ta strona. Dwa języki, statyczny HTML, case study i CV generowane z tych samych danych, a kod napisany razem z Claude Code.","https:\u002F\u002Fwww.adriannita.pl","9jzblys0okUGT_EKTpH8V_D2V3fyys0Agrg6R8OY6qA",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":521},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M12 15V3m9 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"\u002F>\u003Cpath d=\"m7 10l5 5l5-5\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":523},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\"\u002F>\u003Cpath d=\"M3 9h18M9 21V9\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":525},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M7 7h10v10M7 17L17 7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":527},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"18\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\"\u002F>\u003Crect width=\"9\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\"\u002F>\u003Crect width=\"5\" height=\"7\" x=\"16\" y=\"14\" rx=\"1\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":529},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M16 10a4 4 0 0 1-8 0M3.103 6.034h17.794\"\u002F>\u003Cpath d=\"M3.4 5.467a2 2 0 0 0-.4 1.2V20a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6.667a2 2 0 0 0-.4-1.2l-2-2.667A2 2 0 0 0 17 2H7a2 2 0 0 0-1.6.8z\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":531},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"20\" height=\"14\" x=\"2\" y=\"5\" rx=\"2\"\u002F>\u003Cpath d=\"M2 10h20M6 14h2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":533},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M20 6L9 17l-5-5\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":535},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m4.93 4.93l4.24 4.24m5.66 0l4.24-4.24m-4.24 9.9l4.24 4.24m-9.9-4.24l-4.24 4.24\"\u002F>\u003Ccircle cx=\"12\" cy=\"12\" r=\"4\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":537},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594zM20 2v4m2-2h-4\"\u002F>\u003Ccircle cx=\"4\" cy=\"20\" r=\"2\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":539},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M21 12a9 9 0 1 1-6.219-8.56\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":541},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\"\u002F>\u003Cpath d=\"M3 5v14a9 3 0 0 0 18 0V5\"\u002F>\u003Cpath d=\"M3 12a9 3 0 0 0 18 0\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":543},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2\"\u002F>\u003Cpath d=\"m6 17l3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06\"\u002F>\u003Cpath d=\"m12 6l3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":545},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\"\u002F>\u003Cpath d=\"M7 11V7a5 5 0 0 1 10 0v4\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":547},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m16 9l-5.5 5.5L8 12\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":549},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 5v14m7-7l-7 7l-7-7\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":551},"\u003Cpath fill=\"currentColor\" d=\"M23.642 5.43a.4.4 0 0 1 .014.1v5.149c0 .135-.073.26-.189.326l-4.323 2.49v4.934a.38.38 0 0 1-.188.326L9.93 23.949a.3.3 0 0 1-.066.027l-.024.01a.35.35 0 0 1-.192 0q-.016-.005-.03-.012q-.031-.01-.062-.025L.533 18.755a.38.38 0 0 1-.189-.326V2.974q0-.05.014-.098c.003-.012.01-.02.014-.032a.4.4 0 0 1 .023-.058c.004-.013.015-.022.023-.033l.033-.045l.037-.027q.02-.018.041-.034H.53L5.043.05a.38.38 0 0 1 .375 0L9.93 2.647h.002q.021.015.04.033l.038.027c.013.014.02.03.033.045c.008.011.02.021.025.033q.014.029.024.058c.003.011.01.021.013.032q.014.047.014.098v9.652l3.76-2.164V5.527q0-.05.013-.098q.007-.014.013-.032l.024-.059c.007-.012.018-.02.025-.033l.033-.043q.019-.017.037-.028q.02-.017.041-.032h.001l4.513-2.598a.38.38 0 0 1 .375 0l4.513 2.598c.016.01.027.021.042.031l.036.028l.034.044c.008.012.019.021.024.033a.3.3 0 0 1 .024.06q.01.015.015.032m-.74 5.032V6.179l-1.578.908l-2.182 1.256v4.283zm-4.51 7.75v-4.287l-2.147 1.225l-6.126 3.498v4.325zM1.093 3.624v14.588l8.273 4.761v-4.325l-4.322-2.445l-.002-.003H5.04L5 16.169l-.035-.027l-.001-.002q-.018-.018-.031-.04q-.016-.016-.028-.036h-.002l-.02-.047c-.006-.016-.014-.027-.018-.043l-.008-.057q-.005-.02-.006-.041V5.789l-2.18-1.257zM5.23.81L1.47 2.974l3.76 2.164l3.758-2.164zm1.956 13.505l2.182-1.256V3.624l-1.58.91l-2.182 1.255v9.435zm11.581-10.95l-3.76 2.163l3.76 2.163l3.759-2.164zm-.376 4.978L16.21 7.087l-1.58-.907v4.283l2.182 1.256l1.58.908zm-8.65 9.654l5.514-3.148l2.756-1.572l-3.757-2.163l-4.323 2.489l-3.941 2.27z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":553},"\u003Cpath fill=\"currentColor\" d=\"M12.001 0C6.174 0 1.448 4.957 1.448 11.072c0 2.09.552 4.042 1.51 5.71c.25.279.544.484.965.484c1.339 0 1.268-2.065 2.607-2.065s1.411 2.065 2.75 2.065c1.34 0 1.266-2.065 2.606-2.065c.584 0 .928.397 1.24.84c-.221-.205-.48-.348-.82-.348c-1.196 0-1.307 1.678-2.201 2.141v4.51a1.657 1.657 0 0 0 3.312 0V16.45c.308.433.647.815 1.22.815c1.34 0 1.267-2.065 2.606-2.065c.465 0 .774.255 1.04.58a1.1 1.1 0 0 0-.43-.088c-1.159 0-1.297 1.574-2.118 2.094v2.436a1.49 1.49 0 0 0 2.98 0V16.37c.324.466.67.895 1.278.895c.796 0 1.093-.73 1.485-1.32a11.5 11.5 0 0 0 1.074-4.874C22.552 4.957 17.828 0 12 0m-.566 2.877c2.88 0 5.214 2.784 5.214 5.807s-1.545 5.15-5.214 5.15s-5.215-2.127-5.215-5.15s2.335-5.807 5.215-5.807m-1.403 1.66a1.955 2.158 0 0 0-1.955 2.158a1.955 2.158 0 0 0 1.955 2.158a1.955 2.158 0 0 0 1.955-2.158a1.955 2.158 0 0 0-1.955-2.158m-.326.664a.978.996 0 0 1 .979.996a.978.996 0 0 1-.979.996a.978.996 0 0 1-.977-.996a.978.996 0 0 1 .977-.996m-2.95 10.493c-1.074 0-1.272 1.354-1.95 1.964v1.782a1.49 1.49 0 0 0 2.98 0v-3.182c-.264-.324-.577-.564-1.03-.564\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":555},"\u003Cpath fill=\"currentColor\" d=\"M24 1.61h-9.94L12 5.16L9.94 1.61H0l12 20.78ZM12 14.08L5.16 2.23h4.43L12 6.41l2.41-4.18h4.43Z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":557},"\u003Cpath fill=\"currentColor\" d=\"M1.125 0C.502 0 0 .502 0 1.125v21.75C0 23.498.502 24 1.125 24h21.75c.623 0 1.125-.502 1.125-1.125V1.125C24 .502 23.498 0 22.875 0zm17.363 9.75q.918 0 1.627.111a6.4 6.4 0 0 1 1.306.34v2.458a4 4 0 0 0-.643-.361a5 5 0 0 0-.717-.26a5.5 5.5 0 0 0-1.426-.2q-.45 0-.819.086a2.1 2.1 0 0 0-.623.242q-.254.156-.393.374a.9.9 0 0 0-.14.49q0 .294.156.529q.156.234.443.444c.287.21.423.276.696.41q.41.203.926.416q.705.296 1.266.628q.561.333.963.753q.402.418.614.957q.213.538.214 1.253q0 .986-.373 1.656a3 3 0 0 1-1.012 1.085a4.4 4.4 0 0 1-1.487.596q-.85.18-1.79.18a10 10 0 0 1-1.84-.164a5.5 5.5 0 0 1-1.512-.493v-2.63a5.03 5.03 0 0 0 3.237 1.2q.5 0 .872-.09q.373-.09.623-.25q.249-.162.373-.38a1.02 1.02 0 0 0-.074-1.089a2.1 2.1 0 0 0-.537-.5a5.6 5.6 0 0 0-.807-.444a28 28 0 0 0-1.007-.436q-1.377-.575-2.053-1.405t-.676-2.005q0-.92.369-1.582q.368-.662 1.004-1.089a4.5 4.5 0 0 1 1.47-.629a7.5 7.5 0 0 1 1.77-.201m-15.113.188h9.563v2.166H9.506v9.646H6.789v-9.646H3.375z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":559},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 12h14m-7-7v14\"\u002F>",1792786034481]