lastlight-evals 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +98 -12
  2. package/dashboard/dist/assets/index-YwScAAxm.js +238 -0
  3. package/dashboard/dist/assets/index-uU9Sj3M4.css +1 -0
  4. package/dashboard/dist/index.html +19 -0
  5. package/dashboard/dist/logo.png +0 -0
  6. package/datasets/code-fix/repos/codefix__date-range-off-by-one/.github/workflows/ci.yml +16 -0
  7. package/datasets/code-fix/repos/codefix__date-range-off-by-one/README.md +7 -1
  8. package/datasets/code-fix/repos/codefix__date-range-off-by-one/package.json +3 -1
  9. package/datasets/code-fix/repos/codefix__date-range-off-by-one/scripts/lint.mjs +25 -0
  10. package/datasets/code-fix/repos/codefix__date-range-off-by-one/test/date-range.test.ts +14 -0
  11. package/datasets/code-fix/repos/codefix__date-range-off-by-one/tsconfig.json +13 -0
  12. package/datasets/code-fix/tests/codefix__date-range-off-by-one/date-range.test.ts +5 -5
  13. package/dist/arm.js +132 -0
  14. package/dist/arm.js.map +1 -0
  15. package/dist/config.js +100 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/mechanism.test.js +156 -0
  18. package/dist/mechanism.test.js.map +1 -1
  19. package/dist/metrics.js +83 -0
  20. package/dist/metrics.js.map +1 -1
  21. package/dist/paths.js +51 -1
  22. package/dist/paths.js.map +1 -1
  23. package/dist/report.js +112 -3
  24. package/dist/report.js.map +1 -1
  25. package/dist/run-instance.js +136 -15
  26. package/dist/run-instance.js.map +1 -1
  27. package/dist/run.js +350 -118
  28. package/dist/run.js.map +1 -1
  29. package/dist/serve.js +136 -0
  30. package/dist/serve.js.map +1 -0
  31. package/examples/overlay/README.md +30 -0
  32. package/examples/overlay/config.yaml +36 -0
  33. package/examples/overlay-anthropic/config.yaml +27 -0
  34. package/package.json +16 -6
  35. package/dist/html-report.js +0 -325
  36. package/dist/html-report.js.map +0 -1
