[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-topics":3,"verticals":138,"topics-all":177,"search-suggestions":256,"articles-all-14---":269,"articles-total":492},[4,9,13,17,21,25,29,33,37,41,45,49,53,56,60,64,67,70,74,77,80,84,87,91,94,97,101,104,108,111,114,117,120,123,126,129,132,135],{"slug":5,"name":6,"color":7,"articles":8},"webdev","Webdev",null,151,{"slug":10,"name":11,"color":7,"articles":12},"javascript","Javascript",124,{"slug":14,"name":15,"color":7,"articles":16},"frontend","Frontend",88,{"slug":18,"name":19,"color":7,"articles":20},"tutorial","Tutorial",58,{"slug":22,"name":23,"color":7,"articles":24},"css","Css",45,{"slug":26,"name":27,"color":7,"articles":28},"performance","Performance",25,{"slug":30,"name":31,"color":7,"articles":32},"typescript","Typescript",21,{"slug":34,"name":35,"color":7,"articles":36},"react","React",19,{"slug":38,"name":39,"color":7,"articles":40},"browser","Browser",14,{"slug":42,"name":43,"color":7,"articles":44},"node","Node",13,{"slug":46,"name":47,"color":7,"articles":48},"programming","Programming",12,{"slug":50,"name":51,"color":7,"articles":52},"html","Html",10,{"slug":54,"name":55,"color":7,"articles":52},"accessibility","Accessibility",{"slug":57,"name":58,"color":7,"articles":59},"nextjs","Nextjs",8,{"slug":61,"name":62,"color":7,"articles":63},"nuxt","Nuxt",7,{"slug":65,"name":66,"color":7,"articles":63},"nestjs","Nestjs",{"slug":68,"name":69,"color":7,"articles":63},"vue","Vue",{"slug":71,"name":72,"color":7,"articles":73},"grammar","Grammar",6,{"slug":75,"name":76,"color":7,"articles":73},"career","Career",{"slug":78,"name":79,"color":7,"articles":73},"discuss","Discuss",{"slug":81,"name":82,"color":7,"articles":83},"beginners","Beginners",5,{"slug":85,"name":86,"color":7,"articles":83},"productivity","Productivity",{"slug":88,"name":89,"color":7,"articles":90},"ssr","SSR",4,{"slug":92,"name":93,"color":7,"articles":90},"security","Security",{"slug":95,"name":96,"color":7,"articles":90},"apis","Apis",{"slug":98,"name":99,"color":7,"articles":100},"ai","Ai",3,{"slug":102,"name":103,"color":7,"articles":100},"api","API",{"slug":105,"name":106,"color":7,"articles":107},"async","Async",2,{"slug":109,"name":110,"color":7,"articles":107},"forms","Forms",{"slug":112,"name":113,"color":7,"articles":107},"dom","Dom",{"slug":115,"name":116,"color":7,"articles":107},"english","English",{"slug":118,"name":119,"color":7,"articles":107},"verbs","Verbs",{"slug":121,"name":122,"color":7,"articles":107},"spanish","Spanish",{"slug":124,"name":125,"color":7,"articles":107},"a1","A1",{"slug":127,"name":128,"color":7,"articles":107},"a2","A2",{"slug":130,"name":131,"color":7,"articles":107},"tenses","Tenses",{"slug":133,"name":134,"color":7,"articles":107},"turkish","Turkish",{"slug":136,"name":137,"color":7,"articles":107},"animation","Animation",[139,155,166],{"id":140,"slug":141,"name":142,"tagline":143,"description":144,"accentFrom":145,"accentTo":146,"icon":147,"defaultLocale":148,"locales":149,"features":151,"position":154},"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",[148,150],"fa",{"courses":152,"paths":152,"articles":152,"exams":153,"flashcards":153,"packages":152,"community":152,"certificates":152,"teams":152,"commerce":152},true,false,0,{"id":156,"slug":157,"name":158,"tagline":159,"description":160,"accentFrom":161,"accentTo":145,"icon":162,"defaultLocale":148,"locales":163,"features":165,"position":107},"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","⌘",[148,150,164],"es",{"courses":153,"paths":153,"articles":152,"exams":153,"flashcards":152,"packages":153,"community":152,"certificates":152,"teams":153,"commerce":153},{"id":167,"slug":168,"name":169,"tagline":170,"description":171,"accentFrom":172,"accentTo":173,"icon":174,"defaultLocale":148,"locales":175,"features":176,"position":100},"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","◉",[148],{"courses":153,"paths":153,"articles":152,"exams":153,"flashcards":153,"packages":153,"community":152,"certificates":153,"teams":153,"commerce":153},[178,184,186,191,193,198,201,205,210,215,217,222,225,229,231,235,237,240,244,246,248,250,252,254],{"id":179,"slug":180,"name":181,"parentId":7,"description":182,"articleCount":183},"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":185,"slug":68,"name":69,"parentId":7,"description":7,"articleCount":63},"019fe637-3e06-75b8-8a2c-fc350aad7701",{"id":187,"slug":188,"name":189,"parentId":7,"description":190,"articleCount":183},"9ef7e6f6-b287-4ac2-8f56-421d3aafe8cc","meetings","Meetings and rooms","Speaking up, running one, and knowing which kind you are in.",{"id":192,"slug":61,"name":62,"parentId":7,"description":7,"articleCount":63},"019fe637-3e06-75b8-8a2d-0309c35755c6",{"id":194,"slug":195,"name":196,"parentId":7,"description":197,"articleCount":183},"540105e9-ba05-40f3-bdfd-16fb645e978c","interviews","Getting hired","Applications, interviews, offers, and the negotiation nobody rehearses.",{"id":199,"slug":30,"name":200,"parentId":7,"description":7,"articleCount":83},"019fe637-3e06-75b8-8a2d-040994c0d907","TypeScript",{"id":202,"slug":203,"name":204,"parentId":7,"description":7,"articleCount":154},"019fe637-3e06-75b8-8a2d-0956229cd176","architecture","Architecture",{"id":206,"slug":207,"name":208,"parentId":7,"description":209,"articleCount":183},"0cc5bdbb-d6e8-43b0-9cb4-d227aec6aa68","people","The people around you","Colleagues, managers, and the relationships that decide how work feels.",{"id":211,"slug":212,"name":213,"parentId":7,"description":214,"articleCount":183},"545c6bda-b8cf-4905-8056-18c0c4dc7a64","leading","Leading","Becoming the person others rely on, before and after the title.",{"id":216,"slug":26,"name":27,"parentId":7,"description":7,"articleCount":183},"019fe637-3e07-735d-8227-4c34039af2e0",{"id":218,"slug":219,"name":220,"parentId":7,"description":221,"articleCount":183},"cc22e84d-2cac-44ac-a272-5715e4710dc4","company","Company shapes","Why the same behaviour succeeds at five people and fails at five thousand.",{"id":223,"slug":98,"name":224,"parentId":7,"description":7,"articleCount":183},"019fe65f-98ec-773a-8ca8-9a2e971911c1","AI",{"id":226,"slug":22,"name":227,"parentId":7,"description":7,"articleCount":228},"019fe65f-c110-761b-931e-99a2d1280410","CSS",41,{"id":230,"slug":75,"name":76,"parentId":7,"description":7,"articleCount":154},"01a037b3-d685-76cb-9940-6a3f8ce140a0",{"id":232,"slug":233,"name":234,"parentId":7,"description":7,"articleCount":183},"019fe65f-a1cb-74c8-b999-ff353158fce9","designsystems","Design Systems",{"id":236,"slug":115,"name":116,"parentId":7,"description":7,"articleCount":107},"019ff280-9a51-757c-84ce-c941f20371e9",{"id":238,"slug":50,"name":239,"parentId":7,"description":7,"articleCount":100},"019ff19b-f37e-7091-b3cd-5c99e8c005a4","HTML",{"id":241,"slug":10,"name":242,"parentId":7,"description":7,"articleCount":243},"019fe65f-b950-7762-bb1a-d83445281950","JavaScript",71,{"id":245,"slug":65,"name":66,"parentId":7,"description":7,"articleCount":63},"01a03cdb-1ff8-76fa-9fa7-38d9e4eba1e1",{"id":247,"slug":57,"name":58,"parentId":7,"description":7,"articleCount":59},"01a0499d-b263-749a-a3ad-df3cc782e94d",{"id":249,"slug":34,"name":35,"parentId":7,"description":7,"articleCount":52},"019fe65f-b134-725b-bbc7-3e3db8c68675",{"id":251,"slug":92,"name":93,"parentId":7,"description":7,"articleCount":107},"019fe660-ce9d-754e-b241-7bccad915b86",{"id":253,"slug":121,"name":122,"parentId":7,"description":7,"articleCount":107},"019ff280-9d5a-77dc-b01d-e2378eaf86cb",{"id":255,"slug":133,"name":134,"parentId":7,"description":7,"articleCount":107},"019ff280-9eea-736d-ad13-4c01f0ddc46e",[257,258,259,260,261,262,263,264,265,266,267,268],{"slug":5,"name":6,"articles":8},{"slug":10,"name":11,"articles":12},{"slug":14,"name":15,"articles":16},{"slug":18,"name":19,"articles":20},{"slug":22,"name":23,"articles":24},{"slug":26,"name":27,"articles":28},{"slug":30,"name":31,"articles":32},{"slug":34,"name":35,"articles":36},{"slug":38,"name":39,"articles":40},{"slug":42,"name":43,"articles":44},{"slug":46,"name":47,"articles":48},{"slug":54,"name":55,"articles":52},{"items":270,"meta":489},[271,293,311,329,347,365,383,401,419,437,455,472],{"id":272,"slug":273,"title":274,"subtitle":7,"excerpt":275,"coverUrl":276,"locale":148,"readingMinutes":83,"publishedAt":277,"viewCount":278,"likeCount":154,"commentCount":154,"author":279,"vertical":284,"topic":285,"tags":286,"_count":291,"playground":292,"hasQuiz":152,"hasPlayground":152},"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",391,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},"019fe637-3c25-7088-9034-39c9f15dc3c8","Parsa Jiravand","parsa","Frontend engineer · building bestpractic",{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":10,"name":242},[287,288,289,290],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":34,"name":35,"color":7},{"assessments":183},{"slug":273},{"id":294,"slug":295,"title":296,"subtitle":7,"excerpt":297,"coverUrl":298,"locale":148,"readingMinutes":90,"publishedAt":299,"viewCount":300,"likeCount":154,"commentCount":154,"author":301,"vertical":302,"topic":303,"tags":304,"_count":309,"playground":310,"hasQuiz":152,"hasPlayground":152},"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",346,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":10,"name":242},[305,306,307,308],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":42,"name":43,"color":7},{"assessments":183},{"slug":295},{"id":312,"slug":313,"title":314,"subtitle":7,"excerpt":315,"coverUrl":316,"locale":148,"readingMinutes":44,"publishedAt":317,"viewCount":318,"likeCount":154,"commentCount":154,"author":319,"vertical":320,"topic":321,"tags":322,"_count":327,"playground":328,"hasQuiz":152,"hasPlayground":152},"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",762,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":10,"name":242},[323,324,325,326],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":18,"name":19,"color":7},{"slug":46,"name":47,"color":7},{"assessments":183},{"slug":313},{"id":330,"slug":331,"title":332,"subtitle":7,"excerpt":333,"coverUrl":334,"locale":148,"readingMinutes":83,"publishedAt":335,"viewCount":336,"likeCount":154,"commentCount":154,"author":337,"vertical":338,"topic":339,"tags":340,"_count":345,"playground":346,"hasQuiz":152,"hasPlayground":152},"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",402,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":10,"name":242},[341,342,343,344],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":42,"name":43,"color":7},{"assessments":183},{"slug":331},{"id":348,"slug":349,"title":350,"subtitle":7,"excerpt":351,"coverUrl":352,"locale":148,"readingMinutes":90,"publishedAt":353,"viewCount":354,"likeCount":154,"commentCount":154,"author":355,"vertical":356,"topic":357,"tags":358,"_count":363,"playground":364,"hasQuiz":152,"hasPlayground":152},"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",375,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":10,"name":242},[359,360,361,362],{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":10,"name":11,"color":7},{"slug":22,"name":23,"color":7},{"assessments":183},{"slug":349},{"id":366,"slug":367,"title":368,"subtitle":7,"excerpt":369,"coverUrl":370,"locale":148,"readingMinutes":83,"publishedAt":371,"viewCount":372,"likeCount":154,"commentCount":154,"author":373,"vertical":374,"topic":375,"tags":376,"_count":381,"playground":382,"hasQuiz":152,"hasPlayground":152},"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",454,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":30,"name":200},[377,378,379,380],{"slug":30,"name":31,"color":7},{"slug":5,"name":6,"color":7},{"slug":10,"name":11,"color":7},{"slug":14,"name":15,"color":7},{"assessments":183},{"slug":367},{"id":384,"slug":385,"title":386,"subtitle":7,"excerpt":387,"coverUrl":388,"locale":148,"readingMinutes":90,"publishedAt":389,"viewCount":390,"likeCount":154,"commentCount":154,"author":391,"vertical":392,"topic":393,"tags":394,"_count":399,"playground":400,"hasQuiz":152,"hasPlayground":152},"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",365,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":10,"name":242},[395,396,397,398],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":42,"name":43,"color":7},{"assessments":183},{"slug":385},{"id":402,"slug":403,"title":404,"subtitle":7,"excerpt":405,"coverUrl":406,"locale":148,"readingMinutes":83,"publishedAt":407,"viewCount":408,"likeCount":154,"commentCount":154,"author":409,"vertical":410,"topic":411,"tags":412,"_count":417,"playground":418,"hasQuiz":152,"hasPlayground":152},"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",313,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":22,"name":227},[413,414,415,416],{"slug":22,"name":23,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":10,"name":11,"color":7},{"assessments":183},{"slug":403},{"id":420,"slug":421,"title":422,"subtitle":7,"excerpt":423,"coverUrl":424,"locale":148,"readingMinutes":83,"publishedAt":425,"viewCount":426,"likeCount":154,"commentCount":154,"author":427,"vertical":428,"topic":429,"tags":430,"_count":435,"playground":436,"hasQuiz":152,"hasPlayground":152},"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",509,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":22,"name":227},[431,432,433,434],{"slug":22,"name":23,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":10,"name":11,"color":7},{"assessments":183},{"slug":421},{"id":438,"slug":439,"title":440,"subtitle":7,"excerpt":441,"coverUrl":442,"locale":148,"readingMinutes":73,"publishedAt":443,"viewCount":444,"likeCount":154,"commentCount":154,"author":445,"vertical":446,"topic":447,"tags":448,"_count":453,"playground":454,"hasQuiz":152,"hasPlayground":152},"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",355,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":22,"name":227},[449,450,451,452],{"slug":22,"name":23,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":10,"name":11,"color":7},{"assessments":183},{"slug":439},{"id":456,"slug":457,"title":458,"subtitle":7,"excerpt":459,"coverUrl":460,"locale":148,"readingMinutes":90,"publishedAt":461,"viewCount":462,"likeCount":154,"commentCount":154,"author":463,"vertical":464,"topic":465,"tags":466,"_count":471,"playground":7,"hasQuiz":153,"hasPlayground":153},"019fe65f-e7b8-7175-a185-34775c370bcf","abort-controller-async-cancellation","Your fetch() Is Still Running After the User Left","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","2026-07-05T09:12:47.873Z",273,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":10,"name":242},[467,468,469,470],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":34,"name":35,"color":7},{"assessments":154},{"id":473,"slug":474,"title":475,"subtitle":7,"excerpt":476,"coverUrl":477,"locale":148,"readingMinutes":83,"publishedAt":478,"viewCount":479,"likeCount":154,"commentCount":154,"author":480,"vertical":481,"topic":482,"tags":483,"_count":488,"playground":7,"hasQuiz":153,"hasPlayground":153},"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","2026-07-04T08:44:02.193Z",131,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":22,"name":227},[484,485,486,487],{"slug":22,"name":23,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":10,"name":11,"color":7},{"assessments":154},{"page":40,"perPage":48,"total":490,"totalPages":491},177,15,{"items":493,"meta":512},[494],{"id":495,"slug":496,"title":497,"subtitle":7,"excerpt":498,"coverUrl":499,"locale":148,"readingMinutes":83,"publishedAt":500,"viewCount":501,"likeCount":154,"commentCount":154,"author":502,"vertical":503,"topic":504,"tags":505,"_count":510,"playground":511,"hasQuiz":152,"hasPlayground":152},"01a14e81-eaa5-700a-a6f6-3be4ffe47c2b","usesyncexternalstore-tearing-fix","Your Custom Hooks Tear in React 18. `useSyncExternalStore` Fixes It.","A useState + useEffect hook that subscribes to window size, localStorage, or a WebSocket looks fine until React 18's concurrent rendering shows two parts of your UI two different values at once. useSyncExternalStore is the hook built to stop that.","\u002Fmedia\u002Fcovers\u002Fusesyncexternalstore-tearing-fix.png","2026-10-23T06:11:03.306Z",86,{"id":280,"name":281,"username":282,"avatarUrl":7,"headline":283},{"slug":141,"name":142,"accentFrom":145,"accentTo":146},{"slug":34,"name":35},[506,507,508,509],{"slug":34,"name":35,"color":7},{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"assessments":183},{"slug":496},{"page":183,"perPage":183,"total":490,"totalPages":490}]