coding-friend-cli 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +15 -0
  2. package/dist/{chunk-KZT4AFDW.js → chunk-5HZJX47M.js} +1 -1
  3. package/dist/{chunk-AQXTNLQD.js → chunk-6OI37OZX.js} +9 -1
  4. package/dist/chunk-R6ZYK4UX.js +128 -0
  5. package/dist/dev-LZASFXZZ.js +243 -0
  6. package/dist/{host-JBTJCWM2.js → host-BK6DYFWF.js} +2 -2
  7. package/dist/index.js +27 -6
  8. package/dist/{init-E6CL3UZQ.js → init-2UKYE2KV.js} +2 -2
  9. package/dist/{mcp-MWESK6UX.js → mcp-CH4SKZSX.js} +2 -2
  10. package/dist/postinstall.js +1 -1
  11. package/dist/{statusline-7D6YU5YM.js → statusline-ARI7I5YM.js} +1 -1
  12. package/dist/{update-IH3G4SN5.js → update-5A2OP6EY.js} +58 -37
  13. package/lib/learn-host/.prettierignore +3 -0
  14. package/lib/learn-host/.prettierrc +8 -0
  15. package/lib/learn-host/CHANGELOG.md +9 -0
  16. package/lib/learn-host/eslint.config.mjs +6 -0
  17. package/lib/learn-host/next-env.d.ts +1 -1
  18. package/lib/learn-host/next.config.ts +1 -0
  19. package/lib/learn-host/package-lock.json +6039 -391
  20. package/lib/learn-host/package.json +30 -15
  21. package/lib/learn-host/public/_pagefind/fragment/en_1172b3c.pf_fragment +0 -0
  22. package/lib/learn-host/public/_pagefind/fragment/en_118ad1c.pf_fragment +0 -0
  23. package/lib/learn-host/public/_pagefind/fragment/en_32ab3d8.pf_fragment +0 -0
  24. package/lib/learn-host/public/_pagefind/fragment/en_441f1e1.pf_fragment +0 -0
  25. package/lib/learn-host/public/_pagefind/fragment/en_4452de4.pf_fragment +0 -0
  26. package/lib/learn-host/public/_pagefind/fragment/en_4ae396d.pf_fragment +0 -0
  27. package/lib/learn-host/public/_pagefind/fragment/en_58ee89d.pf_fragment +0 -0
  28. package/lib/learn-host/public/_pagefind/fragment/en_6dd2225.pf_fragment +0 -0
  29. package/lib/learn-host/public/_pagefind/fragment/en_765a297.pf_fragment +0 -0
  30. package/lib/learn-host/public/_pagefind/fragment/en_7a4cc4a.pf_fragment +0 -0
  31. package/lib/learn-host/public/_pagefind/fragment/en_8050261.pf_fragment +0 -0
  32. package/lib/learn-host/public/_pagefind/fragment/en_83eaedf.pf_fragment +0 -0
  33. package/lib/learn-host/public/_pagefind/fragment/en_925bc5f.pf_fragment +0 -0
  34. package/lib/learn-host/public/_pagefind/fragment/en_95f3dd5.pf_fragment +0 -0
  35. package/lib/learn-host/public/_pagefind/fragment/en_96d7a02.pf_fragment +0 -0
  36. package/lib/learn-host/public/_pagefind/fragment/en_971f951.pf_fragment +0 -0
  37. package/lib/learn-host/public/_pagefind/fragment/en_a446c32.pf_fragment +0 -0
  38. package/lib/learn-host/public/_pagefind/fragment/en_a5ee367.pf_fragment +0 -0
  39. package/lib/learn-host/public/_pagefind/fragment/en_b11c248.pf_fragment +0 -0
  40. package/lib/learn-host/public/_pagefind/fragment/en_b13c52e.pf_fragment +0 -0
  41. package/lib/learn-host/public/_pagefind/fragment/en_b5bd69b.pf_fragment +0 -0
  42. package/lib/learn-host/public/_pagefind/fragment/en_b625d7d.pf_fragment +0 -0
  43. package/lib/learn-host/public/_pagefind/fragment/en_bf63915.pf_fragment +0 -0
  44. package/lib/learn-host/public/_pagefind/fragment/en_c52b25b.pf_fragment +0 -0
  45. package/lib/learn-host/public/_pagefind/fragment/en_c9db556.pf_fragment +0 -0
  46. package/lib/learn-host/public/_pagefind/fragment/en_d1537ee.pf_fragment +0 -0
  47. package/lib/learn-host/public/_pagefind/fragment/en_d2e6412.pf_fragment +0 -0
  48. package/lib/learn-host/public/_pagefind/fragment/en_d2f47a4.pf_fragment +0 -0
  49. package/lib/learn-host/public/_pagefind/fragment/en_d361292.pf_fragment +0 -0
  50. package/lib/learn-host/public/_pagefind/fragment/en_d727ec8.pf_fragment +0 -0
  51. package/lib/learn-host/public/_pagefind/fragment/en_e11cd8f.pf_fragment +0 -0
  52. package/lib/learn-host/public/_pagefind/fragment/en_e481f19.pf_fragment +0 -0
  53. package/lib/learn-host/public/_pagefind/fragment/en_eee2805.pf_fragment +0 -0
  54. package/lib/learn-host/public/_pagefind/fragment/en_f4de6c4.pf_fragment +0 -0
  55. package/lib/learn-host/public/_pagefind/index/en_1ecb9d5.pf_index +0 -0
  56. package/lib/learn-host/public/_pagefind/index/en_37e362b.pf_index +0 -0
  57. package/lib/learn-host/public/_pagefind/index/en_538eee7.pf_index +0 -0
  58. package/lib/learn-host/public/_pagefind/index/en_5751dc8.pf_index +0 -0
  59. package/lib/learn-host/public/_pagefind/index/en_67f794d.pf_index +0 -0
  60. package/lib/learn-host/public/_pagefind/index/en_7458f81.pf_index +0 -0
  61. package/lib/learn-host/public/_pagefind/index/en_e21f7e1.pf_index +0 -0
  62. package/lib/learn-host/public/_pagefind/pagefind-entry.json +1 -0
  63. package/lib/learn-host/public/_pagefind/pagefind-highlight.js +1064 -0
  64. package/lib/learn-host/public/_pagefind/pagefind-modular-ui.css +214 -0
  65. package/lib/learn-host/public/_pagefind/pagefind-modular-ui.js +8 -0
  66. package/lib/learn-host/public/_pagefind/pagefind-ui.css +1 -0
  67. package/lib/learn-host/public/_pagefind/pagefind-ui.js +2 -0
  68. package/lib/learn-host/public/_pagefind/pagefind.en_104569cceb.pf_meta +0 -0
  69. package/lib/learn-host/public/_pagefind/pagefind.en_1075df6f16.pf_meta +0 -0
  70. package/lib/learn-host/public/_pagefind/pagefind.en_139f35f6e5.pf_meta +0 -0
  71. package/lib/learn-host/public/_pagefind/pagefind.en_46bfc9f7e1.pf_meta +0 -0
  72. package/lib/learn-host/public/_pagefind/pagefind.en_76b8937bbc.pf_meta +0 -0
  73. package/lib/learn-host/public/_pagefind/pagefind.en_83cbfb0fd5.pf_meta +0 -0
  74. package/lib/learn-host/public/_pagefind/pagefind.en_b1d168d536.pf_meta +0 -0
  75. package/lib/learn-host/public/_pagefind/pagefind.js +6 -0
  76. package/lib/learn-host/public/_pagefind/wasm.en.pagefind +0 -0
  77. package/lib/learn-host/public/_pagefind/wasm.unknown.pagefind +0 -0
  78. package/lib/learn-host/public/logo.svg +1 -0
  79. package/lib/learn-host/src/app/[category]/[slug]/page.tsx +36 -32
  80. package/lib/learn-host/src/app/[category]/page.tsx +2 -3
  81. package/lib/learn-host/src/app/apple-icon.svg +1 -0
  82. package/lib/learn-host/src/app/globals.css +74 -14
  83. package/lib/learn-host/src/app/icon.svg +1 -0
  84. package/lib/learn-host/src/app/layout.tsx +29 -9
  85. package/lib/learn-host/src/app/page.tsx +9 -11
  86. package/lib/learn-host/src/components/Breadcrumbs.tsx +12 -4
  87. package/lib/learn-host/src/components/DocCard.tsx +28 -10
  88. package/lib/learn-host/src/components/MarkdownRenderer.tsx +6 -2
  89. package/lib/learn-host/src/components/MobileNav.tsx +43 -35
  90. package/lib/learn-host/src/components/PagefindSearch.tsx +177 -54
  91. package/lib/learn-host/src/components/Sidebar.tsx +27 -29
  92. package/lib/learn-host/src/components/TableOfContents.tsx +62 -0
  93. package/lib/learn-host/src/components/TagBadge.tsx +1 -1
  94. package/lib/learn-host/src/components/ThemeToggle.tsx +36 -9
  95. package/lib/learn-host/src/components/layout/Footer.tsx +41 -0
  96. package/lib/learn-host/src/components/layout/Header.tsx +117 -0
  97. package/lib/learn-host/src/lib/docs.ts +98 -8
  98. package/lib/learn-host/src/lib/types.ts +7 -1
  99. package/lib/learn-host/tsconfig.json +8 -2
  100. package/lib/learn-host/tsconfig.tsbuildinfo +1 -0
  101. package/lib/learn-mcp/CHANGELOG.md +7 -0
  102. package/lib/learn-mcp/package.json +1 -1
  103. package/package.json +13 -5
  104. package/dist/chunk-VHZQ6KEU.js +0 -73
  105. package/lib/learn-host/src/app/search/page.tsx +0 -19
  106. package/lib/learn-host/src/components/SearchBar.tsx +0 -36
