[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"tag-frontend-4":32,"tags-dev":195},[4,20],{"id":5,"slug":6,"name":7,"tagline":8,"description":9,"accentFrom":10,"accentTo":11,"icon":12,"defaultLocale":13,"locales":14,"features":16,"position":19},"019fe637-3d33-714b-b57f-23e163ffca0c","dev","Web Development","Build. Learn. Ship.","Practical courses, engineering-grade articles and open-source tools for people who ship.","violet-500","cyan-400","◇","en",[13,15],"fa",{"courses":17,"paths":17,"articles":17,"exams":18,"flashcards":18,"packages":17,"community":17,"certificates":17,"teams":17,"commerce":17},true,false,0,{"id":21,"slug":22,"name":23,"tagline":24,"description":25,"accentFrom":26,"accentTo":10,"icon":27,"defaultLocale":13,"locales":28,"features":30,"position":31},"019fe637-3dc2-754c-8657-0f175bfee7c6","lang","Languages","Learn a language the way you learn a codebase.","Structured paths, listening drills and spaced repetition that actually sticks.","amber-400","⌘",[13,15,29],"es",{"courses":18,"paths":18,"articles":17,"exams":18,"flashcards":17,"packages":18,"community":17,"certificates":17,"teams":18,"commerce":18},2,{"items":33,"meta":193},[34,66,84,104,120,136,153,175],{"id":35,"slug":36,"title":37,"subtitle":38,"excerpt":39,"coverUrl":40,"locale":13,"readingMinutes":41,"publishedAt":42,"viewCount":43,"likeCount":19,"commentCount":19,"author":44,"vertical":49,"topic":50,"tags":53,"_count":65,"playground":38,"hasQuiz":18,"hasPlayground":18},"019fe65f-d8d6-73ed-b26b-18726a494914","view-transitions-native-page-transitions","The page transition you pay a library for is now free",null,"You reach for Framer Motion or GSAP to make navigation feel smooth. The View Transitions API does the same thing natively — and the starting price is a single CSS rule.","\u002Fmedia\u002Fcovers\u002Fview-transitions-native-page-transitions.png",5,"2026-07-03T09:26:36.534Z",10,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},"019fe637-3c25-7088-9034-39c9f15dc3c8","Parsa Jiravand","parsa","Frontend engineer · building bestpractic",{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":52},"css","CSS",[54,56,59,62],{"slug":51,"name":55,"color":38},"Css",{"slug":57,"name":58,"color":38},"webdev","Webdev",{"slug":60,"name":61,"color":38},"frontend","Frontend",{"slug":63,"name":64,"color":38},"javascript","Javascript",{"assessments":19},{"id":67,"slug":68,"title":69,"subtitle":38,"excerpt":70,"coverUrl":71,"locale":13,"readingMinutes":72,"publishedAt":73,"viewCount":74,"likeCount":19,"commentCount":19,"author":75,"vertical":76,"topic":77,"tags":78,"_count":83,"playground":38,"hasQuiz":18,"hasPlayground":18},"019fe65f-d19a-709a-855e-54178d886feb","has-selector-condition-evaluator",":has() isn't a parent selector. It deletes JavaScript.","Everyone calls :has() the parent selector. That framing is too small — it's a condition evaluator that obsoletes a whole category of class-toggling JS, and it's in every browser today.","\u002Fmedia\u002Fcovers\u002Fhas-selector-condition-evaluator.png",4,"2026-07-02T07:18:03.500Z",7,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":52},[79,80,81,82],{"slug":51,"name":55,"color":38},{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":63,"name":64,"color":38},{"assessments":19},{"id":85,"slug":86,"title":87,"subtitle":38,"excerpt":88,"coverUrl":89,"locale":13,"readingMinutes":72,"publishedAt":90,"viewCount":91,"likeCount":19,"commentCount":19,"author":92,"vertical":93,"topic":94,"tags":96,"_count":103,"playground":38,"hasQuiz":18,"hasPlayground":18},"019fe65f-c9aa-70db-8ac8-df39bed8061b","optimistic-updates-stop-waiting-for-the-server","Your Save button waits 300ms for nothing. Stop it.","Every click that spins for a server round-trip is a choice you made. Optimistic updates remove the wait — but the rollback is where almost every implementation quietly breaks.","\u002Fmedia\u002Fcovers\u002Foptimistic-updates-stop-waiting-for-the-server.png","2026-07-01T07:42:41.462Z",8,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":63,"name":95},"JavaScript",[97,98,99,100],{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":63,"name":64,"color":38},{"slug":101,"name":102,"color":38},"react","React",{"assessments":19},{"id":105,"slug":106,"title":107,"subtitle":38,"excerpt":108,"coverUrl":109,"locale":13,"readingMinutes":72,"publishedAt":110,"viewCount":74,"likeCount":19,"commentCount":19,"author":111,"vertical":112,"topic":113,"tags":114,"_count":119,"playground":38,"hasQuiz":18,"hasPlayground":18},"019fe65f-c193-7159-96ba-bff62b34e53d","container-queries-responsive-primitive","Your card breaks in the sidebar. Here's the real fix.","A component that looks perfect in the main column falls apart in a sidebar — and the viewport width says everything's fine. The bug isn't your CSS. It's the question your CSS is asking.","\u002Fmedia\u002Fcovers\u002Fcontainer-queries-responsive-primitive.png","2026-06-30T07:30:01.218Z",{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":52},[115,116,117,118],{"slug":51,"name":55,"color":38},{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":63,"name":64,"color":38},{"assessments":19},{"id":121,"slug":122,"title":123,"subtitle":38,"excerpt":124,"coverUrl":125,"locale":13,"readingMinutes":72,"publishedAt":126,"viewCount":41,"likeCount":19,"commentCount":19,"author":127,"vertical":128,"topic":129,"tags":130,"_count":135,"playground":38,"hasQuiz":18,"hasPlayground":18},"019fe65f-b9de-72a8-8656-ee81360dbd99","url-as-state-manager","The URL Is Your Best State Manager","You're storing filter state, search queries, and pagination in useState — and losing it every time someone refreshes. The URL already does this better.","\u002Fmedia\u002Fcovers\u002Furl-as-state-manager.png","2026-06-29T07:59:09.726Z",{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":63,"name":95},[131,132,133,134],{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":63,"name":64,"color":38},{"slug":101,"name":102,"color":38},{"assessments":19},{"id":137,"slug":138,"title":139,"subtitle":38,"excerpt":140,"coverUrl":141,"locale":13,"readingMinutes":142,"publishedAt":143,"viewCount":91,"likeCount":19,"commentCount":19,"author":144,"vertical":145,"topic":146,"tags":147,"_count":152,"playground":38,"hasQuiz":18,"hasPlayground":18},"019fe65f-b1ba-7644-b327-4118cffd7d22","server-components-mental-model","Server Components Without the Hype: A Mental Model That Sticks","RSC isn't 'SSR 2.0' and it isn't magic. Here's the one distinction that makes the whole model click.","\u002Fmedia\u002Fcovers\u002Fserver-components-mental-model.png",3,"2026-06-28T09:41:35.140Z",{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":101,"name":102},[148,149,150,151],{"slug":101,"name":102,"color":38},{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":63,"name":64,"color":38},{"assessments":19},{"id":154,"slug":155,"title":156,"subtitle":38,"excerpt":157,"coverUrl":158,"locale":13,"readingMinutes":142,"publishedAt":159,"viewCount":160,"likeCount":19,"commentCount":19,"author":161,"vertical":162,"topic":163,"tags":166,"_count":174,"playground":38,"hasQuiz":18,"hasPlayground":18},"019fe65f-a25a-702f-b8a0-ae60efb61964","design-system-api-for-machines","Your Design System Is Now an API for Machines","Component libraries used to be for humans. Now they're the rails an AI plans against — and that changes how you should build them.","\u002Fmedia\u002Fcovers\u002Fdesign-system-api-for-machines.png","2026-06-26T07:29:19.042Z",12,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":164,"name":165},"designsystems","Design Systems",[167,168,169,171],{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":164,"name":170,"color":38},"Designsystems",{"slug":172,"name":173,"color":38},"ai","Ai",{"assessments":19},{"id":176,"slug":177,"title":178,"subtitle":38,"excerpt":179,"coverUrl":180,"locale":13,"readingMinutes":72,"publishedAt":181,"viewCount":182,"likeCount":19,"commentCount":19,"author":183,"vertical":184,"topic":185,"tags":187,"_count":192,"playground":38,"hasQuiz":18,"hasPlayground":18},"019fe65f-9991-7098-a2e8-28d741366ffa","frontend-future-ai","The Frontend Is Becoming a Conversation: Where UI Engineering Goes Next","Frontend stacks consolidated, the rendering wars cooled off, and AI quietly changed what a frontend engineer actually does all day. Here's where it's heading.","\u002Fmedia\u002Fcovers\u002Ffrontend-future-ai.png","2026-06-25T12:27:00.662Z",11,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":172,"name":186},"AI",[188,189,190,191],{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":172,"name":173,"color":38},{"slug":63,"name":64,"color":38},{"assessments":19},{"page":72,"perPage":160,"total":194,"totalPages":72},44,[196,198,200,201,203,207,210,211,214,215,218],{"slug":57,"name":58,"color":38,"articles":197},50,{"slug":63,"name":64,"color":38,"articles":199},45,{"slug":60,"name":61,"color":38,"articles":194},{"slug":51,"name":55,"color":38,"articles":202},18,{"slug":204,"name":205,"color":38,"articles":206},"typescript","Typescript",9,{"slug":208,"name":209,"color":38,"articles":74},"performance","Performance",{"slug":101,"name":102,"color":38,"articles":41},{"slug":212,"name":213,"color":38,"articles":72},"node","Node",{"slug":172,"name":173,"color":38,"articles":142},{"slug":216,"name":217,"color":38,"articles":142},"tutorial","Tutorial",{"slug":219,"name":220,"color":38,"articles":142},"html","Html"]