[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"verticals":3,"blog-topics":44,"topics-all":165,"search-suggestions":245,"articles-all-6---":258,"articles-total":505},[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":502},[260,282,306,324,344,362,382,402,424,442,462,480],{"id":261,"slug":262,"title":263,"subtitle":48,"excerpt":264,"coverUrl":265,"locale":13,"readingMinutes":101,"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-8bc3-7444-8c96-86953902f5e0","findlast-search-from-end","You copy and reverse the array to find the last match. `findLast()` searches from the end directly.","The usual workaround — `[...arr].reverse().find()` — allocates a full copy just to walk it backward. ES2023 added `findLast()` and `findLastIndex()` to search from the end without touching the original.","\u002Fmedia\u002Fcovers\u002Ffindlast-search-from-end.png","2026-08-14T07:38:34.486Z",538,{"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":67,"name":68,"color":48},{"assessments":171},{"slug":262},{"id":283,"slug":284,"title":285,"subtitle":48,"excerpt":286,"coverUrl":48,"locale":13,"readingMinutes":43,"publishedAt":287,"viewCount":288,"likeCount":19,"commentCount":19,"author":289,"vertical":290,"topic":291,"tags":292,"_count":304,"playground":305,"hasQuiz":17,"hasPlayground":17},"019ff280-9c91-72bb-b247-1b9d070a82a5","english-b2-mixed-conditionals","English B2: mixed conditionals — when the time of the condition and the result differ","The three textbook conditionals assume the if-clause and the result share a time frame. Real regret rarely does. Mixed conditionals are how you say a past mistake still shapes today.","2026-08-14T07:00:00.000Z",296,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":22,"name":23,"accentFrom":26,"accentTo":10},{"slug":130,"name":131},[293,294,297,300,301],{"slug":130,"name":131,"color":48},{"slug":295,"name":296,"color":48},"b2","B2",{"slug":298,"name":299,"color":48},"en-b2","En-b2",{"slug":93,"name":94,"color":48},{"slug":302,"name":303,"color":48},"conditionals","Conditionals",{"assessments":171},{"slug":284},{"id":307,"slug":308,"title":309,"subtitle":48,"excerpt":310,"coverUrl":311,"locale":13,"readingMinutes":101,"publishedAt":312,"viewCount":313,"likeCount":19,"commentCount":19,"author":314,"vertical":315,"topic":316,"tags":317,"_count":322,"playground":323,"hasQuiz":17,"hasPlayground":17},"019fe661-0450-720a-ad6e-5eb995429cd7","sendbeacon-reliable-unload-data","Your `fetch()` in `beforeunload` is being silently dropped. Use `navigator.sendBeacon()`.","Browsers cancel in-flight network requests when a page unloads. The common fix — synchronous XHR — is deprecated. `navigator.sendBeacon()` is the correct, fire-and-forget API designed exactly for this case.","\u002Fmedia\u002Fcovers\u002Fsendbeacon-reliable-unload-data.png","2026-08-13T07:40:48.196Z",680,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[318,319,320,321],{"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":308},{"id":325,"slug":326,"title":327,"subtitle":48,"excerpt":328,"coverUrl":48,"locale":13,"readingMinutes":43,"publishedAt":329,"viewCount":330,"likeCount":19,"commentCount":19,"author":331,"vertical":332,"topic":333,"tags":334,"_count":342,"playground":343,"hasQuiz":17,"hasPlayground":17},"019ff280-9e3d-7252-8944-2082a2a37ade","spanish-a2-preterite-vs-imperfect","Spanish A2: pretérito vs imperfecto — the photo and the film","Spanish has two past tenses and they are not interchangeable. One takes a photograph of a completed event; the other films the background it happened against.","2026-08-13T07:00:00.000Z",274,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":22,"name":23,"accentFrom":26,"accentTo":10},{"slug":136,"name":137},[335,336,337,340,341],{"slug":136,"name":137,"color":48},{"slug":142,"name":143,"color":48},{"slug":338,"name":339,"color":48},"es-a2","Es-a2",{"slug":93,"name":94,"color":48},{"slug":145,"name":146,"color":48},{"assessments":171},{"slug":326},{"id":345,"slug":346,"title":347,"subtitle":48,"excerpt":348,"coverUrl":349,"locale":13,"readingMinutes":101,"publishedAt":350,"viewCount":351,"likeCount":19,"commentCount":19,"author":352,"vertical":353,"topic":354,"tags":355,"_count":360,"playground":361,"hasQuiz":17,"hasPlayground":17},"019ff19b-f763-70e0-abdf-eded59c8e69a","overscroll-behavior-scroll-containment","You're blocking touchmove events to contain scroll. `overscroll-behavior` does it natively.","When a scrollable container hits its edge, the page behind it starts scrolling too. Developers block this with JavaScript event handlers or body overflow tricks. overscroll-behavior is the CSS property that turns off scroll chaining in one line.","\u002Fmedia\u002Fcovers\u002Foverscroll-behavior-scroll-containment.png","2026-08-12T07:38:53.786Z",618,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":59,"name":215},[356,357,358,359],{"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":346},{"id":363,"slug":364,"title":365,"subtitle":48,"excerpt":366,"coverUrl":48,"locale":13,"readingMinutes":43,"publishedAt":367,"viewCount":368,"likeCount":19,"commentCount":19,"author":369,"vertical":370,"topic":371,"tags":372,"_count":380,"playground":381,"hasQuiz":17,"hasPlayground":17},"019ff280-9fc1-779b-b125-9db7d5d16a31","turkish-a2-di-vs-mis-past","Turkish A2: -dı vs -mış — the past you saw and the past you heard about","Turkish has two past tenses, and the choice is not about time. One says you witnessed it; the other says you did not. Getting this wrong makes you sound like you are inventing things.","2026-08-12T07:00:00.000Z",259,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":22,"name":23,"accentFrom":26,"accentTo":10},{"slug":148,"name":149},[373,374,375,378,379],{"slug":148,"name":149,"color":48},{"slug":142,"name":143,"color":48},{"slug":376,"name":377,"color":48},"tr-a2","Tr-a2",{"slug":93,"name":94,"color":48},{"slug":145,"name":146,"color":48},{"assessments":171},{"slug":364},{"id":383,"slug":384,"title":385,"subtitle":48,"excerpt":386,"coverUrl":387,"locale":13,"readingMinutes":101,"publishedAt":388,"viewCount":389,"likeCount":19,"commentCount":19,"author":390,"vertical":391,"topic":392,"tags":393,"_count":400,"playground":401,"hasQuiz":17,"hasPlayground":17},"019ff19b-f68d-77ea-9a2c-70e14c5c7a05","mutation-observer-dom-change-detection","You're polling setInterval to detect DOM changes. `MutationObserver` fires when they happen.","Watching for DOM mutations with setInterval or custom event dispatch is fragile and imprecise. The MutationObserver API delivers a callback exactly when attributes, text content, or child elements change — with full control over which types of mutations you watch.","\u002Fmedia\u002Fcovers\u002Fmutation-observer-dom-change-detection.png","2026-08-11T15:48:01.781Z",698,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[394,395,396,397],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":398,"name":399,"color":48},"dom","Dom",{"assessments":171},{"slug":384},{"id":403,"slug":404,"title":405,"subtitle":48,"excerpt":406,"coverUrl":48,"locale":13,"readingMinutes":43,"publishedAt":407,"viewCount":408,"likeCount":19,"commentCount":19,"author":409,"vertical":410,"topic":411,"tags":412,"_count":422,"playground":423,"hasQuiz":17,"hasPlayground":17},"019ff280-9a99-746a-b659-971a6855a7c1","english-b1-used-to-would-be-used-to","English B1: used to, would, and be used to — three things that look alike","Used to walk, would walk, and be used to walking are not variations of one structure. Two describe the past, one describes a state, and mixing them is one of the most common B1 errors.","2026-08-11T07:00:00.000Z",295,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":22,"name":23,"accentFrom":26,"accentTo":10},{"slug":130,"name":131},[413,414,417,420,421],{"slug":130,"name":131,"color":48},{"slug":415,"name":416,"color":48},"b1","B1",{"slug":418,"name":419,"color":48},"en-b1","En-b1",{"slug":93,"name":94,"color":48},{"slug":133,"name":134,"color":48},{"assessments":171},{"slug":404},{"id":425,"slug":426,"title":427,"subtitle":48,"excerpt":428,"coverUrl":429,"locale":13,"readingMinutes":101,"publishedAt":430,"viewCount":431,"likeCount":19,"commentCount":19,"author":432,"vertical":433,"topic":434,"tags":435,"_count":440,"playground":441,"hasQuiz":17,"hasPlayground":17},"019ff19b-f5b3-7569-8cc8-22b1136aa9b2","compressionstream-native-gzip","You're importing pako to gzip data. `CompressionStream` does it natively.","pako is one of npm's most downloaded packages — pulled in by thousands of projects to compress data before storing or sending it. CompressionStream and DecompressionStream do the same job natively, in any modern browser and Node.js 18+, with no dependencies and native C-speed execution.","\u002Fmedia\u002Fcovers\u002Fcompressionstream-native-gzip.png","2026-08-10T07:49:27.000Z",551,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[436,437,438,439],{"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":426},{"id":443,"slug":444,"title":445,"subtitle":48,"excerpt":446,"coverUrl":48,"locale":13,"readingMinutes":43,"publishedAt":447,"viewCount":448,"likeCount":19,"commentCount":19,"author":449,"vertical":450,"topic":451,"tags":452,"_count":460,"playground":461,"hasQuiz":17,"hasPlayground":17},"019ff280-9d75-715b-b7db-27dd9deec26a","spanish-a1-ser-vs-estar","Spanish A1: ser vs estar — two verbs for 'to be', and the line between them","Spanish splits 'to be' into ser and estar. The usual advice — permanent versus temporary — breaks immediately. Here is the line that actually holds.","2026-08-10T07:00:00.000Z",264,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":22,"name":23,"accentFrom":26,"accentTo":10},{"slug":136,"name":137},[453,454,455,458,459],{"slug":136,"name":137,"color":48},{"slug":139,"name":140,"color":48},{"slug":456,"name":457,"color":48},"es-a1","Es-a1",{"slug":93,"name":94,"color":48},{"slug":133,"name":134,"color":48},{"assessments":171},{"slug":444},{"id":463,"slug":464,"title":465,"subtitle":48,"excerpt":466,"coverUrl":467,"locale":13,"readingMinutes":101,"publishedAt":468,"viewCount":469,"likeCount":19,"commentCount":19,"author":470,"vertical":471,"topic":472,"tags":473,"_count":478,"playground":479,"hasQuiz":17,"hasPlayground":17},"019fe660-fcbe-745e-a443-5ae33ac10aaf","broadcast-channel-cross-tab-messaging","Stop using the localStorage hack to sync browser tabs. BroadcastChannel does it natively.","Syncing state across browser tabs with localStorage events is a widely-used trick that requires JSON.stringify, event filtering, and careful cleanup. The Broadcast Channel API delivers messages between tabs directly, with none of the side effects.","\u002Fmedia\u002Fcovers\u002Fbroadcast-channel-cross-tab-messaging.png","2026-08-09T07:02:41.629Z",1377,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":6,"name":7,"accentFrom":10,"accentTo":11},{"slug":51,"name":230},[474,475,476,477],{"slug":51,"name":52,"color":48},{"slug":46,"name":47,"color":48},{"slug":55,"name":56,"color":48},{"slug":103,"name":104,"color":48},{"assessments":171},{"slug":464},{"id":481,"slug":482,"title":483,"subtitle":48,"excerpt":484,"coverUrl":48,"locale":13,"readingMinutes":31,"publishedAt":485,"viewCount":486,"likeCount":19,"commentCount":19,"author":487,"vertical":488,"topic":489,"tags":490,"_count":500,"playground":501,"hasQuiz":17,"hasPlayground":17},"019ff280-9ef6-70b1-86a9-3d4271f797fe","turkish-a1-vowel-harmony","Turkish A1: vowel harmony — the rule that makes every ending predictable","Turkish glues endings onto words, and the vowel in the ending changes to match the word. Learn the two harmony rules and you stop memorising endings and start deriving them.","2026-08-09T07:00:00.000Z",235,{"id":269,"name":270,"username":271,"avatarUrl":48,"headline":272},{"slug":22,"name":23,"accentFrom":26,"accentTo":10},{"slug":148,"name":149},[491,492,493,496,497],{"slug":148,"name":149,"color":48},{"slug":139,"name":140,"color":48},{"slug":494,"name":495,"color":48},"tr-a1","Tr-a1",{"slug":93,"name":94,"color":48},{"slug":498,"name":499,"color":48},"pronunciation","Pronunciation",{"assessments":171},{"slug":482},{"page":88,"perPage":77,"total":503,"totalPages":504},119,10,{"items":506,"meta":526},[507],{"id":508,"slug":509,"title":510,"subtitle":48,"excerpt":511,"coverUrl":512,"locale":13,"readingMinutes":513,"publishedAt":514,"viewCount":515,"likeCount":19,"commentCount":19,"author":516,"vertical":517,"topic":518,"tags":519,"_count":524,"playground":525,"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},[520,521,522,523],{"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":509},{"page":171,"perPage":171,"total":503,"totalPages":503}]