[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"tag-javascript-4":32,"tags-all":229},[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":227},[34,66,87,104,121,138,154,170,188,209],{"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-e7b8-7175-a185-34775c370bcf","abort-controller-async-cancellation","Your fetch() Is Still Running After the User Left",null,"Stale requests, race conditions in search boxes, state updates on unmounted components — these are all the same bug: async work you forgot to cancel. AbortController is the fix.","\u002Fmedia\u002Fcovers\u002Fabort-controller-async-cancellation.png",4,"2026-07-05T09:12:47.873Z",18,{"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},"javascript","JavaScript",[54,56,59,62],{"slug":51,"name":55,"color":38},"Javascript",{"slug":57,"name":58,"color":38},"webdev","Webdev",{"slug":60,"name":61,"color":38},"frontend","Frontend",{"slug":63,"name":64,"color":38},"react","React",{"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":80,"_count":86,"playground":38,"hasQuiz":18,"hasPlayground":18},"019fe65f-e05c-77bb-b8a3-cb8dbdc99346","css-layer-architecture","You reached for !important again. @layer is the real fix.","When a third-party reset beats your styles and your own utilities lose to an ancient nested rule, the problem isn't your selectors. It's that your stylesheet has no architecture. @layer adds one.","\u002Fmedia\u002Fcovers\u002Fcss-layer-architecture.png",5,"2026-07-04T08:44:02.193Z",13,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":78,"name":79},"css","CSS",[81,83,84,85],{"slug":78,"name":82,"color":38},"Css",{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":51,"name":55,"color":38},{"assessments":19},{"id":88,"slug":89,"title":90,"subtitle":38,"excerpt":91,"coverUrl":92,"locale":13,"readingMinutes":72,"publishedAt":93,"viewCount":94,"likeCount":19,"commentCount":19,"author":95,"vertical":96,"topic":97,"tags":98,"_count":103,"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","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","2026-07-03T09:26:36.534Z",21,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":78,"name":79},[99,100,101,102],{"slug":78,"name":82,"color":38},{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":51,"name":55,"color":38},{"assessments":19},{"id":105,"slug":106,"title":107,"subtitle":38,"excerpt":108,"coverUrl":109,"locale":13,"readingMinutes":41,"publishedAt":110,"viewCount":111,"likeCount":19,"commentCount":19,"author":112,"vertical":113,"topic":114,"tags":115,"_count":120,"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","2026-07-02T07:18:03.500Z",12,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":78,"name":79},[116,117,118,119],{"slug":78,"name":82,"color":38},{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":51,"name":55,"color":38},{"assessments":19},{"id":122,"slug":123,"title":124,"subtitle":38,"excerpt":125,"coverUrl":126,"locale":13,"readingMinutes":41,"publishedAt":127,"viewCount":128,"likeCount":19,"commentCount":19,"author":129,"vertical":130,"topic":131,"tags":132,"_count":137,"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",16,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":52},[133,134,135,136],{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":51,"name":55,"color":38},{"slug":63,"name":64,"color":38},{"assessments":19},{"id":139,"slug":140,"title":141,"subtitle":38,"excerpt":142,"coverUrl":143,"locale":13,"readingMinutes":41,"publishedAt":144,"viewCount":111,"likeCount":19,"commentCount":19,"author":145,"vertical":146,"topic":147,"tags":148,"_count":153,"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":78,"name":79},[149,150,151,152],{"slug":78,"name":82,"color":38},{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":51,"name":55,"color":38},{"assessments":19},{"id":155,"slug":156,"title":157,"subtitle":38,"excerpt":158,"coverUrl":159,"locale":13,"readingMinutes":41,"publishedAt":160,"viewCount":111,"likeCount":19,"commentCount":19,"author":161,"vertical":162,"topic":163,"tags":164,"_count":169,"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":51,"name":52},[165,166,167,168],{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":51,"name":55,"color":38},{"slug":63,"name":64,"color":38},{"assessments":19},{"id":171,"slug":172,"title":173,"subtitle":38,"excerpt":174,"coverUrl":175,"locale":13,"readingMinutes":176,"publishedAt":177,"viewCount":178,"likeCount":19,"commentCount":19,"author":179,"vertical":180,"topic":181,"tags":182,"_count":187,"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",17,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":63,"name":64},[183,184,185,186],{"slug":63,"name":64,"color":38},{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":51,"name":55,"color":38},{"assessments":19},{"id":189,"slug":190,"title":191,"subtitle":38,"excerpt":192,"coverUrl":193,"locale":13,"readingMinutes":176,"publishedAt":194,"viewCount":178,"likeCount":19,"commentCount":19,"author":195,"vertical":196,"topic":197,"tags":200,"_count":208,"playground":38,"hasQuiz":18,"hasPlayground":18},"019fe65f-a9f9-7079-bfbf-ca4dc5685bdd","typescript-won-what-it-bought-us","TypeScript Won. Here's What That Actually Bought Us.","The 'should we use TypeScript?' debate is over. The interesting question is what all those types are quietly enabling now.","\u002Fmedia\u002Fcovers\u002Ftypescript-won-what-it-bought-us.png","2026-06-28T07:31:54.189Z",{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":198,"name":199},"typescript","TypeScript",[201,203,204,205],{"slug":198,"name":202,"color":38},"Typescript",{"slug":51,"name":55,"color":38},{"slug":57,"name":58,"color":38},{"slug":206,"name":207,"color":38},"ai","Ai",{"assessments":19},{"id":210,"slug":211,"title":212,"subtitle":38,"excerpt":213,"coverUrl":214,"locale":13,"readingMinutes":41,"publishedAt":215,"viewCount":216,"likeCount":19,"commentCount":19,"author":217,"vertical":218,"topic":219,"tags":221,"_count":226,"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",23,{"id":45,"name":46,"username":47,"avatarUrl":38,"headline":48},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":206,"name":220},"AI",[222,223,224,225],{"slug":57,"name":58,"color":38},{"slug":60,"name":61,"color":38},{"slug":206,"name":207,"color":38},{"slug":51,"name":55,"color":38},{"assessments":19},{"page":41,"perPage":111,"total":228,"totalPages":41},46,[230,232,233,235,237,239,243,244,247,250,251,254,257,260,263],{"slug":57,"name":58,"color":38,"articles":231},51,{"slug":51,"name":55,"color":38,"articles":228},{"slug":60,"name":61,"color":38,"articles":234},45,{"slug":78,"name":82,"color":38,"articles":236},19,{"slug":198,"name":202,"color":38,"articles":238},9,{"slug":240,"name":241,"color":38,"articles":242},"performance","Performance",7,{"slug":63,"name":64,"color":38,"articles":72},{"slug":245,"name":246,"color":38,"articles":41},"node","Node",{"slug":248,"name":249,"color":38,"articles":41},"grammar","Grammar",{"slug":206,"name":207,"color":38,"articles":176},{"slug":252,"name":253,"color":38,"articles":176},"tutorial","Tutorial",{"slug":255,"name":256,"color":38,"articles":176},"html","Html",{"slug":258,"name":259,"color":38,"articles":31},"verbs","Verbs",{"slug":261,"name":262,"color":38,"articles":31},"a1","A1",{"slug":264,"name":265,"color":38,"articles":31},"turkish","Turkish"]