@@ -0,0 +1 @@
1
+ code[class*=language-],pre[class*=language-]{color:oklch(var(--bc));background:none;font-family:ui-monospace,JetBrains Mono,SFMono-Regular,Menlo,Monaco,Consolas,monospace;text-shadow:none;line-height:1.5;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-hyphens:none;hyphens:none}pre[class*=language-]{background:oklch(var(--b3) / .6);border-radius:.375rem;overflow:auto;padding:.75rem}:not(pre)>code[class*=language-]{background:oklch(var(--b3));color:oklch(var(--a));padding:.1em .3em;border-radius:.25em;white-space:normal}.token.comment,.token.prolog,.token.cdata{color:oklch(var(--bc) / .45);font-style:italic}.token.punctuation{color:oklch(var(--bc) / .65)}.token.namespace{opacity:.7}.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:oklch(var(--wa))}.token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.inserted{color:oklch(var(--su))}.token.operator,.token.entity,.token.url,.language-css .token.string,.style .token.string{color:oklch(var(--in))}.token.atrule,.token.attr-value,.token.keyword{color:oklch(var(--p))}.token.function,.token.class-name{color:oklch(var(--s))}.token.regex,.token.important,.token.variable{color:oklch(var(--a))}.token.important,.token.bold{font-weight:600;color:oklch(var(--bc))}.token.italic{font-style:italic}.token.entity{cursor:help}.token.title,.token.title .token.punctuation{color:oklch(var(--p));font-weight:700}.token.list.punctuation{color:oklch(var(--p))}.token.url-reference,.token.url .token.url,.token.url .token.content{color:oklch(var(--in));text-decoration:underline;text-underline-offset:2px}.token.code-snippet,.language-markdown .token.code,.language-markdown .token.code .token.code-block{color:oklch(var(--a));background:oklch(var(--b3) / .6);border-radius:.25em;padding:.05em .3em}.token.blockquote.punctuation{color:oklch(var(--bc) / .5)}.language-yaml .token.key{color:oklch(var(--p))}.language-yaml .token.anchor,.language-yaml .token.alias{color:oklch(var(--s))}.language-yaml .token.tag{color:oklch(var(--a))}.token.template-block{color:oklch(var(--a));background:oklch(var(--a) / .12);border:1px solid oklch(var(--a) / .3);border-radius:.25em;padding:0 .2em;font-weight:500}.token.bold .token.template-block,.token.italic .token.template-block,.token.title .token.template-block{color:oklch(var(--a))}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color: oklch(0% 0 0)){:root{color-scheme:light;--fallback-p: #491eff;--fallback-pc: #d4dbff;--fallback-s: #ff41c7;--fallback-sc: #fff9fc;--fallback-a: #00cfbd;--fallback-ac: #00100d;--fallback-n: #2b3440;--fallback-nc: #d7dde4;--fallback-b1: #ffffff;--fallback-b2: #e5e6e6;--fallback-b3: #e5e6e6;--fallback-bc: #1f2937;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--fallback-p: #7582ff;--fallback-pc: #050617;--fallback-s: #ff71cf;--fallback-sc: #190211;--fallback-a: #00c7b5;--fallback-ac: #000e0c;--fallback-n: #2a323c;--fallback-nc: #a6adbb;--fallback-b1: #1d232a;--fallback-b2: #191e24;--fallback-b3: #15191e;--fallback-bc: #a6adbb;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,transparent) transparent}*:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,transparent) transparent}:root{--p: 82.7586% .101277 230.317893;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--pc: 18.9824% .027443 258.289839;--s: 81.1162% .101287 293.571186;--sc: 21.0653% .05749 293.109408;--a: 87.8967% .15342 91.605372;--ac: 18.7262% .038267 89.07495;--n: 26.3558% .02245 262.453801;--nc: 89.5452% .016863 259.419138;--b1: 17.6285% .014021 258.357175;--b2: 22.0223% .0157 256.816323;--b3: 26.6643% .014961 256.797842;--bc: 94.2539% .01105 243.65656;--in: 86.5073% .115347 207.07779;--inc: 20.4274% .028648 220.001354;--su: 87.1163% .136267 154.449129;--suc: 21.9364% .039051 162.6444;--wa: 87.8967% .15342 91.605372;--wac: 18.7262% .038267 89.07495;--er: 80.769% .103486 19.57064;--erc: 15.4967% .039477 22.841453}.badge{display:inline-flex;align-items:center;justify-content:center;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;height:1.25rem;font-size:.875rem;line-height:1.25rem;width:-moz-fit-content;width:fit-content;padding-left:.563rem;padding-right:.563rem;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}@media (hover:hover){.label a:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.tab:hover{--tw-text-opacity: 1}.table tr.hover:hover,.table tr.hover:nth-child(2n):hover{--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-color:transparent;border-color:oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn, 1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));--tw-bg-opacity: 1;--tw-border-opacity: 1}.btn-disabled,.btn[disabled],.btn:disabled{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.\!card{position:relative!important;display:flex!important;flex-direction:column!important;border-radius:var(--rounded-box, 1rem)!important}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box, 1rem)}.\!card:focus{outline:2px solid transparent!important;outline-offset:2px!important}.card:focus{outline:2px solid transparent;outline-offset:2px}.\!card figure{display:flex!important;align-items:center!important;justify-content:center!important}.card figure{display:flex;align-items:center;justify-content:center}.\!card.image-full{display:grid!important}.card.image-full{display:grid}.\!card.image-full:before{position:relative!important;content:""!important;z-index:10!important;border-radius:var(--rounded-box, 1rem)!important;--tw-bg-opacity: 1 !important;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)))!important;opacity:.75!important}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.\!card.image-full:before,.\!card.image-full>*{grid-column-start:1!important;grid-row-start:1!important}.\!card.image-full>figure img{height:100%!important;-o-object-fit:cover!important;object-fit:cover!important}.card.image-full>figure img{height:100%;-o-object-fit:cover;object-fit:cover}.\!card.image-full>.card-body{position:relative!important;z-index:20!important;--tw-text-opacity: 1 !important;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))!important}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}@media (hover: hover){.btm-nav>*.disabled:hover,.btm-nav>*[disabled]:hover{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:hover{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,black)}}@supports not (color: oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn.glass:hover{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost:hover{border-color:transparent}@supports (color: oklch(0% 0 0)){.btn-ghost:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}}.btn-disabled:hover,.btn[disabled]:hover,.btn:disabled:hover{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}@supports (color: color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.tab[disabled],.tab[disabled]:hover{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}}.footer{display:grid;width:100%;grid-auto-flow:row;place-items:start;-moz-column-gap:1rem;column-gap:1rem;row-gap:2.5rem;font-size:.875rem;line-height:1.25rem}.footer>*{display:grid;place-items:start;gap:.5rem}@media (min-width: 48rem){.footer{grid-auto-flow:column}.footer-center{grid-auto-flow:row dense}}.label{display:flex;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input[type=number]::-webkit-inner-spin-button,.input-md[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.join{display:inline-flex;align-items:stretch;border-radius:var(--rounded-btn, .5rem)}.join :where(.join-item){border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:not(:first-child):not(:last-child),.join *:not(:first-child):not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0}.join .dropdown .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .dropdown .join-item{border-start-end-radius:inherit;border-end-end-radius:inherit}.join :where(.join-item:first-child:not(:last-child)),.join :where(*:first-child:not(:last-child) .join-item){border-end-start-radius:inherit;border-start-start-radius:inherit}.join .join-item:last-child:not(:first-child),.join *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0}.join :where(.join-item:last-child:not(:first-child)),.join :where(*:last-child:not(:first-child) .join-item){border-start-end-radius:inherit;border-end-end-radius:inherit}@supports not selector(:has(*)){:where(.join *){border-radius:inherit}}@supports selector(:has(*)){:where(.join *:has(.join-item)){border-radius:inherit}}.link{cursor:pointer;text-decoration-line:underline}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}:where(.menu li) .badge{justify-self:end}.modal{pointer-events:none;position:fixed;top:0;right:0;bottom:0;left:0;margin:0;display:grid;height:100%;max-height:none;width:100%;max-width:none;justify-items:center;padding:0;opacity:0;overscroll-behavior:contain;z-index:999;background-color:transparent;color:inherit;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity,visibility;overflow-y:hidden}:where(.modal){align-items:center}.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open]{pointer-events:auto;visibility:visible;opacity:1}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden;scrollbar-gutter:stable}.progress{position:relative;width:100%;-webkit-appearance:none;-moz-appearance:none;appearance:none;overflow:hidden;height:.5rem;border-radius:var(--rounded-box, 1rem);background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.steps .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-columns:auto;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-rows:40px 1fr;place-items:center;text-align:center;min-width:4rem}.swap{position:relative;display:inline-grid;-webkit-user-select:none;-moz-user-select:none;user-select:none;place-content:center;cursor:pointer}.swap>*{grid-column-start:1;grid-row-start:1;transition-duration:.3s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity}.swap input{-webkit-appearance:none;-moz-appearance:none;appearance:none}.swap .swap-on,.swap .swap-indeterminate,.swap input:indeterminate~.swap-on{opacity:0}.swap input:checked~.swap-off,.swap-active .swap-off,.swap input:indeterminate~.swap-off{opacity:0}.swap input:checked~.swap-on,.swap-active .swap-on,.swap input:indeterminate~.swap-indeterminate{opacity:1}.tabs{display:grid;align-items:flex-end}.tabs-lifted:has(.tab-content[class^=rounded-]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])),.tabs-lifted:has(.tab-content[class*=" rounded-"]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])){border-bottom-color:transparent}.tab{position:relative;grid-row-start:1;display:inline-flex;height:2rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;flex-wrap:wrap;align-items:center;justify-content:center;text-align:center;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem;--tw-text-opacity: .5;--tab-color: var(--fallback-bc,oklch(var(--bc)/1));--tab-bg: var(--fallback-b1,oklch(var(--b1)/1));--tab-border-color: var(--fallback-b3,oklch(var(--b3)/1));color:var(--tab-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem)}.tab:is(input[type=radio]){width:auto;border-bottom-right-radius:0;border-bottom-left-radius:0}.tab:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.tab:not(input):empty{cursor:default;grid-column-start:span 9999}input.tab:checked+.tab-content,:is(.tab-active,[aria-selected=true])+.tab-content{display:block}.table{position:relative;width:100%;border-radius:var(--rounded-box, 1rem);text-align:left;font-size:.875rem;line-height:1.25rem}.table :where(.table-pin-rows thead tr){position:sticky;top:0;z-index:1;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-rows tfoot tr){position:sticky;bottom:0;z-index:1;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-cols tr th){position:sticky;left:0;right:0;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.timeline{position:relative;display:flex}:where(.timeline>li){position:relative;display:grid;flex-shrink:0;align-items:center;grid-template-rows:var(--timeline-row-start, minmax(0, 1fr)) auto var( --timeline-row-end, minmax(0, 1fr) );grid-template-columns:var(--timeline-col-start, minmax(0, 1fr)) auto var( --timeline-col-end, minmax(0, 1fr) )}.timeline>li>hr{width:100%;border-width:0px}:where(.timeline>li>hr):first-child{grid-column-start:1;grid-row-start:2}:where(.timeline>li>hr):last-child{grid-column-start:3;grid-column-end:none;grid-row-start:2;grid-row-end:auto}.badge-secondary{--tw-border-opacity: 1;border-color:var(--fallback-s,oklch(var(--s)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-s,oklch(var(--s)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.badge-success{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.badge-warning{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.badge-error{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.badge-ghost{--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.badge-outline.badge-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.badge-outline.badge-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.badge-outline.badge-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.badge-outline.badge-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btm-nav>*:where(.active){border-top-width:2px;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.btm-nav>*.disabled,.btm-nav>*[disabled]{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}@media (prefers-reduced-motion: no-preference){.btn{animation:button-pop var(--animation-btn, .25s) ease-out}}.btn:active:hover,.btn:active:focus{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale, .97))}@supports not (color: oklch(0% 0 0)){.btn{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}.prose :where(code):not(:where([class~=not-prose] *,pre *)){background-color:var(--fallback-b3,oklch(var(--b3)/1))}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn.glass{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost{border-width:1px;border-color:transparent;background-color:transparent;color:currentColor;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn-ghost.btn-active{border-color:transparent;background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.btn.btn-disabled,.btn[disabled],.btn:disabled{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale, .98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.\!card :where(figure:first-child){overflow:hidden!important;border-start-start-radius:inherit!important;border-start-end-radius:inherit!important;border-end-start-radius:unset!important;border-end-end-radius:unset!important}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.\!card :where(figure:last-child){overflow:hidden!important;border-start-start-radius:unset!important;border-start-end-radius:unset!important;border-end-start-radius:inherit!important;border-end-end-radius:inherit!important}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.\!card:focus-visible{outline:2px solid currentColor!important;outline-offset:2px!important}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.\!card.bordered{border-width:1px!important;--tw-border-opacity: 1 !important;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))!important}.card.bordered{border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.\!card.compact .card-body{padding:1rem!important;font-size:.875rem!important;line-height:1.25rem!important}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.\!card.image-full :where(figure){overflow:hidden!important;border-radius:inherit!important}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}.input input{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:transparent}.input input:focus{outline:2px solid transparent;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input:focus,.input:focus-within{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:has(>input[disabled]),.input-disabled,.input:disabled,.input[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input:has(>input[disabled])::-moz-placeholder,.input-disabled::-moz-placeholder,.input:disabled::-moz-placeholder,.input[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])::placeholder,.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1)}.link:focus{outline:2px solid transparent;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.loading{pointer-events:none;display:inline-block;aspect-ratio:1 / 1;width:1.5rem;background-color:currentColor;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-md{width:1.5rem}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.mockup-phone .display{overflow:hidden;border-radius:40px;margin-top:-25px}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;left:.5rem;top:50%;aspect-ratio:1 / 1;height:.75rem;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:2px;border-color:currentColor;opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{content:"";position:absolute;left:1.25rem;top:50%;height:.5rem;--tw-translate-y: 25%;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1px;border-color:currentColor;opacity:.6}.modal:not(dialog:not(.modal-open)),.modal::backdrop{background-color:#0006;animation:modal-pop .2s ease-out}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y: 0px;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes modal-pop{0%{opacity:0}}.progress::-moz-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate{--progress-color: var(--fallback-bc,oklch(var(--bc)/1));background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}.progress::-webkit-progress-bar{border-radius:var(--rounded-box, 1rem);background-color:transparent}.progress::-webkit-progress-value{border-radius:var(--rounded-box, 1rem);background-color:currentColor}.progress:indeterminate::-moz-progress-bar{background-color:transparent;background-image:repeating-linear-gradient(90deg,var(--progress-color) -1%,var(--progress-color) 10%,transparent 10%,transparent 90%);background-size:200%;background-position-x:15%;animation:progress-loading 5s ease-in-out infinite}@keyframes progress-loading{50%{background-position-x:-115%}}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}.steps .step:before{top:0;grid-column-start:1;grid-row-start:1;height:.5rem;width:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));content:"";margin-inline-start:-100%}.steps .step:after{content:counter(step);counter-increment:step;z-index:1;position:relative;grid-column-start:1;grid-row-start:1;display:grid;height:2rem;width:2rem;place-items:center;place-self:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.steps .step:first-child:before{content:none}.steps .step[data-content]:after{content:attr(data-content)}.tabs-lifted>.tab:focus-visible{border-end-end-radius:0;border-end-start-radius:0}.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tab:is(input:checked){border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: 1;--tw-text-opacity: 1}.tab:focus{outline:2px solid transparent;outline-offset:2px}.tab:focus-visible{outline:2px solid currentColor;outline-offset:-5px}.tab-disabled,.tab[disabled]{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.tabs-bordered>.tab{border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2;border-style:solid;border-bottom-width:calc(var(--tab-border, 1px) + 1px)}.tabs-lifted>.tab{border:var(--tab-border, 1px) solid transparent;border-width:0 0 var(--tab-border, 1px) 0;border-start-start-radius:var(--tab-radius, .5rem);border-start-end-radius:var(--tab-radius, .5rem);border-bottom-color:var(--tab-border-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem);padding-top:var(--tab-border, 1px)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tabs-lifted>.tab:is(input:checked){background-color:var(--tab-bg);border-width:var(--tab-border, 1px) var(--tab-border, 1px) 0 var(--tab-border, 1px);border-inline-start-color:var(--tab-border-color);border-inline-end-color:var(--tab-border-color);border-top-color:var(--tab-border-color);padding-inline-start:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-inline-end:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-bottom:var(--tab-border, 1px);padding-top:0}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked):before{z-index:1;content:"";display:block;position:absolute;width:calc(100% + var(--tab-radius, .5rem) * 2);height:var(--tab-radius, .5rem);bottom:0;background-size:var(--tab-radius, .5rem);background-position:top left,top right;background-repeat:no-repeat;--tab-grad: calc(69% - var(--tab-border, 1px));--radius-start: radial-gradient( circle at top left, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );--radius-end: radial-gradient( circle at top right, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );background-image:var(--radius-start),var(--radius-end)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,.tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-end);background-position:top right}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-start);background-position:top left}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,.tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-start);background-position:top left}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-end);background-position:top right}.tabs-lifted>:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled])+.tabs-lifted :is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked)+.tabs-lifted .tab:is(input:checked):before{background-image:var(--radius-end);background-position:top right}.tabs-boxed .tab{border-radius:var(--rounded-btn, .5rem)}.table:where([dir=rtl],[dir=rtl] *){text-align:right}.table :where(th,td){padding:.75rem 1rem;vertical-align:middle}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.active,.table-zebra tr.active:nth-child(2n),.table-zebra-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}.table :where(thead tr,tbody tr:not(:last-child),tbody tr:first-child:last-child){border-bottom-width:1px;--tw-border-opacity: 1;border-bottom-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.table :where(thead,tfoot){white-space:nowrap;font-size:.75rem;line-height:1rem;font-weight:700;color:var(--fallback-bc,oklch(var(--bc)/.6))}.table :where(tfoot){border-top-width:1px;--tw-border-opacity: 1;border-top-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.timeline hr{height:.25rem}:where(.timeline hr){--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}:where(.timeline:has(.timeline-middle) hr):first-child{border-start-end-radius:var(--rounded-badge, 1.9rem);border-end-end-radius:var(--rounded-badge, 1.9rem);border-start-start-radius:0px;border-end-start-radius:0px}:where(.timeline:has(.timeline-middle) hr):last-child{border-start-start-radius:var(--rounded-badge, 1.9rem);border-end-start-radius:var(--rounded-badge, 1.9rem);border-start-end-radius:0px;border-end-end-radius:0px}:where(.timeline:not(:has(.timeline-middle)) :first-child hr:last-child){border-start-start-radius:var(--rounded-badge, 1.9rem);border-end-start-radius:var(--rounded-badge, 1.9rem);border-start-end-radius:0px;border-end-end-radius:0px}:where(.timeline:not(:has(.timeline-middle)) :last-child hr:first-child){border-start-end-radius:var(--rounded-badge, 1.9rem);border-end-end-radius:var(--rounded-badge, 1.9rem);border-start-start-radius:0px;border-end-start-radius:0px}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}:root .prose{--tw-prose-body: var(--fallback-bc,oklch(var(--bc)/.8));--tw-prose-headings: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-lead: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-links: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-bold: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-counters: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-bullets: var(--fallback-bc,oklch(var(--bc)/.5));--tw-prose-hr: var(--fallback-bc,oklch(var(--bc)/.2));--tw-prose-quotes: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-quote-borders: var(--fallback-bc,oklch(var(--bc)/.2));--tw-prose-captions: var(--fallback-bc,oklch(var(--bc)/.5));--tw-prose-code: var(--fallback-bc,oklch(var(--bc)/1));--tw-prose-pre-code: var(--fallback-nc,oklch(var(--nc)/1));--tw-prose-pre-bg: var(--fallback-n,oklch(var(--n)/1));--tw-prose-th-borders: var(--fallback-bc,oklch(var(--bc)/.5));--tw-prose-td-borders: var(--fallback-bc,oklch(var(--bc)/.2));--tw-prose-kbd: var(--fallback-bc,oklch(var(--bc)/.8))}.prose :where(code):not(:where([class~=not-prose] *,pre *)){padding:1px 8px;border-radius:var(--rounded-badge);font-weight:initial;background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before,.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{display:none}.prose pre code{border-radius:0;padding:0}.prose :where(tbody tr,thead):not(:where([class~=not-prose] *)){border-bottom-color:var(--fallback-bc,oklch(var(--bc)/.2))}.artboard.phone-1.horizontal,.artboard.phone-1.artboard-horizontal{width:568px;height:320px}.artboard.phone-2.horizontal,.artboard.phone-2.artboard-horizontal{width:667px;height:375px}.artboard.phone-3.horizontal,.artboard.phone-3.artboard-horizontal{width:736px;height:414px}.artboard.phone-4.horizontal,.artboard.phone-4.artboard-horizontal{width:812px;height:375px}.artboard.phone-5.horizontal,.artboard.phone-5.artboard-horizontal{width:896px;height:414px}.artboard.phone-6.horizontal,.artboard.phone-6.artboard-horizontal{width:1024px;height:320px}.badge-xs{height:.75rem;font-size:.75rem;line-height:.75rem;padding-left:.313rem;padding-right:.313rem}.btm-nav-xs>*:where(.active){border-top-width:1px}.btm-nav-sm>*:where(.active){border-top-width:2px}.btm-nav-md>*:where(.active){border-top-width:2px}.btm-nav-lg>*:where(.active){border-top-width:4px}.btn-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:.5rem;font-size:.75rem}.btn-square:where(.btn-xs){height:1.5rem;width:1.5rem;padding:0}.btn-circle:where(.btn-xs){height:1.5rem;width:1.5rem;border-radius:9999px;padding:0}.join.join-vertical{flex-direction:column}.join.join-vertical .join-item:first-child:not(:last-child),.join.join-vertical *:first-child:not(:last-child) .join-item{border-end-start-radius:0;border-end-end-radius:0;border-start-start-radius:inherit;border-start-end-radius:inherit}.join.join-vertical .join-item:last-child:not(:first-child),.join.join-vertical *:last-child:not(:first-child) .join-item{border-start-start-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-end-end-radius:inherit}.join.join-horizontal{flex-direction:row}.join.join-horizontal .join-item:first-child:not(:last-child),.join.join-horizontal *:first-child:not(:last-child) .join-item{border-end-end-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-start-start-radius:inherit}.join.join-horizontal .join-item:last-child:not(:first-child),.join.join-horizontal *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0;border-end-end-radius:inherit;border-start-end-radius:inherit}.steps-horizontal .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));place-items:center;text-align:center}.steps-vertical .step{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(1,minmax(0,1fr))}.tabs-md :where(.tab){height:2rem;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem}.tabs-lg :where(.tab){height:3rem;font-size:1.125rem;line-height:1.75rem;line-height:2;--tab-padding: 1.25rem}.tabs-sm :where(.tab){height:1.5rem;font-size:.875rem;line-height:.75rem;--tab-padding: .75rem}.tabs-xs :where(.tab){height:1.25rem;font-size:.75rem;line-height:.75rem;--tab-padding: .5rem}.join.join-vertical>:where(*:not(:first-child)){margin-left:0;margin-right:0;margin-top:-1px}.join.join-vertical>:where(*:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn) * -1)}.join.join-horizontal>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join.join-horizontal>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1);margin-top:0}.steps-horizontal .step{grid-template-rows:40px 1fr;grid-template-columns:auto;min-width:4rem}.steps-horizontal .step:before{height:.5rem;width:100%;--tw-translate-x: 0px;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));content:"";margin-inline-start:-100%}.steps-horizontal .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.steps-vertical .step{gap:.5rem;grid-template-columns:40px 1fr;grid-template-rows:auto;min-height:4rem;justify-items:start}.steps-vertical .step:before{height:100%;width:.5rem;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));margin-inline-start:50%}.steps-vertical .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.z-50{z-index:50}.m-0{margin:0}.m-4{margin:1rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3\.5{margin-bottom:.875rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-7{margin-bottom:1.75rem}.mb-9{margin-bottom:2.25rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-1\.5{margin-top:.375rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-\[calc\(100vh-2rem\)\]{height:calc(100vh - 2rem)}.h-full{height:100%}.min-h-0{min-height:0px}.min-h-full{min-height:100%}.w-1\.5{width:.375rem}.w-5{width:1.25rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-\[22\%\]{width:22%}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[140px\]{min-width:140px}.min-w-\[3rem\]{min-width:3rem}.max-w-\[1600px\]{max-width:1600px}.max-w-\[85\%\]{max-width:85%}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-accent{--tw-border-opacity: 1;border-color:var(--fallback-a,oklch(var(--a)/var(--tw-border-opacity, 1)))}.border-accent\/40{border-color:var(--fallback-a,oklch(var(--a)/.4))}.border-base-300{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity, 1)))}.border-base-300\/40{border-color:var(--fallback-b3,oklch(var(--b3)/.4))}.border-base-300\/60{border-color:var(--fallback-b3,oklch(var(--b3)/.6))}.border-error\/40{border-color:var(--fallback-er,oklch(var(--er)/.4))}.border-info{--tw-border-opacity: 1;border-color:var(--fallback-in,oklch(var(--in)/var(--tw-border-opacity, 1)))}.border-success\/40{border-color:var(--fallback-su,oklch(var(--su)/.4))}.border-warning\/40{border-color:var(--fallback-wa,oklch(var(--wa)/.4))}.\!bg-transparent{background-color:transparent!important}.bg-accent{--tw-bg-opacity: 1;background-color:var(--fallback-a,oklch(var(--a)/var(--tw-bg-opacity, 1)))}.bg-accent\/15{background-color:var(--fallback-a,oklch(var(--a)/.15))}.bg-accent\/5{background-color:var(--fallback-a,oklch(var(--a)/.05))}.bg-base-100{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.bg-base-200{--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)))}.bg-base-200\/40{background-color:var(--fallback-b2,oklch(var(--b2)/.4))}.bg-base-200\/80{background-color:var(--fallback-b2,oklch(var(--b2)/.8))}.bg-base-300{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity, 1)))}.bg-base-300\/40{background-color:var(--fallback-b3,oklch(var(--b3)/.4))}.bg-base-300\/60{background-color:var(--fallback-b3,oklch(var(--b3)/.6))}.bg-base-content\/10{background-color:var(--fallback-bc,oklch(var(--bc)/.1))}.bg-black\/60{background-color:#0009}.bg-error{--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity, 1)))}.bg-error\/10{background-color:var(--fallback-er,oklch(var(--er)/.1))}.bg-error\/15{background-color:var(--fallback-er,oklch(var(--er)/.15))}.bg-info{--tw-bg-opacity: 1;background-color:var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity, 1)))}.bg-info\/15{background-color:var(--fallback-in,oklch(var(--in)/.15))}.bg-info\/5{background-color:var(--fallback-in,oklch(var(--in)/.05))}.bg-neutral{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity, 1)))}.bg-primary{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity, 1)))}.bg-primary\/15{background-color:var(--fallback-p,oklch(var(--p)/.15))}.bg-secondary\/15{background-color:var(--fallback-s,oklch(var(--s)/.15))}.bg-success{--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity, 1)))}.bg-success\/15{background-color:var(--fallback-su,oklch(var(--su)/.15))}.bg-warning\/10{background-color:var(--fallback-wa,oklch(var(--wa)/.1))}.bg-warning\/15{background-color:var(--fallback-wa,oklch(var(--wa)/.15))}.stroke-\[2\.25\]{stroke-width:2.25}.object-contain{-o-object-fit:contain;object-fit:contain}.\!p-3{padding:.75rem!important}.p-2{padding:.5rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.pb-20{padding-bottom:5rem}.pb-5{padding-bottom:1.25rem}.pt-10{padding-top:2.5rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.font-sans{font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-2xs{font-size:.6875rem;line-height:1rem}.text-lg{font-size:1.0625rem;line-height:1.625rem}.text-sm{font-size:.8125rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1.125rem}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-7{line-height:1.75rem}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.\!text-inherit{color:inherit!important}.text-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity, 1)))}.text-accent-content{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity, 1)))}.text-base-content{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.text-base-content\/25{color:var(--fallback-bc,oklch(var(--bc)/.25))}.text-base-content\/30{color:var(--fallback-bc,oklch(var(--bc)/.3))}.text-base-content\/40{color:var(--fallback-bc,oklch(var(--bc)/.4))}.text-base-content\/45{color:var(--fallback-bc,oklch(var(--bc)/.45))}.text-base-content\/50{color:var(--fallback-bc,oklch(var(--bc)/.5))}.text-base-content\/55{color:var(--fallback-bc,oklch(var(--bc)/.55))}.text-base-content\/60{color:var(--fallback-bc,oklch(var(--bc)/.6))}.text-base-content\/70{color:var(--fallback-bc,oklch(var(--bc)/.7))}.text-base-content\/75{color:var(--fallback-bc,oklch(var(--bc)/.75))}.text-base-content\/80{color:var(--fallback-bc,oklch(var(--bc)/.8))}.text-base-content\/85{color:var(--fallback-bc,oklch(var(--bc)/.85))}.text-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.text-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity, 1)))}.text-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.text-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity, 1)))}.text-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity, 1)))}.text-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity, 1)))}.opacity-50{opacity:.5}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}html,body,#root{height:100%}html{font-feature-settings:"cv02","cv03","cv04","cv11","ss01";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)));font-family:Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:.8125rem;line-height:1.25rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--fallback-b3,oklch(var(--b3)/1));border-radius:5px;border:2px solid var(--fallback-b1,oklch(var(--b1)/1))}::-webkit-scrollbar-thumb:hover{background:var(--fallback-n,oklch(var(--n)/1))}@keyframes ll-pulse{0%,to{opacity:1}50%{opacity:.35}}.ll-pulse{animation:ll-pulse 1.4s ease-in-out infinite}.hover\:border-accent:hover{--tw-border-opacity: 1;border-color:var(--fallback-a,oklch(var(--a)/var(--tw-border-opacity, 1)))}.hover\:border-info:hover{--tw-border-opacity: 1;border-color:var(--fallback-in,oklch(var(--in)/var(--tw-border-opacity, 1)))}.hover\:bg-base-300\/40:hover{background-color:var(--fallback-b3,oklch(var(--b3)/.4))}.hover\:text-accent\/80:hover{color:var(--fallback-a,oklch(var(--a)/.8))}.hover\:text-base-content:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity, 1)))}.hover\:underline:hover{text-decoration-line:underline}@media (min-width: 640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}
@@ -0,0 +1,19 @@
1
+ <!doctype html>
2
+ <html lang="en" data-theme="lastlight">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
7
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
8
+ <link
9
+ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Inter:wght@400;500;600;700&display=swap"
10
+ rel="stylesheet"
11
+ />
12
+ <title>Last Light — Eval Dashboard</title>
13
+ <script type="module" crossorigin src="/assets/index-YwScAAxm.js"></script>
14
+ <link rel="stylesheet" crossorigin href="/assets/index-uU9Sj3M4.css">
15
+ </head>
16
+ <body>
17
+ <div id="root"></div>
18
+ </body>
19
+ </html>
Binary file
@@ -0,0 +1,16 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ check:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - uses: actions/checkout@v4
12
+ - uses: actions/setup-node@v4
13
+ with:
14
+ node-version: "22"
15
+ - run: npm run lint
16
+ - run: npm test
@@ -5,4 +5,10 @@ A tiny inclusive date-range utility.
5
5
  - `inclusiveDayCount(start, end)` — number of whole days in the inclusive range.
6
6
  - `eachDay(start, end)` — every `YYYY-MM-DD` in the inclusive range.
7
7
 
8
- Run the tests with `npm test` (`node --test`).
8
+ ## Development
9
+
10
+ ```bash
11
+ npm test # node --test (TS via --experimental-strip-types)
12
+ npm run lint # dependency-free house-rule checks over src/
13
+ npm run check # lint + test (also run in CI — see .github/workflows/ci.yml)
14
+ ```
@@ -4,6 +4,8 @@
4
4
  "type": "module",
5
5
  "description": "Tiny date-range utility.",
6
6
  "scripts": {
7
- "test": "node --test --experimental-strip-types"
7
+ "test": "node --test --experimental-strip-types",
8
+ "lint": "node scripts/lint.mjs",
9
+ "check": "npm run lint && npm test"
8
10
  }
9
11
  }
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ // Tiny, dependency-free linter for src/ — runs offline (no install needed) and
3
+ // is intentionally UNRELATED to the date bug, so `npm run lint` is green before
4
+ // and after the fix. It just enforces a couple of house rules so the repo has a
5
+ // real, passing lint command (what the build workflow's guardrails phase looks
6
+ // for in a maintained project).
7
+ import { readdirSync, readFileSync } from "node:fs";
8
+ import { fileURLToPath } from "node:url";
9
+ import { dirname, join } from "node:path";
10
+
11
+ const srcDir = join(dirname(fileURLToPath(import.meta.url)), "..", "src");
12
+ const problems = [];
13
+ for (const name of readdirSync(srcDir)) {
14
+ if (!name.endsWith(".ts")) continue;
15
+ const text = readFileSync(join(srcDir, name), "utf8");
16
+ if (!text.endsWith("\n")) problems.push(`${name}: missing final newline`);
17
+ if (/\bconsole\.log\(/.test(text)) problems.push(`${name}: stray console.log`);
18
+ if (/[ \t]+$/m.test(text)) problems.push(`${name}: trailing whitespace`);
19
+ }
20
+
21
+ if (problems.length) {
22
+ console.error(`lint failed (${problems.length}):\n ${problems.join("\n ")}`);
23
+ process.exit(1);
24
+ }
25
+ console.log("lint ok");
@@ -0,0 +1,14 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ import { eachDay } from "../src/date-range.ts";
5
+
6
+ const d = (s: string): Date => new Date(`${s}T00:00:00Z`);
7
+
8
+ // Pre-existing coverage for behaviour UNRELATED to the off-by-one bug being
9
+ // fixed — it passes before and after the fix (PASS_TO_PASS in the instance
10
+ // definition). It ships in the repo (like a real SWE-bench base test suite) so
11
+ // the build workflow's guardrails phase sees a tested, maintained project.
12
+ test("eachDay still lists every inclusive day", () => {
13
+ assert.deepEqual(eachDay(d("2026-01-01"), d("2026-01-03")), ["2026-01-01", "2026-01-02", "2026-01-03"]);
14
+ });
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "allowImportingTsExtensions": true,
7
+ "verbatimModuleSyntax": true,
8
+ "strict": true,
9
+ "noEmit": true,
10
+ "skipLibCheck": true
11
+ },
12
+ "include": ["src", "test"]
13
+ }
@@ -1,10 +1,14 @@
1
1
  import { test } from "node:test";
