[{"data":1,"prerenderedAt":823},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fsnippets\u002Fdebounce-and-throttle":186,"surround-\u002Fsnippets\u002Fdebounce-and-throttle":668,"notes-index":673},[4,62,127,138,149,160,175],{"title":5,"path":6,"stem":7,"children":8},"Dev","\u002Fdev","1.dev",[9,12,26,36,46,52],{"title":10,"path":6,"stem":11},"Development","1.dev\u002Findex",{"title":13,"path":14,"stem":15,"children":16},"Laravel","\u002Fdev\u002Flaravel","1.dev\u002F1.laravel\u002Findex",[17,18,22],{"title":13,"path":14,"stem":15},{"title":19,"path":20,"stem":21},"Eloquent Relationships","\u002Fdev\u002Flaravel\u002Feloquent-relationships","1.dev\u002F1.laravel\u002F1.eloquent-relationships",{"title":23,"path":24,"stem":25},"Laravel Homestead","\u002Fdev\u002Flaravel\u002Flaravel-homestead","1.dev\u002F1.laravel\u002F2.laravel-homestead",{"title":27,"path":28,"stem":29,"children":30},"Bash","\u002Fdev\u002Fbash","1.dev\u002F13.bash\u002Findex",[31,32],{"title":27,"path":28,"stem":29},{"title":33,"path":34,"stem":35},"My Bash RC","\u002Fdev\u002Fbash\u002Fbash-rc","1.dev\u002F13.bash\u002F2.bash-rc",{"title":37,"path":38,"stem":39,"children":40},"Clean Code","\u002Fdev\u002Fclean-code","1.dev\u002F15.clean-code\u002Findex",[41,42],{"title":37,"path":38,"stem":39},{"title":43,"path":44,"stem":45},"Naming Things","\u002Fdev\u002Fclean-code\u002Fnaming-things","1.dev\u002F15.clean-code\u002F1.naming-things",{"title":47,"path":48,"stem":49,"children":50},"AI Prompting","\u002Fdev\u002Fai-prompting","1.dev\u002F17.ai-prompting\u002Findex",[51],{"title":47,"path":48,"stem":49},{"title":53,"path":54,"stem":55,"children":56},"Git","\u002Fdev\u002Fgit","1.dev\u002F9.git\u002Findex",[57,58],{"title":53,"path":54,"stem":55},{"title":59,"path":60,"stem":61},"Git Cheat Sheet","\u002Fdev\u002Fgit\u002Fgit-cheat-sheet","1.dev\u002F9.git\u002F1.git-cheat-sheet",{"title":63,"path":64,"stem":65,"children":66},"Teaching","\u002Fteaching","2.teaching",[67,69],{"title":63,"path":64,"stem":68},"2.teaching\u002Findex",{"title":70,"path":71,"stem":72,"children":73},"AppsDev","\u002Fteaching\u002Fapps-dev","2.teaching\u002F1.apps-dev\u002Findex",[74,75,93,107,117],{"title":70,"path":71,"stem":72},{"title":76,"path":77,"stem":78,"children":79},"Lesson Plans","\u002Fteaching\u002Fapps-dev\u002Flesson-plans","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002Findex",[80,81,85,89],{"title":76,"path":77,"stem":78},{"title":82,"path":83,"stem":84},"Coding with AI","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fcoding-with-ai","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F1.coding-with-ai",{"title":86,"path":87,"stem":88},"Coding with AI: Prompts & Reading JavaScript","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fprompts-and-reading-js","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F2.prompts-and-reading-js",{"title":90,"path":91,"stem":92},"JavaScript for Beginners","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fjavascript-for-beginners","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F3.javascript-for-beginners",{"title":94,"path":95,"stem":96,"children":97},"Activities","\u002Fteaching\u002Fapps-dev\u002Factivities","2.teaching\u002F1.apps-dev\u002F2.activities\u002Findex",[98,99,103],{"title":94,"path":95,"stem":96},{"title":100,"path":101,"stem":102},"Dynamic Portfolio Website","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fdynamic-portfolio-website","2.teaching\u002F1.apps-dev\u002F2.activities\u002F2.dynamic-portfolio-website",{"title":104,"path":105,"stem":106},"Mini Product Store","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fmini-product-store","2.teaching\u002F1.apps-dev\u002F2.activities\u002F3.mini-product-store",{"title":108,"path":109,"stem":110,"children":111},"Exercises","\u002Fteaching\u002Fapps-dev\u002Fexercises","2.teaching\u002F1.apps-dev\u002F4.exercises\u002Findex",[112,113],{"title":108,"path":109,"stem":110},{"title":114,"path":115,"stem":116},"Read & Predict","\u002Fteaching\u002Fapps-dev\u002Fexercises\u002Fread-and-predict","2.teaching\u002F1.apps-dev\u002F4.exercises\u002F1.read-and-predict",{"title":118,"path":119,"stem":120,"children":121},"AI Prompts","\u002Fteaching\u002Fapps-dev\u002Fai-prompts","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002Findex",[122,123],{"title":118,"path":119,"stem":120},{"title":124,"path":125,"stem":126},"Prompt Flow","\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fbasic-prompting","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F1.basic-prompting",{"title":128,"path":129,"stem":130,"children":131},"Snippets","\u002Fsnippets","3.snippets",[132,134],{"title":128,"path":129,"stem":133},"3.snippets\u002Findex",{"title":135,"path":136,"stem":137},"Debounce and Throttle","\u002Fsnippets\u002Fdebounce-and-throttle","3.snippets\u002F1.debounce-and-throttle",{"title":139,"path":140,"stem":141,"children":142},"Cheat Sheets","\u002Fcheat-sheets","4.cheat-sheets",[143,145],{"title":139,"path":140,"stem":144},"4.cheat-sheets\u002Findex",{"title":146,"path":147,"stem":148},"Vim Cheat Sheet","\u002Fcheat-sheets\u002Fvim-cheat-sheet","4.cheat-sheets\u002F1.vim-cheat-sheet",{"title":150,"path":151,"stem":152,"children":153},"Templates","\u002Ftemplates","5.templates",[154,156],{"title":150,"path":151,"stem":155},"5.templates\u002Findex",{"title":157,"path":158,"stem":159},"Pull Request Template","\u002Ftemplates\u002Fpull-request-template","5.templates\u002F1.pull-request-template",{"title":161,"path":162,"stem":163,"children":164},"Meta","\u002Fmeta","6.meta",[165,167,171],{"title":161,"path":162,"stem":166},"6.meta\u002Findex",{"title":168,"path":169,"stem":170},"Authoring Guide","\u002Fmeta\u002Fauthoring-guide","6.meta\u002F1.authoring-guide",{"title":172,"path":173,"stem":174},"Markdown Showcase","\u002Fmeta\u002Fmarkdown-showcase","6.meta\u002F2.markdown-showcase",{"title":176,"path":177,"stem":178,"children":179},"Troubleshooting","\u002Ftroubleshooting","7.troubleshooting",[180,182],{"title":176,"path":177,"stem":181},"7.troubleshooting\u002Findex",{"title":183,"path":184,"stem":185},"Fixing CORS Errors","\u002Ftroubleshooting\u002Fcors-errors","7.troubleshooting\u002F1.cors-errors",{"id":187,"title":135,"body":188,"category":128,"createdAt":652,"description":653,"draft":654,"extension":655,"featured":654,"keywords":656,"links":659,"meta":660,"navigation":360,"path":136,"readingTime":225,"seo":661,"stem":137,"tags":662,"updatedAt":652,"__hash__":667},"docs\u002F3.snippets\u002F1.debounce-and-throttle.md",{"type":189,"value":190,"toc":648},"minimark",[191,204,208,211,448,451,454,632,644],[192,193,194,195,199,200,203],"p",{},"Both limit how often a function runs. ",[196,197,198],"strong",{},"Debounce"," waits until the activity\nstops; ",[196,201,202],{},"throttle"," runs at a steady maximum rate.",[205,206,198],"h2",{"id":207},"debounce",[192,209,210],{},"Runs once, after things go quiet. Ideal for search-as-you-type or validating a\nfield after the user stops typing.",[212,213,218],"pre",{"className":214,"code":215,"language":216,"meta":217,"style":217},"language-js shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","function debounce(fn, delay = 300) {\n  let timer\n  return (...args) => {\n    clearTimeout(timer)\n    timer = setTimeout(() => fn(...args), delay)\n  }\n}\n\nconst onSearch = debounce(query => fetchResults(query), 300)\ninput.addEventListener('input', e => onSearch(e.target.value))\n","js","",[219,220,221,261,271,292,307,343,349,355,362,398],"code",{"__ignoreMap":217},[222,223,226,230,234,238,242,245,248,251,255,258],"span",{"class":224,"line":225},"line",1,[222,227,229],{"class":228},"s5Kfy","function",[222,231,233],{"class":232},"sljsM"," debounce",[222,235,237],{"class":236},"soVBu","(",[222,239,241],{"class":240},"sqOPj","fn",[222,243,244],{"class":236},",",[222,246,247],{"class":240}," delay",[222,249,250],{"class":236}," =",[222,252,254],{"class":253},"s7CZa"," 300",[222,256,257],{"class":236},")",[222,259,260],{"class":236}," {\n",[222,262,264,267],{"class":224,"line":263},2,[222,265,266],{"class":228},"  let",[222,268,270],{"class":269},"sSC40"," timer\n",[222,272,274,278,281,284,286,290],{"class":224,"line":273},3,[222,275,277],{"class":276},"siDh9","  return",[222,279,280],{"class":236}," (...",[222,282,283],{"class":240},"args",[222,285,257],{"class":236},[222,287,289],{"class":288},"sIOqK"," =>",[222,291,260],{"class":236},[222,293,295,298,301,304],{"class":224,"line":294},4,[222,296,297],{"class":232},"    clearTimeout",[222,299,237],{"class":300},"sLdnO",[222,302,303],{"class":269},"timer",[222,305,306],{"class":300},")\n",[222,308,310,313,315,318,320,323,325,328,330,333,335,337,339,341],{"class":224,"line":309},5,[222,311,312],{"class":269},"    timer",[222,314,250],{"class":236},[222,316,317],{"class":232}," setTimeout",[222,319,237],{"class":300},[222,321,322],{"class":236},"()",[222,324,289],{"class":288},[222,326,327],{"class":232}," fn",[222,329,237],{"class":300},[222,331,332],{"class":236},"...",[222,334,283],{"class":269},[222,336,257],{"class":300},[222,338,244],{"class":236},[222,340,247],{"class":269},[222,342,306],{"class":300},[222,344,346],{"class":224,"line":345},6,[222,347,348],{"class":236},"  }\n",[222,350,352],{"class":224,"line":351},7,[222,353,354],{"class":236},"}\n",[222,356,358],{"class":224,"line":357},8,[222,359,361],{"emptyLinePlaceholder":360},true,"\n",[222,363,365,368,371,373,375,378,381,383,386,388,390,392,394,396],{"class":224,"line":364},9,[222,366,367],{"class":228},"const",[222,369,370],{"class":269}," onSearch",[222,372,250],{"class":236},[222,374,233],{"class":232},[222,376,237],{"class":377},"snCua",[222,379,380],{"class":240},"query",[222,382,289],{"class":288},[222,384,385],{"class":232}," fetchResults",[222,387,237],{"class":377},[222,389,380],{"class":269},[222,391,257],{"class":377},[222,393,244],{"class":236},[222,395,254],{"class":253},[222,397,306],{"class":377},[222,399,401,404,407,410,412,416,419,421,423,426,428,430,432,435,437,440,442,445],{"class":224,"line":400},10,[222,402,403],{"class":269},"input",[222,405,406],{"class":236},".",[222,408,409],{"class":232},"addEventListener",[222,411,237],{"class":377},[222,413,415],{"class":414},"sbYkP","'",[222,417,403],{"class":418},"sTbE_",[222,420,415],{"class":414},[222,422,244],{"class":236},[222,424,425],{"class":240}," e",[222,427,289],{"class":288},[222,429,370],{"class":232},[222,431,237],{"class":377},[222,433,434],{"class":269},"e",[222,436,406],{"class":236},[222,438,439],{"class":269},"target",[222,441,406],{"class":236},[222,443,444],{"class":269},"value",[222,446,447],{"class":377},"))\n",[205,449,450],{"id":202},"Throttle",[192,452,453],{},"Runs at most once per interval. Ideal for scroll and resize handlers that would\notherwise fire hundreds of times a second.",[212,455,457],{"className":214,"code":456,"language":216,"meta":217,"style":217},"function throttle(fn, interval = 200) {\n  let last = 0\n  return (...args) => {\n    const now = Date.now()\n    if (now - last >= interval) {\n      last = now\n      fn(...args)\n    }\n  }\n}\n\nwindow.addEventListener('scroll', throttle(updateProgressBar, 100))\n",[219,458,459,484,496,510,531,556,566,579,584,588,592,597],{"__ignoreMap":217},[222,460,461,463,466,468,470,472,475,477,480,482],{"class":224,"line":225},[222,462,229],{"class":228},[222,464,465],{"class":232}," throttle",[222,467,237],{"class":236},[222,469,241],{"class":240},[222,471,244],{"class":236},[222,473,474],{"class":240}," interval",[222,476,250],{"class":236},[222,478,479],{"class":253}," 200",[222,481,257],{"class":236},[222,483,260],{"class":236},[222,485,486,488,491,493],{"class":224,"line":263},[222,487,266],{"class":228},[222,489,490],{"class":269}," last",[222,492,250],{"class":236},[222,494,495],{"class":253}," 0\n",[222,497,498,500,502,504,506,508],{"class":224,"line":273},[222,499,277],{"class":276},[222,501,280],{"class":236},[222,503,283],{"class":240},[222,505,257],{"class":236},[222,507,289],{"class":288},[222,509,260],{"class":236},[222,511,512,515,518,520,523,525,528],{"class":224,"line":294},[222,513,514],{"class":228},"    const",[222,516,517],{"class":269}," now",[222,519,250],{"class":236},[222,521,522],{"class":269}," Date",[222,524,406],{"class":236},[222,526,527],{"class":232},"now",[222,529,530],{"class":300},"()\n",[222,532,533,536,539,541,545,547,550,552,554],{"class":224,"line":309},[222,534,535],{"class":276},"    if",[222,537,538],{"class":300}," (",[222,540,527],{"class":269},[222,542,544],{"class":543},"sVsLi"," -",[222,546,490],{"class":269},[222,548,549],{"class":236}," >=",[222,551,474],{"class":269},[222,553,257],{"class":300},[222,555,260],{"class":236},[222,557,558,561,563],{"class":224,"line":345},[222,559,560],{"class":269},"      last",[222,562,250],{"class":236},[222,564,565],{"class":269}," now\n",[222,567,568,571,573,575,577],{"class":224,"line":351},[222,569,570],{"class":232},"      fn",[222,572,237],{"class":300},[222,574,332],{"class":236},[222,576,283],{"class":269},[222,578,306],{"class":300},[222,580,581],{"class":224,"line":357},[222,582,583],{"class":236},"    }\n",[222,585,586],{"class":224,"line":364},[222,587,348],{"class":236},[222,589,590],{"class":224,"line":400},[222,591,354],{"class":236},[222,593,595],{"class":224,"line":594},11,[222,596,361],{"emptyLinePlaceholder":360},[222,598,600,603,605,607,609,611,614,616,618,620,622,625,627,630],{"class":224,"line":599},12,[222,601,602],{"class":269},"window",[222,604,406],{"class":236},[222,606,409],{"class":232},[222,608,237],{"class":377},[222,610,415],{"class":414},[222,612,613],{"class":418},"scroll",[222,615,415],{"class":414},[222,617,244],{"class":236},[222,619,465],{"class":232},[222,621,237],{"class":377},[222,623,624],{"class":269},"updateProgressBar",[222,626,244],{"class":236},[222,628,629],{"class":253}," 100",[222,631,447],{"class":377},[633,634,635],"tip",{},[192,636,637,638,640,641,643],{},"Rule of thumb: ",[196,639,207],{}," when you only care about the final state (the last\nkeystroke), ",[196,642,202],{}," when you want regular updates during a continuous action\n(scrolling).",[645,646,647],"style",{},"html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sIOqK, html code.shiki .sIOqK{--shiki-light:#9C3EDA;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sLdnO, html code.shiki .sLdnO{--shiki-light:#E53935;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .snCua, html code.shiki .snCua{--shiki-light:#90A4AE;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}",{"title":217,"searchDepth":273,"depth":273,"links":649},[650,651],{"id":207,"depth":263,"text":198},{"id":202,"depth":263,"text":450},"2026-07-17","Two tiny functions to control how often a handler runs — with the difference explained.",false,"md",[207,202,657,613,658,403],"rate limiting","resize",[],{},{"title":135,"description":653},[663,664,665,666],"javascript","performance","snippets","events","HtvZSBBXmKfidUZMNQ6O1JD5ax0AHuOay8yQDSlraE8",[669,671],{"title":128,"path":129,"stem":133,"description":670,"children":-1},"Small, copy-ready fragments you reach for again and again.",{"title":139,"path":140,"stem":144,"description":672,"children":-1},"Dense, scannable references for commands and syntax.",[674,681,687,690,696,699,706,709,712,719,722,725,732,735,740,743,751,755,758,764,767,771,774,777,779,781,783,788,790,796,799,806,811,814,820],{"path":20,"title":19,"description":675,"tags":676,"category":13,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"The core Eloquent relationship types with examples and the N+1 trap to avoid.",[677,678,679,680],"laravel","eloquent","database","orm",{"path":24,"title":23,"description":682,"tags":683,"category":13,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"My quick reference for setting up and using Laravel Homestead during development.",[677,684,685,686],"homestead","vagrant","virtualbox",{"path":14,"title":13,"description":688,"tags":689,"category":13,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"The PHP framework for web artisans — Eloquent, routing, queues and more.",[],{"path":34,"title":33,"description":691,"tags":692,"category":27,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":263,"draft":654},"Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",[693,694,695,684,677],"bash","bashrc","git bash",{"path":28,"title":27,"description":697,"tags":698,"category":27,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Shell scripting and a faster life on the command line.",[],{"path":44,"title":43,"description":700,"tags":701,"category":37,"featured":360,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Practical rules for naming variables, functions and types so code reads like prose.",[702,703,704,705],"clean-code","naming","readability","craft",{"path":38,"title":37,"description":707,"tags":708,"category":37,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Writing code that other people (and future you) can read.",[],{"path":48,"title":47,"description":710,"tags":711,"category":47,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Getting reliable, useful results out of language models.",[],{"path":60,"title":59,"description":713,"tags":714,"category":53,"featured":360,"updatedAt":652,"createdAt":652,"readingTime":263,"draft":654},"The Git commands I actually use day to day, plus how to undo things safely.",[715,716,717,718],"git","cli","version-control","cheat-sheet",{"path":54,"title":53,"description":720,"tags":721,"category":53,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":723,"tags":724,"category":10,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Languages, frameworks and the craft of building software.",[],{"path":83,"title":82,"description":726,"tags":727,"category":63,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":294,"draft":654},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[728,729,730,731],"ai","software development","prompt engineering","beginners",{"path":87,"title":86,"description":733,"tags":734,"category":63,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":294,"draft":654},"Learn how to write effective AI prompts and read JavaScript code confidently. This lesson teaches students how to direct AI instead of blindly copying its output.",[728,663,730,731],{"path":91,"title":90,"description":736,"tags":737,"category":63,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":273,"draft":654},"Introduction to the fundamentals of JavaScript, from variables and functions to loops, DOM manipulation, and events. This lesson prepares students for the Mini Product Store activity.",[663,731,738,739],"programming","web development",{"path":77,"title":76,"description":741,"tags":742,"category":76,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Session-by-session plans with objectives, timing and materials.",[],{"path":101,"title":100,"description":744,"tags":745,"category":94,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":273,"draft":654},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",[746,747,663,748,749,750],"teaching","activity","portfolio","dom","loops",{"path":105,"title":104,"description":752,"tags":753,"category":94,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":273,"draft":654},"A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",[746,747,663,749,754,750],"arrays",{"path":95,"title":94,"description":756,"tags":757,"category":94,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"In-class activities that get students doing, not just listening.",[],{"path":115,"title":114,"description":759,"tags":760,"category":94,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":263,"draft":654},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[746,747,663,761,762,763],"functions","if-statement","debugging",{"path":109,"title":108,"description":765,"tags":766,"category":108,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Practice problems that build skill through repetition.",[],{"path":125,"title":124,"description":768,"tags":769,"category":118,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":294,"draft":654},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",[728,730,770],"workflow",{"path":119,"title":118,"description":772,"tags":773,"category":118,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Prompt templates for teaching with and about AI.",[],{"path":71,"title":70,"description":775,"tags":776,"category":63,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Lesson plans, activities, rubrics and student references.",[],{"path":64,"title":63,"description":775,"tags":778,"category":63,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},[],{"path":136,"title":135,"description":653,"tags":780,"category":128,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},[663,664,665,666],{"path":129,"title":128,"description":670,"tags":782,"category":128,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},[],{"path":147,"title":146,"description":784,"tags":785,"category":139,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"The essential Vim motions and commands to get productive and get out.",[786,787,718,716],"vim","editor",{"path":140,"title":139,"description":672,"tags":789,"category":139,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},[],{"path":158,"title":157,"description":791,"tags":792,"category":150,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"A reusable PR description template that makes reviews faster and kinder.",[715,793,794,795],"github","template","collaboration",{"path":151,"title":150,"description":797,"tags":798,"category":150,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Reusable starting points for files, configs and docs.",[],{"path":169,"title":168,"description":800,"tags":801,"category":161,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":263,"draft":654},"The frontmatter and markdown conventions every note in this knowledge base follows.",[802,803,804,805],"meta","conventions","markdown","authoring",{"path":173,"title":172,"description":807,"tags":808,"category":161,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":263,"draft":654},"Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",[804,809,810],"mdc","reference",{"path":162,"title":161,"description":812,"tags":813,"category":161,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"How this knowledge base itself is built and maintained.",[],{"path":184,"title":183,"description":815,"tags":816,"category":176,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[817,818,819,763],"cors","http","apis",{"path":177,"title":176,"description":821,"tags":822,"category":176,"featured":654,"updatedAt":652,"createdAt":652,"readingTime":225,"draft":654},"Symptoms, causes and fixes for problems worth remembering.",[],1784276795029]