@font-face{font-family:"DM Sans";font-style:normal;font-display:swap;font-weight:100 1000;src:url("./fonts/dm-sans-latin-ext-wght-normal.woff2") format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"DM Sans";font-style:normal;font-display:swap;font-weight:100 1000;src:url("./fonts/dm-sans-latin-wght-normal.woff2") format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Space Grotesk";font-style:normal;font-display:swap;font-weight:300 700;src:url("./fonts/space-grotesk-latin-ext-wght-normal.woff2") format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"Space Grotesk";font-style:normal;font-display:swap;font-weight:300 700;src:url("./fonts/space-grotesk-latin-wght-normal.woff2") format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
*,*::before,*::after{box-sizing:border-box}
/* `hidden` means hidden. A component that gives an element a display value —
   and most of them do — silently outranks the attribute, so a panel filtered
   by script goes on showing everything it was told to hide. */
[hidden]{display:none!important}
/* Viewport plumbing. The insets need `viewport-fit=cover` in the page's
   viewport meta to resolve to anything; without it they are 0 and every rule
   below degrades to the old flush-to-the-edge layout. The fallbacks keep the
   calc() arithmetic valid on browsers that do not implement env() at all. */
:root{--sk-safe-top:env(safe-area-inset-top,0px);--sk-safe-bottom:env(safe-area-inset-bottom,0px);--sk-safe-left:env(safe-area-inset-left,0px);--sk-safe-right:env(safe-area-inset-right,0px);--sk-gutter:var(--sk-space-gutter);--sk-action-bar-height:calc(var(--sk-size-control-lg) + var(--sk-space-3)*2 + 1px)}
@media(min-width:48rem){:root{--sk-gutter:var(--sk-space-gutter-wide)}}
html{color-scheme:light;background:var(--sk-color-canvas);font-family:var(--sk-font-body);color:var(--sk-color-text)}
html[data-sk-theme="dark"]{color-scheme:dark}
body{margin:0;background:var(--sk-color-canvas);color:var(--sk-color-text)}
button,input,textarea,select{font:inherit;color:inherit}
a{color:inherit}
:where(a[href],button,summary,label.sk-check,label.sk-toggle,[data-sk-modal-open]){cursor:pointer}:where(button,[role=button])[disabled],[aria-disabled=true]{cursor:not-allowed}
:focus-visible{outline:var(--sk-focus-ring) solid var(--sk-color-focus);outline-offset:var(--sk-focus-ring-offset)}
/* Icon-sized controls take a proportionate ring. Set on the container as
   readily as on the control: both properties inherit, so a meta line full
   of .9rem glyphs declares it once. */
[data-sk-focus-compact],.sk-nav-heading__actions{--sk-focus-ring:.09375rem;--sk-focus-ring-offset:.0625rem}
/* Closing a dialog returns focus to whatever opened it, which is right for
   the keyboard and unwanted for the mouse — and :focus-visible cannot tell
   them apart when a script moves focus, so the ordinary path of clicking an
   icon and closing its dialog ended on a heavy ring nobody asked for. The
   modal script marks a pointer-opened opener, and clears the mark at the
   first key, so the keyboard never loses the ring. */
[data-sk-focus-quiet]:focus-visible{outline:0}
.sk-icon{display:inline-block;flex:none;width:1.25rem;height:1.25rem;background-color:currentColor;vertical-align:middle;-webkit-mask:var(--sk-icon-mask) center/contain no-repeat;mask:var(--sk-icon-mask) center/contain no-repeat}.sk-icon--size-16{width:1rem;height:1rem}.sk-icon--size-18{width:1.125rem;height:1.125rem}.sk-icon--size-20{width:1.25rem;height:1.25rem}.sk-icon--size-24{width:1.5rem;height:1.5rem}.sk-icon--size-32{width:2rem;height:2rem}
.sk-icon--square-check-big{--sk-icon-mask:url("./icons/lucide/square-check-big.svg")}.sk-icon--folder{--sk-icon-mask:url("./icons/lucide/folder.svg")}.sk-icon--plus{--sk-icon-mask:url("./icons/lucide/plus.svg")}.sk-icon--settings{--sk-icon-mask:url("./icons/lucide/settings.svg")}.sk-icon--moon{--sk-icon-mask:url("./icons/lucide/moon.svg")}.sk-icon--x{--sk-icon-mask:url("./icons/lucide/x.svg")}.sk-icon--chevrons-up-down{--sk-icon-mask:url("./icons/lucide/chevrons-up-down.svg")}.sk-icon--arrow-right{--sk-icon-mask:url("./icons/lucide/arrow-right.svg")}.sk-icon--external-link{--sk-icon-mask:url("./icons/lucide/external-link.svg")}.sk-icon--mail{--sk-icon-mask:url("./icons/lucide/mail.svg")}.sk-icon--user{--sk-icon-mask:url("./icons/lucide/user.svg")}.sk-icon--trash-2{--sk-icon-mask:url("./icons/lucide/trash-2.svg")}.sk-icon--pencil{--sk-icon-mask:url("./icons/lucide/pencil.svg")}.sk-icon--notebook-pen{--sk-icon-mask:url("./icons/lucide/notebook-pen.svg")}.sk-icon--users{--sk-icon-mask:url("./icons/lucide/users.svg")}.sk-icon--bell{--sk-icon-mask:url("./icons/lucide/bell.svg")}.sk-icon--bell-off{--sk-icon-mask:url("./icons/lucide/bell-off.svg")}.sk-icon--log-out{--sk-icon-mask:url("./icons/lucide/log-out.svg")}.sk-icon--crown{--sk-icon-mask:url("./icons/lucide/crown.svg")}
.sk-icon--check{--sk-icon-mask:url("./icons/lucide/check.svg")}
.sk-icon--hourglass{--sk-icon-mask:url("./icons/lucide/hourglass.svg")}.sk-icon--snowflake{--sk-icon-mask:url("./icons/lucide/snowflake.svg")}.sk-icon--flame{--sk-icon-mask:url("./icons/lucide/flame.svg")}
.sk-icon--arrow-up{--sk-icon-mask:url("./icons/lucide/arrow-up.svg")}.sk-icon--arrow-down{--sk-icon-mask:url("./icons/lucide/arrow-down.svg")}.sk-icon--list-ordered{--sk-icon-mask:url("./icons/lucide/list-ordered.svg")}
.sk-icon--search{--sk-icon-mask:url("./icons/lucide/search.svg")}
.sk-icon--menu{--sk-icon-mask:url("./icons/lucide/menu.svg")}
.sk-icon--ellipsis-vertical{--sk-icon-mask:url("./icons/lucide/ellipsis-vertical.svg")}
.sk-icon--minus{--sk-icon-mask:url("./icons/lucide/minus.svg")}
.sk-icon--list{--sk-icon-mask:url("./icons/lucide/list.svg")}.sk-icon--tag{--sk-icon-mask:url("./icons/lucide/tag.svg")}.sk-icon--chart-no-axes-column{--sk-icon-mask:url("./icons/lucide/chart-no-axes-column.svg")}
.sk-icon--play{--sk-icon-mask:url("./icons/lucide/play.svg")}.sk-icon--circle-stop{--sk-icon-mask:url("./icons/lucide/circle-stop.svg")}
.sk-icon--clock{--sk-icon-mask:url("./icons/lucide/clock.svg")}.sk-icon--clock-off{--sk-icon-mask:url("./icons/lucide/clock-off.svg")}
/* The clock is drawn to the edge of its box — a circle of radius 10 in a 24
   square, so with the stroke it reaches 1 and 23 — while the icons it sits
   beside keep about two units of air. At the same nominal size it therefore
   renders visibly larger and heavier, and in a row of buttons it reads as out
   of line. Scaled to the same optical size as its neighbours; the box, and so
   the button's centre, is unchanged. */
.sk-icon--clock,.sk-icon--clock-off{-webkit-mask-size:88%;mask-size:88%}
.sk-icon--message-circle{--sk-icon-mask:url("./icons/lucide/message-circle.svg")}.sk-icon--send{--sk-icon-mask:url("./icons/lucide/send.svg")}
.sk-icon--funnel{--sk-icon-mask:url("./icons/lucide/funnel.svg")}.sk-icon--calendar{--sk-icon-mask:url("./icons/lucide/calendar.svg")}.sk-icon--calendar-days{--sk-icon-mask:url("./icons/lucide/calendar-days.svg")}.sk-icon--inbox{--sk-icon-mask:url("./icons/lucide/inbox.svg")}
.sk-icon--chevron-down{--sk-icon-mask:url("./icons/lucide/chevron-down.svg")}.sk-icon--grip-vertical{--sk-icon-mask:url("./icons/lucide/grip-vertical.svg")}
.sk-icon--sun{--sk-icon-mask:url("./icons/lucide/sun.svg")}.sk-icon--monitor{--sk-icon-mask:url("./icons/lucide/monitor.svg")}
.sk-icon--upload{--sk-icon-mask:url("./icons/lucide/upload.svg")}.sk-icon--file-text{--sk-icon-mask:url("./icons/lucide/file-text.svg")}.sk-icon--circle-alert{--sk-icon-mask:url("./icons/lucide/circle-alert.svg")}.sk-icon--repeat{--sk-icon-mask:url("./icons/lucide/repeat.svg")}
.sk-button{display:inline-flex;min-height:var(--sk-size-control);align-items:center;justify-content:center;gap:var(--sk-space-2);padding:0 var(--sk-space-5);border:1px solid transparent;border-radius:var(--sk-radius-md);font-weight:700;text-decoration:none;cursor:pointer}
.sk-button--sm{min-height:var(--sk-size-control-sm);padding-inline:var(--sk-space-3);font-size:.875rem}.sk-button--lg{min-height:var(--sk-size-control-lg)}
.sk-button--primary{background:var(--sk-color-accent);color:var(--sk-color-on-accent)}
.sk-button--secondary{border-color:var(--sk-color-border);background:var(--sk-color-surface);color:var(--sk-color-text)}
/* on-danger, not #fff: under the dark theme danger is a light red, and white on
   it is unreadable. */
.sk-button--ghost{background:transparent;color:var(--sk-color-text)}.sk-button--danger{background:var(--sk-color-danger);color:var(--sk-color-on-danger)}
.sk-button[disabled]{opacity:.5;cursor:not-allowed}
.sk-card{padding:var(--sk-space-6);border:1px solid var(--sk-color-border);border-radius:var(--sk-radius-lg);background:var(--sk-color-surface)}
.sk-card--muted{background:var(--sk-color-surface-muted)}.sk-card--interactive{transition:transform 140ms,box-shadow 140ms}.sk-card--interactive:hover{transform:translateY(-2px);box-shadow:var(--sk-component-shadow-panel)}
.sk-badge{display:inline-flex;flex:none;align-items:center;min-height:1.5rem;padding:0 .55rem;border-radius:var(--sk-radius-pill);background:var(--sk-color-active);font-size:.75rem;font-weight:700;white-space:nowrap}
.sk-badge--accent{background:var(--sk-color-accent);color:var(--sk-color-on-accent)}.sk-badge--success{color:var(--sk-color-success)}.sk-badge--danger{color:var(--sk-color-danger)}
.sk-container{width:min(calc(100% - 2rem),var(--sk-size-content));margin-inline:auto}.sk-container--text{max-width:var(--sk-size-text)}
.sk-section-heading h2{margin:.25rem 0;font:var(--sk-type-title-weight) var(--sk-type-title)/var(--sk-type-title-leading) var(--sk-font-display);letter-spacing:var(--sk-type-title-tracking)}.sk-section-heading p{max-width:42rem;color:var(--sk-color-text-muted)}
.sk-align--center{text-align:center;margin-inline:auto}.sk-eyebrow{text-transform:uppercase;letter-spacing:var(--sk-type-eyebrow-tracking);font-size:var(--sk-type-eyebrow);font-weight:var(--sk-type-eyebrow-weight);color:var(--sk-color-text-muted)}
.sk-field{display:grid;gap:.45rem}.sk-field label{font-size:.875rem;font-weight:700}.sk-field input,.sk-field textarea,.sk-field select{width:100%;min-height:var(--sk-size-control);padding:.7rem .85rem;border:1px solid var(--sk-color-border);border-radius:var(--sk-radius-md);background:var(--sk-color-surface)}.sk-field textarea{resize:vertical}.sk-field__hint{color:var(--sk-color-text-muted)}.sk-field__error{color:var(--sk-color-danger)}
:where(input:not([type]),input[type=text],input[type=email],input[type=password],input[type=search],input[type=url],input[type=tel],textarea,select):focus-visible{outline:0;border-color:var(--sk-color-text);box-shadow:inset 0 0 0 1px var(--sk-color-text)}
.sk-check{display:inline-flex;align-items:center;gap:.65rem;min-height:2.75rem;cursor:pointer}.sk-check input{position:absolute;opacity:0}.sk-check__box{display:inline-grid;flex:none;width:1.35rem;height:1.35rem;place-items:center;border:1px solid var(--sk-color-border);border-radius:.35rem;background:var(--sk-color-surface)}.sk-check__box::after{display:none;width:.9rem;height:.9rem;background:var(--sk-color-on-accent);content:"";-webkit-mask:url("./icons/lucide/check.svg") center/contain no-repeat;mask:url("./icons/lucide/check.svg") center/contain no-repeat}.sk-check input:checked+.sk-check__box{border-color:var(--sk-color-accent);background:var(--sk-color-accent)}.sk-check input:checked+.sk-check__box::after{display:block}.sk-check input:focus-visible+.sk-check__box{outline:var(--sk-focus-ring) solid var(--sk-color-focus);outline-offset:var(--sk-focus-ring-offset)}
.sk-toggle{display:inline-flex;align-items:center;gap:.7rem;min-height:2.75rem;cursor:pointer}.sk-toggle input{position:absolute;opacity:0}.sk-toggle__track{position:relative;width:2.5rem;height:1.45rem;border:1px solid var(--sk-color-border);border-radius:var(--sk-radius-pill);background:var(--sk-color-surface-muted);transition:background 140ms,border-color 140ms}.sk-toggle__track::after{content:"";position:absolute;top:.18rem;left:.2rem;width:.95rem;height:.95rem;border-radius:50%;background:var(--sk-color-text-muted);transition:transform 140ms,background 140ms}.sk-toggle input:checked+.sk-toggle__track{border-color:var(--sk-color-accent);background:var(--sk-color-accent)}.sk-toggle input:checked+.sk-toggle__track::after{background:var(--sk-color-on-accent);transform:translateX(1.05rem)}.sk-toggle input:focus-visible+.sk-toggle__track{outline:var(--sk-focus-ring) solid var(--sk-color-focus);outline-offset:var(--sk-focus-ring-offset)}
.sk-icon-button{display:inline-grid;width:2.75rem;height:2.75rem;place-items:center;border:0;border-radius:var(--sk-radius-md);background:transparent;cursor:pointer}.sk-icon-button:hover{background:var(--sk-color-active)}
.sk-disclosure>summary{display:flex;align-items:center;gap:.5rem;min-height:2.75rem;cursor:pointer;list-style:none}.sk-confirmation{padding:var(--sk-space-4);border:1px solid var(--sk-color-border);border-radius:var(--sk-radius-md);background:var(--sk-color-surface-muted)}
/* On a phone a modal is a bottom sheet: full width, anchored to the bottom
   edge within thumb reach, its body scrolling internally so the header stays
   put and the keyboard never pushes the whole dialog off screen. It becomes a
   centred dialog again at the shell breakpoint. */
.sk-modal{width:100%;max-width:none;max-height:85dvh;margin:auto auto 0;padding:0;border:0;border-radius:var(--sk-radius-xl) var(--sk-radius-xl) 0 0;background:transparent;color:var(--sk-color-text);overflow:visible}.sk-modal::backdrop{background:color-mix(in srgb,var(--sk-color-text) 52%,transparent);backdrop-filter:blur(3px)}.sk-modal__surface{display:flex;max-height:85dvh;flex-direction:column;overflow:hidden;border:1px solid var(--sk-color-border);border-radius:inherit;background:var(--sk-color-surface);box-shadow:var(--sk-component-shadow-panel)}.sk-modal__header{display:flex;flex:none;align-items:flex-start;justify-content:space-between;gap:1rem;padding:var(--sk-space-5) var(--sk-space-5) var(--sk-space-4)}.sk-modal__header h2{margin:0;font:var(--sk-type-heading-weight) var(--sk-type-heading)/var(--sk-type-heading-leading) var(--sk-font-display);letter-spacing:var(--sk-type-heading-tracking)}.sk-modal__header p{margin:.55rem 0 0;color:var(--sk-color-text-muted)}.sk-modal__header .sk-icon-button{margin:-.55rem -.55rem 0 0}.sk-modal__body{flex:1;overflow-y:auto;padding:0 var(--sk-space-5) calc(var(--sk-space-5) + var(--sk-safe-bottom))}
/* A footer carries the safe-area padding instead when there is one, so the
   inset is never counted twice. */
.sk-modal__surface:has(.sk-modal__footer) .sk-modal__body{padding-bottom:var(--sk-space-5)}
.sk-modal:target:not([open]){position:fixed;inset:0;z-index:100;display:grid;width:100vw;height:100dvh;max-height:none;margin:0;padding:0;align-content:end;border-radius:0;background:color-mix(in srgb,var(--sk-color-text) 52%,transparent)}.sk-modal:target:not([open]) .sk-modal__surface{width:100%}
.sk-modal__footer{display:flex;flex:none;align-items:center;justify-content:flex-end;gap:var(--sk-space-3);padding:var(--sk-space-4) var(--sk-space-5) calc(var(--sk-space-4) + var(--sk-safe-bottom));border-top:1px solid var(--sk-color-border);background:var(--sk-color-surface)}
.sk-toast-region{position:fixed;z-index:100;right:1rem;bottom:1rem;display:grid;gap:.75rem;width:min(24rem,calc(100% - 2rem))}
.sk-toast{display:flex;align-items:center;gap:var(--sk-space-3);padding:var(--sk-space-3) var(--sk-space-4);border:1px solid var(--sk-color-border);border-radius:var(--sk-radius-md);background:var(--sk-color-surface);box-shadow:var(--sk-component-shadow-panel)}
/* The shell is written narrow-first: what follows is the phone, and the
   sidebar layout is the exception declared once at 48rem. */
.sk-app-shell{min-height:100dvh}.sk-sidebar{display:none;position:fixed;inset:0 auto 0 0;width:var(--sk-component-sidebar-width);flex-direction:column;padding:2rem 1rem 1rem;border-right:1px solid var(--sk-color-border);background:var(--sk-color-surface-muted)}.sk-brand{display:grid;padding:.5rem 1rem 2rem;text-decoration:none}.sk-brand strong{font:var(--sk-type-heading-weight) 2rem/1 var(--sk-font-display);letter-spacing:var(--sk-type-heading-tracking)}.sk-brand small{margin-top:.45rem;color:var(--sk-color-text-muted);font:600 .7rem/1 var(--sk-font-display);letter-spacing:.14em;text-transform:uppercase}.sk-sidebar__action{margin:0 0 1rem}.sk-sidebar__action .sk-button{width:100%}.sk-sidebar__stat{margin:1rem 0 0}
.sk-sidebar nav{display:grid;min-width:0;gap:.2rem;overflow-x:hidden;overflow-y:auto}.sk-workspaces{min-width:0}.sk-nav-item{display:flex;min-width:0;min-height:2.75rem;align-items:center;gap:.7rem;padding:.55rem .8rem;border-radius:var(--sk-radius-md);color:var(--sk-color-text-muted);font-weight:400;text-decoration:none}.sk-nav-item__custom-icon{display:inline-grid;width:1.25rem;height:1.25rem;flex:none;place-items:center;font-size:1rem;line-height:1}.sk-workspaces .sk-nav-item{gap:.4rem;padding-right:.55rem;padding-left:1.25rem}.sk-workspaces>.sk-nav-item+.sk-nav-item{margin-top:.2rem}.sk-nav-item:hover,.sk-nav-item[data-active=true]{background:var(--sk-color-active);color:var(--sk-color-text)}.sk-nav-item__label{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sk-nav-item__badge{padding:.16rem .38rem;border-radius:var(--sk-radius-pill);background:var(--sk-color-active);color:var(--sk-color-text-muted);font-size:.62rem;font-weight:700;letter-spacing:.03em;text-transform:uppercase}.sk-nav-item__count{display:inline-grid;min-width:1.25rem;height:1.25rem;padding:0 .25rem;place-items:center;border-radius:var(--sk-radius-pill);background:var(--sk-color-accent);color:var(--sk-color-on-accent);font-size:.65rem;font-weight:700}.sk-nav-item[data-active=true] .sk-nav-item__badge{background:var(--sk-color-surface-muted)}.sk-nav-heading{display:flex;align-items:center;justify-content:space-between;margin:1.7rem .8rem .4rem;color:var(--sk-color-text-muted);font-size:.75rem;font-weight:800;text-transform:uppercase}.sk-nav-heading__actions{display:flex;align-items:center;gap:.25rem}.sk-nav-heading__actions .sk-icon-button{width:2rem;height:2rem}.sk-account-menu{position:relative;margin-top:auto;margin-right:-1rem;margin-left:-1rem;padding:.75rem 1rem 0;border-top:1px solid var(--sk-color-border)}.sk-account-menu>summary{display:flex;align-items:center;gap:.7rem;padding:.6rem;border-radius:var(--sk-radius-md);cursor:pointer;list-style:none;transition:background 140ms}.sk-account-menu>summary:hover,.sk-account-menu[open]>summary{background:var(--sk-color-active)}.sk-account-menu>summary>span:nth-child(2){display:grid;flex:1;min-width:0}.sk-account-menu>summary>span:nth-child(2)>strong,.sk-account-menu>summary>span:nth-child(2)>small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sk-account-menu small{color:var(--sk-color-text-muted)}.sk-avatar{display:inline-grid;overflow:hidden;width:2.5rem;height:2.5rem;place-items:center;border-radius:50%;background:var(--sk-color-active);font-weight:800;text-decoration:none}/* A circle, cropped to fill. Without both of these an <img> dropped in here
   renders as an unclipped rectangle squashed to the box's shape. */
.sk-avatar img{width:100%;height:100%;object-fit:cover}/* Sized to its longest row rather than to the sidebar. At width:100% the theme
   switch, Account and Sign out were all crammed into 16rem because that is what
   the sidebar happens to be; the panel is free to be wider than the column it
   hangs off, and only the viewport bounds it. Nothing above it clips: the
   overflow-x:hidden in this file is on `.sk-sidebar nav`, which the account
   menu is a sibling of. */
.sk-account-menu__panel{position:absolute;bottom:4.15rem;left:0;display:grid;min-width:100%;width:max-content;max-width:min(22rem,calc(100vw - 2rem));padding:.5rem;border:1px solid var(--sk-color-border);border-radius:var(--sk-radius-md);background:var(--sk-color-surface);box-shadow:var(--sk-component-shadow-panel)}.sk-account-menu__panel a,.sk-account-menu__panel button{display:flex;width:100%;min-height:2.75rem;align-items:center;gap:.6rem;padding:.5rem;border:0;background:transparent;text-decoration:none}.sk-account-menu__panel a:hover,.sk-account-menu__panel button:hover{background:var(--sk-color-active)}.sk-account-menu__logout{margin:.35rem -.5rem 0;padding:.35rem .5rem 0;border-top:1px solid var(--sk-color-border)}.sk-account-menu__version{display:block;padding:.45rem .5rem .1rem;color:var(--sk-color-text-muted);font-size:.7rem;text-align:center}/* The rule under the theme row and the rule above Sign out are the same
   separator seen twice, so they span the same width: the negative side margins
   cancel the panel's own padding, which is what .sk-account-menu__logout
   already does. Without them this one stopped short at both ends and the menu
   looked like two panels stacked. The mobile sheet resets both in
   .sk-theme-switch--wide, where the row is not inside that panel. */
.sk-theme-switch{display:flex;align-items:center;justify-content:space-between;gap:.5rem;margin:0 -.5rem .35rem;padding:.35rem .5rem .6rem;border-bottom:1px solid var(--sk-color-border)}.sk-theme-switch__label{color:var(--sk-color-text-muted);font-size:.8rem}.sk-theme-switch__options{display:inline-flex;padding:.15rem;gap:.15rem;border-radius:var(--sk-radius-pill);background:var(--sk-color-active)}.sk-account-menu__panel .sk-theme-switch__option,.sk-mobile-menu .sk-theme-switch__option{display:inline-grid;width:2rem;min-height:2rem;height:2rem;padding:0;place-items:center;border:0;border-radius:var(--sk-radius-pill);background:transparent;color:var(--sk-color-text-muted);cursor:pointer}.sk-account-menu__panel .sk-theme-switch__option:hover,.sk-mobile-menu .sk-theme-switch__option:hover{background:var(--sk-color-surface-muted);color:var(--sk-color-text)}.sk-account-menu__panel .sk-theme-switch__option[data-active=true],.sk-mobile-menu .sk-theme-switch__option[data-active=true]{background:var(--sk-color-surface);color:var(--sk-color-text);box-shadow:var(--sk-component-shadow-panel)}.sk-theme-switch--wide{margin:0 0 .5rem;padding:.5rem .8rem .75rem}.sk-account-menu__panel a .sk-account-menu__away{margin-left:auto;color:var(--sk-color-text-muted)}.sk-main{min-height:100dvh;margin:0;padding:calc(var(--sk-component-mobile-header-height) + var(--sk-safe-top)) 0 calc(var(--sk-component-mobile-bar-height) + var(--sk-safe-bottom) + 1rem)}
/* Both fixed bars grow by their inset and pad it back, so their content is
   centred in the part of the bar the hardware actually leaves visible. */
/* will-change:transform promotes this to its own compositing layer, the same
   reason yat gives a dragging todo row one. Fixed and blurred with nothing to
   force a layer of its own, it repaints against the content scrolling under
   it on iOS Safari and visibly jitters during momentum scroll. */
.sk-mobile-header{position:fixed;z-index:20;inset:0 0 auto;display:flex;height:calc(var(--sk-component-mobile-header-height) + var(--sk-safe-top));align-items:center;justify-content:space-between;padding:var(--sk-safe-top) max(1rem,var(--sk-safe-right)) 0 max(1rem,var(--sk-safe-left));border-bottom:1px solid var(--sk-color-border);background:color-mix(in srgb,var(--sk-color-surface-muted) 92%,transparent);backdrop-filter:blur(12px);will-change:transform}.sk-mobile-brand{display:flex;align-items:baseline;gap:.45rem;font:var(--sk-type-heading-weight) 1.35rem var(--sk-font-display);letter-spacing:var(--sk-type-heading-tracking)}.sk-mobile-brand a{text-decoration:none}.sk-mobile-brand__byline,.sk-mobile-brand small{color:var(--sk-color-text-muted);font:600 .62rem/1 var(--sk-font-display);letter-spacing:.06em}
.sk-app-shell[data-mobile-menu=true] .sk-main{padding-bottom:1rem}.sk-app-shell[data-mobile-menu=true] .sk-action-bar{bottom:0;padding-bottom:max(var(--sk-space-3),var(--sk-safe-bottom))}
.sk-mobile-menu{position:fixed;inset:0;z-index:100;width:100%;height:100dvh;max-width:none;max-height:none;margin:0;padding:0;border:0;background:var(--sk-color-surface)}.sk-mobile-menu::backdrop{background:color-mix(in srgb,var(--sk-color-text) 52%,transparent)}.sk-mobile-menu__surface{display:grid;height:100%;grid-template-rows:auto minmax(0,1fr);padding:var(--sk-safe-top) max(1rem,var(--sk-safe-right)) var(--sk-safe-bottom) max(1rem,var(--sk-safe-left));background:var(--sk-color-surface)}.sk-mobile-menu__header{display:flex;min-height:var(--sk-component-mobile-header-height);align-items:center;justify-content:space-between;border-bottom:1px solid var(--sk-color-border)}.sk-mobile-menu__nav{display:flex;min-height:0;flex-direction:column;padding:1rem 0;overflow-y:auto}.sk-mobile-menu__nav .sk-nav-item{width:100%;min-height:var(--sk-size-touch);border:0;background:transparent;font:inherit;text-align:left;cursor:pointer}.sk-mobile-menu__primary-action{padding:0 .5rem 1rem}.sk-mobile-menu__primary-action .sk-button{width:100%}.sk-mobile-menu__actions{display:grid;gap:.15rem;margin-bottom:.5rem;padding-bottom:.5rem;border-bottom:1px solid var(--sk-color-border)}.sk-mobile-menu__workspaces{display:grid;gap:.15rem}.sk-mobile-menu__workspaces h3{margin:1.25rem .8rem .35rem;color:var(--sk-color-text-muted);font-size:.75rem;text-transform:uppercase}.sk-mobile-menu__account{display:grid;gap:.15rem;margin-top:auto;padding-top:1rem;border-top:1px solid var(--sk-color-border)}.sk-mobile-menu__account form{margin:0}.sk-mobile-menu__version{padding:.75rem;text-align:center;color:var(--sk-color-text-muted);font-size:.7rem}
.sk-bottom-nav{position:fixed;z-index:20;inset:auto 0 0;display:flex;height:calc(var(--sk-component-mobile-bar-height) + var(--sk-safe-bottom));align-items:stretch;padding:0 var(--sk-safe-right) var(--sk-safe-bottom) var(--sk-safe-left);border-top:1px solid var(--sk-color-border);background:var(--sk-color-surface-muted)}.sk-bottom-nav .sk-nav-item{flex:1;flex-direction:column;justify-content:center;gap:.2rem;border-radius:0;padding:.35rem;font-size:.7rem}.sk-bottom-nav .sk-nav-item span{flex:none;max-width:100%}
/* The generalisation of the SSS uploader bar: the screen's primary action,
   pinned above the bottom nav in thumb reach. Content that sits behind it
   reserves room with padding-bottom:var(--sk-action-bar-height). */
.sk-action-bar{position:fixed;z-index:19;inset:auto 0 calc(var(--sk-component-mobile-bar-height) + var(--sk-safe-bottom)) 0;display:flex;align-items:center;gap:var(--sk-space-3);padding:var(--sk-space-3) max(var(--sk-gutter),var(--sk-safe-right)) var(--sk-space-3) max(var(--sk-gutter),var(--sk-safe-left));border-top:1px solid var(--sk-color-border);background:color-mix(in srgb,var(--sk-color-surface-muted) 94%,transparent);backdrop-filter:blur(12px)}
/* The element that should absorb the free width is marked explicitly rather
   than positionally — the first child of a form is usually its CSRF input. */
.sk-action-bar>*{min-width:0}.sk-action-bar__grow{flex:1;min-width:0}.sk-action-bar .sk-button{min-height:var(--sk-size-control-lg)}
@media(min-width:48rem){
.sk-sidebar{display:flex}
.sk-main{margin-left:var(--sk-component-sidebar-width);padding:0}
.sk-mobile-header,.sk-bottom-nav{display:none}
.sk-mobile-menu{display:none}
.sk-action-bar{position:static;padding:0;border-top:0;background:transparent;backdrop-filter:none}
.sk-modal{width:min(32rem,calc(100% - 2rem));max-height:calc(100dvh - 4rem);margin:auto;border-radius:var(--sk-radius-lg)}
.sk-modal__surface{max-height:calc(100dvh - 4rem)}
.sk-modal__header{padding:var(--sk-space-6) var(--sk-space-6) var(--sk-space-4)}
.sk-modal__body{padding:0 var(--sk-space-6) var(--sk-space-6)}
.sk-modal__footer{padding:var(--sk-space-4) var(--sk-space-6)}
.sk-modal:target:not([open]){padding:1rem;align-content:center;place-items:center}
.sk-modal:target:not([open]) .sk-modal__surface{width:min(32rem,100%);border-radius:var(--sk-radius-lg)}
}
/* An installed window whose manifest asks for `window-controls-overlay` has no
   title bar: the OS keeps a strip at the top for its buttons and gives the rest
   of that height to the document. Treated here as what it is — an inset at the
   top the hardware owns, the same shape as a notch — so every bar that already
   pads for --sk-safe-top moves out of the way without knowing why. */
.sk-titlebar{display:none}
@media(display-mode:window-controls-overlay){
:root{--sk-safe-top:calc(env(safe-area-inset-top,0px) + env(titlebar-area-height,0px))}
/* Full width, not just env(titlebar-area-width): on macOS the buttons sit at
   the left and the system paints over this strip anyway, and a band that stops
   short of an edge is a band the window cannot be dragged by. */
.sk-titlebar{position:fixed;z-index:30;inset:0 0 auto;display:block;height:env(titlebar-area-height,0px);background:var(--sk-color-surface-muted);-webkit-app-region:drag;app-region:drag}
}
@media(display-mode:window-controls-overlay) and (min-width:48rem){
.sk-sidebar{padding-top:calc(2rem + var(--sk-safe-top))}
.sk-main{padding-top:var(--sk-safe-top)}
}
.sk-brand{justify-items:start;text-decoration:none}.sk-brand a{display:block;text-decoration:none}.sk-brand small{display:block}
.sk-brand--inline{display:flex;align-items:baseline;gap:.65rem;padding:.7rem .55rem 1.75rem}.sk-brand--inline strong{font-size:1.35rem;letter-spacing:-.04em}.sk-brand--inline small{margin-top:0;font-size:.67rem;letter-spacing:.1em}
.sk-visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.sk-chip{display:inline-flex;min-height:2.25rem;align-items:center;gap:.4rem;padding:0 .8rem;border:1px solid var(--sk-color-border);border-radius:var(--sk-radius-pill);background:var(--sk-color-surface);color:var(--sk-color-text);font-weight:700;font-size:.8125rem;text-decoration:none}.sk-chip:hover{background:var(--sk-color-active)}/* Three ways of saying the same thing, because the selection is server-rendered
   in one application, a data attribute in another, and a script's aria-pressed
   in a third. They look identical because they mean the same thing to a reader:
   one of these, chosen. */
.sk-chip--selected,.sk-chip[data-selected=true],.sk-chip[aria-pressed=true]{border-color:var(--sk-color-accent);background:var(--sk-color-accent);color:var(--sk-color-on-accent)}
/* A chip that carries a hidden radio has to draw the focus ring itself, or a
   keyboard user loses the selection entirely. */
.sk-chip:has(input:focus-visible){outline:var(--sk-focus-ring) solid var(--sk-color-focus);outline-offset:var(--sk-focus-ring-offset)}.sk-chip .sk-icon{width:1rem;height:1rem}
.sk-stat-card{display:grid;gap:.35rem;padding:var(--sk-space-4) var(--sk-space-5);border:1px solid var(--sk-color-border);border-radius:var(--sk-radius-lg);background:var(--sk-color-surface)}.sk-stat-card__label{color:var(--sk-color-text-muted);font-size:var(--sk-type-eyebrow);letter-spacing:var(--sk-type-eyebrow-tracking);text-transform:uppercase}.sk-stat-card__value{font:var(--sk-type-heading-weight) 1.7rem/1.1 var(--sk-font-display);letter-spacing:var(--sk-type-heading-tracking);font-variant-numeric:tabular-nums}
/* On a phone the label takes the whole first line and the bar, value and share
   share the second, because a fixed label column narrow enough to leave room
   for all three truncates most real category names. One row again at 48rem. */
.sk-bar-row{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem}.sk-bar-row__label{flex:1 1 100%;width:auto;overflow:hidden;color:var(--sk-color-text);font-weight:700;font-size:.875rem;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;background:none;border:0;padding:0;text-align:left}a.sk-bar-row__label{cursor:pointer}a.sk-bar-row__label:hover{text-decoration:underline}.sk-bar-row__track{flex:1;height:.625rem;overflow:hidden;border-radius:var(--sk-radius-pill);background:var(--sk-color-surface-muted)}.sk-bar-row__fill{display:block;height:100%;border-radius:inherit;background:var(--sk-color-accent)}.sk-bar-row__value{flex:none;width:6rem;text-align:right;font:var(--sk-type-heading-weight) .875rem/1 var(--sk-font-display);font-variant-numeric:tabular-nums}.sk-bar-row__share{flex:none;width:3.25rem;text-align:right;color:var(--sk-color-text-muted);font-size:.78rem;font-variant-numeric:tabular-nums}.sk-bar-row__ignore{display:inline-grid;flex:none;width:1.5rem;height:1.5rem;place-items:center;border:0;border-radius:50%;background:var(--sk-color-surface-muted);color:var(--sk-color-text-muted);opacity:0;transition:opacity 120ms}.sk-bar-row:hover .sk-bar-row__ignore,.sk-bar-row__ignore:focus-visible{opacity:1}.sk-bar-row__ignore .sk-icon{width:.85rem;height:.85rem}
/* No hover on touch, so the ignore control is simply there. */
@media(hover:none),(pointer:coarse){.sk-bar-row__ignore{opacity:1}}
@media(min-width:48rem){.sk-bar-row{flex-wrap:nowrap;gap:var(--sk-space-4)}.sk-bar-row__label{flex:none;width:9.5rem}}
.sk-breadcrumbs ol{display:flex;flex-wrap:wrap;gap:.4rem;margin:0;padding:0;list-style:none;color:var(--sk-color-text-muted);font-size:.8125rem}.sk-breadcrumbs li{display:flex;align-items:center;gap:.4rem}.sk-breadcrumbs li:not(:last-child)::after{content:"/"}.sk-breadcrumbs a{color:var(--sk-color-text);font-weight:700;text-decoration:none}.sk-breadcrumbs a:hover{text-decoration:underline}.sk-breadcrumbs [aria-current=page]{color:var(--sk-color-text);font-weight:700}
/* Cards are the base and the table is the widening: a data list is a stack of
   cards on a phone, a table from 48rem. */
.sk-data-list__cards{display:grid;margin:0;padding:0;list-style:none}.sk-data-list__table-wrap{display:none;overflow-x:auto;border:1px solid var(--sk-color-border);border-radius:var(--sk-radius-lg);background:var(--sk-color-surface)}.sk-data-list__table{width:100%;border-collapse:collapse}.sk-data-list__table th,.sk-data-list__table td{padding:.8rem .9rem;border-bottom:1px solid var(--sk-color-border);text-align:left;vertical-align:middle}.sk-data-list__table th{color:var(--sk-color-text-muted);font-size:.78rem}.sk-data-list__table tbody tr:hover{background:var(--sk-color-surface-muted)}.sk-data-list__table tbody tr:last-child td{border-bottom:0}.sk-data-list__actions{display:flex;justify-content:flex-end;gap:.5rem;white-space:nowrap;opacity:0;transition:opacity 120ms}.sk-data-list__table tr:hover .sk-data-list__actions,.sk-data-list__actions:focus-within{opacity:1}
/* Card actions never hide behind hover — there is none on touch. */
.sk-data-list__card-actions{display:flex;justify-content:flex-start;gap:.5rem}.sk-data-list__card{display:grid;gap:.5rem;padding:1rem 1.15rem;border:1px solid var(--sk-color-border);border-radius:var(--sk-radius-lg);background:var(--sk-color-surface)}.sk-data-list__card+.sk-data-list__card{margin-top:.75rem}.sk-data-list__card-label{margin-right:.4rem;color:var(--sk-color-text-muted);font-size:.75rem}.sk-data-list--empty{padding:4rem 1rem;border:1px dashed var(--sk-color-border);border-radius:var(--sk-radius-lg);text-align:center;color:var(--sk-color-text-muted)}
.sk-data-list--plain .sk-data-list__table-wrap{overflow:visible;border:0;border-radius:0;background:transparent}.sk-data-list--plain .sk-data-list__table th,.sk-data-list--plain .sk-data-list__table td{border-bottom:0}.sk-data-list--plain .sk-data-list__table tbody tr[role=link]{cursor:pointer}.sk-data-list--plain .sk-data-list__table tbody tr[role=link]:focus-visible{outline:var(--sk-focus-ring) solid var(--sk-color-focus);outline-offset:calc(var(--sk-focus-ring-offset) * -1)}.sk-data-list--plain .sk-data-list__card{border:0;background:transparent}
@media(min-width:48rem){.sk-data-list__table-wrap{display:block}.sk-data-list__cards{display:none}}
/* Page furniture ------------------------------------------------------------
   The five things every application drew for itself, and drew differently: the
   content wrapper, the page heading, the empty state, the error banner and the
   interstitial. They are here so that a page title is the same size in the
   ledger as it is in the todo list, and so that the next application inherits
   the platform's rhythm instead of inventing a fifth version of it. */
/* The page rhythm is YAT's: a generous top margin on a wide screen, the gutter
   on both sides at every width, and a bottom that clears whatever is pinned to
   it. --sk-page-width is the measure, not the viewport — .sk-page--narrow is
   the reading width for a single column of prose or list items. */
.sk-page{width:min(100%,calc(var(--sk-page-width,var(--sk-size-content)) + var(--sk-gutter)*2));margin-inline:auto;padding:1.5rem var(--sk-gutter) var(--sk-space-8)}
.sk-page--narrow{--sk-page-width:56rem}
/* Content behind a pinned action bar reserves its height rather than ending
   underneath it. */
.sk-page--action-bar{padding-bottom:calc(var(--sk-action-bar-height) + var(--sk-space-6))}
.sk-page--stack{display:grid;gap:var(--sk-space-6);align-content:start}
@media(min-width:48rem){.sk-page{padding-top:6rem;padding-bottom:var(--sk-space-12)}.sk-page--action-bar{padding-bottom:5rem}}
/* Narrow-first: the title and whatever sits beside it are a stack on a phone
   and a row from 48rem. With no aside the row has a single child and behaves
   exactly like the block heading it replaces. */
.sk-page-heading{display:flex;flex-direction:column;align-items:flex-start;gap:var(--sk-space-6);margin:0 0 2.25rem}
.sk-page-heading__lede{min-width:0;flex:1}
.sk-page-heading h1{width:100%;margin:.45rem 0;font:var(--sk-type-display-weight) var(--sk-type-display)/var(--sk-type-display-leading) var(--sk-font-display);letter-spacing:var(--sk-type-display-tracking)}
.sk-page-heading h1>span{font-weight:350}.sk-page-heading h1>strong{font-weight:700}
.sk-page-heading p{margin:.75rem 0 0;max-width:60ch;color:var(--sk-color-text-muted)}
.sk-page-heading__aside{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sk-space-3)}
@media(min-width:48rem){.sk-page-heading{flex-direction:row;align-items:flex-end;justify-content:space-between}}
/* A heading for a surface inside a page — a card, a settings panel, a modal
   section. One step down from the page title and never fluid. */
.sk-panel-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--sk-space-4)}
.sk-panel-heading h2,.sk-heading{margin:.25rem 0;font:var(--sk-type-heading-weight) var(--sk-type-heading)/var(--sk-type-heading-leading) var(--sk-font-display);letter-spacing:var(--sk-type-heading-tracking)}
.sk-subheading{margin:0;font:var(--sk-type-subheading-weight) var(--sk-type-subheading)/var(--sk-type-subheading-leading) var(--sk-font-display);letter-spacing:var(--sk-type-subheading-tracking)}
.sk-empty{display:grid;justify-items:center;gap:.4rem;padding:3.5rem var(--sk-gutter);text-align:center;color:var(--sk-color-text-muted)}
.sk-empty h2{margin:0;font:var(--sk-type-subheading-weight) var(--sk-type-subheading)/var(--sk-type-subheading-leading) var(--sk-font-display);letter-spacing:var(--sk-type-subheading-tracking);color:var(--sk-color-text)}
.sk-empty p{margin:0;max-width:26rem}.sk-empty small{font-size:.78rem}
.sk-empty .sk-button{margin-top:.75rem}
.sk-empty--outlined{border:1px dashed var(--sk-color-border);border-radius:var(--sk-radius-lg)}
/* Danger tinted rather than danger filled: an error is read, not actioned, and
   a solid red block next to a form is louder than the mistake. */
