diff --git a/docs/web/dist/apple-touch-icon.png b/docs/web/dist/apple-touch-icon.png index 8fc895e..0419df1 100644 Binary files a/docs/web/dist/apple-touch-icon.png and b/docs/web/dist/apple-touch-icon.png differ diff --git a/docs/web/dist/assets/index-y37U0USe.js b/docs/web/dist/assets/index-CpircG5P.js similarity index 98% rename from docs/web/dist/assets/index-y37U0USe.js rename to docs/web/dist/assets/index-CpircG5P.js index f4f0aa8..71ae42e 100644 --- a/docs/web/dist/assets/index-y37U0USe.js +++ b/docs/web/dist/assets/index-CpircG5P.js @@ -6,7 +6,7 @@ var e=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports) `+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{We=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?Ue(n):``}function Ke(e,t){switch(e.tag){case 26:case 27:case 5:return Ue(e.type);case 16:return Ue(`Lazy`);case 13:return e.child!==t&&t!==null?Ue(`Suspense Fallback`):Ue(`Suspense`);case 19:return Ue(`SuspenseList`);case 0:case 15:return Ge(e.type,!1);case 11:return Ge(e.type.render,!1);case 1:return Ge(e.type,!0);case 31:return Ue(`Activity`);case 30:return Ue(`ViewTransition`);default:return``}}function qe(e){try{var t=``,n=null;do t+=Ke(e,n),n=e,e=e.return;while(e);return t}catch(e){return` Error generating stack: `+e.message+` `+e.stack}}var Je=Object.prototype.hasOwnProperty,Ye=t.unstable_scheduleCallback,Xe=t.unstable_cancelCallback,Ze=t.unstable_shouldYield,Qe=t.unstable_requestPaint,$e=t.unstable_now,et=t.unstable_getCurrentPriorityLevel,tt=t.unstable_ImmediatePriority,nt=t.unstable_UserBlockingPriority,rt=t.unstable_NormalPriority,it=t.unstable_LowPriority,at=t.unstable_IdlePriority,ot=t.log,st=t.unstable_setDisableYieldValue,ct=null,lt=null;function ut(e){if(typeof ot==`function`&&st(e),lt&&typeof lt.setStrictMode==`function`)try{lt.setStrictMode(ct,e)}catch{}}var dt=Math.clz32?Math.clz32:mt,ft=Math.log,pt=Math.LN2;function mt(e){return e>>>=0,e===0?32:31-(ft(e)/pt|0)|0}var ht=256,gt=262144,_t=4194304;function vt(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&-e;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function yt(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=vt(n))):i=vt(o):i=vt(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=vt(n))):i=vt(o)):i=vt(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function bt(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function xt(e,t){t&8&&(t|=t&32);var n=e.entangledLanes;if(n!==0)for(e=e.entanglements,n&=t;0n;n++)t.push(e);return t}function Tt(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Et(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0=wr),Dr=` `,Or=!1;function kr(e,t){switch(e){case`keyup`:return Sr.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function Ar(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var jr=!1;function Mr(e,t){switch(e){case`compositionend`:return Ar(t);case`keypress`:return t.which===32?(Or=!0,Dr):null;case`textInput`:return e=t.data,e===Dr&&Or?null:e;default:return null}}function Nr(e,t){if(jr)return e===`compositionend`||!Cr&&kr(e,t)?(e=Gn(),Wn=Un=Hn=null,jr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=ni(n)}}function ii(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ii(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ai(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=ti(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=ti(e.document)}return t}function oi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var si=zn&&`documentMode`in document&&11>=document.documentMode,ci=null,li=null,ui=null,di=!1;function fi(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;di||ci==null||ci!==ti(r)||(r=ci,`selectionStart`in r&&oi(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),ui&&ei(ui,r)||(ui=r,r=Jf(li,`onSelect`),0>=o,i-=o,ca=1<<32-dt(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),o=a(_,o,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),A&&ua(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(i,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(i,h),o=a(y,o,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(i,h),A&&ua(i,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(i,v.value,l),v!==null&&(o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return A&&ua(i,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,i,g,v.value,l),v!==null&&(e&&(_=v.alternate,_!==null&&h.delete(_.key===null?g:_.key)),o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(i,e)}),A&&ua(i,g),u}function _(e,r,a,c){if(typeof a==`object`&&a&&a.type===ce&&a.key===null&&a.props.ref===void 0&&(a=a.props.children),typeof a==`object`&&a){switch(a.$$typeof){case oe:a:{for(var l=a.key;r!==null;){if(r.key===l){if(l=a.type,l===ce){if(r.tag===7){n(e,r.sibling),c=i(r,a.props.children),vo(c,a),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===_e&&uo(l)===r.type){n(e,r.sibling),c=i(r,a.props),vo(c,a),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}a.type===ce?(c=Yi(a.props.children,e.mode,c,a.key),vo(c,a),c.return=e,e=c):(c=Ji(a.type,a.key,a.props,null,e.mode,c),vo(c,a),c.return=e,e=c)}return o(e);case se:a:{for(l=a.key;r!==null;){if(r.key===l){if(r.tag===4&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),c=i(r,a.children||[]),c.return=e,e=c;break a}n(e,r);break}t(e,r),r=r.sibling}c=Qi(a,e.mode,c),c.return=e,e=c}return o(e);case _e:return a=uo(a),_(e,r,a,c)}if(De(a))return h(e,r,a,c);if(we(a)){if(l=we(a),typeof l!=`function`)throw Error(s(150));return a=l.call(a),g(e,r,a,c)}if(typeof a.then==`function`)return _(e,r,_o(a),c);if(a.$$typeof===fe)return _(e,r,Ia(e,a),c);yo(e,a)}return typeof a==`string`&&a!==``||typeof a==`number`||typeof a==`bigint`?(a=``+a,r!==null&&r.tag===6?(n(e,r.sibling),c=i(r,a),c.return=e,e=c):(n(e,r),c=Xi(a,e.mode,c),c.return=e,e=c),o(e)):n(e,r)}return function(e,t,n,r){try{go=0;var i=_(e,t,n,r);return ho=null,i}catch(t){if(t===io||t===oo)throw t;var a=Wi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var xo=bo(!0),So=bo(!1),Co=!1;function wo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function To(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Eo(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Do(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,W&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=Vi(e),Bi(e,null,n),t}return Li(e,r,t,n),Vi(e)}function Oo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ot(e,n)}}function ko(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n}else e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Ao=!1;function jo(){if(Ao){var e=Ya;if(e!==null)throw e}}function Mo(e,t,n,r){Ao=!1;var i=e.updateQueue;Co=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(q&f)===f:(r&f)===f){f!==0&&f===Ja&&(Ao=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,h=s;f=t;var g=n;switch(h.tag){case 1:if(m=h.payload,typeof m==`function`){d=m.call(g,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=h.payload,f=typeof m==`function`?m.call(g,d,f):m,f==null)break a;d=S({},d,f);break a;case 2:Co=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),sd|=o,e.lanes=o,e.memoizedState=d}}function No(e,t){if(typeof e!=`function`)throw Error(s(191,e));e.call(t)}function Po(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=C.T,s={};s.types=o===null?null:o.types,C.T=s,_c(e,!1,t,n);try{var c=i(),l=C.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?gc(e,t,Qa(c,r),jd(e)):gc(e,t,r,jd(e))}catch(n){gc(e,t,{then:function(){},status:`rejected`,reason:n},jd())}finally{w.p=a,o!==null&&s.types!==null&&(o.types=s.types),C.T=o}}function oc(){}function sc(e,t,n,r){if(e.tag!==5)throw Error(s(476));var i=cc(e).queue;ac(e,i,t,Oe,n===null?oc:function(){return lc(e),n(r)})}function cc(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:Oe,baseState:Oe,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:vs,lastRenderedState:Oe},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:vs,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function lc(e){var t=cc(e);t.next===null&&(t=e.alternate.memoizedState),gc(e,t.next.queue,{},jd())}function uc(){return Fa(sh)}function dc(){return I().memoizedState}function fc(){return I().memoizedState}function pc(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=jd();e=Eo(n);var r=Do(t,e,n);r!==null&&(Pd(r,t,n),Oo(r,t,n)),t={cache:Va()},e.payload=t;return}t=t.return}}function mc(e,t,n){var r=jd();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},vc(e)?yc(t,n):(n=Ri(e,t,n,r),n!==null&&(Pd(n,e,r),bc(n,t,r)))}function hc(e,t,n){gc(e,t,n,jd())}function gc(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(vc(e))yc(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,$r(s,o))return Li(e,t,i,0),G===null&&Ii(),!1}catch{}if(n=Ri(e,t,i,r),n!==null)return Pd(n,e,r),bc(n,t,r),!0}return!1}function _c(e,t,n,r){if(r={lane:2,revertLane:Pf(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},vc(e)){if(t)throw Error(s(479))}else t=Ri(e,n,r,2),t!==null&&Pd(t,e,2)}function vc(e){var t=e.alternate;return e===M||t!==null&&t===M}function yc(e,t){$o=Qo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function bc(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Ot(e,n)}}var xc={readContext:Fa,use:gs,useCallback:F,useContext:F,useEffect:F,useImperativeHandle:F,useLayoutEffect:F,useInsertionEffect:F,useMemo:F,useReducer:F,useRef:F,useState:F,useDebugValue:F,useDeferredValue:F,useTransition:F,useSyncExternalStore:F,useId:F,useHostTransitionStatus:F,useFormState:F,useActionState:F,useOptimistic:F,useMemoCache:F,useCacheRefresh:F,useEffectEvent:F},Sc={readContext:Fa,use:gs,useCallback:function(e,t){return ps().memoizedState=[e,t===void 0?null:t],e},useContext:Fa,useEffect:Ks,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),Ws(4194308,4,Qs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Ws(4194308,4,e,t)},useInsertionEffect:function(e,t){Ws(4,2,e,t)},useMemo:function(e,t){var n=ps();t=t===void 0?null:t;var r=e();if(es){ut(!0);try{e()}finally{ut(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=ps();if(n!==void 0){var i=n(t);if(es){ut(!0);try{n(t)}finally{ut(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=mc.bind(null,M,e),[r.memoizedState,e]},useRef:function(e){var t=ps();return e={current:e},t.memoizedState=e},useState:function(e){e=Os(e);var t=e.queue,n=hc.bind(null,M,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:ec,useDeferredValue:function(e,t){return rc(ps(),e,t)},useTransition:function(){var e=Os(!1);return e=ac.bind(null,M,e.queue,!0,!1),ps().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=M,i=ps();if(A){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),G===null)throw Error(s(349));q&127||Cs(r,t,n)}i.memoizedState=n;var a={value:n,getSnapshot:t};return i.queue=a,Ks(Ts.bind(null,r,a,e),[e]),r.flags|=2048,Hs(9,{destroy:void 0},ws.bind(null,r,a,n,t),null),n},useId:function(){var e=ps(),t=G.identifierPrefix;if(A){var n=la,r=ca;n=(r&~(1<<32-dt(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=ts++,0<\/script>`,a=a.removeChild(a.firstChild);break;case`select`:a=typeof r.is==`string`?o.createElement(`select`,{is:r.is}):o.createElement(`select`),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a=typeof r.is==`string`?o.createElement(i,{is:r.is}):o.createElement(i)}}a[Ft]=t,a[It]=r;a:for(o=t.child;o!==null;){if(o.tag===5||o.tag===6)a.appendChild(o.stateNode);else if(o.tag!==4&&o.tag!==27&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break a;for(;o.sibling===null;){if(o.return===null||o.return===t)break a;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=a;a:switch(np(a,i,r),i){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&vl(t)}}return z(t),t.subtreeFlags&=-33554433,yl(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&vl(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(s(166));if(e=Fe.current,xa(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,i=O,i!==null)switch(i.tag){case 27:case 5:r=i.memoizedProps}e[Ft]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||ep(e.nodeValue,n)),e||va(t,!0)}else e=lp(e).createTextNode(r),e[Ft]=t,t.stateNode=e}return z(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=xa(t),n!==null){if(e===null){if(!r)throw Error(s(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(s(557));e[Ft]=t}else Sa(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;z(t),e=!1}else n=Ca(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(Ko(t),t):(Ko(t),null);if(t.flags&128)throw Error(s(558))}return z(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=xa(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(s(318));if(i=t.memoizedState,i=i===null?null:i.dehydrated,!i)throw Error(s(317));i[Ft]=t}else Sa(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;z(t),i=!1}else i=Ca(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(Ko(t),t):(Ko(t),null)}return Ko(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,i=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(i=r.alternate.memoizedState.cachePool.pool),a=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(a=r.memoizedState.cachePool.pool),a!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),xl(t,t.updateQueue),z(t),null);case 4:return Re(),e===null&&Wf(t.stateNode.containerInfo),t.flags|=67108864,z(t),null;case 10:return ka(t.type),z(t),null;case 19:if(Yo(t),r=t.memoizedState,r===null)return z(t),null;if(i=!!(t.flags&128),a=r.rendering,a===null){if(i)Sl(r,!1);else{if(Y!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(a=Xo(e),a!==null){for(t.flags|=128,Sl(r,!1),e=a.updateQueue,t.updateQueue=e,xl(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)qi(n,e),n=n.sibling;return Jo(t,qo.current&1|2),A&&ua(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&$e()>_d&&(t.flags|=128,i=!0,Sl(r,!1),t.lanes=4194304)}}else{if(!i){if(e=Xo(a),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,xl(t,e),Sl(r,!0),r.tail===null&&r.tailMode!==`collapsed`&&r.tailMode!==`visible`&&!a.alternate&&!A)return z(t),null}else 2*$e()-r.renderingStartTime>_d&&n!==536870912&&(t.flags|=128,i=!0,Sl(r,!1),t.lanes=4194304)}r.isBackwards?(a.sibling=t.child,t.child=a):(e=r.last,e===null?t.child=a:e.sibling=a,r.last=a)}if(r.tail!==null){e=r.tail;a:{for(n=e;n!==null;){if(n.alternate!==null){n=!1;break a}n=n.sibling}n=!0}return r.rendering=e,r.tail=e.sibling,r.renderingStartTime=$e(),e.sibling=null,a=qo.current,a=i?a&1|2:a&1,r.tailMode===`visible`||r.tailMode===`collapsed`||!n||A?Jo(t,a):(n=a,T(Bo,t),T(qo,n),Vo===null&&(Vo=t)),A&&ua(t,r.treeForkCount),e}return z(t),null;case 22:case 23:return Ko(t),zo(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(z(t),t.subtreeFlags&6&&(t.flags|=8192)):z(t),n=t.updateQueue,n!==null&&xl(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&Me(eo),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),ka(j),z(t),null;case 25:return null;case 30:return t.flags|=33554432,z(t),null}throw Error(s(156,t.tag))}function wl(e,t){switch(pa(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ka(j),Re(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Be(t),null;case 31:if(t.memoizedState!==null){if(Ko(t),t.alternate===null)throw Error(s(340));Sa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Ko(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Sa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Yo(t),e=t.flags,e&65536?(t.flags=e&-65537|128,e=t.memoizedState,e!==null&&(e.rendering=null,e.tail=null),t.flags|=4,t):null;case 4:return Re(),null;case 10:return ka(t.type),null;case 22:case 23:return Ko(t),zo(),e!==null&&Me(eo),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return ka(j),null;case 25:return null;default:return null}}function Tl(e,t){switch(pa(t),t.tag){case 3:ka(j),Re();break;case 26:case 27:case 5:Be(t);break;case 4:Re();break;case 31:t.memoizedState!==null&&Ko(t);break;case 13:Ko(t);break;case 19:Yo(t);break;case 10:ka(t.type);break;case 22:case 23:Ko(t),zo(),e!==null&&Me(eo);break;case 24:ka(j)}}function El(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Dl(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Ol(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{Po(t,n)}catch(t){Z(e,e.return,t)}}}function kl(e,t,n){n.props=kc(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function Al(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:var i=e.stateNode,a=ki(e.memoizedProps,i);(i.ref===null||i.ref.name!==a)&&(i.ref=Pp(a)),r=i.ref;break;case 7:if(e.stateNode===null){var o=new Fp(e);h(e.child,!1,Qp,o,void 0,void 0),e.stateNode=o}r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function jl(e,t){var n=e.ref,r=e.refCleanup;if(n!==null){if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}}function Ml(e,t){if((e.tag===5||e.tag===27||e.tag===6)&&e.alternate===null&&t!==null)for(var n=0;n title`))),np(r,t,n),r[Ft]=e,E(r),t=r;break a;case`link`:if(a=Gm(`link`,`href`,i).get(t+(n.href||``))){for(o=0;og&&(o=g,g=h,h=o);var _=ri(s,h),v=ri(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,C.T=null,n=wd,wd=null;var a=bd,o=Sd;if(X=0,xd=bd=null,Sd=0,W&6)throw Error(s(331));var c=W;if(W|=4,Zu(a.current),Uu(a,a.current,o,n),W=c,Df(0,!1),lt&&typeof lt.onPostCommitFiberRoot==`function`)try{lt.onPostCommitFiberRoot(ct,a)}catch{}return!0}finally{w.p=i,C.T=r,uf(e,t)}}function pf(e,t,n){t=ea(n,t),t=Fc(e.stateNode,t,2),e=Do(e,t,2),e!==null&&(Tt(e,2),Ef(e))}function Z(e,t,n){if(e.tag===3)pf(e,e,n);else for(;t!==null;){if(t.tag===3){pf(t,e,n);break}if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(yd===null||!yd.has(r))){e=ea(n,e),n=Ic(2),r=Do(t,n,2),r!==null&&(Lc(n,r,t,e),Tt(r,2),Ef(r));break}}t=t.return}}function mf(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new td;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(ad=!0,i.add(n),e=hf.bind(null,e,t,n),t.then(e,e))}function hf(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,G===e&&(q&n)===n&&(Y===4||Y===3&&(q&62914560)===q&&300>$e()-hd?W&2?ld|=n:Vd(e,0):ld|=n,dd===q&&(dd=0)),Ef(e)}function gf(e,t){t===0&&(t=Ct()),e=zi(e,t),e!==null&&(Tt(e,t),Ef(e))}function _f(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),gf(e,n)}function vf(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(s(314))}r!==null&&r.delete(t),gf(e,n)}function yf(e,t){return Ye(e,t)}var bf=null,xf=null,Sf=!1,Cf=!1,wf=!1,Tf=0;function Ef(e){e!==xf&&e.next===null&&(xf===null?bf=xf=e:xf=xf.next=e),Cf=!0,Sf||(Sf=!0,Nf())}function Df(e,t){if(!wf&&Cf){wf=!0;do for(var n=!1,r=bf;r!==null;){if(!t){if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-dt(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,Mf(r,a))}else a=q,a=yt(r,r===G?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||bt(r,a)||(n=!0,Mf(r,a))}r=r.next}while(n);wf=!1}}function Of(){kf()}function kf(){Cf=Sf=!1;var e=0;Tf!==0&&hp()&&(e=Tf);for(var t=$e(),n=null,r=bf;r!==null;){var i=r.next,a=Af(r,t);a===0?(r.next=null,n===null?bf=i:n.next=i,i===null&&(xf=n)):(n=r,(e!==0||a&3)&&(Cf=!0)),r=i}X!==0&&X!==5||Df(e,!1),Tf!==0&&(Tf=0)}function Af(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&ap(d)&&(c=c.responseEnd,o+=u*(c$m){s.length=o;break}f=new Promise(jp.bind(f)),s.push(f)}}}if(0`u`?null:document;function Tm(e,t,n){var r=wm;if(r&&typeof t==`string`&&t){var i=hn(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),ym.has(i)||(ym.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),np(t,`link`,e),E(t),r.head.appendChild(t)))}}function Em(e){xm.D(e),Tm(`dns-prefetch`,e,null)}function Dm(e,t){xm.C(e,t),Tm(`preconnect`,e,t)}function Om(e,t,n){xm.L(e,t,n);var r=wm;if(r&&e&&t){var i=`link[rel="preload"][as="`+hn(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+hn(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+hn(n.imageSizes)+`"]`)):i+=`[href="`+hn(e)+`"]`;var a=i;switch(t){case`style`:a=Pm(e);break;case`script`:a=Rm(e)}if(!(vm.has(a)||(e=S({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),vm.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Fm(a))||t===`script`&&r.querySelector(zm(a))))){var o=r.createElement(`link`);np(o,`link`,e),t===`style`&&(o[Ut]=!0,o.onload=o.onerror=function(){Yt(o)}),E(o),r.head.appendChild(o)}}}function km(e,t){xm.m(e,t);var n=wm;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+hn(r)+`"][href="`+hn(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Rm(e)}if(!vm.has(a)&&(e=S({rel:`modulepreload`,href:e},t),vm.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(zm(a)))return}r=n.createElement(`link`),np(r,`link`,e),E(r),n.head.appendChild(r)}}}function Am(e,t,n){xm.S(e,t,n);var r=wm;if(r&&e){var i=Jt(r).hoistableStyles,a=Pm(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Fm(a)))s.loading=5;else{e=S({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=vm.get(a))&&Hm(e,n);var c=o=r.createElement(`link`);E(c),np(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Vm(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function jm(e,t){xm.X(e,t);var n=wm;if(n&&e){var r=Jt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=S({src:e,async:!0},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),E(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mm(e,t){xm.M(e,t);var n=wm;if(n&&e){var r=Jt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=S({src:e,async:!0,type:`module`},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),E(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Nm(e,t,n,r){var i=(i=Fe.current)?bm(i):null;if(!i)throw Error(s(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(n=Pm(n.href),t=Jt(i).hoistableStyles,r=t.get(n),r||(r={type:`style`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Pm(n.href);var a=Jt(i).hoistableStyles,o=a.get(e);if(o||(i=i.ownerDocument||i,o={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},a.set(e,o),(a=i.querySelector(Fm(e)))?a._p||(o.instance=a,o.state.loading=5):(a=vm.get(e),a||(a={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},vm.set(e,a)),Lm(i,e,a,o.state))),t&&r===null)throw Error(s(528,``));return o}if(t&&r!==null)throw Error(s(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(n=Rm(n),t=Jt(i).hoistableScripts,r=t.get(n),r||(r={type:`script`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Pm(e){return`href="`+hn(e)+`"`}function Fm(e){return`link[rel="stylesheet"][`+e+`]`}function Im(e){return S({},e,{"data-precedence":e.precedence,precedence:null})}function Lm(e,t,n,r){if(t=e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)){if(!0!==t[Ut]){r.loading=1;return}}else t=e.createElement(`link`),t[Ut]=!0,t.onload=t.onerror=Yt.bind(null,t),np(t,`link`,n),E(t),e.head.appendChild(t);r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2})}function Rm(e){return`[src="`+hn(e)+`"]`}function zm(e){return`script[async]`+e}function Bm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+hn(n.href)+`"]`);if(r)return t.instance=r,E(r),r;var i=S({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),E(r),np(r,`style`,i),Vm(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Pm(n.href);var a=e.querySelector(Fm(i));if(a)return t.state.loading|=4,t.instance=a,E(a),a;r=Im(n),(i=vm.get(i))&&Hm(r,i),a=(e.ownerDocument||e).createElement(`link`),E(a);var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),t.state.loading|=4,Vm(a,n.precedence,e),t.instance=a;case`script`:return a=Rm(n.src),(i=e.querySelector(zm(a)))?(t.instance=i,E(i),i):(r=n,(i=vm.get(a))&&(r=S({},n),Um(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),E(i),np(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(s(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Vm(r,n.precedence,e));return t.instance}function Vm(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function qm(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Jm(e,t){return e===`img`&&t.src!=null&&t.src!==``&&t.onLoad==null&&t.loading!==`lazy`}function Ym(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Xm(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio==`number`?devicePixelRatio:1)*.25}function Zm(e,t){typeof t.decode==`function`&&(e.imgCount++,t.complete||(e.imgBytes+=Xm(t),e.suspenseyImages.push(t)),e=rh.bind(e),t.decode().then(e,e))}function Qm(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Pm(r.href),a=t.querySelector(Fm(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=nh.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,E(a);return}a=t.ownerDocument||t,r=Im(r),(i=vm.get(i))&&Hm(r,i),a=a.createElement(`link`),E(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=nh.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var $m=0;function eh(e,t){return e.stylesheets&&e.count===0&&ah(e,e.stylesheets),0$m?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function th(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)ah(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function nh(){this.count--,th(this)}function rh(){this.imgCount--,th(this)}var ih=null;function ah(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ih=new Map,t.forEach(oh,e),ih=null,nh.call(e))}function oh(e,t){if(!(t.state.loading&4)){var n=ih.get(e);if(n)var r=n.get(null);else{n=new Map,ih.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=s()}));n();var l=c(),u=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),d=e(((e,t)=>{t.exports=u()}))();function f({rel:e,name:t,alt:n,caption:r,feature:i=``}){return(0,d.jsxs)(`figure`,{className:`shot ${i}`,children:[(0,d.jsx)(`a`,{href:`${e}img/${t}`,target:`_blank`,rel:`noopener noreferrer`,children:(0,d.jsx)(`img`,{src:`${e}img/${t}`,alt:n,loading:`lazy`,decoding:`async`})}),r&&(0,d.jsx)(`figcaption`,{children:r})]})}function p({children:e,label:t}){return(0,d.jsxs)(`div`,{className:`code-block`,children:[t&&(0,d.jsx)(`span`,{className:`code-label`,children:t}),(0,d.jsx)(`pre`,{children:(0,d.jsx)(`code`,{children:e})})]})}function m({children:e}){return(0,d.jsx)(`kbd`,{className:`kbd`,children:e})}function h({tone:e=`ok`,children:t}){return(0,d.jsx)(`span`,{className:`badge badge-${e}`,children:t})}function g({kicker:e,title:t,lede:n}){return(0,d.jsxs)(`header`,{className:`page-head`,children:[e&&(0,d.jsx)(`p`,{className:`kicker`,children:e}),(0,d.jsx)(`h1`,{children:t}),n&&(0,d.jsx)(`p`,{className:`lede`,children:n})]})}function _({rel:e}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(`div`,{className:`hero`,children:[(0,d.jsxs)(`div`,{children:[(0,d.jsx)(`p`,{className:`kicker yellow`,children:`docker · github actions · kubernetes`}),(0,d.jsxs)(`h1`,{children:[`DevOps scaffolding,`,(0,d.jsx)(`br`,{}),`deterministically.`]}),(0,d.jsx)(`p`,{className:`lede`,children:`DevOpsGen reads your Go or Node.js project and writes a complete, opinionated DevOps baseline: hardened Dockerfile, GitHub Actions pipeline and ready-to-apply Kubernetes manifests — with dry-run plans, automatic backups and config validation built in.`}),(0,d.jsxs)(`div`,{className:`hero-cta`,children:[(0,d.jsx)(`a`,{className:`btn`,href:`${e}getting-started/`,children:`Get started`}),(0,d.jsx)(`a`,{className:`btn btn-pink`,href:`${e}wizard/`,children:`Take the wizard tour`})]})]}),(0,d.jsx)(f,{rel:e,name:`wizard.png`,alt:`DevOpsGen interactive wizard running in a Windows terminal, asking for the project stack`,caption:`The interactive wizard — press Enter to accept smart defaults.`,feature:`shot-feature`})]}),(0,d.jsx)(`h2`,{children:`Why DevOpsGen`}),(0,d.jsxs)(`div`,{className:`cards`,children:[(0,d.jsxs)(`div`,{className:`card`,children:[(0,d.jsx)(`h3`,{children:`Deterministic`}),(0,d.jsxs)(`p`,{children:[`Same inputs, same bytes — every run. Machine-friendly for code review: a second generation with `,(0,d.jsx)(`code`,{children:`--force`}),` produces bit-identical files.`]})]}),(0,d.jsxs)(`div`,{className:`card`,children:[(0,d.jsx)(`h3`,{children:`Safe by default`}),(0,d.jsxs)(`p`,{children:[`Existing files are never overwritten without `,(0,d.jsx)(`code`,{children:`--force`}),`. Overwrites get`,` `,(0,d.jsx)(`code`,{children:`.bak`}),` backups, failed runs roll back automatically, and`,` `,(0,d.jsx)(`code`,{children:`--dry-run`}),` prints the full plan first.`]})]}),(0,d.jsxs)(`div`,{className:`card`,children:[(0,d.jsx)(`h3`,{children:`Validated output`}),(0,d.jsx)(`p`,{children:`Built-in validation checks Dockerfile structure, GitHub Actions workflow wiring and Kubernetes manifests (selector consistency, port ranges, Ingress paths) before anything ships.`})]}),(0,d.jsxs)(`div`,{className:`card`,children:[(0,d.jsx)(`h3`,{children:`Stack aware`}),(0,d.jsxs)(`p`,{children:[`Detects Go and Node.js projects (npm, pnpm, Express, Next.js, Vite, NestJS) from`,` `,(0,d.jsx)(`code`,{children:`go.mod`}),` / `,(0,d.jsx)(`code`,{children:`package.json`}),` and tailors templates accordingly.`]})]})]}),(0,d.jsx)(`h2`,{children:`Everything a project needs on day one`}),(0,d.jsxs)(`p`,{children:[`One `,(0,d.jsx)(`code`,{children:`init`}),` command writes the whole baseline tree. Preview the real terminal output of every command below — all screenshots are live captures, not mockups.`]}),(0,d.jsx)(p,{label:`generated in one command`,children:`$ devopsgen init --stack go --ci github-actions --registry ghcr --image you/myapp --port 8080 +`).replace(Qf,``)}function ep(e,t){return t=$f(t),$f(e)===t}function $(e,t,n,r,i,a){switch(n){case`children`:if(typeof r==`string`)t===`body`||t===`textarea`&&r===``||Sn(e,r);else if(typeof r==`number`||typeof r==`bigint`)t!==`body`&&Sn(e,``+r);else return;break;case`className`:sn(e,`class`,r);break;case`tabIndex`:sn(e,`tabindex`,r);break;case`dir`:case`role`:case`viewBox`:case`width`:case`height`:sn(e,n,r);break;case`style`:Tn(e,r,a);return;case`data`:if(t!==`object`){sn(e,`data`,r);break}case`src`:case`href`:if(r===``&&(t!==`a`||n!==`href`)||r==null||typeof r==`function`||typeof r==`symbol`||typeof r==`boolean`){e.removeAttribute(n);break}r=kn(r),e.setAttribute(n,r);break;case`action`:case`formAction`:if(typeof r==`function`){e.setAttribute(n,`javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')`);break}if(typeof a==`function`&&(n===`formAction`?(t!==`input`&&$(e,t,`name`,i.name,i,null),$(e,t,`formEncType`,i.formEncType,i,null),$(e,t,`formMethod`,i.formMethod,i,null),$(e,t,`formTarget`,i.formTarget,i,null)):($(e,t,`encType`,i.encType,i,null),$(e,t,`method`,i.method,i,null),$(e,t,`target`,i.target,i,null))),r==null||typeof r==`symbol`||typeof r==`boolean`){e.removeAttribute(n);break}r=kn(r),e.setAttribute(n,r);break;case`onClick`:r!=null&&(e.onclick=An);return;case`onScroll`:r!=null&&Q(`scroll`,e);return;case`onScrollEnd`:r!=null&&Q(`scrollend`,e);return;case`dangerouslySetInnerHTML`:if(r!=null){if(typeof r!=`object`||!(`__html`in r))throw Error(s(61));if(n=r.__html,n!=null){if(i.children!=null)throw Error(s(60));a?.__html!==n&&(e.innerHTML=n)}}break;case`multiple`:e.multiple=r&&typeof r!=`function`&&typeof r!=`symbol`;break;case`muted`:e.muted=r&&typeof r!=`function`&&typeof r!=`symbol`;break;case`suppressContentEditableWarning`:case`suppressHydrationWarning`:case`defaultValue`:case`defaultChecked`:case`innerHTML`:case`ref`:break;case`autoFocus`:break;case`xlinkHref`:if(r==null||typeof r==`function`||typeof r==`boolean`||typeof r==`symbol`){e.removeAttribute(`xlink:href`);break}n=kn(r),e.setAttributeNS(`http://www.w3.org/1999/xlink`,`xlink:href`,n);break;case`contentEditable`:case`spellCheck`:case`draggable`:case`value`:case`autoReverse`:case`externalResourcesRequired`:case`focusable`:case`preserveAlpha`:r!=null&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,r):e.removeAttribute(n);break;case`inert`:case`allowFullScreen`:case`async`:case`autoPlay`:case`controls`:case`credentialless`:case`default`:case`defer`:case`disabled`:case`disablePictureInPicture`:case`disableRemotePlayback`:case`formNoValidate`:case`hidden`:case`loop`:case`noModule`:case`noValidate`:case`open`:case`playsInline`:case`readOnly`:case`required`:case`reversed`:case`scoped`:case`seamless`:case`itemScope`:r&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,``):e.removeAttribute(n);break;case`capture`:case`download`:!0===r?e.setAttribute(n,``):!1!==r&&r!=null&&typeof r!=`function`&&typeof r!=`symbol`?e.setAttribute(n,r):e.removeAttribute(n);break;case`cols`:case`rows`:case`size`:case`span`:r!=null&&typeof r!=`function`&&typeof r!=`symbol`&&!isNaN(r)&&1<=r?e.setAttribute(n,r):e.removeAttribute(n);break;case`rowSpan`:case`start`:r==null||typeof r==`function`||typeof r==`symbol`||isNaN(r)?e.removeAttribute(n):e.setAttribute(n,r);break;case`popover`:Q(`beforetoggle`,e),Q(`toggle`,e),on(e,`popover`,r);break;case`xlinkActuate`:cn(e,`http://www.w3.org/1999/xlink`,`xlink:actuate`,r);break;case`xlinkArcrole`:cn(e,`http://www.w3.org/1999/xlink`,`xlink:arcrole`,r);break;case`xlinkRole`:cn(e,`http://www.w3.org/1999/xlink`,`xlink:role`,r);break;case`xlinkShow`:cn(e,`http://www.w3.org/1999/xlink`,`xlink:show`,r);break;case`xlinkTitle`:cn(e,`http://www.w3.org/1999/xlink`,`xlink:title`,r);break;case`xlinkType`:cn(e,`http://www.w3.org/1999/xlink`,`xlink:type`,r);break;case`xmlBase`:cn(e,`http://www.w3.org/XML/1998/namespace`,`xml:base`,r);break;case`xmlLang`:cn(e,`http://www.w3.org/XML/1998/namespace`,`xml:lang`,r);break;case`xmlSpace`:cn(e,`http://www.w3.org/XML/1998/namespace`,`xml:space`,r);break;case`is`:on(e,`is`,r);break;case`innerText`:case`textContent`:return;default:if(!(2s)break;var u=c.transferSize,d=c.initiatorType;u&&ap(d)&&(c=c.responseEnd,o+=u*(c$m){s.length=o;break}f=new Promise(jp.bind(f)),s.push(f)}}}if(0`u`?null:document;function Tm(e,t,n){var r=wm;if(r&&typeof t==`string`&&t){var i=hn(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),ym.has(i)||(ym.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),np(t,`link`,e),E(t),r.head.appendChild(t)))}}function Em(e){xm.D(e),Tm(`dns-prefetch`,e,null)}function Dm(e,t){xm.C(e,t),Tm(`preconnect`,e,t)}function Om(e,t,n){xm.L(e,t,n);var r=wm;if(r&&e&&t){var i=`link[rel="preload"][as="`+hn(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+hn(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+hn(n.imageSizes)+`"]`)):i+=`[href="`+hn(e)+`"]`;var a=i;switch(t){case`style`:a=Pm(e);break;case`script`:a=Rm(e)}if(!(vm.has(a)||(e=S({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),vm.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(Fm(a))||t===`script`&&r.querySelector(zm(a))))){var o=r.createElement(`link`);np(o,`link`,e),t===`style`&&(o[Ut]=!0,o.onload=o.onerror=function(){Yt(o)}),E(o),r.head.appendChild(o)}}}function km(e,t){xm.m(e,t);var n=wm;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+hn(r)+`"][href="`+hn(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Rm(e)}if(!vm.has(a)&&(e=S({rel:`modulepreload`,href:e},t),vm.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(zm(a)))return}r=n.createElement(`link`),np(r,`link`,e),E(r),n.head.appendChild(r)}}}function Am(e,t,n){xm.S(e,t,n);var r=wm;if(r&&e){var i=Jt(r).hoistableStyles,a=Pm(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(Fm(a)))s.loading=5;else{e=S({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=vm.get(a))&&Hm(e,n);var c=o=r.createElement(`link`);E(c),np(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Vm(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function jm(e,t){xm.X(e,t);var n=wm;if(n&&e){var r=Jt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=S({src:e,async:!0},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),E(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Mm(e,t){xm.M(e,t);var n=wm;if(n&&e){var r=Jt(n).hoistableScripts,i=Rm(e),a=r.get(i);a||(a=n.querySelector(zm(i)),a||(e=S({src:e,async:!0,type:`module`},t),(t=vm.get(i))&&Um(e,t),a=n.createElement(`script`),E(a),np(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Nm(e,t,n,r){var i=(i=Fe.current)?bm(i):null;if(!i)throw Error(s(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(n=Pm(n.href),t=Jt(i).hoistableStyles,r=t.get(n),r||(r={type:`style`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Pm(n.href);var a=Jt(i).hoistableStyles,o=a.get(e);if(o||(i=i.ownerDocument||i,o={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},a.set(e,o),(a=i.querySelector(Fm(e)))?a._p||(o.instance=a,o.state.loading=5):(a=vm.get(e),a||(a={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},vm.set(e,a)),Lm(i,e,a,o.state))),t&&r===null)throw Error(s(528,``));return o}if(t&&r!==null)throw Error(s(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(n=Rm(n),t=Jt(i).hoistableScripts,r=t.get(n),r||(r={type:`script`,instance:null,count:0,state:null},t.set(n,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Pm(e){return`href="`+hn(e)+`"`}function Fm(e){return`link[rel="stylesheet"][`+e+`]`}function Im(e){return S({},e,{"data-precedence":e.precedence,precedence:null})}function Lm(e,t,n,r){if(t=e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)){if(!0!==t[Ut]){r.loading=1;return}}else t=e.createElement(`link`),t[Ut]=!0,t.onload=t.onerror=Yt.bind(null,t),np(t,`link`,n),E(t),e.head.appendChild(t);r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2})}function Rm(e){return`[src="`+hn(e)+`"]`}function zm(e){return`script[async]`+e}function Bm(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+hn(n.href)+`"]`);if(r)return t.instance=r,E(r),r;var i=S({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),E(r),np(r,`style`,i),Vm(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Pm(n.href);var a=e.querySelector(Fm(i));if(a)return t.state.loading|=4,t.instance=a,E(a),a;r=Im(n),(i=vm.get(i))&&Hm(r,i),a=(e.ownerDocument||e).createElement(`link`),E(a);var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),t.state.loading|=4,Vm(a,n.precedence,e),t.instance=a;case`script`:return a=Rm(n.src),(i=e.querySelector(zm(a)))?(t.instance=i,E(i),i):(r=n,(i=vm.get(a))&&(r=S({},n),Um(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),E(i),np(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(s(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Vm(r,n.precedence,e));return t.instance}function Vm(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function qm(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Jm(e,t){return e===`img`&&t.src!=null&&t.src!==``&&t.onLoad==null&&t.loading!==`lazy`}function Ym(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Xm(e){return(e.width||100)*(e.height||100)*(typeof devicePixelRatio==`number`?devicePixelRatio:1)*.25}function Zm(e,t){typeof t.decode==`function`&&(e.imgCount++,t.complete||(e.imgBytes+=Xm(t),e.suspenseyImages.push(t)),e=rh.bind(e),t.decode().then(e,e))}function Qm(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Pm(r.href),a=t.querySelector(Fm(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=nh.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,E(a);return}a=t.ownerDocument||t,r=Im(r),(i=vm.get(i))&&Hm(r,i),a=a.createElement(`link`),E(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),np(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=nh.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var $m=0;function eh(e,t){return e.stylesheets&&e.count===0&&ah(e,e.stylesheets),0$m?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function th(e){if(e.count===0&&(e.imgCount===0||!e.waitingForImages)){if(e.stylesheets)ah(e,e.stylesheets);else if(e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}}function nh(){this.count--,th(this)}function rh(){this.imgCount--,th(this)}var ih=null;function ah(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,ih=new Map,t.forEach(oh,e),ih=null,nh.call(e))}function oh(e,t){if(!(t.state.loading&4)){var n=ih.get(e);if(n)var r=n.get(null);else{n=new Map,ih.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=s()}));n();var l=c(),u=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),d=e(((e,t)=>{t.exports=u()}))();function f({rel:e,name:t,alt:n,caption:r,feature:i=``}){return(0,d.jsxs)(`figure`,{className:`shot ${i}`,children:[(0,d.jsx)(`a`,{href:`${e}img/${t}`,target:`_blank`,rel:`noopener noreferrer`,children:(0,d.jsx)(`img`,{src:`${e}img/${t}`,alt:n,loading:`lazy`,decoding:`async`})}),r&&(0,d.jsx)(`figcaption`,{children:r})]})}function p({children:e,label:t}){return(0,d.jsxs)(`div`,{className:`code-block`,children:[t&&(0,d.jsx)(`span`,{className:`code-label`,children:t}),(0,d.jsx)(`pre`,{children:(0,d.jsx)(`code`,{children:e})})]})}function m({children:e}){return(0,d.jsx)(`kbd`,{className:`kbd`,children:e})}function h({tone:e=`ok`,children:t}){return(0,d.jsx)(`span`,{className:`badge badge-${e}`,children:t})}function g({kicker:e,title:t,lede:n}){return(0,d.jsxs)(`header`,{className:`page-head`,children:[e&&(0,d.jsx)(`p`,{className:`kicker`,children:e}),(0,d.jsx)(`h1`,{children:t}),n&&(0,d.jsx)(`p`,{className:`lede`,children:n})]})}function _({rel:e}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(`div`,{className:`hero`,children:[(0,d.jsxs)(`div`,{children:[(0,d.jsx)(`p`,{className:`kicker`,children:`docker · github actions · kubernetes`}),(0,d.jsxs)(`h1`,{children:[`DevOps scaffolding,`,(0,d.jsx)(`br`,{}),`deterministically.`]}),(0,d.jsx)(`p`,{className:`lede`,children:`DevOpsGen reads your Go or Node.js project and writes a complete, opinionated DevOps baseline: hardened Dockerfile, GitHub Actions pipeline and ready-to-apply Kubernetes manifests — with dry-run plans, automatic backups and config validation built in.`}),(0,d.jsxs)(`div`,{className:`hero-cta`,children:[(0,d.jsx)(`a`,{className:`btn`,href:`${e}getting-started/`,children:`Get started`}),(0,d.jsx)(`a`,{className:`btn btn-pink`,href:`${e}wizard/`,children:`Take the wizard tour`})]})]}),(0,d.jsx)(f,{rel:e,name:`wizard.png`,alt:`DevOpsGen interactive wizard running in a Windows terminal, asking for the project stack`,caption:`The interactive wizard — press Enter to accept smart defaults.`,feature:`shot-feature`})]}),(0,d.jsx)(`h2`,{children:`Why DevOpsGen`}),(0,d.jsxs)(`div`,{className:`cards`,children:[(0,d.jsxs)(`div`,{className:`card`,children:[(0,d.jsx)(`h3`,{children:`Deterministic`}),(0,d.jsxs)(`p`,{children:[`Same inputs, same bytes — every run. Machine-friendly for code review: a second generation with `,(0,d.jsx)(`code`,{children:`--force`}),` produces bit-identical files.`]})]}),(0,d.jsxs)(`div`,{className:`card`,children:[(0,d.jsx)(`h3`,{children:`Safe by default`}),(0,d.jsxs)(`p`,{children:[`Existing files are never overwritten without `,(0,d.jsx)(`code`,{children:`--force`}),`. Overwrites get`,` `,(0,d.jsx)(`code`,{children:`.bak`}),` backups, failed runs roll back automatically, and`,` `,(0,d.jsx)(`code`,{children:`--dry-run`}),` prints the full plan first.`]})]}),(0,d.jsxs)(`div`,{className:`card`,children:[(0,d.jsx)(`h3`,{children:`Validated output`}),(0,d.jsx)(`p`,{children:`Built-in validation checks Dockerfile structure, GitHub Actions workflow wiring and Kubernetes manifests (selector consistency, port ranges, Ingress paths) before anything ships.`})]}),(0,d.jsxs)(`div`,{className:`card`,children:[(0,d.jsx)(`h3`,{children:`Stack aware`}),(0,d.jsxs)(`p`,{children:[`Detects Go and Node.js projects (npm, pnpm, Express, Next.js, Vite, NestJS) from`,` `,(0,d.jsx)(`code`,{children:`go.mod`}),` / `,(0,d.jsx)(`code`,{children:`package.json`}),` and tailors templates accordingly.`]})]})]}),(0,d.jsx)(`h2`,{children:`Everything a project needs on day one`}),(0,d.jsxs)(`p`,{children:[`One `,(0,d.jsx)(`code`,{children:`init`}),` command writes the whole baseline tree. Preview the real terminal output of every command below — all screenshots are live captures, not mockups.`]}),(0,d.jsx)(p,{label:`generated in one command`,children:`$ devopsgen init --stack go --ci github-actions --registry ghcr --image you/myapp --port 8080 created 5 file(s), replaced 0 file(s) in . exit code: 0`}),(0,d.jsxs)(`div`,{className:`screen-strip`,children:[(0,d.jsx)(f,{rel:e,name:`init-success.png`,alt:`Terminal showing a successful DevOpsGen init run creating five files with exit code 0`,caption:`init — first run creates the complete baseline and exits 0.`}),(0,d.jsx)(f,{rel:e,name:`dry-run.png`,alt:`Terminal showing a DevOpsGen dry-run plan listing five create entries with exit code 0`,caption:`--dry-run on a fresh project prints the pure create plan and exits 0.`}),(0,d.jsx)(f,{rel:e,name:`dry-run-force.png`,alt:`Terminal showing a DevOpsGen dry-run force plan where every file would be replaced, exit code 0`,caption:`--dry-run --force previews the full replace plan — still nothing written.`})]}),(0,d.jsx)(`h2`,{children:`What gets generated`}),(0,d.jsx)(`div`,{className:`table-wrap`,children:(0,d.jsxs)(`table`,{children:[(0,d.jsx)(`thead`,{children:(0,d.jsxs)(`tr`,{children:[(0,d.jsx)(`th`,{children:`Template set`}),(0,d.jsx)(`th`,{children:`Files`}),(0,d.jsx)(`th`,{children:`Purpose`})]})}),(0,d.jsxs)(`tbody`,{children:[(0,d.jsxs)(`tr`,{children:[(0,d.jsxs)(`td`,{children:[(0,d.jsx)(`code`,{children:`docker`}),` (+ `,(0,d.jsx)(`code`,{children:`.dockerignore`}),`)`]}),(0,d.jsx)(`td`,{children:(0,d.jsx)(`code`,{children:`Dockerfile`})}),(0,d.jsxs)(`td`,{children:[`Hardened multi-stage build (Go runs as `,(0,d.jsx)(`code`,{children:`USER 1000:1000`}),` on a scratch base). For Node.js, RUN steps and install/prune commands follow the detected package manager (npm / pnpm) and lockfile. The generated `,(0,d.jsx)(`code`,{children:`.dockerignore`}),` `,`keeps state, tool caches and env files out of the image.`]})]}),(0,d.jsxs)(`tr`,{children:[(0,d.jsx)(`td`,{children:(0,d.jsx)(`code`,{children:`github-actions`})}),(0,d.jsx)(`td`,{children:(0,d.jsx)(`code`,{children:`.github/workflows/ci.yml`})}),(0,d.jsx)(`td`,{children:`Runs your tests when a test command is configured, then builds and pushes the image with both the commit SHA tag and your alias tag, authenticating to the chosen registry via secrets.`})]}),(0,d.jsxs)(`tr`,{children:[(0,d.jsx)(`td`,{children:(0,d.jsx)(`code`,{children:`kubernetes`})}),(0,d.jsxs)(`td`,{children:[(0,d.jsx)(`code`,{children:`deployment.yaml`}),`, `,(0,d.jsx)(`code`,{children:`service.yaml`}),`, optional `,(0,d.jsx)(`code`,{children:`ingress.yaml`})]}),(0,d.jsxs)(`td`,{children:[`DNS 1035-safe resource names, container port wiring, resource requests and limits, health probes when `,(0,d.jsx)(`code`,{children:`--health-path`}),` is given, and an optional host-based Ingress (RFC 1123 hostname).`]})]})]})]})}),(0,d.jsx)(`h2`,{children:`Explore the docs`}),(0,d.jsx)(`div`,{className:`cards core`,children:x.filter(e=>e.path!==``).map(t=>(0,d.jsxs)(`a`,{className:`card`,style:{display:`block`},href:`${e}${t.path}/`,children:[(0,d.jsx)(`h3`,{children:t.path.replace(/-/g,` `)}),(0,d.jsx)(`p`,{children:t.description})]},t.path))}),(0,d.jsx)(`h2`,{children:`Command cheatsheet`}),(0,d.jsxs)(`div`,{className:`screen-strip`,children:[(0,d.jsx)(f,{rel:e,name:`help.png`,alt:`Terminal showing the full devopsgen help output listing all commands`,caption:`devopsgen --help — all commands at a glance.`}),(0,d.jsx)(f,{rel:e,name:`list.png`,alt:`Terminal showing the devopsgen list output with available stacks, app types and registries`,caption:`devopsgen list — supported stacks, app types and registries.`}),(0,d.jsx)(f,{rel:e,name:`version.png`,alt:`Terminal showing the devopsgen version output`,caption:`devopsgen version.`})]})]})}function v({rel:e}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(g,{kicker:`getting started`,title:`Zero to CI in one command`,lede:`Install DevOpsGen, point it at any Go or Node.js project, and get a full Docker + GitHub Actions + Kubernetes baseline in seconds.`}),(0,d.jsx)(`h2`,{children:`Install`}),(0,d.jsx)(p,{label:`go install (go 1.22+)`,children:`go install devopsgen.dev/devopsgen@latest`}),(0,d.jsxs)(`p`,{children:[`Or grab a prebuilt binary from the project`,` `,(0,d.jsx)(`a`,{href:`https://github.com/Bangkahdev/DevOpsGen/releases`,target:`_blank`,rel:`noopener noreferrer`,children:`GitHub releases`}),`, or build from source:`]}),(0,d.jsx)(p,{label:`from source`,children:`git clone https://github.com/Bangkahdev/DevOpsGen.git cd DevOpsGen diff --git a/docs/web/dist/assets/index-DZzeKXFv.css b/docs/web/dist/assets/index-DZzeKXFv.css deleted file mode 100644 index 005c0fb..0000000 --- a/docs/web/dist/assets/index-DZzeKXFv.css +++ /dev/null @@ -1 +0,0 @@ -@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--ui-bg:#f3ede3;--ui-surface:#fffaf2;--ui-surface-2:#f7f0e6;--ui-text:#332820;--ui-text-soft:#5e4d3f;--ui-muted:#756455;--ui-border:#e2d5c5;--ui-border-strong:#d3c2ad;--ui-accent:#8a5b3d;--ui-accent-strong:#7a4f33;--ui-accent-soft:#efe0cf;--ui-accent-contrast:#fffaf2;--ui-badge-ok-bg:#e4ecd9;--ui-badge-ok-fg:#55683f;--ui-badge-warn-bg:#fbf0d2;--ui-badge-warn-fg:#7a5c17;--ui-badge-err-bg:#f9e2db;--ui-badge-err-fg:#8a4a38;--ui-badge-info-bg:#efe6ec;--ui-badge-info-fg:#6e4a63;--ui-note:#f4ead9;--ui-tip:#edf0e2;--ui-caution:#fbf0d2;--ui-danger:#f9e2db;--ui-code:#2d231c;--ui-code-text:#f8f1e8;--ui-code-bar:#efe2d2;--ui-code-bar-text:#5e3c27;--ui-shadow-color:#4a34261a;--ui-shadow-strong:#4a342629;--ui-radius-sm:6px;--ui-radius:10px;--ui-radius-lg:16px;--font-display:"DM Sans", ui-sans-serif, system-ui, sans-serif;--sl-font:"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--sl-font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*{scrollbar-color:var(--ui-border-strong) var(--ui-bg);box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--ui-bg);color:var(--ui-text);font-family:var(--sl-font);text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;font-size:1rem;font-weight:400;line-height:1.75}::selection{background:var(--ui-accent-soft);color:var(--ui-accent-strong)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--ui-bg)}::-webkit-scrollbar-thumb{background:var(--ui-border-strong);border:3px solid var(--ui-bg);border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--ui-accent)}:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px}.skip{z-index:99;background:var(--ui-accent);color:var(--ui-accent-contrast);border-radius:var(--ui-radius-sm);font-family:var(--sl-font);padding:8px 16px;font-weight:600;position:absolute;top:0;left:-9999px}.skip:focus{left:8px}.topbar{background:var(--ui-surface);border-bottom:1px solid var(--ui-border);align-items:center;gap:16px;padding:.6rem clamp(1rem,3vw,2rem);display:flex}.brand{color:var(--ui-text);align-items:center;gap:10px;text-decoration:none;display:inline-flex}.brand-mark{width:2.25rem;height:2.25rem;box-shadow:0 2px 8px var(--ui-shadow-color);display:block}.brand-name{font-family:var(--font-display);letter-spacing:-.015em;font-size:1rem;font-weight:700}.brand-sub{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.08em;border-radius:999px;padding:.16rem .45rem;font-size:.58rem;font-weight:700}.gh-pill{border:1px solid var(--ui-border);background:var(--ui-surface-2);height:2.25rem;box-shadow:none;color:var(--ui-text-soft);font-family:var(--sl-font);border-radius:8px;align-items:center;gap:.4rem;margin-left:auto;padding:0 1rem;font-size:.8rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s;display:inline-flex}.gh-pill:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.shell{grid-template-columns:210px minmax(0,1fr);align-items:start;gap:clamp(1.5rem,3vw,2.5rem);max-width:1200px;margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem);display:grid}.sidebar{padding-block:.25rem;position:sticky;top:1.5rem}.side-home{margin-bottom:.4rem}.side-group+.side-group{margin-top:1.25rem}.group-label{color:var(--ui-muted);letter-spacing:.12em;text-transform:uppercase;margin:0 0 .4rem;padding:0 .6rem;font-size:.66rem;font-weight:700}.sidebar ul{margin:0;padding:0;list-style:none}.sidebar a,.side-link{color:var(--ui-text-soft);text-transform:capitalize;border-radius:7px;padding:.4rem .6rem;font-weight:500;line-height:1.35;text-decoration:none;transition:background .15s,color .15s;display:block}.sidebar a:hover,.side-link:hover{background:var(--ui-surface-2);color:var(--ui-text)}.sidebar a.is-active,.side-link.is-active{background:var(--ui-accent-soft);color:var(--ui-accent-strong);box-shadow:inset 3px 0 0 var(--ui-accent);font-weight:600}main{min-width:0}.page-head{margin-bottom:26px}.kicker{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.12em;text-transform:uppercase;border-radius:999px;margin:0 0 12px;padding:.22rem .7rem;font-size:.66rem;font-weight:700;display:inline-block}.violet{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.blue{background:var(--ui-note);color:var(--ui-text-soft)}.pink,.yellow{background:var(--ui-caution);color:var(--ui-badge-warn-fg)}h1{color:var(--ui-text);box-shadow:none;font-family:var(--font-display);letter-spacing:-.03em;overflow-wrap:anywhere;background:0 0;margin:0 0 14px;padding:0;font-size:clamp(1.9rem,3.8vw,2.6rem);font-weight:700;line-height:1.12;display:block}.lede{background:var(--ui-surface);max-width:46rem;color:var(--ui-text-soft);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin-block:0 8px;padding:1rem 1.25rem;font-size:1.02rem;line-height:1.7;display:block}h2{border-bottom:1px solid var(--ui-border);font-family:var(--font-display);letter-spacing:-.025em;align-items:center;gap:.6rem;margin-block:2.5rem 1rem;padding-bottom:.55rem;font-size:clamp(1.25rem,2.3vw,1.45rem);font-weight:600;display:flex}h2:before{content:"";background:var(--ui-accent);border-radius:999px;flex:none;width:.35rem;height:1.1em}h3{font-family:var(--font-display);margin-block:1.75rem .6rem;font-size:1.08rem;font-weight:600}strong{color:var(--ui-accent-strong);font-weight:600}code:not(.code-block code){background:var(--ui-surface-2);color:var(--ui-accent-strong);border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);font-family:var(--sl-font-mono);-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:.08em .35em;font-size:.88em;font-weight:500}a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong);text-underline-offset:3px;text-decoration-thickness:1px}a:hover{color:var(--ui-accent);-webkit-text-decoration-color:var(--ui-accent);text-decoration-color:var(--ui-accent);background:0 0}.btn:hover,.gh-pill:hover,.sidebar a:hover,.side-link:hover{background-color:inherit}a.btn:hover{color:var(--ui-accent-contrast);background:var(--ui-accent-strong);text-decoration:none}.hero{background:var(--ui-surface);color:var(--ui-text);border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);box-shadow:0 16px 40px var(--ui-shadow-color);grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:center;gap:clamp(1.5rem,4vw,3rem);margin:.5rem 0 2rem;padding:clamp(1.5rem,4vw,3rem);display:grid;position:relative}.hero-cta{flex-wrap:wrap;gap:.75rem;margin-top:6px;display:flex}.btn{border:1px solid var(--ui-accent);background:var(--ui-accent);color:var(--ui-accent-contrast);box-shadow:0 2px 6px var(--ui-shadow-color);border-radius:9px;padding:.6rem 1.1rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s,box-shadow .15s,transform .15s;display:inline-block}.btn:hover{box-shadow:0 6px 16px var(--ui-shadow-strong);transform:translateY(-1px)}.btn-pink{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.btn-pink:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.btn-yellow{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.cards{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1.25rem;display:grid}.card{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 1px 2px var(--ui-shadow-color);color:inherit;padding:1.5rem;text-decoration:none;transition:transform .18s,box-shadow .18s,border-color .18s}.card h3{margin-top:0;font-size:.98rem}.card p,.card li{color:var(--ui-muted);font-size:.9rem;line-height:1.6}.card:hover{border-color:var(--ui-border-strong);box-shadow:0 10px 24px var(--ui-shadow-color);transform:translateY(-2px)}a.card h3{color:var(--ui-accent-strong)}.core .card:hover{border-color:var(--ui-accent)}.shot{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);max-width:100%;margin:22px 0;padding:10px}.shot img{border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);width:100%;height:auto;display:block}.shot figcaption{color:var(--ui-muted);margin-top:10px;font-size:.85rem;font-weight:500}.shot a:hover{color:inherit;background:0 0}.shot-feature{max-width:880px}.screen-strip{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:22px;display:grid}.screen-strip .shot{margin:0 0 12px}.code-block{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-code);color:var(--ui-code-text);box-shadow:0 10px 30px var(--ui-shadow-color);margin:20px 0;position:relative;overflow:hidden}.code-label{background:var(--ui-code-bar);color:var(--ui-code-bar-text);font-family:var(--sl-font-mono);letter-spacing:.06em;text-transform:uppercase;padding:.45rem .9rem;font-size:.7rem;font-weight:600;position:absolute;top:0;left:0;right:0}.code-block pre{font-family:var(--sl-font-mono);margin:0;padding:2.2rem 18px 16px;font-size:.86rem;line-height:1.6;overflow-x:auto}.code-block code{color:inherit;font-size:inherit;background:0 0;border:0;padding:0}.table-wrap{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-surface);box-shadow:0 1px 2px var(--ui-shadow-color);margin:18px 0;overflow:auto}table{border-collapse:collapse;width:100%;font-size:.92rem}th,td{text-align:left;vertical-align:top;padding:.65rem .75rem}th{background:var(--ui-surface-2);color:var(--ui-muted);letter-spacing:.06em;text-transform:uppercase;font-size:.7rem;font-weight:700}td{border-top:1px solid var(--ui-border)}tbody tr:nth-child(2n) td{background:var(--ui-surface-2)}td code{white-space:nowrap}.num{font-weight:700}.badge{font-family:var(--sl-font-mono);letter-spacing:.01em;border:0;border-radius:999px;padding:.05rem .5rem;font-size:.74rem;font-weight:600;display:inline-block;transform:none}.badge-ok{background:var(--ui-badge-ok-bg);color:var(--ui-badge-ok-fg)}.badge-warn{background:var(--ui-badge-warn-bg);color:var(--ui-badge-warn-fg)}.badge-err{background:var(--ui-badge-err-bg);color:var(--ui-badge-err-fg)}.badge-info{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.kbd{border:1px solid var(--ui-border);background:var(--ui-surface-2);color:var(--ui-text);box-shadow:none;font-family:var(--sl-font-mono);border-radius:5px;padding:.1em .4em;font-size:.84rem;display:inline-block}.callout{background:var(--ui-note);color:var(--ui-text);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin:20px 0;padding:1rem 1.25rem;font-weight:500}.callout p{margin:0}.callout-info,.callout-ok{background:var(--ui-tip)}ul,ol{padding-inline-start:1.5rem}li::marker{color:var(--ui-accent)}.step-list{counter-reset:steps;padding-left:0;list-style:none}.step-list li{counter-increment:steps;margin-top:14px;padding-left:48px;position:relative}.step-list li:before{content:counter(steps);background:var(--ui-accent-soft);width:30px;height:30px;color:var(--ui-accent-strong);box-shadow:none;font-family:var(--font-display);border-radius:999px;place-items:center;font-weight:600;display:grid;position:absolute;top:0;left:0}.flag-name{font-family:var(--sl-font-mono);font-weight:600}.footer{max-width:1200px;color:var(--ui-muted);margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem) 2.5rem;font-size:.9rem}.footer a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong)}.footer a:hover{background:var(--ui-accent-soft)}.footer-links{margin-top:6px}.file-tree{font-family:var(--sl-font-mono);white-space:pre;font-size:.9rem;overflow-x:auto}@media (width<=900px){.shell{grid-template-columns:1fr}.sidebar{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);flex-wrap:wrap;align-items:center;gap:.4rem;padding:.75rem 1rem;display:flex;position:static}.side-group{display:contents;margin:0!important}.sidebar ul{flex-wrap:wrap;gap:.25rem;display:flex}.group-label{margin:0 .2rem}.sidebar a,.side-link{background:var(--ui-surface-2);border-radius:999px;padding:.3rem .7rem}.sidebar a.is-active,.side-link.is-active{box-shadow:none}}@media (width<=720px){.hero{border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);grid-template-columns:1fr;padding:1.5rem}.shot,.code-block{box-shadow:0 4px 16px var(--ui-shadow-color)}th,td{padding:.5rem .55rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}} diff --git a/docs/web/dist/assets/index-bqF0xqM6.css b/docs/web/dist/assets/index-bqF0xqM6.css new file mode 100644 index 0000000..2666303 --- /dev/null +++ b/docs/web/dist/assets/index-bqF0xqM6.css @@ -0,0 +1 @@ +@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--ui-bg:#f3ede3;--ui-surface:#fffaf2;--ui-surface-2:#f7f0e6;--ui-text:#332820;--ui-text-soft:#5e4d3f;--ui-muted:#756455;--ui-border:#e2d5c5;--ui-border-strong:#d3c2ad;--ui-accent:#8a5b3d;--ui-accent-strong:#7a4f33;--ui-accent-soft:#efe0cf;--ui-accent-contrast:#fffaf2;--ui-badge-ok-fg:#55683f;--ui-badge-warn-fg:#7a5c17;--ui-badge-err-fg:#8a4a38;--ui-badge-info-fg:#6e4a63;--ui-code:#2d231c;--ui-code-text:#f8f1e8;--ui-code-bar:#efe2d2;--ui-code-bar-text:#5e3c27;--ui-radius-sm:3px;--ui-radius:3px;--ui-radius-lg:4px;--font-display:"DM Sans", ui-sans-serif, system-ui, sans-serif;--sl-font:"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--sl-font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*{scrollbar-color:var(--ui-border-strong) var(--ui-bg);box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--ui-bg);color:var(--ui-text);font-family:var(--sl-font);text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;font-size:1rem;font-weight:400;line-height:1.75}::selection{background:var(--ui-accent-soft);color:var(--ui-accent-strong)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--ui-bg)}::-webkit-scrollbar-thumb{background:var(--ui-border-strong);border:3px solid var(--ui-bg)}::-webkit-scrollbar-thumb:hover{background:var(--ui-accent)}:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px}.skip{z-index:99;background:var(--ui-accent);color:var(--ui-accent-contrast);border-radius:var(--ui-radius-sm);font-family:var(--sl-font);padding:8px 16px;font-weight:600;position:absolute;top:0;left:-9999px}.skip:focus{left:8px}.topbar{background:var(--ui-surface);border-bottom:1px solid var(--ui-border);align-items:center;gap:16px;padding:.6rem clamp(1rem,3vw,2rem);display:flex}.brand{color:var(--ui-text);align-items:center;gap:12px;text-decoration:none;display:inline-flex}.brand-mark{width:2.1rem;height:2.1rem;display:block}.brand-name{font-family:var(--sl-font-mono);letter-spacing:-.01em;font-size:.98rem;font-weight:600}.brand-sub{color:var(--ui-muted);font-family:var(--sl-font-mono);letter-spacing:.14em;font-size:.62rem;font-weight:600}.gh-pill{border:1px solid var(--ui-border);border-radius:var(--ui-radius);height:2.15rem;color:var(--ui-text-soft);font-family:var(--sl-font-mono);background:0 0;align-items:center;gap:.4rem;margin-left:auto;padding:0 .9rem;font-size:.78rem;font-weight:500;text-decoration:none;transition:color .12s,border-color .12s;display:inline-flex}.gh-pill:hover{border-color:var(--ui-accent);color:var(--ui-accent-strong)}.shell{grid-template-columns:210px minmax(0,1fr);align-items:start;gap:clamp(1.5rem,3vw,2.5rem);max-width:1200px;margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem);display:grid}.sidebar{padding-block:.25rem;position:sticky;top:1.5rem}.side-home{margin-bottom:.4rem}.side-group+.side-group{margin-top:1.25rem}.group-label{color:var(--ui-muted);letter-spacing:.12em;text-transform:uppercase;margin:0 0 .4rem;padding:0 .6rem;font-size:.66rem;font-weight:600}.sidebar ul{margin:0;padding:0;list-style:none}.sidebar a,.side-link{color:var(--ui-text-soft);border-left:2px solid #0000;padding:.38rem .6rem;font-weight:500;line-height:1.35;text-decoration:none;transition:color .12s;display:block}.sidebar a:hover,.side-link:hover{color:var(--ui-text)}.sidebar a.is-active,.side-link.is-active{border-left-color:var(--ui-accent);color:var(--ui-accent-strong);font-weight:600}main{min-width:0}.page-head{margin-bottom:26px}.kicker{color:var(--ui-muted);font-family:var(--sl-font-mono);letter-spacing:.12em;text-transform:uppercase;margin:0 0 10px;font-size:.7rem;font-weight:500;display:block}h1{color:var(--ui-text);font-family:var(--font-display);letter-spacing:-.03em;overflow-wrap:anywhere;margin:0 0 14px;padding:0;font-size:clamp(1.9rem,3.8vw,2.6rem);font-weight:700;line-height:1.12;display:block}.lede{max-width:46rem;color:var(--ui-text-soft);margin-block:0 10px;font-size:1.02rem;line-height:1.7;display:block}h2{border-bottom:1px solid var(--ui-border);font-family:var(--font-display);letter-spacing:-.025em;margin-block:2.5rem 1rem;padding-bottom:.5rem;font-size:clamp(1.25rem,2.3vw,1.45rem);font-weight:600;display:block}h3{font-family:var(--font-display);margin-block:1.75rem .6rem;font-size:1.08rem;font-weight:600}strong{font-weight:600}code:not(.code-block code){background:var(--ui-surface-2);color:var(--ui-text);border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);font-family:var(--sl-font-mono);-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:.08em .35em;font-size:.88em;font-weight:500}a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong);text-underline-offset:3px;text-decoration-thickness:1px}a:hover{color:var(--ui-accent);-webkit-text-decoration-color:var(--ui-accent);text-decoration-color:var(--ui-accent)}a.btn:hover{color:var(--ui-accent-contrast);text-decoration:none}.hero{border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:center;gap:clamp(1.5rem,4vw,3rem);margin:.5rem 0 2rem;padding:clamp(1.5rem,4vw,3rem);display:grid}.hero-cta{flex-wrap:wrap;gap:.75rem;margin-top:6px;display:flex}.btn{border:1px solid var(--ui-accent);border-radius:var(--ui-radius);background:var(--ui-accent);color:var(--ui-accent-contrast);padding:.6rem 1.1rem;font-weight:600;text-decoration:none;transition:background .12s,border-color .12s;display:inline-block}.btn:hover{background:var(--ui-accent-strong);border-color:var(--ui-accent-strong)}.btn-pink{border-color:var(--ui-border-strong);color:var(--ui-text);background:0 0}.btn-pink:hover{border-color:var(--ui-accent);color:var(--ui-accent-strong);background:0 0}.btn-yellow{border-color:var(--ui-border-strong);color:var(--ui-text);background:0 0}.cards{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1.25rem;display:grid}.card{border:1px solid var(--ui-border);border-radius:var(--ui-radius);color:inherit;padding:1.5rem;text-decoration:none;transition:border-color .12s}.card h3{margin-top:0;font-size:.98rem}.card p,.card li{color:var(--ui-muted);font-size:.9rem;line-height:1.6}.card:hover{border-color:var(--ui-accent)}a.card h3{color:var(--ui-text)}.shot{border:1px solid var(--ui-border);border-radius:var(--ui-radius);max-width:100%;margin:22px 0;padding:10px}.shot img{border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);width:100%;height:auto;display:block}.shot figcaption{color:var(--ui-muted);margin-top:10px;font-size:.85rem;font-weight:500}.shot a:hover{color:inherit}.shot-feature{max-width:880px}.screen-strip{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:22px;display:grid}.screen-strip .shot{margin:0 0 12px}.code-block{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-code);color:var(--ui-code-text);margin:20px 0;position:relative;overflow:hidden}.code-label{background:var(--ui-code-bar);color:var(--ui-code-bar-text);font-family:var(--sl-font-mono);letter-spacing:.06em;text-transform:uppercase;padding:.45rem .9rem;font-size:.7rem;font-weight:600;position:absolute;top:0;left:0;right:0}.code-block pre{font-family:var(--sl-font-mono);margin:0;padding:2.2rem 18px 16px;font-size:.86rem;line-height:1.6;overflow-x:auto}.code-block code{color:inherit;font-size:inherit;background:0 0;border:0;padding:0}.table-wrap{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-surface);margin:18px 0;overflow:auto}table{border-collapse:collapse;width:100%;font-size:.92rem}th,td{text-align:left;vertical-align:top;padding:.65rem .75rem}th{color:var(--ui-muted);letter-spacing:.06em;text-transform:uppercase;font-size:.7rem;font-weight:600}th,td{border-top:1px solid var(--ui-border)}thead th{border-top:0;border-bottom:1px solid var(--ui-border-strong);background:var(--ui-surface-2)}td code{white-space:nowrap}.num{font-family:var(--sl-font-mono);font-weight:600}.badge{border-radius:var(--ui-radius-sm);font-family:var(--sl-font-mono);white-space:nowrap;border:1px solid;padding:.02rem .45rem;font-size:.72rem;font-weight:500;display:inline-block}.badge-ok{color:var(--ui-badge-ok-fg)}.badge-warn{color:var(--ui-badge-warn-fg)}.badge-err{color:var(--ui-badge-err-fg)}.badge-info{color:var(--ui-badge-info-fg)}.kbd{border:1px solid var(--ui-border-strong);border-radius:var(--ui-radius-sm);background:var(--ui-surface);color:var(--ui-text);font-family:var(--sl-font-mono);border-bottom-width:2px;padding:.1em .4em;font-size:.84rem;display:inline-block}.callout{border-left:2px solid var(--ui-accent);color:var(--ui-text-soft);margin:20px 0;padding:.75rem 1.25rem}.callout p{margin:0}ul,ol{padding-inline-start:1.5rem}li::marker{color:var(--ui-accent)}.step-list{counter-reset:steps;padding-left:0;list-style:none}.step-list li{counter-increment:steps;margin-top:14px;padding-left:44px;position:relative}.step-list li:before{content:counter(steps, decimal-leading-zero);color:var(--ui-accent-strong);font-family:var(--sl-font-mono);font-size:.85rem;font-weight:600;line-height:1.6;position:absolute;top:2px;left:0}.flag-name{font-family:var(--sl-font-mono);font-weight:600}.footer{max-width:1200px;color:var(--ui-muted);margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem) 2.5rem;font-size:.9rem}.footer a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong)}.footer-links{margin-top:6px}.file-tree{font-family:var(--sl-font-mono);white-space:pre;font-size:.9rem;overflow-x:auto}@media (width<=900px){.shell{grid-template-columns:1fr}.sidebar{border:1px solid var(--ui-border);border-radius:var(--ui-radius);flex-wrap:wrap;align-items:center;gap:.4rem;padding:.75rem 1rem;display:flex;position:static}.side-group{display:contents;margin:0!important}.sidebar ul{flex-wrap:wrap;gap:.25rem;display:flex}.group-label{margin:0 .2rem}.sidebar a,.side-link{border-left:0;padding:.3rem .7rem}}@media (width<=720px){.hero{grid-template-columns:1fr;padding:1.5rem}th,td{padding:.5rem .55rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}} diff --git a/docs/web/dist/assets/site.css b/docs/web/dist/assets/site.css index 005c0fb..2666303 100644 --- a/docs/web/dist/assets/site.css +++ b/docs/web/dist/assets/site.css @@ -1 +1 @@ -@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--ui-bg:#f3ede3;--ui-surface:#fffaf2;--ui-surface-2:#f7f0e6;--ui-text:#332820;--ui-text-soft:#5e4d3f;--ui-muted:#756455;--ui-border:#e2d5c5;--ui-border-strong:#d3c2ad;--ui-accent:#8a5b3d;--ui-accent-strong:#7a4f33;--ui-accent-soft:#efe0cf;--ui-accent-contrast:#fffaf2;--ui-badge-ok-bg:#e4ecd9;--ui-badge-ok-fg:#55683f;--ui-badge-warn-bg:#fbf0d2;--ui-badge-warn-fg:#7a5c17;--ui-badge-err-bg:#f9e2db;--ui-badge-err-fg:#8a4a38;--ui-badge-info-bg:#efe6ec;--ui-badge-info-fg:#6e4a63;--ui-note:#f4ead9;--ui-tip:#edf0e2;--ui-caution:#fbf0d2;--ui-danger:#f9e2db;--ui-code:#2d231c;--ui-code-text:#f8f1e8;--ui-code-bar:#efe2d2;--ui-code-bar-text:#5e3c27;--ui-shadow-color:#4a34261a;--ui-shadow-strong:#4a342629;--ui-radius-sm:6px;--ui-radius:10px;--ui-radius-lg:16px;--font-display:"DM Sans", ui-sans-serif, system-ui, sans-serif;--sl-font:"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--sl-font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*{scrollbar-color:var(--ui-border-strong) var(--ui-bg);box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--ui-bg);color:var(--ui-text);font-family:var(--sl-font);text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;font-size:1rem;font-weight:400;line-height:1.75}::selection{background:var(--ui-accent-soft);color:var(--ui-accent-strong)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--ui-bg)}::-webkit-scrollbar-thumb{background:var(--ui-border-strong);border:3px solid var(--ui-bg);border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--ui-accent)}:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px}.skip{z-index:99;background:var(--ui-accent);color:var(--ui-accent-contrast);border-radius:var(--ui-radius-sm);font-family:var(--sl-font);padding:8px 16px;font-weight:600;position:absolute;top:0;left:-9999px}.skip:focus{left:8px}.topbar{background:var(--ui-surface);border-bottom:1px solid var(--ui-border);align-items:center;gap:16px;padding:.6rem clamp(1rem,3vw,2rem);display:flex}.brand{color:var(--ui-text);align-items:center;gap:10px;text-decoration:none;display:inline-flex}.brand-mark{width:2.25rem;height:2.25rem;box-shadow:0 2px 8px var(--ui-shadow-color);display:block}.brand-name{font-family:var(--font-display);letter-spacing:-.015em;font-size:1rem;font-weight:700}.brand-sub{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.08em;border-radius:999px;padding:.16rem .45rem;font-size:.58rem;font-weight:700}.gh-pill{border:1px solid var(--ui-border);background:var(--ui-surface-2);height:2.25rem;box-shadow:none;color:var(--ui-text-soft);font-family:var(--sl-font);border-radius:8px;align-items:center;gap:.4rem;margin-left:auto;padding:0 1rem;font-size:.8rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s;display:inline-flex}.gh-pill:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.shell{grid-template-columns:210px minmax(0,1fr);align-items:start;gap:clamp(1.5rem,3vw,2.5rem);max-width:1200px;margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem);display:grid}.sidebar{padding-block:.25rem;position:sticky;top:1.5rem}.side-home{margin-bottom:.4rem}.side-group+.side-group{margin-top:1.25rem}.group-label{color:var(--ui-muted);letter-spacing:.12em;text-transform:uppercase;margin:0 0 .4rem;padding:0 .6rem;font-size:.66rem;font-weight:700}.sidebar ul{margin:0;padding:0;list-style:none}.sidebar a,.side-link{color:var(--ui-text-soft);text-transform:capitalize;border-radius:7px;padding:.4rem .6rem;font-weight:500;line-height:1.35;text-decoration:none;transition:background .15s,color .15s;display:block}.sidebar a:hover,.side-link:hover{background:var(--ui-surface-2);color:var(--ui-text)}.sidebar a.is-active,.side-link.is-active{background:var(--ui-accent-soft);color:var(--ui-accent-strong);box-shadow:inset 3px 0 0 var(--ui-accent);font-weight:600}main{min-width:0}.page-head{margin-bottom:26px}.kicker{background:var(--ui-accent-soft);color:var(--ui-accent-strong);letter-spacing:.12em;text-transform:uppercase;border-radius:999px;margin:0 0 12px;padding:.22rem .7rem;font-size:.66rem;font-weight:700;display:inline-block}.violet{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.blue{background:var(--ui-note);color:var(--ui-text-soft)}.pink,.yellow{background:var(--ui-caution);color:var(--ui-badge-warn-fg)}h1{color:var(--ui-text);box-shadow:none;font-family:var(--font-display);letter-spacing:-.03em;overflow-wrap:anywhere;background:0 0;margin:0 0 14px;padding:0;font-size:clamp(1.9rem,3.8vw,2.6rem);font-weight:700;line-height:1.12;display:block}.lede{background:var(--ui-surface);max-width:46rem;color:var(--ui-text-soft);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin-block:0 8px;padding:1rem 1.25rem;font-size:1.02rem;line-height:1.7;display:block}h2{border-bottom:1px solid var(--ui-border);font-family:var(--font-display);letter-spacing:-.025em;align-items:center;gap:.6rem;margin-block:2.5rem 1rem;padding-bottom:.55rem;font-size:clamp(1.25rem,2.3vw,1.45rem);font-weight:600;display:flex}h2:before{content:"";background:var(--ui-accent);border-radius:999px;flex:none;width:.35rem;height:1.1em}h3{font-family:var(--font-display);margin-block:1.75rem .6rem;font-size:1.08rem;font-weight:600}strong{color:var(--ui-accent-strong);font-weight:600}code:not(.code-block code){background:var(--ui-surface-2);color:var(--ui-accent-strong);border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);font-family:var(--sl-font-mono);-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:.08em .35em;font-size:.88em;font-weight:500}a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong);text-underline-offset:3px;text-decoration-thickness:1px}a:hover{color:var(--ui-accent);-webkit-text-decoration-color:var(--ui-accent);text-decoration-color:var(--ui-accent);background:0 0}.btn:hover,.gh-pill:hover,.sidebar a:hover,.side-link:hover{background-color:inherit}a.btn:hover{color:var(--ui-accent-contrast);background:var(--ui-accent-strong);text-decoration:none}.hero{background:var(--ui-surface);color:var(--ui-text);border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);box-shadow:0 16px 40px var(--ui-shadow-color);grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:center;gap:clamp(1.5rem,4vw,3rem);margin:.5rem 0 2rem;padding:clamp(1.5rem,4vw,3rem);display:grid;position:relative}.hero-cta{flex-wrap:wrap;gap:.75rem;margin-top:6px;display:flex}.btn{border:1px solid var(--ui-accent);background:var(--ui-accent);color:var(--ui-accent-contrast);box-shadow:0 2px 6px var(--ui-shadow-color);border-radius:9px;padding:.6rem 1.1rem;font-weight:600;text-decoration:none;transition:background .15s,border-color .15s,box-shadow .15s,transform .15s;display:inline-block}.btn:hover{box-shadow:0 6px 16px var(--ui-shadow-strong);transform:translateY(-1px)}.btn-pink{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.btn-pink:hover{background:var(--ui-accent-soft);border-color:var(--ui-border-strong);color:var(--ui-accent-strong)}.btn-yellow{background:var(--ui-surface-2);color:var(--ui-text);border-color:var(--ui-border)}.cards{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1.25rem;display:grid}.card{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 1px 2px var(--ui-shadow-color);color:inherit;padding:1.5rem;text-decoration:none;transition:transform .18s,box-shadow .18s,border-color .18s}.card h3{margin-top:0;font-size:.98rem}.card p,.card li{color:var(--ui-muted);font-size:.9rem;line-height:1.6}.card:hover{border-color:var(--ui-border-strong);box-shadow:0 10px 24px var(--ui-shadow-color);transform:translateY(-2px)}a.card h3{color:var(--ui-accent-strong)}.core .card:hover{border-color:var(--ui-accent)}.shot{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);max-width:100%;margin:22px 0;padding:10px}.shot img{border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);width:100%;height:auto;display:block}.shot figcaption{color:var(--ui-muted);margin-top:10px;font-size:.85rem;font-weight:500}.shot a:hover{color:inherit;background:0 0}.shot-feature{max-width:880px}.screen-strip{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:22px;display:grid}.screen-strip .shot{margin:0 0 12px}.code-block{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-code);color:var(--ui-code-text);box-shadow:0 10px 30px var(--ui-shadow-color);margin:20px 0;position:relative;overflow:hidden}.code-label{background:var(--ui-code-bar);color:var(--ui-code-bar-text);font-family:var(--sl-font-mono);letter-spacing:.06em;text-transform:uppercase;padding:.45rem .9rem;font-size:.7rem;font-weight:600;position:absolute;top:0;left:0;right:0}.code-block pre{font-family:var(--sl-font-mono);margin:0;padding:2.2rem 18px 16px;font-size:.86rem;line-height:1.6;overflow-x:auto}.code-block code{color:inherit;font-size:inherit;background:0 0;border:0;padding:0}.table-wrap{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-surface);box-shadow:0 1px 2px var(--ui-shadow-color);margin:18px 0;overflow:auto}table{border-collapse:collapse;width:100%;font-size:.92rem}th,td{text-align:left;vertical-align:top;padding:.65rem .75rem}th{background:var(--ui-surface-2);color:var(--ui-muted);letter-spacing:.06em;text-transform:uppercase;font-size:.7rem;font-weight:700}td{border-top:1px solid var(--ui-border)}tbody tr:nth-child(2n) td{background:var(--ui-surface-2)}td code{white-space:nowrap}.num{font-weight:700}.badge{font-family:var(--sl-font-mono);letter-spacing:.01em;border:0;border-radius:999px;padding:.05rem .5rem;font-size:.74rem;font-weight:600;display:inline-block;transform:none}.badge-ok{background:var(--ui-badge-ok-bg);color:var(--ui-badge-ok-fg)}.badge-warn{background:var(--ui-badge-warn-bg);color:var(--ui-badge-warn-fg)}.badge-err{background:var(--ui-badge-err-bg);color:var(--ui-badge-err-fg)}.badge-info{background:var(--ui-badge-info-bg);color:var(--ui-badge-info-fg)}.kbd{border:1px solid var(--ui-border);background:var(--ui-surface-2);color:var(--ui-text);box-shadow:none;font-family:var(--sl-font-mono);border-radius:5px;padding:.1em .4em;font-size:.84rem;display:inline-block}.callout{background:var(--ui-note);color:var(--ui-text);border:1px solid var(--ui-border);border-inline-start:3px solid var(--ui-accent);border-radius:8px;margin:20px 0;padding:1rem 1.25rem;font-weight:500}.callout p{margin:0}.callout-info,.callout-ok{background:var(--ui-tip)}ul,ol{padding-inline-start:1.5rem}li::marker{color:var(--ui-accent)}.step-list{counter-reset:steps;padding-left:0;list-style:none}.step-list li{counter-increment:steps;margin-top:14px;padding-left:48px;position:relative}.step-list li:before{content:counter(steps);background:var(--ui-accent-soft);width:30px;height:30px;color:var(--ui-accent-strong);box-shadow:none;font-family:var(--font-display);border-radius:999px;place-items:center;font-weight:600;display:grid;position:absolute;top:0;left:0}.flag-name{font-family:var(--sl-font-mono);font-weight:600}.footer{max-width:1200px;color:var(--ui-muted);margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem) 2.5rem;font-size:.9rem}.footer a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong)}.footer a:hover{background:var(--ui-accent-soft)}.footer-links{margin-top:6px}.file-tree{font-family:var(--sl-font-mono);white-space:pre;font-size:.9rem;overflow-x:auto}@media (width<=900px){.shell{grid-template-columns:1fr}.sidebar{background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius);flex-wrap:wrap;align-items:center;gap:.4rem;padding:.75rem 1rem;display:flex;position:static}.side-group{display:contents;margin:0!important}.sidebar ul{flex-wrap:wrap;gap:.25rem;display:flex}.group-label{margin:0 .2rem}.sidebar a,.side-link{background:var(--ui-surface-2);border-radius:999px;padding:.3rem .7rem}.sidebar a.is-active,.side-link.is-active{box-shadow:none}}@media (width<=720px){.hero{border-radius:var(--ui-radius);box-shadow:0 8px 24px var(--ui-shadow-color);grid-template-columns:1fr;padding:1.5rem}.shot,.code-block{box-shadow:0 4px 16px var(--ui-shadow-color)}th,td{padding:.5rem .55rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}} +@import "https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--ui-bg:#f3ede3;--ui-surface:#fffaf2;--ui-surface-2:#f7f0e6;--ui-text:#332820;--ui-text-soft:#5e4d3f;--ui-muted:#756455;--ui-border:#e2d5c5;--ui-border-strong:#d3c2ad;--ui-accent:#8a5b3d;--ui-accent-strong:#7a4f33;--ui-accent-soft:#efe0cf;--ui-accent-contrast:#fffaf2;--ui-badge-ok-fg:#55683f;--ui-badge-warn-fg:#7a5c17;--ui-badge-err-fg:#8a4a38;--ui-badge-info-fg:#6e4a63;--ui-code:#2d231c;--ui-code-text:#f8f1e8;--ui-code-bar:#efe2d2;--ui-code-bar-text:#5e3c27;--ui-radius-sm:3px;--ui-radius:3px;--ui-radius-lg:4px;--font-display:"DM Sans", ui-sans-serif, system-ui, sans-serif;--sl-font:"DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--sl-font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*{scrollbar-color:var(--ui-border-strong) var(--ui-bg);box-sizing:border-box}html{scroll-behavior:smooth}body{background:var(--ui-bg);color:var(--ui-text);font-family:var(--sl-font);text-rendering:optimizelegibility;-webkit-font-smoothing:antialiased;font-size:1rem;font-weight:400;line-height:1.75}::selection{background:var(--ui-accent-soft);color:var(--ui-accent-strong)}::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-track{background:var(--ui-bg)}::-webkit-scrollbar-thumb{background:var(--ui-border-strong);border:3px solid var(--ui-bg)}::-webkit-scrollbar-thumb:hover{background:var(--ui-accent)}:focus-visible{outline:2px solid var(--ui-accent);outline-offset:3px}.skip{z-index:99;background:var(--ui-accent);color:var(--ui-accent-contrast);border-radius:var(--ui-radius-sm);font-family:var(--sl-font);padding:8px 16px;font-weight:600;position:absolute;top:0;left:-9999px}.skip:focus{left:8px}.topbar{background:var(--ui-surface);border-bottom:1px solid var(--ui-border);align-items:center;gap:16px;padding:.6rem clamp(1rem,3vw,2rem);display:flex}.brand{color:var(--ui-text);align-items:center;gap:12px;text-decoration:none;display:inline-flex}.brand-mark{width:2.1rem;height:2.1rem;display:block}.brand-name{font-family:var(--sl-font-mono);letter-spacing:-.01em;font-size:.98rem;font-weight:600}.brand-sub{color:var(--ui-muted);font-family:var(--sl-font-mono);letter-spacing:.14em;font-size:.62rem;font-weight:600}.gh-pill{border:1px solid var(--ui-border);border-radius:var(--ui-radius);height:2.15rem;color:var(--ui-text-soft);font-family:var(--sl-font-mono);background:0 0;align-items:center;gap:.4rem;margin-left:auto;padding:0 .9rem;font-size:.78rem;font-weight:500;text-decoration:none;transition:color .12s,border-color .12s;display:inline-flex}.gh-pill:hover{border-color:var(--ui-accent);color:var(--ui-accent-strong)}.shell{grid-template-columns:210px minmax(0,1fr);align-items:start;gap:clamp(1.5rem,3vw,2.5rem);max-width:1200px;margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem);display:grid}.sidebar{padding-block:.25rem;position:sticky;top:1.5rem}.side-home{margin-bottom:.4rem}.side-group+.side-group{margin-top:1.25rem}.group-label{color:var(--ui-muted);letter-spacing:.12em;text-transform:uppercase;margin:0 0 .4rem;padding:0 .6rem;font-size:.66rem;font-weight:600}.sidebar ul{margin:0;padding:0;list-style:none}.sidebar a,.side-link{color:var(--ui-text-soft);border-left:2px solid #0000;padding:.38rem .6rem;font-weight:500;line-height:1.35;text-decoration:none;transition:color .12s;display:block}.sidebar a:hover,.side-link:hover{color:var(--ui-text)}.sidebar a.is-active,.side-link.is-active{border-left-color:var(--ui-accent);color:var(--ui-accent-strong);font-weight:600}main{min-width:0}.page-head{margin-bottom:26px}.kicker{color:var(--ui-muted);font-family:var(--sl-font-mono);letter-spacing:.12em;text-transform:uppercase;margin:0 0 10px;font-size:.7rem;font-weight:500;display:block}h1{color:var(--ui-text);font-family:var(--font-display);letter-spacing:-.03em;overflow-wrap:anywhere;margin:0 0 14px;padding:0;font-size:clamp(1.9rem,3.8vw,2.6rem);font-weight:700;line-height:1.12;display:block}.lede{max-width:46rem;color:var(--ui-text-soft);margin-block:0 10px;font-size:1.02rem;line-height:1.7;display:block}h2{border-bottom:1px solid var(--ui-border);font-family:var(--font-display);letter-spacing:-.025em;margin-block:2.5rem 1rem;padding-bottom:.5rem;font-size:clamp(1.25rem,2.3vw,1.45rem);font-weight:600;display:block}h3{font-family:var(--font-display);margin-block:1.75rem .6rem;font-size:1.08rem;font-weight:600}strong{font-weight:600}code:not(.code-block code){background:var(--ui-surface-2);color:var(--ui-text);border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);font-family:var(--sl-font-mono);-webkit-box-decoration-break:clone;box-decoration-break:clone;padding:.08em .35em;font-size:.88em;font-weight:500}a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong);text-underline-offset:3px;text-decoration-thickness:1px}a:hover{color:var(--ui-accent);-webkit-text-decoration-color:var(--ui-accent);text-decoration-color:var(--ui-accent)}a.btn:hover{color:var(--ui-accent-contrast);text-decoration:none}.hero{border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:center;gap:clamp(1.5rem,4vw,3rem);margin:.5rem 0 2rem;padding:clamp(1.5rem,4vw,3rem);display:grid}.hero-cta{flex-wrap:wrap;gap:.75rem;margin-top:6px;display:flex}.btn{border:1px solid var(--ui-accent);border-radius:var(--ui-radius);background:var(--ui-accent);color:var(--ui-accent-contrast);padding:.6rem 1.1rem;font-weight:600;text-decoration:none;transition:background .12s,border-color .12s;display:inline-block}.btn:hover{background:var(--ui-accent-strong);border-color:var(--ui-accent-strong)}.btn-pink{border-color:var(--ui-border-strong);color:var(--ui-text);background:0 0}.btn-pink:hover{border-color:var(--ui-accent);color:var(--ui-accent-strong);background:0 0}.btn-yellow{border-color:var(--ui-border-strong);color:var(--ui-text);background:0 0}.cards{grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1.25rem;display:grid}.card{border:1px solid var(--ui-border);border-radius:var(--ui-radius);color:inherit;padding:1.5rem;text-decoration:none;transition:border-color .12s}.card h3{margin-top:0;font-size:.98rem}.card p,.card li{color:var(--ui-muted);font-size:.9rem;line-height:1.6}.card:hover{border-color:var(--ui-accent)}a.card h3{color:var(--ui-text)}.shot{border:1px solid var(--ui-border);border-radius:var(--ui-radius);max-width:100%;margin:22px 0;padding:10px}.shot img{border:1px solid var(--ui-border);border-radius:var(--ui-radius-sm);width:100%;height:auto;display:block}.shot figcaption{color:var(--ui-muted);margin-top:10px;font-size:.85rem;font-weight:500}.shot a:hover{color:inherit}.shot-feature{max-width:880px}.screen-strip{grid-template-columns:repeat(auto-fit,minmax(300px,1fr));align-items:start;gap:22px;display:grid}.screen-strip .shot{margin:0 0 12px}.code-block{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-code);color:var(--ui-code-text);margin:20px 0;position:relative;overflow:hidden}.code-label{background:var(--ui-code-bar);color:var(--ui-code-bar-text);font-family:var(--sl-font-mono);letter-spacing:.06em;text-transform:uppercase;padding:.45rem .9rem;font-size:.7rem;font-weight:600;position:absolute;top:0;left:0;right:0}.code-block pre{font-family:var(--sl-font-mono);margin:0;padding:2.2rem 18px 16px;font-size:.86rem;line-height:1.6;overflow-x:auto}.code-block code{color:inherit;font-size:inherit;background:0 0;border:0;padding:0}.table-wrap{border:1px solid var(--ui-border);border-radius:var(--ui-radius);background:var(--ui-surface);margin:18px 0;overflow:auto}table{border-collapse:collapse;width:100%;font-size:.92rem}th,td{text-align:left;vertical-align:top;padding:.65rem .75rem}th{color:var(--ui-muted);letter-spacing:.06em;text-transform:uppercase;font-size:.7rem;font-weight:600}th,td{border-top:1px solid var(--ui-border)}thead th{border-top:0;border-bottom:1px solid var(--ui-border-strong);background:var(--ui-surface-2)}td code{white-space:nowrap}.num{font-family:var(--sl-font-mono);font-weight:600}.badge{border-radius:var(--ui-radius-sm);font-family:var(--sl-font-mono);white-space:nowrap;border:1px solid;padding:.02rem .45rem;font-size:.72rem;font-weight:500;display:inline-block}.badge-ok{color:var(--ui-badge-ok-fg)}.badge-warn{color:var(--ui-badge-warn-fg)}.badge-err{color:var(--ui-badge-err-fg)}.badge-info{color:var(--ui-badge-info-fg)}.kbd{border:1px solid var(--ui-border-strong);border-radius:var(--ui-radius-sm);background:var(--ui-surface);color:var(--ui-text);font-family:var(--sl-font-mono);border-bottom-width:2px;padding:.1em .4em;font-size:.84rem;display:inline-block}.callout{border-left:2px solid var(--ui-accent);color:var(--ui-text-soft);margin:20px 0;padding:.75rem 1.25rem}.callout p{margin:0}ul,ol{padding-inline-start:1.5rem}li::marker{color:var(--ui-accent)}.step-list{counter-reset:steps;padding-left:0;list-style:none}.step-list li{counter-increment:steps;margin-top:14px;padding-left:44px;position:relative}.step-list li:before{content:counter(steps, decimal-leading-zero);color:var(--ui-accent-strong);font-family:var(--sl-font-mono);font-size:.85rem;font-weight:600;line-height:1.6;position:absolute;top:2px;left:0}.flag-name{font-family:var(--sl-font-mono);font-weight:600}.footer{max-width:1200px;color:var(--ui-muted);margin:0 auto;padding:1.5rem clamp(1rem,3vw,2rem) 2.5rem;font-size:.9rem}.footer a{color:var(--ui-accent-strong);text-decoration:underline;-webkit-text-decoration-color:var(--ui-border-strong);text-decoration-color:var(--ui-border-strong)}.footer-links{margin-top:6px}.file-tree{font-family:var(--sl-font-mono);white-space:pre;font-size:.9rem;overflow-x:auto}@media (width<=900px){.shell{grid-template-columns:1fr}.sidebar{border:1px solid var(--ui-border);border-radius:var(--ui-radius);flex-wrap:wrap;align-items:center;gap:.4rem;padding:.75rem 1rem;display:flex;position:static}.side-group{display:contents;margin:0!important}.sidebar ul{flex-wrap:wrap;gap:.25rem;display:flex}.group-label{margin:0 .2rem}.sidebar a,.side-link{border-left:0;padding:.3rem .7rem}}@media (width<=720px){.hero{grid-template-columns:1fr;padding:1.5rem}th,td{padding:.5rem .55rem}}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,:before,:after{transition-duration:.001ms!important;animation-duration:.001ms!important;animation-iteration-count:1!important}} diff --git a/docs/web/dist/favicon.svg b/docs/web/dist/favicon.svg index 07a976b..77edec9 100644 --- a/docs/web/dist/favicon.svg +++ b/docs/web/dist/favicon.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/docs/web/dist/img/og.png b/docs/web/dist/img/og.png index bcdb7b0..bb9e7d6 100644 Binary files a/docs/web/dist/img/og.png and b/docs/web/dist/img/og.png differ diff --git a/docs/web/dist/index.html b/docs/web/dist/index.html index ea5886e..2fca278 100644 --- a/docs/web/dist/index.html +++ b/docs/web/dist/index.html @@ -31,7 +31,7 @@ -
DevOpsGenDOCSGitHub

docker · github actions · kubernetes

DevOps scaffolding,
deterministically.

DevOpsGen reads your Go or Node.js project and writes a complete, opinionated DevOps baseline: hardened Dockerfile, GitHub Actions pipeline and ready-to-apply Kubernetes manifests — with dry-run plans, automatic backups and config validation built in.

DevOpsGen interactive wizard running in a Windows terminal, asking for the project stack
The interactive wizard — press Enter to accept smart defaults.

Why DevOpsGen

Deterministic

Same inputs, same bytes — every run. Machine-friendly for code review: a second generation with --force produces bit-identical files.

Safe by default

Existing files are never overwritten without --force. Overwrites get .bak backups, failed runs roll back automatically, and --dry-run prints the full plan first.

Validated output

Built-in validation checks Dockerfile structure, GitHub Actions workflow wiring and Kubernetes manifests (selector consistency, port ranges, Ingress paths) before anything ships.

Stack aware

Detects Go and Node.js projects (npm, pnpm, Express, Next.js, Vite, NestJS) from go.mod / package.json and tailors templates accordingly.

Everything a project needs on day one

One init command writes the whole baseline tree. Preview the real terminal output of every command below — all screenshots are live captures, not mockups.

generated in one command
$ devopsgen init --stack go --ci github-actions --registry ghcr --image you/myapp --port 8080
+
DevOpsGenDOCSGitHub

docker · github actions · kubernetes

DevOps scaffolding,
deterministically.

DevOpsGen reads your Go or Node.js project and writes a complete, opinionated DevOps baseline: hardened Dockerfile, GitHub Actions pipeline and ready-to-apply Kubernetes manifests — with dry-run plans, automatic backups and config validation built in.

DevOpsGen interactive wizard running in a Windows terminal, asking for the project stack
The interactive wizard — press Enter to accept smart defaults.

Why DevOpsGen

Deterministic

Same inputs, same bytes — every run. Machine-friendly for code review: a second generation with --force produces bit-identical files.

Safe by default

Existing files are never overwritten without --force. Overwrites get .bak backups, failed runs roll back automatically, and --dry-run prints the full plan first.

Validated output

Built-in validation checks Dockerfile structure, GitHub Actions workflow wiring and Kubernetes manifests (selector consistency, port ranges, Ingress paths) before anything ships.

Stack aware

Detects Go and Node.js projects (npm, pnpm, Express, Next.js, Vite, NestJS) from go.mod / package.json and tailors templates accordingly.

Everything a project needs on day one

One init command writes the whole baseline tree. Preview the real terminal output of every command below — all screenshots are live captures, not mockups.

generated in one command
$ devopsgen init --stack go --ci github-actions --registry ghcr --image you/myapp --port 8080
 created 5 file(s), replaced 0 file(s) in .
 exit code: 0
Terminal showing a successful DevOpsGen init run creating five files with exit code 0
init — first run creates the complete baseline and exits 0.
Terminal showing a DevOpsGen dry-run plan listing five create entries with exit code 0
--dry-run on a fresh project prints the pure create plan and exits 0.
Terminal showing a DevOpsGen dry-run force plan where every file would be replaced, exit code 0
--dry-run --force previews the full replace plan — still nothing written.

What gets generated

Template setFilesPurpose
docker (+ .dockerignore)DockerfileHardened multi-stage build (Go runs as USER 1000:1000 on a scratch base). For Node.js, RUN steps and install/prune commands follow the detected package manager (npm / pnpm) and lockfile. The generated .dockerignore keeps state, tool caches and env files out of the image.
github-actions.github/workflows/ci.ymlRuns your tests when a test command is configured, then builds and pushes the image with both the commit SHA tag and your alias tag, authenticating to the chosen registry via secrets.
kubernetesdeployment.yaml, service.yaml, optional ingress.yamlDNS 1035-safe resource names, container port wiring, resource requests and limits, health probes when --health-path is given, and an optional host-based Ingress (RFC 1123 hostname).

Explore the docs

Command cheatsheet

Terminal showing the full devopsgen help output listing all commands
devopsgen --help — all commands at a glance.
Terminal showing the devopsgen list output with available stacks, app types and registries
devopsgen list — supported stacks, app types and registries.
Terminal showing the devopsgen version output
devopsgen version.
diff --git a/docs/web/dist/logo.svg b/docs/web/dist/logo.svg index 3e42dd3..77edec9 100644 --- a/docs/web/dist/logo.svg +++ b/docs/web/dist/logo.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/docs/web/public/apple-touch-icon.png b/docs/web/public/apple-touch-icon.png index 8fc895e..0419df1 100644 Binary files a/docs/web/public/apple-touch-icon.png and b/docs/web/public/apple-touch-icon.png differ diff --git a/docs/web/public/favicon.svg b/docs/web/public/favicon.svg index 07a976b..77edec9 100644 --- a/docs/web/public/favicon.svg +++ b/docs/web/public/favicon.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/docs/web/public/img/og.png b/docs/web/public/img/og.png index bcdb7b0..bb9e7d6 100644 Binary files a/docs/web/public/img/og.png and b/docs/web/public/img/og.png differ diff --git a/docs/web/public/logo.svg b/docs/web/public/logo.svg index 3e42dd3..77edec9 100644 --- a/docs/web/public/logo.svg +++ b/docs/web/public/logo.svg @@ -1,5 +1,5 @@ - - - + + + diff --git a/docs/web/src/pages/Home.jsx b/docs/web/src/pages/Home.jsx index 799e2c2..3694fbb 100644 --- a/docs/web/src/pages/Home.jsx +++ b/docs/web/src/pages/Home.jsx @@ -8,7 +8,7 @@ export default function Home({ rel }) { <>
-

docker · github actions · kubernetes

+

docker · github actions · kubernetes

DevOps scaffolding,
diff --git a/docs/web/src/styles/site.css b/docs/web/src/styles/site.css index 53a70f3..70a186c 100644 --- a/docs/web/src/styles/site.css +++ b/docs/web/src/styles/site.css @@ -1,4 +1,4 @@ -/* ============ DevOpsGen Docs — soft editorial design, warm palette ============ */ +/* ============ DevOpsGen Docs — flat engineering paper, warm palette ============ */ @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap'); :root { @@ -15,27 +15,17 @@ --ui-accent-strong: #7a4f33; --ui-accent-soft: #efe0cf; --ui-accent-contrast: #fffaf2; - --ui-badge-ok-bg: #e4ecd9; --ui-badge-ok-fg: #55683f; - --ui-badge-warn-bg: #fbf0d2; --ui-badge-warn-fg: #7a5c17; - --ui-badge-err-bg: #f9e2db; --ui-badge-err-fg: #8a4a38; - --ui-badge-info-bg: #efe6ec; --ui-badge-info-fg: #6e4a63; - --ui-note: #f4ead9; - --ui-tip: #edf0e2; - --ui-caution: #fbf0d2; - --ui-danger: #f9e2db; --ui-code: #2d231c; --ui-code-text: #f8f1e8; --ui-code-bar: #efe2d2; --ui-code-bar-text: #5e3c27; - --ui-shadow-color: rgba(74, 52, 38, 0.1); - --ui-shadow-strong: rgba(74, 52, 38, 0.16); - --ui-radius-sm: 6px; - --ui-radius: 10px; - --ui-radius-lg: 16px; + --ui-radius-sm: 3px; + --ui-radius: 3px; + --ui-radius-lg: 4px; --font-display: 'DM Sans', ui-sans-serif, system-ui, sans-serif; --sl-font: 'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; --sl-font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; @@ -63,7 +53,6 @@ body { ::-webkit-scrollbar-thumb { background: var(--ui-border-strong); border: 3px solid var(--ui-bg); - border-radius: 999px; } ::-webkit-scrollbar-thumb:hover { background: var(--ui-accent); } @@ -96,33 +85,30 @@ body { .brand { display: inline-flex; align-items: center; - gap: 10px; + gap: 12px; color: var(--ui-text); text-decoration: none; } .brand-mark { display: block; - width: 2.25rem; - height: 2.25rem; - box-shadow: 0 2px 8px var(--ui-shadow-color); + width: 2.1rem; + height: 2.1rem; } .brand-name { - font-family: var(--font-display); - font-size: 1rem; - font-weight: 700; - letter-spacing: -0.015em; + font-family: var(--sl-font-mono); + font-size: 0.98rem; + font-weight: 600; + letter-spacing: -0.01em; } .brand-sub { - padding: 0.16rem 0.45rem; - border-radius: 999px; - background: var(--ui-accent-soft); - color: var(--ui-accent-strong); - font-size: 0.58rem; - font-weight: 700; - letter-spacing: 0.08em; + color: var(--ui-muted); + font-family: var(--sl-font-mono); + font-size: 0.62rem; + font-weight: 600; + letter-spacing: 0.14em; } .gh-pill { @@ -130,20 +116,19 @@ body { display: inline-flex; align-items: center; gap: 0.4rem; - height: 2.25rem; - padding: 0 1rem; + height: 2.15rem; + padding: 0 0.9rem; border: 1px solid var(--ui-border); - border-radius: 8px; - background: var(--ui-surface-2); - box-shadow: none; + border-radius: var(--ui-radius); + background: transparent; color: var(--ui-text-soft); - font-family: var(--sl-font); - font-size: 0.8rem; - font-weight: 600; + font-family: var(--sl-font-mono); + font-size: 0.78rem; + font-weight: 500; text-decoration: none; - transition: background 150ms ease, border-color 150ms ease; + transition: color 120ms ease, border-color 120ms ease; } -.gh-pill:hover { background: var(--ui-accent-soft); border-color: var(--ui-border-strong); color: var(--ui-accent-strong); } +.gh-pill:hover { border-color: var(--ui-accent); color: var(--ui-accent-strong); } /* ---------- shell: sidebar + content ---------- */ .shell { @@ -170,7 +155,7 @@ body { padding: 0 0.6rem; color: var(--ui-muted); font-size: 0.66rem; - font-weight: 700; + font-weight: 600; letter-spacing: 0.12em; text-transform: uppercase; } @@ -184,20 +169,18 @@ body { .sidebar a, .side-link { display: block; - padding: 0.4rem 0.6rem; - border-radius: 7px; + padding: 0.38rem 0.6rem; + border-left: 2px solid transparent; color: var(--ui-text-soft); font-weight: 500; line-height: 1.35; text-decoration: none; - text-transform: capitalize; - transition: background 150ms ease, color 150ms ease; + transition: color 120ms ease; } -.sidebar a:hover, .side-link:hover { background: var(--ui-surface-2); color: var(--ui-text); } +.sidebar a:hover, .side-link:hover { color: var(--ui-text); } .sidebar a.is-active, .side-link.is-active { - background: var(--ui-accent-soft); + border-left-color: var(--ui-accent); color: var(--ui-accent-strong); - box-shadow: inset 3px 0 0 var(--ui-accent); font-weight: 600; } @@ -207,30 +190,21 @@ main { min-width: 0; } .page-head { margin-bottom: 26px; } .kicker { - display: inline-block; - margin: 0 0 12px; - padding: 0.22rem 0.7rem; - border-radius: 999px; - background: var(--ui-accent-soft); - color: var(--ui-accent-strong); - font-size: 0.66rem; - font-weight: 700; + display: block; + margin: 0 0 10px; + color: var(--ui-muted); + font-family: var(--sl-font-mono); + font-size: 0.7rem; + font-weight: 500; letter-spacing: 0.12em; text-transform: uppercase; } -.violet { background: var(--ui-badge-info-bg); color: var(--ui-badge-info-fg); } -.blue { background: var(--ui-note); color: var(--ui-text-soft); } -.pink { background: var(--ui-caution); color: var(--ui-badge-warn-fg); } -.yellow { background: var(--ui-caution); color: var(--ui-badge-warn-fg); } - h1 { display: block; margin: 0 0 14px; padding: 0; - background: transparent; color: var(--ui-text); - box-shadow: none; font-family: var(--font-display); font-size: clamp(1.9rem, 3.8vw, 2.6rem); font-weight: 700; @@ -242,23 +216,16 @@ h1 { .lede { display: block; max-width: 46rem; - margin-block: 0 8px; - padding: 1rem 1.25rem; - background: var(--ui-surface); + margin-block: 0 10px; color: var(--ui-text-soft); - border: 1px solid var(--ui-border); - border-inline-start: 3px solid var(--ui-accent); - border-radius: 8px; font-size: 1.02rem; line-height: 1.7; } h2 { - display: flex; - align-items: center; - gap: 0.6rem; + display: block; margin-block: 2.5rem 1rem; - padding-bottom: 0.55rem; + padding-bottom: 0.5rem; border-bottom: 1px solid var(--ui-border); font-family: var(--font-display); font-size: clamp(1.25rem, 2.3vw, 1.45rem); @@ -266,15 +233,6 @@ h2 { letter-spacing: -0.025em; } -h2::before { - content: ''; - flex: 0 0 auto; - width: 0.35rem; - height: 1.1em; - border-radius: 999px; - background: var(--ui-accent); -} - h3 { margin-block: 1.75rem 0.6rem; font-family: var(--font-display); @@ -282,12 +240,12 @@ h3 { font-weight: 600; } -strong { color: var(--ui-accent-strong); font-weight: 600; } +strong { font-weight: 600; } code:not(.code-block code) { padding: 0.08em 0.35em; background: var(--ui-surface-2); - color: var(--ui-accent-strong); + color: var(--ui-text); border: 1px solid var(--ui-border); border-radius: var(--ui-radius-sm); font-family: var(--sl-font-mono); @@ -297,24 +255,19 @@ code:not(.code-block code) { } a { color: var(--ui-accent-strong); text-decoration: underline; text-decoration-color: var(--ui-border-strong); text-decoration-thickness: 1px; text-underline-offset: 3px; } -a:hover { color: var(--ui-accent); text-decoration-color: var(--ui-accent); background: transparent; } -.btn:hover, .gh-pill:hover, .sidebar a:hover, .side-link:hover { background-color: inherit; } -a.btn:hover { color: var(--ui-accent-contrast); text-decoration: none; background: var(--ui-accent-strong); } +a:hover { color: var(--ui-accent); text-decoration-color: var(--ui-accent); } +a.btn:hover { color: var(--ui-accent-contrast); text-decoration: none; } /* ---------- hero (home) ---------- */ .hero { - position: relative; display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr); gap: clamp(1.5rem, 4vw, 3rem); align-items: center; margin: 0.5rem 0 2rem; padding: clamp(1.5rem, 4vw, 3rem); - background: var(--ui-surface); - color: var(--ui-text); border: 1px solid var(--ui-border); border-radius: var(--ui-radius-lg); - box-shadow: 0 16px 40px var(--ui-shadow-color); } .hero-cta { display: flex; flex-wrap: wrap; gap: 0.75rem; margin-top: 6px; } @@ -323,18 +276,21 @@ a.btn:hover { color: var(--ui-accent-contrast); text-decoration: none; backgroun display: inline-block; padding: 0.6rem 1.1rem; border: 1px solid var(--ui-accent); - border-radius: 9px; + border-radius: var(--ui-radius); background: var(--ui-accent); color: var(--ui-accent-contrast); - box-shadow: 0 2px 6px var(--ui-shadow-color); font-weight: 600; text-decoration: none; - transition: background 150ms ease, border-color 150ms ease, box-shadow 150ms ease, transform 150ms ease; + transition: background 120ms ease, border-color 120ms ease; } -.btn:hover { transform: translateY(-1px); box-shadow: 0 6px 16px var(--ui-shadow-strong); } -.btn-pink { background: var(--ui-surface-2); color: var(--ui-text); border-color: var(--ui-border); } -.btn-pink:hover { background: var(--ui-accent-soft); border-color: var(--ui-border-strong); color: var(--ui-accent-strong); } -.btn-yellow { background: var(--ui-surface-2); color: var(--ui-text); border-color: var(--ui-border); } +.btn:hover { background: var(--ui-accent-strong); border-color: var(--ui-accent-strong); } +.btn-pink { + border-color: var(--ui-border-strong); + background: transparent; + color: var(--ui-text); +} +.btn-pink:hover { border-color: var(--ui-accent); color: var(--ui-accent-strong); background: transparent; } +.btn-yellow { border-color: var(--ui-border-strong); background: transparent; color: var(--ui-text); } /* ---------- cards ---------- */ .cards { @@ -345,28 +301,23 @@ a.btn:hover { color: var(--ui-accent-contrast); text-decoration: none; backgroun .card { padding: 1.5rem; - background: var(--ui-surface); border: 1px solid var(--ui-border); border-radius: var(--ui-radius); - box-shadow: 0 1px 2px var(--ui-shadow-color); color: inherit; text-decoration: none; - transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease; + transition: border-color 120ms ease; } .card h3 { margin-top: 0; font-size: 0.98rem; } .card p, .card li { color: var(--ui-muted); font-size: 0.9rem; line-height: 1.6; } -.card:hover { transform: translateY(-2px); border-color: var(--ui-border-strong); box-shadow: 0 10px 24px var(--ui-shadow-color); } -a.card h3 { color: var(--ui-accent-strong); } -.core .card:hover { border-color: var(--ui-accent); } +.card:hover { border-color: var(--ui-accent); } +a.card h3 { color: var(--ui-text); } /* ---------- screenshots ---------- */ .shot { margin: 22px 0; padding: 10px; - background: var(--ui-surface); border: 1px solid var(--ui-border); border-radius: var(--ui-radius); - box-shadow: 0 8px 24px var(--ui-shadow-color); max-width: 100%; } .shot img { display: block; width: 100%; height: auto; border: 1px solid var(--ui-border); border-radius: var(--ui-radius-sm); } @@ -376,7 +327,7 @@ a.card h3 { color: var(--ui-accent-strong); } font-size: 0.85rem; font-weight: 500; } -.shot a:hover { background: transparent; color: inherit; } +.shot a:hover { color: inherit; } .shot-feature { max-width: 880px; } .screen-strip { @@ -396,7 +347,6 @@ a.card h3 { color: var(--ui-accent-strong); } overflow: hidden; background: var(--ui-code); color: var(--ui-code-text); - box-shadow: 0 10px 30px var(--ui-shadow-color); } .code-label { position: absolute; @@ -429,48 +379,45 @@ a.card h3 { color: var(--ui-accent-strong); } border-radius: var(--ui-radius); background: var(--ui-surface); margin: 18px 0; - box-shadow: 0 1px 2px var(--ui-shadow-color); } table { border-collapse: collapse; width: 100%; font-size: 0.92rem; } th, td { padding: 0.65rem 0.75rem; text-align: left; vertical-align: top; } th { - background: var(--ui-surface-2); color: var(--ui-muted); font-size: 0.7rem; - font-weight: 700; + font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; } -td { border-top: 1px solid var(--ui-border); } -tbody tr:nth-child(2n) td { background: var(--ui-surface-2); } +th, td { border-top: 1px solid var(--ui-border); } +thead th { border-top: 0; border-bottom: 1px solid var(--ui-border-strong); background: var(--ui-surface-2); } td code { white-space: nowrap; } -.num { font-weight: 700; } +.num { font-family: var(--sl-font-mono); font-weight: 600; } /* ---------- badges & kbd ---------- */ .badge { display: inline-block; - padding: 0.05rem 0.5rem; - border: 0; - border-radius: 999px; + padding: 0.02rem 0.45rem; + border: 1px solid currentColor; + border-radius: var(--ui-radius-sm); font-family: var(--sl-font-mono); - font-size: 0.74rem; - font-weight: 600; - letter-spacing: 0.01em; - transform: none; + font-size: 0.72rem; + font-weight: 500; + white-space: nowrap; } -.badge-ok { background: var(--ui-badge-ok-bg); color: var(--ui-badge-ok-fg); } -.badge-warn { background: var(--ui-badge-warn-bg); color: var(--ui-badge-warn-fg); } -.badge-err { background: var(--ui-badge-err-bg); color: var(--ui-badge-err-fg); } -.badge-info { background: var(--ui-badge-info-bg); color: var(--ui-badge-info-fg); } +.badge-ok { color: var(--ui-badge-ok-fg); } +.badge-warn { color: var(--ui-badge-warn-fg); } +.badge-err { color: var(--ui-badge-err-fg); } +.badge-info { color: var(--ui-badge-info-fg); } .kbd { display: inline-block; padding: 0.1em 0.4em; - border: 1px solid var(--ui-border); - border-radius: 5px; - background: var(--ui-surface-2); + border: 1px solid var(--ui-border-strong); + border-bottom-width: 2px; + border-radius: var(--ui-radius-sm); + background: var(--ui-surface); color: var(--ui-text); - box-shadow: none; font-family: var(--sl-font-mono); font-size: 0.84rem; } @@ -478,17 +425,11 @@ td code { white-space: nowrap; } /* ---------- callouts (aside style) ---------- */ .callout { margin: 20px 0; - padding: 1rem 1.25rem; - background: var(--ui-note); - color: var(--ui-text); - border: 1px solid var(--ui-border); - border-inline-start: 3px solid var(--ui-accent); - border-radius: 8px; - font-weight: 500; + padding: 0.75rem 1.25rem; + border-left: 2px solid var(--ui-accent); + color: var(--ui-text-soft); } .callout p { margin: 0; } -.callout-info { background: var(--ui-tip); } -.callout-ok { background: var(--ui-tip); } /* ---------- step list ---------- */ ul, ol { padding-inline-start: 1.5rem; } @@ -498,24 +439,19 @@ li::marker { color: var(--ui-accent); } .step-list li { counter-increment: steps; position: relative; - padding-left: 48px; + padding-left: 44px; margin-top: 14px; } .step-list li::before { - content: counter(steps); + content: counter(steps, decimal-leading-zero); position: absolute; left: 0; - top: 0; - display: grid; - place-items: center; - width: 30px; - height: 30px; - border-radius: 999px; - background: var(--ui-accent-soft); + top: 2px; color: var(--ui-accent-strong); - box-shadow: none; - font-family: var(--font-display); + font-family: var(--sl-font-mono); + font-size: 0.85rem; font-weight: 600; + line-height: 1.6; } .flag-name { font-family: var(--sl-font-mono); font-weight: 600; } @@ -529,7 +465,6 @@ li::marker { color: var(--ui-accent); } font-size: 0.9rem; } .footer a { color: var(--ui-accent-strong); text-decoration: underline; text-decoration-color: var(--ui-border-strong); } -.footer a:hover { background: var(--ui-accent-soft); } .footer-links { margin-top: 6px; } .file-tree { @@ -548,20 +483,17 @@ li::marker { color: var(--ui-accent); } align-items: center; gap: 0.4rem; padding: 0.75rem 1rem; - background: var(--ui-surface); border: 1px solid var(--ui-border); border-radius: var(--ui-radius); } .side-group { margin: 0 !important; display: contents; } .sidebar ul { display: flex; flex-wrap: wrap; gap: 0.25rem; } .group-label { margin: 0 0.2rem; } - .sidebar a, .side-link { padding: 0.3rem 0.7rem; border-radius: 999px; background: var(--ui-surface-2); } - .sidebar a.is-active, .side-link.is-active { box-shadow: none; } + .sidebar a, .side-link { padding: 0.3rem 0.7rem; border-left: 0; } } @media (max-width: 720px) { - .hero { grid-template-columns: 1fr; padding: 1.5rem; border-radius: var(--ui-radius); box-shadow: 0 8px 24px var(--ui-shadow-color); } - .shot, .code-block { box-shadow: 0 4px 16px var(--ui-shadow-color); } + .hero { grid-template-columns: 1fr; padding: 1.5rem; } th, td { padding: 0.5rem 0.55rem; } }