[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"blog-topics":44,"topics-all":165,"search-suggestions":245,"articles-all-8---":258,"articles-total":484},[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,172,174,179,181,186,189,193,198,203,205,210,213,217,219,223,225,228,232,234,236,239,241,243],{"id":167,"slug":168,"name":169,"parentId":48,"description":170,"articleCount":171},"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":173,"slug":151,"name":152,"parentId":48,"description":48,"articleCount":31},"019fe637-3e06-75b8-8a2c-fc350aad7701",{"id":175,"slug":176,"name":177,"parentId":48,"description":178,"articleCount":171},"9ef7e6f6-b287-4ac2-8f56-421d3aafe8cc","meetings","Meetings and rooms","Speaking up, running one, and knowing which kind you are in.",{"id":180,"slug":106,"name":107,"parentId":48,"description":48,"articleCount":43},"019fe637-3e06-75b8-8a2d-0309c35755c6",{"id":182,"slug":183,"name":184,"parentId":48,"description":185,"articleCount":19},"540105e9-ba05-40f3-bdfd-16fb645e978c","interviews","Getting hired","Applications, interviews, offers, and the negotiation nobody rehearses.",{"id":187,"slug":67,"name":188,"parentId":48,"description":48,"articleCount":101},"019fe637-3e06-75b8-8a2d-040994c0d907","TypeScript",{"id":190,"slug":191,"name":192,"parentId":48,"description":48,"articleCount":19},"019fe637-3e06-75b8-8a2d-0956229cd176","architecture","Architecture",{"id":194,"slug":195,"name":196,"parentId":48,"description":197,"articleCount":19},"0cc5bdbb-d6e8-43b0-9cb4-d227aec6aa68","people","The people around you","Colleagues, managers, and the relationships that decide how work feels.",{"id":199,"slug":200,"name":201,"parentId":48,"description":202,"articleCount":19},"545c6bda-b8cf-4905-8056-18c0c4dc7a64","leading","Leading","Becoming the person others rely on, before and after the title.",{"id":204,"slug":75,"name":76,"parentId":48,"description":48,"articleCount":19},"019fe637-3e07-735d-8227-4c34039af2e0",{"id":206,"slug":207,"name":208,"parentId":48,"description":209,"articleCount":19},"cc22e84d-2cac-44ac-a272-5715e4710dc4","company","Company shapes","Why the same behaviour succeeds at five people and fails at five thousand.",{"id":211,"slug":115,"name":212,"parentId":48,"description":48,"articleCount":171},"019fe65f-98ec-773a-8ca8-9a2e971911c1","AI",{"id":214,"slug":59,"name":215,"parentId":48,"description":48,"articleCount":216},"019fe65f-c110-761b-931e-99a2d1280410","CSS",31,{"id":218,"slug":154,"name":155,"parentId":48,"description":48,"articleCount":19},"01a037b3-d685-76cb-9940-6a3f8ce140a0",{"id":220,"slug":221,"name":222,"parentId":48,"description":48,"articleCount":171},"019fe65f-a1cb-74c8-b999-ff353158fce9","designsystems","Design Systems",{"id":224,"slug":130,"name":131,"parentId":48,"description":48,"articleCount":31},"019ff280-9a51-757c-84ce-c941f20371e9",{"id":226,"slug":90,"name":227,"parentId":48,"description":48,"articleCount":31},"019ff19b-f37e-7091-b3cd-5c99e8c005a4","HTML",{"id":229,"slug":51,"name":230,"parentId":48,"description":48,"articleCount":231},"019fe65f-b950-7762-bb1a-d83445281950","JavaScript",52,{"id":233,"slug":99,"name":100,"parentId":48,"description":48,"articleCount":101},"01a03cdb-1ff8-76fa-9fa7-38d9e4eba1e1",{"id":235,"slug":112,"name":113,"parentId":48,"description":48,"articleCount":43},"01a0499d-b263-749a-a3ad-df3cc782e94d",{"id":237,"slug":71,"name":72,"parentId":48,"description":48,"articleCount":238},"019fe65f-b134-725b-bbc7-3e3db8c68675",5,{"id":240,"slug":118,"name":119,"parentId":48,"description":48,"articleCount":31},"019fe660-ce9d-754e-b241-7bccad915b86",{"id":242,"slug":136,"name":137,"parentId":48,"description":48,"articleCount":31},"019ff280-9d5a-77dc-b01d-e2378eaf86cb",{"id":244,"slug":148,"name":149,"parentId":48,"description":48,"articleCount":31},"019ff280-9eea-736d-ad13-4c01f0ddc46e",[246,247,248,249,250,251,252,253,254,255,256,257],{"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},{"items":259,"meta":480},[260,282,300,318,336,354,371,389,409,427,445,463],{"id":261,"slug":262,"title":263,"subtitle":48,"excerpt":264,"coverUrl":265,"locale":13,"readingMinutes":238,"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-a973-77a9-9820-826bf25fd884","iterator-helpers-lazy-filter-map","Array methods are eager. Iterator helpers are lazy. Here's why that matters.","Every `.map()` and `.filter()` on an array creates a new intermediate array. Iterator helpers — built into JavaScript since 2024 — give you the same pipeline but evaluate one element at a time, with no wasted allocations.","\u002Fmedia\u002Fcovers\u002Fiterator-helpers-lazy-filter-map.png","2026-07-30T08:34:21.684Z",334,{"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":51,"name":230},[276,277,278,279],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":75,"name":76,"color":48},{"assessments":171},{"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-a1fc-740c-9df4-b60a02de8afa","css-color-mix-native-color-mixing","You reach for Sass to mix colors. `color-mix()` does it natively.","Sass's `darken()`, `lighten()`, and `mix()` functions solved real problems CSS couldn't handle for decades. `color-mix()` is the native answer, and it ships in every modern browser with no build step required.","\u002Fmedia\u002Fcovers\u002Fcss-color-mix-native-color-mixing.png","2026-07-29T08:47:34.803Z",272,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":215},[294,295,296,297],{"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":171},{"slug":284},{"id":301,"slug":302,"title":303,"subtitle":48,"excerpt":304,"coverUrl":305,"locale":13,"readingMinutes":101,"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-9a9b-73dc-87cd-48744e21e671","text-wrap-balance-headline-orphans","You hand-edit headlines to avoid orphaned words. `text-wrap: balance` does it natively.","The classic fix for a headline that breaks awkwardly — a manual `\u003Cbr>`, a `&shy;`, or a max-width tweak — exists because CSS had no way to distribute line breaks evenly. `text-wrap: balance` and `text-wrap: pretty` are the native answers.","\u002Fmedia\u002Fcovers\u002Ftext-wrap-balance-headline-orphans.png","2026-07-28T08:41:41.989Z",283,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":215},[312,313,314,315],{"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":171},{"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-8482-75bc-ab16-8e86f92efc09","resize-observer-element-size","You're watching `window` to detect element size changes. `ResizeObserver` watches the element itself.","A `window` resize listener only fires when the viewport changes. ResizeObserver fires whenever the element's own box changes — from content loading, parent reflow, container queries, or anything else.","\u002Fmedia\u002Fcovers\u002Fresize-observer-element-size.png","2026-07-26T08:32:44.347Z",330,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[330,331,332,333],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":75,"name":76,"color":48},{"assessments":171},{"slug":320},{"id":337,"slug":338,"title":339,"subtitle":48,"excerpt":340,"coverUrl":341,"locale":13,"readingMinutes":101,"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-7d17-745b-812d-b1e81a1b2b85","css-starting-style-entry-animations","You use a setTimeout to trigger CSS entry animations. `@starting-style` makes it unnecessary.","Before `@starting-style`, the moment an element entered the DOM was invisible to CSS — transitions had no 'before' state to interpolate from. The at-rule gives you one, natively, with no JavaScript required.","\u002Fmedia\u002Fcovers\u002Fcss-starting-style-entry-animations.png","2026-07-25T08:13:02.298Z",267,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":215},[348,349,350,351],{"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":171},{"slug":338},{"id":355,"slug":356,"title":357,"subtitle":48,"excerpt":358,"coverUrl":359,"locale":13,"readingMinutes":101,"publishedAt":360,"viewCount":325,"likeCount":19,"commentCount":19,"author":361,"vertical":362,"topic":363,"tags":364,"_count":369,"playground":370,"hasQuiz":17,"hasPlayground":17},"019fe660-75da-727d-a751-32f8723b0b38","using-explicit-resource-management","You still write `finally { resource.close() }`. The `using` keyword does it automatically.","The Explicit Resource Management proposal adds a `using` declaration that calls cleanup the moment a scope exits — normal return, early return, or throw. No more try\u002Ffinally boilerplate for timers, event listeners, connections, or any other resource you need to release.","\u002Fmedia\u002Fcovers\u002Fusing-explicit-resource-management.png","2026-07-24T08:33:28.459Z",{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":67,"name":188},[365,366,367,368],{"slug":67,"name":68,"color":48},{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"assessments":171},{"slug":356},{"id":372,"slug":373,"title":374,"subtitle":48,"excerpt":375,"coverUrl":376,"locale":13,"readingMinutes":101,"publishedAt":377,"viewCount":378,"likeCount":19,"commentCount":19,"author":379,"vertical":380,"topic":381,"tags":382,"_count":387,"playground":388,"hasQuiz":17,"hasPlayground":17},"019fe660-6e7e-72cb-bd34-bc123056cfeb","set-methods-union-intersection","You've been doing Set math by hand. JavaScript finally shipped `.union()`, `.intersection()`, and friends.","Set has always been missing its obvious operations. ES2025 adds `.union()`, `.intersection()`, `.difference()`, `.symmetricDifference()`, and three boolean predicates — native methods that used to require four lines of spread syntax each.","\u002Fmedia\u002Fcovers\u002Fset-methods-union-intersection.png","2026-07-23T08:37:02.144Z",301,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[383,384,385,386],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":67,"name":68,"color":48},{"assessments":171},{"slug":373},{"id":390,"slug":391,"title":392,"subtitle":48,"excerpt":393,"coverUrl":394,"locale":13,"readingMinutes":101,"publishedAt":395,"viewCount":396,"likeCount":19,"commentCount":19,"author":397,"vertical":398,"topic":399,"tags":400,"_count":407,"playground":408,"hasQuiz":17,"hasPlayground":17},"019fe660-66d6-71c3-b71a-ed9102b874c8","promise-with-resolvers","You keep escaping the Promise constructor. `Promise.withResolvers` does it right.","The 'deferred promise' pattern — storing resolve and reject outside the constructor so you can call them later — is a daily JavaScript idiom that's always felt awkward. ES2024 added a one-liner for it.","\u002Fmedia\u002Fcovers\u002Fpromise-with-resolvers.png","2026-07-22T08:35:52.029Z",434,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[401,402,403,404],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":67,"name":68,"color":48},{"slug":405,"name":406,"color":48},"asyncjs","Asyncjs",{"assessments":171},{"slug":391},{"id":410,"slug":411,"title":412,"subtitle":48,"excerpt":413,"coverUrl":414,"locale":13,"readingMinutes":101,"publishedAt":415,"viewCount":416,"likeCount":19,"commentCount":19,"author":417,"vertical":418,"topic":419,"tags":420,"_count":425,"playground":426,"hasQuiz":17,"hasPlayground":17},"019fe660-5f55-701e-9cf4-dc0c9f0517b9","error-cause-rethrow-context","You're rethrowing errors and losing context. `Error.cause` fixes that.","Every time you catch an error and rethrow a new one without forwarding the original, you lose the stack trace, the error type, and everything useful about what actually went wrong. ES2022 added `Error.cause` to fix exactly this.","\u002Fmedia\u002Fcovers\u002Ferror-cause-rethrow-context.png","2026-07-21T08:36:02.331Z",369,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[421,422,423,424],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":79,"name":80,"color":48},{"slug":67,"name":68,"color":48},{"assessments":171},{"slug":411},{"id":428,"slug":429,"title":430,"subtitle":48,"excerpt":431,"coverUrl":432,"locale":13,"readingMinutes":69,"publishedAt":433,"viewCount":434,"likeCount":19,"commentCount":19,"author":435,"vertical":436,"topic":437,"tags":438,"_count":443,"playground":444,"hasQuiz":17,"hasPlayground":17},"019fe660-57eb-7258-b452-d66ff04d2380","weekly-typescript-generics","TypeScript Generics: The Complete Guide (with Cheat Sheet)","Learn TypeScript generics from the ground up — generic functions, constraints, defaults, and classes — with worked examples and a copy-paste cheat sheet.","\u002Fmedia\u002Fcovers\u002Fweekly-typescript-generics.png","2026-07-20T09:23:23.621Z",344,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":67,"name":188},[439,440,441,442],{"slug":67,"name":68,"color":48},{"slug":51,"name":52,"color":48},{"slug":63,"name":64,"color":48},{"slug":46,"name":47,"color":48},{"assessments":171},{"slug":429},{"id":446,"slug":447,"title":448,"subtitle":48,"excerpt":449,"coverUrl":450,"locale":13,"readingMinutes":101,"publishedAt":451,"viewCount":452,"likeCount":19,"commentCount":19,"author":453,"vertical":454,"topic":455,"tags":456,"_count":461,"playground":462,"hasQuiz":17,"hasPlayground":17},"019fe660-503a-7133-b7b0-7d5ce9587539","intersection-observer-visibility","Your scroll listener fires on every pixel. `IntersectionObserver` fires when visibility actually changes.","Detecting whether an element is in the viewport by listening to scroll events runs an expensive layout calculation on every frame. `IntersectionObserver` is the browser-native alternative — it fires only when visibility changes, off the main thread, with no scroll handler involved.","\u002Fmedia\u002Fcovers\u002Fintersection-observer-visibility.png","2026-07-19T08:25:59.411Z",257,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[457,458,459,460],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":75,"name":76,"color":48},{"assessments":171},{"slug":447},{"id":464,"slug":465,"title":466,"subtitle":48,"excerpt":467,"coverUrl":468,"locale":13,"readingMinutes":238,"publishedAt":469,"viewCount":289,"likeCount":19,"commentCount":19,"author":470,"vertical":471,"topic":472,"tags":473,"_count":478,"playground":479,"hasQuiz":17,"hasPlayground":17},"019fe660-48c5-70fe-a5b4-b20c5b2661e7","css-anchor-positioning","You're using Floating UI to position your tooltip. The browser does it natively now.","CSS Anchor Positioning is Baseline 2026 — it lets any element declare itself an anchor and any floating element position relative to it in pure CSS. No JavaScript, no layout math, no ResizeObserver wiring.","\u002Fmedia\u002Fcovers\u002Fcss-anchor-positioning.png","2026-07-18T07:59:42.250Z",{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":215},[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":171},{"slug":465},{"page":481,"perPage":77,"total":482,"totalPages":483},8,119,10,{"items":485,"meta":505},[486],{"id":487,"slug":488,"title":489,"subtitle":48,"excerpt":490,"coverUrl":491,"locale":13,"readingMinutes":492,"publishedAt":493,"viewCount":494,"likeCount":19,"commentCount":19,"author":495,"vertical":496,"topic":497,"tags":498,"_count":503,"playground":504,"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},[499,500,501,502],{"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":171},{"slug":488},{"page":171,"perPage":171,"total":482,"totalPages":482}]