[{"data":1,"prerenderedAt":1081},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fmeta\u002Fmarkdown-showcase":186,"surround-\u002Fmeta\u002Fmarkdown-showcase":927,"notes-index":932},[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":172,"body":188,"category":161,"createdAt":911,"description":912,"draft":913,"extension":914,"featured":913,"keywords":915,"links":919,"meta":920,"navigation":475,"path":173,"readingTime":317,"seo":921,"stem":174,"tags":922,"updatedAt":911,"__hash__":926},"docs\u002F6.meta\u002F2.markdown-showcase.md",{"type":189,"value":190,"toc":893},"minimark",[191,195,200,236,242,260,272,276,279,285,292,298,304,307,310,451,454,574,579,582,632,636,653,657,664,668,695,699,773,777,792,796,803,839,842,877,881,884,889],[192,193,194],"p",{},"This page exercises every markdown and MDC feature available to notes. Keep it\naround — it doubles as a rendering test after any styling change.",[196,197,199],"h2",{"id":198},"text-formatting","Text formatting",[192,201,202,203,207,208,207,212,207,216,220,221,226,227,231,232,235],{},"Prose supports ",[204,205,206],"strong",{},"bold",", ",[209,210,211],"em",{},"italic",[213,214,215],"del",{},"strikethrough",[217,218,219],"code",{},"inline code",", and\n",[222,223,225],"a",{"href":224},"\u002Fdev\u002Fnuxt\u002Frendering-modes","internal links",". Press ",[228,229],"kbd",{"value":230},"meta"," ",[228,233],{"value":234},"K","\nto search at any time.",[237,238,239],"blockquote",{},[192,240,241],{},"Blockquotes read like a quiet aside — good for definitions or a memorable line.",[243,244,245,249,257],"ul",{},[246,247,248],"li",{},"Unordered lists",[246,250,251,252],{},"With several items\n",[243,253,254],{},[246,255,256],{},"And nested children",[246,258,259],{},"Back to the top level",[261,262,263,266,269],"ol",{},[246,264,265],{},"Ordered steps",[246,267,268],{},"Follow in sequence",[246,270,271],{},"Until done",[196,273,275],{"id":274},"callouts","Callouts",[192,277,278],{},"Four semantic callouts cover the situations worth flagging.",[280,281,282],"note",{},[192,283,284],{},"A neutral aside — extra context that isn't critical.",[286,287,289],"tip",{"icon":288},"i-lucide-zap",[192,290,291],{},"A shortcut or best practice that saves time.",[293,294,295],"warning",{},[192,296,297],{},"Something to watch out for before it bites you.",[299,300,301],"caution",{},[192,302,303],{},"A genuinely destructive or irreversible action.",[196,305,306],{"id":217},"Code",[192,308,309],{},"Fenced blocks get syntax highlighting, an optional filename, line highlights,\nand a copy button — in both light and dark themes.",[311,312,320],"pre",{"className":313,"code":314,"filename":315,"highlights":316,"language":318,"meta":319,"style":319},"language-ts shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","export default defineEventHandler((event) => {\n  const name = getQuery(event).name ?? 'world'\n  return { message: `hello, ${name}` }\n})\n","server\u002Fapi\u002Fhello.ts",[317],2,"ts","",[217,321,322,359,405,443],{"__ignoreMap":319},[323,324,327,331,334,338,342,345,349,352,356],"span",{"class":325,"line":326},"line",1,[323,328,330],{"class":329},"siDh9","export",[323,332,333],{"class":329}," default",[323,335,337],{"class":336},"sljsM"," defineEventHandler",[323,339,341],{"class":340},"snCua","(",[323,343,341],{"class":344},"soVBu",[323,346,348],{"class":347},"sqOPj","event",[323,350,351],{"class":344},")",[323,353,355],{"class":354},"sIOqK"," =>",[323,357,358],{"class":344}," {\n",[323,360,363,367,371,374,377,380,382,384,387,390,394,398,402],{"class":361,"line":317},[325,362],"highlight",[323,364,366],{"class":365},"s5Kfy","  const",[323,368,370],{"class":369},"sSC40"," name",[323,372,373],{"class":344}," =",[323,375,376],{"class":336}," getQuery",[323,378,341],{"class":379},"sLdnO",[323,381,348],{"class":369},[323,383,351],{"class":379},[323,385,386],{"class":344},".",[323,388,389],{"class":369},"name",[323,391,393],{"class":392},"sVsLi"," ??",[323,395,397],{"class":396},"sbYkP"," '",[323,399,401],{"class":400},"sTbE_","world",[323,403,404],{"class":396},"'\n",[323,406,408,411,414,418,421,424,427,431,434,437,440],{"class":325,"line":407},3,[323,409,410],{"class":329},"  return",[323,412,413],{"class":344}," {",[323,415,417],{"class":416},"suXOh"," message",[323,419,420],{"class":344},":",[323,422,423],{"class":396}," `",[323,425,426],{"class":400},"hello, ",[323,428,430],{"class":429},"s8XtY","${",[323,432,389],{"class":433},"su_V2",[323,435,436],{"class":429},"}",[323,438,439],{"class":396},"`",[323,441,442],{"class":344}," }\n",[323,444,446,448],{"class":325,"line":445},4,[323,447,436],{"class":344},[323,449,450],{"class":340},")\n",[192,452,453],{},"A PHP block, to confirm non-default languages highlight:",[311,455,460],{"className":456,"code":457,"filename":458,"language":459,"meta":319,"style":319},"language-php shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","\u003C?php\n\nnamespace App\\Models;\n\nclass User extends Authenticatable\n{\n    protected $fillable = ['name', 'email', 'password'];\n}\n","app\u002FModels\u002FUser.php","php",[217,461,462,471,477,496,500,516,522,568],{"__ignoreMap":319},[323,463,464,467],{"class":325,"line":326},[323,465,466],{"class":392},"\u003C?",[323,468,470],{"class":469},"se3Ec","php\n",[323,472,473],{"class":325,"line":317},[323,474,476],{"emptyLinePlaceholder":475},true,"\n",[323,478,479,483,487,490,493],{"class":325,"line":407},[323,480,482],{"class":481},"scgAs","namespace",[323,484,486],{"class":485},"sD-vU"," App",[323,488,489],{"class":344},"\\",[323,491,492],{"class":485},"Models",[323,494,495],{"class":344},";\n",[323,497,498],{"class":325,"line":445},[323,499,476],{"emptyLinePlaceholder":475},[323,501,503,506,509,512],{"class":325,"line":502},5,[323,504,505],{"class":365},"class",[323,507,508],{"class":485}," User",[323,510,511],{"class":365}," extends",[323,513,515],{"class":514},"sYn-s"," Authenticatable\n",[323,517,519],{"class":325,"line":518},6,[323,520,521],{"class":344},"{\n",[323,523,525,528,531,534,536,539,542,544,546,549,551,554,556,558,560,563,565],{"class":325,"line":524},7,[323,526,527],{"class":365},"    protected",[323,529,530],{"class":344}," $",[323,532,533],{"class":369},"fillable",[323,535,373],{"class":344},[323,537,538],{"class":344}," [",[323,540,541],{"class":396},"'",[323,543,389],{"class":400},[323,545,541],{"class":396},[323,547,548],{"class":344},",",[323,550,397],{"class":396},[323,552,553],{"class":400},"email",[323,555,541],{"class":396},[323,557,548],{"class":344},[323,559,397],{"class":396},[323,561,562],{"class":400},"password",[323,564,541],{"class":396},[323,566,567],{"class":344},"];\n",[323,569,571],{"class":325,"line":570},8,[323,572,573],{"class":344},"}\n",[575,576,578],"h3",{"id":577},"code-groups","Code groups",[192,580,581],{},"Tabbed code for showing the same task across tools:",[583,584,585,603,618],"code-group",{},[311,586,591],{"className":587,"code":588,"filename":589,"language":590,"meta":319,"style":319},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","npm install @nuxt\u002Fcontent\n","npm","bash",[217,592,593],{"__ignoreMap":319},[323,594,595,597,600],{"class":325,"line":326},[323,596,589],{"class":514},[323,598,599],{"class":400}," install",[323,601,602],{"class":400}," @nuxt\u002Fcontent\n",[311,604,607],{"className":587,"code":605,"filename":606,"language":590,"meta":319,"style":319},"pnpm add @nuxt\u002Fcontent\n","pnpm",[217,608,609],{"__ignoreMap":319},[323,610,611,613,616],{"class":325,"line":326},[323,612,606],{"class":514},[323,614,615],{"class":400}," add",[323,617,602],{"class":400},[311,619,622],{"className":587,"code":620,"filename":621,"language":590,"meta":319,"style":319},"bun add @nuxt\u002Fcontent\n","bun",[217,623,624],{"__ignoreMap":319},[323,625,626,628,630],{"class":325,"line":326},[323,627,621],{"class":514},[323,629,615],{"class":400},[323,631,602],{"class":400},[196,633,635],{"id":634},"tabs","Tabs",[634,637,638,646],{},[639,640,643],"tabs-item",{"icon":641,"label":642},"i-lucide-book-open","Overview",[192,644,645],{},"Tabs group related content that the reader only needs one of at a time.",[639,647,650],{"icon":648,"label":649},"i-lucide-list","Details",[192,651,652],{},"The second panel — switching tabs never loses your scroll position.",[196,654,656],{"id":655},"collapsible-sections","Collapsible sections",[658,659,661],"collapsible",{"name":660},"the full explanation",[192,662,663],{},"Hidden by default, this is ideal for long derivations, verbose output, or\nanswers you don't want to spoil immediately.",[196,665,667],{"id":666},"steps","Steps",[666,669,671,675,678,682,688,692],{"level":670},"3",[575,672,674],{"id":673},"install-the-dependency","Install the dependency",[192,676,677],{},"Add the package to your project.",[575,679,681],{"id":680},"configure-the-module","Configure the module",[192,683,684,685,386],{},"Register it in ",[217,686,687],{},"nuxt.config.ts",[575,689,691],{"id":690},"restart-the-dev-server","Restart the dev server",[192,693,694],{},"Changes to modules require a fresh start.",[196,696,698],{"id":697},"tables","Tables",[700,701,702,718],"table",{},[703,704,705],"thead",{},[706,707,708,712,715],"tr",{},[709,710,711],"th",{},"Command",[709,713,714],{},"Description",[709,716,717],{},"Reversible",[719,720,721,735,748,760],"tbody",{},[706,722,723,729,732],{},[724,725,726],"td",{},[217,727,728],{},"git status",[724,730,731],{},"Show the working tree state",[724,733,734],{},"—",[706,736,737,742,745],{},[724,738,739],{},[217,740,741],{},"git add",[724,743,744],{},"Stage changes for commit",[724,746,747],{},"Yes",[706,749,750,755,758],{},[724,751,752],{},[217,753,754],{},"git commit",[724,756,757],{},"Record staged changes",[724,759,747],{},[706,761,762,767,770],{},[724,763,764],{},[217,765,766],{},"git push",[724,768,769],{},"Publish commits to the remote",[724,771,772],{},"Hard",[196,774,776],{"id":775},"badges","Badges",[192,778,779,780,231,785,231,788],{},"Inline status markers: ",[781,782,784],"badge",{"color":783},"success","stable",[781,786,787],{"color":293},"beta",[781,789,791],{"color":790},"error","deprecated",[196,793,795],{"id":794},"diagrams","Diagrams",[192,797,798,799,802],{},"Fenced ",[217,800,801],{},"mermaid"," blocks render as diagrams that follow the current theme.",[311,804,807],{"className":805,"code":806,"language":801,"meta":319,"style":319},"language-mermaid shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","flowchart LR\n  A[Write note] --> B{Has frontmatter?}\n  B -->|Yes| C[Parse + index]\n  B -->|No| D[Skip]\n  C --> E[Prerender static HTML]\n  E --> F[Instant search]\n",[217,808,809,814,819,824,829,834],{"__ignoreMap":319},[323,810,811],{"class":325,"line":326},[323,812,813],{},"flowchart LR\n",[323,815,816],{"class":325,"line":317},[323,817,818],{},"  A[Write note] --> B{Has frontmatter?}\n",[323,820,821],{"class":325,"line":407},[323,822,823],{},"  B -->|Yes| C[Parse + index]\n",[323,825,826],{"class":325,"line":445},[323,827,828],{},"  B -->|No| D[Skip]\n",[323,830,831],{"class":325,"line":502},[323,832,833],{},"  C --> E[Prerender static HTML]\n",[323,835,836],{"class":325,"line":518},[323,837,838],{},"  E --> F[Instant search]\n",[192,840,841],{},"A sequence diagram works too:",[311,843,845],{"className":805,"code":844,"language":801,"meta":319,"style":319},"sequenceDiagram\n  participant R as Reader\n  participant S as Static site\n  R->>S: Request \u002Fdev\u002Fnuxt\u002Frendering-modes\n  S-->>R: Prerendered HTML\n  R->>R: Hydrate + load search index\n",[217,846,847,852,857,862,867,872],{"__ignoreMap":319},[323,848,849],{"class":325,"line":326},[323,850,851],{},"sequenceDiagram\n",[323,853,854],{"class":325,"line":317},[323,855,856],{},"  participant R as Reader\n",[323,858,859],{"class":325,"line":407},[323,860,861],{},"  participant S as Static site\n",[323,863,864],{"class":325,"line":445},[323,865,866],{},"  R->>S: Request \u002Fdev\u002Fnuxt\u002Frendering-modes\n",[323,868,869],{"class":325,"line":502},[323,870,871],{},"  S-->>R: Prerendered HTML\n",[323,873,874],{"class":325,"line":518},[323,875,876],{},"  R->>R: Hydrate + load search index\n",[196,878,880],{"id":879},"video","Video",[192,882,883],{},"Embed a video responsively without writing raw iframe markup:",[885,886],"video-embed",{"src":887,"title":888},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=dQw4w9WgXcQ","Example video",[890,891,892],"style",{},"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 .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 .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .snCua, html code.shiki .snCua{--shiki-light:#90A4AE;--shiki-default:#999999;--shiki-dark:#666666}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 .sIOqK, html code.shiki .sIOqK{--shiki-light:#9C3EDA;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .sLdnO, html code.shiki .sLdnO{--shiki-light:#E53935;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}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 pre.shiki code .suXOh, html code.shiki .suXOh{--shiki-light:#E53935;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .su_V2, html code.shiki .su_V2{--shiki-light:#90A4AE;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .scgAs, html code.shiki .scgAs{--shiki-light:#F76D47;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}",{"title":319,"searchDepth":407,"depth":407,"links":894},[895,896,897,900,901,902,907,908,909,910],{"id":198,"depth":317,"text":199},{"id":274,"depth":317,"text":275},{"id":217,"depth":317,"text":306,"children":898},[899],{"id":577,"depth":407,"text":578},{"id":634,"depth":317,"text":635},{"id":655,"depth":317,"text":656},{"id":666,"depth":317,"text":667,"children":903},[904,905,906],{"id":673,"depth":407,"text":674},{"id":680,"depth":407,"text":681},{"id":690,"depth":407,"text":691},{"id":697,"depth":317,"text":698},{"id":775,"depth":317,"text":776},{"id":794,"depth":317,"text":795},{"id":879,"depth":317,"text":880},"2026-07-17","Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",false,"md",[916,634,583,666,658,917,918],"callout","showcase","formatting",[],{},{"title":172,"description":912},[923,924,925],"markdown","mdc","reference","1sgxTVPRvVhf47NN3TnFfw6o07bwKfaIYr-xR26Bj_M",[928,930],{"title":168,"path":169,"stem":170,"description":929,"children":-1},"The frontmatter and markdown conventions every note in this knowledge base follows.",{"title":176,"path":177,"stem":181,"description":931,"children":-1},"Symptoms, causes and fixes for problems worth remembering.",[933,940,946,949,954,957,964,967,970,977,980,983,990,994,999,1002,1010,1014,1017,1023,1026,1030,1033,1036,1038,1044,1047,1052,1055,1061,1064,1068,1070,1073,1079],{"path":20,"title":19,"description":934,"tags":935,"category":13,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"The core Eloquent relationship types with examples and the N+1 trap to avoid.",[936,937,938,939],"laravel","eloquent","database","orm",{"path":24,"title":23,"description":941,"tags":942,"category":13,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"My quick reference for setting up and using Laravel Homestead during development.",[936,943,944,945],"homestead","vagrant","virtualbox",{"path":14,"title":13,"description":947,"tags":948,"category":13,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"The PHP framework for web artisans — Eloquent, routing, queues and more.",[],{"path":34,"title":33,"description":950,"tags":951,"category":27,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":317,"draft":913},"Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",[590,952,953,943,936],"bashrc","git bash",{"path":28,"title":27,"description":955,"tags":956,"category":27,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Shell scripting and a faster life on the command line.",[],{"path":44,"title":43,"description":958,"tags":959,"category":37,"featured":475,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Practical rules for naming variables, functions and types so code reads like prose.",[960,961,962,963],"clean-code","naming","readability","craft",{"path":38,"title":37,"description":965,"tags":966,"category":37,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Writing code that other people (and future you) can read.",[],{"path":48,"title":47,"description":968,"tags":969,"category":47,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Getting reliable, useful results out of language models.",[],{"path":60,"title":59,"description":971,"tags":972,"category":53,"featured":475,"updatedAt":911,"createdAt":911,"readingTime":317,"draft":913},"The Git commands I actually use day to day, plus how to undo things safely.",[973,974,975,976],"git","cli","version-control","cheat-sheet",{"path":54,"title":53,"description":978,"tags":979,"category":53,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":981,"tags":982,"category":10,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Languages, frameworks and the craft of building software.",[],{"path":83,"title":82,"description":984,"tags":985,"category":63,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":445,"draft":913},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[986,987,988,989],"ai","software development","prompt engineering","beginners",{"path":87,"title":86,"description":991,"tags":992,"category":63,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":445,"draft":913},"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.",[986,993,988,989],"javascript",{"path":91,"title":90,"description":995,"tags":996,"category":63,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":407,"draft":913},"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.",[993,989,997,998],"programming","web development",{"path":77,"title":76,"description":1000,"tags":1001,"category":76,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Session-by-session plans with objectives, timing and materials.",[],{"path":101,"title":100,"description":1003,"tags":1004,"category":94,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":407,"draft":913},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",[1005,1006,993,1007,1008,1009],"teaching","activity","portfolio","dom","loops",{"path":105,"title":104,"description":1011,"tags":1012,"category":94,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":407,"draft":913},"A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",[1005,1006,993,1008,1013,1009],"arrays",{"path":95,"title":94,"description":1015,"tags":1016,"category":94,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"In-class activities that get students doing, not just listening.",[],{"path":115,"title":114,"description":1018,"tags":1019,"category":94,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":317,"draft":913},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[1005,1006,993,1020,1021,1022],"functions","if-statement","debugging",{"path":109,"title":108,"description":1024,"tags":1025,"category":108,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Practice problems that build skill through repetition.",[],{"path":125,"title":124,"description":1027,"tags":1028,"category":118,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":445,"draft":913},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",[986,988,1029],"workflow",{"path":119,"title":118,"description":1031,"tags":1032,"category":118,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Prompt templates for teaching with and about AI.",[],{"path":71,"title":70,"description":1034,"tags":1035,"category":63,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Lesson plans, activities, rubrics and student references.",[],{"path":64,"title":63,"description":1034,"tags":1037,"category":63,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},[],{"path":136,"title":135,"description":1039,"tags":1040,"category":128,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Two tiny functions to control how often a handler runs — with the difference explained.",[993,1041,1042,1043],"performance","snippets","events",{"path":129,"title":128,"description":1045,"tags":1046,"category":128,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Small, copy-ready fragments you reach for again and again.",[],{"path":147,"title":146,"description":1048,"tags":1049,"category":139,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"The essential Vim motions and commands to get productive and get out.",[1050,1051,976,974],"vim","editor",{"path":140,"title":139,"description":1053,"tags":1054,"category":139,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Dense, scannable references for commands and syntax.",[],{"path":158,"title":157,"description":1056,"tags":1057,"category":150,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"A reusable PR description template that makes reviews faster and kinder.",[973,1058,1059,1060],"github","template","collaboration",{"path":151,"title":150,"description":1062,"tags":1063,"category":150,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"Reusable starting points for files, configs and docs.",[],{"path":169,"title":168,"description":929,"tags":1065,"category":161,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":317,"draft":913},[230,1066,923,1067],"conventions","authoring",{"path":173,"title":172,"description":912,"tags":1069,"category":161,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":317,"draft":913},[923,924,925],{"path":162,"title":161,"description":1071,"tags":1072,"category":161,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"How this knowledge base itself is built and maintained.",[],{"path":184,"title":183,"description":1074,"tags":1075,"category":176,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[1076,1077,1078,1022],"cors","http","apis",{"path":177,"title":176,"description":931,"tags":1080,"category":176,"featured":913,"updatedAt":911,"createdAt":911,"readingTime":326,"draft":913},[],1784276796870]