1import{B as e,F as t,G as n,N as r,R as i,T as a,V as o,_ as s,b as c,c as l,f as u,h as d,i as f,k as p,l as m,m as h,o as g,s as _,u as v,v as y,w as b,x as ee,y as x}from"./dist-CmufyXml.js";var S=Object.defineProperty,C=(e,t)=>{let n={};for(var r in e)S(n,r,{get:e[r],enumerable:!0});return t||S(n,Symbol.toStringTag,{value:`Module`}),n},te=C({meta:()=>ne}),ne={slug:`fontra-101`,date:{initial:{date:`2026-05-09`},updated:{"1.1":{date:`2026-05-11`,en:`Finished kerning section`,es:`Terminada la sección de kerning`}}},tags:[`typography`,`design`]},re=C({meta:()=>ie}),ie={slug:`letter-to-perfectionists`,date:{initial:{date:`2026-07-11`}},tags:[`cringe`]},ae=C({meta:()=>oe}),oe={slug:`what-is-design`,date:{initial:{date:`2026-08-11`}},tags:[`design`,`cringe`]},se=C({meta:()=>ce}),ce={slug:`instrument-for-thought`,date:{initial:{en:`Started`,date:`2026-08-17`},updated:{"1.0":{date:`2026-09-25`},"1.1":{date:`2026-09-25`,en:`Made my callout a bit less long winded, fixed credit in footnote #1`}}},tags:[`design`]},w=e=>e.children,T=(e,t)=>typeof e==`string`?p(f,{...t,component:e}):p(e,t??{}),E=T,le=c(`<button><span class="*:shrink-0 font-600 invisible h-0"aria-hidden=true></span><span class="*:shrink-0 group-active/b:scale-98 group-active/p:[font-stretch:75%]">`),D=e=>{let[t,r]=n(e,[`variant`,`size`,`shape`,`disabled`,`onclick`,`children`]),a=()=>t.variant??`regular`,o=()=>t.size??`adaptive`,s=()=>t.shape??`rounded-rect`,c=()=>t.disabled??!1,l=e=>{if(c()){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();return}t.onclick?.(e)};return(()=>{var e=m(le),n=e.firstChild,d=n.nextSibling;return y(e,i(r,{get"data-variant"(){return a()},get"data-size"(){return o()},get"data-shape"(){return s()},get disabled(){return c()},onclick:l,class:`uno-lwuarh group/b transition-font-weight,font-stretch,transform,shadow,padding text-size-body`}),!1,!0),u(n,()=>t.children),u(d,()=>t.children),h(),e})()},ue=c(`<span class="inline-flex align-middle">`),O=e=>(()=>{var t=m(ue);return u(t,()=>e.children),t})(),de=c(`<span>`),fe=c(`<span role=button tabindex=0><span class="h-0.8em transition-transform,filter,opacity spring-duration-300 spring-bounce-50 scale-50 [filter:blur(1px)] group-hover/orb:scale-100 group-hover/orb:[filter:none] group-[:not(:hover)]/orb:delay-100 text-shadow text-shadow-color-hazel-800/10 dark:text-shadow-color-mauve-800/50">`),pe=c(`<div>`),me=c(`<section class="flex flex-col gap-2"><h3 class="text-sm text-hazel-500 dark:text-mauve-500"></h3><div class="flex flex-wrap gap-x-8 gap-y-6">`),he=c(`<div class="flex items-center text-xl leading-none text-black dark:text-mauve-50"><!$><!/><span class="flex items-center justify-center text-center size-1.5em"><p></p></span><!$><!/>`),ge={1:`bg-pink-500 bg-sine bg-sine-to-pink-600 dark:bg-pink-700 dark:bg-sine-to-pink-800`,2:`bg-indigo-500 bg-sine bg-sine-to-indigo-600 dark:bg-indigo-700 dark:bg-sine-to-indigo-800`,3:`bg-sky-500 bg-sine bg-sine-to-sky-600 dark:bg-sky-700 dark:bg-sine-to-sky-800`,4:`bg-teal-500 bg-sine bg-sine-to-teal-600 dark:bg-teal-700 dark:bg-sine-to-teal-800`,5:`bg-lime-500 bg-sine bg-sine-to-lime-600 dark:bg-lime-700 dark:bg-sine-to-lime-800`,6:`bg-amber-500 bg-sine bg-sine-to-amber-600 dark:bg-amber-700 dark:bg-sine-to-amber-800`,"*":`bg-hazel-500 bg-sine bg-sine-to-hazel-600 dark:bg-mauve-500 dark:bg-sine-to-mauve-600`},k={1:`1`,2:`2`,3:`3`,4:`4`,5:`5`,6:`6`,"*":`*`},A={en:{diagonals:`Diagonals`,shortVerticalStems:`Short vertical stems`,tallVerticalStems:`Tall vertical stems`,rounded:`Rounded`,irregulars:`Irregulars`},es:{diagonals:`Diagonales`,shortVerticalStems:`Astas verticales bajas`,tallVerticalStems:`Astas verticales altas`,rounded:`Redondeadas`,irregulars:`Irregulares`}},j=e=>(()=>{var t=m(de);return u(t,()=>k[e.for]),r(()=>_(t,` 2 ${ge[e.for]} 3 inline-grid place-items-center 4 size-6 rounded-full 5 text-base font-700 leading-none text-white 6 7 select-none 8 9 bg-sine-from-transparent 10 11 [font-variant-numeric:tabular-nums] 12 align-middle 13 14 text-shadow 15 16 text-shadow-color-hazel-800/10 17 dark:text-shadow-color-mauve-800/50 18 `)),t})(),M=e=>
18{let n=A[e.locale]??A.en,i={[n.diagonals]:{v:[4,4],w:[4,4],x:[4,4],y:[4,4]},[n.shortVerticalStems]:{r:[1,4],m:[1,2],j:[1,1],u:[2,2],i:[3,1]},[n.tallVerticalStems]:{b:[1,5],p:[3,5],k:[3,4],l:[3,2],h:[3,2]},[n.rounded]:{c:[5,6],e:[5,6],q:[5,1],d:[5,1]},[n.irregulars]:{g:[`*`,`*`],a:[`*`,`*`],s:[`*`,`*`],z:[`*`,`*`],f:[`*`,`*`],t:[`*`,`*`]}},[a,o]=t(),[s,c]=t(),l=(e,t)=>{o(t),c(e)},f=()=>{o(),c()},y=e=>(()=>{var t=m(fe),n=t.firstChild;return t.$$keydown=t=>{if(t.key===`Escape`){f();return}(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),l(e.id,e.value))},t.addEventListener(`blur`,f),t.addEventListener(`focus`,()=>l(e.id,e.value)),t.$$click=()=>l(e.id,e.value),t.addEventListener(`mouseleave`,f),t.addEventListener(`mouseenter`,()=>l(e.id,e.value)),u(n,()=>k[e.value]),r(r=>{var i=` 19 ${ge[e.value]} 20 21 group/orb 22 23 relative grid place-items-center 24 25 26 before:content-empty before:absolute before:inset-0 before:scale-150 before:transition-transform before:delay-100 before:[will-change:transform] before:transform-gpu before:rounded-full 27 28 size-3 rounded-full 29 text-[0.65rem] font-700 leading-none text-white 30 31 bg-sine bg-sine-from-transparent 32 33 spring-bounce-50 spring-duration-300 34 transition-transform,opacity 35 [will-change:transform] 36 transform-gpu 37 38 [font-variant-numeric:tabular-nums] 39 `,o={"scale-200 opacity-100":s()===e.id,"before:scale-200":s()===e.id,"before:scale-300":s()!==e.id,"opacity-50 delay-100 spring-bounce-0 spring-duration-500":s()!==e.id&&a()===e.value,"opacity-20 delay-100":a()===void 0,"opacity-0 spring-bounce-0 spring-duration-100":a()!==void 0&&a()!==e.value},c=`Tracy spacing ${k[e.value]}`,l=s()===e.id,u=s()!==e.id;return i!==r.e&&_(t,r.e=i),r.t=g(t,o,r.t),c!==r.a&&d(t,`aria-label`,r.a=c),l!==r.o&&d(t,`aria-pressed`,r.o=l),u!==r.i&&n.classList.toggle(`opacity-0`,r.i=u),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),h(),t})();return(()=>{var t=m(pe);return u(t,p(b,{get each(){return Object.entries(i)},children:([e,t])=>(()=>{var n=m(me),r=n.firstChild,i=r.nextSibling;return u(r,e),u(i,p(b,{get each(){return Object.entries(t)},children:([e,t])=>(()=>{var n=m(he),r=n.firstChild,[i,a]=v(r.nextSibling),o=i.nextSibling,s=o.firstChild,c=o.nextSibling,[l,d]=v(c.nextSibling);return u(n,p(y,{id:`${e}-left`,get value(){return t[0]}}),i,a),u(s,e),u(n,p(y,{id:`${e}-right`,get value(){return t[1]}}),l,d),n})()})),n})()})),r(()=>_(t,` 40 not-prose 41 pm-block 42 43 select-none 44 45 w-full corner-radius-12 46 corner-shape-superellipse-2 47 48 text-base text-[--prose-body] 49 [&_p]:my-2 50 51 bg-hazel-100 dark:bg-mauve-900 52 53 p-5 py-4.5 54 my-[--track-prose-margin] 55 56 col-content-bleed 57 58 59 flex flex-col gap-y-8 60 61 ${e.class} 62 `)),t})()};l([`click`,`keydown`]);var _e=c(`<aside class="col-aside text-body line-height-160% text-hazel-500 dark:text-mauve-500 px-5 py-2 md:p-0 my-0"style=grid-row:2>`),ve=c(`<div class="not-prose pm-block w-full text-base text-[--prose-body] [&_p]:my-2 my-[--track-prose-margin] r-sub"><!$><!/><!$><!/>`),ye=c(`<h3 class="mt-4 mb-2 first:mt-0 text-sm text-hazel-500 dark:text-mauve-500 select-none">`),be=c(`<div class="col-content-bleed flex flex-col gap-2 corner-radius-8 md:corner-radius-12 corner-shape-superellipse-2 bg-hazel-100 dark:bg-mauve-900 p-5 py-4.5 mb-2 last:mb-0"><div class="grid grid-cols-[0.25fr_1fr] gap-x-5 gap-y-4 items-start">`),xe=c(`<h4 class="text-body mt-0.75rem line-height-120% text-hazel-500 dark:text-mauve-500 select-none">`),Se=c(`<div class="flex flex-wrap gap-2">`),Ce=c(`<span class="relative grid place-items-center size-3rem rounded-full text-xl leading-none text-black dark:text-mauve-50"><!$><!/><!$><!/>`),we=c(`<span class="absolute right-1 top-1 -translate-y-1/3 translate-x-1/3 cursor-help text-xs leading-none text-red-700/50 dark:text-red-300/50 select-none">*`),N={en:{sides:{left:`Left side`,right:`Right side`},left:{verticals:`Verticals`,rounded:`Rounded`,diagonals:`Diagonals`},right:{verticals:`Verticals`,rounded:`Rounded`,diagonals:`Diagonals`,arches:`Arches`,diagonalsDesc:`Diagonals (desc)`},special:`Special cases`}
62,es:{sides:{left:`Lado izquierdo`,right:`Lado derecho`},left:{verticals:`Verticales`,rounded:`Redondeados`,diagonals:`Diagonales`},right:{verticals:`Verticales`,rounded:`Redondeados`,diagonals:`Diagonales`,arches:`Con arcos`,diagonalsDesc:`Diagonales (desc)`},special:`Casos especiales`}},Te=[`left`,`right`],P=e=>{let t=N[e.locale]??N.en,n={left:{verticals:{b:`child`,i:`parent`,j:`child`,k:`child`,l:`child`,m:`child`,n:`child`,p:`child`,r:`child`,h:`child`},rounded:{c:`child`,d:`child`,e:`child`,o:`parent`,q:`child`},diagonals:{v:`parent`,w:`child`,y:`child`}},right:{verticals:{d:`child`,i:`parent`,j:`child`,l:[`child`,{en:`If your l has a looped tail, you'll have to kern it independently`,es:`Si tu l tiene un bucle, tendrás que hacer su kerning de forma independiente.`}],q:`child`},rounded:{b:`child`,o:`parent`,p:`child`},diagonals:{k:`child`,x:`parent`},arches:{h:`child`,m:`child`,n:`parent`},diagonalsDesc:{v:`parent`,w:`child`,y:`child`}}},i=e=>Array.isArray(e)?e[0]:e,o=t=>Array.isArray(t)?t[1][e.locale]??t[1].en:void 0;return(()=>{var s=m(ve),c=s.firstChild,[l,f]=v(c.nextSibling),h=l.nextSibling,[_,y]=v(h.nextSibling);return u(s,p(b,{each:Te,children:e=>{let a=n[e];return[(()=>{var n=m(ye);return u(n,()=>t.sides[e]),n})(),(()=>{var n=m(be),s=n.firstChild;return u(s,p(b,{get each(){return Object.entries(a)},children:([n,a])=>[(()=>{var r=m(xe);return u(r,()=>t[e][n]),r})(),(()=>{var e=m(Se);return u(e,p(b,{get each(){return Object.entries(a)},children:([e,t])=>{let n=i(t),a=o(t);return(()=>{var t=m(Ce),i=t.firstChild,[o,s]=v(i.nextSibling),c=o.nextSibling,[l,f]=v(c.nextSibling);return u(t,e,o,s),u(t,a&&(()=>{var e=m(we);return d(e,`title`,a),e})(),l,f),r(e=>g(t,{"bg-hazel-50 dark:bg-mauve-500/10 smooth-shadow-z-1":n===`parent`},e)),t})()}})),e})()]})),n})()]}}),l,f),u(s,p(a,{get when(){return e.note},get children(){var t=m(_e);return u(t,()=>e.note),t}}),_,y),s})()},F=c(`<div>`),I={left:{soft:`inset-y-0 left-0 w-24 bg-sine-dir-r`,sharp:`inset-y-0 left-0 w-8 bg-sine-dir-r`},right:{soft:`inset-y-0 right-0 w-24 bg-sine-dir-l`,sharp:`inset-y-0 right-0 w-8 bg-sine-dir-l`},top:{soft:`inset-x-0 top-0 h-24 bg-sine-dir-b`,sharp:`inset-x-0 top-0 h-8 bg-sine-dir-b`},bottom:{soft:`inset-x-0 bottom-0 h-24 bg-sine-dir-t`,sharp:`inset-x-0 bottom-0 h-8 bg-sine-dir-t`}},Ee=Object.keys(I),L=e=>p(b,{each:Ee,children:t=>{let n=()=>e[`${t}Pct`];return p(a,{get when(){return n()!==void 0},get children(){return[(()=>{var i=m(F);return r(r=>{var a=` 63 pointer-events-none absolute z-2 64 bg-sine-from-hazel-100/90 dark:bg-sine-from-mauve-900/90 65 bg-sine-to-transparent 66 ${I[t].soft} 67 `,o={...e.style,opacity:n()/100};return a!==r.e&&_(i,r.e=a),r.t=x(i,o,r.t),r},{e:void 0,t:void 0}),i})(),(()=>{var i=m(F);return r(r=>{var a=` 68 pointer-events-none absolute z-2 69 bg-sine-from-hazel-100/50 dark:bg-sine-from-mauve-900/50 70 bg-sine-to-transparent 71 ${I[t].sharp} 72 `,o={...e.style,"--sine-bg-to-pct":`${Math.max(50,n())}%`,opacity:n()/10};return a!==r.e&&_(i,r.e=a),r.t=x(i,o,r.t),r},{e:void 0,t:void 0}),i})()]}})}}),De=e=>1-Math.cos(e*Math.PI/2),R=n=>{let{element:r,size:i=48}=n,[a,s]=t(0),[c,l]=t(0),[u,d]=t(0),[f,p]=t(0),[m,h]=t(0),[g,_]=t(0),[v,y]=t(0),[b,ee]=t(0),x=0,S=e=>De(Math.min(1,Math.max(0,e/i)))*100,C=()=>{x||=requestAnimationFrame(()=>{x=0;let e=r();if(!e)return;let t=e.scrollWidth-e.clientWidth,n=e.scrollHeight-e.clientHeight;s(S(e.scrollLeft)),l(S(t-e.scrollLeft)),d(S(e.scrollTop)),p(S(n-e.scrollTop)),h(e.offsetWidth-e.clientWidth),_(e.offsetHeight-e.clientHeight),y(e.clientWidth),ee(e.clientHeight)})};return o(()=>{let t=r();if(!t)return;C(),t.addEventListener(`scroll`,C,{passive:!0});let n=new ResizeObserver(C);n.observe(t),n.observe(t.firstElementChild??t),e(()=>{t.removeEventListener(`scroll`,C),n.disconnect(),cancelAnimationFrame(x)})}),{leftPct:a,rightPct:c,topPct:u,bottomPct:f,scrollbarWidth:m,scrollbarHeight:g,viewportWidth:v,viewportHeight:b,update:C}},Oe=c(`<div class="not-prose overflow-clip relative group/code w-full corner-radius-12 corner-shape-superellipse-2 bg-hazel-100 dar
72k:bg-mauve-900"style="grid-column:main-track-l-gutter-edge / -1"><div class="flex h-28 items-stretch gap-2 overflow-x-auto py-5"></div><!$><!/>`),ke=c(`<div class="relative grid shrink-0 place-items-center overflow-clip text-sm [font-variant-numeric:tabular-nums] select-none bg-hazel-150 dark:bg-mauve-800 bg-sine-from-hazel-200 dark:bg-sine-from-mauve-750 bg-sine-to-hazel-150 dark:bg-sine-to-mauve-800 bg-sine -bg-sine-dir-4 corner-radius-3 corner-shape-superellipse-2 smooth-shadow-z-1 smooth-shadow-inner smooth-shadow-color-from-hazel-a-1000 smooth-shadow-color-to-hazel-a-900 dark:smooth-shadow-color-mauve-1000 first:ml-5 last:mr-5"><span class="relative z-1 text-[--prose-body]">`),z={minWeight:50,maxWeight:900,minStroke:27,maxStroke:207,curvature:1/Math.sqrt(2)},Ae=[50,100,200,300,400,500,600,700,800,900],B=(e,{minWeight:t,maxWeight:n,minStroke:r,maxStroke:i,curvature:a=1})=>r*(i/r)**Math.min(1,Math.max(0,(e-t)/(n-t)))**a,je=B(z.maxWeight,z),V=()=>{let e,t=R({element:()=>e});return(()=>{var n=m(Oe),i=n.firstChild,a=i.nextSibling,[o,c]=v(a.nextSibling),l=e;return typeof l==`function`?ee(l,i):e=i,u(i,p(b,{each:Ae,children:e=>{let t=B(e,z),n=t/je*100;return(()=>{var i=m(ke),a=i.firstChild;return s(i,`width`,`${t}px`),u(a,e),r(r=>{var a=`${Math.max(0,n-.1)}%`,o=`${Math.min(100,n+.1)}%`,c=`${e}: ${Math.round(t)} units`;return a!==r.e&&s(i,`--sine-bg-from-pct`,r.e=a),o!==r.t&&s(i,`--sine-bg-to-pct`,r.t=o),c!==r.a&&d(i,`title`,r.a=c),r},{e:void 0,t:void 0,a:void 0}),i})()}})),u(n,p(L,{get leftPct(){return t.leftPct()},get rightPct(){return t.rightPct()}}),o,c),n})()},H=`/assets/4TFbEH9I.svg`,Me={sources:[{srcset:`/assets/CVhHYr4a.svg`,media:`(prefers-color-scheme: dark)`},{srcset:H}],img:{src:H,w:1300,h:400}},Ne={sources:{},img:{src:`/assets/CeOpvcyL.webp`,w:900,h:600}},Pe={sources:{},img:{src:`/assets/CFi0Cr6W.webp`,w:911,h:751}},Fe={sources:{},img:{src:`/assets/DhIktYSp.webp`,w:961,h:819}},Ie={src:`/assets/BPQo8Y3-.svg`,width:3840,height:1049},Le={sources:{},img:{src:`/assets/Bkbbqe7T.webp`,w:940,h:479}},Re={sources:{},img:{src:`/assets/BuWNzFhL.webp`,w:961,h:701}},ze={sources:{},img:{src:`/assets/eYwxzxhz.webp`,w:1508,h:981}},Be={sources:{},img:{src:`/assets/Dt7UdRxX.webp`,w:981,h:980}},Ve={sources:{},img:{src:`/assets/CtzUPJTe.webp`,w:1001,h:1005}},He={sources:{},img:{src:`/assets/fN51G3X-.webp`,w:1001,h:1005}},Ue={sources:{},img:{src:`/assets/BSVDWUbT.webp`,w:1001,h:1005}},We={sources:{},img:{src:`/assets/QQ3Ox6BH.webp`,w:1001,h:1005}},U={sources:{},img:{src:`/assets/BIfvp9k9.webp`,w:1001,h:1005}},Ge={sources:{},img:{src:`/assets/DKgmYf5V.webp`,w:1001,h:1005}},Ke={sources:{},img:{src:`/assets/Dj4qjqKD.webp`,w:1001,h:1005}},qe={sources:{},img:{src:`/assets/bbH696VE.webp`,w:1001,h:1005}},Je={sources:{},img:{src:`/assets/HV939rGB.webp`,w:1001,h:1005}},Ye={sources:{},img:{src:`/assets/1QamJX10.webp`,w:1001,h:1005}},Xe={sources:{},img:{src:`/assets/BBTrQwHa.webp`,w:1001,h:1005}},Ze={sources:{},img:{src:`/assets/Czy_qnAv.webp`,w:1001,h:1005}},Qe={sources:{},img:{src:`/assets/C91AkR6Q.webp`,w:1001,h:1005}},$e={sources:{},img:{src:`/assets/BBceHaqV.webp`,w:1698,h:869}},et={sources:{},img:{src:`/assets/CasUhjtI.webp`,w:1465,h:867}},tt={sources:{},img:{src:`/assets/v0YTjZPu.webp`,w:1465,h:867}},nt={sources:{},img:{src:`/assets/CGJQNuV5.webp`,w:1414,h:875}},rt={sources:{},img:{src:`/assets/C0dhPDjf.webp`,w:1414,h:875}},it=C({arrowForward:()=>W,default:()=>ut,license:()=>ot,metadata:()=>at,plusButton:()=>st,toc:()=>ct}),at={title:`Making your own fonts with Fontra`},ot=`CC-BY-SA`,W=()=>T(O,{children:T(`span`,{class:`i-md:arrow-forward`})}),st=()=>T(O,{children:T(D,{size:`xs`,onclick:()=>window.alert(`Not this one, the one in Fontra ð`),children:T(`span`,{class:`i-md:add-2`})})}),ct=[{depth:1,id:`creating-a-typeface`,text:`Creating a typeface`},{depth:1,id:`adding-glyph-sets`,text:`Adding glyph sets`},{depth:1,id:`line-metrics`,text:`Line metrics`},{depth:2,id:`compensating-for-optical-illusions`,text:`Compensating for optical illusions`},{depth:1,id:`drawing-our-first-glyph-in-fontra`,text:`Drawing our first glyph in Fontra`},{depth:1,id:`side-bearings`,text:`Side bearings`},{depth:1,id:`kerning`,text:`Kerning`}
72,{depth:2,id:`kerning-classes`,text:`Kerning classes`},{depth:1,id:`interpolation-curves`,text:`Interpolation curves`},{depth:1,id:`further-reading`,text:`Further reading`}];function lt(e){let t={a:`a`,code:`code`,em:`em`,figure:`figure`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,...e.components},{Figure:n,Kbd:r,SideNote:i,Table:a}=t;return n||G(`Figure`,!0),r||G(`Kbd`,!0),i||G(`SideNote`,!0),a||G(`Table`,!0),E(w,{children:[T(t.p,{children:`I've been working on a custom typeface called Zephyr Sans on and off for about a year. 73It attempts to be a fresh take on the vibes from KDE's Breeze icons and the old Oxygen Sans family.`}),` 74`,` 75`,T(n,{wide:!0,src:Me,alt:`A sample with all four currently available weights`,loading:`eager`,fetchpriority:`high`,preload:!0}),` 76`,T(t.p,{children:`It took a decent amount of research to get this far, and I still consider myself a bit of a noob. But I can try to smooth the bumps for you if you want to do a similar project.`}),` 77`,T(t.p,{children:`As you can probably guess, we'll be using Fontra, an open-source editor that works in all the usual places.`}),` 78`,T(t.h1,{id:`creating-a-typeface`,children:`Creating a typeface`}),` 79`,E(t.p,{children:[`First off, we install FontraPak from `,T(t.a,{href:`https://fontra.xyz`,children:`fontra.xyz`}),`, which runs both the server and client locally on your computer.`]}),` 80`,T(t.p,{children:`The client/server split allows you to have Figma-style real-time collaboration, but we don't really care about that at the moment.`}),` 81`,T(t.p,{children:`Once opened, a window like the following will appear:`}),` 82`,T(n,{title:`FontraPak window`,src:Ne}),` 83`,E(t.p,{children:[`Click on `,T(t.strong,{children:`New Font`}),` on the top left. You'll see multiple formats (Designspace, Fontra, RoboCJK and UFO). Pick `,T(t.strong,{children:`Designspace`}),`.`]}),` 84`,E(t.p,{children:[`UFO is the standard app-independent format for a single font (folders like `,T(t.code,{children:`MyFont_Light.ufo`}),`, `,T(t.code,{children:`MyFont_Regular.ufo`}),` and so on).`]}),` 85`,E(t.p,{children:[`Designspace is a folder of UFOs (plus a `,T(t.code,{children:`.designspace`}),` XML file) that combines those fonts into the single typeface. By picking Designspace you're both future proofing your font in case you ever want to scale it up, while still allowing for other potential contributors to use their preferred editor like Glyphs, RoboFont, FontLab etc. which may have advanced features like plugins, curvature combs and non-Latin language support.`]}),` 86`,T(t.p,{children:`You should see a page like the following open up in your browser:`}),` 87`,T(n,{title:`Empty glyph grid view`,src:Pe}),` 88`,T(t.h1,{id:`adding-glyph-sets`,children:`Adding glyph sets`}),` 89`,T(t.p,{children:`Glyph sets are a way to specify which characters you plan on supporting on your typeface. You can pick a standardized glyph set from an existing collection like the one from Google Fonts.`}),` 90`,` 91`,E(t.p,{children:[`See the sidebar on the left? Click on the `,st(),` button to the right of Project glyph sets. Select the `,T(t.strong,{children:`Google Fonts`}),` collection and check `,T(t.strong,{children:`GF Latin Kernel`}),` for now, then save.`]}),` 92`,T(n,{src:Fe,alt:`Glyph set view`,children:T(t.p,{children:`You'll now see the coverage on your font, with light gray cards containing a preview for existing glyphs.`})}),` 93`,T(t.h1,{id:`line-metrics`,children:`Line metrics`}),` 94`,T(t.p,{children:`Before we start drawing any glyphs, we need to think about the anatomy of the font we want to make.`}),` 95`,T(n,{src:Ie,alt:`Line metrics diagram`,wide:!0}),` 96`,T(t.p,{children:`A default Fontra Designspace project has 1000 units per em but you may come across 1024, 2000 or 2048 sometimes. 97Variable fonts generally speaking need a higher UPM.`}),` 98`,T(t.p,{children:`While the format itself is vector based, the nodes snap unit by unit based on this resolution as if it were pixel based.`}),` 99`,E(t.p,{children:[`Now out of these 1000 vertical units we have to pick how many go to each section. 100Get some paper out and sketch a bit. Draw enough glyphs to figure out the proportions for the `,T(t.strong,{children:`ascender`}),`, `,T(t.strong,{children:`x-height`}),` and `,T(t.strong,{children:`descender`}),`. Then try to retroactively give it sizes by literally measuring on paper and rounding.`]}),` 101`,T(n,{src:Le,alt:`Glyph sketches`,children:T(t.p,{children:`You can probably tell I drew this sketch before I learned all of this.`})}),` 102`,E(t.p,{children:[`In this case I chose to make the `,T(r,{children:`a`}),` double-storey and based my measurements around where the bowl and the hook meet.`]}),` 103`,T(t.p,{children:`Cap height should be derived from the x-height. Body fonts (those used for long-form text at small sizes) should sit between 65% and 75% cap he
103ight to x-height ratio.`}),` 104`,T(t.p,{children:`I picked as close to 75% as possible â around where Inter and Helvetica sit â as my intention for this font is to be used on user interfaces. 550/740 is â 75%, 775-550 = 225 (which matches the descender).`}),` 105`,T(n,{src:Re,alt:`Line metrics view`}),` 106`,T(t.p,{children:`The values on the left should sum up to your units per em (default to 1000), 775 + 225 = 1000.`}),` 107`,T(t.h2,{id:`compensating-for-optical-illusions`,children:`Compensating for optical illusions`}),` 108`,T(t.p,{children:`The number inputs on the right of each metric act as buffer zones for overshoots. As a rule of thumb, the smaller in size you expect the font to be used, the greater the buffer has to be.`}),` 109`,E(t.p,{children:[T(t.a,{href:`http://designwithfontforge.com/en-US/Trusting_Your_Eyes.html`,children:`Read this page`}),` to catch up to speed on this.`]}),` 110`,T(t.h1,{id:`drawing-our-first-glyph-in-fontra`,children:`Drawing our first glyph in Fontra`}),` 111`,E(t.p,{children:[`We can now start drawing our first glyphs, `,T(r,{children:`n`}),` and `,T(r,{children:`o`}),`. These will act as the base for the others.`]}),` 112`,E(t.p,{children:[`Go back to the glyph grid and double click the `,T(r,{children:`n`}),` card. 113A new editor tab will open. The UI is pretty self-explanatory so just play around with it and we'll start drawing once you come back.`]}),` 114`,T(n,{src:ze,alt:`Empty glyph editor tab`}),` 115`,T(t.p,{children:`Select the rectangle tool, and add a rectangle from x-height to baseline to make a vertical stroke. 116Unlike on editors like Figma, the selection tool (Pointer) doesn't select the entire shape by just clicking on the fill. For that, double click on the shape's path.`}),` 117`,E(t.p,{children:[`On the right sidebar, select the `,T(t.strong,{children:`Selection Transformation`}),` tab, then select a shape to see its width and height.`]}),` 118`,E(t.p,{children:[`There's also an option to see the coordinates on each selected node. It's on View `,W(),` Glyph editor appearance `,W(),` Coordinates.`]}),` 119`,T(t.p,{children:`There's also a Ruler tool that sticks and rotates along the closest edge where you click, which is pretty handy.`}),` 120`,T(n,{src:Be,alt:`Rectangle in editor`}),` 121`,T(t.p,{children:`Let's pick the pencil tool to start drawing our own shape. We'll do the shoulder now.`}),` 122`,T(n,{src:Ve,alt:`Starting shoulder`}),` 123`,E(t.p,{children:[`Hold `,T(r,{children:`Shift`}),` to lock the X or Y axis down, then draw a straight line downwards.`]}),` 124`,T(t.p,{children:`We then close this shape by drawing our way back to the initial point where we click to finish. You'll see a blue circle while hovering the node, clicking here will close the contour.`}),` 125`,T(n,{src:He,alt:`Closing shoulder`}),` 126`,T(t.p,{children:`You can also click on the middle of a line to split it with a node â you'll see the blue circle again.`}),` 127`,T(n,{src:Ue,alt:`Closed shoulder`}),` 128`,E(t.p,{children:[`Now, to make the lines curved instead of straight, hold `,T(r,{children:`Alt`}),` and click with your Pencil tool. You'll see two smaller blue circles before clicking.`]}),` 129`,T(n,{src:We,alt:`Curve indicator preview`}),` 130`,T(n,{src:U,alt:`Curve handles`}),` 131`,E(t.p,{children:[`It's better to have the same angle on either side, so hold `,T(r,{children:`Shift`}),` when moving the handles.`]}),` 132`,T(t.p,{children:`Once you're finished making all the lines curved, chances are it'll look a bit rough. That's fine for now.`}),` 133`,T(n,{src:Ge,alt:`This does not bring joy`}),` 134`,E(n,{src:Ke,alt:`Slightly better now`,children:[T(t.p,{children:`Make sure the shoulder goes up to the overshoot region.`}),T(t.p,{children:`Remember that it's rounded so it needs that compensation.`})]}),` 135`,E(t.p,{children:[`Now while having both nodes selected like in the picture, hold `,T(r,{children:`Alt`}),` and use the arrow keys to nudge the nodes left or right while keeping the curve handles where they are. Trust your eyes. Also nudge the nodes on the right side.`]}),` 136`,T(n,{src:qe,alt:`Acceptable`}),` 137`,T(t.p,{children:`Now we have to think about stroke contrast, which would be how much narrower horizontal strokes are compared to vertical ones.`}),` 138`,T(t.p,{children:`If you were to set both to, say, 80, the top side of N's shoulder would paradoxically look bolder/wider than the vertical lines on either side. This is yet another optical illusion that we need to compensate for.`}),` 139`,E(t.p,{children:[`If you want to make it `,T(t.em,{children:`visually`}),` the same, you should do about 10% less on horizontal strokes, which is what we'll do here by setting it to 72. You can make it more contrasty if you want.`]}),` 140`,T(n,{src:Je,alt:`With proper contrast`}),` 141`,T(t.p,{children:`Now we have to fix that weird hole where both shapes intersect. Why is that happening? Well, it's because of the draw direction. Notice how every shape has a node with a half circle â that's where the shape starts to be drawn. If both shapes happen to have the same direction, they will combine. If they don't, they'll c
141ancel each other out and leave a hole.`}),` 142`,E(t.p,{children:[`Best practice is to have additive shapes be drawn clockwise and subtractive ones like counters (the negative space in `,T(r,{children:`o`}),` for example) counter-clockwise.`]}),` 143`,T(t.p,{children:`The de-facto standard most seem to have converged to is setting the start point of every shape to the closest point to the bottom left. 144I've since moved to using that in my typefaces also.`}),` 145`,T(n,{src:Ye,alt:`Setting start point`,children:T(t.p,{children:`You can still set it to the top or wherever you prefer.`})}),` 146`,T(n,{src:Xe,alt:`New start point`}),` 147`,E(t.p,{children:[`We can now see more clearly the direction it's being drawn in. Change it to clockwise to make it additive. Right click `,W(),` `,T(t.strong,{children:`Reverse contour direction`}),`.`]}),` 148`,E(t.p,{children:[`You can hold `,T(r,{children:`Space`}),` to hide the editor UI, preview the glyph with a solid color, and pan around the canvas.`]}),` 149`,T(n,{src:Ze,alt:`N preview`}),` 150`,E(t.p,{children:[`Now try drawing `,T(r,{children:`o`}),` by yourself. Remember that you should do both vertical and horizontal overshoots, so it should be wider than `,T(r,{children:`n`}),` â in this case, it's about 40 units wider horizontally, according to the Dimensions section in the Glyph info panel on the right.`]}),` 151`,T(n,{src:Qe,alt:`O preview`,children:T(t.p,{children:`I did some mining off-camera because the n glyph looked rough lol.`})}),` 152`,T(t.h1,{id:`side-bearings`,children:`Side bearings`}),` 153`,E(t.p,{children:[`Notice how when we draw glyphs we reserve some space on either side of them so they don't scrape against each other. 154That space is what's called the `,T(t.strong,{children:`side bearings`}),`.`]}),` 155`,E(t.p,{children:[`A common analogy for this is `,T(t.em,{children:`volume`}),`, the liquid kind. Both the space between glyphs and the glyph's own counterform should have about the same visual volume.`]}),` 156`,E(t.p,{children:[`The gap on the right side of `,T(r,{children:`r`}),` has more space for volume than, say, `,T(r,{children:`q`}),`, so we have to take that into consideration.`]}),` 157`,E(t.p,{children:[`You `,T(t.em,{children:`could`}),` eyeball it but it's better to follow some sort of guideline to keep things consistent. One of those is the Tracy method, which we'll be using.`]}),` 158`,T(M,{locale:`en`,class:`md:-mb-3`}),` 159`,E(i,{children:[T(t.p,{children:`For simplicity's sake, we'll just do lowercase.`}),T(t.p,{children:`This grouping is based on the one in Designing Type by Karen Cheng, which you really should buy.`})]}),` 160`,E(a,{children:[T(`thead`,{children:E(`tr`,{children:[T(`th`,{class:`w-px whitespace-nowrap !pr-0`,children:T(`span`,{class:`size-5 i-md:tag ml-0.75 -mt-0.5`})}),T(`th`,{children:`Description`}),T(`th`,{children:`Units`})]})}),E(`tbody`,{class:`[&_tr_td:first-child]:!pr-0`,children:[E(`tr`,{children:[T(`td`,{children:T(j,{for:1})}),E(`td`,{children:[`Same as left side bearing of `,T(r,{children:`n`})]}),T(`td`,{children:`75`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:2})}),E(`td`,{children:[`Same as right side bearing of `,T(r,{children:`n`})]}),T(`td`,{children:`70`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:3})}),E(`td`,{children:[`Slightly more than left side bearing of `,T(r,{children:`n`})]}),T(`td`,{children:`80`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:4})}),T(`td`,{children:`Minimum side bearings`}),T(`td`,{children:`40`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:5})}),E(`td`,{children:[`Same side bearings as `,T(r,{children:`o`})]}),T(`td`,{children:`55`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:6})}),E(`td`,{children:[`Slightly less than side bearings of `,T(r,{children:`o`})]}),T(`td`,{children:`50`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:`*`})}),T(`td`,{children:`Adjusted visually by hand`}),T(`td`,{class:`!pl-5.5`,children:`â`})]})]})]}),` 161`,T(i,{children:T(t.p,{children:`These are the units I ended up picking for Zephyr. You can pick others.`})}),` 162`,E(t.p,{children:[`As I alluded to before, `,T(r,{children:`o`}),` and `,T(r,{children:`n`}),` are pretty important to nail down before we do the rest of the glyphs.
163Now we know why: we'll set by eye the units that feel nice and balanced and use those as a base.`]}),` 164`,E(t.p,{children:[`Open the Selection Info tab on the right sidebar and tweak the side bearings of `,T(r,{children:`n`}),` and `,T(r,{children:`o`}),` until you're happy with the results.`]}),` 165`,T(n,{wide:!0,src:$e,alt:`Setting start point`}),` 166`,E(t.p,{children:[`You can now draw the rest of the glyphs, then apply the sidebearings based on your own table. You can use either the text inputs highlighted on the previous image, or the tool button with `,T(r,{children:`H`}),` on it.`]}),` 167`,E(t.p,{children:[`Here's a cool trick: say you're setting the right side bearing of `,T(r,{children:`b`}),`, which would be the same value as the one in `,T(r,{children:`o`}),`. You can just set the value to `,T(r,{children:`o`}),` and Fontra will automatically translate it.`]}),` 168`,T(t.h1,{id:`kerning`,children:`Kerning`}),` 169`,T(t.p,{children:`Note: You should only start once you've completely finished setting all side bearings.`}),` 170`,E(t.p,{children:[`There are some pairs like `,T(r,{children:`r.`}),`, `,T(r,{children:`r-`}),`, `,T(r,{children:`fo`}),` and `,T(r,{children:`lt`}),` that, regardless of what you set their side bearings to, still need to be kerned by hand so that they don't end up with too little or too much space.`]}),` 171`,T(n,{src:et,title:`Before`,children:T(t.p,{children:`Anything with diagonals, tails or crossbars is awkwardly spaced.`})}),` 172`,T(n,{src:tt,title:`After a first pass`,children:T(t.p,{children:`Not perfect but acceptable`})}),` 173`,E(t.p,{children:[`Sure, we could go letter by letter and try every permutation and manually adjust it but that's too time-consuming. We'll define groups of similar shapes on either side called `,T(t.em,{children:`classes`}),`.`]}),` 174`,T(t.h2,{id:`kerning-classes`,children:`Kerning classes`}),` 175`,E(t.p,{children:[`This isn't really covered in Designing Type all that much. Probably because there's no right way to approach this. 176I found this one somewhere on the internet, and I can't seem to find where it was anymore. Only tweak to the original was adding `,T(r,{children:`d`}),` and `,T(r,{children:`q`}),` to the right side verticals, which is based on the RoboFont docs.`]}),` 177`,T(P,{locale:`en`,note:`Pick one of each to act as the parent of the group. I chose the circled ones.`}),` 178`,E(t.p,{children:[`Now, these classes can be called anything, like straight-up just `,T(t.code,{children:`verticals`}),` or `,T(t.code,{children:`diagonals-desc`}),`, but when you tweak a bunch of them it's a bit too annoying so I just use the parent letter directly.`]}),` 179`,T(t.p,{children:`The left and right classes are independent so we can set both sides to the same letter and it'll apply the right one.`}),` 180`,E(n,{src:nt,children:[E(t.p,{children:[`The letter `,T(r,{children:`y`}),` is part of the diagonals group in both left and right, where the parent is `,T(r,{children:`v`}),`.`]}),T(t.p,{children:`Go letter by letter setting the parent per side.`})]}),` 181`,T(n,{src:rt,children:E(t.p,{children:[`You can click and drag between letters to add or remove units from the pair. 182`,T(t.code,{children:`@v`}),` and `,T(t.code,{children:`@o`}),` are the class names that we've set to every letter in its group.`]})}),` 183`,E(t.p,{children:[`You can search for common kerning pairs. Don't overdo it, `,T(t.a,{href:`https://typedrawers.com/discussion/comment/52058/#Comment_52058`,children:`it's fine to not cover uncommon edge cases`}),`. There are too many permutations for you to be able to handle every single combination.`]}),` 184`,T(t.p,{children:`This is the one step that I think has the most potential to be improved further down the line. I'll be exploring ways of automating this process in later posts.`}),` 185`,T(t.h1,{id:`interpolation-curves`,children:`Interpolation curves`}),` 186`,E(t.p,{children:[`Imagine we have a type family composed of multiple weights. If we set the stem width in Regular/400 to 80 units and adjust it up and down linearly by the same step size, it wouldn't really `,T(t.em,{children:`look`}),` linear to us â we have a harder time discerning dark tones from light ones, and need exponentially more contrast the darker we go.`]}),` 187`,T(i,{children:T(t.p,{children:`See the 0.33 to 0.5 from Steven's power laws on light sensitivity, and Ebner and Fairchild's 0.43.`})}),` 188`,E(t.p,{children:[`Since strokes/form and counterform blur together into a `,T(t.em,{children:`typographic color`}),`, we have to apply this here too.`]}),` 189`,T(t.p,{children:`I don't want to get super into the weeds in this one so I'll leave some of the key details here for you to research:`}),` 190`,E(t.ul,{children:[` 191`,T(t.li,{children:T(t.a,{href:`https://www.lucasfonts.com/learn/interpolation-theory`,children:`Luc(as) de Groot interpolation theory`})}),` 192`,T(t.li,{children:T(t.a,{href:`https://web.archive.org/web/20170721200038/http://www.impallari.com:80/familysteps/index.php`,children:`Impallari`})}),`
193`,T(t.li,{children:`Schneider: (Lucas + Impallari) / 2`}),` 194`,T(t.li,{children:T(t.a,{href:`https://typedrawers.com/discussion/comment/26280/#Comment_26280`,children:`CSS Ogee by Abraham Lee`})}),` 195`,T(t.li,{children:T(t.a,{href:`https://googlefonts.github.io/gf-guide/variable.html#the-axis-mapping`,children:`Axis mapping in Google Fonts docs`})}),` 196`]}),` 197`,T(t.figure,{"data-rehype-pretty-code-figure":``,children:T(t.pre,{style:{"--shiki-light":`#1f2328`,"--shiki-dark":`#a9b1d6`,"--shiki-light-bg":`#ffffff`,"--shiki-dark-bg":`#1a1b26`},tabIndex:`0`,"data-language":`ts`,"data-theme":`github-light-default tokyo-night`,children:E(t.code,{"data-language":`ts`,"data-theme":`github-light-default tokyo-night`,style:{display:`grid`},children:[E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#BB9AF7`},children:`type`}),T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#C0CAF5`},children:` StrokeCurveConfig`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` {`})]}),` 198`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#73DACA`},children:` minWeight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`})]}),` 199`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#73DACA`},children:` maxWeight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`})]}),` 200`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#73DACA`},children:` minStroke`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`})]}),` 201`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#73DACA`},children:` maxStroke`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`})]}),` 202`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#73DACA`},children:` curvature`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`?:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`})]}),` 203`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`}`})}),` 204`,T(t.span,{"data-line":``,children:` `}),` 205`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#9D7CD8`,"--shiki-dark-font-style":`italic`},children:`const`}),T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:` strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` (`})]}),` 206`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` weight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 207`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:` {`})}),` 208`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` minWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 209`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` maxWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 210`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` minStroke`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 211`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` maxStroke`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 212`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` curvature`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9
212E64`},children:` 1`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // luc(as) de groot fallback`})]}),` 213`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:` }`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#C0CAF5`},children:` StrokeCurveConfig`})]}),` 214`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#BB9AF7`},children:` =>`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` {`})]}),` 215`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#9D7CD8`,"--shiki-dark-font-style":`italic`},children:` const`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#BB9AF7`},children:` ratio`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` maxStroke`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` /`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` minStroke`})]}),` 216`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#9D7CD8`,"--shiki-dark-font-style":`italic`},children:` const`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#BB9AF7`},children:` t`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` `})]}),` 217`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Math`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`.`}),T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`min`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`1`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Math`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`.`}),T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`max`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`0`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // clamp to 0..1`})]}),` 218`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` (`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:`weight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` -`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` minWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`) `})]}),` 219`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` /`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` (`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:`maxWeight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` -`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` minWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)))`})]}),` 220`,T(t.span,{"data-line":``,children:` `}),` 221`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#BB9AF7`,"--shiki-dark-font-style":`italic`},children:` return`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` minStroke`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` *`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` ratio`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` **`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` (`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:`t`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` **`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` curvature`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`})]}),` 222`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`}`})}),` 223`,T(t.span,{"data-line":``,children:` `}),` 224`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:`//`})}),` 225`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:`//`})}),` 226`,T(t.span,{"data-line":``,children:` `}),` 227`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#9D7CD8`,"--shiki-dark-font-style":`italic`},children:`const`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#BB9AF7`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#C0CAF5`},children:` StrokeCurveConfig`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` {`})]}),` 228`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#73DACA`},children:` minWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9
228E64`},children:` 50`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 229`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#73DACA`},children:` maxWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:` 900`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 230`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#73DACA`},children:` minStroke`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:` 27`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 231`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#73DACA`},children:` maxStroke`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:` 207`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 232`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#73DACA`},children:` curvature`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:` 1`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` /`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Math`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`.`}),T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`sqrt`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`2`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`})]}),` 233`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`}`})}),` 234`,T(t.span,{"data-line":``,children:` `}),` 235`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`50`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // 27`})]}),` 236`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`100`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 36`})]}),` 237`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9
237E64`},children:`200`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 49`})]}),` 238`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`300`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 64`})]}),` 239`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`400`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 80`})]}),` 240`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`500`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 99`})]}),` 241`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`600`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 121`})]}),` 242`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`700`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 146`})]}),` 243`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9
243E64`},children:`800`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 174`})]}),` 244`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`900`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // 207`})]})]})})}),` 245`,T(i,{children:T(t.p,{children:`Zephyr's custom curve.`})}),` 246`,T(V,{}),` 247`,T(t.h1,{id:`further-reading`,children:`Further reading`}),` 248`,E(t.ul,{children:[` 249`,E(t.li,{children:[T(t.strong,{children:`Designing Type`}),` by Karen Cheng`]}),` 250`,E(t.li,{children:[T(t.strong,{children:`The Stroke: Theory of Writing`}),` by Gerrit Noordzij`]}),` 251`]})]})}function ut(e={}){let{wrapper:t}=e.components||{};return t?T(t,{...e,children:T(lt,{...e})}):lt(e)}function G(e,t){throw Error(`Expected `+(t?`component`:`object`)+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}var dt=C({arrowForward:()=>K,default:()=>gt,metadata:()=>ft,plusButton:()=>pt,toc:()=>mt}),ft={title:`[wip] Cómo hacer tu propia familia tipográfica con Fontra`},K=()=>T(O,{children:T(`span`,{class:`i-md:arrow-forward`})}),pt=()=>T(O,{children:T(D,{size:`xs`,onclick:()=>window.alert(`Este no, el de Fontra ð`),children:T(`span`,{class:`i-md:add-2`})})}),mt=[{depth:1,id:`creamos-la-fuente`,text:`Creamos la fuente`},{depth:1,id:`añadimos-el-juego-de-caracteres`,text:`Añadimos el juego de caracteres`},{depth:1,id:`métricas-de-lÃnea`,text:`Métricas de lÃnea`},{depth:2,id:`contrarrestando-los-efectos-ópticos`,text:`Contrarrestando los efectos ópticos`},{depth:1,id:`dibujando-nuestro-primer-glifo-en-fontra`,text:`Dibujando nuestro primer glifo en Fontra`},{depth:1,id:`espaciado`,text:`Espaciado`},{depth:1,id:`kerning`,text:`Kerning`},{depth:2,id:`clases-de-kerning`,text:`Clases de kerning`},{depth:1,id:`curvas-de-interpolación`,text:`Curvas de interpolación`},{depth:1,id:`lectura-complementaria`,text:`Lectura complementaria`}];function ht(e){let t={a:`a`,code:`code`,em:`em`,figure:`figure`,h1:`h1`,h2:`h2`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,...e.components},{Figure:n,Kbd:r,SideNote:i,Table:a}=t;return n||q(`Figure`,!0),r||q(`Kbd`,!0),i||q(`SideNote`,!0),a||q(`Table`,!0),E(w,{children:[T(t.p,{children:`Este último año he estado, entre ratos libres, trabajando en una tipografÃa llamada Zephyr Sans. 252Intenta ser una vuelta de tuerca al estilo de los iconos Breeze de KDE y la antigua familia tipográfica Oxygen Sans.`}),` 253`,T(n,{wide:!0,src:Me,alt:`Una muestra de los cuatro pesos disponibles por ahora`,loading:`eager`,fetchpriority:`high`,preload:!0}),` 254`,T(t.p,{children:`He tenido que investigar un buen rato para llegar a este punto, y pese a eso no dirÃa precisamente que soy un erudito en este campo. Pero si te ahorro un poco de trecho para tu propio proyecto, pues eso que te llevas.`}),` 255`,T(t.p,{children:`Como has podido adivinar, usaremos Fontra, un editor de software libre que funciona en las plataformas de siempre.`}),` 256`,T(t.h1,{id:`creamos-la-fuente`,children:`Creamos la fuente`}),` 257`,E(t.p,{children:[`Para empezar, instalamos FontraPak desde `,T(t.a,{href:`https://fontra.xyz`,children:`https://fontra.xyz`}),`, que ejecuta tanto servidor como cliente de forma local en tu ordenador.`]}
257),` 258`,T(t.p,{children:`Esta división en dos partes permite la colaboración en tiempo real al estilo Figma, pero no es muy relevante por ahora.`}),` 259`,T(t.p,{children:`Una vez abierto, aparecerá la ventana siguiente:`}),` 260`,T(n,{title:`Ventana de FontraPak`,src:Ne}),` 261`,E(t.p,{children:[`Haz click en `,T(t.strong,{children:`New Font`}),` en la esquina superior derecha. Verás varios formatos (Designspace, Fontra, RoboCJK y UFO). Elige `,T(t.strong,{children:`Designspace`}),`.`]}),` 262`,E(t.p,{children:[`UFO es el formato estándar genérico para una fuente individual (guardado en carpetas como `,T(t.code,{children:`MyFont_Light.ufo`}),`, `,T(t.code,{children:`MyFont_Regular.ufo`}),` etc).`]}),` 263`,E(t.p,{children:[`Un Designspace es una carpeta con varios UFOs (y un XML con `,T(t.code,{children:`.designspace`}),`) que agrupa las fuentes en una familia tipográfica. Al elegir Designspace evitas pillarte los dedos en el futuro si te planteas el llevarlo más allá, pero sin quitarle la posibilidad a potenciales colaboradores de usar sus programas favoritos como Glyphs, RoboFont, Fontlab etc. que suelen tener cosas más avanzadas como plugins, peines de curvatura (como el del CAD) y soporte para idiomas sin alfabeto latino.`]}),` 264`,T(t.p,{children:`Se abrirá una pestaña en tu navegador web como esta:`}),` 265`,T(n,{title:`CuadrÃcula de glifos vacÃa`,src:Pe}),` 266`,T(t.h1,{id:`añadimos-el-juego-de-caracteres`,children:`Añadimos el juego de caracteres`}),` 267`,T(t.p,{children:`Los juegos de caracteres son la forma en la que especificamos los caracteres que planeamos tener en nuestra fuente. Puedes elegir una existente de colecciones como el de Google Fonts.`}),` 268`,` 269`,E(t.p,{children:[`¿Ves la barra lateral a la izquierda? Haz click en el botón `,pt(),` a la derecha de donde pone Project glyph sets. En el modal selecciona la colección `,T(t.strong,{children:`Google Fonts`}),` y marca `,T(t.strong,{children:`GF Latin Kernel`}),` para empezar, luego dale a guardar.`]}),` 270`,T(n,{src:Fe,alt:`Vista de glifos filtrados por juego de caracteres`,children:T(t.p,{children:`Ahora verás la cobertura del juego de caracteres de tu fuente, con tarjetas gris claro con vista previa para cada glifo soportado.`})}),` 271`,T(t.h1,{id:`métricas-de-lÃnea`,children:`Métricas de lÃnea`}),` 272`,T(t.p,{children:`Antes de empezar a dibujar glifos, necesitamos pensar en la anatomÃa de la fuente que queremos crear.`}),` 273`,T(n,{src:Ie,alt:`Diagrama de métricas de lÃnea`,wide:!0}),` 274`,T(t.p,{children:`Un proyecto Designspace nuevo en Fontra tiene 1000 unidades por em, aunque puede que a veces te encuentres otros proyectos con 1024 o 2048.`}),` 275`,T(t.p,{children:`Aunque el formato sea vectorial, los nodos se redondean a la unidad más próxima, como si de pÃxeles se tratara, basado en esta resolución.`}),` 276`,E(t.p,{children:[`Ahora bien, de estas 1000 unidades verticales tenemos que elegir cuánto vamos a destinar a qué secciones. 277Coge un folio y boceta un poco. Dibuja los suficientes glifos como para sacar las proporciones para los `,T(t.strong,{children:`ascendentes`}),`, la `,T(t.strong,{children:`altura de x`}),` y los `,T(t.strong,{children:`descendientes`}),`. Tras esto, asóciale tamaños de forma retroactiva literalmente midiéndolo en el papel y redondeándolo.`]}),` 278`,T(n,{src:Le,alt:`Glyph sketches`,children:T(t.p,{children:`Se nota que lo dibujé antes de aprender esto en condiciones.`})}),` 279`,E(t.p,{children:[`En este caso elegà hacer la `,T(r,{children:`a`}),` de dos pisos, y basar las medidas de donde el bowl y el hook conectan. 280En concreto:`]}),` 281`,E(t.ul,{children:[` 282`,T(t.li,{children:`Desde el baseline a la parte de arriba del bowl: 2`}),` 283`,T(t.li,{children:`Desde el bowl a la parte de arriba del hook: â2`}),` 284`,T(t.li,{children:`Ancho: 2 à â2`}),` 285`]}),` 286`,T(t.p,{children:`¿Por qué estos en concreto? Porque me apetecÃa.`}),` 287`,T(t.p,{children:`La altura de las mayúsculas se derivan de la altura x. En las fuentes de cuerpo (las que se usan para long-form text at small sizes [todo] maybe say "the ones used in long-form prose" instead) el caps-height to x-height ratio deberÃa rondar entre el 65% al 75%.`}),` 288`,T(t.p,{children:`[todo] I picked as close to 75% as possible â around where Inter and Helvetica sit â as my intention for this font is to be used on user interfaces. 550/740 is â 75%, 775-550 = 225 (which matches the descender).`}),` 289`,T(n,{src:Re,alt:`Line metrics view`}),` 290`,T(t.p,{children:`Los valores del lado izquierdo deben sumar a las unidades por em de tu proyecto (por defecto es 1000). 775 + 225 = 1000.`}),` 291`,T(t.h2,{id:`contrarrestando-los-efectos-ópticos`,children:`Contrarrestando los efectos ópticos`}),` 292`,T(t.p,{children:`Los valores de la derecha actúan para las lÃneas de rebasamiento. Como norma general, estos aumentan de tamaño a medida que el texto es más pequeño.`}),` 293`,E(t.p,{children:[T(t.a,{href:`http://designwithfontforge.com/en-US/Trusting_Your_Eyes.html`,children:`Lee esta página`}),` para aprender más sobre esto.`]}),` 294`,T(t.h1,{id:`dibujando-nuestro-primer-glifo-en-fontra`,children:`Dibujando nuestro primer glifo en Fontra`}),` 295`,E(t.p,{children:[`We can now start drawing our first glyphs, `,T(r,{children:`n`}),` and `,T(r,{children:`o`}),`. These will act as the base for the others.`]}),` 296`,E(t.p,{children:[`Go back to the glyph grid and double click the `,T(r,{children:`n`}),` card. 297A new editor tab will open. The UI is pretty self-explanatory so just play around with it and we'll start drawing once you come back.`]}),` 298`,T(n,{src:ze,alt:`Empty glyph editor tab`}),`
299`,T(t.p,{children:`Select the rectangle tool, and add a rectangle from x-height to baseline to make a vertical stroke. 300Unlike on editors like Figma, the selection tool (Pointer) doesn't select the entire shape by just clicking on the fill. For that, double click on the shape's path.`}),` 301`,E(t.p,{children:[`On the right sidebar, select the `,T(t.strong,{children:`Selection Transformation`}),` tab, then select a shape to see its width and height.`]}),` 302`,E(t.p,{children:[`There's also an option to see the coordinates on each selected node. It's on View `,K(),` Glyph editor appearance `,K(),` Coordinates.`]}),` 303`,T(t.p,{children:`There's also a Ruler tool that sticks and rotates along the closest edge where you click, which is pretty handy.`}),` 304`,T(n,{src:Be,alt:`Rectangle in editor`}),` 305`,T(t.p,{children:`Let's pick the pencil tool to start drawing our own shape. We'll do the shoulder now.`}),` 306`,T(n,{src:Ve,alt:`Starting shoulder`}),` 307`,E(t.p,{children:[`Hold `,T(r,{children:`Shift`}),` to lock the X or Y axis down, then draw a straight line downwards.`]}),` 308`,T(t.p,{children:`We then close this shape by drawing our way back to the initial point where we click to finish. You'll see a blue circle while hovering the node, clicking here will close the contour.`}),` 309`,T(n,{src:He,alt:`Closing shoulder`}),` 310`,T(t.p,{children:`You can also click on the middle of a line to split it with a node â you'll see the blue circle again.`}),` 311`,T(n,{src:Ue,alt:`Closed shoulder`}),` 312`,E(t.p,{children:[`Now, to make the lines curved instead of straight, hold `,T(r,{children:`Alt`}),` and click with your Pencil tool. You'll see two smaller blue circles before clicking.`]}),` 313`,T(n,{src:We,alt:`Curve indicator preview`}),` 314`,T(n,{src:U,alt:`Curve handles`}),` 315`,E(t.p,{children:[`It's better to have the same angle on either side, so hold `,T(r,{children:`Shift`}),` when moving the handles.`]}),` 316`,T(t.p,{children:`Once you're finished making all the lines curved, chances are it'll look a bit rough. That's fine for now.`}),` 317`,T(n,{src:Ge,alt:`This does not bring joy`}),` 318`,E(n,{src:Ke,alt:`Slightly better now`,children:[T(t.p,{children:`Make sure the shoulder goes up to the overshoot region.`}),T(t.p,{children:`Remember that it's rounded so it needs that compensation.`})]}),` 319`,E(t.p,{children:[`Now while having both nodes selected like in the picture, hold `,T(r,{children:`Alt`}),` and use the arrow keys to nudge the nodes left or right while keeping the curve handles where they are. Trust your eyes. Also nudge the nodes on the right side.`]}),` 320`,T(n,{src:qe,alt:`Acceptable`}),` 321`,T(t.p,{children:`Now we have to think about stroke contrast, which would be how much narrower horizontal strokes are compared to vertical ones.`}),` 322`,T(t.p,{children:`If you were to set both to, say, 80, the top side of N's shoulder would paradoxically look bolder/wider than the vertical lines on either side. This is yet another optical illusion that we need to compensate for.`}),` 323`,E(t.p,{children:[`If you want to make it `,T(t.em,{children:`visually`}),` the same, you should do about 10% less on horizontal strokes, which is what we'll do here by setting it to 72. You can make it more contrasty if you want.`]}),` 324`,T(n,{src:Je,alt:`With proper contrast`}),` 325`,T(t.p,{children:`Now we have to fix that weird hole where both shapes intersect. Why is that happening? Well, it's because of the draw direction. Notice how every shape has a node with a half circle â that's where the shape starts to be drawn. If both shapes happen to have the same direction, they will combine. If they don't, they'll cancel each other out and leave a hole.`}),` 326`,E(t.p,{children:[`Best practice is to have additive shapes be drawn clockwise and subtractive ones like counters (the negative space in `,T(r,{children:`o`}),` for example) counter-clockwise.`]}),` 327`,T(t.p,{children:`I tend to set the start point of all shapes to the nodes closest to the top for simplicity. You might find that helpful.`}),` 328`,T(n,{src:Ye,alt:`Setting start point`}),` 329`,T(n,{src:Xe,alt:`New start point`}),` 330`,E(t.p,{children:[`We can now see more clearly the direction it's being drawn in. Change it to clockwise to make it additive. Right click `,K(),` `,T(t.strong,{children:`Reverse
330contour direction`}),`.`]}),` 331`,E(t.p,{children:[`You can hold `,T(r,{children:`Space`}),` to hide the editor UI, preview the glyph with a solid color, and pan around the canvas.`]}),` 332`,T(n,{src:Ze,alt:`N preview`}),` 333`,E(t.p,{children:[`Now try drawing `,T(r,{children:`o`}),` by yourself. Remember that you should do both vertical and horizontal overshoots, so it should be wider than `,T(r,{children:`n`}),` â in this case, it's about 40 units wider horizontally, according to the Dimensions section in the Glyph info panel on the right.`]}),` 334`,T(n,{src:Qe,alt:`O preview`,children:T(t.p,{children:`I did some mining off-camera because the n glyph looked rough lol.`})}),` 335`,T(t.h1,{id:`espaciado`,children:`Espaciado`}),` 336`,E(t.p,{children:[`Te habrás dado cuenta que cuando dibujamos glifos reservamos un poco de espacio a cada lado para que no choquen entre sÃ. 337A este hueco se le llama `,T(t.strong,{children:`espaciado`}),`.`]}),` 338`,E(t.p,{children:[`A common analogy for this is `,T(t.em,{children:`volume`}),`, the liquid kind. Both the space between glyphs and the glyph's own counterform should have about the same visual volume.`]}),` 339`,E(t.p,{children:[`The gap on the right side of `,T(r,{children:`i`}),` has more space for volume than, say, `,T(r,{children:`q`}),`, so we have to take that into consideration.`]}),` 340`,E(t.p,{children:[`You `,T(t.em,{children:`could`}),` eyeball it but it's better to follow some sort of guideline to keep things consistent. One of those is the Tracy method, which we'll be using.`]}),` 341`,T(M,{locale:`es`,class:`md:-mb-3`}),` 342`,E(i,{children:[T(t.p,{children:`For simplicity's sake, we'll just do lowercase.`}),T(t.p,{children:`This grouping is based on the one in Designing Type by Karen Cheng, which you really should buy.`})]}),` 343`,E(a,{children:[T(`thead`,{children:E(`tr`,{children:[T(`th`,{class:`w-px whitespace-nowrap !pr-0`,children:T(`span`,{class:`size-5 i-md:tag ml-0.75 -mt-0.5`})}),T(`th`,{children:`Descripción`}),T(`th`,{children:`Unidades`})]})}),E(`tbody`,{class:`[&_tr_td:first-child]:!pr-0`,children:[E(`tr`,{children:[T(`td`,{children:T(j,{for:1})}),E(`td`,{children:[`Igual al espaciado izquierdo de `,T(r,{children:`n`})]}),T(`td`,{children:`75`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:2})}),E(`td`,{children:[`Igual al espaciado derecho de `,T(r,{children:`n`})]}),T(`td`,{children:`70`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:3})}),E(`td`,{children:[`Un pelÃn más que el espaciado izquierdo de `,T(r,{children:`n`})]}),T(`td`,{children:`80`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:4})}),T(`td`,{children:`Espaciado mÃnimo`}),T(`td`,{children:`40`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:5})}),E(`td`,{children:[`Mismo espaciado que `,T(r,{children:`o`})]}),T(`td`,{children:`55`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:6})}),E(`td`,{children:[`Un pelÃn menos de espaciado que `,T(r,{children:`o`})]}),T(`td`,{children:`50`})]}),E(`tr`,{children:[T(`td`,{children:T(j,{for:`*`})}),T(`td`,{children:`Ajustado a mano`}),T(`td`,{class:`!pl-5.5`,children:`â`})]})]})]}),` 344`,T(t.h1,{id:`kerning`,children:`Kerning`}),` 345`,T(t.p,{children:`Ojo, solo tendrÃas que empezar a hacer kerning una vez que hayas terminado completamente con el espaciado normal.`}),` 346`,E(t.p,{children:[`Hay algunos pares como `,T(r,{children:`r.`}),`, `,T(r,{children:`r-`}),`, `,T(r,{children:`fo`}),` y `,T(r,{children:`lt`}),` que por mucho que ajustes el espaciado siguen teniendo espacio de más o de menos, y que no hay más remedio que ajustarlo a mano.`]}),` 347`,T(n,{src:et,title:`Before`,children:T(t.p,{children:`Los que tengan astas diagonales, tails o astas transversales tienen espacios un poco extraños. 348Anything with diagonals, tails or crossbars is akwardly spaced.`})}),` 349`,T(n,{src:tt,title:`After a first pass`}),` 350`,E(t.p,{children:[`Sure, we could go letter by letter and try every permutation and manually adjust it but that's too time-consuming. We'll define groups of similar shapes on either side called `,T(t.em,{children:`classes`}),`.`]}),` 351`,T(t.h2,{id:`clases-de-kerning`,children:`Clases de kerning`}),` 352`,E(t.p,{children:[`This isn't really covered in Designing Type all that much â probably because there's no perfect way to approach this. 353I found this one somewhere on the internet, and I can't seem to find where it was anymore. 354My only tweak was adding `,T(r,{children:`d`}),` and `,T(r,{children:`q`}),` to the right side verticals, which is based on the RoboFont docs.`]}),` 355`,T(P,{locale:`es`,note:`Pick one of each to act as the parent of the group. I chose the circled ones.`}),` 356`,E(t.p,{children:[`Now, these classes can be called anything, like straight-up just `,T(t.code,{children:`verticals`}),` or `,T(t.code,{children:`diagonals-desc`}),`, but when you tweak a bunch of them it's a bit too annoying so I just use the parent letter directly.`]}),` 357`,T(t.p,{children:`The left and right classes are independent so we can set both
357sides to the same letter and it'll apply the right one.`}),` 358`,E(n,{src:nt,children:[E(t.p,{children:[`The letter `,T(r,{children:`y`}),` is part of the diagonals group in both left and right, where the parent is `,T(r,{children:`v`}),`.`]}),T(t.p,{children:`Go letter by letter setting the parent per side.`})]}),` 359`,T(n,{src:rt,children:E(t.p,{children:[`You can click and drag between letters to add or remove units from the pair. 360`,T(t.code,{children:`@v`}),` and `,T(t.code,{children:`@o`}),` are the class names that we've set to every letter in its group.`]})}),` 361`,E(t.p,{children:[`You can search for common kerning pairs. Don't overdo it, `,T(t.a,{href:`https://typedrawers.com/discussion/comment/52058/#Comment_52058`,children:`it's fine to not cover uncommon edge cases`}),`. There are too many permutations for you to be able to handle every single combination.`]}),` 362`,T(t.h1,{id:`curvas-de-interpolación`,children:`Curvas de interpolación`}),` 363`,` 364`,T(t.p,{children:`Imagina que tenemos una familia tipográfica compuesta por varios pesos. Si en el peso Regular/400 tenemos el [todo] stem width a 80 unidades, y definimos el rango de 100 a 900 con ±60 unidades escalados de forma [todo] linear, nos costará discernir los tonos más oscuros de los claros en cuanto al gris tipográfico se refiere. Necesitaremos exponencialmente más contraste en cuanto más oscuro se vuelva este.`}),` 365`,T(i,{children:T(t.p,{children:`Mira el rango de 0,33 a 0,5 de las leyes de potencia de Stevens sobre la sensibilidad a la luz, y el 0,43 de Ebner y Fairchild.`})}),` 366`,E(t.p,{children:[`Since strokes/form and counterform blur together into a `,T(t.em,{children:`typographic gray`}),`, we have to apply this here too.`]}),` 367`,T(t.p,{children:`No quiero meterme demasiado en este tema, asà que dejaré las partes clave aquà para que lo investigues por tu cuenta:`}),` 368`,E(t.ul,{children:[` 369`,T(t.li,{children:T(t.a,{href:`https://www.lucasfonts.com/learn/interpolation-theory`,children:`TeorÃa de interpolación de Luc(as) de Groot`})}),` 370`,T(t.li,{children:T(t.a,{href:`https://web.archive.org/web/20170721200038/http://www.impallari.com:80/familysteps/index.php`,children:`Impallari`})}),` 371`,T(t.li,{children:`Schneider: (Lucas + Impallari) / 2`}),` 372`,T(t.li,{children:T(t.a,{href:`https://typedrawers.com/discussion/comment/26280/#Comment_26280`,children:`CSS Ogee de Abraham Lee`})}),` 373`,T(t.li,{children:T(t.a,{href:`https://googlefonts.github.io/gf-guide/variable.html#the-axis-mapping`,children:`Mapeo de ejes en la documentación de Google Fonts`})}),` 374`]}),` 375`,T(t.figure,{"data-rehype-pretty-code-figure":``,children:T(t.pre,{style:{"--shiki-light":`#1f2328`,"--shiki-dark":`#a9b1d6`,"--shiki-light-bg":`#ffffff`,"--shiki-dark-bg":`#1a1b26`},tabIndex:`0`,"data-language":`ts`,"data-theme":`github-light-default tokyo-night`,children:E(t.code,{"data-language":`ts`,"data-theme":`github-light-default tokyo-night`,style:{display:`grid`},children:[E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#BB9AF7`},children:`type`}),T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#C0CAF5`},children:` StrokeCurveConfig`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` {`})]}),` 376`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#73DACA`},children:` minWeight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`})]}),` 377`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#73DACA`},children:` maxWeight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`})]}),` 378`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#73DACA`},children:` minStroke`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`})]}),` 379`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#73DACA`},children:` maxStroke`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`})]}),` 380`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#73DACA`},children:` curvature`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`?:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`})]}),` 381`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`}`})}),` 382`,T(t.span,{"data-line":``,children:` `}),` 383`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#9D7CD8`,"--shiki-dark-font-style":`italic`},children:`const`}),T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:` strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` (`})]}),` 384`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` weight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#0DB9D7`},children:` number`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 385`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:` {`})}),` 386`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` minWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 387`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` maxWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 388`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` minStroke`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 389`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` maxStroke`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 390`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#E0AF68`},children:` curvature`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9
390E64`},children:` 1`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // luc(as) de groot fallback`})]}),` 391`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:` }`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#C0CAF5`},children:` StrokeCurveConfig`})]}),` 392`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#BB9AF7`},children:` =>`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` {`})]}),` 393`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#9D7CD8`,"--shiki-dark-font-style":`italic`},children:` const`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#BB9AF7`},children:` ratio`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` maxStroke`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` /`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` minStroke`})]}),` 394`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#9D7CD8`,"--shiki-dark-font-style":`italic`},children:` const`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#BB9AF7`},children:` t`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` `})]}),` 395`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Math`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`.`}),T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`min`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`1`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Math`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`.`}),T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`max`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`0`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // clamp to 0..1`})]}),` 396`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` (`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:`weight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` -`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` minWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`) `})]}),` 397`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` /`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` (`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:`maxWeight`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` -`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` minWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)))`})]}),` 398`,T(t.span,{"data-line":``,children:` `}),` 399`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#BB9AF7`,"--shiki-dark-font-style":`italic`},children:` return`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` minStroke`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` *`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` ratio`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` **`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` (`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:`t`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` **`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` curvature`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`})]}),` 400`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`}`})}),` 401`,T(t.span,{"data-line":``,children:` `}),` 402`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:`//`})}),` 403`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:`//`})}),` 404`,T(t.span,{"data-line":``,children:` `}),` 405`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#9D7CD8`,"--shiki-dark-font-style":`italic`},children:`const`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#BB9AF7`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#953800`,"--shiki-dark":`#C0CAF5`},children:` StrokeCurveConfig`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` =`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:` {`})]}),` 406`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#73DACA`},children:` minWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9
406E64`},children:` 50`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 407`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#73DACA`},children:` maxWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:` 900`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 408`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#73DACA`},children:` minStroke`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:` 27`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 409`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#73DACA`},children:` maxStroke`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:` 207`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`})]}),` 410`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#73DACA`},children:` curvature`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`:`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:` 1`}),T(t.span,{style:{"--shiki-light":`#CF222E`,"--shiki-dark":`#89DDFF`},children:` /`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Math`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`.`}),T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`sqrt`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`2`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`})]}),` 411`,T(t.span,{"data-line":``,children:T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`}`})}),` 412`,T(t.span,{"data-line":``,children:` `}),` 413`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`50`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // 27`})]}),` 414`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`100`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 36`})]}),` 415`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9
415E64`},children:`200`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 49`})]}),` 416`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`300`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 64`})]}),` 417`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`400`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 80`})]}),` 418`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`500`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 99`})]}),` 419`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`600`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 121`})]}),` 420`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`700`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 146`})]}),` 421`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9
421E64`},children:`800`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // rounded to 174`})]}),` 422`,E(t.span,{"data-line":``,children:[T(t.span,{style:{"--shiki-light":`#8250DF`,"--shiki-dark":`#7AA2F7`},children:`strokeFromWeight`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`(`}),T(t.span,{style:{"--shiki-light":`#0550AE`,"--shiki-dark":`#FF9E64`},children:`900`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#89DDFF`},children:`,`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#C0CAF5`},children:` Zephyr`}),T(t.span,{style:{"--shiki-light":`#1F2328`,"--shiki-dark":`#9ABDF5`},children:`)`}),T(t.span,{style:{"--shiki-light":`#6E7781`,"--shiki-light-font-style":`inherit`,"--shiki-dark":`#51597D`,"--shiki-dark-font-style":`italic`},children:` // 207`})]})]})})}),` 423`,T(i,{children:T(t.p,{children:`La curva usada en Zephyr`})}),` 424`,T(V,{}),` 425`,T(t.h1,{id:`lectura-complementaria`,children:`Lectura complementaria`}),` 426`,E(t.ul,{children:[` 427`,E(t.li,{children:[T(t.strong,{children:`Designing Type`}),` de Karen Cheng`]}),` 428`,E(t.li,{children:[T(t.strong,{children:`The Stroke: Theory of Writing`}),` de Gerrit Noordzij`]}),` 429`]})]})}function gt(e={}){let{wrapper:t}=e.components||{};return t?T(t,{...e,children:T(ht,{...e})}):ht(e)}function q(e,t){throw Error(`Expected `+(t?`component`:`object`)+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}var _t=C({default:()=>xt,metadata:()=>vt,toc:()=>yt}),vt={title:`A letter to chronic perfectionists`},yt=[{depth:2,id:`the-garage`,text:`The garage`},{depth:2,id:`the-recital`,text:`The recital`},{depth:2,id:`but-i-feel-like-im-in-a-bit-of-both-at-times`,text:`But I feel like I'm in a bit of both at times...`}];function bt(e){let t={em:`em`,h2:`h2`,p:`p`,strong:`strong`,...e.components};return E(w,{children:[E(t.p,{children:[`You did the thing, ticked the box but satisfaction didn't come. For you, caring is a constant, yet that certainty doesn't translate to how you'll feel when it's over. If you care this much, how come `,T(t.em,{children:`you`}),` get the void?`]}),` 430`,E(t.p,{children:[`At its worst, this tension makes you not pursue projects that you'd love to do â who'd want to willingly go through all that again on `,T(t.em,{children:`your`}),` free time?`]}),` 431`,T(t.p,{children:`Yet there's still a reason you keep caring and pushing yourself that hard, sometimes to the point of wearing yourself down to dust.`}),` 432`,T(t.h2,{id:`the-garage`,children:`The garage`}),` 433`,T(t.p,{children:`Picture a hobby band playing in their garage. They don't care about making a perfect song, or playing it perfectly in one go. It's scrappy, gritty, freeing, fun and ultimately alive.`}),` 434`,T(t.p,{children:`They still care about making great things, of course, but it's not suffocating and especially it's not to prove a point to anyone. There's enjoyment inherent to respecting the craft itself and improving yourself, of which the main spectator is you.`}),` 435`,T(t.p,{children:`The gap between where you are and want to be doesn't cause stress, and doesn't diminish the value of you as a person. The gap is about vision and exploration.`}),` 436`,T(t.h2,{id:`the-recital`,children:`The recital`}),` 437`,T(t.p,{children:`Now picture a recital. You feel the stress of people staring and judging you, or rather, the picture of them in your mind.`}),` 438`,T(t.p,{children:`Those people might not even be there â most of the time they aren't. You took every parallel universe, timeline and branch, inflated the probability of everything wrong happening, then condensed it down to a demon-core-shaped inner critic.`}),` 439`,T(t.p,{children:`You become fixated on truly making things perfect. Forget about the freeing sensation from earlier.`}),` 440`,E(t.p,{children:[`"Well, the stress keeps me in check" you think to yourself. Yet ultimately that line of thought ends up betraying you, expressing somatically through muscle tension. You make some mistakes, each one feeling like a dagger cutting through you, yet it's decoupled from reality â was it really `,T(t.em,{children:`that`}),` bad?`]}),` 441`,T(t.p,{children:`Scrappiness is a failure. It doesn't bring joy.`}),` 442`,T(t.p,{children:`Finally it's over, hopefully no one noticed. You get the emptiness again, but it feels weighty and dense like fog.`}),` 443`,E(t.p,{children:[`Maybe you `,T(t.em,{children:`do`}),` end up persevering and doing it perfect next time. And the other. Maybe it's even `,T(t.strong,{children:`more`}),` perfect than if you had gone the garage route â but it doesn't add to `,T(t.em,{children:`your`}),` experience, it takes away a bit out of your soul. The spark and emotion that got you started in your field is lost along the way, losing the human touch.`]}),` 444`,T(t.p,{children:`That resentment makes you avoid performing in the first place. The way you deliver to the world looks more like a sine wave, peaks of going all-out to get it over with followed by troughs where people wonder where you are, all while the increasing standards make the swings harder.`}),` 445`,T(t.h2,{id:`but-i-feel-like-im-in-a-bit-of-both-at-times`,children:`But I feel like I'm in a bit of both at times...`}),` 446`,T(t.p,{children:`That's the catch. We start at the garage, but the pull of unhealthy perfectionism drags us to the recital. It's probably not as dramatic as either extreme.`}),` 447`,T(t.p,{children:`It takes constant, conscious effort to pull away. At first you'll notice when you're already there, but as you develop the muscle you'll feel the pull without having to be mid-air.`}),` 448`,T(t.p,{children:`Feel stressed? Take a pause and think to yourself: are you at the recital or the garage?`})]})}function xt(e={}){let{wrapper:t}=e.components||{};return t?T(t,{...e,children:T(bt,{...e})}):bt(e)}var St=C({default:()=>Et,metadata:()=>Ct,nl:()=>J,toc:()=>wt}),Ct={title:`What's design?`},J=()=>T(`br`,{}),wt=[];function Tt(e){let t={em:`em`,p:`p`,...e.components};return E(w,{children:[E(t.p,{children:[`Design is about playing the song of humanity. `,J(),` 449From the dreams we have, `,J(),` 450the ideas we come up with, `,J(),` 451and the rules we break. `,J()]}),` 452`,E(t.p,{children:[`To create without cutting corners is to respect others. `,J(),` 453To whole-ass something. `,J(),` 454Even on the parts people will never see. `,J()]}),` 455`,E(t.p,{children:[`How it makes people feel. `,J(),` 456Seen, appreciated, empowered. `,J()]}),` 457`,E(t.p,{children:[`Caring is not about making things perfect, `,J(),` 458but about not diluting our humanity. `,J()]}),` 459`,` 460`,`
461`,E(t.p,{children:[`It can be fixing that old '50s car with your father, `,J(),` 462or building that LEGO set with your little sister, `,J(),` 463or recording that one cringe VCR home movie. `,J(),` 464Or someone adding support in Noto Sans `,J(),` 465for a language only a couple thousand speakers `,J(),` 466even know on the first place. `,J()]}),` 467`,E(t.p,{children:[`Because caring is our inner drive as a species. `,J(),` 468Creation is our play. `,J(),` 469It's what extends us beyond our space and time. `,J()]}),` 470`,E(t.p,{children:[`It's never too late to care. `,J()]}),` 471`,E(t.p,{children:[`When we make a piano and figure out what tactility `,J(),` 472and heft feels nicest on every key. `,J(),` 473Or make a drill fit the ergonomics of our hands. `,J(),` 474And the way bike pedals and seats can be adjusted `,J(),` 475to close to every person. `,J()]}),` 476`,E(t.p,{children:[`We think of the wonder a baby feels when they first `,J(),` 477start drawing with crayons. `,J(),` 478Smashing the cylinder into the square hole. `,J(),` 479And pressing the damn button that makes the toy `,J(),` 480sing again. `,J()]}),` 481`,E(t.p,{children:[`Humanity is all about blasting that cylinder like it owes us money. `,J(),` 482Or figuring out that actually, it `,T(t.em,{children:`did`}),` fit in the square hole.`]}),` 483`,E(t.p,{children:[`It's about democratizing access to inventions for the rest of us. `,J(),` 484Making it cheap, safe, conscious of ourselves and our environment. `,J(),` 485Turning inventions into instruments. Amplifying us. `,J()]}),` 486`,E(t.p,{children:[`Because to make anything but that does us a disservice. `,J(),` 487We need to keep playing the song of humanity. `,J()]})]})}function Et(e={}){let{wrapper:t}=e.components||{};return t?T(t,{...e,children:T(Tt,{...e})}):Tt(e)}var Dt=`/assets/DHAP9Xz6.svg`,Ot={sources:[{srcset:`/assets/Ci50c_F6.svg`,media:`(prefers-color-scheme: dark)`},{srcset:Dt}],img:{src:Dt,w:700,h:300}},kt={src:`/assets/f9cKSIuR.svg`,width:700,height:912},At={src:`/assets/CXzzFnuf.svg`,width:700,height:1044},jt=`/assets/CzIuMlu7.svg`,Mt={sources:[{srcset:`/assets/DGDFteVn.svg`,media:`(prefers-color-scheme: dark)`},{srcset:jt}],img:{src:jt,w:700,h:468}},Nt=`/assets/D33VB2MB.svg`,Pt={sources:[{srcset:`/assets/DRGRJad8.svg`,media:`(prefers-color-scheme: dark)`},{srcset:Nt}],img:{src:Nt,w:700,h:1209}},Ft=C({default:()=>zt,metadata:()=>It,toc:()=>Lt}),It={title:`We (still) need an instrument for thought`},Lt=[{depth:2,id:`credits-and-licenses`,text:`Credits and licenses`},{depth:2,id:`footnote-label`,text:`Footnotes`}];function Rt(e){let t={a:`a`,code:`code`,em:`em`,h2:`h2`,hr:`hr`,li:`li`,ol:`ol`,p:`p`,section:`section`,sup:`sup`,ul:`ul`,...e.components},{Abbr:n,Blockquote:r,Callout:i,Figure:a,Gloss:o,SideNote:s}=t;return n||Y(`Abbr`,!0),r||Y(`Blockquote`,!0),i||Y(`Callout`,!0),a||Y(`Figure`,!0),o||Y(`Gloss`,!0),s||Y(`SideNote`,!0),E(w,{children:[T(t.p,{children:`We've always sought to extend our cognitive and physical capabilities to make hard things tractable and the impossible things possible.`}),` 488`,E(t.p,{children:[`However, merely augmenting our capabilities by itself doesn't compound. `,T(o,{title:`The ability of an entity to perform actions on their environment`,children:`Agency`}),` gains only materialize once those augmentations are widely dispersed and integrated into education for people to build on.`]}),` 489`,E(t.p,{children:[`Democratization also happens through design. Xerox PARC pioneered the `,T(n,{title:`Windows, Icons, Menus and Pointer`,children:`WIMP`}),` paradigm, turning computers from an abstract tool for computation to a constructed environment with familiar metaphors the average person could reason about.`]}),` 490`,T(t.p,{children:`Later, the Macintosh (despite, at the time, being called a toy) made part of that paradigm widely available with a proper distribution channel, documentation and lower price point, with some tradeoffs.`}),` 491`,E(i,{children:[T(t.p,{children:`Before we continue, let's define some concepts.`}),E(t.p,{children:[`An instrument`,T(t.sup,{children:T(t.a,{href:`#user-content-fn-1`,id:`user-content-fnref-1`,"data-footnote-ref":!0,"aria-describedby":`footnote-label`,children:`1`})}),` amplifies self-expression, self-determination and creativity. It unfolds as you interact and compose with it. That exploration aspect is what allows human ambition to flourish and what makes it an environment one can reside in.`]}),T(t.p,{children:`Tools, in contrast, are shortcuts or automations to decrease the tedium, often very useful ones, to allow us to remain in focus with instruments. They are what a calculator is to mathematics, or a metronome to music.`}),T(t.p,{children:`This is why the Macintosh was considered a toy. If you judged it as merely a tool and compared it to a Cray, it would've been a terrible one. But it was conceived as an instrument, its power relied not on its processing capabilities, but on the (partial but accessible) symbiosis formed with the user. Combine 2, 10 or 100 Crays together and you still wouldn't get that. Calling it a toy really missed the point, would've been more accurate to compare it to society.`})]}),` 492`,T(t.p,{children:`Then, smartphones made it so that we could always keep a small window open into this constructed environment. Multi-touch reduced the distance between content and ourselves. However, the smaller screen size and awkward input system for larger scoped work made it more tailored towards consumption than creation, and its ecosystem followed suit.`}),` 493`,T(t.p,{children:`With AI, we find ourselves at an awkward spot yet again. Is it an instrument or a tool?`}),` 494`,T(t.p,{children:`AI capabilities grow every few months. Each new model unlocks many useful usecases, which resembles the unboundedness of instruments.`}),` 495`,` 496`,T(t.p,{children:`You get superhuman tirelessness, throughput and iteration speed. Seemingly unbounded granting.`}),` 497`,T(t.p,{children:`The genie in a bottle grants just three wishes, religious prayer depends on the will of a third party, and deals with the devil always wrap up with repayment.`}),` 498`,E(t.p,{children:[`This snap transition moment for software development happened after November 2025, after a series of models (Opus 4.5 and GPT 5.2 Codex) made agents viable. `,T(t.a,{href:`https://github.com/neomjs/neo#the-two-hemispheres`,children:`Its`}),` `,T(t.a,{href:`https://youtu.be/9WjPdgOK-68?t=2833&si=hKQAlVSbo4DNO_Lm`,children:`reception`}),` `,T(t.a,{href:`https://www.youtube.com/watch?v=iPUn1Fnfn0k`,children:`and impact on developers`}),` `,T(t.a,{href:`https://dontbeameatproxy.com/`,children:`has`}),` `,T(t.a,{href:`https://github.com/garrytan/gstack`,children:`been`}),` `,T(t.a,{href:`https://github.com/garrytan/gstack/blob/main/docs/ON_THE_LOC_CONTROVERSY.md#:~:text=The%20
498delta%20isn%27t%20that%20I%20became%20a%20better%20programmer.%20If%20anything%2C%20my%20mental%20model%20of%20coding%20has%20atrophied`,children:`varied`}),` `,T(t.a,{href:`https://geohot.github.io/blog/jekyll/update/2026/05/24/the-eternal-sloptember.html`,children:`so`}),` `,T(t.a,{href:`https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04`,children:`far`}),`.`]}),` 499`,T(t.p,{children:`A subset has chosen not to use AI or to use it just for debugging, reviewing and information retrieval, but even among those their experience has meaningfully changed, with increased code review workload and decreased collaboration between colleagues. Another percentage has embraced it more fully and enjoys it a lot. Most people probably sit somewhere in the middle.`}),` 500`,E(t.p,{children:[`The truth is that the act of programming used to be an instrument for thought. A live environment for human-machine symbiosis that `,T(t.a,{href:`https://en.wikipedia.org/wiki/Intelligence_amplification`,children:`amplified people's intelligence`}),`, but only for the select few that learned its idiosyncrasies.`]}),` 501`,T(r,{children:T(t.p,{children:`The skilled programmer is necessary only because the distance between the 502computer implementation of a task and a person's mental conception of it is 503too great.`})}),` 504`,T(s,{children:T(t.p,{children:`Alan Kay`})}),` 505`,E(t.p,{children:[`We started off by thinking about problems, how to express and decompose them. How to `,T(t.a,{href:`https://caseymuratori.com/blog_0015`,children:`compress them`}),` to reuse them. How it was like to use for other people to read in this (or other) project. What the process for collaboration would be like, and how to make sure it was reliable for people.`]}),` 506`,T(t.p,{children:`Depending on what each developer valued, they probably have different aspects to celebrate or grieve during this transition.`}),` 507`,E(i,{children:[T(t.p,{children:`Feel free to skip this one if you want.`}),T(t.p,{children:`Personally, I'm a designer that happens to code. I care about how people understand and use things. Developers are (were?) also users.`}),T(t.p,{children:`I care about compression. Reusable patterns both for end-users (design systems and components) and developers (understandable units of computation).`}),T(t.p,{children:`Lastly, I also care about democratization and openness. About people owning their own destiny, collaborating and learning together. `}),T(t.p,{children:`On this I see a paradox, where there's never been more on-demand software but coming from just a handful of AI models and labs.`}),T(t.p,{children:`I learned to code shortly before ChatGPT dropped.`}),T(t.p,{children:` Not for more money in the future, but to actually be able to push things through when needed.`}),T(t.p,{children:`I walked away with a new-found appreciation of those idiosyncrasies.`}),E(t.p,{children:[`I was in awe of how people like Jake Wharton contributed that much to open source whenever I did anything Android related. Or Antfu in TS. 508I appreciated the extent to which Swift went for human ergonomics, like trailing closures, named arguments and `,T(t.code,{children:`.case`}
508),` enum syntax. Isn't it cool how the V-DOM works in Vue? And composables are so nice. 509Getting literal dreams (or nightmares?) about programming in Swift because of time crunch`,`.`]}),E(t.p,{children:[`I learned Vim keybindings and even used Emacs with `,T(n,{title:`Emacs package for Helix-like keybindings`,children:`Meow`}),` for a while. 510I silently celebrated when Xcode 14 added Vim keybindings too. 511I learned Colemak-DH with the ISO Angle mod. Then I changed over to `,T(t.a,{href:`https://gitlab.com/manueljlin/qmk-configs`,children:`a layout based on Canary`}),` on a couple of QMK keyboards, including the Framework 16 I'm typing this on. 512I got The Little Typer, TAPL and ATTAPL, and read the first one on the way to Akademy 2024, the first time I ever traveled abroad by myself outside of Spain.`]}),T(t.p,{children:`I don't want people to lose that sense of wonder.`}),T(t.hr,{}),T(t.p,{children:`Software's scarcity meant that the grip on people was in that layer, and open source was the counterweight. The gap could be closed with labor. GCC, Wine, FFmpeg...`}),T(t.p,{children:`AI didn't relax that grip but moved it a layer above to compute and data, which is heavily capital intensive. `}),T(t.p,{children:`I can make peace with software changing. I can't do the same for the grip moving elsewhere and not being able to do much about it. I hope local open weight models are, eventually, a realistic counterweight.`})]}),` 513`,E(r,{children:[T(t.p,{children:`Today with the advent of inexpensive computers, for the first time the average man is presented with a powerful medium through which his ideas can attain a life of their own.`}),T(t.p,{children:`A computer program is a creation: unusual, appropriate, in a very real sense a work of art, perhaps more so than computer "scientists" like to admit. Many programmers have felt a sense of creative excitement watching their programs execute on a computer without needing their intervention, particularly if they can watch the programs progress with their own eyes.`}),T(t.p,{children:`Surprise, stimulation, satisfaction and savoring are the rewards of creativity.`})]}),` 514`,T(s,{children:E(t.p,{children:[`David Canfield Smith's Ph.D. thesis `,T(t.em,{children:`Pygmalion`}),`, 1975`]})}),` 515`,T(t.p,{children:`The software industry formed around selling tools to sidestep this difficulty. A computer to users was an appliance that happened to run tools and instruments, its (somewhat flawed) symbiosis happening one layer above â the app layer â but with the friction of those pieces not talking through each other natively.`}),` 516`,E(r,{children:[E(t.p,{children:[`But what we're trying to get is- we're trying to get away from programming. 517We've got to get away from programming because people don't want to `,T(t.em,{children:`program`}),` computers, people want to `,T(t.em,{children:`use`}),` computers.`]}),T(t.p,{children:`And so our strategy right now is, let's write some programs that are generic. 518We'll write 90% of the program and you fill the last 10% of the blanks.`}),T(t.p,{children:`[â¦]`}),E(t.p,{children:[`Now, let me give you an example of how this can work. We have a million Apple `,E(`span`,{class:`whitespace-nowrap`,children:[T(`span`,{"aria-hidden":`true`,children:`][s`}),T(`span`,{class:`sr-only`,children:`IIs`})]}),` out there â a `,T(t.em,{children:`million`}),`. And people have paid about $2k for them. So if they can buy a new program, one of these new diskettes for $100 that lets their computers do something totally new that it never could do before, that's a good deal.`]})]}),` 519`,T(s,{children:E(t.p,{children:[`Steve Jobs at the `,T(t.em,{children:`International Design Conference`}),` in Aspen, 1983`]})}),` 520`,T(t.p,{children:`Generative AI happens to both stress this industry's economic model, but more importantly, instruments in general.`}),` 521`,T(t.p,{children:`Older non-agentic integrations like long form chats for documentation retrieval and code snippets were something developers explicitly reached out for. Every message and thread was a primitive for understanding. It didn't mutate the environment, so it was easier mentally to phase in and out from without thinking about side-effects.`}),` 522`,E(t.p,{children:[`Tab-complete (`,T(n,{title:`Fill-in-the-Middle`,children:`FIM`}),` and `,T(n,{title:`Next-Edit Prediction`,children:`NEP`}),`/`,T(n,{title:`Next-Edit Sequence`,children:`NES`}),`) added some tiny friction and mutation, but each individual suggested change was atomic enough to be absorbed at a glance. Some `,T(t.a,{href:`https://www.inceptionlabs.ai/blog/introducing-mercury-edit-2`,children:`recent enough`}),` `,T(t.a,{href:`https://huggingface.co/zed-industries/zeta-2`,children:`models are`}),` `,T(t.a,{href:`https://huggingface.co/sweepai/sweep-next-edit-v2-7B`,children:`still coming out`}),` with that UX in mind but it's been largely superseded.`]}),` 523`,E(t.p,{children:[`In contrast, our current AI agentic paradigm (like through parallelization, scheduled agents, loops), rewards decreased `,T(t.em,{children:`human`}),`-in-the-loop friction and understanding.`]}),` 524`,T(t.p,{children:`We've decoupled active incremental engagement from the act of creation. That engagement used to be our instrument for thought.`}),` 525`,T(t.p,{children:`Now we process that cognitive glut at once, if at all. That's our repayment.`}),` 526`,T(a,{src:Ot,alt:`A tweet from user @mycoliza saying 'i wanted "a bicycle for the mind but what we got was âDoordash for Thinkingâ'`}),` 527`,T(t.p,{children:`Licklider would call this a (temporary?) example of the "humanly extended machine", where a previously symbiotic relationship has lost its balance, and people now help AI instead of the other way around. With current interfaces, it requires temporarily handing over your agency to AI, which means you trade your future growth and understanding.`}),` 528`,E(r,{children:[T(t.p,{children:`In some instances, particularly in large computer-centered information and control systems, the human operators are responsible mainly for functions that it proved infeasible to automate. Such systems ("humanly extended machines," North might call them) are not symbiotic systems. They are "semi-automatic" systems, systems that started out to be fully automatic but fell short of the goal.`}),T(t.p,{children:`Man-computer symbiosis is probably not the ultimate paradigm for complex technological systems. It seems entirely possible that, in due course, electronic or chemical "machines" will outdo the human brain in most of the functions we now consider exclusively within its province.`})]}),` 529`,T(s,{children:T(t.p,{children:`Man-Computer Symbiosis by J.C.R. Licklider`})}),` 530`,T(a,{src:kt,alt:[`A subset of a tweet thread from user @mycoliza saying`,`"in contrast to the GUI editor where you're the one driving, but you can occasionally highlight stuff and say âhey go do this boring part for meâ, Claude Code feels more like you're in the backseat of an Uber where the driver keeps making wrong turns and you're yelling at him"`,`"more importantly, none of this is inherent to the underlying mathematical principles behind the technology of having really big neural nets! they are all design and implementation decisions in the layers on top that let users consume the underlying technology."`,`"a good analogy is how the principles behind the internal
530combustion engine work the same regardless of whether you consume it by owning a car, riding the bus, or ordering DoorDash. the technology may be inevitable but the way it's implemented is a choice."`].join(` 531`)}),` 532`,T(t.p,{children:`At worst, it adds top-down pressure to increase activity over capability.`}),` 533`,T(a,{src:At,alt:`A long-form tweet from user @v0xium saying "I am done with this shit. It is over. The state of engineering right now is horrible. It has been half a month since I started a new role at a big company. Nobody knows anything here. The specs, code, tests, PRDs, tickets, resolution of those tickets, reports, etc., everything is made by Claude Code. Nobody on my team likes this. They are being forced to ship as much as they can. I have heard multiple times from higher management that pushing code is not a bottleneck, so why are we slow? People are working 12 to 13 hours a day just to press enter. Nobody is reading anything. Humans in corporate are doing nothing on their own. Everyone, literally everyone, from an L1 to an L7 engineer here is doing the same thing. Talk to Claude. There is no sense of victory. Nobody is resolving bugs. In reality, nobody is thinking anymore. Everything is done by LLMs. It is so soul-sucking. I would not mind it, to be honest, if we were at least given the time to check out the code and see what is going where. But no, the goal is to just ship. No matter what happens."`,children:E(t.p,{children:[`An accidental summary of `,T(t.a,{href:`https://mariozechner.at/posts/2026-03-25-thoughts-on-slowing-the-fuck-down/`,children:`"Thoughts on slowing the fuck down"`}),`, by Mario Zechner.`]})}),` 534`,T(t.p,{children:`I find this negative of a frame of mind unfortunate.`}),` 535`,T(t.p,{children:`Even if one were to wave away wellbeing concerns, in a world where there's more software than ever, quality, empathy and care is the most tangible differentiator you can have. Restraint separates the good enough from the greats.`}),` 536`,T(t.p,{children:`Every company or project should have in their best interests to continually rebalance people back towards symbiosis, even if the way work is done changes.`}),` 537`,T(t.p,{children:`It's been worrying to see this extend to other fields like mathematics, with similar consequences.`}),` 538`,T(a,{src:Mt,alt:`A tweet from user @TaliaRinger saying 'The disempowerment is coming from within the house. Not by the AI tools themselves, but by the companies building them that insist on building AI tools meant to replace rather than collaborate with humans'`}),` 539`,E(t.p,{children:[`Things `,T(t.a,{href:`https://www.youtube.com/watch?v=svl_1upFpQo`,children:`intensified`}),` after Navier-Stokes was solved by an OpenAI model`,T(t.sup,{children:T(t.a,{href:`#user-content-fn-2`,id:`user-content-fnref-2`,"data-footnote-ref":!0,"aria-describedby":`footnote-label`,children:`2`})}),`, and a 13M lines Lean formalization of Fermat's Last Theorem was released by Anthropic`,T(t.sup,{children:T(t.a,{href:`#user-content-fn-3`,id:`user-content-fnref-3`,"data-footnote-ref":!0,"aria-describedby":`footnote-label`,children:`3`})}),`.`]}),` 540`,` 541`,T(a,{src:Pt,alt:`A long-form mathstodon toot from Terence Tao about how exploration isn't about efficiency, how mathematics was an exception, and how that contract could be starting to break`}),` 542`,T(t.p,{children:`The diagnosis is the same. We need instruments for thought and exploration back on the menu, and not just for a handful of fields.`}),` 543`,T(t.p,{children:`We can still shape the new ways work and play are done. It must be the role of design to go back to symbiosis.`}),` 544`,T(t.p,{children:`I wanted to share some thoughts on potential directions, but I didn't want to dilute this message. I'm happy just opening up the conversation on this.`}),` 545`,T(t.p,{children:`Onward.`}),` 546`,T(t.h2,{id:`credits-and-licenses`,children:`Credits and licenses`}),` 547`,E(t.p,{children:[`This post is licensed under `,T(t.a,{href:`https://creativecommons.org/licenses/by-sa/4.0/`,children:`Creative Commons Attribution ShareAlike 4.0`}),`.`]}),` 548`,E(t.ul,{children:[` 549`,E(t.li,{children:[` 550`,T(t.p,{children:T(t.a,{href:`https://x.com/mycoliza/status/2097396240187359608`,children:`"Doordash for Thinking" tweet by @mycoliza`})}),` 551`]}),` 552`,E(t.li,{children:[` 553`,T(t.p,{children:T(t.a,{href:`https://x.com/TaliaRinger/status/2097777594875752459`,children:`"AI tools meant to replace [...] humans" tweet by @TaliaRinger`})}),` 554`]}),` 555`,E(t.li,{children:[` 556`,T(t.p,{children:T(t.a,{href:`https://mathstodon.xyz/@tao/117244103501118293`,children:`Toot by Terence Tao`})}),` 557`]}),` 558`]}),` 559`,` 560`,E(t.section,{"data-footnotes":!0,className:`footnotes`,children:[T(t.h2,{className:``,id:`footnote-label`,children:`Footnotes`}),` 561`,E(t.ol,{children:[` 562`,E(t.li,{id:`user-content-fn-1`,children:[` 563`,E(t.p,{children:[`Also called a "medium" by Kay and Goldberg `,T(t.a,{href:`#user-content-fnref-1`,"data-footnote-backref":``,"aria-label":`Back to reference 1`,className:`data-footnote-backref`,children:`â©`})]}),` 564`]}),` 565`,E(t.li,{id:`user-content-fn-2`,children:[` 566`,E(t.p,{children:[T(t.a,{href:`https://openai.com/index/navier-stokes-solution/`,children:`https://openai.com/index/navier-stokes-solution/`}),` `,T(t.a,{href:`#user-content-fnref-2`,"data-footnote-backref":``,"aria-label":`Back to reference 2`,className:`data-footnote-backref`,children:`â©`})]}),` 567`]}),` 568`,E(t.li,{id:`user-content-fn-3`,children:[` 569`,E(t.p,{children:[T(t.a,{href:`https://www.anthropic.com/research/formalizing-fermats-last-theorem`,children:`https://www.anthropic.com/research/formalizing-fermats-last-theorem`}),` `,T(t.a,{href:`#user-content-fnref-3`,"data-footnote-backref":``,"aria-label":`Back to reference 3`,className:`data-footnote-backref`,children:`â©`})]}),` 570`]}),` 571`]}),` 572`]})]})}function zt(e={}){let{wrapper:t}=e.components||{};return t?T(t,{...e,children:T(Rt,{...e})}):Rt(e)}function Y(e,t){throw Error(`Expected `+(t?`component`:`object`)+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}var Bt=[`en`,`es`],X=e=>Bt.includes(e),[Vt,Ht]=t((()=>
572{if(typeof navigator>`u`||!navigator.languages)return`en`;for(let e of navigator.languages){let t=e.split(`-`)[0];if(X(t))return t}return`en`})()),Ut=e=>new Intl.DisplayNames([e],{type:`language`}),Z=(e,t)=>{let n=Ut(e).of(t);return n.charAt(0).toUpperCase()+n.slice(1)},Wt={en:e=>`Also available in ${e}`,es:e=>`También disponible en ${e}`},Gt=(e,t)=>Wt[e]?.(Z(e,t))??Wt.en(Z(`en`,t)),Kt={en:`Initial`,es:`Inicial`},qt=(e,t)=>{let n=X(e)?e:`en`;return t?.[n]??t?.en??Kt[n]},Jt=e=>{if(!(typeof navigator>`u`||!navigator.languages))for(let t of navigator.languages){let n=t.split(`-`)[0];if(X(n)&&e.includes(n))return n}},Yt=Object.assign({"./posts/1-fontra-101/meta.ts":te,"./posts/2-letter-to-perfectionists/meta.ts":re,"./posts/4-what-is-design/meta.ts":ae,"./posts/5-instrument-for-thought/meta.ts":se}),Xt=Object.assign({"./posts/1-fontra-101/en.mdx":it,"./posts/1-fontra-101/es.mdx":dt,"./posts/2-letter-to-perfectionists/en.mdx":_t,"./posts/4-what-is-design/en.mdx":St,"./posts/5-instrument-for-thought/en.mdx":Ft}),Zt=e=>e.split(`/`).slice(-2)[0],Qt=e=>e.split(`/`).pop().replace(/\.mdx?$/,``),$t=e=>e.replace(/^\d+-/,``),en=e=>Number(e.match(/^(\d+)-/)?.[1]??0),Q=Object.fromEntries(Object.entries(Yt).map(([e,t])=>[Zt(e),t.meta])),$={};for(let[e,t]of Object.entries(Xt)){let n=Zt(e),r=Qt(e);$[n]??={},$[n][r]=t}for(let[e,t]of Object.entries($)){if(!Q[e])throw Error(`[posts] Missing meta.ts in posts/${e}`);for(let n of Object.keys(t))if(!X(n))throw Error(`[posts] Unknown locale '${n}' in posts/${e} â add it to locales in i18n.ts`)}for(let e of Object.keys(Q))if(!$[e]||Object.keys($[e]).length===0)throw Error(`[posts] No language files found in posts/${e}`);var tn=e=>e.includes(`en`)?`en`:e[0],nn=(e,t)=>e.draft?{...t,title:`[draft] ${t.title}`}:t,rn=()=>Object.entries($).filter(([e])=>!Q[e].draft).map(([e,t])=>{let n=Q[e],r=n.slug??$t(e),i=Object.keys(t);return{slug:r,meta:n,langs:i,order:en(e),metadata:nn(n,{date:n.date,...t[tn(i)].metadata})}}),an=(e,t)=>{for(let[n,r]of Object.entries($)){let i=Q[n];if((i.slug??$t(n))!==e)continue;if(i.draft)return;let a=r[t];return a?{slug:e,lang:t,langs:Object.keys(r),meta:i,metadata:nn(i,{date:i.date,...a.metadata}),toc:a.toc??[],content:a.default}:void 0}};export{qt as a,Vt as c,O as d,D as f,Gt as i,R as l,an as n,Z as o,Jt as r,X as s,rn as t,L as u};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.