[{"data":1,"prerenderedAt":921},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fmini-product-store":186,"surround-\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fmini-product-store":766,"notes-index":771},[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":104,"body":188,"category":94,"createdAt":744,"description":745,"draft":746,"extension":747,"featured":746,"keywords":748,"links":754,"meta":755,"navigation":756,"path":105,"readingTime":727,"seo":757,"stem":106,"tags":758,"updatedAt":744,"__hash__":765},"docs\u002F2.teaching\u002F1.apps-dev\u002F2.activities\u002F3.mini-product-store.md",{"type":189,"value":190,"toc":725},"minimark",[191,195,200,203,266,270,283,287,347,351,445,449,452,504,508,511,536,546,550,553,575,579,599,603,690,695,699,702,720],[192,193,194],"p",{},"Build a simple product store entirely with JavaScript. The goal is not to create\na beautiful website, but to practice thinking in data instead of copy-pasting\nHTML.",[196,197,199],"h2",{"id":198},"learning-objectives","Learning Objectives",[192,201,202],{},"By the end of this activity, students should be able to:",[204,205,206,215,222,232,240,246,252],"ul",{},[207,208,209,210,214],"li",{},"Store products in an ",[211,212,213],"strong",{},"array of objects",".",[207,216,217,218,221],{},"Create ",[211,219,220],{},"reusable functions"," that work for any product.",[207,223,224,225,214],{},"Generate HTML using a ",[211,226,227,231],{},[228,229,230],"code",{},"for"," loop",[207,233,234,235,214],{},"Display cart items using ",[211,236,237],{},[228,238,239],{},"forEach()",[207,241,242,243,214],{},"Update the page using ",[211,244,245],{},"DOM manipulation",[207,247,248,249,214],{},"Respond to user actions with ",[211,250,251],{},"event listeners",[207,253,254,255,258,259,265],{},"Use ",[211,256,257],{},"template literals"," and ",[211,260,261,264],{},[228,262,263],{},"if"," statements"," to build dynamic interfaces.",[196,267,269],{"id":268},"the-big-idea","The Big Idea",[271,272,273,276],"note",{},[192,274,275],{},"Think like a programmer, not a copy-paster.",[192,277,278,279,282],{},"Do ",[211,280,281],{},"not"," hardcode products directly into HTML or create one function for every\nproduct. Store your data in JavaScript and let loops and reusable functions do\nthe work.",[196,284,286],{"id":285},"project-files","Project Files",[288,289,290,303],"table",{},[291,292,293],"thead",{},[294,295,296,300],"tr",{},[297,298,299],"th",{},"File",[297,301,302],{},"Purpose",[304,305,306,317,327,337],"tbody",{},[294,307,308,314],{},[309,310,311],"td",{},[228,312,313],{},"index.html",[309,315,316],{},"Minimal HTML structure with empty containers.",[294,318,319,324],{},[309,320,321],{},[228,322,323],{},"style.css",[309,325,326],{},"Basic styling. No changes required.",[294,328,329,334],{},[309,330,331],{},[228,332,333],{},"script.js",[309,335,336],{},"Your working file containing the TODOs.",[294,338,339,344],{},[309,340,341],{},[228,342,343],{},"SOLUTION.js",[309,345,346],{},"Reference solution. Check only after attempting the activity yourself.",[196,348,350],{"id":349},"activity-flow","Activity Flow",[352,353,355,360,369,373,376,417,420,424,427],"steps",{"level":354},"3",[356,357,359],"h3",{"id":358},"open-the-project","Open the Project",[192,361,362,363,365,366,368],{},"Open ",[228,364,313],{}," in your browser and ",[228,367,333],{}," in your code editor.",[356,370,372],{"id":371},"complete-the-todos","Complete the TODOs",[192,374,375],{},"Finish each task in order.",[377,378,379,386,396,402],"ol",{},[207,380,381,382,385],{},"Build ",[228,383,384],{},"createCard(product)"," using a template literal and attach an event listener.",[207,387,381,388,391,392,214],{},[228,389,390],{},"renderProducts()"," using a ",[211,393,394,231],{},[228,395,230],{},[207,397,381,398,401],{},[228,399,400],{},"addToCart(product)"," by adding products into the cart array.",[207,403,381,404,407,408,258,413,214],{},[228,405,406],{},"renderCart()"," using an ",[211,409,410,412],{},[228,411,263],{}," statement",[211,414,415],{},[228,416,239],{},[192,418,419],{},"Save your work and refresh the browser after each step.",[356,421,423],{"id":422},"test-your-application","Test Your Application",[192,425,426],{},"Verify that:",[204,428,429,432,439,442],{},[207,430,431],{},"Products appear automatically from the JavaScript array.",[207,433,434,435,438],{},"Clicking ",[211,436,437],{},"Add to cart"," updates the cart.",[207,440,441],{},"The total updates correctly.",[207,443,444],{},"An empty cart displays an appropriate message.",[196,446,448],{"id":447},"requirements","Requirements",[192,450,451],{},"Students must demonstrate all of the following:",[204,453,454,462,465,468,473,477,479,484,487,491,494],{},[207,455,456,258,459],{},[228,457,458],{},"let",[228,460,461],{},"const",[207,463,464],{},"An array of product objects",[207,466,467],{},"At least three reusable functions",[207,469,470,471,231],{},"At least one ",[228,472,230],{},[207,474,470,475],{},[228,476,239],{},[207,478,245],{},[207,480,470,481],{},[228,482,483],{},"addEventListener",[207,485,486],{},"At least one template literal",[207,488,470,489,412],{},[228,490,263],{},[207,492,493],{},"No hardcoded product HTML",[207,495,496,497,500,501],{},"No per-product functions such as ",[228,498,499],{},"addApple()"," or ",[228,502,503],{},"addBanana()",[196,505,507],{"id":506},"expected-output","Expected Output",[192,509,510],{},"When completed, the application should:",[204,512,513,520,523,526,533],{},[207,514,515,516,519],{},"Display one product card for every object inside the ",[228,517,518],{},"products"," array.",[207,521,522],{},"Allow users to add products to the cart.",[207,524,525],{},"Automatically update the total price.",[207,527,528,529,532],{},"Display ",[211,530,531],{},"\"Your cart is empty.\""," before any products are added.",[207,534,535],{},"Correctly add duplicate products if the same button is clicked multiple times.",[537,538,539],"tip",{},[192,540,541,542,545],{},"Open the browser Developer Tools (",[228,543,544],{},"F12",") while working. Read every error\nmessage carefully before asking for help. Most bugs tell you exactly where they\nare hiding. Computers are surprisingly honest compared to humans.",[196,547,549],{"id":548},"stretch-goals","Stretch Goals",[192,551,552],{},"Students who finish early may:",[377,554,555,562,569],{},[207,556,557,558,561],{},"Add a ",[228,559,560],{},"quantity"," property to each product.",[207,563,564,565,568],{},"Display a ",[211,566,567],{},"Free Shipping"," message when the total exceeds ₱100.",[207,570,557,571,574],{},[211,572,573],{},"Clear Cart"," button with its own event listener.",[196,576,578],{"id":577},"submission","Submission",[204,580,581,593,596],{},[207,582,583,584,258,587,590,591,214],{},"Add your ",[211,585,586],{},"full name",[211,588,589],{},"section"," at the top of ",[228,592,333],{},[207,594,595],{},"Submit the required files according to your instructor's instructions.",[207,597,598],{},"Be prepared to explain every line of your code.",[196,600,602],{"id":601},"grading-rubric","Grading Rubric",[288,604,605,616],{},[291,606,607],{},[294,608,609,612],{},[297,610,611],{},"Category",[297,613,615],{"align":614},"right","Points",[304,617,618,626,634,648,655,663,670,678],{},[294,619,620,623],{},[309,621,622],{},"JavaScript Logic",[309,624,625],{"align":614},"25",[294,627,628,631],{},[309,629,630],{},"Reusable Functions",[309,632,633],{"align":614},"20",[294,635,636,645],{},[309,637,638,639,258,641,644],{},"Loops (",[228,640,230],{},[228,642,643],{},"forEach",")",[309,646,647],{"align":614},"15",[294,649,650,653],{},[309,651,652],{},"DOM Manipulation",[309,654,647],{"align":614},[294,656,657,660],{},[309,658,659],{},"Code Organization",[309,661,662],{"align":614},"10",[294,664,665,668],{},[309,666,667],{},"Readability",[309,669,662],{"align":614},[294,671,672,675],{},[309,673,674],{},"Following Instructions",[309,676,677],{"align":614},"5",[294,679,680,685],{},[309,681,682],{},[211,683,684],{},"Total",[309,686,687],{"align":614},[211,688,689],{},"100",[271,691,692],{},[192,693,694],{},"You may use AI as a learning assistant, but you must understand every line you\nsubmit. If you cannot explain what your code does, it is not yet your code.\nThe objective of this activity is to develop problem-solving skills, not to\nproduce the fastest solution.",[196,696,698],{"id":697},"resources","Resources",[192,700,701],{},"The starter project for this activity is available on GitHub.",[204,703,704],{},[207,705,706,709,710],{},[211,707,708],{},"Activity Template:"," ",[711,712,714],"content-reference",{"index":713},"0",[715,716,717],"a",{"href":717,"rel":718},"https:\u002F\u002Fgithub.com\u002Fjpynzon\u002Fjs-product-store-activity",[719],"nofollow",[192,721,722,723,214],{},"Clone or download the repository before starting the activity. The project already contains the HTML structure, CSS styling, and JavaScript TODOs. Your task is to complete the missing JavaScript logic inside ",[228,724,333],{},{"title":726,"searchDepth":727,"depth":727,"links":728},"",3,[729,731,732,733,738,739,740,741,742,743],{"id":198,"depth":730,"text":199},2,{"id":268,"depth":730,"text":269},{"id":285,"depth":730,"text":286},{"id":349,"depth":730,"text":350,"children":734},[735,736,737],{"id":358,"depth":727,"text":359},{"id":371,"depth":727,"text":372},{"id":422,"depth":727,"text":423},{"id":447,"depth":730,"text":448},{"id":506,"depth":730,"text":507},{"id":548,"depth":730,"text":549},{"id":577,"depth":730,"text":578},{"id":601,"depth":730,"text":602},{"id":697,"depth":730,"text":698},"2026-07-17","A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",false,"md",[749,750,751,213,752,753],"javascript activity","mini store","dom manipulation","for loop","foreach",[],{},true,{"title":104,"description":745},[759,760,761,762,763,764],"teaching","activity","javascript","dom","arrays","loops","FkA2dLJ8UeqK_JC9nXBxkqvSlJ--Sb3ASPeNWgraxPc",[767,769],{"title":100,"path":101,"stem":102,"description":768,"children":-1},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",{"title":108,"path":109,"stem":110,"description":770,"children":-1},"Practice problems that build skill through repetition.",[772,780,786,789,795,798,805,808,811,818,821,824,832,835,840,843,846,848,851,857,859,863,866,869,871,877,880,885,888,894,897,904,909,912,918],{"path":20,"title":19,"description":773,"tags":774,"category":13,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"The core Eloquent relationship types with examples and the N+1 trap to avoid.",[775,776,777,778],"laravel","eloquent","database","orm",1,{"path":24,"title":23,"description":781,"tags":782,"category":13,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"My quick reference for setting up and using Laravel Homestead during development.",[775,783,784,785],"homestead","vagrant","virtualbox",{"path":14,"title":13,"description":787,"tags":788,"category":13,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"The PHP framework for web artisans — Eloquent, routing, queues and more.",[],{"path":34,"title":33,"description":790,"tags":791,"category":27,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":730,"draft":746},"Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",[792,793,794,783,775],"bash","bashrc","git bash",{"path":28,"title":27,"description":796,"tags":797,"category":27,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Shell scripting and a faster life on the command line.",[],{"path":44,"title":43,"description":799,"tags":800,"category":37,"featured":756,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Practical rules for naming variables, functions and types so code reads like prose.",[801,802,803,804],"clean-code","naming","readability","craft",{"path":38,"title":37,"description":806,"tags":807,"category":37,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Writing code that other people (and future you) can read.",[],{"path":48,"title":47,"description":809,"tags":810,"category":47,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Getting reliable, useful results out of language models.",[],{"path":60,"title":59,"description":812,"tags":813,"category":53,"featured":756,"updatedAt":744,"createdAt":744,"readingTime":730,"draft":746},"The Git commands I actually use day to day, plus how to undo things safely.",[814,815,816,817],"git","cli","version-control","cheat-sheet",{"path":54,"title":53,"description":819,"tags":820,"category":53,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":822,"tags":823,"category":10,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Languages, frameworks and the craft of building software.",[],{"path":83,"title":82,"description":825,"tags":826,"category":63,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":831,"draft":746},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[827,828,829,830],"ai","software development","prompt engineering","beginners",4,{"path":87,"title":86,"description":833,"tags":834,"category":63,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":831,"draft":746},"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.",[827,761,829,830],{"path":91,"title":90,"description":836,"tags":837,"category":63,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":727,"draft":746},"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.",[761,830,838,839],"programming","web development",{"path":77,"title":76,"description":841,"tags":842,"category":76,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Session-by-session plans with objectives, timing and materials.",[],{"path":101,"title":100,"description":768,"tags":844,"category":94,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":727,"draft":746},[759,760,761,845,762,764],"portfolio",{"path":105,"title":104,"description":745,"tags":847,"category":94,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":727,"draft":746},[759,760,761,762,763,764],{"path":95,"title":94,"description":849,"tags":850,"category":94,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"In-class activities that get students doing, not just listening.",[],{"path":115,"title":114,"description":852,"tags":853,"category":94,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":730,"draft":746},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[759,760,761,854,855,856],"functions","if-statement","debugging",{"path":109,"title":108,"description":770,"tags":858,"category":108,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},[],{"path":125,"title":124,"description":860,"tags":861,"category":118,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":831,"draft":746},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",[827,829,862],"workflow",{"path":119,"title":118,"description":864,"tags":865,"category":118,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Prompt templates for teaching with and about AI.",[],{"path":71,"title":70,"description":867,"tags":868,"category":63,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Lesson plans, activities, rubrics and student references.",[],{"path":64,"title":63,"description":867,"tags":870,"category":63,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},[],{"path":136,"title":135,"description":872,"tags":873,"category":128,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Two tiny functions to control how often a handler runs — with the difference explained.",[761,874,875,876],"performance","snippets","events",{"path":129,"title":128,"description":878,"tags":879,"category":128,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Small, copy-ready fragments you reach for again and again.",[],{"path":147,"title":146,"description":881,"tags":882,"category":139,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"The essential Vim motions and commands to get productive and get out.",[883,884,817,815],"vim","editor",{"path":140,"title":139,"description":886,"tags":887,"category":139,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Dense, scannable references for commands and syntax.",[],{"path":158,"title":157,"description":889,"tags":890,"category":150,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"A reusable PR description template that makes reviews faster and kinder.",[814,891,892,893],"github","template","collaboration",{"path":151,"title":150,"description":895,"tags":896,"category":150,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Reusable starting points for files, configs and docs.",[],{"path":169,"title":168,"description":898,"tags":899,"category":161,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":730,"draft":746},"The frontmatter and markdown conventions every note in this knowledge base follows.",[900,901,902,903],"meta","conventions","markdown","authoring",{"path":173,"title":172,"description":905,"tags":906,"category":161,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":730,"draft":746},"Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",[902,907,908],"mdc","reference",{"path":162,"title":161,"description":910,"tags":911,"category":161,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"How this knowledge base itself is built and maintained.",[],{"path":184,"title":183,"description":913,"tags":914,"category":176,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[915,916,917,856],"cors","http","apis",{"path":177,"title":176,"description":919,"tags":920,"category":176,"featured":746,"updatedAt":744,"createdAt":744,"readingTime":779,"draft":746},"Symptoms, causes and fixes for problems worth remembering.",[],1784276794990]