@@ -0,0 +1,6 @@
1
+ const pagefind_version="1.4.0";let wasm_bindgen;(function(){const __exports={};let script_src;if(typeof document!=='undefined'&&document.currentScript!==null){script_src=new URL("UNHANDLED",location.href).toString()}let wasm=undefined;let WASM_VECTOR_LEN=0;let cachedUint8Memory0=null;function getUint8Memory0(){if(cachedUint8Memory0===null||cachedUint8Memory0.byteLength===0){cachedUint8Memory0=new Uint8Array(wasm.memory.buffer)}return cachedUint8Memory0}const cachedTextEncoder=(typeof TextEncoder!=='undefined'?new TextEncoder('utf-8'):{encode:()=>{throw Error('TextEncoder not available')}});const encodeString=(typeof cachedTextEncoder.encodeInto==='function'?function(arg,view){return cachedTextEncoder.encodeInto(arg,view)}:function(arg,view){const buf=cachedTextEncoder.encode(arg);view.set(buf);return{read:arg.length,written:buf.length}});function passStringToWasm0(arg,malloc,realloc){if(realloc===undefined){const buf=cachedTextEncoder.encode(arg);const ptr=malloc(buf.length,1)>>>0;getUint8Memory0().subarray(ptr,ptr+buf.length).set(buf);WASM_VECTOR_LEN=buf.length;return ptr}let len=arg.length;let ptr=malloc(len,1)>>>0;const mem=getUint8Memory0();let offset=0;for(;offset<len;offset++){const code=arg.charCodeAt(offset);if(code>0x7F)break;mem[ptr+offset]=code}if(offset!==len){if(offset!==0){arg=arg.slice(offset)}ptr=realloc(ptr,len,len=offset+arg.length*3,1)>>>0;const view=getUint8Memory0().subarray(ptr+offset,ptr+len);const ret=encodeString(arg,view);offset+=ret.written;ptr=realloc(ptr,len,offset,1)>>>0}WASM_VECTOR_LEN=offset;return ptr}__exports.set_ranking_weights=function(ptr,weights){const ptr0=passStringToWasm0(weights,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ret=wasm.set_ranking_weights(ptr,ptr0,len0);return ret>>>0};function passArray8ToWasm0(arg,malloc){const ptr=malloc(arg.length*1,1)>>>0;getUint8Memory0().set(arg,ptr/1);WASM_VECTOR_LEN=arg.length;return ptr}__exports.init_pagefind=function(metadata_bytes){const ptr0=passArray8ToWasm0(metadata_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.init_pagefind(ptr0,len0);return ret>>>0};__exports.load_filter_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_filter_chunk(ptr,ptr0,len0);return ret>>>0};let cachedInt32Memory0=null;function getInt32Memory0(){if(cachedInt32Memory0===null||cachedInt32Memory0.byteLength===0){cachedInt32Memory0=new Int32Array(wasm.memory.buffer)}return cachedInt32Memory0}const cachedTextDecoder=(typeof TextDecoder!=='undefined'?new TextDecoder('utf-8',{ignoreBOM:true,fatal:true}):{decode:()=>{throw Error('TextDecoder not available')}});if(typeof TextDecoder!=='undefined'){cachedTextDecoder.decode()};function getStringFromWasm0(ptr,len){ptr=ptr>>>0;return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr,ptr+len))}__exports.request_filter_indexes=function(ptr,filters){let deferred2_0;let deferred2_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(filters,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_filter_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred2_0=r0;deferred2_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred2_0,deferred2_1,1)}};__exports.request_indexes=function(ptr,query){let deferred2_0;let deferred2_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred2_0=r0;deferred2_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred2_0,deferred2_1,1)}};__exports.request_all_filter_indexes=function(ptr){let deferred1_0;let deferred1_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.request_all_filter_indexes(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred1_0=r0;deferred1_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred1_0,deferred1_1,1)}};__exports.filters=function(ptr){let deferred1_0;let deferred1_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.filters(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred1_0=r0;deferred1_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred1_0,deferred1_1,1)}};__exports.enter_playground_mode=function(ptr){const ret=wasm.enter_playground_mode(ptr);return ret>>>0};__exports.search=function(ptr,query,filter,sort,exact){let deferred4_0;let deferred4_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ptr1=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len1=WASM_VECTOR_LEN;const ptr2=passStringToWasm0(sort,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len2=WASM_VECTOR_LEN;wasm.search(retptr,ptr,ptr0,len0,ptr1,len1,ptr2,len2,exact);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred4_0=r0;deferred4_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred4_0,deferred4_1,1)}};__exports.add_synthetic_filter=function(ptr,filter){const ptr0=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ret=wasm.add_synthetic_filter(ptr,ptr0,len0);return ret>>>0};__exports.load_index_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_index_chunk(ptr,ptr0,len0);return ret>>>0};async function __wbg_load(module,imports){if(typeof Response==='function'&&module instanceof Response){if(typeof WebAssembly.instantiateStreaming==='function'){try{return await WebAssembly.instantiateStreaming(module,imports)}catch(e){if(module.headers.get('Content-Type')!='application/wasm'){console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",e)}else{throw e}}}const bytes=await module.arrayBuffer();return await WebAssembly.instantiate(bytes,imports)}else{const instance=await WebAssembly.instantiate(module,imports);if(instance instanceof WebAssembly.Instance){return{instance,module}}else{return instance}}}function __wbg_get_imports(){const imports={};imports.wbg={};return imports}function __wbg_init_memory(imports,maybe_memory){}function __wbg_finalize_init(instance,module){wasm=instance.exports;__wbg_init.__wbindgen_wasm_module=module;cachedInt32Memory0=null;cachedUint8Memory0=null;return wasm}function initSync(module){if(wasm!==undefined)return wasm;const imports=__wbg_get_imports();__wbg_init_memory(imports);if(!(module instanceof WebAssembly.Module)){module=new WebAssembly.Module(module)}const instance=new WebAssembly.Instance(module,imports);return __wbg_finalize_init(instance,module)}async function __wbg_init(input){if(wasm!==undefined)return wasm;if(typeof input==='undefined'&&typeof script_src!=='undefined'){input=script_src.replace(/\.js$/,'_bg.wasm')}const imports=__wbg_get_imports();if(typeof input==='string'||(typeof Request==='function'&&input instanceof Request)||(typeof URL==='function'&&input instanceof URL)){input=fetch(input)}__wbg_init_memory(imports);const{instance,module}=await __wbg_load(await input,imports);return __wbg_finalize_init(instance,module)}wasm_bindgen=Object.assign(__wbg_init,{initSync},__exports)})();var u8=Uint8Array;var u16=Uint16Array;var u32=Uint32Array;var fleb=new u8([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]);var fdeb=new u8([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]);var clim=new u8([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);var freb=function(eb,start){var b=new u16(31);for(var i2=0;i2<31;++i2){b[i2]=start+=1<<eb[i2-1]}var r=new u32(b[30]);for(var i2=1;i2<30;++i2){for(var j=b[i2];j<b[i2+1];++j){r[j]=j-b[i2]<<5|i2}}return[b,r]};var _a=freb(fleb,2);var fl=_a[0];var revfl=_a[1];fl[28]=258,revfl[258]=28;var _b=freb(fdeb,0);var fd=_b[0];var revfd=_b[1];var rev=new u16(32768);for(i=0;i<32768;++i){x=(i&43690)>>>1|(i&21845)<<1;x=(x&52428)>>>2|(x&13107)<<2;x=(x&61680)>>>4|(x&3855)<<4;rev[i]=((x&65280)>>>8|(x&255)<<8)>>>1}var x;var i;var hMap=function(cd,mb,r){var s=cd.length;var i2=0;var l=new u16(mb);for(;i2<s;++i2){if(cd[i2])++l[cd[i2]-1]}var le=new u16(mb);for(i2=0;i2<mb;++i2){le[i2]=le[i2-1]+l[i2-1]<<1}var co;if(r){co=new u16(1<<mb);var rvb=15-mb;for(i2=0;i2<s;++i2){if(cd[i2]){var sv=i2<<4|cd[i2];var r_1=mb-cd[i2];var v=le[cd[i2]-1]++<<r_1;for(var m=v|(1<<r_1)-1;v<=m;++v){co[rev[v]>>>rvb]=sv}}}}else{co=new u16(s);for(i2=0;i2<s;++i2){if(cd[i2]){co[i2]=rev[le[cd[i2]-1]++]>>>15-cd[i2]}}}return co};var flt=new u8(288);for(i=0;i<144;++i)flt[i]=8;var i;for(i=144;i<256;++i)flt[i]=9;var i;for(i=256;i<280;++i)flt[i]=7;var i;for(i=280;i<288;++i)flt[i]=8;var i;var fdt=new u8(32);for(i=0;i<32;++i)fdt[i]=5;var i;var flrm=hMap(flt,9,1);var fdrm=hMap(fdt,5,1);var max=function(a){var m=a[0];for(var i2=1;i2<a.length;++i2){if(a[i2]>m)m=a[i2]}return m};var bits=function(d,p,m){var o=p/8|0;return(d[o]|d[o+1]<<8)>>(p&7)&m};var bits16=function(d,p){var o=p/8|0;return(d[o]|d[o+1]<<8|d[o+2]<<16)>>(p&7)};var shft=function(p){return(p+7)/8|0};var slc=function(v,s,e){if(s==null||s<0)s=0;if(e==null||e>v.length)e=v.length;var n=new(v.BYTES_PER_ELEMENT==2?u16:v.BYTES_PER_ELEMENT==4?u32:u8)(e-s);n.set(v.subarray(s,e));return n};var ec=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"];var err=function(ind,msg,nt){var e=new Error(msg||ec[ind]);e.code=ind;if(Error.captureStackTrace)Error.captureStackTrace(e,err);if(!nt)throw e;return e};var inflt=function(dat,buf,st){var sl=dat.length;if(!sl||st&&st.f&&!st.l)return buf||new u8(0);var noBuf=!buf||st;var noSt=!st||st.i;if(!st)st={};if(!buf)buf=new u8(sl*3);var cbuf=function(l2){var bl=buf.length;if(l2>bl){var nbuf=new u8(Math.max(bl*2,l2));nbuf.set(buf);buf=nbuf}};var final=st.f||0,pos=st.p||0,bt=st.b||0,lm=st.l,dm=st.d,lbt=st.m,dbt=st.n;var tbts=sl*8;do{if(!lm){final=bits(dat,pos,1);var type=bits(dat,pos+1,3);pos+=3;if(!type){var s=shft(pos)+4,l=dat[s-4]|dat[s-3]<<8,t=s+l;if(t>sl){if(noSt)err(0);break}if(noBuf)cbuf(bt+l);buf.set(dat.subarray(s,t),bt);st.b=bt+=l,st.p=pos=t*8,st.f=final;continue}else if(type==1)lm=flrm,dm=fdrm,lbt=9,dbt=5;else if(type==2){var hLit=bits(dat,pos,31)+257,hcLen=bits(dat,pos+10,15)+4;var tl=hLit+bits(dat,pos+5,31)+1;pos+=14;var ldt=new u8(tl);var clt=new u8(19);for(var i2=0;i2<hcLen;++i2){clt[clim[i2]]=bits(dat,pos+i2*3,7)}pos+=hcLen*3;var clb=max(clt),clbmsk=(1<<clb)-1;var clm=hMap(clt,clb,1);for(var i2=0;i2<tl;){var r=clm[bits(dat,pos,clbmsk)];pos+=r&15;var s=r>>>4;if(s<16){ldt[i2++]=s}else{var c=0,n=0;if(s==16)n=3+bits(dat,pos,3),pos+=2,c=ldt[i2-1];else if(s==17)n=3+bits(dat,pos,7),pos+=3;else if(s==18)n=11+bits(dat,pos,127),pos+=7;while(n--)ldt[i2++]=c}}var lt=ldt.subarray(0,hLit),dt=ldt.subarray(hLit);lbt=max(lt);dbt=max(dt);lm=hMap(lt,lbt,1);dm=hMap(dt,dbt,1)}else err(1);if(pos>tbts){if(noSt)err(0);break}}if(noBuf)cbuf(bt+131072);var lms=(1<<lbt)-1,dms=(1<<dbt)-1;var lpos=pos;for(;;lpos=pos){var c=lm[bits16(dat,pos)&lms],sym=c>>>4;pos+=c&15;if(pos>tbts){if(noSt)err(0);break}if(!c)err(2);if(sym<256)buf[bt++]=sym;else if(sym==256){lpos=pos,lm=null;break}else{var add=sym-254;if(sym>264){var i2=sym-257,b=fleb[i2];add=bits(dat,pos,(1<<b)-1)+fl[i2];pos+=b}var d=dm[bits16(dat,pos)&dms],dsym=d>>>4;if(!d)err(3);pos+=d&15;var dt=fd[dsym];if(dsym>3){var b=fdeb[dsym];dt+=bits16(dat,pos)&(1<<b)-1,pos+=b}if(pos>tbts){if(noSt)err(0);break}if(noBuf)cbuf(bt+131072);var end=bt+add;for(;bt<end;bt+=4){buf[bt]=buf[bt-dt];buf[bt+1]=buf[bt+1-dt];buf[bt+2]=buf[bt+2-dt];buf[bt+3]=buf[bt+3-dt]}bt=end}}st.l=lm,st.p=lpos,st.b=bt,st.f=final;if(lm)final=1,st.m=lbt,st.d=dm,st.n=dbt}while(!final);return bt==buf.length?buf:slc(buf,0,bt)};var et=new u8(0);var gzs=function(d){if(d[0]!=31||d[1]!=139||d[2]!=8)err(6,"invalid gzip data");var flg=d[3];var st=10;if(flg&4)st+=d[10]|(d[11]<<8)+2;for(var zs=(flg>>3&1)+(flg>>4&1);zs>0;zs-=!d[st++]);return st+(flg&2)};var gzl=function(d){var l=d.length;return(d[l-4]|d[l-3]<<8|d[l-2]<<16|d[l-1]<<24)>>>0};function gunzipSync(data,out){return inflt(data.subarray(gzs(data),-8),out||new u8(gzl(data)))}var td=typeof TextDecoder!="undefined"&&new TextDecoder();var tds=0;try{td.decode(et,{stream:true});tds=1}catch(e){}var gz_default=gunzipSync;var calculate_excerpt_region=(word_positions,excerpt_length)=>{if(word_positions.length===0){return 0}let words=[];for(const word of word_positions){words[word.location]=words[word.location]||0;words[word.location]+=word.balanced_score}if(words.length<=excerpt_length){return 0}let densest=words.slice(0,excerpt_length).reduce((partialSum,a)=>partialSum+a,0);let working_sum=densest;let densest_at=[0];for(let i2=0;i2<words.length;i2++){const boundary=i2+excerpt_length;working_sum+=(words[boundary]??0)-(words[i2]??0);if(working_sum>densest){densest=working_sum;densest_at=[i2]}else if(working_sum===densest&&densest_at[densest_at.length-1]===i2-1){densest_at.push(i2)}}let midpoint=densest_at[Math.floor(densest_at.length/2)];return midpoint};var build_excerpt=(content,start,length,locations,not_before,not_from)=>{let is_zws_delimited=content.includes("\u200B");let fragment_words=[];if(is_zws_delimited){fragment_words=content.split("\u200B")}else{fragment_words=content.split(/[\r\n\s]+/g)}for(let word of locations){if(fragment_words[word]?.startsWith(`<mark>`)){continue}fragment_words[word]=`<mark>${fragment_words[word]}</mark>`}let endcap=not_from??fragment_words.length;let startcap=not_before??0;if(endcap-startcap<length){length=endcap-startcap}if(start+length>endcap){start=endcap-length}if(start<startcap){start=startcap}return fragment_words.slice(start,start+length).join(is_zws_delimited?"":" ").trim()};var calculate_sub_results=(fragment,desired_excerpt_length)=>{const anchors=fragment.anchors.filter((a)=>/h\d/i.test(a.element)&&a.text?.length&&/\S/.test(a.text)).sort((a,b)=>a.location-b.location);const results=[];let current_anchor_position=0;let current_anchor={title:fragment.meta["title"],url:fragment.url,weighted_locations:[],locations:[],excerpt:""};const add_result=(end_range)=>{if(current_anchor.locations.length){const relative_weighted_locations=current_anchor.weighted_locations.map((l)=>{return{weight:l.weight,balanced_score:l.balanced_score,location:l.location-current_anchor_position}});const excerpt_start=calculate_excerpt_region(relative_weighted_locations,desired_excerpt_length)+current_anchor_position;const excerpt_length=end_range?Math.min(end_range-excerpt_start,desired_excerpt_length):desired_excerpt_length;current_anchor.excerpt=build_excerpt(fragment.raw_content??"",excerpt_start,excerpt_length,current_anchor.locations,current_anchor_position,end_range);results.push(current_anchor)}};for(let word of fragment.weighted_locations){if(!anchors.length||word.location<anchors[0].location){current_anchor.weighted_locations.push(word);current_anchor.locations.push(word.location)}else{let next_anchor=anchors.shift();add_result(next_anchor.location);while(anchors.length&&word.location>=anchors[0].location){next_anchor=anchors.shift()}let anchored_url=fragment.url;try{const url_is_fq=/^((https?:)?\/\/)/.test(anchored_url);if(url_is_fq){let fq_url=new URL(anchored_url);fq_url.hash=next_anchor.id;anchored_url=fq_url.toString()}else{if(!/^\//.test(anchored_url)){anchored_url=`/${anchored_url}`}let fq_url=new URL(`https://example.com${anchored_url}`);fq_url.hash=next_anchor.id;anchored_url=fq_url.toString().replace(/^https:\/\/example.com/,"")}}catch(e){console.error(`Pagefind: Couldn't process ${anchored_url} for a search result`)}current_anchor_position=next_anchor.location;current_anchor={title:next_anchor.text,url:anchored_url,anchor:next_anchor,weighted_locations:[word],locations:[word.location],excerpt:""}}}add_result(anchors[0]?.location);return results};var asyncSleep=async(ms=100)=>{return new Promise((r)=>setTimeout(r,ms))};var isBrowser=typeof window!=="undefined"&&typeof document!=="undefined";var PagefindInstance=class{constructor(opts={}){this.version=pagefind_version;this.backend=wasm_bindgen;this.decoder=new TextDecoder("utf-8");this.wasm=null;this.basePath=opts.basePath||"/pagefind/";this.primary=opts.primary||false;if(this.primary&&!opts.basePath){this.initPrimary()}if(/[^\/]$/.test(this.basePath)){this.basePath=`${this.basePath}/`}if(isBrowser&&window?.location?.origin&&this.basePath.startsWith(window.location.origin)){this.basePath=this.basePath.replace(window.location.origin,"")}this.baseUrl=opts.baseUrl||this.defaultBaseUrl();if(!/^(\/|https?:\/\/)/.test(this.baseUrl)){this.baseUrl=`/${this.baseUrl}`}this.indexWeight=opts.indexWeight??1;this.excerptLength=opts.excerptLength??30;this.mergeFilter=opts.mergeFilter??{};this.ranking=opts.ranking;this.highlightParam=opts.highlightParam??null;this.loaded_chunks={};this.loaded_filters={};this.loaded_fragments={};this.raw_ptr=null;this.searchMeta=null;this.languages=null}initPrimary(){if(isBrowser&&typeof import.meta.url!=="undefined"){let derivedBasePath=import.meta.url.match(/^(.*\/)pagefind.js.*$/)?.[1];if(derivedBasePath){this.basePath=derivedBasePath}else{console.warn(["Pagefind couldn't determine the base of the bundle from the import path. Falling back to the default.","Set a basePath option when initialising Pagefind to ignore this message."].join("\n"))}}}defaultBaseUrl(){let default_base=this.basePath.match(/^(.*\/)_?pagefind/)?.[1];return default_base||"/"}async options(options2){const opts=["basePath","baseUrl","indexWeight","excerptLength","mergeFilter","highlightParam","ranking"];for(const[k,v]of Object.entries(options2)){if(k==="mergeFilter"){let filters2=this.stringifyFilters(v);let ptr=await this.getPtr();this.raw_ptr=this.backend.add_synthetic_filter(ptr,filters2)}else if(k==="ranking"){await this.set_ranking(options2.ranking)}else if(opts.includes(k)){if(k==="basePath"&&typeof v==="string")this.basePath=v;if(k==="baseUrl"&&typeof v==="string")this.baseUrl=v;if(k==="indexWeight"&&typeof v==="number")this.indexWeight=v;if(k==="excerptLength"&&typeof v==="number")this.excerptLength=v;if(k==="mergeFilter"&&typeof v==="object")this.mergeFilter=v;if(k==="highlightParam"&&typeof v==="string")this.highlightParam=v}else{console.warn(`Unknown Pagefind option ${k}. Allowed options: [${opts.join(", ")}]`)}}}async enterPlaygroundMode(){let ptr=await this.getPtr();this.raw_ptr=this.backend.enter_playground_mode(ptr)}decompress(data,file="unknown file"){if(this.decoder.decode(data.slice(0,12))==="pagefind_dcd"){return data.slice(12)}data=gz_default(data);if(this.decoder.decode(data.slice(0,12))!=="pagefind_dcd"){console.error(`Decompressing ${file} appears to have failed: Missing signature`);return data}return data.slice(12)}async set_ranking(ranking){if(!ranking)return;let rankingWeights={term_similarity:ranking.termSimilarity??null,page_length:ranking.pageLength??null,term_saturation:ranking.termSaturation??null,term_frequency:ranking.termFrequency??null};let ptr=await this.getPtr();this.raw_ptr=this.backend.set_ranking_weights(ptr,JSON.stringify(rankingWeights))}async init(language,opts){await this.loadEntry();let index=this.findIndex(language);let lang_wasm=index.wasm?index.wasm:"unknown";this.loadedLanguage=language;let resources=[this.loadMeta(index.hash)];if(opts.load_wasm===true){resources.push(this.loadWasm(lang_wasm))}await Promise.all(resources);this.raw_ptr=this.backend.init_pagefind(new Uint8Array(this.searchMeta));if(Object.keys(this.mergeFilter)?.length){let filters2=this.stringifyFilters(this.mergeFilter);let ptr=await this.getPtr();this.raw_ptr=this.backend.add_synthetic_filter(ptr,filters2)}if(this.ranking){await this.set_ranking(this.ranking)}}async loadEntry(){try{let entry_response=await fetch(`${this.basePath}pagefind-entry.json?ts=${Date.now()}`);let entry_json=await entry_response.json();this.languages=entry_json.languages;this.loadedVersion=entry_json.version;this.includeCharacters=entry_json.include_characters??[];if(entry_json.version!==this.version){if(this.primary){console.warn(["Pagefind JS version doesn't match the version in your search index.",`Pagefind JS: ${this.version}. Pagefind index: ${entry_json.version}`,"If you upgraded Pagefind recently, you likely have a cached pagefind.js file.","If you encounter any search errors, try clearing your cache."].join("\n"))}else{console.warn(["Merging a Pagefind index from a different version than the main Pagefind instance.",`Main Pagefind JS: ${this.version}. Merged index (${this.basePath}): ${entry_json.version}`,"If you encounter any search errors, make sure that both sites are running the same version of Pagefind."].join("\n"))}}}catch(e){console.error(`Failed to load Pagefind metadata:
2
+ ${e?.toString()}`);throw new Error("Failed to load Pagefind metadata")}}findIndex(language){if(this.languages){let index=this.languages[language];if(index)return index;index=this.languages[language.split("-")[0]];if(index)return index;let topLang=Object.values(this.languages).sort((a,b)=>b.page_count-a.page_count);if(topLang[0])return topLang[0]}throw new Error("Pagefind Error: No language indexes found.")}async loadMeta(index){try{let compressed_resp=await fetch(`${this.basePath}pagefind.${index}.pf_meta`);let compressed_meta=await compressed_resp.arrayBuffer();this.searchMeta=this.decompress(new Uint8Array(compressed_meta),"Pagefind metadata")}catch(e){console.error(`Failed to load the meta index:
3
+ ${e?.toString()}`)}}async loadWasm(language){try{const wasm_url=`${this.basePath}wasm.${language}.pagefind`;let compressed_resp=await fetch(wasm_url);let compressed_wasm=await compressed_resp.arrayBuffer();const final_wasm=this.decompress(new Uint8Array(compressed_wasm),"Pagefind WebAssembly");if(!final_wasm){throw new Error("No WASM after decompression")}this.wasm=await this.backend(final_wasm)}catch(e){console.error(`Failed to load the Pagefind WASM:
4
+ ${e?.toString()}`);throw new Error(`Failed to load the Pagefind WASM:
5
+ ${e?.toString()}`)}}async _loadGenericChunk(url,method){try{let compressed_resp=await fetch(url);let compressed_chunk=await compressed_resp.arrayBuffer();let chunk=this.decompress(new Uint8Array(compressed_chunk),url);let ptr=await this.getPtr();this.raw_ptr=this.backend[method](ptr,chunk)}catch(e){console.error(`Failed to load the index chunk ${url}:
6
+ ${e?.toString()}`)}}async loadChunk(hash){if(!this.loaded_chunks[hash]){const url=`${this.basePath}index/${hash}.pf_index`;this.loaded_chunks[hash]=this._loadGenericChunk(url,"load_index_chunk")}return await this.loaded_chunks[hash]}async loadFilterChunk(hash){if(!this.loaded_filters[hash]){const url=`${this.basePath}filter/${hash}.pf_filter`;this.loaded_filters[hash]=this._loadGenericChunk(url,"load_filter_chunk")}return await this.loaded_filters[hash]}async _loadFragment(hash){let compressed_resp=await fetch(`${this.basePath}fragment/${hash}.pf_fragment`);let compressed_fragment=await compressed_resp.arrayBuffer();let fragment=this.decompress(new Uint8Array(compressed_fragment),`Fragment ${hash}`);return JSON.parse(new TextDecoder().decode(fragment))}async loadFragment(hash,weighted_locations=[],search_term){if(!this.loaded_fragments[hash]){this.loaded_fragments[hash]=this._loadFragment(hash)}let fragment=await this.loaded_fragments[hash];fragment.weighted_locations=weighted_locations;fragment.locations=weighted_locations.map((l)=>l.location);if(!fragment.raw_content){fragment.raw_content=fragment.content.replace(/</g,"&lt;").replace(/>/g,"&gt;");fragment.content=fragment.content.replace(/\u200B/g,"")}if(!fragment.raw_url){fragment.raw_url=fragment.url}fragment.url=this.processedUrl(fragment.raw_url,search_term);const excerpt_start=calculate_excerpt_region(weighted_locations,this.excerptLength);fragment.excerpt=build_excerpt(fragment.raw_content,excerpt_start,this.excerptLength,fragment.locations);fragment.sub_results=calculate_sub_results(fragment,this.excerptLength);return fragment}fullUrl(raw){if(/^(https?:)?\/\//.test(raw)){return raw}return`${this.baseUrl}/${raw}`.replace(/\/+/g,"/").replace(/^(https?:\/)/,"$1/")}processedUrl(url,search_term){const normalized=this.fullUrl(url);if(this.highlightParam===null){return normalized}let individual_terms=search_term.split(/\s+/);try{let processed=new URL(normalized);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString()}catch(e){try{let processed=new URL(`https://example.com${normalized}`);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString().replace(/^https:\/\/example\.com/,"")}catch(e2){return normalized}}}async getPtr(){while(this.raw_ptr===null){await asyncSleep(50)}if(!this.raw_ptr){console.error("Pagefind: WASM Error (No pointer)");throw new Error("Pagefind: WASM Error (No pointer)")}return this.raw_ptr}stringifyFilters(obj={}){return JSON.stringify(obj)}stringifySorts(obj={}){let sorts=Object.entries(obj);for(let[sort,direction]of sorts){if(sorts.length>1){console.warn(`Pagefind was provided multiple sort options in this search, but can only operate on one. Using the ${sort} sort.`)}if(direction!=="asc"&&direction!=="desc"){console.warn(`Pagefind was provided a sort with unknown direction ${direction}. Supported: [asc, desc]`)}return`${sort}:${direction}`}return``}async filters(){let ptr=await this.getPtr();let filters2=this.backend.request_all_filter_indexes(ptr);let filter_array=JSON.parse(filters2);if(Array.isArray(filter_array)){let filter_chunks=filter_array.filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...filter_chunks])}ptr=await this.getPtr();let results=this.backend.filters(ptr);return JSON.parse(results)}async preload(term,options2={}){await this.search(term,{...options2,preload:true})}async search(term,options2={}){options2={verbose:false,filters:{},sort:{},...options2};const log=(str)=>{if(options2.verbose)console.log(str)};log(`Starting search on ${this.basePath}`);let start=Date.now();let ptr=await this.getPtr();let filter_only=term===null;term=term??"";let exact_search=/^\s*".+"\s*$/.test(term);if(exact_search){log(`Running an exact search`)}let trueLanguage=null;try{trueLanguage=Intl.getCanonicalLocales(this.loadedLanguage)[0]}catch(err2){}const term_chunks=[];let segments;if(trueLanguage&&typeof Intl.Segmenter!=="undefined"){const segmenter=new Intl.Segmenter(trueLanguage,{granularity:"grapheme"});segments=[...segmenter.segment(term)].map(({segment})=>segment)}else{segments=[...term]}for(const segment of segments){if(this.includeCharacters?.includes(segment)){term_chunks.push(segment)}else if(!/^\p{Pd}|\p{Pe}|\p{Pf}|\p{Pi}|\p{Po}|\p{Ps}$/u.test(segment)){term_chunks.push(segment.toLocaleLowerCase())}}term=term_chunks.join("").replace(/\s{2,}/g," ").trim();log(`Normalized search term to ${term}`);if(!term?.length&&!filter_only){return{results:[],unfilteredResultCount:0,filters:{},totalFilters:{},timings:{preload:Date.now()-start,search:Date.now()-start,total:Date.now()-start}}}let sort_list=this.stringifySorts(options2.sort);log(`Stringified sort to ${sort_list}`);const filter_list=this.stringifyFilters(options2.filters);log(`Stringified filters to ${filter_list}`);let index_resp=this.backend.request_indexes(ptr,term);let index_array=JSON.parse(index_resp);let filter_resp=this.backend.request_filter_indexes(ptr,filter_list);let filter_array=JSON.parse(filter_resp);let chunks=index_array.filter((v)=>v).map((chunk)=>this.loadChunk(chunk));let filter_chunks=filter_array.filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...chunks,...filter_chunks]);log(`Loaded necessary chunks to run search`);if(options2.preload){log(`Preload \u2014 bailing out of search operation now.`);return null}ptr=await this.getPtr();let searchStart=Date.now();let result=this.backend.search(ptr,term,filter_list,sort_list,exact_search);log(`Got the raw search result: ${result}`);let{filtered_counts,total_counts,results,unfiltered_total,search_keywords}=JSON.parse(result);let resultsInterface=results.map((result2)=>{let weighted_locations=result2.l.map((l)=>{let loc={weight:l.w/24,balanced_score:l.s,location:l.l};if(l.v){loc.verbose={word_string:l.v.ws,length_bonus:l.v.lb}}return loc});let locations=weighted_locations.map((l)=>l.location);let res={id:result2.p,score:result2.s*this.indexWeight,words:locations,data:async()=>await this.loadFragment(result2.p,weighted_locations,term)};if(result2.params){res.params={document_length:result2.params.dl,average_page_length:result2.params.apl,total_pages:result2.params.tp}}if(result2.scores){res.scores=result2.scores.map((r)=>{return{search_term:r.w,idf:r.idf,saturating_tf:r.b_tf,raw_tf:r.r_tf,pagefind_tf:r.p_tf,score:r.s,params:{weighted_term_frequency:r.params.w_tf,pages_containing_term:r.params.pct,length_bonus:r.params.lb}}})}return res});const searchTime=Date.now()-searchStart;const realTime=Date.now()-start;log(`Found ${results.length} result${results.length == 1 ? "" : "s"} for "${term}" in ${Date.now() - searchStart}ms (${Date.now() - start}ms realtime)`);let response={results:resultsInterface,unfilteredResultCount:unfiltered_total,filters:filtered_counts,totalFilters:total_counts,timings:{preload:realTime-searchTime,search:searchTime,total:realTime}};if(search_keywords){response.search_keywords=search_keywords}return response}};var Pagefind=class{constructor(options2={}){this.backend=wasm_bindgen;this.primaryLanguage="unknown";this.searchID=0;this.primary=new PagefindInstance({...options2,primary:true});this.instances=[this.primary];this.init(options2?.language)}async options(options2){await this.primary.options(options2)}async enterPlaygroundMode(){await this.primary.enterPlaygroundMode()}async init(overrideLanguage){if(isBrowser&&document?.querySelector){const langCode=document.querySelector("html")?.getAttribute("lang")||"unknown";this.primaryLanguage=langCode.toLocaleLowerCase()}await this.primary.init(overrideLanguage?overrideLanguage:this.primaryLanguage,{load_wasm:true})}async mergeIndex(indexPath,options2={}){if(this.primary.basePath.startsWith(indexPath)){console.warn(`Skipping mergeIndex ${indexPath} that appears to be the same as the primary index (${this.primary.basePath})`);return}let newInstance=new PagefindInstance({primary:false,basePath:indexPath});this.instances.push(newInstance);while(this.primary.wasm===null){await asyncSleep(50)}await newInstance.init(options2.language||this.primaryLanguage,{load_wasm:false});delete options2["language"];await newInstance.options(options2)}mergeFilters(filters2){const merged={};for(const searchFilter of filters2){for(const[filterKey,values]of Object.entries(searchFilter)){if(!merged[filterKey]){merged[filterKey]=values;continue}else{const filter=merged[filterKey];for(const[valueKey,count]of Object.entries(values)){filter[valueKey]=(filter[valueKey]||0)+count}}}}return merged}async filters(){let filters2=await Promise.all(this.instances.map((i2)=>i2.filters()));return this.mergeFilters(filters2)}async preload(term,options2={}){await Promise.all(this.instances.map((i2)=>i2.preload(term,options2)))}async debouncedSearch(term,options2,debounceTimeoutMs){const thisSearchID=++this.searchID;this.preload(term,options2);await asyncSleep(debounceTimeoutMs);if(thisSearchID!==this.searchID){return null}const searchResult=await this.search(term,options2);if(thisSearchID!==this.searchID){return null}return searchResult}async search(term,options2={}){let search2=await Promise.all(this.instances.map((i2)=>i2.search(term,options2)));const filters2=this.mergeFilters(search2.map((s)=>s.filters));const totalFilters=this.mergeFilters(search2.map((s)=>s.totalFilters));const results=search2.map((s)=>s.results).flat().sort((a,b)=>b.score-a.score);const timings=search2.map((s)=>s.timings);const unfilteredResultCount=search2.reduce((sum,s)=>sum+s.unfilteredResultCount,0);let response={results,unfilteredResultCount,filters:filters2,totalFilters,timings};if(search2[0].search_keywords){response.search_keywords=search2[0].search_keywords}return response}};var pagefind=void 0;var initial_options=void 0;var init_pagefind=()=>{if(!pagefind){pagefind=new Pagefind(initial_options??{})}};var options=async(new_options)=>{if(pagefind){await pagefind.options(new_options)}else{initial_options=new_options}};var init=async()=>{init_pagefind()};var destroy=async()=>{pagefind=void 0;initial_options=void 0};var mergeIndex=async(indexPath,options2)=>{init_pagefind();return await pagefind.mergeIndex(indexPath,options2)};var search=async(term,options2)=>{init_pagefind();return await pagefind.search(term,options2)};var debouncedSearch=async(term,options2,debounceTimeoutMs=300)=>{init_pagefind();return await pagefind.debouncedSearch(term,options2,debounceTimeoutMs)};var preload=async(term,options2)=>{init_pagefind();return await pagefind.preload(term,options2)};var filters=async()=>{init_pagefind();return await pagefind.filters()};export{debouncedSearch,destroy,filters,init,mergeIndex,options,preload,search}
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" x="0" y="0" viewBox="0 0 64 64" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><linearGradient id="a" x1="78.644" x2="25.425" y1="74.123" y2="11.863" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#064e3b"></stop><stop offset="1" stop-color="#10b981"></stop></linearGradient><path fill="url(#a)" fill-rule="evenodd" d="M2 14C2 7.373 7.373 2 14 2h36c6.627 0 12 5.373 12 12v28c0 6.627-5.373 12-12 12H39.908l-6.403 7.317a2 2 0 0 1-3.01 0L24.093 54H14C7.373 54 2 48.627 2 42z" clip-rule="evenodd" opacity="1" data-original="url(#a)" class=""></path><path fill="#ffffff" d="M32 14a2 2 0 0 1 1.95 1.556l1.107 4.867a6 6 0 0 0 4.52 4.52l4.867 1.107a2 2 0 0 1 0 3.9l-4.867 1.107a6 6 0 0 0-4.52 4.52l-1.107 4.866a2 2 0 0 1-3.9 0l-1.107-4.866a6 6 0 0 0-4.52-4.52l-4.866-1.107a2 2 0 0 1 0-3.9l4.866-1.107a6 6 0 0 0 4.52-4.52l1.107-4.866A2 2 0 0 1 32 14z"></path></g></svg>
@@ -1,6 +1,7 @@
1
- import { getAllDocs, getDocBySlug } from "@/lib/docs";
1
+ import { getAllDocs, getDocBySlug, extractHeadings } from "@/lib/docs";
2
2
  import Breadcrumbs from "@/components/Breadcrumbs";
3
3
  import MarkdownRenderer from "@/components/MarkdownRenderer";
4
+ import TableOfContents from "@/components/TableOfContents";
4
5
  import TagBadge from "@/components/TagBadge";
5
6
  import { notFound } from "next/navigation";
6
7
 
@@ -12,7 +13,6 @@ export async function generateStaticParams() {
12
13
  }
13
14
 
14
15
  export const dynamicParams = true;
15
- export const revalidate = 10;
16
16
 
17
17
  export default async function DocPage({
18
18
  params,
@@ -24,39 +24,43 @@ export default async function DocPage({
24
24
  if (!doc) notFound();
25
25
 
26
26
  const categoryDisplay = category.replace(/[_-]/g, " ");
27
+ const headings = extractHeadings(doc.content);
27
28
 
28
29
  return (
29
- <article data-pagefind-body>
30
- <Breadcrumbs
31
- crumbs={[
32
- { label: categoryDisplay, href: `/${category}/` },
33
- { label: doc.frontmatter.title },
34
- ]}
35
- />
36
-
37
- <header className="mb-8">
38
- <h1 className="text-3xl font-bold mb-2">{doc.frontmatter.title}</h1>
39
- <div className="flex flex-wrap items-center gap-3 text-sm text-gray-500 dark:text-gray-400">
40
- <span className="capitalize px-2 py-0.5 bg-gray-100 dark:bg-gray-800 rounded">
41
- {categoryDisplay}
42
- </span>
43
- {doc.frontmatter.created && (
44
- <span>Created: {doc.frontmatter.created}</span>
30
+ <div className="flex w-full">
31
+ <article className="min-w-0 flex-1" data-pagefind-body>
32
+ <Breadcrumbs
33
+ crumbs={[
34
+ { label: categoryDisplay, href: `/${category}/` },
35
+ { label: doc.frontmatter.title },
36
+ ]}
37
+ />
38
+
39
+ <header className="mb-8">
40
+ <h1 className="mb-2 text-3xl font-bold">{doc.frontmatter.title}</h1>
41
+ {(doc.frontmatter.created || doc.frontmatter.updated) && (
42
+ <div className="flex flex-wrap items-center gap-3 text-sm text-slate-500 dark:text-slate-400">
43
+ {doc.frontmatter.created && (
44
+ <span>Created: {doc.frontmatter.created}</span>
45
+ )}
46
+ {doc.frontmatter.updated && (
47
+ <span>Updated: {doc.frontmatter.updated}</span>
48
+ )}
49
+ </div>
45
50
  )}
46
- {doc.frontmatter.updated && (
47
- <span>Updated: {doc.frontmatter.updated}</span>
51
+ {doc.frontmatter.tags.length > 0 && (
52
+ <div className="mt-3 flex flex-wrap gap-1.5">
53
+ {doc.frontmatter.tags.map((tag) => (
54
+ <TagBadge key={tag} tag={tag} />
55
+ ))}
56
+ </div>
48
57
  )}
49
- </div>
50
- {doc.frontmatter.tags.length > 0 && (
51
- <div className="flex flex-wrap gap-1.5 mt-3">
52
- {doc.frontmatter.tags.map((tag) => (
53
- <TagBadge key={tag} tag={tag} />
54
- ))}
55
- </div>
56
- )}
57
- </header>
58
-
59
- <MarkdownRenderer content={doc.content} />
60
- </article>
58
+ </header>
59
+
60
+ <MarkdownRenderer content={doc.content} />
61
+ </article>
62
+
63
+ <TableOfContents headings={headings} />
64
+ </div>
61
65
  );
62
66
  }
@@ -7,7 +7,6 @@ export async function generateStaticParams() {
7
7
  }
8
8
 
9
9
  export const dynamicParams = true;
10
- export const revalidate = 10;
11
10
 
12
11
  export default async function CategoryPage({
13
12
  params,
@@ -21,8 +20,8 @@ export default async function CategoryPage({
21
20
  return (
22
21
  <div>
23
22
  <Breadcrumbs crumbs={[{ label: displayName }]} />
24
- <h1 className="text-2xl font-bold capitalize mb-1">{displayName}</h1>
25
- <p className="text-gray-500 dark:text-gray-400 mb-6">
23
+ <h1 className="mb-1 text-2xl font-bold capitalize">{displayName}</h1>
24
+ <p className="mb-6 text-slate-500 dark:text-slate-400">
26
25
  {docs.length} {docs.length === 1 ? "doc" : "docs"}
27
26
  </p>
28
27
 
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" x="0" y="0" viewBox="0 0 64 64" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><linearGradient id="a" x1="78.644" x2="25.425" y1="74.123" y2="11.863" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#064e3b"></stop><stop offset="1" stop-color="#10b981"></stop></linearGradient><path fill="url(#a)" fill-rule="evenodd" d="M2 14C2 7.373 7.373 2 14 2h36c6.627 0 12 5.373 12 12v28c0 6.627-5.373 12-12 12H39.908l-6.403 7.317a2 2 0 0 1-3.01 0L24.093 54H14C7.373 54 2 48.627 2 42z" clip-rule="evenodd" opacity="1" data-original="url(#a)" class=""></path><path fill="#ffffff" d="M32 14a2 2 0 0 1 1.95 1.556l1.107 4.867a6 6 0 0 0 4.52 4.52l4.867 1.107a2 2 0 0 1 0 3.9l-4.867 1.107a6 6 0 0 0-4.52 4.52l-1.107 4.866a2 2 0 0 1-3.9 0l-1.107-4.866a6 6 0 0 0-4.52-4.52l-4.866-1.107a2 2 0 0 1 0-3.9l4.866-1.107a6 6 0 0 0 4.52-4.52l1.107-4.866A2 2 0 0 1 32 14z"></path></g></svg>
@@ -4,28 +4,88 @@
4
4
  @custom-variant dark (&:where(.dark, .dark *));
5
5
 
6
6
  @theme {
7
- --color-primary: #3b82f6;
8
- --color-primary-dark: #60a5fa;
9
- --color-surface: #ffffff;
10
- --color-surface-dark: #111827;
11
- --color-surface-secondary: #f9fafb;
12
- --color-surface-secondary-dark: #1f2937;
13
- --color-border: #e5e7eb;
14
- --color-border-dark: #374151;
15
- --color-text: #111827;
16
- --color-text-dark: #f9fafb;
17
- --color-text-muted: #6b7280;
18
- --color-text-muted-dark: #9ca3af;
7
+ --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
8
+
9
+ /* Warm slate scale (dark palette — from website) */
10
+ --color-navy-800: #31353f;
11
+ --color-navy-900: #2a2d38;
12
+ --color-navy-950: #23262e;
13
+
14
+ /* Violet accent (from website) */
15
+ --color-accent: #7c3aed;
16
+ --color-accent-light: #a78bfa;
17
+ --color-accent-dark: #6d28d9;
18
+
19
+ --color-surface: #2a2d38;
20
+ --color-surface-secondary: #31353f;
21
+ --color-border: rgba(160, 160, 160, 0.11);
22
+ --color-text: #f8fafc;
23
+ --color-text-muted: #94a3b8;
24
+ --color-link: #58adfb;
19
25
  }
20
26
 
21
27
  html {
22
28
  scroll-behavior: smooth;
23
29
  }
24
30
 
31
+ @media (prefers-reduced-motion: reduce) {
32
+ html {
33
+ scroll-behavior: auto;
34
+ }
35
+ *,
36
+ *::before,
37
+ *::after {
38
+ animation-duration: 0.01ms !important;
39
+ animation-iteration-count: 1 !important;
40
+ transition-duration: 0.01ms !important;
41
+ }
42
+ }
43
+
44
+ /* Scrollbar */
45
+ *::-webkit-scrollbar {
46
+ width: 8px;
47
+ height: 8px;
48
+ }
49
+ *::-webkit-scrollbar-thumb {
50
+ background: #d1d5db4c;
51
+ border-radius: 10px;
52
+ }
53
+ *::-webkit-scrollbar-thumb:hover {
54
+ background: #d1d5dbce;
55
+ }
56
+ *::-webkit-scrollbar-track {
57
+ background: transparent;
58
+ }
59
+
60
+ /* Hide scrollbar utility */
61
+ .scrollbar-none::-webkit-scrollbar {
62
+ display: none;
63
+ }
64
+
25
65
  /* Syntax highlighting */
26
- pre code.hljs {
27
- padding: 1rem;
66
+ pre code {
28
67
  border-radius: 0.5rem;
29
68
  font-size: 0.875rem;
30
69
  line-height: 1.7;
70
+
71
+ &.hljs {
72
+ padding: 0 !important;
73
+ }
74
+ }
75
+
76
+ pre {
77
+ padding: 1rem;
78
+ background: #0d1117;
79
+ }
80
+
81
+ :where(code):not(:where([class~="not-prose"], [class~="not-prose"] *)) {
82
+ font-weight: 500;
83
+ }
84
+
85
+ :not(pre) > code {
86
+ background: none !important;
87
+ border: 1px solid #a0a0a06b;
88
+ font-size: 85%;
89
+ padding: 1px 5px;
90
+ border-radius: 4px;
31
91
  }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" x="0" y="0" viewBox="0 0 64 64" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><linearGradient id="a" x1="78.644" x2="25.425" y1="74.123" y2="11.863" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#064e3b"></stop><stop offset="1" stop-color="#10b981"></stop></linearGradient><path fill="url(#a)" fill-rule="evenodd" d="M2 14C2 7.373 7.373 2 14 2h36c6.627 0 12 5.373 12 12v28c0 6.627-5.373 12-12 12H39.908l-6.403 7.317a2 2 0 0 1-3.01 0L24.093 54H14C7.373 54 2 48.627 2 42z" clip-rule="evenodd" opacity="1" data-original="url(#a)" class=""></path><path fill="#ffffff" d="M32 14a2 2 0 0 1 1.95 1.556l1.107 4.867a6 6 0 0 0 4.52 4.52l4.867 1.107a2 2 0 0 1 0 3.9l-4.867 1.107a6 6 0 0 0-4.52 4.52l-1.107 4.866a2 2 0 0 1-3.9 0l-1.107-4.866a6 6 0 0 0-4.52-4.52l-4.866-1.107a2 2 0 0 1 0-3.9l4.866-1.107a6 6 0 0 0 4.52-4.52l1.107-4.866A2 2 0 0 1 32 14z"></path></g></svg>
@@ -1,36 +1,56 @@
1
1
  import type { Metadata } from "next";
2
2
  import { ThemeProvider } from "next-themes";
3
3
  import { getAllCategories } from "@/lib/docs";
4
+ import Header from "@/components/layout/Header";
5
+ import Footer from "@/components/layout/Footer";
4
6
  import Sidebar from "@/components/Sidebar";
5
7
  import MobileNav from "@/components/MobileNav";
6
8
  import "./globals.css";
7
9
  import "highlight.js/styles/github-dark.css";
8
10
 
9
- export const revalidate = 10;
10
-
11
11
  export const metadata: Metadata = {
12
12
  title: "Learning Notes",
13
13
  description: "Personal learning knowledge base",
14
14
  };
15
15
 
16
- export default function RootLayout({ children }: { children: React.ReactNode }) {
16
+ export default function RootLayout({
17
+ children,
18
+ }: {
19
+ children: React.ReactNode;
20
+ }) {
17
21
  const categories = getAllCategories();
18
22
 
19
23
  return (
20
- <html lang="en" suppressHydrationWarning>
21
- <body className="bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100">
24
+ <html lang="en" data-scroll-behavior="smooth" suppressHydrationWarning>
25
+ <head>
26
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
27
+ <link
28
+ rel="preconnect"
29
+ href="https://fonts.gstatic.com"
30
+ crossOrigin="anonymous"
31
+ />
32
+ <link
33
+ href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
34
+ rel="stylesheet"
35
+ />
36
+ </head>
37
+ <body className="dark:bg-navy-900 bg-white text-slate-900 antialiased dark:text-slate-50">
22
38
  <ThemeProvider attribute="class" defaultTheme="system" enableSystem>
23
- <div data-pagefind-ignore>
39
+ <Header categories={categories} />
40
+ <div data-pagefind-ignore className="md:hidden">
24
41
  <MobileNav categories={categories} />
25
42
  </div>
26
43
  <div className="flex">
27
44
  <div data-pagefind-ignore>
28
45
  <Sidebar categories={categories} />
29
46
  </div>
30
- <main className="flex-1 min-h-screen p-6 md:p-8 max-w-4xl">
31
- {children}
32
- </main>
47
+ <div className="flex min-w-0 flex-1 justify-center md:pl-64 lg:pl-[300px]">
48
+ <main className="min-h-screen w-full max-w-5xl p-6 pb-24 md:p-8 md:pb-24">
49
+ {children}
50
+ </main>
51
+ </div>
33
52
  </div>
53
+ <Footer />
34
54
  </ThemeProvider>
35
55
  </body>
36
56
  </html>
@@ -3,8 +3,6 @@ import DocCard from "@/components/DocCard";
3
3
  import TagBadge from "@/components/TagBadge";
4
4
  import Link from "next/link";
5
5
 
6
- export const revalidate = 10;
7
-
8
6
  export default function HomePage() {
9
7
  const categories = getAllCategories();
10
8
  const docs = getAllDocs();
@@ -13,25 +11,25 @@ export default function HomePage() {
13
11
 
14
12
  return (
15
13
  <div>
16
- <h1 className="text-3xl font-bold mb-2">Learning Notes</h1>
17
- <p className="text-gray-500 dark:text-gray-400 mb-8">
14
+ <h1 className="mb-2 text-3xl font-bold">Learning Notes</h1>
15
+ <p className="mb-8 text-slate-500 dark:text-slate-400">
18
16
  {docs.length} docs across {categories.length} categories
19
17
  </p>
20
18
 
21
19
  {/* Categories */}
22
20
  <section className="mb-8">
23
- <h2 className="text-lg font-semibold mb-3">Categories</h2>
24
- <div className="grid grid-cols-2 sm:grid-cols-3 gap-3">
21
+ <h2 className="mb-3 text-lg font-semibold">Categories</h2>
22
+ <div className="grid grid-cols-2 gap-3 sm:grid-cols-3">
25
23
  {categories.map((cat) => (
26
24
  <Link
27
25
  key={cat.name}
28
26
  href={`/${cat.name}/`}
29
- className="p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:border-blue-300 dark:hover:border-blue-600 transition-colors"
27
+ className="rounded-lg border border-slate-200 p-3 transition-colors hover:border-violet-400/50 dark:border-[#a0a0a01c] dark:hover:border-violet-400/50"
30
28
  >
31
- <div className="font-medium capitalize text-gray-900 dark:text-gray-100">
29
+ <div className="font-medium text-slate-900 capitalize dark:text-slate-100">
32
30
  {cat.name.replace(/[_-]/g, " ")}
33
31
  </div>
34
- <div className="text-sm text-gray-500 dark:text-gray-400">
32
+ <div className="text-sm text-slate-500 dark:text-slate-400">
35
33
  {cat.docCount} {cat.docCount === 1 ? "doc" : "docs"}
36
34
  </div>
37
35
  </Link>
@@ -42,7 +40,7 @@ export default function HomePage() {
42
40
  {/* Tags */}
43
41
  {tags.length > 0 && (
44
42
  <section className="mb-8">
45
- <h2 className="text-lg font-semibold mb-3">Tags</h2>
43
+ <h2 className="mb-3 text-lg font-semibold">Tags</h2>
46
44
  <div className="flex flex-wrap gap-2">
47
45
  {tags.slice(0, 20).map(({ tag }) => (
48
46
  <TagBadge key={tag} tag={tag} />
@@ -53,7 +51,7 @@ export default function HomePage() {
53
51
 
54
52
  {/* Recent Docs */}
55
53
  <section>
56
- <h2 className="text-lg font-semibold mb-3">Recently Updated</h2>
54
+ <h2 className="mb-3 text-lg font-semibold">Recently Updated</h2>
57
55
  <div className="grid gap-3">
58
56
  {recentDocs.map((doc) => (
59
57
  <DocCard key={`${doc.category}/${doc.slug}`} doc={doc} />
@@ -7,19 +7,27 @@ interface Crumb {
7
7
 
8
8
  export default function Breadcrumbs({ crumbs }: { crumbs: Crumb[] }) {
9
9
  return (
10
- <nav className="flex items-center gap-2 text-sm text-gray-500 dark:text-gray-400 mb-4">
11
- <Link href="/" className="hover:text-blue-600 dark:hover:text-blue-400">
10
+ <nav className="mb-4 flex items-center gap-2 text-sm text-slate-500 dark:text-slate-400">
11
+ <Link
12
+ href="/"
13
+ className="hover:text-violet-600 dark:hover:text-violet-400"
14
+ >
12
15
  Home
13
16
  </Link>
14
17
  {crumbs.map((crumb, i) => (
15
18
  <span key={i} className="flex items-center gap-2">
16
19
  <span>/</span>
17
20
  {crumb.href ? (
18
- <Link href={crumb.href} className="hover:text-blue-600 dark:hover:text-blue-400 capitalize">
21
+ <Link
22
+ href={crumb.href}
23
+ className="capitalize hover:text-violet-600 dark:hover:text-violet-400"
24
+ >
19
25
  {crumb.label}
20
26
  </Link>
21
27
  ) : (
22
- <span className="text-gray-700 dark:text-gray-300">{crumb.label}</span>
28
+ <span className="text-slate-700 dark:text-slate-300">
29
+ {crumb.label}
30
+ </span>
23
31
  )}
24
32
  </span>
25
33
  ))}
@@ -1,32 +1,50 @@
1
+ "use client";
2
+
1
3
  import Link from "next/link";
4
+ import { useRouter } from "next/navigation";
2
5
  import TagBadge from "./TagBadge";
3
6
  import type { DocMeta } from "@/lib/types";
4
7
 
5
8
  export default function DocCard({ doc }: { doc: DocMeta }) {
9
+ const router = useRouter();
10
+ const href = `/${doc.category}/${doc.slug}/`;
11
+
6
12
  return (
7
- <Link
8
- href={`/${doc.category}/${doc.slug}/`}
9
- className="block p-4 rounded-lg border border-gray-200 dark:border-gray-700 hover:border-blue-300 dark:hover:border-blue-600 hover:shadow-sm transition-all bg-white dark:bg-gray-800/50"
13
+ <div
14
+ role="link"
15
+ tabIndex={0}
16
+ onClick={() => router.push(href)}
17
+ onKeyDown={(e) => {
18
+ if (e.key === "Enter") router.push(href);
19
+ }}
20
+ className="dark:bg-navy-800/50 block cursor-pointer rounded-lg border border-slate-200 bg-white p-4 transition-all hover:border-violet-400/50 dark:border-[#a0a0a01c] dark:hover:border-violet-400/50"
10
21
  >
11
- <h3 className="font-semibold text-gray-900 dark:text-gray-100 mb-1">
12
- {doc.frontmatter.title}
22
+ <h3 className="mb-1 font-semibold text-slate-900 dark:text-slate-100">
23
+ <Link href={href} className="hover:underline">
24
+ {doc.frontmatter.title}
25
+ </Link>
13
26
  </h3>
14
- <p className="text-sm text-gray-500 dark:text-gray-400 mb-2 line-clamp-2">
27
+ <p className="mb-2 line-clamp-2 text-sm text-slate-500 dark:text-slate-400">
15
28
  {doc.excerpt}
16
29
  </p>
17
30
  <div className="flex items-center justify-between">
18
- <div className="flex gap-1 flex-wrap">
31
+ <div
32
+ className="flex flex-wrap items-center gap-2"
33
+ onClick={(e) => e.stopPropagation()}
34
+ >
19
35
  {doc.frontmatter.tags.slice(0, 3).map((tag) => (
20
36
  <TagBadge key={tag} tag={tag} />
21
37
  ))}
22
38
  {doc.frontmatter.tags.length > 3 && (
23
- <span className="text-xs text-gray-400">+{doc.frontmatter.tags.length - 3}</span>
39
+ <span className="text-xs text-slate-400">
40
+ +{doc.frontmatter.tags.length - 3}
41
+ </span>
24
42
  )}
25
43
  </div>
26
- <span className="text-xs text-gray-400">
44
+ <span className="text-xs text-slate-400">
27
45
  {doc.frontmatter.updated || doc.frontmatter.created}
28
46
  </span>
29
47
  </div>
30
- </Link>
48
+ </div>
31
49
  );
32
50
  }
@@ -1,11 +1,15 @@
1
1
  import ReactMarkdown from "react-markdown";
2
2
  import remarkGfm from "remark-gfm";
3
3
  import rehypeHighlight from "rehype-highlight";
4
+ import rehypeSlug from "rehype-slug";
4
5
 
5
6
  export default function MarkdownRenderer({ content }: { content: string }) {
6
7
  return (
7
- <div className="prose prose-gray dark:prose-invert max-w-none prose-headings:scroll-mt-20 prose-a:text-blue-600 dark:prose-a:text-blue-400 prose-code:before:content-none prose-code:after:content-none">
8
- <ReactMarkdown remarkPlugins={[remarkGfm]} rehypePlugins={[rehypeHighlight]}>
8
+ <div className="prose prose-slate prose-headings:scroll-mt-20 prose-a:text-link prose-code:before:content-none prose-code:after:content-none dark:prose-invert dark:prose-a:text-link max-w-none">
9
+ <ReactMarkdown
10
+ remarkPlugins={[remarkGfm]}
11
+ rehypePlugins={[rehypeHighlight, rehypeSlug]}
12
+ >
9
13
  {content}
10
14
  </ReactMarkdown>
11
15
  </div>