我做的前端友好的股票行情 SDK,被阮一峰的科技爱好者周刊收录了
给 stock-sdk 接了个 AI 大脑:MCP + Skills 玩法全解
kline-charts-react:我写了个 React K 线图组件
我用 stock-sdk 做了一个纯前端的 A 股看板
我写了个“能少写点代码”的汇率 SDK:Exchange Rate SDK
从单文件到可扩展:我给 stock-sdk 做的一次架构升级
stock-sdk:为前端设计的股票行情 SDK
React 源码深潜(五):Memoization 双子星与 Suspense 的悬停魔法
React 源码深潜(四):并发模式与 useTransition 的"时间魔法"
React 源码深潜(三):Hooks 的幻术——闭包快照与链表存储
`],{type:"text/html;charset=utf-8"});let e=URL.createObjectURL(r);window.open(e,"_blank","noopener"),setTimeout(()=>URL.revokeObjectURL(e),3e4)}},o=r=>{let e=r.querySelector(".mermaid-open-btn");e||((e=document.createElement("button")).type="button",e.className="mermaid-open-btn",r.appendChild(e)),e.innerHTML='',e.__mermaidViewerBound||(e.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();var t,e=r.__mermaidOriginalSvg||r.querySelector("svg");e&&(t=r.__mermaidInitViewBox,n({source:e,initViewBox:t}))}),e.__mermaidViewerBound=!0)},u=(e,t,r,i)=>{var n=e[2]*t;return[r-(r-e[0])*t,i-(i-e[1])*t,n,e[3]*t]},d=d=>{let m=d.querySelector("svg");if(m){var e=l(m);if(d.__mermaidInitViewBox=e,d.__mermaidCurViewBox=e.slice(),r(m,e),!d.__mermaidGestureBound){d.__mermaidGestureBound=!0;let n=(e,t)=>{var r=m.getBoundingClientRect(),i=d.__mermaidCurViewBox||l(m);return{x:i[0]+(e-r.left)*(i[2]/r.width),y:i[1]+i[3]/r.height*(t-r.top),rect:r,vb:i}},a={pointers:new Map,startVb:null,startDist:0,startCenter:null},t=e=>{var t=d.__mermaidInitViewBox||e,r=.1*t[2],i=10*t[2],n=.1*t[3],t=10*t[3];return e[2]=s(e[2],r,i),e[3]=s(e[3],n,t),e},o=e=>{e=t(e),d.__mermaidCurViewBox=e,r(m,e)};e=e=>{a.pointers.delete(e.pointerId),0===a.pointers.size?(a.startVb=null,a.startDist=0,a.startCenter=null,d.__mermaidLastSinglePointer=null):1===a.pointers.size&&(d.__mermaidLastSinglePointer=[...a.pointers.values()][0])};m.addEventListener("pointerdown",e=>{var t,r;"mouse"===e.pointerType&&0!==e.button||(m.setPointerCapture(e.pointerId),a.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),1===a.pointers.size?a.startVb=(d.__mermaidCurViewBox||l(m)).slice():2===a.pointers.size&&(t=(e=[...a.pointers.values()])[0].x-e[1].x,r=e[0].y-e[1].y,a.startDist=Math.hypot(t,r),a.startVb=(d.__mermaidCurViewBox||l(m)).slice(),a.startCenter={x:(e[0].x+e[1].x)/2,y:(e[0].y+e[1].y)/2}))}),m.addEventListener("pointermove",e=>{var t,r,i;a.pointers.has(e.pointerId)&&(a.pointers.set(e.pointerId,{x:e.clientX,y:e.clientY}),1===a.pointers.size&&a.startVb?(r=[...a.pointers.values()][0],e.clientX,e=d.__mermaidLastSinglePointer||r,i=r.x-e.x,e=r.y-e.y,r=(d.__mermaidLastSinglePointer=r,n(r.x,r.y)).rect,t=i*((i=(d.__mermaidCurViewBox||l(m)).slice())[2]/r.width),e=e*(i[3]/r.height),o([i[0]-t,i[1]-e,i[2],i[3]])):2===a.pointers.size&&a.startVb&&0{e.preventDefault();var t=0{var e=d.__mermaidInitViewBox;e&&(d.__mermaidCurViewBox=e.slice(),r(m,e))})}}};var e=()=>{var e;0!==(e=document.querySelectorAll("pre > code.mermaid")).length&&e.forEach(e=>{var t=document.createElement("pre"),r=(t.className="mermaid-src",t.hidden=!0,t.textContent=e.textContent,document.createElement("div"));r.className="mermaid-wrap",r.appendChild(t),e.parentNode.replaceWith(r)});let t=document.querySelectorAll("#article-container .mermaid-wrap");0!==t.length&&(e=()=>(e=>{window.loadMermaid=!0;let a="dark"===document.documentElement.getAttribute("data-theme")?"dark":"default";e.forEach((t,e)=>{let r=t.firstElementChild;var i=t.querySelector("svg"),i=(i&&i.remove(),t.__mermaidGestureBound=!1,r.dataset.config?JSON.parse(r.dataset.config):{}),i=(i.theme||(i.theme=a),`%%{init: ${JSON.stringify(i)}}%% `),i=i+r.textContent,e=mermaid.render("mermaid-"+e,i);let n=e=>{r.insertAdjacentHTML("afterend",e),d(t),t.__mermaidOriginalSvg=e,o(t)};"string"==typeof e?n(e):e.then(({svg:e})=>n(e))})})(t),btf.addGlobalFn("themeChange",e,"mermaid"),window.loadMermaid?e():btf.getScript("https://cdn.jsdelivr.net/npm/mermaid@11.12.2/dist/mermaid.min.js").then(e))};btf.addGlobalFn("encrypt",e,"mermaid"),window.pjax?e():document.addEventListener("DOMContentLoaded",e)})()