[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"blog-topics":44,"search-suggestions":165,"topics-all":178,"articles-all-9---":258,"articles-total":483},[4,20,32],{"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","Read it. Run it. Prove it.","A post a day on modern web development — most with an editable playground and a quiz that explains every answer. Free, no account needed.","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.","Grammar explained the way good documentation explains an API — one idea at a time, each with a quiz.","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,{"id":33,"slug":34,"name":35,"tagline":36,"description":37,"accentFrom":38,"accentTo":39,"icon":40,"defaultLocale":13,"locales":41,"features":42,"position":43},"7b3c16f2-931d-410e-802e-e1fa4edab7de","soft","Soft Skills","The half of the job nobody wrote documentation for.","Weekly, on the parts of working life that decide more than your code does — first weeks, meetings, interviews, promotions, and the people around you. Written from what actually happens, and recorded as a podcast you can listen to on the walk.","emerald-400","teal-300","◉",[13],{"courses":18,"paths":18,"articles":17,"exams":18,"flashcards":18,"packages":18,"community":17,"certificates":18,"teams":18,"commerce":18},3,[45,50,54,58,62,66,70,74,78,82,85,89,92,95,98,102,105,108,111,114,117,120,123,126,129,132,135,138,141,144,147,150,153,156,159,162],{"slug":46,"name":47,"color":48,"articles":49},"webdev","Webdev",null,103,{"slug":51,"name":52,"color":48,"articles":53},"javascript","Javascript",87,{"slug":55,"name":56,"color":48,"articles":57},"frontend","Frontend",71,{"slug":59,"name":60,"color":48,"articles":61},"css","Css",34,{"slug":63,"name":64,"color":48,"articles":65},"tutorial","Tutorial",32,{"slug":67,"name":68,"color":48,"articles":69},"typescript","Typescript",15,{"slug":71,"name":72,"color":48,"articles":73},"react","React",13,{"slug":75,"name":76,"color":48,"articles":77},"performance","Performance",12,{"slug":79,"name":80,"color":48,"articles":81},"node","Node",9,{"slug":83,"name":84,"color":48,"articles":81},"browser","Browser",{"slug":86,"name":87,"color":48,"articles":88},"programming","Programming",6,{"slug":90,"name":91,"color":48,"articles":88},"html","Html",{"slug":93,"name":94,"color":48,"articles":88},"grammar","Grammar",{"slug":96,"name":97,"color":48,"articles":88},"accessibility","Accessibility",{"slug":99,"name":100,"color":48,"articles":101},"nestjs","Nestjs",4,{"slug":103,"name":104,"color":48,"articles":101},"apis","Apis",{"slug":106,"name":107,"color":48,"articles":43},"nuxt","Nuxt",{"slug":109,"name":110,"color":48,"articles":43},"ssr","SSR",{"slug":112,"name":113,"color":48,"articles":43},"nextjs","Nextjs",{"slug":115,"name":116,"color":48,"articles":43},"ai","Ai",{"slug":118,"name":119,"color":48,"articles":31},"security","Security",{"slug":121,"name":122,"color":48,"articles":31},"async","Async",{"slug":124,"name":125,"color":48,"articles":31},"forms","Forms",{"slug":127,"name":128,"color":48,"articles":31},"api","API",{"slug":130,"name":131,"color":48,"articles":31},"english","English",{"slug":133,"name":134,"color":48,"articles":31},"verbs","Verbs",{"slug":136,"name":137,"color":48,"articles":31},"spanish","Spanish",{"slug":139,"name":140,"color":48,"articles":31},"a1","A1",{"slug":142,"name":143,"color":48,"articles":31},"a2","A2",{"slug":145,"name":146,"color":48,"articles":31},"tenses","Tenses",{"slug":148,"name":149,"color":48,"articles":31},"turkish","Turkish",{"slug":151,"name":152,"color":48,"articles":31},"vue","Vue",{"slug":154,"name":155,"color":48,"articles":31},"career","Career",{"slug":157,"name":158,"color":48,"articles":31},"beginners","Beginners",{"slug":160,"name":161,"color":48,"articles":31},"productivity","Productivity",{"slug":163,"name":164,"color":48,"articles":31},"discuss","Discuss",[166,167,168,169,170,171,172,173,174,175,176,177],{"slug":46,"name":47,"articles":49},{"slug":51,"name":52,"articles":53},{"slug":55,"name":56,"articles":57},{"slug":59,"name":60,"articles":61},{"slug":63,"name":64,"articles":65},{"slug":67,"name":68,"articles":69},{"slug":71,"name":72,"articles":73},{"slug":75,"name":76,"articles":77},{"slug":83,"name":84,"articles":81},{"slug":79,"name":80,"articles":81},{"slug":90,"name":91,"articles":88},{"slug":93,"name":94,"articles":88},[179,185,187,192,194,199,202,206,211,216,218,223,226,230,232,236,238,241,245,247,249,252,254,256],{"id":180,"slug":181,"name":182,"parentId":48,"description":183,"articleCount":184},"0da12d3c-ac33-4b32-859f-9a16877ef255","starting","Starting somewhere new","First days, first weeks, and the part where you do not know anything yet.",1,{"id":186,"slug":151,"name":152,"parentId":48,"description":48,"articleCount":31},"019fe637-3e06-75b8-8a2c-fc350aad7701",{"id":188,"slug":189,"name":190,"parentId":48,"description":191,"articleCount":184},"9ef7e6f6-b287-4ac2-8f56-421d3aafe8cc","meetings","Meetings and rooms","Speaking up, running one, and knowing which kind you are in.",{"id":193,"slug":106,"name":107,"parentId":48,"description":48,"articleCount":43},"019fe637-3e06-75b8-8a2d-0309c35755c6",{"id":195,"slug":196,"name":197,"parentId":48,"description":198,"articleCount":19},"540105e9-ba05-40f3-bdfd-16fb645e978c","interviews","Getting hired","Applications, interviews, offers, and the negotiation nobody rehearses.",{"id":200,"slug":67,"name":201,"parentId":48,"description":48,"articleCount":101},"019fe637-3e06-75b8-8a2d-040994c0d907","TypeScript",{"id":203,"slug":204,"name":205,"parentId":48,"description":48,"articleCount":19},"019fe637-3e06-75b8-8a2d-0956229cd176","architecture","Architecture",{"id":207,"slug":208,"name":209,"parentId":48,"description":210,"articleCount":19},"0cc5bdbb-d6e8-43b0-9cb4-d227aec6aa68","people","The people around you","Colleagues, managers, and the relationships that decide how work feels.",{"id":212,"slug":213,"name":214,"parentId":48,"description":215,"articleCount":19},"545c6bda-b8cf-4905-8056-18c0c4dc7a64","leading","Leading","Becoming the person others rely on, before and after the title.",{"id":217,"slug":75,"name":76,"parentId":48,"description":48,"articleCount":19},"019fe637-3e07-735d-8227-4c34039af2e0",{"id":219,"slug":220,"name":221,"parentId":48,"description":222,"articleCount":19},"cc22e84d-2cac-44ac-a272-5715e4710dc4","company","Company shapes","Why the same behaviour succeeds at five people and fails at five thousand.",{"id":224,"slug":115,"name":225,"parentId":48,"description":48,"articleCount":184},"019fe65f-98ec-773a-8ca8-9a2e971911c1","AI",{"id":227,"slug":59,"name":228,"parentId":48,"description":48,"articleCount":229},"019fe65f-c110-761b-931e-99a2d1280410","CSS",31,{"id":231,"slug":154,"name":155,"parentId":48,"description":48,"articleCount":19},"01a037b3-d685-76cb-9940-6a3f8ce140a0",{"id":233,"slug":234,"name":235,"parentId":48,"description":48,"articleCount":184},"019fe65f-a1cb-74c8-b999-ff353158fce9","designsystems","Design Systems",{"id":237,"slug":130,"name":131,"parentId":48,"description":48,"articleCount":31},"019ff280-9a51-757c-84ce-c941f20371e9",{"id":239,"slug":90,"name":240,"parentId":48,"description":48,"articleCount":31},"019ff19b-f37e-7091-b3cd-5c99e8c005a4","HTML",{"id":242,"slug":51,"name":243,"parentId":48,"description":48,"articleCount":244},"019fe65f-b950-7762-bb1a-d83445281950","JavaScript",52,{"id":246,"slug":99,"name":100,"parentId":48,"description":48,"articleCount":101},"01a03cdb-1ff8-76fa-9fa7-38d9e4eba1e1",{"id":248,"slug":112,"name":113,"parentId":48,"description":48,"articleCount":43},"01a0499d-b263-749a-a3ad-df3cc782e94d",{"id":250,"slug":71,"name":72,"parentId":48,"description":48,"articleCount":251},"019fe65f-b134-725b-bbc7-3e3db8c68675",5,{"id":253,"slug":118,"name":119,"parentId":48,"description":48,"articleCount":31},"019fe660-ce9d-754e-b241-7bccad915b86",{"id":255,"slug":136,"name":137,"parentId":48,"description":48,"articleCount":31},"019ff280-9d5a-77dc-b01d-e2378eaf86cb",{"id":257,"slug":148,"name":149,"parentId":48,"description":48,"articleCount":31},"019ff280-9eea-736d-ad13-4c01f0ddc46e",{"items":259,"meta":480},[260,282,300,318,336,354,372,390,408,426,444,462],{"id":261,"slug":262,"title":263,"subtitle":48,"excerpt":264,"coverUrl":265,"locale":13,"readingMinutes":251,"publishedAt":266,"viewCount":267,"likeCount":19,"commentCount":19,"author":268,"vertical":273,"topic":274,"tags":275,"_count":280,"playground":281,"hasQuiz":17,"hasPlayground":17},"019fe660-416e-7357-854c-5a7b56d68629","css-logical-properties","Your `margin-left` doesn't exist in Arabic. CSS logical properties fix that.","Physical CSS properties like `margin-left` and `padding-right` break silently when a layout needs to support right-to-left languages. Logical properties replace the physical axis with a writing-mode-aware model — one codebase, every direction.","\u002Fmedia\u002Fcovers\u002Fcss-logical-properties.png","2026-07-17T08:18:05.044Z",376,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},"019fe637-3c25-7088-9034-39c9f15dc3c8","Parsa Jiravand","parsa","Frontend engineer · building bestpractic",{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[276,277,278,279],{"slug":59,"name":60,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":90,"name":91,"color":48},{"assessments":184},{"slug":262},{"id":283,"slug":284,"title":285,"subtitle":48,"excerpt":286,"coverUrl":287,"locale":13,"readingMinutes":101,"publishedAt":288,"viewCount":289,"likeCount":19,"commentCount":19,"author":290,"vertical":291,"topic":292,"tags":293,"_count":298,"playground":299,"hasQuiz":17,"hasPlayground":17},"019fe660-39f9-768b-be22-fcd49b6abf6d","css-subgrid-nested-grid-alignment","Your CSS Grid cards look misaligned. `subgrid` is the fix you didn't know existed.","CSS Grid controls your outer container, but its children can't participate in the same tracks. `subgrid` closes that gap — nested elements align to the parent grid's rows and columns without padding hacks, fixed heights, or JavaScript measurements.","\u002Fmedia\u002Fcovers\u002Fcss-subgrid-nested-grid-alignment.png","2026-07-16T08:21:27.248Z",453,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[294,295,296,297],{"slug":59,"name":60,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":90,"name":91,"color":48},{"assessments":184},{"slug":284},{"id":301,"slug":302,"title":303,"subtitle":48,"excerpt":304,"coverUrl":305,"locale":13,"readingMinutes":251,"publishedAt":306,"viewCount":307,"likeCount":19,"commentCount":19,"author":308,"vertical":309,"topic":310,"tags":311,"_count":316,"playground":317,"hasQuiz":17,"hasPlayground":17},"019fe660-32b6-757d-a975-3860df795f67","immutable-array-methods","Your `.sort()` is mutating state. JavaScript finally gave you the fix.","The classic array methods — sort, reverse, splice — mutate the original array, silently breaking React state updates and surprising anyone who forgot to spread first. ES2023 added four immutable counterparts: toSorted, toReversed, toSpliced, and with.","\u002Fmedia\u002Fcovers\u002Fimmutable-array-methods.png","2026-07-15T08:22:28.270Z",245,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[312,313,314,315],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":71,"name":72,"color":48},{"assessments":184},{"slug":302},{"id":319,"slug":320,"title":321,"subtitle":48,"excerpt":322,"coverUrl":323,"locale":13,"readingMinutes":101,"publishedAt":324,"viewCount":325,"likeCount":19,"commentCount":19,"author":326,"vertical":327,"topic":328,"tags":329,"_count":334,"playground":335,"hasQuiz":17,"hasPlayground":17},"019fe660-2b2e-71fb-a0d1-fd1509765d3b","object-groupby-replace-reduce","You've been writing this `reduce` a hundred times. `Object.groupBy` does it in one.","Grouping an array by a key is one of the most common data transforms in frontend code. You've been wiring it by hand with `reduce` for years. `Object.groupBy` is the native version — no helper, no library, no ceremony.","\u002Fmedia\u002Fcovers\u002Fobject-groupby-replace-reduce.png","2026-07-14T08:16:56.309Z",221,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[330,331,332,333],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":79,"name":80,"color":48},{"assessments":184},{"slug":320},{"id":337,"slug":338,"title":339,"subtitle":48,"excerpt":340,"coverUrl":341,"locale":13,"readingMinutes":73,"publishedAt":342,"viewCount":343,"likeCount":19,"commentCount":19,"author":344,"vertical":345,"topic":346,"tags":347,"_count":352,"playground":353,"hasQuiz":17,"hasPlayground":17},"019fe660-2335-7652-9e51-7c6f28871874","weekly-javascript-event-loop","JavaScript Event Loop Explained: The Complete Guide","Learn how the JavaScript event loop really works — call stack, microtasks, and macrotasks — with worked examples, edge cases, and a cheat sheet.","\u002Fmedia\u002Fcovers\u002Fweekly-javascript-event-loop.png","2026-07-13T09:36:33.464Z",494,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[348,349,350,351],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":63,"name":64,"color":48},{"slug":86,"name":87,"color":48},{"assessments":184},{"slug":338},{"id":355,"slug":356,"title":357,"subtitle":48,"excerpt":358,"coverUrl":359,"locale":13,"readingMinutes":251,"publishedAt":360,"viewCount":361,"likeCount":19,"commentCount":19,"author":362,"vertical":363,"topic":364,"tags":365,"_count":370,"playground":371,"hasQuiz":17,"hasPlayground":17},"019fe660-1be2-74dd-aa56-0c8fd84204fd","promise-concurrency-all-settled-any-race","You reach for `Promise.all` for every concurrent request. Here's when to use the other three.","`Promise.all` fails the moment any one request fails. `allSettled`, `any`, and `race` each solve a different concurrency problem — dashboard partial results, CDN failover, and timeouts. Here's the taxonomy.","\u002Fmedia\u002Fcovers\u002Fpromise-concurrency-all-settled-any-race.png","2026-07-13T09:36:32.501Z",188,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[366,367,368,369],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":79,"name":80,"color":48},{"assessments":184},{"slug":356},{"id":373,"slug":374,"title":375,"subtitle":48,"excerpt":376,"coverUrl":377,"locale":13,"readingMinutes":101,"publishedAt":378,"viewCount":379,"likeCount":19,"commentCount":19,"author":380,"vertical":381,"topic":382,"tags":383,"_count":388,"playground":389,"hasQuiz":17,"hasPlayground":17},"019fe660-1462-723e-9605-66ffa7e98f42","popover-api-native-popovers","Your dropdown is a div. The browser has a native popover now.","Custom dropdowns, tooltips, and menus built with stacked divs and click-outside listeners — the Popover API landed in every browser in 2024, and the baseline version is two HTML attributes.","\u002Fmedia\u002Fcovers\u002Fpopover-api-native-popovers.png","2026-07-12T08:24:42.323Z",234,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[384,385,386,387],{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"slug":59,"name":60,"color":48},{"assessments":184},{"slug":374},{"id":391,"slug":392,"title":393,"subtitle":48,"excerpt":394,"coverUrl":395,"locale":13,"readingMinutes":251,"publishedAt":396,"viewCount":397,"likeCount":19,"commentCount":19,"author":398,"vertical":399,"topic":400,"tags":401,"_count":406,"playground":407,"hasQuiz":17,"hasPlayground":17},"019fe660-0d25-72d6-8fd8-3cf3c3592e54","typescript-satisfies-operator","Your TypeScript config objects are losing type information. `satisfies` fixes it.","Type annotations widen your object types and erase the precise values TypeScript inferred. The `satisfies` operator validates against a type without changing what TypeScript keeps — you get the check without the widening.","\u002Fmedia\u002Fcovers\u002Ftypescript-satisfies-operator.png","2026-07-11T08:03:26.200Z",288,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":67,"name":201},[402,403,404,405],{"slug":67,"name":68,"color":48},{"slug":46,"name":47,"color":48},{"slug":51,"name":52,"color":48},{"slug":55,"name":56,"color":48},{"assessments":184},{"slug":392},{"id":409,"slug":410,"title":411,"subtitle":48,"excerpt":412,"coverUrl":413,"locale":13,"readingMinutes":101,"publishedAt":414,"viewCount":415,"likeCount":19,"commentCount":19,"author":416,"vertical":417,"topic":418,"tags":419,"_count":424,"playground":425,"hasQuiz":17,"hasPlayground":17},"019fe660-0596-7433-9dc2-0fc620be2d0f","structuredclone-deep-clone","You've been deep-cloning objects with a JSON hack. `structuredClone` does it right.","JSON.parse(JSON.stringify(obj)) silently corrupts Dates, Maps, Sets, and undefined values. structuredClone is the native replacement — no library, no import, no surprises.","\u002Fmedia\u002Fcovers\u002Fstructuredclone-deep-clone.png","2026-07-10T09:43:33.966Z",196,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":243},[420,421,422,423],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":79,"name":80,"color":48},{"assessments":184},{"slug":410},{"id":427,"slug":428,"title":429,"subtitle":48,"excerpt":430,"coverUrl":431,"locale":13,"readingMinutes":101,"publishedAt":432,"viewCount":433,"likeCount":19,"commentCount":19,"author":434,"vertical":435,"topic":436,"tags":437,"_count":442,"playground":443,"hasQuiz":17,"hasPlayground":17},"019fe65f-fe39-767c-9ce8-da4db5144b1d","css-nesting-sass-replaced","You kept Sass for one reason. Native CSS nesting just ended it.","CSS has supported nesting natively since 2023 — pseudo-classes, pseudo-elements, and @media queries nested inside the rules they belong to. No compiler required.","\u002Fmedia\u002Fcovers\u002Fcss-nesting-sass-replaced.png","2026-07-09T09:48:41.505Z",187,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[438,439,440,441],{"slug":59,"name":60,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"assessments":184},{"slug":428},{"id":445,"slug":446,"title":447,"subtitle":48,"excerpt":448,"coverUrl":449,"locale":13,"readingMinutes":251,"publishedAt":450,"viewCount":451,"likeCount":19,"commentCount":19,"author":452,"vertical":453,"topic":454,"tags":455,"_count":460,"playground":461,"hasQuiz":17,"hasPlayground":17},"019fe65f-f67a-7038-9c0d-874d6c8ece3c","css-property-registered-custom-properties","You can't transition a CSS variable. @property says otherwise.","CSS custom properties are string substitution — the browser doesn't know a number from a color. Register one with @property and it gains a real type, an initial value, and the ability to animate.","\u002Fmedia\u002Fcovers\u002Fcss-property-registered-custom-properties.png","2026-07-08T08:36:23.824Z",314,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[456,457,458,459],{"slug":59,"name":60,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"assessments":184},{"slug":446},{"id":463,"slug":464,"title":465,"subtitle":48,"excerpt":466,"coverUrl":467,"locale":13,"readingMinutes":251,"publishedAt":468,"viewCount":469,"likeCount":19,"commentCount":19,"author":470,"vertical":471,"topic":472,"tags":473,"_count":478,"playground":479,"hasQuiz":17,"hasPlayground":17},"019fe65f-ef22-765a-97c7-cdfdbb168024","scroll-driven-animations","Your scroll listener is doing CSS's job","Reading progress bars, reveal-on-scroll effects, parallax — you've been writing these in JavaScript. CSS scroll-driven animations bind them directly to scroll position, off the main thread, in a handful of lines.","\u002Fmedia\u002Fcovers\u002Fscroll-driven-animations.png","2026-07-06T10:47:02.014Z",204,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":228},[474,475,476,477],{"slug":59,"name":60,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":51,"name":52,"color":48},{"assessments":184},{"slug":464},{"page":81,"perPage":77,"total":481,"totalPages":482},119,10,{"items":484,"meta":504},[485],{"id":486,"slug":487,"title":488,"subtitle":48,"excerpt":489,"coverUrl":490,"locale":13,"readingMinutes":491,"publishedAt":492,"viewCount":493,"likeCount":19,"commentCount":19,"author":494,"vertical":495,"topic":496,"tags":497,"_count":502,"playground":503,"hasQuiz":17,"hasPlayground":17},"01a0ab57-dda2-74dd-816b-a0ef7f77aeb3","react-weekly-derived-state-bug","React Derived State: Why That useState Is Probably a Bug","React derived state explained: why syncing a computed value into useState with an Effect causes extra renders and drift, and what to write instead.","\u002Fmedia\u002Fcovers\u002Freact-weekly-derived-state-bug.png",14,"2026-09-20T16:27:07.271Z",85,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":71,"name":72},[498,499,500,501],{"slug":71,"name":72,"color":48},{"slug":51,"name":52,"color":48},{"slug":63,"name":64,"color":48},{"slug":46,"name":47,"color":48},{"assessments":184},{"slug":487},{"page":184,"perPage":184,"total":481,"totalPages":481}]