@specbook/ui 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./Host-ClcN3YPO.js","./panel-nV09I7Wr.js","./panel-l1xvY4kI.css","./mount-D3holu10.js"])))=>i.map(i=>d[i]);
2
+ import{a as e,c as t,d as n,h as r,l as i,m as a,n as o,o as s,p as c,r as l,s as u,u as d,v as f,y as p}from"./panel-nV09I7Wr.js";import{a as m,n as h}from"./mount-D3holu10.js";var g=Object.defineProperty,_=(e,t)=>{let n={};for(var r in e)g(n,r,{get:e[r],enumerable:!0});return t||g(n,Symbol.toStringTag,{value:`Module`}),n},v=Object.prototype.hasOwnProperty;function y(e,t,n){for(n of e.keys())if(b(n,t))return n}function b(e,t){var n,r,i;if(e===t)return!0;if(e&&t&&(n=e.constructor)===t.constructor){if(n===Date)return e.getTime()===t.getTime();if(n===RegExp)return e.toString()===t.toString();if(n===Array){if((r=e.length)===t.length)for(;r--&&b(e[r],t[r]););return r===-1}if(n===Set){if(e.size!==t.size)return!1;for(r of e)if(i=r,i&&typeof i==`object`&&(i=y(t,i),!i)||!t.has(i))return!1;return!0}if(n===Map){if(e.size!==t.size)return!1;for(r of e)if(i=r[0],i&&typeof i==`object`&&(i=y(t,i),!i)||!b(r[1],t.get(i)))return!1;return!0}if(n===ArrayBuffer)e=new Uint8Array(e),t=new Uint8Array(t);else if(n===DataView){if((r=e.byteLength)===t.byteLength)for(;r--&&e.getInt8(r)===t.getInt8(r););return r===-1}if(ArrayBuffer.isView(e)){if((r=e.byteLength)===t.byteLength)for(;r--&&e[r]===t[r];);return r===-1}if(!n||typeof e==`object`){for(n in r=0,e)if(v.call(e,n)&&++r&&!v.call(t,n)||!(n in t)||!b(e[n],t[n]))return!1;return Object.keys(t).length===r}}return e!==e&&t!==t}var x,S,C,w,T=!0;typeof process<`u`&&({FORCE_COLOR:x,NODE_DISABLE_COLORS:S,NO_COLOR:C,TERM:w}={},T=process.stdout&&process.stdout.isTTY);var E={enabled:!S&&C==null&&w!==`dumb`&&(x!=null&&x!==`0`||T),reset:k(0,0),bold:k(1,22),dim:k(2,22),italic:k(3,23),underline:k(4,24),inverse:k(7,27),hidden:k(8,28),strikethrough:k(9,29),black:k(30,39),red:k(31,39),green:k(32,39),yellow:k(33,39),blue:k(34,39),magenta:k(35,39),cyan:k(36,39),white:k(37,39),gray:k(90,39),grey:k(90,39),bgBlack:k(40,49),bgRed:k(41,49),bgGreen:k(42,49),bgYellow:k(43,49),bgBlue:k(44,49),bgMagenta:k(45,49),bgCyan:k(46,49),bgWhite:k(47,49)};function D(e,t){let n=0,r,i=``,a=``;for(;n<e.length;n++)r=e[n],i+=r.open,a+=r.close,~t.indexOf(r.close)&&(t=t.replace(r.rgx,r.close+r.open));return i+t+a}function O(e,t){let n={has:e,keys:t};return n.reset=E.reset.bind(n),n.bold=E.bold.bind(n),n.dim=E.dim.bind(n),n.italic=E.italic.bind(n),n.underline=E.underline.bind(n),n.inverse=E.inverse.bind(n),n.hidden=E.hidden.bind(n),n.strikethrough=E.strikethrough.bind(n),n.black=E.black.bind(n),n.red=E.red.bind(n),n.green=E.green.bind(n),n.yellow=E.yellow.bind(n),n.blue=E.blue.bind(n),n.magenta=E.magenta.bind(n),n.cyan=E.cyan.bind(n),n.white=E.white.bind(n),n.gray=E.gray.bind(n),n.grey=E.grey.bind(n),n.bgBlack=E.bgBlack.bind(n),n.bgRed=E.bgRed.bind(n),n.bgGreen=E.bgGreen.bind(n),n.bgYellow=E.bgYellow.bind(n),n.bgBlue=E.bgBlue.bind(n),n.bgMagenta=E.bgMagenta.bind(n),n.bgCyan=E.bgCyan.bind(n),n.bgWhite=E.bgWhite.bind(n),n}function k(e,t){let n={open:`\x1b[${e}m`,close:`\x1b[${t}m`,rgx:RegExp(`\\x1b\\[${t}m`,`g`)};return function(t){return this!==void 0&&this.has!==void 0?(~this.has.indexOf(e)||(this.has.push(e),this.keys.push(n)),t===void 0?this:E.enabled?D(this.keys,t+``):t+``):t===void 0?O([e],[n]):E.enabled?D([n],t+``):t+``}}function A(){}A.prototype={diff:function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},r=n.callback;typeof n==`function`&&(r=n,n={}),this.options=n;var i=this;function a(e){return r?(setTimeout(function(){r(void 0,e)},0),!0):e}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e)),t=this.removeEmpty(this.tokenize(t));var o=t.length,s=e.length,c=1,l=o+s;n.maxEditLength&&(l=Math.min(l,n.maxEditLength));var u=n.timeout??1/0,d=Date.now()+u,f=[{oldPos:-1,lastComponent:void 0}],p=this.extractCommon(f[0],t,e,0);if(f[0].oldPos+1>=s&&p+1>=o)return a([{value:this.join(t),count:t.length}]);var m=-1/0,h=1/0;function g(){for(var n=Math.max(m,-c);n<=Math.min(h,c);n+=2){var r=void 0,l=f[n-1],u=f[n+1];l&&(f[n-1]=void 0);var d=!1;if(u){var g=u.oldPos-n;d=u&&0<=g&&g<o}var _=l&&l.oldPos+1<s;if(!d&&!_)f[n]=void 0;else{if(r=!_||d&&l.oldPos+1<u.oldPos?i.addToPath(u,!0,void 0,0):i.addToPath(l,void 0,!0,1),p=i.extractCommon(r,t,e,n),r.oldPos+1>=s&&p+1>=o)return a(ee(i,r.lastComponent,t,e,i.useLongestToken));f[n]=r,r.oldPos+1>=s&&(h=Math.min(h,n-1)),p+1>=o&&(m=Math.max(m,n+1))}}c++}if(r)(function e(){setTimeout(function(){if(c>l||Date.now()>d)return r();g()||e()},0)})();else for(;c<=l&&Date.now()<=d;){var _=g();if(_)return _}},addToPath:function(e,t,n,r){var i=e.lastComponent;return i&&i.added===t&&i.removed===n?{oldPos:e.oldPos+r,lastComponent:{count:i.count+1,added:t,removed:n,previousComponent:i.previousComponent}}:{oldPos:e.oldPos+r,lastComponent:{count:1,added:t,removed:n,previousComponent:i}}},extractCommon:function(e,t,n,r){for(var i=t.length,a=n.length,o=e.oldPos,s=o-r,c=0;s+1<i&&o+1<a&&this.equals(t[s+1],n[o+1]);)s++,o++,c++;return c&&(e.lastComponent={count:c,previousComponent:e.lastComponent}),e.oldPos=o,s},equals:function(e,t){return this.options.comparator?this.options.comparator(e,t):e===t||this.options.ignoreCase&&e.toLowerCase()===t.toLowerCase()},removeEmpty:function(e){for(var t=[],n=0;n<e.length;n++)e[n]&&t.push(e[n]);return t},castInput:function(e){return e},tokenize:function(e){return e.split(``)},join:function(e){return e.join(``)}};function ee(e,t,n,r,i){for(var a=[],o;t;)a.push(t),o=t.previousComponent,delete t.previousComponent,t=o;a.reverse();for(var s=0,c=a.length,l=0,u=0;s<c;s++){var d=a[s];if(!d.removed){if(!d.added&&i){var f=n.slice(l,l+d.count);f=f.map(function(e,t){var n=r[u+t];return n.length>e.length?n:e}),d.value=e.join(f)}else d.value=e.join(n.slice(l,l+d.count));l+=d.count,d.added||(u+=d.count)}else if(d.value=e.join(r.slice(u,u+d.count)),u+=d.count,s&&a[s-1].added){var p=a[s-1];a[s-1]=a[s],a[s]=p}}var m=a[c-1];return c>1&&typeof m.value==`string`&&(m.added||m.removed)&&e.equals(``,m.value)&&(a[c-2].value+=m.value,a.pop()),a}var te=new A;function ne(e,t,n){return te.diff(e,t,n)}var re=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,ie=/\S/,ae=new A;ae.equals=function(e,t){return this.options.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e===t||this.options.ignoreWhitespace&&!ie.test(e)&&!ie.test(t)},ae.tokenize=function(e){for(var t=e.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),n=0;n<t.length-1;n++)!t[n+1]&&t[n+2]&&re.test(t[n])&&re.test(t[n+2])&&(t[n]+=t[n+2],t.splice(n+1,2),n--);return t};var oe=new A;oe.tokenize=function(e){this.options.stripTrailingCr&&(e=e.replace(/\r\n/g,`
3
+ `));var t=[],n=e.split(/(\n|\r\n)/);n[n.length-1]||n.pop();for(var r=0;r<n.length;r++){var i=n[r];r%2&&!this.options.newlineIsToken?t[t.length-1]+=i:(this.options.ignoreWhitespace&&(i=i.trim()),t.push(i))}return t};function se(e,t,n){return oe.diff(e,t,n)}var ce=new A;ce.tokenize=function(e){return e.split(/(\S.+?[.!?])(?=\s+|$)/)};var le=new A;le.tokenize=function(e){return e.split(/([{}:;,]|\s+)/)};function ue(e){"@babel/helpers - typeof";return ue=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},ue(e)}var de=Object.prototype.toString,fe=new A;fe.useLongestToken=!0,fe.tokenize=oe.tokenize,fe.castInput=function(e){var t=this.options,n=t.undefinedReplacement,r=t.stringifyReplacer,i=r===void 0?function(e,t){return t===void 0?n:t}:r;return typeof e==`string`?e:JSON.stringify(pe(e,null,null,i),i,` `)},fe.equals=function(e,t){return A.prototype.equals.call(fe,e.replace(/,([\r\n])/g,`$1`),t.replace(/,([\r\n])/g,`$1`))};function pe(e,t,n,r,i){t||=[],n||=[],r&&(e=r(i,e));for(var a=0;a<t.length;a+=1)if(t[a]===e)return n[a];var o;if(de.call(e)===`[object Array]`){for(t.push(e),o=Array(e.length),n.push(o),a=0;a<e.length;a+=1)o[a]=pe(e[a],t,n,r,i);return t.pop(),n.pop(),o}if(e&&e.toJSON&&(e=e.toJSON()),ue(e)===`object`&&e!==null){t.push(e),o={},n.push(o);var s=[],c;for(c in e)e.hasOwnProperty(c)&&s.push(c);for(s.sort(),a=0;a<s.length;a+=1)c=s[a],o[c]=pe(e[c],t,n,r,c);t.pop(),n.pop()}else o=e;return o}var me=new A;me.tokenize=function(e){return e.slice()},me.join=me.removeEmpty=function(e){return e};function he(e,t,n){return me.diff(e,t,n)}var ge={"--":E.red,"··":E.grey,"++":E.green},_e=E.dim().italic,ve=E.dim(`→`),ye=E.dim(`·`),be=E.dim(`↵`),xe=(e,t)=>ge[e](e+Ce(t))+`
4
+ `,Se=(e,t)=>E.dim(`L`+String(e).padStart(t,`0`)+` `),Ce=e=>e.replace(/[ ]/g,ye).replace(/\t/g,ve).replace(/(\r?\n)/g,be);function we(e,t,n){let r=e.removed?`--`:e.added?`++`:`··`,i=e.value.replace(/\r?\n$/,``).split(`
5
+ `),a=0,o,s=``;for(e.added?s+=ge[r]().underline(_e(`Expected:`))+`
6
+ `:e.removed&&(s+=ge[r]().underline(_e(`Actual:`))+`
7
+ `);a<i.length;a++)o=i[a],o!=null&&(t&&(s+=Se(t+a,n)),s+=xe(r,o||`
8
+ `));return s}function Te(e,t){let n=he(e,t),r=0,i=0,a=0,o,s,c,l,u,d=xe(`··`,`[`);for(;r<n.length;r++)for(c=(o=n[r]).removed?`--`:o.added?`++`:`··`,o.added?d+=ge[c]().underline(_e(`Expected:`))+`
9
+ `:o.removed&&(d+=ge[c]().underline(_e(`Actual:`))+`
10
+ `),i=0;i<o.value.length;i++)for(l=o.value[i]&&typeof o.value[i]==`object`,s=je(o.value[i]).split(/\r?\n/g),a=0;a<s.length;)u=` `+s[a++]+(l?``:`,`),l&&a===s.length&&i+1<o.value.length&&(u+=`,`),d+=xe(c,u);return d+xe(`··`,`]`)}function Ee(e,t,n=0){let r=0,i,a=``,o=se(e,t),s=String(t.split(/\r?\n/g).length-n).length;for(;r<o.length;r++)a+=we(i=o[r],n,s),n&&!i.removed&&(n+=i.count);return a}function De(e,t){let n=ne(e,t),r=0,i=``,a,o=e.length,s=t.length,c=Ce(e),l=Ce(t);if(a=n[r],o!==s&&a.removed&&n[r+1]){let i=a.count-n[r+1].count;i==0||(i>0?(t=` `.repeat(i)+t,l=` `.repeat(i)+l,s+=i):i<0&&(e=` `.repeat(-i)+e,c=` `.repeat(-i)+c,o+=-i))}if(i+=Oe(c,l,o,s),o===s)for(a=` `;r<o;r++)a+=e[r]===t[r]?` `:`^`;else for(a=` `;r<n.length;r++)a+=(n[r].added||n[r].removed?`^`:` `).repeat(Math.max(n[r].count,0)),r+1<n.length&&(n[r].added&&n[r+1].removed||n[r].removed&&n[r+1].added)&&(n[r+1].count-=n[r].count);return i+E.red(a)}function Oe(e,t,n=String(e).length,r=String(t).length){let i=4,a=Math.max(n,r),o=typeof e,s=typeof t;if(o!==s){i=2;let c=i+a-n,l=i+a-r;e+=` `.repeat(c)+E.dim(`[${o}]`),t+=` `.repeat(l)+E.dim(`[${s}]`),n+=c+o.length+2,r+=l+s.length+2,a=Math.max(n,r)}return ge[`++`](`++`+t+` `.repeat(i+a-r)+_e(`(Expected)`))+`
11
+ `+ge[`--`](`--`+e+` `.repeat(i+a-n)+_e(`(Actual)`))+`
12
+ `}function ke(e,t){var n,r=0,i,a=Array.isArray(e),o=[],s=a?Array(e.length):{};if(a)for(r=0;r<s.length;r++)i=e[r],!i||typeof i!=`object`?s[r]=i:s[r]=ke(i,t[r]);else{for(n in t)o.push(n);for(;r<o.length;r++)Object.prototype.hasOwnProperty.call(e,n=o[r])&&(!(i=e[n])||typeof i!=`object`?s[n]=i:s[n]=ke(i,t[n]));for(n in e)s.hasOwnProperty(n)||(s[n]=e[n])}return s}function Ae(){var e=new Set;return function(t,n){return n===void 0?`[__VOID__]`:typeof n==`number`&&n!==n?`[__NAN__]`:typeof n==`bigint`?n.toString():!n||typeof n!=`object`?n:e.has(n)?`[Circular]`:(e.add(n),n)}}function je(e){return JSON.stringify(e,Ae(),2).replace(/"\[__NAN__\]"/g,`NaN`).replace(/"\[__VOID__\]"/g,`undefined`)}function Me(e,t){if(Array.isArray(t)&&Array.isArray(e))return Te(e,t);if(t instanceof RegExp)return De(``+e,``+t);let n=e&&typeof e==`object`,r=t&&typeof t==`object`;return n&&r&&(e=ke(e,t)),r&&(t=je(t)),n&&(e=je(e)),t&&typeof t==`object`&&(e=je(ke(e,t)),t=je(t)),n=typeof e==`string`,r=typeof t==`string`,n&&/\r?\n/.test(e)?Ee(e,``+t):r&&/\r?\n/.test(t)?Ee(``+e,t):n&&r?De(e,t):Oe(e,t)}var Ne=_({Assertion:()=>Pe,equal:()=>Le,fixture:()=>We,instance:()=>Be,is:()=>Ie,match:()=>Ve,not:()=>N,ok:()=>Fe,snapshot:()=>He,throws:()=>Ge,type:()=>ze,unreachable:()=>Re});function j(e){e=e.replace(/\r?\n/g,`
13
+ `);let t=e.match(/^[ \t]*(?=\S)/gm),n=0,r=1/0,i=(t||[]).length;for(;n<i;n++)r=Math.min(r,t[n].length);return i&&r?e.replace(RegExp(`^[ \\t]{${r}}`,`gm`),``):e}var Pe=class extends Error{constructor(e={}){super(e.message),this.name=`Assertion`,this.code=`ERR_ASSERTION`,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor),this.details=e.details||!1,this.generated=!!e.generated,this.operator=e.operator,this.expects=e.expects,this.actual=e.actual}};function M(e,t,n,r,i,a,o){if(e)return;let s=o||a;throw o instanceof Error?o:new Pe({actual:t,expects:n,operator:r,message:s,details:i&&i(t,n),generated:!o})}function Fe(e,t){M(!!e,!1,!0,`ok`,!1,`Expected value to be truthy`,t)}function Ie(e,t,n){M(e===t,e,t,`is`,Me,`Expected values to be strictly equal:`,n)}function Le(e,t,n){M(b(e,t),e,t,`equal`,Me,`Expected values to be deeply equal:`,n)}function Re(e){M(!1,!0,!1,`unreachable`,!1,`Expected not to be reached!`,e)}function ze(e,t,n){let r=typeof e;M(r===t,r,t,`type`,!1,`Expected "${r}" to be "${t}"`,n)}function Be(e,t,n){let r="`"+(t.name||t.constructor.name)+"`";M(e instanceof t,e,t,`instance`,!1,`Expected value to be an instance of ${r}`,n)}function Ve(e,t,n){typeof t==`string`?M(e.includes(t),e,t,`match`,!1,`Expected value to include "${t}" substring`,n):M(t.test(e),e,t,`match`,!1,`Expected value to match \`${String(t)}\` pattern`,n)}function He(e,t,n){e=j(e),t=j(t),M(e===t,e,t,`snapshot`,Ee,`Expected value to match snapshot:`,n)}var Ue=(e,t)=>Ee(e,t,1);function We(e,t,n){e=j(e),t=j(t),M(e===t,e,t,`fixture`,Ue,`Expected value to match fixture:`,n)}function Ge(e,t,n){!n&&typeof t==`string`&&(n=t,t=null);try{e(),M(!1,!1,!0,`throws`,!1,`Expected function to throw`,n)}catch(e){if(e instanceof Pe)throw e;typeof t==`function`?M(t(e),!1,!0,`throws`,!1,`Expected function to throw matching exception`,n):t instanceof RegExp&&M(t.test(e.message),!1,!0,`throws`,!1,`Expected function to throw exception matching \`${String(t)}\` pattern`,n)}}function N(e,t){M(!e,!0,!1,`not`,!1,`Expected value to be falsey`,t)}N.ok=N,Ie.not=function(e,t,n){M(e!==t,e,t,`is.not`,!1,`Expected values not to be strictly equal`,n)},N.equal=function(e,t,n){M(!b(e,t),e,t,`not.equal`,!1,`Expected values not to be deeply equal`,n)},N.type=function(e,t,n){let r=typeof e;M(r!==t,r,t,`not.type`,!1,`Expected "${r}" not to be "${t}"`,n)},N.instance=function(e,t,n){let r="`"+(t.name||t.constructor.name)+"`";M(!(e instanceof t),e,t,`not.instance`,!1,`Expected value not to be an instance of ${r}`,n)},N.snapshot=function(e,t,n){e=j(e),t=j(t),M(e!==t,e,t,`not.snapshot`,!1,`Expected value not to match snapshot`,n)},N.fixture=function(e,t,n){e=j(e),t=j(t),M(e!==t,e,t,`not.fixture`,!1,`Expected value not to match fixture`,n)},N.match=function(e,t,n){typeof t==`string`?M(!e.includes(t),e,t,`not.match`,!1,`Expected value not to include "${t}" substring`,n):M(!t.test(e),e,t,`not.match`,!1,`Expected value not to match \`${String(t)}\` pattern`,n)},N.throws=function(e,t,n){!n&&typeof t==`string`&&(n=t,t=null);try{e()}catch(e){typeof t==`function`?M(!t(e),!0,!1,`not.throws`,!1,`Expected function not to throw matching exception`,n):t instanceof RegExp?M(!t.test(e.message),!0,!1,`not.throws`,!1,`Expected function not to throw exception matching \`${String(t)}\` pattern`,n):t||M(!1,!0,!1,`not.throws`,!1,`Expected function not to throw`,n)}};var Ke=/\u001b\[[0-9;]*m/g,qe=e=>e.replace(Ke,``),Je=/(?:\(|at )?([^\s()]+):(\d+):(\d+)\)?\s*$/;function Ye(e){if(!e)return;let t=e.split(`
14
+ `).slice(1).map(e=>({line:e,m:Je.exec(e)})),n=t[0]?.m?.[1];for(let{line:e,m:r}of t)if(!(!r||e.includes(`/core/src/assert`)||e.includes(`node_modules`))&&r[1]!==n)return{file:r[1],line:Number(r[2]),column:Number(r[3])}}function Xe(e=`soft`){let t=[],n=(n,r)=>{let i=r.length-1;return(...a)=>{let o=typeof a[i]==`string`?a[i]:void 0;try{r(...a),t.push({label:o??n,operator:n,pass:!0,location:Ye(Error().stack)})}catch(r){if(r?.name!==`Assertion`||(t.push({label:qe(String(r.message??o??n)),operator:n,pass:!1,actual:r.actual,expected:r.expects,diff:r.details?qe(String(r.details)):void 0,location:Ye(Error().stack)}),e===`hard`))throw r}}},r=Ne,i={};for(let e of[`ok`,`is`,`equal`,`type`,`instance`,`match`,`throws`,`unreachable`,`snapshot`,`fixture`])typeof r[e]==`function`&&(i[e]=n(e,r[e]));let a=n(`not`,r.not);for(let e of Object.keys(r.not??{}))typeof r.not[e]==`function`&&(a[e]=n(`not.${e}`,r.not[e]));return i.not=a,{assert:i,results:t}}var Ze=e=>typeof e.opts.default==`function`;function Qe(e){return typeof e==`function`?e():e}var $e=class extends Error{};function et(e,t){let n=e.opts.value;return n?n(t):t}function tt(e,t){return e===t||JSON.stringify(e)===JSON.stringify(t)}function nt(e,t,n){switch(t.kind){case`select`:{let r=t.opts.options;if(r.length===0)throw new $e(`No options available for "${e}"`);let i=r.map(e=>et(t,e));if(n!==void 0){if(!i.some(e=>tt(e,n)))throw new $e(`Value for "${e}" is not one of the available options`);return n}let a=t.opts.default;return typeof a==`number`&&Number.isInteger(a)&&a>=0&&a<i.length&&typeof i[0]!=`number`?i[a]:typeof a==`function`?a(r):a!==void 0&&i.some(e=>tt(e,a))?a:i[0]}case`multiselect`:{let e=t.opts.options;if(n!==void 0)return n;let r=t.opts.default;return typeof r==`function`?r(e):r??[]}case`object`:{let e=t.opts.shape,r=n??{};return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,nt(e,t,r[e])]))}case`array`:{let r=n??t.opts.default??[],{min:i,max:a}=t.opts;if(i!==void 0&&r.length<i)throw new $e(`"${e}" needs at least ${i} items`);if(a!==void 0&&r.length>a)throw new $e(`"${e}" allows at most ${a} items`);return r.map(n=>nt(e,t.opts.item,n))}case`boolean`:return n??Qe(t.opts.default)??!1;case`number`:return n??Qe(t.opts.default)??0;default:return n??Qe(t.opts.default)??``}}function rt(e,t={}){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,nt(e,n,t[e])]))}function it(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>{if(t.kind===`select`||t.kind===`multiselect`){let n=t.opts.label,r=t.opts.options.map(e=>({label:n?n(e):String(et(t,e)),value:et(t,e)}));return[e,{kind:t.kind,options:r}]}return[e,{kind:t.kind,default:Qe(t.opts.default),generated:Ze(t)}]}))}var at=`__specbookFaker`,ot=globalThis,st=new Proxy({},{get(e,t){let n=ot[at];if(!n)throw Error(`faker is not initialised. Install "@faker-js/faker" in your project; specbook sets it up before each run.`);return n[t]}});function ct(e){ot[at]=e}function lt(e={},t){let n=t??e.default??`en`;return[...new Set([...e.locales?.[n]??[n,`en`],`base`])]}async function ut(e,t={},n){let r=e.locales;if(!r)return e;let i={Faker:e.Faker};return await Promise.all(lt(t,n).map(async e=>{let t=r[e];t&&(i[e]=await t())})),i}function dt(e,t={},n={}){let r=n.locale??t.default??`en`,i=lt(t,r).map(t=>{let n=e[t];if(!n)throw Error(`Unknown faker locale "${t}" (from "${r}")`);return n}),a=new e.Faker({locale:i});return n.seed!==void 0&&a.seed(n.seed),ct(a),a}var ft=String.raw`[\w.$\[\]-]+`,pt=new RegExp(String.raw`^\s*\{\{\s*(${ft})\s*\}\}\s*$`),mt=new RegExp(String.raw`\{\{\s*(${ft})\s*\}\}`,`g`),ht=e=>e.split(/[.[]/,1)[0],gt=[`secrets`,`session`],_t=class extends Error{variable;constructor(e){super(`Missing variable "{{${e}}}"`),this.variable=e,this.name=`TemplateError`}};function vt(e){let t=e.split(`.`)[0];return gt.includes(t)&&e.includes(`.`)}var yt=e=>e.startsWith(`faker.`),bt=class extends _t{message;constructor(e,t){super(e),this.message=t,this.name=`FakerPlaceholderError`}};function xt(e){let[,t,n,...r]=e.split(`.`),i=()=>new bt(e,`Unknown faker generator "{{${e}}}": use faker.<module>.<method>`);if(!t||!n||r.length>0)throw i();let a=st[t],o=typeof a==`object`&&a?a[n]:void 0;if(typeof o!=`function`||n===`constructor`)throw i();return{found:!0,value:o.call(a)}}function St(e){return[...F(e)].some(yt)}var Ct=e=>e.replace(/\[(\d+)\]/g,`.$1`).split(`.`);function wt(e,t){if(yt(t))return xt(t);let n=e;for(let e of Ct(t))if(typeof n==`object`&&n&&Object.hasOwn(n,e))n=n[e];else return{found:!1};return{found:!0,value:n}}function Tt(e){if(!e.includes(`faker`))return;let t=/\{\{\s*(faker\.[\s\S]*?)(?:\}\}|$)/.exec(e.replace(mt,``));if(t){let e=t[1].trim();throw new bt(e,`"{{${e}}}" is not a faker placeholder: placeholders take no arguments. Use faker in a request file for those.`)}}function Et(e,t){Tt(e);let n=pt.exec(e);if(n){let r=n[1];if(vt(r))return e;let i=wt(t,r);if(!i.found)throw new _t(r);return i.value}return e.replace(mt,(e,n)=>{if(vt(n))return e;let r=wt(t,n);if(!r.found)throw new _t(n);let i=r.value;return typeof i==`object`&&i?JSON.stringify(i):String(i)})}function P(e,t){if(typeof e==`string`)return Et(e,t);if(Dt(e))return e;if(Array.isArray(e))return e.map(e=>P(e,t));if(typeof e==`object`&&e){let n={};for(let[r,i]of Object.entries(e))n[r]=P(i,t);return n}return e}function F(e,t=new Set){if(typeof e==`string`)for(let n of e.matchAll(mt))t.add(n[1]);else if(Array.isArray(e))for(let n of e)F(n,t);else if(typeof e==`object`&&e)for(let n of Object.values(e))F(n,t);return t}var Dt=e=>typeof Blob<`u`&&e instanceof Blob;function Ot(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&!Dt(e)}function I(e,t){if(!Ot(e)||!Ot(t))return t===void 0?e:t;let n={...e};for(let[e,r]of Object.entries(t))n[e]=I(n[e],r);return n}var L=class extends Error{variable;constructor(e,t){super(e),this.variable=t,this.name=`AddressError`}},kt=[`authorizationUrl`,`tokenUrl`,`openIdConnectUrl`,`clientId`];function At(e,t,n={},r={}){return{...e.vars,...e.environments?.[t]?.vars,...n,...r}}function jt(e,t,n){for(let t of F(e))if(vt(t)||yt(t))throw new L(`${n} cannot use {{${t}}}: only environment variables are available`);let r;try{r=Et(e,t)}catch(e){throw e instanceof _t?new L(`${n}: set ${e.variable}`,e.variable):e}if(typeof r==`object`&&r)throw new L(`${n} is not a text value`);let i=r==null?``:String(r).trim();if(/\{\{/.test(i))throw new L(`${n} still contains a placeholder: ${i}`);return i}function Mt(e,t,n,r){let i=e.services[t]?.baseUrl,a=typeof i==`string`?i:i?.[n];if(!a)return;let o=`No base URL for ${t} in ${n}`,s=/\{\{/.test(a)?jt(a,r,o):a.trim();return s?s.replace(/\/+$/,``):void 0}function Nt(e,t,n=`sign-in`){let r={...e};for(let e of kt){let i=r[e];if(typeof i!=`string`||!/\{\{/.test(i))continue;let a=jt(i,t,`${n} ${e}`);a?r[e]=a:delete r[e]}return r}function Pt(e,t=[],n=[]){let r=new Set([`mock`]),i=Object.values(e.services??{});i.some(e=>typeof e.baseUrl==`string`)&&r.add(`live`);for(let e of i)if(e.baseUrl&&typeof e.baseUrl==`object`)for(let t of Object.keys(e.baseUrl))r.add(t);for(let t of Object.keys(e.environments??{}))r.add(t);for(let e of t)r.add(e);for(let e of n)r.add(e);return[...r]}function Ft(e){let t={},n=e=>{if(!(vt(e)||yt(e)))return t[e]??={services:[],profiles:[]},t[e]};for(let[t,r]of Object.entries(e.services??{})){let e=typeof r.baseUrl==`string`?[r.baseUrl]:Object.values(r.baseUrl??{});for(let r of e)for(let e of F(r)){let r=n(e);r&&!r.services.includes(t)&&r.services.push(t)}}for(let[t,r]of Object.entries(e.auth??{}))for(let e of kt){let i=r.oauth?.[e];if(typeof i==`string`)for(let r of F(i))n(r)?.profiles.push({profile:t,field:e})}return t}var It={comma:`,`,space:` `,pipe:`|`},Lt=e=>typeof Blob<`u`&&e instanceof Blob;function Rt(e,t=`indices`,n=``,r=[]){if(typeof t==`string`||n||typeof e!=`object`||!e)zt(n,e,r,typeof t==`string`?t:`indices`);else for(let[n,i]of Object.entries(e))zt(n,i,r,t[n]??`indices`);return r}function zt(e,t,n,r){if(t!=null){if(Array.isArray(t)&&r in It&&t.every(e=>typeof e!=`object`||!e))n.push([e,t.map(String).join(It[r])]);else if(Array.isArray(t))t.forEach((t,i)=>{zt(r===`indices`||r in It?`${e}[${i}]`:r===`brackets`?`${e}[]`:e,t,n,r)});else if(typeof t==`object`)for(let[i,a]of Object.entries(t))zt(e?`${e}[${i}]`:i,a,n,r);else n.push([e,String(t)])}}function Bt(e,t=`indices`){return Rt(e,t).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join(`&`)}function Vt(e){let t=new FormData,n=(e,n)=>{n!=null&&(Lt(n)?t.append(e,n,n.name??`file`):typeof n==`object`?t.append(e,new Blob([JSON.stringify(n)],{type:`application/json`})):t.append(e,String(n)))};for(let[t,r]of Object.entries(e??{}))if(Array.isArray(r))for(let e of r)n(t,e);else n(t,r);return t}function Ht(e){return JSON.stringify(typeof e==`string`?{query:e}:e)}function Ut(e,t,n,r){switch(e){case`json`:return{body:JSON.stringify(t),contentType:`application/json`};case`graphql`:return{body:Ht(t),contentType:`application/json`};case`form`:return{body:Bt(t,n),contentType:`application/x-www-form-urlencoded`};case`text`:return{body:String(t),contentType:`text/plain`};case`multipart`:return{body:Vt(t)};case`binary`:return{body:t,contentType:r||(Lt(t)&&t.type?t.type:`application/octet-stream`)};default:return{body:t}}}function Wt(e){if(Lt(e)){let t=e;return{file:t.name??`file`,type:t.type,size:t.size}}return Array.isArray(e)?e.map(Wt):typeof e==`object`&&e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Wt(t)])):e}var R=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Gt=e=>[`string`,`number`,`boolean`].includes(typeof e);function Kt(e,t){return typeof t==`number`&&typeof e==`string`&&e.trim()!==``&&!Number.isNaN(Number(e))?Number(e):typeof t==`string`&&typeof e==`number`?String(e):e}function qt(e,t){if(R(e)&&R(t)){let n={...e};for(let[e,r]of Object.entries(t))e in n&&(n[e]=qt(n[e],r));return n}if(Array.isArray(e)&&Array.isArray(t)){if(t.length===0)return e;if(t.every(Gt)&&e.every(Gt))return t;let n=e[0];return R(n)&&t.every(R)?t.map(e=>qt(n,e)):e}return Gt(t)&&Gt(e)&&typeof t==typeof e?t:typeof e==`number`&&typeof t==`string`&&t.trim()!==``&&!Number.isNaN(Number(t))?Number(t):e}function Jt(e,t){let n={...e},r=Object.entries(t).filter(([,e])=>e!==void 0&&e!==``);for(let[e,t]of r)e in n&&!R(n[e])&&!Array.isArray(n[e])?n[e]=Kt(t,n[e]):r.length===1&&`id`in n&&/^(id|.*[a-z]Id|.*_id)$/.test(e)&&!R(n.id)&&!Array.isArray(n.id)&&(n.id=Kt(t,n.id));return n}var Yt=e=>Gt(e),Xt=new Set([`id`,`object`,`type`,`kind`,`created`,`updated`,`url`,`livemode`,`metadata`,`status`]);function Zt(e,t=[],n=[],r=0){if(r>6)return n;if(R(e))for(let[i,a]of Object.entries(e))Zt(a,[...t,i],n,r+1);else Array.isArray(e)?e.length&&Zt(e[0],[...t,0],n,r+1):Yt(e)&&n.push({path:t,value:e});return n}var Qt=(e,t)=>{let n=e;for(let e of t){if(typeof n!=`object`||!n)return;n=n[e]}return n};function $t(e,t,n=[],r=[],i=0){if(i>5)return r;if(R(e))for(let[a,o]of Object.entries(e))a===t&&Yt(o)?r.push([...n,a]):$t(o,t,[...n,a],r,i+1);else Array.isArray(e)&&e.length&&$t(e[0],t,[...n,0],r,i+1);return r}var en=(e,t)=>typeof e==typeof t||typeof t==`number`&&typeof e==`string`&&e.trim()!==``&&!Number.isNaN(Number(e));function tn(e,t,n){let r=Qt(e,t.slice(0,-1));typeof r==`object`&&r&&(r[t[t.length-1]]=n)}function nn(e,t,n){let r=structuredClone(e),i=new Set(Zt(n).map(e=>e.path.join(`\0`)));for(let e of Zt(t)){if(Qt(r,e.path)!==void 0)continue;let t=String(e.path[e.path.length-1]);if(Xt.has(t)||typeof e.path[e.path.length-1]==`number`)continue;let n=$t(r,t).filter(e=>!i.has(e.join(`\0`)));if(n.length!==1)continue;let a=n[0],o=Qt(r,a);en(e.value,o)&&(tn(r,a,Kt(e.value,o)),i.add(a.join(`\0`)))}return r}var rn=/^(limit|per_?page|page_?size|size|count|max|max_?results|take)$/i;function an(e){return Array.isArray(e)?e[0]:typeof e==`string`&&e.includes(`,`)?e.split(`,`)[0]?.trim():e}function on(e,t){let n=Object.entries(t).map(([e,t])=>[e,an(t)]).filter(([,e])=>Yt(e)&&e!==``);if(n.length===0)return e;let r=e=>{let t={...e};for(let[e,r]of n)e in t&&Yt(t[e])&&en(r,t[e])&&(t[e]=Kt(r,t[e]));return t},i=n.find(([e])=>rn.test(e))?.[1],a=i!==void 0&&Number.isFinite(Number(i))?Math.min(Math.max(Math.trunc(Number(i)),1),10):void 0,o=e=>{if(!e.every(R))return e;let t=e.map(e=>r(e));if(a===void 0||t.length===0||t.length>=a)return t.slice(0,a??t.length);let n=t[0];return Array.from({length:a},(e,r)=>r<t.length?t[r]:{...n,...typeof n.id==`number`?{id:n.id+r}:{}})};if(Array.isArray(e))return o(e);if(R(e)){let t={...e},n=Object.entries(t).filter(([,e])=>Array.isArray(e)&&e.length>0&&e.every(R));if(n.length===1)t[n[0]?.[0]]=o(n[0]?.[1]);else return r(t);return t}return e}function sn(e,t){let n=e;if(t.body!==void 0){let e=R(n)&&Array.isArray(t.body)&&t.body.length>0&&t.body.every(R)?t.body[0]:t.body;(R(n)&&R(e)||Array.isArray(n)&&Array.isArray(e))&&(n=qt(n,e),R(n)&&R(e)&&(n=nn(n,e,e)))}return R(n)&&t.path&&(n=Jt(n,t.path)),t.query&&(n=on(n,t.query)),n}var cn=e=>e>=200&&e<300,ln=e=>e===void 0?e:JSON.parse(JSON.stringify(e));function un(e){let t=e.sleep??((e,t)=>new Promise((n,r)=>{if(t?.aborted)return r(Error(`Stopped before the API answered.`));let i=setTimeout(n,e);t?.addEventListener(`abort`,()=>{clearTimeout(i),r(Error(`Stopped before the API answered.`))},{once:!0})}));return async(n,r)=>{let i=n.mock,a=await e.loader.statuses(n.service,n.opId),o=n.mockStatus??a.find(cn)??a[0]??200;if(i?.secured&&!n.headers.authorization&&!Object.keys(n.headers).some(e=>/api[-_]?key|token/i.test(e))&&n.mockStatus===void 0&&a.includes(401))return dn(401,await e.loader.example(n.service,n.opId,401));let s={...i?.vars??{},...i?.pathParams??{},...i?.rawQuery??{}},c=async t=>{let r=ln(await e.loader.example(n.service,n.opId,t));return cn(t)&&(r=sn(r,{body:n.body,path:i?.pathParams,query:i?.rawQuery})),r===void 0?void 0:P(r,s)},l={status:o,data:await c(o),headers:{},delayMs:0,respond:(e,t)=>{u={status:e,data:t}}},u;if(i?.hook&&await i.hook({vars:i.vars??{},body:n.body,query:i.rawQuery,path:i.pathParams,headers:n.headers},l),u){let e=await c(u.status);l.status=u.status,l.data=u.data===void 0?e:I(e,u.data)}return l.delayMs&&await t(l.delayMs,r),{...dn(l.status,l.data),headers:{"content-type":`application/json`,...l.headers}}}}function dn(e,t){return{status:e,headers:{"content-type":`application/json`},text:t===void 0?``:JSON.stringify(t),body:t}}var z=class extends Error{constructor(e){super(e),this.name=`OAuthError`}},fn=e=>`openIdConnectUrl`in e;function pn(e){let t=e&&typeof e==`object`?e:{},n=e=>typeof e==`string`&&/^https?:\/\//i.test(e)?e:void 0,r=n(t.authorization_endpoint),i=n(t.token_endpoint);if(!r||!i)throw new z(`The provider’s discovery document has no authorization or token endpoint`);let a=[`openid`,...(Array.isArray(t.scopes_supported)?t.scopes_supported.filter(e=>typeof e==`string`):[]).filter(e=>e!==`openid`)];return{authorizationUrl:r,tokenUrl:i,scopes:Object.fromEntries(a.map(e=>[e,``]))}}var mn=e=>{let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)},hn=e=>mn(crypto.getRandomValues(new Uint8Array(e)));async function gn(e){if(!globalThis.crypto?.subtle)throw new z(`Sign-in needs a secure page (https, or localhost). Open the viewer over https, or paste an access token.`);let t=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(e));return mn(new Uint8Array(t))}async function _n(){let e=hn(48);return{verifier:e,challenge:await gn(e)}}var vn=()=>hn(24);function yn(e){let t=new URL(e.authorizationUrl);return t.searchParams.set(`response_type`,`code`),t.searchParams.set(`client_id`,e.clientId),t.searchParams.set(`redirect_uri`,e.redirectUri),e.scopes?.length&&t.searchParams.set(`scope`,e.scopes.join(` `)),t.searchParams.set(`state`,e.state),t.searchParams.set(`code_challenge`,e.challenge),t.searchParams.set(`code_challenge_method`,`S256`),t.toString()}function bn(e,t){let n=t=>(e instanceof URLSearchParams?e.get(t):e[t])??void 0,r=n(`error`);if(r){let e=n(`error_description`);throw new z(`Sign-in was refused: ${e?`${r} (${e})`:r}`)}if(n(`state`)!==t)throw new z(`Sign-in was rejected: the response did not match this request (state)`);let i=n(`code`);if(!i)throw new z(`Sign-in returned no authorization code`);return{code:i}}function xn(e){return{grant_type:`authorization_code`,code:e.code,redirect_uri:e.redirectUri,client_id:e.clientId,code_verifier:e.verifier}}function Sn(e){let t=e&&typeof e==`object`?e:{};if(typeof t.error==`string`){let e=typeof t.error_description==`string`?` (${t.error_description})`:``;throw new z(`The token endpoint refused the code: ${t.error}${e}`)}if(typeof t.access_token!=`string`||t.access_token===``)throw new z(`The token endpoint returned no access token`);return{accessToken:t.access_token,...typeof t.expires_in==`number`?{expiresIn:t.expires_in}:{},...typeof t.scope==`string`?{scope:t.scope}:{}}}var Cn=123,wn=125,Tn=e=>e===32||e===9||e===10||e===13,En=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||e===95||e===36||e===45,Dn=[115,101,99,114,101,116,115,46];function On(e,t){let n=t+2;for(;n<e.length&&Tn(e[n]);)n++;for(let t of Dn)if(e[n++]!==t)return;let r=n;for(;n<e.length&&En(e[n]);)n++;if(n===r)return;let i=String.fromCharCode(...e.subarray(r,n));for(;n<e.length&&Tn(e[n]);)n++;if(e[n]===wn&&e[n+1]===wn)return{start:t,end:n+2,name:i}}function kn(e){let t=[];for(let n=0;n<e.length-1;n++)if(e[n]===Cn&&e[n+1]===Cn){let r=On(e,n);r&&(t.push(r),n=r.end-1)}return t}var An=new TextEncoder;function jn(e){return[...new Set(kn(e).map(e=>e.name))]}function Mn(e,t){let n=kn(e).filter(e=>t.has(e.name));if(n.length===0)return e;let r=[],i=0;for(let a of n)r.push(e.subarray(i,a.start),An.encode(t.get(a.name))),i=a.end;r.push(e.subarray(i));let a=new Uint8Array(r.reduce((e,t)=>e+t.length,0)),o=0;for(let e of r)a.set(e,o),o+=e.length;return a}var Nn=new TextDecoder;function Pn(e,t){return e.includes(`{{`)?Nn.decode(Mn(An.encode(e),t)):e}var Fn=new TextDecoder(`utf-8`,{fatal:!0}),In=new TextEncoder;function Ln(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function Rn(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function zn(e){try{return{kind:`text`,text:Fn.decode(e)}}catch{return{kind:`b64`,b64:Ln(e)}}}function Bn(e){return e.kind===`text`?In.encode(e.text):Rn(e.b64)}async function Vn(e){let t={};e.headers.forEach((e,n)=>{t[n]=e});let n=e.method!==`GET`&&e.method!==`HEAD`&&e.body!==null;return{method:e.method,url:e.url,headers:t,...n?{body:zn(new Uint8Array(await e.arrayBuffer()))}:{}}}function Hn(e){let t=e.status===204||e.status===205||e.status===304;return new Response(e.body&&!t?Bn(e.body):null,{status:e.status,headers:e.headers})}function Un(e,t,n,r={},i){return{kind:`request`,op:e,input:t,dataPatches:n,varOverrides:r,mockHook:i,with(a){let o={...t};return a.path&&(o.path=I(t.path,a.path)),a.query&&(o.query=I(t.query,a.query)),a.headers&&(o.headers={...t.headers??{},...a.headers}),a.capture&&(o.capture={...t.capture??{},...a.capture}),a.assert&&(o.assert=a.assert),a.auth!==void 0&&(o.auth=a.auth),a.assertMode&&(o.assertMode=a.assertMode),a.tags&&(o.tags=[...new Set([...t.tags??[],...a.tags])]),Un(e,o,a.data===void 0?n:[...n,a.data],a.vars?{...r,...a.vars}:r,i)}}}function Wn(e,t){return Un(e.op,e.input,e.dataPatches,e.varOverrides,t)}function Gn(e){return{meta:e,request(t={}){return Un(e,t,[])}}}var Kn=class extends Error{names;constructor(e){super(`Missing secrets: ${e.join(`, `)}`),this.names=e,this.name=`MissingSecretsError`}},qn=3;function Jn(e){let t=new Set([e]),n=e=>{try{t.add(e())}catch{}};return n(()=>encodeURIComponent(e)),n(()=>encodeURI(e)),n(()=>JSON.stringify(e).slice(1,-1)),n(()=>btoa(String.fromCharCode(...new TextEncoder().encode(e)))),[...t]}function Yn(e,t){let n=[...new Set([...t].filter(e=>e.length>=qn).flatMap(Jn))].sort((e,t)=>t.length-e.length);if(n.length===0)return e;let r=e=>n.reduce((e,t)=>e.split(t).join(`***`),e),i=e=>typeof e==`string`?r(e):Array.isArray(e)?e.map(i):typeof e==`object`&&e?Object.fromEntries(Object.entries(e).map(([e,t])=>[r(e),i(t)])):e;return i(e)}function Xn(e,t){let n=new URLSearchParams;for(let[e,r]of Object.entries(t.query))for(let t of Array.isArray(r)?r:[r])n.append(e,t);let r=n.toString();return`${e.replace(/\/+$/,``)}${t.url}${r?`?${r}`:``}`}function Zn(e,t){try{return new URL(e,t).toString()}catch{return e}}var Qn={ECONNREFUSED:`connection refused`,ENOTFOUND:`host not found`,EAI_AGAIN:`host not found`,ECONNRESET:`connection reset`,ETIMEDOUT:`connection timed out`,UND_ERR_CONNECT_TIMEOUT:`connection timed out`,EHOSTUNREACH:`host unreachable`,ENETUNREACH:`network unreachable`};function $n(e,t){let n=e?.cause;if(!(e instanceof TypeError)||!n)return e;let r=n.code??n.errors?.find(e=>e.code)?.code,i=r&&/^CERT_|^ERR_TLS|SELF_SIGNED|UNABLE_TO_VERIFY/.test(r)?`certificate problem`:``,a=typeof n.message==`string`&&n.message.length<=120?n.message:``,o=r&&Qn[r]||i||a;if(!o)return e;let s=t;try{s=new URL(t).host}catch{}return Error(`Could not reach ${s}: ${o}.`,{cause:e})}function er(e){return async(t,n)=>{if(n?.aborted)throw Error(`Stopped before the API answered.`);let r=e.fetch??fetch,i={...t.headers},a;if(t.body!==void 0&&t.method!==`GET`&&t.method!==`HEAD`){let e=Ut(t.encoding,t.body,t.formArrays,t.mediaType);a=e.body,e.contentType&&(i[`content-type`]??=e.contentType)}let o=new AbortController,s=!1,c=t.timeoutMs?setTimeout(()=>{s=!0,o.abort()},t.timeoutMs):void 0;n?.addEventListener(`abort`,()=>o.abort());let l=Xn(e.baseUrl(t.service),t);try{let e=await r(l,{method:t.method,headers:i,body:a,signal:o.signal}),n=await e.text(),s={};e.headers.forEach((e,t)=>{s[t.toLowerCase()]=e});let c=n;if(n.length===0)c=void 0;else try{c=JSON.parse(n)}catch{c=n}return{status:e.status,headers:s,text:n,body:c}}catch(e){throw s?Error(`Timed out after ${t.timeoutMs}ms: no answer from the API.`):n?.aborted?Error(`Stopped before the API answered.`):$n(e,l)}finally{c&&clearTimeout(c)}}}var B=()=>Date.now(),tr=class extends Error{};function nr(){return`run_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}var rr=(e={})=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e.toLowerCase(),t]));function ir(e){let t={};for(let[n,r]of Object.entries(e??{}))t[n]=typeof r==`function`?r():r;return t}async function ar(e){return typeof e==`function`?(await e()).default:e}async function or(e,t,n){if(t.length===0)return Array.isArray(e)?Promise.all(e.map(e=>typeof e==`string`?n(e):e)):typeof e==`string`?n(e):e;if(Array.isArray(e))return Promise.all(e.map(e=>or(e,t,n)));let[r,...i]=t;return Ot(e)&&r in e?{...e,[r]:await or(e[r],i,n)}:e}async function sr(e,t,n,r,i){let a=e=>r(e,i);if(n===`binary`)return typeof e==`string`?a(e):e;let o=e;for(let e of t)o=await or(o,e.split(`.`),a);return o}function cr(e,t,n){let r=new Set,i=[];for(let a of e){if(vt(a)||yt(a))continue;let e=ht(a);if(!r.has(e)){r.add(e);for(let r=t.length-1;r>=0;r--){let[a,o]=t[r];if(e in o){let s=a===`capture`?{key:e,source:a,step:n[e]}:{key:e,source:a};if(a===`capture`){let n=t.slice(0,r).reverse().find(([,t])=>e in t),[i,a]=[typeof n?.[1][e],typeof o[e]];n&&i!==a&&(s.shadows={source:n[0],type:i,replacedBy:a})}i.push(s);break}}}}return i}function lr(e,t,n){let r=e=>e.replace(/\{\{\s*((?:secrets|session)\.[\w$-]+)\s*\}\}/g,(e,r)=>{let[i,a]=r.split(`.`);if(i===`secrets`){let n=t.o.secrets?.[a];if(n===void 0&&(t.o.env===`mock`||t.o.deferSecrets))return e;if(n===void 0)throw new Kn([a]);return t.mask.add(n),n}let o=(n?t.sessions.get(`${t.o.env}:${n}`)?.session:void 0)?.[a];if(o===void 0)throw new tr(`No session value "${a}" for profile "${n}"`);return t.mask.add(String(o)),String(o)}),i=e=>Lt(e)?e:typeof e==`string`?r(e):Array.isArray(e)?e.map(i):typeof e==`object`&&e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,i(t)])):e;return i(e)}function V(e,t){e.o.onEvent?.(e.mask.size?Yn(t,e.mask):t)}var ur=new Set([`GET`,`HEAD`,`OPTIONS`]);function dr(e,t){if(e.input.safe||ur.has(t.method))return!0;if(t.encoding===`graphql`){let e=t.body;return typeof e?.query==`string`&&!/(^|[\s}])mutation\b/.test(e.query)}return!1}function fr(e,t){if(t.op.security===!1)return;let n=t.input.auth===void 0?e.seqAuth:t.input.auth;if(n===!1)return;let r=n??e.o.serviceAuth?.[t.op.service];return r&&e.o.auth?.[r]?r:void 0}function pr(e,t){return{status:e.status,ok:e.status>=200&&e.status<300,headers:rr(e.headers),data:e.body,text:e.text,durationMs:t}}async function mr(e,t,n,r=!1){let i=e.o.auth?.[t];if(!i.login||!i.token)return;let a=`${e.o.env}:${t}`,o=e.sessions.get(a);if(o&&(o.expiresAt===void 0||o.expiresAt>(e.o.now?.()??B()))&&!r)return;let s=e.inflight.get(a);if(s)return s;let c=(async()=>{let r=i;V(e,{type:`auth:login`,profile:t});let{result:o,response:s}=await gr(e,await r.login(),`Login (${t})`,hr,`auth`,!0);if(n.push(o),!s?.ok)throw new tr(`Login for profile "${t}" failed (${s?.status})`);let c=r.token(s),l=typeof c.expiresIn==`number`?(e.o.now?.()??B())+c.expiresIn*1e3:void 0;e.sessions.set(a,{session:c,expiresAt:l});for(let t of Object.values(c))typeof t==`string`&&e.mask.add(t)})().finally(()=>e.inflight.delete(a));return e.inflight.set(a,c),c}var hr={inputs:{},captured:{},from:{}};async function gr(e,t,n,r,i=`request`,a=!1){let o=e.o.now?.()??B(),s=[],c={name:n,kind:i,status:`pass`,assertions:[],captured:{},durationMs:0},l=t.input.assertMode??e.seqAssertMode??e.o.assertMode??`soft`;V(e,{type:`step:start`,name:n});let u;try{let o=[[`config`,e.o.vars??{}],[`init`,ir(t.input.init)],[`input`,r.inputs],[`capture`,r.captured],[`override`,ir(t.varOverrides)],[`override`,e.o.overrides??{}]],d=Object.assign({},...o.map(e=>e[1])),f;if(t.input.example&&(f=await e.o.example?.(t.op,t.input.example),!f))throw new tr(`Example "${t.input.example}" not found for ${t.op.id}`);let p=I(f?.body,await ar(t.input.data));for(let e of t.dataPatches)p=I(p,e);let m=I(f?.path??{},t.input.path??{}),h=I(f?.query??{},t.input.query??{}),g={...f?.headers??{},...t.input.headers??{}};c.uses=cr(F([p,m,h,g]),o,r.from);let _=p===void 0?void 0:P(p,d),v=P(m,d)??{},y=P(h,d)??{},b=rr(P(g,d)),x=t.input.encoding??t.op.encoding??(_===void 0?`none`:`json`);_!==void 0&&e.o.readFile&&(t.op.files?.length||x===`binary`)&&(_=await sr(_,t.op.files??[],x,e.o.readFile,f?.dir));let S=a?void 0:fr(e,t),C=S?e.o.auth?.[S]:void 0,w={};C&&S&&(b={...rr(P(C.apply.headers??{},d)),...b},Object.assign(w,P(C.apply.query??{},d)));let T=t.op.path.replace(/\{([^}]+)\}/g,(e,t)=>{let n=v[t];if(n==null)throw new tr(`Missing path parameter "${t}"`);return encodeURIComponent(String(n))}),E={};for(let[e,t]of Object.entries({...y,...w}))t!=null&&(E[e]=Array.isArray(t)?t.map(String):String(t));let D={service:t.op.service,opId:t.op.id,method:t.op.method,url:T,query:E,headers:b,body:_,encoding:x,mediaType:x===`binary`?t.op.mediaType:void 0,formArrays:t.op.formArrays,timeoutMs:t.input.timeoutMs??e.o.timeoutMs??3e4,mockStatus:e.o.env===`mock`?e.o.mockStatus:void 0,mock:e.o.env===`mock`?{hook:t.mockHook,vars:d,pathParams:v,rawQuery:y,secured:t.op.security}:void 0};if(c.request={opId:t.op.id,method:D.method,service:D.service,url:D.url,query:D.query,headers:D.headers,body:Wt(D.body),profile:S},V(e,{type:`request`,name:n,request:c.request}),e.o.readOnly&&i!==`auth`&&!dr(t,D))throw new tr(`Refusing ${D.method} ${t.op.path} in "${e.o.env}": this is a --safe run, which only reads.`);let O=async()=>{S&&await mr(e,S,s);let{mock:t,...n}=D,r={...lr(n,e,S),mock:t},i=e.o.now?.()??B();return pr(await e.o.transport(r,e.o.signal),(e.o.now?.()??B())-i)};u=await O(),u.status===401&&S&&C?.retryOn401!==!1&&C?.login&&(await mr(e,S,s,!0),u=await O()),c.response={status:u.status,headers:u.headers,body:u.data,durationMs:u.durationMs},V(e,{type:`response`,name:n,status:u.status,durationMs:u.durationMs});for(let[e,n]of Object.entries(t.input.capture??{}))c.captured[e]=n(u,d);if(V(e,{type:`capture`,name:n,captured:c.captured}),t.input.assert){let r=Xe(l);try{await t.input.assert(u,{assert:r.assert,vars:{...d,...c.captured},req:c.request})}catch(e){e?.name!==`Assertion`&&(c.status=`error`,c.error=`assert threw: ${e?.message??e}`)}c.assertions=r.results;for(let t of r.results)V(e,{type:t.pass?`assert:pass`:`assert:fail`,name:n,assertion:t})}else if(e.o.implicitStatusCheck&&i===`request`){let t=u.status>=200&&u.status<300,r={label:`status is 2xx`,operator:`status`,pass:t,actual:u.status,expected:`2xx`};c.assertions=[r],V(e,{type:t?`assert:pass`:`assert:fail`,name:n,assertion:r})}c.status===`pass`&&c.assertions.some(e=>!e.pass)&&(c.status=`fail`)}catch(e){c.status=`error`,c.error=e instanceof Error?e.message:String(e)}return c.durationMs=(e.o.now?.()??B())-o,V(e,{type:`step:end`,name:n,status:c.status}),{result:c,response:u,authResults:s}}function _r(e){let t={steps:0,passed:0,failed:0,skipped:0,assertions:{passed:0,failed:0}},n=e=>{if(e.children?.length)e.children.forEach(n);else{t.steps++,e.status===`pass`?t.passed++:e.status===`skipped`?t.skipped++:t.failed++;for(let n of e.assertions)n.pass?t.assertions.passed++:t.assertions.failed++}};return e.forEach(n),t}function vr(e){let t=[],n=e=>{t.push(e),e.children?.forEach(n)};return e.forEach(n),t.some(e=>e.status===`error`)?`error`:t.some(e=>e.status===`fail`)?`fail`:`pass`}function yr(e,t,n,r,i){let a=Yn({schemaVersion:1,runId:nr(),kind:t,id:n.id,title:n.title,env:e.o.env,locale:e.o.locale,seed:e.o.seed,usedDrafts:e.o.usedDrafts??!1,tags:n.tags??[],status:vr(r),startedAt:new Date(i).toISOString(),durationMs:(e.o.now?.()??B())-i,totals:_r(r),steps:r},e.mask);return V(e,{type:`done`,result:a}),a}function br(e){return{o:e,sessions:new Map,inflight:new Map,mask:new Set(Object.values(e.secrets??{}))}}async function xr(e,t){let n=br(t),r=t.now?.()??B();V(n,{type:`run:start`,id:e.op.id,title:e.input.name??e.op.id,kind:`request`,tags:e.input.tags});let i=e.input.name??e.op.id,{result:a,authResults:o}=await gr(n,e,i,hr);return yr(n,`request`,{id:e.op.id,title:i,tags:e.input.tags},[...o,a],r)}async function Sr(e,t){let n=br(t);n.seqAuth=e.meta.auth,n.seqAssertMode=e.meta.assertMode;let r=t.now?.()??B();V(n,{type:`run:start`,id:e.meta.id,title:e.meta.title,kind:`sequence`,tags:e.meta.tags});let i=[],a={},o={},s=(e,t)=>{Object.assign(a,e);for(let n of Object.keys(e))o[n]=t},c;try{c=rt(e.meta.inputs??{},t.inputs)}catch(t){return i.push({name:`inputs`,kind:`input`,status:`error`,assertions:[],captured:{},error:t.message,durationMs:0}),yr(n,`sequence`,e.meta,i,r)}let l=t.vars??{},u=()=>({inputs:c,captured:a,vars:{...l,...t.overrides??{}},env:t.env}),d=!1,f=(e,t)=>i.push({name:e,kind:t,status:`skipped`,assertions:[],captured:{},durationMs:0});for(let r of e.nodes)if(d&&!e.meta.continueOnFailure)f(r.name,r.kind===`step`?`request`:r.kind);else if(t.signal?.aborted)f(r.name,r.kind===`step`?`request`:r.kind),d=!0;else try{if(r.kind===`step`){let{result:e,authResults:t}=await gr(n,typeof r.def==`function`?r.def(u()):r.def,r.name,{inputs:c,captured:a,from:o});i.push(...t,e),s(e.captured,r.name),e.status!==`pass`&&(d=!0)}else if(r.kind===`each`){let l=r.items(u()),f={name:r.name,kind:`each`,status:`pass`,assertions:[],captured:{},durationMs:0,children:[]},p=t.now?.()??B(),m={};for(let t=0;t<l.length;t++){let{result:i,authResults:s}=await gr(n,r.def(l[t],u(),t),`${r.name} #${t+1}`,{inputs:c,captured:a,from:o});f.children?.push(...s,i);for(let[e,t]of Object.entries(i.captured))m[e]??=[],m[e]?.push(t);if(i.status!==`pass`&&(f.status=i.status,!e.meta.continueOnFailure))break}f.captured=m,f.durationMs=(t.now?.()??B())-p,s(m,r.name),i.push(f),f.status!==`pass`&&(d=!0)}else if(r.kind===`input`){let e=r.controls(u()),a=it(e);V(n,{type:`input:required`,name:r.name,controls:a});let o=rt(e,t.onInput?await t.onInput({name:r.name,controls:a}):t.inputs??{});c={...c,...o},i.push({name:r.name,kind:`input`,status:`pass`,assertions:[],captured:o,durationMs:0})}else if(r.kind===`check`){let a=Xe(e.meta.assertMode??t.assertMode??`soft`),o={name:r.name,kind:`check`,status:`pass`,assertions:[],captured:{},durationMs:0};V(n,{type:`step:start`,name:r.name});try{await r.fn(u(),{assert:a.assert})}catch(e){e?.name!==`Assertion`&&(o.status=`error`,o.error=e?.message??String(e))}o.assertions=a.results,o.status===`pass`&&a.results.some(e=>!e.pass)&&(o.status=`fail`),V(n,{type:`step:end`,name:r.name,status:o.status}),i.push(o),o.status!==`pass`&&(d=!0)}}catch(e){let t=e instanceof $e;i.push({name:r.name,kind:r.kind===`step`?`request`:r.kind,status:`error`,assertions:[],captured:{},error:t?e.message:e?.message??String(e),durationMs:0}),d=!0}return yr(n,`sequence`,e.meta,i,r)}function Cr(e,t){let n={},r={};for(let i of e){let e=i.description?{description:i.description}:{};i.name===`live`?(n[t]=i.url,i.description&&(r.live=e)):r[i.name]={...e,vars:{[t]:i.url}}}return{vars:n,environments:r,baseUrl:`{{${t}}}`}}var wr=_({assets:()=>Zr,brandingAssets:()=>Lr,definitions:()=>qr,docs:()=>zr,environmentStore:()=>oi,environmentVars:()=>Rr,examples:()=>Jr,fakerUnavailable:()=>$r,loadConfig:()=>si,loadFaker:()=>null,loadManifests:()=>Ar,manifests:()=>kr,mode:()=>Dr,operationDocs:()=>Kr,operations:()=>Qr,project:()=>Or,requestExamples:()=>Yr,requestMeta:()=>Mr,requests:()=>jr,responseSchemas:()=>Gr,schemas:()=>Wr,sequenceMeta:()=>Fr,sequences:()=>Pr,unresolvedRequests:()=>Nr,unresolvedSequences:()=>Ir}),H=globalThis.__SPECBOOK_VIEWER__;if(!H)throw Error(`The viewer registry was imported before a spec was opened`);var{open:U}=H,W=U.service,Tr=e=>`${W}/${e}`,Er=Object.keys(U.metas),Dr=`static`,Or={root:``,outDir:``,requestsDir:`requests`},kr={[W]:U.manifest},Ar=async e=>{},jr=[],Mr={},Nr=[],Pr=[],Fr={},Ir=[],Lr={},Rr={},zr=[],Br=new Map,Vr=e=>{let t=e.slice(W.length+1),n=Br.get(e);if(n)return n;let r=H.bundle(t).catch(()=>({}));return Br.set(e,r),r},Hr=e=>new Proxy({},{get:(t,n)=>typeof n==`string`&&n.startsWith(`${W}/`)&&Er.includes(n.slice(W.length+1))?e(n):void 0,has:(e,t)=>typeof t==`string`&&t.startsWith(`${W}/`)&&Er.includes(t.slice(W.length+1)),ownKeys:()=>Er.map(Tr),getOwnPropertyDescriptor:()=>({enumerable:!0,configurable:!0})}),Ur=e=>Hr(t=>()=>Vr(t).then(t=>({default:e(t)}))),Wr=Ur(e=>e.schema),Gr=Ur(e=>e.responses),Kr=Ur(e=>e.docs),qr={[W]:()=>H.definitions().then(e=>({default:e}))},Jr=new Proxy({},{get:(e,t)=>{if(typeof t!=`string`||!t.includes(`.`))return;let n=t.lastIndexOf(`.`),r=t.slice(0,n);if(Er.includes(r.slice(W.length+1)))return()=>Vr(r).then(e=>({default:e.mock?.[t.slice(n+1)]}))}}),Yr=Hr(e=>(U.exampleNames[e.slice(W.length+1)]??[]).map(t=>({name:t,source:`generated`,dir:`${e}@generated`,load:()=>Vr(e).then(e=>({default:e.examples?.[t]}))}))),Xr,Zr=new Proxy({},{get:(e,t)=>typeof t==`string`&&t.endsWith(`/sample.txt`)?()=>(Xr??=URL.createObjectURL(new Blob([`specbook sample file
15
+ `],{type:`text/plain`})),Promise.resolve(Xr)):void 0}),Qr=Object.fromEntries(Er.map(e=>[Tr(e),async()=>({[e]:Gn(U.metas[e])})])),$r=`Generated values ({{faker.…}}) work in a Specbook project, not in the hosted viewer. Type a value instead.`,ei=H.baseUrl??U.baseUrl,ti=U.servers.find(e=>e.name===`live`),ni=Cr([...ei?[{name:`live`,url:ei,description:ti?.description}]:[],...U.servers.filter(e=>e.name!==`live`)],`baseUrl`),ri=e=>{if(/^https?:\/\//i.test(e)||!H.baseUrl)return e;try{return new URL(e,`${H.baseUrl.replace(/\/+$/,``)}/`).toString()}catch{return e}},ii={...ni.vars,...Object.fromEntries(Object.entries(U.authVars).map(([e,t])=>[e,ri(t)]))},ai={...ni.environments};for(let[e,t]of Object.entries(U.authEnvironmentVars))ai[e]={...ai[e],vars:{...ai[e]?.vars,...t}};var oi=H.source?{scope:H.source.kind===`url`?H.source.url:`upload:${W}`,session:H.source.kind!==`url`}:null,si=()=>Promise.resolve({default:{project:W,secrets:U.secrets,auth:U.auth,...Object.keys(ii).length?{vars:ii}:{},...Object.keys(ai).length?{environments:ai}:{},services:{[W]:{spec:``,baseUrl:ei||U.servers.length?ni.baseUrl:{},...U.defaultProfile?{auth:U.defaultProfile}:{}}}}}),G=d({links:[],ready:!1});function ci(e){let t=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!t)return;let n=t[1].length===3?[...t[1]].map(e=>e+e).join(``):t[1];return[0,2,4].map(e=>Number.parseInt(n.slice(e,e+2),16))}function li(e){let t=ci(e);if(!t)return;let n=t.map(e=>{let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4}),r=.2126*n[0]+.7152*n[1]+.0722*n[2],i=1.05/(r+.05);return(r+.05)/.056>i?`#0b1020`:`#ffffff`}var ui=e=>`--sb-accent:${e};--sb-accent-hover:color-mix(in srgb,${e} 82%,black);--sb-focus-ring:color-mix(in srgb,${e} 45%,white);`+(li(e)?`--sb-text-on-accent:${li(e)};`:``);function di(e,t=`root`){if(!e.accent&&!e.accentDark)return``;let n=t===`host`?`:host`:`:root`,r=t===`host`?`:host(:not([data-theme="light"]))`:`:root:not([data-theme="light"])`,i=t===`host`?`:host([data-theme="dark"])`:`:root[data-theme="dark"]`,a=e.accent?`${n}{${ui(e.accent)}}`:``;return e.accentDark?`${a}@media (prefers-color-scheme: dark){${r}{${ui(e.accentDark)}}}${i}{${ui(e.accentDark)}}`:a}function fi(e,t,n){if(typeof document>`u`)return;let r=document.getElementById(`specbook-brand`);r||(r=document.createElement(`style`),r.id=`specbook-brand`,document.head.append(r)),r.textContent=e?di(e):``;let i=t.name??n;if(globalThis.__SPECBOOK_VIEWER__?.setTitle!==!1&&(document.title=t.title?`${i} · ${t.title}`:i),t.favicon||t.logo){let e=document.querySelector(`link[rel="icon"]`);e||(e=document.createElement(`link`),e.rel=`icon`,document.head.append(e)),e.href=t.favicon??t.logo}}var pi;function mi(e){pi=e,typeof location<`u`&&(K.value=vi(location.hash))}var hi=e=>pi&&e.startsWith(`${pi}/`)?e.slice(pi.length+1):e,gi=e=>pi&&!e.includes(`/`)?`${pi}/${e}`:e,_i=e=>encodeURIComponent(e).replace(/%2F/gi,`/`);function vi(e){let[t=``,n=``]=e.split(`?`),r=new URLSearchParams(n),i=r.get(`play`)??void 0,a=r.get(`tab`),o=a===`docs`||a===`try`?a:void 0,s=/^#\/op\/(.+)$/.exec(t);if(s)return{kind:`op`,key:gi(decodeURIComponent(s[1])),play:i,tab:o};let c=/^#\/seq\/(.+)$/.exec(t);return c?{kind:`seq`,id:decodeURIComponent(c[1]),play:i,tab:o}:t===`#/browse`?{kind:`browse`}:{kind:`home`}}function yi(e){if(e.kind===`home`)return`#/`;if(e.kind===`browse`)return`#/browse`;let t=e.kind===`op`?`#/op/${_i(hi(e.key))}`:`#/seq/${encodeURIComponent(e.id)}`,n=new URLSearchParams;e.play!==void 0&&n.set(`play`,e.play),e.tab&&n.set(`tab`,e.tab);let r=n.toString();return r?`${t}?${r}`:t}var bi=()=>typeof matchMedia==`function`&&matchMedia(`(max-width: 820px)`).matches,xi=e=>bi()?{kind:`browse`}:{kind:`home`},K=d(vi(typeof location>`u`?``:location.hash)),q=d(!1),Si=d(``),Ci=d(``);function J(e){location.hash=yi(e),K.value=e}function wi(e,t,n=40){let r=t.trim().toLowerCase().split(/\s+/).filter(Boolean);if(r.length===0)return e.slice(0,n);let i=[];for(let t of e){let e=t.title.toLowerCase(),n=`${e} ${t.group.toLowerCase()} ${t.hay.toLowerCase()}`;if(!r.every(e=>n.includes(e)))continue;let a=0;for(let t of r)a+=e.startsWith(t)?3:e.includes(t)?2:1;t.kind===`seq`&&(a+=.5),t.kind===`req`&&(a+=.4),i.push([a,t])}return i.sort((e,t)=>t[0]-e[0]).slice(0,n).map(([,e])=>e)}function Ti({size:t=16}){return e(`svg`,{viewBox:`0 0 24 24`,width:t,height:t,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`,children:[e(`path`,{d:`M3 3l19 9-19 9 3.5-9z`}),e(`path`,{d:`M6.5 12H14`})]})}function Ei({size:t=12}){return e(`svg`,{viewBox:`0 0 24 24`,width:t,height:t,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`,children:[e(`rect`,{x:`4`,y:`11`,width:`16`,height:`10`,rx:`2`}),e(`path`,{d:`M8 11V7a4 4 0 0 1 8 0v4`})]})}function Di({size:t=16}){return e(`svg`,{viewBox:`0 0 24 24`,width:t,height:t,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`,children:[e(`path`,{d:`M12 15V3`}),e(`path`,{d:`M7.5 7.5 12 3l4.5 4.5`}),e(`path`,{d:`M5 11H4.5A1.5 1.5 0 0 0 3 12.5v7A1.5 1.5 0 0 0 4.5 21h15a1.5 1.5 0 0 0 1.5-1.5v-7a1.5 1.5 0 0 0-1.5-1.5H19`})]})}function Oi({size:t=16}){return e(`svg`,{viewBox:`0 0 16 16`,width:t,height:t,fill:`currentColor`,"aria-hidden":`true`,children:e(`path`,{d:`M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.6 7.6 0 0 1 4 0c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z`})})}function ki({size:t=16}){return e(`svg`,{viewBox:`0 0 24 24`,width:t,height:t,fill:`currentColor`,"aria-hidden":`true`,children:e(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`2`})})}function Ai(){let e=new Map;return{getItem:t=>e.get(t)??null,setItem:(t,n)=>void e.set(t,String(n)),removeItem:t=>void e.delete(t)}}function ji(e){try{let t=globalThis[e];if(t)return t}catch{}return Ai()}var Mi={get local(){return ji(`localStorage`)},get session(){return ji(`sessionStorage`)}},Ni=`specbook.environments.v1`,Pi={local:{},session:{}},Fi=e=>e===`local`?Mi.local:Mi.session;function Ii(e){try{let t=Fi(e).getItem(Ni);return t?JSON.parse(t):Pi[e]}catch{return Pi[e]}}function Li(e,t){Pi[e]=t;try{Fi(e).setItem(Ni,JSON.stringify(t))}catch{}}function Ri(e,t=`local`){return{all:()=>Ii(t)[e]??{},save(n,r){let i=Ii(t);Li(t,{...i,[e]:{...i[e],[n]:r}})},remove(n){let r=Ii(t),{[n]:i,...a}=r[e]??{};Li(t,{...r,[e]:a})}}}var zi=`specbook`;function Bi(e){return{version:e,send(e,t){return new Promise((n,r)=>{let i=e.id,a=e=>{let t=e.data;if(e.source!==window||t?.channel!==`${zi}:reply`||!t.reply)return;let r=t.reply;(i===void 0||r.id===i)&&(s(),n(t.reply))},o=()=>{s(),window.postMessage({channel:`${zi}:call`,call:{v:1,type:`abort`,id:i}},`*`),r(new DOMException(`aborted`,`AbortError`))},s=()=>{window.removeEventListener(`message`,a),t?.removeEventListener(`abort`,o)};window.addEventListener(`message`,a),t?.addEventListener(`abort`,o),window.postMessage({channel:`${zi}:call`,call:e},`*`)})}}}async function Vi(e=250){let t=globalThis.__SPECBOOK_EXTENSION__;if(t)return t;if(typeof window>`u`)return;let n=Bi(1),r=new Promise(t=>setTimeout(()=>t(void 0),e)),i=await Promise.race([n.send({v:1,type:`ping`}).catch(()=>void 0),r]);return i?.type===`pong`?{...n,version:i.version}:void 0}var Hi=0;function Ui(e,t){return er({baseUrl:t,fetch:async(t,n)=>{let r=new Request(t,n),i=`c${Date.now().toString(36)}${Hi++}`,a=await e.send({v:1,type:`fetch`,id:i,req:await Vn(r)},n?.signal??void 0);if(a.type===`error`)throw Error(a.message);if(a.type!==`response`)throw Error(`unexpected reply from the extension`);return Hn(a.res)}})}var Wi=`specbook.secrets.v1`,Gi={},Ki=()=>{try{let e=Mi.session.getItem(Wi);return e?JSON.parse(e):Gi}catch{return Gi}},qi=e=>{Gi=e;try{Mi.session.setItem(Wi,JSON.stringify(e))}catch{}},Ji={get:(e,t)=>Ki()[e]?.[t],set(e,t,n){let r=Ki();qi({...r,[e]:{...r[e],[t]:n}})},remove(e,t){let n=Ki(),{[t]:r,...i}=n[e]??{};qi({...n,[e]:i})}},Yi=e=>{try{return e?new URL(e).origin:void 0}catch{return}},Xi=/\{\{\s*secrets\.([\w$-]+)\s*\}\}/g;function Zi(e){return e.proxy?`proxy`:e.pageOrigin&&Yi(e.baseUrl)===e.pageOrigin?`direct`:e.extension?`extension`:`direct`}var Qi=e=>{let t=new Set,n=e=>{if(typeof e==`string`)for(let n of jn(new TextEncoder().encode(e)))t.add(n);else Array.isArray(e)?e.forEach(n):e&&typeof e==`object`&&Object.getPrototypeOf(e)===Object.prototype&&Object.values(e).forEach(n)};return n(e.headers),n(e.query),n(e.body),[...t]};function $i(e,t){return(n,r)=>{let i=Qi(n);if(i.length===0)return e(n,r);let a=t.originFor(n.service),o=new Map,s=[];for(let e of i){let n=a?t.store.get(a,e):void 0;n===void 0?s.push(e):o.set(e,n)}if(s.length&&t.unresolved===`fail`)throw new Kn(s);let c=e=>typeof e==`string`?Pn(e,o):Array.isArray(e)?e.map(c):e&&typeof e==`object`&&Object.getPrototypeOf(e)===Object.prototype?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,c(t)])):e;return e({...n,headers:c(n.headers),query:c(n.query),body:c(n.body)},r)}}function ea(e){return(t,n)=>{let r=Zi({proxy:!!e.proxy,extension:!!e.extension,baseUrl:e.baseOf(t.service),pageOrigin:e.pageOrigin});return((r===`proxy`?e.proxy:r===`extension`?e.extension:e.direct)??e.direct)(t,n)}}var ta=`auth:`,na=e=>`${ta}${encodeURIComponent(e)}`,ra=`discovery:`,ia=e=>`${ra}${encodeURIComponent(e)}`,aa=/^[A-Za-z0-9_-]+$/,oa=/^[A-Za-z_][\w.-]*$/,sa=e=>typeof e==`string`?/\{\{/.test(e):typeof e==`object`&&!!e&&Object.values(e).some(sa),ca=e=>typeof e==`object`&&e?JSON.stringify(e):String(e??``);function la(e,t={}){if(!e.loadFaker&&e.fakerUnavailable){let t=e.fakerUnavailable;ct(new Proxy({},{get(){throw Error(t)}}))}let n={statuses:(t,n)=>e.manifests[t]?.operations.find(e=>e.id===n)?.statuses??[],async example(t,n,r){let i=async r=>(await e.examples[`${t}/${n}.${r}`]?.(0))?.default;return await i(r)??await i(`default`)}};async function r(t){return(await e.loadConfig(t)).default}let i=()=>e.mode!==`dev`,a=()=>i()?t.environmentStore?.all()??{}:{},o=new Set;async function s(e){let t=await r(e),n={};for(let[e,r]of Object.entries(t.environments??{})){let t=r?.risk;(t===`production`||t===`sandbox`)&&(n[e]=t)}for(let[e,t]of Object.entries(a()))t.from&&n[t.from]&&!n[e]&&(n[e]=n[t.from]);return n}async function c(e){let t=await r(e),n={};for(let[e,r]of Object.entries(t.environments??{})){let t=r?.description;t&&(n[e]=t)}for(let[e,t]of Object.entries(a()))t.from&&(n[e]=`copy of ${t.from}, kept in this browser`);return n}async function l(t){let n=await r(t);return Pt({services:n.services??{},environments:n.environments},[...Object.keys(e.environmentVars??{}),...o],Object.keys(a()))}async function u(t){if(e.mode===`dev`)try{let e=await fetch(`/__specbook/environment?env=${encodeURIComponent(t)}`);if(e.ok)return(await e.json()).vars}catch{}return{...e.environmentVars?.[t],...a()[t]?.vars}}async function d(e,t){return At(await r(t),e,await u(e))}async function f(e,t,n){return Mt(await r(n),e,t,await d(t,n))}async function p(e,t,n){let i=(await r(n)).auth?.[e]?.oauth;return!i||!sa(i)?i:Nt(i,await d(t,n),e)}async function m(e,t){let n=At(e,t,Object.values(e.services??{}).some(e=>sa(e.baseUrl))||Object.values(e.auth??{}).some(e=>sa(e.oauth))?await u(t):{});return{baseUrl(r){try{return Mt(e,r,t,n)}catch{return}},oauth(t){let r=e.auth?.[t]?.oauth;try{return r?Nt(r,n,t):void 0}catch{return}}}}async function h(n,o){let s=await r(o),c=s.vars??{},l=s.environments?.[n]?.vars??{},d=a()[n],f=i()?e.environmentVars?.[n]??{}:await u(n),p=d?.vars??{},m=[...new Set([...Object.keys(c),...Object.keys(l),...Object.keys(f),...Object.keys(p)])],h=e.mode===`dev`||!!t.environmentStore,g=m.map(e=>{let t=e in l?l[e]:c[e],n=e in p?`browser`:e in f?`file`:void 0,r=e in p?p[e]:e in f?f[e]:t,i=e in p&&e in f?f[e]:t;return{name:e,value:ca(r),source:n??(e in l?`config`:`default`),fallback:n&&i!==void 0?ca(i):void 0,editable:h}}),_=At(s,n,{...f,...p}),v=[];if(n!==`mock`)for(let e of Object.keys(s.services??{}))try{let t=Mt(s,e,n,_);v.push({service:e,...t?{url:t}:{}})}catch(t){if(!(t instanceof L))throw t;v.push({service:e,error:t.message})}return{rows:g,addresses:v,uses:Ft(s),removable:!!d?.from}}let g=()=>e.mode===`dev`||!!t.environmentStore;async function _(n,i,a){if(!aa.test(n))throw Error(`Use letters, digits, "-" and "_" in an environment name`);if(n===`mock`||(await l(a)).includes(n))throw Error(`"${n}" already exists`);if(e.mode===`dev`){let e=await fetch(`/__specbook/environment`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({name:n,from:i})});if(!e.ok)throw Error((await e.json()).error??`could not create`);o.add(n);return}if(!t.environmentStore)throw Error(`This page has nowhere to keep a new environment`);let s={...(await r(a)).environments?.[i]?.vars??{},...await u(i)};t.environmentStore.save(n,{from:i,vars:Object.fromEntries(Object.entries(s).filter(([,e])=>e!==null&&typeof e!=`object`).map(([e,t])=>[e,String(t)]))})}async function v(n,r,i){if(!oa.test(r))throw Error(`"${r}" is not a variable name`);if(e.mode===`dev`){let e=await fetch(`/__specbook/var`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({env:n,name:r,value:i})});if(!e.ok)throw Error((await e.json()).error??`save failed`);return}let a=t.environmentStore;if(!a)throw Error(`This page has nowhere to keep a variable`);let o=a.all()[n]??{vars:{}},s={...o.vars};i===null?delete s[r]:s[r]=i,!o.from&&Object.keys(s).length===0?a.remove(n):a.save(n,{...o,vars:s})}function y(e){t.environmentStore?.remove(e)}async function b(e,t){let n=await r(t);return[...new Set([...Object.keys(n.vars??{}),...Object.keys(n.environments?.[e]?.vars??{}),...Object.keys(await u(e))])]}async function x(i,a,o,s={}){if(i===`mock`)return un({loader:n});let c=await r(o),l=Object.values(c.services??{}).some(e=>sa(e.baseUrl))?await d(i,o):{},u=globalThis.location?.href,f=globalThis.location?.origin,p=e=>{if(s[e])return s[e];let t;try{t=Mt(c,e,i,l)}catch(e){throw e instanceof L?Error(e.message):e}if(!t)throw Error(`No base URL for ${e} in ${i}`);return Zn(t,u)},m=e.mode!==`static`,h=await t.extension?.(),g=h?Ui(h,x):void 0,_=t.secrets??Ji,v=er({baseUrl:p}),y=m?er({baseUrl:e=>`${a}/${i}/${e}`}):void 0;return ea({direct:S($i(v,{store:_,originFor:b,unresolved:`fail`})),proxy:y?$i(y,{store:_,originFor:b,unresolved:`keep`}):void 0,extension:g?$i(g,{store:_,originFor:b,unresolved:`keep`}):void 0,baseOf:x,pageOrigin:f});function b(e){return Yi(x(e))}function x(e){try{return p(e)}catch{return``}}function S(e){return async(t,n)=>{try{return await e(t,n)}catch(e){throw e instanceof TypeError&&(t.service.startsWith(ta)||t.service.startsWith(ra))?Error(`The browser could not reach the sign-in provider (${s[t.service]??`unknown`}). It probably does not allow calls from this page (CORS). Embedding the viewer on the API's origin does not help when the sign-in server is on another host; the browser extension can make the call. You can still paste an access token.`):e instanceof TypeError?Error(`The browser could not reach ${t.service} in "${i}". The API probably does not allow calls from this page (CORS). It works when the viewer runs on the API's own origin: embed it in the API's docs route ("Embed the viewer" in the README). Mock data keeps working.`):e}}}}async function S(t){if(e.mode!==`dev`||t===`mock`)return{};try{let e=await fetch(`/__specbook/environment?env=${encodeURIComponent(t)}`);if(!e.ok)return{};let n=await e.json();return Object.fromEntries((n.secrets??[]).filter(e=>e.source).map(e=>[e.name,e.source]))}catch{return{}}}let C=new Map;async function w(e){if(e.env===`mock`)throw Error(`Sign in needs a live environment, not mock`);let t;try{t=await p(e.profile,e.env,e.version)}catch(e){throw e instanceof L?Error(e.message):e}if(!t)throw Error(`"${e.profile}" has no sign-in configured`);if(!fn(t))return{authorizationUrl:t.authorizationUrl,tokenUrl:t.tokenUrl,scopes:t.scopes??{}};let n=new URL(t.openIdConnectUrl),r=C.get(n.href);r||(r=(async()=>{let t=ia(e.profile),r=await(await x(e.env,e.proxyBase??`/__specbook/proxy`,e.version,{[t]:n.origin}))({service:t,opId:`oidc-discovery`,method:`GET`,url:n.pathname,query:Object.fromEntries(n.searchParams),headers:{accept:`application/json`},encoding:`none`},e.signal);if(r.status>=400)throw Error(`The provider's discovery document answered ${r.status}`);return pn(r.body)})(),C.set(n.href,r),r.catch(()=>C.delete(n.href)));let i=await r;return{...i,scopes:t.scopes&&Object.keys(t.scopes).length?t.scopes:i.scopes}}async function T(e){let{tokenUrl:t}=await w(e),n=new URL(t),r=na(e.profile),i=await(await x(e.env,e.proxyBase??`/__specbook/proxy`,e.version,{[r]:n.origin}))({service:r,opId:`oauth-token`,method:`POST`,url:n.pathname,query:Object.fromEntries(n.searchParams),headers:{accept:`application/json`},body:e.fields,encoding:`form`},e.signal),a=i.body;if(i.status>=400&&typeof a?.error!=`string`)throw Error(`The token endpoint answered ${i.status}`);return i.body}let E=e=>e.replace(/^\.\//,``),D=t=>e.requestExamples[t]??[];async function O(e,t,n){let r=D(e).find(e=>e.name===t);if(r)return{...(await r.load(n)).default,source:r.source,dir:r.dir}}async function k(t,n){let r=await e.assets[`${n}/${E(t)}`]?.();if(!r)throw Error(`File "${t}" not found next to the example`);let i=await fetch(r);if(!i.ok)throw Error(`Could not read "${t}" (${i.status})`);return new File([await i.blob()],E(t).split(`/`).pop(),{type:i.headers.get(`content-type`)??void 0})}async function A(e){let t=await r(e.version),n=t.auth??{},i=Object.fromEntries(Object.entries(t.services??{}).filter(([,e])=>e.auth).map(([e,t])=>[e,t.auth]));return{env:e.env,vars:await d(e.env,e.version),overrides:e.vars,inputs:e.inputs,transport:await x(e.env,e.proxyBase??`/__specbook/proxy`,e.version),deferSecrets:!0,auth:n,serviceAuth:i,onEvent:e.onEvent,onInput:e.onInput,signal:e.signal,timeoutMs:t.timeoutMs,example:(t,n)=>O(`${t.service}/${t.id}`,n,e.version),readFile:(t,n)=>k(t,n??e.fileDir)}}async function ee(e,t){if(e.kind===`sequence`)return!0;let{init:n,data:r,example:i,path:a,query:o,headers:s}=e.input;return Object.values(n??{}).some(e=>typeof e==`function`)||typeof r==`function`?!0:St([i?await O(`${e.op.service}/${e.op.id}`,i,t.version):void 0,r,e.dataPatches,a,o,s,t.vars])}async function te(t,n,i){if(!e.loadFaker)return!1;let[a,o]=await Promise.all([e.loadFaker(t),r(t)]);return dt(await ut(a,o.faker,n),o.faker,{locale:n,seed:i}),!0}async function ne(t,n){e.loadFaker&&await ee(t,n)&&await te(n.version,n.locale,n.seed);let r=await A(n);return t.kind===`sequence`?Sr(t,r):xr(t,n.env===`mock`?{...r,mockStatus:n.mockStatus}:r)}async function re(t,n,r,i){let a=e.operations[t];if(!a)throw Error(`Unknown operation ${t}`);let o=(await a(n))[t.split(`/`)[1]];if(!o)throw Error(`Operation module for ${t} has no export`);let s=Object.fromEntries(Object.entries(r).filter(([,e])=>e!==void 0)),c=o.request({...i?.input??{},...s});return i?.mockHook?Wn(c,i.mockHook):c}async function ie(t,n){return(await e.operations[t]?.(n))?.[t.split(`/`)[1]]?.meta}async function ae(e,t){let n=`${e.op.service}/${e.op.id}`,r=e.input.example?await O(n,e.input.example,t):void 0,i=e.input.data;typeof i==`function`&&(i=(await i()).default);let a=I(r?.body,i);for(let t of e.dataPatches)a=I(a,t);return{name:e.input.name??e.op.id,source:`project`,dir:r?.dir,path:I(r?.path??{},e.input.path??{}),query:I(r?.query??{},e.input.query??{}),headers:{...r?.headers??{},...e.input.headers??{}},body:a}}async function oe(e,t){let n={};await Promise.all(e.map(async e=>{try{let r=ua(await e.load(t));if(r?.kind!==`request`)return;let i=`${r.op.service}/${r.op.id}`,a=r.input.name??e.file.replace(/^.*\//,``).replace(/\.req\.ts$/,``);n[i]??=[],n[i]?.push({file:e.file,name:a,def:r})}catch{}}));for(let e of Object.values(n))e.sort((e,t)=>e.name.localeCompare(t.name));return n}async function se(e,t){let n=[];return await Promise.all(e.map(async e=>{try{let r=ua(await e.load(t));r?.kind===`sequence`&&n.push({file:e.file,seq:r})}catch{}})),n.sort((e,t)=>e.seq.meta.title.localeCompare(t.seq.meta.title))}return{config:r,environments:l,environmentRisks:s,environmentNotes:c,environmentVars:u,environmentView:h,canCreateEnvironment:g,createEnvironment:_,deleteEnvironment:y,setVariable:v,baseUrlOf:f,oauthOf:p,addressesIn:m,managedSecrets:S,oauthEndpoints:w,oauthExchange:T,run:ne,fakerReady:te,operationRequest:re,operationMeta:ie,examplesOf:D,knownVars:b,loadExample:O,savedExample:ae,loadVariants:oe,loadSequences:se}}function ua(e){let t=e=>e&&(e.kind===`request`||e.kind===`sequence`);return t(e.default)?e.default:Object.values(e).find(t)}var Y=d(Date.now()),X=d(`mock`),Z=d([`mock`]),da=d({}),fa=d({}),pa=d(void 0),ma=d(void 0),ha=d(!1),ga=d(0),_a=d(!1),va=d(!1),ya=d({createEnvironment:!0,environmentSettings:!0}),Q=wr,ba,xa=async()=>{if(ba&&Date.now()-ba.at<3e4)return ba.bridge;let e=await Vi();return ba={at:Date.now(),bridge:e},e},Sa=oi,$=la(wr,{extension:xa,environmentStore:Sa===null?void 0:Ri(Sa?.scope??`${globalThis.location?.origin}${globalThis.location?.pathname}`,Sa?.session?`session`:`local`)}),Ca=Dr===`static`;async function wa(e,t){let n=await fetch(`/__specbook/save`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({path:e,content:t})});if(!n.ok)throw Error((await n.json()).error??`save failed`);Y.value=Date.now()}function Ta(){if(!globalThis.__SPECBOOK_VIEWER__)return null;let t=Z.value.some(e=>e!==`mock`);return e(`p`,{class:`muted overview-mode`,children:t?`Requests start on mock data. Switch Environment to live to call the real API.`:`Requests run on generated mock data: this document does not say where the API lives.`})}var Ea=/(^|\.)specbook\.dev$/i;function Da(e){return e.published&&e.badge!==!1&&!Ea.test(e.host)}var Oa=e=>`https://ui.specbook.dev/?ref=${encodeURIComponent(e)}`;function ka(){let t=globalThis.location?.hostname??``;return Da({host:t,published:Ca,badge:G.value.badge})?e(`p`,{class:`powered-by`,children:e(`a`,{href:Oa(t),target:`_blank`,rel:`noopener`,children:`Powered by Specbook`})}):null}var Aa=60,ja=`Default`;function Ma(e){let t=K.value;if(e.route.kind===`op`&&t.kind===`op`&&e.route.key===t.key){let n=(t.play??``).startsWith(`saved:`);return e.kind===`req`?t.play===e.route.play:!n}return e.route.kind===`seq`&&t.kind===`seq`&&e.route.id===t.id}function Na({e:t}){return e(`button`,{type:`button`,class:`op-row ${Ma(t)?`active`:``}`,onClick:()=>J(t.route),title:t.path?`${t.title}\n${t.path}`:t.title,children:[e(`span`,{class:`method ${t.method}`,children:t.method}),e(`span`,{class:`op-title`,children:[t.title,t.secured&&e(`span`,{class:`op-lock`,title:`Needs credentials`,children:e(Ei,{})})]}),e(`span`,{class:`op-path`,children:t.path})]})}function Pa(e,t){let n=Ci.value.trim(),r=t.length<=1,i=r?t[0]?.id??``:Si.value,o=a(()=>e.filter(e=>e.kind===`op`),[e]),s=a(()=>e.filter(e=>e.kind===`seq`),[e]),c=a(()=>e.filter(e=>e.kind===`req`),[e]),l=a(()=>{let e=i?c.filter(e=>e.service===i):c;return n?wi(e,n,200):e},[c,i,n]);return{q:n,single:r,svc:i,shownOps:a(()=>{let e=i?o.filter(e=>e.service===i):o;return n?wi(e,n,500):e},[o,i,n]),shownFlows:a(()=>{let e=i&&!r?s.filter(e=>e.tags?.includes(i)):s;return n?wi(e,n,100):e},[s,i,n,r]),shownReqs:l}}function Fa({entries:t,services:i}){let o=c(null),s=c(null),[l,u]=r(new Map),{q:d,single:f,svc:p,shownOps:m,shownFlows:h,shownReqs:g}=Pa(t,i),_=e=>l.get(`section:${e}`)??!0,v=e=>{let t=new Map(l);t.set(`section:${e}`,!_(e)),u(t)};n(()=>{let e=e=>{let t=e.target;e.key===`/`&&!/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName)&&(e.preventDefault(),o.current?.focus())};return addEventListener(`keydown`,e),()=>removeEventListener(`keydown`,e)},[]),n(()=>{let e=s.current;if(!e)return;let t=t=>{if(t.key!==`ArrowDown`&&t.key!==`ArrowUp`)return;let n=[...e.querySelectorAll(`.op-row, .flow-row`)],r=n.indexOf(document.activeElement);if(r<0)return;let i=t.key===`ArrowDown`?r+1:r-1;t.preventDefault(),i>=0&&i<n.length?n[i]?.focus():i<0&&o.current?.focus()};return e.addEventListener(`keydown`,t),()=>e.removeEventListener(`keydown`,t)},[]);let y=a(()=>{let e=new Map;for(let t of m){let n=t.tag??`default`,r=p||f?n:`${t.service} · ${n}`;e.set(r,[...e.get(r)??[],t])}return[...e.entries()].sort(([e],[t])=>e.localeCompare(t))},[m,p,f]),b=a(()=>{let e=new Map;for(let t of h){let n=t.flowGroup?.trim()||ja;e.set(n,[...e.get(n)??[],t])}let t=e=>e===ja?0:1;return[...e.entries()].sort(([e],[n])=>t(e)-t(n)||e.localeCompare(n))},[h]),x=m.length>Aa&&!d,S=(e,t)=>l.get(e)??(!x||t.some(Ma)),C=(e,t)=>{let n=new Map(l);n.set(e,!S(e,t)),u(n)};return e(`div`,{class:`catalog`,ref:s,children:[e(`div`,{class:`cat-top`,children:[!f&&e(`div`,{class:`pills`,role:`tablist`,"aria-label":`APIs`,children:[e(`button`,{type:`button`,role:`tab`,"aria-selected":p===``,class:`pill ${p===``?`on`:``}`,onClick:()=>Si.value=``,children:`All`}),i.map(t=>e(`button`,{type:`button`,role:`tab`,"aria-selected":p===t.id,class:`pill ${p===t.id?`on`:``}`,onClick:()=>Si.value=t.id,children:[t.id,` `,e(`span`,{class:`count`,children:t.ops})]}))]}),e(`div`,{class:`cat-filter-wrap`,children:[e(`input`,{ref:o,type:`text`,class:`cat-filter`,placeholder:p?`Filter ${p}`:`Filter operations and flows`,"aria-label":`Filter`,value:Ci.value,onInput:e=>Ci.value=e.target.value,onKeyDown:e=>{e.key===`ArrowDown`&&(e.preventDefault(),s.current?.querySelector(`.op-row, .flow-row`)?.focus()),e.key===`Escape`&&(Ci.value=``)}}),e(`kbd`,{class:`cat-hint`,title:`Focus the filter`,children:`/`})]})]}),b.length>0&&e(`section`,{class:`flows`,"aria-label":`Flows`,children:[e(`button`,{type:`button`,class:`flows-title`,"aria-expanded":_(`flows`),onClick:()=>v(`flows`),children:[e(`span`,{class:`caret`,children:_(`flows`)?`▾`:`▸`}),e(`span`,{class:`method flow`,children:`FLOW`}),e(`span`,{class:`muted small`,children:`Multi-step flows you can run end to end`}),e(`span`,{class:`count`,children:h.length})]}),_(`flows`)&&b.map(([t,n])=>{let r=`flows:${t}`,i=b.length===1,a=i||(l.get(r)??!0);return e(`div`,{class:`flow-group`,children:[!i&&e(`button`,{type:`button`,class:`group-head flow-head`,"aria-expanded":a,onClick:()=>{let e=new Map(l);e.set(r,!a),u(e)},children:[e(`span`,{class:`caret`,children:a?`▾`:`▸`}),` `,t,` `,e(`span`,{class:`count`,children:n.length})]}),a&&n.map(t=>e(`button`,{type:`button`,class:`op-row flow-row ${Ma(t)?`active`:``}`,onClick:()=>J(t.route),children:[e(`span`,{class:`flow-play`,"aria-hidden":`true`,children:`▶`}),e(`span`,{class:`op-title`,children:t.title})]}))]},r)})]}),g.length>0&&e(`section`,{class:`flows requests`,"aria-label":`Requests`,children:[e(`button`,{type:`button`,class:`flows-title`,"aria-expanded":_(`requests`),onClick:()=>v(`requests`),children:[e(`span`,{class:`caret`,children:_(`requests`)?`▾`:`▸`}),e(`span`,{class:`method req`,children:`REQ`}),e(`span`,{class:`muted small`,children:`Requests you can run and check`}),e(`span`,{class:`count`,children:g.length})]}),_(`requests`)&&g.map(t=>e(`button`,{type:`button`,class:`op-row req-row ${Ma(t)?`active`:``}`,onClick:()=>J(t.route),title:`${t.method} ${t.path}`,children:[e(`span`,{class:`method ${t.method}`,children:t.method}),e(`span`,{class:`op-title`,children:[t.title,(t.tags??[]).map(t=>e(`span`,{class:`chip req-tag`,children:t}))]}),e(`span`,{class:`op-path`,children:t.path})]}))]}),y.map(([t,n])=>{let r=S(t,n);return e(`div`,{class:`op-group`,children:[e(`button`,{type:`button`,class:`group-head`,"aria-expanded":r,onClick:()=>C(t,n),children:[e(`span`,{class:`caret`,children:r?`▾`:`▸`}),` `,t,` `,e(`span`,{class:`count`,children:n.length})]}),r&&n.map(t=>e(Na,{e:t}))]},t)}),y.length===0&&b.length===0&&g.length===0&&e(`p`,{class:`muted cat-empty`,children:[d?`Nothing matches “${d}”.`:`No operations.`,` `,d&&e(`button`,{type:`button`,class:`link`,onClick:()=>Ci.value=``,children:`Clear the filter`})]})]})}function Ia({services:t,counts:n}){let r=G.value;if(!r.ready)return e(`div`,{class:`overview`,"aria-busy":`true`});let i=t.reduce((e,t)=>e+t.ops,0),a=t.length===1?t[0]:void 0,o=r.title??r.name??(a?a.title??a.id:`${t.length} APIs · ${i.toLocaleString()} operations`),s=a?`${a.ops} ${a.ops===1?`operation`:`operations`}${a.version?` · v${a.version}`:``}`:r.name||r.title?`${t.length} APIs · ${i.toLocaleString()} operations`:void 0;return e(`div`,{class:`overview`,children:[r.logo&&e(`img`,{class:`overview-logo`,src:r.logo,alt:``,style:r.logoBackground?{background:r.logoBackground,padding:`10px 16px`,borderRadius:`10px`}:void 0}),r.title&&r.name&&e(`p`,{class:`overview-name`,children:r.name}),e(`h1`,{children:o}),r.tagline&&e(`p`,{class:`tagline`,children:r.tagline}),s&&e(`p`,{class:`muted`,children:s}),e(`p`,{class:`overview-hint`,children:`Choose an operation or flow on the left to read it and try it.`}),e(Ta,{}),e(`button`,{type:`button`,class:`btn primary overview-browse`,onClick:()=>J({kind:`browse`}),children:`Browse operations and flows`}),r.links.length>0&&e(`p`,{class:`overview-links`,children:r.links.map(t=>e(`a`,{href:t.href,target:`_blank`,rel:`noreferrer`,children:t.label}))}),e(`p`,{class:`muted overview-keys`,children:[e(`kbd`,{children:`⌘`}),` `,e(`kbd`,{children:`K`}),` jumps anywhere · `,e(`kbd`,{children:`/`}),` filters the list`]}),e(ka,{})]})}var La=`\0new-environment`;function Ra(){let t=X.value,n=Z.value.includes(t)?Z.value:[t,...Z.value],r=da.value[t],i=t===`mock`?`mock`:r===`production`||r!==`sandbox`&&/prod/i.test(t)?`prod`:`live`,a=ya.value.createEnvironment&&$.canCreateEnvironment(),o=n.length>1||a;return e(`span`,{class:`env-badge ${i} ${o?`switch`:``}`,title:t===`mock`?`Environment: mock (no network)`:`Environment: ${t}. Requests go to the real API.`,children:[e(`span`,{class:`env-name`,children:t}),o&&e(`select`,{"aria-label":`Environment`,value:t,onChange:e=>{let t=e.target.value;t===La?(e.target.value=X.value,va.value=!0):X.value=t},children:[n.map(t=>e(`option`,{value:t,title:fa.value[t],children:t})),a&&e(`option`,{value:La,children:`New environment…`})]})]})}async function za(){let e=Y.value,[t,n,r]=await Promise.all([$.environments(e),$.environmentRisks(e),$.environmentNotes(e)]);Z.value=t,da.value=n,fa.value=r,ga.value+=1}var Ba={session:`this session`,process:`environment variable`,environment:`environment file`,shared:`shared file`},Va={default:`default`,config:`config`,file:`file`,browser:`this browser`};async function Ha(e,t){let n=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)});if(!n.ok)throw Error((await n.json()).error??`save failed`)}function Ua(e,t){let n=t.uses[e.name];if(!n)return[];let r=[];for(let e of n.services){let n=t.addresses.find(t=>t.service===e);r.push(n?.url?`${e} calls go to ${n.url}`:`${e} calls use this address`)}for(let e of n.profiles)r.push(`${e.profile} sign-in reads this (${e.field})`);return r}function Wa(){let[t,i]=r(),[o,s]=r(),[c,l]=r({}),u=_a.value,d=e=>_a.value=e,[f,m]=r(`environment`),[h,g]=r({}),[_,v]=r({name:``,value:``}),[y,b]=r(),x=X.value,S=()=>Ca?Promise.resolve():fetch(`/__specbook/environment?env=${encodeURIComponent(x)}`).then(e=>e.json()).then(i,()=>i(void 0));n(()=>{S(),m(x===`mock`?`session`:`environment`),g({})},[x]),n(()=>{let e=!0;return $.environmentView(x,Y.value).then(t=>e&&s(t)),()=>{e=!1}},[x,Y.value,ga.value]),n(()=>{$.config(Y.value).then(e=>{let t={};for(let[n,r]of Object.entries(e.auth??{}))for(let e of JSON.stringify(r.apply).matchAll(/secrets\.([\w$-]+)/g))t[e[1]]=r.title??n;l(t)})},[]);let C=a(()=>x===`mock`?0:t?.secrets.filter(e=>!e.source).length??0,[t,x]);if(!o||!Ca&&!t)return null;let w=t?.secrets??[];if(!(w.length>0||o.rows.length>0||x!==`mock`))return null;let T=async e=>{b(void 0);try{await e(),await S()}catch(e){b(e instanceof Error?e.message:String(e))}},E=(e,t)=>T(async()=>{await Ha(`/__specbook/secret`,{name:e,value:t,scope:f,env:f===`shared`?void 0:x}),g(t=>({...t,[e]:``}))}),D=(e,t)=>T(async()=>{await $.setVariable(x,e,t===``?null:t),ga.value+=1}),O=()=>T(async()=>{$.deleteEnvironment(x),X.value=`mock`,await za()}),k=[...t?.warnings??[],...x===`mock`?[]:o.addresses.filter(e=>e.error).map(e=>e.error)],A=[...o.rows].sort((e,t)=>Number(!!o.uses[t.name])-Number(!!o.uses[e.name])||e.name.localeCompare(t.name));return e(`div`,{class:`envmenu`,children:[e(`button`,{type:`button`,class:`btn envmenu-btn`,"aria-expanded":u,title:`Variables and credentials for ${x}`,"aria-label":C>0?`Environment settings, ${C} missing`:`Environment settings`,onClick:()=>d(!u),children:[e(`span`,{"aria-hidden":`true`,children:`⚙︎`}),` `,e(`span`,{class:`envmenu-label`,children:`Environment settings`}),C>0&&e(`span`,{class:`badge-missing`,children:C})]}),u&&e(`div`,{class:`envmenu-pop`,role:`dialog`,"aria-label":`Settings for ${x}`,children:[e(`header`,{class:`envmenu-head`,children:[e(`strong`,{children:x}),e(`span`,{class:`muted small`,children:x===`mock`?`mocks need no credentials`:`values apply to this environment`}),e(`span`,{class:`spacer`}),e(`button`,{type:`button`,class:`icon`,"aria-label":`Close`,onClick:()=>d(!1),children:`×`})]}),k.map(t=>e(`p`,{class:`envmenu-warn`,children:t})),y&&e(`p`,{class:`envmenu-warn`,children:y}),e(`section`,{children:[e(`h3`,{children:`Variables`}),e(`p`,{class:`muted small`,children:Ca?`Kept in this browser; the defaults come from the spec or site.`:e(p,{children:[`Shared with the team in `,e(`code`,{children:[`.specbook/environments/`,x,`.env`]}),`. Defaults come from specbook.config.ts.`]})}),A.map(t=>{let n=t.source===`file`||t.source===`browser`,r=`var:${t.name}`;return e(`div`,{children:[e(`div`,{class:`envrow`,children:[e(`code`,{children:t.name}),e(`input`,{"aria-label":`Value of ${t.name}`,value:h[r]??t.value,disabled:!t.editable,onInput:e=>g({...h,[r]:e.target.value}),onBlur:()=>{let e=h[r];e!==void 0&&e!==t.value&&D(t.name,e)},onKeyDown:e=>e.key===`Enter`&&e.target.blur()}),e(`span`,{class:`src ${n?`set`:`inherited`}`,children:Va[t.source]}),n&&t.editable&&e(`button`,{type:`button`,class:`icon`,"aria-label":t.fallback===void 0?`Remove ${t.name}`:`Reset ${t.name}`,title:t.fallback===void 0?`Remove this variable`:`Back to ${t.fallback}`,onClick:()=>D(t.name,null),children:`×`})]}),Ua(t,o).map(t=>e(`p`,{class:`muted small envuse`,children:t}))]},t.name)}),x!==`mock`&&o.addresses.filter(e=>e.url&&!Object.values(o.uses).some(t=>t.services.includes(e.service))).map(t=>e(`p`,{class:`muted small envuse`,children:[t.service,` calls go to `,t.url]})),x!==`mock`&&e(`form`,{class:`envrow`,onSubmit:e=>{e.preventDefault(),_.name&&D(_.name,_.value).then(()=>v({name:``,value:``}))},children:[e(`input`,{placeholder:`name`,"aria-label":`New variable name`,value:_.name,onInput:e=>v({..._,name:e.target.value})}),e(`input`,{placeholder:`value`,"aria-label":`New variable value`,value:_.value,onInput:e=>v({..._,value:e.target.value})}),e(`button`,{type:`submit`,class:`btn`,disabled:!_.name,children:`Add`})]}),o.removable&&e(`p`,{children:e(`button`,{type:`button`,class:`link`,onClick:O,children:`Delete environment`})})]}),!Ca&&e(`section`,{children:[e(`h3`,{children:`Secrets`}),w.length===0?e(`p`,{class:`muted small`,children:[`None declared. Add `,e(`code`,{children:[`secrets: `,`{ NAME: {} }`]}),` to the config.`]}):e(p,{children:[e(`label`,{class:`envrow scope`,children:[e(`span`,{class:`muted small`,children:`Save to`}),e(`select`,{"aria-label":`Where to save secrets`,value:f,onChange:e=>m(e.target.value),children:[e(`option`,{value:`environment`,children:[x,`.secrets.env (remembered here)`]}),e(`option`,{value:`session`,children:`this session only`}),e(`option`,{value:`shared`,children:`all environments (secrets.local.env)`})]})]}),w.map(t=>e(`form`,{class:`secretrow`,onSubmit:e=>{e.preventDefault(),E(t.name,h[t.name]??``)},children:[e(`div`,{class:`secretrow-head`,children:[e(`span`,{children:c[t.name]??t.name}),e(`code`,{class:`muted small`,children:t.key}),e(`span`,{class:`src ${t.source?`set`:`missing`}`,children:t.source?Ba[t.source]:`missing`})]}),e(`div`,{class:`envrow`,children:[e(`input`,{type:`password`,autocomplete:`off`,"aria-label":`Value of ${t.name}`,placeholder:t.source?`•••••• (type to replace)`:`paste a value`,value:h[t.name]??``,onInput:e=>g({...h,[t.name]:e.target.value})}),e(`button`,{type:`submit`,class:`btn`,disabled:!h[t.name],children:`Save`}),t.source&&t.source!==`process`&&e(`button`,{type:`button`,class:`link`,onClick:()=>E(t.name,``),title:`Remove the value from the selected place`,children:`Clear`})]})]}))]})]})]})]})}var Ga=`https://github.com/specbook-dev/specbook`;function Ka(){return globalThis.__SPECBOOK_VIEWER__?.source?e(`a`,{class:`btn gh-star`,href:Ga,target:`_blank`,rel:`noopener`,title:`Specbook's source is on GitHub`,children:[e(Oi,{}),e(`span`,{class:`gh-label`,children:`GitHub`})]}):null}var qa=`specbook:list-width`,Ja=()=>Math.round(innerWidth*.55);function Ya(){try{let e=Number(localStorage.getItem(qa));return e>=280?e:void 0}catch{return}}var Xa=d(Ya());function Za(e){Xa.value=e===void 0?void 0:Math.round(Math.max(280,Math.min(Ja(),e)));try{Xa.value===void 0?localStorage.removeItem(qa):localStorage.setItem(qa,String(Xa.value))}catch{}}function Qa(){let t=e=>{e.preventDefault(),document.body.classList.add(`resizing`);let t=e=>Za(e.clientX),n=()=>{document.body.classList.remove(`resizing`),removeEventListener(`pointermove`,t),removeEventListener(`pointerup`,n)};addEventListener(`pointermove`,t),addEventListener(`pointerup`,n)},n=()=>Xa.value??document.querySelector(`.list-col`)?.offsetWidth??360;return e(`div`,{class:`list-resizer`,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize the list`,"aria-valuenow":Xa.value,"aria-valuemin":280,tabIndex:0,title:`Drag to resize · double-click to reset`,onPointerDown:t,onDblClick:()=>Za(void 0),onKeyDown:e=>{e.key===`ArrowLeft`?(e.preventDefault(),Za(n()-24)):e.key===`ArrowRight`&&(e.preventDefault(),Za(n()+24))}})}var $a=/^[A-Za-z0-9_-]+$/;function eo(){return va.value?e(to,{}):null}function to(){let[t,i]=r(``),[a,o]=r(()=>X.value===`mock`?Z.value.find(e=>e!==`mock`)??`mock`:X.value),[s,l]=r(),[u,d]=r(!1),f=c(null);n(()=>{f.current?.focus();let e=e=>{e.key===`Escape`&&(va.value=!1)};return addEventListener(`keydown`,e),()=>removeEventListener(`keydown`,e)},[]);let p=()=>va.value=!1,m=Z.value.includes(t),h=t===``?void 0:$a.test(t)?t===`mock`||m?`"${t}" already exists`:void 0:`Use letters, digits, "-" and "_"`,g=async()=>{d(!0),l(void 0);try{await $.createEnvironment(t,a,Y.value),await za(),X.value=t,va.value=!1,_a.value=!0}catch(e){l(e instanceof Error?e.message:String(e))}finally{d(!1)}};return e(`div`,{class:`palette-backdrop newenv-backdrop`,children:[e(`button`,{type:`button`,class:`palette-dismiss`,"aria-label":`Close`,onClick:p}),e(`div`,{class:`palette newenv`,role:`dialog`,"aria-label":`New environment`,children:e(`form`,{onSubmit:e=>{e.preventDefault(),t&&!h&&!u&&g()},children:[e(`h2`,{children:`New environment`}),e(`label`,{children:[e(`span`,{class:`muted small`,children:`Name`}),e(`input`,{ref:f,type:`text`,"aria-label":`Environment name`,placeholder:`staging`,value:t,onInput:e=>i(e.target.value.trim())})]}),e(`label`,{children:[e(`span`,{class:`muted small`,children:`Duplicate of`}),e(`select`,{"aria-label":`Duplicate of`,value:a,onChange:e=>o(e.target.value),children:Z.value.filter(e=>e!==`mock`).map(t=>e(`option`,{value:t,children:t}))})]}),e(`p`,{class:`muted small`,children:[`It starts with `,a,`'s variables. Change its address in Variables; secrets are asked for again.`]}),(h||s)&&e(`p`,{class:`envmenu-warn`,children:h??s}),e(`div`,{class:`envrow`,children:[e(`span`,{class:`spacer`}),e(`button`,{type:`button`,class:`btn`,onClick:p,children:`Cancel`}),e(`button`,{type:`submit`,class:`btn primary`,disabled:!t||!!h||u,children:`Create`})]})]})})]})}function no({entries:t}){let[i,o]=r(``),[s,l]=r(0),u=c(null),d=q.value;n(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`k`?(e.preventDefault(),q.value=!q.value):e.key===`Escape`&&(q.value=!1)};return addEventListener(`keydown`,e),()=>removeEventListener(`keydown`,e)},[]),n(()=>{d&&(o(``),l(0),setTimeout(()=>u.current?.focus(),0))},[d]);let f=a(()=>wi(t,i,30),[t,i]);if(!d)return null;let p=e=>{e&&(q.value=!1,J(e.route))};return e(`div`,{class:`palette-backdrop`,children:[e(`button`,{type:`button`,class:`palette-dismiss`,"aria-label":`Close`,onClick:()=>q.value=!1}),e(`div`,{class:`palette`,role:`dialog`,"aria-label":`Jump to`,children:[e(`input`,{ref:u,type:`text`,placeholder:`Jump to a sequence, request or operation…`,value:i,onInput:e=>{o(e.target.value),l(0)},onKeyDown:e=>{e.key===`ArrowDown`?(e.preventDefault(),l(Math.min(f.length-1,s+1))):e.key===`ArrowUp`?(e.preventDefault(),l(Math.max(0,s-1))):e.key===`Enter`&&p(f[s])}}),e(`ul`,{children:[f.map((t,n)=>e(`li`,{children:e(`button`,{type:`button`,class:n===s?`sel`:``,onMouseEnter:()=>l(n),onClick:()=>p(t),children:[e(`span`,{class:`p-title`,children:t.title}),e(`span`,{class:`muted`,children:t.kind===`seq`?`Sequence`:t.kind===`req`?`Request`:t.group})]})})),f.length===0&&e(`li`,{class:`muted pad`,children:[`Nothing matches “`,i,`”`]})]})]})]})}function ro(){let t=globalThis.__SPECBOOK_VIEWER__,[n,i]=r(!1),[a,s]=r(!1);if(!t?.source)return null;K.value;let c=l(t.source),u=c.ok?o({origin:location.origin,pathname:location.pathname,hash:location.hash},c.spec,t.open.title):void 0;return e(`div`,{class:`share`,children:[e(`button`,{type:`button`,class:`btn`,"aria-expanded":n,"aria-haspopup":`true`,"aria-label":`Share`,onClick:()=>i(!n),children:[e(Di,{}),e(`span`,{class:`share-label`,children:`Share`})]}),n&&e(`div`,{class:`share-pop`,role:`menu`,children:u?e(p,{children:[e(`input`,{class:`share-link`,readOnly:!0,value:u.link,"aria-label":`Link to this view`,onFocus:e=>e.target.select()}),e(`div`,{class:`share-actions`,children:[e(`button`,{type:`button`,class:`btn primary`,onClick:async()=>{if(u)try{await navigator.clipboard.writeText(u.link),s(!0),setTimeout(()=>s(!1),1500)}catch{}},children:a?`Copied`:`Copy link`}),typeof navigator.share==`function`&&e(`button`,{type:`button`,class:`btn`,onClick:()=>void navigator.share({title:u.title,url:u.link}).catch(()=>{}),children:`Share…`})]}),e(`ul`,{class:`share-targets`,children:u.targets.map(t=>e(`li`,{children:e(`a`,{href:t.href,target:`_blank`,rel:`noopener noreferrer`,children:t.label})}))})]}):e(`p`,{class:`muted`,children:c.ok?``:c.reason})})]})}var io={auto:`Theme: follows your system. Click for light.`,light:`Theme: light. Click for dark.`,dark:`Theme: dark. Click to follow your system.`},ao=({mode:t})=>e(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`,children:[t===`light`&&e(p,{children:[e(`circle`,{cx:`12`,cy:`12`,r:`4`}),e(`path`,{d:`M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4`})]}),t===`dark`&&e(`path`,{d:`M20 14.5A8.5 8.5 0 0 1 9.5 4 8.5 8.5 0 1 0 20 14.5z`}),t===`auto`&&e(p,{children:[e(`circle`,{cx:`12`,cy:`12`,r:`8.5`}),e(`path`,{d:`M12 3.5v17a8.5 8.5 0 0 0 0-17z`,fill:`currentColor`,stroke:`none`})]})]});function oo(){let n=i.value;return e(`button`,{type:`button`,class:`icon theme-toggle`,title:io[n],"aria-label":io[n],"data-theme-mode":n,onClick:t,children:e(ao,{mode:n})})}var so=`\0new-environment`,co=globalThis.__SPECBOOK_VIEWER__?.source?s:void 0;function lo(){r(()=>{let e=Object.keys(Q.manifests);mi(e.length===1?e[0]:void 0)})}var uo=d([]);function fo(){let[e,t]=r(),i=K.value.kind===`op`||K.value.kind===`seq`;return n(()=>{i&&!e&&h(()=>import(`./Host-ClcN3YPO.js`).then(t),__vite__mapDeps([0,1,2,3]),import.meta.url)},[i,e]),i?e:void 0}function po(){lo();let[t,i]=r({}),[o,s]=r(void 0),[l,u]=r(!1);n(()=>{let e=()=>{K.value=vi(location.hash)};return addEventListener(`hashchange`,e),$.config(Y.value).then(async e=>{uo.value=Object.keys(e.faker?.locales??{}),e.faker?.default&&(pa.value=e.faker.default);let t=e.branding,n=Q.brandingAssets,r=Object.values(Q.manifests),i=r.length===1?r[0]?.logo:void 0,a=t?.logo??await n.logo?.().catch(()=>void 0),o={ready:!0,name:t?.name,title:t?.title,tagline:t?.tagline,links:t?.links??[],badge:t?.badge,logo:a??i?.url,logoBackground:a?void 0:i?.backgroundColor,favicon:t?.favicon??await n.favicon?.().catch(()=>void 0)};G.value=o,fi(t,o,r.length===1?r[0]?.title??`Specbook`:`Specbook`)}).catch(()=>{G.value={...G.value,ready:!0}}).finally(()=>{$.loadVariants(Q.requests,Y.value).then(i);let e=Q.sequences.filter(e=>Q.unresolvedSequences.includes(e.file));e.length&&$.loadSequences(e,Y.value).then(s)}),$.environments(Y.value).then(e=>{Z.value=e;let t=globalThis.__SPECBOOK_VIEWER__?.defaultEnv;t&&e.includes(t)&&(X.value=t)}),$.environmentRisks(Y.value).then(e=>{da.value=e}),$.environmentNotes(Y.value).then(e=>{fa.value=e}),()=>removeEventListener(`hashchange`,e)},[]);let d=c(K.value);n(()=>{d.current!==K.value&&(d.current=K.value,u(!1))},[K.value]),n(()=>{if(!l)return;let e=e=>e.key===`Escape`&&u(!1);return addEventListener(`keydown`,e),()=>removeEventListener(`keydown`,e)},[l]);let f=Object.keys(Q.manifests).length>1,p=a(()=>{let e=[],n=[...Object.values(Q.sequenceMeta),...(o??[]).map(e=>({...e.seq.meta}))];for(let t of n)e.push({kind:`seq`,route:{kind:`seq`,id:t.id},title:t.title,group:t.tags?.[0]??`sequence`,tags:t.tags,flowGroup:t.group,description:t.description,hay:`${t.description??``} ${(t.tags??[]).join(` `)}`});for(let n of Object.values(Q.manifests))for(let r of n.operations){let i=`${n.service}/${r.id}`;for(let a of t[i]??[])e.push({kind:`req`,route:{kind:`op`,key:i,play:`saved:${a.file}`},title:a.name,group:`request`,service:n.service,tag:r.tags[0]??`default`,method:r.method,path:r.path,tags:a.def.input.tags,hay:`${r.id} ${r.method} ${r.path} ${(a.def.input.tags??[]).join(` `)} ${a.file}`});let a=(t[i]??[]).map(e=>e.name).join(` `);e.push({kind:`op`,route:{kind:`op`,key:i},title:r.summary?.replace(/\.$/,``)||r.path,group:`${f?`${n.service} · `:``}${r.tags[0]??`default`}`,service:n.service,tag:r.tags[0]??`default`,method:r.method,path:r.path,secured:r.secured,hay:`${r.id} ${r.method} ${r.path} ${r.tags.join(` `)} ${a}`})}return e},[o,t,f]),m=K.value,h=m.kind===`op`?mo(m.key):void 0,g=m.kind===`seq`?m.id:void 0,[_,v]=r();n(()=>{if(!g)return;let e=Q.sequenceMeta[g]?.file;if(e){let t=Q.sequences.filter(t=>t.file===e);$.loadSequences(t,Y.value).then(e=>v(e[0]))}else v(o?.find(e=>e.seq.meta.id===g))},[g,o,Y.value]);let y=_?.seq.meta.id===g?_:void 0,b=fo(),x=()=>J(xi(K.value)),S=a(()=>Object.values(Q.manifests).map(e=>({id:e.service,title:e.title,version:e.version,ops:e.operations.length})).sort((e,t)=>e.id.localeCompare(t.id)),[]),C=a(()=>{if(m.kind!==`op`&&m.kind!==`seq`)return{};let e=p.find(e=>e.kind===`op`&&m.kind===`op`&&e.route.kind===`op`&&e.route.key===m.key||e.kind===`seq`&&m.kind===`seq`&&e.route.kind===`seq`&&e.route.id===m.id);if(!e)return{};let t=p.filter(t=>e.kind===`seq`?t.kind===`seq`:t.kind===`op`&&t.service===e.service&&t.tag===e.tag),n=t.indexOf(e),r=e=>e?()=>J({...e.route,play:``}):void 0;return{prev:r(t[n-1]),next:r(t[n+1])}},[p,m.kind===`op`?m.key:m.kind===`seq`?m.id:``]),w=e=>J(m.kind===`op`?{kind:`op`,key:m.key,play:e.example??m.play??``,tab:e.tab}:m.kind===`seq`?{kind:`seq`,id:m.id,play:``,tab:e.tab}:m);return e(`div`,{class:`app`,style:Xa.value?{"--sb-list-w":`${Xa.value}px`}:void 0,children:[e(`header`,{class:`header`,children:[e(`button`,{type:`button`,class:`brand`,onClick:()=>J({kind:`home`}),children:[(G.value.logo??co)&&e(`img`,{class:`brand-logo`,src:G.value.logo??co,alt:``,style:G.value.logoBackground?{background:G.value.logoBackground,padding:`3px 6px`,borderRadius:`4px`}:void 0}),e(`span`,{class:`brand-name`,children:G.value.name??`Specbook`})]}),e(`button`,{type:`button`,class:`palette-btn`,onClick:()=>q.value=!0,children:[e(`span`,{children:`Jump to an operation or flow…`}),e(`kbd`,{children:`⌘K`})]}),e(`span`,{class:`spacer`}),e(`span`,{class:`header-env`,children:e(Ra,{})}),e(`button`,{type:`button`,class:`menu-btn icon`,"aria-label":`Settings`,"aria-expanded":l,onClick:()=>u(!l),children:`⋯`}),e(`div`,{class:`header-controls ${l?`open`:``}`,children:[Q.loadFaker&&e(`span`,{class:`row muted`,title:ha.value?"Generated values such as {{faker.person.fullName}}: new on every run, or fixed so the same number always gives the same data. `specbook test --seed` reproduces a run.":`Applies when the open request or flow uses {{faker.*}}`,children:[e(`label`,{class:`row`,children:[`Generated values`,e(`select`,{"aria-label":`Generated values`,disabled:!ha.value,value:ma.value===void 0?`random`:`fixed`,onChange:e=>{ma.value=e.target.value===`fixed`?ma.value??42:void 0},children:[e(`option`,{value:`random`,children:`New each run`}),e(`option`,{value:`fixed`,children:`Fixed`})]})]}),ma.value!==void 0&&e(`input`,{type:`number`,class:`seed-input`,"aria-label":`Seed number`,title:`The same number gives the same data every run`,disabled:!ha.value,value:ma.value,onInput:e=>{let t=e.target.valueAsNumber;ma.value=Number.isFinite(t)?t:void 0}})]}),uo.value.length>1&&e(`label`,{class:`row muted`,children:[`locale`,e(`select`,{value:pa.value??``,onChange:e=>pa.value=e.target.value||void 0,children:uo.value.map(t=>e(`option`,{value:t,children:t}))})]}),e(Wa,{}),e(`label`,{class:`row`,children:[`Environment`,e(`select`,{value:X.value,onChange:e=>{let t=e.target.value;t===so?(e.target.value=X.value,va.value=!0):X.value=t},children:[Z.value.map(t=>e(`option`,{value:t,title:fa.value[t],children:t})),$.canCreateEnvironment()&&e(`option`,{value:so,children:`New environment…`})]})]}),e(Ka,{}),e(ro,{}),e(oo,{})]})]}),e(`div`,{class:`layout`,"data-view":m.kind===`home`?`splash`:`list`,children:[e(`nav`,{class:`list-col`,"aria-label":`Operations and flows`,children:e(Fa,{entries:p,services:S})}),e(Qa,{}),e(`main`,{class:`stage`,children:(m.kind===`home`||m.kind===`browse`)&&e(Ia,{services:S,counts:{flows:p.filter(e=>e.kind===`seq`).length,requests:p.filter(e=>e.kind===`req`).length}})})]}),e(no,{entries:p}),e(eo,{}),b&&m.kind===`op`&&h&&e(b.Host,{kind:`op`,modal:!1,service:h.service,op:h.op,variants:t[m.key]??[],example:m.play??``,tab:m.tab,onNavigate:w,onPrev:C.prev,onNext:C.next,onClose:x}),b&&m.kind===`seq`&&y&&e(b.Host,{kind:`seq`,modal:!1,info:y,tab:m.tab,onNavigate:w,onPrev:C.prev,onNext:C.next,onClose:x})]})}function mo(e){let[t,n]=e.split(`/`),r=Q.manifests[t]?.operations.find(e=>e.id===n);return r?{service:t,op:r}:void 0}var ho=_({});u(),(globalThis.__SPECBOOK_VIEWER__===void 0?m():Promise.resolve(!1)).then(async t=>{t||(await Ar(),f(e(po,{}),document.getElementById(`app`)))});export{bn as A,J as C,_n as D,yn as E,F,P as I,ht as L,xn as M,Rt as N,fn as O,Lt as P,ki as S,z as T,Xi as _,Q as a,Mi as b,_a as c,Z as d,ha as f,Y as g,ma as h,Ca as i,Sn as j,vn as k,ga as l,pa as m,Ra as n,wa as o,ya as p,$ as r,X as s,ho as t,fa as u,Yi as v,Zn as w,Ti as x,Ji as y};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./main-CSkB-O_8.js","./panel-9eYU7Gz6.js","./panel-hNOojwiM.css","./registry-DIHX11uY.js"])))=>i.map(i=>d[i]);
2
- var e=`specbook-oauth`;function t(t={}){let n=t.stripWhenUnclaimed??!0,r=globalThis.location;if(!r||typeof BroadcastChannel>`u`&&!globalThis.opener)return Promise.resolve(!1);let i=new URLSearchParams(r.search),a=i.get(`state`);if(!a||!(i.has(`code`)||i.has(`error`)))return Promise.resolve(!1);let o={type:`callback`,state:a,...i.get(`code`)?{code:i.get(`code`)}:{},...i.get(`error`)?{error:i.get(`error`)}:{},...i.get(`error_description`)?{description:i.get(`error_description`)}:{}},s=()=>history.replaceState(null,``,r.pathname+r.hash);return n&&s(),new Promise(t=>{let n=typeof BroadcastChannel>`u`?null:new BroadcastChannel(e),i=!1,c=e=>{i||(i=!0,clearTimeout(f),n?.close(),removeEventListener(`message`,d),t(e))},l=()=>{i||(s(),c(!0),document.body.textContent=`Signed in. You can close this window.`,window.close())},u=e=>e?.type===`ack`&&e.state===a,d=e=>{e.origin===r.origin&&u(e.data)&&l()},f=setTimeout(()=>c(!1),1500);n&&(n.onmessage=e=>u(e.data)&&l()),addEventListener(`message`,d),n?.postMessage(o);try{window.opener?.postMessage(o,r.origin)}catch{}})}var n=new URL(`worker-BmvGpsJS.js`,import.meta.url).href;function r(){let e=new URL(n,import.meta.url);if(e.origin===location.origin)return new Worker(e,{type:`module`});let t=new Blob([`import ${JSON.stringify(e.href)}`],{type:`text/javascript`});return new Worker(URL.createObjectURL(t),{type:`module`})}var i=class{worker;next=1;pending=new Map;constructor(){this.worker=r(),this.worker.addEventListener(`message`,e=>{let t=e.data,n=this.pending.get(t.id);if(n){if(`progress`in t)return n.onProgress?.(t.progress);this.pending.delete(t.id),t.ok?n.resolve(t.result):n.reject(Object.assign(Error(t.error),{code:t.code}))}})}call(e,t){let n=this.next++;return{id:n,promise:new Promise((r,i)=>{this.pending.set(n,{resolve:r,reject:i,onProgress:t}),this.worker.postMessage({...e,id:n})})}}open(e,t){let{id:n,promise:r}=this.call({type:`open`,source:e},t);return{promise:r,cancel:()=>this.worker.postMessage({type:`cancel`,id:n})}}async bundle(e){let t=await this.call({type:`bundle`,opId:e}).promise;return JSON.parse(t)}async definitions(){return JSON.parse(await this.call({type:`definitions`}).promise)}},a=`modulepreload`,o=function(e,t){return new URL(e,t).href},s={},c=function(e){return e.pathname.endsWith(`.css`)},l=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},u=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),u=i?.nonce||i?.getAttribute(`nonce`);function d(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function f(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=d(t.map(t=>{t=o(t,n);let r=f(t),i=c(r);return l(s,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:a,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,u&&t.setAttribute(`nonce`,u),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};async function d(e){let{worker:t}=e,n={open:e.result,baseUrl:e.baseUrl,source:e.shareable===!1?void 0:e.source.kind===`url`?{kind:`url`,url:e.source.url}:{kind:`text`},bundle:e=>t.bundle(e),definitions:()=>t.definitions()};globalThis.__SPECBOOK_VIEWER__=n,e.setTitle!==!1&&(document.title=`${e.result.title} · Specbook`),await u(()=>import(`./main-CSkB-O_8.js`).then(e=>e.t),__vite__mapDeps([0,1,2,3]),import.meta.url),f()}function f(){navigator.connection?.saveData||(window.requestIdleCallback??(e=>setTimeout(e,1500)))(()=>{u(()=>import(`./registry-DIHX11uY.js`).then(e=>e.loadFaker()),[],import.meta.url).catch(()=>{})})}export{t as a,e as i,u as n,i as r,d as t};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./main-CAlriyIm.js","./panel-nV09I7Wr.js","./panel-l1xvY4kI.css"])))=>i.map(i=>d[i]);
2
+ var e=`specbook-oauth`;function t(t={}){let n=t.stripWhenUnclaimed??!0,r=globalThis.location;if(!r||typeof BroadcastChannel>`u`&&!globalThis.opener)return Promise.resolve(!1);let i=new URLSearchParams(r.search),a=i.get(`state`);if(!a||!(i.has(`code`)||i.has(`error`)))return Promise.resolve(!1);let o={type:`callback`,state:a,...i.get(`code`)?{code:i.get(`code`)}:{},...i.get(`error`)?{error:i.get(`error`)}:{},...i.get(`error_description`)?{description:i.get(`error_description`)}:{}},s=()=>history.replaceState(null,``,r.pathname+r.hash);return n&&s(),new Promise(t=>{let n=typeof BroadcastChannel>`u`?null:new BroadcastChannel(e),i=!1,c=e=>{i||(i=!0,clearTimeout(f),n?.close(),removeEventListener(`message`,d),t(e))},l=()=>{i||(s(),c(!0),document.body.textContent=`Signed in. You can close this window.`,window.close())},u=e=>e?.type===`ack`&&e.state===a,d=e=>{e.origin===r.origin&&u(e.data)&&l()},f=setTimeout(()=>c(!1),1500);n&&(n.onmessage=e=>u(e.data)&&l()),addEventListener(`message`,d),n?.postMessage(o);try{window.opener?.postMessage(o,r.origin)}catch{}})}var n=new URL(`worker-13v89DyZ.js`,import.meta.url).href;function r(){let e=new URL(n,import.meta.url);if(e.origin===location.origin)return new Worker(e,{type:`module`});let t=new Blob([`import ${JSON.stringify(e.href)}`],{type:`text/javascript`});return new Worker(URL.createObjectURL(t),{type:`module`})}var i=class{worker;next=1;pending=new Map;constructor(){this.worker=r(),this.worker.addEventListener(`message`,e=>{let t=e.data,n=this.pending.get(t.id);if(n){if(`progress`in t)return n.onProgress?.(t.progress);this.pending.delete(t.id),t.ok?n.resolve(t.result):n.reject(Object.assign(Error(t.error),{code:t.code}))}})}call(e,t){let n=this.next++;return{id:n,promise:new Promise((r,i)=>{this.pending.set(n,{resolve:r,reject:i,onProgress:t}),this.worker.postMessage({...e,id:n})})}}open(e,t){let{id:n,promise:r}=this.call({type:`open`,source:e},t);return{promise:r,cancel:()=>this.worker.postMessage({type:`cancel`,id:n})}}async bundle(e){let t=await this.call({type:`bundle`,opId:e}).promise;return JSON.parse(t)}async definitions(){return JSON.parse(await this.call({type:`definitions`}).promise)}},a=`modulepreload`,o=function(e,t){return new URL(e,t).href},s={},c=function(e){return e.pathname.endsWith(`.css`)},l=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},u=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),u=i?.nonce||i?.getAttribute(`nonce`);function d(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function f(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=d(t.map(t=>{t=o(t,n);let r=f(t),i=c(r);return l(s,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:a,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,u&&t.setAttribute(`nonce`,u),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};async function d(e){let{worker:t}=e,n={open:e.result,baseUrl:e.baseUrl,defaultEnv:e.defaultEnv,setTitle:e.setTitle,source:e.shareable===!1?void 0:e.source.kind===`url`?{kind:`url`,url:e.source.url}:{kind:`text`},bundle:e=>t.bundle(e),definitions:()=>t.definitions()};globalThis.__SPECBOOK_VIEWER__=n,e.setTitle!==!1&&(document.title=`${e.result.title} · Specbook`),await u(()=>import(`./main-CAlriyIm.js`).then(e=>e.t),__vite__mapDeps([0,1,2]),import.meta.url)}export{t as a,e as i,u as n,i as r,d as t};
@@ -0,0 +1 @@
1
+ .prism-code-editor{background:var(--pce-bg);--_pse:var(--padding-inline,.75em);--_ns:var(--number-spacing,.75em);--padding-left:var(--_pse);--_sp:0px;scroll-padding:var(--_sp);-webkit-user-select:none;user-select:none;isolation:isolate;white-space:pre;line-height:1.4;display:grid;overflow:auto}.show-line-numbers{--padding-left:calc(var(--_pse) + var(--number-width) + var(--_ns));scroll-padding-left:calc(var(--padding-left) + var(--_sp));counter-reset:line;grid:1fr/0 1fr}.pce-focus{--_sp:var(--pce-scroll-padding,2ch)}.pce-wrapper{pointer-events:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;margin:.5em 0;position:relative}.pce-textarea{all:unset;box-sizing:border-box;color:#0000;-webkit-user-select:auto;user-select:auto;pointer-events:auto;width:100%;height:100%;caret-color:var(--pce-cursor);overflow:hidden}.pce-textarea::selection{color:#0000}.pce-wrapper ::selection{background:var(--pce-selection)}.pce-no-selection textarea:focus{z-index:1}.pce-line,.pce-textarea{padding:0 var(--_pse) 0 var(--padding-left);position:relative}.show-line-numbers .pce-line:before{counter-increment:line;content:counter(line);margin:0 0 0 calc(-1 * var(--padding-left));padding:0 var(--_ns) 0 0;box-sizing:border-box;color:var(--pce-line-number);text-align:end;display:inline-block}.show-line-numbers:before{content:"";background:inherit;pointer-events:none}.show-line-numbers:before,.pce-line:before{z-index:2;height:100%;width:var(--padding-left);position:sticky;left:0}.pce-wrap .pce-line:before{margin:0;position:absolute}.pce-overlays,.pce-overlays>*,pre.pce-guides .pce-line:after,.pce-no-selection .active-line:after,.active-line.match-highlight:after{content:"";position:absolute;inset:0}.show-line-numbers .pce-line:after{left:var(--padding-left)}.active-line:after{border:var(--pce-border-highlight);background:var(--pce-bg-highlight);z-index:-2}.pce-wrap{white-space:pre-wrap;white-space:break-spaces;word-break:break-word}.selection-matches span{background:var(--pce-selection-match)}.pce-nowrap .active-bracket{display:inline-block}.pce-ac-wrapper button{all:unset;cursor:pointer}.pce-ac-top{grid:"d"minmax(3em,1fr)"t"minmax(auto,max-content)/auto}.pce-ac-bottom{grid:"t"minmax(auto,max-content)"d"minmax(3em,1fr)/auto}.pce-ac-bottom-end{grid:"t d"".d"3em/auto auto}.pce-ac-bottom-start{grid:"d t""d."3em/auto auto}.pce-ac-top-end{grid:".d"3em"t d"/auto auto}.pce-ac-top-start{grid:"d."3em"d t"/auto auto}.pce-ac-content{padding:.25em .3em}.pce-ac-docs,.pce-ac-docs pre{white-space:pre-wrap;white-space:break-spaces;word-break:break-word}.pce-ac-docs pre,.pce-ac-docs code{font:inherit;margin:0}.pce-ac-top .pce-ac-docs{margin-block:0 -1px}.pce-ac-bottom .pce-ac-docs{margin-block:-1px 0}.pce-ac-top-start .pce-ac-docs,.pce-ac-bottom-start .pce-ac-docs{inset-inline-end:-1px}.pce-ac-top-end .pce-ac-docs,.pce-ac-bottom-end .pce-ac-docs{margin-inline:-1px 0}.pce-ac-top-start .pce-ac-docs,.pce-ac-bottom-start .pce-ac-docs,.pce-ac-top-end .pce-ac-docs,.pce-ac-bottom-end .pce-ac-docs{width:20em;max-height:100%;position:absolute}.pce-ac-top-start .pce-ac-docs,.pce-ac-top-end .pce-ac-docs{bottom:0}button.pce-ac-toggle{place-items:center;width:1.26em;height:1.4em;display:grid;position:absolute;inset-inline-end:.2em}.pce-ac-toggle:after{content:"";clip-path:polygon(50% 28.96%,0% 63.96%,10.1% 71.04%,50% 43.11%,89.9% 71.04%,100% 63.96%);width:.7em;height:1em;transform:rotate(90deg)}button.pce-ac-close{float:inline-end;place-items:center;width:1.3em;height:1.3em;display:grid}.pce-ac-close:after{content:"";clip-path:polygon(50% 44.34%,0% 74.34%,9.43% 80%,9.43% 20%,0% 25.66%,50% 55.66%,100% 25.66%,90.57% 20%,50% 44.34%,9.43% 20%,9.43% 80%,50% 55.66%,90.57% 80%,100% 74.34%);background:currentColor;width:.6em;height:1em}.pce-ac-wrapper{pointer-events:auto;display:grid;position:sticky;left:.5em;right:.5em}.pce-ac-wrapper>div{border:1px solid var(--pce-widget-border);background:var(--pce-widget-bg);box-sizing:border-box;border-radius:.2em;overflow:auto}.pce-ac-docs{-webkit-user-select:text;user-select:text;outline:0;grid-area:d;max-height:min(100% + 1px,17em)}.pce-ac-tooltip{white-space:pre;grid-area:t;height:100%;max-height:17em}.pce-ac-tooltip>ul{box-sizing:border-box;padding:0;overflow:hidden}.pce-ac-row{cursor:pointer;align-items:center;gap:.5em;height:1.4em;padding:0 .2em;display:flex;position:relative}.pce-ac-label span{color:var(--pce-ac-match,#52b1ff)}.pce-ac-label{flex-grow:1}.pce-ac-label,.pce-ac-details span{text-overflow:ellipsis;overflow-x:hidden}.pce-ac-details{opacity:.75;flex-shrink:4;max-width:70%;font-size:90%;display:flex}.pce-ac-details:has(:empty){display:none}.pce-ac-row:hover:has(button) .pce-ac-details span{width:calc(100% - 1.4em)}.pce-ac-row:hover:has(button):has(.pce-ac-details :empty){padding-inline:.2em 1.46em}.pce-ac-row:hover .pce-ac-toggle:after{background:currentColor}@media (hover:hover){.pce-ac-row:hover{background:#7772}}.pce-ac-row[aria-selected]{color:var(--pce-widget-color-active);background:#1094ff36}.pce-tabstops span{background:var(--pce-tabstop,#7c7c7c4d)}.pce-tabstops :empty{margin:0 -1px;padding:0 1px}.pce-ac-icon{flex-shrink:0;align-items:center;margin-right:-.25em;display:flex}.pce-ac-icon:before{content:"";width:16px;height:16px;-webkit-mask:no-repeat var(--mask);-webkit-mask:no-repeat var(--mask);mask:no-repeat var(--mask);background:currentColor}.pce-ac-row[aria-selected] .pce-ac-icon:before{color:var(--pce-widget-color-active)}.pce-ac-icon-namespace{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" d=\"m6 2.5a2 2 0 00-2 2V6a2 2 0 01-2 2 2 2 0 012 2v1.5a2 2 0 002 2m4-11a2 2 0 012 2V6a2 2 0 002 2 2 2 0 00-2 2v1.5a2 2 0 01-2 2\"/></svg>")}.pce-ac-icon-unit{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" stroke-linejoin=\"bevel\" d=\"m3.5 1.5h9v13h-9zm.5 2h4m-4 3h2m-2 3h4m-4 3h2\"/></svg>")}.pce-ac-icon-parameter{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\" stroke=\"red\" fill=\"none\"><path stroke-linejoin=\"bevel\" d=\"m3.3 6.2L1.5 8l1.8 1.8m9.4 0 1.8-1.8-1.8-1.8\"/><path d=\"m5.5 6V4.5h5V6M8 5v6.5h1.5-3m.5 0a1 1 0 001-1 1 1 0 001 1m1.5-6a1 1 0 00-1-1m-3 0a1 1 0 00-1 1\"/></svg>")}.pce-ac-icon-snippet{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" stroke-linejoin=\"bevel\" d=\"m2.5 13V1.5h12V13M2 14.5h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1m1 0h1\"/></svg>")}.pce-ac-icon-enum{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m2 7h6l1 1v5l-1 1H2l-1-1V8zv6h6V8H2zm1 2h4v1H3zm0 2h4v1H3zm4-5V3l1-1h6l1 1v5l-1 1h-4V8h4V3H8v3zm2-2h4v1H9zm0 2h4v1H9.41L9 6.59z\"/></svg>")}.pce-ac-icon-interface{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" d=\"m4 8h4.5a3 3 0 016 0 3 3 0 01-6 0\"/><circle cx=\"3\" cy=\"8\" r=\"2\"/></svg>")}.pce-ac-icon-constant{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" stroke-linejoin=\"bevel\" d=\"m1.5 3.5h13v9h-13zm2.5 3h8m0 3H4\"/></svg>")}.pce-ac-icon-class{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" stroke-linejoin=\"bevel\" d=\"m5.5 1.5 2 2-4 4-2-2 4-4zm0 4v7h5.5m-.5.5 2.5-2.5 1.5 1.5-2.5 2.5zm-5-5.5h5.5m-.5.5 2.5-2.5 1.5 1.5-2.5 2.5z\"/></svg>")}.pce-ac-icon-property{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" d=\"m7.24 6.86a3.8 3.8 0 015.02-5.02l-2.8 2.8 1.9 1.9 2.8-2.8a3.8 3.8 0 01-5.02 5.02l-5.35 5.35a.95.95 0 01-1.9-1.9z\"/></svg>")}.pce-ac-icon-variable{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" stroke-linejoin=\"bevel\" d=\"m4 4.5H1.5v8H4m8 0h2.5v-8H12m-3 1L11.5 7v2.5l-4.5 2L4.5 10V7.5zm-4.5 2L7 9v2.5M7 9l4.5-2\"/></svg>")}.pce-ac-icon-function{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" stroke-linejoin=\"bevel\" d=\"m8 1.25l5.5 3.3v6.6l-5.5 3.3-5.5-3.3v-6.6zM2.5 4.85l5.5 3v6.5m0-6.5l5.5-3\"/></svg>")}.pce-ac-icon-keyword{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" d=\"m1.5 2.5h6v2h-6zm8.5 1h5m-14 4h11m-11 3h6m3 0h5m-3 3h2m-13 0h9\"/></svg>")}.pce-ac-icon-text{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" d=\"m1.55 7a1.2 1.2 0 011.2-.8h.6a1.2 1.2 0 011.2 1.2v3.72m0-3.09-2 .3a1.2 1.2 0 000 2.39h.1a1.9 1.9 0 001.9-2m1.7-5.2v7.6m1.85-.4a1.85 2.3 0 010-4.6 1.85 2.3 0 010 4.6m6.6-.8a1.85 2.3 0 110-3\"/></svg>")}.pce-ac-icon-event{--mask:url("data:image/svg+xml,<svg viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path stroke=\"red\" fill=\"none\" stroke-linejoin=\"bevel\" d=\"m3.9 14.1 2.5-4.6H3.55l3.9-8h4.53l-3.29 5h3.97l-7.97 8.17\"/></svg>")}@layer reset{*,:before,:after{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit;color:inherit}}@layer tokens{:root,:host{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--sb-bg:#f8fafc;--sb-surface:#fff;--sb-surface-raised:#f1f5f9;--sb-border:#e2e8f0;--sb-text:#0f172a;--sb-text-muted:#64748b;--sb-accent:#2563eb;--sb-accent-hover:#1d4ed8;--sb-text-on-accent:#fff;--sb-focus-ring:#93c5fd;--sb-info:#0369a1;--sb-success:#15803d;--sb-success-subtle:#dcfce7;--sb-danger:#b91c1c;--sb-text-on-danger:#fff;--sb-danger-subtle:#fee2e2;--sb-warning:#b45309;--sb-warning-subtle:#fef3c7;--sb-method-get:#0369a1;--sb-method-post:#15803d;--sb-method-put:#b45309;--sb-method-patch:#7c3aed;--sb-method-delete:#b91c1c;--sb-code-bg:#f8fafc;--sb-code-line:#e8eefc;--sb-code-key:#0369a1;--sb-code-string:#15803d;--sb-code-number:#b45309;--sb-code-literal:#7c3aed;--sb-code-keyword:#2563eb;--sb-code-comment:#64748b;--sb-code-punct:#475569;--sb-font-sans:system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--sb-font-mono:ui-monospace, "SF Mono", Menlo, Consolas, monospace;--sb-radius-control:6px;--sb-radius-card:10px;--sb-space-1:4px;--sb-space-2:8px;--sb-space-3:12px;--sb-space-4:16px;--sb-space-6:24px}@media (prefers-color-scheme:dark){:root:not([data-theme=light]),:host(:not([data-theme=light])){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--sb-bg:#0b1020;--sb-surface:#111827;--sb-surface-raised:#1e293b;--sb-border:#243049;--sb-text:#e5e7eb;--sb-text-muted:#94a3b8;--sb-accent:#3b82f6;--sb-accent-hover:#60a5fa;--sb-text-on-accent:#0b1020;--sb-focus-ring:#1d4ed8;--sb-success:#4ade80;--sb-success-subtle:#052e16;--sb-danger:#f87171;--sb-text-on-danger:#0b1020;--sb-danger-subtle:#450a0a;--sb-warning:#fbbf24;--sb-warning-subtle:#422006;--sb-method-get:#38bdf8;--sb-method-post:#4ade80;--sb-method-put:#fbbf24;--sb-method-patch:#a78bfa;--sb-method-delete:#f87171;--sb-code-bg:#0f172a;--sb-code-line:#1e2a4a;--sb-code-key:#38bdf8;--sb-code-string:#4ade80;--sb-code-number:#fbbf24;--sb-code-literal:#a78bfa;--sb-code-keyword:#60a5fa;--sb-code-comment:#94a3b8;--sb-code-punct:#94a3b8}}:root[data-theme=dark],:host([data-theme=dark]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--sb-bg:#0b1020;--sb-surface:#111827;--sb-surface-raised:#1e293b;--sb-border:#243049;--sb-text:#e5e7eb;--sb-text-muted:#94a3b8;--sb-accent:#3b82f6;--sb-accent-hover:#60a5fa;--sb-text-on-accent:#0b1020;--sb-focus-ring:#1d4ed8;--sb-success:#4ade80;--sb-success-subtle:#052e16;--sb-danger:#f87171;--sb-text-on-danger:#0b1020;--sb-danger-subtle:#450a0a;--sb-warning:#fbbf24;--sb-warning-subtle:#422006;--sb-method-get:#38bdf8;--sb-method-post:#4ade80;--sb-method-put:#fbbf24;--sb-method-patch:#a78bfa;--sb-method-delete:#f87171;--sb-code-bg:#0f172a;--sb-code-line:#1e2a4a;--sb-code-key:#38bdf8;--sb-code-string:#4ade80;--sb-code-number:#fbbf24;--sb-code-literal:#a78bfa;--sb-code-keyword:#60a5fa;--sb-code-comment:#94a3b8;--sb-code-punct:#94a3b8}}@layer base{html,body,#app{height:100%}body{background:var(--sb-bg);color:var(--sb-text);font:14px / 1.5 var(--sb-font-sans)}code,pre,kbd{font-family:var(--sb-font-mono);font-size:12.5px}kbd{border:1px solid var(--sb-border);background:var(--sb-surface-raised);color:var(--sb-text-muted);border-radius:4px;padding:1px 6px}h1,h2,h3,p{margin:0}h1{letter-spacing:-.01em;font-size:22px;font-weight:650}h2{letter-spacing:.04em;text-transform:uppercase;color:var(--sb-text-muted);font-size:13px;font-weight:600}html,body{overscroll-behavior:none}:focus-visible{outline:2px solid var(--sb-focus-ring);outline-offset:1px}}@layer components{.app{flex-direction:column;height:100%;display:flex}@supports (height:100dvh){.app{height:100dvh}}.header{align-items:center;gap:var(--sb-space-4);height:var(--sb-header-h,53px);padding:8px var(--sb-space-4);background:var(--sb-surface);border-bottom:1px solid var(--sb-border);flex-wrap:wrap;flex:none;display:flex}.brand{letter-spacing:-.01em;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;font-size:15px;font-weight:700;display:inline-flex}.spacer{flex:1}.row{gap:var(--sb-space-3);flex-wrap:wrap;align-items:center;display:flex}.muted{color:var(--sb-text-muted)}.count{opacity:.7;margin-left:4px;font-weight:400}.app{--sb-list-w:clamp(320px, 28vw, 440px)}.layout{grid-template-columns:var(--sb-list-w) minmax(0, 1fr);flex:1;min-height:0;display:grid}.list-col,.stage,.panel-body,.panel-main.scroll,.tab-pane,.seq-left{scrollbar-width:thin;scrollbar-color:var(--sb-border) transparent}.list-col{scrollbar-gutter:stable;overscroll-behavior:contain;min-height:0;padding:var(--sb-space-3);background:var(--sb-surface);border-right:1px solid var(--sb-border);overflow:auto}.stage{min-height:0;padding:var(--sb-space-6) 32px 96px;overflow:auto}@media (max-width:900px){.layout{grid-template-columns:minmax(0,1fr)}.stage,.layout[data-view=splash] .list-col{display:none}.layout[data-view=splash] .stage{padding:var(--sb-space-6) var(--sb-space-4);justify-content:center;align-items:center;display:flex}.layout[data-view=splash] .overview{min-height:0;padding-bottom:6vh}}.overview .overview-browse{display:none}@media (max-width:820px){.overview .overview-browse{min-height:48px;padding-block:0;padding-inline:var(--sb-space-6);text-align:center;justify-content:center;align-items:center;font-size:16px;line-height:1.2;display:inline-flex}.overview-hint,.overview-keys{display:none}}.header-env{display:none}.header-controls{display:contents}.header .menu-btn{width:36px;height:36px;font-size:20px;line-height:1;display:none}.theme-toggle{border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);width:32px;height:32px;color:var(--sb-text)}.brand-logo{object-fit:contain;width:auto;max-width:120px;height:24px}.seed-input{width:80px}.palette-btn{justify-content:space-between;align-items:center;gap:var(--sb-space-6);border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-bg);min-width:min(360px,40vw);color:var(--sb-text-muted);cursor:pointer;padding:6px 10px;display:flex}.palette-btn:hover{border-color:var(--sb-text-muted)}.palette-backdrop{z-index:20;background:#0f172a66;justify-content:center;padding-top:14vh;display:flex;position:fixed;inset:0}.palette-dismiss{cursor:default;background:0 0;border:0;padding:0;position:absolute;inset:0}.palette{background:var(--sb-surface);border:1px solid var(--sb-border);border-radius:var(--sb-radius-card);flex-direction:column;width:min(620px,92vw);max-height:60vh;display:flex;position:relative;overflow:hidden;box-shadow:0 20px 50px #00000040}.palette input{border:0;border-bottom:1px solid var(--sb-border);border-radius:0;outline:none;padding:14px 16px;font-size:15px}.newenv-backdrop{z-index:60}.newenv{align-self:flex-start}.newenv form{gap:var(--sb-space-2);padding:var(--sb-space-4);flex-direction:column;display:flex}.newenv h2{margin:0;font-size:15px}.newenv label{flex-direction:column;gap:4px;display:flex}.newenv input,.newenv select{border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);padding:8px 10px;font-size:16px}.palette ul{margin:0;padding:6px;list-style:none;overflow:auto}.palette li button{justify-content:space-between;gap:var(--sb-space-3);border-radius:var(--sb-radius-control);text-align:left;cursor:pointer;background:0 0;border:0;width:100%;padding:8px 10px;display:flex}.palette li button.sel{background:var(--sb-surface-raised)}.pad{padding:12px}.states{gap:var(--sb-space-2);margin-bottom:var(--sb-space-4);flex-wrap:wrap;align-items:center;display:flex}.state{border:1px solid var(--sb-border);background:var(--sb-surface);cursor:pointer;border-radius:999px;align-items:center;gap:6px;padding:3px 10px;font-size:12px;display:inline-flex}.state span{color:var(--sb-text-muted)}table.headers{border-collapse:collapse;width:100%;font-size:12px}table.headers th{text-align:left;font-family:var(--sb-font-mono);color:var(--sb-text-muted);vertical-align:top;padding:3px 12px 3px 0}table.headers td{word-break:break-all}.state.s2{border-color:var(--sb-success)}.state.s4,.state.s5{border-color:var(--sb-warning)}.state.forced{background:var(--sb-accent);border-color:var(--sb-accent);color:var(--sb-text-on-accent)}.state.forced span{color:inherit}.state.last:before{content:"●";color:var(--sb-success);font-size:8px}.tabs{border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);display:inline-flex;overflow:hidden}.tabs .tab{cursor:pointer;background:0 0;border:0;padding:3px 12px}.tabs .tab.on{background:var(--sb-surface-raised);font-weight:600}.lock{margin-bottom:var(--sb-space-3)}.state-badge{border-radius:999px;padding:2px 10px;font-size:12px;font-weight:600}.state-badge.s2{background:var(--sb-success-subtle);color:var(--sb-success)}.state-badge.s3{background:var(--sb-surface-raised)}.state-badge.s4,.state-badge.s5{background:var(--sb-warning-subtle);color:var(--sb-warning)}.conf{font-size:12px;font-weight:600}.conf.ok{color:var(--sb-success)}.conf.warn{color:var(--sb-warning)}.conf.none{color:var(--sb-text-muted);font-weight:400}.checks{margin:var(--sb-space-3) 0 0;padding:var(--sb-space-3) 0 0;border-top:1px solid var(--sb-border);list-style:none}.checks .ok{color:var(--sb-text-muted)}.checks .ok .tick{color:var(--sb-success)}.checks .bad,.error-text{color:var(--sb-danger)}.journey{margin:0;padding:0;list-style:none}.jstep{gap:var(--sb-space-3);padding-bottom:var(--sb-space-4);grid-template-columns:28px minmax(0,1fr);display:grid;position:relative}.jstep:before{content:"";background:var(--sb-border);width:2px;position:absolute;top:28px;bottom:0;left:13px}.jstep:last-child:before{display:none}.jmark{background:var(--sb-surface-raised);border:2px solid var(--sb-border);border-radius:50%;place-items:center;width:28px;height:28px;font-size:12px;font-weight:700;display:grid}.jstep.pass .jmark{background:var(--sb-success-subtle);border-color:var(--sb-success);color:var(--sb-success)}.jstep.fail .jmark,.jstep.error .jmark{background:var(--sb-danger-subtle);border-color:var(--sb-danger);color:var(--sb-danger)}.jstep.paused .jmark,.jstep.running .jmark{border-color:var(--sb-accent);color:var(--sb-accent)}.jstep.skipped{opacity:.6}.jhead{gap:var(--sb-space-3);text-align:left;cursor:pointer;background:0 0;border:0;flex-wrap:wrap;align-items:baseline;padding:2px 0;display:flex}.jhead:disabled{cursor:default}.jname{font-weight:600}.cap{background:var(--sb-surface-raised);color:var(--sb-text-muted);border-radius:999px;padding:1px 8px;font-size:12px}.cap b{color:var(--sb-text);font-weight:600}.cap em{opacity:.8;font-style:normal}.cap.use{background:var(--sb-warning-subtle);color:var(--sb-warning)}.cap.make{background:var(--sb-success-subtle);color:var(--sb-success)}.pause{margin-top:var(--sb-space-3);padding:var(--sb-space-3);border-left:3px solid var(--sb-accent);background:var(--sb-bg);border-radius:var(--sb-radius-control)}.btn{border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-surface);cursor:pointer;padding:6px 14px}.btn:hover{background:var(--sb-surface-raised)}.btn.primary{background:var(--sb-accent);border-color:var(--sb-accent);color:var(--sb-text-on-accent);font-weight:600}.btn.primary:hover{background:var(--sb-accent-hover)}.btn:disabled{opacity:.55;cursor:default}input[type=text],input[type=number],input[type=date],select,textarea.val{border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-surface);padding:5px 8px}.field{margin-bottom:var(--sb-space-3);gap:4px;display:grid}.field>.label{font-size:12px;font-weight:600}.nested{border-left:2px solid var(--sb-border);padding-left:var(--sb-space-3)}.method{font:700 11px var(--sb-font-mono);background:var(--sb-surface-raised);border-radius:4px;padding:1px 6px}.method.GET{color:var(--sb-method-get)}.method.POST{color:var(--sb-method-post)}.method.PUT{color:var(--sb-method-put)}.method.PATCH{color:var(--sb-method-patch)}.method.DELETE{color:var(--sb-method-delete)}.badge{border-radius:999px;padding:1px 8px;font-size:12px;font-weight:600}.badge.pass{background:var(--sb-success-subtle);color:var(--sb-success)}.badge.fail,.badge.error{background:var(--sb-danger-subtle);color:var(--sb-danger)}@media (max-width:900px){.header{gap:var(--sb-space-3);flex-wrap:nowrap;position:relative}.brand{flex:0 auto;min-width:0}.brand-logo{flex:none}.brand-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@media (min-width:360px){.brand{flex:none}.brand-name{max-width:9ch}.header .palette-btn{min-width:64px}}.palette-btn{flex:1;min-width:0}.palette-btn span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.palette-btn kbd,.header>.spacer{display:none}.header .menu-btn{flex:none;justify-content:center;align-items:center;display:inline-flex}.header-env{flex:none;display:inline-flex}.header-controls{top:100%;right:var(--sb-space-2);left:var(--sb-space-2);z-index:30;align-items:stretch;gap:var(--sb-space-3);padding:var(--sb-space-4);border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-surface);box-shadow:0 12px 32px color-mix(in srgb, var(--sb-text) 18%, transparent);flex-direction:column;display:none;position:absolute}.header-controls.open{display:flex}.header-controls .row{flex-wrap:nowrap;justify-content:space-between}.header-controls .row>select{flex:0 0 56%;width:56%;min-width:0}.header-controls .row>.row{flex:100%}.header-controls .row.muted{flex-wrap:wrap}.header-controls .seed-input{flex:0 0 56%;margin-left:auto}.header-controls .envmenu,.header-controls .envmenu-btn{width:100%}.header-controls .envmenu-btn{justify-content:center;align-items:center;gap:var(--sb-space-2);display:flex}.header-controls .gh-label,.header-controls .share-label,.header-controls .envmenu-label{display:inline}.header-controls .gh-star,.header-controls .share>.btn{justify-content:flex-start;width:100%}.list-col{padding:var(--sb-space-2)}}@media (max-width:820px){input,select,textarea{font-size:16px!important}}.share{position:relative}.share-pop{z-index:40;gap:var(--sb-space-3);width:min(360px,90vw);padding:var(--sb-space-3);background:var(--sb-surface);border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);box-shadow:0 12px 32px color-mix(in srgb, var(--sb-text) 18%, transparent);display:grid;position:absolute;top:calc(100% + 6px);right:0}.share-pop p{margin:0}.share-link{width:100%;min-width:0;font-size:12px}.share-actions{gap:var(--sb-space-2);flex-wrap:wrap;display:flex}.share-targets{gap:var(--sb-space-3);flex-wrap:wrap;margin:0;padding:0;list-style:none;display:flex}.share-targets a{color:var(--sb-accent)}@media (max-width:820px){.share-pop{width:auto;position:static}}.powered-by{margin:var(--sb-space-6) 0 0;font-size:12px}.powered-by a{color:var(--sb-text-muted);text-decoration:none}.powered-by a:hover{color:var(--sb-accent);text-decoration:underline}.header{flex-wrap:nowrap}.palette-btn{flex:180px;min-width:120px;max-width:360px}@media (max-width:1360px){.gh-label,.share-label,.envmenu-label{display:none}}.gh-star{color:var(--sb-text)}.share>.btn,.gh-star{white-space:nowrap;align-items:center;gap:6px;text-decoration:none;display:inline-flex}.doc{max-width:900px;margin:0 auto;line-height:1.6}.doc-head{justify-content:space-between;align-items:center;gap:var(--sb-space-4);display:flex}.doc h1{letter-spacing:-.02em;margin:0;font-size:26px}.doc h2{margin:var(--sb-space-6) 0 var(--sb-space-2);text-transform:uppercase;letter-spacing:.06em;color:var(--sb-text-muted);font-size:11px}.doc .endpoint{align-items:center;gap:var(--sb-space-3);margin:var(--sb-space-3) 0 var(--sb-space-4);padding:8px var(--sb-space-3);border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-surface);display:flex}.doc .endpoint .method{font-size:12px}.doc .btn.primary{height:36px;padding:0 18px}.doc-custom blockquote{margin:var(--sb-space-3) 0;padding:var(--sb-space-1) var(--sb-space-3);border-left:3px solid var(--sb-border);color:var(--sb-text-muted)}.doc-custom :is(h1,h2,h3){margin-top:var(--sb-space-4)}.doc-custom pre,.doc code{font-family:var(--sb-font-mono);font-size:12.5px}table.fields{border-collapse:separate;border-spacing:0;border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-surface);width:100%;font-size:13px;overflow:hidden}table.fields th{text-align:left;color:var(--sb-text-muted);letter-spacing:.04em;text-transform:uppercase;background:var(--sb-surface-raised);border-bottom:1px solid var(--sb-border);padding:7px 12px;font-size:11px;font-weight:600}table.fields td{border-bottom:1px solid var(--sb-border);vertical-align:top;padding:8px 12px}table.fields tr:last-child td{border-bottom:0}.statuses,.examples,.steps{padding-left:var(--sb-space-4);margin:0}.statuses{padding:0;list-style:none}.req{color:var(--sb-danger);margin-left:2px}.chip{background:var(--sb-surface-raised);color:var(--sb-text-muted);font:11px var(--sb-font-mono);border-radius:4px;padding:0 6px;display:inline-block}.chip.req{background:var(--sb-danger-subtle);color:var(--sb-danger);margin:0}.chip.warn{background:var(--sb-warning-subtle);color:var(--sb-warning)}.icon{cursor:pointer;color:var(--sb-text-muted);background:0 0;border:0;padding:2px 6px;font-size:16px;line-height:1}.panel-backdrop{background:color-mix(in srgb, var(--sb-text) 35%, transparent);cursor:default;z-index:20;border:0;padding:0;position:fixed;inset:0}.panel{background:var(--sb-surface);border-left:1px solid var(--sb-border);width:75vw;min-width:min(560px,100vw);box-shadow:-12px 0 32px color-mix(in srgb, var(--sb-text) 18%, transparent);z-index:21;flex-direction:column;animation:.16s ease-out panel-in;display:flex;position:fixed;inset:0 0 0 auto}@keyframes panel-in{0%{opacity:0;transform:translate(24px)}}@media (prefers-reduced-motion:reduce){.panel{animation:none}}.panel-head{align-items:center;gap:var(--sb-space-3);padding:var(--sb-space-3) var(--sb-space-4);border-bottom:1px solid var(--sb-border);background:var(--sb-surface);display:flex}.panel-title{min-width:0}.panel-head h2{letter-spacing:0;text-transform:none;color:var(--sb-text);margin:0;font-size:15px;font-weight:650}.panel-head .method{padding:3px 8px;font-size:12px}.panel-body{overscroll-behavior:contain;min-height:0;padding:var(--sb-space-4);background:var(--sb-bg);flex:1;overflow:auto}.panel-body.flush{background:var(--sb-surface);padding:0;overflow:hidden}.section-head{align-items:center;gap:var(--sb-space-3);margin-bottom:var(--sb-space-2);flex-wrap:wrap;display:flex}.section-head h3,.grid h3{margin:0 0 var(--sb-space-2);text-transform:uppercase;letter-spacing:.06em;color:var(--sb-text-muted);font-size:11px}.section-head h3{margin:0}.saved-note{align-items:flex-start;gap:var(--sb-space-2);margin:0 var(--sb-space-4) var(--sb-space-3);padding:var(--sb-space-2) var(--sb-space-3);border-radius:var(--sb-radius-control);background:var(--sb-success-subtle);color:var(--sb-success);font-size:12.5px;display:flex}.saved-note span{flex:1}.saved-note code{word-break:break-all;background:0 0;font-weight:600}.naming{padding:0 var(--sb-space-4) var(--sb-space-3)}.lock{padding:0 var(--sb-space-4) var(--sb-space-3);margin:0}.panel.docked{inset:var(--sb-header-h,53px) 0 0 var(--sb-list-w);width:auto;min-width:0;box-shadow:-8px 0 24px color-mix(in srgb, var(--sb-text) 10%, transparent);animation:none}.stepper{display:inline-flex}.stepper .icon:disabled{opacity:.35;cursor:default}.panel-split{flex-direction:column;height:100%;min-height:0;display:flex}.panel-tabs{background:var(--sb-surface);flex:none}.panel-main{flex:1;min-height:0;overflow:hidden}.panel-main.scroll{overscroll-behavior:contain;padding:var(--sb-space-4) var(--sb-space-6) var(--sb-space-6);overflow:auto}.doc-intro{align-items:center;gap:var(--sb-space-3);margin-bottom:var(--sb-space-4);padding:8px var(--sb-space-3);border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-surface);display:flex}.doc-intro .method{font-size:12px}.catalog{container-type:inline-size}.cat-top{gap:var(--sb-space-3);margin-bottom:var(--sb-space-3);display:grid}.pills{gap:var(--sb-space-2);flex-wrap:wrap;display:flex}.pill{border:1px solid var(--sb-border);background:var(--sb-surface);color:var(--sb-text);cursor:pointer;border-radius:999px;align-items:center;gap:6px;padding:3px 11px;font-size:13px;display:inline-flex}.pill:hover{border-color:var(--sb-text-muted)}.pill.on{background:var(--sb-accent);border-color:var(--sb-accent);color:var(--sb-text-on-accent)}.pill .count{margin:0;font-size:11px}.cat-filter-wrap{position:relative}.cat-filter{width:100%;padding-right:34px}.cat-hint{pointer-events:none;position:absolute;top:50%;right:8px;transform:translateY(-50%)}.group-head.static{cursor:default;color:var(--sb-text-muted);letter-spacing:.06em;text-transform:uppercase;padding-left:20px;font-size:11px}.method.flow{color:var(--sb-accent)}.flows{margin-bottom:var(--sb-space-4);border:1px solid color-mix(in srgb, var(--sb-accent) 28%, var(--sb-border));border-left:3px solid var(--sb-accent);border-radius:var(--sb-radius-control);background:color-mix(in srgb, var(--sb-accent) 6%, transparent);overflow:hidden}.flows-title{align-items:center;gap:var(--sb-space-2);padding:8px;display:flex}.panel-error{margin:var(--sb-space-4);padding:var(--sb-space-4);border:1px solid var(--sb-border);border-left:3px solid var(--sb-danger,#dc2626);border-radius:var(--sb-radius-card);background:var(--sb-surface)}.panel-error pre{margin:var(--sb-space-2) 0 var(--sb-space-3);white-space:pre-wrap;overflow-wrap:anywhere;font:12px var(--sb-font-mono);color:var(--sb-text-muted)}button.flows-title{width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0}@media (pointer:coarse){button.flows-title{min-height:44px}}button.flows-title:hover{background:var(--sb-surface-raised)}button.flows-title:focus-visible{outline:2px solid var(--sb-focus-ring);outline-offset:-2px}.flows-title .caret{width:1em;color:var(--sb-text-muted)}.flows-title .count{color:var(--sb-text-muted);margin-left:auto;font-size:12px}.flows .flow-head{color:var(--sb-text-muted);padding-left:8px;font-size:12px}.flows .op-row:last-child{border-bottom:0}.flows.requests{border-color:var(--sb-border);border-left-color:var(--sb-text-muted);background:var(--sb-surface-raised)}.method.req{color:var(--sb-text-muted)}.req-tag{margin-left:6px;font-size:11px;font-weight:500}.flow-play{text-align:center;color:var(--sb-accent);font-size:10px}.overview{place-content:center;justify-items:center;gap:var(--sb-space-2);text-align:center;min-height:100%;color:var(--sb-text-muted);padding-bottom:8vh;display:grid}.overview .overview-name{letter-spacing:.1em;text-transform:uppercase;color:var(--sb-accent);margin:0;font-size:12px;font-weight:700}.overview h1{margin:0 0 var(--sb-space-2);letter-spacing:-.02em;color:var(--sb-text);font-size:26px}.overview p{max-width:52ch;margin:0}.overview-logo{width:auto;max-width:240px;max-height:72px;margin-bottom:var(--sb-space-3);object-fit:contain}.overview .tagline{color:var(--sb-text);font-size:16px}.overview-links{justify-content:center;gap:var(--sb-space-2) var(--sb-space-4);margin-top:var(--sb-space-2);flex-wrap:wrap;display:flex}.overview-links a{color:var(--sb-accent);font-weight:600;text-decoration:none}.overview-links a:hover{text-decoration:underline}.op-group{margin-bottom:var(--sb-space-3)}.group-head{border:0;border-bottom:1px solid var(--sb-border);text-align:left;cursor:pointer;background:0 0;align-items:center;gap:6px;width:100%;padding:6px 8px;font-weight:600;display:flex}.group-head .caret{width:12px;color:var(--sb-text-muted)}.group-head .count{font-size:12px}.op-row{align-items:center;gap:var(--sb-space-3);border:0;border-bottom:1px solid color-mix(in srgb, var(--sb-border) 60%, transparent);text-align:left;cursor:pointer;background:0 0;grid-template-columns:52px minmax(0,1fr) auto;width:100%;padding:7px 8px;display:grid}.op-row:hover,.op-row:focus-visible{background:var(--sb-surface-raised)}.op-row.active{background:color-mix(in srgb, var(--sb-accent) 10%, var(--sb-surface));box-shadow:inset 3px 0 0 var(--sb-accent)}.op-row .method{text-align:center;justify-self:start;min-width:0;padding:1px 5px;font-size:10px}.op-title{-webkit-line-clamp:2;overflow-wrap:anywhere;-webkit-box-orient:vertical;line-height:1.35;display:-webkit-box;overflow:hidden}.op-path{text-overflow:ellipsis;white-space:nowrap;max-width:46%;font:12px var(--sb-font-mono);color:var(--sb-text-muted);overflow:hidden}@container (width<=520px){.op-path{display:none}.op-row{grid-template-columns:52px minmax(0,1fr)}}.cat-empty{padding:var(--sb-space-4) 0}.request-panel{flex-direction:column;height:100%;min-height:0;display:flex}.rq{flex-direction:column;flex:1;min-height:0;display:flex}.rq-bar{align-items:center;gap:var(--sb-space-2);padding:var(--sb-space-3) var(--sb-space-4) var(--sb-space-2);display:flex}.rq-bar .method{border:1px solid var(--sb-border);padding:7px 10px;font-size:12px}.rq-url{align-items:center;gap:var(--sb-space-2);min-width:0;height:34px;padding:0 var(--sb-space-3);border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-surface-raised);flex:1;display:flex}.rq-url code{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:13px;overflow:hidden}.rq-url mark{background:var(--sb-warning-subtle);color:var(--sb-warning);border-radius:3px;padding:0 2px}.rq-example{display:contents}.env-badge{font:600 10px var(--sb-font-sans);letter-spacing:.06em;text-transform:uppercase;color:var(--sb-text-muted);border:1px solid var(--sb-border);white-space:nowrap;border-radius:4px;flex:none;align-items:center;padding:1px 6px;display:inline-flex;position:relative}.env-badge.switch{cursor:pointer}.env-badge.switch>.env-name:after{content:" ▾";opacity:.7}.env-badge select{opacity:0;cursor:pointer;width:100%;height:100%;min-height:0;position:absolute;inset:0}.env-badge.live{color:var(--sb-warning);border-color:color-mix(in srgb, var(--sb-warning) 45%, var(--sb-border));background:var(--sb-warning-subtle)}.env-badge.prod{color:var(--sb-danger);border-color:color-mix(in srgb, var(--sb-danger) 45%, var(--sb-border));background:var(--sb-danger-subtle)}.result-chip{white-space:nowrap;cursor:pointer;border:0;border-radius:999px;flex:none;align-items:center;height:34px;padding:0 12px;font-size:12px;font-weight:600;display:inline-flex}.result-chip.s2{background:var(--sb-success-subtle);color:var(--sb-success)}.result-chip.s3{background:var(--sb-surface-raised);color:var(--sb-text)}.result-chip.s4,.result-chip.s5{background:var(--sb-warning-subtle);color:var(--sb-warning)}.rq-status{align-items:center;gap:var(--sb-space-2);white-space:nowrap;font-size:12px;display:flex}.request-panel select,.panel-head select,.header select{appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' fill='none' stroke='%2394a3b8' stroke-width='1.6'%3E%3Cpath d='M1 1l4 4 4-4'/%3E%3C/svg%3E");background-position:right 9px center;background-repeat:no-repeat;padding-right:26px}.rq-bar .send{place-items:center;height:34px;padding:0 18px;display:inline-grid}kbd.icon-key{vertical-align:middle;place-items:center;display:inline-grid}.needs-vars{align-items:center;gap:var(--sb-space-2) var(--sb-space-3);min-width:0;margin:0 var(--sb-space-4) var(--sb-space-2);padding:var(--sb-space-2) var(--sb-space-3);border:1px solid color-mix(in srgb, var(--sb-warning) 35%, var(--sb-border));border-radius:var(--sb-radius-control);background:var(--sb-warning-subtle);flex-wrap:wrap;font-size:12.5px;display:flex}.needs-vars.ok{border-color:var(--sb-border);background:var(--sb-surface)}.secrets-folded{margin:0 var(--sb-space-4) var(--sb-space-2)}.secrets-chip{text-overflow:ellipsis;white-space:nowrap;border:1px solid var(--sb-border);background:var(--sb-surface);max-width:100%;color:var(--sb-text-muted);cursor:pointer;border-radius:999px;padding:1px 10px;font-size:12px;line-height:1.4;overflow:hidden}.needs-var{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;max-width:100%;display:inline-flex}.needs-var input{width:130px;min-width:0}.needs-var input[type=password]{border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-surface);padding:5px 8px}.oauth-signin{flex:100%}.oauth-signin input[type=text]{flex:140px;width:auto;max-width:360px}.oauth-signin details{flex:100%;min-width:0}.oauth-signin input[type=checkbox]{flex:none;width:auto}.oauth-signin details label{overflow-wrap:anywhere;align-items:center;gap:6px;min-height:28px;display:flex}.oauth-status{overflow-wrap:anywhere;flex:100%;min-width:0}.rq-meta{align-items:center;gap:var(--sb-space-3);padding:var(--sb-space-1) var(--sb-space-4) var(--sb-space-3);font-size:12px;display:flex}.edited{color:var(--sb-warning);background:var(--sb-warning-subtle);border-radius:999px;padding:1px 8px;font-size:11px;font-weight:600}.rq-tabs{gap:var(--sb-space-1);padding:0 var(--sb-space-4);border-bottom:1px solid var(--sb-border);display:flex}.rq-tabs[hidden]{display:none}.rq-tab{color:var(--sb-text-muted);cursor:pointer;background:0 0;border:0;border-bottom:2px solid #0000;align-items:center;gap:6px;margin-bottom:-1px;padding:8px 10px;font-weight:500;display:inline-flex}.rq-tab:hover{color:var(--sb-text)}.rq-tab.on{color:var(--sb-text);border-bottom-color:var(--sb-accent)}.rq-tab .count{background:var(--sb-surface-raised);opacity:1;border-radius:999px;margin:0;padding:0 6px;font-size:11px;font-weight:600}.rq-tab .count.bad{background:var(--sb-danger-subtle);color:var(--sb-danger)}.rq-pane{min-height:0;padding:var(--sb-space-3) var(--sb-space-4) var(--sb-space-4);flex-direction:column;flex:1;display:flex}.tab-pane{flex-direction:column;flex:1;min-height:0;display:flex;overflow:auto}.tab-pane[hidden]{display:none}.tab-pane>section+section{margin-top:var(--sb-space-4)}.tab-gap{flex:1}.state-dot{border-radius:999px;padding:0 6px;font-size:11px;font-weight:700}.state-dot.s2{background:var(--sb-success-subtle);color:var(--sb-success)}.state-dot.s3{background:var(--sb-surface-raised)}.state-dot.s4,.state-dot.s5{background:var(--sb-warning-subtle);color:var(--sb-warning)}.tab-pane>.body{flex-direction:column;flex:1;min-height:0;display:flex}.tab-pane .body .body-editor{flex:1;min-height:120px;max-height:none}.sent-view{gap:var(--sb-space-2);flex-direction:column;min-height:0;display:flex}.sent-view .rq-bar{padding:0}.sent-view table.headers th{width:200px;font-family:var(--sb-font-mono);font-size:12.5px}.sent-view h3{margin:var(--sb-space-2) 0 0;text-transform:uppercase;letter-spacing:.06em;color:var(--sb-text-muted);font-size:11px}.response{background:var(--sb-surface);flex-direction:column;flex:1;min-height:0;display:flex}.rs-head{align-items:center;gap:var(--sb-space-3);padding:0 0 var(--sb-space-2);display:flex}.rs-head h3{text-transform:uppercase;letter-spacing:.06em;color:var(--sb-text-muted);margin:0;font-size:11px}.rs-stat{color:var(--sb-text-muted);font-size:12px}.sent{padding:0 0 var(--sb-space-2);text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:12px;overflow:hidden}.rs-pane{min-height:0;padding:var(--sb-space-3) 0 0;flex-direction:column;flex:1;display:flex}.rs-pane>div{flex-direction:column;flex:1;min-height:0;display:flex;overflow:auto}.rs-pane>div[hidden]{display:none}.rs-pane .body-editor{flex:1;min-height:120px;max-height:none}.response .rq-tabs{padding:0}.rs-empty{place-content:center;justify-items:center;gap:var(--sb-space-2);padding:var(--sb-space-6);color:var(--sb-text-muted);flex:1;display:grid}.rs-empty strong{color:var(--sb-text)}.response .checks{border:0;margin:0;padding:0}.visually-hidden{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.checks .bad{margin-top:var(--sb-space-2);color:inherit}.check-fail{gap:var(--sb-space-2);min-width:0;padding:var(--sb-space-3);border:1px solid color-mix(in srgb, var(--sb-danger) 35%, var(--sb-border));border-left:3px solid var(--sb-danger);border-radius:var(--sb-radius-control);background:color-mix(in srgb, var(--sb-danger) 5%, var(--sb-surface));margin:0;display:grid}.check-head{align-items:center;gap:var(--sb-space-2);color:var(--sb-danger);flex-wrap:wrap;display:flex}.check-head strong{overflow-wrap:anywhere;min-width:0}.diff-legend{gap:var(--sb-space-3);font-size:12px;font-weight:600;display:flex}.diff-key.diff-expected,.diff-line.diff-expected{color:var(--sb-success)}.diff-key.diff-received,.diff-line.diff-received{color:var(--sb-danger)}.diff{padding:var(--sb-space-2) 0;white-space:pre;border-radius:var(--sb-radius-control);background:var(--sb-surface);border:1px solid var(--sb-border);max-height:18em;font:12.5px / 1.5 var(--sb-font-mono);margin:0;overflow:auto}.diff-line{min-width:max-content;padding:0 var(--sb-space-3) 0 0;display:flex}.diff-line.diff-expected{background:var(--sb-success-subtle)}.diff-line.diff-received{background:var(--sb-danger-subtle)}.diff-line.diff-same{color:var(--sb-text-muted)}.diff-line.diff-skip{color:var(--sb-text-muted);font-style:italic}.diff-gutter{text-align:center;-webkit-user-select:none;user-select:none;flex:none;width:2em}.diff-text{white-space:pre}.check-where{font:12px var(--sb-font-mono);color:var(--sb-text-muted);overflow-wrap:anywhere}.link{color:var(--sb-accent);cursor:pointer;background:0 0;border:0;padding:0}.link:hover{text-decoration:underline}.icon{cursor:pointer;width:24px;height:24px;color:var(--sb-text-muted);background:0 0;border:0;border-radius:4px;place-items:center;padding:0;font-size:16px;line-height:1;display:inline-grid}.icon:hover{background:var(--sb-surface-raised);color:var(--sb-text)}.small{font-size:12px}.grid table{border-collapse:separate;border-spacing:0;table-layout:fixed;border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);width:100%;font-size:13px;overflow:hidden}.grid th{text-align:left;letter-spacing:.04em;text-transform:uppercase;color:var(--sb-text-muted);background:var(--sb-surface-raised);border-bottom:1px solid var(--sb-border);padding:6px 8px;font-size:11px;font-weight:600}.grid td{border-bottom:1px solid var(--sb-border);vertical-align:middle;background:var(--sb-surface);height:32px;padding:0}.grid tbody tr:last-child td{border-bottom:0}.grid td+td,.grid th+th{border-left:1px solid var(--sb-border)}.grid tbody tr:hover td{background:color-mix(in srgb, var(--sb-accent) 4%, var(--sb-surface))}.grid tr.bad td{background:var(--sb-danger-subtle)}.g-check{text-align:center}.grid th{position:relative}.col-resizer{z-index:2;cursor:col-resize;touch-action:none;width:8px;position:absolute;top:0;bottom:0;right:-4px}.col-resizer:after{content:"";background:0 0;border-radius:1px;position:absolute;inset:4px 3px}.col-resizer:hover:after,.col-resizer:focus-visible:after,body.resizing .col-resizer:after{background:var(--sb-accent)}.g-check input{accent-color:var(--sb-accent);vertical-align:middle;margin:0}.g-act{white-space:nowrap;text-align:right;padding-right:4px}.g-act .icon{opacity:0}.grid tr:hover .g-act .icon,.grid tr:focus-within .g-act .icon{opacity:1}.g-key .key{align-items:baseline;gap:2px;padding:0 8px;display:flex}.g-key code{font-size:12.5px}.g-doc{color:var(--sb-text-muted);white-space:nowrap;text-overflow:ellipsis;padding:0 8px;overflow:hidden}.grid tr.off td:not(.g-check):not(.g-act){color:var(--sb-text-muted)}.grid tr.off .cell,.grid tr.off code{opacity:.6}.cell{width:100%;height:31px;font:inherit;color:var(--sb-text);background:0 0;border:0;border-radius:0;outline:none;padding:0 8px;display:block}.cell::placeholder{color:color-mix(in srgb, var(--sb-text-muted) 70%, transparent)}.cell:focus,.file-cell:focus-within{background:var(--sb-surface);box-shadow:inset 0 0 0 2px var(--sb-accent)}.grid tr.ghost td{background:color-mix(in srgb, var(--sb-surface-raised) 50%, var(--sb-surface))}.file-cell{cursor:pointer;white-space:nowrap;text-overflow:ellipsis;align-items:center;height:31px;padding:0 8px;display:flex;overflow:hidden}.file-cell input{opacity:0;width:1px;height:1px;position:absolute}.combo{position:relative}.combo .cell{padding-right:26px}.combo-toggle{width:26px;color:var(--sb-text-muted);cursor:pointer;background:0 0;border:0;position:absolute;inset:0 0 0 auto}.combo-list{z-index:30;background:var(--sb-surface);border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);max-height:220px;box-shadow:0 8px 24px color-mix(in srgb, var(--sb-text) 16%, transparent);margin:0;padding:4px;position:fixed;overflow:auto}.combo-list button{text-align:left;cursor:pointer;width:100%;font-family:var(--sb-font-mono);background:0 0;border:0;border-radius:4px;padding:5px 8px;font-size:12.5px;display:block}.combo-list button:hover,.combo-list button.at{background:var(--sb-surface-raised)}.combo-list button.on{color:var(--sb-accent);font-weight:600}.doc-project{margin-top:var(--sb-space-3)}.field-note{margin-top:var(--sb-space-2);border-left:2px solid var(--sb-accent);padding-left:8px;font-size:12.5px}.field-note>:first-child{margin-top:0}.field-note>:last-child{margin-bottom:0}.step-note-row td{border-top:0;padding-top:0}.step-note{color:var(--sb-text-muted);font-size:13px}.step-note>:first-child{margin-top:0}.step-note>:last-child{margin-bottom:0}.step-about{margin:var(--sb-space-2) 0;border:1px solid var(--sb-border);border-left:3px solid var(--sb-accent);border-radius:var(--sb-radius-control);padding:6px 10px;font-size:13px}.step-about summary{cursor:pointer;font-weight:600}.step-about .doc-custom{margin-top:var(--sb-space-2)}.code-sample{gap:var(--sb-space-2);padding:var(--sb-space-3);flex-direction:column;display:flex}.code-head{align-items:center;gap:var(--sb-space-2);display:flex}.code-block{padding:var(--sb-space-3);border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-surface-raised);font:12.5px / 1.55 var(--sb-font-mono);-webkit-user-select:text;user-select:text;margin:0;overflow-x:auto}fieldset.seg{border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);min-width:0;margin:0;padding:0;display:inline-flex;overflow:hidden}.seg-btn{background:var(--sb-surface);color:var(--sb-text-muted);cursor:pointer;border:0;padding:2px 10px;font-size:12px;font-weight:600}.seg-btn+.seg-btn{border-left:1px solid var(--sb-border)}.seg-btn.on{background:var(--sb-surface-raised);color:var(--sb-text)}.body-editor{border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-code-bg);max-height:420px;display:grid;overflow:auto}.body-editor .prism-code-editor{--pce-bg:var(--sb-code-bg);--pce-cursor:var(--sb-text);--pce-selection:var(--sb-focus-ring);--pce-bg-highlight:var(--sb-code-line);--pce-line-number:var(--sb-text-muted);--pce-selection-match:transparent;--pce-widget-bg:var(--sb-surface);--pce-widget-border:var(--sb-border);--pce-widget-color-active:var(--sb-text);--pce-ac-match:var(--sb-accent);font:12.5px / 1.6 var(--sb-font-mono);min-height:3.2em}.body-editor [class*=language-],.body-editor .token.punctuation,.body-editor .token.operator{color:var(--sb-code-punct)}.body-editor .token.property,.body-editor .token.attr-name{color:var(--sb-code-key)}.body-editor .token.string{color:var(--sb-code-string)}.body-editor .token.number{color:var(--sb-code-number)}.body-editor .token.boolean,.body-editor .token.null,.body-editor .token.constant{color:var(--sb-code-literal)}.body-editor .token.keyword,.body-editor .token.class-name,.body-editor .token.function{color:var(--sb-code-keyword)}.body-editor .token.comment{color:var(--sb-code-comment)}.field-doc{min-height:4.5em;margin-top:var(--sb-space-2);padding:var(--sb-space-2) var(--sb-space-3);border-left:3px solid var(--sb-accent);background:var(--sb-surface);font-size:13px}.tab-pane>.field-doc,.tab-pane .body>.field-doc,.sent-view>.field-doc,.rs-pane>div>.field-doc{z-index:1;position:sticky;bottom:0}.field-doc.empty{border-left-color:var(--sb-border);color:var(--sb-text-muted)}.field-doc p{margin:4px 0 0}.field-doc-text{max-height:11em;margin-top:4px;overflow:auto}.field-doc-text :is(p,ul,ol,pre){margin:0 0 var(--sb-space-2)}.field-doc-text :is(ul,ol){padding-left:1.3em}.field-doc-text pre{padding:var(--sb-space-2);background:var(--sb-surface-raised);border-radius:var(--sb-radius-control);overflow:auto}.field-doc-text :is(h2,h3,h4,h5){margin:var(--sb-space-2) 0 var(--sb-space-1);text-transform:none;letter-spacing:0;color:var(--sb-text);font-size:13px}.doc-inline a,.field-doc-text a{color:var(--sb-accent)}.doc-inline code,.field-doc-text code{background:var(--sb-surface-raised);border-radius:3px;padding:0 4px}.field-doc-head{align-items:center;gap:var(--sb-space-2);flex-wrap:wrap;display:flex}.field-doc-enum code{margin-right:6px}.issues{margin-top:var(--sb-space-2);font-size:12px}.sequence-panel{grid-template-columns:minmax(300px,4fr) minmax(0,7fr);height:100%;min-height:0;display:grid}@media (max-width:900px){.sequence-panel{grid-template-columns:minmax(0,1fr);overflow:auto}}.seq-left{min-height:0;padding:var(--sb-space-4);background:var(--sb-bg);border-right:1px solid var(--sb-border);overflow:auto}.controls-grid{margin-bottom:var(--sb-space-3);container-type:inline-size}.controls-grid col.c-key{width:30%}.controls-grid col.c-val{width:40%}@container (width<=520px){.controls-grid .g-doc,.controls-grid th.g-doc{display:none}.controls-grid col.c-key{width:40%}.controls-grid col.c-val{width:60%}}.controls-head{justify-content:space-between;align-items:center;gap:var(--sb-space-2);display:flex}.controls-head .gen-all{text-transform:none;letter-spacing:0;align-items:center;gap:6px;padding:4px 10px;font-size:12px;display:inline-flex}.cell-gen{align-items:center;gap:4px;min-width:0;display:flex}.cell-gen>:first-child{flex:auto;min-width:0}.cell-gen .cell{width:100%;min-width:0}.gen{width:28px;height:28px;color:var(--sb-text-muted);border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);cursor:pointer;background:0 0;flex:none;justify-content:center;align-items:center;margin-right:4px;padding:0;display:inline-flex}.gen:hover,.gen:focus-visible{color:var(--sb-accent);border-color:var(--sb-accent)}@media (pointer:coarse){.gen{width:44px;height:44px}.controls-head .gen-all{min-height:44px}}.multi-cell{flex-wrap:wrap;gap:4px 12px;padding:6px 8px;display:flex}.multi-cell label{align-items:center;gap:4px;display:inline-flex}.cell.mono{font-family:var(--sb-font-mono);font-size:12.5px}.doc-tags{gap:var(--sb-space-1);margin:0 0 var(--sb-space-3);display:flex}.doc .link{text-align:left}.pause .controls-grid{margin:var(--sb-space-2) 0}.step-exchange{flex-direction:column;height:100%;min-height:0;display:flex}.seq-left .controls{padding:var(--sb-space-3) var(--sb-space-4);margin-bottom:var(--sb-space-3);background:var(--sb-surface);border:1px solid var(--sb-border);border-radius:var(--sb-radius-card)}.seq-left .controls h3{margin:0 0 var(--sb-space-2);text-transform:uppercase;letter-spacing:.06em;color:var(--sb-text-muted);font-size:11px}.seq-run{align-items:center;gap:var(--sb-space-3);margin-bottom:var(--sb-space-4);flex-wrap:wrap;display:flex}.seq-left .journey{padding:var(--sb-space-1) 0}.seq-left .jhead{font-size:13px}.seq-right{background:var(--sb-surface);flex-direction:column;min-height:0;display:flex;overflow:auto}.seq-right .response{padding:var(--sb-space-3) var(--sb-space-4) 0}.seq-req{border-bottom:1px solid var(--sb-border);flex:none}.seq-req .rq-bar{padding-bottom:var(--sb-space-3)}.seq-req .rq-pane{padding-top:0}.seq-req .body-editor{max-height:200px}.jstep.picked .jhead .jname{text-underline-offset:3px;text-decoration:underline}.envmenu{position:relative}.envmenu-btn{white-space:nowrap;align-items:center;gap:6px;display:inline-flex}.badge-missing{background:var(--sb-danger);min-width:18px;color:var(--sb-text-on-danger);text-align:center;border-radius:999px;padding:0 5px;font-size:11px;font-weight:700}.envmenu-pop{z-index:40;gap:var(--sb-space-3);width:min(460px,92vw);max-height:min(70vh,640px);padding:var(--sb-space-3) var(--sb-space-4);background:var(--sb-surface);border:1px solid var(--sb-border);border-radius:var(--sb-radius-card);box-shadow:0 12px 32px color-mix(in srgb, var(--sb-text) 20%, transparent);grid-template-columns:minmax(0,1fr);display:grid;position:absolute;top:calc(100% + 8px);right:0;overflow:auto}.envmenu-head{align-items:center;gap:var(--sb-space-3);display:flex}.envmenu-pop h3{margin:0 0 var(--sb-space-1);text-transform:uppercase;letter-spacing:.06em;color:var(--sb-text-muted);font-size:11px}.envmenu-pop p{margin:0}.envmenu-warn{padding:var(--sb-space-2) var(--sb-space-3);border-radius:var(--sb-radius-control);background:var(--sb-warning-subtle);color:var(--sb-warning);font-size:12.5px}.envrow{align-items:center;gap:var(--sb-space-2);margin-top:var(--sb-space-2);display:flex}.envrow input,.envrow select{border:1px solid var(--sb-border);border-radius:var(--sb-radius-control);background:var(--sb-surface);flex:1;min-width:0;padding:5px 8px}.envrow code{text-overflow:ellipsis;flex:0 0 38%;overflow:hidden}.secretrow{margin-top:var(--sb-space-3)}.secretrow-head{align-items:baseline;gap:var(--sb-space-2);font-size:13px;display:flex}.secretrow-head .src{border-radius:999px;margin-left:auto;padding:0 8px;font-size:11px;font-weight:600}.src.set{background:var(--sb-success-subtle);color:var(--sb-success)}.src.missing{background:var(--sb-danger-subtle);color:var(--sb-danger)}.envrow .src{border-radius:999px;flex:none;padding:0 8px;font-size:11px;font-weight:600}.src.inherited{background:var(--sb-surface-raised);color:var(--sb-text-muted)}.envuse{margin:-2px 0 var(--sb-space-2);overflow-wrap:anywhere;padding-left:2px}.op-lock{color:var(--sb-text-muted);vertical-align:-1px;margin-left:6px;display:inline-block}.list-resizer{z-index:25;top:var(--sb-header-h,53px);bottom:0;left:calc(var(--sb-list-w) - 4px);cursor:col-resize;touch-action:none;width:8px;position:fixed}.list-resizer:after{content:"";background:0 0;transition:background .12s;position:absolute;inset:0 3px}.list-resizer:hover:after,.list-resizer:focus-visible:after,body.resizing .list-resizer:after{background:var(--sb-accent)}body.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}@media (max-width:900px){.list-resizer{display:none}}@media (max-width:820px){.panel,.panel.docked{width:100%;min-width:0;height:100dvh;box-shadow:none;border-left:0;inset:0}input,select,textarea,.body-editor .prism-code-editor,.body-editor .prism-code-editor textarea{font-size:16px}.body-editor .prism-code-editor{line-height:1.5}.panel-head{padding:var(--sb-space-2) var(--sb-space-3);gap:var(--sb-space-2);flex-wrap:nowrap}.panel-title{flex:1 1 0;min-width:0}.panel-head h2{-webkit-line-clamp:2;line-clamp:2;overflow-wrap:anywhere;-webkit-box-orient:vertical;line-height:1.25;display:-webkit-box;overflow:hidden}.panel-title>.muted{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.panel-head .spacer,.panel-head label.row{display:none}.stepper{gap:0}.panel-head .icon{min-width:36px;min-height:36px}.panel-main.scroll{padding:var(--sb-space-3)}.doc-intro{flex-wrap:wrap}.doc-intro code{overflow-wrap:anywhere;flex:1 1 0;min-width:0}.doc-intro .spacer{display:none}.doc pre,.doc-custom pre{max-width:100%;overflow-x:auto}.doc img{max-width:100%;height:auto}.doc-custom table{max-width:100%;display:block;overflow-x:auto}.panel-main.scroll{overflow-x:hidden}.envmenu{position:static}.envmenu-pop{inset:var(--sb-space-2);z-index:40;width:auto;max-height:none;position:fixed}.envrow{flex-wrap:wrap}.envrow code{flex:1 0 100%}.envrow input{flex:1 1 0}.envrow input,.envrow select{min-width:0;max-width:100%}table.fields{max-width:100%;display:block;overflow-x:auto}table.fields td:last-child{min-width:440px}table.fields td:first-child{white-space:nowrap}.rq-meta{padding-inline:var(--sb-space-3);flex-wrap:wrap}.secrets-note,.oauth-hint{display:none}.secrets-folded,.needs-vars{margin-inline:var(--sb-space-3)}.rq-example{align-items:center;gap:var(--sb-space-2);flex:100%;min-width:0;display:flex}.rq-example>label.row{flex:1 1 0;min-width:0}.rq-example>label.row select{text-overflow:ellipsis;flex:1 1 0;min-width:0}.rq-status{gap:var(--sb-space-3);flex:100%;order:1;min-width:0}.rq-status>select{text-overflow:ellipsis;flex:1 1 0;min-width:0}.rq-example>label.row>.muted,.rq-status>.muted{flex:0 0 84px}.rq-meta>.edited,.rq-meta>.spacer,.rq-meta>.link{order:2}.rq-meta select{min-width:0;max-width:100%}button,select,input:not([type=checkbox]):not([type=radio]){min-height:36px}}.sheet-close{display:none}@media (max-width:820px){.sequence-panel{padding-bottom:8px;overflow:auto}.sequence-panel.sheet-open .seq-left{padding-bottom:62vh}.seq-right{display:none}.seq-right.sheet-open{z-index:5;border-top:1px solid var(--sb-border);height:min(62%,520px);box-shadow:0 -12px 32px color-mix(in srgb, var(--sb-text) 22%, transparent);overscroll-behavior:contain;border-radius:14px 14px 0 0;display:flex;position:absolute;inset:auto 0 0;overflow:auto}.seq-right .sheet-close{align-items:center;gap:var(--sb-space-2);z-index:2;min-height:44px;padding:0 var(--sb-space-4);border:0;border-bottom:1px solid var(--sb-border);background:var(--sb-surface);text-align:left;color:var(--sb-text);flex:none;font-weight:600;display:flex;position:sticky;top:0}}}@layer brand;