[{"data":1,"prerenderedAt":171},["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,"project-pl-portfolio":17,"projects-pl":153,"i-lucide:lock":159,"i-lucide:sparkles":161,"i-lucide:chevron-left":163,"i-lucide:git-branch":165,"i-lucide:shield-check":167,"i-lucide:search":169},{"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>",{"id":18,"title":19,"body":20,"description":89,"extension":102,"facts":103,"gallery":116,"highlights":117,"image":133,"meta":136,"navigation":10,"order":137,"path":138,"role":139,"screens":116,"seo":140,"stack":141,"stem":148,"summary":149,"url":150,"year":151,"__hash__":152},"projects_pl\u002Fprojekty\u002Fportfolio.md","Portfolio",{"type":21,"value":22,"toc":88},"minimark",[23,28,32,36,39,43,48,51,55,58,62,65,69,72,75,79],[24,25,27],"h2",{"id":26},"zadanie","Zadanie",[29,30,31],"p",{},"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ą.",[24,33,35],{"id":34},"co-zrobiłem","Co zrobiłem",[29,37,38],{},"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ę.",[24,40,42],{"id":41},"decyzje","Decyzje",[44,45,47],"h3",{"id":46},"statyczny-html","Statyczny HTML",[29,49,50],{},"Strony są prerenderowane, więc nie ma serwera do utrzymania. Jedyny endpoint to formularz kontaktowy, który działa jako funkcja na Cloudflare.",[44,52,54],{"id":53},"animacje-w-css","Animacje w CSS",[29,56,57],{},"Nagłówek, oś doświadczenia i wejścia sekcji działają na animacjach sterowanych scrollem, bez JavaScriptu. Przy ograniczeniu ruchu się wyłączają.",[44,59,61],{"id":60},"e-mail-składany-w-przeglądarce","E-mail składany w przeglądarce",[29,63,64],{},"Pełnego adresu nie ma ani w HTML-u, ani w bundlu, więc boty zbierające adresy go nie znajdą.",[24,66,68],{"id":67},"co-poprawiałem-po-drodze","Co poprawiałem po drodze",[29,70,71],{},"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.",[29,73,74],{},"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.",[24,76,78],{"id":77},"efekt","Efekt",[29,80,81,82,87],{},"Strona działa pod adresem ",[83,84,86],"a",{"href":85},"\u002F","adriannita.pl",". Każdy push przechodzi lint, typy, testy i build, a po wdrożeniu smoke test sprawdza stronę i formularz.",{"title":89,"searchDepth":90,"depth":90,"links":91},"",2,[92,93,94,100,101],{"id":26,"depth":90,"text":27},{"id":34,"depth":90,"text":35},{"id":41,"depth":90,"text":42,"children":95},[96,98,99],{"id":46,"depth":97,"text":47},3,{"id":53,"depth":97,"text":54},{"id":60,"depth":97,"text":61},{"id":67,"depth":90,"text":68},{"id":77,"depth":90,"text":78},"md",[104,107,110,113],{"value":105,"label":106},"1 dzień","od pierwszego commita do wdrożenia",{"value":108,"label":109},"CSP","nagłówki bezpieczeństwa na Cloudflare",{"value":111,"label":112},"PL \u002F EN","dwie wersje językowe",{"value":114,"label":115},"1 JSON","z niego powstaje strona i CV w PDF",null,[118,121,125,129],{"icon":119,"title":54,"text":120},"lucide:sparkles","Nagłówek, oś doświadczenia i przejścia między stronami na animacjach sterowanych scrollem i View Transitions.",{"icon":122,"title":123,"text":124},"lucide:shield-check","CSP i nagłówki","Content Security Policy z hashami skryptów inline i nagłówki bezpieczeństwa na Cloudflare.",{"icon":126,"title":127,"text":128},"lucide:search","SEO","Schema.org ProfilePage, hreflang, sitemap i obrazki OG generowane przy buildzie.",{"icon":130,"title":131,"text":132},"lucide:git-branch","CI\u002FCD","Lint, typy, testy i build przy każdym pushu, smoke test po wdrożeniu i wydania CalVer.",{"src":134,"alt":135},"\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":19,"description":89},[142,143,144,145,146,147],"Nuxt 4","Vue","TypeScript","Tailwind CSS 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","2026","9jzblys0okUGT_EKTpH8V_D2V3fyys0Agrg6R8OY6qA",[154,158],{"path":155,"title":156,"summary":157},"\u002Fprojekty\u002Fleathermaster","LeatherMaster","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.",{"path":138,"title":19,"summary":149},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":160},"\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":162},"\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":164},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"m15 18l-6-6l6-6\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":166},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M15 6a9 9 0 0 0-9 9V3\"\u002F>\u003Ccircle cx=\"18\" cy=\"6\" r=\"3\"\u002F>\u003Ccircle cx=\"6\" cy=\"18\" r=\"3\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":168},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\"\u002F>\u003Cpath d=\"m9 12l2 2l4-4\"\u002F>\u003C\u002Fg>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":170},"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Cpath d=\"m21 21l-4.34-4.34\"\u002F>\u003Ccircle cx=\"11\" cy=\"11\" r=\"8\"\u002F>\u003C\u002Fg>",1792789502421]