2
2
  import assert from "node:assert/strict";
3
3
 
4
- import { inclusiveDayCount, eachDay } from "./src/date-range.ts";
4
+ import { inclusiveDayCount } from "./src/date-range.ts";
5
5
 
6
6
  const d = (s: string): Date => new Date(`${s}T00:00:00Z`);
7
7
 
8
+ // HELD-OUT, bug-revealing tests (FAIL_TO_PASS) — kept out of the seeded repo so
9
+ // the agent can't see or edit what it's graded on. Copied in by the grader
10
+ // AFTER the agent runs: red before the fix, green after. The PASS_TO_PASS
11
+ // "eachDay …" test ships in the repo itself (see repos/<id>/test/).
8
12
  test("inclusive single day counts as one", () => {
9
13
  assert.equal(inclusiveDayCount(d("2026-01-01"), d("2026-01-01")), 1);
10
14
  });
@@ -12,7 +16,3 @@ test("inclusive single day counts as one", () => {
12
16
  test("inclusive three day span counts as three", () => {
13
17
  assert.equal(inclusiveDayCount(d("2026-01-01"), d("2026-01-03")), 3);
14
18
  });
15
-
16
- test("eachDay still lists every inclusive day", () => {
17
- assert.deepEqual(eachDay(d("2026-01-01"), d("2026-01-03")), ["2026-01-01", "2026-01-02", "2026-01-03"]);
18
- });
package/dist/arm.js ADDED
@@ -0,0 +1,132 @@
1
+ /**
2
+ * The Arm — one column of the model-comparison axis, behind one interface.
3
+ *
4
+ * A comparison run has N arms. Every arm flows through the SAME downstream
5
+ * machinery (work-list → grade → scorecard → dashboard); arms differ only in
6
+ * *how a workflow step picks its model*. That fork has exactly two shapes:
7
+ *
8
+ * - `models` runs — one model FORCED across every step (`modelsArm`).
9
+ * - `config` runs — a deployment's REAL per-step model config drives selection
10
+ * (`configArm`): the merged `models`/`variants` maps from core's
11
+ * `default.yaml` ← an overlay's `config.yaml`, threaded to core exactly as
12
+ * production does so core picks the model per phase.
13
+ *
14
+ * Before this module that fork was re-decided in ~5 places across `run.ts` and
15
+ * `run-instance.ts` (every `if (modelConfig)` / `runType === "config"`). Here it
16
+ * lives once, as polymorphism over two adapters. The seam:
17
+ *
18
+ * - `prepare(ctx)` — the single per-run model operation: patch `ctx.models`/
19
+ * `ctx.variants` (config only) AND hand back the `ExecutorConfig.model` +
20
+ * the `runWorkflow` `models`/`variants` args. Always invoked together, so
21
+ * it's one call.
22
+ * - `recordPhaseModel(template, phase)` — the model a phase resolved to, for
23
+ * the scorecard (runs per-phase, AFTER the workflow — kept separate).
24
+ * - `activate()` — repoint the process-global asset root to this arm's overlay
25
+ * (config only; guarded — see ADR 0001). `modelsArm` is a no-op.
26
+ * - `describe()` — the per-step `k→v` summary for the plan note (config only).
27
+ *
28
+ * `run.ts` owns *which* arms exist (flag + registry resolution); the adapters own
29
+ * *how* to build one. This module imports `config.ts` + `bootstrap.ts` (local)
30
+ * and NEVER the `lastlight/evals` barrel — that coupling stays in
31
+ * `run-instance.ts`, the only file that calls `runWorkflow`.
32
+ */
33
+ import { basename } from "node:path";
34
+ import { loadMergedConfig, resolvePhaseModel } from "./config.js";
35
+ import { bootstrapAssets } from "./bootstrap.js";
36
+ /**
37
+ * `models` arm — one model id forced across every workflow step. No ctx patch,
38
+ * no overlay, no per-step map: the label IS the model and every phase runs it.
39
+ */
40
+ export function modelsArm(id, family) {
41
+ return {
42
+ label: id,
43
+ family,
44
+ activate() {
45
+ /* no overlay to switch — built-in assets only */
46
+ },
47
+ prepare() {
48
+ // No `models`/`variants` → core falls every phase back to config.model = id.
49
+ return { model: id };
50
+ },
51
+ recordPhaseModel() {
52
+ return id;
53
+ },
54
+ describe() {
55
+ return undefined;
56
+ },
57
+ };
58
+ }
59
+ /**
60
+ * `config` arm — a deployment's REAL per-step config drives model selection.
61
+ * Owns the YAML merge (`loadMergedConfig`), the optional `--model` default
62
+ * override, and its own label (`basename(overlayDir)` or `"config"`).
63
+ *
64
+ * @param builtInRoot the lastlight package root (holds `config/default.yaml`).
65
+ * @param overlayDir the overlay whose `config.yaml` merges over the defaults
66
+ * (and whose workflows/skills {@link Arm.activate} repoints to). Absent ⇒ core
67
+ * defaults only (a degenerate single-model config — still a valid arm).
68
+ * @param defaultOverride a `--model`-resolved id that replaces the merged
69
+ * config's `default` for quick what-if runs (run.ts resolves the token).
70
+ */
71
+ export function configArm(builtInRoot, overlayDir, defaultOverride) {
72
+ const merged = loadMergedConfig(builtInRoot, overlayDir);
73
+ if (defaultOverride)
74
+ merged.models.default = defaultOverride;
75
+ const label = overlayDir ? basename(overlayDir) : "config";
76
+ return {
77
+ label,
78
+ // config arms keep their own serial family (one overlay at a time — the
79
+ // asset root is a process global; see ADR 0001).
80
+ family: label,
81
+ activate() {
82
+ activateOverlay(overlayDir);
83
+ },
84
+ prepare(ctx) {
85
+ // Thread the merged maps onto ctx EXACTLY as production (`simple.js`) does
86
+ // so `model: "{{models.X}}"` phase templates resolve against `ctx.models`.
87
+ ctx.models = merged.models;
88
+ ctx.variants = merged.variants;
89
+ return { model: merged.models.default, models: merged.models, variants: merged.variants };
90
+ },
91
+ recordPhaseModel(template, phase) {
92
+ return resolvePhaseModel(template, phase, merged.models);
93
+ },
94
+ describe() {
95
+ return Object.entries(merged.models)
96
+ .map(([k, v]) => `${k}→${v}`)
97
+ .join(" ");
98
+ },
99
+ };
100
+ }
101
+ // ── The process-global overlay guard (ADR 0001) ──────────────────────────────
102
+ // Core's asset root is module-level state inside the `lastlight` package — there
103
+ // is one "current overlay" for the whole process. Config arms switch it between
104
+ // arms (serial), which is safe; two overlays active AT ONCE would race. The
105
+ // guard turns that discipline-maintained invariant into a runtime-checked one:
106
+ // it records the active overlay and throws if a different one is activated while
107
+ // the current is still in use. The serial run loop calls `releaseOverlayGuard()`
108
+ // when it finishes an arm, so the legitimate sequential switch never trips it.
109
+ let activeOverlay;
110
+ let overlayActive = false;
111
+ function activateOverlay(overlayDir) {
112
+ if (overlayActive && overlayDir !== activeOverlay) {
113
+ throw new Error(`Refusing to activate overlay ${overlayDir ?? "(core defaults)"} while ` +
114
+ `${activeOverlay ?? "(core defaults)"} is still in use — the workflow asset root is ` +
115
+ `process-global (see ADR 0001), so config arms must run serially. Call ` +
116
+ `releaseOverlayGuard() before switching overlays.`);
117
+ }
118
+ bootstrapAssets({ overlayDir });
119
+ activeOverlay = overlayDir;
120
+ overlayActive = true;
121
+ }
122
+ /**
123
+ * Release the overlay guard so the next arm may activate a different overlay.
124
+ * The serial run loop calls this on each arm change (and a focused test calls it
125
+ * to reset between assertions). Reaching {@link activateOverlay} with a different
126
+ * overlay WITHOUT a release first is the parallel footgun the guard catches.
127
+ */
128
+ export function releaseOverlayGuard() {
129
+ activeOverlay = undefined;
130
+ overlayActive = false;
131
+ }
132
+ //# sourceMappingURL=arm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arm.js","sourceRoot":"","sources":["../src/arm.ts"],"names":[],"mappings":"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"}
package/dist/config.js ADDED
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Per-step model config loader — the heart of the `config` run type.
3
+ *
4
+ * The `models` run type forces ONE model across every workflow step. The
5
+ * `config` run type instead reproduces what a real deployment ships: a
6
+ * per-workflow-step model map (`models.guardrails`, `models.architect`, …)
7
+ * merged from core's `config/default.yaml` and an overlay's `config.yaml`,
8
+ * exactly as production's {@link https://…/dist/config.js loadConfig} does.
9
+ *
10
+ * Core does NOT export its `loadConfig`/`ModelConfig` via the `lastlight/evals`
11
+ * barrel, so we read + deep-merge the two YAMLs ourselves — but ONLY the
12
+ * `models` / `variants` maps, and with the same semantics core uses
13
+ * (per-key overlay-wins, string values only, a guaranteed `default`). The
14
+ * resolved maps are then handed to core's runner via `ctx.models`/`ctx.variants`
15
+ * + the `runWorkflow` args, so actual per-phase selection is still delegated to
16
+ * core — we never re-implement the selection itself, only mirror it for
17
+ * RECORDING (see {@link resolvePhaseModel}).
18
+ */
19
+ import { existsSync, readFileSync } from "node:fs";
20
+ import { join } from "node:path";
21
+ import { parse as parseYaml } from "yaml";
22
+ /** Core's fallback when neither default.yaml nor the overlay sets a default. */
23
+ const DEFAULT_MODEL = "anthropic/claude-sonnet-4-6";
24
+ function isPlainObject(v) {
25
+ return typeof v === "object" && v !== null && !Array.isArray(v);
26
+ }
27
+ /** Parse a YAML file's top-level mapping, or {} if absent/empty. */
28
+ function readYamlMap(path) {
29
+ if (!existsSync(path))
30
+ return {};
31
+ const parsed = parseYaml(readFileSync(path, "utf-8"));
32
+ return isPlainObject(parsed) ? parsed : {};
33
+ }
34
+ /** Pull a sub-map of string values from a raw config object (core semantics:
35
+ * non-string entries are dropped). */
36
+ function stringMap(raw, key) {
37
+ const sub = isPlainObject(raw[key]) ? raw[key] : {};
38
+ const out = {};
39
+ for (const [k, v] of Object.entries(sub))
40
+ if (typeof v === "string")
41
+ out[k] = v;
42
+ return out;
43
+ }
44
+ /**
45
+ * Load the merged `models`/`variants` config, mirroring production's
46
+ * default.yaml ← overlay/config.yaml deep-merge (overlay wins per key).
47
+ *
48
+ * @param builtInRoot the lastlight package root (from `resolveCoreRoot()`),
49
+ * which holds `config/default.yaml`.
50
+ * @param overlayDir optional overlay dir holding `config.yaml`. Absent ⇒ just
51
+ * the core defaults (a degenerate single-model config — still a valid arm).
52
+ */
53
+ export function loadMergedConfig(builtInRoot, overlayDir) {
54
+ const def = readYamlMap(join(builtInRoot, "config", "default.yaml"));
55
+ const overlay = overlayDir ? readYamlMap(join(overlayDir, "config.yaml")) : {};
56
+ const models = {
57
+ default: DEFAULT_MODEL,
58
+ ...stringMap(def, "models"),
59
+ ...stringMap(overlay, "models"),
60
+ };
61
+ const variants = {
62
+ ...stringMap(def, "variants"),
63
+ ...stringMap(overlay, "variants"),
64
+ };
65
+ return { models, variants };
66
+ }
67
+ /** Walk a dotted key (e.g. `models.guardrails`) over a context object. */
68
+ function walkKey(ctx, key) {
69
+ let cur = ctx;
70
+ for (const seg of key.split(".")) {
71
+ if (!isPlainObject(cur))
72
+ return undefined;
73
+ cur = cur[seg];
74
+ }
75
+ return cur;
76
+ }
77
+ /** Render a `{{models.X}}`-style template against the models map (the subset of
78
+ * core's renderTemplate that phase `model:` fields ever use). */
79
+ function renderModelTemplate(template, models) {
80
+ return template.replace(/\{\{([\w-]+(?:\.[\w-]+)*)\}\}/g, (_m, key) => {
81
+ const val = walkKey({ models }, key);
82
+ return val === undefined || val === null ? "" : String(val);
83
+ });
84
+ }
85
+ /**
86
+ * Resolve the model a phase will actually run on, mirroring core's
87
+ * `resolveModelVariant` precedence for RECORDING into the scorecard
88
+ * (`PhaseMetric.model`). Core does the real selection; this just lets the
89
+ * dashboard show the per-step assignment without a round-trip.
90
+ *
91
+ * rendered `{{models.X}}` template → models[phaseName] → models.default
92
+ *
93
+ * @param template the phase's raw `model:` field (e.g. `"{{models.executor}}"`),
94
+ * or undefined for phases that name no model.
95
+ */
96
+ export function resolvePhaseModel(template, phaseName, models) {
97
+ const rendered = template ? renderModelTemplate(template, models).trim() : "";
98
+ return rendered || models[phaseName] || models.default;
99
+ }
100
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}