.sk-error{margin:0;padding:.75rem 1rem;border:1px solid color-mix(in srgb,var(--sk-color-danger) 45%,var(--sk-color-border));border-radius:var(--sk-radius-md);background:color-mix(in srgb,var(--sk-color-danger) 7%,var(--sk-color-surface));color:var(--sk-color-danger);font-size:.875rem}
/* Everything served without a shell: sign-in, sign-out, an invitation, Common
   being unreachable. The brand is pinned to the corner the sidebar would have
   occupied rather than stacked inside the card, so the page still reads as this
   application's. */
.sk-auth-page{position:relative;display:grid;min-height:100dvh;place-items:center;padding:calc(var(--sk-gutter) + var(--sk-safe-top)) var(--sk-gutter) calc(var(--sk-gutter) + var(--sk-safe-bottom))}
.sk-auth-page>.sk-card{display:grid;justify-items:start;gap:.85rem;width:min(32rem,100%);padding:clamp(1.5rem,5vw,3rem)}
.sk-auth-page h1{width:100%;margin:0;font:var(--sk-type-title-weight) var(--sk-type-title)/var(--sk-type-title-leading) var(--sk-font-display);letter-spacing:var(--sk-type-title-tracking)}
.sk-auth-page p{margin:0;color:var(--sk-color-text-muted)}
.sk-auth-brand{position:absolute;top:calc(var(--sk-space-6) + var(--sk-safe-top));left:max(var(--sk-space-6),var(--sk-safe-left));font:var(--sk-type-heading-weight) var(--sk-type-heading) var(--sk-font-display);letter-spacing:var(--sk-type-heading-tracking);text-decoration:none}
/* The inverted slab: a hero, the back of a flip card, a call to action. It
   flips the page rather than tinting it, so anything inside it that was already
   inverted — a primary button — has to flip back. */
.sk-inverse{background:var(--sk-color-accent);color:var(--sk-color-on-accent)}
.sk-inverse .sk-button--primary{background:var(--sk-color-on-accent);color:var(--sk-color-accent)}
.sk-inverse .sk-eyebrow,.sk-inverse .sk-stat-card__label{color:inherit;opacity:.6}
.sk-inverse .sk-stat-card{border:0;background:transparent;color:inherit}
/* A field whose label is carried by the surrounding layout instead — a search
   box under a magnifier, a code entry under its own heading. The label stays in
   the markup for a screen reader; only the sighted duplicate goes. */
.sk-field--label-hidden>label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}
/* The reduction is a matter of taste, and forced-colors is not: there the
   ring goes back to its full weight in the system's own highlight. */
@media(forced-colors:active){:root{--sk-focus-ring:.1875rem;--sk-focus-ring-offset:.1875rem}:focus-visible{outline-color:Highlight}[data-sk-focus-quiet]:focus-visible{outline:var(--sk-focus-ring) solid Highlight}}
