[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-topics":3,"verticals":126,"topics-all":165,"search-suggestions":245,"articles-all-7---":258,"articles-total":489},[4,9,13,17,21,25,29,33,37,41,44,48,51,54,57,61,64,68,71,74,77,81,84,87,90,93,96,99,102,105,108,111,114,117,120,123],{"slug":5,"name":6,"color":7,"articles":8},"webdev","Webdev",null,103,{"slug":10,"name":11,"color":7,"articles":12},"javascript","Javascript",87,{"slug":14,"name":15,"color":7,"articles":16},"frontend","Frontend",71,{"slug":18,"name":19,"color":7,"articles":20},"css","Css",34,{"slug":22,"name":23,"color":7,"articles":24},"tutorial","Tutorial",32,{"slug":26,"name":27,"color":7,"articles":28},"typescript","Typescript",15,{"slug":30,"name":31,"color":7,"articles":32},"react","React",13,{"slug":34,"name":35,"color":7,"articles":36},"performance","Performance",12,{"slug":38,"name":39,"color":7,"articles":40},"node","Node",9,{"slug":42,"name":43,"color":7,"articles":40},"browser","Browser",{"slug":45,"name":46,"color":7,"articles":47},"programming","Programming",6,{"slug":49,"name":50,"color":7,"articles":47},"html","Html",{"slug":52,"name":53,"color":7,"articles":47},"grammar","Grammar",{"slug":55,"name":56,"color":7,"articles":47},"accessibility","Accessibility",{"slug":58,"name":59,"color":7,"articles":60},"nestjs","Nestjs",4,{"slug":62,"name":63,"color":7,"articles":60},"apis","Apis",{"slug":65,"name":66,"color":7,"articles":67},"nuxt","Nuxt",3,{"slug":69,"name":70,"color":7,"articles":67},"ssr","SSR",{"slug":72,"name":73,"color":7,"articles":67},"nextjs","Nextjs",{"slug":75,"name":76,"color":7,"articles":67},"ai","Ai",{"slug":78,"name":79,"color":7,"articles":80},"security","Security",2,{"slug":82,"name":83,"color":7,"articles":80},"async","Async",{"slug":85,"name":86,"color":7,"articles":80},"forms","Forms",{"slug":88,"name":89,"color":7,"articles":80},"api","API",{"slug":91,"name":92,"color":7,"articles":80},"english","English",{"slug":94,"name":95,"color":7,"articles":80},"verbs","Verbs",{"slug":97,"name":98,"color":7,"articles":80},"spanish","Spanish",{"slug":100,"name":101,"color":7,"articles":80},"a1","A1",{"slug":103,"name":104,"color":7,"articles":80},"a2","A2",{"slug":106,"name":107,"color":7,"articles":80},"tenses","Tenses",{"slug":109,"name":110,"color":7,"articles":80},"turkish","Turkish",{"slug":112,"name":113,"color":7,"articles":80},"vue","Vue",{"slug":115,"name":116,"color":7,"articles":80},"career","Career",{"slug":118,"name":119,"color":7,"articles":80},"beginners","Beginners",{"slug":121,"name":122,"color":7,"articles":80},"productivity","Productivity",{"slug":124,"name":125,"color":7,"articles":80},"discuss","Discuss",[127,143,154],{"id":128,"slug":129,"name":130,"tagline":131,"description":132,"accentFrom":133,"accentTo":134,"icon":135,"defaultLocale":136,"locales":137,"features":139,"position":142},"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",[136,138],"fa",{"courses":140,"paths":140,"articles":140,"exams":141,"flashcards":141,"packages":140,"community":140,"certificates":140,"teams":140,"commerce":140},true,false,0,{"id":144,"slug":145,"name":146,"tagline":147,"description":148,"accentFrom":149,"accentTo":133,"icon":150,"defaultLocale":136,"locales":151,"features":153,"position":80},"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","⌘",[136,138,152],"es",{"courses":141,"paths":141,"articles":140,"exams":141,"flashcards":140,"packages":141,"community":140,"certificates":140,"teams":141,"commerce":141},{"id":155,"slug":156,"name":157,"tagline":158,"description":159,"accentFrom":160,"accentTo":161,"icon":162,"defaultLocale":136,"locales":163,"features":164,"position":67},"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","◉",[136],{"courses":141,"paths":141,"articles":140,"exams":141,"flashcards":141,"packages":141,"community":140,"certificates":141,"teams":141,"commerce":141},[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":7,"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":112,"name":113,"parentId":7,"description":7,"articleCount":80},"019fe637-3e06-75b8-8a2c-fc350aad7701",{"id":175,"slug":176,"name":177,"parentId":7,"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":65,"name":66,"parentId":7,"description":7,"articleCount":67},"019fe637-3e06-75b8-8a2d-0309c35755c6",{"id":182,"slug":183,"name":184,"parentId":7,"description":185,"articleCount":142},"540105e9-ba05-40f3-bdfd-16fb645e978c","interviews","Getting hired","Applications, interviews, offers, and the negotiation nobody rehearses.",{"id":187,"slug":26,"name":188,"parentId":7,"description":7,"articleCount":60},"019fe637-3e06-75b8-8a2d-040994c0d907","TypeScript",{"id":190,"slug":191,"name":192,"parentId":7,"description":7,"articleCount":142},"019fe637-3e06-75b8-8a2d-0956229cd176","architecture","Architecture",{"id":194,"slug":195,"name":196,"parentId":7,"description":197,"articleCount":142},"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":7,"description":202,"articleCount":142},"545c6bda-b8cf-4905-8056-18c0c4dc7a64","leading","Leading","Becoming the person others rely on, before and after the title.",{"id":204,"slug":34,"name":35,"parentId":7,"description":7,"articleCount":142},"019fe637-3e07-735d-8227-4c34039af2e0",{"id":206,"slug":207,"name":208,"parentId":7,"description":209,"articleCount":142},"cc22e84d-2cac-44ac-a272-5715e4710dc4","company","Company shapes","Why the same behaviour succeeds at five people and fails at five thousand.",{"id":211,"slug":75,"name":212,"parentId":7,"description":7,"articleCount":171},"019fe65f-98ec-773a-8ca8-9a2e971911c1","AI",{"id":214,"slug":18,"name":215,"parentId":7,"description":7,"articleCount":216},"019fe65f-c110-761b-931e-99a2d1280410","CSS",31,{"id":218,"slug":115,"name":116,"parentId":7,"description":7,"articleCount":142},"01a037b3-d685-76cb-9940-6a3f8ce140a0",{"id":220,"slug":221,"name":222,"parentId":7,"description":7,"articleCount":171},"019fe65f-a1cb-74c8-b999-ff353158fce9","designsystems","Design Systems",{"id":224,"slug":91,"name":92,"parentId":7,"description":7,"articleCount":80},"019ff280-9a51-757c-84ce-c941f20371e9",{"id":226,"slug":49,"name":227,"parentId":7,"description":7,"articleCount":80},"019ff19b-f37e-7091-b3cd-5c99e8c005a4","HTML",{"id":229,"slug":10,"name":230,"parentId":7,"description":7,"articleCount":231},"019fe65f-b950-7762-bb1a-d83445281950","JavaScript",52,{"id":233,"slug":58,"name":59,"parentId":7,"description":7,"articleCount":60},"01a03cdb-1ff8-76fa-9fa7-38d9e4eba1e1",{"id":235,"slug":72,"name":73,"parentId":7,"description":7,"articleCount":67},"01a0499d-b263-749a-a3ad-df3cc782e94d",{"id":237,"slug":30,"name":31,"parentId":7,"description":7,"articleCount":238},"019fe65f-b134-725b-bbc7-3e3db8c68675",5,{"id":240,"slug":78,"name":79,"parentId":7,"description":7,"articleCount":80},"019fe660-ce9d-754e-b241-7bccad915b86",{"id":242,"slug":97,"name":98,"parentId":7,"description":7,"articleCount":80},"019ff280-9d5a-77dc-b01d-e2378eaf86cb",{"id":244,"slug":109,"name":110,"parentId":7,"description":7,"articleCount":80},"019ff280-9eea-736d-ad13-4c01f0ddc46e",[246,247,248,249,250,251,252,253,254,255,256,257],{"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":42,"name":43,"articles":40},{"slug":38,"name":39,"articles":40},{"slug":49,"name":50,"articles":47},{"slug":52,"name":53,"articles":47},{"items":259,"meta":485},[260,282,300,320,338,358,376,394,413,431,449,467],{"id":261,"slug":262,"title":263,"subtitle":7,"excerpt":264,"coverUrl":265,"locale":136,"readingMinutes":238,"publishedAt":266,"viewCount":267,"likeCount":142,"commentCount":142,"author":268,"vertical":273,"topic":274,"tags":275,"_count":280,"playground":281,"hasQuiz":140,"hasPlayground":140},"019ff19b-f388-73f8-aa5b-93d73337d6fd","dialog-element-native-modal","You built your modal with a `\u003Cdiv>` and a focus trap library. The native `\u003Cdialog>` does all of that.","The `\u003Cdialog>` element ships with focus trapping, Escape-to-close, backdrop rendering, and correct ARIA semantics — no library, no boilerplate. It's been Baseline since 2022.","\u002Fmedia\u002Fcovers\u002Fdialog-element-native-modal.png","2026-08-08T07:00:10.810Z",421,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},"019fe637-3c25-7088-9034-39c9f15dc3c8","Parsa Jiravand","parsa","Frontend engineer · building bestpractic",{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":49,"name":227},[276,277,278,279],{"slug":49,"name":50,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":10,"name":11,"color":7},{"assessments":171},{"slug":262},{"id":283,"slug":284,"title":285,"subtitle":7,"excerpt":286,"coverUrl":287,"locale":136,"readingMinutes":67,"publishedAt":288,"viewCount":289,"likeCount":142,"commentCount":142,"author":290,"vertical":291,"topic":292,"tags":293,"_count":298,"playground":299,"hasQuiz":140,"hasPlayground":140},"019fe660-f552-73c8-9f52-d036e672c053","crypto-randomuuid-native-uuid","Stop importing `uuid`. `crypto.randomUUID()` has been native since 2021.","The `uuid` package is downloaded hundreds of millions of times a week. Most installs exist to call uuid\u002Fv4 — exactly what `crypto.randomUUID()` does natively, with no import, no bundle cost, and guaranteed cryptographic randomness.","\u002Fmedia\u002Fcovers\u002Fcrypto-randomuuid-native-uuid.png","2026-08-08T07:00:09.988Z",408,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":10,"name":230},[294,295,296,297],{"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":171},{"slug":284},{"id":301,"slug":302,"title":303,"subtitle":7,"excerpt":304,"coverUrl":305,"locale":136,"readingMinutes":60,"publishedAt":306,"viewCount":307,"likeCount":142,"commentCount":142,"author":308,"vertical":309,"topic":310,"tags":311,"_count":318,"playground":319,"hasQuiz":140,"hasPlayground":140},"019fe660-edbb-714e-b0e8-8488ccbb6940","intl-relativetimeformat-relative-dates","You're installing date-fns for 'X hours ago'. `Intl.RelativeTimeFormat` does it natively.","Most apps display relative timestamps — '3 minutes ago', 'last week'. Developers still reach for date-fns or moment for this. The Intl.RelativeTimeFormat API handles it natively, with full locale support and zero dependencies.","\u002Fmedia\u002Fcovers\u002Fintl-relativetimeformat-relative-dates.png","2026-08-07T07:22:54.352Z",314,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":10,"name":230},[312,313,314,315],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":316,"name":317,"color":7},"intl","Intl",{"assessments":171},{"slug":302},{"id":321,"slug":322,"title":323,"subtitle":7,"excerpt":324,"coverUrl":325,"locale":136,"readingMinutes":60,"publishedAt":326,"viewCount":327,"likeCount":142,"commentCount":142,"author":328,"vertical":329,"topic":330,"tags":331,"_count":336,"playground":337,"hasQuiz":140,"hasPlayground":140},"019ff19b-f047-748a-800d-00912a4d95c9","object-hasown-safe-property-check","You use `obj.hasOwnProperty(key)` to check property ownership. It can silently fail. `Object.hasOwn()` is the safe replacement.","Two real cases where `obj.hasOwnProperty(key)` throws or returns wrong results — and why `Object.hasOwn(obj, key)` is the ES2022 fix that ESLint's `no-prototype-builtins` rule has been nudging you toward for years.","\u002Fmedia\u002Fcovers\u002Fobject-hasown-safe-property-check.png","2026-08-06T08:44:20.722Z",301,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":10,"name":230},[332,333,334,335],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":26,"name":27,"color":7},{"assessments":171},{"slug":322},{"id":339,"slug":340,"title":341,"subtitle":7,"excerpt":342,"coverUrl":343,"locale":136,"readingMinutes":60,"publishedAt":344,"viewCount":345,"likeCount":142,"commentCount":142,"author":346,"vertical":347,"topic":348,"tags":349,"_count":356,"playground":357,"hasQuiz":140,"hasPlayground":140},"019fe660-e5d0-756a-9ae2-20c6ff4c2f48","css-style-queries-react-to-custom-properties","Container queries can check more than size — style queries let components read custom property values","Size queries react to container width. Style queries react to CSS custom property values on a container ancestor — enabling component-level theming and variant switching in pure CSS, no JavaScript involved.","\u002Fmedia\u002Fcovers\u002Fcss-style-queries-react-to-custom-properties.png","2026-08-06T08:44:20.136Z",303,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":18,"name":215},[350,351,352,353],{"slug":18,"name":19,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":354,"name":355,"color":7},"components","Components",{"assessments":171},{"slug":340},{"id":359,"slug":360,"title":361,"subtitle":7,"excerpt":362,"coverUrl":363,"locale":136,"readingMinutes":60,"publishedAt":364,"viewCount":365,"likeCount":142,"commentCount":142,"author":366,"vertical":367,"topic":368,"tags":369,"_count":374,"playground":375,"hasQuiz":140,"hasPlayground":140},"019fe660-de51-759d-935f-dbda9e7e38b5","array-from-async-async-iterable","You're collecting async iterable results with a for-await loop. `Array.fromAsync` does it in one call.","A for-await loop that pushes into an array, or the `await Promise.all([...asyncIterable])` workaround that silently fails — `Array.fromAsync` replaces both with a single awaited call. It's Baseline 2024.","\u002Fmedia\u002Fcovers\u002Farray-from-async-async-iterable.png","2026-08-05T08:42:50.920Z",534,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":10,"name":230},[370,371,372,373],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":82,"name":83,"color":7},{"assessments":171},{"slug":360},{"id":377,"slug":378,"title":379,"subtitle":7,"excerpt":380,"coverUrl":381,"locale":136,"readingMinutes":238,"publishedAt":382,"viewCount":383,"likeCount":142,"commentCount":142,"author":384,"vertical":385,"topic":386,"tags":387,"_count":392,"playground":393,"hasQuiz":140,"hasPlayground":140},"019fe660-d6d5-7099-89bb-af60e48fcb28","content-visibility-skip-offscreen-rendering","Your browser renders everything, even what you can't see — `content-visibility: auto` fixes that","Browsers lay out and paint the entire page on load, including the 80% below the fold. `content-visibility: auto` tells the browser to skip that work for off-screen elements — and it's Baseline 2024.","\u002Fmedia\u002Fcovers\u002Fcontent-visibility-skip-offscreen-rendering.png","2026-08-04T08:44:59.227Z",617,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":18,"name":215},[388,389,390,391],{"slug":18,"name":19,"color":7},{"slug":5,"name":6,"color":7},{"slug":34,"name":35,"color":7},{"slug":14,"name":15,"color":7},{"assessments":171},{"slug":378},{"id":395,"slug":396,"title":397,"subtitle":7,"excerpt":398,"coverUrl":399,"locale":136,"readingMinutes":400,"publishedAt":401,"viewCount":402,"likeCount":142,"commentCount":142,"author":403,"vertical":404,"topic":405,"tags":406,"_count":411,"playground":412,"hasQuiz":140,"hasPlayground":140},"019fe660-cf2a-71df-b517-8d722f92cc37","weekly-cors-explained","CORS Explained: The Complete Guide (with Cheat Sheet)","A complete guide to CORS: the same-origin policy, preflight requests, and Access-Control-Allow-Origin headers — with worked examples and a cheat sheet.","\u002Fmedia\u002Fcovers\u002Fweekly-cors-explained.png",14,"2026-08-03T09:54:26.268Z",647,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":78,"name":79},[407,408,409,410],{"slug":5,"name":6,"color":7},{"slug":78,"name":79,"color":7},{"slug":10,"name":11,"color":7},{"slug":22,"name":23,"color":7},{"assessments":171},{"slug":396},{"id":414,"slug":415,"title":416,"subtitle":7,"excerpt":417,"coverUrl":418,"locale":136,"readingMinutes":238,"publishedAt":419,"viewCount":420,"likeCount":142,"commentCount":142,"author":421,"vertical":422,"topic":423,"tags":424,"_count":429,"playground":430,"hasQuiz":140,"hasPlayground":140},"019fe660-c754-703b-80fb-2254bb102ab7","scheduler-yield-main-thread","Your UI is freezing because you never gave the browser a break","Long synchronous tasks block the main thread and make your interface unresponsive. `scheduler.yield()` is the native way to hand control back to the browser mid-task so it can paint, handle input, and resume your work exactly where it left off.","\u002Fmedia\u002Fcovers\u002Fscheduler-yield-main-thread.png","2026-08-03T09:54:25.323Z",464,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":10,"name":230},[425,426,427,428],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":34,"name":35,"color":7},{"slug":14,"name":15,"color":7},{"assessments":171},{"slug":415},{"id":432,"slug":433,"title":434,"subtitle":7,"excerpt":435,"coverUrl":436,"locale":136,"readingMinutes":238,"publishedAt":437,"viewCount":438,"likeCount":142,"commentCount":142,"author":439,"vertical":440,"topic":441,"tags":442,"_count":447,"playground":448,"hasQuiz":140,"hasPlayground":140},"019fe660-c020-760c-b4c7-46c1465e25bd","css-light-dark-function","You're writing dark-mode colors twice. `light-dark()` fixes that.","Every `@media (prefers-color-scheme: dark)` block duplicates your color definitions. `light-dark()` lets you write both values on the same line, in the same rule, with no separate block and no build step. Baseline 2024.","\u002Fmedia\u002Fcovers\u002Fcss-light-dark-function.png","2026-08-02T08:29:56.698Z",441,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":18,"name":215},[443,444,445,446],{"slug":18,"name":19,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":10,"name":11,"color":7},{"assessments":171},{"slug":433},{"id":450,"slug":451,"title":452,"subtitle":7,"excerpt":453,"coverUrl":454,"locale":136,"readingMinutes":238,"publishedAt":455,"viewCount":456,"likeCount":142,"commentCount":142,"author":457,"vertical":458,"topic":459,"tags":460,"_count":465,"playground":466,"hasQuiz":140,"hasPlayground":140},"019fe660-b8d7-7515-892c-bd576110158c","url-parse-safe-parsing","You've been wrapping `new URL()` in try\u002Fcatch. `URL.parse()` does it natively.","Validating an untrusted URL before parsing it used to mean a try\u002Fcatch wrapper or a regex. `URL.canParse()` checks validity without constructing. `URL.parse()` parses and returns null on failure. Both are Baseline 2024 — no wrapper needed.","\u002Fmedia\u002Fcovers\u002Furl-parse-safe-parsing.png","2026-08-01T08:27:13.710Z",395,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":10,"name":230},[461,462,463,464],{"slug":10,"name":11,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":26,"name":27,"color":7},{"assessments":171},{"slug":451},{"id":468,"slug":469,"title":470,"subtitle":7,"excerpt":471,"coverUrl":472,"locale":136,"readingMinutes":238,"publishedAt":473,"viewCount":474,"likeCount":142,"commentCount":142,"author":475,"vertical":476,"topic":477,"tags":478,"_count":483,"playground":484,"hasQuiz":140,"hasPlayground":140},"019fe660-b09d-731e-b160-9e45270a5652","css-scope-native-style-scoping","CSS has no native scoping. `@scope` changes that.","BEM, CSS Modules, and scoped component styles all exist because CSS leaks — a rule written for one component can silently affect another. `@scope` gives the cascade a lower boundary so styles stay where you put them, natively, with no build step.","\u002Fmedia\u002Fcovers\u002Fcss-scope-native-style-scoping.png","2026-07-31T08:56:20.507Z",378,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":18,"name":215},[479,480,481,482],{"slug":18,"name":19,"color":7},{"slug":5,"name":6,"color":7},{"slug":14,"name":15,"color":7},{"slug":10,"name":11,"color":7},{"assessments":171},{"slug":469},{"page":486,"perPage":36,"total":487,"totalPages":488},7,119,10,{"items":490,"meta":509},[491],{"id":492,"slug":493,"title":494,"subtitle":7,"excerpt":495,"coverUrl":496,"locale":136,"readingMinutes":400,"publishedAt":497,"viewCount":498,"likeCount":142,"commentCount":142,"author":499,"vertical":500,"topic":501,"tags":502,"_count":507,"playground":508,"hasQuiz":140,"hasPlayground":140},"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","2026-09-20T16:27:07.271Z",85,{"id":269,"name":270,"username":271,"avatarUrl":7,"headline":272},{"slug":129,"name":130,"accentFrom":133,"accentTo":134},{"slug":30,"name":31},[503,504,505,506],{"slug":30,"name":31,"color":7},{"slug":10,"name":11,"color":7},{"slug":22,"name":23,"color":7},{"slug":5,"name":6,"color":7},{"assessments":171},{"slug":493},{"page":171,"perPage":171,"total":487,"totalPages":487}]