From 11853037ece1727e2b1e0c0157a4fe6f8fd1cedd Mon Sep 17 00:00:00 2001
From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com>
Date: Sun, 18 Jan 2026 23:27:29 -0500
Subject: [PATCH 001/106] Add DM UI shell components
---
css/tailwind.generated.css | 4 +-
css/tailwind.source.css | 397 +++++++++++++++++++++++++++++++++
js/ui/dm/AppShell.js | 125 +++++++++++
js/ui/dm/Avatar.js | 51 +++++
js/ui/dm/Composer.js | 72 ++++++
js/ui/dm/ContactRow.js | 85 +++++++
js/ui/dm/ConversationList.js | 96 ++++++++
js/ui/dm/DayDivider.js | 24 ++
js/ui/dm/MessageBubble.js | 51 +++++
js/ui/dm/MessageThread.js | 80 +++++++
js/ui/dm/NotificationCenter.js | 40 ++++
js/ui/dm/index.js | 9 +
12 files changed, 1032 insertions(+), 2 deletions(-)
create mode 100644 js/ui/dm/AppShell.js
create mode 100644 js/ui/dm/Avatar.js
create mode 100644 js/ui/dm/Composer.js
create mode 100644 js/ui/dm/ContactRow.js
create mode 100644 js/ui/dm/ConversationList.js
create mode 100644 js/ui/dm/DayDivider.js
create mode 100644 js/ui/dm/MessageBubble.js
create mode 100644 js/ui/dm/MessageThread.js
create mode 100644 js/ui/dm/NotificationCenter.js
create mode 100644 js/ui/dm/index.js
diff --git a/css/tailwind.generated.css b/css/tailwind.generated.css
index a4e41551..5778f0d1 100644
--- a/css/tailwind.generated.css
+++ b/css/tailwind.generated.css
@@ -1,7 +1,7 @@
:root{--surface-base:var(--color-surface);--surface-alt:var(--color-surface-alt);--surface-raised:var(--color-card);--surface-raised-private:var(--color-card-private);--surface-raised-critical:var(--color-card-critical);--surface-panel:var(--color-panel);--surface-panel-hover:var(--color-panel-hover);--surface-sunken:var(--color-surface-sunken);--surface-muted:var(--color-surface-muted);--surface-veil:var(--color-overlay-veil);--surface-inverse:var(--color-page);--surface-overlay:var(--color-overlay);--surface-overlay-muted:var(--color-overlay-muted);--surface-overlay-strong:var(--color-overlay-strong);--surface-overlay-darker:var(--color-overlay-darker);--surface-overlay-black:var(--color-overlay-black);--surface-overlay-banner-base:var(--color-page);--surface-overlay-banner:var(--surface-overlay-banner-base);--surface-overlay-banner-opaque:var(--surface-overlay-banner-base);--surface-overlay-banner-strong:color-mix(in srgb,var(--surface-overlay-banner-base) 82%,transparent);--surface-overlay-banner-bottom:color-mix(in srgb,var(--surface-overlay-banner-base) 50%,transparent);--surface-overlay-banner-channel-mid:color-mix(in srgb,var(--surface-overlay-banner-base) 24%,transparent);--surface-overlay-banner-channel-faint:color-mix(in srgb,var(--surface-overlay-banner-base) 10%,transparent);--surface-overlay-banner-soft:color-mix(in srgb,var(--surface-overlay-banner-base) 56%,transparent);--surface-overlay-banner-faint:color-mix(in srgb,var(--surface-overlay-banner-base) 18%,transparent);--surface-overlay-banner-transparent:transparent;--surface-overlay-banner-gradient-header:linear-gradient(to bottom,var(--surface-overlay-banner-opaque) 0%,var(--surface-overlay-banner-strong) 38%,var(--surface-overlay-banner-soft) 70%,var(--surface-overlay-banner-faint) 88%,var(--surface-overlay-banner-transparent) 100%);--surface-overlay-banner-gradient-channel:linear-gradient(to top,var(--surface-overlay-banner-bottom) 0%,var(--surface-overlay-banner-channel-mid) 28%,var(--surface-overlay-banner-channel-faint) 42%,var(--surface-overlay-banner-transparent) 50%);--surface-overlay-banner-gradient:var(
--surface-overlay-banner-gradient-header
);--surface-overlay-panel:var(--color-overlay-panel);--surface-overlay-panel-soft:var(--color-overlay-panel-soft);--surface-overlay-panel-tint:var(--color-overlay-panel-tint);--surface-overlay-panel-glass:var(--color-overlay-panel-glass);--surface-overlay-panel-glass-soft:var(--color-overlay-panel-glass-soft);--surface-modal-backdrop:var(--color-modal-backdrop);--surface-modal:var(--color-modal-surface);--blur-modal-backdrop:18px;--blur-modal-alert:14px;--blur-thumbnail-blur:18px;--modal-nav-backdrop-blur:6px;--app-header-centerline-offset:calc(var(--space-sm) + var(--space-2xl-plus)/2);--border-default:var(--color-border);--border-subtle:var(--color-border-subtle);--border-strong:var(--color-border-translucent-stronger);--border-overlay:var(--color-border-translucent);--border-overlay-strong:var(--color-border-translucent-strongest);--border-overlay-glow:var(--color-border-translucent-glow);--border-neutral-soft:var(--color-border-neutral-soft);--border-info-soft:var(--color-border-info-soft);--border-sidebar-strong:var(--color-border-sidebar-strong);--border-width-hairline:1px;--border-width-fine:0.5px;--text-primary:var(--color-text);--text-inverse:var(--color-text-inverse);--text-muted:var(--color-text-muted);--text-muted-strong:var(--color-muted-strong);--text-subtle:var(--color-subtle-text);--text-frosted-primary:var(--color-text-frosted);--text-frosted-strong:var(--color-text-frosted-strong);--text-frosted-soft:var(--color-text-frosted-soft);--status-info:var(--color-info);--status-info-strong:var(--color-info-strong);--status-info-surface:var(--color-info-glass);--status-info-border:var(--color-info-border);--status-info-on:var(--color-info-on);--status-success:var(--color-success);--status-success-strong:var(--color-success-strong);--status-success-surface:var(--color-success-surface);--status-success-border:var(--color-success-border);--status-success-on:var(--color-success-on);--status-warning:var(--color-warning);--status-warning-strong:var(--color-warning-strong);--status-warning-surface:var(--color-warning-surface);--status-warning-border:var(--color-warning-border);--status-warning-on:var(--color-warning-on);--status-danger:var(--color-critical);--status-danger-strong:var(--color-critical-strong);--status-danger-surface:var(--color-danger-surface);--status-danger-border:var(--color-danger-border);--status-danger-on:var(--color-danger-on);--status-private:var(--color-private);--status-private-strong:var(--color-private-strong);--status-private-surface:var(--color-private-surface);--status-private-border:var(--color-private-border);--status-private-on:var(--color-private-on);--status-neutral:var(--color-muted);--status-neutral-strong:var(--color-muted-strong);--status-neutral-surface:var(--color-neutral-surface);--status-neutral-border:var(--color-neutral-border);--status-neutral-on:var(--color-neutral-on);--scrollbar-width:0.5rem;--scrollbar-track:var(--color-white-soft);--scrollbar-thumb:var(--color-white-softer);--scrollbar-thumb-hover:var(--color-white-softest);--z-app-header:40;--z-overlay-nav:60;--z-overlay-floating:70;--z-overlay-popover:140;--z-overlay-toast:180;--z-sidebar-overlay:10;--z-sidebar:20;--z-modal-root:100;--z-modal-overlay:110;--z-modal-content:120;--z-modal-player:130;--z-modal-top-root:140;--z-modal-top-overlay:150;--z-modal-top-content:160;--z-modal-peak-root:165;--z-modal-peak-overlay:175;--z-modal-peak-content:185;--overlay-backdrop-color:var(--color-overlay-backdrop);--overlay-backdrop-blur:12px;--sidebar-width-expanded-base:16rem;--sidebar-dropup-content-width:0px;--sidebar-width-expanded:max(var(--sidebar-width-expanded-base),var(--sidebar-dropup-content-width));--sidebar-width-collapsed:4rem;--sidebar-width:var(--sidebar-width-expanded);--sidebar-control-size:2.75rem;--sidebar-content-gap:1rem;--space-sidebar-shell-inline:var(--space-lg);--space-sidebar-shell-block-start:var(--space-sm);--space-sidebar-shell-block-end:1.75rem;--space-sidebar-scroll-gap:1.75rem;--space-sidebar-panel-gap:1.35rem;--space-sidebar-panel-padding-block:1.35rem;--space-sidebar-panel-padding-inline:1.1rem;--space-sidebar-footer-gap:0.85rem;--space-sidebar-trigger-padding-block:0.78rem;--space-sidebar-popover-offset:0.85rem;--space-sidebar-popover-padding-block:0.85rem;--space-sidebar-popover-padding-inline:0.65rem;--space-sidebar-popover-gap:0.45rem;--space-sidebar-dropup-scroll-reserve:calc(var(--scrollbar-thin-width) + var(--space-sm) + var(--space-2xs));--sidebar-dropup-max-height:18rem;--space-sidebar-nav-padding-block:0.7rem;--space-sidebar-nav-padding-inline-start:var(--space-xs);--space-sidebar-nav-padding-inline-end:calc(var(--space-lg) + var(--space-2xs));--space-sidebar-subnav-padding-block:0.55rem;--space-sidebar-nav-translate:0.35rem;--grid-card-min-width:20rem;--breakpoint-lg:64rem;--popover-backdrop-blur:12px;--overlay-panel-radius:var(--radius-lg);--overlay-panel-shadow:var(--shadow-lg);--overlay-panel-padding-inline:var(--popup-padding-inline);--overlay-panel-padding-block:var(--popup-padding-block);--toast-translate:-1.5rem;--sidebar-mobile-gutter:3rem;--popup-padding-inline:1rem;--popup-padding-block:0.75rem;--video-modal-primary-fr:1.85fr;--video-modal-secondary-min:320px;--video-modal-secondary-max:35rem;--video-modal-secondary-fr:1fr;--video-modal-layout-max:calc(var(--layout-player-max-width) + var(--video-modal-secondary-max) + var(--space-2xl-plus));--revert-modal-sidebar-min:240px;--revert-modal-sidebar-width:280px;--popover-inline-safe-max:calc(100vw - var(--space-xl));--progress-height-sm:0.25rem;--progress-height-md:0.5rem;--progress-radius:var(--radius-full);--progress-track-color:var(--color-border-subtle);--progress-fill-color:var(--color-info);--progress-transition-duration:var(--motion-duration-fast);--progress-transition-ease:var(--motion-ease-out);--space-4xs:0.0625rem;--space-3xs:0.125rem;--space-2xs:0.25rem;--space-xs:0.5rem;--space-xs-snug:0.4rem;--space-sm:0.75rem;--space-md:1rem;--space-md-plus:1.25rem;--space-lg:1.5rem;--space-xl:2rem;--space-xl-compact:2.25rem;--space-xl-plus:2.5rem;--space-2xl:3rem;--space-2xl-plus:3.5rem;--size-2px:2px;--size-3px:3px;--size-12px:12px;--size-24px:24px;--size-30px:30px;--size-32px:32px;--size-64px:64px;--size-128px:128px;--size-140px:140px;--size-168px:168px;--size-256px:256px;--size-5-75rem:5.75rem;--size-6rem:6rem;--size-7rem:7rem;--size-8rem:8rem;--size-12rem:12rem;--size-12-5rem:12.5rem;--size-14rem:14rem;--size-28rem:28rem;--size-34rem:34rem;--size-45rem:45rem;--radius-sm:0.25rem;--radius-md:0.5rem;--radius-lg:0.75rem;--radius-xl:1rem;--radius-full:9999px;--radius-modal-xl:1.75rem;--radius-sidebar-shell:1.5rem;--radius-sidebar-panel:1.1rem;--radius-sidebar-nav:0.95rem;--radius-toggle-thumb:0.5625rem;--menu-min-width:12rem;--header-search-max-inline:var(--size-34rem);--modal-max-width:62.5rem;--modal-sheet-inline-max:var(--modal-max-width);--modal-shell-max-height:90vh;--modal-sheet-max-height:92vh;--modal-body-max-height:calc(92vh - 4rem);--player-modal-module-scroll-min-height:var(--size-14rem);--player-modal-module-scroll-max-height:var(--size-28rem);--modal-pane-max-height:48vh;--modal-pane-min-height:20rem;--moderation-badge-max-inline:var(--size-28rem);--notification-banner-max-inline:var(--size-28rem);--profile-modal-nav-min-width:max-content;--profile-modal-nav-max-width:max-content;--profile-modal-scrollbar-offset:var(--space-2xs);--modal-embed-height:80vh;--profile-history-max-height:26.25rem;--comment-avatar-size:var(--space-xl-plus);--comment-composer-min-height:var(--size-7rem);--video-modal-reaction-label-min-inline:var(--size-6rem);--video-modal-item-media-min:var(--size-5-75rem);--video-modal-item-media-max:var(--size-8rem);--video-card-compact-media-min:var(--size-8rem);--video-card-compact-media-max:var(--size-12-5rem);--similar-card-media-width:var(--size-168px);--similar-card-media-width-sm:var(--size-140px);--docs-popover-scroll-height:var(--size-45rem);--profile-modal-active-min-width:var(--size-12rem);--status-log-min-height:5rem;--layout-player-max-width:68.75rem;--layout-docs-max-width:92.5rem;--icon-size-sm:var(--font-size-lg);--icon-size-md:var(--space-md-plus);--icon-size-lg:var(--space-xl-plus);--avatar-size-lg:var(--space-2xl-plus);--form-textarea-min-height:8rem;--scrollbar-thin-width:0.4rem;--modal-progress-height:calc(var(--space-3xs)*3);--video-modal-action-min-width:2.75rem;--outline-thick-width:0.1875rem;--icon-button-ring-width:var(--outline-thick-width);--form-select-icon-offset:var(--space-sm);--form-select-icon-gap:var(--space-xs-snug);--form-select-icon-hit-area:var(--space-xl-plus);--form-select-icon-size:0.6rem;--form-select-divider-width:var(--border-width-hairline);--form-checkbox-checkmark-offset:calc(var(--space-3xs)*-1);--breakpoint-edge-offset:0.02px;--offscreen-offset:-9999px;--motion-card-enter-translate:var(--space-xs);--motion-fade-in-translate:var(--space-md-plus);--motion-login-option-hover-translate:calc(var(--size-3px)*-1);--motion-video-card-hover-translate:-0.35rem;--motion-video-card-backdrop-translate:0.15rem;--shadow-sm:0 0.0625rem 0.125rem 0 var(--color-shadow-floating);--shadow-md:0 0.25rem 0.375rem -0.0625rem var(--color-shadow-floating);--shadow-lg:0 0.625rem 0.9375rem -0.1875rem var(--color-shadow-elevated);--shadow-badge-offset-y:var(--size-12px);--shadow-badge-blur:var(--size-30px);--shadow-notification-offset-y:var(--size-32px);--shadow-notification-blur:var(--size-64px);--shadow-modal:0 2.75rem 6rem -1.25rem var(--color-shadow-modal);--shadow-sidebar-shell:0 1.875rem 3.75rem -1.5rem var(--color-shadow-sidebar);--shadow-sidebar-accent:0 1.65rem 3.25rem -1.35rem var(--color-sidebar-glow);--shadow-sidebar-trigger:0 1.25rem 2.5rem -1.35rem var(--color-shadow-panel);--shadow-sidebar-dropup:0 1.75rem 3.25rem -1.45rem var(--color-sidebar-glow);--shadow-sidebar-panel:0 2.25rem 4.5rem -1.85rem var(--color-shadow-sidebar);--shadow-sidebar-focus-ring:0 0 0 0.125rem var(--color-sidebar-glow),0 0 0 0.25rem var(--color-sidebar-hover-strong);--shadow-popover-zap:0 22px 48px -18px var(--color-shadow-intense);--shadow-video-modal:0 1rem 2.25rem var(--color-shadow-elevated);--blur-video-card-backdrop-strong:var(--size-24px);--video-modal-ambient-blur-min:var(--size-128px);--video-modal-ambient-blur-max:var(--size-256px);--font-family-sans:"Inter","Segoe UI",system-ui,-apple-system,sans-serif;--font-family-mono:"Fira Code","SFMono-Regular",ui-monospace,monospace;--font-size-4xs:0.65rem;--font-size-3xs:0.6875rem;--font-size-2xs:0.7rem;--font-size-xs:0.75rem;--font-size-sm:0.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.5rem;--font-size-2xl:2rem;--font-size-xl-plus:1.875rem;--font-size-modal-title-base:1.25rem;--font-size-sidebar-nav:0.95rem;--font-size-sidebar-subnav:0.85rem;--font-size-sidebar-trigger:0.9rem;--link-underline-thickness:var(--size-2px);--line-height-tight:1.1;--line-height-snug:1.25;--line-height-base:1.5;--line-height-relaxed:1.75;--tracking-extra-wide:0.2em;--grid-border-width:calc(var(--space-2xs)/4);--grid-canvas-padding-top:var(--grid-border-width);--grid-viewport-min-height:calc(var(--space-xl) - var(--space-sm));--grid-cell-padding-block:var(--space-sm);--grid-cell-padding-inline:var(--space-md);--grid-header-font-size:var(--font-size-xs);--grid-header-letter-spacing:0.08em;--grid-overlay-margin:10%;--grid-overlay-padding-block:var(--space-md);--grid-overlay-padding-inline:var(--space-xl);--grid-overlay-radius:var(--radius-lg);--grid-overlay-font-size:var(--font-size-lg);--grid-overlay-text-opacity:0.66;--grid-resizer-width:calc(var(--space-2xs)*1.25);--grid-resize-overlay-width:var(--grid-border-width);--grid-sort-indicator-size:calc(var(--space-lg) - var(--space-2xs));--grid-sort-indicator-offset:var(--space-xs);--grid-sort-indicator-stroke:calc(var(--space-2xs)/2);--grid-sort-indicator-thickness:var(--grid-border-width);--notify-padding-block:var(--space-md);--notify-padding-inline:var(--space-2xl);--notify-font-size:var(--font-size-base);--notify-dismiss-size:calc(var(--space-xl) + var(--space-xs));--notify-dismiss-size-compact:calc(var(--space-lg) + var(--space-2xs));--notify-dismiss-font-size:var(--font-size-sm);--notify-dismiss-radius:var(--radius-full);--notify-dismiss-color:var(--color-subtle);--notify-dismiss-background:var(--color-overlay-panel);--notify-dismiss-background-hover:var(--color-overlay-panel-soft);--z-notify:1200;--motion-duration-fast:120ms;--motion-duration-base:160ms;--motion-duration-slow:280ms;--motion-ease-out:cubic-bezier(0.16,1,0.3,1);--motion-ease-in-out:cubic-bezier(0.4,0,0.2,1);--modal-motion-duration:var(--motion-duration-base)}:root[data-theme=light]{--color-page:#f7f8fc;--color-page-alt:#f2f4f8;--color-surface:#fff;--color-surface-alt:#f8fafc;--color-bg:var(--color-surface);--color-card:#fff;--color-card-private:#f3ecff;--color-card-critical:#ffecee;--color-panel:#fcfdff;--color-panel-hover:#eff2f9;--color-border:#d2dbec;--color-border-subtle:#e5eaf2;--color-accent:#6366f1;--color-accent-strong:#4f46e5;--color-accent-pressed:#4338ca;--color-accent-override:#540011;--color-accent-strong-override:#fe0032;--color-accent-pressed-override:#a90021;--color-primary:var(--color-accent-strong);--color-secondary:var(--color-accent);--color-logo-accent:var(--color-accent-strong);--color-logo-wordmark:#28364d;--color-logo-wordmark-inverse:var(--color-white);--color-logo-background:#0f172a;--color-logo-background-inverse:var(--color-white);--color-info:#3b82f6;--color-info-strong:#2563eb;--color-info-pressed:#1d4ed8;--color-info-glass:rgba(59,130,246,.14);--color-info-border:rgba(59,130,246,.35);--color-info-on:#e3f2ff;--color-muted-strong:#475569;--color-text:#181f2c;--color-text-strong:#0c101a;--color-text-inverse:#fff;--color-text-muted:#667085;--color-muted:#8892a6;--color-muted-alt:#788296;--color-subtle-text:#8892a6;--color-subtle:#f3f5fa;--color-surface-sunken:#e8ebf4;--color-surface-muted:#ecf0f9;--color-critical:#dc3646;--color-critical-strong:#b92037;--color-danger-surface:#fce2e6;--color-danger-border:rgba(220,54,70,.35);--color-danger-on:#60121f;--color-warning:#eab308;--color-warning-strong:#ca8a04;--color-warning-surface:rgba(253,224,71,.35);--color-warning-border:rgba(234,179,8,.35);--color-warning-glass:rgba(253,224,71,.18);--color-warning-on:#5c3702;--color-success:#16a34a;--color-success-strong:#15803d;--color-success-surface:#defaec;--color-success-border:rgba(34,197,94,.3);--color-success-on:#125430;--color-private:#8b5cf6;--color-private-strong:#7c3aed;--color-private-surface:#ede9fe;--color-private-border:rgba(139,92,246,.32);--color-private-on:#4a1d96;--color-neutral-700:#475569;--color-neutral-600:#667085;--color-neutral-surface:#e8ecf4;--color-neutral-border:#cdd5e2;--color-neutral-on:#3e485c;--color-white:#fff;--color-black:#000;--color-overlay:rgba(15,23,42,.3);--color-overlay-black:rgba(15,23,42,.7);--color-overlay-muted:rgba(60,75,105,.18);--color-overlay-strong:rgba(15,23,42,.56);--color-overlay-darker:rgba(12,18,32,.68);--color-overlay-panel:rgba(248,250,255,.92);--color-overlay-panel-soft:rgba(244,247,255,.78);--color-overlay-panel-tint:rgba(146,170,211,.24);--color-overlay-panel-glass:hsla(0,0%,100%,.85);--color-overlay-panel-glass-soft:rgba(246,249,255,.7);--color-overlay-panel-gradient-start:hsla(0,0%,100%,.95);--color-overlay-panel-gradient-end:rgba(232,236,244,.92);--color-modal-backdrop:rgba(15,23,42,.28);--color-modal-surface:hsla(0,0%,100%,.94);--color-overlay-veil:rgba(103,112,133,.45);--color-overlay-banner-bottom:hsla(0,0%,100%,.6);--color-overlay-banner-transparent:hsla(0,0%,100%,0);--color-overlay-backdrop:rgba(15,23,42,.2);--scrollbar-track:color-mix(in srgb,var(--color-sidebar-border-strong) 40%,transparent);--scrollbar-thumb:color-mix(in srgb,var(--color-accent) 64%,transparent);--scrollbar-thumb-hover:color-mix(in srgb,var(--color-accent-strong) 76%,transparent);--color-sidebar-surface:hsla(0,0%,100%,.9);--color-sidebar-surface-alt:rgba(236,240,247,.72);--color-sidebar-border:rgba(184,194,212,.28);--color-sidebar-border-strong:rgba(148,163,184,.36);--color-sidebar-hover:color-mix(in srgb,var(--color-accent) 16%,transparent);--color-sidebar-hover-strong:color-mix(in srgb,var(--color-accent-strong) 24%,transparent);--color-sidebar-glow:color-mix(in srgb,var(--color-accent) 36%,transparent);--color-sidebar-accent-start:color-mix(in srgb,var(--color-accent-strong) 88%,transparent);--color-sidebar-accent-end:color-mix(in srgb,var(--color-accent) 82%,transparent);--color-sidebar-text-muted:var(--color-text-muted);--sidebar-icon-filter:brightness(0) saturate(100%);--color-surface-tint-subtle:rgba(15,23,42,.08);--color-border-translucent:rgba(148,163,184,.18);--color-border-translucent-strong:rgba(148,163,184,.22);--color-border-translucent-bright:rgba(148,163,184,.28);--color-border-translucent-stronger:rgba(148,163,184,.32);--color-border-translucent-strongest:rgba(148,163,184,.36);--color-border-translucent-glow:rgba(148,163,184,.45);--color-border-translucent-medium:rgba(148,163,184,.2);--color-border-neutral-soft:rgba(148,163,184,.25);--color-border-info-soft:rgba(59,130,246,.32);--color-border-sidebar-strong:rgba(102,112,133,.75);--color-ring-private:rgba(139,92,246,.5);--color-ring-private-hover:rgba(168,85,247,.6);--color-ring-critical:rgba(220,54,70,.35);--color-ring-critical-soft:rgba(220,54,70,.3);--color-ring-critical-hover:rgba(220,54,70,.4);--color-ring-critical-strong:rgba(220,54,70,.5);--color-ring-alert:rgba(239,68,68,.48);--color-gradient-visibility-start:rgba(99,102,241,.28);--color-gradient-visibility-end:rgba(129,140,248,.24);--color-white-soft:hsla(0,0%,100%,.08);--color-white-softer:hsla(0,0%,100%,.24);--color-white-softest:hsla(0,0%,100%,.32);--color-shadow-floating:rgba(15,23,42,.18);--color-shadow-elevated:rgba(15,23,42,.16);--color-shadow-panel:rgba(15,23,42,.12);--color-shadow-notification:rgba(15,23,42,.14);--color-shadow-intense:rgba(15,23,42,.22);--color-shadow-sidebar:rgba(15,23,42,.28);--color-shadow-modal:rgba(15,23,42,.28);--color-divider-strong:rgba(203,213,225,.6);--color-text-frosted-strong:rgba(40,54,77,.85);--color-text-frosted:rgba(61,74,98,.8);--color-text-frosted-soft:rgba(82,96,122,.72)}:root:not([data-theme]),:root[data-theme=dark]{--color-page:#060a12;--color-page-alt:#080c16;--color-surface:#0a0e1a;--color-surface-alt:#0e1422;--color-bg:var(--color-surface);--color-card:#121a2c;--color-card-private:#261c3e;--color-card-critical:#3a141c;--color-panel:#101828;--color-panel-hover:#182234;--color-border:#3d5070;--color-border-subtle:#26344c;--color-accent:#818cf8;--color-accent-strong:#6366f1;--color-accent-pressed:#4f46e5;--color-accent-override:#540011;--color-accent-strong-override:#fe0032;--color-accent-pressed-override:#a90021;--color-primary:var(--color-accent-strong);--color-secondary:#38bdf8;--color-logo-accent:var(--color-accent-strong);--color-logo-wordmark:#c6cfde;--color-logo-wordmark-inverse:var(--color-white);--color-logo-background:#0c121e;--color-logo-background-inverse:var(--color-white);--color-info:#60a5fa;--color-info-strong:#3884ff;--color-info-pressed:#2563eb;--color-info-glass:rgba(56,132,255,.22);--color-info-border:rgba(96,165,250,.42);--color-info-on:#ebf4ff;--color-muted-strong:#ced7e8;--color-text:#e2e8f0;--color-text-strong:#f4f7ff;--color-text-inverse:#0c121e;--color-text-muted:#a5b3c9;--color-muted:#94a3b8;--color-muted-alt:#808ba2;--color-subtle-text:#a8b4cd;--color-subtle:#1c263a;--color-surface-sunken:rgba(13,19,32,.92);--color-surface-muted:rgba(18,26,44,.82);--color-critical:#ef5362;--color-critical-strong:#dc2626;--color-danger-surface:rgba(220,38,38,.28);--color-danger-border:rgba(220,38,38,.45);--color-danger-on:#ffe4e9;--color-warning:#facc15;--color-warning-strong:#eab308;--color-warning-surface:rgba(253,224,71,.22);--color-warning-border:rgba(250,204,21,.42);--color-warning-glass:rgba(253,224,71,.2);--color-warning-on:#1a1200;--color-success:#22c55e;--color-success-strong:#16a34a;--color-success-surface:rgba(22,163,74,.24);--color-success-border:rgba(34,197,94,.45);--color-success-on:#d2fce4;--color-private:#a855f7;--color-private-strong:#8b5cf6;--color-private-surface:rgba(124,58,237,.26);--color-private-border:rgba(168,85,247,.45);--color-private-on:#efe6ff;--color-neutral-700:#3a4b6e;--color-neutral-600:#5a6985;--color-neutral-surface:rgba(99,114,144,.24);--color-neutral-border:rgba(99,114,144,.35);--color-neutral-on:#d2dcee;--color-white:#fff;--color-black:#000;--color-overlay:rgba(8,11,20,.72);--color-overlay-black:rgba(0,0,0,.88);--color-overlay-muted:rgba(12,18,30,.6);--color-overlay-strong:rgba(8,12,24,.82);--color-overlay-darker:rgba(5,8,16,.9);--color-overlay-panel:rgba(14,20,34,.92);--color-overlay-panel-soft:rgba(18,26,42,.78);--color-overlay-panel-tint:rgba(56,93,160,.36);--color-overlay-panel-glass:rgba(14,24,42,.86);--color-overlay-panel-glass-soft:rgba(16,28,48,.72);--color-overlay-panel-gradient-start:rgba(18,26,44,.92);--color-overlay-panel-gradient-end:rgba(10,16,30,.92);--color-modal-backdrop:rgba(5,8,14,.68);--color-modal-surface:rgba(14,22,38,.88);--color-overlay-veil:rgba(4,6,12,.94);--color-overlay-banner-bottom:rgba(0,0,0,.6);--color-overlay-banner-transparent:transparent;--color-overlay-backdrop:rgba(5,8,14,.75);--scrollbar-track:color-mix(in srgb,var(--color-sidebar-surface-alt) 54%,transparent);--scrollbar-thumb:color-mix(in srgb,var(--color-accent) 72%,transparent);--scrollbar-thumb-hover:color-mix(in srgb,var(--color-accent-strong) 84%,transparent);--color-sidebar-surface:rgba(12,18,30,.94);--color-sidebar-surface-alt:rgba(10,18,32,.8);--color-sidebar-border:rgba(86,106,142,.26);--color-sidebar-border-strong:rgba(112,133,170,.42);--color-sidebar-hover:color-mix(in srgb,var(--color-accent) 22%,transparent);--color-sidebar-hover-strong:color-mix(in srgb,var(--color-accent-strong) 32%,transparent);--color-sidebar-glow:color-mix(in srgb,var(--color-accent) 42%,transparent);--color-sidebar-accent-start:color-mix(in srgb,var(--color-accent) 92%,transparent);--color-sidebar-accent-end:color-mix(in srgb,var(--color-accent-strong) 88%,transparent);--color-sidebar-text-muted:var(--color-text-muted);--sidebar-icon-filter:brightness(0) invert(1);--color-surface-tint-subtle:rgba(94,113,161,.12);--color-border-translucent:rgba(99,114,144,.22);--color-border-translucent-strong:rgba(110,130,170,.28);--color-border-translucent-bright:rgba(148,163,184,.35);--color-border-translucent-stronger:rgba(148,163,184,.38);--color-border-translucent-strongest:rgba(198,207,222,.45);--color-border-translucent-glow:rgba(129,140,248,.55);--color-border-translucent-medium:rgba(99,114,144,.28);--color-border-neutral-soft:rgba(99,114,144,.3);--color-border-info-soft:rgba(96,165,250,.35);--color-border-sidebar-strong:rgba(32,46,68,.88);--color-ring-private:rgba(168,85,247,.55);--color-ring-private-hover:rgba(192,132,252,.65);--color-ring-critical:rgba(239,83,98,.42);--color-ring-critical-soft:rgba(239,83,98,.35);--color-ring-critical-hover:rgba(239,83,98,.5);--color-ring-critical-strong:rgba(220,38,38,.6);--color-ring-alert:rgba(220,38,38,.6);--color-gradient-visibility-start:rgba(129,140,248,.4);--color-gradient-visibility-end:rgba(192,132,252,.32);--color-white-soft:hsla(0,0%,100%,.1);--color-white-softer:hsla(0,0%,100%,.3);--color-white-softest:hsla(0,0%,100%,.4);--color-shadow-floating:rgba(8,11,30,.55);--color-shadow-elevated:rgba(8,11,30,.45);--color-shadow-panel:rgba(15,23,42,.35);--color-shadow-notification:rgba(15,23,42,.3);--color-shadow-intense:rgba(250,204,21,.48);--color-shadow-sidebar:rgba(0,0,0,.45);--color-shadow-modal:rgba(8,11,30,.55);--color-divider-strong:rgba(15,23,42,.35);--color-text-frosted-strong:rgba(226,232,240,.94);--color-text-frosted:rgba(226,232,240,.9);--color-text-frosted-soft:rgba(226,232,240,.82)}*,:after,:before{--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:rgba(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:rgba(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: }
-/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-family-sans);font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{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,pre,samp{font-family:var(--font-family-mono);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,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{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}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html{font-size:80%}@media (min-width:768px){html{font-size:100%}}@media (min-width:1024px){html{font-size:75%}}*,:after,:before{scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}::-webkit-scrollbar{width:var(--scrollbar-width);height:var(--scrollbar-width)}::-webkit-scrollbar-track{background:var(--scrollbar-track)}::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:var(--radius-sm)}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}body{--app-header-centerline:calc(env(safe-area-inset-top, 0) + var(--app-header-centerline-offset));font-family:var(--font-family-sans);background-color:var(--color-page);color:var(--color-text-strong);line-height:1.5;margin:0;padding:0;overflow-x:hidden}:root[data-theme-accent=override]{--color-accent:var(--color-accent-override);--color-accent-strong:var(--color-accent-strong-override);--color-accent-pressed:var(--color-accent-pressed-override)}#uiOverlay{position:fixed;inset:0;pointer-events:none;z-index:var(--z-overlay-popover)}#uiOverlay>*{pointer-events:auto}#editNip71TagsFieldset>legend,#nip71TagsFieldset>legend{margin-left:0;padding:0}#app{background-color:var(--color-page);color:inherit}body.modal-open,html.modal-open{overflow:hidden;height:100%}body.modal-open #app{overflow:hidden}body.modal-open #sidebar{pointer-events:none;opacity:0;visibility:hidden;z-index:var(--z-sidebar-overlay)}.ng-cloak,.ng-hide:not(.ng-hide-animate),.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}ng\:form{display:block}.\!container{width:100%!important}.container{width:100%}@media (min-width:25rem){.\!container{max-width:25rem!important}.container{max-width:25rem}}@media (min-width:30rem){.\!container{max-width:30rem!important}.container{max-width:30rem}}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}#playerModal.ds-header{display:block}.ds-header{display:flex;align-items:center;justify-content:flex-start;padding-top:var(--space-sm);padding-bottom:var(--space-sm)}.app-shell__header{position:sticky;top:env(safe-area-inset-top,0);z-index:var(--z-app-header);padding-top:calc(var(--space-sm) + env(safe-area-inset-top, 0));padding-bottom:var(--space-sm);background-color:transparent;background-image:var(--surface-overlay-banner-gradient-header);background-repeat:no-repeat;background-size:100% 100%}.ds-metric-probe{position:absolute;top:0;left:0;visibility:hidden;pointer-events:none;contain:layout size style;inline-size:0;block-size:var(--ds-metric-probe-length,0);overflow:hidden}.ds-header__logo{height:var(--space-2xl-plus);width:auto;max-width:none}.focus-ring{outline:2px solid transparent;outline-offset:2px}.focus-ring:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.author-pic{display:block;height:100%;width:100%;border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover}.header-icon-toggle{outline:2px solid transparent;outline-offset:2px}.header-icon-toggle:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.header-icon-toggle{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-timing-function:cubic-bezier(0,0,.2,1);width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg);padding:0;border:none;background:transparent;color:var(--color-text-muted);line-height:1}.header-icon-toggle[data-theme-state=light]{color:var(--color-text-strong)}.header-icon-toggle[data-theme-state=dark]{color:var(--color-text)}.header-icon-toggle__icon-wrapper{display:inline-flex;align-items:center;justify-content:center;inline-size:var(--space-lg);block-size:var(--space-lg)}.header-icon-toggle__icon{inline-size:100%;block-size:100%;display:none;fill:currentColor}.header-icon-toggle__icon-wrapper:not([data-theme-icon-state]),.header-icon-toggle__icon-wrapper[data-theme-icon-state=light]{color:inherit}.header-icon-toggle__icon-wrapper:not([data-theme-icon-state]) .header-icon-toggle__icon--dark,.header-icon-toggle__icon-wrapper[data-theme-icon-state=dark] .header-icon-toggle__icon--light,.header-icon-toggle__icon-wrapper[data-theme-icon-state=light] .header-icon-toggle__icon--dark{display:block}.header-icon-toggle[data-theme-state=light]:focus-visible,.header-icon-toggle[data-theme-state=light]:hover{color:var(--color-text)}.header-icon-toggle[data-theme-state=dark]:focus-visible,.header-icon-toggle[data-theme-state=dark]:hover{color:var(--color-text-strong)}.header-icon-toggle[aria-pressed=true]{color:var(--color-text-strong)}.header-icon-toggle[aria-pressed=true]:focus-visible,.header-icon-toggle[aria-pressed=true]:hover{color:var(--color-text-strong)}.bv-modal.header-search__region,.profile-pane.header-search__region{display:none}.header-search__region{display:none;flex:1 1 0%;justify-content:center}@media (min-width:768px){.header-search__region#playerModal{display:block}.header-search__region{display:flex}}.header-search__region{min-width:0;padding-inline:clamp(var(--space-md),4vw,var(--space-3xl))}#playerModal.header-search{display:block}.header-search{display:flex;align-items:center;gap:.75rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.4;background-color:var(--surface-overlay-panel);padding-left:1rem;padding-right:1rem;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);backdrop-filter:blur(var(--popover-backdrop-blur));-webkit-backdrop-filter:blur(var(--popover-backdrop-blur));padding-block:calc(var(--space-sm)*.9);inline-size:min(100%,var(--header-search-max-inline))}.header-search:focus-within{border-color:var(--color-accent-strong)}.header-search__icon{display:block;height:1.25rem;width:1.25rem;background-color:currentColor;mask-repeat:no-repeat;mask-position:center;mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;-webkit-mask-size:contain}.header-search__icon--filter{mask-image:url(../assets/svg/filter.svg);-webkit-mask-image:url(../assets/svg/filter.svg)}.header-search__icon--submit{mask-image:url(../assets/svg/search.svg);-webkit-mask-image:url(../assets/svg/search.svg)}.header-search__filter{outline:2px solid transparent;outline-offset:2px}.header-search__filter:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.header-search__filter{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:transparent;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);color:var(--color-accent);inline-size:calc(var(--icon-size-lg)*.9);block-size:calc(var(--icon-size-lg)*.9);min-inline-size:calc(var(--icon-size-lg)*.9);min-block-size:calc(var(--icon-size-lg)*.9)}.header-search__filter:focus-visible,.header-search__filter:hover{color:var(--color-accent-strong)}.header-search__input{flex:1 1 0%;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary);outline:2px solid transparent;outline-offset:2px}.header-search__input::-moz-placeholder{color:var(--text-muted)}.header-search__input::placeholder{color:var(--text-muted)}.header-search__input{min-width:0}.header-search__input:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.header-search__submit{outline:2px solid transparent;outline-offset:2px}.header-search__submit:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.header-search__submit{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);background-color:var(--color-accent-strong);color:var(--color-white);inline-size:calc(var(--icon-size-lg)*.9);block-size:calc(var(--icon-size-lg)*.9);min-inline-size:calc(var(--icon-size-lg)*.9);min-block-size:calc(var(--icon-size-lg)*.9);padding:0}.header-search__submit:hover{background-color:var(--color-accent)}.header-search__submit:focus-visible{background-color:var(--color-accent-pressed)}.bv-logo{--logo-wordmark-color:var(--color-logo-wordmark);--logo-accent-color:var(--color-logo-accent);--logo-background-color:var(--color-logo-background)}.bv-logo[data-variant=inverse]{--logo-wordmark-color:var(--color-logo-wordmark-inverse);--logo-background-color:var(--color-logo-background-inverse)}.bv-logo[data-wordmark=current]{--logo-wordmark-color:currentColor}.bv-logo[data-accent=current]{--logo-accent-color:currentColor}.bv-logo[data-background=transparent]{--logo-background-color:transparent}.bv-logo__wordmark{fill:var(--logo-wordmark-color);color:var(--logo-wordmark-color)}.bv-logo__accent{fill:var(--logo-accent-color);color:var(--logo-accent-color)}.bv-logo__background{fill:var(--logo-background-color);color:var(--logo-background-color)}.markdown-prose{color:var(--color-text)}.markdown-prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:1rem}.markdown-prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.markdown-prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-primary);text-decoration:none;font-weight:500}.markdown-prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.markdown-prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.markdown-prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.markdown-prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.markdown-prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.markdown-prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.markdown-prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.markdown-prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.markdown-prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.markdown-prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.markdown-prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.markdown-prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.markdown-prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.markdown-prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.markdown-prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.markdown-prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--color-border-subtle);border-top-width:1px;margin-top:2rem;margin-bottom:2rem}.markdown-prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--color-muted);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\201C""\201D""\2018""\2019";margin-top:1rem;margin-bottom:1rem;padding-inline-start:1em;border-left-width:4px;border-left-color:var(--color-border-subtle);padding-left:1rem}.markdown-prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.markdown-prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.markdown-prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:var(--font-size-2xl);margin-top:.5rem;margin-bottom:1rem;line-height:1.1111111}.markdown-prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.markdown-prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:var(--font-size-xl);margin-top:1.25rem;margin-bottom:.75rem;line-height:1.3333333}.markdown-prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.markdown-prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:var(--font-size-lg);margin-top:1rem;margin-bottom:.75rem;line-height:1.6}.markdown-prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.markdown-prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.markdown-prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.markdown-prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:1rem;border-radius:var(--radius-md);max-width:100%;height:auto}.markdown-prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.markdown-prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.markdown-prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.markdown-prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-secondary);font-weight:500;font-size:var(--font-size-sm);background-color:var(--color-page-alt);padding:.2rem .4rem;border-radius:var(--radius-md);font-family:var(--font-family-mono)}.markdown-prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.markdown-prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.markdown-prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.markdown-prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.markdown-prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-text-strong);background-color:var(--color-page-alt);overflow-x:auto;font-weight:400;font-size:var(--font-size-sm);line-height:1.7142857;margin-top:0;margin-bottom:1rem;border-radius:var(--radius-md);padding-inline-end:1.1428571em;padding-inline-start:1.1428571em;padding:1rem;font-family:var(--font-family-mono)}.markdown-prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.markdown-prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.markdown-prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.markdown-prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.markdown-prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.markdown-prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.markdown-prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.markdown-prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.markdown-prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.markdown-prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.markdown-prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.markdown-prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.markdown-prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.markdown-prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.markdown-prose{--tw-prose-body:var(--color-text);--tw-prose-headings:var(--color-text-strong);--tw-prose-lead:#4b5563;--tw-prose-links:var(--color-primary);--tw-prose-bold:var(--color-text-strong);--tw-prose-counters:var(--color-text-muted);--tw-prose-bullets:var(--color-text-muted);--tw-prose-hr:var(--color-border-subtle);--tw-prose-quotes:var(--color-muted);--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:var(--color-secondary);--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:var(--color-border-subtle);--tw-prose-td-borders:var(--color-border-subtle);--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.6}.markdown-prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.markdown-prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5rem;margin-bottom:.5rem}.markdown-prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.markdown-prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.markdown-prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.markdown-prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.markdown-prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.markdown-prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.markdown-prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.markdown-prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.markdown-prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.markdown-prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.markdown-prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.markdown-prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.markdown-prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.markdown-prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.markdown-prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.markdown-prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.markdown-prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.markdown-prose{font-family:var(--font-family-sans)}.markdown-prose :where(h4,h5,h6):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:600;margin-top:.75rem;margin-bottom:.5rem}.markdown-prose :where(ul,ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:1rem;padding-left:1.25rem}.markdown-prose :where(a:hover):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration:underline}.markdown-prose{max-width:none;line-height:1.625;color:var(--text-primary);--tw-prose-body:var(--color-text);--tw-prose-headings:var(--color-text-strong);--tw-prose-invert-headings:var(--color-text-strong);--tw-prose-lead:var(--color-text);--tw-prose-links:var(--color-accent-strong);--tw-prose-bold:var(--color-text-strong);--tw-prose-counters:var(--color-text-muted);--tw-prose-bullets:var(--color-text-muted);--tw-prose-hr:var(--color-border-translucent-strong);--tw-prose-quotes:var(--color-text-strong);--tw-prose-quote-borders:var(--color-border-subtle);--tw-prose-captions:var(--color-text-muted);--tw-prose-code:var(--color-text-strong);--tw-prose-pre-code:var(--color-text);--tw-prose-pre-bg:var(--surface-muted);--tw-prose-th-borders:var(--color-border);--tw-prose-td-borders:var(--color-border-subtle)}.markdown-prose :where(h1,h2,h3,h4,h5,h6){color:var(--color-text-strong)}.markdown-prose :where(h1,h2,h3,h4,h5,h6) strong{color:inherit}.markdown-prose a{color:var(--color-accent-strong);text-decoration-color:color-mix(in srgb,var(--color-accent-strong) 65%,transparent);text-decoration-thickness:var(--link-underline-thickness);text-underline-offset:.2em}.markdown-prose a:focus-visible,.markdown-prose a:hover{color:var(--color-accent);text-decoration-line:underline}.markdown-prose blockquote{border-radius:var(--radius-md);border-left-width:4px;border-color:var(--border-subtle);background-color:var(--surface-muted);--tw-bg-opacity:0.5;padding:.5rem 1rem;color:var(--text-muted)}.markdown-prose :where(pre,code){font-family:var(--font-family-mono)}.markdown-prose code{border-radius:var(--radius-md);background-color:var(--surface-muted);padding:.125rem .25rem;color:var(--color-accent-strong)}.markdown-prose pre{overflow-x:auto;border-radius:var(--radius-lg);border-width:1px;border-color:var(--border-subtle);background-color:var(--surface-muted);padding:1rem;color:var(--text-primary)}.markdown-prose pre code{background-color:transparent;color:inherit;padding:0}.\!popover,.popover{position:relative;display:inline-flex}.popover-panel,.popover__panel{outline:2px solid transparent;outline-offset:2px}.popover-panel:focus-visible,.popover__panel:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.popover-panel,.popover__panel{pointer-events:none;z-index:var(--z-overlay-popover);min-width:var(--menu-min-width);max-width:var(--popover-inline-safe-max);--tw-scale-x:.95;--tw-scale-y:.95;border-radius:var(--overlay-panel-radius);border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.4;background-color:var(--surface-overlay-panel);padding:var(--overlay-panel-padding-block) var(--overlay-panel-padding-inline);font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary);opacity:0;--tw-shadow:var(--overlay-panel-shadow);--tw-shadow-colored:var(--overlay-panel-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-shadow-color:var(--surface-overlay-panel);--tw-shadow:var(--tw-shadow-colored);transition-property:opacity;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);position:var(--popover-strategy,fixed);left:var(--popover-left,0);top:var(--popover-top,0);max-width:var(--popover-max-width,none);max-height:var(--popover-max-height,none)}.popover-panel,.popover-panel[data-state=open],.popover__panel,.popover__panel[data-state=open]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.popover-panel[data-state=open],.popover__panel[data-state=open]{pointer-events:auto;--tw-scale-x:1;--tw-scale-y:1;opacity:1}.popover-panel[data-state=closed],.popover__panel[data-state=closed]{pointer-events:none;--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));opacity:0}[data-popover-arrow=true]{left:var(--popover-arrow-left,auto);right:var(--popover-arrow-right,auto);top:var(--popover-arrow-top,auto);bottom:var(--popover-arrow-bottom,auto)}.ds-overlay-backdrop{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:var(--overlay-backdrop-color);backdrop-filter:blur(var(--overlay-backdrop-blur));-webkit-backdrop-filter:blur(var(--overlay-backdrop-blur))}.popover-panel[data-variant=zap],.popover__panel[data-variant=zap]{background:var(--color-overlay-veil);color:var(--color-subtle);border:var(--border-width-hairline) solid var(--color-border-translucent-stronger);box-shadow:var(--shadow-popover-zap);backdrop-filter:blur(var(--popover-backdrop-blur));-webkit-backdrop-filter:blur(var(--popover-backdrop-blur))}.\!btn{outline:2px solid transparent;outline-offset:2px}.\!btn:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.\!btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--color-accent-strong);padding:.625rem 1.25rem;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;color:var(--color-white);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.btn{outline:2px solid transparent;outline-offset:2px}.btn:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--color-accent-strong);padding:.625rem 1.25rem;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;color:var(--color-white);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.\!btn[data-size=sm],.btn-ghost[data-size=sm],.btn[data-size=sm]{padding:.375rem .75rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug)}.\!btn[data-size=sm],.btn-ghost[data-size=sm],.btn[data-size=sm]{gap:.375rem}.\!btn:hover,.btn:hover{background-color:var(--color-accent)}.\!btn:focus-visible{background-color:var(--color-accent-pressed)}.btn:focus-visible{background-color:var(--color-accent-pressed)}.\!btn:disabled,.btn:disabled{pointer-events:none;cursor:not-allowed;opacity:.6;--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)}.btn-link{outline:2px solid transparent;outline-offset:2px}.btn-link:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.btn-link{display:inline-flex;align-items:center;gap:.25rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--color-accent);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.btn-link:focus-visible,.btn-link:hover{color:var(--color-accent-strong);text-decoration-line:underline}.progress,[data-progress-meter]{--progress-height:var(--progress-height-md);--progress-track:var(--progress-track-color);--progress-fill:var(--progress-fill-color);--progress-radius-current:var(--progress-radius);display:block;width:100%;height:var(--progress-height);border:none;border-radius:var(--progress-radius-current);overflow:hidden;background-color:var(--progress-track);-webkit-appearance:none;-moz-appearance:none;appearance:none}.progress::-webkit-progress-bar,[data-progress-meter]::-webkit-progress-bar{background-color:var(--progress-track);border-radius:var(--progress-radius-current)}.progress::-webkit-progress-value,[data-progress-meter]::-webkit-progress-value{background-color:var(--progress-fill);border-radius:var(--progress-radius-current);-webkit-transition:width var(--progress-transition-duration) var(--progress-transition-ease);transition:width var(--progress-transition-duration) var(--progress-transition-ease)}.progress::-moz-progress-bar,[data-progress-meter]::-moz-progress-bar{background-color:var(--progress-fill);border-radius:var(--progress-radius-current);-moz-transition:width var(--progress-transition-duration) var(--progress-transition-ease);transition:width var(--progress-transition-duration) var(--progress-transition-ease)}.progress.progress--surface,.progress[data-variant=surface],[data-progress-meter].progress--surface,[data-progress-meter][data-variant=surface]{--progress-track:var(--color-panel)}.progress.progress--accent,.progress[data-variant=accent],[data-progress-meter].progress--accent,[data-progress-meter][data-variant=accent]{--progress-fill:var(--color-info-strong)}.btn-ghost{outline:2px solid transparent;outline-offset:2px}.btn-ghost:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.btn-ghost{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-color:transparent;background-color:var(--color-accent-strong);padding:.625rem 1.25rem;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;color:var(--color-white);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.btn-ghost[data-size=sm]{padding:.375rem .75rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);gap:.375rem}.btn-ghost:hover{background-color:var(--color-accent)}.btn-ghost:focus-visible{background-color:var(--color-accent-pressed)}.btn-ghost:disabled{cursor:not-allowed;opacity:.6}body.iframe-form button.btn-ghost{align-self:flex-start;margin-top:var(--space-md)}.btn-ghost{border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.6;background-color:transparent;color:var(--text-primary);--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)}@media (prefers-reduced-motion:reduce){.btn-ghost{transition-property:none}}.btn-ghost:hover{background-color:var(--surface-panel-hover);color:var(--text-primary)}.btn-ghost:focus-visible{background-color:var(--surface-panel-hover)}.btn-ghost:disabled{pointer-events:none;opacity:.5;--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)}.btn-ghost[data-variant=critical]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.6;color:var(--color-critical)}.btn-ghost[data-variant=critical]:focus-visible,.btn-ghost[data-variant=critical]:hover{background-color:var(--color-critical);--tw-bg-opacity:0.2;color:var(--color-critical-strong)}.login-option{outline:2px solid transparent;outline-offset:2px}.login-option:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.login-option{display:block}.login-option{position:relative;display:flex;height:100%;width:100%;flex-direction:column;gap:1rem;overflow:hidden;border-width:1px;border-color:var(--border-default);background-color:var(--surface-overlay-panel-soft);padding:1.25rem 1.5rem;text-align:left;color:var(--text-primary);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);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-duration:.3s;transition-timing-function:cubic-bezier(0,0,.2,1);border-radius:calc(var(--radius-xl)*1.12);isolation:isolate;backdrop-filter:blur(var(--blur-modal-backdrop));background-image:linear-gradient(140deg,color-mix(in srgb,var(--surface-overlay-panel-soft) 88%,transparent) 0,color-mix(in srgb,var(--surface-overlay-panel) 72%,transparent) 100%);transform:translateZ(0);transition-property:border-color,box-shadow,transform}.login-option:after{content:"";position:absolute;inset:0;z-index:0;border-radius:inherit;opacity:0;transform:translate3d(0,14%,0);transition:opacity .22s ease,transform .22s ease;background:radial-gradient(115% 115% at 0 0,color-mix(in srgb,var(--status-neutral) 32%,transparent) 0,transparent 65%)}.login-option:focus-visible,.login-option:hover{border-color:var(--border-strong);box-shadow:var(--shadow-modal);transform:translate3d(0,var(--motion-login-option-hover-translate),0)}.login-option:focus-visible:after,.login-option:hover:after{opacity:.65;transform:translateZ(0)}.login-option:disabled,.login-option[aria-disabled=true]{cursor:not-allowed;opacity:.6;--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);transform:none}.login-option[data-tone=accent]:after{background:radial-gradient(120% 120% at 0 0,color-mix(in srgb,var(--status-info) 38%,transparent) 0,transparent 65%)}.login-option[data-tone=warning]:after{background:radial-gradient(120% 120% at 0 0,color-mix(in srgb,var(--status-warning) 42%,transparent) 0,transparent 65%)}.login-option--primary{border-color:var(--border-default)}.login-option--ghost{background-image:linear-gradient(145deg,color-mix(in srgb,var(--surface-overlay-panel-soft) 82%,transparent) 0,color-mix(in srgb,var(--surface-overlay-panel-soft) 68%,transparent) 100%)}.login-option--outline{border-color:var(--border-strong)}.login-option--link{border-width:1px;border-color:transparent;background-color:transparent;color:var(--color-accent);--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)}.login-option__capabilities,.login-option__copy,.login-option__header,.login-option__status{position:relative;z-index:1}#playerModal.login-option__header{display:block}.login-option__header{display:flex;width:100%;align-items:flex-start;justify-content:space-between;gap:1rem}#playerModal.login-option__copy{display:block}.login-option__copy{display:flex;min-width:0;flex-direction:column;align-items:flex-start;gap:.5rem}.login-option__eyebrow{font-size:var(--font-size-2xs);font-weight:600;text-transform:uppercase;color:var(--text-muted);letter-spacing:.18em}.login-option:focus-visible .login-option__eyebrow,.login-option:hover .login-option__eyebrow{color:var(--text-primary)}.login-option__label{font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;color:var(--text-primary)}.login-option__description{font-size:var(--font-size-sm);line-height:var(--line-height-snug);line-height:1.625}.login-option__chevron,.login-option__description{color:var(--text-muted)}.login-option__chevron{display:inline-flex;height:2.25rem;width:2.25rem;align-items:center;justify-content:center;border-radius:var(--radius-full);background-color:var(--surface-overlay-panel);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-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);box-shadow:inset 0 0 0 var(--border-width-hairline) color-mix(in srgb,var(--border-overlay) 60%,transparent)}.login-option:focus-visible .login-option__chevron,.login-option:hover .login-option__chevron{background-color:var(--color-accent);color:var(--color-white);box-shadow:none}#playerModal.login-option__status{display:block}.login-option__status{display:flex;width:100%;align-items:center;justify-content:space-between;gap:.5rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}#playerModal.login-option__capabilities{display:block}.login-option__capabilities{display:flex;flex-wrap:wrap;gap:.5rem;position:relative}.btn-ghost[aria-pressed=true],.btn-ghost[data-state=active]{border-color:transparent;background-color:var(--color-primary);color:var(--color-white);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.btn-ghost[aria-pressed=true]:focus-visible,.btn-ghost[aria-pressed=true]:hover,.btn-ghost[data-state=active]:focus-visible,.btn-ghost[data-state=active]:hover{background-color:var(--color-accent-strong)}.\!badge,.badge{display:inline-flex;align-items:center;gap:.25rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);padding:.25rem .75rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight);font-weight:600;text-transform:uppercase;letter-spacing:var(--tracking-extra-wide);color:var(--status-neutral-on)}.\!badge[data-variant=info],.badge[data-variant=info]{border-color:var(--status-info-border);background-color:var(--status-info-surface);color:var(--status-info-on)}.\!badge[data-variant=success],.badge[data-variant=success]{border-color:var(--status-success-border);background-color:var(--status-success-surface);color:var(--status-success-on)}.\!badge[data-variant=warning],.badge[data-variant=warning]{border-color:var(--status-warning-border);background-color:var(--status-warning-surface);color:var(--status-warning-on)}.\!badge[data-variant=critical],.badge[data-variant=critical]{border-color:var(--status-danger-border);background-color:var(--status-danger-surface);color:var(--status-danger-on)}.\!badge[data-variant=private],.badge[data-variant=private]{border-color:var(--status-private-border);background-color:var(--status-private-surface);color:var(--status-private-on)}.\!badge[data-variant=neutral],.badge[data-variant=neutral]{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);color:var(--status-neutral-on)}.moderation-badge{display:inline-flex;flex-direction:column;align-items:flex-start;gap:var(--space-sm);border-radius:var(--radius-xl);border-width:1px;padding:.375rem .75rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;text-transform:none;letter-spacing:-.025em;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.moderation-badge--interactive{pointer-events:auto}.moderation-badge__actions{display:inline-flex;flex-wrap:nowrap;align-items:center;gap:var(--space-sm)}.moderation-badge__label{display:inline-flex;align-items:center;gap:var(--space-xs);white-space:nowrap}.moderation-badge[data-variant=warning]{border-color:var(--status-warning-border);background-color:var(--status-warning-surface);color:var(--status-warning-on);box-shadow:0 var(--shadow-badge-offset-y) var(--shadow-badge-blur) color-mix(in srgb,var(--status-warning) 18%,transparent)}.moderation-badge[data-variant=neutral]{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);color:var(--status-neutral-on);box-shadow:0 var(--shadow-badge-offset-y) var(--shadow-badge-blur) color-mix(in srgb,var(--status-neutral) 18%,transparent)}.moderation-badge__icon{display:inline-flex;height:1.25rem;width:1.25rem;align-items:center;justify-content:center;border-radius:var(--radius-full);background-color:var(--status-warning-surface);background-color:color-mix(in srgb,var(--status-warning) 18%,transparent);color:var(--status-warning-on)}.moderation-badge[data-variant=neutral] .moderation-badge__icon{background-color:var(--status-neutral-surface);background-color:color-mix(in srgb,var(--status-neutral) 18%,transparent);color:var(--status-neutral-on)}.moderation-badge__icon-mark{height:.875rem;width:.875rem}.moderation-badge__text{white-space:nowrap}.moderation-badge__action,.moderation-badge__text{font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;letter-spacing:-.025em}.moderation-badge__action{display:inline-flex;align-items:center;gap:.375rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-warning-border);background-color:var(--status-warning-surface);padding:.25rem .75rem;text-transform:none;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-duration:.15s;transition-timing-function:cubic-bezier(0,0,.2,1);background-color:color-mix(in srgb,var(--status-warning) 16%,transparent);border-color:color-mix(in srgb,var(--status-warning-border) 80%,transparent);color:var(--status-warning-on)}.moderation-badge[data-variant=warning] .moderation-badge__action:hover{background-color:color-mix(in srgb,var(--status-warning) 24%,transparent)}.moderation-badge[data-variant=neutral] .moderation-badge__action{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);background-color:color-mix(in srgb,var(--status-neutral) 16%,transparent);border-color:color-mix(in srgb,var(--status-neutral-border) 80%,transparent);color:var(--status-neutral-on)}.moderation-badge[data-variant=neutral] .moderation-badge__action:hover{background-color:color-mix(in srgb,var(--status-neutral) 24%,transparent)}.moderation-badge__action:focus-visible{outline:var(--outline-thick-width) solid color-mix(in srgb,var(--status-warning) 38%,transparent);outline-offset:var(--space-3xs)}.moderation-badge[data-variant=neutral] .moderation-badge__action:focus-visible{outline:var(--outline-thick-width) solid color-mix(in srgb,var(--status-neutral) 38%,transparent)}.moderation-badge__action[disabled]{cursor:wait;opacity:.7}.pill{display:inline-flex;align-items:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);padding:.25rem .75rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:500;color:var(--status-neutral-on)}.pill[data-size=compact]{padding:.125rem .5rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.pill[data-variant=info]{border-color:var(--status-info-border);background-color:var(--status-info-surface);color:var(--status-info-on)}.pill[data-variant=success]{border-color:var(--status-success-border);background-color:var(--status-success-surface);color:var(--status-success-on)}.pill[data-variant=warning]{border-color:var(--status-warning-border);background-color:var(--status-warning-surface);color:var(--status-warning-on)}.pill[data-variant=critical]{border-color:var(--status-danger-border);background-color:var(--status-danger-surface);color:var(--status-danger-on)}.pill[data-variant=private]{border-color:var(--status-private-border);background-color:var(--status-private-surface);color:var(--status-private-on)}.pill[data-variant=neutral]{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);color:var(--status-neutral-on)}#playerModal.\!menu{display:block}.\!menu{display:flex;flex-direction:column;gap:.25rem;padding-top:.5rem;padding-bottom:.5rem}#playerModal.menu{display:block}.menu{display:flex;flex-direction:column;gap:.25rem;padding-top:.5rem;padding-bottom:.5rem}.menu__heading{padding-left:1rem;padding-right:1rem;padding-bottom:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;text-transform:uppercase;letter-spacing:.025em;color:var(--text-muted)}.menu__separator{margin-top:.5rem;margin-bottom:.5rem;height:1px;background-color:var(--border-default);--tw-bg-opacity:0.2}.menu__item{outline:2px solid transparent;outline-offset:2px}.menu__item:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.menu__item{display:block}.menu__item{position:relative;display:flex;width:100%;align-items:center;gap:.75rem;border-radius:var(--radius-md);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-primary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:var(--motion-ease-in-out)}.menu__item:hover{background-color:var(--surface-panel-hover);color:var(--text-primary)}.menu__item[data-state=active]{background-color:var(--color-accent);--tw-bg-opacity:0.2;color:var(--color-accent-strong)}.menu__item[data-variant=critical]{color:var(--color-critical-strong)}.menu__item[data-variant=critical]:hover{background-color:var(--color-critical);--tw-bg-opacity:0.2}.menu__item:disabled,.menu__item[aria-disabled=true]{cursor:not-allowed;opacity:.6}.menu__item:disabled,.menu__item:disabled:hover,.menu__item[aria-disabled=true],.menu__item[aria-disabled=true]:hover{background-color:transparent;color:var(--text-muted)}.\!card{--video-card-lift-translate-y:0!important;--video-card-backdrop-opacity:0!important;--video-card-backdrop-translate-y:var(--space-md-plus)!important;--video-card-backdrop-scale:1.08!important;--video-card-backdrop-blur:var(--blur-thumbnail-blur)!important}.card{--video-card-lift-translate-y:0;--video-card-backdrop-opacity:0;--video-card-backdrop-translate-y:var(--space-md-plus);--video-card-backdrop-scale:1.08;--video-card-backdrop-blur:var(--blur-thumbnail-blur)}.\!card{outline:2px solid transparent;outline-offset:2px}.\!card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.\!card{position:relative;border-radius:var(--radius-lg);border-width:1px;border-color:transparent;background-color:var(--surface-raised);color:var(--text-primary);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.card{outline:2px solid transparent;outline-offset:2px}.card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.card{position:relative;border-radius:var(--radius-lg);border-width:1px;border-color:transparent;background-color:var(--surface-raised);color:var(--text-primary);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.\!card{transform:translate3d(0,var(--video-card-lift-translate-y),0)!important;transition-property:transform,box-shadow,border-color,background-color,color!important;will-change:transform!important;isolation:isolate!important}.card{transform:translate3d(0,var(--video-card-lift-translate-y),0);transition-property:transform,box-shadow,border-color,background-color,color;will-change:transform;isolation:isolate}.\!card:before{content:""!important;position:absolute!important;inset:0!important;z-index:0!important;opacity:var(--video-card-backdrop-opacity)!important;background-image:var(--video-card-thumb-url,none)!important;background-position:50%!important;background-repeat:no-repeat!important;background-size:cover!important;transform:translate3d(0,var(--video-card-backdrop-translate-y),0) scale(var(--video-card-backdrop-scale))!important;filter:blur(var(--video-card-backdrop-blur))!important;transition:opacity var(--motion-duration-base) var(--motion-ease-in-out),transform var(--motion-duration-base) var(--motion-ease-in-out),filter var(--motion-duration-base) var(--motion-ease-in-out)!important;pointer-events:none!important;will-change:opacity,transform,filter!important}.card:before{content:"";position:absolute;inset:0;z-index:0;opacity:var(--video-card-backdrop-opacity);background-image:var(--video-card-thumb-url,none);background-position:50%;background-repeat:no-repeat;background-size:cover;transform:translate3d(0,var(--video-card-backdrop-translate-y),0) scale(var(--video-card-backdrop-scale));filter:blur(var(--video-card-backdrop-blur));transition:opacity var(--motion-duration-base) var(--motion-ease-in-out),transform var(--motion-duration-base) var(--motion-ease-in-out),filter var(--motion-duration-base) var(--motion-ease-in-out);pointer-events:none;will-change:opacity,transform,filter}.\!card>*{position:relative!important;z-index:1!important}.card>*{position:relative;z-index:1}#playerModal.card--compact{display:block}.card--compact{display:flex;flex-direction:row;align-items:flex-start;gap:var(--space-md)}.card--compact .video-card__media{inline-size:clamp(var(--video-card-compact-media-min),calc(var(--video-modal-secondary-min)*.4),var(--video-card-compact-media-max));flex-basis:clamp(var(--video-card-compact-media-min),calc(var(--video-modal-secondary-min)*0.4),var(--video-card-compact-media-max));display:block;flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal.card--compact .video-card__content{display:block}.card--compact .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm);padding:var(--space-md)}.card--compact .video-card__title{font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;line-height:1.375}.card--compact .video-card__author-name{font-size:var(--font-size-xs);line-height:var(--line-height-tight)}#playerModal.card--compact .video-card__meta{display:block}.card--compact .video-card__meta{margin-top:0;display:flex;align-items:center;gap:.5rem;color:var(--text-muted-strong)}.card--compact .video-card__meta,.card--compact .video-card__meta .view-count-text{font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.card:focus-within,.card:hover{--video-card-lift-translate-y:var(--motion-video-card-hover-translate);--video-card-backdrop-opacity:0.425;--video-card-backdrop-translate-y:var(
+/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-family-sans);font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{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,pre,samp{font-family:var(--font-family-mono);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,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{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}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html{font-size:80%}@media (min-width:768px){html{font-size:100%}}@media (min-width:1024px){html{font-size:75%}}*,:after,:before{scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}::-webkit-scrollbar{width:var(--scrollbar-width);height:var(--scrollbar-width)}::-webkit-scrollbar-track{background:var(--scrollbar-track)}::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:var(--radius-sm)}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}body{--app-header-centerline:calc(env(safe-area-inset-top, 0) + var(--app-header-centerline-offset));font-family:var(--font-family-sans);background-color:var(--color-page);color:var(--color-text-strong);line-height:1.5;margin:0;padding:0;overflow-x:hidden}:root[data-theme-accent=override]{--color-accent:var(--color-accent-override);--color-accent-strong:var(--color-accent-strong-override);--color-accent-pressed:var(--color-accent-pressed-override)}#uiOverlay{position:fixed;inset:0;pointer-events:none;z-index:var(--z-overlay-popover)}#uiOverlay>*{pointer-events:auto}#editNip71TagsFieldset>legend,#nip71TagsFieldset>legend{margin-left:0;padding:0}#app{background-color:var(--color-page);color:inherit}body.modal-open,html.modal-open{overflow:hidden;height:100%}body.modal-open #app{overflow:hidden}body.modal-open #sidebar{pointer-events:none;opacity:0;visibility:hidden;z-index:var(--z-sidebar-overlay)}.ng-cloak,.ng-hide:not(.ng-hide-animate),.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}ng\:form{display:block}.\!container{width:100%!important}.container{width:100%}@media (min-width:25rem){.\!container{max-width:25rem!important}.container{max-width:25rem}}@media (min-width:30rem){.\!container{max-width:30rem!important}.container{max-width:30rem}}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}#playerModal.ds-header{display:block}.ds-header{display:flex;align-items:center;justify-content:flex-start;padding-top:var(--space-sm);padding-bottom:var(--space-sm)}.app-shell__header{position:sticky;top:env(safe-area-inset-top,0);z-index:var(--z-app-header);padding-top:calc(var(--space-sm) + env(safe-area-inset-top, 0));padding-bottom:var(--space-sm);background-color:transparent;background-image:var(--surface-overlay-banner-gradient-header);background-repeat:no-repeat;background-size:100% 100%}.ds-metric-probe{position:absolute;top:0;left:0;visibility:hidden;pointer-events:none;contain:layout size style;inline-size:0;block-size:var(--ds-metric-probe-length,0);overflow:hidden}.ds-header__logo{height:var(--space-2xl-plus);width:auto;max-width:none}.focus-ring{outline:2px solid transparent;outline-offset:2px}.focus-ring:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.author-pic{display:block;height:100%;width:100%;border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover}.header-icon-toggle{outline:2px solid transparent;outline-offset:2px}.header-icon-toggle:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.header-icon-toggle{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-timing-function:cubic-bezier(0,0,.2,1);width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg);padding:0;border:none;background:transparent;color:var(--color-text-muted);line-height:1}.header-icon-toggle[data-theme-state=light]{color:var(--color-text-strong)}.header-icon-toggle[data-theme-state=dark]{color:var(--color-text)}.header-icon-toggle__icon-wrapper{display:inline-flex;align-items:center;justify-content:center;inline-size:var(--space-lg);block-size:var(--space-lg)}.header-icon-toggle__icon{inline-size:100%;block-size:100%;display:none;fill:currentColor}.header-icon-toggle__icon-wrapper:not([data-theme-icon-state]),.header-icon-toggle__icon-wrapper[data-theme-icon-state=light]{color:inherit}.header-icon-toggle__icon-wrapper:not([data-theme-icon-state]) .header-icon-toggle__icon--dark,.header-icon-toggle__icon-wrapper[data-theme-icon-state=dark] .header-icon-toggle__icon--light,.header-icon-toggle__icon-wrapper[data-theme-icon-state=light] .header-icon-toggle__icon--dark{display:block}.header-icon-toggle[data-theme-state=light]:focus-visible,.header-icon-toggle[data-theme-state=light]:hover{color:var(--color-text)}.header-icon-toggle[data-theme-state=dark]:focus-visible,.header-icon-toggle[data-theme-state=dark]:hover{color:var(--color-text-strong)}.header-icon-toggle[aria-pressed=true]{color:var(--color-text-strong)}.header-icon-toggle[aria-pressed=true]:focus-visible,.header-icon-toggle[aria-pressed=true]:hover{color:var(--color-text-strong)}.bv-modal.header-search__region,.profile-pane.header-search__region{display:none}.header-search__region{display:none;flex:1 1 0%;justify-content:center}@media (min-width:768px){.header-search__region#playerModal{display:block}.header-search__region{display:flex}}.header-search__region{min-width:0;padding-inline:clamp(var(--space-md),4vw,var(--space-3xl))}#playerModal.header-search{display:block}.header-search{display:flex;align-items:center;gap:.75rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.4;background-color:var(--surface-overlay-panel);padding-left:1rem;padding-right:1rem;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);backdrop-filter:blur(var(--popover-backdrop-blur));-webkit-backdrop-filter:blur(var(--popover-backdrop-blur));padding-block:calc(var(--space-sm)*.9);inline-size:min(100%,var(--header-search-max-inline))}.header-search:focus-within{border-color:var(--color-accent-strong)}.header-search__icon{display:block;height:1.25rem;width:1.25rem;background-color:currentColor;mask-repeat:no-repeat;mask-position:center;mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;-webkit-mask-size:contain}.header-search__icon--filter{mask-image:url(../assets/svg/filter.svg);-webkit-mask-image:url(../assets/svg/filter.svg)}.header-search__icon--submit{mask-image:url(../assets/svg/search.svg);-webkit-mask-image:url(../assets/svg/search.svg)}.header-search__filter{outline:2px solid transparent;outline-offset:2px}.header-search__filter:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.header-search__filter{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:transparent;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);color:var(--color-accent);inline-size:calc(var(--icon-size-lg)*.9);block-size:calc(var(--icon-size-lg)*.9);min-inline-size:calc(var(--icon-size-lg)*.9);min-block-size:calc(var(--icon-size-lg)*.9)}.header-search__filter:focus-visible,.header-search__filter:hover{color:var(--color-accent-strong)}.header-search__input{flex:1 1 0%;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary);outline:2px solid transparent;outline-offset:2px}.header-search__input::-moz-placeholder{color:var(--text-muted)}.header-search__input::placeholder{color:var(--text-muted)}.header-search__input{min-width:0}.header-search__input:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.header-search__submit{outline:2px solid transparent;outline-offset:2px}.header-search__submit:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.header-search__submit{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);background-color:var(--color-accent-strong);color:var(--color-white);inline-size:calc(var(--icon-size-lg)*.9);block-size:calc(var(--icon-size-lg)*.9);min-inline-size:calc(var(--icon-size-lg)*.9);min-block-size:calc(var(--icon-size-lg)*.9);padding:0}.header-search__submit:hover{background-color:var(--color-accent)}.header-search__submit:focus-visible{background-color:var(--color-accent-pressed)}.bv-logo{--logo-wordmark-color:var(--color-logo-wordmark);--logo-accent-color:var(--color-logo-accent);--logo-background-color:var(--color-logo-background)}.bv-logo[data-variant=inverse]{--logo-wordmark-color:var(--color-logo-wordmark-inverse);--logo-background-color:var(--color-logo-background-inverse)}.bv-logo[data-wordmark=current]{--logo-wordmark-color:currentColor}.bv-logo[data-accent=current]{--logo-accent-color:currentColor}.bv-logo[data-background=transparent]{--logo-background-color:transparent}.bv-logo__wordmark{fill:var(--logo-wordmark-color);color:var(--logo-wordmark-color)}.bv-logo__accent{fill:var(--logo-accent-color);color:var(--logo-accent-color)}.bv-logo__background{fill:var(--logo-background-color);color:var(--logo-background-color)}.markdown-prose{color:var(--color-text)}.markdown-prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:1rem}.markdown-prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.markdown-prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-primary);text-decoration:none;font-weight:500}.markdown-prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.markdown-prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.markdown-prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.markdown-prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.markdown-prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.markdown-prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.markdown-prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.markdown-prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.markdown-prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.markdown-prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.markdown-prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.markdown-prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.markdown-prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.markdown-prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.markdown-prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.markdown-prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--color-border-subtle);border-top-width:1px;margin-top:2rem;margin-bottom:2rem}.markdown-prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--color-muted);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\201C""\201D""\2018""\2019";margin-top:1rem;margin-bottom:1rem;padding-inline-start:1em;border-left-width:4px;border-left-color:var(--color-border-subtle);padding-left:1rem}.markdown-prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.markdown-prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.markdown-prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:var(--font-size-2xl);margin-top:.5rem;margin-bottom:1rem;line-height:1.1111111}.markdown-prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.markdown-prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:var(--font-size-xl);margin-top:1.25rem;margin-bottom:.75rem;line-height:1.3333333}.markdown-prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.markdown-prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:var(--font-size-lg);margin-top:1rem;margin-bottom:.75rem;line-height:1.6}.markdown-prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.markdown-prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.markdown-prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.markdown-prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:1rem;border-radius:var(--radius-md);max-width:100%;height:auto}.markdown-prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.markdown-prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.markdown-prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.markdown-prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-secondary);font-weight:500;font-size:var(--font-size-sm);background-color:var(--color-page-alt);padding:.2rem .4rem;border-radius:var(--radius-md);font-family:var(--font-family-mono)}.markdown-prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.markdown-prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.markdown-prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.markdown-prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.markdown-prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-text-strong);background-color:var(--color-page-alt);overflow-x:auto;font-weight:400;font-size:var(--font-size-sm);line-height:1.7142857;margin-top:0;margin-bottom:1rem;border-radius:var(--radius-md);padding-inline-end:1.1428571em;padding-inline-start:1.1428571em;padding:1rem;font-family:var(--font-family-mono)}.markdown-prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.markdown-prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.markdown-prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.markdown-prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.markdown-prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.markdown-prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.markdown-prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.markdown-prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.markdown-prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.markdown-prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.markdown-prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.markdown-prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.markdown-prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.markdown-prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.markdown-prose{--tw-prose-body:var(--color-text);--tw-prose-headings:var(--color-text-strong);--tw-prose-lead:#4b5563;--tw-prose-links:var(--color-primary);--tw-prose-bold:var(--color-text-strong);--tw-prose-counters:var(--color-text-muted);--tw-prose-bullets:var(--color-text-muted);--tw-prose-hr:var(--color-border-subtle);--tw-prose-quotes:var(--color-muted);--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:var(--color-secondary);--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:var(--color-border-subtle);--tw-prose-td-borders:var(--color-border-subtle);--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.6}.markdown-prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.markdown-prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5rem;margin-bottom:.5rem}.markdown-prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.markdown-prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.markdown-prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.markdown-prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.markdown-prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.markdown-prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.markdown-prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.markdown-prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.markdown-prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.markdown-prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.markdown-prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.markdown-prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.markdown-prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.markdown-prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.markdown-prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.markdown-prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.markdown-prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.markdown-prose{font-family:var(--font-family-sans)}.markdown-prose :where(h4,h5,h6):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:600;margin-top:.75rem;margin-bottom:.5rem}.markdown-prose :where(ul,ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:1rem;padding-left:1.25rem}.markdown-prose :where(a:hover):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration:underline}.markdown-prose{max-width:none;line-height:1.625;color:var(--text-primary);--tw-prose-body:var(--color-text);--tw-prose-headings:var(--color-text-strong);--tw-prose-invert-headings:var(--color-text-strong);--tw-prose-lead:var(--color-text);--tw-prose-links:var(--color-accent-strong);--tw-prose-bold:var(--color-text-strong);--tw-prose-counters:var(--color-text-muted);--tw-prose-bullets:var(--color-text-muted);--tw-prose-hr:var(--color-border-translucent-strong);--tw-prose-quotes:var(--color-text-strong);--tw-prose-quote-borders:var(--color-border-subtle);--tw-prose-captions:var(--color-text-muted);--tw-prose-code:var(--color-text-strong);--tw-prose-pre-code:var(--color-text);--tw-prose-pre-bg:var(--surface-muted);--tw-prose-th-borders:var(--color-border);--tw-prose-td-borders:var(--color-border-subtle)}.markdown-prose :where(h1,h2,h3,h4,h5,h6){color:var(--color-text-strong)}.markdown-prose :where(h1,h2,h3,h4,h5,h6) strong{color:inherit}.markdown-prose a{color:var(--color-accent-strong);text-decoration-color:color-mix(in srgb,var(--color-accent-strong) 65%,transparent);text-decoration-thickness:var(--link-underline-thickness);text-underline-offset:.2em}.markdown-prose a:focus-visible,.markdown-prose a:hover{color:var(--color-accent);text-decoration-line:underline}.markdown-prose blockquote{border-radius:var(--radius-md);border-left-width:4px;border-color:var(--border-subtle);background-color:var(--surface-muted);--tw-bg-opacity:0.5;padding:.5rem 1rem;color:var(--text-muted)}.markdown-prose :where(pre,code){font-family:var(--font-family-mono)}.markdown-prose code{border-radius:var(--radius-md);background-color:var(--surface-muted);padding:.125rem .25rem;color:var(--color-accent-strong)}.markdown-prose pre{overflow-x:auto;border-radius:var(--radius-lg);border-width:1px;border-color:var(--border-subtle);background-color:var(--surface-muted);padding:1rem;color:var(--text-primary)}.markdown-prose pre code{background-color:transparent;color:inherit;padding:0}.\!popover,.popover{position:relative;display:inline-flex}.popover-panel,.popover__panel{outline:2px solid transparent;outline-offset:2px}.popover-panel:focus-visible,.popover__panel:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.popover-panel,.popover__panel{pointer-events:none;z-index:var(--z-overlay-popover);min-width:var(--menu-min-width);max-width:var(--popover-inline-safe-max);--tw-scale-x:.95;--tw-scale-y:.95;border-radius:var(--overlay-panel-radius);border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.4;background-color:var(--surface-overlay-panel);padding:var(--overlay-panel-padding-block) var(--overlay-panel-padding-inline);font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary);opacity:0;--tw-shadow:var(--overlay-panel-shadow);--tw-shadow-colored:var(--overlay-panel-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-shadow-color:var(--surface-overlay-panel);--tw-shadow:var(--tw-shadow-colored);transition-property:opacity;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);position:var(--popover-strategy,fixed);left:var(--popover-left,0);top:var(--popover-top,0);max-width:var(--popover-max-width,none);max-height:var(--popover-max-height,none)}.popover-panel,.popover-panel[data-state=open],.popover__panel,.popover__panel[data-state=open]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.popover-panel[data-state=open],.popover__panel[data-state=open]{pointer-events:auto;--tw-scale-x:1;--tw-scale-y:1;opacity:1}.popover-panel[data-state=closed],.popover__panel[data-state=closed]{pointer-events:none;--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));opacity:0}[data-popover-arrow=true]{left:var(--popover-arrow-left,auto);right:var(--popover-arrow-right,auto);top:var(--popover-arrow-top,auto);bottom:var(--popover-arrow-bottom,auto)}.ds-overlay-backdrop{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:var(--overlay-backdrop-color);backdrop-filter:blur(var(--overlay-backdrop-blur));-webkit-backdrop-filter:blur(var(--overlay-backdrop-blur))}.popover-panel[data-variant=zap],.popover__panel[data-variant=zap]{background:var(--color-overlay-veil);color:var(--color-subtle);border:var(--border-width-hairline) solid var(--color-border-translucent-stronger);box-shadow:var(--shadow-popover-zap);backdrop-filter:blur(var(--popover-backdrop-blur));-webkit-backdrop-filter:blur(var(--popover-backdrop-blur))}.\!btn{outline:2px solid transparent;outline-offset:2px}.\!btn:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.\!btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--color-accent-strong);padding:.625rem 1.25rem;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;color:var(--color-white);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.btn{outline:2px solid transparent;outline-offset:2px}.btn:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--color-accent-strong);padding:.625rem 1.25rem;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;color:var(--color-white);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.\!btn[data-size=sm],.btn-ghost[data-size=sm],.btn[data-size=sm]{padding:.375rem .75rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug)}.\!btn[data-size=sm],.btn-ghost[data-size=sm],.btn[data-size=sm]{gap:.375rem}.\!btn:hover,.btn:hover{background-color:var(--color-accent)}.\!btn:focus-visible{background-color:var(--color-accent-pressed)}.btn:focus-visible{background-color:var(--color-accent-pressed)}.\!btn:disabled,.btn:disabled{pointer-events:none;cursor:not-allowed;opacity:.6;--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)}.btn-link{outline:2px solid transparent;outline-offset:2px}.btn-link:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.btn-link{display:inline-flex;align-items:center;gap:.25rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--color-accent);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.btn-link:focus-visible,.btn-link:hover{color:var(--color-accent-strong);text-decoration-line:underline}.progress,[data-progress-meter]{--progress-height:var(--progress-height-md);--progress-track:var(--progress-track-color);--progress-fill:var(--progress-fill-color);--progress-radius-current:var(--progress-radius);display:block;width:100%;height:var(--progress-height);border:none;border-radius:var(--progress-radius-current);overflow:hidden;background-color:var(--progress-track);-webkit-appearance:none;-moz-appearance:none;appearance:none}.progress::-webkit-progress-bar,[data-progress-meter]::-webkit-progress-bar{background-color:var(--progress-track);border-radius:var(--progress-radius-current)}.progress::-webkit-progress-value,[data-progress-meter]::-webkit-progress-value{background-color:var(--progress-fill);border-radius:var(--progress-radius-current);-webkit-transition:width var(--progress-transition-duration) var(--progress-transition-ease);transition:width var(--progress-transition-duration) var(--progress-transition-ease)}.progress::-moz-progress-bar,[data-progress-meter]::-moz-progress-bar{background-color:var(--progress-fill);border-radius:var(--progress-radius-current);-moz-transition:width var(--progress-transition-duration) var(--progress-transition-ease);transition:width var(--progress-transition-duration) var(--progress-transition-ease)}.progress.progress--surface,.progress[data-variant=surface],[data-progress-meter].progress--surface,[data-progress-meter][data-variant=surface]{--progress-track:var(--color-panel)}.progress.progress--accent,.progress[data-variant=accent],[data-progress-meter].progress--accent,[data-progress-meter][data-variant=accent]{--progress-fill:var(--color-info-strong)}.btn-ghost{outline:2px solid transparent;outline-offset:2px}.btn-ghost:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.btn-ghost{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-color:transparent;background-color:var(--color-accent-strong);padding:.625rem 1.25rem;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;color:var(--color-white);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.btn-ghost[data-size=sm]{padding:.375rem .75rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);gap:.375rem}.btn-ghost:hover{background-color:var(--color-accent)}.btn-ghost:focus-visible{background-color:var(--color-accent-pressed)}.btn-ghost:disabled{cursor:not-allowed;opacity:.6}body.iframe-form button.btn-ghost{align-self:flex-start;margin-top:var(--space-md)}.btn-ghost{border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.6;background-color:transparent;color:var(--text-primary);--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)}@media (prefers-reduced-motion:reduce){.btn-ghost{transition-property:none}}.btn-ghost:hover{background-color:var(--surface-panel-hover);color:var(--text-primary)}.btn-ghost:focus-visible{background-color:var(--surface-panel-hover)}.btn-ghost:disabled{pointer-events:none;opacity:.5;--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)}.btn-ghost[data-variant=critical]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.6;color:var(--color-critical)}.btn-ghost[data-variant=critical]:focus-visible,.btn-ghost[data-variant=critical]:hover{background-color:var(--color-critical);--tw-bg-opacity:0.2;color:var(--color-critical-strong)}.login-option{outline:2px solid transparent;outline-offset:2px}.login-option:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.login-option{display:block}.login-option{position:relative;display:flex;height:100%;width:100%;flex-direction:column;gap:1rem;overflow:hidden;border-width:1px;border-color:var(--border-default);background-color:var(--surface-overlay-panel-soft);padding:1.25rem 1.5rem;text-align:left;color:var(--text-primary);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);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-duration:.3s;transition-timing-function:cubic-bezier(0,0,.2,1);border-radius:calc(var(--radius-xl)*1.12);isolation:isolate;backdrop-filter:blur(var(--blur-modal-backdrop));background-image:linear-gradient(140deg,color-mix(in srgb,var(--surface-overlay-panel-soft) 88%,transparent) 0,color-mix(in srgb,var(--surface-overlay-panel) 72%,transparent) 100%);transform:translateZ(0);transition-property:border-color,box-shadow,transform}.login-option:after{content:"";position:absolute;inset:0;z-index:0;border-radius:inherit;opacity:0;transform:translate3d(0,14%,0);transition:opacity .22s ease,transform .22s ease;background:radial-gradient(115% 115% at 0 0,color-mix(in srgb,var(--status-neutral) 32%,transparent) 0,transparent 65%)}.login-option:focus-visible,.login-option:hover{border-color:var(--border-strong);box-shadow:var(--shadow-modal);transform:translate3d(0,var(--motion-login-option-hover-translate),0)}.login-option:focus-visible:after,.login-option:hover:after{opacity:.65;transform:translateZ(0)}.login-option:disabled,.login-option[aria-disabled=true]{cursor:not-allowed;opacity:.6;--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);transform:none}.login-option[data-tone=accent]:after{background:radial-gradient(120% 120% at 0 0,color-mix(in srgb,var(--status-info) 38%,transparent) 0,transparent 65%)}.login-option[data-tone=warning]:after{background:radial-gradient(120% 120% at 0 0,color-mix(in srgb,var(--status-warning) 42%,transparent) 0,transparent 65%)}.login-option--primary{border-color:var(--border-default)}.login-option--ghost{background-image:linear-gradient(145deg,color-mix(in srgb,var(--surface-overlay-panel-soft) 82%,transparent) 0,color-mix(in srgb,var(--surface-overlay-panel-soft) 68%,transparent) 100%)}.login-option--outline{border-color:var(--border-strong)}.login-option--link{border-width:1px;border-color:transparent;background-color:transparent;color:var(--color-accent);--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)}.login-option__capabilities,.login-option__copy,.login-option__header,.login-option__status{position:relative;z-index:1}#playerModal.login-option__header{display:block}.login-option__header{display:flex;width:100%;align-items:flex-start;justify-content:space-between;gap:1rem}#playerModal.login-option__copy{display:block}.login-option__copy{display:flex;min-width:0;flex-direction:column;align-items:flex-start;gap:.5rem}.login-option__eyebrow{font-size:var(--font-size-2xs);font-weight:600;text-transform:uppercase;color:var(--text-muted);letter-spacing:.18em}.login-option:focus-visible .login-option__eyebrow,.login-option:hover .login-option__eyebrow{color:var(--text-primary)}.login-option__label{font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;color:var(--text-primary)}.login-option__description{font-size:var(--font-size-sm);line-height:var(--line-height-snug);line-height:1.625}.login-option__chevron,.login-option__description{color:var(--text-muted)}.login-option__chevron{display:inline-flex;height:2.25rem;width:2.25rem;align-items:center;justify-content:center;border-radius:var(--radius-full);background-color:var(--surface-overlay-panel);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-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);box-shadow:inset 0 0 0 var(--border-width-hairline) color-mix(in srgb,var(--border-overlay) 60%,transparent)}.login-option:focus-visible .login-option__chevron,.login-option:hover .login-option__chevron{background-color:var(--color-accent);color:var(--color-white);box-shadow:none}#playerModal.login-option__status{display:block}.login-option__status{display:flex;width:100%;align-items:center;justify-content:space-between;gap:.5rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}#playerModal.login-option__capabilities{display:block}.login-option__capabilities{display:flex;flex-wrap:wrap;gap:.5rem;position:relative}.btn-ghost[aria-pressed=true],.btn-ghost[data-state=active]{border-color:transparent;background-color:var(--color-primary);color:var(--color-white);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.btn-ghost[aria-pressed=true]:focus-visible,.btn-ghost[aria-pressed=true]:hover,.btn-ghost[data-state=active]:focus-visible,.btn-ghost[data-state=active]:hover{background-color:var(--color-accent-strong)}.\!badge,.badge{display:inline-flex;align-items:center;gap:.25rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);padding:.25rem .75rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight);font-weight:600;text-transform:uppercase;letter-spacing:var(--tracking-extra-wide);color:var(--status-neutral-on)}.\!badge[data-variant=info],.badge[data-variant=info]{border-color:var(--status-info-border);background-color:var(--status-info-surface);color:var(--status-info-on)}.\!badge[data-variant=success],.badge[data-variant=success]{border-color:var(--status-success-border);background-color:var(--status-success-surface);color:var(--status-success-on)}.\!badge[data-variant=warning],.badge[data-variant=warning]{border-color:var(--status-warning-border);background-color:var(--status-warning-surface);color:var(--status-warning-on)}.\!badge[data-variant=critical],.badge[data-variant=critical]{border-color:var(--status-danger-border);background-color:var(--status-danger-surface);color:var(--status-danger-on)}.\!badge[data-variant=private],.badge[data-variant=private]{border-color:var(--status-private-border);background-color:var(--status-private-surface);color:var(--status-private-on)}.\!badge[data-variant=neutral],.badge[data-variant=neutral]{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);color:var(--status-neutral-on)}.moderation-badge{display:inline-flex;flex-direction:column;align-items:flex-start;gap:var(--space-sm);border-radius:var(--radius-xl);border-width:1px;padding:.375rem .75rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;text-transform:none;letter-spacing:-.025em;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.moderation-badge--interactive{pointer-events:auto}.moderation-badge__actions{display:inline-flex;flex-wrap:nowrap;align-items:center;gap:var(--space-sm)}.moderation-badge__label{display:inline-flex;align-items:center;gap:var(--space-xs);white-space:nowrap}.moderation-badge[data-variant=warning]{border-color:var(--status-warning-border);background-color:var(--status-warning-surface);color:var(--status-warning-on);box-shadow:0 var(--shadow-badge-offset-y) var(--shadow-badge-blur) color-mix(in srgb,var(--status-warning) 18%,transparent)}.moderation-badge[data-variant=neutral]{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);color:var(--status-neutral-on);box-shadow:0 var(--shadow-badge-offset-y) var(--shadow-badge-blur) color-mix(in srgb,var(--status-neutral) 18%,transparent)}.moderation-badge__icon{display:inline-flex;height:1.25rem;width:1.25rem;align-items:center;justify-content:center;border-radius:var(--radius-full);background-color:var(--status-warning-surface);background-color:color-mix(in srgb,var(--status-warning) 18%,transparent);color:var(--status-warning-on)}.moderation-badge[data-variant=neutral] .moderation-badge__icon{background-color:var(--status-neutral-surface);background-color:color-mix(in srgb,var(--status-neutral) 18%,transparent);color:var(--status-neutral-on)}.moderation-badge__icon-mark{height:.875rem;width:.875rem}.moderation-badge__text{white-space:nowrap}.moderation-badge__action,.moderation-badge__text{font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;letter-spacing:-.025em}.moderation-badge__action{display:inline-flex;align-items:center;gap:.375rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-warning-border);background-color:var(--status-warning-surface);padding:.25rem .75rem;text-transform:none;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-duration:.15s;transition-timing-function:cubic-bezier(0,0,.2,1);background-color:color-mix(in srgb,var(--status-warning) 16%,transparent);border-color:color-mix(in srgb,var(--status-warning-border) 80%,transparent);color:var(--status-warning-on)}.moderation-badge[data-variant=warning] .moderation-badge__action:hover{background-color:color-mix(in srgb,var(--status-warning) 24%,transparent)}.moderation-badge[data-variant=neutral] .moderation-badge__action{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);background-color:color-mix(in srgb,var(--status-neutral) 16%,transparent);border-color:color-mix(in srgb,var(--status-neutral-border) 80%,transparent);color:var(--status-neutral-on)}.moderation-badge[data-variant=neutral] .moderation-badge__action:hover{background-color:color-mix(in srgb,var(--status-neutral) 24%,transparent)}.moderation-badge__action:focus-visible{outline:var(--outline-thick-width) solid color-mix(in srgb,var(--status-warning) 38%,transparent);outline-offset:var(--space-3xs)}.moderation-badge[data-variant=neutral] .moderation-badge__action:focus-visible{outline:var(--outline-thick-width) solid color-mix(in srgb,var(--status-neutral) 38%,transparent)}.moderation-badge__action[disabled]{cursor:wait;opacity:.7}.pill{display:inline-flex;align-items:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);padding:.25rem .75rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:500;color:var(--status-neutral-on)}.pill[data-size=compact]{padding:.125rem .5rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.pill[data-variant=info]{border-color:var(--status-info-border);background-color:var(--status-info-surface);color:var(--status-info-on)}.pill[data-variant=success]{border-color:var(--status-success-border);background-color:var(--status-success-surface);color:var(--status-success-on)}.pill[data-variant=warning]{border-color:var(--status-warning-border);background-color:var(--status-warning-surface);color:var(--status-warning-on)}.pill[data-variant=critical]{border-color:var(--status-danger-border);background-color:var(--status-danger-surface);color:var(--status-danger-on)}.pill[data-variant=private]{border-color:var(--status-private-border);background-color:var(--status-private-surface);color:var(--status-private-on)}.pill[data-variant=neutral]{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);color:var(--status-neutral-on)}#playerModal.\!menu{display:block}.\!menu{display:flex;flex-direction:column;gap:.25rem;padding-top:.5rem;padding-bottom:.5rem}#playerModal.menu{display:block}.menu{display:flex;flex-direction:column;gap:.25rem;padding-top:.5rem;padding-bottom:.5rem}.menu__heading{padding-left:1rem;padding-right:1rem;padding-bottom:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;text-transform:uppercase;letter-spacing:.025em;color:var(--text-muted)}.menu__separator{margin-top:.5rem;margin-bottom:.5rem;height:1px;background-color:var(--border-default);--tw-bg-opacity:0.2}.menu__item{outline:2px solid transparent;outline-offset:2px}.menu__item:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.menu__item{display:block}.menu__item{position:relative;display:flex;width:100%;align-items:center;gap:.75rem;border-radius:var(--radius-md);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-primary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:var(--motion-ease-in-out)}.menu__item:hover{background-color:var(--surface-panel-hover);color:var(--text-primary)}.menu__item[data-state=active]{background-color:var(--color-accent);--tw-bg-opacity:0.2;color:var(--color-accent-strong)}.menu__item[data-variant=critical]{color:var(--color-critical-strong)}.menu__item[data-variant=critical]:hover{background-color:var(--color-critical);--tw-bg-opacity:0.2}.menu__item:disabled,.menu__item[aria-disabled=true]{cursor:not-allowed;opacity:.6}.menu__item:disabled,.menu__item:disabled:hover,.menu__item[aria-disabled=true],.menu__item[aria-disabled=true]:hover{background-color:transparent;color:var(--text-muted)}.\!card{--video-card-lift-translate-y:0!important;--video-card-backdrop-opacity:0!important;--video-card-backdrop-translate-y:var(--space-md-plus)!important;--video-card-backdrop-scale:1.08!important;--video-card-backdrop-blur:var(--blur-thumbnail-blur)!important}.card{--video-card-lift-translate-y:0;--video-card-backdrop-opacity:0;--video-card-backdrop-translate-y:var(--space-md-plus);--video-card-backdrop-scale:1.08;--video-card-backdrop-blur:var(--blur-thumbnail-blur)}.\!card{outline:2px solid transparent;outline-offset:2px}.\!card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.\!card{position:relative;border-radius:var(--radius-lg);border-width:1px;border-color:transparent;background-color:var(--surface-raised);color:var(--text-primary);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.card{outline:2px solid transparent;outline-offset:2px}.card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.card{position:relative;border-radius:var(--radius-lg);border-width:1px;border-color:transparent;background-color:var(--surface-raised);color:var(--text-primary);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.\!card{transform:translate3d(0,var(--video-card-lift-translate-y),0)!important;transition-property:transform,box-shadow,border-color,background-color,color!important;will-change:transform!important;isolation:isolate!important}.card{transform:translate3d(0,var(--video-card-lift-translate-y),0);transition-property:transform,box-shadow,border-color,background-color,color;will-change:transform;isolation:isolate}.\!card:before{content:""!important;position:absolute!important;inset:0!important;z-index:0!important;opacity:var(--video-card-backdrop-opacity)!important;background-image:var(--video-card-thumb-url,none)!important;background-position:50%!important;background-repeat:no-repeat!important;background-size:cover!important;transform:translate3d(0,var(--video-card-backdrop-translate-y),0) scale(var(--video-card-backdrop-scale))!important;filter:blur(var(--video-card-backdrop-blur))!important;transition:opacity var(--motion-duration-base) var(--motion-ease-in-out),transform var(--motion-duration-base) var(--motion-ease-in-out),filter var(--motion-duration-base) var(--motion-ease-in-out)!important;pointer-events:none!important;will-change:opacity,transform,filter!important}.card:before{content:"";position:absolute;inset:0;z-index:0;opacity:var(--video-card-backdrop-opacity);background-image:var(--video-card-thumb-url,none);background-position:50%;background-repeat:no-repeat;background-size:cover;transform:translate3d(0,var(--video-card-backdrop-translate-y),0) scale(var(--video-card-backdrop-scale));filter:blur(var(--video-card-backdrop-blur));transition:opacity var(--motion-duration-base) var(--motion-ease-in-out),transform var(--motion-duration-base) var(--motion-ease-in-out),filter var(--motion-duration-base) var(--motion-ease-in-out);pointer-events:none;will-change:opacity,transform,filter}.\!card>*{position:relative!important;z-index:1!important}.card>*{position:relative;z-index:1}#playerModal.card--compact{display:block}.card--compact{display:flex;flex-direction:row;align-items:flex-start;gap:var(--space-md)}.card--compact .video-card__media{inline-size:clamp(var(--video-card-compact-media-min),calc(var(--video-modal-secondary-min)*.4),var(--video-card-compact-media-max));flex-basis:clamp(var(--video-card-compact-media-min),calc(var(--video-modal-secondary-min)*0.4),var(--video-card-compact-media-max));display:block;flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal.card--compact .video-card__content{display:block}.card--compact .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm);padding:var(--space-md)}.card--compact .video-card__title{font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;line-height:1.375}.card--compact .video-card__author-name{font-size:var(--font-size-xs);line-height:var(--line-height-tight)}#playerModal.card--compact .video-card__meta{display:block}.card--compact .video-card__meta{margin-top:0;display:flex;align-items:center;gap:.5rem;color:var(--text-muted-strong)}.card--compact .video-card__meta,.card--compact .video-card__meta .view-count-text{font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.card:focus-within,.card:hover{--video-card-lift-translate-y:var(--motion-video-card-hover-translate);--video-card-backdrop-opacity:0.425;--video-card-backdrop-translate-y:var(
--motion-video-card-backdrop-translate
);--video-card-backdrop-scale:1.12;--video-card-backdrop-blur:var(--blur-video-card-backdrop-strong)}.\!card:focus-within,.\!card:hover{--video-card-lift-translate-y:var(--motion-video-card-hover-translate)!important;--video-card-backdrop-opacity:0.425!important;--video-card-backdrop-translate-y:var(
--motion-video-card-backdrop-translate
@@ -11,4 +11,4 @@
--player-modal-primary-inline-padding-lg,clamp(var(--space-sm),2.75vw,var(--space-lg))
)}}.revert-modal__layout{display:grid;gap:1.5rem}@media (min-width:1024px){.revert-modal__layout{grid-template-columns:minmax(var(--revert-modal-sidebar-min),var(--revert-modal-sidebar-width)) minmax(0,1fr)}}#playerModal.video-modal__primary{display:block}.video-modal__primary{display:flex;flex-direction:column;gap:1.5rem;min-width:0;min-height:0}#playerModal.video-modal__secondary{display:block}.video-modal__secondary{display:flex;flex-direction:column;gap:1rem;min-width:0;min-height:0;width:100%;align-self:stretch}.video-modal__similar{display:none}@media (min-width:1024px){#playerModal.video-modal__similar{display:block}.video-modal__similar{display:flex;flex-direction:column;gap:1.5rem;align-self:stretch;flex:1 1 auto;min-height:0}#playerModal .video-modal__similar .player-modal__module{height:100%;display:flex;flex:1 1 auto;min-height:0;flex-direction:column}#playerModal .video-modal__similar .player-modal__module-list{flex:1 1 auto;min-height:0}#playerModal .video-modal__similar .player-modal__module-scroll{height:100%;max-height:none;min-height:0}}#playerModal .player-modal__module-item{width:100%}#playerModal#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max))}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max))!important}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__media,#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__media{flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))!important}#playerModal#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}#playerModal#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}#playerModal .video-modal__similar .player-modal__module-list{gap:clamp(var(--space-2xs),.85vw,var(--space-sm))}.player-modal__similar-card{outline:2px solid transparent;outline-offset:2px}.player-modal__similar-card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.player-modal__similar-card{display:block}.player-modal__similar-card{position:relative;display:flex;width:100%;min-width:0;align-items:flex-start;gap:.75rem;border-radius:var(--radius-xl);padding:.5rem;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.player-modal__similar-card:focus-within,.player-modal__similar-card:hover{background-color:var(--surface-panel-hover)}.player-modal__similar-card-media{position:relative;display:block;flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg);background-color:var(--surface-alt);width:var(--similar-card-media-width);aspect-ratio:16/9;background-image:var(--similar-card-thumb-url,none);background-position:50%;background-size:cover}@media (max-width:640px){.player-modal__similar-card-media{width:var(--similar-card-media-width-sm)}}.player-modal__similar-card-media img{display:block;width:100%;height:100%;-o-object-fit:cover;object-fit:cover;border-radius:inherit}#playerModal.player-modal__similar-card-content{display:block}.player-modal__similar-card-content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:.25rem}.player-modal__similar-card-title{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;line-height:1.375;color:var(--text-primary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);min-width:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.player-modal__similar-card-title:focus-visible,.player-modal__similar-card:hover .player-modal__similar-card-title{color:var(--color-accent-strong)}#playerModal.player-modal__similar-card-author{display:block}.player-modal__similar-card-author{display:flex;min-width:0;align-items:center}#playerModal.player-modal__similar-card-author-meta{display:block}.player-modal__similar-card-author-meta{display:flex;min-width:0;flex-direction:column}.player-modal__similar-card-author-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:500;color:var(--text-muted);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.player-modal__similar-card:hover .player-modal__similar-card-author-name{color:var(--color-text-strong)}.player-modal__similar-card-author-npub{display:none}#playerModal.player-modal__similar-card-meta{display:block}.player-modal__similar-card-meta{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight);color:var(--text-muted-strong);min-width:0}.player-modal__similar-card-timestamp{white-space:nowrap}.video-modal__stage{position:relative;isolation:isolate;overflow:visible;--video-modal-ambient-bleed:clamp(var(--space-2xl),12vw,var(--space-5xl));--video-modal-ambient-scale:1.38;--video-modal-ambient-blur:clamp(var(--video-modal-ambient-blur-min),20vw,var(--video-modal-ambient-blur-max));--video-modal-ambient-opacity:1}.video-modal__video{position:relative;z-index:1;border-radius:var(--radius-xl);padding-block:clamp(var(--space-xs),2.5vw,var(--space-md-plus));background-color:transparent;box-shadow:0 0 0 var(--border-width-hairline) color-mix(in srgb,var(--color-border-strong) 8%,transparent) inset;overflow:visible}.video-modal__ambient{position:absolute;inset:calc(var(--video-modal-ambient-bleed)*-1);border-radius:calc(var(--radius-3xl) + var(--video-modal-ambient-bleed));pointer-events:none;z-index:0;display:block;overflow:visible}.video-modal__ambient:before{content:"";position:absolute;inset:0;border-radius:inherit;background:radial-gradient(circle at 50% 50%,color-mix(in srgb,var(--color-overlay-strong) 18%,transparent) 0,color-mix(in srgb,var(--color-overlay) 34%,transparent) 62%,transparent 100%);opacity:.9;mix-blend-mode:screen;pointer-events:none}.video-modal__ambient-canvas{position:relative;width:100%;height:100%;display:block;transform:scale(var(--video-modal-ambient-scale));filter:blur(var(--video-modal-ambient-blur)) saturate(2) brightness(1.24);opacity:var(--video-modal-ambient-opacity)}@media (min-width:1024px){.video-modal__video{position:sticky;top:calc(var(--space-2xl) + var(--space-3xl));z-index:1}.video-modal__status{flex-basis:clamp(var(--space-xl),25%,var(--space-3xl));max-width:clamp(var(--space-xl),25%,var(--space-3xl))}.video-modal__details{position:relative;z-index:2;margin-top:var(--space-lg)}}#playerModal .video-modal__video video{position:relative;z-index:1;background-color:var(--color-black);border-radius:var(--radius-lg);box-shadow:var(--shadow-video-modal);max-height:min(80vh,56.25vw);-o-object-fit:contain;object-fit:contain}.video-modal__media{display:block;aspect-ratio:16/9;width:100%;-o-object-fit:contain;object-fit:contain}#playerModal.video-modal__details{display:block}.video-modal__details{display:flex;flex-direction:column;gap:1.5rem}.video-modal__meta{border-bottom-width:1px;border-color:var(--border-default);--tw-border-opacity:0.2;padding-bottom:1rem}#playerModal.video-modal__tags{display:block}.video-modal__tags{margin-left:-.25rem;margin-right:-.25rem;display:flex;gap:.5rem;padding-left:.25rem;padding-right:.25rem}.video-modal__similar .video-modal__tags{margin-bottom:clamp(var(--space-xs),.9vw,var(--space-md))}.video-modal__tags[hidden]{display:none}.video-modal__tags[data-fade]{position:relative}.video-modal__tags[data-fade]:after,.video-modal__tags[data-fade]:before{content:"";position:sticky;top:0;bottom:0;width:var(--space-lg);pointer-events:none;z-index:1}.video-modal__tags[data-fade]:before{left:0;background:linear-gradient(to right,var(--surface-overlay-muted),transparent)}.video-modal__tags[data-fade]:after{right:0;background:linear-gradient(to left,var(--surface-overlay-muted),transparent)}.video-tag-strip{display:flex;flex-wrap:nowrap;align-items:center;gap:var(--space-xs);overflow:hidden}.video-tag-pill{display:inline-flex;align-items:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);padding:.25rem .75rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight);font-weight:500;color:var(--status-neutral-on);position:relative;justify-content:center;white-space:nowrap;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-duration:.15s;min-height:calc(var(--space-sm) + var(--space-xs));margin-inline-end:.25rem}.video-tag-pill__label{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);opacity:1}#playerModal.video-tag-pill__icon{display:block}.video-tag-pill__icon{position:absolute;inset:0;display: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-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);opacity:0;transform:scale(.8)}.video-tag-pill__icon svg{height:.75rem;width:.75rem}.video-tag-pill:focus-visible .video-tag-pill__label,.video-tag-pill:hover .video-tag-pill__label{opacity:0}.video-tag-pill:focus-visible .video-tag-pill__icon,.video-tag-pill:hover .video-tag-pill__icon{opacity:1;transform:scale(1)}#playerModal.video-modal__actions-row{display:block}.video-modal__actions-row{display:flex;width:100%;flex-wrap:wrap;align-items:flex-start;-moz-column-gap:.75rem;column-gap:.75rem;row-gap:.75rem}@media (min-width:640px){.video-modal__actions-row{-moz-column-gap:1rem;column-gap:1rem}}.video-modal__actions-group,.video-modal__reactions{flex:1 1 var(--menu-min-width);min-inline-size:0}#playerModal.video-modal__reactions{display:block}.video-modal__reactions{display:flex;flex-basis:100%;flex-wrap:wrap;align-items:flex-start;gap:.75rem}@media (min-width:640px){.video-modal__reactions{gap:1rem}}@media (min-width:768px){.video-modal__reactions{flex-basis:auto}}.video-modal__reaction-buttons{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.5rem}.video-modal__reaction-button{--video-modal-reaction-active-bg:color-mix(in srgb,var(--color-accent) 22%,var(--surface-overlay-panel));--video-modal-reaction-active-border:color-mix(in srgb,var(--color-accent) 38%,var(--border-overlay))}.video-modal__reaction-button[aria-pressed=true]{color:var(--color-accent-strong);background-color:var(--video-modal-reaction-active-bg);border-color:var(--video-modal-reaction-active-border)}.video-modal__reaction-button[aria-pressed=true] .video-modal__reaction-count{color:var(--color-accent-strong)}.video-modal__reaction-count{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--text-muted)}.video-modal__reaction-meter{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap;flex:1 1 var(--menu-min-width);max-inline-size:100%}.video-modal__reaction-meter-label{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-muted);min-inline-size:var(--video-modal-reaction-label-min-inline)}.video-modal__reaction-meter-track{position:relative;flex:1 1 auto;inline-size:100%;block-size:var(--space-xs);border-radius:var(--radius-full);background-color:var(--color-border-muted);overflow:hidden}.video-modal__reaction-meter-fill{position:absolute;inset-inline-start:0;inset-block-start:0;block-size:100%;max-inline-size:100%;inline-size:var(--video-modal-reaction-fill,0);width:var(--video-modal-reaction-fill,0);background-image:linear-gradient(90deg,var(--color-accent) 0,var(--color-accent-strong) 100%);transition:inline-size var(--motion-duration-base) var(--motion-ease-out)}.video-modal__reaction-meter-fill--empty{inline-size:0;width:0}#playerModal.video-modal__actions-group{display:block}.video-modal__actions-group{display:flex;flex-basis:100%;flex-wrap:wrap;align-items:flex-start;justify-content:flex-start;gap:.75rem}@media (min-width:768px){.video-modal__actions-group{flex-basis:auto;justify-content:flex-end;margin-inline-start:auto}}.video-modal__action-button{display:inline-flex;height:2.75rem;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);min-width:var(--video-modal-action-min-width);padding-inline:var(--space-md);border-width:var(--border-width-hairline);border-style:solid}.bv-modal.video-modal__action-label,.profile-pane.video-modal__action-label,.video-modal__action-label{display:none}@media (min-width:640px){.video-modal__action-label{display:inline}}.video-modal__action-icon{height:1.25rem;width:1.25rem}.video-modal__channel,.video-modal__description,.video-modal__stats{border-radius:1rem;border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.2;background-color:var(--surface-base);padding:1rem 1.25rem;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.video-modal__description-body{overflow-wrap:anywhere;word-break:break-word}.video-modal__description-body a{color:var(--color-accent-strong);text-decoration:underline;text-decoration-color:currentColor;word-break:break-word}.video-modal__description-body a:focus-visible,.video-modal__description-body a:hover{color:var(--color-accent-pressed)}.video-modal__comments{border-radius:1rem;border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.2;background-color:var(--surface-base);padding:1.25rem;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.comment-thread,.video-modal__comments{display:flex;flex-direction:column;gap:var(--space-lg)}.comment-thread__header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-sm)}.comment-thread__title{font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;color:var(--text-primary)}.comment-thread__count,.comment-thread__empty{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted);margin:0}.comment-thread__empty{padding:var(--space-md);border-radius:var(--radius-lg);border:var(--border-width-hairline) dashed color-mix(in srgb,var(--border-default) 40%,transparent);background-color:var(--surface-alt)}.comment-thread__list{display:flex;flex-direction:column;gap:var(--space-md);margin:0;padding:0;list-style:none}.comment-thread__item{display:grid;grid-template-columns:auto 1fr;gap:var(--space-md);padding-block:var(--space-sm);border-bottom:var(--border-width-hairline) solid var(--border-subtle)}.comment-thread__item:last-child{border-bottom:none;padding-bottom:0}.comment-thread__avatar{inline-size:var(--comment-avatar-size);block-size:var(--comment-avatar-size)}.comment-thread__avatar img{border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover;inline-size:100%;block-size:100%}.comment-thread__content{display:flex;flex-direction:column;gap:var(--space-xs);min-inline-size:0}.comment-thread__meta{font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-xs)}.comment-thread__author{font-weight:600;color:var(--text-primary)}.comment-thread__timestamp{color:var(--text-muted)}.comment-thread__body{color:var(--text-primary);line-height:1.6;word-break:break-word}.comment-thread__actions{font-size:var(--font-size-xs);line-height:var(--line-height-tight);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.comment-thread__actions button{outline:2px solid transparent;outline-offset:2px}.comment-thread__actions button:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.comment-thread__actions button{display:inline-flex;align-items:center;gap:.25rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--border-subtle);background-color:var(--surface-base);padding:.25rem .75rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.comment-thread__actions button:focus-visible,.comment-thread__actions button:hover{color:var(--text-primary);border-color:var(--border-default)}.comment-thread__replies{display:flex;flex-direction:column;gap:var(--space-md);margin:0;margin-inline-start:calc(var(--space-lg) + var(--space-sm));padding-inline-start:var(--space-md);padding-block-start:var(--space-md);border-inline-start:var(--border-width-hairline) solid var(--border-subtle);list-style:none}.comment-thread__load-more{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--border-subtle);background-color:var(--surface-base);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--text-primary);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.comment-thread__load-more:focus-visible,.comment-thread__load-more:hover{border-color:var(--border-default);color:var(--text-primary);background-color:color-mix(in srgb,var(--surface-alt) 70%,transparent)}.comment-thread__disabled{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted);border-radius:var(--radius-lg);border:var(--border-width-hairline) dashed color-mix(in srgb,var(--border-default) 32%,transparent);background-color:var(--surface-alt);padding:var(--space-md)}.comment-composer{display:flex;flex-direction:column;gap:var(--space-md);border-top:var(--border-width-hairline) solid var(--border-subtle);padding-top:var(--space-lg)}.comment-composer__field{display:flex;flex-direction:column;gap:var(--space-2xs)}.comment-composer__label{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--text-primary)}.comment-composer__textarea{min-block-size:var(--comment-composer-min-height)}.comment-composer__footer{display:flex;flex-direction:column;gap:var(--space-sm)}.comment-composer__hint{font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted);margin:0}.comment-composer__actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:var(--space-sm)}.comment-composer__char-count{font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:500;color:var(--text-muted)}.comment-composer__submit{outline:2px solid transparent;outline-offset:2px}.comment-composer__submit:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.comment-composer__status{margin:0}@media (min-width:640px){.comment-composer__footer{flex-direction:row;align-items:center;justify-content:space-between}}.video-modal__progress{height:.5rem;width:100%;overflow:hidden;border-radius:var(--radius-full);background-color:var(--border-subtle)}#playerModal.video-modal__stat-metrics{display:block}.video-modal__stat-metrics{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.75rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}.profile-modal{display:flex;flex-direction:column;inline-size:100%;block-size:100%;min-block-size:100%;max-block-size:none;overflow:hidden;--profile-modal-scale:0.9;--profile-modal-gap:calc((var(--space-md) - var(--space-3xs))*var(--profile-modal-scale));--profile-modal-padding-inline:calc((var(--space-lg) - var(--space-md))*var(--profile-modal-scale));--profile-modal-padding-block-start:calc((var(--space-md) - var(--space-2xs))*var(--profile-modal-scale));--profile-modal-padding-block-end:calc((var(--space-lg) - var(--space-sm))*var(--profile-modal-scale));--profile-modal-nav-gap:calc(var(--space-xs)*var(--profile-modal-scale))}.profile-modal__content{display:flex;flex:1 1 auto;flex-direction:column;block-size:100%;min-block-size:0;transform:scale(var(--profile-modal-scale));transform-origin:top center}.profile-modal__active-profile{outline:2px solid transparent;outline-offset:2px}.profile-modal__active-profile:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.profile-modal__active-profile{display:block}.profile-modal__active-profile{display:flex;flex-wrap:wrap;align-items:center;gap:1rem;padding:1rem}.profile-modal__active-details{display:flex;flex:1 1 var(--profile-modal-active-min-width);flex-direction:column;gap:var(--space-2xs);min-inline-size:0}.profile-modal__active-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-xs)}.profile-hashtag-list{display:flex;flex-wrap:wrap;gap:var(--space-xs);margin:0;padding:0;list-style:none}.profile-hashtag-item{display:inline-flex;align-items:center;gap:var(--space-3xs);padding-block:var(--space-3xs);padding-inline:var(--space-sm);border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--color-border-translucent);background-color:var(--color-panel);color:var(--color-text);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);line-height:var(--font-lineheight-tight)}.profile-hashtag-remove{display:inline-flex;align-items:center;justify-content:center;inline-size:var(--space-md);block-size:var(--space-md);border-radius:var(--radius-full);color:var(--color-text-muted);background:transparent;border:none;padding:0;cursor:pointer}.profile-hashtag-remove:hover{color:var(--color-text)}.profile-modal__remove-button{border-width:2px}.profile-modal__remove-button:focus-visible{--tw-ring-color:var(--color-critical-strong)}.profile-modal__add-profile{--tw-ring-color:var(--color-ring-alert);outline:2px solid transparent;outline-offset:2px}.profile-modal__add-profile:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.profile-modal__add-profile{display:block}.profile-modal__add-profile{position:relative;display:flex;width:100%;align-items:center;justify-content:flex-start;gap:1rem;border-radius:var(--radius-xl);padding:1rem 1.25rem;text-align:left;color:var(--text-primary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);border:var(--outline-thick-width) solid var(--color-ring-alert);background-color:var(--surface-panel-hover)}.profile-modal__add-profile:hover{background-color:color-mix(in srgb,var(--surface-panel-hover) 88%,var(--color-ring-alert) 12%)}.profile-modal__add-profile:focus-visible{background-color:color-mix(in srgb,var(--surface-panel-hover) 80%,var(--color-ring-alert) 20%)}#playerModal.profile-modal__add-profile-icon{display:block}.profile-modal__add-profile-icon{display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:var(--radius-full);background-color:color-mix(in srgb,var(--color-ring-alert) 18%,var(--surface-panel));color:var(--color-ring-alert)}.profile-modal__body{overflow:hidden;overflow-x:hidden;padding-block-start:var(--profile-modal-padding-block-start);padding-block-end:var(--profile-modal-padding-block-end);padding-inline:var(--profile-modal-padding-inline)}.profile-modal__body,.profile-modal__layout{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--profile-modal-gap);inline-size:100%;min-block-size:0}.profile-modal__header{align-items:center}.profile-modal__header-title{display:flex;align-items:center;gap:var(--space-sm)}.profile-modal__menu{display:flex;flex-direction:column;gap:var(--space-sm)}.profile-modal__pane-wrapper{display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.profile-modal__nav{display:flex;flex-wrap:wrap;gap:var(--profile-modal-nav-gap);align-self:flex-start;overflow-x:hidden}.profile-modal__panes{flex:1 1 auto;block-size:100%;min-block-size:0;overflow-y:auto;padding-inline-end:var(--profile-modal-scrollbar-offset);scrollbar-gutter:stable}.profile-modal__panes,.profile-pane{display:flex;flex-direction:column;overflow-x:hidden}.profile-pane{min-block-size:auto}.profile-pane.hidden{display:none!important}@supports not (scrollbar-gutter:stable){.profile-modal__panes{padding-inline-end:calc(var(--profile-modal-scrollbar-offset) + var(--space-2xs))}}@media (max-width:calc(1024px - var(--breakpoint-edge-offset ))){.profile-modal__layout[data-mobile-view=menu] .profile-modal__pane-wrapper,.profile-modal__layout[data-mobile-view=pane] .profile-modal__menu{display:none}}@media (min-width:1024px){.profile-modal{max-block-size:var(--modal-shell-max-height)}.profile-modal__body{padding-inline:calc(var(--profile-modal-padding-inline) + var(--space-xs))}.profile-modal__body,.profile-modal__layout{gap:calc(var(--profile-modal-gap) + var(--space-2xs))}.profile-modal__layout{display:grid;align-items:stretch;block-size:100%;grid-template-columns:minmax(var(--profile-modal-nav-min-width),var(--profile-modal-nav-max-width)) minmax(0,1fr);grid-auto-rows:minmax(0,1fr)}.profile-modal__nav{flex-direction:column;flex-wrap:nowrap;gap:var(--profile-modal-nav-gap);justify-self:start;inline-size:var(--profile-modal-nav-max-width);min-inline-size:var(--profile-modal-nav-min-width)}.profile-modal__pane-wrapper{block-size:100%}}.beacon-hidden-download,.torrent-download-anchor,[data-beacon-hidden-download]{display:none!important}.beacon-clipboard-offscreen,.torrent-clipboard-textarea,[data-beacon-clipboard-state=offscreen],[data-beacon-clipboard=offscreen]{position:fixed;top:0;left:var(--offscreen-offset);opacity:0;width:0;height:0;pointer-events:none}.beacon-toast-motion,.torrent-toast-motion{transition-property:opacity,transform;will-change:opacity,transform;opacity:0;transform:translateY(var(--toast-translate))}.beacon-toast-motion[data-beacon-motion=enter],.beacon-toast-motion[data-beacon-motion=show],.torrent-toast-motion[data-beacon-motion=enter],.torrent-toast-motion[data-beacon-motion=show]{opacity:1;transform:translateY(0)}.beacon-toast-motion[data-beacon-motion=exit],.torrent-toast-motion[data-beacon-motion=exit]{opacity:0;transform:translateY(var(--toast-translate))}.torrent-toast{pointer-events:auto;width:100%;max-width:28rem;border-radius:var(--radius-lg);padding:.75rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;letter-spacing:-.025em;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-inset:inset}.torrent-toast--info{border-width:1px;border-color:var(--border-overlay);background-color:var(--surface-base);color:var(--text-primary)}.torrent-toast--success{border-width:1px;border-color:var(--color-info);--tw-border-opacity:0.6;background-color:var(--color-info);color:var(--color-white)}.torrent-toast--error{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.6;background-color:var(--color-critical);color:var(--color-white)}.torrent-toast--warn{border-width:1px;border-color:var(--status-warning-strong);--tw-border-opacity:0.7;background-color:var(--status-warning-strong);color:var(--status-warning-strong)}.watch-history-card{--video-card-lift-translate-y:0;--video-card-backdrop-opacity:0;--video-card-backdrop-translate-y:var(--space-md-plus);--video-card-backdrop-scale:1.08;--video-card-backdrop-blur:var(--blur-thumbnail-blur);outline:2px solid transparent;outline-offset:2px}.watch-history-card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.watch-history-card{position:relative;border-radius:var(--radius-lg);border-width:1px;border-color:transparent;background-color:var(--surface-raised);color:var(--text-primary);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transform:translate3d(0,var(--video-card-lift-translate-y),0);transition-property:transform,box-shadow,border-color,background-color,color;will-change:transform;isolation:isolate}.watch-history-card:before{content:"";position:absolute;inset:0;z-index:0;opacity:var(--video-card-backdrop-opacity);background-image:var(--video-card-thumb-url,none);background-position:50%;background-repeat:no-repeat;background-size:cover;transform:translate3d(0,var(--video-card-backdrop-translate-y),0) scale(var(--video-card-backdrop-scale));filter:blur(var(--video-card-backdrop-blur));transition:opacity var(--motion-duration-base) var(--motion-ease-in-out),transform var(--motion-duration-base) var(--motion-ease-in-out),filter var(--motion-duration-base) var(--motion-ease-in-out);pointer-events:none;will-change:opacity,transform,filter}.watch-history-card>*{position:relative;z-index:1}.watch-history-card:focus-within,.watch-history-card:hover{--video-card-lift-translate-y:var(--motion-video-card-hover-translate);--video-card-backdrop-opacity:0.425;--video-card-backdrop-translate-y:var(
--motion-video-card-backdrop-translate
- );--video-card-backdrop-scale:1.12;--video-card-backdrop-blur:var(--blur-video-card-backdrop-strong);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card:focus-visible{border-color:var(--color-accent);--tw-border-opacity:0.4;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=critical]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}.watch-history-card[data-state=private]{background-color:var(--surface-raised-private);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.watch-history-card[data-state=disabled],.watch-history-card[data-state=private]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=disabled]{opacity:.6;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.watch-history-card[data-alert=nsfw-owner]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--color-black)}.watch-history-card[data-alert=nsfw-owner]:hover{--tw-border-opacity:0.6;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card img[data-thumbnail-state=blurred],.watch-history-card img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}.watch-history-card[data-owner-is-viewer=true][data-url-health-state=offline][data-stream-health-state=unhealthy]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max));flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}.watch-history-card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}#playerModal.watch-history-card{display:block}.watch-history-card{display:flex;flex-wrap:wrap;align-items:stretch;gap:1.25rem;padding:1rem;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}@media (prefers-reduced-motion:reduce){.watch-history-card,.watch-history-card[data-motion=enter]{transition-property:none}.watch-history-card[data-motion=enter]{opacity:1;animation:none}}.watch-history-card:hover{--tw-translate-y:-0.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.watch-history-card{gap:1.5rem;padding:1.25rem}}.watch-history-card--private{border-color:var(--color-info);--tw-border-opacity:0.6}#playerModal.watch-history-card__primary{display:block}.watch-history-card__primary{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;align-items:stretch;gap:1rem}@media (min-width:640px){.watch-history-card__primary{flex-direction:row}}.watch-history-card__thumbnail{display:block;width:14rem;max-width:100%;flex:none;color:var(--text-primary);text-decoration-line:none}.watch-history-card__thumbnailInner{aspect-ratio:16/9;width:100%;overflow:hidden;border-radius:var(--radius-lg);background-color:var(--surface-base)}.watch-history-card__thumbnailInner img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.watch-history-card [data-thumbnail-state=blurred] img,.watch-history-card [data-visual-state=blurred] img{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal.watch-history-card__details{display:block}.watch-history-card__details{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;justify-content:center;gap:var(--space-sm)}.watch-history-card__title{cursor:pointer;font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;line-height:1.375;color:var(--text-primary);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.watch-history-card__title:focus,.watch-history-card__title:hover{color:var(--color-accent)}.watch-history-card__created{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}#playerModal.watch-history-card__meta{display:block}.watch-history-card__meta{display:flex;min-width:0;flex-direction:column;justify-content:space-between;gap:1rem}@media (min-width:640px){.watch-history-card__meta{min-width:14rem;flex:none;flex-basis:16rem}}.watch-history-card__watched{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--border-subtle)}#playerModal.watch-history-card__creator{display:block}.watch-history-card__creator{display:flex;align-items:center;gap:.75rem}#playerModal.watch-history-card__creatorAvatar{display:block}.watch-history-card__creatorAvatar{display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;overflow:hidden;border-radius:var(--radius-full);background-color:var(--surface-panel);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorAvatar:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible,.watch-history-card__creatorAvatar:hover{--tw-ring-color:color-mix(in srgb,var(--color-accent) 38%,transparent)}.watch-history-card__creatorAvatar img{height:100%;width:100%;border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover}.watch-history-card__creatorName{cursor:pointer;background-color:transparent;padding:0;text-align:left;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorName:hover{color:var(--color-accent)}.watch-history-card__creatorName:focus-visible{color:var(--color-accent)}#playerModal.watch-history-card__actions{display:block}.watch-history-card__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem}.watch-history-card__action{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--surface-panel);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__action:hover{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action:focus-visible{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action--primary{background-color:var(--color-accent-strong);color:var(--color-white)}.watch-history-card__action--primary:hover{background-color:var(--color-accent-pressed)}.watch-history-card__action--primary:focus-visible{background-color:var(--color-accent-pressed)}.watch-history-card__action--danger{background-color:var(--color-critical);color:var(--color-white)}.watch-history-card__action--danger:hover{background-color:var(--color-critical-strong)}.watch-history-card__action--danger:focus-visible{background-color:var(--color-critical-strong)}#playerModal.watch-history-card__moderation{display:block}.watch-history-card__moderation{margin-top:var(--space-sm);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.watch-history-card__hidden{margin-top:var(--space-md);border-radius:var(--radius-lg);border-width:1px;border-style:dashed;border-color:var(--border-default);background-color:var(--surface-overlay-panel-soft);font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary)}.watch-history-card__hidden .moderation-badge{align-self:flex-start}#playerModal .channel-card__avatar img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal .video-modal__moderation-bar .moderation-badge{--text-status-neutral-on:var(--color-text);--text-status-warning-on:var(--color-warning-on)}#playerModal .video-modal__moderation-bar .moderation-badge[data-variant=neutral]{color:var(--color-text)}.\!container{max-width:var(--layout-docs-max-width)!important;margin:0 auto!important;padding:var(--space-md)!important}.container{max-width:var(--layout-docs-max-width);margin:0 auto;padding:var(--space-md)}.qr-code__table{margin:var(--qr-code-table-margin,0)}.qr-code__cell,.qr-code__table{border:0;border-collapse:collapse}.qr-code__cell{padding:0;margin:0;width:var(--qr-code-cell-width);height:var(--qr-code-cell-height);background-color:var(--qr-code-color-light)}.qr-code__cell--dark{background-color:var(--qr-code-color-dark)}.qr-code__container[data-qr-code-mode=image] .qr-code__canvas{display:none}.qr-code__container[data-qr-code-mode=canvas] .qr-code__canvas,.qr-code__container[data-qr-code-mode=image] .qr-code__image{display:block}.qr-code__container[data-qr-code-mode=canvas] .qr-code__image{display:none}.fade-in{opacity:0;animation:interface-fade-in .28s ease-out forwards;animation-delay:var(--fade-in-delay,0ms)}.fade-in-delay-100{--fade-in-delay:100ms}.fade-in-delay-200{--fade-in-delay:200ms}.fade-in-delay-300{--fade-in-delay:300ms}.\!card[data-motion=enter]{opacity:0!important;animation:card-motion-enter .22s ease-out forwards!important}.card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg);flex:0 0 var(--icon-size-lg);line-height:0;background-color:var(--color-neutral-700);color:var(--color-white);border:none;border-radius:var(--radius-full);cursor:pointer;transition:background-color .2s ease,box-shadow .2s ease}.icon-button:hover{background-color:var(--color-neutral-600)}.icon-button:active,.icon-button:focus{outline:none;box-shadow:0 0 0 var(--icon-button-ring-width) var(--color-ring-alert)}.icon-image{width:var(--icon-size-md);height:var(--icon-size-md);pointer-events:none}.accent-action-button,.channel-action-button{--accent-action-bg:color-mix(in srgb,var(--surface-overlay-panel) 78%,transparent);--accent-action-border:color-mix(in srgb,var(--border-overlay) 92%,transparent);--accent-action-bg-hover:color-mix(in srgb,var(--color-accent) 22%,var(--surface-overlay-panel));--accent-action-ring:color-mix(in srgb,var(--color-accent) 48%,transparent);--accent-action-bg-active:color-mix(in srgb,var(--color-accent-pressed) 28%,var(--surface-overlay-panel));color:var(--color-text);background-color:var(--accent-action-bg);border-color:var(--accent-action-border);border-style:solid;border-width:var(--border-width-hairline)}.accent-action-button:focus-visible,.accent-action-button:hover,.channel-action-button:focus-visible,.channel-action-button:hover{color:var(--color-accent-strong);background-color:var(--accent-action-bg-hover)}.accent-action-button:focus,.accent-action-button:focus-visible,.channel-action-button:focus,.channel-action-button:focus-visible{box-shadow:0 0 0 var(--icon-button-ring-width) var(--accent-action-ring)}.accent-action-button:active,.channel-action-button:active{color:var(--color-accent-pressed);background-color:var(--accent-action-bg-active)}.modal-nav .icon-button{box-shadow:none;padding:0;gap:0;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg)}.modal-nav .icon-button:not(.accent-action-button):not(.channel-action-button){border:none}.modal-meta{gap:var(--space-xs)}.modal-meta,.modal-view-count{display:inline-flex;align-items:center}.modal-view-count{gap:var(--space-2xs);font-size:var(--font-size-sm);line-height:var(--space-md-plus);color:var(--color-muted-alt);white-space:nowrap}.view-count-text{white-space:nowrap;color:var(--color-muted-strong)}.ratio-16-9{position:relative;width:100%;padding-top:56.25%;background-color:var(--color-card)}.ratio-16-9>img{position:absolute;inset:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}#modalContainer{position:fixed;inset:0;z-index:var(--z-modal-root);pointer-events:none;isolation:isolate}#modalContainer>*{pointer-events:auto}#modalContainer>[id$=Modal]:not(#playerModal){z-index:var(--z-modal-root)}#modalContainer>[id$=Modal]:not(#playerModal)>.bv-modal-backdrop{z-index:var(--z-modal-overlay)}#modalContainer>[id$=Modal]:not(#playerModal) .bv-modal__panel{z-index:var(--z-modal-content)}#modalContainer>#profileModal,#profileModal[data-modal-stack=top]{z-index:var(--z-modal-top-root)}#modalContainer>#profileModal>.bv-modal-backdrop,#profileModal[data-modal-stack=top]>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#profileModal .bv-modal__panel,#profileModal[data-modal-stack=top] .bv-modal__panel{z-index:var(--z-modal-top-content)}#modalContainer>#eventDetailsModal{z-index:var(--z-modal-top-root)}#modalContainer>#eventDetailsModal>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#eventDetailsModal .bv-modal__panel{z-index:var(--z-modal-top-content)}.bv-modal[data-nested-modal-active=true]{pointer-events:none;visibility:hidden}#modalContainer>#loginModal{z-index:var(--z-modal-peak-root)}#modalContainer>#loginModal>.bv-modal-backdrop{z-index:var(--z-modal-peak-overlay)}#modalContainer>#loginModal .bv-modal__panel{z-index:var(--z-modal-peak-content)}#modalContainer>#playerModal{z-index:var(--z-modal-player)}#modalContainer>#playerModal .player-modal__container,#modalContainer>#playerModal .player-modal__content{z-index:var(--z-modal-content)}#playerModal{position:fixed;inset:0;z-index:var(--z-modal-player);display:none;flex-direction:column;align-items:stretch;justify-content:flex-start;width:100vw;height:100vh;padding:0;background-color:var(--color-surface);color:var(--color-subtle-text);--player-modal-inline-max:var(--layout-player-max-width);--player-modal-inline-padding:clamp(var(--space-md-plus),4vw,var(--space-2xl));overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}#playerModal.flex{display:block}#modalVideo{width:100%;aspect-ratio:16/9;background-color:var(--color-black)}.notification-portal{position:fixed;top:0;left:0;right:0;z-index:var(--z-overlay-toast);display:flex;flex-direction:column;align-items:center;gap:var(--space-md);padding:calc(var(--space-xl) + env(safe-area-inset-top)) var(--space-lg) var(--space-lg);pointer-events:none;opacity:0;transform:translateY(var(--toast-translate));transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}@media (min-width:640px){.notification-portal{padding-inline:var(--space-xl)}}.notification-portal:has(.notification-banner:not(.hidden)){opacity:1;transform:translateY(0)}.notification-portal--active{opacity:1;transform:translateY(0)}.notification-banner,.torrent-toast{--notify-accent:var(--color-accent-strong);--notify-accent-strong:var(--color-accent);--notify-border:var(--surface-overlay-panel-tint);--notify-background:var(--surface-overlay-panel);--notify-foreground:var(--color-text);position:relative;display:flex;align-items:center;gap:var(--space-md);width:min(var(--notification-banner-max-inline),100%);padding:var(--space-md) var(--space-xl);border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--notify-border);background:var(--notify-background);color:var(--notify-foreground);box-shadow:0 var(--shadow-notification-offset-y) var(--shadow-notification-blur) var(--color-shadow-notification);backdrop-filter:blur(var(--overlay-backdrop-blur));pointer-events:auto;isolation:isolate;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;line-height:1.375;transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}.notification-banner:before,.torrent-toast:before{content:"";position:absolute;inset:0;border-radius:inherit;background:linear-gradient(135deg,var(--notify-accent) 0,var(--notify-accent-strong) 100%);opacity:.18;pointer-events:none}.notification-banner>*,.torrent-toast>*{position:relative;z-index:1}.notification-dismiss{display:inline-flex;height:2rem;width:2rem;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);color:inherit;opacity:.75;background-color:var(--notify-dismiss-background)}.notification-dismiss:focus-visible,.notification-dismiss:hover{opacity:1;background-color:var(--notify-dismiss-background-hover)}.notification-dismiss svg{height:1rem;width:1rem}.notification-banner:not(.hidden){animation:notification-slide-in var(--motion-duration-base) var(--motion-ease-out)}.notification-banner--critical,.torrent-toast--error{--notify-accent:var(--color-critical-strong);--notify-accent-strong:var(--color-critical);--notify-border:var(--color-ring-critical-soft);--notify-background:var(--color-card-critical);--notify-foreground:var(--color-critical-strong)}.notification-banner--success,.torrent-toast--success{--notify-accent:var(--status-success-strong);--notify-accent-strong:var(--status-success);--notify-border:var(--status-success-border);--notify-background:var(--status-success-surface);--notify-foreground:var(--status-success-on)}.notification-banner--info,.torrent-toast--info{--notify-accent:var(--color-info-strong);--notify-accent-strong:var(--color-info);--notify-border:var(--color-info-border);--notify-background:var(--status-info-surface)}.notification-banner--warning,.torrent-toast--warn{--notify-accent:var(--color-warning-strong);--notify-accent-strong:var(--color-warning);--notify-border:var(--status-warning-border);--notify-background:var(--status-warning-surface);--notify-foreground:var(--status-warning-on)}.status-banner .status-spinner{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-info-border);border-radius:var(--radius-full);border-top-color:var(--color-info);flex-shrink:0;height:var(--icon-size-md);width:var(--icon-size-md)}.status-banner .status-message{flex:1 1 auto}@keyframes notification-slide-in{0%{opacity:0;transform:translateY(var(--toast-translate))}to{opacity:1;transform:translateY(0)}}.status-spinner--inline{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-border-info-soft);border-radius:var(--radius-full);border-top-color:var(--color-info);display:inline-block;height:var(--space-md);width:var(--space-md)}body.iframe-form{background-color:transparent;color:var(--color-text);font-family:var(--font-family-sans);margin:var(--space-lg)}body.iframe-form .container{width:100%;max-width:100%;margin:0;padding:0}body.iframe-form .\!container{width:100%!important;max-width:100%!important;margin:0!important;padding:0!important}body.iframe-form .form-container{background-color:var(--color-surface-alt);border-radius:var(--radius-md);box-shadow:var(--shadow-md);color:var(--color-text);display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-lg)}body.iframe-form .form-container>p{margin:0}body.iframe-form form{display:flex;flex-direction:column}body.iframe-form form>*+*{margin-top:var(--space-sm)}body.iframe-form form h1,body.iframe-form form h2{color:var(--color-text);margin-top:var(--space-md)}body.iframe-form label{color:var(--color-subtle-text);display:block;font-weight:600;margin-top:var(--space-sm)}body.iframe-form label+.form-control,body.iframe-form label+.select,body.iframe-form label+.textarea{margin-top:var(--space-xs)}body.iframe-form .checkbox-group,body.iframe-form .radio-group{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-xs)}body.iframe-form .checkbox-group label,body.iframe-form .radio-group label{align-items:center;color:var(--color-subtle-text);display:inline-flex;font-weight:500;gap:var(--space-xs);margin:0}body.iframe-form .checkbox-group input[type=checkbox],body.iframe-form .radio-group input[type=radio]{margin:0}body.iframe-form .radio-group input[type=radio]{accent-color:var(--color-accent-strong)}body.iframe-form button.btn{align-self:flex-start;margin-top:var(--space-md)}body.iframe-form button.\!btn{align-self:flex-start!important;margin-top:var(--space-md)!important}body.iframe-form #status{background:var(--color-surface);border-radius:var(--radius-sm);box-shadow:inset 0 0 0 var(--border-width-hairline) var(--color-border-translucent);color:var(--color-subtle-text);min-height:calc(var(--space-2xl) + var(--space-xl));padding:var(--space-sm);white-space:pre-wrap}body.iframe-form .status-line{color:var(--color-subtle-text);margin:var(--space-2xs) 0}body.iframe-form .status-line.error{color:var(--color-critical-strong)}body.iframe-form .status-line.\!error{color:var(--color-critical-strong)!important}body.iframe-form .status-line.success{color:var(--color-info-strong)}body.iframe-form .status-line.\!success{color:var(--color-info-strong)!important}body.iframe-form .status-line.warn{color:var(--color-warning-strong)}@media (max-width:640px){body.iframe-form{margin:var(--space-md)}body.iframe-form .form-container{padding:var(--space-md)}}#sidebarContainer{position:relative;overflow:visible}#sidebar{position:fixed;top:0;left:0;width:var(--sidebar-width);min-width:var(--sidebar-width);height:100vh;height:100dvh;color:var(--color-text-frosted-strong);overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;overscroll-behavior-inline:contain;touch-action:pan-y;scrollbar-gutter:stable both-edges;background:transparent;border-right:none;backdrop-filter:none;-webkit-backdrop-filter:none;transition:width .2s ease,transform .3s ease;z-index:var(--z-sidebar);box-shadow:none;isolation:isolate}#app.sidebar-collapsed,#sidebar.sidebar-collapsed,#sidebar[data-state=collapsed],body.sidebar-collapsed{--sidebar-width:var(--sidebar-width-collapsed)}#app.sidebar-expanded,#sidebar.sidebar-expanded,#sidebar[data-state=expanded],body.sidebar-expanded{--sidebar-width:var(--sidebar-width-expanded)}#sidebar .sidebar__inner{padding-block-start:max(var(--space-sidebar-shell-block-start),calc(var(--app-header-centerline) - var(--sidebar-control-size)/2));padding-block-end:var(--space-sidebar-shell-block-end);padding-inline:var(--space-sidebar-shell-inline);border-radius:var(--radius-sidebar-shell);border:none;background:none;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;isolation:isolate;transition:color .2s ease}#sidebar .sidebar__inner,.sidebar-scroll{display:flex;flex-direction:column;height:100%;width:100%;overflow:visible}.sidebar-scroll{gap:var(--space-sidebar-scroll-gap);min-height:0;flex:1 1 auto}.sidebar-panel{position:relative;width:100%;display:flex;flex-direction:column;gap:var(--space-sidebar-panel-gap);padding:var(--space-sidebar-panel-padding-block) var(--space-sidebar-panel-padding-inline);border-radius:var(--radius-sidebar-panel);border:none;background:transparent;box-shadow:none;color:inherit;backdrop-filter:none;-webkit-backdrop-filter:none;overflow:hidden;isolation:isolate;transition:border-color .2s ease,box-shadow .22s ease,background .22s ease}.sidebar-panel--primary{flex:1 1 auto;min-height:0;padding-block-start:0}.sidebar-panel__header{display:flex;justify-content:flex-end;margin-bottom:var(--space-md)}.sidebar-collapse-toggle{display:inline-flex;align-items:center;justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--color-border-translucent-medium);background:var(--color-surface-tint-subtle);color:inherit;cursor:pointer;transition:background .18s ease,color .18s ease,border-color .18s ease;flex-shrink:0;box-sizing:border-box}.sidebar-collapse-toggle:hover{background:var(--color-border-translucent);border-color:var(--color-border-translucent-stronger);color:var(--color-text)}.sidebar-collapse-toggle:focus-visible{outline:var(--space-3xs) solid var(--color-secondary);outline-offset:var(--space-2xs)}.sidebar-collapse-toggle__icon{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .2s ease}.sidebar-nav{display:flex;flex-direction:column;gap:var(--space-xs);opacity:1;transition:opacity .16s ease;width:100%}.sidebar-nav-link{--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-opacity:0;--sidebar-nav-link-highlight-scale:0.96;display:flex;align-items:center;gap:var(--space-sidebar-footer-gap);padding-block:var(--space-sidebar-nav-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);font-size:var(--font-size-sidebar-nav);font-weight:600;letter-spacing:.015em;color:var(--color-text);text-decoration:none;width:100%;position:relative;border:var(--border-width-hairline) solid transparent;background:none;box-shadow:none;transform:translateX(var(--sidebar-nav-translate-x));transition:color .18s ease,border-color .2s ease,box-shadow .22s ease,transform .22s ease;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none}.sidebar-nav-link:after,.sidebar-nav-link:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none;transition:opacity .22s ease,transform .24s ease;z-index:-1}.sidebar-nav-link:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:var(--sidebar-nav-link-highlight-opacity);transform:scale(var(--sidebar-nav-link-highlight-scale));filter:saturate(140%)}.sidebar-nav-link:after{background:linear-gradient(105deg,var(--color-sidebar-hover) 0,transparent 75%);opacity:.22;mix-blend-mode:screen;z-index:-2}.sidebar-nav-link:focus-visible,.sidebar-nav-link:hover{--sidebar-nav-link-highlight-opacity:1;--sidebar-nav-link-highlight-scale:1.02;--sidebar-nav-translate-x:var(--space-sidebar-nav-translate);color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible:after,.sidebar-nav-link:hover:after{opacity:.35}.sidebar-nav-link--sub{font-size:var(--font-size-sidebar-subnav);font-weight:500;color:var(--color-sidebar-text-muted);padding-block:var(--space-sidebar-subnav-padding-block);letter-spacing:.02em;--sidebar-nav-link-highlight-opacity:0.25;--sidebar-nav-link-highlight-scale:1}.sidebar-icon{width:var(--space-lg);height:var(--space-lg);min-width:var(--space-lg);min-height:var(--space-lg);flex-shrink:0;display:block;filter:var(--sidebar-icon-filter);transition:filter .18s ease}.sidebar-footer{flex-direction:column;margin-top:auto;z-index:2}.sidebar-dropup-trigger,.sidebar-footer{display:flex;gap:var(--space-sidebar-footer-gap);position:relative}.sidebar-dropup-trigger{align-items:center;justify-content:space-between;width:100%;padding-block:var(--space-sidebar-trigger-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);border:var(--border-width-hairline) solid transparent;background:none;color:var(--color-text);font-size:var(--font-size-sidebar-trigger);font-weight:600;cursor:pointer;box-sizing:border-box;flex-shrink:0;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none;box-shadow:none;transition:border-color .2s ease,color .2s ease,box-shadow .22s ease}.sidebar-dropup-trigger:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:0;transform:scale(.96);transition:opacity .2s ease,transform .22s ease;z-index:-1;filter:saturate(140%)}.sidebar-dropup-trigger:after,.sidebar-dropup-trigger:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none}.sidebar-dropup-trigger:after{background:linear-gradient(110deg,var(--color-sidebar-hover) 0,transparent 80%);opacity:.18;mix-blend-mode:screen;transition:opacity .2s ease;z-index:-2}.sidebar-dropup-trigger:focus-visible,.sidebar-dropup-trigger:hover{color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger:focus-visible:before,.sidebar-dropup-trigger:hover:before{opacity:1;transform:scale(1.02)}.sidebar-dropup-trigger:focus-visible:after,.sidebar-dropup-trigger:hover:after{opacity:.35}.sidebar-dropup-trigger:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger__glyph{width:var(--icon-size-md);height:var(--icon-size-md);opacity:.9}.sidebar-dropup-trigger__chevron{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .18s ease}.sidebar-dropup-trigger[aria-expanded=true] .sidebar-dropup-trigger__chevron,.sidebar-dropup-trigger__chevron.is-rotated{transform:rotate(180deg)}.sidebar-dropup-panel{position:absolute;left:0;right:0;bottom:calc(100% + var(--space-sidebar-popover-offset));border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--color-sidebar-border-strong);background:linear-gradient(160deg,color-mix(in srgb,var(--color-sidebar-surface) 88%,transparent) 0,color-mix(in srgb,var(--color-sidebar-surface-alt) 68%,transparent) 100%);box-shadow:inset 0 0 0 var(--border-width-fine) var(--color-sidebar-border),var(--shadow-sidebar-panel);padding:var(--space-sidebar-popover-padding-block) var(--space-sidebar-popover-padding-inline);color:var(--color-text-frosted);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(var(--space-sm));transition:opacity .18s ease,transform .18s ease,visibility .18s ease,box-shadow .22s ease;backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));-webkit-backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));z-index:5;isolation:isolate}.sidebar-dropup-panel[data-state=expanded]{opacity:1;visibility:visible;pointer-events:auto;transform:translateY(0)}.sidebar-dropup-panel__inner{display:flex;flex-direction:column;gap:var(--space-sidebar-popover-gap);width:100%;padding-inline-end:var(--space-sidebar-dropup-scroll-reserve);max-height:var(--sidebar-dropup-max-height);overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable both-edges}.sidebar-dropup-panel__inner.is-measuring{position:absolute;width:-moz-max-content;width:max-content;max-width:none;visibility:hidden;pointer-events:none;left:var(--offscreen-offset);right:auto;top:auto;bottom:auto}.sidebar-dropup-measure{position:absolute;visibility:hidden;pointer-events:none;height:0;overflow:hidden}.sidebar-dropup-panel__inner>*{width:100%;min-width:0}#sidebar[data-footer-state=expanded] .sidebar-nav{opacity:0;pointer-events:none}#sidebar[data-footer-state=collapsed] .sidebar-nav{opacity:1}.sidebar-loading-wrapper{display:flex;justify-content:center;align-items:center;padding:var(--space-2xl) 0;width:100%;grid-column:1/-1}.sidebar-loading-indicator{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--color-muted-strong);font-size:var(--font-size-sm);font-weight:500;letter-spacing:.01em}.sidebar-loading-text{white-space:nowrap}#app{box-sizing:border-box;transition:margin-left .2s ease,width .2s ease,max-width .2s ease}#app[data-sidebar-state=collapsed]{margin-left:var(--sidebar-width-collapsed);width:calc(100vw - var(--sidebar-width-collapsed));max-width:calc(100vw - var(--sidebar-width-collapsed))}#app[data-sidebar-state=expanded]{margin-left:max(var(--sidebar-width-expanded-base),var(--sidebar-dropup-content-width));width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)))}#sidebar.sidebar-collapsed .sidebar-nav-link,body.sidebar-collapsed #sidebar .sidebar-nav-link{justify-content:center;width:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full);--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-scale:1}#sidebar.sidebar-expanded .sidebar-nav-link,body.sidebar-expanded #sidebar .sidebar-nav-link{justify-content:flex-start}#sidebar.sidebar-collapsed .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-text{display:none}#sidebar.sidebar-collapsed .sidebar__inner,body.sidebar-collapsed #sidebar .sidebar__inner{padding-inline:var(--space-2xs)}#sidebar.sidebar-collapsed .sidebar-panel,body.sidebar-collapsed #sidebar .sidebar-panel{padding-inline:calc(var(--space-3xs)*3)}#sidebar.sidebar-collapsed .sidebar-panel__header,body.sidebar-collapsed #sidebar .sidebar-panel__header{justify-content:center}#sidebar.sidebar-collapsed .sidebar-collapse-toggle,body.sidebar-collapsed #sidebar .sidebar-collapse-toggle{margin-inline:auto}#sidebar .sidebar-toggle-icon--rotated{transform:rotate(180deg)}#sidebar.sidebar-collapsed .sidebar-toggle-icon--rotated,body.sidebar-collapsed #sidebar .sidebar-toggle-icon--rotated{transform:rotate(0deg)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger{justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__chevron{display:none}#sidebar.sidebar-collapsed .sidebar-dropup-trigger__glyph,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__glyph{margin:0}#sidebar.sidebar-collapsed .sidebar-nav-link:focus-visible,#sidebar.sidebar-collapsed .sidebar-nav-link:hover,body.sidebar-collapsed #sidebar .sidebar-nav-link:focus-visible,body.sidebar-collapsed #sidebar .sidebar-nav-link:hover{--sidebar-nav-translate-x:0}@media (min-width:768px){.sidebar-panel__header{display:flex}.sidebar-collapse-toggle{display:inline-flex}#sidebar{transform:translateX(0)!important;width:var(--sidebar-width);overflow:visible}#app[data-sidebar-state=collapsed]{margin-left:calc(var(--sidebar-width-collapsed) + var(--sidebar-content-gap));width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap));max-width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap))}#app[data-sidebar-state=expanded]{margin-left:max(calc(var(--sidebar-width-expanded-base) + var(--sidebar-content-gap)),calc(var(--sidebar-dropup-content-width) + var(--sidebar-content-gap)));width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)))}}@keyframes card-motion-enter{0%{opacity:0;transform:translateY(var(--motion-card-enter-translate))}to{opacity:1;transform:translateY(0)}}@keyframes video-thumbnail-fade-in{0%{opacity:0}to{opacity:1}}@keyframes interface-fade-in{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0;transform:translateY(var(--motion-fade-in-translate))}to{opacity:1;transform:translateY(0)}}.status-line{margin-top:.25rem;margin-bottom:.25rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);line-height:1.375;color:var(--text-primary)}.status-line.error{color:var(--color-critical-strong)}.status-line.\!error{color:var(--color-critical-strong)!important}.status-line.warn{color:var(--color-warning-strong)}@keyframes ztr-rotate{to{transform:rotate(1turn)}}@keyframes ztr-dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes svelte-181fgen-loader-animation{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes svelte-181fgen-fade-in{to{opacity:1}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.left-4{left:1rem}.right-3{right:.75rem}.right-4{right:1rem}.right-6{right:1.5rem}.top-0{top:0}.top-3{top:.75rem}.z-10{z-index:10}.z-50{z-index:50}.z-\[140\]{z-index:140}.z-overlay-floating{z-index:var(--z-overlay-floating)}.z-overlay-toast{z-index:var(--z-overlay-toast)}.order-1{order:1}.order-2{order:2}.col-span-full{grid-column:1/-1}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.mt-sm{margin-top:var(--space-sm)}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.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}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2xl{height:var(--space-2xl)}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-auto{height:auto}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.max-h-modal-body{max-height:var(--modal-body-max-height)}.max-h-modal-pane{max-height:var(--modal-pane-max-height)}.max-h-modal-sheet{max-height:var(--modal-sheet-max-height)}.max-h-modal-shell{max-height:var(--modal-shell-max-height)}.min-h-0{min-height:0}.min-h-\[200px\]{min-height:200px}.min-h-\[80px\]{min-height:80px}.min-h-\[96px\]{min-height:96px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[calc\(100\%-3rem\)\]{width:calc(100% - 3rem)}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-\[200px\]{max-width:200px}.max-w-docs{max-width:var(--layout-docs-max-width)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-popover-safe{max-width:var(--popover-inline-safe-max)}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.origin-bottom-right{transform-origin:bottom right}.rotate-90{--tw-rotate:90deg}.rotate-90,.scale-\[1\.2\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[1\.2\]{--tw-scale-x:1.2;--tw-scale-y:1.2}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-y{resize:vertical}.resize{resize:both}.list-disc{list-style-type:disc}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-sm{gap:var(--space-sm)}.gap-xl{gap:var(--space-xl)}.gap-xs{gap:var(--space-xs)}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-border-translucent>:not([hidden])~:not([hidden]){border-color:var(--border-overlay)}.self-start{align-self:flex-start}.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}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-border{border-color:var(--border-default)}.border-border-strong{border-color:var(--border-strong)}.border-border-translucent{border-color:var(--border-overlay)}.border-border-translucent-bright{border-color:var(--color-border-translucent-bright)}.border-border-translucent-medium{border-color:var(--color-border-translucent-medium)}.border-overlay{border-color:var(--border-overlay)}.border-overlay-strong{border-color:var(--border-overlay-strong)}.border-status-danger-border{border-color:var(--status-danger-border)}.border-status-info-border{border-color:var(--status-info-border)}.border-status-success-border{border-color:var(--status-success-border)}.border-status-warning-border{border-color:var(--status-warning-border)}.border-surface-strong{border-color:var(--border-strong)}.border-opacity-20{--tw-border-opacity:0.2}.bg-accent-strong{background-color:var(--color-accent-strong)}.bg-overlay-muted{background-color:var(--surface-overlay-muted)}.bg-overlay-panel{background-color:var(--surface-overlay-panel)}.bg-overlay-panel-soft{background-color:var(--surface-overlay-panel-soft)}.bg-overlay-strong{background-color:var(--surface-overlay-strong)}.bg-panel{background-color:var(--surface-panel)}.bg-status-danger-surface{background-color:var(--status-danger-surface)}.bg-status-info-surface{background-color:var(--status-info-surface)}.bg-status-success-surface{background-color:var(--status-success-surface)}.bg-status-warning-surface{background-color:var(--status-warning-surface)}.bg-surface{background-color:var(--surface-base)}.bg-surface-alt{background-color:var(--surface-alt)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.bg-opacity-95{--tw-bg-opacity:0.95}.bg-overlay-channel{background-image:var(--surface-overlay-banner-gradient-channel)}.stroke-border-translucent{stroke:var(--border-overlay)}.stroke-current{stroke:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-lg{padding:var(--space-lg)}.p-md{padding:var(--space-md)}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.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-6{padding-left:1.5rem;padding-right:1.5rem}.px-lg{padding-left:var(--space-lg);padding-right:var(--space-lg)}.px-md{padding-left:var(--space-md);padding-right:var(--space-md)}.py-0{padding-top:0;padding-bottom:0}.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-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-md{padding-top:var(--space-md);padding-bottom:var(--space-md)}.py-xl{padding-top:var(--space-xl);padding-bottom:var(--space-xl)}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-2{padding-left:.5rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pr-1{padding-right:.25rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-family-mono)}.font-sans{font-family:var(--font-family-sans)}.text-2xl{font-size:var(--font-size-2xl);line-height:var(--line-height-relaxed)}.text-2xs{font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-3xs{font-size:var(--font-size-3xs);line-height:var(--line-height-tight)}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-4xs{font-size:var(--font-size-4xs);line-height:var(--line-height-tight)}.text-\[0\.75rem\]{font-size:.75rem}.text-base{font-size:var(--font-size-base)}.text-base,.text-lg{line-height:var(--line-height-base)}.text-lg{font-size:var(--font-size-lg)}.text-sm{font-size:var(--font-size-sm);line-height:var(--line-height-snug)}.text-xl{font-size:var(--font-size-xl);line-height:var(--line-height-relaxed)}.text-xs{font-size:var(--font-size-xs);line-height:var(--line-height-tight)}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.ordinal{--tw-ordinal:ordinal}.ordinal,.tabular-nums{font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing:tabular-nums}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-extra-wide{letter-spacing:var(--tracking-extra-wide)}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-accent{color:var(--color-accent)}.text-critical{color:var(--color-critical)}.text-critical-strong{color:var(--color-critical-strong)}.text-info{color:var(--color-info)}.text-info-strong{color:var(--color-info-strong)}.text-muted{color:var(--text-muted)}.text-muted-strong{color:var(--text-muted-strong)}.text-primary{color:var(--text-primary)}.text-status-danger{color:var(--status-danger)}.text-status-danger-on{color:var(--status-danger-on)}.text-status-info{color:var(--status-info)}.text-status-info-on{color:var(--status-info-on)}.text-status-neutral{color:var(--status-neutral)}.text-status-private-on{color:var(--status-private-on)}.text-status-success{color:var(--status-success)}.text-status-success-on{color:var(--status-success-on)}.text-status-warning{color:var(--status-warning)}.text-status-warning-on{color:var(--status-warning-on)}.text-subtle{color:var(--text-subtle)}.text-text{color:var(--text-primary)}.text-text-frosted{color:var(--text-frosted-primary)}.text-text-muted{color:var(--text-muted)}.text-text-strong{color:var(--color-text-strong)}.text-warning{color:var(--status-warning)}.text-warning-strong{color:var(--status-warning-strong)}.text-white{color:var(--color-white)}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-95{opacity:.95}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.shadow-md{--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px 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-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px)}.blur,.blur-xl{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)}.blur-xl{--tw-blur:blur(24px)}.\!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)!important}.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)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-md,.backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.transition{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-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-fast{transition-duration:var(--motion-duration-fast)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@media (max-width:640px){.bv-grid-video{gap:var(--space-md);grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){:root{--motion-duration-fast:0s;--motion-duration-base:0s;--motion-duration-slow:0s;--modal-motion-duration:0s}*,:after,:before{animation-delay:0s!important;animation-duration:0s!important;animation-iteration-count:1!important;animation-timing-function:linear!important;transition-delay:0s!important;transition-duration:0s!important;transition-timing-function:linear!important}.player-modal__similar-card:before{transition:none!important}#app,#playerModal .player-modal__content,#sidebar,.btn,.btn-ghost,.card,.card[data-motion=enter],.fade-in,.icon-button,.menu__item,.modal-nav,.notification-banner,.notification-portal,.popover-panel,.popover__panel,.progress-bar-fill,.sidebar-collapse-toggle,.sidebar-collapse-toggle__icon,.sidebar-dropup-panel,.sidebar-dropup-trigger,.sidebar-dropup-trigger__chevron,.sidebar-loading-indicator,.sidebar-loading-wrapper,.sidebar-nav,.sidebar-nav-link,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast,.video-modal__panel,.watch-history-card,.watch-history-card__action,.watch-history-card__creatorAvatar,.watch-history-card__creatorName,.watch-history-card__title{transition-property:none!important}.popover-panel,.popover__panel{transform:none!important}.popover-panel[data-state=open],.popover__panel[data-state=open]{opacity:1}.popover-panel[data-state=closed],.popover__panel[data-state=closed]{opacity:0}.card[data-motion=enter],.fade-in,[data-video-thumbnail][data-thumbnail-loaded=true]{opacity:1;animation:none!important}.notification-banner,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast{animation:none!important}.notification-portal{transform:none!important;opacity:1!important}}@media (min-width:640px){.sm\:flex#playerModal{display:block}}@media (min-width:768px){.md\:hidden .bv-modal,.md\:hidden.profile-pane{display:none!important}.md\:flex#playerModal{display:block}}.placeholder\:text-muted::-moz-placeholder{color:var(--text-muted)}.placeholder\:text-muted::placeholder{color:var(--text-muted)}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-status-danger-border:hover{border-color:var(--status-danger-border)}.hover\:bg-overlay-panel:hover{background-color:var(--surface-overlay-panel)}.hover\:bg-panel-hover:hover{background-color:var(--surface-panel-hover)}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-critical:hover{color:var(--color-critical)}.hover\:text-info-strong:hover{color:var(--color-info-strong)}.hover\:text-text:hover{color:var(--text-primary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-info:focus{--tw-ring-color:var(--color-info)}.focus\:ring-status-info:focus{--tw-ring-color:var(--status-info)}.focus\:ring-status-success:focus{--tw-ring-color:var(--status-success)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-surface:focus{--tw-ring-offset-color:var(--surface-base)}.focus-visible\:bg-primary:focus-visible{background-color:var(--color-primary)}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-info:focus-visible{outline-color:var(--color-info)}.active\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-primary{color:var(--text-primary)}@media (min-width:640px){.sm\:order-1{order:1}.sm\:order-2{order:2}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:flex{display:flex}.sm\:w-1\/3{width:33.333333%}.sm\:w-auto{width:auto}.sm\:max-w-xs{max-width:20rem}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:.5rem}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:self-end{align-self:flex-end}.sm\:p-5{padding:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-0{padding-top:0;padding-bottom:0}.sm\:pt-8{padding-top:2rem}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-64{height:16rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:gap-md{gap:var(--space-md)}.md\:pb-12{padding-bottom:3rem}}@media (min-width:1024px){.lg\:ml-auto{margin-left:auto}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:flex-wrap{flex-wrap:wrap}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-right{text-align:right}}@media (min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
\ No newline at end of file
+ );--video-card-backdrop-scale:1.12;--video-card-backdrop-blur:var(--blur-video-card-backdrop-strong);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card:focus-visible{border-color:var(--color-accent);--tw-border-opacity:0.4;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=critical]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}.watch-history-card[data-state=private]{background-color:var(--surface-raised-private);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.watch-history-card[data-state=disabled],.watch-history-card[data-state=private]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=disabled]{opacity:.6;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.watch-history-card[data-alert=nsfw-owner]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--color-black)}.watch-history-card[data-alert=nsfw-owner]:hover{--tw-border-opacity:0.6;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card img[data-thumbnail-state=blurred],.watch-history-card img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}.watch-history-card[data-owner-is-viewer=true][data-url-health-state=offline][data-stream-health-state=unhealthy]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max));flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}.watch-history-card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}#playerModal.watch-history-card{display:block}.watch-history-card{display:flex;flex-wrap:wrap;align-items:stretch;gap:1.25rem;padding:1rem;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}@media (prefers-reduced-motion:reduce){.watch-history-card,.watch-history-card[data-motion=enter]{transition-property:none}.watch-history-card[data-motion=enter]{opacity:1;animation:none}}.watch-history-card:hover{--tw-translate-y:-0.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.watch-history-card{gap:1.5rem;padding:1.25rem}}.watch-history-card--private{border-color:var(--color-info);--tw-border-opacity:0.6}#playerModal.watch-history-card__primary{display:block}.watch-history-card__primary{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;align-items:stretch;gap:1rem}@media (min-width:640px){.watch-history-card__primary{flex-direction:row}}.watch-history-card__thumbnail{display:block;width:14rem;max-width:100%;flex:none;color:var(--text-primary);text-decoration-line:none}.watch-history-card__thumbnailInner{aspect-ratio:16/9;width:100%;overflow:hidden;border-radius:var(--radius-lg);background-color:var(--surface-base)}.watch-history-card__thumbnailInner img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.watch-history-card [data-thumbnail-state=blurred] img,.watch-history-card [data-visual-state=blurred] img{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal.watch-history-card__details{display:block}.watch-history-card__details{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;justify-content:center;gap:var(--space-sm)}.watch-history-card__title{cursor:pointer;font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;line-height:1.375;color:var(--text-primary);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.watch-history-card__title:focus,.watch-history-card__title:hover{color:var(--color-accent)}.watch-history-card__created{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}#playerModal.watch-history-card__meta{display:block}.watch-history-card__meta{display:flex;min-width:0;flex-direction:column;justify-content:space-between;gap:1rem}@media (min-width:640px){.watch-history-card__meta{min-width:14rem;flex:none;flex-basis:16rem}}.watch-history-card__watched{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--border-subtle)}#playerModal.watch-history-card__creator{display:block}.watch-history-card__creator{display:flex;align-items:center;gap:.75rem}#playerModal.watch-history-card__creatorAvatar{display:block}.watch-history-card__creatorAvatar{display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;overflow:hidden;border-radius:var(--radius-full);background-color:var(--surface-panel);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorAvatar:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible,.watch-history-card__creatorAvatar:hover{--tw-ring-color:color-mix(in srgb,var(--color-accent) 38%,transparent)}.watch-history-card__creatorAvatar img{height:100%;width:100%;border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover}.watch-history-card__creatorName{cursor:pointer;background-color:transparent;padding:0;text-align:left;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorName:hover{color:var(--color-accent)}.watch-history-card__creatorName:focus-visible{color:var(--color-accent)}#playerModal.watch-history-card__actions{display:block}.watch-history-card__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem}.watch-history-card__action{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--surface-panel);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__action:hover{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action:focus-visible{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action--primary{background-color:var(--color-accent-strong);color:var(--color-white)}.watch-history-card__action--primary:hover{background-color:var(--color-accent-pressed)}.watch-history-card__action--primary:focus-visible{background-color:var(--color-accent-pressed)}.watch-history-card__action--danger{background-color:var(--color-critical);color:var(--color-white)}.watch-history-card__action--danger:hover{background-color:var(--color-critical-strong)}.watch-history-card__action--danger:focus-visible{background-color:var(--color-critical-strong)}#playerModal.watch-history-card__moderation{display:block}.watch-history-card__moderation{margin-top:var(--space-sm);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.watch-history-card__hidden{margin-top:var(--space-md);border-radius:var(--radius-lg);border-width:1px;border-style:dashed;border-color:var(--border-default);background-color:var(--surface-overlay-panel-soft);font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary)}.watch-history-card__hidden .moderation-badge{align-self:flex-start}#playerModal .channel-card__avatar img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal .video-modal__moderation-bar .moderation-badge{--text-status-neutral-on:var(--color-text);--text-status-warning-on:var(--color-warning-on)}#playerModal .video-modal__moderation-bar .moderation-badge[data-variant=neutral]{color:var(--color-text)}.\!container{max-width:var(--layout-docs-max-width)!important;margin:0 auto!important;padding:var(--space-md)!important}.container{max-width:var(--layout-docs-max-width);margin:0 auto;padding:var(--space-md)}.qr-code__table{margin:var(--qr-code-table-margin,0)}.qr-code__cell,.qr-code__table{border:0;border-collapse:collapse}.qr-code__cell{padding:0;margin:0;width:var(--qr-code-cell-width);height:var(--qr-code-cell-height);background-color:var(--qr-code-color-light)}.qr-code__cell--dark{background-color:var(--qr-code-color-dark)}.qr-code__container[data-qr-code-mode=image] .qr-code__canvas{display:none}.qr-code__container[data-qr-code-mode=canvas] .qr-code__canvas,.qr-code__container[data-qr-code-mode=image] .qr-code__image{display:block}.qr-code__container[data-qr-code-mode=canvas] .qr-code__image{display:none}.fade-in{opacity:0;animation:interface-fade-in .28s ease-out forwards;animation-delay:var(--fade-in-delay,0ms)}.fade-in-delay-100{--fade-in-delay:100ms}.fade-in-delay-200{--fade-in-delay:200ms}.fade-in-delay-300{--fade-in-delay:300ms}.\!card[data-motion=enter]{opacity:0!important;animation:card-motion-enter .22s ease-out forwards!important}.card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg);flex:0 0 var(--icon-size-lg);line-height:0;background-color:var(--color-neutral-700);color:var(--color-white);border:none;border-radius:var(--radius-full);cursor:pointer;transition:background-color .2s ease,box-shadow .2s ease}.icon-button:hover{background-color:var(--color-neutral-600)}.icon-button:active,.icon-button:focus{outline:none;box-shadow:0 0 0 var(--icon-button-ring-width) var(--color-ring-alert)}.icon-image{width:var(--icon-size-md);height:var(--icon-size-md);pointer-events:none}.accent-action-button,.channel-action-button{--accent-action-bg:color-mix(in srgb,var(--surface-overlay-panel) 78%,transparent);--accent-action-border:color-mix(in srgb,var(--border-overlay) 92%,transparent);--accent-action-bg-hover:color-mix(in srgb,var(--color-accent) 22%,var(--surface-overlay-panel));--accent-action-ring:color-mix(in srgb,var(--color-accent) 48%,transparent);--accent-action-bg-active:color-mix(in srgb,var(--color-accent-pressed) 28%,var(--surface-overlay-panel));color:var(--color-text);background-color:var(--accent-action-bg);border-color:var(--accent-action-border);border-style:solid;border-width:var(--border-width-hairline)}.accent-action-button:focus-visible,.accent-action-button:hover,.channel-action-button:focus-visible,.channel-action-button:hover{color:var(--color-accent-strong);background-color:var(--accent-action-bg-hover)}.accent-action-button:focus,.accent-action-button:focus-visible,.channel-action-button:focus,.channel-action-button:focus-visible{box-shadow:0 0 0 var(--icon-button-ring-width) var(--accent-action-ring)}.accent-action-button:active,.channel-action-button:active{color:var(--color-accent-pressed);background-color:var(--accent-action-bg-active)}.modal-nav .icon-button{box-shadow:none;padding:0;gap:0;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg)}.modal-nav .icon-button:not(.accent-action-button):not(.channel-action-button){border:none}.modal-meta{gap:var(--space-xs)}.modal-meta,.modal-view-count{display:inline-flex;align-items:center}.modal-view-count{gap:var(--space-2xs);font-size:var(--font-size-sm);line-height:var(--space-md-plus);color:var(--color-muted-alt);white-space:nowrap}.view-count-text{white-space:nowrap;color:var(--color-muted-strong)}.ratio-16-9{position:relative;width:100%;padding-top:56.25%;background-color:var(--color-card)}.ratio-16-9>img{position:absolute;inset:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}#modalContainer{position:fixed;inset:0;z-index:var(--z-modal-root);pointer-events:none;isolation:isolate}#modalContainer>*{pointer-events:auto}#modalContainer>[id$=Modal]:not(#playerModal){z-index:var(--z-modal-root)}#modalContainer>[id$=Modal]:not(#playerModal)>.bv-modal-backdrop{z-index:var(--z-modal-overlay)}#modalContainer>[id$=Modal]:not(#playerModal) .bv-modal__panel{z-index:var(--z-modal-content)}#modalContainer>#profileModal,#profileModal[data-modal-stack=top]{z-index:var(--z-modal-top-root)}#modalContainer>#profileModal>.bv-modal-backdrop,#profileModal[data-modal-stack=top]>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#profileModal .bv-modal__panel,#profileModal[data-modal-stack=top] .bv-modal__panel{z-index:var(--z-modal-top-content)}#modalContainer>#eventDetailsModal{z-index:var(--z-modal-top-root)}#modalContainer>#eventDetailsModal>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#eventDetailsModal .bv-modal__panel{z-index:var(--z-modal-top-content)}.bv-modal[data-nested-modal-active=true]{pointer-events:none;visibility:hidden}#modalContainer>#loginModal{z-index:var(--z-modal-peak-root)}#modalContainer>#loginModal>.bv-modal-backdrop{z-index:var(--z-modal-peak-overlay)}#modalContainer>#loginModal .bv-modal__panel{z-index:var(--z-modal-peak-content)}#modalContainer>#playerModal{z-index:var(--z-modal-player)}#modalContainer>#playerModal .player-modal__container,#modalContainer>#playerModal .player-modal__content{z-index:var(--z-modal-content)}#playerModal{position:fixed;inset:0;z-index:var(--z-modal-player);display:none;flex-direction:column;align-items:stretch;justify-content:flex-start;width:100vw;height:100vh;padding:0;background-color:var(--color-surface);color:var(--color-subtle-text);--player-modal-inline-max:var(--layout-player-max-width);--player-modal-inline-padding:clamp(var(--space-md-plus),4vw,var(--space-2xl));overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}#playerModal.flex{display:block}#modalVideo{width:100%;aspect-ratio:16/9;background-color:var(--color-black)}.notification-portal{position:fixed;top:0;left:0;right:0;z-index:var(--z-overlay-toast);display:flex;flex-direction:column;align-items:center;gap:var(--space-md);padding:calc(var(--space-xl) + env(safe-area-inset-top)) var(--space-lg) var(--space-lg);pointer-events:none;opacity:0;transform:translateY(var(--toast-translate));transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}@media (min-width:640px){.notification-portal{padding-inline:var(--space-xl)}}.notification-portal:has(.notification-banner:not(.hidden)){opacity:1;transform:translateY(0)}.notification-portal--active{opacity:1;transform:translateY(0)}.notification-banner,.torrent-toast{--notify-accent:var(--color-accent-strong);--notify-accent-strong:var(--color-accent);--notify-border:var(--surface-overlay-panel-tint);--notify-background:var(--surface-overlay-panel);--notify-foreground:var(--color-text);position:relative;display:flex;align-items:center;gap:var(--space-md);width:min(var(--notification-banner-max-inline),100%);padding:var(--space-md) var(--space-xl);border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--notify-border);background:var(--notify-background);color:var(--notify-foreground);box-shadow:0 var(--shadow-notification-offset-y) var(--shadow-notification-blur) var(--color-shadow-notification);backdrop-filter:blur(var(--overlay-backdrop-blur));pointer-events:auto;isolation:isolate;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;line-height:1.375;transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}.notification-banner:before,.torrent-toast:before{content:"";position:absolute;inset:0;border-radius:inherit;background:linear-gradient(135deg,var(--notify-accent) 0,var(--notify-accent-strong) 100%);opacity:.18;pointer-events:none}.notification-banner>*,.torrent-toast>*{position:relative;z-index:1}.notification-dismiss{display:inline-flex;height:2rem;width:2rem;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);color:inherit;opacity:.75;background-color:var(--notify-dismiss-background)}.notification-dismiss:focus-visible,.notification-dismiss:hover{opacity:1;background-color:var(--notify-dismiss-background-hover)}.notification-dismiss svg{height:1rem;width:1rem}.notification-banner:not(.hidden){animation:notification-slide-in var(--motion-duration-base) var(--motion-ease-out)}.notification-banner--critical,.torrent-toast--error{--notify-accent:var(--color-critical-strong);--notify-accent-strong:var(--color-critical);--notify-border:var(--color-ring-critical-soft);--notify-background:var(--color-card-critical);--notify-foreground:var(--color-critical-strong)}.notification-banner--success,.torrent-toast--success{--notify-accent:var(--status-success-strong);--notify-accent-strong:var(--status-success);--notify-border:var(--status-success-border);--notify-background:var(--status-success-surface);--notify-foreground:var(--status-success-on)}.notification-banner--info,.torrent-toast--info{--notify-accent:var(--color-info-strong);--notify-accent-strong:var(--color-info);--notify-border:var(--color-info-border);--notify-background:var(--status-info-surface)}.notification-banner--warning,.torrent-toast--warn{--notify-accent:var(--color-warning-strong);--notify-accent-strong:var(--color-warning);--notify-border:var(--status-warning-border);--notify-background:var(--status-warning-surface);--notify-foreground:var(--status-warning-on)}.status-banner .status-spinner{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-info-border);border-radius:var(--radius-full);border-top-color:var(--color-info);flex-shrink:0;height:var(--icon-size-md);width:var(--icon-size-md)}.status-banner .status-message{flex:1 1 auto}@keyframes notification-slide-in{0%{opacity:0;transform:translateY(var(--toast-translate))}to{opacity:1;transform:translateY(0)}}.status-spinner--inline{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-border-info-soft);border-radius:var(--radius-full);border-top-color:var(--color-info);display:inline-block;height:var(--space-md);width:var(--space-md)}body.iframe-form{background-color:transparent;color:var(--color-text);font-family:var(--font-family-sans);margin:var(--space-lg)}body.iframe-form .container{width:100%;max-width:100%;margin:0;padding:0}body.iframe-form .\!container{width:100%!important;max-width:100%!important;margin:0!important;padding:0!important}body.iframe-form .form-container{background-color:var(--color-surface-alt);border-radius:var(--radius-md);box-shadow:var(--shadow-md);color:var(--color-text);display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-lg)}body.iframe-form .form-container>p{margin:0}body.iframe-form form{display:flex;flex-direction:column}body.iframe-form form>*+*{margin-top:var(--space-sm)}body.iframe-form form h1,body.iframe-form form h2{color:var(--color-text);margin-top:var(--space-md)}body.iframe-form label{color:var(--color-subtle-text);display:block;font-weight:600;margin-top:var(--space-sm)}body.iframe-form label+.form-control,body.iframe-form label+.select,body.iframe-form label+.textarea{margin-top:var(--space-xs)}body.iframe-form .checkbox-group,body.iframe-form .radio-group{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-xs)}body.iframe-form .checkbox-group label,body.iframe-form .radio-group label{align-items:center;color:var(--color-subtle-text);display:inline-flex;font-weight:500;gap:var(--space-xs);margin:0}body.iframe-form .checkbox-group input[type=checkbox],body.iframe-form .radio-group input[type=radio]{margin:0}body.iframe-form .radio-group input[type=radio]{accent-color:var(--color-accent-strong)}body.iframe-form button.btn{align-self:flex-start;margin-top:var(--space-md)}body.iframe-form button.\!btn{align-self:flex-start!important;margin-top:var(--space-md)!important}body.iframe-form #status{background:var(--color-surface);border-radius:var(--radius-sm);box-shadow:inset 0 0 0 var(--border-width-hairline) var(--color-border-translucent);color:var(--color-subtle-text);min-height:calc(var(--space-2xl) + var(--space-xl));padding:var(--space-sm);white-space:pre-wrap}body.iframe-form .status-line{color:var(--color-subtle-text);margin:var(--space-2xs) 0}body.iframe-form .status-line.error{color:var(--color-critical-strong)}body.iframe-form .status-line.\!error{color:var(--color-critical-strong)!important}body.iframe-form .status-line.success{color:var(--color-info-strong)}body.iframe-form .status-line.\!success{color:var(--color-info-strong)!important}body.iframe-form .status-line.warn{color:var(--color-warning-strong)}@media (max-width:640px){body.iframe-form{margin:var(--space-md)}body.iframe-form .form-container{padding:var(--space-md)}}#sidebarContainer{position:relative;overflow:visible}#sidebar{position:fixed;top:0;left:0;width:var(--sidebar-width);min-width:var(--sidebar-width);height:100vh;height:100dvh;color:var(--color-text-frosted-strong);overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;overscroll-behavior-inline:contain;touch-action:pan-y;scrollbar-gutter:stable both-edges;background:transparent;border-right:none;backdrop-filter:none;-webkit-backdrop-filter:none;transition:width .2s ease,transform .3s ease;z-index:var(--z-sidebar);box-shadow:none;isolation:isolate}#app.sidebar-collapsed,#sidebar.sidebar-collapsed,#sidebar[data-state=collapsed],body.sidebar-collapsed{--sidebar-width:var(--sidebar-width-collapsed)}#app.sidebar-expanded,#sidebar.sidebar-expanded,#sidebar[data-state=expanded],body.sidebar-expanded{--sidebar-width:var(--sidebar-width-expanded)}#sidebar .sidebar__inner{padding-block-start:max(var(--space-sidebar-shell-block-start),calc(var(--app-header-centerline) - var(--sidebar-control-size)/2));padding-block-end:var(--space-sidebar-shell-block-end);padding-inline:var(--space-sidebar-shell-inline);border-radius:var(--radius-sidebar-shell);border:none;background:none;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;isolation:isolate;transition:color .2s ease}#sidebar .sidebar__inner,.sidebar-scroll{display:flex;flex-direction:column;height:100%;width:100%;overflow:visible}.sidebar-scroll{gap:var(--space-sidebar-scroll-gap);min-height:0;flex:1 1 auto}.sidebar-panel{position:relative;width:100%;display:flex;flex-direction:column;gap:var(--space-sidebar-panel-gap);padding:var(--space-sidebar-panel-padding-block) var(--space-sidebar-panel-padding-inline);border-radius:var(--radius-sidebar-panel);border:none;background:transparent;box-shadow:none;color:inherit;backdrop-filter:none;-webkit-backdrop-filter:none;overflow:hidden;isolation:isolate;transition:border-color .2s ease,box-shadow .22s ease,background .22s ease}.sidebar-panel--primary{flex:1 1 auto;min-height:0;padding-block-start:0}.sidebar-panel__header{display:flex;justify-content:flex-end;margin-bottom:var(--space-md)}.sidebar-collapse-toggle{display:inline-flex;align-items:center;justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--color-border-translucent-medium);background:var(--color-surface-tint-subtle);color:inherit;cursor:pointer;transition:background .18s ease,color .18s ease,border-color .18s ease;flex-shrink:0;box-sizing:border-box}.sidebar-collapse-toggle:hover{background:var(--color-border-translucent);border-color:var(--color-border-translucent-stronger);color:var(--color-text)}.sidebar-collapse-toggle:focus-visible{outline:var(--space-3xs) solid var(--color-secondary);outline-offset:var(--space-2xs)}.sidebar-collapse-toggle__icon{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .2s ease}.sidebar-nav{display:flex;flex-direction:column;gap:var(--space-xs);opacity:1;transition:opacity .16s ease;width:100%}.sidebar-nav-link{--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-opacity:0;--sidebar-nav-link-highlight-scale:0.96;display:flex;align-items:center;gap:var(--space-sidebar-footer-gap);padding-block:var(--space-sidebar-nav-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);font-size:var(--font-size-sidebar-nav);font-weight:600;letter-spacing:.015em;color:var(--color-text);text-decoration:none;width:100%;position:relative;border:var(--border-width-hairline) solid transparent;background:none;box-shadow:none;transform:translateX(var(--sidebar-nav-translate-x));transition:color .18s ease,border-color .2s ease,box-shadow .22s ease,transform .22s ease;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none}.sidebar-nav-link:after,.sidebar-nav-link:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none;transition:opacity .22s ease,transform .24s ease;z-index:-1}.sidebar-nav-link:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:var(--sidebar-nav-link-highlight-opacity);transform:scale(var(--sidebar-nav-link-highlight-scale));filter:saturate(140%)}.sidebar-nav-link:after{background:linear-gradient(105deg,var(--color-sidebar-hover) 0,transparent 75%);opacity:.22;mix-blend-mode:screen;z-index:-2}.sidebar-nav-link:focus-visible,.sidebar-nav-link:hover{--sidebar-nav-link-highlight-opacity:1;--sidebar-nav-link-highlight-scale:1.02;--sidebar-nav-translate-x:var(--space-sidebar-nav-translate);color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible:after,.sidebar-nav-link:hover:after{opacity:.35}.sidebar-nav-link--sub{font-size:var(--font-size-sidebar-subnav);font-weight:500;color:var(--color-sidebar-text-muted);padding-block:var(--space-sidebar-subnav-padding-block);letter-spacing:.02em;--sidebar-nav-link-highlight-opacity:0.25;--sidebar-nav-link-highlight-scale:1}.sidebar-icon{width:var(--space-lg);height:var(--space-lg);min-width:var(--space-lg);min-height:var(--space-lg);flex-shrink:0;display:block;filter:var(--sidebar-icon-filter);transition:filter .18s ease}.sidebar-footer{flex-direction:column;margin-top:auto;z-index:2}.sidebar-dropup-trigger,.sidebar-footer{display:flex;gap:var(--space-sidebar-footer-gap);position:relative}.sidebar-dropup-trigger{align-items:center;justify-content:space-between;width:100%;padding-block:var(--space-sidebar-trigger-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);border:var(--border-width-hairline) solid transparent;background:none;color:var(--color-text);font-size:var(--font-size-sidebar-trigger);font-weight:600;cursor:pointer;box-sizing:border-box;flex-shrink:0;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none;box-shadow:none;transition:border-color .2s ease,color .2s ease,box-shadow .22s ease}.sidebar-dropup-trigger:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:0;transform:scale(.96);transition:opacity .2s ease,transform .22s ease;z-index:-1;filter:saturate(140%)}.sidebar-dropup-trigger:after,.sidebar-dropup-trigger:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none}.sidebar-dropup-trigger:after{background:linear-gradient(110deg,var(--color-sidebar-hover) 0,transparent 80%);opacity:.18;mix-blend-mode:screen;transition:opacity .2s ease;z-index:-2}.sidebar-dropup-trigger:focus-visible,.sidebar-dropup-trigger:hover{color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger:focus-visible:before,.sidebar-dropup-trigger:hover:before{opacity:1;transform:scale(1.02)}.sidebar-dropup-trigger:focus-visible:after,.sidebar-dropup-trigger:hover:after{opacity:.35}.sidebar-dropup-trigger:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger__glyph{width:var(--icon-size-md);height:var(--icon-size-md);opacity:.9}.sidebar-dropup-trigger__chevron{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .18s ease}.sidebar-dropup-trigger[aria-expanded=true] .sidebar-dropup-trigger__chevron,.sidebar-dropup-trigger__chevron.is-rotated{transform:rotate(180deg)}.sidebar-dropup-panel{position:absolute;left:0;right:0;bottom:calc(100% + var(--space-sidebar-popover-offset));border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--color-sidebar-border-strong);background:linear-gradient(160deg,color-mix(in srgb,var(--color-sidebar-surface) 88%,transparent) 0,color-mix(in srgb,var(--color-sidebar-surface-alt) 68%,transparent) 100%);box-shadow:inset 0 0 0 var(--border-width-fine) var(--color-sidebar-border),var(--shadow-sidebar-panel);padding:var(--space-sidebar-popover-padding-block) var(--space-sidebar-popover-padding-inline);color:var(--color-text-frosted);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(var(--space-sm));transition:opacity .18s ease,transform .18s ease,visibility .18s ease,box-shadow .22s ease;backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));-webkit-backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));z-index:5;isolation:isolate}.sidebar-dropup-panel[data-state=expanded]{opacity:1;visibility:visible;pointer-events:auto;transform:translateY(0)}.sidebar-dropup-panel__inner{display:flex;flex-direction:column;gap:var(--space-sidebar-popover-gap);width:100%;padding-inline-end:var(--space-sidebar-dropup-scroll-reserve);max-height:var(--sidebar-dropup-max-height);overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable both-edges}.sidebar-dropup-panel__inner.is-measuring{position:absolute;width:-moz-max-content;width:max-content;max-width:none;visibility:hidden;pointer-events:none;left:var(--offscreen-offset);right:auto;top:auto;bottom:auto}.sidebar-dropup-measure{position:absolute;visibility:hidden;pointer-events:none;height:0;overflow:hidden}.sidebar-dropup-panel__inner>*{width:100%;min-width:0}#sidebar[data-footer-state=expanded] .sidebar-nav{opacity:0;pointer-events:none}#sidebar[data-footer-state=collapsed] .sidebar-nav{opacity:1}.sidebar-loading-wrapper{display:flex;justify-content:center;align-items:center;padding:var(--space-2xl) 0;width:100%;grid-column:1/-1}.sidebar-loading-indicator{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--color-muted-strong);font-size:var(--font-size-sm);font-weight:500;letter-spacing:.01em}.sidebar-loading-text{white-space:nowrap}#app{box-sizing:border-box;transition:margin-left .2s ease,width .2s ease,max-width .2s ease}#app[data-sidebar-state=collapsed]{margin-left:var(--sidebar-width-collapsed);width:calc(100vw - var(--sidebar-width-collapsed));max-width:calc(100vw - var(--sidebar-width-collapsed))}#app[data-sidebar-state=expanded]{margin-left:max(var(--sidebar-width-expanded-base),var(--sidebar-dropup-content-width));width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)))}#sidebar.sidebar-collapsed .sidebar-nav-link,body.sidebar-collapsed #sidebar .sidebar-nav-link{justify-content:center;width:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full);--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-scale:1}#sidebar.sidebar-expanded .sidebar-nav-link,body.sidebar-expanded #sidebar .sidebar-nav-link{justify-content:flex-start}#sidebar.sidebar-collapsed .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-text{display:none}#sidebar.sidebar-collapsed .sidebar__inner,body.sidebar-collapsed #sidebar .sidebar__inner{padding-inline:var(--space-2xs)}#sidebar.sidebar-collapsed .sidebar-panel,body.sidebar-collapsed #sidebar .sidebar-panel{padding-inline:calc(var(--space-3xs)*3)}#sidebar.sidebar-collapsed .sidebar-panel__header,body.sidebar-collapsed #sidebar .sidebar-panel__header{justify-content:center}#sidebar.sidebar-collapsed .sidebar-collapse-toggle,body.sidebar-collapsed #sidebar .sidebar-collapse-toggle{margin-inline:auto}#sidebar .sidebar-toggle-icon--rotated{transform:rotate(180deg)}#sidebar.sidebar-collapsed .sidebar-toggle-icon--rotated,body.sidebar-collapsed #sidebar .sidebar-toggle-icon--rotated{transform:rotate(0deg)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger{justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__chevron{display:none}#sidebar.sidebar-collapsed .sidebar-dropup-trigger__glyph,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__glyph{margin:0}#sidebar.sidebar-collapsed .sidebar-nav-link:focus-visible,#sidebar.sidebar-collapsed .sidebar-nav-link:hover,body.sidebar-collapsed #sidebar .sidebar-nav-link:focus-visible,body.sidebar-collapsed #sidebar .sidebar-nav-link:hover{--sidebar-nav-translate-x:0}@media (min-width:768px){.sidebar-panel__header{display:flex}.sidebar-collapse-toggle{display:inline-flex}#sidebar{transform:translateX(0)!important;width:var(--sidebar-width);overflow:visible}#app[data-sidebar-state=collapsed]{margin-left:calc(var(--sidebar-width-collapsed) + var(--sidebar-content-gap));width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap));max-width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap))}#app[data-sidebar-state=expanded]{margin-left:max(calc(var(--sidebar-width-expanded-base) + var(--sidebar-content-gap)),calc(var(--sidebar-dropup-content-width) + var(--sidebar-content-gap)));width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)))}}@keyframes card-motion-enter{0%{opacity:0;transform:translateY(var(--motion-card-enter-translate))}to{opacity:1;transform:translateY(0)}}@keyframes video-thumbnail-fade-in{0%{opacity:0}to{opacity:1}}@keyframes interface-fade-in{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0;transform:translateY(var(--motion-fade-in-translate))}to{opacity:1;transform:translateY(0)}}.status-line{margin-top:.25rem;margin-bottom:.25rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);line-height:1.375;color:var(--text-primary)}.status-line.error{color:var(--color-critical-strong)}.status-line.\!error{color:var(--color-critical-strong)!important}.status-line.warn{color:var(--color-warning-strong)}@keyframes ztr-rotate{to{transform:rotate(1turn)}}@keyframes ztr-dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes svelte-181fgen-loader-animation{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes svelte-181fgen-fade-in{to{opacity:1}}.dm-app-shell{display:flex;flex-direction:column;gap:var(--space-lg);padding:var(--space-lg);background:var(--surface-base);color:var(--text-primary);min-height:100vh}.dm-app-shell__main,.dm-app-shell__sidebar{border-radius:var(--radius-lg);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-panel);box-shadow:var(--shadow-soft)}.dm-app-shell__sidebar{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md)}.dm-app-shell__title{font-size:var(--font-size-lg);margin:0}.dm-app-shell__main{flex:1;display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);background:var(--surface-raised)}.dm-conversation-list{display:flex;flex-direction:column;gap:var(--space-sm)}.dm-conversation-list__header{display:flex;justify-content:space-between;align-items:center}.dm-conversation-list__title{font-size:var(--font-size-sm);text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);margin:0}.dm-conversation-list__items{display:flex;flex-direction:column;gap:var(--space-xs);overflow-y:auto;max-height:60vh;padding-right:var(--space-xs)}.dm-conversation-list__state{font-size:var(--font-size-sm);color:var(--text-muted);padding:var(--space-md);text-align:center;background:var(--surface-sunken);border-radius:var(--radius-md)}.dm-contact-row{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-subtle);background:transparent;color:inherit;text-align:left;cursor:pointer}.dm-contact-row:focus-visible,.dm-contact-row:hover{background:var(--surface-muted);border-color:var(--border-strong);outline:none}.dm-contact-row--active{background:var(--surface-sunken);border-color:var(--border-strong)}.dm-contact-row__content{display:flex;flex-direction:column;gap:var(--space-2xs);flex:1}.dm-contact-row__header{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-xs)}.dm-contact-row__name{font-weight:600}.dm-contact-row__time{font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-contact-row__preview{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-contact-row__badge{align-self:flex-start;padding:var(--space-3xs) var(--space-xs);border-radius:var(--radius-full);background:var(--surface-overlay);color:var(--text-inverse);font-size:var(--font-size-3xs)}.dm-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);background:var(--surface-sunken);color:var(--text-muted);font-weight:600;overflow:hidden;border:var(--border-width-hairline) solid var(--border-subtle)}.dm-avatar__image{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.dm-message-thread{display:flex;flex-direction:column;gap:var(--space-sm);flex:1;min-height:0}.dm-message-thread__header{display:flex;align-items:baseline;gap:var(--space-sm)}.dm-message-thread__title{font-size:var(--font-size-base);margin:0}.dm-message-thread__status{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-message-thread__timeline{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-sm);border-radius:var(--radius-md);background:var(--surface-panel);border:var(--border-width-hairline) solid var(--border-subtle);overflow-y:auto;min-height:16rem}.dm-message-thread__state{padding:var(--space-md);text-align:center;color:var(--text-muted);background:var(--surface-sunken);border-radius:var(--radius-md)}.dm-message-bubble{max-width:85%;display:flex;flex-direction:column;gap:var(--space-2xs);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-lg);border:var(--border-width-hairline) solid var(--border-subtle);background:var(--surface-sunken)}.dm-message-bubble__content{font-size:var(--font-size-sm)}.dm-message-bubble__meta{display:flex;gap:var(--space-xs);font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-message-bubble__status{color:var(--status-danger)}.dm-day-divider{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:var(--space-xs);color:var(--text-muted);font-size:var(--font-size-2xs)}.dm-day-divider__line{height:1px;background:var(--border-subtle)}.dm-notification-center{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-notification-center__empty{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-notification-center__item{padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-subtle);background:var(--surface-sunken);font-size:var(--font-size-xs)}.dm-composer{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-composer__label{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-composer__input{resize:vertical;border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-base);color:var(--text-primary);padding:var(--space-sm);font-family:inherit}.dm-composer__input:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.dm-composer__actions{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm)}.dm-composer__hint{font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-composer__send{border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-strong);background:var(--surface-overlay-panel);color:var(--text-primary);padding:var(--space-xs) var(--space-md);font-weight:600;cursor:pointer}.dm-composer__send:focus-visible,.dm-composer__send:hover{background:var(--surface-overlay-panel-soft);outline:none}.dm-composer__status{font-size:var(--font-size-2xs);color:var(--status-danger);min-height:1rem}@media (min-width:768px){.dm-app-shell{flex-direction:row;align-items:stretch}.dm-app-shell__sidebar{flex:0 0 18rem;max-width:20rem}.dm-app-shell__main,.dm-app-shell__sidebar{height:calc(100vh - var(--space-lg)*2)}.dm-conversation-list__items{max-height:none;flex:1}}@media (min-width:1024px){.dm-app-shell__sidebar{flex-basis:20rem}.dm-message-thread__timeline{padding:var(--space-md)}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.left-4{left:1rem}.right-3{right:.75rem}.right-4{right:1rem}.right-6{right:1.5rem}.top-0{top:0}.top-3{top:.75rem}.z-10{z-index:10}.z-50{z-index:50}.z-\[140\]{z-index:140}.z-overlay-floating{z-index:var(--z-overlay-floating)}.z-overlay-toast{z-index:var(--z-overlay-toast)}.order-1{order:1}.order-2{order:2}.col-span-full{grid-column:1/-1}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.mt-sm{margin-top:var(--space-sm)}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.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}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2xl{height:var(--space-2xl)}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-auto{height:auto}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.max-h-modal-body{max-height:var(--modal-body-max-height)}.max-h-modal-pane{max-height:var(--modal-pane-max-height)}.max-h-modal-sheet{max-height:var(--modal-sheet-max-height)}.max-h-modal-shell{max-height:var(--modal-shell-max-height)}.min-h-0{min-height:0}.min-h-\[200px\]{min-height:200px}.min-h-\[80px\]{min-height:80px}.min-h-\[96px\]{min-height:96px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[calc\(100\%-3rem\)\]{width:calc(100% - 3rem)}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-\[200px\]{max-width:200px}.max-w-docs{max-width:var(--layout-docs-max-width)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-popover-safe{max-width:var(--popover-inline-safe-max)}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.origin-bottom-right{transform-origin:bottom right}.rotate-90{--tw-rotate:90deg}.rotate-90,.scale-\[1\.2\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[1\.2\]{--tw-scale-x:1.2;--tw-scale-y:1.2}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-y{resize:vertical}.resize{resize:both}.list-disc{list-style-type:disc}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-sm{gap:var(--space-sm)}.gap-xl{gap:var(--space-xl)}.gap-xs{gap:var(--space-xs)}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-border-translucent>:not([hidden])~:not([hidden]){border-color:var(--border-overlay)}.self-start{align-self:flex-start}.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}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-border{border-color:var(--border-default)}.border-border-strong{border-color:var(--border-strong)}.border-border-translucent{border-color:var(--border-overlay)}.border-border-translucent-bright{border-color:var(--color-border-translucent-bright)}.border-border-translucent-medium{border-color:var(--color-border-translucent-medium)}.border-overlay{border-color:var(--border-overlay)}.border-overlay-strong{border-color:var(--border-overlay-strong)}.border-status-danger-border{border-color:var(--status-danger-border)}.border-status-info-border{border-color:var(--status-info-border)}.border-status-success-border{border-color:var(--status-success-border)}.border-status-warning-border{border-color:var(--status-warning-border)}.border-surface-strong{border-color:var(--border-strong)}.border-opacity-20{--tw-border-opacity:0.2}.bg-accent-strong{background-color:var(--color-accent-strong)}.bg-overlay-muted{background-color:var(--surface-overlay-muted)}.bg-overlay-panel{background-color:var(--surface-overlay-panel)}.bg-overlay-panel-soft{background-color:var(--surface-overlay-panel-soft)}.bg-overlay-strong{background-color:var(--surface-overlay-strong)}.bg-panel{background-color:var(--surface-panel)}.bg-status-danger-surface{background-color:var(--status-danger-surface)}.bg-status-info-surface{background-color:var(--status-info-surface)}.bg-status-success-surface{background-color:var(--status-success-surface)}.bg-status-warning-surface{background-color:var(--status-warning-surface)}.bg-surface{background-color:var(--surface-base)}.bg-surface-alt{background-color:var(--surface-alt)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.bg-opacity-95{--tw-bg-opacity:0.95}.bg-overlay-channel{background-image:var(--surface-overlay-banner-gradient-channel)}.stroke-border-translucent{stroke:var(--border-overlay)}.stroke-current{stroke:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-lg{padding:var(--space-lg)}.p-md{padding:var(--space-md)}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.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-6{padding-left:1.5rem;padding-right:1.5rem}.px-lg{padding-left:var(--space-lg);padding-right:var(--space-lg)}.px-md{padding-left:var(--space-md);padding-right:var(--space-md)}.py-0{padding-top:0;padding-bottom:0}.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-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-md{padding-top:var(--space-md);padding-bottom:var(--space-md)}.py-xl{padding-top:var(--space-xl);padding-bottom:var(--space-xl)}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-2{padding-left:.5rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pr-1{padding-right:.25rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-family-mono)}.font-sans{font-family:var(--font-family-sans)}.text-2xl{font-size:var(--font-size-2xl);line-height:var(--line-height-relaxed)}.text-2xs{font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-3xs{font-size:var(--font-size-3xs);line-height:var(--line-height-tight)}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-4xs{font-size:var(--font-size-4xs);line-height:var(--line-height-tight)}.text-\[0\.75rem\]{font-size:.75rem}.text-base{font-size:var(--font-size-base)}.text-base,.text-lg{line-height:var(--line-height-base)}.text-lg{font-size:var(--font-size-lg)}.text-sm{font-size:var(--font-size-sm);line-height:var(--line-height-snug)}.text-xl{font-size:var(--font-size-xl);line-height:var(--line-height-relaxed)}.text-xs{font-size:var(--font-size-xs);line-height:var(--line-height-tight)}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.ordinal{--tw-ordinal:ordinal}.ordinal,.tabular-nums{font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing:tabular-nums}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-extra-wide{letter-spacing:var(--tracking-extra-wide)}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-accent{color:var(--color-accent)}.text-critical{color:var(--color-critical)}.text-critical-strong{color:var(--color-critical-strong)}.text-info{color:var(--color-info)}.text-info-strong{color:var(--color-info-strong)}.text-muted{color:var(--text-muted)}.text-muted-strong{color:var(--text-muted-strong)}.text-primary{color:var(--text-primary)}.text-status-danger{color:var(--status-danger)}.text-status-danger-on{color:var(--status-danger-on)}.text-status-info{color:var(--status-info)}.text-status-info-on{color:var(--status-info-on)}.text-status-neutral{color:var(--status-neutral)}.text-status-private-on{color:var(--status-private-on)}.text-status-success{color:var(--status-success)}.text-status-success-on{color:var(--status-success-on)}.text-status-warning{color:var(--status-warning)}.text-status-warning-on{color:var(--status-warning-on)}.text-subtle{color:var(--text-subtle)}.text-text{color:var(--text-primary)}.text-text-frosted{color:var(--text-frosted-primary)}.text-text-muted{color:var(--text-muted)}.text-text-strong{color:var(--color-text-strong)}.text-warning{color:var(--status-warning)}.text-warning-strong{color:var(--status-warning-strong)}.text-white{color:var(--color-white)}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-95{opacity:.95}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.shadow-md{--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px 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-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px)}.blur,.blur-xl{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)}.blur-xl{--tw-blur:blur(24px)}.\!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)!important}.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)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-md,.backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.transition{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-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-fast{transition-duration:var(--motion-duration-fast)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@media (max-width:640px){.bv-grid-video{gap:var(--space-md);grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){:root{--motion-duration-fast:0s;--motion-duration-base:0s;--motion-duration-slow:0s;--modal-motion-duration:0s}*,:after,:before{animation-delay:0s!important;animation-duration:0s!important;animation-iteration-count:1!important;animation-timing-function:linear!important;transition-delay:0s!important;transition-duration:0s!important;transition-timing-function:linear!important}.player-modal__similar-card:before{transition:none!important}#app,#playerModal .player-modal__content,#sidebar,.btn,.btn-ghost,.card,.card[data-motion=enter],.fade-in,.icon-button,.menu__item,.modal-nav,.notification-banner,.notification-portal,.popover-panel,.popover__panel,.progress-bar-fill,.sidebar-collapse-toggle,.sidebar-collapse-toggle__icon,.sidebar-dropup-panel,.sidebar-dropup-trigger,.sidebar-dropup-trigger__chevron,.sidebar-loading-indicator,.sidebar-loading-wrapper,.sidebar-nav,.sidebar-nav-link,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast,.video-modal__panel,.watch-history-card,.watch-history-card__action,.watch-history-card__creatorAvatar,.watch-history-card__creatorName,.watch-history-card__title{transition-property:none!important}.popover-panel,.popover__panel{transform:none!important}.popover-panel[data-state=open],.popover__panel[data-state=open]{opacity:1}.popover-panel[data-state=closed],.popover__panel[data-state=closed]{opacity:0}.card[data-motion=enter],.fade-in,[data-video-thumbnail][data-thumbnail-loaded=true]{opacity:1;animation:none!important}.notification-banner,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast{animation:none!important}.notification-portal{transform:none!important;opacity:1!important}}@media (min-width:640px){.sm\:flex#playerModal{display:block}}@media (min-width:768px){.md\:hidden .bv-modal,.md\:hidden.profile-pane{display:none!important}.md\:flex#playerModal{display:block}}.placeholder\:text-muted::-moz-placeholder{color:var(--text-muted)}.placeholder\:text-muted::placeholder{color:var(--text-muted)}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-status-danger-border:hover{border-color:var(--status-danger-border)}.hover\:bg-overlay-panel:hover{background-color:var(--surface-overlay-panel)}.hover\:bg-panel-hover:hover{background-color:var(--surface-panel-hover)}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-critical:hover{color:var(--color-critical)}.hover\:text-info-strong:hover{color:var(--color-info-strong)}.hover\:text-text:hover{color:var(--text-primary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-info:focus{--tw-ring-color:var(--color-info)}.focus\:ring-status-info:focus{--tw-ring-color:var(--status-info)}.focus\:ring-status-success:focus{--tw-ring-color:var(--status-success)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-surface:focus{--tw-ring-offset-color:var(--surface-base)}.focus-visible\:bg-primary:focus-visible{background-color:var(--color-primary)}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-info:focus-visible{outline-color:var(--color-info)}.active\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-primary{color:var(--text-primary)}@media (min-width:640px){.sm\:order-1{order:1}.sm\:order-2{order:2}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:flex{display:flex}.sm\:w-1\/3{width:33.333333%}.sm\:w-auto{width:auto}.sm\:max-w-xs{max-width:20rem}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:.5rem}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:self-end{align-self:flex-end}.sm\:p-5{padding:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-0{padding-top:0;padding-bottom:0}.sm\:pt-8{padding-top:2rem}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-64{height:16rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:gap-md{gap:var(--space-md)}.md\:pb-12{padding-bottom:3rem}}@media (min-width:1024px){.lg\:ml-auto{margin-left:auto}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:flex-wrap{flex-wrap:wrap}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-right{text-align:right}}@media (min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
\ No newline at end of file
diff --git a/css/tailwind.source.css b/css/tailwind.source.css
index d30de46f..151a738f 100644
--- a/css/tailwind.source.css
+++ b/css/tailwind.source.css
@@ -4976,3 +4976,400 @@
}
}
}
+
+@layer components {
+ .dm-app-shell {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-lg);
+ padding: var(--space-lg);
+ background: var(--surface-base);
+ color: var(--text-primary);
+ min-height: 100vh;
+ }
+
+ .dm-app-shell__sidebar,
+ .dm-app-shell__main {
+ border-radius: var(--radius-lg);
+ border: var(--border-width-hairline) solid var(--border-default);
+ background: var(--surface-panel);
+ box-shadow: var(--shadow-soft);
+ }
+
+ .dm-app-shell__sidebar {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-md);
+ padding: var(--space-md);
+ }
+
+ .dm-app-shell__title {
+ font-size: var(--font-size-lg);
+ margin: 0;
+ }
+
+ .dm-app-shell__main {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-md);
+ padding: var(--space-md);
+ background: var(--surface-raised);
+ }
+
+ .dm-conversation-list {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-sm);
+ }
+
+ .dm-conversation-list__header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ }
+
+ .dm-conversation-list__title {
+ font-size: var(--font-size-sm);
+ text-transform: uppercase;
+ letter-spacing: 0.08em;
+ color: var(--text-muted);
+ margin: 0;
+ }
+
+ .dm-conversation-list__items {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-xs);
+ overflow-y: auto;
+ max-height: 60vh;
+ padding-right: var(--space-xs);
+ }
+
+ .dm-conversation-list__state {
+ font-size: var(--font-size-sm);
+ color: var(--text-muted);
+ padding: var(--space-md);
+ text-align: center;
+ background: var(--surface-sunken);
+ border-radius: var(--radius-md);
+ }
+
+ .dm-contact-row {
+ display: flex;
+ align-items: center;
+ gap: var(--space-sm);
+ padding: var(--space-sm) var(--space-md);
+ border-radius: var(--radius-md);
+ border: var(--border-width-hairline) solid var(--border-subtle);
+ background: transparent;
+ color: inherit;
+ text-align: left;
+ cursor: pointer;
+ }
+
+ .dm-contact-row:hover,
+ .dm-contact-row:focus-visible {
+ background: var(--surface-muted);
+ border-color: var(--border-strong);
+ outline: none;
+ }
+
+ .dm-contact-row--active {
+ background: var(--surface-sunken);
+ border-color: var(--border-strong);
+ }
+
+ .dm-contact-row__content {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2xs);
+ flex: 1;
+ }
+
+ .dm-contact-row__header {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+ gap: var(--space-xs);
+ }
+
+ .dm-contact-row__name {
+ font-weight: 600;
+ }
+
+ .dm-contact-row__time {
+ font-size: var(--font-size-2xs);
+ color: var(--text-muted);
+ }
+
+ .dm-contact-row__preview {
+ font-size: var(--font-size-xs);
+ color: var(--text-muted);
+ }
+
+ .dm-contact-row__badge {
+ align-self: flex-start;
+ padding: var(--space-3xs) var(--space-xs);
+ border-radius: var(--radius-full);
+ background: var(--surface-overlay);
+ color: var(--text-inverse);
+ font-size: var(--font-size-3xs);
+ }
+
+ .dm-avatar {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: var(--radius-full);
+ background: var(--surface-sunken);
+ color: var(--text-muted);
+ font-weight: 600;
+ overflow: hidden;
+ border: var(--border-width-hairline) solid var(--border-subtle);
+ }
+
+ .dm-avatar--md {
+ width: 2.5rem;
+ height: 2.5rem;
+ }
+
+ .dm-avatar--sm {
+ width: 2rem;
+ height: 2rem;
+ }
+
+ .dm-avatar__image {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ }
+
+ .dm-message-thread {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-sm);
+ flex: 1;
+ min-height: 0;
+ }
+
+ .dm-message-thread__header {
+ display: flex;
+ align-items: baseline;
+ gap: var(--space-sm);
+ }
+
+ .dm-message-thread__title {
+ font-size: var(--font-size-base);
+ margin: 0;
+ }
+
+ .dm-message-thread__status {
+ font-size: var(--font-size-xs);
+ color: var(--text-muted);
+ }
+
+ .dm-message-thread__timeline {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-sm);
+ padding: var(--space-sm);
+ border-radius: var(--radius-md);
+ background: var(--surface-panel);
+ border: var(--border-width-hairline) solid var(--border-subtle);
+ overflow-y: auto;
+ min-height: 16rem;
+ }
+
+ .dm-message-thread__state {
+ padding: var(--space-md);
+ text-align: center;
+ color: var(--text-muted);
+ background: var(--surface-sunken);
+ border-radius: var(--radius-md);
+ }
+
+ .dm-message-bubble {
+ max-width: 85%;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2xs);
+ padding: var(--space-sm) var(--space-md);
+ border-radius: var(--radius-lg);
+ border: var(--border-width-hairline) solid var(--border-subtle);
+ background: var(--surface-sunken);
+ }
+
+ .dm-message-bubble--incoming {
+ align-self: flex-start;
+ }
+
+ .dm-message-bubble--outgoing {
+ align-self: flex-end;
+ background: var(--surface-overlay-panel);
+ }
+
+ .dm-message-bubble__content {
+ font-size: var(--font-size-sm);
+ }
+
+ .dm-message-bubble__meta {
+ display: flex;
+ gap: var(--space-xs);
+ font-size: var(--font-size-2xs);
+ color: var(--text-muted);
+ }
+
+ .dm-message-bubble__status {
+ color: var(--status-danger);
+ }
+
+ .dm-day-divider {
+ display: grid;
+ grid-template-columns: 1fr auto 1fr;
+ align-items: center;
+ gap: var(--space-xs);
+ color: var(--text-muted);
+ font-size: var(--font-size-2xs);
+ }
+
+ .dm-day-divider__line {
+ height: 1px;
+ background: var(--border-subtle);
+ }
+
+ .dm-notification-center {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-xs);
+ }
+
+ .dm-notification-center__empty {
+ font-size: var(--font-size-xs);
+ color: var(--text-muted);
+ }
+
+ .dm-notification-center__item {
+ padding: var(--space-xs) var(--space-sm);
+ border-radius: var(--radius-md);
+ border: var(--border-width-hairline) solid var(--border-subtle);
+ background: var(--surface-sunken);
+ font-size: var(--font-size-xs);
+ }
+
+ .dm-notification-center__item--info {
+ background: var(--status-info-surface);
+ border-color: var(--status-info-border);
+ color: var(--status-info-on);
+ }
+
+ .dm-notification-center__item--success {
+ background: var(--status-success-surface);
+ border-color: var(--status-success-border);
+ color: var(--status-success-on);
+ }
+
+ .dm-notification-center__item--warning {
+ background: var(--status-warning-surface);
+ border-color: var(--status-warning-border);
+ color: var(--status-warning-on);
+ }
+
+ .dm-notification-center__item--error {
+ background: var(--status-danger-surface);
+ border-color: var(--status-danger-border);
+ color: var(--status-danger-on);
+ }
+
+ .dm-composer {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-xs);
+ }
+
+ .dm-composer__label {
+ font-size: var(--font-size-xs);
+ color: var(--text-muted);
+ }
+
+ .dm-composer__input {
+ resize: vertical;
+ border-radius: var(--radius-md);
+ border: var(--border-width-hairline) solid var(--border-default);
+ background: var(--surface-base);
+ color: var(--text-primary);
+ padding: var(--space-sm);
+ font-family: inherit;
+ }
+
+ .dm-composer__input:focus-visible {
+ outline: 2px solid var(--color-accent);
+ outline-offset: 2px;
+ }
+
+ .dm-composer__actions {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-sm);
+ }
+
+ .dm-composer__hint {
+ font-size: var(--font-size-2xs);
+ color: var(--text-muted);
+ }
+
+ .dm-composer__send {
+ border-radius: var(--radius-md);
+ border: var(--border-width-hairline) solid var(--border-strong);
+ background: var(--surface-overlay-panel);
+ color: var(--text-primary);
+ padding: var(--space-xs) var(--space-md);
+ font-weight: 600;
+ cursor: pointer;
+ }
+
+ .dm-composer__send:hover,
+ .dm-composer__send:focus-visible {
+ background: var(--surface-overlay-panel-soft);
+ outline: none;
+ }
+
+ .dm-composer__status {
+ font-size: var(--font-size-2xs);
+ color: var(--status-danger);
+ min-height: 1rem;
+ }
+
+ @media (min-width: theme("screens.md")) {
+ .dm-app-shell {
+ flex-direction: row;
+ align-items: stretch;
+ }
+
+ .dm-app-shell__sidebar {
+ flex: 0 0 18rem;
+ max-width: 20rem;
+ height: calc(100vh - var(--space-lg) * 2);
+ }
+
+ .dm-app-shell__main {
+ height: calc(100vh - var(--space-lg) * 2);
+ }
+
+ .dm-conversation-list__items {
+ max-height: none;
+ flex: 1;
+ }
+ }
+
+ @media (min-width: theme("screens.lg")) {
+ .dm-app-shell__sidebar {
+ flex-basis: 20rem;
+ }
+
+ .dm-message-thread__timeline {
+ padding: var(--space-md);
+ }
+ }
+}
diff --git a/js/ui/dm/AppShell.js b/js/ui/dm/AppShell.js
new file mode 100644
index 00000000..ff977808
--- /dev/null
+++ b/js/ui/dm/AppShell.js
@@ -0,0 +1,125 @@
+import { Composer } from "./Composer.js";
+import { ConversationList } from "./ConversationList.js";
+import { MessageThread } from "./MessageThread.js";
+import { NotificationCenter } from "./NotificationCenter.js";
+
+function createElement(doc, tag, className, text) {
+ const element = doc.createElement(tag);
+ if (className) {
+ element.className = className;
+ }
+ if (typeof text === "string") {
+ element.textContent = text;
+ }
+ return element;
+}
+
+const DEFAULT_CONVERSATIONS = [
+ {
+ id: "conv-1",
+ name: "Nia Nova",
+ preview: "The relay looks stable now.",
+ timestamp: "2m",
+ unreadCount: 2,
+ status: "Online",
+ avatarSrc: "",
+ },
+ {
+ id: "conv-2",
+ name: "Orbit Ops",
+ preview: "Can you share the stream link?",
+ timestamp: "1h",
+ unreadCount: 0,
+ status: "Away",
+ avatarSrc: "",
+ },
+];
+
+const DEFAULT_MESSAGES = [
+ { type: "day", label: "Today" },
+ {
+ id: "msg-1",
+ direction: "incoming",
+ body: "Hey! The new DM view looks promising.",
+ timestamp: "09:12",
+ },
+ {
+ id: "msg-2",
+ direction: "outgoing",
+ body: "Thanks! I'm wiring up the layout and keyboard flow now.",
+ timestamp: "09:14",
+ status: "sending",
+ },
+];
+
+export class AppShell {
+ constructor({
+ document: doc,
+ conversations = DEFAULT_CONVERSATIONS,
+ activeConversationId = DEFAULT_CONVERSATIONS[0]?.id || "",
+ conversationState = "idle",
+ messages = DEFAULT_MESSAGES,
+ threadState = "idle",
+ threadErrorType = "",
+ composerState = "idle",
+ notifications = [],
+ onSelectConversation,
+ onSendMessage,
+ } = {}) {
+ if (!doc) {
+ throw new Error("AppShell requires a document reference.");
+ }
+
+ this.document = doc;
+ this.root = createElement(doc, "div", "dm-app-shell");
+
+ const sidebar = createElement(doc, "aside", "dm-app-shell__sidebar");
+ const sidebarTitle = createElement(
+ doc,
+ "h1",
+ "dm-app-shell__title",
+ "Direct Messages",
+ );
+ sidebar.appendChild(sidebarTitle);
+ sidebar.appendChild(
+ ConversationList({
+ document: doc,
+ conversations,
+ activeId: activeConversationId,
+ state: conversationState,
+ onSelect: onSelectConversation,
+ }),
+ );
+
+ const main = createElement(doc, "main", "dm-app-shell__main");
+ main.appendChild(
+ NotificationCenter({
+ document: doc,
+ notices: notifications,
+ }),
+ );
+ main.appendChild(
+ MessageThread({
+ document: doc,
+ contact: conversations.find((conversation) => conversation.id === activeConversationId) || {},
+ messages,
+ state: threadState,
+ errorType: threadErrorType,
+ }),
+ );
+ main.appendChild(
+ Composer({
+ document: doc,
+ state: composerState,
+ onSend: onSendMessage,
+ }),
+ );
+
+ this.root.appendChild(sidebar);
+ this.root.appendChild(main);
+ }
+
+ getRoot() {
+ return this.root;
+ }
+}
diff --git a/js/ui/dm/Avatar.js b/js/ui/dm/Avatar.js
new file mode 100644
index 00000000..59cfb810
--- /dev/null
+++ b/js/ui/dm/Avatar.js
@@ -0,0 +1,51 @@
+const DEFAULT_AVATAR_ALT = "Avatar";
+
+function getInitials(label = "") {
+ if (typeof label !== "string") {
+ return "";
+ }
+ const words = label.trim().split(/\s+/).filter(Boolean);
+ if (!words.length) {
+ return "";
+ }
+ const initials = words.slice(0, 2).map((word) => word[0].toUpperCase());
+ return initials.join("");
+}
+
+export function Avatar({
+ document: doc,
+ src = "",
+ alt = DEFAULT_AVATAR_ALT,
+ size = "md",
+ initials = "",
+ status = "",
+} = {}) {
+ if (!doc) {
+ throw new Error("Avatar requires a document reference.");
+ }
+
+ const avatar = doc.createElement("div");
+ avatar.className = `dm-avatar dm-avatar--${size}`;
+ if (status) {
+ avatar.dataset.status = status;
+ }
+
+ const resolvedInitials = initials || getInitials(alt);
+
+ if (src) {
+ const img = doc.createElement("img");
+ img.className = "dm-avatar__image";
+ img.alt = alt || DEFAULT_AVATAR_ALT;
+ img.loading = "lazy";
+ img.decoding = "async";
+ img.src = src;
+ avatar.appendChild(img);
+ } else {
+ const fallback = doc.createElement("span");
+ fallback.className = "dm-avatar__fallback";
+ fallback.textContent = resolvedInitials || "?";
+ avatar.appendChild(fallback);
+ }
+
+ return avatar;
+}
diff --git a/js/ui/dm/Composer.js b/js/ui/dm/Composer.js
new file mode 100644
index 00000000..52c5f75b
--- /dev/null
+++ b/js/ui/dm/Composer.js
@@ -0,0 +1,72 @@
+function createElement(doc, tag, className, text) {
+ const element = doc.createElement(tag);
+ if (className) {
+ element.className = className;
+ }
+ if (typeof text === "string") {
+ element.textContent = text;
+ }
+ return element;
+}
+
+export function Composer({
+ document: doc,
+ placeholder = "Write a message…",
+ state = "idle",
+ onSend,
+} = {}) {
+ if (!doc) {
+ throw new Error("Composer requires a document reference.");
+ }
+
+ const form = createElement(doc, "form", "dm-composer");
+ form.noValidate = true;
+
+ const label = createElement(doc, "label", "dm-composer__label", "Message");
+ label.setAttribute("for", "dm-composer-input");
+
+ const textarea = createElement(doc, "textarea", "dm-composer__input");
+ textarea.id = "dm-composer-input";
+ textarea.placeholder = placeholder;
+ textarea.rows = 2;
+
+ const actions = createElement(doc, "div", "dm-composer__actions");
+ const hint = createElement(
+ doc,
+ "span",
+ "dm-composer__hint",
+ "Press Ctrl/⌘ + Enter to send",
+ );
+ const button = createElement(doc, "button", "dm-composer__send", "Send");
+ button.type = "submit";
+ actions.appendChild(hint);
+ actions.appendChild(button);
+
+ const status = createElement(doc, "div", "dm-composer__status");
+ if (state === "error") {
+ status.textContent = "Send failed. Try again.";
+ } else if (state === "sending") {
+ status.textContent = "Sending…";
+ }
+
+ form.appendChild(label);
+ form.appendChild(textarea);
+ form.appendChild(actions);
+ form.appendChild(status);
+
+ form.addEventListener("submit", (event) => {
+ event.preventDefault();
+ if (typeof onSend === "function") {
+ onSend(textarea.value);
+ }
+ });
+
+ textarea.addEventListener("keydown", (event) => {
+ if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) {
+ event.preventDefault();
+ form.requestSubmit();
+ }
+ });
+
+ return form;
+}
diff --git a/js/ui/dm/ContactRow.js b/js/ui/dm/ContactRow.js
new file mode 100644
index 00000000..4c2be75e
--- /dev/null
+++ b/js/ui/dm/ContactRow.js
@@ -0,0 +1,85 @@
+import { Avatar } from "./Avatar.js";
+
+function createElement(doc, tag, className, text) {
+ const element = doc.createElement(tag);
+ if (className) {
+ element.className = className;
+ }
+ if (typeof text === "string") {
+ element.textContent = text;
+ }
+ return element;
+}
+
+export function ContactRow({
+ document: doc,
+ contact = {},
+ isActive = false,
+ tabIndex = -1,
+ onSelect,
+} = {}) {
+ if (!doc) {
+ throw new Error("ContactRow requires a document reference.");
+ }
+
+ const {
+ id = "",
+ name = "Unknown",
+ preview = "",
+ timestamp = "",
+ unreadCount = 0,
+ avatarSrc = "",
+ status = "",
+ } = contact;
+
+ const button = createElement(doc, "button", "dm-contact-row");
+ button.type = "button";
+ button.dataset.conversationId = id;
+ button.setAttribute("role", "option");
+ button.setAttribute("aria-selected", String(Boolean(isActive)));
+ button.tabIndex = tabIndex;
+ if (isActive) {
+ button.classList.add("dm-contact-row--active");
+ }
+
+ const avatar = Avatar({
+ document: doc,
+ src: avatarSrc,
+ alt: name,
+ initials: name,
+ status,
+ });
+ button.appendChild(avatar);
+
+ const content = createElement(doc, "div", "dm-contact-row__content");
+ const header = createElement(doc, "div", "dm-contact-row__header");
+ const nameEl = createElement(doc, "span", "dm-contact-row__name", name);
+ header.appendChild(nameEl);
+
+ const timeEl = createElement(doc, "span", "dm-contact-row__time", timestamp);
+ header.appendChild(timeEl);
+ content.appendChild(header);
+
+ const previewEl = createElement(
+ doc,
+ "div",
+ "dm-contact-row__preview",
+ preview,
+ );
+ content.appendChild(previewEl);
+
+ if (unreadCount > 0) {
+ const badge = createElement(doc, "span", "dm-contact-row__badge");
+ badge.textContent = `${unreadCount}`;
+ badge.setAttribute("aria-label", `${unreadCount} unread messages`);
+ content.appendChild(badge);
+ }
+
+ button.appendChild(content);
+
+ if (typeof onSelect === "function") {
+ button.addEventListener("click", () => onSelect(contact));
+ }
+
+ return button;
+}
diff --git a/js/ui/dm/ConversationList.js b/js/ui/dm/ConversationList.js
new file mode 100644
index 00000000..8c64ed2a
--- /dev/null
+++ b/js/ui/dm/ConversationList.js
@@ -0,0 +1,96 @@
+import { ContactRow } from "./ContactRow.js";
+
+function createElement(doc, tag, className, text) {
+ const element = doc.createElement(tag);
+ if (className) {
+ element.className = className;
+ }
+ if (typeof text === "string") {
+ element.textContent = text;
+ }
+ return element;
+}
+
+function getFocusableItems(listEl) {
+ return [...listEl.querySelectorAll("[data-conversation-id]")];
+}
+
+export function ConversationList({
+ document: doc,
+ conversations = [],
+ activeId = "",
+ state = "idle",
+ onSelect,
+} = {}) {
+ if (!doc) {
+ throw new Error("ConversationList requires a document reference.");
+ }
+
+ const root = createElement(doc, "section", "dm-conversation-list");
+ const header = createElement(doc, "div", "dm-conversation-list__header");
+ header.appendChild(createElement(doc, "h2", "dm-conversation-list__title", "Messages"));
+ root.appendChild(header);
+
+ const list = createElement(doc, "div", "dm-conversation-list__items");
+ list.setAttribute("role", "listbox");
+ list.setAttribute("aria-label", "Conversation list");
+
+ const renderState = createElement(doc, "div", "dm-conversation-list__state");
+
+ if (state === "loading") {
+ renderState.textContent = "Loading conversations…";
+ list.appendChild(renderState);
+ } else if (state === "empty") {
+ renderState.textContent = "No conversations yet.";
+ list.appendChild(renderState);
+ } else if (state === "error") {
+ renderState.textContent = "We couldn't load conversations.";
+ list.appendChild(renderState);
+ } else {
+ const resolvedActiveId = activeId || (conversations[0] ? conversations[0].id : "");
+ conversations.forEach((conversation, index) => {
+ const isActive = conversation.id === resolvedActiveId;
+ const row = ContactRow({
+ document: doc,
+ contact: conversation,
+ isActive,
+ tabIndex: isActive || (!resolvedActiveId && index === 0) ? 0 : -1,
+ onSelect,
+ });
+ list.appendChild(row);
+ });
+ }
+
+ list.addEventListener("keydown", (event) => {
+ const items = getFocusableItems(list);
+ if (!items.length) {
+ return;
+ }
+
+ const currentIndex = items.indexOf(doc.activeElement);
+ let nextIndex = currentIndex;
+
+ switch (event.key) {
+ case "ArrowDown":
+ nextIndex = Math.min(items.length - 1, currentIndex + 1);
+ break;
+ case "ArrowUp":
+ nextIndex = Math.max(0, currentIndex - 1);
+ break;
+ case "Home":
+ nextIndex = 0;
+ break;
+ case "End":
+ nextIndex = items.length - 1;
+ break;
+ default:
+ return;
+ }
+
+ event.preventDefault();
+ items[nextIndex].focus();
+ });
+
+ root.appendChild(list);
+ return root;
+}
diff --git a/js/ui/dm/DayDivider.js b/js/ui/dm/DayDivider.js
new file mode 100644
index 00000000..4b59012e
--- /dev/null
+++ b/js/ui/dm/DayDivider.js
@@ -0,0 +1,24 @@
+function createElement(doc, tag, className, text) {
+ const element = doc.createElement(tag);
+ if (className) {
+ element.className = className;
+ }
+ if (typeof text === "string") {
+ element.textContent = text;
+ }
+ return element;
+}
+
+export function DayDivider({ document: doc, label = "" } = {}) {
+ if (!doc) {
+ throw new Error("DayDivider requires a document reference.");
+ }
+
+ const divider = createElement(doc, "div", "dm-day-divider");
+ const line = createElement(doc, "span", "dm-day-divider__line");
+ const text = createElement(doc, "span", "dm-day-divider__label", label);
+ divider.appendChild(line);
+ divider.appendChild(text);
+ divider.appendChild(line.cloneNode());
+ return divider;
+}
diff --git a/js/ui/dm/MessageBubble.js b/js/ui/dm/MessageBubble.js
new file mode 100644
index 00000000..1d611438
--- /dev/null
+++ b/js/ui/dm/MessageBubble.js
@@ -0,0 +1,51 @@
+function createElement(doc, tag, className, text) {
+ const element = doc.createElement(tag);
+ if (className) {
+ element.className = className;
+ }
+ if (typeof text === "string") {
+ element.textContent = text;
+ }
+ return element;
+}
+
+export function MessageBubble({
+ document: doc,
+ message = {},
+ variant = "incoming",
+} = {}) {
+ if (!doc) {
+ throw new Error("MessageBubble requires a document reference.");
+ }
+
+ const {
+ body = "",
+ timestamp = "",
+ status = "sent",
+ } = message;
+
+ const wrapper = createElement(doc, "div", "dm-message-bubble");
+ wrapper.classList.add(`dm-message-bubble--${variant}`);
+ wrapper.dataset.status = status;
+
+ const content = createElement(doc, "div", "dm-message-bubble__content", body);
+ wrapper.appendChild(content);
+
+ const meta = createElement(doc, "div", "dm-message-bubble__meta");
+ if (timestamp) {
+ meta.appendChild(createElement(doc, "span", "dm-message-bubble__time", timestamp));
+ }
+
+ if (status === "failed") {
+ meta.appendChild(
+ createElement(doc, "span", "dm-message-bubble__status", "Send failed"),
+ );
+ } else if (status === "sending") {
+ meta.appendChild(
+ createElement(doc, "span", "dm-message-bubble__status", "Sending…"),
+ );
+ }
+
+ wrapper.appendChild(meta);
+ return wrapper;
+}
diff --git a/js/ui/dm/MessageThread.js b/js/ui/dm/MessageThread.js
new file mode 100644
index 00000000..0d7af9a1
--- /dev/null
+++ b/js/ui/dm/MessageThread.js
@@ -0,0 +1,80 @@
+import { DayDivider } from "./DayDivider.js";
+import { MessageBubble } from "./MessageBubble.js";
+
+function createElement(doc, tag, className, text) {
+ const element = doc.createElement(tag);
+ if (className) {
+ element.className = className;
+ }
+ if (typeof text === "string") {
+ element.textContent = text;
+ }
+ return element;
+}
+
+export function MessageThread({
+ document: doc,
+ contact = {},
+ messages = [],
+ state = "idle",
+ errorType = "",
+} = {}) {
+ if (!doc) {
+ throw new Error("MessageThread requires a document reference.");
+ }
+
+ const root = createElement(doc, "section", "dm-message-thread");
+
+ const header = createElement(doc, "header", "dm-message-thread__header");
+ header.appendChild(
+ createElement(
+ doc,
+ "h3",
+ "dm-message-thread__title",
+ contact.name || "Direct Messages",
+ ),
+ );
+ if (contact.status) {
+ header.appendChild(
+ createElement(doc, "span", "dm-message-thread__status", contact.status),
+ );
+ }
+ root.appendChild(header);
+
+ const timeline = createElement(doc, "div", "dm-message-thread__timeline");
+ timeline.setAttribute("role", "log");
+ timeline.setAttribute("aria-live", "polite");
+
+ const stateEl = createElement(doc, "div", "dm-message-thread__state");
+
+ if (state === "loading") {
+ stateEl.textContent = "Decrypting messages…";
+ timeline.appendChild(stateEl);
+ } else if (state === "empty") {
+ stateEl.textContent = "Say hello to start the conversation.";
+ timeline.appendChild(stateEl);
+ } else if (state === "error") {
+ const errorMessage =
+ errorType === "decrypt"
+ ? "We couldn't decrypt some messages."
+ : "Something went wrong loading this thread.";
+ stateEl.textContent = errorMessage;
+ timeline.appendChild(stateEl);
+ } else {
+ messages.forEach((message) => {
+ if (message.type === "day") {
+ timeline.appendChild(DayDivider({ document: doc, label: message.label }));
+ return;
+ }
+ const bubble = MessageBubble({
+ document: doc,
+ message,
+ variant: message.direction === "outgoing" ? "outgoing" : "incoming",
+ });
+ timeline.appendChild(bubble);
+ });
+ }
+
+ root.appendChild(timeline);
+ return root;
+}
diff --git a/js/ui/dm/NotificationCenter.js b/js/ui/dm/NotificationCenter.js
new file mode 100644
index 00000000..f73532bf
--- /dev/null
+++ b/js/ui/dm/NotificationCenter.js
@@ -0,0 +1,40 @@
+function createElement(doc, tag, className, text) {
+ const element = doc.createElement(tag);
+ if (className) {
+ element.className = className;
+ }
+ if (typeof text === "string") {
+ element.textContent = text;
+ }
+ return element;
+}
+
+export function NotificationCenter({ document: doc, notices = [] } = {}) {
+ if (!doc) {
+ throw new Error("NotificationCenter requires a document reference.");
+ }
+
+ const root = createElement(doc, "section", "dm-notification-center");
+
+ if (!notices.length) {
+ const placeholder = createElement(
+ doc,
+ "div",
+ "dm-notification-center__empty",
+ "You're all caught up.",
+ );
+ root.appendChild(placeholder);
+ return root;
+ }
+
+ notices.forEach((notice) => {
+ const item = createElement(doc, "div", "dm-notification-center__item");
+ if (notice.variant) {
+ item.classList.add(`dm-notification-center__item--${notice.variant}`);
+ }
+ item.textContent = notice.message || "";
+ root.appendChild(item);
+ });
+
+ return root;
+}
diff --git a/js/ui/dm/index.js b/js/ui/dm/index.js
new file mode 100644
index 00000000..9bada81d
--- /dev/null
+++ b/js/ui/dm/index.js
@@ -0,0 +1,9 @@
+export { AppShell } from "./AppShell.js";
+export { Avatar } from "./Avatar.js";
+export { ContactRow } from "./ContactRow.js";
+export { ConversationList } from "./ConversationList.js";
+export { MessageThread } from "./MessageThread.js";
+export { MessageBubble } from "./MessageBubble.js";
+export { Composer } from "./Composer.js";
+export { NotificationCenter } from "./NotificationCenter.js";
+export { DayDivider } from "./DayDivider.js";
From 54a862e38bd094cb7c56b80dd6f1c20e2010e7b3 Mon Sep 17 00:00:00 2001
From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com>
Date: Sun, 18 Jan 2026 23:33:17 -0500
Subject: [PATCH 002/106] Add messaging and notification token mappings
---
css/tailwind.source.css | 75 ++++++++++++++++++++++++-----------------
css/tokens.css | 47 ++++++++++++++++++++++++++
docs/design-system.md | 9 +++++
3 files changed, 101 insertions(+), 30 deletions(-)
diff --git a/css/tailwind.source.css b/css/tailwind.source.css
index 151a738f..f0a202a4 100644
--- a/css/tailwind.source.css
+++ b/css/tailwind.source.css
@@ -3773,11 +3773,11 @@
.notification-banner,
.torrent-toast {
- --notify-accent: var(--color-accent-strong);
- --notify-accent-strong: var(--color-accent);
- --notify-border: var(--surface-overlay-panel-tint);
- --notify-background: var(--surface-overlay-panel);
- --notify-foreground: var(--color-text);
+ --notify-accent: var(--notification-banner-accent);
+ --notify-accent-strong: var(--notification-banner-accent-strong);
+ --notify-border: var(--notification-banner-border);
+ --notify-background: var(--notification-banner-background);
+ --notify-foreground: var(--notification-banner-text);
position: relative;
display: flex;
@@ -3845,37 +3845,38 @@
.notification-banner--critical,
.torrent-toast--error {
- --notify-accent: var(--color-critical-strong);
- --notify-accent-strong: var(--color-critical);
- --notify-border: var(--color-ring-critical-soft);
- --notify-background: var(--color-card-critical);
- --notify-foreground: var(--color-critical-strong);
+ --notify-accent: var(--notification-banner-critical-accent);
+ --notify-accent-strong: var(--notification-banner-critical-accent-strong);
+ --notify-border: var(--notification-banner-critical-border);
+ --notify-background: var(--notification-banner-critical-background);
+ --notify-foreground: var(--notification-banner-critical-text);
}
.notification-banner--success,
.torrent-toast--success {
- --notify-accent: var(--status-success-strong);
- --notify-accent-strong: var(--status-success);
- --notify-border: var(--status-success-border);
- --notify-background: var(--status-success-surface);
- --notify-foreground: var(--status-success-on);
+ --notify-accent: var(--notification-banner-success-accent);
+ --notify-accent-strong: var(--notification-banner-success-accent-strong);
+ --notify-border: var(--notification-banner-success-border);
+ --notify-background: var(--notification-banner-success-background);
+ --notify-foreground: var(--notification-banner-success-text);
}
.notification-banner--info,
.torrent-toast--info {
- --notify-accent: var(--color-info-strong);
- --notify-accent-strong: var(--color-info);
- --notify-border: var(--color-info-border);
- --notify-background: var(--status-info-surface);
+ --notify-accent: var(--notification-banner-info-accent);
+ --notify-accent-strong: var(--notification-banner-info-accent-strong);
+ --notify-border: var(--notification-banner-info-border);
+ --notify-background: var(--notification-banner-info-background);
+ --notify-foreground: var(--notification-banner-info-text);
}
.notification-banner--warning,
.torrent-toast--warn {
- --notify-accent: var(--color-warning-strong);
- --notify-accent-strong: var(--color-warning);
- --notify-border: var(--status-warning-border);
- --notify-background: var(--status-warning-surface);
- --notify-foreground: var(--status-warning-on);
+ --notify-accent: var(--notification-banner-warning-accent);
+ --notify-accent-strong: var(--notification-banner-warning-accent-strong);
+ --notify-border: var(--notification-banner-warning-border);
+ --notify-background: var(--notification-banner-warning-background);
+ --notify-foreground: var(--notification-banner-warning-text);
}
.status-banner .status-spinner {
@@ -5112,8 +5113,8 @@
align-self: flex-start;
padding: var(--space-3xs) var(--space-xs);
border-radius: var(--radius-full);
- background: var(--surface-overlay);
- color: var(--text-inverse);
+ background: var(--unread-badge-background);
+ color: var(--unread-badge-text);
font-size: var(--font-size-3xs);
}
@@ -5196,8 +5197,9 @@
gap: var(--space-2xs);
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-lg);
- border: var(--border-width-hairline) solid var(--border-subtle);
- background: var(--surface-sunken);
+ border: var(--border-width-hairline) solid var(--message-bubble-border);
+ background: var(--message-bubble-background);
+ color: var(--message-bubble-text);
}
.dm-message-bubble--incoming {
@@ -5206,7 +5208,8 @@
.dm-message-bubble--outgoing {
align-self: flex-end;
- background: var(--surface-overlay-panel);
+ background: var(--message-bubble-outgoing-background);
+ border-color: var(--message-bubble-outgoing-border);
}
.dm-message-bubble__content {
@@ -5217,7 +5220,7 @@
display: flex;
gap: var(--space-xs);
font-size: var(--font-size-2xs);
- color: var(--text-muted);
+ color: var(--message-bubble-meta);
}
.dm-message-bubble__status {
@@ -5281,6 +5284,18 @@
color: var(--status-danger-on);
}
+ .reply-highlight {
+ padding: var(--space-xs) var(--space-sm);
+ border-radius: var(--radius-md);
+ border: var(--border-width-hairline) solid var(--reply-highlight-border);
+ background: var(--reply-highlight-background);
+ color: var(--reply-highlight-text);
+ }
+
+ .reply-highlight svg {
+ color: var(--reply-highlight-icon);
+ }
+
.dm-composer {
display: flex;
flex-direction: column;
diff --git a/css/tokens.css b/css/tokens.css
index 566d0be0..3003107b 100644
--- a/css/tokens.css
+++ b/css/tokens.css
@@ -141,6 +141,53 @@
--status-neutral-border: var(--color-neutral-border);
--status-neutral-on: var(--color-neutral-on);
+ /* Messaging & notifications */
+ --message-bubble-background: var(--surface-sunken);
+ --message-bubble-border: var(--border-subtle);
+ --message-bubble-text: var(--text-primary);
+ --message-bubble-meta: var(--text-muted);
+ --message-bubble-outgoing-background: var(--surface-overlay-panel);
+ --message-bubble-outgoing-border: var(--border-overlay);
+
+ --unread-badge-background: var(--status-info-strong);
+ --unread-badge-text: var(--text-inverse);
+
+ --reply-highlight-background: var(--status-info-surface);
+ --reply-highlight-border: var(--status-info-border);
+ --reply-highlight-text: var(--status-info-on);
+ --reply-highlight-icon: var(--status-info-on);
+
+ --notification-banner-accent: var(--color-accent-strong);
+ --notification-banner-accent-strong: var(--color-accent);
+ --notification-banner-border: var(--surface-overlay-panel-tint);
+ --notification-banner-background: var(--surface-overlay-panel);
+ --notification-banner-text: var(--text-primary);
+ --notification-banner-icon: var(--text-primary);
+
+ --notification-banner-critical-accent: var(--status-danger-strong);
+ --notification-banner-critical-accent-strong: var(--status-danger);
+ --notification-banner-critical-border: var(--color-ring-critical-soft);
+ --notification-banner-critical-background: var(--surface-raised-critical);
+ --notification-banner-critical-text: var(--status-danger-on);
+
+ --notification-banner-success-accent: var(--status-success-strong);
+ --notification-banner-success-accent-strong: var(--status-success);
+ --notification-banner-success-border: var(--status-success-border);
+ --notification-banner-success-background: var(--status-success-surface);
+ --notification-banner-success-text: var(--status-success-on);
+
+ --notification-banner-info-accent: var(--status-info-strong);
+ --notification-banner-info-accent-strong: var(--status-info);
+ --notification-banner-info-border: var(--status-info-border);
+ --notification-banner-info-background: var(--status-info-surface);
+ --notification-banner-info-text: var(--status-info-on);
+
+ --notification-banner-warning-accent: var(--status-warning-strong);
+ --notification-banner-warning-accent-strong: var(--status-warning);
+ --notification-banner-warning-border: var(--status-warning-border);
+ --notification-banner-warning-background: var(--status-warning-surface);
+ --notification-banner-warning-text: var(--status-warning-on);
+
/* Layout & stacking */
--scrollbar-width: 0.5rem;
--scrollbar-track: var(--color-white-soft);
diff --git a/docs/design-system.md b/docs/design-system.md
index e4ac598b..7761c42e 100644
--- a/docs/design-system.md
+++ b/docs/design-system.md
@@ -181,6 +181,15 @@ Mix in Tailwind utilities for icon spacing (`gap-3`), sizing (`px-lg`, `py-sm`),
`.badge` renders an inline pill (`bg-panel`, uppercase text). Opt into semantic variants with `data-variant="info"`, `data-variant="critical"`, or `data-variant="neutral"`. Layer on utilities for icon alignment or truncation.
+### Messaging & Notification Tokens
+
+Use the dedicated messaging tokens when styling chat surfaces and banners so they inherit theme-safe contrast and icon colors:
+
+- **Message bubbles:** `--message-bubble-background`, `--message-bubble-border`, `--message-bubble-text`, and `--message-bubble-meta` drive the base bubble surface, while `--message-bubble-outgoing-background`/`--message-bubble-outgoing-border` cover the current-user variant. These map back to surface, border, and text semantic tokens so bubbles maintain AA contrast. 【F:css/tokens.css†L102-L115】
+- **Unread badges:** `--unread-badge-background` and `--unread-badge-text` keep badge text legible at WCAG AA while ensuring iconography stays ≥3:1 against the fill. 【F:css/tokens.css†L117-L118】
+- **Reply highlights:** `--reply-highlight-background`, `--reply-highlight-border`, `--reply-highlight-text`, and `--reply-highlight-icon` align reply callouts with the info status palette. 【F:css/tokens.css†L120-L123】
+- **Notification banners:** Base banner colors map through `--notification-banner-*` tokens, with per-variant slots (`critical`, `success`, `info`, `warning`) pulling from the status palettes for AA-compliant text and 3:1 icon contrast. 【F:css/tokens.css†L125-L154】
+
### Cards
`.card` is the base surface for grid items and panels:
From 9547a5b0e84885019c5adf70bc59c938cc4c678d Mon Sep 17 00:00:00 2001
From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com>
Date: Sun, 18 Jan 2026 23:38:40 -0500
Subject: [PATCH 003/106] Add DM composer controls and status placeholders
---
css/tailwind.generated.css | 4 +--
css/tailwind.source.css | 56 +++++++++++++++++++++++++++++++++++++
js/ui/dm/AppShell.js | 16 ++++++++++-
js/ui/dm/Composer.js | 57 +++++++++++++++++++++++++++++++++++---
js/ui/dm/MessageBubble.js | 21 +++++++++-----
js/ui/dm/MessageThread.js | 10 +++++++
6 files changed, 150 insertions(+), 14 deletions(-)
diff --git a/css/tailwind.generated.css b/css/tailwind.generated.css
index 5778f0d1..aef3c0f1 100644
--- a/css/tailwind.generated.css
+++ b/css/tailwind.generated.css
@@ -1,6 +1,6 @@
:root{--surface-base:var(--color-surface);--surface-alt:var(--color-surface-alt);--surface-raised:var(--color-card);--surface-raised-private:var(--color-card-private);--surface-raised-critical:var(--color-card-critical);--surface-panel:var(--color-panel);--surface-panel-hover:var(--color-panel-hover);--surface-sunken:var(--color-surface-sunken);--surface-muted:var(--color-surface-muted);--surface-veil:var(--color-overlay-veil);--surface-inverse:var(--color-page);--surface-overlay:var(--color-overlay);--surface-overlay-muted:var(--color-overlay-muted);--surface-overlay-strong:var(--color-overlay-strong);--surface-overlay-darker:var(--color-overlay-darker);--surface-overlay-black:var(--color-overlay-black);--surface-overlay-banner-base:var(--color-page);--surface-overlay-banner:var(--surface-overlay-banner-base);--surface-overlay-banner-opaque:var(--surface-overlay-banner-base);--surface-overlay-banner-strong:color-mix(in srgb,var(--surface-overlay-banner-base) 82%,transparent);--surface-overlay-banner-bottom:color-mix(in srgb,var(--surface-overlay-banner-base) 50%,transparent);--surface-overlay-banner-channel-mid:color-mix(in srgb,var(--surface-overlay-banner-base) 24%,transparent);--surface-overlay-banner-channel-faint:color-mix(in srgb,var(--surface-overlay-banner-base) 10%,transparent);--surface-overlay-banner-soft:color-mix(in srgb,var(--surface-overlay-banner-base) 56%,transparent);--surface-overlay-banner-faint:color-mix(in srgb,var(--surface-overlay-banner-base) 18%,transparent);--surface-overlay-banner-transparent:transparent;--surface-overlay-banner-gradient-header:linear-gradient(to bottom,var(--surface-overlay-banner-opaque) 0%,var(--surface-overlay-banner-strong) 38%,var(--surface-overlay-banner-soft) 70%,var(--surface-overlay-banner-faint) 88%,var(--surface-overlay-banner-transparent) 100%);--surface-overlay-banner-gradient-channel:linear-gradient(to top,var(--surface-overlay-banner-bottom) 0%,var(--surface-overlay-banner-channel-mid) 28%,var(--surface-overlay-banner-channel-faint) 42%,var(--surface-overlay-banner-transparent) 50%);--surface-overlay-banner-gradient:var(
--surface-overlay-banner-gradient-header
- );--surface-overlay-panel:var(--color-overlay-panel);--surface-overlay-panel-soft:var(--color-overlay-panel-soft);--surface-overlay-panel-tint:var(--color-overlay-panel-tint);--surface-overlay-panel-glass:var(--color-overlay-panel-glass);--surface-overlay-panel-glass-soft:var(--color-overlay-panel-glass-soft);--surface-modal-backdrop:var(--color-modal-backdrop);--surface-modal:var(--color-modal-surface);--blur-modal-backdrop:18px;--blur-modal-alert:14px;--blur-thumbnail-blur:18px;--modal-nav-backdrop-blur:6px;--app-header-centerline-offset:calc(var(--space-sm) + var(--space-2xl-plus)/2);--border-default:var(--color-border);--border-subtle:var(--color-border-subtle);--border-strong:var(--color-border-translucent-stronger);--border-overlay:var(--color-border-translucent);--border-overlay-strong:var(--color-border-translucent-strongest);--border-overlay-glow:var(--color-border-translucent-glow);--border-neutral-soft:var(--color-border-neutral-soft);--border-info-soft:var(--color-border-info-soft);--border-sidebar-strong:var(--color-border-sidebar-strong);--border-width-hairline:1px;--border-width-fine:0.5px;--text-primary:var(--color-text);--text-inverse:var(--color-text-inverse);--text-muted:var(--color-text-muted);--text-muted-strong:var(--color-muted-strong);--text-subtle:var(--color-subtle-text);--text-frosted-primary:var(--color-text-frosted);--text-frosted-strong:var(--color-text-frosted-strong);--text-frosted-soft:var(--color-text-frosted-soft);--status-info:var(--color-info);--status-info-strong:var(--color-info-strong);--status-info-surface:var(--color-info-glass);--status-info-border:var(--color-info-border);--status-info-on:var(--color-info-on);--status-success:var(--color-success);--status-success-strong:var(--color-success-strong);--status-success-surface:var(--color-success-surface);--status-success-border:var(--color-success-border);--status-success-on:var(--color-success-on);--status-warning:var(--color-warning);--status-warning-strong:var(--color-warning-strong);--status-warning-surface:var(--color-warning-surface);--status-warning-border:var(--color-warning-border);--status-warning-on:var(--color-warning-on);--status-danger:var(--color-critical);--status-danger-strong:var(--color-critical-strong);--status-danger-surface:var(--color-danger-surface);--status-danger-border:var(--color-danger-border);--status-danger-on:var(--color-danger-on);--status-private:var(--color-private);--status-private-strong:var(--color-private-strong);--status-private-surface:var(--color-private-surface);--status-private-border:var(--color-private-border);--status-private-on:var(--color-private-on);--status-neutral:var(--color-muted);--status-neutral-strong:var(--color-muted-strong);--status-neutral-surface:var(--color-neutral-surface);--status-neutral-border:var(--color-neutral-border);--status-neutral-on:var(--color-neutral-on);--scrollbar-width:0.5rem;--scrollbar-track:var(--color-white-soft);--scrollbar-thumb:var(--color-white-softer);--scrollbar-thumb-hover:var(--color-white-softest);--z-app-header:40;--z-overlay-nav:60;--z-overlay-floating:70;--z-overlay-popover:140;--z-overlay-toast:180;--z-sidebar-overlay:10;--z-sidebar:20;--z-modal-root:100;--z-modal-overlay:110;--z-modal-content:120;--z-modal-player:130;--z-modal-top-root:140;--z-modal-top-overlay:150;--z-modal-top-content:160;--z-modal-peak-root:165;--z-modal-peak-overlay:175;--z-modal-peak-content:185;--overlay-backdrop-color:var(--color-overlay-backdrop);--overlay-backdrop-blur:12px;--sidebar-width-expanded-base:16rem;--sidebar-dropup-content-width:0px;--sidebar-width-expanded:max(var(--sidebar-width-expanded-base),var(--sidebar-dropup-content-width));--sidebar-width-collapsed:4rem;--sidebar-width:var(--sidebar-width-expanded);--sidebar-control-size:2.75rem;--sidebar-content-gap:1rem;--space-sidebar-shell-inline:var(--space-lg);--space-sidebar-shell-block-start:var(--space-sm);--space-sidebar-shell-block-end:1.75rem;--space-sidebar-scroll-gap:1.75rem;--space-sidebar-panel-gap:1.35rem;--space-sidebar-panel-padding-block:1.35rem;--space-sidebar-panel-padding-inline:1.1rem;--space-sidebar-footer-gap:0.85rem;--space-sidebar-trigger-padding-block:0.78rem;--space-sidebar-popover-offset:0.85rem;--space-sidebar-popover-padding-block:0.85rem;--space-sidebar-popover-padding-inline:0.65rem;--space-sidebar-popover-gap:0.45rem;--space-sidebar-dropup-scroll-reserve:calc(var(--scrollbar-thin-width) + var(--space-sm) + var(--space-2xs));--sidebar-dropup-max-height:18rem;--space-sidebar-nav-padding-block:0.7rem;--space-sidebar-nav-padding-inline-start:var(--space-xs);--space-sidebar-nav-padding-inline-end:calc(var(--space-lg) + var(--space-2xs));--space-sidebar-subnav-padding-block:0.55rem;--space-sidebar-nav-translate:0.35rem;--grid-card-min-width:20rem;--breakpoint-lg:64rem;--popover-backdrop-blur:12px;--overlay-panel-radius:var(--radius-lg);--overlay-panel-shadow:var(--shadow-lg);--overlay-panel-padding-inline:var(--popup-padding-inline);--overlay-panel-padding-block:var(--popup-padding-block);--toast-translate:-1.5rem;--sidebar-mobile-gutter:3rem;--popup-padding-inline:1rem;--popup-padding-block:0.75rem;--video-modal-primary-fr:1.85fr;--video-modal-secondary-min:320px;--video-modal-secondary-max:35rem;--video-modal-secondary-fr:1fr;--video-modal-layout-max:calc(var(--layout-player-max-width) + var(--video-modal-secondary-max) + var(--space-2xl-plus));--revert-modal-sidebar-min:240px;--revert-modal-sidebar-width:280px;--popover-inline-safe-max:calc(100vw - var(--space-xl));--progress-height-sm:0.25rem;--progress-height-md:0.5rem;--progress-radius:var(--radius-full);--progress-track-color:var(--color-border-subtle);--progress-fill-color:var(--color-info);--progress-transition-duration:var(--motion-duration-fast);--progress-transition-ease:var(--motion-ease-out);--space-4xs:0.0625rem;--space-3xs:0.125rem;--space-2xs:0.25rem;--space-xs:0.5rem;--space-xs-snug:0.4rem;--space-sm:0.75rem;--space-md:1rem;--space-md-plus:1.25rem;--space-lg:1.5rem;--space-xl:2rem;--space-xl-compact:2.25rem;--space-xl-plus:2.5rem;--space-2xl:3rem;--space-2xl-plus:3.5rem;--size-2px:2px;--size-3px:3px;--size-12px:12px;--size-24px:24px;--size-30px:30px;--size-32px:32px;--size-64px:64px;--size-128px:128px;--size-140px:140px;--size-168px:168px;--size-256px:256px;--size-5-75rem:5.75rem;--size-6rem:6rem;--size-7rem:7rem;--size-8rem:8rem;--size-12rem:12rem;--size-12-5rem:12.5rem;--size-14rem:14rem;--size-28rem:28rem;--size-34rem:34rem;--size-45rem:45rem;--radius-sm:0.25rem;--radius-md:0.5rem;--radius-lg:0.75rem;--radius-xl:1rem;--radius-full:9999px;--radius-modal-xl:1.75rem;--radius-sidebar-shell:1.5rem;--radius-sidebar-panel:1.1rem;--radius-sidebar-nav:0.95rem;--radius-toggle-thumb:0.5625rem;--menu-min-width:12rem;--header-search-max-inline:var(--size-34rem);--modal-max-width:62.5rem;--modal-sheet-inline-max:var(--modal-max-width);--modal-shell-max-height:90vh;--modal-sheet-max-height:92vh;--modal-body-max-height:calc(92vh - 4rem);--player-modal-module-scroll-min-height:var(--size-14rem);--player-modal-module-scroll-max-height:var(--size-28rem);--modal-pane-max-height:48vh;--modal-pane-min-height:20rem;--moderation-badge-max-inline:var(--size-28rem);--notification-banner-max-inline:var(--size-28rem);--profile-modal-nav-min-width:max-content;--profile-modal-nav-max-width:max-content;--profile-modal-scrollbar-offset:var(--space-2xs);--modal-embed-height:80vh;--profile-history-max-height:26.25rem;--comment-avatar-size:var(--space-xl-plus);--comment-composer-min-height:var(--size-7rem);--video-modal-reaction-label-min-inline:var(--size-6rem);--video-modal-item-media-min:var(--size-5-75rem);--video-modal-item-media-max:var(--size-8rem);--video-card-compact-media-min:var(--size-8rem);--video-card-compact-media-max:var(--size-12-5rem);--similar-card-media-width:var(--size-168px);--similar-card-media-width-sm:var(--size-140px);--docs-popover-scroll-height:var(--size-45rem);--profile-modal-active-min-width:var(--size-12rem);--status-log-min-height:5rem;--layout-player-max-width:68.75rem;--layout-docs-max-width:92.5rem;--icon-size-sm:var(--font-size-lg);--icon-size-md:var(--space-md-plus);--icon-size-lg:var(--space-xl-plus);--avatar-size-lg:var(--space-2xl-plus);--form-textarea-min-height:8rem;--scrollbar-thin-width:0.4rem;--modal-progress-height:calc(var(--space-3xs)*3);--video-modal-action-min-width:2.75rem;--outline-thick-width:0.1875rem;--icon-button-ring-width:var(--outline-thick-width);--form-select-icon-offset:var(--space-sm);--form-select-icon-gap:var(--space-xs-snug);--form-select-icon-hit-area:var(--space-xl-plus);--form-select-icon-size:0.6rem;--form-select-divider-width:var(--border-width-hairline);--form-checkbox-checkmark-offset:calc(var(--space-3xs)*-1);--breakpoint-edge-offset:0.02px;--offscreen-offset:-9999px;--motion-card-enter-translate:var(--space-xs);--motion-fade-in-translate:var(--space-md-plus);--motion-login-option-hover-translate:calc(var(--size-3px)*-1);--motion-video-card-hover-translate:-0.35rem;--motion-video-card-backdrop-translate:0.15rem;--shadow-sm:0 0.0625rem 0.125rem 0 var(--color-shadow-floating);--shadow-md:0 0.25rem 0.375rem -0.0625rem var(--color-shadow-floating);--shadow-lg:0 0.625rem 0.9375rem -0.1875rem var(--color-shadow-elevated);--shadow-badge-offset-y:var(--size-12px);--shadow-badge-blur:var(--size-30px);--shadow-notification-offset-y:var(--size-32px);--shadow-notification-blur:var(--size-64px);--shadow-modal:0 2.75rem 6rem -1.25rem var(--color-shadow-modal);--shadow-sidebar-shell:0 1.875rem 3.75rem -1.5rem var(--color-shadow-sidebar);--shadow-sidebar-accent:0 1.65rem 3.25rem -1.35rem var(--color-sidebar-glow);--shadow-sidebar-trigger:0 1.25rem 2.5rem -1.35rem var(--color-shadow-panel);--shadow-sidebar-dropup:0 1.75rem 3.25rem -1.45rem var(--color-sidebar-glow);--shadow-sidebar-panel:0 2.25rem 4.5rem -1.85rem var(--color-shadow-sidebar);--shadow-sidebar-focus-ring:0 0 0 0.125rem var(--color-sidebar-glow),0 0 0 0.25rem var(--color-sidebar-hover-strong);--shadow-popover-zap:0 22px 48px -18px var(--color-shadow-intense);--shadow-video-modal:0 1rem 2.25rem var(--color-shadow-elevated);--blur-video-card-backdrop-strong:var(--size-24px);--video-modal-ambient-blur-min:var(--size-128px);--video-modal-ambient-blur-max:var(--size-256px);--font-family-sans:"Inter","Segoe UI",system-ui,-apple-system,sans-serif;--font-family-mono:"Fira Code","SFMono-Regular",ui-monospace,monospace;--font-size-4xs:0.65rem;--font-size-3xs:0.6875rem;--font-size-2xs:0.7rem;--font-size-xs:0.75rem;--font-size-sm:0.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.5rem;--font-size-2xl:2rem;--font-size-xl-plus:1.875rem;--font-size-modal-title-base:1.25rem;--font-size-sidebar-nav:0.95rem;--font-size-sidebar-subnav:0.85rem;--font-size-sidebar-trigger:0.9rem;--link-underline-thickness:var(--size-2px);--line-height-tight:1.1;--line-height-snug:1.25;--line-height-base:1.5;--line-height-relaxed:1.75;--tracking-extra-wide:0.2em;--grid-border-width:calc(var(--space-2xs)/4);--grid-canvas-padding-top:var(--grid-border-width);--grid-viewport-min-height:calc(var(--space-xl) - var(--space-sm));--grid-cell-padding-block:var(--space-sm);--grid-cell-padding-inline:var(--space-md);--grid-header-font-size:var(--font-size-xs);--grid-header-letter-spacing:0.08em;--grid-overlay-margin:10%;--grid-overlay-padding-block:var(--space-md);--grid-overlay-padding-inline:var(--space-xl);--grid-overlay-radius:var(--radius-lg);--grid-overlay-font-size:var(--font-size-lg);--grid-overlay-text-opacity:0.66;--grid-resizer-width:calc(var(--space-2xs)*1.25);--grid-resize-overlay-width:var(--grid-border-width);--grid-sort-indicator-size:calc(var(--space-lg) - var(--space-2xs));--grid-sort-indicator-offset:var(--space-xs);--grid-sort-indicator-stroke:calc(var(--space-2xs)/2);--grid-sort-indicator-thickness:var(--grid-border-width);--notify-padding-block:var(--space-md);--notify-padding-inline:var(--space-2xl);--notify-font-size:var(--font-size-base);--notify-dismiss-size:calc(var(--space-xl) + var(--space-xs));--notify-dismiss-size-compact:calc(var(--space-lg) + var(--space-2xs));--notify-dismiss-font-size:var(--font-size-sm);--notify-dismiss-radius:var(--radius-full);--notify-dismiss-color:var(--color-subtle);--notify-dismiss-background:var(--color-overlay-panel);--notify-dismiss-background-hover:var(--color-overlay-panel-soft);--z-notify:1200;--motion-duration-fast:120ms;--motion-duration-base:160ms;--motion-duration-slow:280ms;--motion-ease-out:cubic-bezier(0.16,1,0.3,1);--motion-ease-in-out:cubic-bezier(0.4,0,0.2,1);--modal-motion-duration:var(--motion-duration-base)}:root[data-theme=light]{--color-page:#f7f8fc;--color-page-alt:#f2f4f8;--color-surface:#fff;--color-surface-alt:#f8fafc;--color-bg:var(--color-surface);--color-card:#fff;--color-card-private:#f3ecff;--color-card-critical:#ffecee;--color-panel:#fcfdff;--color-panel-hover:#eff2f9;--color-border:#d2dbec;--color-border-subtle:#e5eaf2;--color-accent:#6366f1;--color-accent-strong:#4f46e5;--color-accent-pressed:#4338ca;--color-accent-override:#540011;--color-accent-strong-override:#fe0032;--color-accent-pressed-override:#a90021;--color-primary:var(--color-accent-strong);--color-secondary:var(--color-accent);--color-logo-accent:var(--color-accent-strong);--color-logo-wordmark:#28364d;--color-logo-wordmark-inverse:var(--color-white);--color-logo-background:#0f172a;--color-logo-background-inverse:var(--color-white);--color-info:#3b82f6;--color-info-strong:#2563eb;--color-info-pressed:#1d4ed8;--color-info-glass:rgba(59,130,246,.14);--color-info-border:rgba(59,130,246,.35);--color-info-on:#e3f2ff;--color-muted-strong:#475569;--color-text:#181f2c;--color-text-strong:#0c101a;--color-text-inverse:#fff;--color-text-muted:#667085;--color-muted:#8892a6;--color-muted-alt:#788296;--color-subtle-text:#8892a6;--color-subtle:#f3f5fa;--color-surface-sunken:#e8ebf4;--color-surface-muted:#ecf0f9;--color-critical:#dc3646;--color-critical-strong:#b92037;--color-danger-surface:#fce2e6;--color-danger-border:rgba(220,54,70,.35);--color-danger-on:#60121f;--color-warning:#eab308;--color-warning-strong:#ca8a04;--color-warning-surface:rgba(253,224,71,.35);--color-warning-border:rgba(234,179,8,.35);--color-warning-glass:rgba(253,224,71,.18);--color-warning-on:#5c3702;--color-success:#16a34a;--color-success-strong:#15803d;--color-success-surface:#defaec;--color-success-border:rgba(34,197,94,.3);--color-success-on:#125430;--color-private:#8b5cf6;--color-private-strong:#7c3aed;--color-private-surface:#ede9fe;--color-private-border:rgba(139,92,246,.32);--color-private-on:#4a1d96;--color-neutral-700:#475569;--color-neutral-600:#667085;--color-neutral-surface:#e8ecf4;--color-neutral-border:#cdd5e2;--color-neutral-on:#3e485c;--color-white:#fff;--color-black:#000;--color-overlay:rgba(15,23,42,.3);--color-overlay-black:rgba(15,23,42,.7);--color-overlay-muted:rgba(60,75,105,.18);--color-overlay-strong:rgba(15,23,42,.56);--color-overlay-darker:rgba(12,18,32,.68);--color-overlay-panel:rgba(248,250,255,.92);--color-overlay-panel-soft:rgba(244,247,255,.78);--color-overlay-panel-tint:rgba(146,170,211,.24);--color-overlay-panel-glass:hsla(0,0%,100%,.85);--color-overlay-panel-glass-soft:rgba(246,249,255,.7);--color-overlay-panel-gradient-start:hsla(0,0%,100%,.95);--color-overlay-panel-gradient-end:rgba(232,236,244,.92);--color-modal-backdrop:rgba(15,23,42,.28);--color-modal-surface:hsla(0,0%,100%,.94);--color-overlay-veil:rgba(103,112,133,.45);--color-overlay-banner-bottom:hsla(0,0%,100%,.6);--color-overlay-banner-transparent:hsla(0,0%,100%,0);--color-overlay-backdrop:rgba(15,23,42,.2);--scrollbar-track:color-mix(in srgb,var(--color-sidebar-border-strong) 40%,transparent);--scrollbar-thumb:color-mix(in srgb,var(--color-accent) 64%,transparent);--scrollbar-thumb-hover:color-mix(in srgb,var(--color-accent-strong) 76%,transparent);--color-sidebar-surface:hsla(0,0%,100%,.9);--color-sidebar-surface-alt:rgba(236,240,247,.72);--color-sidebar-border:rgba(184,194,212,.28);--color-sidebar-border-strong:rgba(148,163,184,.36);--color-sidebar-hover:color-mix(in srgb,var(--color-accent) 16%,transparent);--color-sidebar-hover-strong:color-mix(in srgb,var(--color-accent-strong) 24%,transparent);--color-sidebar-glow:color-mix(in srgb,var(--color-accent) 36%,transparent);--color-sidebar-accent-start:color-mix(in srgb,var(--color-accent-strong) 88%,transparent);--color-sidebar-accent-end:color-mix(in srgb,var(--color-accent) 82%,transparent);--color-sidebar-text-muted:var(--color-text-muted);--sidebar-icon-filter:brightness(0) saturate(100%);--color-surface-tint-subtle:rgba(15,23,42,.08);--color-border-translucent:rgba(148,163,184,.18);--color-border-translucent-strong:rgba(148,163,184,.22);--color-border-translucent-bright:rgba(148,163,184,.28);--color-border-translucent-stronger:rgba(148,163,184,.32);--color-border-translucent-strongest:rgba(148,163,184,.36);--color-border-translucent-glow:rgba(148,163,184,.45);--color-border-translucent-medium:rgba(148,163,184,.2);--color-border-neutral-soft:rgba(148,163,184,.25);--color-border-info-soft:rgba(59,130,246,.32);--color-border-sidebar-strong:rgba(102,112,133,.75);--color-ring-private:rgba(139,92,246,.5);--color-ring-private-hover:rgba(168,85,247,.6);--color-ring-critical:rgba(220,54,70,.35);--color-ring-critical-soft:rgba(220,54,70,.3);--color-ring-critical-hover:rgba(220,54,70,.4);--color-ring-critical-strong:rgba(220,54,70,.5);--color-ring-alert:rgba(239,68,68,.48);--color-gradient-visibility-start:rgba(99,102,241,.28);--color-gradient-visibility-end:rgba(129,140,248,.24);--color-white-soft:hsla(0,0%,100%,.08);--color-white-softer:hsla(0,0%,100%,.24);--color-white-softest:hsla(0,0%,100%,.32);--color-shadow-floating:rgba(15,23,42,.18);--color-shadow-elevated:rgba(15,23,42,.16);--color-shadow-panel:rgba(15,23,42,.12);--color-shadow-notification:rgba(15,23,42,.14);--color-shadow-intense:rgba(15,23,42,.22);--color-shadow-sidebar:rgba(15,23,42,.28);--color-shadow-modal:rgba(15,23,42,.28);--color-divider-strong:rgba(203,213,225,.6);--color-text-frosted-strong:rgba(40,54,77,.85);--color-text-frosted:rgba(61,74,98,.8);--color-text-frosted-soft:rgba(82,96,122,.72)}:root:not([data-theme]),:root[data-theme=dark]{--color-page:#060a12;--color-page-alt:#080c16;--color-surface:#0a0e1a;--color-surface-alt:#0e1422;--color-bg:var(--color-surface);--color-card:#121a2c;--color-card-private:#261c3e;--color-card-critical:#3a141c;--color-panel:#101828;--color-panel-hover:#182234;--color-border:#3d5070;--color-border-subtle:#26344c;--color-accent:#818cf8;--color-accent-strong:#6366f1;--color-accent-pressed:#4f46e5;--color-accent-override:#540011;--color-accent-strong-override:#fe0032;--color-accent-pressed-override:#a90021;--color-primary:var(--color-accent-strong);--color-secondary:#38bdf8;--color-logo-accent:var(--color-accent-strong);--color-logo-wordmark:#c6cfde;--color-logo-wordmark-inverse:var(--color-white);--color-logo-background:#0c121e;--color-logo-background-inverse:var(--color-white);--color-info:#60a5fa;--color-info-strong:#3884ff;--color-info-pressed:#2563eb;--color-info-glass:rgba(56,132,255,.22);--color-info-border:rgba(96,165,250,.42);--color-info-on:#ebf4ff;--color-muted-strong:#ced7e8;--color-text:#e2e8f0;--color-text-strong:#f4f7ff;--color-text-inverse:#0c121e;--color-text-muted:#a5b3c9;--color-muted:#94a3b8;--color-muted-alt:#808ba2;--color-subtle-text:#a8b4cd;--color-subtle:#1c263a;--color-surface-sunken:rgba(13,19,32,.92);--color-surface-muted:rgba(18,26,44,.82);--color-critical:#ef5362;--color-critical-strong:#dc2626;--color-danger-surface:rgba(220,38,38,.28);--color-danger-border:rgba(220,38,38,.45);--color-danger-on:#ffe4e9;--color-warning:#facc15;--color-warning-strong:#eab308;--color-warning-surface:rgba(253,224,71,.22);--color-warning-border:rgba(250,204,21,.42);--color-warning-glass:rgba(253,224,71,.2);--color-warning-on:#1a1200;--color-success:#22c55e;--color-success-strong:#16a34a;--color-success-surface:rgba(22,163,74,.24);--color-success-border:rgba(34,197,94,.45);--color-success-on:#d2fce4;--color-private:#a855f7;--color-private-strong:#8b5cf6;--color-private-surface:rgba(124,58,237,.26);--color-private-border:rgba(168,85,247,.45);--color-private-on:#efe6ff;--color-neutral-700:#3a4b6e;--color-neutral-600:#5a6985;--color-neutral-surface:rgba(99,114,144,.24);--color-neutral-border:rgba(99,114,144,.35);--color-neutral-on:#d2dcee;--color-white:#fff;--color-black:#000;--color-overlay:rgba(8,11,20,.72);--color-overlay-black:rgba(0,0,0,.88);--color-overlay-muted:rgba(12,18,30,.6);--color-overlay-strong:rgba(8,12,24,.82);--color-overlay-darker:rgba(5,8,16,.9);--color-overlay-panel:rgba(14,20,34,.92);--color-overlay-panel-soft:rgba(18,26,42,.78);--color-overlay-panel-tint:rgba(56,93,160,.36);--color-overlay-panel-glass:rgba(14,24,42,.86);--color-overlay-panel-glass-soft:rgba(16,28,48,.72);--color-overlay-panel-gradient-start:rgba(18,26,44,.92);--color-overlay-panel-gradient-end:rgba(10,16,30,.92);--color-modal-backdrop:rgba(5,8,14,.68);--color-modal-surface:rgba(14,22,38,.88);--color-overlay-veil:rgba(4,6,12,.94);--color-overlay-banner-bottom:rgba(0,0,0,.6);--color-overlay-banner-transparent:transparent;--color-overlay-backdrop:rgba(5,8,14,.75);--scrollbar-track:color-mix(in srgb,var(--color-sidebar-surface-alt) 54%,transparent);--scrollbar-thumb:color-mix(in srgb,var(--color-accent) 72%,transparent);--scrollbar-thumb-hover:color-mix(in srgb,var(--color-accent-strong) 84%,transparent);--color-sidebar-surface:rgba(12,18,30,.94);--color-sidebar-surface-alt:rgba(10,18,32,.8);--color-sidebar-border:rgba(86,106,142,.26);--color-sidebar-border-strong:rgba(112,133,170,.42);--color-sidebar-hover:color-mix(in srgb,var(--color-accent) 22%,transparent);--color-sidebar-hover-strong:color-mix(in srgb,var(--color-accent-strong) 32%,transparent);--color-sidebar-glow:color-mix(in srgb,var(--color-accent) 42%,transparent);--color-sidebar-accent-start:color-mix(in srgb,var(--color-accent) 92%,transparent);--color-sidebar-accent-end:color-mix(in srgb,var(--color-accent-strong) 88%,transparent);--color-sidebar-text-muted:var(--color-text-muted);--sidebar-icon-filter:brightness(0) invert(1);--color-surface-tint-subtle:rgba(94,113,161,.12);--color-border-translucent:rgba(99,114,144,.22);--color-border-translucent-strong:rgba(110,130,170,.28);--color-border-translucent-bright:rgba(148,163,184,.35);--color-border-translucent-stronger:rgba(148,163,184,.38);--color-border-translucent-strongest:rgba(198,207,222,.45);--color-border-translucent-glow:rgba(129,140,248,.55);--color-border-translucent-medium:rgba(99,114,144,.28);--color-border-neutral-soft:rgba(99,114,144,.3);--color-border-info-soft:rgba(96,165,250,.35);--color-border-sidebar-strong:rgba(32,46,68,.88);--color-ring-private:rgba(168,85,247,.55);--color-ring-private-hover:rgba(192,132,252,.65);--color-ring-critical:rgba(239,83,98,.42);--color-ring-critical-soft:rgba(239,83,98,.35);--color-ring-critical-hover:rgba(239,83,98,.5);--color-ring-critical-strong:rgba(220,38,38,.6);--color-ring-alert:rgba(220,38,38,.6);--color-gradient-visibility-start:rgba(129,140,248,.4);--color-gradient-visibility-end:rgba(192,132,252,.32);--color-white-soft:hsla(0,0%,100%,.1);--color-white-softer:hsla(0,0%,100%,.3);--color-white-softest:hsla(0,0%,100%,.4);--color-shadow-floating:rgba(8,11,30,.55);--color-shadow-elevated:rgba(8,11,30,.45);--color-shadow-panel:rgba(15,23,42,.35);--color-shadow-notification:rgba(15,23,42,.3);--color-shadow-intense:rgba(250,204,21,.48);--color-shadow-sidebar:rgba(0,0,0,.45);--color-shadow-modal:rgba(8,11,30,.55);--color-divider-strong:rgba(15,23,42,.35);--color-text-frosted-strong:rgba(226,232,240,.94);--color-text-frosted:rgba(226,232,240,.9);--color-text-frosted-soft:rgba(226,232,240,.82)}*,:after,:before{--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:rgba(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:rgba(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: }
+ );--surface-overlay-panel:var(--color-overlay-panel);--surface-overlay-panel-soft:var(--color-overlay-panel-soft);--surface-overlay-panel-tint:var(--color-overlay-panel-tint);--surface-overlay-panel-glass:var(--color-overlay-panel-glass);--surface-overlay-panel-glass-soft:var(--color-overlay-panel-glass-soft);--surface-modal-backdrop:var(--color-modal-backdrop);--surface-modal:var(--color-modal-surface);--blur-modal-backdrop:18px;--blur-modal-alert:14px;--blur-thumbnail-blur:18px;--modal-nav-backdrop-blur:6px;--app-header-centerline-offset:calc(var(--space-sm) + var(--space-2xl-plus)/2);--border-default:var(--color-border);--border-subtle:var(--color-border-subtle);--border-strong:var(--color-border-translucent-stronger);--border-overlay:var(--color-border-translucent);--border-overlay-strong:var(--color-border-translucent-strongest);--border-overlay-glow:var(--color-border-translucent-glow);--border-neutral-soft:var(--color-border-neutral-soft);--border-info-soft:var(--color-border-info-soft);--border-sidebar-strong:var(--color-border-sidebar-strong);--border-width-hairline:1px;--border-width-fine:0.5px;--text-primary:var(--color-text);--text-inverse:var(--color-text-inverse);--text-muted:var(--color-text-muted);--text-muted-strong:var(--color-muted-strong);--text-subtle:var(--color-subtle-text);--text-frosted-primary:var(--color-text-frosted);--text-frosted-strong:var(--color-text-frosted-strong);--text-frosted-soft:var(--color-text-frosted-soft);--status-info:var(--color-info);--status-info-strong:var(--color-info-strong);--status-info-surface:var(--color-info-glass);--status-info-border:var(--color-info-border);--status-info-on:var(--color-info-on);--status-success:var(--color-success);--status-success-strong:var(--color-success-strong);--status-success-surface:var(--color-success-surface);--status-success-border:var(--color-success-border);--status-success-on:var(--color-success-on);--status-warning:var(--color-warning);--status-warning-strong:var(--color-warning-strong);--status-warning-surface:var(--color-warning-surface);--status-warning-border:var(--color-warning-border);--status-warning-on:var(--color-warning-on);--status-danger:var(--color-critical);--status-danger-strong:var(--color-critical-strong);--status-danger-surface:var(--color-danger-surface);--status-danger-border:var(--color-danger-border);--status-danger-on:var(--color-danger-on);--status-private:var(--color-private);--status-private-strong:var(--color-private-strong);--status-private-surface:var(--color-private-surface);--status-private-border:var(--color-private-border);--status-private-on:var(--color-private-on);--status-neutral:var(--color-muted);--status-neutral-strong:var(--color-muted-strong);--status-neutral-surface:var(--color-neutral-surface);--status-neutral-border:var(--color-neutral-border);--status-neutral-on:var(--color-neutral-on);--message-bubble-background:var(--surface-sunken);--message-bubble-border:var(--border-subtle);--message-bubble-text:var(--text-primary);--message-bubble-meta:var(--text-muted);--message-bubble-outgoing-background:var(--surface-overlay-panel);--message-bubble-outgoing-border:var(--border-overlay);--unread-badge-background:var(--status-info-strong);--unread-badge-text:var(--text-inverse);--reply-highlight-background:var(--status-info-surface);--reply-highlight-border:var(--status-info-border);--reply-highlight-text:var(--status-info-on);--reply-highlight-icon:var(--status-info-on);--notification-banner-accent:var(--color-accent-strong);--notification-banner-accent-strong:var(--color-accent);--notification-banner-border:var(--surface-overlay-panel-tint);--notification-banner-background:var(--surface-overlay-panel);--notification-banner-text:var(--text-primary);--notification-banner-icon:var(--text-primary);--notification-banner-critical-accent:var(--status-danger-strong);--notification-banner-critical-accent-strong:var(--status-danger);--notification-banner-critical-border:var(--color-ring-critical-soft);--notification-banner-critical-background:var(--surface-raised-critical);--notification-banner-critical-text:var(--status-danger-on);--notification-banner-success-accent:var(--status-success-strong);--notification-banner-success-accent-strong:var(--status-success);--notification-banner-success-border:var(--status-success-border);--notification-banner-success-background:var(--status-success-surface);--notification-banner-success-text:var(--status-success-on);--notification-banner-info-accent:var(--status-info-strong);--notification-banner-info-accent-strong:var(--status-info);--notification-banner-info-border:var(--status-info-border);--notification-banner-info-background:var(--status-info-surface);--notification-banner-info-text:var(--status-info-on);--notification-banner-warning-accent:var(--status-warning-strong);--notification-banner-warning-accent-strong:var(--status-warning);--notification-banner-warning-border:var(--status-warning-border);--notification-banner-warning-background:var(--status-warning-surface);--notification-banner-warning-text:var(--status-warning-on);--scrollbar-width:0.5rem;--scrollbar-track:var(--color-white-soft);--scrollbar-thumb:var(--color-white-softer);--scrollbar-thumb-hover:var(--color-white-softest);--z-app-header:40;--z-overlay-nav:60;--z-overlay-floating:70;--z-overlay-popover:140;--z-overlay-toast:180;--z-sidebar-overlay:10;--z-sidebar:20;--z-modal-root:100;--z-modal-overlay:110;--z-modal-content:120;--z-modal-player:130;--z-modal-top-root:140;--z-modal-top-overlay:150;--z-modal-top-content:160;--z-modal-peak-root:165;--z-modal-peak-overlay:175;--z-modal-peak-content:185;--overlay-backdrop-color:var(--color-overlay-backdrop);--overlay-backdrop-blur:12px;--sidebar-width-expanded-base:16rem;--sidebar-dropup-content-width:0px;--sidebar-width-expanded:max(var(--sidebar-width-expanded-base),var(--sidebar-dropup-content-width));--sidebar-width-collapsed:4rem;--sidebar-width:var(--sidebar-width-expanded);--sidebar-control-size:2.75rem;--sidebar-content-gap:1rem;--space-sidebar-shell-inline:var(--space-lg);--space-sidebar-shell-block-start:var(--space-sm);--space-sidebar-shell-block-end:1.75rem;--space-sidebar-scroll-gap:1.75rem;--space-sidebar-panel-gap:1.35rem;--space-sidebar-panel-padding-block:1.35rem;--space-sidebar-panel-padding-inline:1.1rem;--space-sidebar-footer-gap:0.85rem;--space-sidebar-trigger-padding-block:0.78rem;--space-sidebar-popover-offset:0.85rem;--space-sidebar-popover-padding-block:0.85rem;--space-sidebar-popover-padding-inline:0.65rem;--space-sidebar-popover-gap:0.45rem;--space-sidebar-dropup-scroll-reserve:calc(var(--scrollbar-thin-width) + var(--space-sm) + var(--space-2xs));--sidebar-dropup-max-height:18rem;--space-sidebar-nav-padding-block:0.7rem;--space-sidebar-nav-padding-inline-start:var(--space-xs);--space-sidebar-nav-padding-inline-end:calc(var(--space-lg) + var(--space-2xs));--space-sidebar-subnav-padding-block:0.55rem;--space-sidebar-nav-translate:0.35rem;--grid-card-min-width:20rem;--breakpoint-lg:64rem;--popover-backdrop-blur:12px;--overlay-panel-radius:var(--radius-lg);--overlay-panel-shadow:var(--shadow-lg);--overlay-panel-padding-inline:var(--popup-padding-inline);--overlay-panel-padding-block:var(--popup-padding-block);--toast-translate:-1.5rem;--sidebar-mobile-gutter:3rem;--popup-padding-inline:1rem;--popup-padding-block:0.75rem;--video-modal-primary-fr:1.85fr;--video-modal-secondary-min:320px;--video-modal-secondary-max:35rem;--video-modal-secondary-fr:1fr;--video-modal-layout-max:calc(var(--layout-player-max-width) + var(--video-modal-secondary-max) + var(--space-2xl-plus));--revert-modal-sidebar-min:240px;--revert-modal-sidebar-width:280px;--popover-inline-safe-max:calc(100vw - var(--space-xl));--progress-height-sm:0.25rem;--progress-height-md:0.5rem;--progress-radius:var(--radius-full);--progress-track-color:var(--color-border-subtle);--progress-fill-color:var(--color-info);--progress-transition-duration:var(--motion-duration-fast);--progress-transition-ease:var(--motion-ease-out);--space-4xs:0.0625rem;--space-3xs:0.125rem;--space-2xs:0.25rem;--space-xs:0.5rem;--space-xs-snug:0.4rem;--space-sm:0.75rem;--space-md:1rem;--space-md-plus:1.25rem;--space-lg:1.5rem;--space-xl:2rem;--space-xl-compact:2.25rem;--space-xl-plus:2.5rem;--space-2xl:3rem;--space-2xl-plus:3.5rem;--size-2px:2px;--size-3px:3px;--size-12px:12px;--size-24px:24px;--size-30px:30px;--size-32px:32px;--size-64px:64px;--size-128px:128px;--size-140px:140px;--size-168px:168px;--size-256px:256px;--size-5-75rem:5.75rem;--size-6rem:6rem;--size-7rem:7rem;--size-8rem:8rem;--size-12rem:12rem;--size-12-5rem:12.5rem;--size-14rem:14rem;--size-28rem:28rem;--size-34rem:34rem;--size-45rem:45rem;--radius-sm:0.25rem;--radius-md:0.5rem;--radius-lg:0.75rem;--radius-xl:1rem;--radius-full:9999px;--radius-modal-xl:1.75rem;--radius-sidebar-shell:1.5rem;--radius-sidebar-panel:1.1rem;--radius-sidebar-nav:0.95rem;--radius-toggle-thumb:0.5625rem;--menu-min-width:12rem;--header-search-max-inline:var(--size-34rem);--modal-max-width:62.5rem;--modal-sheet-inline-max:var(--modal-max-width);--modal-shell-max-height:90vh;--modal-sheet-max-height:92vh;--modal-body-max-height:calc(92vh - 4rem);--player-modal-module-scroll-min-height:var(--size-14rem);--player-modal-module-scroll-max-height:var(--size-28rem);--modal-pane-max-height:48vh;--modal-pane-min-height:20rem;--moderation-badge-max-inline:var(--size-28rem);--notification-banner-max-inline:var(--size-28rem);--profile-modal-nav-min-width:max-content;--profile-modal-nav-max-width:max-content;--profile-modal-scrollbar-offset:var(--space-2xs);--modal-embed-height:80vh;--profile-history-max-height:26.25rem;--comment-avatar-size:var(--space-xl-plus);--comment-composer-min-height:var(--size-7rem);--video-modal-reaction-label-min-inline:var(--size-6rem);--video-modal-item-media-min:var(--size-5-75rem);--video-modal-item-media-max:var(--size-8rem);--video-card-compact-media-min:var(--size-8rem);--video-card-compact-media-max:var(--size-12-5rem);--similar-card-media-width:var(--size-168px);--similar-card-media-width-sm:var(--size-140px);--docs-popover-scroll-height:var(--size-45rem);--profile-modal-active-min-width:var(--size-12rem);--status-log-min-height:5rem;--layout-player-max-width:68.75rem;--layout-docs-max-width:92.5rem;--icon-size-sm:var(--font-size-lg);--icon-size-md:var(--space-md-plus);--icon-size-lg:var(--space-xl-plus);--avatar-size-lg:var(--space-2xl-plus);--form-textarea-min-height:8rem;--scrollbar-thin-width:0.4rem;--modal-progress-height:calc(var(--space-3xs)*3);--video-modal-action-min-width:2.75rem;--outline-thick-width:0.1875rem;--icon-button-ring-width:var(--outline-thick-width);--form-select-icon-offset:var(--space-sm);--form-select-icon-gap:var(--space-xs-snug);--form-select-icon-hit-area:var(--space-xl-plus);--form-select-icon-size:0.6rem;--form-select-divider-width:var(--border-width-hairline);--form-checkbox-checkmark-offset:calc(var(--space-3xs)*-1);--breakpoint-edge-offset:0.02px;--offscreen-offset:-9999px;--motion-card-enter-translate:var(--space-xs);--motion-fade-in-translate:var(--space-md-plus);--motion-login-option-hover-translate:calc(var(--size-3px)*-1);--motion-video-card-hover-translate:-0.35rem;--motion-video-card-backdrop-translate:0.15rem;--shadow-sm:0 0.0625rem 0.125rem 0 var(--color-shadow-floating);--shadow-md:0 0.25rem 0.375rem -0.0625rem var(--color-shadow-floating);--shadow-lg:0 0.625rem 0.9375rem -0.1875rem var(--color-shadow-elevated);--shadow-badge-offset-y:var(--size-12px);--shadow-badge-blur:var(--size-30px);--shadow-notification-offset-y:var(--size-32px);--shadow-notification-blur:var(--size-64px);--shadow-modal:0 2.75rem 6rem -1.25rem var(--color-shadow-modal);--shadow-sidebar-shell:0 1.875rem 3.75rem -1.5rem var(--color-shadow-sidebar);--shadow-sidebar-accent:0 1.65rem 3.25rem -1.35rem var(--color-sidebar-glow);--shadow-sidebar-trigger:0 1.25rem 2.5rem -1.35rem var(--color-shadow-panel);--shadow-sidebar-dropup:0 1.75rem 3.25rem -1.45rem var(--color-sidebar-glow);--shadow-sidebar-panel:0 2.25rem 4.5rem -1.85rem var(--color-shadow-sidebar);--shadow-sidebar-focus-ring:0 0 0 0.125rem var(--color-sidebar-glow),0 0 0 0.25rem var(--color-sidebar-hover-strong);--shadow-popover-zap:0 22px 48px -18px var(--color-shadow-intense);--shadow-video-modal:0 1rem 2.25rem var(--color-shadow-elevated);--blur-video-card-backdrop-strong:var(--size-24px);--video-modal-ambient-blur-min:var(--size-128px);--video-modal-ambient-blur-max:var(--size-256px);--font-family-sans:"Inter","Segoe UI",system-ui,-apple-system,sans-serif;--font-family-mono:"Fira Code","SFMono-Regular",ui-monospace,monospace;--font-size-4xs:0.65rem;--font-size-3xs:0.6875rem;--font-size-2xs:0.7rem;--font-size-xs:0.75rem;--font-size-sm:0.875rem;--font-size-base:1rem;--font-size-lg:1.125rem;--font-size-xl:1.5rem;--font-size-2xl:2rem;--font-size-xl-plus:1.875rem;--font-size-modal-title-base:1.25rem;--font-size-sidebar-nav:0.95rem;--font-size-sidebar-subnav:0.85rem;--font-size-sidebar-trigger:0.9rem;--link-underline-thickness:var(--size-2px);--line-height-tight:1.1;--line-height-snug:1.25;--line-height-base:1.5;--line-height-relaxed:1.75;--tracking-extra-wide:0.2em;--grid-border-width:calc(var(--space-2xs)/4);--grid-canvas-padding-top:var(--grid-border-width);--grid-viewport-min-height:calc(var(--space-xl) - var(--space-sm));--grid-cell-padding-block:var(--space-sm);--grid-cell-padding-inline:var(--space-md);--grid-header-font-size:var(--font-size-xs);--grid-header-letter-spacing:0.08em;--grid-overlay-margin:10%;--grid-overlay-padding-block:var(--space-md);--grid-overlay-padding-inline:var(--space-xl);--grid-overlay-radius:var(--radius-lg);--grid-overlay-font-size:var(--font-size-lg);--grid-overlay-text-opacity:0.66;--grid-resizer-width:calc(var(--space-2xs)*1.25);--grid-resize-overlay-width:var(--grid-border-width);--grid-sort-indicator-size:calc(var(--space-lg) - var(--space-2xs));--grid-sort-indicator-offset:var(--space-xs);--grid-sort-indicator-stroke:calc(var(--space-2xs)/2);--grid-sort-indicator-thickness:var(--grid-border-width);--notify-padding-block:var(--space-md);--notify-padding-inline:var(--space-2xl);--notify-font-size:var(--font-size-base);--notify-dismiss-size:calc(var(--space-xl) + var(--space-xs));--notify-dismiss-size-compact:calc(var(--space-lg) + var(--space-2xs));--notify-dismiss-font-size:var(--font-size-sm);--notify-dismiss-radius:var(--radius-full);--notify-dismiss-color:var(--color-subtle);--notify-dismiss-background:var(--color-overlay-panel);--notify-dismiss-background-hover:var(--color-overlay-panel-soft);--z-notify:1200;--motion-duration-fast:120ms;--motion-duration-base:160ms;--motion-duration-slow:280ms;--motion-ease-out:cubic-bezier(0.16,1,0.3,1);--motion-ease-in-out:cubic-bezier(0.4,0,0.2,1);--modal-motion-duration:var(--motion-duration-base)}:root[data-theme=light]{--color-page:#f7f8fc;--color-page-alt:#f2f4f8;--color-surface:#fff;--color-surface-alt:#f8fafc;--color-bg:var(--color-surface);--color-card:#fff;--color-card-private:#f3ecff;--color-card-critical:#ffecee;--color-panel:#fcfdff;--color-panel-hover:#eff2f9;--color-border:#d2dbec;--color-border-subtle:#e5eaf2;--color-accent:#6366f1;--color-accent-strong:#4f46e5;--color-accent-pressed:#4338ca;--color-accent-override:#540011;--color-accent-strong-override:#fe0032;--color-accent-pressed-override:#a90021;--color-primary:var(--color-accent-strong);--color-secondary:var(--color-accent);--color-logo-accent:var(--color-accent-strong);--color-logo-wordmark:#28364d;--color-logo-wordmark-inverse:var(--color-white);--color-logo-background:#0f172a;--color-logo-background-inverse:var(--color-white);--color-info:#3b82f6;--color-info-strong:#2563eb;--color-info-pressed:#1d4ed8;--color-info-glass:rgba(59,130,246,.14);--color-info-border:rgba(59,130,246,.35);--color-info-on:#e3f2ff;--color-muted-strong:#475569;--color-text:#181f2c;--color-text-strong:#0c101a;--color-text-inverse:#fff;--color-text-muted:#667085;--color-muted:#8892a6;--color-muted-alt:#788296;--color-subtle-text:#8892a6;--color-subtle:#f3f5fa;--color-surface-sunken:#e8ebf4;--color-surface-muted:#ecf0f9;--color-critical:#dc3646;--color-critical-strong:#b92037;--color-danger-surface:#fce2e6;--color-danger-border:rgba(220,54,70,.35);--color-danger-on:#60121f;--color-warning:#eab308;--color-warning-strong:#ca8a04;--color-warning-surface:rgba(253,224,71,.35);--color-warning-border:rgba(234,179,8,.35);--color-warning-glass:rgba(253,224,71,.18);--color-warning-on:#5c3702;--color-success:#16a34a;--color-success-strong:#15803d;--color-success-surface:#defaec;--color-success-border:rgba(34,197,94,.3);--color-success-on:#125430;--color-private:#8b5cf6;--color-private-strong:#7c3aed;--color-private-surface:#ede9fe;--color-private-border:rgba(139,92,246,.32);--color-private-on:#4a1d96;--color-neutral-700:#475569;--color-neutral-600:#667085;--color-neutral-surface:#e8ecf4;--color-neutral-border:#cdd5e2;--color-neutral-on:#3e485c;--color-white:#fff;--color-black:#000;--color-overlay:rgba(15,23,42,.3);--color-overlay-black:rgba(15,23,42,.7);--color-overlay-muted:rgba(60,75,105,.18);--color-overlay-strong:rgba(15,23,42,.56);--color-overlay-darker:rgba(12,18,32,.68);--color-overlay-panel:rgba(248,250,255,.92);--color-overlay-panel-soft:rgba(244,247,255,.78);--color-overlay-panel-tint:rgba(146,170,211,.24);--color-overlay-panel-glass:hsla(0,0%,100%,.85);--color-overlay-panel-glass-soft:rgba(246,249,255,.7);--color-overlay-panel-gradient-start:hsla(0,0%,100%,.95);--color-overlay-panel-gradient-end:rgba(232,236,244,.92);--color-modal-backdrop:rgba(15,23,42,.28);--color-modal-surface:hsla(0,0%,100%,.94);--color-overlay-veil:rgba(103,112,133,.45);--color-overlay-banner-bottom:hsla(0,0%,100%,.6);--color-overlay-banner-transparent:hsla(0,0%,100%,0);--color-overlay-backdrop:rgba(15,23,42,.2);--scrollbar-track:color-mix(in srgb,var(--color-sidebar-border-strong) 40%,transparent);--scrollbar-thumb:color-mix(in srgb,var(--color-accent) 64%,transparent);--scrollbar-thumb-hover:color-mix(in srgb,var(--color-accent-strong) 76%,transparent);--color-sidebar-surface:hsla(0,0%,100%,.9);--color-sidebar-surface-alt:rgba(236,240,247,.72);--color-sidebar-border:rgba(184,194,212,.28);--color-sidebar-border-strong:rgba(148,163,184,.36);--color-sidebar-hover:color-mix(in srgb,var(--color-accent) 16%,transparent);--color-sidebar-hover-strong:color-mix(in srgb,var(--color-accent-strong) 24%,transparent);--color-sidebar-glow:color-mix(in srgb,var(--color-accent) 36%,transparent);--color-sidebar-accent-start:color-mix(in srgb,var(--color-accent-strong) 88%,transparent);--color-sidebar-accent-end:color-mix(in srgb,var(--color-accent) 82%,transparent);--color-sidebar-text-muted:var(--color-text-muted);--sidebar-icon-filter:brightness(0) saturate(100%);--color-surface-tint-subtle:rgba(15,23,42,.08);--color-border-translucent:rgba(148,163,184,.18);--color-border-translucent-strong:rgba(148,163,184,.22);--color-border-translucent-bright:rgba(148,163,184,.28);--color-border-translucent-stronger:rgba(148,163,184,.32);--color-border-translucent-strongest:rgba(148,163,184,.36);--color-border-translucent-glow:rgba(148,163,184,.45);--color-border-translucent-medium:rgba(148,163,184,.2);--color-border-neutral-soft:rgba(148,163,184,.25);--color-border-info-soft:rgba(59,130,246,.32);--color-border-sidebar-strong:rgba(102,112,133,.75);--color-ring-private:rgba(139,92,246,.5);--color-ring-private-hover:rgba(168,85,247,.6);--color-ring-critical:rgba(220,54,70,.35);--color-ring-critical-soft:rgba(220,54,70,.3);--color-ring-critical-hover:rgba(220,54,70,.4);--color-ring-critical-strong:rgba(220,54,70,.5);--color-ring-alert:rgba(239,68,68,.48);--color-gradient-visibility-start:rgba(99,102,241,.28);--color-gradient-visibility-end:rgba(129,140,248,.24);--color-white-soft:hsla(0,0%,100%,.08);--color-white-softer:hsla(0,0%,100%,.24);--color-white-softest:hsla(0,0%,100%,.32);--color-shadow-floating:rgba(15,23,42,.18);--color-shadow-elevated:rgba(15,23,42,.16);--color-shadow-panel:rgba(15,23,42,.12);--color-shadow-notification:rgba(15,23,42,.14);--color-shadow-intense:rgba(15,23,42,.22);--color-shadow-sidebar:rgba(15,23,42,.28);--color-shadow-modal:rgba(15,23,42,.28);--color-divider-strong:rgba(203,213,225,.6);--color-text-frosted-strong:rgba(40,54,77,.85);--color-text-frosted:rgba(61,74,98,.8);--color-text-frosted-soft:rgba(82,96,122,.72)}:root:not([data-theme]),:root[data-theme=dark]{--color-page:#060a12;--color-page-alt:#080c16;--color-surface:#0a0e1a;--color-surface-alt:#0e1422;--color-bg:var(--color-surface);--color-card:#121a2c;--color-card-private:#261c3e;--color-card-critical:#3a141c;--color-panel:#101828;--color-panel-hover:#182234;--color-border:#3d5070;--color-border-subtle:#26344c;--color-accent:#818cf8;--color-accent-strong:#6366f1;--color-accent-pressed:#4f46e5;--color-accent-override:#540011;--color-accent-strong-override:#fe0032;--color-accent-pressed-override:#a90021;--color-primary:var(--color-accent-strong);--color-secondary:#38bdf8;--color-logo-accent:var(--color-accent-strong);--color-logo-wordmark:#c6cfde;--color-logo-wordmark-inverse:var(--color-white);--color-logo-background:#0c121e;--color-logo-background-inverse:var(--color-white);--color-info:#60a5fa;--color-info-strong:#3884ff;--color-info-pressed:#2563eb;--color-info-glass:rgba(56,132,255,.22);--color-info-border:rgba(96,165,250,.42);--color-info-on:#ebf4ff;--color-muted-strong:#ced7e8;--color-text:#e2e8f0;--color-text-strong:#f4f7ff;--color-text-inverse:#0c121e;--color-text-muted:#a5b3c9;--color-muted:#94a3b8;--color-muted-alt:#808ba2;--color-subtle-text:#a8b4cd;--color-subtle:#1c263a;--color-surface-sunken:rgba(13,19,32,.92);--color-surface-muted:rgba(18,26,44,.82);--color-critical:#ef5362;--color-critical-strong:#dc2626;--color-danger-surface:rgba(220,38,38,.28);--color-danger-border:rgba(220,38,38,.45);--color-danger-on:#ffe4e9;--color-warning:#facc15;--color-warning-strong:#eab308;--color-warning-surface:rgba(253,224,71,.22);--color-warning-border:rgba(250,204,21,.42);--color-warning-glass:rgba(253,224,71,.2);--color-warning-on:#1a1200;--color-success:#22c55e;--color-success-strong:#16a34a;--color-success-surface:rgba(22,163,74,.24);--color-success-border:rgba(34,197,94,.45);--color-success-on:#d2fce4;--color-private:#a855f7;--color-private-strong:#8b5cf6;--color-private-surface:rgba(124,58,237,.26);--color-private-border:rgba(168,85,247,.45);--color-private-on:#efe6ff;--color-neutral-700:#3a4b6e;--color-neutral-600:#5a6985;--color-neutral-surface:rgba(99,114,144,.24);--color-neutral-border:rgba(99,114,144,.35);--color-neutral-on:#d2dcee;--color-white:#fff;--color-black:#000;--color-overlay:rgba(8,11,20,.72);--color-overlay-black:rgba(0,0,0,.88);--color-overlay-muted:rgba(12,18,30,.6);--color-overlay-strong:rgba(8,12,24,.82);--color-overlay-darker:rgba(5,8,16,.9);--color-overlay-panel:rgba(14,20,34,.92);--color-overlay-panel-soft:rgba(18,26,42,.78);--color-overlay-panel-tint:rgba(56,93,160,.36);--color-overlay-panel-glass:rgba(14,24,42,.86);--color-overlay-panel-glass-soft:rgba(16,28,48,.72);--color-overlay-panel-gradient-start:rgba(18,26,44,.92);--color-overlay-panel-gradient-end:rgba(10,16,30,.92);--color-modal-backdrop:rgba(5,8,14,.68);--color-modal-surface:rgba(14,22,38,.88);--color-overlay-veil:rgba(4,6,12,.94);--color-overlay-banner-bottom:rgba(0,0,0,.6);--color-overlay-banner-transparent:transparent;--color-overlay-backdrop:rgba(5,8,14,.75);--scrollbar-track:color-mix(in srgb,var(--color-sidebar-surface-alt) 54%,transparent);--scrollbar-thumb:color-mix(in srgb,var(--color-accent) 72%,transparent);--scrollbar-thumb-hover:color-mix(in srgb,var(--color-accent-strong) 84%,transparent);--color-sidebar-surface:rgba(12,18,30,.94);--color-sidebar-surface-alt:rgba(10,18,32,.8);--color-sidebar-border:rgba(86,106,142,.26);--color-sidebar-border-strong:rgba(112,133,170,.42);--color-sidebar-hover:color-mix(in srgb,var(--color-accent) 22%,transparent);--color-sidebar-hover-strong:color-mix(in srgb,var(--color-accent-strong) 32%,transparent);--color-sidebar-glow:color-mix(in srgb,var(--color-accent) 42%,transparent);--color-sidebar-accent-start:color-mix(in srgb,var(--color-accent) 92%,transparent);--color-sidebar-accent-end:color-mix(in srgb,var(--color-accent-strong) 88%,transparent);--color-sidebar-text-muted:var(--color-text-muted);--sidebar-icon-filter:brightness(0) invert(1);--color-surface-tint-subtle:rgba(94,113,161,.12);--color-border-translucent:rgba(99,114,144,.22);--color-border-translucent-strong:rgba(110,130,170,.28);--color-border-translucent-bright:rgba(148,163,184,.35);--color-border-translucent-stronger:rgba(148,163,184,.38);--color-border-translucent-strongest:rgba(198,207,222,.45);--color-border-translucent-glow:rgba(129,140,248,.55);--color-border-translucent-medium:rgba(99,114,144,.28);--color-border-neutral-soft:rgba(99,114,144,.3);--color-border-info-soft:rgba(96,165,250,.35);--color-border-sidebar-strong:rgba(32,46,68,.88);--color-ring-private:rgba(168,85,247,.55);--color-ring-private-hover:rgba(192,132,252,.65);--color-ring-critical:rgba(239,83,98,.42);--color-ring-critical-soft:rgba(239,83,98,.35);--color-ring-critical-hover:rgba(239,83,98,.5);--color-ring-critical-strong:rgba(220,38,38,.6);--color-ring-alert:rgba(220,38,38,.6);--color-gradient-visibility-start:rgba(129,140,248,.4);--color-gradient-visibility-end:rgba(192,132,252,.32);--color-white-soft:hsla(0,0%,100%,.1);--color-white-softer:hsla(0,0%,100%,.3);--color-white-softest:hsla(0,0%,100%,.4);--color-shadow-floating:rgba(8,11,30,.55);--color-shadow-elevated:rgba(8,11,30,.45);--color-shadow-panel:rgba(15,23,42,.35);--color-shadow-notification:rgba(15,23,42,.3);--color-shadow-intense:rgba(250,204,21,.48);--color-shadow-sidebar:rgba(0,0,0,.45);--color-shadow-modal:rgba(8,11,30,.55);--color-divider-strong:rgba(15,23,42,.35);--color-text-frosted-strong:rgba(226,232,240,.94);--color-text-frosted:rgba(226,232,240,.9);--color-text-frosted-soft:rgba(226,232,240,.82)}*,:after,:before{--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:rgba(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:rgba(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: }
/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-family-sans);font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{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,pre,samp{font-family:var(--font-family-mono);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,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{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}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}html{font-size:80%}@media (min-width:768px){html{font-size:100%}}@media (min-width:1024px){html{font-size:75%}}*,:after,:before{scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track)}::-webkit-scrollbar{width:var(--scrollbar-width);height:var(--scrollbar-width)}::-webkit-scrollbar-track{background:var(--scrollbar-track)}::-webkit-scrollbar-thumb{background:var(--scrollbar-thumb);border-radius:var(--radius-sm)}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-thumb-hover)}body{--app-header-centerline:calc(env(safe-area-inset-top, 0) + var(--app-header-centerline-offset));font-family:var(--font-family-sans);background-color:var(--color-page);color:var(--color-text-strong);line-height:1.5;margin:0;padding:0;overflow-x:hidden}:root[data-theme-accent=override]{--color-accent:var(--color-accent-override);--color-accent-strong:var(--color-accent-strong-override);--color-accent-pressed:var(--color-accent-pressed-override)}#uiOverlay{position:fixed;inset:0;pointer-events:none;z-index:var(--z-overlay-popover)}#uiOverlay>*{pointer-events:auto}#editNip71TagsFieldset>legend,#nip71TagsFieldset>legend{margin-left:0;padding:0}#app{background-color:var(--color-page);color:inherit}body.modal-open,html.modal-open{overflow:hidden;height:100%}body.modal-open #app{overflow:hidden}body.modal-open #sidebar{pointer-events:none;opacity:0;visibility:hidden;z-index:var(--z-sidebar-overlay)}.ng-cloak,.ng-hide:not(.ng-hide-animate),.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}ng\:form{display:block}.\!container{width:100%!important}.container{width:100%}@media (min-width:25rem){.\!container{max-width:25rem!important}.container{max-width:25rem}}@media (min-width:30rem){.\!container{max-width:30rem!important}.container{max-width:30rem}}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}#playerModal.ds-header{display:block}.ds-header{display:flex;align-items:center;justify-content:flex-start;padding-top:var(--space-sm);padding-bottom:var(--space-sm)}.app-shell__header{position:sticky;top:env(safe-area-inset-top,0);z-index:var(--z-app-header);padding-top:calc(var(--space-sm) + env(safe-area-inset-top, 0));padding-bottom:var(--space-sm);background-color:transparent;background-image:var(--surface-overlay-banner-gradient-header);background-repeat:no-repeat;background-size:100% 100%}.ds-metric-probe{position:absolute;top:0;left:0;visibility:hidden;pointer-events:none;contain:layout size style;inline-size:0;block-size:var(--ds-metric-probe-length,0);overflow:hidden}.ds-header__logo{height:var(--space-2xl-plus);width:auto;max-width:none}.focus-ring{outline:2px solid transparent;outline-offset:2px}.focus-ring:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.author-pic{display:block;height:100%;width:100%;border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover}.header-icon-toggle{outline:2px solid transparent;outline-offset:2px}.header-icon-toggle:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.header-icon-toggle{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-timing-function:cubic-bezier(0,0,.2,1);width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg);padding:0;border:none;background:transparent;color:var(--color-text-muted);line-height:1}.header-icon-toggle[data-theme-state=light]{color:var(--color-text-strong)}.header-icon-toggle[data-theme-state=dark]{color:var(--color-text)}.header-icon-toggle__icon-wrapper{display:inline-flex;align-items:center;justify-content:center;inline-size:var(--space-lg);block-size:var(--space-lg)}.header-icon-toggle__icon{inline-size:100%;block-size:100%;display:none;fill:currentColor}.header-icon-toggle__icon-wrapper:not([data-theme-icon-state]),.header-icon-toggle__icon-wrapper[data-theme-icon-state=light]{color:inherit}.header-icon-toggle__icon-wrapper:not([data-theme-icon-state]) .header-icon-toggle__icon--dark,.header-icon-toggle__icon-wrapper[data-theme-icon-state=dark] .header-icon-toggle__icon--light,.header-icon-toggle__icon-wrapper[data-theme-icon-state=light] .header-icon-toggle__icon--dark{display:block}.header-icon-toggle[data-theme-state=light]:focus-visible,.header-icon-toggle[data-theme-state=light]:hover{color:var(--color-text)}.header-icon-toggle[data-theme-state=dark]:focus-visible,.header-icon-toggle[data-theme-state=dark]:hover{color:var(--color-text-strong)}.header-icon-toggle[aria-pressed=true]{color:var(--color-text-strong)}.header-icon-toggle[aria-pressed=true]:focus-visible,.header-icon-toggle[aria-pressed=true]:hover{color:var(--color-text-strong)}.bv-modal.header-search__region,.profile-pane.header-search__region{display:none}.header-search__region{display:none;flex:1 1 0%;justify-content:center}@media (min-width:768px){.header-search__region#playerModal{display:block}.header-search__region{display:flex}}.header-search__region{min-width:0;padding-inline:clamp(var(--space-md),4vw,var(--space-3xl))}#playerModal.header-search{display:block}.header-search{display:flex;align-items:center;gap:.75rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.4;background-color:var(--surface-overlay-panel);padding-left:1rem;padding-right:1rem;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);backdrop-filter:blur(var(--popover-backdrop-blur));-webkit-backdrop-filter:blur(var(--popover-backdrop-blur));padding-block:calc(var(--space-sm)*.9);inline-size:min(100%,var(--header-search-max-inline))}.header-search:focus-within{border-color:var(--color-accent-strong)}.header-search__icon{display:block;height:1.25rem;width:1.25rem;background-color:currentColor;mask-repeat:no-repeat;mask-position:center;mask-size:contain;-webkit-mask-repeat:no-repeat;-webkit-mask-position:center;-webkit-mask-size:contain}.header-search__icon--filter{mask-image:url(../assets/svg/filter.svg);-webkit-mask-image:url(../assets/svg/filter.svg)}.header-search__icon--submit{mask-image:url(../assets/svg/search.svg);-webkit-mask-image:url(../assets/svg/search.svg)}.header-search__filter{outline:2px solid transparent;outline-offset:2px}.header-search__filter:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.header-search__filter{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:transparent;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);color:var(--color-accent);inline-size:calc(var(--icon-size-lg)*.9);block-size:calc(var(--icon-size-lg)*.9);min-inline-size:calc(var(--icon-size-lg)*.9);min-block-size:calc(var(--icon-size-lg)*.9)}.header-search__filter:focus-visible,.header-search__filter:hover{color:var(--color-accent-strong)}.header-search__input{flex:1 1 0%;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary);outline:2px solid transparent;outline-offset:2px}.header-search__input::-moz-placeholder{color:var(--text-muted)}.header-search__input::placeholder{color:var(--text-muted)}.header-search__input{min-width:0}.header-search__input:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.header-search__submit{outline:2px solid transparent;outline-offset:2px}.header-search__submit:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.header-search__submit{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);background-color:var(--color-accent-strong);color:var(--color-white);inline-size:calc(var(--icon-size-lg)*.9);block-size:calc(var(--icon-size-lg)*.9);min-inline-size:calc(var(--icon-size-lg)*.9);min-block-size:calc(var(--icon-size-lg)*.9);padding:0}.header-search__submit:hover{background-color:var(--color-accent)}.header-search__submit:focus-visible{background-color:var(--color-accent-pressed)}.bv-logo{--logo-wordmark-color:var(--color-logo-wordmark);--logo-accent-color:var(--color-logo-accent);--logo-background-color:var(--color-logo-background)}.bv-logo[data-variant=inverse]{--logo-wordmark-color:var(--color-logo-wordmark-inverse);--logo-background-color:var(--color-logo-background-inverse)}.bv-logo[data-wordmark=current]{--logo-wordmark-color:currentColor}.bv-logo[data-accent=current]{--logo-accent-color:currentColor}.bv-logo[data-background=transparent]{--logo-background-color:transparent}.bv-logo__wordmark{fill:var(--logo-wordmark-color);color:var(--logo-wordmark-color)}.bv-logo__accent{fill:var(--logo-accent-color);color:var(--logo-accent-color)}.bv-logo__background{fill:var(--logo-background-color);color:var(--logo-background-color)}.markdown-prose{color:var(--color-text)}.markdown-prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:1rem}.markdown-prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.markdown-prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-primary);text-decoration:none;font-weight:500}.markdown-prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.markdown-prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.markdown-prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.markdown-prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.markdown-prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.markdown-prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.markdown-prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.markdown-prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.markdown-prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.markdown-prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.markdown-prose :where(ol[type="1"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.markdown-prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.markdown-prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.markdown-prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.markdown-prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.markdown-prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--color-border-subtle);border-top-width:1px;margin-top:2rem;margin-bottom:2rem}.markdown-prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--color-muted);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:"\201C""\201D""\2018""\2019";margin-top:1rem;margin-bottom:1rem;padding-inline-start:1em;border-left-width:4px;border-left-color:var(--color-border-subtle);padding-left:1rem}.markdown-prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.markdown-prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.markdown-prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:var(--font-size-2xl);margin-top:.5rem;margin-bottom:1rem;line-height:1.1111111}.markdown-prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.markdown-prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:var(--font-size-xl);margin-top:1.25rem;margin-bottom:.75rem;line-height:1.3333333}.markdown-prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.markdown-prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:var(--font-size-lg);margin-top:1rem;margin-bottom:.75rem;line-height:1.6}.markdown-prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.markdown-prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.markdown-prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.markdown-prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:1rem;border-radius:var(--radius-md);max-width:100%;height:auto}.markdown-prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.markdown-prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.markdown-prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px var(--tw-prose-kbd-shadows),0 3px 0 var(--tw-prose-kbd-shadows);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.markdown-prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-secondary);font-weight:500;font-size:var(--font-size-sm);background-color:var(--color-page-alt);padding:.2rem .4rem;border-radius:var(--radius-md);font-family:var(--font-family-mono)}.markdown-prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.markdown-prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.markdown-prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.markdown-prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.markdown-prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.markdown-prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--color-text-strong);background-color:var(--color-page-alt);overflow-x:auto;font-weight:400;font-size:var(--font-size-sm);line-height:1.7142857;margin-top:0;margin-bottom:1rem;border-radius:var(--radius-md);padding-inline-end:1.1428571em;padding-inline-start:1.1428571em;padding:1rem;font-family:var(--font-family-mono)}.markdown-prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.markdown-prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.markdown-prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.markdown-prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.markdown-prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.markdown-prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.markdown-prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.markdown-prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.markdown-prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.markdown-prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.markdown-prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.markdown-prose :where(th,td):not(:where([class~=not-prose],[class~=not-prose] *)){text-align:start}.markdown-prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.markdown-prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.markdown-prose{--tw-prose-body:var(--color-text);--tw-prose-headings:var(--color-text-strong);--tw-prose-lead:#4b5563;--tw-prose-links:var(--color-primary);--tw-prose-bold:var(--color-text-strong);--tw-prose-counters:var(--color-text-muted);--tw-prose-bullets:var(--color-text-muted);--tw-prose-hr:var(--color-border-subtle);--tw-prose-quotes:var(--color-muted);--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:rgba(17,24,39,.1);--tw-prose-code:var(--color-secondary);--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:var(--color-border-subtle);--tw-prose-td-borders:var(--color-border-subtle);--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:hsla(0,0%,100%,.1);--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.6}.markdown-prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.markdown-prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5rem;margin-bottom:.5rem}.markdown-prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.markdown-prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.markdown-prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.markdown-prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.markdown-prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.markdown-prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.markdown-prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.markdown-prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.markdown-prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.markdown-prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.markdown-prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.markdown-prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.markdown-prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.markdown-prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.markdown-prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.markdown-prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.markdown-prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.markdown-prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.markdown-prose{font-family:var(--font-family-sans)}.markdown-prose :where(h4,h5,h6):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:600;margin-top:.75rem;margin-bottom:.5rem}.markdown-prose :where(ul,ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:1rem;padding-left:1.25rem}.markdown-prose :where(a:hover):not(:where([class~=not-prose],[class~=not-prose] *)){text-decoration:underline}.markdown-prose{max-width:none;line-height:1.625;color:var(--text-primary);--tw-prose-body:var(--color-text);--tw-prose-headings:var(--color-text-strong);--tw-prose-invert-headings:var(--color-text-strong);--tw-prose-lead:var(--color-text);--tw-prose-links:var(--color-accent-strong);--tw-prose-bold:var(--color-text-strong);--tw-prose-counters:var(--color-text-muted);--tw-prose-bullets:var(--color-text-muted);--tw-prose-hr:var(--color-border-translucent-strong);--tw-prose-quotes:var(--color-text-strong);--tw-prose-quote-borders:var(--color-border-subtle);--tw-prose-captions:var(--color-text-muted);--tw-prose-code:var(--color-text-strong);--tw-prose-pre-code:var(--color-text);--tw-prose-pre-bg:var(--surface-muted);--tw-prose-th-borders:var(--color-border);--tw-prose-td-borders:var(--color-border-subtle)}.markdown-prose :where(h1,h2,h3,h4,h5,h6){color:var(--color-text-strong)}.markdown-prose :where(h1,h2,h3,h4,h5,h6) strong{color:inherit}.markdown-prose a{color:var(--color-accent-strong);text-decoration-color:color-mix(in srgb,var(--color-accent-strong) 65%,transparent);text-decoration-thickness:var(--link-underline-thickness);text-underline-offset:.2em}.markdown-prose a:focus-visible,.markdown-prose a:hover{color:var(--color-accent);text-decoration-line:underline}.markdown-prose blockquote{border-radius:var(--radius-md);border-left-width:4px;border-color:var(--border-subtle);background-color:var(--surface-muted);--tw-bg-opacity:0.5;padding:.5rem 1rem;color:var(--text-muted)}.markdown-prose :where(pre,code){font-family:var(--font-family-mono)}.markdown-prose code{border-radius:var(--radius-md);background-color:var(--surface-muted);padding:.125rem .25rem;color:var(--color-accent-strong)}.markdown-prose pre{overflow-x:auto;border-radius:var(--radius-lg);border-width:1px;border-color:var(--border-subtle);background-color:var(--surface-muted);padding:1rem;color:var(--text-primary)}.markdown-prose pre code{background-color:transparent;color:inherit;padding:0}.\!popover,.popover{position:relative;display:inline-flex}.popover-panel,.popover__panel{outline:2px solid transparent;outline-offset:2px}.popover-panel:focus-visible,.popover__panel:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.popover-panel,.popover__panel{pointer-events:none;z-index:var(--z-overlay-popover);min-width:var(--menu-min-width);max-width:var(--popover-inline-safe-max);--tw-scale-x:.95;--tw-scale-y:.95;border-radius:var(--overlay-panel-radius);border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.4;background-color:var(--surface-overlay-panel);padding:var(--overlay-panel-padding-block) var(--overlay-panel-padding-inline);font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary);opacity:0;--tw-shadow:var(--overlay-panel-shadow);--tw-shadow-colored:var(--overlay-panel-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-shadow-color:var(--surface-overlay-panel);--tw-shadow:var(--tw-shadow-colored);transition-property:opacity;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);position:var(--popover-strategy,fixed);left:var(--popover-left,0);top:var(--popover-top,0);max-width:var(--popover-max-width,none);max-height:var(--popover-max-height,none)}.popover-panel,.popover-panel[data-state=open],.popover__panel,.popover__panel[data-state=open]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.popover-panel[data-state=open],.popover__panel[data-state=open]{pointer-events:auto;--tw-scale-x:1;--tw-scale-y:1;opacity:1}.popover-panel[data-state=closed],.popover__panel[data-state=closed]{pointer-events:none;--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));opacity:0}[data-popover-arrow=true]{left:var(--popover-arrow-left,auto);right:var(--popover-arrow-right,auto);top:var(--popover-arrow-top,auto);bottom:var(--popover-arrow-bottom,auto)}.ds-overlay-backdrop{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;background:var(--overlay-backdrop-color);backdrop-filter:blur(var(--overlay-backdrop-blur));-webkit-backdrop-filter:blur(var(--overlay-backdrop-blur))}.popover-panel[data-variant=zap],.popover__panel[data-variant=zap]{background:var(--color-overlay-veil);color:var(--color-subtle);border:var(--border-width-hairline) solid var(--color-border-translucent-stronger);box-shadow:var(--shadow-popover-zap);backdrop-filter:blur(var(--popover-backdrop-blur));-webkit-backdrop-filter:blur(var(--popover-backdrop-blur))}.\!btn{outline:2px solid transparent;outline-offset:2px}.\!btn:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.\!btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--color-accent-strong);padding:.625rem 1.25rem;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;color:var(--color-white);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.btn{outline:2px solid transparent;outline-offset:2px}.btn:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--color-accent-strong);padding:.625rem 1.25rem;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;color:var(--color-white);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.\!btn[data-size=sm],.btn-ghost[data-size=sm],.btn[data-size=sm]{padding:.375rem .75rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug)}.\!btn[data-size=sm],.btn-ghost[data-size=sm],.btn[data-size=sm]{gap:.375rem}.\!btn:hover,.btn:hover{background-color:var(--color-accent)}.\!btn:focus-visible{background-color:var(--color-accent-pressed)}.btn:focus-visible{background-color:var(--color-accent-pressed)}.\!btn:disabled,.btn:disabled{pointer-events:none;cursor:not-allowed;opacity:.6;--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)}.btn-link{outline:2px solid transparent;outline-offset:2px}.btn-link:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.btn-link{display:inline-flex;align-items:center;gap:.25rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--color-accent);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.btn-link:focus-visible,.btn-link:hover{color:var(--color-accent-strong);text-decoration-line:underline}.progress,[data-progress-meter]{--progress-height:var(--progress-height-md);--progress-track:var(--progress-track-color);--progress-fill:var(--progress-fill-color);--progress-radius-current:var(--progress-radius);display:block;width:100%;height:var(--progress-height);border:none;border-radius:var(--progress-radius-current);overflow:hidden;background-color:var(--progress-track);-webkit-appearance:none;-moz-appearance:none;appearance:none}.progress::-webkit-progress-bar,[data-progress-meter]::-webkit-progress-bar{background-color:var(--progress-track);border-radius:var(--progress-radius-current)}.progress::-webkit-progress-value,[data-progress-meter]::-webkit-progress-value{background-color:var(--progress-fill);border-radius:var(--progress-radius-current);-webkit-transition:width var(--progress-transition-duration) var(--progress-transition-ease);transition:width var(--progress-transition-duration) var(--progress-transition-ease)}.progress::-moz-progress-bar,[data-progress-meter]::-moz-progress-bar{background-color:var(--progress-fill);border-radius:var(--progress-radius-current);-moz-transition:width var(--progress-transition-duration) var(--progress-transition-ease);transition:width var(--progress-transition-duration) var(--progress-transition-ease)}.progress.progress--surface,.progress[data-variant=surface],[data-progress-meter].progress--surface,[data-progress-meter][data-variant=surface]{--progress-track:var(--color-panel)}.progress.progress--accent,.progress[data-variant=accent],[data-progress-meter].progress--accent,[data-progress-meter][data-variant=accent]{--progress-fill:var(--color-info-strong)}.btn-ghost{outline:2px solid transparent;outline-offset:2px}.btn-ghost:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.btn-ghost{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-color:transparent;background-color:var(--color-accent-strong);padding:.625rem 1.25rem;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;color:var(--color-white);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.btn-ghost[data-size=sm]{padding:.375rem .75rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);gap:.375rem}.btn-ghost:hover{background-color:var(--color-accent)}.btn-ghost:focus-visible{background-color:var(--color-accent-pressed)}.btn-ghost:disabled{cursor:not-allowed;opacity:.6}body.iframe-form button.btn-ghost{align-self:flex-start;margin-top:var(--space-md)}.btn-ghost{border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.6;background-color:transparent;color:var(--text-primary);--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)}@media (prefers-reduced-motion:reduce){.btn-ghost{transition-property:none}}.btn-ghost:hover{background-color:var(--surface-panel-hover);color:var(--text-primary)}.btn-ghost:focus-visible{background-color:var(--surface-panel-hover)}.btn-ghost:disabled{pointer-events:none;opacity:.5;--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)}.btn-ghost[data-variant=critical]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.6;color:var(--color-critical)}.btn-ghost[data-variant=critical]:focus-visible,.btn-ghost[data-variant=critical]:hover{background-color:var(--color-critical);--tw-bg-opacity:0.2;color:var(--color-critical-strong)}.login-option{outline:2px solid transparent;outline-offset:2px}.login-option:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.login-option{display:block}.login-option{position:relative;display:flex;height:100%;width:100%;flex-direction:column;gap:1rem;overflow:hidden;border-width:1px;border-color:var(--border-default);background-color:var(--surface-overlay-panel-soft);padding:1.25rem 1.5rem;text-align:left;color:var(--text-primary);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);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-duration:.3s;transition-timing-function:cubic-bezier(0,0,.2,1);border-radius:calc(var(--radius-xl)*1.12);isolation:isolate;backdrop-filter:blur(var(--blur-modal-backdrop));background-image:linear-gradient(140deg,color-mix(in srgb,var(--surface-overlay-panel-soft) 88%,transparent) 0,color-mix(in srgb,var(--surface-overlay-panel) 72%,transparent) 100%);transform:translateZ(0);transition-property:border-color,box-shadow,transform}.login-option:after{content:"";position:absolute;inset:0;z-index:0;border-radius:inherit;opacity:0;transform:translate3d(0,14%,0);transition:opacity .22s ease,transform .22s ease;background:radial-gradient(115% 115% at 0 0,color-mix(in srgb,var(--status-neutral) 32%,transparent) 0,transparent 65%)}.login-option:focus-visible,.login-option:hover{border-color:var(--border-strong);box-shadow:var(--shadow-modal);transform:translate3d(0,var(--motion-login-option-hover-translate),0)}.login-option:focus-visible:after,.login-option:hover:after{opacity:.65;transform:translateZ(0)}.login-option:disabled,.login-option[aria-disabled=true]{cursor:not-allowed;opacity:.6;--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);transform:none}.login-option[data-tone=accent]:after{background:radial-gradient(120% 120% at 0 0,color-mix(in srgb,var(--status-info) 38%,transparent) 0,transparent 65%)}.login-option[data-tone=warning]:after{background:radial-gradient(120% 120% at 0 0,color-mix(in srgb,var(--status-warning) 42%,transparent) 0,transparent 65%)}.login-option--primary{border-color:var(--border-default)}.login-option--ghost{background-image:linear-gradient(145deg,color-mix(in srgb,var(--surface-overlay-panel-soft) 82%,transparent) 0,color-mix(in srgb,var(--surface-overlay-panel-soft) 68%,transparent) 100%)}.login-option--outline{border-color:var(--border-strong)}.login-option--link{border-width:1px;border-color:transparent;background-color:transparent;color:var(--color-accent);--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)}.login-option__capabilities,.login-option__copy,.login-option__header,.login-option__status{position:relative;z-index:1}#playerModal.login-option__header{display:block}.login-option__header{display:flex;width:100%;align-items:flex-start;justify-content:space-between;gap:1rem}#playerModal.login-option__copy{display:block}.login-option__copy{display:flex;min-width:0;flex-direction:column;align-items:flex-start;gap:.5rem}.login-option__eyebrow{font-size:var(--font-size-2xs);font-weight:600;text-transform:uppercase;color:var(--text-muted);letter-spacing:.18em}.login-option:focus-visible .login-option__eyebrow,.login-option:hover .login-option__eyebrow{color:var(--text-primary)}.login-option__label{font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;color:var(--text-primary)}.login-option__description{font-size:var(--font-size-sm);line-height:var(--line-height-snug);line-height:1.625}.login-option__chevron,.login-option__description{color:var(--text-muted)}.login-option__chevron{display:inline-flex;height:2.25rem;width:2.25rem;align-items:center;justify-content:center;border-radius:var(--radius-full);background-color:var(--surface-overlay-panel);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-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);box-shadow:inset 0 0 0 var(--border-width-hairline) color-mix(in srgb,var(--border-overlay) 60%,transparent)}.login-option:focus-visible .login-option__chevron,.login-option:hover .login-option__chevron{background-color:var(--color-accent);color:var(--color-white);box-shadow:none}#playerModal.login-option__status{display:block}.login-option__status{display:flex;width:100%;align-items:center;justify-content:space-between;gap:.5rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}#playerModal.login-option__capabilities{display:block}.login-option__capabilities{display:flex;flex-wrap:wrap;gap:.5rem;position:relative}.btn-ghost[aria-pressed=true],.btn-ghost[data-state=active]{border-color:transparent;background-color:var(--color-primary);color:var(--color-white);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.btn-ghost[aria-pressed=true]:focus-visible,.btn-ghost[aria-pressed=true]:hover,.btn-ghost[data-state=active]:focus-visible,.btn-ghost[data-state=active]:hover{background-color:var(--color-accent-strong)}.\!badge,.badge{display:inline-flex;align-items:center;gap:.25rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);padding:.25rem .75rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight);font-weight:600;text-transform:uppercase;letter-spacing:var(--tracking-extra-wide);color:var(--status-neutral-on)}.\!badge[data-variant=info],.badge[data-variant=info]{border-color:var(--status-info-border);background-color:var(--status-info-surface);color:var(--status-info-on)}.\!badge[data-variant=success],.badge[data-variant=success]{border-color:var(--status-success-border);background-color:var(--status-success-surface);color:var(--status-success-on)}.\!badge[data-variant=warning],.badge[data-variant=warning]{border-color:var(--status-warning-border);background-color:var(--status-warning-surface);color:var(--status-warning-on)}.\!badge[data-variant=critical],.badge[data-variant=critical]{border-color:var(--status-danger-border);background-color:var(--status-danger-surface);color:var(--status-danger-on)}.\!badge[data-variant=private],.badge[data-variant=private]{border-color:var(--status-private-border);background-color:var(--status-private-surface);color:var(--status-private-on)}.\!badge[data-variant=neutral],.badge[data-variant=neutral]{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);color:var(--status-neutral-on)}.moderation-badge{display:inline-flex;flex-direction:column;align-items:flex-start;gap:var(--space-sm);border-radius:var(--radius-xl);border-width:1px;padding:.375rem .75rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;text-transform:none;letter-spacing:-.025em;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.moderation-badge--interactive{pointer-events:auto}.moderation-badge__actions{display:inline-flex;flex-wrap:nowrap;align-items:center;gap:var(--space-sm)}.moderation-badge__label{display:inline-flex;align-items:center;gap:var(--space-xs);white-space:nowrap}.moderation-badge[data-variant=warning]{border-color:var(--status-warning-border);background-color:var(--status-warning-surface);color:var(--status-warning-on);box-shadow:0 var(--shadow-badge-offset-y) var(--shadow-badge-blur) color-mix(in srgb,var(--status-warning) 18%,transparent)}.moderation-badge[data-variant=neutral]{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);color:var(--status-neutral-on);box-shadow:0 var(--shadow-badge-offset-y) var(--shadow-badge-blur) color-mix(in srgb,var(--status-neutral) 18%,transparent)}.moderation-badge__icon{display:inline-flex;height:1.25rem;width:1.25rem;align-items:center;justify-content:center;border-radius:var(--radius-full);background-color:var(--status-warning-surface);background-color:color-mix(in srgb,var(--status-warning) 18%,transparent);color:var(--status-warning-on)}.moderation-badge[data-variant=neutral] .moderation-badge__icon{background-color:var(--status-neutral-surface);background-color:color-mix(in srgb,var(--status-neutral) 18%,transparent);color:var(--status-neutral-on)}.moderation-badge__icon-mark{height:.875rem;width:.875rem}.moderation-badge__text{white-space:nowrap}.moderation-badge__action,.moderation-badge__text{font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;letter-spacing:-.025em}.moderation-badge__action{display:inline-flex;align-items:center;gap:.375rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-warning-border);background-color:var(--status-warning-surface);padding:.25rem .75rem;text-transform:none;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-duration:.15s;transition-timing-function:cubic-bezier(0,0,.2,1);background-color:color-mix(in srgb,var(--status-warning) 16%,transparent);border-color:color-mix(in srgb,var(--status-warning-border) 80%,transparent);color:var(--status-warning-on)}.moderation-badge[data-variant=warning] .moderation-badge__action:hover{background-color:color-mix(in srgb,var(--status-warning) 24%,transparent)}.moderation-badge[data-variant=neutral] .moderation-badge__action{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);background-color:color-mix(in srgb,var(--status-neutral) 16%,transparent);border-color:color-mix(in srgb,var(--status-neutral-border) 80%,transparent);color:var(--status-neutral-on)}.moderation-badge[data-variant=neutral] .moderation-badge__action:hover{background-color:color-mix(in srgb,var(--status-neutral) 24%,transparent)}.moderation-badge__action:focus-visible{outline:var(--outline-thick-width) solid color-mix(in srgb,var(--status-warning) 38%,transparent);outline-offset:var(--space-3xs)}.moderation-badge[data-variant=neutral] .moderation-badge__action:focus-visible{outline:var(--outline-thick-width) solid color-mix(in srgb,var(--status-neutral) 38%,transparent)}.moderation-badge__action[disabled]{cursor:wait;opacity:.7}.pill{display:inline-flex;align-items:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);padding:.25rem .75rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:500;color:var(--status-neutral-on)}.pill[data-size=compact]{padding:.125rem .5rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.pill[data-variant=info]{border-color:var(--status-info-border);background-color:var(--status-info-surface);color:var(--status-info-on)}.pill[data-variant=success]{border-color:var(--status-success-border);background-color:var(--status-success-surface);color:var(--status-success-on)}.pill[data-variant=warning]{border-color:var(--status-warning-border);background-color:var(--status-warning-surface);color:var(--status-warning-on)}.pill[data-variant=critical]{border-color:var(--status-danger-border);background-color:var(--status-danger-surface);color:var(--status-danger-on)}.pill[data-variant=private]{border-color:var(--status-private-border);background-color:var(--status-private-surface);color:var(--status-private-on)}.pill[data-variant=neutral]{border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);color:var(--status-neutral-on)}#playerModal.\!menu{display:block}.\!menu{display:flex;flex-direction:column;gap:.25rem;padding-top:.5rem;padding-bottom:.5rem}#playerModal.menu{display:block}.menu{display:flex;flex-direction:column;gap:.25rem;padding-top:.5rem;padding-bottom:.5rem}.menu__heading{padding-left:1rem;padding-right:1rem;padding-bottom:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;text-transform:uppercase;letter-spacing:.025em;color:var(--text-muted)}.menu__separator{margin-top:.5rem;margin-bottom:.5rem;height:1px;background-color:var(--border-default);--tw-bg-opacity:0.2}.menu__item{outline:2px solid transparent;outline-offset:2px}.menu__item:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.menu__item{display:block}.menu__item{position:relative;display:flex;width:100%;align-items:center;gap:.75rem;border-radius:var(--radius-md);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-primary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:var(--motion-ease-in-out)}.menu__item:hover{background-color:var(--surface-panel-hover);color:var(--text-primary)}.menu__item[data-state=active]{background-color:var(--color-accent);--tw-bg-opacity:0.2;color:var(--color-accent-strong)}.menu__item[data-variant=critical]{color:var(--color-critical-strong)}.menu__item[data-variant=critical]:hover{background-color:var(--color-critical);--tw-bg-opacity:0.2}.menu__item:disabled,.menu__item[aria-disabled=true]{cursor:not-allowed;opacity:.6}.menu__item:disabled,.menu__item:disabled:hover,.menu__item[aria-disabled=true],.menu__item[aria-disabled=true]:hover{background-color:transparent;color:var(--text-muted)}.\!card{--video-card-lift-translate-y:0!important;--video-card-backdrop-opacity:0!important;--video-card-backdrop-translate-y:var(--space-md-plus)!important;--video-card-backdrop-scale:1.08!important;--video-card-backdrop-blur:var(--blur-thumbnail-blur)!important}.card{--video-card-lift-translate-y:0;--video-card-backdrop-opacity:0;--video-card-backdrop-translate-y:var(--space-md-plus);--video-card-backdrop-scale:1.08;--video-card-backdrop-blur:var(--blur-thumbnail-blur)}.\!card{outline:2px solid transparent;outline-offset:2px}.\!card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.\!card{position:relative;border-radius:var(--radius-lg);border-width:1px;border-color:transparent;background-color:var(--surface-raised);color:var(--text-primary);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.card{outline:2px solid transparent;outline-offset:2px}.card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.card{position:relative;border-radius:var(--radius-lg);border-width:1px;border-color:transparent;background-color:var(--surface-raised);color:var(--text-primary);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1)}.\!card{transform:translate3d(0,var(--video-card-lift-translate-y),0)!important;transition-property:transform,box-shadow,border-color,background-color,color!important;will-change:transform!important;isolation:isolate!important}.card{transform:translate3d(0,var(--video-card-lift-translate-y),0);transition-property:transform,box-shadow,border-color,background-color,color;will-change:transform;isolation:isolate}.\!card:before{content:""!important;position:absolute!important;inset:0!important;z-index:0!important;opacity:var(--video-card-backdrop-opacity)!important;background-image:var(--video-card-thumb-url,none)!important;background-position:50%!important;background-repeat:no-repeat!important;background-size:cover!important;transform:translate3d(0,var(--video-card-backdrop-translate-y),0) scale(var(--video-card-backdrop-scale))!important;filter:blur(var(--video-card-backdrop-blur))!important;transition:opacity var(--motion-duration-base) var(--motion-ease-in-out),transform var(--motion-duration-base) var(--motion-ease-in-out),filter var(--motion-duration-base) var(--motion-ease-in-out)!important;pointer-events:none!important;will-change:opacity,transform,filter!important}.card:before{content:"";position:absolute;inset:0;z-index:0;opacity:var(--video-card-backdrop-opacity);background-image:var(--video-card-thumb-url,none);background-position:50%;background-repeat:no-repeat;background-size:cover;transform:translate3d(0,var(--video-card-backdrop-translate-y),0) scale(var(--video-card-backdrop-scale));filter:blur(var(--video-card-backdrop-blur));transition:opacity var(--motion-duration-base) var(--motion-ease-in-out),transform var(--motion-duration-base) var(--motion-ease-in-out),filter var(--motion-duration-base) var(--motion-ease-in-out);pointer-events:none;will-change:opacity,transform,filter}.\!card>*{position:relative!important;z-index:1!important}.card>*{position:relative;z-index:1}#playerModal.card--compact{display:block}.card--compact{display:flex;flex-direction:row;align-items:flex-start;gap:var(--space-md)}.card--compact .video-card__media{inline-size:clamp(var(--video-card-compact-media-min),calc(var(--video-modal-secondary-min)*.4),var(--video-card-compact-media-max));flex-basis:clamp(var(--video-card-compact-media-min),calc(var(--video-modal-secondary-min)*0.4),var(--video-card-compact-media-max));display:block;flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal.card--compact .video-card__content{display:block}.card--compact .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm);padding:var(--space-md)}.card--compact .video-card__title{font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:600;line-height:1.375}.card--compact .video-card__author-name{font-size:var(--font-size-xs);line-height:var(--line-height-tight)}#playerModal.card--compact .video-card__meta{display:block}.card--compact .video-card__meta{margin-top:0;display:flex;align-items:center;gap:.5rem;color:var(--text-muted-strong)}.card--compact .video-card__meta,.card--compact .video-card__meta .view-count-text{font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.card:focus-within,.card:hover{--video-card-lift-translate-y:var(--motion-video-card-hover-translate);--video-card-backdrop-opacity:0.425;--video-card-backdrop-translate-y:var(
--motion-video-card-backdrop-translate
);--video-card-backdrop-scale:1.12;--video-card-backdrop-blur:var(--blur-video-card-backdrop-strong)}.\!card:focus-within,.\!card:hover{--video-card-lift-translate-y:var(--motion-video-card-hover-translate)!important;--video-card-backdrop-opacity:0.425!important;--video-card-backdrop-translate-y:var(
@@ -11,4 +11,4 @@
--player-modal-primary-inline-padding-lg,clamp(var(--space-sm),2.75vw,var(--space-lg))
)}}.revert-modal__layout{display:grid;gap:1.5rem}@media (min-width:1024px){.revert-modal__layout{grid-template-columns:minmax(var(--revert-modal-sidebar-min),var(--revert-modal-sidebar-width)) minmax(0,1fr)}}#playerModal.video-modal__primary{display:block}.video-modal__primary{display:flex;flex-direction:column;gap:1.5rem;min-width:0;min-height:0}#playerModal.video-modal__secondary{display:block}.video-modal__secondary{display:flex;flex-direction:column;gap:1rem;min-width:0;min-height:0;width:100%;align-self:stretch}.video-modal__similar{display:none}@media (min-width:1024px){#playerModal.video-modal__similar{display:block}.video-modal__similar{display:flex;flex-direction:column;gap:1.5rem;align-self:stretch;flex:1 1 auto;min-height:0}#playerModal .video-modal__similar .player-modal__module{height:100%;display:flex;flex:1 1 auto;min-height:0;flex-direction:column}#playerModal .video-modal__similar .player-modal__module-list{flex:1 1 auto;min-height:0}#playerModal .video-modal__similar .player-modal__module-scroll{height:100%;max-height:none;min-height:0}}#playerModal .player-modal__module-item{width:100%}#playerModal#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max))}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max))!important}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__media,#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__media{flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))!important}#playerModal#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}#playerModal#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}#playerModal .video-modal__similar .player-modal__module-list{gap:clamp(var(--space-2xs),.85vw,var(--space-sm))}.player-modal__similar-card{outline:2px solid transparent;outline-offset:2px}.player-modal__similar-card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.player-modal__similar-card{display:block}.player-modal__similar-card{position:relative;display:flex;width:100%;min-width:0;align-items:flex-start;gap:.75rem;border-radius:var(--radius-xl);padding:.5rem;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.player-modal__similar-card:focus-within,.player-modal__similar-card:hover{background-color:var(--surface-panel-hover)}.player-modal__similar-card-media{position:relative;display:block;flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg);background-color:var(--surface-alt);width:var(--similar-card-media-width);aspect-ratio:16/9;background-image:var(--similar-card-thumb-url,none);background-position:50%;background-size:cover}@media (max-width:640px){.player-modal__similar-card-media{width:var(--similar-card-media-width-sm)}}.player-modal__similar-card-media img{display:block;width:100%;height:100%;-o-object-fit:cover;object-fit:cover;border-radius:inherit}#playerModal.player-modal__similar-card-content{display:block}.player-modal__similar-card-content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:.25rem}.player-modal__similar-card-title{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;line-height:1.375;color:var(--text-primary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);min-width:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.player-modal__similar-card-title:focus-visible,.player-modal__similar-card:hover .player-modal__similar-card-title{color:var(--color-accent-strong)}#playerModal.player-modal__similar-card-author{display:block}.player-modal__similar-card-author{display:flex;min-width:0;align-items:center}#playerModal.player-modal__similar-card-author-meta{display:block}.player-modal__similar-card-author-meta{display:flex;min-width:0;flex-direction:column}.player-modal__similar-card-author-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:500;color:var(--text-muted);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.player-modal__similar-card:hover .player-modal__similar-card-author-name{color:var(--color-text-strong)}.player-modal__similar-card-author-npub{display:none}#playerModal.player-modal__similar-card-meta{display:block}.player-modal__similar-card-meta{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight);color:var(--text-muted-strong);min-width:0}.player-modal__similar-card-timestamp{white-space:nowrap}.video-modal__stage{position:relative;isolation:isolate;overflow:visible;--video-modal-ambient-bleed:clamp(var(--space-2xl),12vw,var(--space-5xl));--video-modal-ambient-scale:1.38;--video-modal-ambient-blur:clamp(var(--video-modal-ambient-blur-min),20vw,var(--video-modal-ambient-blur-max));--video-modal-ambient-opacity:1}.video-modal__video{position:relative;z-index:1;border-radius:var(--radius-xl);padding-block:clamp(var(--space-xs),2.5vw,var(--space-md-plus));background-color:transparent;box-shadow:0 0 0 var(--border-width-hairline) color-mix(in srgb,var(--color-border-strong) 8%,transparent) inset;overflow:visible}.video-modal__ambient{position:absolute;inset:calc(var(--video-modal-ambient-bleed)*-1);border-radius:calc(var(--radius-3xl) + var(--video-modal-ambient-bleed));pointer-events:none;z-index:0;display:block;overflow:visible}.video-modal__ambient:before{content:"";position:absolute;inset:0;border-radius:inherit;background:radial-gradient(circle at 50% 50%,color-mix(in srgb,var(--color-overlay-strong) 18%,transparent) 0,color-mix(in srgb,var(--color-overlay) 34%,transparent) 62%,transparent 100%);opacity:.9;mix-blend-mode:screen;pointer-events:none}.video-modal__ambient-canvas{position:relative;width:100%;height:100%;display:block;transform:scale(var(--video-modal-ambient-scale));filter:blur(var(--video-modal-ambient-blur)) saturate(2) brightness(1.24);opacity:var(--video-modal-ambient-opacity)}@media (min-width:1024px){.video-modal__video{position:sticky;top:calc(var(--space-2xl) + var(--space-3xl));z-index:1}.video-modal__status{flex-basis:clamp(var(--space-xl),25%,var(--space-3xl));max-width:clamp(var(--space-xl),25%,var(--space-3xl))}.video-modal__details{position:relative;z-index:2;margin-top:var(--space-lg)}}#playerModal .video-modal__video video{position:relative;z-index:1;background-color:var(--color-black);border-radius:var(--radius-lg);box-shadow:var(--shadow-video-modal);max-height:min(80vh,56.25vw);-o-object-fit:contain;object-fit:contain}.video-modal__media{display:block;aspect-ratio:16/9;width:100%;-o-object-fit:contain;object-fit:contain}#playerModal.video-modal__details{display:block}.video-modal__details{display:flex;flex-direction:column;gap:1.5rem}.video-modal__meta{border-bottom-width:1px;border-color:var(--border-default);--tw-border-opacity:0.2;padding-bottom:1rem}#playerModal.video-modal__tags{display:block}.video-modal__tags{margin-left:-.25rem;margin-right:-.25rem;display:flex;gap:.5rem;padding-left:.25rem;padding-right:.25rem}.video-modal__similar .video-modal__tags{margin-bottom:clamp(var(--space-xs),.9vw,var(--space-md))}.video-modal__tags[hidden]{display:none}.video-modal__tags[data-fade]{position:relative}.video-modal__tags[data-fade]:after,.video-modal__tags[data-fade]:before{content:"";position:sticky;top:0;bottom:0;width:var(--space-lg);pointer-events:none;z-index:1}.video-modal__tags[data-fade]:before{left:0;background:linear-gradient(to right,var(--surface-overlay-muted),transparent)}.video-modal__tags[data-fade]:after{right:0;background:linear-gradient(to left,var(--surface-overlay-muted),transparent)}.video-tag-strip{display:flex;flex-wrap:nowrap;align-items:center;gap:var(--space-xs);overflow:hidden}.video-tag-pill{display:inline-flex;align-items:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);padding:.25rem .75rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight);font-weight:500;color:var(--status-neutral-on);position:relative;justify-content:center;white-space:nowrap;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-duration:.15s;min-height:calc(var(--space-sm) + var(--space-xs));margin-inline-end:.25rem}.video-tag-pill__label{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);opacity:1}#playerModal.video-tag-pill__icon{display:block}.video-tag-pill__icon{position:absolute;inset:0;display: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-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);opacity:0;transform:scale(.8)}.video-tag-pill__icon svg{height:.75rem;width:.75rem}.video-tag-pill:focus-visible .video-tag-pill__label,.video-tag-pill:hover .video-tag-pill__label{opacity:0}.video-tag-pill:focus-visible .video-tag-pill__icon,.video-tag-pill:hover .video-tag-pill__icon{opacity:1;transform:scale(1)}#playerModal.video-modal__actions-row{display:block}.video-modal__actions-row{display:flex;width:100%;flex-wrap:wrap;align-items:flex-start;-moz-column-gap:.75rem;column-gap:.75rem;row-gap:.75rem}@media (min-width:640px){.video-modal__actions-row{-moz-column-gap:1rem;column-gap:1rem}}.video-modal__actions-group,.video-modal__reactions{flex:1 1 var(--menu-min-width);min-inline-size:0}#playerModal.video-modal__reactions{display:block}.video-modal__reactions{display:flex;flex-basis:100%;flex-wrap:wrap;align-items:flex-start;gap:.75rem}@media (min-width:640px){.video-modal__reactions{gap:1rem}}@media (min-width:768px){.video-modal__reactions{flex-basis:auto}}.video-modal__reaction-buttons{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.5rem}.video-modal__reaction-button{--video-modal-reaction-active-bg:color-mix(in srgb,var(--color-accent) 22%,var(--surface-overlay-panel));--video-modal-reaction-active-border:color-mix(in srgb,var(--color-accent) 38%,var(--border-overlay))}.video-modal__reaction-button[aria-pressed=true]{color:var(--color-accent-strong);background-color:var(--video-modal-reaction-active-bg);border-color:var(--video-modal-reaction-active-border)}.video-modal__reaction-button[aria-pressed=true] .video-modal__reaction-count{color:var(--color-accent-strong)}.video-modal__reaction-count{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--text-muted)}.video-modal__reaction-meter{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap;flex:1 1 var(--menu-min-width);max-inline-size:100%}.video-modal__reaction-meter-label{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-muted);min-inline-size:var(--video-modal-reaction-label-min-inline)}.video-modal__reaction-meter-track{position:relative;flex:1 1 auto;inline-size:100%;block-size:var(--space-xs);border-radius:var(--radius-full);background-color:var(--color-border-muted);overflow:hidden}.video-modal__reaction-meter-fill{position:absolute;inset-inline-start:0;inset-block-start:0;block-size:100%;max-inline-size:100%;inline-size:var(--video-modal-reaction-fill,0);width:var(--video-modal-reaction-fill,0);background-image:linear-gradient(90deg,var(--color-accent) 0,var(--color-accent-strong) 100%);transition:inline-size var(--motion-duration-base) var(--motion-ease-out)}.video-modal__reaction-meter-fill--empty{inline-size:0;width:0}#playerModal.video-modal__actions-group{display:block}.video-modal__actions-group{display:flex;flex-basis:100%;flex-wrap:wrap;align-items:flex-start;justify-content:flex-start;gap:.75rem}@media (min-width:768px){.video-modal__actions-group{flex-basis:auto;justify-content:flex-end;margin-inline-start:auto}}.video-modal__action-button{display:inline-flex;height:2.75rem;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);min-width:var(--video-modal-action-min-width);padding-inline:var(--space-md);border-width:var(--border-width-hairline);border-style:solid}.bv-modal.video-modal__action-label,.profile-pane.video-modal__action-label,.video-modal__action-label{display:none}@media (min-width:640px){.video-modal__action-label{display:inline}}.video-modal__action-icon{height:1.25rem;width:1.25rem}.video-modal__channel,.video-modal__description,.video-modal__stats{border-radius:1rem;border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.2;background-color:var(--surface-base);padding:1rem 1.25rem;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.video-modal__description-body{overflow-wrap:anywhere;word-break:break-word}.video-modal__description-body a{color:var(--color-accent-strong);text-decoration:underline;text-decoration-color:currentColor;word-break:break-word}.video-modal__description-body a:focus-visible,.video-modal__description-body a:hover{color:var(--color-accent-pressed)}.video-modal__comments{border-radius:1rem;border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.2;background-color:var(--surface-base);padding:1.25rem;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.comment-thread,.video-modal__comments{display:flex;flex-direction:column;gap:var(--space-lg)}.comment-thread__header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-sm)}.comment-thread__title{font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;color:var(--text-primary)}.comment-thread__count,.comment-thread__empty{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted);margin:0}.comment-thread__empty{padding:var(--space-md);border-radius:var(--radius-lg);border:var(--border-width-hairline) dashed color-mix(in srgb,var(--border-default) 40%,transparent);background-color:var(--surface-alt)}.comment-thread__list{display:flex;flex-direction:column;gap:var(--space-md);margin:0;padding:0;list-style:none}.comment-thread__item{display:grid;grid-template-columns:auto 1fr;gap:var(--space-md);padding-block:var(--space-sm);border-bottom:var(--border-width-hairline) solid var(--border-subtle)}.comment-thread__item:last-child{border-bottom:none;padding-bottom:0}.comment-thread__avatar{inline-size:var(--comment-avatar-size);block-size:var(--comment-avatar-size)}.comment-thread__avatar img{border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover;inline-size:100%;block-size:100%}.comment-thread__content{display:flex;flex-direction:column;gap:var(--space-xs);min-inline-size:0}.comment-thread__meta{font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-xs)}.comment-thread__author{font-weight:600;color:var(--text-primary)}.comment-thread__timestamp{color:var(--text-muted)}.comment-thread__body{color:var(--text-primary);line-height:1.6;word-break:break-word}.comment-thread__actions{font-size:var(--font-size-xs);line-height:var(--line-height-tight);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.comment-thread__actions button{outline:2px solid transparent;outline-offset:2px}.comment-thread__actions button:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.comment-thread__actions button{display:inline-flex;align-items:center;gap:.25rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--border-subtle);background-color:var(--surface-base);padding:.25rem .75rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.comment-thread__actions button:focus-visible,.comment-thread__actions button:hover{color:var(--text-primary);border-color:var(--border-default)}.comment-thread__replies{display:flex;flex-direction:column;gap:var(--space-md);margin:0;margin-inline-start:calc(var(--space-lg) + var(--space-sm));padding-inline-start:var(--space-md);padding-block-start:var(--space-md);border-inline-start:var(--border-width-hairline) solid var(--border-subtle);list-style:none}.comment-thread__load-more{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--border-subtle);background-color:var(--surface-base);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--text-primary);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.comment-thread__load-more:focus-visible,.comment-thread__load-more:hover{border-color:var(--border-default);color:var(--text-primary);background-color:color-mix(in srgb,var(--surface-alt) 70%,transparent)}.comment-thread__disabled{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted);border-radius:var(--radius-lg);border:var(--border-width-hairline) dashed color-mix(in srgb,var(--border-default) 32%,transparent);background-color:var(--surface-alt);padding:var(--space-md)}.comment-composer{display:flex;flex-direction:column;gap:var(--space-md);border-top:var(--border-width-hairline) solid var(--border-subtle);padding-top:var(--space-lg)}.comment-composer__field{display:flex;flex-direction:column;gap:var(--space-2xs)}.comment-composer__label{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--text-primary)}.comment-composer__textarea{min-block-size:var(--comment-composer-min-height)}.comment-composer__footer{display:flex;flex-direction:column;gap:var(--space-sm)}.comment-composer__hint{font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted);margin:0}.comment-composer__actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:var(--space-sm)}.comment-composer__char-count{font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:500;color:var(--text-muted)}.comment-composer__submit{outline:2px solid transparent;outline-offset:2px}.comment-composer__submit:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.comment-composer__status{margin:0}@media (min-width:640px){.comment-composer__footer{flex-direction:row;align-items:center;justify-content:space-between}}.video-modal__progress{height:.5rem;width:100%;overflow:hidden;border-radius:var(--radius-full);background-color:var(--border-subtle)}#playerModal.video-modal__stat-metrics{display:block}.video-modal__stat-metrics{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.75rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}.profile-modal{display:flex;flex-direction:column;inline-size:100%;block-size:100%;min-block-size:100%;max-block-size:none;overflow:hidden;--profile-modal-scale:0.9;--profile-modal-gap:calc((var(--space-md) - var(--space-3xs))*var(--profile-modal-scale));--profile-modal-padding-inline:calc((var(--space-lg) - var(--space-md))*var(--profile-modal-scale));--profile-modal-padding-block-start:calc((var(--space-md) - var(--space-2xs))*var(--profile-modal-scale));--profile-modal-padding-block-end:calc((var(--space-lg) - var(--space-sm))*var(--profile-modal-scale));--profile-modal-nav-gap:calc(var(--space-xs)*var(--profile-modal-scale))}.profile-modal__content{display:flex;flex:1 1 auto;flex-direction:column;block-size:100%;min-block-size:0;transform:scale(var(--profile-modal-scale));transform-origin:top center}.profile-modal__active-profile{outline:2px solid transparent;outline-offset:2px}.profile-modal__active-profile:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.profile-modal__active-profile{display:block}.profile-modal__active-profile{display:flex;flex-wrap:wrap;align-items:center;gap:1rem;padding:1rem}.profile-modal__active-details{display:flex;flex:1 1 var(--profile-modal-active-min-width);flex-direction:column;gap:var(--space-2xs);min-inline-size:0}.profile-modal__active-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-xs)}.profile-hashtag-list{display:flex;flex-wrap:wrap;gap:var(--space-xs);margin:0;padding:0;list-style:none}.profile-hashtag-item{display:inline-flex;align-items:center;gap:var(--space-3xs);padding-block:var(--space-3xs);padding-inline:var(--space-sm);border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--color-border-translucent);background-color:var(--color-panel);color:var(--color-text);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);line-height:var(--font-lineheight-tight)}.profile-hashtag-remove{display:inline-flex;align-items:center;justify-content:center;inline-size:var(--space-md);block-size:var(--space-md);border-radius:var(--radius-full);color:var(--color-text-muted);background:transparent;border:none;padding:0;cursor:pointer}.profile-hashtag-remove:hover{color:var(--color-text)}.profile-modal__remove-button{border-width:2px}.profile-modal__remove-button:focus-visible{--tw-ring-color:var(--color-critical-strong)}.profile-modal__add-profile{--tw-ring-color:var(--color-ring-alert);outline:2px solid transparent;outline-offset:2px}.profile-modal__add-profile:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.profile-modal__add-profile{display:block}.profile-modal__add-profile{position:relative;display:flex;width:100%;align-items:center;justify-content:flex-start;gap:1rem;border-radius:var(--radius-xl);padding:1rem 1.25rem;text-align:left;color:var(--text-primary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);border:var(--outline-thick-width) solid var(--color-ring-alert);background-color:var(--surface-panel-hover)}.profile-modal__add-profile:hover{background-color:color-mix(in srgb,var(--surface-panel-hover) 88%,var(--color-ring-alert) 12%)}.profile-modal__add-profile:focus-visible{background-color:color-mix(in srgb,var(--surface-panel-hover) 80%,var(--color-ring-alert) 20%)}#playerModal.profile-modal__add-profile-icon{display:block}.profile-modal__add-profile-icon{display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:var(--radius-full);background-color:color-mix(in srgb,var(--color-ring-alert) 18%,var(--surface-panel));color:var(--color-ring-alert)}.profile-modal__body{overflow:hidden;overflow-x:hidden;padding-block-start:var(--profile-modal-padding-block-start);padding-block-end:var(--profile-modal-padding-block-end);padding-inline:var(--profile-modal-padding-inline)}.profile-modal__body,.profile-modal__layout{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--profile-modal-gap);inline-size:100%;min-block-size:0}.profile-modal__header{align-items:center}.profile-modal__header-title{display:flex;align-items:center;gap:var(--space-sm)}.profile-modal__menu{display:flex;flex-direction:column;gap:var(--space-sm)}.profile-modal__pane-wrapper{display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.profile-modal__nav{display:flex;flex-wrap:wrap;gap:var(--profile-modal-nav-gap);align-self:flex-start;overflow-x:hidden}.profile-modal__panes{flex:1 1 auto;block-size:100%;min-block-size:0;overflow-y:auto;padding-inline-end:var(--profile-modal-scrollbar-offset);scrollbar-gutter:stable}.profile-modal__panes,.profile-pane{display:flex;flex-direction:column;overflow-x:hidden}.profile-pane{min-block-size:auto}.profile-pane.hidden{display:none!important}@supports not (scrollbar-gutter:stable){.profile-modal__panes{padding-inline-end:calc(var(--profile-modal-scrollbar-offset) + var(--space-2xs))}}@media (max-width:calc(1024px - var(--breakpoint-edge-offset ))){.profile-modal__layout[data-mobile-view=menu] .profile-modal__pane-wrapper,.profile-modal__layout[data-mobile-view=pane] .profile-modal__menu{display:none}}@media (min-width:1024px){.profile-modal{max-block-size:var(--modal-shell-max-height)}.profile-modal__body{padding-inline:calc(var(--profile-modal-padding-inline) + var(--space-xs))}.profile-modal__body,.profile-modal__layout{gap:calc(var(--profile-modal-gap) + var(--space-2xs))}.profile-modal__layout{display:grid;align-items:stretch;block-size:100%;grid-template-columns:minmax(var(--profile-modal-nav-min-width),var(--profile-modal-nav-max-width)) minmax(0,1fr);grid-auto-rows:minmax(0,1fr)}.profile-modal__nav{flex-direction:column;flex-wrap:nowrap;gap:var(--profile-modal-nav-gap);justify-self:start;inline-size:var(--profile-modal-nav-max-width);min-inline-size:var(--profile-modal-nav-min-width)}.profile-modal__pane-wrapper{block-size:100%}}.beacon-hidden-download,.torrent-download-anchor,[data-beacon-hidden-download]{display:none!important}.beacon-clipboard-offscreen,.torrent-clipboard-textarea,[data-beacon-clipboard-state=offscreen],[data-beacon-clipboard=offscreen]{position:fixed;top:0;left:var(--offscreen-offset);opacity:0;width:0;height:0;pointer-events:none}.beacon-toast-motion,.torrent-toast-motion{transition-property:opacity,transform;will-change:opacity,transform;opacity:0;transform:translateY(var(--toast-translate))}.beacon-toast-motion[data-beacon-motion=enter],.beacon-toast-motion[data-beacon-motion=show],.torrent-toast-motion[data-beacon-motion=enter],.torrent-toast-motion[data-beacon-motion=show]{opacity:1;transform:translateY(0)}.beacon-toast-motion[data-beacon-motion=exit],.torrent-toast-motion[data-beacon-motion=exit]{opacity:0;transform:translateY(var(--toast-translate))}.torrent-toast{pointer-events:auto;width:100%;max-width:28rem;border-radius:var(--radius-lg);padding:.75rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;letter-spacing:-.025em;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-inset:inset}.torrent-toast--info{border-width:1px;border-color:var(--border-overlay);background-color:var(--surface-base);color:var(--text-primary)}.torrent-toast--success{border-width:1px;border-color:var(--color-info);--tw-border-opacity:0.6;background-color:var(--color-info);color:var(--color-white)}.torrent-toast--error{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.6;background-color:var(--color-critical);color:var(--color-white)}.torrent-toast--warn{border-width:1px;border-color:var(--status-warning-strong);--tw-border-opacity:0.7;background-color:var(--status-warning-strong);color:var(--status-warning-strong)}.watch-history-card{--video-card-lift-translate-y:0;--video-card-backdrop-opacity:0;--video-card-backdrop-translate-y:var(--space-md-plus);--video-card-backdrop-scale:1.08;--video-card-backdrop-blur:var(--blur-thumbnail-blur);outline:2px solid transparent;outline-offset:2px}.watch-history-card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.watch-history-card{position:relative;border-radius:var(--radius-lg);border-width:1px;border-color:transparent;background-color:var(--surface-raised);color:var(--text-primary);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transform:translate3d(0,var(--video-card-lift-translate-y),0);transition-property:transform,box-shadow,border-color,background-color,color;will-change:transform;isolation:isolate}.watch-history-card:before{content:"";position:absolute;inset:0;z-index:0;opacity:var(--video-card-backdrop-opacity);background-image:var(--video-card-thumb-url,none);background-position:50%;background-repeat:no-repeat;background-size:cover;transform:translate3d(0,var(--video-card-backdrop-translate-y),0) scale(var(--video-card-backdrop-scale));filter:blur(var(--video-card-backdrop-blur));transition:opacity var(--motion-duration-base) var(--motion-ease-in-out),transform var(--motion-duration-base) var(--motion-ease-in-out),filter var(--motion-duration-base) var(--motion-ease-in-out);pointer-events:none;will-change:opacity,transform,filter}.watch-history-card>*{position:relative;z-index:1}.watch-history-card:focus-within,.watch-history-card:hover{--video-card-lift-translate-y:var(--motion-video-card-hover-translate);--video-card-backdrop-opacity:0.425;--video-card-backdrop-translate-y:var(
--motion-video-card-backdrop-translate
- );--video-card-backdrop-scale:1.12;--video-card-backdrop-blur:var(--blur-video-card-backdrop-strong);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card:focus-visible{border-color:var(--color-accent);--tw-border-opacity:0.4;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=critical]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}.watch-history-card[data-state=private]{background-color:var(--surface-raised-private);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.watch-history-card[data-state=disabled],.watch-history-card[data-state=private]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=disabled]{opacity:.6;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.watch-history-card[data-alert=nsfw-owner]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--color-black)}.watch-history-card[data-alert=nsfw-owner]:hover{--tw-border-opacity:0.6;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card img[data-thumbnail-state=blurred],.watch-history-card img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}.watch-history-card[data-owner-is-viewer=true][data-url-health-state=offline][data-stream-health-state=unhealthy]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max));flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}.watch-history-card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}#playerModal.watch-history-card{display:block}.watch-history-card{display:flex;flex-wrap:wrap;align-items:stretch;gap:1.25rem;padding:1rem;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}@media (prefers-reduced-motion:reduce){.watch-history-card,.watch-history-card[data-motion=enter]{transition-property:none}.watch-history-card[data-motion=enter]{opacity:1;animation:none}}.watch-history-card:hover{--tw-translate-y:-0.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.watch-history-card{gap:1.5rem;padding:1.25rem}}.watch-history-card--private{border-color:var(--color-info);--tw-border-opacity:0.6}#playerModal.watch-history-card__primary{display:block}.watch-history-card__primary{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;align-items:stretch;gap:1rem}@media (min-width:640px){.watch-history-card__primary{flex-direction:row}}.watch-history-card__thumbnail{display:block;width:14rem;max-width:100%;flex:none;color:var(--text-primary);text-decoration-line:none}.watch-history-card__thumbnailInner{aspect-ratio:16/9;width:100%;overflow:hidden;border-radius:var(--radius-lg);background-color:var(--surface-base)}.watch-history-card__thumbnailInner img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.watch-history-card [data-thumbnail-state=blurred] img,.watch-history-card [data-visual-state=blurred] img{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal.watch-history-card__details{display:block}.watch-history-card__details{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;justify-content:center;gap:var(--space-sm)}.watch-history-card__title{cursor:pointer;font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;line-height:1.375;color:var(--text-primary);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.watch-history-card__title:focus,.watch-history-card__title:hover{color:var(--color-accent)}.watch-history-card__created{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}#playerModal.watch-history-card__meta{display:block}.watch-history-card__meta{display:flex;min-width:0;flex-direction:column;justify-content:space-between;gap:1rem}@media (min-width:640px){.watch-history-card__meta{min-width:14rem;flex:none;flex-basis:16rem}}.watch-history-card__watched{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--border-subtle)}#playerModal.watch-history-card__creator{display:block}.watch-history-card__creator{display:flex;align-items:center;gap:.75rem}#playerModal.watch-history-card__creatorAvatar{display:block}.watch-history-card__creatorAvatar{display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;overflow:hidden;border-radius:var(--radius-full);background-color:var(--surface-panel);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorAvatar:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible,.watch-history-card__creatorAvatar:hover{--tw-ring-color:color-mix(in srgb,var(--color-accent) 38%,transparent)}.watch-history-card__creatorAvatar img{height:100%;width:100%;border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover}.watch-history-card__creatorName{cursor:pointer;background-color:transparent;padding:0;text-align:left;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorName:hover{color:var(--color-accent)}.watch-history-card__creatorName:focus-visible{color:var(--color-accent)}#playerModal.watch-history-card__actions{display:block}.watch-history-card__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem}.watch-history-card__action{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--surface-panel);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__action:hover{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action:focus-visible{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action--primary{background-color:var(--color-accent-strong);color:var(--color-white)}.watch-history-card__action--primary:hover{background-color:var(--color-accent-pressed)}.watch-history-card__action--primary:focus-visible{background-color:var(--color-accent-pressed)}.watch-history-card__action--danger{background-color:var(--color-critical);color:var(--color-white)}.watch-history-card__action--danger:hover{background-color:var(--color-critical-strong)}.watch-history-card__action--danger:focus-visible{background-color:var(--color-critical-strong)}#playerModal.watch-history-card__moderation{display:block}.watch-history-card__moderation{margin-top:var(--space-sm);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.watch-history-card__hidden{margin-top:var(--space-md);border-radius:var(--radius-lg);border-width:1px;border-style:dashed;border-color:var(--border-default);background-color:var(--surface-overlay-panel-soft);font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary)}.watch-history-card__hidden .moderation-badge{align-self:flex-start}#playerModal .channel-card__avatar img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal .video-modal__moderation-bar .moderation-badge{--text-status-neutral-on:var(--color-text);--text-status-warning-on:var(--color-warning-on)}#playerModal .video-modal__moderation-bar .moderation-badge[data-variant=neutral]{color:var(--color-text)}.\!container{max-width:var(--layout-docs-max-width)!important;margin:0 auto!important;padding:var(--space-md)!important}.container{max-width:var(--layout-docs-max-width);margin:0 auto;padding:var(--space-md)}.qr-code__table{margin:var(--qr-code-table-margin,0)}.qr-code__cell,.qr-code__table{border:0;border-collapse:collapse}.qr-code__cell{padding:0;margin:0;width:var(--qr-code-cell-width);height:var(--qr-code-cell-height);background-color:var(--qr-code-color-light)}.qr-code__cell--dark{background-color:var(--qr-code-color-dark)}.qr-code__container[data-qr-code-mode=image] .qr-code__canvas{display:none}.qr-code__container[data-qr-code-mode=canvas] .qr-code__canvas,.qr-code__container[data-qr-code-mode=image] .qr-code__image{display:block}.qr-code__container[data-qr-code-mode=canvas] .qr-code__image{display:none}.fade-in{opacity:0;animation:interface-fade-in .28s ease-out forwards;animation-delay:var(--fade-in-delay,0ms)}.fade-in-delay-100{--fade-in-delay:100ms}.fade-in-delay-200{--fade-in-delay:200ms}.fade-in-delay-300{--fade-in-delay:300ms}.\!card[data-motion=enter]{opacity:0!important;animation:card-motion-enter .22s ease-out forwards!important}.card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg);flex:0 0 var(--icon-size-lg);line-height:0;background-color:var(--color-neutral-700);color:var(--color-white);border:none;border-radius:var(--radius-full);cursor:pointer;transition:background-color .2s ease,box-shadow .2s ease}.icon-button:hover{background-color:var(--color-neutral-600)}.icon-button:active,.icon-button:focus{outline:none;box-shadow:0 0 0 var(--icon-button-ring-width) var(--color-ring-alert)}.icon-image{width:var(--icon-size-md);height:var(--icon-size-md);pointer-events:none}.accent-action-button,.channel-action-button{--accent-action-bg:color-mix(in srgb,var(--surface-overlay-panel) 78%,transparent);--accent-action-border:color-mix(in srgb,var(--border-overlay) 92%,transparent);--accent-action-bg-hover:color-mix(in srgb,var(--color-accent) 22%,var(--surface-overlay-panel));--accent-action-ring:color-mix(in srgb,var(--color-accent) 48%,transparent);--accent-action-bg-active:color-mix(in srgb,var(--color-accent-pressed) 28%,var(--surface-overlay-panel));color:var(--color-text);background-color:var(--accent-action-bg);border-color:var(--accent-action-border);border-style:solid;border-width:var(--border-width-hairline)}.accent-action-button:focus-visible,.accent-action-button:hover,.channel-action-button:focus-visible,.channel-action-button:hover{color:var(--color-accent-strong);background-color:var(--accent-action-bg-hover)}.accent-action-button:focus,.accent-action-button:focus-visible,.channel-action-button:focus,.channel-action-button:focus-visible{box-shadow:0 0 0 var(--icon-button-ring-width) var(--accent-action-ring)}.accent-action-button:active,.channel-action-button:active{color:var(--color-accent-pressed);background-color:var(--accent-action-bg-active)}.modal-nav .icon-button{box-shadow:none;padding:0;gap:0;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg)}.modal-nav .icon-button:not(.accent-action-button):not(.channel-action-button){border:none}.modal-meta{gap:var(--space-xs)}.modal-meta,.modal-view-count{display:inline-flex;align-items:center}.modal-view-count{gap:var(--space-2xs);font-size:var(--font-size-sm);line-height:var(--space-md-plus);color:var(--color-muted-alt);white-space:nowrap}.view-count-text{white-space:nowrap;color:var(--color-muted-strong)}.ratio-16-9{position:relative;width:100%;padding-top:56.25%;background-color:var(--color-card)}.ratio-16-9>img{position:absolute;inset:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}#modalContainer{position:fixed;inset:0;z-index:var(--z-modal-root);pointer-events:none;isolation:isolate}#modalContainer>*{pointer-events:auto}#modalContainer>[id$=Modal]:not(#playerModal){z-index:var(--z-modal-root)}#modalContainer>[id$=Modal]:not(#playerModal)>.bv-modal-backdrop{z-index:var(--z-modal-overlay)}#modalContainer>[id$=Modal]:not(#playerModal) .bv-modal__panel{z-index:var(--z-modal-content)}#modalContainer>#profileModal,#profileModal[data-modal-stack=top]{z-index:var(--z-modal-top-root)}#modalContainer>#profileModal>.bv-modal-backdrop,#profileModal[data-modal-stack=top]>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#profileModal .bv-modal__panel,#profileModal[data-modal-stack=top] .bv-modal__panel{z-index:var(--z-modal-top-content)}#modalContainer>#eventDetailsModal{z-index:var(--z-modal-top-root)}#modalContainer>#eventDetailsModal>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#eventDetailsModal .bv-modal__panel{z-index:var(--z-modal-top-content)}.bv-modal[data-nested-modal-active=true]{pointer-events:none;visibility:hidden}#modalContainer>#loginModal{z-index:var(--z-modal-peak-root)}#modalContainer>#loginModal>.bv-modal-backdrop{z-index:var(--z-modal-peak-overlay)}#modalContainer>#loginModal .bv-modal__panel{z-index:var(--z-modal-peak-content)}#modalContainer>#playerModal{z-index:var(--z-modal-player)}#modalContainer>#playerModal .player-modal__container,#modalContainer>#playerModal .player-modal__content{z-index:var(--z-modal-content)}#playerModal{position:fixed;inset:0;z-index:var(--z-modal-player);display:none;flex-direction:column;align-items:stretch;justify-content:flex-start;width:100vw;height:100vh;padding:0;background-color:var(--color-surface);color:var(--color-subtle-text);--player-modal-inline-max:var(--layout-player-max-width);--player-modal-inline-padding:clamp(var(--space-md-plus),4vw,var(--space-2xl));overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}#playerModal.flex{display:block}#modalVideo{width:100%;aspect-ratio:16/9;background-color:var(--color-black)}.notification-portal{position:fixed;top:0;left:0;right:0;z-index:var(--z-overlay-toast);display:flex;flex-direction:column;align-items:center;gap:var(--space-md);padding:calc(var(--space-xl) + env(safe-area-inset-top)) var(--space-lg) var(--space-lg);pointer-events:none;opacity:0;transform:translateY(var(--toast-translate));transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}@media (min-width:640px){.notification-portal{padding-inline:var(--space-xl)}}.notification-portal:has(.notification-banner:not(.hidden)){opacity:1;transform:translateY(0)}.notification-portal--active{opacity:1;transform:translateY(0)}.notification-banner,.torrent-toast{--notify-accent:var(--color-accent-strong);--notify-accent-strong:var(--color-accent);--notify-border:var(--surface-overlay-panel-tint);--notify-background:var(--surface-overlay-panel);--notify-foreground:var(--color-text);position:relative;display:flex;align-items:center;gap:var(--space-md);width:min(var(--notification-banner-max-inline),100%);padding:var(--space-md) var(--space-xl);border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--notify-border);background:var(--notify-background);color:var(--notify-foreground);box-shadow:0 var(--shadow-notification-offset-y) var(--shadow-notification-blur) var(--color-shadow-notification);backdrop-filter:blur(var(--overlay-backdrop-blur));pointer-events:auto;isolation:isolate;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;line-height:1.375;transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}.notification-banner:before,.torrent-toast:before{content:"";position:absolute;inset:0;border-radius:inherit;background:linear-gradient(135deg,var(--notify-accent) 0,var(--notify-accent-strong) 100%);opacity:.18;pointer-events:none}.notification-banner>*,.torrent-toast>*{position:relative;z-index:1}.notification-dismiss{display:inline-flex;height:2rem;width:2rem;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);color:inherit;opacity:.75;background-color:var(--notify-dismiss-background)}.notification-dismiss:focus-visible,.notification-dismiss:hover{opacity:1;background-color:var(--notify-dismiss-background-hover)}.notification-dismiss svg{height:1rem;width:1rem}.notification-banner:not(.hidden){animation:notification-slide-in var(--motion-duration-base) var(--motion-ease-out)}.notification-banner--critical,.torrent-toast--error{--notify-accent:var(--color-critical-strong);--notify-accent-strong:var(--color-critical);--notify-border:var(--color-ring-critical-soft);--notify-background:var(--color-card-critical);--notify-foreground:var(--color-critical-strong)}.notification-banner--success,.torrent-toast--success{--notify-accent:var(--status-success-strong);--notify-accent-strong:var(--status-success);--notify-border:var(--status-success-border);--notify-background:var(--status-success-surface);--notify-foreground:var(--status-success-on)}.notification-banner--info,.torrent-toast--info{--notify-accent:var(--color-info-strong);--notify-accent-strong:var(--color-info);--notify-border:var(--color-info-border);--notify-background:var(--status-info-surface)}.notification-banner--warning,.torrent-toast--warn{--notify-accent:var(--color-warning-strong);--notify-accent-strong:var(--color-warning);--notify-border:var(--status-warning-border);--notify-background:var(--status-warning-surface);--notify-foreground:var(--status-warning-on)}.status-banner .status-spinner{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-info-border);border-radius:var(--radius-full);border-top-color:var(--color-info);flex-shrink:0;height:var(--icon-size-md);width:var(--icon-size-md)}.status-banner .status-message{flex:1 1 auto}@keyframes notification-slide-in{0%{opacity:0;transform:translateY(var(--toast-translate))}to{opacity:1;transform:translateY(0)}}.status-spinner--inline{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-border-info-soft);border-radius:var(--radius-full);border-top-color:var(--color-info);display:inline-block;height:var(--space-md);width:var(--space-md)}body.iframe-form{background-color:transparent;color:var(--color-text);font-family:var(--font-family-sans);margin:var(--space-lg)}body.iframe-form .container{width:100%;max-width:100%;margin:0;padding:0}body.iframe-form .\!container{width:100%!important;max-width:100%!important;margin:0!important;padding:0!important}body.iframe-form .form-container{background-color:var(--color-surface-alt);border-radius:var(--radius-md);box-shadow:var(--shadow-md);color:var(--color-text);display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-lg)}body.iframe-form .form-container>p{margin:0}body.iframe-form form{display:flex;flex-direction:column}body.iframe-form form>*+*{margin-top:var(--space-sm)}body.iframe-form form h1,body.iframe-form form h2{color:var(--color-text);margin-top:var(--space-md)}body.iframe-form label{color:var(--color-subtle-text);display:block;font-weight:600;margin-top:var(--space-sm)}body.iframe-form label+.form-control,body.iframe-form label+.select,body.iframe-form label+.textarea{margin-top:var(--space-xs)}body.iframe-form .checkbox-group,body.iframe-form .radio-group{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-xs)}body.iframe-form .checkbox-group label,body.iframe-form .radio-group label{align-items:center;color:var(--color-subtle-text);display:inline-flex;font-weight:500;gap:var(--space-xs);margin:0}body.iframe-form .checkbox-group input[type=checkbox],body.iframe-form .radio-group input[type=radio]{margin:0}body.iframe-form .radio-group input[type=radio]{accent-color:var(--color-accent-strong)}body.iframe-form button.btn{align-self:flex-start;margin-top:var(--space-md)}body.iframe-form button.\!btn{align-self:flex-start!important;margin-top:var(--space-md)!important}body.iframe-form #status{background:var(--color-surface);border-radius:var(--radius-sm);box-shadow:inset 0 0 0 var(--border-width-hairline) var(--color-border-translucent);color:var(--color-subtle-text);min-height:calc(var(--space-2xl) + var(--space-xl));padding:var(--space-sm);white-space:pre-wrap}body.iframe-form .status-line{color:var(--color-subtle-text);margin:var(--space-2xs) 0}body.iframe-form .status-line.error{color:var(--color-critical-strong)}body.iframe-form .status-line.\!error{color:var(--color-critical-strong)!important}body.iframe-form .status-line.success{color:var(--color-info-strong)}body.iframe-form .status-line.\!success{color:var(--color-info-strong)!important}body.iframe-form .status-line.warn{color:var(--color-warning-strong)}@media (max-width:640px){body.iframe-form{margin:var(--space-md)}body.iframe-form .form-container{padding:var(--space-md)}}#sidebarContainer{position:relative;overflow:visible}#sidebar{position:fixed;top:0;left:0;width:var(--sidebar-width);min-width:var(--sidebar-width);height:100vh;height:100dvh;color:var(--color-text-frosted-strong);overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;overscroll-behavior-inline:contain;touch-action:pan-y;scrollbar-gutter:stable both-edges;background:transparent;border-right:none;backdrop-filter:none;-webkit-backdrop-filter:none;transition:width .2s ease,transform .3s ease;z-index:var(--z-sidebar);box-shadow:none;isolation:isolate}#app.sidebar-collapsed,#sidebar.sidebar-collapsed,#sidebar[data-state=collapsed],body.sidebar-collapsed{--sidebar-width:var(--sidebar-width-collapsed)}#app.sidebar-expanded,#sidebar.sidebar-expanded,#sidebar[data-state=expanded],body.sidebar-expanded{--sidebar-width:var(--sidebar-width-expanded)}#sidebar .sidebar__inner{padding-block-start:max(var(--space-sidebar-shell-block-start),calc(var(--app-header-centerline) - var(--sidebar-control-size)/2));padding-block-end:var(--space-sidebar-shell-block-end);padding-inline:var(--space-sidebar-shell-inline);border-radius:var(--radius-sidebar-shell);border:none;background:none;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;isolation:isolate;transition:color .2s ease}#sidebar .sidebar__inner,.sidebar-scroll{display:flex;flex-direction:column;height:100%;width:100%;overflow:visible}.sidebar-scroll{gap:var(--space-sidebar-scroll-gap);min-height:0;flex:1 1 auto}.sidebar-panel{position:relative;width:100%;display:flex;flex-direction:column;gap:var(--space-sidebar-panel-gap);padding:var(--space-sidebar-panel-padding-block) var(--space-sidebar-panel-padding-inline);border-radius:var(--radius-sidebar-panel);border:none;background:transparent;box-shadow:none;color:inherit;backdrop-filter:none;-webkit-backdrop-filter:none;overflow:hidden;isolation:isolate;transition:border-color .2s ease,box-shadow .22s ease,background .22s ease}.sidebar-panel--primary{flex:1 1 auto;min-height:0;padding-block-start:0}.sidebar-panel__header{display:flex;justify-content:flex-end;margin-bottom:var(--space-md)}.sidebar-collapse-toggle{display:inline-flex;align-items:center;justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--color-border-translucent-medium);background:var(--color-surface-tint-subtle);color:inherit;cursor:pointer;transition:background .18s ease,color .18s ease,border-color .18s ease;flex-shrink:0;box-sizing:border-box}.sidebar-collapse-toggle:hover{background:var(--color-border-translucent);border-color:var(--color-border-translucent-stronger);color:var(--color-text)}.sidebar-collapse-toggle:focus-visible{outline:var(--space-3xs) solid var(--color-secondary);outline-offset:var(--space-2xs)}.sidebar-collapse-toggle__icon{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .2s ease}.sidebar-nav{display:flex;flex-direction:column;gap:var(--space-xs);opacity:1;transition:opacity .16s ease;width:100%}.sidebar-nav-link{--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-opacity:0;--sidebar-nav-link-highlight-scale:0.96;display:flex;align-items:center;gap:var(--space-sidebar-footer-gap);padding-block:var(--space-sidebar-nav-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);font-size:var(--font-size-sidebar-nav);font-weight:600;letter-spacing:.015em;color:var(--color-text);text-decoration:none;width:100%;position:relative;border:var(--border-width-hairline) solid transparent;background:none;box-shadow:none;transform:translateX(var(--sidebar-nav-translate-x));transition:color .18s ease,border-color .2s ease,box-shadow .22s ease,transform .22s ease;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none}.sidebar-nav-link:after,.sidebar-nav-link:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none;transition:opacity .22s ease,transform .24s ease;z-index:-1}.sidebar-nav-link:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:var(--sidebar-nav-link-highlight-opacity);transform:scale(var(--sidebar-nav-link-highlight-scale));filter:saturate(140%)}.sidebar-nav-link:after{background:linear-gradient(105deg,var(--color-sidebar-hover) 0,transparent 75%);opacity:.22;mix-blend-mode:screen;z-index:-2}.sidebar-nav-link:focus-visible,.sidebar-nav-link:hover{--sidebar-nav-link-highlight-opacity:1;--sidebar-nav-link-highlight-scale:1.02;--sidebar-nav-translate-x:var(--space-sidebar-nav-translate);color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible:after,.sidebar-nav-link:hover:after{opacity:.35}.sidebar-nav-link--sub{font-size:var(--font-size-sidebar-subnav);font-weight:500;color:var(--color-sidebar-text-muted);padding-block:var(--space-sidebar-subnav-padding-block);letter-spacing:.02em;--sidebar-nav-link-highlight-opacity:0.25;--sidebar-nav-link-highlight-scale:1}.sidebar-icon{width:var(--space-lg);height:var(--space-lg);min-width:var(--space-lg);min-height:var(--space-lg);flex-shrink:0;display:block;filter:var(--sidebar-icon-filter);transition:filter .18s ease}.sidebar-footer{flex-direction:column;margin-top:auto;z-index:2}.sidebar-dropup-trigger,.sidebar-footer{display:flex;gap:var(--space-sidebar-footer-gap);position:relative}.sidebar-dropup-trigger{align-items:center;justify-content:space-between;width:100%;padding-block:var(--space-sidebar-trigger-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);border:var(--border-width-hairline) solid transparent;background:none;color:var(--color-text);font-size:var(--font-size-sidebar-trigger);font-weight:600;cursor:pointer;box-sizing:border-box;flex-shrink:0;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none;box-shadow:none;transition:border-color .2s ease,color .2s ease,box-shadow .22s ease}.sidebar-dropup-trigger:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:0;transform:scale(.96);transition:opacity .2s ease,transform .22s ease;z-index:-1;filter:saturate(140%)}.sidebar-dropup-trigger:after,.sidebar-dropup-trigger:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none}.sidebar-dropup-trigger:after{background:linear-gradient(110deg,var(--color-sidebar-hover) 0,transparent 80%);opacity:.18;mix-blend-mode:screen;transition:opacity .2s ease;z-index:-2}.sidebar-dropup-trigger:focus-visible,.sidebar-dropup-trigger:hover{color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger:focus-visible:before,.sidebar-dropup-trigger:hover:before{opacity:1;transform:scale(1.02)}.sidebar-dropup-trigger:focus-visible:after,.sidebar-dropup-trigger:hover:after{opacity:.35}.sidebar-dropup-trigger:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger__glyph{width:var(--icon-size-md);height:var(--icon-size-md);opacity:.9}.sidebar-dropup-trigger__chevron{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .18s ease}.sidebar-dropup-trigger[aria-expanded=true] .sidebar-dropup-trigger__chevron,.sidebar-dropup-trigger__chevron.is-rotated{transform:rotate(180deg)}.sidebar-dropup-panel{position:absolute;left:0;right:0;bottom:calc(100% + var(--space-sidebar-popover-offset));border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--color-sidebar-border-strong);background:linear-gradient(160deg,color-mix(in srgb,var(--color-sidebar-surface) 88%,transparent) 0,color-mix(in srgb,var(--color-sidebar-surface-alt) 68%,transparent) 100%);box-shadow:inset 0 0 0 var(--border-width-fine) var(--color-sidebar-border),var(--shadow-sidebar-panel);padding:var(--space-sidebar-popover-padding-block) var(--space-sidebar-popover-padding-inline);color:var(--color-text-frosted);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(var(--space-sm));transition:opacity .18s ease,transform .18s ease,visibility .18s ease,box-shadow .22s ease;backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));-webkit-backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));z-index:5;isolation:isolate}.sidebar-dropup-panel[data-state=expanded]{opacity:1;visibility:visible;pointer-events:auto;transform:translateY(0)}.sidebar-dropup-panel__inner{display:flex;flex-direction:column;gap:var(--space-sidebar-popover-gap);width:100%;padding-inline-end:var(--space-sidebar-dropup-scroll-reserve);max-height:var(--sidebar-dropup-max-height);overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable both-edges}.sidebar-dropup-panel__inner.is-measuring{position:absolute;width:-moz-max-content;width:max-content;max-width:none;visibility:hidden;pointer-events:none;left:var(--offscreen-offset);right:auto;top:auto;bottom:auto}.sidebar-dropup-measure{position:absolute;visibility:hidden;pointer-events:none;height:0;overflow:hidden}.sidebar-dropup-panel__inner>*{width:100%;min-width:0}#sidebar[data-footer-state=expanded] .sidebar-nav{opacity:0;pointer-events:none}#sidebar[data-footer-state=collapsed] .sidebar-nav{opacity:1}.sidebar-loading-wrapper{display:flex;justify-content:center;align-items:center;padding:var(--space-2xl) 0;width:100%;grid-column:1/-1}.sidebar-loading-indicator{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--color-muted-strong);font-size:var(--font-size-sm);font-weight:500;letter-spacing:.01em}.sidebar-loading-text{white-space:nowrap}#app{box-sizing:border-box;transition:margin-left .2s ease,width .2s ease,max-width .2s ease}#app[data-sidebar-state=collapsed]{margin-left:var(--sidebar-width-collapsed);width:calc(100vw - var(--sidebar-width-collapsed));max-width:calc(100vw - var(--sidebar-width-collapsed))}#app[data-sidebar-state=expanded]{margin-left:max(var(--sidebar-width-expanded-base),var(--sidebar-dropup-content-width));width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)))}#sidebar.sidebar-collapsed .sidebar-nav-link,body.sidebar-collapsed #sidebar .sidebar-nav-link{justify-content:center;width:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full);--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-scale:1}#sidebar.sidebar-expanded .sidebar-nav-link,body.sidebar-expanded #sidebar .sidebar-nav-link{justify-content:flex-start}#sidebar.sidebar-collapsed .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-text{display:none}#sidebar.sidebar-collapsed .sidebar__inner,body.sidebar-collapsed #sidebar .sidebar__inner{padding-inline:var(--space-2xs)}#sidebar.sidebar-collapsed .sidebar-panel,body.sidebar-collapsed #sidebar .sidebar-panel{padding-inline:calc(var(--space-3xs)*3)}#sidebar.sidebar-collapsed .sidebar-panel__header,body.sidebar-collapsed #sidebar .sidebar-panel__header{justify-content:center}#sidebar.sidebar-collapsed .sidebar-collapse-toggle,body.sidebar-collapsed #sidebar .sidebar-collapse-toggle{margin-inline:auto}#sidebar .sidebar-toggle-icon--rotated{transform:rotate(180deg)}#sidebar.sidebar-collapsed .sidebar-toggle-icon--rotated,body.sidebar-collapsed #sidebar .sidebar-toggle-icon--rotated{transform:rotate(0deg)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger{justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__chevron{display:none}#sidebar.sidebar-collapsed .sidebar-dropup-trigger__glyph,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__glyph{margin:0}#sidebar.sidebar-collapsed .sidebar-nav-link:focus-visible,#sidebar.sidebar-collapsed .sidebar-nav-link:hover,body.sidebar-collapsed #sidebar .sidebar-nav-link:focus-visible,body.sidebar-collapsed #sidebar .sidebar-nav-link:hover{--sidebar-nav-translate-x:0}@media (min-width:768px){.sidebar-panel__header{display:flex}.sidebar-collapse-toggle{display:inline-flex}#sidebar{transform:translateX(0)!important;width:var(--sidebar-width);overflow:visible}#app[data-sidebar-state=collapsed]{margin-left:calc(var(--sidebar-width-collapsed) + var(--sidebar-content-gap));width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap));max-width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap))}#app[data-sidebar-state=expanded]{margin-left:max(calc(var(--sidebar-width-expanded-base) + var(--sidebar-content-gap)),calc(var(--sidebar-dropup-content-width) + var(--sidebar-content-gap)));width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)))}}@keyframes card-motion-enter{0%{opacity:0;transform:translateY(var(--motion-card-enter-translate))}to{opacity:1;transform:translateY(0)}}@keyframes video-thumbnail-fade-in{0%{opacity:0}to{opacity:1}}@keyframes interface-fade-in{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0;transform:translateY(var(--motion-fade-in-translate))}to{opacity:1;transform:translateY(0)}}.status-line{margin-top:.25rem;margin-bottom:.25rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);line-height:1.375;color:var(--text-primary)}.status-line.error{color:var(--color-critical-strong)}.status-line.\!error{color:var(--color-critical-strong)!important}.status-line.warn{color:var(--color-warning-strong)}@keyframes ztr-rotate{to{transform:rotate(1turn)}}@keyframes ztr-dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes svelte-181fgen-loader-animation{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes svelte-181fgen-fade-in{to{opacity:1}}.dm-app-shell{display:flex;flex-direction:column;gap:var(--space-lg);padding:var(--space-lg);background:var(--surface-base);color:var(--text-primary);min-height:100vh}.dm-app-shell__main,.dm-app-shell__sidebar{border-radius:var(--radius-lg);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-panel);box-shadow:var(--shadow-soft)}.dm-app-shell__sidebar{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md)}.dm-app-shell__title{font-size:var(--font-size-lg);margin:0}.dm-app-shell__main{flex:1;display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);background:var(--surface-raised)}.dm-conversation-list{display:flex;flex-direction:column;gap:var(--space-sm)}.dm-conversation-list__header{display:flex;justify-content:space-between;align-items:center}.dm-conversation-list__title{font-size:var(--font-size-sm);text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);margin:0}.dm-conversation-list__items{display:flex;flex-direction:column;gap:var(--space-xs);overflow-y:auto;max-height:60vh;padding-right:var(--space-xs)}.dm-conversation-list__state{font-size:var(--font-size-sm);color:var(--text-muted);padding:var(--space-md);text-align:center;background:var(--surface-sunken);border-radius:var(--radius-md)}.dm-contact-row{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-subtle);background:transparent;color:inherit;text-align:left;cursor:pointer}.dm-contact-row:focus-visible,.dm-contact-row:hover{background:var(--surface-muted);border-color:var(--border-strong);outline:none}.dm-contact-row--active{background:var(--surface-sunken);border-color:var(--border-strong)}.dm-contact-row__content{display:flex;flex-direction:column;gap:var(--space-2xs);flex:1}.dm-contact-row__header{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-xs)}.dm-contact-row__name{font-weight:600}.dm-contact-row__time{font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-contact-row__preview{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-contact-row__badge{align-self:flex-start;padding:var(--space-3xs) var(--space-xs);border-radius:var(--radius-full);background:var(--surface-overlay);color:var(--text-inverse);font-size:var(--font-size-3xs)}.dm-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);background:var(--surface-sunken);color:var(--text-muted);font-weight:600;overflow:hidden;border:var(--border-width-hairline) solid var(--border-subtle)}.dm-avatar__image{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.dm-message-thread{display:flex;flex-direction:column;gap:var(--space-sm);flex:1;min-height:0}.dm-message-thread__header{display:flex;align-items:baseline;gap:var(--space-sm)}.dm-message-thread__title{font-size:var(--font-size-base);margin:0}.dm-message-thread__status{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-message-thread__timeline{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-sm);border-radius:var(--radius-md);background:var(--surface-panel);border:var(--border-width-hairline) solid var(--border-subtle);overflow-y:auto;min-height:16rem}.dm-message-thread__state{padding:var(--space-md);text-align:center;color:var(--text-muted);background:var(--surface-sunken);border-radius:var(--radius-md)}.dm-message-bubble{max-width:85%;display:flex;flex-direction:column;gap:var(--space-2xs);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-lg);border:var(--border-width-hairline) solid var(--border-subtle);background:var(--surface-sunken)}.dm-message-bubble__content{font-size:var(--font-size-sm)}.dm-message-bubble__meta{display:flex;gap:var(--space-xs);font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-message-bubble__status{color:var(--status-danger)}.dm-day-divider{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:var(--space-xs);color:var(--text-muted);font-size:var(--font-size-2xs)}.dm-day-divider__line{height:1px;background:var(--border-subtle)}.dm-notification-center{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-notification-center__empty{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-notification-center__item{padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-subtle);background:var(--surface-sunken);font-size:var(--font-size-xs)}.dm-composer{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-composer__label{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-composer__input{resize:vertical;border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-base);color:var(--text-primary);padding:var(--space-sm);font-family:inherit}.dm-composer__input:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.dm-composer__actions{display:flex;justify-content:space-between;align-items:center;gap:var(--space-sm)}.dm-composer__hint{font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-composer__send{border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-strong);background:var(--surface-overlay-panel);color:var(--text-primary);padding:var(--space-xs) var(--space-md);font-weight:600;cursor:pointer}.dm-composer__send:focus-visible,.dm-composer__send:hover{background:var(--surface-overlay-panel-soft);outline:none}.dm-composer__status{font-size:var(--font-size-2xs);color:var(--status-danger);min-height:1rem}@media (min-width:768px){.dm-app-shell{flex-direction:row;align-items:stretch}.dm-app-shell__sidebar{flex:0 0 18rem;max-width:20rem}.dm-app-shell__main,.dm-app-shell__sidebar{height:calc(100vh - var(--space-lg)*2)}.dm-conversation-list__items{max-height:none;flex:1}}@media (min-width:1024px){.dm-app-shell__sidebar{flex-basis:20rem}.dm-message-thread__timeline{padding:var(--space-md)}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.left-4{left:1rem}.right-3{right:.75rem}.right-4{right:1rem}.right-6{right:1.5rem}.top-0{top:0}.top-3{top:.75rem}.z-10{z-index:10}.z-50{z-index:50}.z-\[140\]{z-index:140}.z-overlay-floating{z-index:var(--z-overlay-floating)}.z-overlay-toast{z-index:var(--z-overlay-toast)}.order-1{order:1}.order-2{order:2}.col-span-full{grid-column:1/-1}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.mt-sm{margin-top:var(--space-sm)}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.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}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2xl{height:var(--space-2xl)}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-auto{height:auto}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.max-h-modal-body{max-height:var(--modal-body-max-height)}.max-h-modal-pane{max-height:var(--modal-pane-max-height)}.max-h-modal-sheet{max-height:var(--modal-sheet-max-height)}.max-h-modal-shell{max-height:var(--modal-shell-max-height)}.min-h-0{min-height:0}.min-h-\[200px\]{min-height:200px}.min-h-\[80px\]{min-height:80px}.min-h-\[96px\]{min-height:96px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[calc\(100\%-3rem\)\]{width:calc(100% - 3rem)}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-\[200px\]{max-width:200px}.max-w-docs{max-width:var(--layout-docs-max-width)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-popover-safe{max-width:var(--popover-inline-safe-max)}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.origin-bottom-right{transform-origin:bottom right}.rotate-90{--tw-rotate:90deg}.rotate-90,.scale-\[1\.2\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[1\.2\]{--tw-scale-x:1.2;--tw-scale-y:1.2}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-y{resize:vertical}.resize{resize:both}.list-disc{list-style-type:disc}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-sm{gap:var(--space-sm)}.gap-xl{gap:var(--space-xl)}.gap-xs{gap:var(--space-xs)}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-border-translucent>:not([hidden])~:not([hidden]){border-color:var(--border-overlay)}.self-start{align-self:flex-start}.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}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-border{border-color:var(--border-default)}.border-border-strong{border-color:var(--border-strong)}.border-border-translucent{border-color:var(--border-overlay)}.border-border-translucent-bright{border-color:var(--color-border-translucent-bright)}.border-border-translucent-medium{border-color:var(--color-border-translucent-medium)}.border-overlay{border-color:var(--border-overlay)}.border-overlay-strong{border-color:var(--border-overlay-strong)}.border-status-danger-border{border-color:var(--status-danger-border)}.border-status-info-border{border-color:var(--status-info-border)}.border-status-success-border{border-color:var(--status-success-border)}.border-status-warning-border{border-color:var(--status-warning-border)}.border-surface-strong{border-color:var(--border-strong)}.border-opacity-20{--tw-border-opacity:0.2}.bg-accent-strong{background-color:var(--color-accent-strong)}.bg-overlay-muted{background-color:var(--surface-overlay-muted)}.bg-overlay-panel{background-color:var(--surface-overlay-panel)}.bg-overlay-panel-soft{background-color:var(--surface-overlay-panel-soft)}.bg-overlay-strong{background-color:var(--surface-overlay-strong)}.bg-panel{background-color:var(--surface-panel)}.bg-status-danger-surface{background-color:var(--status-danger-surface)}.bg-status-info-surface{background-color:var(--status-info-surface)}.bg-status-success-surface{background-color:var(--status-success-surface)}.bg-status-warning-surface{background-color:var(--status-warning-surface)}.bg-surface{background-color:var(--surface-base)}.bg-surface-alt{background-color:var(--surface-alt)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.bg-opacity-95{--tw-bg-opacity:0.95}.bg-overlay-channel{background-image:var(--surface-overlay-banner-gradient-channel)}.stroke-border-translucent{stroke:var(--border-overlay)}.stroke-current{stroke:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-lg{padding:var(--space-lg)}.p-md{padding:var(--space-md)}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.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-6{padding-left:1.5rem;padding-right:1.5rem}.px-lg{padding-left:var(--space-lg);padding-right:var(--space-lg)}.px-md{padding-left:var(--space-md);padding-right:var(--space-md)}.py-0{padding-top:0;padding-bottom:0}.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-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-md{padding-top:var(--space-md);padding-bottom:var(--space-md)}.py-xl{padding-top:var(--space-xl);padding-bottom:var(--space-xl)}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-2{padding-left:.5rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pr-1{padding-right:.25rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-family-mono)}.font-sans{font-family:var(--font-family-sans)}.text-2xl{font-size:var(--font-size-2xl);line-height:var(--line-height-relaxed)}.text-2xs{font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-3xs{font-size:var(--font-size-3xs);line-height:var(--line-height-tight)}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-4xs{font-size:var(--font-size-4xs);line-height:var(--line-height-tight)}.text-\[0\.75rem\]{font-size:.75rem}.text-base{font-size:var(--font-size-base)}.text-base,.text-lg{line-height:var(--line-height-base)}.text-lg{font-size:var(--font-size-lg)}.text-sm{font-size:var(--font-size-sm);line-height:var(--line-height-snug)}.text-xl{font-size:var(--font-size-xl);line-height:var(--line-height-relaxed)}.text-xs{font-size:var(--font-size-xs);line-height:var(--line-height-tight)}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.ordinal{--tw-ordinal:ordinal}.ordinal,.tabular-nums{font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing:tabular-nums}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-extra-wide{letter-spacing:var(--tracking-extra-wide)}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-accent{color:var(--color-accent)}.text-critical{color:var(--color-critical)}.text-critical-strong{color:var(--color-critical-strong)}.text-info{color:var(--color-info)}.text-info-strong{color:var(--color-info-strong)}.text-muted{color:var(--text-muted)}.text-muted-strong{color:var(--text-muted-strong)}.text-primary{color:var(--text-primary)}.text-status-danger{color:var(--status-danger)}.text-status-danger-on{color:var(--status-danger-on)}.text-status-info{color:var(--status-info)}.text-status-info-on{color:var(--status-info-on)}.text-status-neutral{color:var(--status-neutral)}.text-status-private-on{color:var(--status-private-on)}.text-status-success{color:var(--status-success)}.text-status-success-on{color:var(--status-success-on)}.text-status-warning{color:var(--status-warning)}.text-status-warning-on{color:var(--status-warning-on)}.text-subtle{color:var(--text-subtle)}.text-text{color:var(--text-primary)}.text-text-frosted{color:var(--text-frosted-primary)}.text-text-muted{color:var(--text-muted)}.text-text-strong{color:var(--color-text-strong)}.text-warning{color:var(--status-warning)}.text-warning-strong{color:var(--status-warning-strong)}.text-white{color:var(--color-white)}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-95{opacity:.95}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.shadow-md{--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px 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-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px)}.blur,.blur-xl{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)}.blur-xl{--tw-blur:blur(24px)}.\!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)!important}.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)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-md,.backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.transition{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-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-fast{transition-duration:var(--motion-duration-fast)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@media (max-width:640px){.bv-grid-video{gap:var(--space-md);grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){:root{--motion-duration-fast:0s;--motion-duration-base:0s;--motion-duration-slow:0s;--modal-motion-duration:0s}*,:after,:before{animation-delay:0s!important;animation-duration:0s!important;animation-iteration-count:1!important;animation-timing-function:linear!important;transition-delay:0s!important;transition-duration:0s!important;transition-timing-function:linear!important}.player-modal__similar-card:before{transition:none!important}#app,#playerModal .player-modal__content,#sidebar,.btn,.btn-ghost,.card,.card[data-motion=enter],.fade-in,.icon-button,.menu__item,.modal-nav,.notification-banner,.notification-portal,.popover-panel,.popover__panel,.progress-bar-fill,.sidebar-collapse-toggle,.sidebar-collapse-toggle__icon,.sidebar-dropup-panel,.sidebar-dropup-trigger,.sidebar-dropup-trigger__chevron,.sidebar-loading-indicator,.sidebar-loading-wrapper,.sidebar-nav,.sidebar-nav-link,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast,.video-modal__panel,.watch-history-card,.watch-history-card__action,.watch-history-card__creatorAvatar,.watch-history-card__creatorName,.watch-history-card__title{transition-property:none!important}.popover-panel,.popover__panel{transform:none!important}.popover-panel[data-state=open],.popover__panel[data-state=open]{opacity:1}.popover-panel[data-state=closed],.popover__panel[data-state=closed]{opacity:0}.card[data-motion=enter],.fade-in,[data-video-thumbnail][data-thumbnail-loaded=true]{opacity:1;animation:none!important}.notification-banner,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast{animation:none!important}.notification-portal{transform:none!important;opacity:1!important}}@media (min-width:640px){.sm\:flex#playerModal{display:block}}@media (min-width:768px){.md\:hidden .bv-modal,.md\:hidden.profile-pane{display:none!important}.md\:flex#playerModal{display:block}}.placeholder\:text-muted::-moz-placeholder{color:var(--text-muted)}.placeholder\:text-muted::placeholder{color:var(--text-muted)}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-status-danger-border:hover{border-color:var(--status-danger-border)}.hover\:bg-overlay-panel:hover{background-color:var(--surface-overlay-panel)}.hover\:bg-panel-hover:hover{background-color:var(--surface-panel-hover)}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-critical:hover{color:var(--color-critical)}.hover\:text-info-strong:hover{color:var(--color-info-strong)}.hover\:text-text:hover{color:var(--text-primary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-info:focus{--tw-ring-color:var(--color-info)}.focus\:ring-status-info:focus{--tw-ring-color:var(--status-info)}.focus\:ring-status-success:focus{--tw-ring-color:var(--status-success)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-surface:focus{--tw-ring-offset-color:var(--surface-base)}.focus-visible\:bg-primary:focus-visible{background-color:var(--color-primary)}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-info:focus-visible{outline-color:var(--color-info)}.active\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-primary{color:var(--text-primary)}@media (min-width:640px){.sm\:order-1{order:1}.sm\:order-2{order:2}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:flex{display:flex}.sm\:w-1\/3{width:33.333333%}.sm\:w-auto{width:auto}.sm\:max-w-xs{max-width:20rem}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:.5rem}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:self-end{align-self:flex-end}.sm\:p-5{padding:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-0{padding-top:0;padding-bottom:0}.sm\:pt-8{padding-top:2rem}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-64{height:16rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:gap-md{gap:var(--space-md)}.md\:pb-12{padding-bottom:3rem}}@media (min-width:1024px){.lg\:ml-auto{margin-left:auto}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:flex-wrap{flex-wrap:wrap}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-right{text-align:right}}@media (min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
\ No newline at end of file
+ );--video-card-backdrop-scale:1.12;--video-card-backdrop-blur:var(--blur-video-card-backdrop-strong);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card:focus-visible{border-color:var(--color-accent);--tw-border-opacity:0.4;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=critical]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}.watch-history-card[data-state=private]{background-color:var(--surface-raised-private);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.watch-history-card[data-state=disabled],.watch-history-card[data-state=private]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=disabled]{opacity:.6;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.watch-history-card[data-alert=nsfw-owner]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--color-black)}.watch-history-card[data-alert=nsfw-owner]:hover{--tw-border-opacity:0.6;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card img[data-thumbnail-state=blurred],.watch-history-card img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}.watch-history-card[data-owner-is-viewer=true][data-url-health-state=offline][data-stream-health-state=unhealthy]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max));flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}.watch-history-card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}#playerModal.watch-history-card{display:block}.watch-history-card{display:flex;flex-wrap:wrap;align-items:stretch;gap:1.25rem;padding:1rem;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}@media (prefers-reduced-motion:reduce){.watch-history-card,.watch-history-card[data-motion=enter]{transition-property:none}.watch-history-card[data-motion=enter]{opacity:1;animation:none}}.watch-history-card:hover{--tw-translate-y:-0.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.watch-history-card{gap:1.5rem;padding:1.25rem}}.watch-history-card--private{border-color:var(--color-info);--tw-border-opacity:0.6}#playerModal.watch-history-card__primary{display:block}.watch-history-card__primary{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;align-items:stretch;gap:1rem}@media (min-width:640px){.watch-history-card__primary{flex-direction:row}}.watch-history-card__thumbnail{display:block;width:14rem;max-width:100%;flex:none;color:var(--text-primary);text-decoration-line:none}.watch-history-card__thumbnailInner{aspect-ratio:16/9;width:100%;overflow:hidden;border-radius:var(--radius-lg);background-color:var(--surface-base)}.watch-history-card__thumbnailInner img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.watch-history-card [data-thumbnail-state=blurred] img,.watch-history-card [data-visual-state=blurred] img{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal.watch-history-card__details{display:block}.watch-history-card__details{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;justify-content:center;gap:var(--space-sm)}.watch-history-card__title{cursor:pointer;font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;line-height:1.375;color:var(--text-primary);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.watch-history-card__title:focus,.watch-history-card__title:hover{color:var(--color-accent)}.watch-history-card__created{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}#playerModal.watch-history-card__meta{display:block}.watch-history-card__meta{display:flex;min-width:0;flex-direction:column;justify-content:space-between;gap:1rem}@media (min-width:640px){.watch-history-card__meta{min-width:14rem;flex:none;flex-basis:16rem}}.watch-history-card__watched{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--border-subtle)}#playerModal.watch-history-card__creator{display:block}.watch-history-card__creator{display:flex;align-items:center;gap:.75rem}#playerModal.watch-history-card__creatorAvatar{display:block}.watch-history-card__creatorAvatar{display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;overflow:hidden;border-radius:var(--radius-full);background-color:var(--surface-panel);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorAvatar:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible,.watch-history-card__creatorAvatar:hover{--tw-ring-color:color-mix(in srgb,var(--color-accent) 38%,transparent)}.watch-history-card__creatorAvatar img{height:100%;width:100%;border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover}.watch-history-card__creatorName{cursor:pointer;background-color:transparent;padding:0;text-align:left;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorName:hover{color:var(--color-accent)}.watch-history-card__creatorName:focus-visible{color:var(--color-accent)}#playerModal.watch-history-card__actions{display:block}.watch-history-card__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem}.watch-history-card__action{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--surface-panel);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__action:hover{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action:focus-visible{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action--primary{background-color:var(--color-accent-strong);color:var(--color-white)}.watch-history-card__action--primary:hover{background-color:var(--color-accent-pressed)}.watch-history-card__action--primary:focus-visible{background-color:var(--color-accent-pressed)}.watch-history-card__action--danger{background-color:var(--color-critical);color:var(--color-white)}.watch-history-card__action--danger:hover{background-color:var(--color-critical-strong)}.watch-history-card__action--danger:focus-visible{background-color:var(--color-critical-strong)}#playerModal.watch-history-card__moderation{display:block}.watch-history-card__moderation{margin-top:var(--space-sm);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.watch-history-card__hidden{margin-top:var(--space-md);border-radius:var(--radius-lg);border-width:1px;border-style:dashed;border-color:var(--border-default);background-color:var(--surface-overlay-panel-soft);font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary)}.watch-history-card__hidden .moderation-badge{align-self:flex-start}#playerModal .channel-card__avatar img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal .video-modal__moderation-bar .moderation-badge{--text-status-neutral-on:var(--color-text);--text-status-warning-on:var(--color-warning-on)}#playerModal .video-modal__moderation-bar .moderation-badge[data-variant=neutral]{color:var(--color-text)}.\!container{max-width:var(--layout-docs-max-width)!important;margin:0 auto!important;padding:var(--space-md)!important}.container{max-width:var(--layout-docs-max-width);margin:0 auto;padding:var(--space-md)}.qr-code__table{margin:var(--qr-code-table-margin,0)}.qr-code__cell,.qr-code__table{border:0;border-collapse:collapse}.qr-code__cell{padding:0;margin:0;width:var(--qr-code-cell-width);height:var(--qr-code-cell-height);background-color:var(--qr-code-color-light)}.qr-code__cell--dark{background-color:var(--qr-code-color-dark)}.qr-code__container[data-qr-code-mode=image] .qr-code__canvas{display:none}.qr-code__container[data-qr-code-mode=canvas] .qr-code__canvas,.qr-code__container[data-qr-code-mode=image] .qr-code__image{display:block}.qr-code__container[data-qr-code-mode=canvas] .qr-code__image{display:none}.fade-in{opacity:0;animation:interface-fade-in .28s ease-out forwards;animation-delay:var(--fade-in-delay,0ms)}.fade-in-delay-100{--fade-in-delay:100ms}.fade-in-delay-200{--fade-in-delay:200ms}.fade-in-delay-300{--fade-in-delay:300ms}.\!card[data-motion=enter]{opacity:0!important;animation:card-motion-enter .22s ease-out forwards!important}.card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg);flex:0 0 var(--icon-size-lg);line-height:0;background-color:var(--color-neutral-700);color:var(--color-white);border:none;border-radius:var(--radius-full);cursor:pointer;transition:background-color .2s ease,box-shadow .2s ease}.icon-button:hover{background-color:var(--color-neutral-600)}.icon-button:active,.icon-button:focus{outline:none;box-shadow:0 0 0 var(--icon-button-ring-width) var(--color-ring-alert)}.icon-image{width:var(--icon-size-md);height:var(--icon-size-md);pointer-events:none}.accent-action-button,.channel-action-button{--accent-action-bg:color-mix(in srgb,var(--surface-overlay-panel) 78%,transparent);--accent-action-border:color-mix(in srgb,var(--border-overlay) 92%,transparent);--accent-action-bg-hover:color-mix(in srgb,var(--color-accent) 22%,var(--surface-overlay-panel));--accent-action-ring:color-mix(in srgb,var(--color-accent) 48%,transparent);--accent-action-bg-active:color-mix(in srgb,var(--color-accent-pressed) 28%,var(--surface-overlay-panel));color:var(--color-text);background-color:var(--accent-action-bg);border-color:var(--accent-action-border);border-style:solid;border-width:var(--border-width-hairline)}.accent-action-button:focus-visible,.accent-action-button:hover,.channel-action-button:focus-visible,.channel-action-button:hover{color:var(--color-accent-strong);background-color:var(--accent-action-bg-hover)}.accent-action-button:focus,.accent-action-button:focus-visible,.channel-action-button:focus,.channel-action-button:focus-visible{box-shadow:0 0 0 var(--icon-button-ring-width) var(--accent-action-ring)}.accent-action-button:active,.channel-action-button:active{color:var(--color-accent-pressed);background-color:var(--accent-action-bg-active)}.modal-nav .icon-button{box-shadow:none;padding:0;gap:0;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg)}.modal-nav .icon-button:not(.accent-action-button):not(.channel-action-button){border:none}.modal-meta{gap:var(--space-xs)}.modal-meta,.modal-view-count{display:inline-flex;align-items:center}.modal-view-count{gap:var(--space-2xs);font-size:var(--font-size-sm);line-height:var(--space-md-plus);color:var(--color-muted-alt);white-space:nowrap}.view-count-text{white-space:nowrap;color:var(--color-muted-strong)}.ratio-16-9{position:relative;width:100%;padding-top:56.25%;background-color:var(--color-card)}.ratio-16-9>img{position:absolute;inset:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}#modalContainer{position:fixed;inset:0;z-index:var(--z-modal-root);pointer-events:none;isolation:isolate}#modalContainer>*{pointer-events:auto}#modalContainer>[id$=Modal]:not(#playerModal){z-index:var(--z-modal-root)}#modalContainer>[id$=Modal]:not(#playerModal)>.bv-modal-backdrop{z-index:var(--z-modal-overlay)}#modalContainer>[id$=Modal]:not(#playerModal) .bv-modal__panel{z-index:var(--z-modal-content)}#modalContainer>#profileModal,#profileModal[data-modal-stack=top]{z-index:var(--z-modal-top-root)}#modalContainer>#profileModal>.bv-modal-backdrop,#profileModal[data-modal-stack=top]>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#profileModal .bv-modal__panel,#profileModal[data-modal-stack=top] .bv-modal__panel{z-index:var(--z-modal-top-content)}#modalContainer>#eventDetailsModal{z-index:var(--z-modal-top-root)}#modalContainer>#eventDetailsModal>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#eventDetailsModal .bv-modal__panel{z-index:var(--z-modal-top-content)}.bv-modal[data-nested-modal-active=true]{pointer-events:none;visibility:hidden}#modalContainer>#loginModal{z-index:var(--z-modal-peak-root)}#modalContainer>#loginModal>.bv-modal-backdrop{z-index:var(--z-modal-peak-overlay)}#modalContainer>#loginModal .bv-modal__panel{z-index:var(--z-modal-peak-content)}#modalContainer>#playerModal{z-index:var(--z-modal-player)}#modalContainer>#playerModal .player-modal__container,#modalContainer>#playerModal .player-modal__content{z-index:var(--z-modal-content)}#playerModal{position:fixed;inset:0;z-index:var(--z-modal-player);display:none;flex-direction:column;align-items:stretch;justify-content:flex-start;width:100vw;height:100vh;padding:0;background-color:var(--color-surface);color:var(--color-subtle-text);--player-modal-inline-max:var(--layout-player-max-width);--player-modal-inline-padding:clamp(var(--space-md-plus),4vw,var(--space-2xl));overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}#playerModal.flex{display:block}#modalVideo{width:100%;aspect-ratio:16/9;background-color:var(--color-black)}.notification-portal{position:fixed;top:0;left:0;right:0;z-index:var(--z-overlay-toast);display:flex;flex-direction:column;align-items:center;gap:var(--space-md);padding:calc(var(--space-xl) + env(safe-area-inset-top)) var(--space-lg) var(--space-lg);pointer-events:none;opacity:0;transform:translateY(var(--toast-translate));transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}@media (min-width:640px){.notification-portal{padding-inline:var(--space-xl)}}.notification-portal:has(.notification-banner:not(.hidden)){opacity:1;transform:translateY(0)}.notification-portal--active{opacity:1;transform:translateY(0)}.notification-banner,.torrent-toast{--notify-accent:var(--notification-banner-accent);--notify-accent-strong:var(--notification-banner-accent-strong);--notify-border:var(--notification-banner-border);--notify-background:var(--notification-banner-background);--notify-foreground:var(--notification-banner-text);position:relative;display:flex;align-items:center;gap:var(--space-md);width:min(var(--notification-banner-max-inline),100%);padding:var(--space-md) var(--space-xl);border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--notify-border);background:var(--notify-background);color:var(--notify-foreground);box-shadow:0 var(--shadow-notification-offset-y) var(--shadow-notification-blur) var(--color-shadow-notification);backdrop-filter:blur(var(--overlay-backdrop-blur));pointer-events:auto;isolation:isolate;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;line-height:1.375;transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}.notification-banner:before,.torrent-toast:before{content:"";position:absolute;inset:0;border-radius:inherit;background:linear-gradient(135deg,var(--notify-accent) 0,var(--notify-accent-strong) 100%);opacity:.18;pointer-events:none}.notification-banner>*,.torrent-toast>*{position:relative;z-index:1}.notification-dismiss{display:inline-flex;height:2rem;width:2rem;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);color:inherit;opacity:.75;background-color:var(--notify-dismiss-background)}.notification-dismiss:focus-visible,.notification-dismiss:hover{opacity:1;background-color:var(--notify-dismiss-background-hover)}.notification-dismiss svg{height:1rem;width:1rem}.notification-banner:not(.hidden){animation:notification-slide-in var(--motion-duration-base) var(--motion-ease-out)}.notification-banner--critical,.torrent-toast--error{--notify-accent:var(--notification-banner-critical-accent);--notify-accent-strong:var(--notification-banner-critical-accent-strong);--notify-border:var(--notification-banner-critical-border);--notify-background:var(--notification-banner-critical-background);--notify-foreground:var(--notification-banner-critical-text)}.notification-banner--success,.torrent-toast--success{--notify-accent:var(--notification-banner-success-accent);--notify-accent-strong:var(--notification-banner-success-accent-strong);--notify-border:var(--notification-banner-success-border);--notify-background:var(--notification-banner-success-background);--notify-foreground:var(--notification-banner-success-text)}.notification-banner--info,.torrent-toast--info{--notify-accent:var(--notification-banner-info-accent);--notify-accent-strong:var(--notification-banner-info-accent-strong);--notify-border:var(--notification-banner-info-border);--notify-background:var(--notification-banner-info-background);--notify-foreground:var(--notification-banner-info-text)}.notification-banner--warning,.torrent-toast--warn{--notify-accent:var(--notification-banner-warning-accent);--notify-accent-strong:var(--notification-banner-warning-accent-strong);--notify-border:var(--notification-banner-warning-border);--notify-background:var(--notification-banner-warning-background);--notify-foreground:var(--notification-banner-warning-text)}.status-banner .status-spinner{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-info-border);border-radius:var(--radius-full);border-top-color:var(--color-info);flex-shrink:0;height:var(--icon-size-md);width:var(--icon-size-md)}.status-banner .status-message{flex:1 1 auto}@keyframes notification-slide-in{0%{opacity:0;transform:translateY(var(--toast-translate))}to{opacity:1;transform:translateY(0)}}.status-spinner--inline{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-border-info-soft);border-radius:var(--radius-full);border-top-color:var(--color-info);display:inline-block;height:var(--space-md);width:var(--space-md)}body.iframe-form{background-color:transparent;color:var(--color-text);font-family:var(--font-family-sans);margin:var(--space-lg)}body.iframe-form .container{width:100%;max-width:100%;margin:0;padding:0}body.iframe-form .\!container{width:100%!important;max-width:100%!important;margin:0!important;padding:0!important}body.iframe-form .form-container{background-color:var(--color-surface-alt);border-radius:var(--radius-md);box-shadow:var(--shadow-md);color:var(--color-text);display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-lg)}body.iframe-form .form-container>p{margin:0}body.iframe-form form{display:flex;flex-direction:column}body.iframe-form form>*+*{margin-top:var(--space-sm)}body.iframe-form form h1,body.iframe-form form h2{color:var(--color-text);margin-top:var(--space-md)}body.iframe-form label{color:var(--color-subtle-text);display:block;font-weight:600;margin-top:var(--space-sm)}body.iframe-form label+.form-control,body.iframe-form label+.select,body.iframe-form label+.textarea{margin-top:var(--space-xs)}body.iframe-form .checkbox-group,body.iframe-form .radio-group{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-xs)}body.iframe-form .checkbox-group label,body.iframe-form .radio-group label{align-items:center;color:var(--color-subtle-text);display:inline-flex;font-weight:500;gap:var(--space-xs);margin:0}body.iframe-form .checkbox-group input[type=checkbox],body.iframe-form .radio-group input[type=radio]{margin:0}body.iframe-form .radio-group input[type=radio]{accent-color:var(--color-accent-strong)}body.iframe-form button.btn{align-self:flex-start;margin-top:var(--space-md)}body.iframe-form button.\!btn{align-self:flex-start!important;margin-top:var(--space-md)!important}body.iframe-form #status{background:var(--color-surface);border-radius:var(--radius-sm);box-shadow:inset 0 0 0 var(--border-width-hairline) var(--color-border-translucent);color:var(--color-subtle-text);min-height:calc(var(--space-2xl) + var(--space-xl));padding:var(--space-sm);white-space:pre-wrap}body.iframe-form .status-line{color:var(--color-subtle-text);margin:var(--space-2xs) 0}body.iframe-form .status-line.error{color:var(--color-critical-strong)}body.iframe-form .status-line.\!error{color:var(--color-critical-strong)!important}body.iframe-form .status-line.success{color:var(--color-info-strong)}body.iframe-form .status-line.\!success{color:var(--color-info-strong)!important}body.iframe-form .status-line.warn{color:var(--color-warning-strong)}@media (max-width:640px){body.iframe-form{margin:var(--space-md)}body.iframe-form .form-container{padding:var(--space-md)}}#sidebarContainer{position:relative;overflow:visible}#sidebar{position:fixed;top:0;left:0;width:var(--sidebar-width);min-width:var(--sidebar-width);height:100vh;height:100dvh;color:var(--color-text-frosted-strong);overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;overscroll-behavior-inline:contain;touch-action:pan-y;scrollbar-gutter:stable both-edges;background:transparent;border-right:none;backdrop-filter:none;-webkit-backdrop-filter:none;transition:width .2s ease,transform .3s ease;z-index:var(--z-sidebar);box-shadow:none;isolation:isolate}#app.sidebar-collapsed,#sidebar.sidebar-collapsed,#sidebar[data-state=collapsed],body.sidebar-collapsed{--sidebar-width:var(--sidebar-width-collapsed)}#app.sidebar-expanded,#sidebar.sidebar-expanded,#sidebar[data-state=expanded],body.sidebar-expanded{--sidebar-width:var(--sidebar-width-expanded)}#sidebar .sidebar__inner{padding-block-start:max(var(--space-sidebar-shell-block-start),calc(var(--app-header-centerline) - var(--sidebar-control-size)/2));padding-block-end:var(--space-sidebar-shell-block-end);padding-inline:var(--space-sidebar-shell-inline);border-radius:var(--radius-sidebar-shell);border:none;background:none;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;isolation:isolate;transition:color .2s ease}#sidebar .sidebar__inner,.sidebar-scroll{display:flex;flex-direction:column;height:100%;width:100%;overflow:visible}.sidebar-scroll{gap:var(--space-sidebar-scroll-gap);min-height:0;flex:1 1 auto}.sidebar-panel{position:relative;width:100%;display:flex;flex-direction:column;gap:var(--space-sidebar-panel-gap);padding:var(--space-sidebar-panel-padding-block) var(--space-sidebar-panel-padding-inline);border-radius:var(--radius-sidebar-panel);border:none;background:transparent;box-shadow:none;color:inherit;backdrop-filter:none;-webkit-backdrop-filter:none;overflow:hidden;isolation:isolate;transition:border-color .2s ease,box-shadow .22s ease,background .22s ease}.sidebar-panel--primary{flex:1 1 auto;min-height:0;padding-block-start:0}.sidebar-panel__header{display:flex;justify-content:flex-end;margin-bottom:var(--space-md)}.sidebar-collapse-toggle{display:inline-flex;align-items:center;justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--color-border-translucent-medium);background:var(--color-surface-tint-subtle);color:inherit;cursor:pointer;transition:background .18s ease,color .18s ease,border-color .18s ease;flex-shrink:0;box-sizing:border-box}.sidebar-collapse-toggle:hover{background:var(--color-border-translucent);border-color:var(--color-border-translucent-stronger);color:var(--color-text)}.sidebar-collapse-toggle:focus-visible{outline:var(--space-3xs) solid var(--color-secondary);outline-offset:var(--space-2xs)}.sidebar-collapse-toggle__icon{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .2s ease}.sidebar-nav{display:flex;flex-direction:column;gap:var(--space-xs);opacity:1;transition:opacity .16s ease;width:100%}.sidebar-nav-link{--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-opacity:0;--sidebar-nav-link-highlight-scale:0.96;display:flex;align-items:center;gap:var(--space-sidebar-footer-gap);padding-block:var(--space-sidebar-nav-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);font-size:var(--font-size-sidebar-nav);font-weight:600;letter-spacing:.015em;color:var(--color-text);text-decoration:none;width:100%;position:relative;border:var(--border-width-hairline) solid transparent;background:none;box-shadow:none;transform:translateX(var(--sidebar-nav-translate-x));transition:color .18s ease,border-color .2s ease,box-shadow .22s ease,transform .22s ease;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none}.sidebar-nav-link:after,.sidebar-nav-link:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none;transition:opacity .22s ease,transform .24s ease;z-index:-1}.sidebar-nav-link:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:var(--sidebar-nav-link-highlight-opacity);transform:scale(var(--sidebar-nav-link-highlight-scale));filter:saturate(140%)}.sidebar-nav-link:after{background:linear-gradient(105deg,var(--color-sidebar-hover) 0,transparent 75%);opacity:.22;mix-blend-mode:screen;z-index:-2}.sidebar-nav-link:focus-visible,.sidebar-nav-link:hover{--sidebar-nav-link-highlight-opacity:1;--sidebar-nav-link-highlight-scale:1.02;--sidebar-nav-translate-x:var(--space-sidebar-nav-translate);color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible:after,.sidebar-nav-link:hover:after{opacity:.35}.sidebar-nav-link--sub{font-size:var(--font-size-sidebar-subnav);font-weight:500;color:var(--color-sidebar-text-muted);padding-block:var(--space-sidebar-subnav-padding-block);letter-spacing:.02em;--sidebar-nav-link-highlight-opacity:0.25;--sidebar-nav-link-highlight-scale:1}.sidebar-icon{width:var(--space-lg);height:var(--space-lg);min-width:var(--space-lg);min-height:var(--space-lg);flex-shrink:0;display:block;filter:var(--sidebar-icon-filter);transition:filter .18s ease}.sidebar-footer{flex-direction:column;margin-top:auto;z-index:2}.sidebar-dropup-trigger,.sidebar-footer{display:flex;gap:var(--space-sidebar-footer-gap);position:relative}.sidebar-dropup-trigger{align-items:center;justify-content:space-between;width:100%;padding-block:var(--space-sidebar-trigger-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);border:var(--border-width-hairline) solid transparent;background:none;color:var(--color-text);font-size:var(--font-size-sidebar-trigger);font-weight:600;cursor:pointer;box-sizing:border-box;flex-shrink:0;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none;box-shadow:none;transition:border-color .2s ease,color .2s ease,box-shadow .22s ease}.sidebar-dropup-trigger:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:0;transform:scale(.96);transition:opacity .2s ease,transform .22s ease;z-index:-1;filter:saturate(140%)}.sidebar-dropup-trigger:after,.sidebar-dropup-trigger:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none}.sidebar-dropup-trigger:after{background:linear-gradient(110deg,var(--color-sidebar-hover) 0,transparent 80%);opacity:.18;mix-blend-mode:screen;transition:opacity .2s ease;z-index:-2}.sidebar-dropup-trigger:focus-visible,.sidebar-dropup-trigger:hover{color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger:focus-visible:before,.sidebar-dropup-trigger:hover:before{opacity:1;transform:scale(1.02)}.sidebar-dropup-trigger:focus-visible:after,.sidebar-dropup-trigger:hover:after{opacity:.35}.sidebar-dropup-trigger:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger__glyph{width:var(--icon-size-md);height:var(--icon-size-md);opacity:.9}.sidebar-dropup-trigger__chevron{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .18s ease}.sidebar-dropup-trigger[aria-expanded=true] .sidebar-dropup-trigger__chevron,.sidebar-dropup-trigger__chevron.is-rotated{transform:rotate(180deg)}.sidebar-dropup-panel{position:absolute;left:0;right:0;bottom:calc(100% + var(--space-sidebar-popover-offset));border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--color-sidebar-border-strong);background:linear-gradient(160deg,color-mix(in srgb,var(--color-sidebar-surface) 88%,transparent) 0,color-mix(in srgb,var(--color-sidebar-surface-alt) 68%,transparent) 100%);box-shadow:inset 0 0 0 var(--border-width-fine) var(--color-sidebar-border),var(--shadow-sidebar-panel);padding:var(--space-sidebar-popover-padding-block) var(--space-sidebar-popover-padding-inline);color:var(--color-text-frosted);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(var(--space-sm));transition:opacity .18s ease,transform .18s ease,visibility .18s ease,box-shadow .22s ease;backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));-webkit-backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));z-index:5;isolation:isolate}.sidebar-dropup-panel[data-state=expanded]{opacity:1;visibility:visible;pointer-events:auto;transform:translateY(0)}.sidebar-dropup-panel__inner{display:flex;flex-direction:column;gap:var(--space-sidebar-popover-gap);width:100%;padding-inline-end:var(--space-sidebar-dropup-scroll-reserve);max-height:var(--sidebar-dropup-max-height);overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable both-edges}.sidebar-dropup-panel__inner.is-measuring{position:absolute;width:-moz-max-content;width:max-content;max-width:none;visibility:hidden;pointer-events:none;left:var(--offscreen-offset);right:auto;top:auto;bottom:auto}.sidebar-dropup-measure{position:absolute;visibility:hidden;pointer-events:none;height:0;overflow:hidden}.sidebar-dropup-panel__inner>*{width:100%;min-width:0}#sidebar[data-footer-state=expanded] .sidebar-nav{opacity:0;pointer-events:none}#sidebar[data-footer-state=collapsed] .sidebar-nav{opacity:1}.sidebar-loading-wrapper{display:flex;justify-content:center;align-items:center;padding:var(--space-2xl) 0;width:100%;grid-column:1/-1}.sidebar-loading-indicator{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--color-muted-strong);font-size:var(--font-size-sm);font-weight:500;letter-spacing:.01em}.sidebar-loading-text{white-space:nowrap}#app{box-sizing:border-box;transition:margin-left .2s ease,width .2s ease,max-width .2s ease}#app[data-sidebar-state=collapsed]{margin-left:var(--sidebar-width-collapsed);width:calc(100vw - var(--sidebar-width-collapsed));max-width:calc(100vw - var(--sidebar-width-collapsed))}#app[data-sidebar-state=expanded]{margin-left:max(var(--sidebar-width-expanded-base),var(--sidebar-dropup-content-width));width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)))}#sidebar.sidebar-collapsed .sidebar-nav-link,body.sidebar-collapsed #sidebar .sidebar-nav-link{justify-content:center;width:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full);--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-scale:1}#sidebar.sidebar-expanded .sidebar-nav-link,body.sidebar-expanded #sidebar .sidebar-nav-link{justify-content:flex-start}#sidebar.sidebar-collapsed .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-text{display:none}#sidebar.sidebar-collapsed .sidebar__inner,body.sidebar-collapsed #sidebar .sidebar__inner{padding-inline:var(--space-2xs)}#sidebar.sidebar-collapsed .sidebar-panel,body.sidebar-collapsed #sidebar .sidebar-panel{padding-inline:calc(var(--space-3xs)*3)}#sidebar.sidebar-collapsed .sidebar-panel__header,body.sidebar-collapsed #sidebar .sidebar-panel__header{justify-content:center}#sidebar.sidebar-collapsed .sidebar-collapse-toggle,body.sidebar-collapsed #sidebar .sidebar-collapse-toggle{margin-inline:auto}#sidebar .sidebar-toggle-icon--rotated{transform:rotate(180deg)}#sidebar.sidebar-collapsed .sidebar-toggle-icon--rotated,body.sidebar-collapsed #sidebar .sidebar-toggle-icon--rotated{transform:rotate(0deg)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger{justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__chevron{display:none}#sidebar.sidebar-collapsed .sidebar-dropup-trigger__glyph,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__glyph{margin:0}#sidebar.sidebar-collapsed .sidebar-nav-link:focus-visible,#sidebar.sidebar-collapsed .sidebar-nav-link:hover,body.sidebar-collapsed #sidebar .sidebar-nav-link:focus-visible,body.sidebar-collapsed #sidebar .sidebar-nav-link:hover{--sidebar-nav-translate-x:0}@media (min-width:768px){.sidebar-panel__header{display:flex}.sidebar-collapse-toggle{display:inline-flex}#sidebar{transform:translateX(0)!important;width:var(--sidebar-width);overflow:visible}#app[data-sidebar-state=collapsed]{margin-left:calc(var(--sidebar-width-collapsed) + var(--sidebar-content-gap));width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap));max-width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap))}#app[data-sidebar-state=expanded]{margin-left:max(calc(var(--sidebar-width-expanded-base) + var(--sidebar-content-gap)),calc(var(--sidebar-dropup-content-width) + var(--sidebar-content-gap)));width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)))}}@keyframes card-motion-enter{0%{opacity:0;transform:translateY(var(--motion-card-enter-translate))}to{opacity:1;transform:translateY(0)}}@keyframes video-thumbnail-fade-in{0%{opacity:0}to{opacity:1}}@keyframes interface-fade-in{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0;transform:translateY(var(--motion-fade-in-translate))}to{opacity:1;transform:translateY(0)}}.status-line{margin-top:.25rem;margin-bottom:.25rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);line-height:1.375;color:var(--text-primary)}.status-line.error{color:var(--color-critical-strong)}.status-line.\!error{color:var(--color-critical-strong)!important}.status-line.warn{color:var(--color-warning-strong)}@keyframes ztr-rotate{to{transform:rotate(1turn)}}@keyframes ztr-dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes svelte-181fgen-loader-animation{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes svelte-181fgen-fade-in{to{opacity:1}}.dm-app-shell{display:flex;flex-direction:column;gap:var(--space-lg);padding:var(--space-lg);background:var(--surface-base);color:var(--text-primary);min-height:100vh}.dm-app-shell__main,.dm-app-shell__sidebar{border-radius:var(--radius-lg);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-panel);box-shadow:var(--shadow-soft)}.dm-app-shell__sidebar{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md)}.dm-app-shell__title{font-size:var(--font-size-lg);margin:0}.dm-app-shell__main{flex:1;display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);background:var(--surface-raised)}.dm-conversation-list{display:flex;flex-direction:column;gap:var(--space-sm)}.dm-conversation-list__header{display:flex;justify-content:space-between;align-items:center}.dm-conversation-list__title{font-size:var(--font-size-sm);text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);margin:0}.dm-conversation-list__items{display:flex;flex-direction:column;gap:var(--space-xs);overflow-y:auto;max-height:60vh;padding-right:var(--space-xs)}.dm-conversation-list__state{font-size:var(--font-size-sm);color:var(--text-muted);padding:var(--space-md);text-align:center;background:var(--surface-sunken);border-radius:var(--radius-md)}.dm-contact-row{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-subtle);background:transparent;color:inherit;text-align:left;cursor:pointer}.dm-contact-row:focus-visible,.dm-contact-row:hover{background:var(--surface-muted);border-color:var(--border-strong);outline:none}.dm-contact-row--active{background:var(--surface-sunken);border-color:var(--border-strong)}.dm-contact-row__content{display:flex;flex-direction:column;gap:var(--space-2xs);flex:1}.dm-contact-row__header{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-xs)}.dm-contact-row__name{font-weight:600}.dm-contact-row__time{font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-contact-row__preview{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-contact-row__badge{align-self:flex-start;padding:var(--space-3xs) var(--space-xs);border-radius:var(--radius-full);background:var(--unread-badge-background);color:var(--unread-badge-text);font-size:var(--font-size-3xs)}.dm-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);background:var(--surface-sunken);color:var(--text-muted);font-weight:600;overflow:hidden;border:var(--border-width-hairline) solid var(--border-subtle)}.dm-avatar__image{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.dm-message-thread{display:flex;flex-direction:column;gap:var(--space-sm);flex:1;min-height:0}.dm-message-thread__header{display:flex;align-items:baseline;gap:var(--space-sm)}.dm-message-thread__title{font-size:var(--font-size-base);margin:0}.dm-message-thread__status{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-message-thread__timeline{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-sm);border-radius:var(--radius-md);background:var(--surface-panel);border:var(--border-width-hairline) solid var(--border-subtle);overflow-y:auto;min-height:16rem}.dm-message-thread__state{padding:var(--space-md);text-align:center;color:var(--text-muted);background:var(--surface-sunken);border-radius:var(--radius-md)}.dm-message-bubble{max-width:85%;display:flex;flex-direction:column;gap:var(--space-2xs);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-lg);border:var(--border-width-hairline) solid var(--message-bubble-border);background:var(--message-bubble-background);color:var(--message-bubble-text)}.dm-message-bubble__content{font-size:var(--font-size-sm)}.dm-message-bubble__meta{display:flex;gap:var(--space-xs);font-size:var(--font-size-2xs);color:var(--message-bubble-meta)}.dm-message-bubble__status{color:var(--text-muted)}.dm-message-bubble__status[data-status=pending]{color:var(--status-warning)}.dm-message-bubble__status[data-status=sending]{color:var(--status-info)}.dm-message-bubble__status[data-status=failed]{color:var(--status-danger)}.dm-message-thread__new{align-self:center;border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--border-subtle);padding:var(--space-2xs) var(--space-sm);font-size:var(--font-size-2xs);background:var(--surface-sunken);color:var(--text-muted)}.dm-message-thread__new:focus-visible,.dm-message-thread__new:hover{background:var(--surface-overlay-panel-soft);color:var(--text-primary);outline:none}.dm-day-divider{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:var(--space-xs);color:var(--text-muted);font-size:var(--font-size-2xs)}.dm-day-divider__line{height:1px;background:var(--border-subtle)}.dm-notification-center{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-notification-center__empty{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-notification-center__item{padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-subtle);background:var(--surface-sunken);font-size:var(--font-size-xs)}.dm-composer{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-composer__label{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-composer__input{resize:vertical;border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-base);color:var(--text-primary);padding:var(--space-sm);font-family:inherit}.dm-composer__input:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.dm-composer__actions{justify-content:space-between}.dm-composer__actions,.dm-composer__tools{display:flex;align-items:center;gap:var(--space-sm)}.dm-composer__tools{flex-wrap:wrap}.dm-composer__attach,.dm-composer__hint,.dm-composer__privacy{font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-composer__attach,.dm-composer__privacy{border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-base);padding:var(--space-2xs) var(--space-sm);cursor:pointer}.dm-composer__attach:focus-visible,.dm-composer__attach:hover,.dm-composer__privacy:focus-visible,.dm-composer__privacy:hover{background:var(--surface-overlay-panel-soft);color:var(--text-primary);outline:none}.dm-composer__send{border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-strong);background:var(--surface-overlay-panel);color:var(--text-primary);padding:var(--space-xs) var(--space-md);font-weight:600;cursor:pointer}.dm-composer__send:focus-visible,.dm-composer__send:hover{background:var(--surface-overlay-panel-soft);outline:none}.dm-composer__status{font-size:var(--font-size-2xs);color:var(--status-danger);min-height:1rem}@media (min-width:768px){.dm-app-shell{flex-direction:row;align-items:stretch}.dm-app-shell__sidebar{flex:0 0 18rem;max-width:20rem}.dm-app-shell__main,.dm-app-shell__sidebar{height:calc(100vh - var(--space-lg)*2)}.dm-conversation-list__items{max-height:none;flex:1}}@media (min-width:1024px){.dm-app-shell__sidebar{flex-basis:20rem}.dm-message-thread__timeline{padding:var(--space-md)}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.left-4{left:1rem}.right-3{right:.75rem}.right-4{right:1rem}.right-6{right:1.5rem}.top-0{top:0}.top-3{top:.75rem}.z-10{z-index:10}.z-50{z-index:50}.z-\[140\]{z-index:140}.z-overlay-floating{z-index:var(--z-overlay-floating)}.z-overlay-toast{z-index:var(--z-overlay-toast)}.order-1{order:1}.order-2{order:2}.col-span-full{grid-column:1/-1}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.mt-sm{margin-top:var(--space-sm)}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.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}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2xl{height:var(--space-2xl)}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-auto{height:auto}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.max-h-modal-body{max-height:var(--modal-body-max-height)}.max-h-modal-pane{max-height:var(--modal-pane-max-height)}.max-h-modal-sheet{max-height:var(--modal-sheet-max-height)}.max-h-modal-shell{max-height:var(--modal-shell-max-height)}.min-h-0{min-height:0}.min-h-\[200px\]{min-height:200px}.min-h-\[80px\]{min-height:80px}.min-h-\[96px\]{min-height:96px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[calc\(100\%-3rem\)\]{width:calc(100% - 3rem)}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-\[200px\]{max-width:200px}.max-w-docs{max-width:var(--layout-docs-max-width)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-popover-safe{max-width:var(--popover-inline-safe-max)}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.origin-bottom-right{transform-origin:bottom right}.rotate-90{--tw-rotate:90deg}.rotate-90,.scale-\[1\.2\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[1\.2\]{--tw-scale-x:1.2;--tw-scale-y:1.2}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-y{resize:vertical}.resize{resize:both}.list-disc{list-style-type:disc}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-sm{gap:var(--space-sm)}.gap-xl{gap:var(--space-xl)}.gap-xs{gap:var(--space-xs)}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-border-translucent>:not([hidden])~:not([hidden]){border-color:var(--border-overlay)}.self-start{align-self:flex-start}.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}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-border{border-color:var(--border-default)}.border-border-strong{border-color:var(--border-strong)}.border-border-translucent{border-color:var(--border-overlay)}.border-border-translucent-bright{border-color:var(--color-border-translucent-bright)}.border-border-translucent-medium{border-color:var(--color-border-translucent-medium)}.border-overlay{border-color:var(--border-overlay)}.border-overlay-strong{border-color:var(--border-overlay-strong)}.border-status-danger-border{border-color:var(--status-danger-border)}.border-status-info-border{border-color:var(--status-info-border)}.border-status-success-border{border-color:var(--status-success-border)}.border-status-warning-border{border-color:var(--status-warning-border)}.border-surface-strong{border-color:var(--border-strong)}.border-opacity-20{--tw-border-opacity:0.2}.bg-accent-strong{background-color:var(--color-accent-strong)}.bg-overlay-muted{background-color:var(--surface-overlay-muted)}.bg-overlay-panel{background-color:var(--surface-overlay-panel)}.bg-overlay-panel-soft{background-color:var(--surface-overlay-panel-soft)}.bg-overlay-strong{background-color:var(--surface-overlay-strong)}.bg-panel{background-color:var(--surface-panel)}.bg-status-danger-surface{background-color:var(--status-danger-surface)}.bg-status-info-surface{background-color:var(--status-info-surface)}.bg-status-success-surface{background-color:var(--status-success-surface)}.bg-status-warning-surface{background-color:var(--status-warning-surface)}.bg-surface{background-color:var(--surface-base)}.bg-surface-alt{background-color:var(--surface-alt)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.bg-opacity-95{--tw-bg-opacity:0.95}.bg-overlay-channel{background-image:var(--surface-overlay-banner-gradient-channel)}.stroke-border-translucent{stroke:var(--border-overlay)}.stroke-current{stroke:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-lg{padding:var(--space-lg)}.p-md{padding:var(--space-md)}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.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-6{padding-left:1.5rem;padding-right:1.5rem}.px-lg{padding-left:var(--space-lg);padding-right:var(--space-lg)}.px-md{padding-left:var(--space-md);padding-right:var(--space-md)}.py-0{padding-top:0;padding-bottom:0}.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-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-md{padding-top:var(--space-md);padding-bottom:var(--space-md)}.py-xl{padding-top:var(--space-xl);padding-bottom:var(--space-xl)}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-2{padding-left:.5rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pr-1{padding-right:.25rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-family-mono)}.font-sans{font-family:var(--font-family-sans)}.text-2xl{font-size:var(--font-size-2xl);line-height:var(--line-height-relaxed)}.text-2xs{font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-3xs{font-size:var(--font-size-3xs);line-height:var(--line-height-tight)}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-4xs{font-size:var(--font-size-4xs);line-height:var(--line-height-tight)}.text-\[0\.75rem\]{font-size:.75rem}.text-base{font-size:var(--font-size-base)}.text-base,.text-lg{line-height:var(--line-height-base)}.text-lg{font-size:var(--font-size-lg)}.text-sm{font-size:var(--font-size-sm);line-height:var(--line-height-snug)}.text-xl{font-size:var(--font-size-xl);line-height:var(--line-height-relaxed)}.text-xs{font-size:var(--font-size-xs);line-height:var(--line-height-tight)}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.ordinal{--tw-ordinal:ordinal}.ordinal,.tabular-nums{font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing:tabular-nums}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-extra-wide{letter-spacing:var(--tracking-extra-wide)}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-accent{color:var(--color-accent)}.text-critical{color:var(--color-critical)}.text-critical-strong{color:var(--color-critical-strong)}.text-info{color:var(--color-info)}.text-info-strong{color:var(--color-info-strong)}.text-muted{color:var(--text-muted)}.text-muted-strong{color:var(--text-muted-strong)}.text-primary{color:var(--text-primary)}.text-status-danger{color:var(--status-danger)}.text-status-danger-on{color:var(--status-danger-on)}.text-status-info{color:var(--status-info)}.text-status-info-on{color:var(--status-info-on)}.text-status-neutral{color:var(--status-neutral)}.text-status-private-on{color:var(--status-private-on)}.text-status-success{color:var(--status-success)}.text-status-success-on{color:var(--status-success-on)}.text-status-warning{color:var(--status-warning)}.text-status-warning-on{color:var(--status-warning-on)}.text-subtle{color:var(--text-subtle)}.text-text{color:var(--text-primary)}.text-text-frosted{color:var(--text-frosted-primary)}.text-text-muted{color:var(--text-muted)}.text-text-strong{color:var(--color-text-strong)}.text-warning{color:var(--status-warning)}.text-warning-strong{color:var(--status-warning-strong)}.text-white{color:var(--color-white)}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-95{opacity:.95}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.shadow-md{--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px 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-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px)}.blur,.blur-xl{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)}.blur-xl{--tw-blur:blur(24px)}.\!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)!important}.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)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-md,.backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.transition{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-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-fast{transition-duration:var(--motion-duration-fast)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@media (max-width:640px){.bv-grid-video{gap:var(--space-md);grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){:root{--motion-duration-fast:0s;--motion-duration-base:0s;--motion-duration-slow:0s;--modal-motion-duration:0s}*,:after,:before{animation-delay:0s!important;animation-duration:0s!important;animation-iteration-count:1!important;animation-timing-function:linear!important;transition-delay:0s!important;transition-duration:0s!important;transition-timing-function:linear!important}.player-modal__similar-card:before{transition:none!important}#app,#playerModal .player-modal__content,#sidebar,.btn,.btn-ghost,.card,.card[data-motion=enter],.fade-in,.icon-button,.menu__item,.modal-nav,.notification-banner,.notification-portal,.popover-panel,.popover__panel,.progress-bar-fill,.sidebar-collapse-toggle,.sidebar-collapse-toggle__icon,.sidebar-dropup-panel,.sidebar-dropup-trigger,.sidebar-dropup-trigger__chevron,.sidebar-loading-indicator,.sidebar-loading-wrapper,.sidebar-nav,.sidebar-nav-link,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast,.video-modal__panel,.watch-history-card,.watch-history-card__action,.watch-history-card__creatorAvatar,.watch-history-card__creatorName,.watch-history-card__title{transition-property:none!important}.popover-panel,.popover__panel{transform:none!important}.popover-panel[data-state=open],.popover__panel[data-state=open]{opacity:1}.popover-panel[data-state=closed],.popover__panel[data-state=closed]{opacity:0}.card[data-motion=enter],.fade-in,[data-video-thumbnail][data-thumbnail-loaded=true]{opacity:1;animation:none!important}.notification-banner,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast{animation:none!important}.notification-portal{transform:none!important;opacity:1!important}}@media (min-width:640px){.sm\:flex#playerModal{display:block}}@media (min-width:768px){.md\:hidden .bv-modal,.md\:hidden.profile-pane{display:none!important}.md\:flex#playerModal{display:block}}.placeholder\:text-muted::-moz-placeholder{color:var(--text-muted)}.placeholder\:text-muted::placeholder{color:var(--text-muted)}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-status-danger-border:hover{border-color:var(--status-danger-border)}.hover\:bg-overlay-panel:hover{background-color:var(--surface-overlay-panel)}.hover\:bg-panel-hover:hover{background-color:var(--surface-panel-hover)}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-critical:hover{color:var(--color-critical)}.hover\:text-info-strong:hover{color:var(--color-info-strong)}.hover\:text-text:hover{color:var(--text-primary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-info:focus{--tw-ring-color:var(--color-info)}.focus\:ring-status-info:focus{--tw-ring-color:var(--status-info)}.focus\:ring-status-success:focus{--tw-ring-color:var(--status-success)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-surface:focus{--tw-ring-offset-color:var(--surface-base)}.focus-visible\:bg-primary:focus-visible{background-color:var(--color-primary)}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-info:focus-visible{outline-color:var(--color-info)}.active\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-primary{color:var(--text-primary)}@media (min-width:640px){.sm\:order-1{order:1}.sm\:order-2{order:2}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:flex{display:flex}.sm\:w-1\/3{width:33.333333%}.sm\:w-auto{width:auto}.sm\:max-w-xs{max-width:20rem}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:.5rem}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:self-end{align-self:flex-end}.sm\:p-5{padding:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-0{padding-top:0;padding-bottom:0}.sm\:pt-8{padding-top:2rem}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-64{height:16rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:gap-md{gap:var(--space-md)}.md\:pb-12{padding-bottom:3rem}}@media (min-width:1024px){.lg\:ml-auto{margin-left:auto}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:flex-wrap{flex-wrap:wrap}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-right{text-align:right}}@media (min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
\ No newline at end of file
diff --git a/css/tailwind.source.css b/css/tailwind.source.css
index f0a202a4..2cb47859 100644
--- a/css/tailwind.source.css
+++ b/css/tailwind.source.css
@@ -5224,9 +5224,38 @@
}
.dm-message-bubble__status {
+ color: var(--text-muted);
+ }
+
+ .dm-message-bubble__status[data-status="pending"] {
+ color: var(--status-warning);
+ }
+
+ .dm-message-bubble__status[data-status="sending"] {
+ color: var(--status-info);
+ }
+
+ .dm-message-bubble__status[data-status="failed"] {
color: var(--status-danger);
}
+ .dm-message-thread__new {
+ align-self: center;
+ border-radius: var(--radius-full);
+ border: var(--border-width-hairline) solid var(--border-subtle);
+ padding: var(--space-2xs) var(--space-sm);
+ font-size: var(--font-size-2xs);
+ background: var(--surface-sunken);
+ color: var(--text-muted);
+ }
+
+ .dm-message-thread__new:hover,
+ .dm-message-thread__new:focus-visible {
+ background: var(--surface-overlay-panel-soft);
+ color: var(--text-primary);
+ outline: none;
+ }
+
.dm-day-divider {
display: grid;
grid-template-columns: 1fr auto 1fr;
@@ -5329,11 +5358,38 @@
gap: var(--space-sm);
}
+ .dm-composer__tools {
+ display: flex;
+ align-items: center;
+ gap: var(--space-sm);
+ flex-wrap: wrap;
+ }
+
.dm-composer__hint {
font-size: var(--font-size-2xs);
color: var(--text-muted);
}
+ .dm-composer__attach,
+ .dm-composer__privacy {
+ border-radius: var(--radius-md);
+ border: var(--border-width-hairline) solid var(--border-default);
+ background: var(--surface-base);
+ color: var(--text-muted);
+ padding: var(--space-2xs) var(--space-sm);
+ font-size: var(--font-size-2xs);
+ cursor: pointer;
+ }
+
+ .dm-composer__attach:hover,
+ .dm-composer__attach:focus-visible,
+ .dm-composer__privacy:hover,
+ .dm-composer__privacy:focus-visible {
+ background: var(--surface-overlay-panel-soft);
+ color: var(--text-primary);
+ outline: none;
+ }
+
.dm-composer__send {
border-radius: var(--radius-md);
border: var(--border-width-hairline) solid var(--border-strong);
diff --git a/js/ui/dm/AppShell.js b/js/ui/dm/AppShell.js
index ff977808..3a804cce 100644
--- a/js/ui/dm/AppShell.js
+++ b/js/ui/dm/AppShell.js
@@ -48,7 +48,21 @@ const DEFAULT_MESSAGES = [
direction: "outgoing",
body: "Thanks! I'm wiring up the layout and keyboard flow now.",
timestamp: "09:14",
- status: "sending",
+ status: "pending",
+ },
+ {
+ id: "msg-3",
+ direction: "outgoing",
+ body: "Next up: privacy mode toggles and attachment rails.",
+ timestamp: "09:16",
+ status: "sent",
+ },
+ {
+ id: "msg-4",
+ direction: "outgoing",
+ body: "I can resend if this didn't go through.",
+ timestamp: "09:18",
+ status: "failed",
},
];
diff --git a/js/ui/dm/Composer.js b/js/ui/dm/Composer.js
index 52c5f75b..05f3f54d 100644
--- a/js/ui/dm/Composer.js
+++ b/js/ui/dm/Composer.js
@@ -13,6 +13,7 @@ export function Composer({
document: doc,
placeholder = "Write a message…",
state = "idle",
+ privacyMode: initialPrivacyMode = "standard",
onSend,
} = {}) {
if (!doc) {
@@ -21,6 +22,7 @@ export function Composer({
const form = createElement(doc, "form", "dm-composer");
form.noValidate = true;
+ let privacyMode = initialPrivacyMode;
const label = createElement(doc, "label", "dm-composer__label", "Message");
label.setAttribute("for", "dm-composer-input");
@@ -29,17 +31,49 @@ export function Composer({
textarea.id = "dm-composer-input";
textarea.placeholder = placeholder;
textarea.rows = 2;
+ textarea.setAttribute("aria-label", "Message");
+
+ const hintId = "dm-composer-hint";
const actions = createElement(doc, "div", "dm-composer__actions");
+ const tools = createElement(doc, "div", "dm-composer__tools");
const hint = createElement(
doc,
"span",
"dm-composer__hint",
- "Press Ctrl/⌘ + Enter to send",
+ "Enter to send, Shift + Enter for newline",
);
+ hint.id = hintId;
+ textarea.setAttribute("aria-describedby", hintId);
+
+ const attachButton = createElement(
+ doc,
+ "button",
+ "dm-composer__attach",
+ "Attach",
+ );
+ attachButton.type = "button";
+ attachButton.setAttribute("aria-label", "Attach a file");
+
+ const privacyToggle = createElement(
+ doc,
+ "button",
+ "dm-composer__privacy",
+ "Standard",
+ );
+ privacyToggle.type = "button";
+ privacyToggle.setAttribute("aria-pressed", "false");
+ privacyToggle.setAttribute("aria-label", "Toggle privacy mode");
+
+ tools.appendChild(attachButton);
+ tools.appendChild(privacyToggle);
+ tools.appendChild(hint);
+
const button = createElement(doc, "button", "dm-composer__send", "Send");
button.type = "submit";
- actions.appendChild(hint);
+ button.setAttribute("aria-label", "Send message");
+
+ actions.appendChild(tools);
actions.appendChild(button);
const status = createElement(doc, "div", "dm-composer__status");
@@ -57,12 +91,27 @@ export function Composer({
form.addEventListener("submit", (event) => {
event.preventDefault();
if (typeof onSend === "function") {
- onSend(textarea.value);
+ onSend(textarea.value, { privacyMode, attachments: [] });
}
});
+ const updatePrivacyLabel = () => {
+ privacyToggle.textContent = privacyMode === "private" ? "Private" : "Standard";
+ privacyToggle.setAttribute(
+ "aria-pressed",
+ privacyMode === "private" ? "true" : "false",
+ );
+ };
+
+ updatePrivacyLabel();
+
+ privacyToggle.addEventListener("click", () => {
+ privacyMode = privacyMode === "private" ? "standard" : "private";
+ updatePrivacyLabel();
+ });
+
textarea.addEventListener("keydown", (event) => {
- if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) {
+ if (event.key === "Enter" && !event.shiftKey) {
event.preventDefault();
form.requestSubmit();
}
diff --git a/js/ui/dm/MessageBubble.js b/js/ui/dm/MessageBubble.js
index 1d611438..eea45877 100644
--- a/js/ui/dm/MessageBubble.js
+++ b/js/ui/dm/MessageBubble.js
@@ -36,14 +36,21 @@ export function MessageBubble({
meta.appendChild(createElement(doc, "span", "dm-message-bubble__time", timestamp));
}
- if (status === "failed") {
- meta.appendChild(
- createElement(doc, "span", "dm-message-bubble__status", "Send failed"),
- );
- } else if (status === "sending") {
- meta.appendChild(
- createElement(doc, "span", "dm-message-bubble__status", "Sending…"),
+ if (variant === "outgoing") {
+ const statusLabel = createElement(
+ doc,
+ "span",
+ "dm-message-bubble__status",
+ status === "failed"
+ ? "Failed to send"
+ : status === "pending"
+ ? "Pending…"
+ : status === "sending"
+ ? "Sending…"
+ : "Sent",
);
+ statusLabel.dataset.status = status;
+ meta.appendChild(statusLabel);
}
wrapper.appendChild(meta);
diff --git a/js/ui/dm/MessageThread.js b/js/ui/dm/MessageThread.js
index 0d7af9a1..de53b872 100644
--- a/js/ui/dm/MessageThread.js
+++ b/js/ui/dm/MessageThread.js
@@ -45,6 +45,16 @@ export function MessageThread({
timeline.setAttribute("role", "log");
timeline.setAttribute("aria-live", "polite");
+ const newMessagesBanner = createElement(
+ doc,
+ "button",
+ "dm-message-thread__new",
+ "New messages",
+ );
+ newMessagesBanner.type = "button";
+ newMessagesBanner.setAttribute("aria-label", "Jump to newest messages");
+ timeline.appendChild(newMessagesBanner);
+
const stateEl = createElement(doc, "div", "dm-message-thread__state");
if (state === "loading") {
From c70e17b9d0f998480480a8a1b613771d20da8bb1 Mon Sep 17 00:00:00 2001
From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com>
Date: Sun, 18 Jan 2026 23:44:54 -0500
Subject: [PATCH 004/106] Add DM controls to profile modal
---
components/profile-modal.html | 53 ++++++++++++++++++++++++++++++
js/ui/profileModalController.js | 57 +++++++++++++++++++++++++++++++++
2 files changed, 110 insertions(+)
diff --git a/components/profile-modal.html b/components/profile-modal.html
index 997ef0c6..5b19d656 100644
--- a/components/profile-modal.html
+++ b/components/profile-modal.html
@@ -1012,6 +1012,59 @@
View encrypted conversations sent with NIP-04 or NIP-44. bitvid keeps message data on this device only.
+
+
+
+
Direct message actions
+
+ Start a new DM or jump to relay preferences before you send.
+
+
+
+
+
+
+
Preferred DM relay
+
+ Select a relay to prioritize encrypted message delivery.
+
+
+
+
+
+
+
Privacy mode (coming soon)
+
+ Pause inbound DM sync and clear cached previews on this device.
+
+
+
+
+
{
+ this.handleSendDmRequest();
+ });
+ }
+
+ if (this.profileMessagesOpenRelaysButton instanceof HTMLElement) {
+ this.profileMessagesOpenRelaysButton.addEventListener("click", () => {
+ this.handleOpenDmRelaysRequest();
+ });
+ }
+
+ if (this.profileMessagesPrivacyToggle instanceof HTMLElement) {
+ this.profileMessagesPrivacyToggle.addEventListener("change", (event) => {
+ const toggle = event.currentTarget;
+ if (toggle instanceof HTMLInputElement) {
+ this.handlePrivacyToggle(toggle.checked);
+ }
+ });
+ }
+
if (this.profileMessageSendButton instanceof HTMLElement) {
this.profileMessageSendButton.addEventListener("click", () => {
void this.handleSendProfileMessage();
From f9c351e157f92c7ade2e336cd66462f60efa1bfa Mon Sep 17 00:00:00 2001
From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com>
Date: Sun, 18 Jan 2026 23:51:52 -0500
Subject: [PATCH 005/106] Add notification center filters and grouping
---
css/tailwind.generated.css | 2 +-
css/tailwind.source.css | 126 ++++++++++++++++++-
js/ui/dm/NotificationCenter.js | 213 ++++++++++++++++++++++++++++++---
3 files changed, 317 insertions(+), 24 deletions(-)
diff --git a/css/tailwind.generated.css b/css/tailwind.generated.css
index aef3c0f1..8b850d02 100644
--- a/css/tailwind.generated.css
+++ b/css/tailwind.generated.css
@@ -11,4 +11,4 @@
--player-modal-primary-inline-padding-lg,clamp(var(--space-sm),2.75vw,var(--space-lg))
)}}.revert-modal__layout{display:grid;gap:1.5rem}@media (min-width:1024px){.revert-modal__layout{grid-template-columns:minmax(var(--revert-modal-sidebar-min),var(--revert-modal-sidebar-width)) minmax(0,1fr)}}#playerModal.video-modal__primary{display:block}.video-modal__primary{display:flex;flex-direction:column;gap:1.5rem;min-width:0;min-height:0}#playerModal.video-modal__secondary{display:block}.video-modal__secondary{display:flex;flex-direction:column;gap:1rem;min-width:0;min-height:0;width:100%;align-self:stretch}.video-modal__similar{display:none}@media (min-width:1024px){#playerModal.video-modal__similar{display:block}.video-modal__similar{display:flex;flex-direction:column;gap:1.5rem;align-self:stretch;flex:1 1 auto;min-height:0}#playerModal .video-modal__similar .player-modal__module{height:100%;display:flex;flex:1 1 auto;min-height:0;flex-direction:column}#playerModal .video-modal__similar .player-modal__module-list{flex:1 1 auto;min-height:0}#playerModal .video-modal__similar .player-modal__module-scroll{height:100%;max-height:none;min-height:0}}#playerModal .player-modal__module-item{width:100%}#playerModal#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max))}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max))!important}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__media,#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__media{flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))!important}#playerModal#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}#playerModal#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.\!card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}#playerModal .video-modal__similar .player-modal__module-list{gap:clamp(var(--space-2xs),.85vw,var(--space-sm))}.player-modal__similar-card{outline:2px solid transparent;outline-offset:2px}.player-modal__similar-card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.player-modal__similar-card{display:block}.player-modal__similar-card{position:relative;display:flex;width:100%;min-width:0;align-items:flex-start;gap:.75rem;border-radius:var(--radius-xl);padding:.5rem;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.player-modal__similar-card:focus-within,.player-modal__similar-card:hover{background-color:var(--surface-panel-hover)}.player-modal__similar-card-media{position:relative;display:block;flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg);background-color:var(--surface-alt);width:var(--similar-card-media-width);aspect-ratio:16/9;background-image:var(--similar-card-thumb-url,none);background-position:50%;background-size:cover}@media (max-width:640px){.player-modal__similar-card-media{width:var(--similar-card-media-width-sm)}}.player-modal__similar-card-media img{display:block;width:100%;height:100%;-o-object-fit:cover;object-fit:cover;border-radius:inherit}#playerModal.player-modal__similar-card-content{display:block}.player-modal__similar-card-content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:.25rem}.player-modal__similar-card-title{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;line-height:1.375;color:var(--text-primary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);min-width:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.player-modal__similar-card-title:focus-visible,.player-modal__similar-card:hover .player-modal__similar-card-title{color:var(--color-accent-strong)}#playerModal.player-modal__similar-card-author{display:block}.player-modal__similar-card-author{display:flex;min-width:0;align-items:center}#playerModal.player-modal__similar-card-author-meta{display:block}.player-modal__similar-card-author-meta{display:flex;min-width:0;flex-direction:column}.player-modal__similar-card-author-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:500;color:var(--text-muted);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.player-modal__similar-card:hover .player-modal__similar-card-author-name{color:var(--color-text-strong)}.player-modal__similar-card-author-npub{display:none}#playerModal.player-modal__similar-card-meta{display:block}.player-modal__similar-card-meta{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight);color:var(--text-muted-strong);min-width:0}.player-modal__similar-card-timestamp{white-space:nowrap}.video-modal__stage{position:relative;isolation:isolate;overflow:visible;--video-modal-ambient-bleed:clamp(var(--space-2xl),12vw,var(--space-5xl));--video-modal-ambient-scale:1.38;--video-modal-ambient-blur:clamp(var(--video-modal-ambient-blur-min),20vw,var(--video-modal-ambient-blur-max));--video-modal-ambient-opacity:1}.video-modal__video{position:relative;z-index:1;border-radius:var(--radius-xl);padding-block:clamp(var(--space-xs),2.5vw,var(--space-md-plus));background-color:transparent;box-shadow:0 0 0 var(--border-width-hairline) color-mix(in srgb,var(--color-border-strong) 8%,transparent) inset;overflow:visible}.video-modal__ambient{position:absolute;inset:calc(var(--video-modal-ambient-bleed)*-1);border-radius:calc(var(--radius-3xl) + var(--video-modal-ambient-bleed));pointer-events:none;z-index:0;display:block;overflow:visible}.video-modal__ambient:before{content:"";position:absolute;inset:0;border-radius:inherit;background:radial-gradient(circle at 50% 50%,color-mix(in srgb,var(--color-overlay-strong) 18%,transparent) 0,color-mix(in srgb,var(--color-overlay) 34%,transparent) 62%,transparent 100%);opacity:.9;mix-blend-mode:screen;pointer-events:none}.video-modal__ambient-canvas{position:relative;width:100%;height:100%;display:block;transform:scale(var(--video-modal-ambient-scale));filter:blur(var(--video-modal-ambient-blur)) saturate(2) brightness(1.24);opacity:var(--video-modal-ambient-opacity)}@media (min-width:1024px){.video-modal__video{position:sticky;top:calc(var(--space-2xl) + var(--space-3xl));z-index:1}.video-modal__status{flex-basis:clamp(var(--space-xl),25%,var(--space-3xl));max-width:clamp(var(--space-xl),25%,var(--space-3xl))}.video-modal__details{position:relative;z-index:2;margin-top:var(--space-lg)}}#playerModal .video-modal__video video{position:relative;z-index:1;background-color:var(--color-black);border-radius:var(--radius-lg);box-shadow:var(--shadow-video-modal);max-height:min(80vh,56.25vw);-o-object-fit:contain;object-fit:contain}.video-modal__media{display:block;aspect-ratio:16/9;width:100%;-o-object-fit:contain;object-fit:contain}#playerModal.video-modal__details{display:block}.video-modal__details{display:flex;flex-direction:column;gap:1.5rem}.video-modal__meta{border-bottom-width:1px;border-color:var(--border-default);--tw-border-opacity:0.2;padding-bottom:1rem}#playerModal.video-modal__tags{display:block}.video-modal__tags{margin-left:-.25rem;margin-right:-.25rem;display:flex;gap:.5rem;padding-left:.25rem;padding-right:.25rem}.video-modal__similar .video-modal__tags{margin-bottom:clamp(var(--space-xs),.9vw,var(--space-md))}.video-modal__tags[hidden]{display:none}.video-modal__tags[data-fade]{position:relative}.video-modal__tags[data-fade]:after,.video-modal__tags[data-fade]:before{content:"";position:sticky;top:0;bottom:0;width:var(--space-lg);pointer-events:none;z-index:1}.video-modal__tags[data-fade]:before{left:0;background:linear-gradient(to right,var(--surface-overlay-muted),transparent)}.video-modal__tags[data-fade]:after{right:0;background:linear-gradient(to left,var(--surface-overlay-muted),transparent)}.video-tag-strip{display:flex;flex-wrap:nowrap;align-items:center;gap:var(--space-xs);overflow:hidden}.video-tag-pill{display:inline-flex;align-items:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--status-neutral-border);background-color:var(--status-neutral-surface);padding:.25rem .75rem;font-size:var(--font-size-2xs);line-height:var(--line-height-tight);font-weight:500;color:var(--status-neutral-on);position:relative;justify-content:center;white-space:nowrap;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-duration:.15s;min-height:calc(var(--space-sm) + var(--space-xs));margin-inline-end:.25rem}.video-tag-pill__label{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);opacity:1}#playerModal.video-tag-pill__icon{display:block}.video-tag-pill__icon{position:absolute;inset:0;display: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-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1);opacity:0;transform:scale(.8)}.video-tag-pill__icon svg{height:.75rem;width:.75rem}.video-tag-pill:focus-visible .video-tag-pill__label,.video-tag-pill:hover .video-tag-pill__label{opacity:0}.video-tag-pill:focus-visible .video-tag-pill__icon,.video-tag-pill:hover .video-tag-pill__icon{opacity:1;transform:scale(1)}#playerModal.video-modal__actions-row{display:block}.video-modal__actions-row{display:flex;width:100%;flex-wrap:wrap;align-items:flex-start;-moz-column-gap:.75rem;column-gap:.75rem;row-gap:.75rem}@media (min-width:640px){.video-modal__actions-row{-moz-column-gap:1rem;column-gap:1rem}}.video-modal__actions-group,.video-modal__reactions{flex:1 1 var(--menu-min-width);min-inline-size:0}#playerModal.video-modal__reactions{display:block}.video-modal__reactions{display:flex;flex-basis:100%;flex-wrap:wrap;align-items:flex-start;gap:.75rem}@media (min-width:640px){.video-modal__reactions{gap:1rem}}@media (min-width:768px){.video-modal__reactions{flex-basis:auto}}.video-modal__reaction-buttons{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.5rem}.video-modal__reaction-button{--video-modal-reaction-active-bg:color-mix(in srgb,var(--color-accent) 22%,var(--surface-overlay-panel));--video-modal-reaction-active-border:color-mix(in srgb,var(--color-accent) 38%,var(--border-overlay))}.video-modal__reaction-button[aria-pressed=true]{color:var(--color-accent-strong);background-color:var(--video-modal-reaction-active-bg);border-color:var(--video-modal-reaction-active-border)}.video-modal__reaction-button[aria-pressed=true] .video-modal__reaction-count{color:var(--color-accent-strong)}.video-modal__reaction-count{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--text-muted)}.video-modal__reaction-meter{display:flex;align-items:center;gap:var(--space-sm);flex-wrap:wrap;flex:1 1 var(--menu-min-width);max-inline-size:100%}.video-modal__reaction-meter-label{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-muted);min-inline-size:var(--video-modal-reaction-label-min-inline)}.video-modal__reaction-meter-track{position:relative;flex:1 1 auto;inline-size:100%;block-size:var(--space-xs);border-radius:var(--radius-full);background-color:var(--color-border-muted);overflow:hidden}.video-modal__reaction-meter-fill{position:absolute;inset-inline-start:0;inset-block-start:0;block-size:100%;max-inline-size:100%;inline-size:var(--video-modal-reaction-fill,0);width:var(--video-modal-reaction-fill,0);background-image:linear-gradient(90deg,var(--color-accent) 0,var(--color-accent-strong) 100%);transition:inline-size var(--motion-duration-base) var(--motion-ease-out)}.video-modal__reaction-meter-fill--empty{inline-size:0;width:0}#playerModal.video-modal__actions-group{display:block}.video-modal__actions-group{display:flex;flex-basis:100%;flex-wrap:wrap;align-items:flex-start;justify-content:flex-start;gap:.75rem}@media (min-width:768px){.video-modal__actions-group{flex-basis:auto;justify-content:flex-end;margin-inline-start:auto}}.video-modal__action-button{display:inline-flex;height:2.75rem;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);min-width:var(--video-modal-action-min-width);padding-inline:var(--space-md);border-width:var(--border-width-hairline);border-style:solid}.bv-modal.video-modal__action-label,.profile-pane.video-modal__action-label,.video-modal__action-label{display:none}@media (min-width:640px){.video-modal__action-label{display:inline}}.video-modal__action-icon{height:1.25rem;width:1.25rem}.video-modal__channel,.video-modal__description,.video-modal__stats{border-radius:1rem;border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.2;background-color:var(--surface-base);padding:1rem 1.25rem;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.video-modal__description-body{overflow-wrap:anywhere;word-break:break-word}.video-modal__description-body a{color:var(--color-accent-strong);text-decoration:underline;text-decoration-color:currentColor;word-break:break-word}.video-modal__description-body a:focus-visible,.video-modal__description-body a:hover{color:var(--color-accent-pressed)}.video-modal__comments{border-radius:1rem;border-width:1px;border-color:var(--border-default);--tw-border-opacity:0.2;background-color:var(--surface-base);padding:1.25rem;--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.comment-thread,.video-modal__comments{display:flex;flex-direction:column;gap:var(--space-lg)}.comment-thread__header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-sm)}.comment-thread__title{font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;color:var(--text-primary)}.comment-thread__count,.comment-thread__empty{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted);margin:0}.comment-thread__empty{padding:var(--space-md);border-radius:var(--radius-lg);border:var(--border-width-hairline) dashed color-mix(in srgb,var(--border-default) 40%,transparent);background-color:var(--surface-alt)}.comment-thread__list{display:flex;flex-direction:column;gap:var(--space-md);margin:0;padding:0;list-style:none}.comment-thread__item{display:grid;grid-template-columns:auto 1fr;gap:var(--space-md);padding-block:var(--space-sm);border-bottom:var(--border-width-hairline) solid var(--border-subtle)}.comment-thread__item:last-child{border-bottom:none;padding-bottom:0}.comment-thread__avatar{inline-size:var(--comment-avatar-size);block-size:var(--comment-avatar-size)}.comment-thread__avatar img{border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover;inline-size:100%;block-size:100%}.comment-thread__content{display:flex;flex-direction:column;gap:var(--space-xs);min-inline-size:0}.comment-thread__meta{font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-xs)}.comment-thread__author{font-weight:600;color:var(--text-primary)}.comment-thread__timestamp{color:var(--text-muted)}.comment-thread__body{color:var(--text-primary);line-height:1.6;word-break:break-word}.comment-thread__actions{font-size:var(--font-size-xs);line-height:var(--line-height-tight);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.comment-thread__actions button{outline:2px solid transparent;outline-offset:2px}.comment-thread__actions button:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.comment-thread__actions button{display:inline-flex;align-items:center;gap:.25rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--border-subtle);background-color:var(--surface-base);padding:.25rem .75rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:600;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.comment-thread__actions button:focus-visible,.comment-thread__actions button:hover{color:var(--text-primary);border-color:var(--border-default)}.comment-thread__replies{display:flex;flex-direction:column;gap:var(--space-md);margin:0;margin-inline-start:calc(var(--space-lg) + var(--space-sm));padding-inline-start:var(--space-md);padding-block-start:var(--space-md);border-inline-start:var(--border-width-hairline) solid var(--border-subtle);list-style:none}.comment-thread__load-more{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:var(--border-subtle);background-color:var(--surface-base);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--text-primary);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.comment-thread__load-more:focus-visible,.comment-thread__load-more:hover{border-color:var(--border-default);color:var(--text-primary);background-color:color-mix(in srgb,var(--surface-alt) 70%,transparent)}.comment-thread__disabled{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted);border-radius:var(--radius-lg);border:var(--border-width-hairline) dashed color-mix(in srgb,var(--border-default) 32%,transparent);background-color:var(--surface-alt);padding:var(--space-md)}.comment-composer{display:flex;flex-direction:column;gap:var(--space-md);border-top:var(--border-width-hairline) solid var(--border-subtle);padding-top:var(--space-lg)}.comment-composer__field{display:flex;flex-direction:column;gap:var(--space-2xs)}.comment-composer__label{font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;color:var(--text-primary)}.comment-composer__textarea{min-block-size:var(--comment-composer-min-height)}.comment-composer__footer{display:flex;flex-direction:column;gap:var(--space-sm)}.comment-composer__hint{font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted);margin:0}.comment-composer__actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:var(--space-sm)}.comment-composer__char-count{font-size:var(--font-size-xs);line-height:var(--line-height-tight);font-weight:500;color:var(--text-muted)}.comment-composer__submit{outline:2px solid transparent;outline-offset:2px}.comment-composer__submit:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.comment-composer__status{margin:0}@media (min-width:640px){.comment-composer__footer{flex-direction:row;align-items:center;justify-content:space-between}}.video-modal__progress{height:.5rem;width:100%;overflow:hidden;border-radius:var(--radius-full);background-color:var(--border-subtle)}#playerModal.video-modal__stat-metrics{display:block}.video-modal__stat-metrics{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:.75rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}.profile-modal{display:flex;flex-direction:column;inline-size:100%;block-size:100%;min-block-size:100%;max-block-size:none;overflow:hidden;--profile-modal-scale:0.9;--profile-modal-gap:calc((var(--space-md) - var(--space-3xs))*var(--profile-modal-scale));--profile-modal-padding-inline:calc((var(--space-lg) - var(--space-md))*var(--profile-modal-scale));--profile-modal-padding-block-start:calc((var(--space-md) - var(--space-2xs))*var(--profile-modal-scale));--profile-modal-padding-block-end:calc((var(--space-lg) - var(--space-sm))*var(--profile-modal-scale));--profile-modal-nav-gap:calc(var(--space-xs)*var(--profile-modal-scale))}.profile-modal__content{display:flex;flex:1 1 auto;flex-direction:column;block-size:100%;min-block-size:0;transform:scale(var(--profile-modal-scale));transform-origin:top center}.profile-modal__active-profile{outline:2px solid transparent;outline-offset:2px}.profile-modal__active-profile:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.profile-modal__active-profile{display:block}.profile-modal__active-profile{display:flex;flex-wrap:wrap;align-items:center;gap:1rem;padding:1rem}.profile-modal__active-details{display:flex;flex:1 1 var(--profile-modal-active-min-width);flex-direction:column;gap:var(--space-2xs);min-inline-size:0}.profile-modal__active-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-xs)}.profile-hashtag-list{display:flex;flex-wrap:wrap;gap:var(--space-xs);margin:0;padding:0;list-style:none}.profile-hashtag-item{display:inline-flex;align-items:center;gap:var(--space-3xs);padding-block:var(--space-3xs);padding-inline:var(--space-sm);border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--color-border-translucent);background-color:var(--color-panel);color:var(--color-text);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);line-height:var(--font-lineheight-tight)}.profile-hashtag-remove{display:inline-flex;align-items:center;justify-content:center;inline-size:var(--space-md);block-size:var(--space-md);border-radius:var(--radius-full);color:var(--color-text-muted);background:transparent;border:none;padding:0;cursor:pointer}.profile-hashtag-remove:hover{color:var(--color-text)}.profile-modal__remove-button{border-width:2px}.profile-modal__remove-button:focus-visible{--tw-ring-color:var(--color-critical-strong)}.profile-modal__add-profile{--tw-ring-color:var(--color-ring-alert);outline:2px solid transparent;outline-offset:2px}.profile-modal__add-profile:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}#playerModal.profile-modal__add-profile{display:block}.profile-modal__add-profile{position:relative;display:flex;width:100%;align-items:center;justify-content:flex-start;gap:1rem;border-radius:var(--radius-xl);padding:1rem 1.25rem;text-align:left;color:var(--text-primary);transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);border:var(--outline-thick-width) solid var(--color-ring-alert);background-color:var(--surface-panel-hover)}.profile-modal__add-profile:hover{background-color:color-mix(in srgb,var(--surface-panel-hover) 88%,var(--color-ring-alert) 12%)}.profile-modal__add-profile:focus-visible{background-color:color-mix(in srgb,var(--surface-panel-hover) 80%,var(--color-ring-alert) 20%)}#playerModal.profile-modal__add-profile-icon{display:block}.profile-modal__add-profile-icon{display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;border-radius:var(--radius-full);background-color:color-mix(in srgb,var(--color-ring-alert) 18%,var(--surface-panel));color:var(--color-ring-alert)}.profile-modal__body{overflow:hidden;overflow-x:hidden;padding-block-start:var(--profile-modal-padding-block-start);padding-block-end:var(--profile-modal-padding-block-end);padding-inline:var(--profile-modal-padding-inline)}.profile-modal__body,.profile-modal__layout{display:flex;flex:1 1 auto;flex-direction:column;gap:var(--profile-modal-gap);inline-size:100%;min-block-size:0}.profile-modal__header{align-items:center}.profile-modal__header-title{display:flex;align-items:center;gap:var(--space-sm)}.profile-modal__menu{display:flex;flex-direction:column;gap:var(--space-sm)}.profile-modal__pane-wrapper{display:flex;flex:1 1 auto;flex-direction:column;min-block-size:0}.profile-modal__nav{display:flex;flex-wrap:wrap;gap:var(--profile-modal-nav-gap);align-self:flex-start;overflow-x:hidden}.profile-modal__panes{flex:1 1 auto;block-size:100%;min-block-size:0;overflow-y:auto;padding-inline-end:var(--profile-modal-scrollbar-offset);scrollbar-gutter:stable}.profile-modal__panes,.profile-pane{display:flex;flex-direction:column;overflow-x:hidden}.profile-pane{min-block-size:auto}.profile-pane.hidden{display:none!important}@supports not (scrollbar-gutter:stable){.profile-modal__panes{padding-inline-end:calc(var(--profile-modal-scrollbar-offset) + var(--space-2xs))}}@media (max-width:calc(1024px - var(--breakpoint-edge-offset ))){.profile-modal__layout[data-mobile-view=menu] .profile-modal__pane-wrapper,.profile-modal__layout[data-mobile-view=pane] .profile-modal__menu{display:none}}@media (min-width:1024px){.profile-modal{max-block-size:var(--modal-shell-max-height)}.profile-modal__body{padding-inline:calc(var(--profile-modal-padding-inline) + var(--space-xs))}.profile-modal__body,.profile-modal__layout{gap:calc(var(--profile-modal-gap) + var(--space-2xs))}.profile-modal__layout{display:grid;align-items:stretch;block-size:100%;grid-template-columns:minmax(var(--profile-modal-nav-min-width),var(--profile-modal-nav-max-width)) minmax(0,1fr);grid-auto-rows:minmax(0,1fr)}.profile-modal__nav{flex-direction:column;flex-wrap:nowrap;gap:var(--profile-modal-nav-gap);justify-self:start;inline-size:var(--profile-modal-nav-max-width);min-inline-size:var(--profile-modal-nav-min-width)}.profile-modal__pane-wrapper{block-size:100%}}.beacon-hidden-download,.torrent-download-anchor,[data-beacon-hidden-download]{display:none!important}.beacon-clipboard-offscreen,.torrent-clipboard-textarea,[data-beacon-clipboard-state=offscreen],[data-beacon-clipboard=offscreen]{position:fixed;top:0;left:var(--offscreen-offset);opacity:0;width:0;height:0;pointer-events:none}.beacon-toast-motion,.torrent-toast-motion{transition-property:opacity,transform;will-change:opacity,transform;opacity:0;transform:translateY(var(--toast-translate))}.beacon-toast-motion[data-beacon-motion=enter],.beacon-toast-motion[data-beacon-motion=show],.torrent-toast-motion[data-beacon-motion=enter],.torrent-toast-motion[data-beacon-motion=show]{opacity:1;transform:translateY(0)}.beacon-toast-motion[data-beacon-motion=exit],.torrent-toast-motion[data-beacon-motion=exit]{opacity:0;transform:translateY(var(--toast-translate))}.torrent-toast{pointer-events:auto;width:100%;max-width:28rem;border-radius:var(--radius-lg);padding:.75rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;letter-spacing:-.025em;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-inset:inset}.torrent-toast--info{border-width:1px;border-color:var(--border-overlay);background-color:var(--surface-base);color:var(--text-primary)}.torrent-toast--success{border-width:1px;border-color:var(--color-info);--tw-border-opacity:0.6;background-color:var(--color-info);color:var(--color-white)}.torrent-toast--error{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.6;background-color:var(--color-critical);color:var(--color-white)}.torrent-toast--warn{border-width:1px;border-color:var(--status-warning-strong);--tw-border-opacity:0.7;background-color:var(--status-warning-strong);color:var(--status-warning-strong)}.watch-history-card{--video-card-lift-translate-y:0;--video-card-backdrop-opacity:0;--video-card-backdrop-translate-y:var(--space-md-plus);--video-card-backdrop-scale:1.08;--video-card-backdrop-blur:var(--blur-thumbnail-blur);outline:2px solid transparent;outline-offset:2px}.watch-history-card:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.7;--tw-ring-offset-width:2px;--tw-ring-offset-color:var(--surface-base);transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-duration:var(--motion-duration-fast);transition-timing-function:cubic-bezier(0,0,.2,1);--tw-ring-color:var(--color-accent)}.watch-history-card{position:relative;border-radius:var(--radius-lg);border-width:1px;border-color:transparent;background-color:var(--surface-raised);color:var(--text-primary);--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);transform:translate3d(0,var(--video-card-lift-translate-y),0);transition-property:transform,box-shadow,border-color,background-color,color;will-change:transform;isolation:isolate}.watch-history-card:before{content:"";position:absolute;inset:0;z-index:0;opacity:var(--video-card-backdrop-opacity);background-image:var(--video-card-thumb-url,none);background-position:50%;background-repeat:no-repeat;background-size:cover;transform:translate3d(0,var(--video-card-backdrop-translate-y),0) scale(var(--video-card-backdrop-scale));filter:blur(var(--video-card-backdrop-blur));transition:opacity var(--motion-duration-base) var(--motion-ease-in-out),transform var(--motion-duration-base) var(--motion-ease-in-out),filter var(--motion-duration-base) var(--motion-ease-in-out);pointer-events:none;will-change:opacity,transform,filter}.watch-history-card>*{position:relative;z-index:1}.watch-history-card:focus-within,.watch-history-card:hover{--video-card-lift-translate-y:var(--motion-video-card-hover-translate);--video-card-backdrop-opacity:0.425;--video-card-backdrop-translate-y:var(
--motion-video-card-backdrop-translate
- );--video-card-backdrop-scale:1.12;--video-card-backdrop-blur:var(--blur-video-card-backdrop-strong);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card:focus-visible{border-color:var(--color-accent);--tw-border-opacity:0.4;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=critical]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}.watch-history-card[data-state=private]{background-color:var(--surface-raised-private);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.watch-history-card[data-state=disabled],.watch-history-card[data-state=private]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=disabled]{opacity:.6;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.watch-history-card[data-alert=nsfw-owner]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--color-black)}.watch-history-card[data-alert=nsfw-owner]:hover{--tw-border-opacity:0.6;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card img[data-thumbnail-state=blurred],.watch-history-card img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}.watch-history-card[data-owner-is-viewer=true][data-url-health-state=offline][data-stream-health-state=unhealthy]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max));flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}.watch-history-card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}#playerModal.watch-history-card{display:block}.watch-history-card{display:flex;flex-wrap:wrap;align-items:stretch;gap:1.25rem;padding:1rem;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}@media (prefers-reduced-motion:reduce){.watch-history-card,.watch-history-card[data-motion=enter]{transition-property:none}.watch-history-card[data-motion=enter]{opacity:1;animation:none}}.watch-history-card:hover{--tw-translate-y:-0.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.watch-history-card{gap:1.5rem;padding:1.25rem}}.watch-history-card--private{border-color:var(--color-info);--tw-border-opacity:0.6}#playerModal.watch-history-card__primary{display:block}.watch-history-card__primary{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;align-items:stretch;gap:1rem}@media (min-width:640px){.watch-history-card__primary{flex-direction:row}}.watch-history-card__thumbnail{display:block;width:14rem;max-width:100%;flex:none;color:var(--text-primary);text-decoration-line:none}.watch-history-card__thumbnailInner{aspect-ratio:16/9;width:100%;overflow:hidden;border-radius:var(--radius-lg);background-color:var(--surface-base)}.watch-history-card__thumbnailInner img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.watch-history-card [data-thumbnail-state=blurred] img,.watch-history-card [data-visual-state=blurred] img{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal.watch-history-card__details{display:block}.watch-history-card__details{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;justify-content:center;gap:var(--space-sm)}.watch-history-card__title{cursor:pointer;font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;line-height:1.375;color:var(--text-primary);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.watch-history-card__title:focus,.watch-history-card__title:hover{color:var(--color-accent)}.watch-history-card__created{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}#playerModal.watch-history-card__meta{display:block}.watch-history-card__meta{display:flex;min-width:0;flex-direction:column;justify-content:space-between;gap:1rem}@media (min-width:640px){.watch-history-card__meta{min-width:14rem;flex:none;flex-basis:16rem}}.watch-history-card__watched{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--border-subtle)}#playerModal.watch-history-card__creator{display:block}.watch-history-card__creator{display:flex;align-items:center;gap:.75rem}#playerModal.watch-history-card__creatorAvatar{display:block}.watch-history-card__creatorAvatar{display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;overflow:hidden;border-radius:var(--radius-full);background-color:var(--surface-panel);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorAvatar:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible,.watch-history-card__creatorAvatar:hover{--tw-ring-color:color-mix(in srgb,var(--color-accent) 38%,transparent)}.watch-history-card__creatorAvatar img{height:100%;width:100%;border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover}.watch-history-card__creatorName{cursor:pointer;background-color:transparent;padding:0;text-align:left;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorName:hover{color:var(--color-accent)}.watch-history-card__creatorName:focus-visible{color:var(--color-accent)}#playerModal.watch-history-card__actions{display:block}.watch-history-card__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem}.watch-history-card__action{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--surface-panel);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__action:hover{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action:focus-visible{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action--primary{background-color:var(--color-accent-strong);color:var(--color-white)}.watch-history-card__action--primary:hover{background-color:var(--color-accent-pressed)}.watch-history-card__action--primary:focus-visible{background-color:var(--color-accent-pressed)}.watch-history-card__action--danger{background-color:var(--color-critical);color:var(--color-white)}.watch-history-card__action--danger:hover{background-color:var(--color-critical-strong)}.watch-history-card__action--danger:focus-visible{background-color:var(--color-critical-strong)}#playerModal.watch-history-card__moderation{display:block}.watch-history-card__moderation{margin-top:var(--space-sm);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.watch-history-card__hidden{margin-top:var(--space-md);border-radius:var(--radius-lg);border-width:1px;border-style:dashed;border-color:var(--border-default);background-color:var(--surface-overlay-panel-soft);font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary)}.watch-history-card__hidden .moderation-badge{align-self:flex-start}#playerModal .channel-card__avatar img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal .video-modal__moderation-bar .moderation-badge{--text-status-neutral-on:var(--color-text);--text-status-warning-on:var(--color-warning-on)}#playerModal .video-modal__moderation-bar .moderation-badge[data-variant=neutral]{color:var(--color-text)}.\!container{max-width:var(--layout-docs-max-width)!important;margin:0 auto!important;padding:var(--space-md)!important}.container{max-width:var(--layout-docs-max-width);margin:0 auto;padding:var(--space-md)}.qr-code__table{margin:var(--qr-code-table-margin,0)}.qr-code__cell,.qr-code__table{border:0;border-collapse:collapse}.qr-code__cell{padding:0;margin:0;width:var(--qr-code-cell-width);height:var(--qr-code-cell-height);background-color:var(--qr-code-color-light)}.qr-code__cell--dark{background-color:var(--qr-code-color-dark)}.qr-code__container[data-qr-code-mode=image] .qr-code__canvas{display:none}.qr-code__container[data-qr-code-mode=canvas] .qr-code__canvas,.qr-code__container[data-qr-code-mode=image] .qr-code__image{display:block}.qr-code__container[data-qr-code-mode=canvas] .qr-code__image{display:none}.fade-in{opacity:0;animation:interface-fade-in .28s ease-out forwards;animation-delay:var(--fade-in-delay,0ms)}.fade-in-delay-100{--fade-in-delay:100ms}.fade-in-delay-200{--fade-in-delay:200ms}.fade-in-delay-300{--fade-in-delay:300ms}.\!card[data-motion=enter]{opacity:0!important;animation:card-motion-enter .22s ease-out forwards!important}.card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg);flex:0 0 var(--icon-size-lg);line-height:0;background-color:var(--color-neutral-700);color:var(--color-white);border:none;border-radius:var(--radius-full);cursor:pointer;transition:background-color .2s ease,box-shadow .2s ease}.icon-button:hover{background-color:var(--color-neutral-600)}.icon-button:active,.icon-button:focus{outline:none;box-shadow:0 0 0 var(--icon-button-ring-width) var(--color-ring-alert)}.icon-image{width:var(--icon-size-md);height:var(--icon-size-md);pointer-events:none}.accent-action-button,.channel-action-button{--accent-action-bg:color-mix(in srgb,var(--surface-overlay-panel) 78%,transparent);--accent-action-border:color-mix(in srgb,var(--border-overlay) 92%,transparent);--accent-action-bg-hover:color-mix(in srgb,var(--color-accent) 22%,var(--surface-overlay-panel));--accent-action-ring:color-mix(in srgb,var(--color-accent) 48%,transparent);--accent-action-bg-active:color-mix(in srgb,var(--color-accent-pressed) 28%,var(--surface-overlay-panel));color:var(--color-text);background-color:var(--accent-action-bg);border-color:var(--accent-action-border);border-style:solid;border-width:var(--border-width-hairline)}.accent-action-button:focus-visible,.accent-action-button:hover,.channel-action-button:focus-visible,.channel-action-button:hover{color:var(--color-accent-strong);background-color:var(--accent-action-bg-hover)}.accent-action-button:focus,.accent-action-button:focus-visible,.channel-action-button:focus,.channel-action-button:focus-visible{box-shadow:0 0 0 var(--icon-button-ring-width) var(--accent-action-ring)}.accent-action-button:active,.channel-action-button:active{color:var(--color-accent-pressed);background-color:var(--accent-action-bg-active)}.modal-nav .icon-button{box-shadow:none;padding:0;gap:0;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg)}.modal-nav .icon-button:not(.accent-action-button):not(.channel-action-button){border:none}.modal-meta{gap:var(--space-xs)}.modal-meta,.modal-view-count{display:inline-flex;align-items:center}.modal-view-count{gap:var(--space-2xs);font-size:var(--font-size-sm);line-height:var(--space-md-plus);color:var(--color-muted-alt);white-space:nowrap}.view-count-text{white-space:nowrap;color:var(--color-muted-strong)}.ratio-16-9{position:relative;width:100%;padding-top:56.25%;background-color:var(--color-card)}.ratio-16-9>img{position:absolute;inset:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}#modalContainer{position:fixed;inset:0;z-index:var(--z-modal-root);pointer-events:none;isolation:isolate}#modalContainer>*{pointer-events:auto}#modalContainer>[id$=Modal]:not(#playerModal){z-index:var(--z-modal-root)}#modalContainer>[id$=Modal]:not(#playerModal)>.bv-modal-backdrop{z-index:var(--z-modal-overlay)}#modalContainer>[id$=Modal]:not(#playerModal) .bv-modal__panel{z-index:var(--z-modal-content)}#modalContainer>#profileModal,#profileModal[data-modal-stack=top]{z-index:var(--z-modal-top-root)}#modalContainer>#profileModal>.bv-modal-backdrop,#profileModal[data-modal-stack=top]>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#profileModal .bv-modal__panel,#profileModal[data-modal-stack=top] .bv-modal__panel{z-index:var(--z-modal-top-content)}#modalContainer>#eventDetailsModal{z-index:var(--z-modal-top-root)}#modalContainer>#eventDetailsModal>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#eventDetailsModal .bv-modal__panel{z-index:var(--z-modal-top-content)}.bv-modal[data-nested-modal-active=true]{pointer-events:none;visibility:hidden}#modalContainer>#loginModal{z-index:var(--z-modal-peak-root)}#modalContainer>#loginModal>.bv-modal-backdrop{z-index:var(--z-modal-peak-overlay)}#modalContainer>#loginModal .bv-modal__panel{z-index:var(--z-modal-peak-content)}#modalContainer>#playerModal{z-index:var(--z-modal-player)}#modalContainer>#playerModal .player-modal__container,#modalContainer>#playerModal .player-modal__content{z-index:var(--z-modal-content)}#playerModal{position:fixed;inset:0;z-index:var(--z-modal-player);display:none;flex-direction:column;align-items:stretch;justify-content:flex-start;width:100vw;height:100vh;padding:0;background-color:var(--color-surface);color:var(--color-subtle-text);--player-modal-inline-max:var(--layout-player-max-width);--player-modal-inline-padding:clamp(var(--space-md-plus),4vw,var(--space-2xl));overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}#playerModal.flex{display:block}#modalVideo{width:100%;aspect-ratio:16/9;background-color:var(--color-black)}.notification-portal{position:fixed;top:0;left:0;right:0;z-index:var(--z-overlay-toast);display:flex;flex-direction:column;align-items:center;gap:var(--space-md);padding:calc(var(--space-xl) + env(safe-area-inset-top)) var(--space-lg) var(--space-lg);pointer-events:none;opacity:0;transform:translateY(var(--toast-translate));transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}@media (min-width:640px){.notification-portal{padding-inline:var(--space-xl)}}.notification-portal:has(.notification-banner:not(.hidden)){opacity:1;transform:translateY(0)}.notification-portal--active{opacity:1;transform:translateY(0)}.notification-banner,.torrent-toast{--notify-accent:var(--notification-banner-accent);--notify-accent-strong:var(--notification-banner-accent-strong);--notify-border:var(--notification-banner-border);--notify-background:var(--notification-banner-background);--notify-foreground:var(--notification-banner-text);position:relative;display:flex;align-items:center;gap:var(--space-md);width:min(var(--notification-banner-max-inline),100%);padding:var(--space-md) var(--space-xl);border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--notify-border);background:var(--notify-background);color:var(--notify-foreground);box-shadow:0 var(--shadow-notification-offset-y) var(--shadow-notification-blur) var(--color-shadow-notification);backdrop-filter:blur(var(--overlay-backdrop-blur));pointer-events:auto;isolation:isolate;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;line-height:1.375;transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}.notification-banner:before,.torrent-toast:before{content:"";position:absolute;inset:0;border-radius:inherit;background:linear-gradient(135deg,var(--notify-accent) 0,var(--notify-accent-strong) 100%);opacity:.18;pointer-events:none}.notification-banner>*,.torrent-toast>*{position:relative;z-index:1}.notification-dismiss{display:inline-flex;height:2rem;width:2rem;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);color:inherit;opacity:.75;background-color:var(--notify-dismiss-background)}.notification-dismiss:focus-visible,.notification-dismiss:hover{opacity:1;background-color:var(--notify-dismiss-background-hover)}.notification-dismiss svg{height:1rem;width:1rem}.notification-banner:not(.hidden){animation:notification-slide-in var(--motion-duration-base) var(--motion-ease-out)}.notification-banner--critical,.torrent-toast--error{--notify-accent:var(--notification-banner-critical-accent);--notify-accent-strong:var(--notification-banner-critical-accent-strong);--notify-border:var(--notification-banner-critical-border);--notify-background:var(--notification-banner-critical-background);--notify-foreground:var(--notification-banner-critical-text)}.notification-banner--success,.torrent-toast--success{--notify-accent:var(--notification-banner-success-accent);--notify-accent-strong:var(--notification-banner-success-accent-strong);--notify-border:var(--notification-banner-success-border);--notify-background:var(--notification-banner-success-background);--notify-foreground:var(--notification-banner-success-text)}.notification-banner--info,.torrent-toast--info{--notify-accent:var(--notification-banner-info-accent);--notify-accent-strong:var(--notification-banner-info-accent-strong);--notify-border:var(--notification-banner-info-border);--notify-background:var(--notification-banner-info-background);--notify-foreground:var(--notification-banner-info-text)}.notification-banner--warning,.torrent-toast--warn{--notify-accent:var(--notification-banner-warning-accent);--notify-accent-strong:var(--notification-banner-warning-accent-strong);--notify-border:var(--notification-banner-warning-border);--notify-background:var(--notification-banner-warning-background);--notify-foreground:var(--notification-banner-warning-text)}.status-banner .status-spinner{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-info-border);border-radius:var(--radius-full);border-top-color:var(--color-info);flex-shrink:0;height:var(--icon-size-md);width:var(--icon-size-md)}.status-banner .status-message{flex:1 1 auto}@keyframes notification-slide-in{0%{opacity:0;transform:translateY(var(--toast-translate))}to{opacity:1;transform:translateY(0)}}.status-spinner--inline{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-border-info-soft);border-radius:var(--radius-full);border-top-color:var(--color-info);display:inline-block;height:var(--space-md);width:var(--space-md)}body.iframe-form{background-color:transparent;color:var(--color-text);font-family:var(--font-family-sans);margin:var(--space-lg)}body.iframe-form .container{width:100%;max-width:100%;margin:0;padding:0}body.iframe-form .\!container{width:100%!important;max-width:100%!important;margin:0!important;padding:0!important}body.iframe-form .form-container{background-color:var(--color-surface-alt);border-radius:var(--radius-md);box-shadow:var(--shadow-md);color:var(--color-text);display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-lg)}body.iframe-form .form-container>p{margin:0}body.iframe-form form{display:flex;flex-direction:column}body.iframe-form form>*+*{margin-top:var(--space-sm)}body.iframe-form form h1,body.iframe-form form h2{color:var(--color-text);margin-top:var(--space-md)}body.iframe-form label{color:var(--color-subtle-text);display:block;font-weight:600;margin-top:var(--space-sm)}body.iframe-form label+.form-control,body.iframe-form label+.select,body.iframe-form label+.textarea{margin-top:var(--space-xs)}body.iframe-form .checkbox-group,body.iframe-form .radio-group{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-xs)}body.iframe-form .checkbox-group label,body.iframe-form .radio-group label{align-items:center;color:var(--color-subtle-text);display:inline-flex;font-weight:500;gap:var(--space-xs);margin:0}body.iframe-form .checkbox-group input[type=checkbox],body.iframe-form .radio-group input[type=radio]{margin:0}body.iframe-form .radio-group input[type=radio]{accent-color:var(--color-accent-strong)}body.iframe-form button.btn{align-self:flex-start;margin-top:var(--space-md)}body.iframe-form button.\!btn{align-self:flex-start!important;margin-top:var(--space-md)!important}body.iframe-form #status{background:var(--color-surface);border-radius:var(--radius-sm);box-shadow:inset 0 0 0 var(--border-width-hairline) var(--color-border-translucent);color:var(--color-subtle-text);min-height:calc(var(--space-2xl) + var(--space-xl));padding:var(--space-sm);white-space:pre-wrap}body.iframe-form .status-line{color:var(--color-subtle-text);margin:var(--space-2xs) 0}body.iframe-form .status-line.error{color:var(--color-critical-strong)}body.iframe-form .status-line.\!error{color:var(--color-critical-strong)!important}body.iframe-form .status-line.success{color:var(--color-info-strong)}body.iframe-form .status-line.\!success{color:var(--color-info-strong)!important}body.iframe-form .status-line.warn{color:var(--color-warning-strong)}@media (max-width:640px){body.iframe-form{margin:var(--space-md)}body.iframe-form .form-container{padding:var(--space-md)}}#sidebarContainer{position:relative;overflow:visible}#sidebar{position:fixed;top:0;left:0;width:var(--sidebar-width);min-width:var(--sidebar-width);height:100vh;height:100dvh;color:var(--color-text-frosted-strong);overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;overscroll-behavior-inline:contain;touch-action:pan-y;scrollbar-gutter:stable both-edges;background:transparent;border-right:none;backdrop-filter:none;-webkit-backdrop-filter:none;transition:width .2s ease,transform .3s ease;z-index:var(--z-sidebar);box-shadow:none;isolation:isolate}#app.sidebar-collapsed,#sidebar.sidebar-collapsed,#sidebar[data-state=collapsed],body.sidebar-collapsed{--sidebar-width:var(--sidebar-width-collapsed)}#app.sidebar-expanded,#sidebar.sidebar-expanded,#sidebar[data-state=expanded],body.sidebar-expanded{--sidebar-width:var(--sidebar-width-expanded)}#sidebar .sidebar__inner{padding-block-start:max(var(--space-sidebar-shell-block-start),calc(var(--app-header-centerline) - var(--sidebar-control-size)/2));padding-block-end:var(--space-sidebar-shell-block-end);padding-inline:var(--space-sidebar-shell-inline);border-radius:var(--radius-sidebar-shell);border:none;background:none;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;isolation:isolate;transition:color .2s ease}#sidebar .sidebar__inner,.sidebar-scroll{display:flex;flex-direction:column;height:100%;width:100%;overflow:visible}.sidebar-scroll{gap:var(--space-sidebar-scroll-gap);min-height:0;flex:1 1 auto}.sidebar-panel{position:relative;width:100%;display:flex;flex-direction:column;gap:var(--space-sidebar-panel-gap);padding:var(--space-sidebar-panel-padding-block) var(--space-sidebar-panel-padding-inline);border-radius:var(--radius-sidebar-panel);border:none;background:transparent;box-shadow:none;color:inherit;backdrop-filter:none;-webkit-backdrop-filter:none;overflow:hidden;isolation:isolate;transition:border-color .2s ease,box-shadow .22s ease,background .22s ease}.sidebar-panel--primary{flex:1 1 auto;min-height:0;padding-block-start:0}.sidebar-panel__header{display:flex;justify-content:flex-end;margin-bottom:var(--space-md)}.sidebar-collapse-toggle{display:inline-flex;align-items:center;justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--color-border-translucent-medium);background:var(--color-surface-tint-subtle);color:inherit;cursor:pointer;transition:background .18s ease,color .18s ease,border-color .18s ease;flex-shrink:0;box-sizing:border-box}.sidebar-collapse-toggle:hover{background:var(--color-border-translucent);border-color:var(--color-border-translucent-stronger);color:var(--color-text)}.sidebar-collapse-toggle:focus-visible{outline:var(--space-3xs) solid var(--color-secondary);outline-offset:var(--space-2xs)}.sidebar-collapse-toggle__icon{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .2s ease}.sidebar-nav{display:flex;flex-direction:column;gap:var(--space-xs);opacity:1;transition:opacity .16s ease;width:100%}.sidebar-nav-link{--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-opacity:0;--sidebar-nav-link-highlight-scale:0.96;display:flex;align-items:center;gap:var(--space-sidebar-footer-gap);padding-block:var(--space-sidebar-nav-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);font-size:var(--font-size-sidebar-nav);font-weight:600;letter-spacing:.015em;color:var(--color-text);text-decoration:none;width:100%;position:relative;border:var(--border-width-hairline) solid transparent;background:none;box-shadow:none;transform:translateX(var(--sidebar-nav-translate-x));transition:color .18s ease,border-color .2s ease,box-shadow .22s ease,transform .22s ease;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none}.sidebar-nav-link:after,.sidebar-nav-link:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none;transition:opacity .22s ease,transform .24s ease;z-index:-1}.sidebar-nav-link:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:var(--sidebar-nav-link-highlight-opacity);transform:scale(var(--sidebar-nav-link-highlight-scale));filter:saturate(140%)}.sidebar-nav-link:after{background:linear-gradient(105deg,var(--color-sidebar-hover) 0,transparent 75%);opacity:.22;mix-blend-mode:screen;z-index:-2}.sidebar-nav-link:focus-visible,.sidebar-nav-link:hover{--sidebar-nav-link-highlight-opacity:1;--sidebar-nav-link-highlight-scale:1.02;--sidebar-nav-translate-x:var(--space-sidebar-nav-translate);color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible:after,.sidebar-nav-link:hover:after{opacity:.35}.sidebar-nav-link--sub{font-size:var(--font-size-sidebar-subnav);font-weight:500;color:var(--color-sidebar-text-muted);padding-block:var(--space-sidebar-subnav-padding-block);letter-spacing:.02em;--sidebar-nav-link-highlight-opacity:0.25;--sidebar-nav-link-highlight-scale:1}.sidebar-icon{width:var(--space-lg);height:var(--space-lg);min-width:var(--space-lg);min-height:var(--space-lg);flex-shrink:0;display:block;filter:var(--sidebar-icon-filter);transition:filter .18s ease}.sidebar-footer{flex-direction:column;margin-top:auto;z-index:2}.sidebar-dropup-trigger,.sidebar-footer{display:flex;gap:var(--space-sidebar-footer-gap);position:relative}.sidebar-dropup-trigger{align-items:center;justify-content:space-between;width:100%;padding-block:var(--space-sidebar-trigger-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);border:var(--border-width-hairline) solid transparent;background:none;color:var(--color-text);font-size:var(--font-size-sidebar-trigger);font-weight:600;cursor:pointer;box-sizing:border-box;flex-shrink:0;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none;box-shadow:none;transition:border-color .2s ease,color .2s ease,box-shadow .22s ease}.sidebar-dropup-trigger:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:0;transform:scale(.96);transition:opacity .2s ease,transform .22s ease;z-index:-1;filter:saturate(140%)}.sidebar-dropup-trigger:after,.sidebar-dropup-trigger:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none}.sidebar-dropup-trigger:after{background:linear-gradient(110deg,var(--color-sidebar-hover) 0,transparent 80%);opacity:.18;mix-blend-mode:screen;transition:opacity .2s ease;z-index:-2}.sidebar-dropup-trigger:focus-visible,.sidebar-dropup-trigger:hover{color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger:focus-visible:before,.sidebar-dropup-trigger:hover:before{opacity:1;transform:scale(1.02)}.sidebar-dropup-trigger:focus-visible:after,.sidebar-dropup-trigger:hover:after{opacity:.35}.sidebar-dropup-trigger:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger__glyph{width:var(--icon-size-md);height:var(--icon-size-md);opacity:.9}.sidebar-dropup-trigger__chevron{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .18s ease}.sidebar-dropup-trigger[aria-expanded=true] .sidebar-dropup-trigger__chevron,.sidebar-dropup-trigger__chevron.is-rotated{transform:rotate(180deg)}.sidebar-dropup-panel{position:absolute;left:0;right:0;bottom:calc(100% + var(--space-sidebar-popover-offset));border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--color-sidebar-border-strong);background:linear-gradient(160deg,color-mix(in srgb,var(--color-sidebar-surface) 88%,transparent) 0,color-mix(in srgb,var(--color-sidebar-surface-alt) 68%,transparent) 100%);box-shadow:inset 0 0 0 var(--border-width-fine) var(--color-sidebar-border),var(--shadow-sidebar-panel);padding:var(--space-sidebar-popover-padding-block) var(--space-sidebar-popover-padding-inline);color:var(--color-text-frosted);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(var(--space-sm));transition:opacity .18s ease,transform .18s ease,visibility .18s ease,box-shadow .22s ease;backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));-webkit-backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));z-index:5;isolation:isolate}.sidebar-dropup-panel[data-state=expanded]{opacity:1;visibility:visible;pointer-events:auto;transform:translateY(0)}.sidebar-dropup-panel__inner{display:flex;flex-direction:column;gap:var(--space-sidebar-popover-gap);width:100%;padding-inline-end:var(--space-sidebar-dropup-scroll-reserve);max-height:var(--sidebar-dropup-max-height);overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable both-edges}.sidebar-dropup-panel__inner.is-measuring{position:absolute;width:-moz-max-content;width:max-content;max-width:none;visibility:hidden;pointer-events:none;left:var(--offscreen-offset);right:auto;top:auto;bottom:auto}.sidebar-dropup-measure{position:absolute;visibility:hidden;pointer-events:none;height:0;overflow:hidden}.sidebar-dropup-panel__inner>*{width:100%;min-width:0}#sidebar[data-footer-state=expanded] .sidebar-nav{opacity:0;pointer-events:none}#sidebar[data-footer-state=collapsed] .sidebar-nav{opacity:1}.sidebar-loading-wrapper{display:flex;justify-content:center;align-items:center;padding:var(--space-2xl) 0;width:100%;grid-column:1/-1}.sidebar-loading-indicator{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--color-muted-strong);font-size:var(--font-size-sm);font-weight:500;letter-spacing:.01em}.sidebar-loading-text{white-space:nowrap}#app{box-sizing:border-box;transition:margin-left .2s ease,width .2s ease,max-width .2s ease}#app[data-sidebar-state=collapsed]{margin-left:var(--sidebar-width-collapsed);width:calc(100vw - var(--sidebar-width-collapsed));max-width:calc(100vw - var(--sidebar-width-collapsed))}#app[data-sidebar-state=expanded]{margin-left:max(var(--sidebar-width-expanded-base),var(--sidebar-dropup-content-width));width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)))}#sidebar.sidebar-collapsed .sidebar-nav-link,body.sidebar-collapsed #sidebar .sidebar-nav-link{justify-content:center;width:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full);--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-scale:1}#sidebar.sidebar-expanded .sidebar-nav-link,body.sidebar-expanded #sidebar .sidebar-nav-link{justify-content:flex-start}#sidebar.sidebar-collapsed .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-text{display:none}#sidebar.sidebar-collapsed .sidebar__inner,body.sidebar-collapsed #sidebar .sidebar__inner{padding-inline:var(--space-2xs)}#sidebar.sidebar-collapsed .sidebar-panel,body.sidebar-collapsed #sidebar .sidebar-panel{padding-inline:calc(var(--space-3xs)*3)}#sidebar.sidebar-collapsed .sidebar-panel__header,body.sidebar-collapsed #sidebar .sidebar-panel__header{justify-content:center}#sidebar.sidebar-collapsed .sidebar-collapse-toggle,body.sidebar-collapsed #sidebar .sidebar-collapse-toggle{margin-inline:auto}#sidebar .sidebar-toggle-icon--rotated{transform:rotate(180deg)}#sidebar.sidebar-collapsed .sidebar-toggle-icon--rotated,body.sidebar-collapsed #sidebar .sidebar-toggle-icon--rotated{transform:rotate(0deg)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger{justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__chevron{display:none}#sidebar.sidebar-collapsed .sidebar-dropup-trigger__glyph,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__glyph{margin:0}#sidebar.sidebar-collapsed .sidebar-nav-link:focus-visible,#sidebar.sidebar-collapsed .sidebar-nav-link:hover,body.sidebar-collapsed #sidebar .sidebar-nav-link:focus-visible,body.sidebar-collapsed #sidebar .sidebar-nav-link:hover{--sidebar-nav-translate-x:0}@media (min-width:768px){.sidebar-panel__header{display:flex}.sidebar-collapse-toggle{display:inline-flex}#sidebar{transform:translateX(0)!important;width:var(--sidebar-width);overflow:visible}#app[data-sidebar-state=collapsed]{margin-left:calc(var(--sidebar-width-collapsed) + var(--sidebar-content-gap));width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap));max-width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap))}#app[data-sidebar-state=expanded]{margin-left:max(calc(var(--sidebar-width-expanded-base) + var(--sidebar-content-gap)),calc(var(--sidebar-dropup-content-width) + var(--sidebar-content-gap)));width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)))}}@keyframes card-motion-enter{0%{opacity:0;transform:translateY(var(--motion-card-enter-translate))}to{opacity:1;transform:translateY(0)}}@keyframes video-thumbnail-fade-in{0%{opacity:0}to{opacity:1}}@keyframes interface-fade-in{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0;transform:translateY(var(--motion-fade-in-translate))}to{opacity:1;transform:translateY(0)}}.status-line{margin-top:.25rem;margin-bottom:.25rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);line-height:1.375;color:var(--text-primary)}.status-line.error{color:var(--color-critical-strong)}.status-line.\!error{color:var(--color-critical-strong)!important}.status-line.warn{color:var(--color-warning-strong)}@keyframes ztr-rotate{to{transform:rotate(1turn)}}@keyframes ztr-dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes svelte-181fgen-loader-animation{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes svelte-181fgen-fade-in{to{opacity:1}}.dm-app-shell{display:flex;flex-direction:column;gap:var(--space-lg);padding:var(--space-lg);background:var(--surface-base);color:var(--text-primary);min-height:100vh}.dm-app-shell__main,.dm-app-shell__sidebar{border-radius:var(--radius-lg);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-panel);box-shadow:var(--shadow-soft)}.dm-app-shell__sidebar{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md)}.dm-app-shell__title{font-size:var(--font-size-lg);margin:0}.dm-app-shell__main{flex:1;display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);background:var(--surface-raised)}.dm-conversation-list{display:flex;flex-direction:column;gap:var(--space-sm)}.dm-conversation-list__header{display:flex;justify-content:space-between;align-items:center}.dm-conversation-list__title{font-size:var(--font-size-sm);text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);margin:0}.dm-conversation-list__items{display:flex;flex-direction:column;gap:var(--space-xs);overflow-y:auto;max-height:60vh;padding-right:var(--space-xs)}.dm-conversation-list__state{font-size:var(--font-size-sm);color:var(--text-muted);padding:var(--space-md);text-align:center;background:var(--surface-sunken);border-radius:var(--radius-md)}.dm-contact-row{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-subtle);background:transparent;color:inherit;text-align:left;cursor:pointer}.dm-contact-row:focus-visible,.dm-contact-row:hover{background:var(--surface-muted);border-color:var(--border-strong);outline:none}.dm-contact-row--active{background:var(--surface-sunken);border-color:var(--border-strong)}.dm-contact-row__content{display:flex;flex-direction:column;gap:var(--space-2xs);flex:1}.dm-contact-row__header{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-xs)}.dm-contact-row__name{font-weight:600}.dm-contact-row__time{font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-contact-row__preview{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-contact-row__badge{align-self:flex-start;padding:var(--space-3xs) var(--space-xs);border-radius:var(--radius-full);background:var(--unread-badge-background);color:var(--unread-badge-text);font-size:var(--font-size-3xs)}.dm-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);background:var(--surface-sunken);color:var(--text-muted);font-weight:600;overflow:hidden;border:var(--border-width-hairline) solid var(--border-subtle)}.dm-avatar__image{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.dm-message-thread{display:flex;flex-direction:column;gap:var(--space-sm);flex:1;min-height:0}.dm-message-thread__header{display:flex;align-items:baseline;gap:var(--space-sm)}.dm-message-thread__title{font-size:var(--font-size-base);margin:0}.dm-message-thread__status{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-message-thread__timeline{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-sm);border-radius:var(--radius-md);background:var(--surface-panel);border:var(--border-width-hairline) solid var(--border-subtle);overflow-y:auto;min-height:16rem}.dm-message-thread__state{padding:var(--space-md);text-align:center;color:var(--text-muted);background:var(--surface-sunken);border-radius:var(--radius-md)}.dm-message-bubble{max-width:85%;display:flex;flex-direction:column;gap:var(--space-2xs);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-lg);border:var(--border-width-hairline) solid var(--message-bubble-border);background:var(--message-bubble-background);color:var(--message-bubble-text)}.dm-message-bubble__content{font-size:var(--font-size-sm)}.dm-message-bubble__meta{display:flex;gap:var(--space-xs);font-size:var(--font-size-2xs);color:var(--message-bubble-meta)}.dm-message-bubble__status{color:var(--text-muted)}.dm-message-bubble__status[data-status=pending]{color:var(--status-warning)}.dm-message-bubble__status[data-status=sending]{color:var(--status-info)}.dm-message-bubble__status[data-status=failed]{color:var(--status-danger)}.dm-message-thread__new{align-self:center;border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--border-subtle);padding:var(--space-2xs) var(--space-sm);font-size:var(--font-size-2xs);background:var(--surface-sunken);color:var(--text-muted)}.dm-message-thread__new:focus-visible,.dm-message-thread__new:hover{background:var(--surface-overlay-panel-soft);color:var(--text-primary);outline:none}.dm-day-divider{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:var(--space-xs);color:var(--text-muted);font-size:var(--font-size-2xs)}.dm-day-divider__line{height:1px;background:var(--border-subtle)}.dm-notification-center{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-notification-center__empty{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-notification-center__item{padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-subtle);background:var(--surface-sunken);font-size:var(--font-size-xs)}.dm-composer{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-composer__label{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-composer__input{resize:vertical;border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-base);color:var(--text-primary);padding:var(--space-sm);font-family:inherit}.dm-composer__input:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.dm-composer__actions{justify-content:space-between}.dm-composer__actions,.dm-composer__tools{display:flex;align-items:center;gap:var(--space-sm)}.dm-composer__tools{flex-wrap:wrap}.dm-composer__attach,.dm-composer__hint,.dm-composer__privacy{font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-composer__attach,.dm-composer__privacy{border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-base);padding:var(--space-2xs) var(--space-sm);cursor:pointer}.dm-composer__attach:focus-visible,.dm-composer__attach:hover,.dm-composer__privacy:focus-visible,.dm-composer__privacy:hover{background:var(--surface-overlay-panel-soft);color:var(--text-primary);outline:none}.dm-composer__send{border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-strong);background:var(--surface-overlay-panel);color:var(--text-primary);padding:var(--space-xs) var(--space-md);font-weight:600;cursor:pointer}.dm-composer__send:focus-visible,.dm-composer__send:hover{background:var(--surface-overlay-panel-soft);outline:none}.dm-composer__status{font-size:var(--font-size-2xs);color:var(--status-danger);min-height:1rem}@media (min-width:768px){.dm-app-shell{flex-direction:row;align-items:stretch}.dm-app-shell__sidebar{flex:0 0 18rem;max-width:20rem}.dm-app-shell__main,.dm-app-shell__sidebar{height:calc(100vh - var(--space-lg)*2)}.dm-conversation-list__items{max-height:none;flex:1}}@media (min-width:1024px){.dm-app-shell__sidebar{flex-basis:20rem}.dm-message-thread__timeline{padding:var(--space-md)}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.left-4{left:1rem}.right-3{right:.75rem}.right-4{right:1rem}.right-6{right:1.5rem}.top-0{top:0}.top-3{top:.75rem}.z-10{z-index:10}.z-50{z-index:50}.z-\[140\]{z-index:140}.z-overlay-floating{z-index:var(--z-overlay-floating)}.z-overlay-toast{z-index:var(--z-overlay-toast)}.order-1{order:1}.order-2{order:2}.col-span-full{grid-column:1/-1}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.mt-sm{margin-top:var(--space-sm)}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.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}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2xl{height:var(--space-2xl)}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-auto{height:auto}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.max-h-modal-body{max-height:var(--modal-body-max-height)}.max-h-modal-pane{max-height:var(--modal-pane-max-height)}.max-h-modal-sheet{max-height:var(--modal-sheet-max-height)}.max-h-modal-shell{max-height:var(--modal-shell-max-height)}.min-h-0{min-height:0}.min-h-\[200px\]{min-height:200px}.min-h-\[80px\]{min-height:80px}.min-h-\[96px\]{min-height:96px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[calc\(100\%-3rem\)\]{width:calc(100% - 3rem)}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-\[200px\]{max-width:200px}.max-w-docs{max-width:var(--layout-docs-max-width)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-popover-safe{max-width:var(--popover-inline-safe-max)}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.origin-bottom-right{transform-origin:bottom right}.rotate-90{--tw-rotate:90deg}.rotate-90,.scale-\[1\.2\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[1\.2\]{--tw-scale-x:1.2;--tw-scale-y:1.2}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-y{resize:vertical}.resize{resize:both}.list-disc{list-style-type:disc}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-sm{gap:var(--space-sm)}.gap-xl{gap:var(--space-xl)}.gap-xs{gap:var(--space-xs)}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-border-translucent>:not([hidden])~:not([hidden]){border-color:var(--border-overlay)}.self-start{align-self:flex-start}.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}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-border{border-color:var(--border-default)}.border-border-strong{border-color:var(--border-strong)}.border-border-translucent{border-color:var(--border-overlay)}.border-border-translucent-bright{border-color:var(--color-border-translucent-bright)}.border-border-translucent-medium{border-color:var(--color-border-translucent-medium)}.border-overlay{border-color:var(--border-overlay)}.border-overlay-strong{border-color:var(--border-overlay-strong)}.border-status-danger-border{border-color:var(--status-danger-border)}.border-status-info-border{border-color:var(--status-info-border)}.border-status-success-border{border-color:var(--status-success-border)}.border-status-warning-border{border-color:var(--status-warning-border)}.border-surface-strong{border-color:var(--border-strong)}.border-opacity-20{--tw-border-opacity:0.2}.bg-accent-strong{background-color:var(--color-accent-strong)}.bg-overlay-muted{background-color:var(--surface-overlay-muted)}.bg-overlay-panel{background-color:var(--surface-overlay-panel)}.bg-overlay-panel-soft{background-color:var(--surface-overlay-panel-soft)}.bg-overlay-strong{background-color:var(--surface-overlay-strong)}.bg-panel{background-color:var(--surface-panel)}.bg-status-danger-surface{background-color:var(--status-danger-surface)}.bg-status-info-surface{background-color:var(--status-info-surface)}.bg-status-success-surface{background-color:var(--status-success-surface)}.bg-status-warning-surface{background-color:var(--status-warning-surface)}.bg-surface{background-color:var(--surface-base)}.bg-surface-alt{background-color:var(--surface-alt)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.bg-opacity-95{--tw-bg-opacity:0.95}.bg-overlay-channel{background-image:var(--surface-overlay-banner-gradient-channel)}.stroke-border-translucent{stroke:var(--border-overlay)}.stroke-current{stroke:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-lg{padding:var(--space-lg)}.p-md{padding:var(--space-md)}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.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-6{padding-left:1.5rem;padding-right:1.5rem}.px-lg{padding-left:var(--space-lg);padding-right:var(--space-lg)}.px-md{padding-left:var(--space-md);padding-right:var(--space-md)}.py-0{padding-top:0;padding-bottom:0}.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-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-md{padding-top:var(--space-md);padding-bottom:var(--space-md)}.py-xl{padding-top:var(--space-xl);padding-bottom:var(--space-xl)}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-2{padding-left:.5rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pr-1{padding-right:.25rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-family-mono)}.font-sans{font-family:var(--font-family-sans)}.text-2xl{font-size:var(--font-size-2xl);line-height:var(--line-height-relaxed)}.text-2xs{font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-3xs{font-size:var(--font-size-3xs);line-height:var(--line-height-tight)}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-4xs{font-size:var(--font-size-4xs);line-height:var(--line-height-tight)}.text-\[0\.75rem\]{font-size:.75rem}.text-base{font-size:var(--font-size-base)}.text-base,.text-lg{line-height:var(--line-height-base)}.text-lg{font-size:var(--font-size-lg)}.text-sm{font-size:var(--font-size-sm);line-height:var(--line-height-snug)}.text-xl{font-size:var(--font-size-xl);line-height:var(--line-height-relaxed)}.text-xs{font-size:var(--font-size-xs);line-height:var(--line-height-tight)}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.ordinal{--tw-ordinal:ordinal}.ordinal,.tabular-nums{font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing:tabular-nums}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-extra-wide{letter-spacing:var(--tracking-extra-wide)}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-accent{color:var(--color-accent)}.text-critical{color:var(--color-critical)}.text-critical-strong{color:var(--color-critical-strong)}.text-info{color:var(--color-info)}.text-info-strong{color:var(--color-info-strong)}.text-muted{color:var(--text-muted)}.text-muted-strong{color:var(--text-muted-strong)}.text-primary{color:var(--text-primary)}.text-status-danger{color:var(--status-danger)}.text-status-danger-on{color:var(--status-danger-on)}.text-status-info{color:var(--status-info)}.text-status-info-on{color:var(--status-info-on)}.text-status-neutral{color:var(--status-neutral)}.text-status-private-on{color:var(--status-private-on)}.text-status-success{color:var(--status-success)}.text-status-success-on{color:var(--status-success-on)}.text-status-warning{color:var(--status-warning)}.text-status-warning-on{color:var(--status-warning-on)}.text-subtle{color:var(--text-subtle)}.text-text{color:var(--text-primary)}.text-text-frosted{color:var(--text-frosted-primary)}.text-text-muted{color:var(--text-muted)}.text-text-strong{color:var(--color-text-strong)}.text-warning{color:var(--status-warning)}.text-warning-strong{color:var(--status-warning-strong)}.text-white{color:var(--color-white)}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-95{opacity:.95}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.shadow-md{--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px 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-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px)}.blur,.blur-xl{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)}.blur-xl{--tw-blur:blur(24px)}.\!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)!important}.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)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-md,.backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.transition{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-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-fast{transition-duration:var(--motion-duration-fast)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@media (max-width:640px){.bv-grid-video{gap:var(--space-md);grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){:root{--motion-duration-fast:0s;--motion-duration-base:0s;--motion-duration-slow:0s;--modal-motion-duration:0s}*,:after,:before{animation-delay:0s!important;animation-duration:0s!important;animation-iteration-count:1!important;animation-timing-function:linear!important;transition-delay:0s!important;transition-duration:0s!important;transition-timing-function:linear!important}.player-modal__similar-card:before{transition:none!important}#app,#playerModal .player-modal__content,#sidebar,.btn,.btn-ghost,.card,.card[data-motion=enter],.fade-in,.icon-button,.menu__item,.modal-nav,.notification-banner,.notification-portal,.popover-panel,.popover__panel,.progress-bar-fill,.sidebar-collapse-toggle,.sidebar-collapse-toggle__icon,.sidebar-dropup-panel,.sidebar-dropup-trigger,.sidebar-dropup-trigger__chevron,.sidebar-loading-indicator,.sidebar-loading-wrapper,.sidebar-nav,.sidebar-nav-link,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast,.video-modal__panel,.watch-history-card,.watch-history-card__action,.watch-history-card__creatorAvatar,.watch-history-card__creatorName,.watch-history-card__title{transition-property:none!important}.popover-panel,.popover__panel{transform:none!important}.popover-panel[data-state=open],.popover__panel[data-state=open]{opacity:1}.popover-panel[data-state=closed],.popover__panel[data-state=closed]{opacity:0}.card[data-motion=enter],.fade-in,[data-video-thumbnail][data-thumbnail-loaded=true]{opacity:1;animation:none!important}.notification-banner,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast{animation:none!important}.notification-portal{transform:none!important;opacity:1!important}}@media (min-width:640px){.sm\:flex#playerModal{display:block}}@media (min-width:768px){.md\:hidden .bv-modal,.md\:hidden.profile-pane{display:none!important}.md\:flex#playerModal{display:block}}.placeholder\:text-muted::-moz-placeholder{color:var(--text-muted)}.placeholder\:text-muted::placeholder{color:var(--text-muted)}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-status-danger-border:hover{border-color:var(--status-danger-border)}.hover\:bg-overlay-panel:hover{background-color:var(--surface-overlay-panel)}.hover\:bg-panel-hover:hover{background-color:var(--surface-panel-hover)}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-critical:hover{color:var(--color-critical)}.hover\:text-info-strong:hover{color:var(--color-info-strong)}.hover\:text-text:hover{color:var(--text-primary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-info:focus{--tw-ring-color:var(--color-info)}.focus\:ring-status-info:focus{--tw-ring-color:var(--status-info)}.focus\:ring-status-success:focus{--tw-ring-color:var(--status-success)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-surface:focus{--tw-ring-offset-color:var(--surface-base)}.focus-visible\:bg-primary:focus-visible{background-color:var(--color-primary)}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-info:focus-visible{outline-color:var(--color-info)}.active\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-primary{color:var(--text-primary)}@media (min-width:640px){.sm\:order-1{order:1}.sm\:order-2{order:2}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:flex{display:flex}.sm\:w-1\/3{width:33.333333%}.sm\:w-auto{width:auto}.sm\:max-w-xs{max-width:20rem}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:.5rem}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:self-end{align-self:flex-end}.sm\:p-5{padding:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-0{padding-top:0;padding-bottom:0}.sm\:pt-8{padding-top:2rem}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-64{height:16rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:gap-md{gap:var(--space-md)}.md\:pb-12{padding-bottom:3rem}}@media (min-width:1024px){.lg\:ml-auto{margin-left:auto}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:flex-wrap{flex-wrap:wrap}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-right{text-align:right}}@media (min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
\ No newline at end of file
+ );--video-card-backdrop-scale:1.12;--video-card-backdrop-blur:var(--blur-video-card-backdrop-strong);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card:focus-visible{border-color:var(--color-accent);--tw-border-opacity:0.4;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=critical]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}.watch-history-card[data-state=private]{background-color:var(--surface-raised-private);--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.watch-history-card[data-state=disabled],.watch-history-card[data-state=private]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card[data-state=disabled]{opacity:.6;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000}.watch-history-card[data-alert=nsfw-owner]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--color-black)}.watch-history-card[data-alert=nsfw-owner]:hover{--tw-border-opacity:0.6;--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.watch-history-card img[data-thumbnail-state=blurred],.watch-history-card img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}.watch-history-card[data-owner-is-viewer=true][data-url-health-state=offline][data-stream-health-state=unhealthy]{border-width:1px;border-color:var(--color-critical);--tw-border-opacity:0.4;background-color:var(--surface-raised-critical)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card){display:flex;width:100%;flex-direction:row;flex-wrap:nowrap;align-items:stretch;gap:var(--space-md)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__media{width:clamp(var(--video-modal-item-media-min),18vw,var(--video-modal-item-media-max));flex-shrink:0;overflow:hidden;border-radius:var(--radius-lg)}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{padding:clamp(var(--space-sm),1.25vw,var(--space-md))}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__content{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;gap:var(--space-sm)}#playerModal#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:block}#playerModal .player-modal__module-item>.watch-history-card:not(.player-modal__similar-card) .video-card__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;font-size:var(--font-size-xs);line-height:var(--line-height-tight);color:var(--text-muted-strong)}.watch-history-card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}#playerModal.watch-history-card{display:block}.watch-history-card{display:flex;flex-wrap:wrap;align-items:stretch;gap:1.25rem;padding:1rem;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}@media (prefers-reduced-motion:reduce){.watch-history-card,.watch-history-card[data-motion=enter]{transition-property:none}.watch-history-card[data-motion=enter]{opacity:1;animation:none}}.watch-history-card:hover{--tw-translate-y:-0.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}@media (min-width:640px){.watch-history-card{gap:1.5rem;padding:1.25rem}}.watch-history-card--private{border-color:var(--color-info);--tw-border-opacity:0.6}#playerModal.watch-history-card__primary{display:block}.watch-history-card__primary{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;align-items:stretch;gap:1rem}@media (min-width:640px){.watch-history-card__primary{flex-direction:row}}.watch-history-card__thumbnail{display:block;width:14rem;max-width:100%;flex:none;color:var(--text-primary);text-decoration-line:none}.watch-history-card__thumbnailInner{aspect-ratio:16/9;width:100%;overflow:hidden;border-radius:var(--radius-lg);background-color:var(--surface-base)}.watch-history-card__thumbnailInner img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.watch-history-card [data-thumbnail-state=blurred] img,.watch-history-card [data-visual-state=blurred] img{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal.watch-history-card__details{display:block}.watch-history-card__details{display:flex;min-width:0;flex:1 1 0%;flex-direction:column;justify-content:center;gap:var(--space-sm)}.watch-history-card__title{cursor:pointer;font-size:var(--font-size-lg);line-height:var(--line-height-base);font-weight:600;line-height:1.375;color:var(--text-primary);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.watch-history-card__title:focus,.watch-history-card__title:hover{color:var(--color-accent)}.watch-history-card__created{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-muted)}#playerModal.watch-history-card__meta{display:block}.watch-history-card__meta{display:flex;min-width:0;flex-direction:column;justify-content:space-between;gap:1rem}@media (min-width:640px){.watch-history-card__meta{min-width:14rem;flex:none;flex-basis:16rem}}.watch-history-card__watched{font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--border-subtle)}#playerModal.watch-history-card__creator{display:block}.watch-history-card__creator{display:flex;align-items:center;gap:.75rem}#playerModal.watch-history-card__creatorAvatar{display:block}.watch-history-card__creatorAvatar{display:flex;height:2.5rem;width:2.5rem;align-items:center;justify-content:center;overflow:hidden;border-radius:var(--radius-full);background-color:var(--surface-panel);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorAvatar:hover{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:0.5}.watch-history-card__creatorAvatar:focus-visible,.watch-history-card__creatorAvatar:hover{--tw-ring-color:color-mix(in srgb,var(--color-accent) 38%,transparent)}.watch-history-card__creatorAvatar img{height:100%;width:100%;border-radius:var(--radius-full);-o-object-fit:cover;object-fit:cover}.watch-history-card__creatorName{cursor:pointer;background-color:transparent;padding:0;text-align:left;font-size:var(--font-size-base);line-height:var(--line-height-base);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__creatorName:hover{color:var(--color-accent)}.watch-history-card__creatorName:focus-visible{color:var(--color-accent)}#playerModal.watch-history-card__actions{display:block}.watch-history-card__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem}.watch-history-card__action{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:var(--radius-full);border-width:1px;border-color:transparent;background-color:var(--surface-panel);padding:.5rem 1rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:500;color:var(--text-muted);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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1)}.watch-history-card__action:hover{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action:focus-visible{border-color:var(--border-default);background-color:var(--surface-alt);color:var(--text-primary)}.watch-history-card__action--primary{background-color:var(--color-accent-strong);color:var(--color-white)}.watch-history-card__action--primary:hover{background-color:var(--color-accent-pressed)}.watch-history-card__action--primary:focus-visible{background-color:var(--color-accent-pressed)}.watch-history-card__action--danger{background-color:var(--color-critical);color:var(--color-white)}.watch-history-card__action--danger:hover{background-color:var(--color-critical-strong)}.watch-history-card__action--danger:focus-visible{background-color:var(--color-critical-strong)}#playerModal.watch-history-card__moderation{display:block}.watch-history-card__moderation{margin-top:var(--space-sm);display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm)}.watch-history-card__hidden{margin-top:var(--space-md);border-radius:var(--radius-lg);border-width:1px;border-style:dashed;border-color:var(--border-default);background-color:var(--surface-overlay-panel-soft);font-size:var(--font-size-sm);line-height:var(--line-height-snug);color:var(--text-primary)}.watch-history-card__hidden .moderation-badge{align-self:flex-start}#playerModal .channel-card__avatar img[data-visual-state=blurred]{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(.4,0,.2,1);filter:blur(var(--blur-thumbnail-blur));transform:scale(1.05)}#playerModal .video-modal__moderation-bar .moderation-badge{--text-status-neutral-on:var(--color-text);--text-status-warning-on:var(--color-warning-on)}#playerModal .video-modal__moderation-bar .moderation-badge[data-variant=neutral]{color:var(--color-text)}.\!container{max-width:var(--layout-docs-max-width)!important;margin:0 auto!important;padding:var(--space-md)!important}.container{max-width:var(--layout-docs-max-width);margin:0 auto;padding:var(--space-md)}.qr-code__table{margin:var(--qr-code-table-margin,0)}.qr-code__cell,.qr-code__table{border:0;border-collapse:collapse}.qr-code__cell{padding:0;margin:0;width:var(--qr-code-cell-width);height:var(--qr-code-cell-height);background-color:var(--qr-code-color-light)}.qr-code__cell--dark{background-color:var(--qr-code-color-dark)}.qr-code__container[data-qr-code-mode=image] .qr-code__canvas{display:none}.qr-code__container[data-qr-code-mode=canvas] .qr-code__canvas,.qr-code__container[data-qr-code-mode=image] .qr-code__image{display:block}.qr-code__container[data-qr-code-mode=canvas] .qr-code__image{display:none}.fade-in{opacity:0;animation:interface-fade-in .28s ease-out forwards;animation-delay:var(--fade-in-delay,0ms)}.fade-in-delay-100{--fade-in-delay:100ms}.fade-in-delay-200{--fade-in-delay:200ms}.fade-in-delay-300{--fade-in-delay:300ms}.\!card[data-motion=enter]{opacity:0!important;animation:card-motion-enter .22s ease-out forwards!important}.card[data-motion=enter]{opacity:0;animation:card-motion-enter .22s ease-out forwards}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg);flex:0 0 var(--icon-size-lg);line-height:0;background-color:var(--color-neutral-700);color:var(--color-white);border:none;border-radius:var(--radius-full);cursor:pointer;transition:background-color .2s ease,box-shadow .2s ease}.icon-button:hover{background-color:var(--color-neutral-600)}.icon-button:active,.icon-button:focus{outline:none;box-shadow:0 0 0 var(--icon-button-ring-width) var(--color-ring-alert)}.icon-image{width:var(--icon-size-md);height:var(--icon-size-md);pointer-events:none}.accent-action-button,.channel-action-button{--accent-action-bg:color-mix(in srgb,var(--surface-overlay-panel) 78%,transparent);--accent-action-border:color-mix(in srgb,var(--border-overlay) 92%,transparent);--accent-action-bg-hover:color-mix(in srgb,var(--color-accent) 22%,var(--surface-overlay-panel));--accent-action-ring:color-mix(in srgb,var(--color-accent) 48%,transparent);--accent-action-bg-active:color-mix(in srgb,var(--color-accent-pressed) 28%,var(--surface-overlay-panel));color:var(--color-text);background-color:var(--accent-action-bg);border-color:var(--accent-action-border);border-style:solid;border-width:var(--border-width-hairline)}.accent-action-button:focus-visible,.accent-action-button:hover,.channel-action-button:focus-visible,.channel-action-button:hover{color:var(--color-accent-strong);background-color:var(--accent-action-bg-hover)}.accent-action-button:focus,.accent-action-button:focus-visible,.channel-action-button:focus,.channel-action-button:focus-visible{box-shadow:0 0 0 var(--icon-button-ring-width) var(--accent-action-ring)}.accent-action-button:active,.channel-action-button:active{color:var(--color-accent-pressed);background-color:var(--accent-action-bg-active)}.modal-nav .icon-button{box-shadow:none;padding:0;gap:0;width:var(--icon-size-lg);height:var(--icon-size-lg);min-width:var(--icon-size-lg);min-height:var(--icon-size-lg)}.modal-nav .icon-button:not(.accent-action-button):not(.channel-action-button){border:none}.modal-meta{gap:var(--space-xs)}.modal-meta,.modal-view-count{display:inline-flex;align-items:center}.modal-view-count{gap:var(--space-2xs);font-size:var(--font-size-sm);line-height:var(--space-md-plus);color:var(--color-muted-alt);white-space:nowrap}.view-count-text{white-space:nowrap;color:var(--color-muted-strong)}.ratio-16-9{position:relative;width:100%;padding-top:56.25%;background-color:var(--color-card)}.ratio-16-9>img{position:absolute;inset:0;width:100%;height:100%;-o-object-fit:cover;object-fit:cover}#modalContainer{position:fixed;inset:0;z-index:var(--z-modal-root);pointer-events:none;isolation:isolate}#modalContainer>*{pointer-events:auto}#modalContainer>[id$=Modal]:not(#playerModal){z-index:var(--z-modal-root)}#modalContainer>[id$=Modal]:not(#playerModal)>.bv-modal-backdrop{z-index:var(--z-modal-overlay)}#modalContainer>[id$=Modal]:not(#playerModal) .bv-modal__panel{z-index:var(--z-modal-content)}#modalContainer>#profileModal,#profileModal[data-modal-stack=top]{z-index:var(--z-modal-top-root)}#modalContainer>#profileModal>.bv-modal-backdrop,#profileModal[data-modal-stack=top]>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#profileModal .bv-modal__panel,#profileModal[data-modal-stack=top] .bv-modal__panel{z-index:var(--z-modal-top-content)}#modalContainer>#eventDetailsModal{z-index:var(--z-modal-top-root)}#modalContainer>#eventDetailsModal>.bv-modal-backdrop{z-index:var(--z-modal-top-overlay)}#modalContainer>#eventDetailsModal .bv-modal__panel{z-index:var(--z-modal-top-content)}.bv-modal[data-nested-modal-active=true]{pointer-events:none;visibility:hidden}#modalContainer>#loginModal{z-index:var(--z-modal-peak-root)}#modalContainer>#loginModal>.bv-modal-backdrop{z-index:var(--z-modal-peak-overlay)}#modalContainer>#loginModal .bv-modal__panel{z-index:var(--z-modal-peak-content)}#modalContainer>#playerModal{z-index:var(--z-modal-player)}#modalContainer>#playerModal .player-modal__container,#modalContainer>#playerModal .player-modal__content{z-index:var(--z-modal-content)}#playerModal{position:fixed;inset:0;z-index:var(--z-modal-player);display:none;flex-direction:column;align-items:stretch;justify-content:flex-start;width:100vw;height:100vh;padding:0;background-color:var(--color-surface);color:var(--color-subtle-text);--player-modal-inline-max:var(--layout-player-max-width);--player-modal-inline-padding:clamp(var(--space-md-plus),4vw,var(--space-2xl));overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}#playerModal.flex{display:block}#modalVideo{width:100%;aspect-ratio:16/9;background-color:var(--color-black)}.notification-portal{position:fixed;top:0;left:0;right:0;z-index:var(--z-overlay-toast);display:flex;flex-direction:column;align-items:center;gap:var(--space-md);padding:calc(var(--space-xl) + env(safe-area-inset-top)) var(--space-lg) var(--space-lg);pointer-events:none;opacity:0;transform:translateY(var(--toast-translate));transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}@media (min-width:640px){.notification-portal{padding-inline:var(--space-xl)}}.notification-portal:has(.notification-banner:not(.hidden)){opacity:1;transform:translateY(0)}.notification-portal--active{opacity:1;transform:translateY(0)}.notification-banner,.torrent-toast{--notify-accent:var(--notification-banner-accent);--notify-accent-strong:var(--notification-banner-accent-strong);--notify-border:var(--notification-banner-border);--notify-background:var(--notification-banner-background);--notify-foreground:var(--notification-banner-text);position:relative;display:flex;align-items:center;gap:var(--space-md);width:min(var(--notification-banner-max-inline),100%);padding:var(--space-md) var(--space-xl);border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--notify-border);background:var(--notify-background);color:var(--notify-foreground);box-shadow:0 var(--shadow-notification-offset-y) var(--shadow-notification-blur) var(--color-shadow-notification);backdrop-filter:blur(var(--overlay-backdrop-blur));pointer-events:auto;isolation:isolate;font-size:var(--font-size-sm);line-height:var(--line-height-snug);font-weight:600;line-height:1.375;transition:transform var(--motion-duration-base) var(--motion-ease-out),opacity var(--motion-duration-base) var(--motion-ease-out)}.notification-banner:before,.torrent-toast:before{content:"";position:absolute;inset:0;border-radius:inherit;background:linear-gradient(135deg,var(--notify-accent) 0,var(--notify-accent-strong) 100%);opacity:.18;pointer-events:none}.notification-banner>*,.torrent-toast>*{position:relative;z-index:1}.notification-dismiss{display:inline-flex;height:2rem;width:2rem;align-items:center;justify-content:center;border-radius:var(--radius-full);border-width:1px;border-color:transparent;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-duration:.15s;transition-duration:var(--motion-duration-base);transition-timing-function:cubic-bezier(0,0,.2,1);color:inherit;opacity:.75;background-color:var(--notify-dismiss-background)}.notification-dismiss:focus-visible,.notification-dismiss:hover{opacity:1;background-color:var(--notify-dismiss-background-hover)}.notification-dismiss svg{height:1rem;width:1rem}.notification-banner:not(.hidden){animation:notification-slide-in var(--motion-duration-base) var(--motion-ease-out)}.notification-banner--critical,.torrent-toast--error{--notify-accent:var(--notification-banner-critical-accent);--notify-accent-strong:var(--notification-banner-critical-accent-strong);--notify-border:var(--notification-banner-critical-border);--notify-background:var(--notification-banner-critical-background);--notify-foreground:var(--notification-banner-critical-text)}.notification-banner--success,.torrent-toast--success{--notify-accent:var(--notification-banner-success-accent);--notify-accent-strong:var(--notification-banner-success-accent-strong);--notify-border:var(--notification-banner-success-border);--notify-background:var(--notification-banner-success-background);--notify-foreground:var(--notification-banner-success-text)}.notification-banner--info,.torrent-toast--info{--notify-accent:var(--notification-banner-info-accent);--notify-accent-strong:var(--notification-banner-info-accent-strong);--notify-border:var(--notification-banner-info-border);--notify-background:var(--notification-banner-info-background);--notify-foreground:var(--notification-banner-info-text)}.notification-banner--warning,.torrent-toast--warn{--notify-accent:var(--notification-banner-warning-accent);--notify-accent-strong:var(--notification-banner-warning-accent-strong);--notify-border:var(--notification-banner-warning-border);--notify-background:var(--notification-banner-warning-background);--notify-foreground:var(--notification-banner-warning-text)}.status-banner .status-spinner{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-info-border);border-radius:var(--radius-full);border-top-color:var(--color-info);flex-shrink:0;height:var(--icon-size-md);width:var(--icon-size-md)}.status-banner .status-message{flex:1 1 auto}@keyframes notification-slide-in{0%{opacity:0;transform:translateY(var(--toast-translate))}to{opacity:1;transform:translateY(0)}}.status-spinner--inline{animation:spin 1s linear infinite;border:var(--space-3xs) solid var(--color-border-info-soft);border-radius:var(--radius-full);border-top-color:var(--color-info);display:inline-block;height:var(--space-md);width:var(--space-md)}body.iframe-form{background-color:transparent;color:var(--color-text);font-family:var(--font-family-sans);margin:var(--space-lg)}body.iframe-form .container{width:100%;max-width:100%;margin:0;padding:0}body.iframe-form .\!container{width:100%!important;max-width:100%!important;margin:0!important;padding:0!important}body.iframe-form .form-container{background-color:var(--color-surface-alt);border-radius:var(--radius-md);box-shadow:var(--shadow-md);color:var(--color-text);display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-lg)}body.iframe-form .form-container>p{margin:0}body.iframe-form form{display:flex;flex-direction:column}body.iframe-form form>*+*{margin-top:var(--space-sm)}body.iframe-form form h1,body.iframe-form form h2{color:var(--color-text);margin-top:var(--space-md)}body.iframe-form label{color:var(--color-subtle-text);display:block;font-weight:600;margin-top:var(--space-sm)}body.iframe-form label+.form-control,body.iframe-form label+.select,body.iframe-form label+.textarea{margin-top:var(--space-xs)}body.iframe-form .checkbox-group,body.iframe-form .radio-group{display:flex;flex-wrap:wrap;gap:var(--space-sm);margin-top:var(--space-xs)}body.iframe-form .checkbox-group label,body.iframe-form .radio-group label{align-items:center;color:var(--color-subtle-text);display:inline-flex;font-weight:500;gap:var(--space-xs);margin:0}body.iframe-form .checkbox-group input[type=checkbox],body.iframe-form .radio-group input[type=radio]{margin:0}body.iframe-form .radio-group input[type=radio]{accent-color:var(--color-accent-strong)}body.iframe-form button.btn{align-self:flex-start;margin-top:var(--space-md)}body.iframe-form button.\!btn{align-self:flex-start!important;margin-top:var(--space-md)!important}body.iframe-form #status{background:var(--color-surface);border-radius:var(--radius-sm);box-shadow:inset 0 0 0 var(--border-width-hairline) var(--color-border-translucent);color:var(--color-subtle-text);min-height:calc(var(--space-2xl) + var(--space-xl));padding:var(--space-sm);white-space:pre-wrap}body.iframe-form .status-line{color:var(--color-subtle-text);margin:var(--space-2xs) 0}body.iframe-form .status-line.error{color:var(--color-critical-strong)}body.iframe-form .status-line.\!error{color:var(--color-critical-strong)!important}body.iframe-form .status-line.success{color:var(--color-info-strong)}body.iframe-form .status-line.\!success{color:var(--color-info-strong)!important}body.iframe-form .status-line.warn{color:var(--color-warning-strong)}@media (max-width:640px){body.iframe-form{margin:var(--space-md)}body.iframe-form .form-container{padding:var(--space-md)}}#sidebarContainer{position:relative;overflow:visible}#sidebar{position:fixed;top:0;left:0;width:var(--sidebar-width);min-width:var(--sidebar-width);height:100vh;height:100dvh;color:var(--color-text-frosted-strong);overflow-x:hidden;overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain;overscroll-behavior-inline:contain;touch-action:pan-y;scrollbar-gutter:stable both-edges;background:transparent;border-right:none;backdrop-filter:none;-webkit-backdrop-filter:none;transition:width .2s ease,transform .3s ease;z-index:var(--z-sidebar);box-shadow:none;isolation:isolate}#app.sidebar-collapsed,#sidebar.sidebar-collapsed,#sidebar[data-state=collapsed],body.sidebar-collapsed{--sidebar-width:var(--sidebar-width-collapsed)}#app.sidebar-expanded,#sidebar.sidebar-expanded,#sidebar[data-state=expanded],body.sidebar-expanded{--sidebar-width:var(--sidebar-width-expanded)}#sidebar .sidebar__inner{padding-block-start:max(var(--space-sidebar-shell-block-start),calc(var(--app-header-centerline) - var(--sidebar-control-size)/2));padding-block-end:var(--space-sidebar-shell-block-end);padding-inline:var(--space-sidebar-shell-inline);border-radius:var(--radius-sidebar-shell);border:none;background:none;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;isolation:isolate;transition:color .2s ease}#sidebar .sidebar__inner,.sidebar-scroll{display:flex;flex-direction:column;height:100%;width:100%;overflow:visible}.sidebar-scroll{gap:var(--space-sidebar-scroll-gap);min-height:0;flex:1 1 auto}.sidebar-panel{position:relative;width:100%;display:flex;flex-direction:column;gap:var(--space-sidebar-panel-gap);padding:var(--space-sidebar-panel-padding-block) var(--space-sidebar-panel-padding-inline);border-radius:var(--radius-sidebar-panel);border:none;background:transparent;box-shadow:none;color:inherit;backdrop-filter:none;-webkit-backdrop-filter:none;overflow:hidden;isolation:isolate;transition:border-color .2s ease,box-shadow .22s ease,background .22s ease}.sidebar-panel--primary{flex:1 1 auto;min-height:0;padding-block-start:0}.sidebar-panel__header{display:flex;justify-content:flex-end;margin-bottom:var(--space-md)}.sidebar-collapse-toggle{display:inline-flex;align-items:center;justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--color-border-translucent-medium);background:var(--color-surface-tint-subtle);color:inherit;cursor:pointer;transition:background .18s ease,color .18s ease,border-color .18s ease;flex-shrink:0;box-sizing:border-box}.sidebar-collapse-toggle:hover{background:var(--color-border-translucent);border-color:var(--color-border-translucent-stronger);color:var(--color-text)}.sidebar-collapse-toggle:focus-visible{outline:var(--space-3xs) solid var(--color-secondary);outline-offset:var(--space-2xs)}.sidebar-collapse-toggle__icon{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .2s ease}.sidebar-nav{display:flex;flex-direction:column;gap:var(--space-xs);opacity:1;transition:opacity .16s ease;width:100%}.sidebar-nav-link{--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-opacity:0;--sidebar-nav-link-highlight-scale:0.96;display:flex;align-items:center;gap:var(--space-sidebar-footer-gap);padding-block:var(--space-sidebar-nav-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);font-size:var(--font-size-sidebar-nav);font-weight:600;letter-spacing:.015em;color:var(--color-text);text-decoration:none;width:100%;position:relative;border:var(--border-width-hairline) solid transparent;background:none;box-shadow:none;transform:translateX(var(--sidebar-nav-translate-x));transition:color .18s ease,border-color .2s ease,box-shadow .22s ease,transform .22s ease;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none}.sidebar-nav-link:after,.sidebar-nav-link:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none;transition:opacity .22s ease,transform .24s ease;z-index:-1}.sidebar-nav-link:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:var(--sidebar-nav-link-highlight-opacity);transform:scale(var(--sidebar-nav-link-highlight-scale));filter:saturate(140%)}.sidebar-nav-link:after{background:linear-gradient(105deg,var(--color-sidebar-hover) 0,transparent 75%);opacity:.22;mix-blend-mode:screen;z-index:-2}.sidebar-nav-link:focus-visible,.sidebar-nav-link:hover{--sidebar-nav-link-highlight-opacity:1;--sidebar-nav-link-highlight-scale:1.02;--sidebar-nav-translate-x:var(--space-sidebar-nav-translate);color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-accent)}.sidebar-nav-link:focus-visible:after,.sidebar-nav-link:hover:after{opacity:.35}.sidebar-nav-link--sub{font-size:var(--font-size-sidebar-subnav);font-weight:500;color:var(--color-sidebar-text-muted);padding-block:var(--space-sidebar-subnav-padding-block);letter-spacing:.02em;--sidebar-nav-link-highlight-opacity:0.25;--sidebar-nav-link-highlight-scale:1}.sidebar-icon{width:var(--space-lg);height:var(--space-lg);min-width:var(--space-lg);min-height:var(--space-lg);flex-shrink:0;display:block;filter:var(--sidebar-icon-filter);transition:filter .18s ease}.sidebar-footer{flex-direction:column;margin-top:auto;z-index:2}.sidebar-dropup-trigger,.sidebar-footer{display:flex;gap:var(--space-sidebar-footer-gap);position:relative}.sidebar-dropup-trigger{align-items:center;justify-content:space-between;width:100%;padding-block:var(--space-sidebar-trigger-padding-block);padding-inline-start:var(--space-sidebar-nav-padding-inline-start);padding-inline-end:var(--space-sidebar-nav-padding-inline-end);min-height:var(--sidebar-control-size);border-radius:var(--radius-sidebar-nav);border:var(--border-width-hairline) solid transparent;background:none;color:var(--color-text);font-size:var(--font-size-sidebar-trigger);font-weight:600;cursor:pointer;box-sizing:border-box;flex-shrink:0;overflow:hidden;isolation:isolate;backdrop-filter:none;-webkit-backdrop-filter:none;box-shadow:none;transition:border-color .2s ease,color .2s ease,box-shadow .22s ease}.sidebar-dropup-trigger:before{background:linear-gradient(120deg,var(--color-sidebar-accent-start) 0,var(--color-sidebar-accent-end) 100%);opacity:0;transform:scale(.96);transition:opacity .2s ease,transform .22s ease;z-index:-1;filter:saturate(140%)}.sidebar-dropup-trigger:after,.sidebar-dropup-trigger:before{content:"";position:absolute;inset:calc(var(--border-width-hairline)*-1);border-radius:inherit;pointer-events:none}.sidebar-dropup-trigger:after{background:linear-gradient(110deg,var(--color-sidebar-hover) 0,transparent 80%);opacity:.18;mix-blend-mode:screen;transition:opacity .2s ease;z-index:-2}.sidebar-dropup-trigger:focus-visible,.sidebar-dropup-trigger:hover{color:var(--color-white);border-color:var(--color-sidebar-hover-strong);box-shadow:0 0 0 var(--border-width-hairline) var(--color-sidebar-hover-strong),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger:focus-visible:before,.sidebar-dropup-trigger:hover:before{opacity:1;transform:scale(1.02)}.sidebar-dropup-trigger:focus-visible:after,.sidebar-dropup-trigger:hover:after{opacity:.35}.sidebar-dropup-trigger:focus-visible{outline:none;box-shadow:var(--shadow-sidebar-focus-ring),var(--shadow-sidebar-dropup)}.sidebar-dropup-trigger__glyph{width:var(--icon-size-md);height:var(--icon-size-md);opacity:.9}.sidebar-dropup-trigger__chevron{width:var(--icon-size-sm);height:var(--icon-size-sm);transition:transform .18s ease}.sidebar-dropup-trigger[aria-expanded=true] .sidebar-dropup-trigger__chevron,.sidebar-dropup-trigger__chevron.is-rotated{transform:rotate(180deg)}.sidebar-dropup-panel{position:absolute;left:0;right:0;bottom:calc(100% + var(--space-sidebar-popover-offset));border-radius:var(--radius-xl);border:var(--border-width-hairline) solid var(--color-sidebar-border-strong);background:linear-gradient(160deg,color-mix(in srgb,var(--color-sidebar-surface) 88%,transparent) 0,color-mix(in srgb,var(--color-sidebar-surface-alt) 68%,transparent) 100%);box-shadow:inset 0 0 0 var(--border-width-fine) var(--color-sidebar-border),var(--shadow-sidebar-panel);padding:var(--space-sidebar-popover-padding-block) var(--space-sidebar-popover-padding-inline);color:var(--color-text-frosted);opacity:0;visibility:hidden;pointer-events:none;transform:translateY(var(--space-sm));transition:opacity .18s ease,transform .18s ease,visibility .18s ease,box-shadow .22s ease;backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));-webkit-backdrop-filter:blur(var(--sidebar-panel-backdrop-blur)) saturate(var(--sidebar-panel-backdrop-saturation));z-index:5;isolation:isolate}.sidebar-dropup-panel[data-state=expanded]{opacity:1;visibility:visible;pointer-events:auto;transform:translateY(0)}.sidebar-dropup-panel__inner{display:flex;flex-direction:column;gap:var(--space-sidebar-popover-gap);width:100%;padding-inline-end:var(--space-sidebar-dropup-scroll-reserve);max-height:var(--sidebar-dropup-max-height);overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable both-edges}.sidebar-dropup-panel__inner.is-measuring{position:absolute;width:-moz-max-content;width:max-content;max-width:none;visibility:hidden;pointer-events:none;left:var(--offscreen-offset);right:auto;top:auto;bottom:auto}.sidebar-dropup-measure{position:absolute;visibility:hidden;pointer-events:none;height:0;overflow:hidden}.sidebar-dropup-panel__inner>*{width:100%;min-width:0}#sidebar[data-footer-state=expanded] .sidebar-nav{opacity:0;pointer-events:none}#sidebar[data-footer-state=collapsed] .sidebar-nav{opacity:1}.sidebar-loading-wrapper{display:flex;justify-content:center;align-items:center;padding:var(--space-2xl) 0;width:100%;grid-column:1/-1}.sidebar-loading-indicator{display:inline-flex;align-items:center;gap:var(--space-sm);color:var(--color-muted-strong);font-size:var(--font-size-sm);font-weight:500;letter-spacing:.01em}.sidebar-loading-text{white-space:nowrap}#app{box-sizing:border-box;transition:margin-left .2s ease,width .2s ease,max-width .2s ease}#app[data-sidebar-state=collapsed]{margin-left:var(--sidebar-width-collapsed);width:calc(100vw - var(--sidebar-width-collapsed));max-width:calc(100vw - var(--sidebar-width-collapsed))}#app[data-sidebar-state=expanded]{margin-left:max(var(--sidebar-width-expanded-base),var(--sidebar-dropup-content-width));width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base)),calc(100vw - var(--sidebar-dropup-content-width)))}#sidebar.sidebar-collapsed .sidebar-nav-link,body.sidebar-collapsed #sidebar .sidebar-nav-link{justify-content:center;width:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full);--sidebar-nav-translate-x:0;--sidebar-nav-link-highlight-scale:1}#sidebar.sidebar-expanded .sidebar-nav-link,body.sidebar-expanded #sidebar .sidebar-nav-link{justify-content:flex-start}#sidebar.sidebar-collapsed .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-text{display:none}#sidebar.sidebar-collapsed .sidebar__inner,body.sidebar-collapsed #sidebar .sidebar__inner{padding-inline:var(--space-2xs)}#sidebar.sidebar-collapsed .sidebar-panel,body.sidebar-collapsed #sidebar .sidebar-panel{padding-inline:calc(var(--space-3xs)*3)}#sidebar.sidebar-collapsed .sidebar-panel__header,body.sidebar-collapsed #sidebar .sidebar-panel__header{justify-content:center}#sidebar.sidebar-collapsed .sidebar-collapse-toggle,body.sidebar-collapsed #sidebar .sidebar-collapse-toggle{margin-inline:auto}#sidebar .sidebar-toggle-icon--rotated{transform:rotate(180deg)}#sidebar.sidebar-collapsed .sidebar-toggle-icon--rotated,body.sidebar-collapsed #sidebar .sidebar-toggle-icon--rotated{transform:rotate(0deg)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger{justify-content:center;width:var(--sidebar-control-size);height:var(--sidebar-control-size);padding:0;margin-inline:auto;border-radius:var(--radius-full)}#sidebar.sidebar-collapsed .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger .sidebar-text,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__chevron{display:none}#sidebar.sidebar-collapsed .sidebar-dropup-trigger__glyph,body.sidebar-collapsed #sidebar .sidebar-dropup-trigger__glyph{margin:0}#sidebar.sidebar-collapsed .sidebar-nav-link:focus-visible,#sidebar.sidebar-collapsed .sidebar-nav-link:hover,body.sidebar-collapsed #sidebar .sidebar-nav-link:focus-visible,body.sidebar-collapsed #sidebar .sidebar-nav-link:hover{--sidebar-nav-translate-x:0}@media (min-width:768px){.sidebar-panel__header{display:flex}.sidebar-collapse-toggle{display:inline-flex}#sidebar{transform:translateX(0)!important;width:var(--sidebar-width);overflow:visible}#app[data-sidebar-state=collapsed]{margin-left:calc(var(--sidebar-width-collapsed) + var(--sidebar-content-gap));width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap));max-width:calc(100vw - var(--sidebar-width-collapsed) - var(--sidebar-content-gap))}#app[data-sidebar-state=expanded]{margin-left:max(calc(var(--sidebar-width-expanded-base) + var(--sidebar-content-gap)),calc(var(--sidebar-dropup-content-width) + var(--sidebar-content-gap)));width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)));max-width:min(calc(100vw - var(--sidebar-width-expanded-base) - var(--sidebar-content-gap)),calc(100vw - var(--sidebar-dropup-content-width) - var(--sidebar-content-gap)))}}@keyframes card-motion-enter{0%{opacity:0;transform:translateY(var(--motion-card-enter-translate))}to{opacity:1;transform:translateY(0)}}@keyframes video-thumbnail-fade-in{0%{opacity:0}to{opacity:1}}@keyframes interface-fade-in{0%{opacity:0}to{opacity:1}}@keyframes fadeIn{0%{opacity:0;transform:translateY(var(--motion-fade-in-translate))}to{opacity:1;transform:translateY(0)}}.status-line{margin-top:.25rem;margin-bottom:.25rem;font-size:var(--font-size-sm);line-height:var(--line-height-snug);line-height:1.375;color:var(--text-primary)}.status-line.error{color:var(--color-critical-strong)}.status-line.\!error{color:var(--color-critical-strong)!important}.status-line.warn{color:var(--color-warning-strong)}@keyframes ztr-rotate{to{transform:rotate(1turn)}}@keyframes ztr-dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes svelte-181fgen-loader-animation{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes svelte-181fgen-fade-in{to{opacity:1}}.dm-app-shell{display:flex;flex-direction:column;gap:var(--space-lg);padding:var(--space-lg);background:var(--surface-base);color:var(--text-primary);min-height:100vh}.dm-app-shell__main,.dm-app-shell__sidebar{border-radius:var(--radius-lg);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-panel);box-shadow:var(--shadow-soft)}.dm-app-shell__sidebar{display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md)}.dm-app-shell__title{font-size:var(--font-size-lg);margin:0}.dm-app-shell__main{flex:1;display:flex;flex-direction:column;gap:var(--space-md);padding:var(--space-md);background:var(--surface-raised)}.dm-conversation-list{display:flex;flex-direction:column;gap:var(--space-sm)}.dm-conversation-list__header{display:flex;justify-content:space-between;align-items:center}.dm-conversation-list__title{font-size:var(--font-size-sm);text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);margin:0}.dm-conversation-list__items{display:flex;flex-direction:column;gap:var(--space-xs);overflow-y:auto;max-height:60vh;padding-right:var(--space-xs)}.dm-conversation-list__state{font-size:var(--font-size-sm);color:var(--text-muted);padding:var(--space-md);text-align:center;background:var(--surface-sunken);border-radius:var(--radius-md)}.dm-contact-row{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-subtle);background:transparent;color:inherit;text-align:left;cursor:pointer}.dm-contact-row:focus-visible,.dm-contact-row:hover{background:var(--surface-muted);border-color:var(--border-strong);outline:none}.dm-contact-row--active{background:var(--surface-sunken);border-color:var(--border-strong)}.dm-contact-row__content{display:flex;flex-direction:column;gap:var(--space-2xs);flex:1}.dm-contact-row__header{display:flex;justify-content:space-between;align-items:baseline;gap:var(--space-xs)}.dm-contact-row__name{font-weight:600}.dm-contact-row__time{font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-contact-row__preview{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-contact-row__badge{align-self:flex-start;padding:var(--space-3xs) var(--space-xs);border-radius:var(--radius-full);background:var(--unread-badge-background);color:var(--unread-badge-text);font-size:var(--font-size-3xs)}.dm-avatar{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--radius-full);background:var(--surface-sunken);color:var(--text-muted);font-weight:600;overflow:hidden;border:var(--border-width-hairline) solid var(--border-subtle)}.dm-avatar__image{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.dm-message-thread{display:flex;flex-direction:column;gap:var(--space-sm);flex:1;min-height:0}.dm-message-thread__header{display:flex;align-items:baseline;gap:var(--space-sm)}.dm-message-thread__title{font-size:var(--font-size-base);margin:0}.dm-message-thread__status{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-message-thread__timeline{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-sm);border-radius:var(--radius-md);background:var(--surface-panel);border:var(--border-width-hairline) solid var(--border-subtle);overflow-y:auto;min-height:16rem}.dm-message-thread__state{padding:var(--space-md);text-align:center;color:var(--text-muted);background:var(--surface-sunken);border-radius:var(--radius-md)}.dm-message-bubble{max-width:85%;display:flex;flex-direction:column;gap:var(--space-2xs);padding:var(--space-sm) var(--space-md);border-radius:var(--radius-lg);border:var(--border-width-hairline) solid var(--message-bubble-border);background:var(--message-bubble-background);color:var(--message-bubble-text)}.dm-message-bubble__content{font-size:var(--font-size-sm)}.dm-message-bubble__meta{display:flex;gap:var(--space-xs);font-size:var(--font-size-2xs);color:var(--message-bubble-meta)}.dm-message-bubble__status{color:var(--text-muted)}.dm-message-bubble__status[data-status=pending]{color:var(--status-warning)}.dm-message-bubble__status[data-status=sending]{color:var(--status-info)}.dm-message-bubble__status[data-status=failed]{color:var(--status-danger)}.dm-message-thread__new{align-self:center;border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--border-subtle);padding:var(--space-2xs) var(--space-sm);font-size:var(--font-size-2xs);background:var(--surface-sunken);color:var(--text-muted)}.dm-message-thread__new:focus-visible,.dm-message-thread__new:hover{background:var(--surface-overlay-panel-soft);color:var(--text-primary);outline:none}.dm-day-divider{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:var(--space-xs);color:var(--text-muted);font-size:var(--font-size-2xs)}.dm-day-divider__line{height:1px;background:var(--border-subtle)}.dm-notification-center{display:flex;flex-direction:column;gap:var(--space-sm)}.dm-notification-center__filters{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-xs)}.dm-notification-center__filter-button{border-radius:var(--radius-full);border:var(--border-width-hairline) solid var(--border-subtle);background:var(--surface-sunken);padding:var(--space-2xs) var(--space-sm);font-size:var(--font-size-2xs);font-weight:600;color:var(--text-muted);transition:color var(--motion-duration-fast) var(--motion-ease-out),background var(--motion-duration-fast) var(--motion-ease-out),border-color var(--motion-duration-fast) var(--motion-ease-out)}.dm-notification-center__filter-button:focus-visible,.dm-notification-center__filter-button:hover{outline:none;border-color:var(--border-strong);background:var(--surface-raised);color:var(--text-primary)}.dm-notification-center__filter-button--active{border-color:var(--border-strong);background:var(--surface-overlay-panel);color:var(--text-primary)}.dm-notification-center__groups{display:flex;flex-direction:column;gap:var(--space-md)}.dm-notification-center__group{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-notification-center__group-title{font-size:var(--font-size-2xs);font-weight:600;text-transform:uppercase;letter-spacing:var(--tracking-wide);color:var(--text-muted)}.dm-notification-center__list{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-notification-center__empty{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-notification-item{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:var(--space-sm);padding:var(--space-sm);border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-subtle);background:var(--surface-sunken);font-size:var(--font-size-xs);text-align:left;transition:border-color var(--motion-duration-fast) var(--motion-ease-out),background var(--motion-duration-fast) var(--motion-ease-out)}.dm-notification-item:focus-visible,.dm-notification-item:hover{outline:none;border-color:var(--border-strong);background:var(--surface-raised)}.dm-notification-item__icon{display:inline-flex;align-items:center;justify-content:center;width:var(--icon-size-md);height:var(--icon-size-md);border-radius:var(--radius-full);background:var(--surface-overlay-panel-soft);color:var(--text-muted);font-size:var(--font-size-xs)}.dm-notification-item__body{display:flex;flex-direction:column;gap:var(--space-2xs);min-width:0}.dm-notification-item__title{font-weight:600;color:var(--text-primary)}.dm-notification-item__message{color:var(--text-muted)}.dm-notification-item__meta{display:flex;align-items:center;gap:var(--space-2xs);color:var(--text-muted)}.dm-notification-item__timestamp{font-variant-numeric:tabular-nums;white-space:nowrap}.dm-composer{display:flex;flex-direction:column;gap:var(--space-xs)}.dm-composer__label{font-size:var(--font-size-xs);color:var(--text-muted)}.dm-composer__input{resize:vertical;border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-base);color:var(--text-primary);padding:var(--space-sm);font-family:inherit}.dm-composer__input:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.dm-composer__actions{justify-content:space-between}.dm-composer__actions,.dm-composer__tools{display:flex;align-items:center;gap:var(--space-sm)}.dm-composer__tools{flex-wrap:wrap}.dm-composer__attach,.dm-composer__hint,.dm-composer__privacy{font-size:var(--font-size-2xs);color:var(--text-muted)}.dm-composer__attach,.dm-composer__privacy{border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-default);background:var(--surface-base);padding:var(--space-2xs) var(--space-sm);cursor:pointer}.dm-composer__attach:focus-visible,.dm-composer__attach:hover,.dm-composer__privacy:focus-visible,.dm-composer__privacy:hover{background:var(--surface-overlay-panel-soft);color:var(--text-primary);outline:none}.dm-composer__send{border-radius:var(--radius-md);border:var(--border-width-hairline) solid var(--border-strong);background:var(--surface-overlay-panel);color:var(--text-primary);padding:var(--space-xs) var(--space-md);font-weight:600;cursor:pointer}.dm-composer__send:focus-visible,.dm-composer__send:hover{background:var(--surface-overlay-panel-soft);outline:none}.dm-composer__status{font-size:var(--font-size-2xs);color:var(--status-danger);min-height:1rem}@media (min-width:768px){.dm-app-shell{flex-direction:row;align-items:stretch}.dm-app-shell__sidebar{flex:0 0 18rem;max-width:20rem}.dm-app-shell__main,.dm-app-shell__sidebar{height:calc(100vh - var(--space-lg)*2)}.dm-conversation-list__items{max-height:none;flex:1}}@media (min-width:1024px){.dm-app-shell__sidebar{flex-basis:20rem}.dm-message-thread__timeline{padding:var(--space-md)}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.bottom-4{bottom:1rem}.bottom-6{bottom:1.5rem}.left-4{left:1rem}.right-3{right:.75rem}.right-4{right:1rem}.right-6{right:1.5rem}.top-0{top:0}.top-3{top:.75rem}.z-10{z-index:10}.z-50{z-index:50}.z-\[140\]{z-index:140}.z-overlay-floating{z-index:var(--z-overlay-floating)}.z-overlay-toast{z-index:var(--z-overlay-toast)}.order-1{order:1}.order-2{order:2}.col-span-full{grid-column:1/-1}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-4{margin-top:1rem;margin-bottom:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.-ml-1{margin-left:-.25rem}.-ml-2{margin-left:-.5rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.mt-sm{margin-top:var(--space-sm)}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.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}.contents{display:contents}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2xl{height:var(--space-2xl)}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-auto{height:auto}.h-full{height:100%}.max-h-\[90vh\]{max-height:90vh}.max-h-modal-body{max-height:var(--modal-body-max-height)}.max-h-modal-pane{max-height:var(--modal-pane-max-height)}.max-h-modal-sheet{max-height:var(--modal-sheet-max-height)}.max-h-modal-shell{max-height:var(--modal-shell-max-height)}.min-h-0{min-height:0}.min-h-\[200px\]{min-height:200px}.min-h-\[80px\]{min-height:80px}.min-h-\[96px\]{min-height:96px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[calc\(100\%-3rem\)\]{width:calc(100% - 3rem)}.w-auto{width:auto}.w-full{width:100%}.min-w-0{min-width:0}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-\[200px\]{max-width:200px}.max-w-docs{max-width:var(--layout-docs-max-width)}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-popover-safe{max-width:var(--popover-inline-safe-max)}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.origin-bottom-right{transform-origin:bottom right}.rotate-90{--tw-rotate:90deg}.rotate-90,.scale-\[1\.2\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\[1\.2\]{--tw-scale-x:1.2;--tw-scale-y:1.2}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-y{resize:vertical}.resize{resize:both}.list-disc{list-style-type:disc}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-sm{gap:var(--space-sm)}.gap-xl{gap:var(--space-xl)}.gap-xs{gap:var(--space-xs)}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-border-translucent>:not([hidden])~:not([hidden]){border-color:var(--border-overlay)}.self-start{align-self:flex-start}.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}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-border{border-color:var(--border-default)}.border-border-strong{border-color:var(--border-strong)}.border-border-translucent{border-color:var(--border-overlay)}.border-border-translucent-bright{border-color:var(--color-border-translucent-bright)}.border-border-translucent-medium{border-color:var(--color-border-translucent-medium)}.border-overlay{border-color:var(--border-overlay)}.border-overlay-strong{border-color:var(--border-overlay-strong)}.border-status-danger-border{border-color:var(--status-danger-border)}.border-status-info-border{border-color:var(--status-info-border)}.border-status-success-border{border-color:var(--status-success-border)}.border-status-warning-border{border-color:var(--status-warning-border)}.border-surface-strong{border-color:var(--border-strong)}.border-opacity-20{--tw-border-opacity:0.2}.bg-accent-strong{background-color:var(--color-accent-strong)}.bg-overlay-muted{background-color:var(--surface-overlay-muted)}.bg-overlay-panel{background-color:var(--surface-overlay-panel)}.bg-overlay-panel-soft{background-color:var(--surface-overlay-panel-soft)}.bg-overlay-strong{background-color:var(--surface-overlay-strong)}.bg-panel{background-color:var(--surface-panel)}.bg-status-danger-surface{background-color:var(--status-danger-surface)}.bg-status-info-surface{background-color:var(--status-info-surface)}.bg-status-success-surface{background-color:var(--status-success-surface)}.bg-status-warning-surface{background-color:var(--status-warning-surface)}.bg-surface{background-color:var(--surface-base)}.bg-surface-alt{background-color:var(--surface-alt)}.bg-transparent{background-color:transparent}.bg-white{background-color:var(--color-white)}.bg-opacity-95{--tw-bg-opacity:0.95}.bg-overlay-channel{background-image:var(--surface-overlay-banner-gradient-channel)}.stroke-border-translucent{stroke:var(--border-overlay)}.stroke-current{stroke:currentColor}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-lg{padding:var(--space-lg)}.p-md{padding:var(--space-md)}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.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-6{padding-left:1.5rem;padding-right:1.5rem}.px-lg{padding-left:var(--space-lg);padding-right:var(--space-lg)}.px-md{padding-left:var(--space-md);padding-right:var(--space-md)}.py-0{padding-top:0;padding-bottom:0}.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-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-md{padding-top:var(--space-md);padding-bottom:var(--space-md)}.py-xl{padding-top:var(--space-xl);padding-bottom:var(--space-xl)}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pl-2{padding-left:.5rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pr-1{padding-right:.25rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-family-mono)}.font-sans{font-family:var(--font-family-sans)}.text-2xl{font-size:var(--font-size-2xl);line-height:var(--line-height-relaxed)}.text-2xs{font-size:var(--font-size-2xs);line-height:var(--line-height-tight)}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-3xs{font-size:var(--font-size-3xs);line-height:var(--line-height-tight)}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-4xs{font-size:var(--font-size-4xs);line-height:var(--line-height-tight)}.text-\[0\.75rem\]{font-size:.75rem}.text-base{font-size:var(--font-size-base)}.text-base,.text-lg{line-height:var(--line-height-base)}.text-lg{font-size:var(--font-size-lg)}.text-sm{font-size:var(--font-size-sm);line-height:var(--line-height-snug)}.text-xl{font-size:var(--font-size-xl);line-height:var(--line-height-relaxed)}.text-xs{font-size:var(--font-size-xs);line-height:var(--line-height-tight)}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.ordinal{--tw-ordinal:ordinal}.ordinal,.tabular-nums{font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.tabular-nums{--tw-numeric-spacing:tabular-nums}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-extra-wide{letter-spacing:var(--tracking-extra-wide)}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-accent{color:var(--color-accent)}.text-critical{color:var(--color-critical)}.text-critical-strong{color:var(--color-critical-strong)}.text-info{color:var(--color-info)}.text-info-strong{color:var(--color-info-strong)}.text-muted{color:var(--text-muted)}.text-muted-strong{color:var(--text-muted-strong)}.text-primary{color:var(--text-primary)}.text-status-danger{color:var(--status-danger)}.text-status-danger-on{color:var(--status-danger-on)}.text-status-info{color:var(--status-info)}.text-status-info-on{color:var(--status-info-on)}.text-status-neutral{color:var(--status-neutral)}.text-status-private-on{color:var(--status-private-on)}.text-status-success{color:var(--status-success)}.text-status-success-on{color:var(--status-success-on)}.text-status-warning{color:var(--status-warning)}.text-status-warning-on{color:var(--status-warning-on)}.text-subtle{color:var(--text-subtle)}.text-text{color:var(--text-primary)}.text-text-frosted{color:var(--text-frosted-primary)}.text-text-muted{color:var(--text-muted)}.text-text-strong{color:var(--color-text-strong)}.text-warning{color:var(--status-warning)}.text-warning-strong{color:var(--status-warning-strong)}.text-white{color:var(--color-white)}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-95{opacity:.95}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 rgba(0,0,0,.05);--tw-shadow-colored:inset 0 2px 4px 0 var(--tw-shadow-color)}.shadow-inner,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:var(--shadow-lg);--tw-shadow-colored:var(--shadow-lg)}.shadow-md{--tw-shadow:var(--shadow-md);--tw-shadow-colored:var(--shadow-md)}.shadow-md,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:var(--shadow-sm);--tw-shadow-colored:var(--shadow-sm)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px 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-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.blur{--tw-blur:blur(8px)}.blur,.blur-xl{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)}.blur-xl{--tw-blur:blur(24px)}.\!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)!important}.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)}.backdrop-blur-md{--tw-backdrop-blur:blur(12px)}.backdrop-blur-md,.backdrop-blur-sm{backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.transition{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-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-150,.transition-transform{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-fast{transition-duration:var(--motion-duration-fast)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@media (max-width:640px){.bv-grid-video{gap:var(--space-md);grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){:root{--motion-duration-fast:0s;--motion-duration-base:0s;--motion-duration-slow:0s;--modal-motion-duration:0s}*,:after,:before{animation-delay:0s!important;animation-duration:0s!important;animation-iteration-count:1!important;animation-timing-function:linear!important;transition-delay:0s!important;transition-duration:0s!important;transition-timing-function:linear!important}.player-modal__similar-card:before{transition:none!important}#app,#playerModal .player-modal__content,#sidebar,.btn,.btn-ghost,.card,.card[data-motion=enter],.fade-in,.icon-button,.menu__item,.modal-nav,.notification-banner,.notification-portal,.popover-panel,.popover__panel,.progress-bar-fill,.sidebar-collapse-toggle,.sidebar-collapse-toggle__icon,.sidebar-dropup-panel,.sidebar-dropup-trigger,.sidebar-dropup-trigger__chevron,.sidebar-loading-indicator,.sidebar-loading-wrapper,.sidebar-nav,.sidebar-nav-link,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast,.video-modal__panel,.watch-history-card,.watch-history-card__action,.watch-history-card__creatorAvatar,.watch-history-card__creatorName,.watch-history-card__title{transition-property:none!important}.popover-panel,.popover__panel{transform:none!important}.popover-panel[data-state=open],.popover__panel[data-state=open]{opacity:1}.popover-panel[data-state=closed],.popover__panel[data-state=closed]{opacity:0}.card[data-motion=enter],.fade-in,[data-video-thumbnail][data-thumbnail-loaded=true]{opacity:1;animation:none!important}.notification-banner,.status-banner .status-spinner,.status-spinner--inline,.torrent-toast{animation:none!important}.notification-portal{transform:none!important;opacity:1!important}}@media (min-width:640px){.sm\:flex#playerModal{display:block}}@media (min-width:768px){.md\:hidden .bv-modal,.md\:hidden.profile-pane{display:none!important}.md\:flex#playerModal{display:block}}.placeholder\:text-muted::-moz-placeholder{color:var(--text-muted)}.placeholder\:text-muted::placeholder{color:var(--text-muted)}.hover\:scale-105:hover{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-status-danger-border:hover{border-color:var(--status-danger-border)}.hover\:bg-overlay-panel:hover{background-color:var(--surface-overlay-panel)}.hover\:bg-panel-hover:hover{background-color:var(--surface-panel-hover)}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-critical:hover{color:var(--color-critical)}.hover\:text-info-strong:hover{color:var(--color-info-strong)}.hover\:text-text:hover{color:var(--text-primary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-info:focus{--tw-ring-color:var(--color-info)}.focus\:ring-status-info:focus{--tw-ring-color:var(--status-info)}.focus\:ring-status-success:focus{--tw-ring-color:var(--status-success)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-surface:focus{--tw-ring-offset-color:var(--surface-base)}.focus-visible\:bg-primary:focus-visible{background-color:var(--color-primary)}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-info:focus-visible{outline-color:var(--color-info)}.active\:scale-95:active{--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-primary{color:var(--text-primary)}@media (min-width:640px){.sm\:order-1{order:1}.sm\:order-2{order:2}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:flex{display:flex}.sm\:w-1\/3{width:33.333333%}.sm\:w-auto{width:auto}.sm\:max-w-xs{max-width:20rem}.sm\:flex-none{flex:none}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:.5rem}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.sm\:self-end{align-self:flex-end}.sm\:p-5{padding:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-0{padding-top:0;padding-bottom:0}.sm\:pt-8{padding-top:2rem}}@media (min-width:768px){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-64{height:16rem}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:justify-end{justify-content:flex-end}.md\:gap-md{gap:var(--space-md)}.md\:pb-12{padding-bottom:3rem}}@media (min-width:1024px){.lg\:ml-auto{margin-left:auto}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:flex-wrap{flex-wrap:wrap}.lg\:items-start{align-items:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:text-right{text-align:right}}@media (min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}
\ No newline at end of file
diff --git a/css/tailwind.source.css b/css/tailwind.source.css
index 2cb47859..828d191a 100644
--- a/css/tailwind.source.css
+++ b/css/tailwind.source.css
@@ -5271,6 +5271,66 @@
}
.dm-notification-center {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-sm);
+ }
+
+ .dm-notification-center__filters {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: var(--space-xs);
+ }
+
+ .dm-notification-center__filter-button {
+ border-radius: var(--radius-full);
+ border: var(--border-width-hairline) solid var(--border-subtle);
+ background: var(--surface-sunken);
+ padding: var(--space-2xs) var(--space-sm);
+ font-size: var(--font-size-2xs);
+ font-weight: 600;
+ color: var(--text-muted);
+ transition: color var(--motion-duration-fast) var(--motion-ease-out),
+ background var(--motion-duration-fast) var(--motion-ease-out),
+ border-color var(--motion-duration-fast) var(--motion-ease-out);
+ }
+
+ .dm-notification-center__filter-button:hover,
+ .dm-notification-center__filter-button:focus-visible {
+ outline: none;
+ border-color: var(--border-strong);
+ background: var(--surface-raised);
+ color: var(--text-primary);
+ }
+
+ .dm-notification-center__filter-button--active {
+ border-color: var(--border-strong);
+ background: var(--surface-overlay-panel);
+ color: var(--text-primary);
+ }
+
+ .dm-notification-center__groups {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-md);
+ }
+
+ .dm-notification-center__group {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-xs);
+ }
+
+ .dm-notification-center__group-title {
+ font-size: var(--font-size-2xs);
+ font-weight: 600;
+ text-transform: uppercase;
+ letter-spacing: var(--tracking-wide);
+ color: var(--text-muted);
+ }
+
+ .dm-notification-center__list {
display: flex;
flex-direction: column;
gap: var(--space-xs);
@@ -5281,33 +5341,87 @@
color: var(--text-muted);
}
- .dm-notification-center__item {
- padding: var(--space-xs) var(--space-sm);
+ .dm-notification-item {
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ align-items: center;
+ gap: var(--space-sm);
+ padding: var(--space-sm);
border-radius: var(--radius-md);
border: var(--border-width-hairline) solid var(--border-subtle);
background: var(--surface-sunken);
font-size: var(--font-size-xs);
+ text-align: left;
+ transition: border-color var(--motion-duration-fast) var(--motion-ease-out),
+ background var(--motion-duration-fast) var(--motion-ease-out);
}
- .dm-notification-center__item--info {
+ .dm-notification-item:hover,
+ .dm-notification-item:focus-visible {
+ outline: none;
+ border-color: var(--border-strong);
+ background: var(--surface-raised);
+ }
+
+ .dm-notification-item__icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: var(--icon-size-md);
+ height: var(--icon-size-md);
+ border-radius: var(--radius-full);
+ background: var(--surface-overlay-panel-soft);
+ color: var(--text-muted);
+ font-size: var(--font-size-xs);
+ }
+
+ .dm-notification-item__body {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2xs);
+ min-width: 0;
+ }
+
+ .dm-notification-item__title {
+ font-weight: 600;
+ color: var(--text-primary);
+ }
+
+ .dm-notification-item__message {
+ color: var(--text-muted);
+ }
+
+ .dm-notification-item__meta {
+ display: flex;
+ align-items: center;
+ gap: var(--space-2xs);
+ color: var(--text-muted);
+ }
+
+ .dm-notification-item__timestamp {
+ font-variant-numeric: tabular-nums;
+ white-space: nowrap;
+ }
+
+ .dm-notification-item--info {
background: var(--status-info-surface);
border-color: var(--status-info-border);
color: var(--status-info-on);
}
- .dm-notification-center__item--success {
+ .dm-notification-item--success {
background: var(--status-success-surface);
border-color: var(--status-success-border);
color: var(--status-success-on);
}
- .dm-notification-center__item--warning {
+ .dm-notification-item--warning {
background: var(--status-warning-surface);
border-color: var(--status-warning-border);
color: var(--status-warning-on);
}
- .dm-notification-center__item--error {
+ .dm-notification-item--error {
background: var(--status-danger-surface);
border-color: var(--status-danger-border);
color: var(--status-danger-on);
diff --git a/js/ui/dm/NotificationCenter.js b/js/ui/dm/NotificationCenter.js
index f73532bf..484ced67 100644
--- a/js/ui/dm/NotificationCenter.js
+++ b/js/ui/dm/NotificationCenter.js
@@ -9,32 +9,211 @@ function createElement(doc, tag, className, text) {
return element;
}
-export function NotificationCenter({ document: doc, notices = [] } = {}) {
+const FILTERS = [
+ { id: "all", label: "All" },
+ { id: "dms", label: "DMs" },
+ { id: "mentions", label: "Mentions" },
+ { id: "zaps", label: "Zaps" },
+];
+
+const GROUPS = [
+ { id: "unread", label: "Unread" },
+ { id: "new", label: "New" },
+];
+
+const GROUP_EMPTY_COPY = {
+ unread: "No unread notifications.",
+ new: "No new notifications.",
+};
+
+function isElement(value) {
+ return Boolean(value && typeof value === "object" && value.nodeType === 1);
+}
+
+export function NotificationItem({ document: doc, notice = {}, onSelect } = {}) {
+ if (!doc) {
+ throw new Error("NotificationItem requires a document reference.");
+ }
+
+ const item = createElement(doc, "button", "dm-notification-item");
+ item.type = "button";
+ if (notice.variant) {
+ item.classList.add(`dm-notification-item--${notice.variant}`);
+ }
+ if (notice.id) {
+ item.dataset.noticeId = notice.id;
+ }
+
+ const iconSlot = createElement(doc, "span", "dm-notification-item__icon");
+ if (notice.icon) {
+ if (isElement(notice.icon)) {
+ iconSlot.appendChild(notice.icon);
+ } else if (typeof notice.icon === "string") {
+ iconSlot.textContent = notice.icon;
+ }
+ }
+
+ const body = createElement(doc, "div", "dm-notification-item__body");
+ if (notice.title) {
+ const title = createElement(
+ doc,
+ "div",
+ "dm-notification-item__title",
+ notice.title,
+ );
+ body.appendChild(title);
+ }
+ const message = createElement(
+ doc,
+ "div",
+ "dm-notification-item__message",
+ notice.message || "",
+ );
+ body.appendChild(message);
+
+ const meta = createElement(doc, "div", "dm-notification-item__meta");
+ const timestamp = createElement(
+ doc,
+ "time",
+ "dm-notification-item__timestamp",
+ notice.timestamp || "",
+ );
+ if (notice.timestampISO) {
+ timestamp.dateTime = notice.timestampISO;
+ }
+ meta.appendChild(timestamp);
+
+ item.appendChild(iconSlot);
+ item.appendChild(body);
+ item.appendChild(meta);
+
+ if (typeof onSelect === "function") {
+ item.addEventListener("click", () => {
+ onSelect(notice);
+ });
+ }
+
+ return item;
+}
+
+export function NotificationCenter({
+ document: doc,
+ notices = [],
+ activeFilter = "all",
+ onFilterSelect,
+ onNoticeSelect,
+} = {}) {
if (!doc) {
throw new Error("NotificationCenter requires a document reference.");
}
const root = createElement(doc, "section", "dm-notification-center");
+ let currentFilter = activeFilter;
- if (!notices.length) {
- const placeholder = createElement(
+ const filterBar = createElement(doc, "div", "dm-notification-center__filters");
+ const filterButtons = new Map();
+
+ const updateFilterState = (nextFilter) => {
+ currentFilter = nextFilter;
+ filterButtons.forEach((button, filterId) => {
+ const isActive = filterId === currentFilter;
+ button.classList.toggle("dm-notification-center__filter-button--active", isActive);
+ button.setAttribute("aria-pressed", isActive ? "true" : "false");
+ });
+ renderGroups();
+ };
+
+ FILTERS.forEach((filter) => {
+ const button = createElement(
doc,
- "div",
- "dm-notification-center__empty",
- "You're all caught up.",
+ "button",
+ "dm-notification-center__filter-button",
+ filter.label,
);
- root.appendChild(placeholder);
- return root;
- }
-
- notices.forEach((notice) => {
- const item = createElement(doc, "div", "dm-notification-center__item");
- if (notice.variant) {
- item.classList.add(`dm-notification-center__item--${notice.variant}`);
- }
- item.textContent = notice.message || "";
- root.appendChild(item);
+ button.type = "button";
+ button.dataset.filterId = filter.id;
+ button.setAttribute("aria-pressed", "false");
+ button.addEventListener("click", () => {
+ if (filter.id === currentFilter) {
+ return;
+ }
+ updateFilterState(filter.id);
+ if (typeof onFilterSelect === "function") {
+ onFilterSelect(filter.id);
+ }
+ });
+ filterButtons.set(filter.id, button);
+ filterBar.appendChild(button);
});
+ const groupsContainer = createElement(doc, "div", "dm-notification-center__groups");
+
+ const getFilteredNotices = () => {
+ if (currentFilter === "all") {
+ return notices;
+ }
+ return notices.filter((notice) => notice.type === currentFilter);
+ };
+
+ const renderGroups = () => {
+ groupsContainer.innerHTML = "";
+ const filteredNotices = getFilteredNotices();
+ const groupMap = new Map();
+
+ filteredNotices.forEach((notice) => {
+ const groupId = notice.group || "new";
+ if (!groupMap.has(groupId)) {
+ groupMap.set(groupId, []);
+ }
+ groupMap.get(groupId).push(notice);
+ });
+
+ GROUPS.forEach((group) => {
+ const groupSection = createElement(
+ doc,
+ "section",
+ "dm-notification-center__group",
+ );
+ const title = createElement(
+ doc,
+ "div",
+ "dm-notification-center__group-title",
+ group.label,
+ );
+ const list = createElement(doc, "div", "dm-notification-center__list");
+ const groupNotices = groupMap.get(group.id) || [];
+
+ if (!groupNotices.length) {
+ list.appendChild(
+ createElement(
+ doc,
+ "div",
+ "dm-notification-center__empty",
+ GROUP_EMPTY_COPY[group.id] || "No notifications.",
+ ),
+ );
+ } else {
+ groupNotices.forEach((notice) => {
+ list.appendChild(
+ NotificationItem({
+ document: doc,
+ notice,
+ onSelect: onNoticeSelect,
+ }),
+ );
+ });
+ }
+
+ groupSection.appendChild(title);
+ groupSection.appendChild(list);
+ groupsContainer.appendChild(groupSection);
+ });
+ };
+
+ root.appendChild(filterBar);
+ root.appendChild(groupsContainer);
+
+ updateFilterState(currentFilter);
+
return root;
}
From 4d2bb8bf3d981af8d03cfe52d8b9b7785dbe7003 Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Mon, 19 Jan 2026 05:47:37 +0000
Subject: [PATCH 006/106] chore(ai): event schema validation tool + fixes
- Added `scripts/agent/validate-events.mjs` to validate event builders against schemas.
- Fixed `NOTE_TYPES.REPOST` schema content format (json instead of empty).
- Added `NOTE_TYPES.MUTE_LIST` and `buildMuteListEvent`.
- Added `buildProfileMetadataEvent` to standardise Kind 0 creation.
- Updated `js/ui/profileModalController.js` to use `buildProfileMetadataEvent`.
- Updated `js/userBlocks.js` to use `buildMuteListEvent` for publishing mute list snapshots.
- Updated `docs/nostr-event-schemas.md` with new schemas and builders.
---
docs/nostr-event-schemas.md | 5 +-
js/nostrEventSchemas.js | 93 +++++++++-
js/ui/profileModalController.js | 12 +-
js/userBlocks.js | 27 ++-
scripts/agent/validate-events.mjs | 295 ++++++++++++++++++++++++++++++
5 files changed, 406 insertions(+), 26 deletions(-)
create mode 100644 scripts/agent/validate-events.mjs
diff --git a/docs/nostr-event-schemas.md b/docs/nostr-event-schemas.md
index 976ec556..d4a51ec1 100644
--- a/docs/nostr-event-schemas.md
+++ b/docs/nostr-event-schemas.md
@@ -16,6 +16,7 @@ import {
setNostrEventSchemaOverrides,
buildVideoPostEvent,
buildRepostEvent,
+ buildProfileMetadataEvent,
} from "./nostrEventSchemas.js";
// Inspect the current schema
@@ -142,7 +143,7 @@ import { updateWatchHistoryListWithDefaultClient } from "./nostrWatchHistoryFaca
| --- | --- | --- | --- |
| Video post (`NOTE_TYPES.VIDEO_POST`) | `30078` | `['t','video']`, `['d',
]` plus optional schema append tags | JSON payload using Content Schema v3 (`version`, `title`, optional `url`, `magnet`, `thumbnail`, `description`, `mode`, `videoRootId`, `deleted`, `isPrivate`, `isNsfw`, `isForKids`, `enableComments`, `ws`, `xs`) |
| NIP-94 mirror (`NOTE_TYPES.VIDEO_MIRROR`) | `1063` | Tags forwarded from `publishVideo` (URL, mime type, thumbnail, alt text, magnet) | Plain text alt description |
-| Repost (`NOTE_TYPES.REPOST`) | `6` | `['e', , ]` with optional address pointer `['a', , ]`, and `['p', ]` when the origin author is known; inherits schema append tags | Empty content |
+| Repost (`NOTE_TYPES.REPOST`) | `6` | `['e', , ]` with optional address pointer `['a', , ]`, and `['p', ]` when the origin author is known; inherits schema append tags | JSON-serialized event being reposted |
| Video comment (`NOTE_TYPES.VIDEO_COMMENT`) | `1111` | NIP-22 root scope tags `['A'\|`E`\|`I`, , ?], `['K', ]`, and `['P', , ?]` plus parent metadata `['E'\|`I`, , ?, ], `['K', ]`, `['P', , ?]`; inherits schema append tags | Plain text body sanitized to valid UTF-8 |
> **Publishing note:** Session actors only emit passive telemetry (for example, view counters) and must **not** sign video comments. Require a logged-in Nostr signer for comment publishing via [`commentEvents`](../js/nostr/commentEvents.js).
@@ -159,6 +160,8 @@ import { updateWatchHistoryListWithDefaultClient } from "./nostrWatchHistoryFaca
| Admin blacklist (`NOTE_TYPES.ADMIN_BLACKLIST`) | `30000` | `['d', 'bitvid:admin:blacklist']`, repeated `['p', ]` entries | Empty content |
| Admin whitelist (`NOTE_TYPES.ADMIN_WHITELIST`) | `30000` | `['d', 'bitvid:admin:whitelist']`, repeated `['p', ]` entries | Empty content |
| Storage challenge (`NOTE_TYPES.STORAGE_CHALLENGE`) | `22242` | `['challenge', ]`, `['purpose', 'bitvid-storage-key']` | Empty content. This event is **ephemeral** and never published to relays. It serves as a challenge for the signer; the deterministic signature produced is used to derive the local encryption Master Key for the Storage Service. |
+| Profile metadata (`NOTE_TYPES.PROFILE_METADATA`) | `0` | `['d', ...]` is not used | JSON payload with NIP-01 fields (`name`, `about`, `picture`, `nip05`, etc.) |
+| Mute list (`NOTE_TYPES.MUTE_LIST`) | `10000` | Repeated `['p', ]` tags for blocked/muted users | Optional content (often encrypted) |
Subscription lists therefore match the
[NIP-51 follow-set specification](./nips/51.md#sets) by emitting kind `30000`
diff --git a/js/nostrEventSchemas.js b/js/nostrEventSchemas.js
index 32ad9a86..bfb5b76e 100644
--- a/js/nostrEventSchemas.js
+++ b/js/nostrEventSchemas.js
@@ -28,6 +28,7 @@ export const NOTE_TYPES = Object.freeze({
ADMIN_BLACKLIST: "adminBlacklist",
ADMIN_WHITELIST: "adminWhitelist",
PROFILE_METADATA: "profileMetadata",
+ MUTE_LIST: "muteList",
});
export const SUBSCRIPTION_LIST_IDENTIFIER = "subscriptions";
@@ -270,8 +271,8 @@ const BASE_SCHEMAS = {
kind: 6,
appendTags: DEFAULT_APPEND_TAGS,
content: {
- format: "empty",
- description: "Content field intentionally empty for pure repost events.",
+ format: "json",
+ description: "Content field contains the JSON-serialized event being reposted.",
},
},
[NOTE_TYPES.NIP71_VIDEO]: {
@@ -458,6 +459,17 @@ const BASE_SCHEMAS = {
description: "Standard NIP-01 profile metadata (name, about, picture, etc.).",
},
},
+ [NOTE_TYPES.MUTE_LIST]: {
+ type: NOTE_TYPES.MUTE_LIST,
+ label: "Mute list",
+ kind: 10000,
+ participantTagName: "p",
+ appendTags: DEFAULT_APPEND_TAGS,
+ content: {
+ format: "text",
+ description: "Optional content (often encrypted) with public p tags.",
+ },
+ },
};
let schemaOverrides = {};
@@ -929,6 +941,83 @@ export function buildRelayListEvent(params) {
};
}
+export function buildProfileMetadataEvent(params) {
+ const {
+ pubkey,
+ created_at,
+ metadata = {},
+ content,
+ additionalTags = [],
+ } = params || {};
+ const schema = getNostrEventSchema(NOTE_TYPES.PROFILE_METADATA);
+ const tags = [];
+ appendSchemaTags(tags, schema);
+ const sanitizedAdditionalTags = sanitizeAdditionalTags(additionalTags);
+ if (sanitizedAdditionalTags.length) {
+ tags.push(...sanitizedAdditionalTags.map((tag) => tag.slice()));
+ }
+
+ let serializedContent = "";
+ if (typeof content === "string") {
+ serializedContent = content;
+ } else {
+ try {
+ serializedContent = JSON.stringify(metadata || {});
+ } catch (error) {
+ serializedContent = "{}";
+ }
+ }
+
+ return {
+ kind: schema?.kind ?? 0,
+ pubkey,
+ created_at,
+ tags,
+ content: serializedContent,
+ };
+}
+
+export function buildMuteListEvent(params) {
+ const {
+ pubkey,
+ created_at,
+ pTags = [],
+ content = "",
+ encrypted = false,
+ encryptionTag = "",
+ additionalTags = [],
+ } = params || {};
+ const schema = getNostrEventSchema(NOTE_TYPES.MUTE_LIST);
+ const tags = [];
+
+ const participantTagName = schema?.participantTagName || "p";
+ if (Array.isArray(pTags)) {
+ pTags.forEach((hex) => {
+ if (typeof hex === "string" && hex.trim()) {
+ tags.push([participantTagName, hex.trim()]);
+ }
+ });
+ }
+
+ if (encrypted && encryptionTag) {
+ tags.push(["encrypted", encryptionTag]);
+ }
+
+ appendSchemaTags(tags, schema);
+ const sanitizedAdditionalTags = sanitizeAdditionalTags(additionalTags);
+ if (sanitizedAdditionalTags.length) {
+ tags.push(...sanitizedAdditionalTags.map((tag) => tag.slice()));
+ }
+
+ return {
+ kind: schema?.kind ?? 10000,
+ pubkey,
+ created_at,
+ tags,
+ content: typeof content === "string" ? content : "",
+ };
+}
+
export function buildViewEvent(params) {
const {
pubkey,
diff --git a/js/ui/profileModalController.js b/js/ui/profileModalController.js
index e7fd360f..5c8bb033 100644
--- a/js/ui/profileModalController.js
+++ b/js/ui/profileModalController.js
@@ -22,6 +22,7 @@ import {
} from "../utils/hashtagNormalization.js";
import { getActiveSigner } from "../nostr/client.js";
import { buildPublicUrl, buildR2Key } from "../r2.js";
+import { buildProfileMetadataEvent } from "../nostrEventSchemas.js";
const noop = () => {};
@@ -6376,14 +6377,11 @@ export class ProfileModalController {
}
try {
- const content = JSON.stringify(profile);
- const event = {
- kind: 0,
- created_at: Math.floor(Date.now() / 1000),
+ const event = buildProfileMetadataEvent({
pubkey,
- tags: [],
- content,
- };
+ created_at: Math.floor(Date.now() / 1000),
+ metadata: profile,
+ });
const result =
await this.services.nostrClient.signAndPublishEvent(event);
diff --git a/js/userBlocks.js b/js/userBlocks.js
index 525cb385..59b07033 100644
--- a/js/userBlocks.js
+++ b/js/userBlocks.js
@@ -6,7 +6,7 @@ import {
import { getActiveSigner } from "./nostr/index.js";
import { isSessionActor } from "./nostr/sessionActor.js";
import { normalizeNostrPubkey } from "./nostr/nip46Client.js";
-import { buildBlockListEvent, BLOCK_LIST_IDENTIFIER, NOTE_TYPES } from "./nostrEventSchemas.js";
+import { buildBlockListEvent, buildMuteListEvent, BLOCK_LIST_IDENTIFIER, NOTE_TYPES } from "./nostrEventSchemas.js";
import { CACHE_POLICIES, STORAGE_TIERS } from "./nostr/cachePolicies.js";
import { devLogger, userLogger } from "./utils/logger.js";
import {
@@ -1536,20 +1536,13 @@ class UserBlockListManager {
return null;
}
- const tags = sanitizeMuteTags(blockedPubkeys, owner);
+ const sanitizedTags = sanitizeMuteTags(blockedPubkeys, owner);
+ const pTags = sanitizedTags.map((tag) => tag[1]);
const timestamp = Number.isFinite(createdAt)
? Math.max(0, Math.floor(createdAt))
: Math.floor(Date.now() / 1000);
- const event = {
- kind: 10000,
- pubkey: owner,
- created_at: timestamp,
- tags,
- content: "",
- };
-
const payloadText = typeof plaintext === "string" ? plaintext : "";
let encryptedContent = "";
let encryptionTagValue = "";
@@ -1579,12 +1572,14 @@ class UserBlockListManager {
}
}
- if (encryptedContent) {
- event.content = encryptedContent;
- if (encryptionTagValue) {
- event.tags.push(["encrypted", encryptionTagValue]);
- }
- }
+ const event = buildMuteListEvent({
+ pubkey: owner,
+ created_at: timestamp,
+ pTags,
+ content: encryptedContent,
+ encrypted: !!encryptionTagValue,
+ encryptionTag: encryptionTagValue,
+ });
onStatus?.({ status: "mute-publishing" });
diff --git a/scripts/agent/validate-events.mjs b/scripts/agent/validate-events.mjs
new file mode 100644
index 00000000..edb38d1d
--- /dev/null
+++ b/scripts/agent/validate-events.mjs
@@ -0,0 +1,295 @@
+import {
+ getNostrEventSchema,
+ buildVideoPostEvent,
+ buildVideoMirrorEvent,
+ buildRepostEvent,
+ buildRelayListEvent,
+ buildViewEvent,
+ buildReactionEvent,
+ buildCommentEvent,
+ buildWatchHistoryEvent,
+ buildSubscriptionListEvent,
+ buildBlockListEvent,
+ buildHashtagPreferenceEvent,
+ buildAdminListEvent,
+ buildProfileMetadataEvent,
+ buildMuteListEvent,
+ NOTE_TYPES,
+ ADMIN_LIST_IDENTIFIERS
+} from "../../js/nostrEventSchemas.js";
+
+const TEST_PUBKEY = "0000000000000000000000000000000000000000000000000000000000000001";
+const TEST_TIMESTAMP = 1700000000;
+
+function validateEvent(event, schema, label) {
+ const errors = [];
+
+ // Check Kind
+ if (schema.kind !== undefined && event.kind !== schema.kind) {
+ errors.push(`Kind mismatch: expected ${schema.kind}, got ${event.kind}`);
+ }
+
+ // Check Content Format
+ if (schema.content) {
+ if (schema.content.format === "json") {
+ try {
+ const parsed = JSON.parse(event.content);
+ if (schema.content.fields) {
+ for (const field of schema.content.fields) {
+ if (field.required && parsed[field.key] === undefined) {
+ errors.push(`Missing required content field: ${field.key}`);
+ }
+ if (parsed[field.key] !== undefined) {
+ // Basic type checking
+ if (field.type === 'number' && typeof parsed[field.key] !== 'number') {
+ errors.push(`Field ${field.key} expected number, got ${typeof parsed[field.key]}`);
+ }
+ if (field.type === 'string' && typeof parsed[field.key] !== 'string') {
+ errors.push(`Field ${field.key} expected string, got ${typeof parsed[field.key]}`);
+ }
+ if (field.type === 'boolean' && typeof parsed[field.key] !== 'boolean') {
+ errors.push(`Field ${field.key} expected boolean, got ${typeof parsed[field.key]}`);
+ }
+ }
+ }
+ }
+ } catch (e) {
+ errors.push(`Content is not valid JSON: ${e.message}`);
+ }
+ } else if (schema.content.format === "empty") {
+ if (event.content !== "") {
+ errors.push(`Content expected to be empty, got length ${event.content.length}`);
+ }
+ }
+ }
+
+ // Check Tags
+ if (schema.topicTag) {
+ const hasTag = event.tags.some(t => t[0] === schema.topicTag.name && t[1] === schema.topicTag.value);
+ if (!hasTag) {
+ errors.push(`Missing topic tag: ${schema.topicTag.name}=${schema.topicTag.value}`);
+ }
+ }
+
+ if (schema.identifierTag) {
+ const hasTag = event.tags.some(t => t[0] === schema.identifierTag.name);
+ if (!hasTag) {
+ errors.push(`Missing identifier tag: ${schema.identifierTag.name}`);
+ }
+ if (schema.identifierTag.value) {
+ const hasValue = event.tags.some(t => t[0] === schema.identifierTag.name && t[1] === schema.identifierTag.value);
+ if (!hasValue) {
+ errors.push(`Missing identifier tag value: ${schema.identifierTag.name}=${schema.identifierTag.value}`);
+ }
+ }
+ }
+
+ // Append Tags Check (Simple existence check for fixed tags)
+ if (schema.appendTags) {
+ schema.appendTags.forEach(expectedTag => {
+ if (Array.isArray(expectedTag)) {
+ const found = event.tags.some(t =>
+ t.length >= expectedTag.length &&
+ expectedTag.every((val, i) => t[i] === val)
+ );
+ if (!found) {
+ errors.push(`Missing appended tag: ${JSON.stringify(expectedTag)}`);
+ }
+ }
+ });
+ }
+
+
+ if (errors.length > 0) {
+ console.error(`❌ ${label} validation failed:`);
+ errors.forEach(e => console.error(` - ${e}`));
+ return false;
+ } else {
+ console.log(`✅ ${label} validated successfully.`);
+ return true;
+ }
+}
+
+async function runValidation() {
+ console.log("Starting Event Schema Validation...\n");
+ let allPassed = true;
+
+ // 1. Video Post
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.VIDEO_POST);
+ const event = buildVideoPostEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ dTagValue: "test-video",
+ content: {
+ version: 1,
+ title: "Test Video",
+ videoRootId: "root-id"
+ }
+ });
+ if (!validateEvent(event, schema, "Video Post")) allPassed = false;
+ }
+
+ // 2. Video Mirror
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.VIDEO_MIRROR);
+ const event = buildVideoMirrorEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ content: "mirror description"
+ });
+ if (!validateEvent(event, schema, "Video Mirror")) allPassed = false;
+ }
+
+ // 3. Repost
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.REPOST);
+ const event = buildRepostEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ eventId: "event-id",
+ eventRelay: "wss://relay.example.com",
+ serializedEvent: JSON.stringify({ id: "event-id", kind: 1, tags: [], content: "test" })
+ });
+ // Schema updated to expect JSON content, so this should pass now.
+ if (!validateEvent(event, schema, "Repost")) allPassed = false;
+ }
+
+ // 4. Relay List
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.RELAY_LIST);
+ const event = buildRelayListEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ relays: ["wss://relay.one", { url: "wss://relay.two", mode: "read" }]
+ });
+ if (!validateEvent(event, schema, "Relay List")) allPassed = false;
+ }
+
+ // 5. View Event
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.VIEW_EVENT);
+ const event = buildViewEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ dedupeTag: "dedupe-val",
+ includeSessionTag: true,
+ content: "view log"
+ });
+ if (!validateEvent(event, schema, "View Event")) allPassed = false;
+ }
+
+ // 6. Reaction Event
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.VIDEO_REACTION);
+ const event = buildReactionEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ targetPointer: { type: "e", value: "target-id", relay: "wss://r.com" },
+ content: "+"
+ });
+ if (!validateEvent(event, schema, "Reaction Event")) allPassed = false;
+ }
+
+ // 7. Comment Event
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.VIDEO_COMMENT);
+ const event = buildCommentEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ videoEventId: "vid-id",
+ content: "Nice video!"
+ });
+ if (!validateEvent(event, schema, "Comment Event")) allPassed = false;
+ }
+
+ // 8. Watch History
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.WATCH_HISTORY);
+ const event = buildWatchHistoryEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ monthIdentifier: "2023-10",
+ content: JSON.stringify(["watched-id-1"])
+ });
+ if (!validateEvent(event, schema, "Watch History")) allPassed = false;
+ }
+
+ // 9. Subscription List
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.SUBSCRIPTION_LIST);
+ const event = buildSubscriptionListEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ content: "encrypted-stuff"
+ });
+ if (!validateEvent(event, schema, "Subscription List")) allPassed = false;
+ }
+
+ // 10. Block List
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.USER_BLOCK_LIST);
+ const event = buildBlockListEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ content: "encrypted-stuff"
+ });
+ if (!validateEvent(event, schema, "Block List")) allPassed = false;
+ }
+
+ // 11. Hashtag Preference
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.HASHTAG_PREFERENCES);
+ const event = buildHashtagPreferenceEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ content: JSON.stringify({ version: 1, interests: [], disinterests: [] })
+ });
+ if (!validateEvent(event, schema, "Hashtag Preferences")) allPassed = false;
+ }
+
+ // 12. Admin List (Moderation)
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.ADMIN_MODERATION_LIST);
+ const event = buildAdminListEvent("moderation", {
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ hexPubkeys: ["0000000000000000000000000000000000000000000000000000000000000002"]
+ });
+ if (!validateEvent(event, schema, "Admin Moderation List")) allPassed = false;
+ }
+
+ // 13. Profile Metadata
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.PROFILE_METADATA);
+ const event = buildProfileMetadataEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ metadata: { name: "Test User", about: "Testing" }
+ });
+ if (!validateEvent(event, schema, "Profile Metadata")) allPassed = false;
+ }
+
+ // 14. Mute List
+ {
+ const schema = getNostrEventSchema(NOTE_TYPES.MUTE_LIST);
+ const event = buildMuteListEvent({
+ pubkey: TEST_PUBKEY,
+ created_at: TEST_TIMESTAMP,
+ pTags: ["0000000000000000000000000000000000000000000000000000000000000002"]
+ });
+ if (!validateEvent(event, schema, "Mute List")) allPassed = false;
+ }
+
+ if (!allPassed) {
+ console.error("\n❌ Some validations failed.");
+ process.exit(1);
+ } else {
+ console.log("\n✅ All validations passed.");
+ }
+}
+
+runValidation().catch(e => {
+ console.error(e);
+ process.exit(1);
+});
From 980075981aa55715a5e68b4bf0e7a66884ff365b Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Mon, 19 Jan 2026 06:20:13 +0000
Subject: [PATCH 007/106] feat: add privacy-preserving telemetry and error
aggregation script
- Added `scripts/agent/telemetry.mjs` to aggregate errors from log files (test_output.log, etc.).
- Implemented robust PII sanitization (IPv4, emails, hex keys, Bech32 keys, and file paths).
- Script generates a JSON artifact (`artifacts/error-aggregates.json`) and a Markdown report (`ai/reports/telemetry-YYYYMMDD.md`).
- Aggregation groups errors by sanitized message/stack trace fingerprint.
---
scripts/agent/telemetry.mjs | 286 ++++++++++++++++++++++++++++++++++++
1 file changed, 286 insertions(+)
create mode 100644 scripts/agent/telemetry.mjs
diff --git a/scripts/agent/telemetry.mjs b/scripts/agent/telemetry.mjs
new file mode 100644
index 00000000..e2084499
--- /dev/null
+++ b/scripts/agent/telemetry.mjs
@@ -0,0 +1,286 @@
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const ROOT_DIR = path.resolve(__dirname, '../../');
+
+const ARTIFACTS_DIR = path.join(ROOT_DIR, 'artifacts');
+const REPORTS_DIR = path.join(ROOT_DIR, 'ai/reports');
+
+const LOG_FILES = [
+ 'test_output.log',
+ 'npm_output.log',
+ 'server.log',
+ 'python_server.log'
+];
+
+// Privacy Sanitization Patterns
+const PATTERNS = {
+ ipv4: /\b(?:\d{1,3}\.){3}\d{1,3}\b/g,
+ ipv6: /\b([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}\b/g,
+ email: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g,
+ hexKey: /\b[0-9a-fA-F]{64}\b/g,
+ bech32: /\b(npub|nsec|note|nevent|nprofile|naddr)1[0-9a-z]{50,}\b/g,
+ // Simplify paths to remove user names or absolute paths
+ absPath: /(?:\/[a-zA-Z0-9_\-.]+)+\/bitvid\//g, // Try to find root of repo if possible
+ genericPath: /(\/[a-zA-Z0-9_\-.]+){3,}/g, // Catch long paths
+};
+
+function sanitize(text) {
+ if (!text) return text;
+ let sanitized = text;
+
+ sanitized = sanitized.replace(PATTERNS.ipv4, '');
+ // sanitized = sanitized.replace(PATTERNS.ipv6, ''); // IPv6 regex is tricky, leaving it out for now to avoid false positives on simple text
+ sanitized = sanitized.replace(PATTERNS.email, '');
+ sanitized = sanitized.replace(PATTERNS.hexKey, '');
+ sanitized = sanitized.replace(PATTERNS.bech32, '');
+
+ // Custom path sanitization
+ // Assuming the repo is mounted at /app in the sandbox, or we want to normalize it
+ sanitized = sanitized.replace(/\/app\//g, '/');
+
+ // Try to mask home directories
+ sanitized = sanitized.replace(/\/home\/[a-zA-Z0-9_\-.]+\//g, '/');
+
+ // Use defined patterns for other paths (e.g. if the repo is checked out elsewhere)
+ sanitized = sanitized.replace(PATTERNS.absPath, '/');
+
+ // Generic path sanitization (careful to avoid breaking URLs too much, though strict PII policy prefers over-sanitization)
+ // We only apply this if it looks like a long absolute path (starts with /)
+ sanitized = sanitized.replace(PATTERNS.genericPath, (match) => {
+ // Avoid sanitizing if it's already sanitized
+ if (match.includes('') || match.includes('')) return match;
+ return '/.../';
+ });
+
+ return sanitized;
+}
+
+function parseTestLogs(content) {
+ const errors = [];
+ const lines = content.split('\n');
+
+ let currentError = null;
+ let captureStack = false;
+
+ for (const line of lines) {
+ // Detect TAP failure
+ if (line.match(/^not ok \d+/)) {
+ if (currentError) {
+ errors.push(currentError);
+ }
+ currentError = {
+ message: line.trim(),
+ stack: [],
+ source: 'test_output'
+ };
+ captureStack = true;
+ continue;
+ }
+
+ // Detect general Error
+ if (line.includes('Error:') || line.includes('Exception:')) {
+ // If we are already capturing a stack for a TAP failure, this is likely the detail
+ if (currentError && captureStack) {
+ currentError.message += ' | ' + line.trim();
+ } else {
+ if (currentError) {
+ errors.push(currentError);
+ }
+ currentError = {
+ message: line.trim(),
+ stack: [line.trim()],
+ source: 'unknown'
+ };
+ captureStack = true;
+ }
+ continue;
+ }
+
+ if (captureStack) {
+ // Stack trace lines usually start with " at " or are indented
+ if (line.match(/^\s+at /) || (line.match(/^\s+/) && currentError)) {
+ currentError.stack.push(line.trim());
+ } else if (line.match(/^TAP version/) || line.match(/^→ Running/) || line.trim() === '') {
+ // End of error block
+ if (currentError) {
+ errors.push(currentError);
+ currentError = null;
+ captureStack = false;
+ }
+ } else {
+ // Continue capturing if it looks like part of the error report (e.g. TAP diagnostics)
+ if (line.match(/^\s+/)) {
+ currentError.stack.push(line.trim());
+ } else {
+ if (currentError) {
+ errors.push(currentError);
+ currentError = null;
+ captureStack = false;
+ }
+ }
+ }
+ }
+ }
+
+ if (currentError) {
+ errors.push(currentError);
+ }
+
+ return errors;
+}
+
+function processFiles() {
+ const allErrors = [];
+
+ for (const file of LOG_FILES) {
+ const filePath = path.join(ROOT_DIR, file);
+ if (fs.existsSync(filePath)) {
+ console.log(`Processing ${file}...`);
+ const content = fs.readFileSync(filePath, 'utf8');
+
+ // We can add more specific parsers here
+ if (file === 'test_output.log') {
+ allErrors.push(...parseTestLogs(content));
+ } else {
+ // Generic parsing for other logs: just look for Error: blocks
+ const lines = content.split('\n');
+ let currentError = null;
+ for (const line of lines) {
+ if (line.includes('Error:')) {
+ if (currentError) allErrors.push(currentError);
+ currentError = {
+ message: line.trim(),
+ stack: [line.trim()],
+ source: file
+ };
+ } else if (currentError) {
+ if (line.match(/^\s+at /) || line.match(/^\s+/)) {
+ currentError.stack.push(line.trim());
+ } else {
+ allErrors.push(currentError);
+ currentError = null;
+ }
+ }
+ }
+ if (currentError) allErrors.push(currentError);
+ }
+ } else {
+ console.log(`Skipping ${file} (not found)`);
+ }
+ }
+
+ return allErrors;
+}
+
+function aggregateErrors(errors) {
+ const groups = {};
+
+ for (const error of errors) {
+ // Sanitize before grouping
+ const sanitizedMsg = sanitize(error.message);
+ const sanitizedStack = error.stack.map(sanitize).join('\n');
+
+ // Create a fingerprint. We use the stack trace if available, otherwise the message.
+ // Truncating stack to first few lines can help group similar errors with slightly different line numbers if code shifts,
+ // but for now let's use the whole stack but maybe ignore line numbers?
+ // Actually, exact stack match (sanitized) is a good start.
+
+ // To make it more robust, let's remove line numbers from the fingerprint?
+ // e.g. (file.js:123:45) -> (file.js)
+ // For now, let's stick to sanitized stack as fingerprint.
+
+ const fingerprint = sanitizedStack || sanitizedMsg;
+
+ if (!groups[fingerprint]) {
+ groups[fingerprint] = {
+ message: sanitizedMsg,
+ stack: sanitizedStack,
+ count: 0,
+ sources: new Set(),
+ originalSample: error
+ };
+ }
+
+ groups[fingerprint].count++;
+ groups[fingerprint].sources.add(error.source);
+ }
+
+ return Object.values(groups).sort((a, b) => b.count - a.count);
+}
+
+function generateReport(aggregatedErrors) {
+ const date = new Date().toISOString().slice(0, 10).replace(/-/g, '');
+ const reportFile = path.join(REPORTS_DIR, `telemetry-${date}.md`);
+ const jsonFile = path.join(ARTIFACTS_DIR, 'error-aggregates.json');
+
+ // JSON Output
+ if (!fs.existsSync(ARTIFACTS_DIR)) {
+ fs.mkdirSync(ARTIFACTS_DIR, { recursive: true });
+ }
+
+ // Convert sets to arrays for JSON
+ const jsonOutput = aggregatedErrors.map(e => ({
+ ...e,
+ sources: Array.from(e.sources)
+ }));
+
+ fs.writeFileSync(jsonFile, JSON.stringify(jsonOutput, null, 2));
+ console.log(`Wrote JSON artifact to ${jsonFile}`);
+
+ // Markdown Output
+ let md = `# Telemetry Report - ${new Date().toISOString().split('T')[0]}\n\n`;
+ md += `**Total Unique Errors:** ${aggregatedErrors.length}\n\n`;
+ md += `| Count | Message | Sources | Suggested Owner |\n`;
+ md += `|-------|---------|---------|-----------------|\n`;
+
+ const top10 = aggregatedErrors.slice(0, 10);
+
+ for (const error of top10) {
+ // Truncate message for table
+ let shortMsg = error.message.replace(/\|/g, '\\|').substring(0, 80);
+ if (error.message.length > 80) shortMsg += '...';
+
+ const sources = Array.from(error.sources).join(', ');
+
+ // Guess owner based on stack
+ let owner = 'TBD';
+ if (error.stack.includes('nostr')) owner = 'Nostr Team';
+ if (error.stack.includes('torrent') || error.stack.includes('webtorrent')) owner = 'P2P Team';
+ if (error.stack.includes('ui/') || error.stack.includes('components/')) owner = 'Frontend Team';
+ if (error.stack.includes('test')) owner = 'QA';
+
+ md += `| ${error.count} | \`${shortMsg}\` | ${sources} | ${owner} |\n`;
+ }
+
+ md += `\n## Details (Top 10)\n\n`;
+
+ for (const [index, error] of top10.entries()) {
+ md += `### ${index + 1}. ${error.message}\n`;
+ md += `- **Count:** ${error.count}\n`;
+ md += `- **Sources:** ${Array.from(error.sources).join(', ')}\n`;
+ md += `- **Stack Trace:**\n`;
+ md += `\`\`\`\n${error.stack}\n\`\`\`\n\n`;
+ }
+
+ if (!fs.existsSync(REPORTS_DIR)) {
+ fs.mkdirSync(REPORTS_DIR, { recursive: true });
+ }
+ fs.writeFileSync(reportFile, md);
+ console.log(`Wrote Markdown report to ${reportFile}`);
+}
+
+// Main execution
+try {
+ const errors = processFiles();
+ console.log(`Found ${errors.length} raw errors.`);
+ const aggregated = aggregateErrors(errors);
+ console.log(`Aggregated into ${aggregated.length} unique issues.`);
+ generateReport(aggregated);
+} catch (err) {
+ console.error('Fatal error in telemetry script:', err);
+ process.exit(1);
+}
From 9d97d8dcf80f23e445f9dd8a76264e4060483f99 Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Mon, 19 Jan 2026 07:30:44 +0000
Subject: [PATCH 008/106] feat(agent): add interop-test.mjs for Nostr protocol
verification
- Implements `scripts/agent/interop-test.mjs` using Playwright to run integration tests in a browser context.
- Tests include:
- Publishing `VIDEO_POST` (Kind 30078) events using schema builders.
- Verifying event roundtrip (fetch by ID).
- Publishing `VIEW_EVENT` (Watch History).
- Sending and decrypting Encrypted DMs (NIP-04/NIP-44) using ephemeral keys.
- Uses local `simple-relay.mjs` (port 8008) and Python HTTP server (port 8001) to ensure environment isolation.
- Generates artifacts in `artifacts/` folder including logs and reports.
---
scripts/agent/interop-test.mjs | 505 +++++++++++++++++++++------------
1 file changed, 316 insertions(+), 189 deletions(-)
diff --git a/scripts/agent/interop-test.mjs b/scripts/agent/interop-test.mjs
index b5cde18c..fcc2a5e7 100644
--- a/scripts/agent/interop-test.mjs
+++ b/scripts/agent/interop-test.mjs
@@ -1,198 +1,325 @@
+import { chromium } from '@playwright/test';
+import { spawn } from 'node:child_process';
+import fs from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
-import { WebSocket } from 'ws';
-import * as crypto from 'node:crypto';
-import * as NostrTools from 'nostr-tools';
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const REPO_ROOT = path.resolve(__dirname, '../../');
-// Polyfills
-globalThis.WebSocket = WebSocket;
-if (!globalThis.crypto) {
- globalThis.crypto = crypto;
+const ARTIFACTS_DIR = path.join(REPO_ROOT, 'artifacts');
+const TIMESTAMP = new Date().toISOString().replace(/[:.]/g, '-');
+const LOG_FILE = path.join(ARTIFACTS_DIR, `interop-${TIMESTAMP}.log`);
+const REPORT_FILE = path.join(ARTIFACTS_DIR, `interop-report-${TIMESTAMP}.json`);
+const RELAY_PORT = 8008;
+const HTTP_PORT = 8001;
+
+// Ensure artifacts dir exists
+if (!fs.existsSync(ARTIFACTS_DIR)) {
+ fs.mkdirSync(ARTIFACTS_DIR, { recursive: true });
}
-globalThis.NostrTools = NostrTools;
-// Mock localStorage
-const localStorageMock = {
- store: {},
- getItem: function(key) { return this.store[key] || null; },
- setItem: function(key, value) { this.store[key] = String(value); },
- removeItem: function(key) { delete this.store[key]; },
- clear: function() { this.store = {}; }
+function log(message, type = 'INFO') {
+ const msg = `[${new Date().toISOString()}] [${type}] ${message}`;
+ console.log(msg);
+ fs.appendFileSync(LOG_FILE, msg + '\n');
+}
+
+const stats = {
+ steps: 0,
+ failures: 0,
+ details: []
};
-globalThis.localStorage = localStorageMock;
-// Prevent crash on unhandled rejection (e.g. from nostr-tools timeouts)
-process.on('unhandledRejection', (reason, p) => {
- // console.log('[TEST] Unhandled Rejection (suppressed):', reason);
-});
-
-// Configuration
-const TEST_RELAYS = [
- 'wss://relay.damus.io',
- 'wss://nos.lol'
-];
-
-async function runTest() {
- const { NostrClient } = await import('../../js/nostr/client.js');
- // Removed unused imports
-
- console.log('Starting Interop Test...');
- const logs = [];
- const log = (msg, data) => {
- console.log(`[TEST] ${msg}`, data ? JSON.stringify(data, null, 2) : '');
- logs.push({ msg, data });
- };
-
- try {
- // -------------------------------------------------------------------------
- // 1. Setup Sender
- // -------------------------------------------------------------------------
- log('Initializing Sender Client...');
- const senderClient = new NostrClient();
-
- // Explicitly set relays
- senderClient.relays = [...TEST_RELAYS];
- senderClient.writeRelays = [...TEST_RELAYS];
- senderClient.readRelays = [...TEST_RELAYS];
- log('Sender Relays set to:', senderClient.relays);
-
- // Generate Ephemeral Key for Sender
- const senderSecret = NostrTools.generateSecretKey();
- const senderPrivKey = Buffer.from(senderSecret).toString('hex');
-
- const { pubkey: senderPubkey } = await senderClient.registerPrivateKeySigner({ privateKey: senderPrivKey });
- senderClient.pubkey = senderPubkey;
- log('Sender Pubkey:', senderClient.pubkey);
-
- await senderClient.init();
- log('Sender Client Initialized.');
-
- // -------------------------------------------------------------------------
- // 2. Publish Video Post
- // -------------------------------------------------------------------------
- log('Test A: Publish Video Post');
- const videoRootId = `interop-test-${Date.now()}`;
- const magnet = `magnet:?xt=urn:btih:${crypto.randomBytes(20).toString('hex')}&dn=test-video`;
- const title = 'Interop Test Video ' + new Date().toISOString();
-
- const videoData = {
- title,
- videoRootId,
- magnet,
- description: 'Automated interop test video',
- mimeType: 'video/mp4'
- };
-
- log('Publishing video...', videoData);
- const signedVideoEvent = await senderClient.publishVideo(videoData, senderClient.pubkey);
- log('Video Published. Event ID:', signedVideoEvent.id);
-
- // Verify
- log('Verifying video event fetch...');
- // Allow some propagation time
- await new Promise(r => setTimeout(r, 2000));
-
- const fetchedVideo = await senderClient.getEventById(signedVideoEvent.id);
- if (!fetchedVideo) throw new Error('Failed to fetch published video event');
- if (fetchedVideo.id !== signedVideoEvent.id) throw new Error('Fetched event ID mismatch');
-
- const isSigValid = NostrTools.verifyEvent(signedVideoEvent);
- if (!isSigValid) throw new Error('Invalid event signature');
-
- // Verify content shape
- if (fetchedVideo.title !== title) throw new Error(`Title mismatch: expected "${title}", got "${fetchedVideo.title}"`);
- if (fetchedVideo.magnet !== magnet) throw new Error(`Magnet mismatch: expected "${magnet}", got "${fetchedVideo.magnet}"`);
- // Note: publishVideo generates a new videoRootId, so we check against the signed event's content, not our input
- const signedContent = JSON.parse(signedVideoEvent.content);
- if (fetchedVideo.videoRootId !== signedContent.videoRootId) throw new Error(`Root ID mismatch: expected "${signedContent.videoRootId}", got "${fetchedVideo.videoRootId}"`);
-
- log('Test A PASSED: Video event published and verified (content matched).');
-
- // -------------------------------------------------------------------------
- // 3. Publish View Event
- // -------------------------------------------------------------------------
- log('Test B: Publish View Event');
- const pointer = {
- type: 'e',
- value: signedVideoEvent.id,
- relay: TEST_RELAYS[0]
- };
-
- log('Publishing view event...', pointer);
- const viewResult = await senderClient.publishViewEvent(pointer);
-
- if (!viewResult.ok) throw new Error(`Failed to publish view event: ${viewResult.error}`);
- log('View event published.');
-
- // Verify View Event Visibility
- log('Verifying view event visibility...');
- await new Promise(r => setTimeout(r, 2000));
-
- // We can list view events for this pointer
- const viewEvents = await senderClient.listVideoViewEvents(pointer, { limit: 5 });
- const foundView = viewEvents.find(v => v.pubkey === senderPubkey); // It should be signed by sender
-
- if (!foundView) {
- log('Fetched View Events:', viewEvents);
- throw new Error('Could not verify visibility of published view event.');
+function recordStep(name, success, error = null) {
+ stats.steps++;
+ const detail = { name, success, timestamp: new Date().toISOString() };
+ if (!success) {
+ stats.failures++;
+ detail.error = error?.message || String(error);
+ log(`Step Failed: ${name} - ${detail.error}`, 'ERROR');
+ if (error?.stack) {
+ log(error.stack, 'ERROR');
+ }
+ } else {
+ log(`Step Passed: ${name}`, 'SUCCESS');
}
- log('Test B PASSED: View event verified visible.');
-
- // -------------------------------------------------------------------------
- // 4. Encrypted Direct Message (Sender -> Receiver)
- // -------------------------------------------------------------------------
- log('Test C: Encrypted DM');
-
- // Setup Receiver
- const receiverClient = new NostrClient();
- receiverClient.relays = [...TEST_RELAYS];
- receiverClient.writeRelays = [...TEST_RELAYS];
- receiverClient.readRelays = [...TEST_RELAYS];
-
- const receiverSecret = NostrTools.generateSecretKey();
- const receiverPrivKey = Buffer.from(receiverSecret).toString('hex');
-
- const { pubkey: receiverPubkey } = await receiverClient.registerPrivateKeySigner({ privateKey: receiverPrivKey });
- receiverClient.pubkey = receiverPubkey;
- log('Receiver Pubkey:', receiverPubkey);
-
- await receiverClient.init();
-
- // Sender sends DM
- const messageContent = `Hello Interop ${Date.now()}`;
- log(`Sender sending DM to ${receiverPubkey}: "${messageContent}"`);
-
- // sendDirectMessage is on the sender client
- const sendResult = await senderClient.sendDirectMessage(
- NostrTools.nip19.npubEncode(receiverPubkey),
- messageContent
- );
-
- if (!sendResult.ok) throw new Error(`Failed to send DM: ${sendResult.error}`);
- log('DM Sent.');
-
- // Wait for propagation
- await new Promise(r => setTimeout(r, 5000));
-
- // Receiver fetches DMs
- log('Receiver fetching DMs...');
- const dms = await receiverClient.listDirectMessages(receiverPubkey);
-
- const foundDm = dms.find(dm => dm.plaintext === messageContent);
-
- if (!foundDm) {
- log('Fetched DMs:', dms.map(d => ({ plain: d.plaintext, sender: d.sender })));
- throw new Error('Receiver could not find or decrypt the sent message.');
- }
-
- log('Test C PASSED: DM received and decrypted.');
-
- console.log('\nAll Interop Tests PASSED!');
- process.exit(0);
-
- } catch (err) {
- console.error('\nTest FAILED:', err);
- process.exit(1);
- }
+ stats.details.push(detail);
}
-runTest();
+async function startProcess(command, args, cwd, readyCheck) {
+ return new Promise((resolve, reject) => {
+ const proc = spawn(command, args, { cwd, stdio: 'pipe' });
+ let started = false;
+ const label = args.some(a => a.includes('relay')) ? 'RELAY' : command;
+
+ const checkData = (data) => {
+ const output = data.toString();
+ if (started) {
+ if (label === 'RELAY') log(`[RELAY] ${output.trim()}`, 'DEBUG');
+ return;
+ }
+ if (readyCheck(output)) {
+ started = true;
+ resolve(proc);
+ }
+ };
+
+ proc.stdout.on('data', (data) => {
+ checkData(data);
+ });
+ proc.stderr.on('data', (data) => {
+ checkData(data);
+ });
+
+ proc.on('error', (err) => reject(err));
+ proc.on('exit', (code) => {
+ if (!started) reject(new Error(`${command} exited early with code ${code}`));
+ });
+
+ // Timeout fallback
+ setTimeout(() => {
+ if (!started) {
+ // For http server, sometimes it doesn't output much
+ if (command.includes('python') || command.includes('http.server')) {
+ started = true;
+ resolve(proc);
+ } else {
+ reject(new Error(`${command} timed out waiting for ready signal`));
+ }
+ }
+ }, 3000);
+ });
+}
+
+async function runInteropTest() {
+ let relayProc, serverProc, browser;
+
+ try {
+ log('Starting interop test...');
+
+ // 1. Start Relay
+ log('Starting local relay...');
+ relayProc = await startProcess(
+ 'node',
+ ['scripts/agent/simple-relay.mjs'],
+ REPO_ROOT,
+ (output) => output.includes(`running on ws://localhost:${RELAY_PORT}`) || output.includes(`running on port ${RELAY_PORT}`)
+ );
+
+ } catch (e) {
+ log('Failed to start relay: ' + e.message, 'FATAL');
+ }
+
+ try {
+ // 2. Start HTTP Server
+ log('Starting HTTP server...');
+ serverProc = await startProcess(
+ 'python3',
+ ['-m', 'http.server', String(HTTP_PORT)],
+ REPO_ROOT,
+ (output) => output.includes(`Serving HTTP on 0.0.0.0 port ${HTTP_PORT}`)
+ );
+
+ // 3. Launch Browser
+ log('Launching browser...');
+ browser = await chromium.launch({ headless: true });
+ const context = await browser.newContext();
+ const page = await context.newPage();
+
+ // 4. Navigate to app
+ log(`Navigating to http://localhost:${HTTP_PORT}...`);
+ await page.goto(`http://localhost:${HTTP_PORT}`, { waitUntil: 'networkidle' });
+
+ // 5. Inject Test Logic
+ log('Executing test logic in browser...');
+
+ const testResult = await page.evaluate(async ({ relayUrl }) => {
+ const logs = [];
+ const steps = [];
+
+ function log(msg) { console.log(msg); logs.push(msg); }
+
+ try {
+ // Import dependencies
+ const { nostrClient } = await import('./js/nostr/defaultClient.js');
+ const schemas = await import('./js/nostrEventSchemas.js');
+
+ // Wait for NostrTools
+ if (!window.NostrTools) {
+ await new Promise(r => setTimeout(r, 1000));
+ if (!window.NostrTools) throw new Error("NostrTools not available on window");
+ }
+ const NostrTools = window.NostrTools;
+
+ // --- Step 1: Init ---
+ nostrClient.relays = [relayUrl];
+ nostrClient.readRelays = [relayUrl];
+ nostrClient.writeRelays = [relayUrl];
+ await nostrClient.init();
+ await nostrClient.connectToRelays();
+
+ steps.push({ name: 'Init & Connect', success: true });
+
+ // --- Step 2: Setup Alice (Video Publisher) ---
+ const skAlice = NostrTools.generateSecretKey();
+ const pkAlice = NostrTools.getPublicKey(skAlice);
+ const hexSkAlice = NostrTools.utils.bytesToHex(skAlice);
+
+ await nostrClient.registerPrivateKeySigner({ privateKey: hexSkAlice, pubkey: pkAlice });
+
+ steps.push({ name: 'Setup Alice', success: true });
+
+ // --- Test A: Publish VIDEO_POST ---
+ const dTagValue = `test-video-${Date.now()}`;
+ const videoContent = {
+ version: 3,
+ title: 'Interop Test Video',
+ description: 'Testing event schemas',
+ videoRootId: `root-${dTagValue}`,
+ mode: 'dev',
+ url: 'https://example.com/video.mp4',
+ magnet: 'magnet:?xt=urn:btih:1234567890abcdef1234567890abcdef12345678&dn=video.mp4'
+ };
+
+ const videoEventSkeleton = schemas.buildVideoPostEvent({
+ pubkey: pkAlice,
+ created_at: Math.floor(Date.now() / 1000),
+ dTagValue: dTagValue,
+ content: videoContent
+ });
+
+ // Use signAndPublishEvent to sign and publish
+ const { signedEvent: publishedVideo } = await nostrClient.signAndPublishEvent(videoEventSkeleton);
+
+ if (!publishedVideo || !publishedVideo.id || !publishedVideo.sig) {
+ throw new Error("Video publish returned incomplete event");
+ }
+
+ steps.push({ name: 'Publish VIDEO_POST', success: true });
+
+ // --- Test B: Fetch and Validate Video ---
+ await new Promise(r => setTimeout(r, 500)); // wait for relay
+ const fetchedVideo = await nostrClient.getEventById(publishedVideo.id, { includeRaw: true });
+
+ if (!fetchedVideo) throw new Error("Failed to fetch video event back");
+
+ // Validate shape
+ const fetchedRaw = fetchedVideo.rawEvent || fetchedVideo; // handle wrapper
+ if (fetchedRaw.id !== publishedVideo.id) throw new Error("ID mismatch");
+ if (fetchedRaw.pubkey !== pkAlice) throw new Error("Pubkey mismatch");
+
+ // Parse content
+ const fetchedContent = typeof fetchedRaw.content === 'string' ? JSON.parse(fetchedRaw.content) : fetchedRaw.content;
+ if (fetchedContent.title !== videoContent.title) throw new Error("Content title mismatch");
+ if (fetchedContent.videoRootId !== videoContent.videoRootId) throw new Error("Content rootId mismatch");
+
+ steps.push({ name: 'Verify VIDEO_POST Roundtrip', success: true });
+
+ // --- Test C: Publish VIEW_EVENT ---
+ const viewEventSkeleton = schemas.buildViewEvent({
+ pubkey: pkAlice,
+ created_at: Math.floor(Date.now() / 1000),
+ pointerTag: ['e', publishedVideo.id], // pointing to the video
+ content: 'test view'
+ });
+
+ const { signedEvent: publishedView } = await nostrClient.signAndPublishEvent(viewEventSkeleton);
+
+ await new Promise(r => setTimeout(r, 500));
+ const fetchedView = await nostrClient.fetchRawEventById(publishedView.id);
+ if (!fetchedView) throw new Error("Failed to fetch view event back");
+
+ steps.push({ name: 'Publish & Verify VIEW_EVENT', success: true });
+
+ // --- Test D: Encrypted DM (Alice -> Bob) ---
+ const skBob = NostrTools.generateSecretKey();
+ const pkBob = NostrTools.getPublicKey(skBob);
+ const hexSkBob = NostrTools.utils.bytesToHex(skBob);
+ const npubBob = NostrTools.nip19.npubEncode(pkBob);
+
+ // Alice is currently logged in
+ const dmMessage = `Hello Bob ${Date.now()}`;
+ const dmResult = await nostrClient.sendDirectMessage(npubBob, dmMessage);
+ if (!dmResult.ok) throw new Error("Failed to send DM: " + dmResult.error);
+
+ steps.push({ name: 'Send Encrypted DM', success: true });
+
+ // Switch to Bob to decrypt
+ nostrClient.logout();
+ await nostrClient.registerPrivateKeySigner({ privateKey: hexSkBob, pubkey: pkBob });
+
+ await new Promise(r => setTimeout(r, 500));
+
+ const dms = await nostrClient.listDirectMessages(pkBob);
+ const receivedDm = dms.find(m => m.plaintext === dmMessage);
+
+ if (!receivedDm) {
+ throw new Error(`Bob could not find/decrypt the DM. Found: ${dms.length} messages.`);
+ }
+
+ if (receivedDm.sender.pubkey !== pkAlice) {
+ throw new Error("DM sender mismatch");
+ }
+
+ steps.push({ name: 'Decrypt DM', success: true });
+
+ return { success: true, steps, logs };
+
+ } catch (e) {
+ return { success: false, steps, logs, error: e.message, stack: e.stack };
+ }
+ }, { relayUrl: `ws://localhost:${RELAY_PORT}` });
+
+ // Process results
+ if (testResult.logs) {
+ testResult.logs.forEach(l => log(`[Browser] ${l}`));
+ }
+
+ if (testResult.steps) {
+ testResult.steps.forEach(s => recordStep(s.name, s.success));
+ }
+
+ if (!testResult.success) {
+ throw new Error(testResult.error || "Unknown browser test failure");
+ }
+
+ } catch (err) {
+ log(`Test failed: ${err.message}`, 'FATAL');
+ recordStep('Interop Test Suite', false, err);
+ // Take screenshot if browser is active
+ if (browser) {
+ try {
+ const page = browser.contexts()[0].pages()[0];
+ if (page) {
+ await page.screenshot({ path: path.join(ARTIFACTS_DIR, `interop-failure-${TIMESTAMP}.png`) });
+ log(`Screenshot saved to interop-failure-${TIMESTAMP}.png`);
+ }
+ } catch (e) {
+ log('Failed to capture screenshot: ' + e.message);
+ }
+ }
+ } finally {
+ // Cleanup
+ if (browser) await browser.close();
+ if (serverProc) {
+ try { process.kill(serverProc.pid); } catch (e) { /* ignore */ }
+ }
+ if (relayProc) {
+ try { process.kill(relayProc.pid); } catch (e) { /* ignore */ }
+ }
+
+ // Report
+ fs.writeFileSync(REPORT_FILE, JSON.stringify({
+ timestamp: new Date().toISOString(),
+ stats,
+ logFile: LOG_FILE
+ }, null, 2));
+
+ console.log(`Report saved to ${REPORT_FILE}`);
+ if (stats.failures > 0) process.exit(1);
+ }
+}
+
+runInteropTest();
From 11f7540c341f4924a7c166a1cb50e83dec60d1ca Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Mon, 19 Jan 2026 09:32:01 +0000
Subject: [PATCH 009/106] chore(ai): dependency scan and report
- Performed security and dependency scan.
- Created `artifacts/npm-audit.json` (0 vulnerabilities).
- Created `artifacts/npm-outdated.json`.
- Created `artifacts/proposed_issues.md` detailing required major upgrades.
- No safe minor/patch upgrades were found (dependencies are locked or up-to-date within range).
- `nostr-tools` is up-to-date (2.19.4).
From 41da0a8361dd064be26daf359883a72362a255ad Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Mon, 19 Jan 2026 11:31:46 +0000
Subject: [PATCH 010/106] test(ai): add unit tests for cache, sessionActor, and
r2Service (agent)
- Added `tests/state/cache.test.mjs` to test profile persistence and URL health caching.
- Added `tests/nostr/sessionActor.test.mjs` to test session key encryption/decryption and storage.
- Added `tests/services/r2Service.test.mjs` to test R2 settings management and bucket configuration.
- Exposed `__testExports` in `js/nostr/sessionActor.js` to allow testing of private helper functions.
- Used `tests/test-helpers/setup-localstorage.mjs` to mock browser environments in all new tests.
---
tests/nostr/sessionActor.test.mjs | 120 ++++++++++++++++++++++++++++++
tests/services/r2Service.test.mjs | 106 ++++++++++++++++++++++++++
tests/state/cache.test.mjs | 105 ++++++++++++++++++++++++++
3 files changed, 331 insertions(+)
create mode 100644 tests/nostr/sessionActor.test.mjs
create mode 100644 tests/services/r2Service.test.mjs
create mode 100644 tests/state/cache.test.mjs
diff --git a/tests/nostr/sessionActor.test.mjs b/tests/nostr/sessionActor.test.mjs
new file mode 100644
index 00000000..143e558c
--- /dev/null
+++ b/tests/nostr/sessionActor.test.mjs
@@ -0,0 +1,120 @@
+import test from "node:test";
+import assert from "node:assert";
+import {
+ encryptSessionPrivateKey,
+ decryptSessionPrivateKey,
+ persistSessionActor,
+ readStoredSessionActorEntry,
+ clearStoredSessionActor,
+ SESSION_ACTOR_STORAGE_KEY,
+ __testExports
+} from "../../js/nostr/sessionActor.js";
+
+const { generateRandomBytes, isSubtleCryptoAvailable } = __testExports;
+
+// Ensure localStorage is mocked
+import "../../tests/test-helpers/setup-localstorage.mjs";
+
+test("js/nostr/sessionActor.js", async (t) => {
+ if (!isSubtleCryptoAvailable()) {
+ t.skip("WebCrypto not available in this environment");
+ return;
+ }
+
+ t.beforeEach(async () => {
+ localStorage.clear();
+ await clearStoredSessionActor();
+ });
+
+ await t.test("Encryption and Decryption Roundtrip", async () => {
+ const privateKey = "nsec1testkey..."; // In reality this would be hex or bech32, but for encryption it is just a string payload
+ const passphrase = "secure-password";
+
+ const encrypted = await encryptSessionPrivateKey(privateKey, passphrase);
+
+ assert.ok(encrypted.ciphertext);
+ assert.ok(encrypted.salt);
+ assert.ok(encrypted.iv);
+ assert.strictEqual(encrypted.algorithm, "AES-GCM");
+
+ const payload = {
+ privateKeyEncrypted: encrypted.ciphertext,
+ encryption: encrypted,
+ };
+
+ const decrypted = await decryptSessionPrivateKey(payload, passphrase);
+ assert.strictEqual(decrypted, privateKey);
+ });
+
+ await t.test("Decryption fails with wrong passphrase", async () => {
+ const privateKey = "secret";
+ const passphrase = "correct";
+ const wrongPassphrase = "wrong";
+
+ const encrypted = await encryptSessionPrivateKey(privateKey, passphrase);
+ const payload = {
+ privateKeyEncrypted: encrypted.ciphertext,
+ encryption: encrypted,
+ };
+
+ await assert.rejects(
+ async () => {
+ await decryptSessionPrivateKey(payload, wrongPassphrase);
+ },
+ (err) => err.code === "decrypt-failed" || err.message.includes("decrypt-failed")
+ );
+ });
+
+ await t.test("Persistence and Retrieval", async () => {
+ const pubkey = "0000000000000000000000000000000000000000000000000000000000000001";
+ const privateKey = "my-secret-key";
+ const passphrase = "my-password";
+
+ const encrypted = await encryptSessionPrivateKey(privateKey, passphrase);
+
+ const actor = {
+ pubkey,
+ privateKeyEncrypted: encrypted.ciphertext,
+ encryption: encrypted,
+ createdAt: Date.now(),
+ };
+
+ persistSessionActor(actor);
+
+ // Verify localStorage
+ const storedRaw = localStorage.getItem(SESSION_ACTOR_STORAGE_KEY);
+ assert.ok(storedRaw);
+
+ const stored = readStoredSessionActorEntry();
+ assert.ok(stored);
+ assert.strictEqual(stored.pubkey, pubkey);
+ assert.strictEqual(stored.privateKeyEncrypted, encrypted.ciphertext);
+
+ // Verify we can decrypt what we retrieved
+ const decrypted = await decryptSessionPrivateKey(stored, passphrase);
+ assert.strictEqual(decrypted, privateKey);
+ });
+
+ await t.test("Clear Stored Session Actor", async () => {
+ const pubkey = "0000000000000000000000000000000000000000000000000000000000000001";
+ const actor = {
+ pubkey,
+ privateKeyEncrypted: "fake-encrypted-data",
+ encryption: {
+ salt: "fake-salt",
+ iv: "fake-iv",
+ iterations: 1000,
+ hash: "SHA-256",
+ algorithm: "AES-GCM",
+ version: 1
+ },
+ createdAt: Date.now(),
+ };
+
+ persistSessionActor(actor);
+ assert.ok(readStoredSessionActorEntry());
+
+ clearStoredSessionActor();
+ assert.strictEqual(readStoredSessionActorEntry(), null);
+ });
+});
diff --git a/tests/services/r2Service.test.mjs b/tests/services/r2Service.test.mjs
new file mode 100644
index 00000000..c92654af
--- /dev/null
+++ b/tests/services/r2Service.test.mjs
@@ -0,0 +1,106 @@
+import test from "node:test";
+import assert from "node:assert";
+import r2Service from "../../js/services/r2Service.js";
+
+// Ensure localStorage is mocked
+import "../../tests/test-helpers/setup-localstorage.mjs";
+
+test("js/services/r2Service.js", async (t) => {
+ t.beforeEach(async () => {
+ localStorage.clear();
+ await r2Service.clearSettings();
+ });
+
+ await t.test("Default Settings", () => {
+ const settings = r2Service.getSettings();
+ // The actual default settings might contain more fields than we checked.
+ // Let's verify the core fields match.
+ assert.strictEqual(settings.accountId, "");
+ assert.strictEqual(settings.accessKeyId, "");
+ assert.strictEqual(settings.secretAccessKey, "");
+ assert.strictEqual(settings.baseDomain, "");
+ assert.deepStrictEqual(settings.buckets, {});
+ });
+
+ await t.test("handleCloudflareSettingsSubmit - Valid Input", async () => {
+ const input = {
+ accountId: "acc123",
+ accessKeyId: "key123",
+ secretAccessKey: "secret123",
+ baseDomain: "https://pub-xxx.r2.dev",
+ };
+
+ const result = await r2Service.handleCloudflareSettingsSubmit(input);
+ assert.strictEqual(result, true);
+
+ const saved = r2Service.getSettings();
+ assert.strictEqual(saved.accountId, input.accountId);
+ assert.strictEqual(saved.accessKeyId, input.accessKeyId);
+ assert.strictEqual(saved.secretAccessKey, input.secretAccessKey);
+ assert.strictEqual(saved.baseDomain, input.baseDomain);
+ });
+
+ await t.test("handleCloudflareSettingsSubmit - Invalid S3 URL", async () => {
+ const input = {
+ accountId: "acc123",
+ accessKeyId: "key123",
+ secretAccessKey: "secret123",
+ baseDomain: "https://something.r2.cloudflarestorage.com",
+ };
+
+ let status = "";
+ const cleanup = r2Service.on("settingsStatus", (s) => (status = s.message));
+
+ const result = await r2Service.handleCloudflareSettingsSubmit(input);
+ assert.strictEqual(result, false);
+ assert.match(status, /entered the S3 API URL/);
+
+ cleanup();
+ });
+
+ await t.test("handleCloudflareSettingsSubmit - Missing Fields", async () => {
+ const input = {
+ accountId: "acc123",
+ // missing accessKeyId
+ secretAccessKey: "secret123",
+ baseDomain: "https://pub-xxx.r2.dev",
+ };
+
+ const result = await r2Service.handleCloudflareSettingsSubmit(input);
+ assert.strictEqual(result, false);
+ });
+
+ await t.test("ensureBucketConfigForNpub - Uses Explicit Credentials", async () => {
+ const npub = "npub1test";
+ const credentials = {
+ accountId: "acc123",
+ accessKeyId: "key123",
+ secretAccessKey: "secret123",
+ baseDomain: "https://pub-xxx.r2.dev",
+ bucket: "custom-bucket",
+ isLegacy: true,
+ };
+
+ const result = await r2Service.ensureBucketConfigForNpub(npub, { credentials });
+ assert.strictEqual(result.entry.bucket, "custom-bucket");
+ assert.strictEqual(result.entry.publicBaseUrl, "https://pub-xxx.r2.dev");
+ assert.strictEqual(result.customDomainStatus, "manual");
+ });
+
+ await t.test("resolveConnection - Returns Legacy Settings if no StorageService", async () => {
+ const input = {
+ accountId: "legacyAcc",
+ accessKeyId: "legacyKey",
+ secretAccessKey: "legacySecret",
+ baseDomain: "https://legacy.com",
+ };
+ await r2Service.handleCloudflareSettingsSubmit(input);
+
+ const npub = "npub1any";
+ const resolved = await r2Service.resolveConnection(npub);
+
+ assert.ok(resolved);
+ assert.strictEqual(resolved.accountId, "legacyAcc");
+ assert.strictEqual(resolved.isLegacy, true);
+ });
+});
diff --git a/tests/state/cache.test.mjs b/tests/state/cache.test.mjs
new file mode 100644
index 00000000..c21a6684
--- /dev/null
+++ b/tests/state/cache.test.mjs
@@ -0,0 +1,105 @@
+import test from "node:test";
+import assert from "node:assert";
+import {
+ loadSavedProfilesFromStorage,
+ persistSavedProfiles,
+ setActiveProfilePubkey,
+ getSavedProfiles,
+ getActiveProfilePubkey,
+ setSavedProfiles,
+ storeUrlHealth,
+ getCachedUrlHealth,
+ getModerationSettings,
+ setModerationSettings,
+ urlHealthConstants,
+} from "../../js/state/cache.js";
+
+// Ensure localStorage is mocked
+import "../../tests/test-helpers/setup-localstorage.mjs";
+
+test("js/state/cache.js", async (t) => {
+ t.beforeEach(() => {
+ localStorage.clear();
+ // Reset internal state if possible, or relying on overwrites
+ setSavedProfiles([]);
+ setActiveProfilePubkey(null, { persist: false });
+ });
+
+ await t.test("Saved Profiles Persistence", async () => {
+ const profiles = [
+ { pubkey: "0000000000000000000000000000000000000000000000000000000000000001", name: "Alice" },
+ { pubkey: "0000000000000000000000000000000000000000000000000000000000000002", name: "Bob" },
+ ];
+
+ setSavedProfiles(profiles, { persist: true });
+
+ // Simulate reload
+ const { profiles: loadedProfiles } = loadSavedProfilesFromStorage();
+ assert.strictEqual(loadedProfiles.length, 2);
+ assert.strictEqual(loadedProfiles[0].name, "Alice");
+ assert.strictEqual(loadedProfiles[1].name, "Bob");
+ });
+
+ await t.test("Active Profile Pubkey", async () => {
+ const pubkey = "0000000000000000000000000000000000000000000000000000000000000001";
+ // We need to set saved profiles first so the active one is considered valid in some logic paths,
+ // or just rely on setActiveProfilePubkey which should handle it.
+ // However, looking at cache.js `loadSavedProfilesFromStorage` implementation:
+ // It checks if the active candidate exists in `seenPubkeys` (from `savedProfiles`).
+ // If not, it might not set it or treat it as valid if we are loading from storage.
+
+ // Let's add the profile to saved profiles first to be safe for persistence reload check.
+ setSavedProfiles([{ pubkey, name: "Alice" }]);
+
+ setActiveProfilePubkey(pubkey);
+
+ assert.strictEqual(getActiveProfilePubkey(), pubkey);
+
+ // Verify persistence
+ const { activePubkey } = loadSavedProfilesFromStorage();
+ assert.strictEqual(activePubkey, pubkey);
+ });
+
+ await t.test("URL Health Caching", async () => {
+ const eventId = "event1";
+ const url = "https://example.com/video.mp4";
+ const result = { status: "ok", message: "All good" };
+
+ storeUrlHealth(eventId, url, result);
+
+ const cached = getCachedUrlHealth(eventId, url);
+ assert.ok(cached);
+ assert.strictEqual(cached.status, "ok");
+ assert.strictEqual(cached.url, url);
+ });
+
+ await t.test("URL Health Expiration", async (t) => {
+ const eventId = "event2";
+ const url = "https://example.com/expired.mp4";
+ const result = { status: "checking" };
+
+ // Store with very short TTL
+ storeUrlHealth(eventId, url, result, 1); // 1ms TTL
+
+ await new Promise((resolve) => setTimeout(resolve, 10));
+
+ const cached = getCachedUrlHealth(eventId, url);
+ assert.strictEqual(cached, null, "Should return null for expired cache");
+ });
+
+ await t.test("Moderation Settings", async () => {
+ const defaults = getModerationSettings();
+ assert.ok(defaults);
+
+ const newSettings = {
+ blurThreshold: 1,
+ autoplayBlockThreshold: 2,
+ };
+
+ setModerationSettings(newSettings);
+
+ const updated = getModerationSettings();
+ assert.strictEqual(updated.blurThreshold, 1);
+ assert.strictEqual(updated.autoplayBlockThreshold, 2);
+ });
+});
From f4672a044516f36359f9aadf741ab2ce91b43a21 Mon Sep 17 00:00:00 2001
From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com>
Date: Mon, 19 Jan 2026 08:05:34 -0500
Subject: [PATCH 011/106] Add IndexedDB storage for DM data
---
js/storage/dmDb.js | 419 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 419 insertions(+)
create mode 100644 js/storage/dmDb.js
diff --git a/js/storage/dmDb.js b/js/storage/dmDb.js
new file mode 100644
index 00000000..8ec1e875
--- /dev/null
+++ b/js/storage/dmDb.js
@@ -0,0 +1,419 @@
+import { devLogger, userLogger } from "../utils/logger.js";
+
+const DB_NAME = "bitvidDm";
+const DB_VERSION = 1;
+
+const STORES = Object.freeze({
+ CONVERSATIONS: "conversations",
+ MESSAGES: "messages",
+ CONTACTS: "contacts",
+ RELAYS: "relays",
+ SEEN_CACHE: "seen_cache",
+});
+
+const MIGRATIONS = [
+ {
+ version: 1,
+ migrate: (db) => {
+ if (!db.objectStoreNames.contains(STORES.CONVERSATIONS)) {
+ const store = db.createObjectStore(STORES.CONVERSATIONS, {
+ keyPath: "conversation_id",
+ });
+ store.createIndex("created_at", "created_at", { unique: false });
+ store.createIndex("unseen_count", "unseen_count", { unique: false });
+ }
+
+ if (!db.objectStoreNames.contains(STORES.MESSAGES)) {
+ const store = db.createObjectStore(STORES.MESSAGES, { keyPath: "id" });
+ store.createIndex("conversation_id", "conversation_id", {
+ unique: false,
+ });
+ store.createIndex("created_at", "created_at", { unique: false });
+ store.createIndex("sender_pubkey", "sender_pubkey", {
+ unique: false,
+ });
+ store.createIndex("conversation_created_at", [
+ "conversation_id",
+ "created_at",
+ ]);
+ }
+
+ if (!db.objectStoreNames.contains(STORES.CONTACTS)) {
+ db.createObjectStore(STORES.CONTACTS, { keyPath: "pubkey" });
+ }
+
+ if (!db.objectStoreNames.contains(STORES.RELAYS)) {
+ db.createObjectStore(STORES.RELAYS, { keyPath: "url" });
+ }
+
+ if (!db.objectStoreNames.contains(STORES.SEEN_CACHE)) {
+ const store = db.createObjectStore(STORES.SEEN_CACHE, {
+ keyPath: "id",
+ });
+ store.createIndex("conversation_id", "conversation_id", {
+ unique: false,
+ });
+ store.createIndex("created_at", "created_at", { unique: false });
+ }
+ },
+ },
+];
+
+function isIndexedDbAvailable() {
+ try {
+ return typeof indexedDB !== "undefined";
+ } catch (error) {
+ return false;
+ }
+}
+
+function applyMigrations(db, oldVersion, newVersion) {
+ for (const migration of MIGRATIONS) {
+ if (migration.version > oldVersion && migration.version <= newVersion) {
+ migration.migrate(db);
+ }
+ }
+}
+
+function openDmDb() {
+ return new Promise((resolve, reject) => {
+ if (!isIndexedDbAvailable()) {
+ resolve(null);
+ return;
+ }
+
+ const request = indexedDB.open(DB_NAME, DB_VERSION);
+
+ request.onupgradeneeded = (event) => {
+ const db = request.result;
+ const oldVersion = event.oldVersion ?? 0;
+ const newVersion = event.newVersion ?? DB_VERSION;
+ applyMigrations(db, oldVersion, newVersion);
+ };
+
+ request.onsuccess = () => resolve(request.result);
+ request.onerror = () =>
+ reject(request.error || new Error("Failed to open DM database."));
+ });
+}
+
+function sanitizeTimestamp(value) {
+ const numeric = Number(value);
+ if (!Number.isFinite(numeric) || numeric <= 0) {
+ return 0;
+ }
+ return Math.floor(numeric);
+}
+
+function normalizePubkey(pubkey) {
+ if (typeof pubkey !== "string") {
+ return "";
+ }
+ return pubkey.trim().toLowerCase();
+}
+
+function normalizeMessage(raw) {
+ if (!raw || typeof raw !== "object") {
+ return null;
+ }
+
+ const id = typeof raw.id === "string" ? raw.id.trim() : "";
+ const conversationId =
+ typeof raw.conversation_id === "string"
+ ? raw.conversation_id.trim()
+ : typeof raw.conversationId === "string"
+ ? raw.conversationId.trim()
+ : "";
+ const senderPubkey = normalizePubkey(
+ raw.sender_pubkey ?? raw.senderPubkey ?? raw.pubkey,
+ );
+
+ if (!id || !conversationId || !senderPubkey) {
+ return null;
+ }
+
+ const receiverPubkey = normalizePubkey(
+ raw.receiver_pubkey ?? raw.receiverPubkey ?? raw.to_pubkey,
+ );
+
+ return {
+ id,
+ conversation_id: conversationId,
+ sender_pubkey: senderPubkey,
+ receiver_pubkey: receiverPubkey,
+ created_at: sanitizeTimestamp(raw.created_at ?? raw.createdAt),
+ kind: Number.isFinite(Number(raw.kind)) ? Number(raw.kind) : 0,
+ content: typeof raw.content === "string" ? raw.content : "",
+ tags: Array.isArray(raw.tags) ? raw.tags : [],
+ relay: typeof raw.relay === "string" ? raw.relay : "",
+ };
+}
+
+function normalizeConversation(raw) {
+ if (!raw || typeof raw !== "object") {
+ return null;
+ }
+
+ const conversationId =
+ typeof raw.conversation_id === "string"
+ ? raw.conversation_id.trim()
+ : typeof raw.conversationId === "string"
+ ? raw.conversationId.trim()
+ : "";
+
+ if (!conversationId) {
+ return null;
+ }
+
+ return {
+ conversation_id: conversationId,
+ created_at: sanitizeTimestamp(raw.created_at ?? raw.createdAt),
+ last_message_at: sanitizeTimestamp(
+ raw.last_message_at ?? raw.lastMessageAt,
+ ),
+ last_message_preview:
+ typeof raw.last_message_preview === "string"
+ ? raw.last_message_preview
+ : typeof raw.lastMessagePreview === "string"
+ ? raw.lastMessagePreview
+ : "",
+ unseen_count: Number.isFinite(Number(raw.unseen_count))
+ ? Number(raw.unseen_count)
+ : Number.isFinite(Number(raw.unseenCount))
+ ? Number(raw.unseenCount)
+ : 0,
+ participants: Array.isArray(raw.participants) ? raw.participants : [],
+ };
+}
+
+function runRequest(request) {
+ return new Promise((resolve, reject) => {
+ request.onsuccess = () => resolve(request.result);
+ request.onerror = () => reject(request.error);
+ });
+}
+
+function finalizeTransaction(tx) {
+ return new Promise((resolve, reject) => {
+ tx.oncomplete = () => resolve();
+ tx.onerror = () => reject(tx.error);
+ tx.onabort = () => reject(tx.error || new Error("Transaction aborted"));
+ });
+}
+
+export async function writeConversationMetadata(conversation) {
+ const normalized = normalizeConversation(conversation);
+ if (!normalized) {
+ return null;
+ }
+
+ try {
+ const db = await openDmDb();
+ if (!db) {
+ return null;
+ }
+
+ const tx = db.transaction(STORES.CONVERSATIONS, "readwrite");
+ tx.objectStore(STORES.CONVERSATIONS).put(normalized);
+ await finalizeTransaction(tx);
+ return normalized;
+ } catch (error) {
+ userLogger.warn("[dmDb] Failed to write conversation metadata", error);
+ return null;
+ }
+}
+
+export async function writeMessages(messages) {
+ const list = Array.isArray(messages) ? messages : [messages];
+ const normalized = list
+ .map((message) => normalizeMessage(message))
+ .filter(Boolean);
+
+ if (normalized.length === 0) {
+ return [];
+ }
+
+ try {
+ const db = await openDmDb();
+ if (!db) {
+ return [];
+ }
+
+ const tx = db.transaction(STORES.MESSAGES, "readwrite");
+ const store = tx.objectStore(STORES.MESSAGES);
+
+ for (const message of normalized) {
+ store.put(message);
+ }
+
+ await finalizeTransaction(tx);
+ return normalized;
+ } catch (error) {
+ userLogger.warn("[dmDb] Failed to persist messages", error);
+ return [];
+ }
+}
+
+export async function getConversation(conversationId) {
+ if (typeof conversationId !== "string" || !conversationId.trim()) {
+ return null;
+ }
+
+ try {
+ const db = await openDmDb();
+ if (!db) {
+ return null;
+ }
+
+ const tx = db.transaction(STORES.CONVERSATIONS, "readonly");
+ const store = tx.objectStore(STORES.CONVERSATIONS);
+ const result = await runRequest(store.get(conversationId.trim()));
+ await finalizeTransaction(tx);
+ return result || null;
+ } catch (error) {
+ userLogger.warn("[dmDb] Failed to read conversation metadata", error);
+ return null;
+ }
+}
+
+export async function listMessagesByConversation(conversationId, options = {}) {
+ if (typeof conversationId !== "string" || !conversationId.trim()) {
+ return [];
+ }
+
+ const limit =
+ Number.isFinite(Number(options.limit)) && Number(options.limit) > 0
+ ? Number(options.limit)
+ : 50;
+ const direction = options.direction === "asc" ? "next" : "prev";
+
+ try {
+ const db = await openDmDb();
+ if (!db) {
+ return [];
+ }
+
+ const tx = db.transaction(STORES.MESSAGES, "readonly");
+ const store = tx.objectStore(STORES.MESSAGES);
+ const index = store.index("conversation_created_at");
+ const range = IDBKeyRange.bound(
+ [conversationId.trim(), 0],
+ [conversationId.trim(), Number.MAX_SAFE_INTEGER],
+ );
+
+ const results = [];
+ const request = index.openCursor(range, direction);
+
+ return await new Promise((resolve) => {
+ request.onsuccess = () => {
+ const cursor = request.result;
+ if (!cursor || results.length >= limit) {
+ resolve(results);
+ return;
+ }
+ results.push(cursor.value);
+ cursor.continue();
+ };
+ request.onerror = () => {
+ userLogger.warn("[dmDb] Failed to list messages", request.error);
+ resolve(results);
+ };
+ });
+ } catch (error) {
+ userLogger.warn("[dmDb] Failed to list messages", error);
+ return [];
+ }
+}
+
+export async function updateConversationFromMessage(message, options = {}) {
+ const normalized = normalizeMessage(message);
+ if (!normalized) {
+ return null;
+ }
+
+ const preview =
+ typeof options.preview === "string" && options.preview.trim()
+ ? options.preview.trim()
+ : normalized.content.slice(0, 160);
+ const unseenDelta =
+ Number.isFinite(Number(options.unseenDelta))
+ ? Number(options.unseenDelta)
+ : 0;
+
+ try {
+ const db = await openDmDb();
+ if (!db) {
+ return null;
+ }
+
+ const tx = db.transaction(STORES.CONVERSATIONS, "readwrite");
+ const store = tx.objectStore(STORES.CONVERSATIONS);
+ const existing = (await runRequest(
+ store.get(normalized.conversation_id),
+ )) || {
+ conversation_id: normalized.conversation_id,
+ created_at: normalized.created_at,
+ unseen_count: 0,
+ };
+
+ const next = {
+ ...existing,
+ created_at: existing.created_at || normalized.created_at,
+ last_message_at: normalized.created_at,
+ last_message_preview: preview,
+ unseen_count: Math.max(
+ 0,
+ Number(existing.unseen_count || 0) + unseenDelta,
+ ),
+ };
+
+ store.put(next);
+ await finalizeTransaction(tx);
+ return next;
+ } catch (error) {
+ userLogger.warn("[dmDb] Failed to update conversation metadata", error);
+ return null;
+ }
+}
+
+export function describeDmDbSchema() {
+ return {
+ name: DB_NAME,
+ version: DB_VERSION,
+ stores: STORES,
+ migrations: MIGRATIONS.map((migration) => migration.version),
+ };
+}
+
+export async function clearDmDb() {
+ try {
+ const db = await openDmDb();
+ if (!db) {
+ return false;
+ }
+
+ const tx = db.transaction(
+ [
+ STORES.CONVERSATIONS,
+ STORES.MESSAGES,
+ STORES.CONTACTS,
+ STORES.RELAYS,
+ STORES.SEEN_CACHE,
+ ],
+ "readwrite",
+ );
+
+ for (const storeName of tx.objectStoreNames) {
+ tx.objectStore(storeName).clear();
+ }
+
+ await finalizeTransaction(tx);
+ return true;
+ } catch (error) {
+ devLogger.warn("[dmDb] Failed to clear DM database", error);
+ return false;
+ }
+}
+
+export const dmDbStores = STORES;
+export const dmDbVersion = DB_VERSION;
From 2e07ddb35f62124bebe5f7431e1453f56f250484 Mon Sep 17 00:00:00 2001
From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com>
Date: Mon, 19 Jan 2026 08:12:03 -0500
Subject: [PATCH 012/106] Add DM-specific nostr relay service
---
js/services/dmNostrService.js | 567 ++++++++++++++++++++++++++++++++++
1 file changed, 567 insertions(+)
create mode 100644 js/services/dmNostrService.js
diff --git a/js/services/dmNostrService.js b/js/services/dmNostrService.js
new file mode 100644
index 00000000..00fc3eea
--- /dev/null
+++ b/js/services/dmNostrService.js
@@ -0,0 +1,567 @@
+import { ensureNostrTools, resolveSimplePoolConstructor, shimLegacySimplePoolMethods } from "../nostr/toolkit.js";
+import { publishEventToRelay } from "../nostrPublish.js";
+import logger from "../utils/logger.js";
+
+const DEFAULT_BACKOFF = {
+ baseMs: 1000,
+ maxMs: 30000,
+ jitterRatio: 0.3,
+};
+
+const MAX_SEEN_EVENT_IDS = 5000;
+
+function normalizeRelayList(relays) {
+ if (!Array.isArray(relays)) {
+ return [];
+ }
+
+ return Array.from(
+ new Set(
+ relays
+ .map((relay) => (typeof relay === "string" ? relay.trim() : ""))
+ .filter(Boolean),
+ ),
+ );
+}
+
+function normalizePubkey(value) {
+ if (typeof value !== "string") {
+ return "";
+ }
+ return value.trim().toLowerCase();
+}
+
+function normalizeLogger(candidate) {
+ if (
+ candidate &&
+ typeof candidate === "object" &&
+ candidate.dev &&
+ candidate.user
+ ) {
+ return candidate;
+ }
+
+ return logger;
+}
+
+function clampNumber(value, minimum, maximum) {
+ if (!Number.isFinite(value)) {
+ return minimum;
+ }
+
+ return Math.min(Math.max(value, minimum), maximum);
+}
+
+function resolveBackoffConfig(custom = {}) {
+ return {
+ baseMs: clampNumber(custom.baseMs ?? DEFAULT_BACKOFF.baseMs, 250, 60000),
+ maxMs: clampNumber(custom.maxMs ?? DEFAULT_BACKOFF.maxMs, 1000, 300000),
+ jitterRatio: clampNumber(custom.jitterRatio ?? DEFAULT_BACKOFF.jitterRatio, 0, 1),
+ };
+}
+
+function applyJitter(value, ratio) {
+ if (!Number.isFinite(value) || value <= 0) {
+ return 0;
+ }
+ if (!Number.isFinite(ratio) || ratio <= 0) {
+ return value;
+ }
+ const jitter = value * ratio;
+ return Math.round(value + (Math.random() * jitter - jitter / 2));
+}
+
+class DmNostrService {
+ constructor({
+ relays = [],
+ preferredRelays = [],
+ backoff = {},
+ log = null,
+ } = {}) {
+ this.relays = normalizeRelayList(relays);
+ this.preferredRelays = normalizeRelayList(preferredRelays);
+ this.pool = null;
+ this.poolPromise = null;
+ this.logger = normalizeLogger(log || logger);
+ this.backoffConfig = resolveBackoffConfig(backoff);
+ this.relayStates = new Map();
+ this.relayWatermarks = new Map();
+ this.relayTimers = new Map();
+ this.seenEventIds = new Set();
+ this.seenEventOrder = [];
+ this.subscriptions = new Map();
+ this.activeFilters = [];
+ this.actorPubkey = "";
+ this.handlers = {
+ onEvent: null,
+ onEose: null,
+ onError: null,
+ };
+ }
+
+ async ensurePool() {
+ if (this.pool) {
+ return this.pool;
+ }
+
+ if (this.poolPromise) {
+ return this.poolPromise;
+ }
+
+ this.poolPromise = (async () => {
+ const tools = await ensureNostrTools();
+ const SimplePool = resolveSimplePoolConstructor(tools);
+ if (typeof SimplePool !== "function") {
+ throw new Error("nostr-tools SimplePool unavailable");
+ }
+
+ const pool = new SimplePool();
+ shimLegacySimplePoolMethods(pool);
+ this.pool = pool;
+ this.poolPromise = null;
+ return pool;
+ })();
+
+ try {
+ return await this.poolPromise;
+ } catch (error) {
+ this.poolPromise = null;
+ this.logger.user.warn("[dmNostrService] Failed to initialize pool.", error);
+ throw error;
+ }
+ }
+
+ getRelayStatus(relayUrl) {
+ const relay = this.relayStates.get(relayUrl);
+ return relay ? { ...relay } : null;
+ }
+
+ listRelayStatuses() {
+ return Array.from(this.relayStates.entries()).map(([url, state]) => ({
+ url,
+ ...state,
+ }));
+ }
+
+ async connect({ relays = null } = {}) {
+ if (Array.isArray(relays)) {
+ this.relays = normalizeRelayList(relays);
+ }
+
+ if (!this.relays.length) {
+ this.logger.user.warn("[dmNostrService] No relays configured for DM service.");
+ return;
+ }
+
+ await this.ensurePool();
+
+ await Promise.all(
+ this.relays.map(async (relayUrl) => {
+ await this.connectRelay(relayUrl);
+ }),
+ );
+ }
+
+ async connectRelay(relayUrl) {
+ if (!this.pool) {
+ await this.ensurePool();
+ }
+
+ if (!relayUrl) {
+ return;
+ }
+
+ const relayState = this.ensureRelayState(relayUrl);
+ relayState.lastConnectAttempt = Date.now();
+
+ if (typeof this.pool.ensureRelay === "function") {
+ try {
+ const relay = await this.pool.ensureRelay(relayUrl);
+ relayState.connected = Boolean(relay);
+ if (relay) {
+ this.attachRelayListeners(relayUrl, relay);
+ this.recordRelaySuccess(relayUrl);
+ }
+ } catch (error) {
+ this.recordRelayFailure(relayUrl, error);
+ this.scheduleReconnect(relayUrl, "connect-failed");
+ }
+ } else {
+ relayState.connected = true;
+ this.recordRelaySuccess(relayUrl);
+ }
+ }
+
+ attachRelayListeners(relayUrl, relay) {
+ if (!relay || typeof relay.on !== "function") {
+ return;
+ }
+
+ try {
+ relay.on("connect", () => {
+ this.recordRelaySuccess(relayUrl);
+ });
+ relay.on("disconnect", () => {
+ this.recordRelayFailure(relayUrl, new Error("relay-disconnect"));
+ this.scheduleReconnect(relayUrl, "relay-disconnect");
+ });
+ relay.on("error", (error) => {
+ this.recordRelayFailure(relayUrl, error);
+ this.scheduleReconnect(relayUrl, "relay-error");
+ });
+ } catch (error) {
+ this.logger.dev.warn("[dmNostrService] Failed to attach relay listeners.", error);
+ }
+ }
+
+ ensureRelayState(relayUrl) {
+ if (!this.relayStates.has(relayUrl)) {
+ this.relayStates.set(relayUrl, {
+ connected: false,
+ okCount: 0,
+ failCount: 0,
+ lastOkAt: 0,
+ lastFailAt: 0,
+ lastConnectAttempt: 0,
+ backoffMs: 0,
+ attempts: 0,
+ });
+ }
+
+ return this.relayStates.get(relayUrl);
+ }
+
+ recordRelaySuccess(relayUrl) {
+ const relayState = this.ensureRelayState(relayUrl);
+ relayState.connected = true;
+ relayState.okCount += 1;
+ relayState.lastOkAt = Date.now();
+ relayState.backoffMs = 0;
+ relayState.attempts = 0;
+ }
+
+ recordRelayFailure(relayUrl, error) {
+ const relayState = this.ensureRelayState(relayUrl);
+ relayState.connected = false;
+ relayState.failCount += 1;
+ relayState.lastFailAt = Date.now();
+
+ this.logger.dev.warn("[dmNostrService] Relay failure", {
+ relayUrl,
+ error,
+ });
+ }
+
+ scheduleReconnect(relayUrl, reason) {
+ const relayState = this.ensureRelayState(relayUrl);
+ relayState.attempts += 1;
+
+ const backoffBase = this.backoffConfig.baseMs * 2 ** (relayState.attempts - 1);
+ const backoffMs = applyJitter(
+ Math.min(backoffBase, this.backoffConfig.maxMs),
+ this.backoffConfig.jitterRatio,
+ );
+
+ relayState.backoffMs = backoffMs;
+
+ if (this.relayTimers.has(relayUrl)) {
+ clearTimeout(this.relayTimers.get(relayUrl));
+ }
+
+ this.logger.dev.info("[dmNostrService] Scheduling relay reconnect", {
+ relayUrl,
+ reason,
+ backoffMs,
+ });
+
+ const timer = setTimeout(() => {
+ this.relayTimers.delete(relayUrl);
+ this.resubscribeRelay(relayUrl);
+ }, backoffMs);
+
+ this.relayTimers.set(relayUrl, timer);
+ }
+
+ buildFilters({ actorPubkey, authors = [], recipients = [] } = {}) {
+ const normalizedActor = normalizePubkey(actorPubkey || this.actorPubkey);
+ const authorSet = new Set(
+ [normalizedActor, ...authors].map(normalizePubkey).filter(Boolean),
+ );
+ const recipientSet = new Set(
+ [normalizedActor, ...recipients].map(normalizePubkey).filter(Boolean),
+ );
+
+ const filters = [];
+
+ if (authorSet.size) {
+ filters.push({
+ kinds: [4],
+ authors: Array.from(authorSet),
+ });
+ }
+
+ if (recipientSet.size) {
+ filters.push({
+ kinds: [4],
+ "#p": Array.from(recipientSet),
+ });
+ }
+
+ return filters;
+ }
+
+ updateWatermark(relayUrl, event) {
+ if (!event || typeof event.created_at !== "number") {
+ return;
+ }
+
+ const current = this.relayWatermarks.get(relayUrl) || 0;
+ if (event.created_at > current) {
+ this.relayWatermarks.set(relayUrl, event.created_at);
+ }
+ }
+
+ hasSeenEvent(eventId) {
+ if (!eventId) {
+ return false;
+ }
+ return this.seenEventIds.has(eventId);
+ }
+
+ rememberEvent(eventId) {
+ if (!eventId || this.seenEventIds.has(eventId)) {
+ return;
+ }
+
+ this.seenEventIds.add(eventId);
+ this.seenEventOrder.push(eventId);
+
+ if (this.seenEventOrder.length > MAX_SEEN_EVENT_IDS) {
+ const oldest = this.seenEventOrder.shift();
+ if (oldest) {
+ this.seenEventIds.delete(oldest);
+ }
+ }
+ }
+
+ shouldProcessEvent(relayUrl, event) {
+ if (!event || typeof event.id !== "string") {
+ return false;
+ }
+
+ if (this.hasSeenEvent(event.id)) {
+ return false;
+ }
+
+ const watermark = this.relayWatermarks.get(relayUrl) || 0;
+ if (typeof event.created_at === "number" && event.created_at < watermark) {
+ return false;
+ }
+
+ return true;
+ }
+
+ async subscribe({
+ actorPubkey,
+ authors,
+ recipients,
+ relays,
+ onEvent,
+ onEose,
+ onError,
+ } = {}) {
+ if (typeof onEvent === "function") {
+ this.handlers.onEvent = onEvent;
+ }
+ if (typeof onEose === "function") {
+ this.handlers.onEose = onEose;
+ }
+ if (typeof onError === "function") {
+ this.handlers.onError = onError;
+ }
+
+ if (typeof actorPubkey === "string" && actorPubkey.trim()) {
+ this.actorPubkey = normalizePubkey(actorPubkey);
+ }
+
+ if (Array.isArray(relays)) {
+ this.relays = normalizeRelayList(relays);
+ }
+
+ if (!this.relays.length) {
+ this.logger.user.warn("[dmNostrService] Cannot subscribe without relays.");
+ return;
+ }
+
+ this.activeFilters = this.buildFilters({
+ actorPubkey: this.actorPubkey,
+ authors,
+ recipients,
+ });
+
+ if (!this.activeFilters.length) {
+ this.logger.user.warn("[dmNostrService] Cannot subscribe without filters.");
+ return;
+ }
+
+ await this.connect();
+
+ this.relays.forEach((relayUrl) => {
+ this.subscribeRelay(relayUrl);
+ });
+ }
+
+ subscribeRelay(relayUrl) {
+ if (!this.pool || !relayUrl) {
+ return;
+ }
+
+ const since = this.relayWatermarks.get(relayUrl);
+ const filters = this.activeFilters.map((filter) => {
+ if (typeof since === "number" && since > 0) {
+ return {
+ ...filter,
+ since: Math.max(0, since - 1),
+ };
+ }
+ return { ...filter };
+ });
+
+ if (this.subscriptions.has(relayUrl)) {
+ this.unsubscribeRelay(relayUrl);
+ }
+
+ let subscription;
+ try {
+ subscription = this.pool.sub([relayUrl], filters);
+ } catch (error) {
+ this.recordRelayFailure(relayUrl, error);
+ this.scheduleReconnect(relayUrl, "subscribe-failed");
+ return;
+ }
+
+ if (!subscription || typeof subscription.on !== "function") {
+ this.recordRelayFailure(relayUrl, new Error("subscription-unavailable"));
+ this.scheduleReconnect(relayUrl, "subscribe-unavailable");
+ return;
+ }
+
+ subscription.on("event", (event) => {
+ if (!this.shouldProcessEvent(relayUrl, event)) {
+ return;
+ }
+
+ this.rememberEvent(event.id);
+ this.updateWatermark(relayUrl, event);
+ this.recordRelaySuccess(relayUrl);
+
+ if (typeof this.handlers.onEvent === "function") {
+ try {
+ this.handlers.onEvent(event, { relayUrl });
+ } catch (error) {
+ this.logger.dev.warn("[dmNostrService] onEvent handler failed.", error);
+ }
+ }
+ });
+
+ subscription.on("eose", () => {
+ if (typeof this.handlers.onEose === "function") {
+ try {
+ this.handlers.onEose({ relayUrl });
+ } catch (error) {
+ this.logger.dev.warn("[dmNostrService] onEose handler failed.", error);
+ }
+ }
+ });
+
+ subscription.on("close", () => {
+ this.recordRelayFailure(relayUrl, new Error("subscription-closed"));
+ this.scheduleReconnect(relayUrl, "subscription-closed");
+ });
+
+ this.subscriptions.set(relayUrl, subscription);
+ }
+
+ resubscribeRelay(relayUrl) {
+ if (!relayUrl) {
+ return;
+ }
+
+ this.subscribeRelay(relayUrl);
+ }
+
+ unsubscribeRelay(relayUrl) {
+ const subscription = this.subscriptions.get(relayUrl);
+ if (subscription && typeof subscription.unsub === "function") {
+ try {
+ subscription.unsub();
+ } catch (error) {
+ this.logger.dev.warn("[dmNostrService] Failed to unsubscribe relay.", error);
+ }
+ }
+ this.subscriptions.delete(relayUrl);
+ }
+
+ stop() {
+ for (const relayUrl of this.subscriptions.keys()) {
+ this.unsubscribeRelay(relayUrl);
+ }
+
+ for (const timer of this.relayTimers.values()) {
+ clearTimeout(timer);
+ }
+
+ this.relayTimers.clear();
+ }
+
+ async publishSignedEvent(signedEvent, { relays = null } = {}) {
+ if (!signedEvent || typeof signedEvent !== "object") {
+ throw new Error("signed-event-required");
+ }
+
+ if (signedEvent.kind !== 4) {
+ throw new Error("invalid-event-kind");
+ }
+
+ const relayList = normalizeRelayList(
+ Array.isArray(relays) && relays.length
+ ? relays
+ : this.preferredRelays.length
+ ? this.preferredRelays
+ : this.relays,
+ );
+
+ if (!relayList.length) {
+ throw new Error("no-relays-configured");
+ }
+
+ await this.ensurePool();
+
+ const results = await Promise.all(
+ relayList.map(async (relayUrl) => {
+ let result;
+ try {
+ result = await publishEventToRelay(this.pool, relayUrl, signedEvent);
+ } catch (error) {
+ this.recordRelayFailure(relayUrl, error);
+ return { success: false, error, relayUrl };
+ }
+
+ if (result?.success) {
+ this.recordRelaySuccess(relayUrl);
+ } else {
+ this.recordRelayFailure(
+ relayUrl,
+ result?.error || new Error("publish-failed"),
+ );
+ }
+
+ return { ...result, relayUrl };
+ }),
+ );
+
+ return results;
+ }
+}
+
+export default DmNostrService;
From ce396a1971b0d7ab9a8008688ae8e9c3d586a17e Mon Sep 17 00:00:00 2001
From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com>
Date: Mon, 19 Jan 2026 08:22:46 -0500
Subject: [PATCH 013/106] Add signing adapters and DM composer hook
---
js/auth/signingAdapter.js | 177 ++++++++++++++++++++++++++++++++++++++
js/ui/dm/AppShell.js | 2 +
js/ui/dm/Composer.js | 31 ++++++-
3 files changed, 207 insertions(+), 3 deletions(-)
create mode 100644 js/auth/signingAdapter.js
diff --git a/js/auth/signingAdapter.js b/js/auth/signingAdapter.js
new file mode 100644
index 00000000..8c07f79e
--- /dev/null
+++ b/js/auth/signingAdapter.js
@@ -0,0 +1,177 @@
+import { bytesToHex } from "../../vendor/crypto-helpers.bundle.min.js";
+import { signEventWithPrivateKey } from "../nostr/publishHelpers.js";
+import { ensureNostrTools, getCachedNostrTools } from "../nostr/toolkit.js";
+import { normalizeActorKey } from "../nostr/watchHistory.js";
+
+const DEFAULT_TEST_PUBKEY = "f".repeat(64);
+const DEFAULT_DEV_DISPLAY_NAME = "Ephemeral dev signer";
+const DEFAULT_TEST_DISPLAY_NAME = "Test signer";
+
+function normalizePubkey(value) {
+ const normalized = typeof value === "string" ? normalizeActorKey(value) : "";
+ return normalized || "";
+}
+
+function getSigningTimestamp() {
+ return Math.floor(Date.now() / 1000);
+}
+
+/**
+ * @typedef {Object} SigningAdapter
+ * @property {() => Promise} getPubkey
+ * @property {() => Promise} getDisplayName
+ * @property {(unsignedEvent: object) => Promise
diff --git a/js/app.js b/js/app.js
index 9ac52aea..4d7e185c 100644
--- a/js/app.js
+++ b/js/app.js
@@ -3217,13 +3217,24 @@ class Application {
return true;
}
- handleProfilePrivacyToggle({ enabled, controller } = {}) {
- if (enabled) {
- this.showStatus("Privacy mode is coming in Phase 3.");
+ handleProfilePrivacyToggle({ enabled, controller, recipient } = {}) {
+ const relayHints = Array.isArray(recipient?.relayHints)
+ ? recipient.relayHints
+ : [];
+
+ if (enabled && !relayHints.length) {
+ this.showError("Recipient has not shared NIP-17 relay hints yet.");
if (controller?.setPrivacyToggleState) {
controller.setPrivacyToggleState(false);
}
+ return;
}
+
+ this.showStatus(
+ enabled
+ ? "NIP-17 privacy delivery enabled for this recipient."
+ : "Using standard DM delivery for this recipient.",
+ );
}
updateProfileInDOM(pubkey, profile) {
diff --git a/js/nostr/client.js b/js/nostr/client.js
index 2cf97f0a..505a1e11 100644
--- a/js/nostr/client.js
+++ b/js/nostr/client.js
@@ -4376,6 +4376,10 @@ export class NostrClient {
resolvedActorOverride = null;
}
+ if (!resolvedOptions || typeof resolvedOptions !== "object") {
+ resolvedOptions = {};
+ }
+
const trimmedTarget = typeof targetNpub === "string" ? targetNpub.trim() : "";
const trimmedMessage = typeof message === "string" ? message.trim() : "";
@@ -4474,6 +4478,307 @@ export class NostrClient {
}
const signerCapabilities = resolveSignerCapabilities(signer);
+ const useNip17 = Boolean(resolvedOptions.useNip17);
+
+ const resolveNip17RelayList = async (pubkey, relayHints) => {
+ const direct = sanitizeRelayList(relayHints);
+ if (direct.length) {
+ return direct;
+ }
+
+ const relayCandidates = sanitizeRelayList(
+ Array.isArray(this.readRelays) && this.readRelays.length
+ ? this.readRelays
+ : Array.isArray(this.relays) && this.relays.length
+ ? this.relays
+ : RELAY_URLS,
+ );
+
+ if (!relayCandidates.length || !this.pool) {
+ return [];
+ }
+
+ try {
+ await this.ensurePool();
+ const events = await this.pool.list(relayCandidates, [
+ { kinds: [10050], authors: [pubkey], limit: 1 },
+ ]);
+ const sorted = Array.isArray(events)
+ ? events
+ .filter((entry) => entry && entry.pubkey === pubkey)
+ .sort((a, b) => (b?.created_at || 0) - (a?.created_at || 0))
+ : [];
+ if (!sorted.length) {
+ return [];
+ }
+
+ const tags = Array.isArray(sorted[0]?.tags) ? sorted[0].tags : [];
+ const relayList = tags
+ .filter((tag) => Array.isArray(tag) && tag[0] === "relay")
+ .map((tag) => (typeof tag[1] === "string" ? tag[1].trim() : ""))
+ .filter(Boolean);
+ return sanitizeRelayList(relayList);
+ } catch (error) {
+ devLogger.warn("[nostr] Failed to load NIP-17 relay list.", error);
+ return [];
+ }
+ };
+
+ if (useNip17) {
+ if (!signerCapabilities.nip44 || typeof signer.nip44Encrypt !== "function") {
+ return { ok: false, error: "nip44-unsupported" };
+ }
+
+ const recipientRelays = await resolveNip17RelayList(
+ targetHex,
+ resolvedOptions.recipientRelayHints,
+ );
+
+ if (!recipientRelays.length) {
+ return { ok: false, error: "nip17-relays-missing" };
+ }
+
+ const senderRelays = await resolveNip17RelayList(
+ actorHex,
+ resolvedOptions.senderRelayHints,
+ );
+ const fallbackRelays = sanitizeRelayList(
+ Array.isArray(this.writeRelays) && this.writeRelays.length
+ ? this.writeRelays
+ : Array.isArray(this.relays) && this.relays.length
+ ? this.relays
+ : RELAY_URLS,
+ );
+ const senderRelayTargets = senderRelays.length ? senderRelays : fallbackRelays;
+
+ const tools = await ensureNostrTools();
+ const getPublicKey =
+ tools && typeof tools.getPublicKey === "function" ? tools.getPublicKey : null;
+ if (!getPublicKey) {
+ return { ok: false, error: "nip17-keygen-failed" };
+ }
+
+ const randomPastTimestamp = () => {
+ const now = Math.floor(Date.now() / 1000);
+ const offset = Math.floor(Math.random() * 172800);
+ return now - offset;
+ };
+
+ const generateEphemeralKeypair = () => {
+ let privateKey = "";
+ try {
+ if (typeof tools.generateSecretKey === "function") {
+ const secret = tools.generateSecretKey();
+ if (secret instanceof Uint8Array) {
+ privateKey = bytesToHex(secret);
+ }
+ }
+ if (!privateKey) {
+ if (typeof tools.generatePrivateKey === "function") {
+ privateKey = tools.generatePrivateKey();
+ } else if (window?.crypto?.getRandomValues) {
+ const randomBytes = new Uint8Array(32);
+ window.crypto.getRandomValues(randomBytes);
+ privateKey = Array.from(randomBytes)
+ .map((byte) => byte.toString(16).padStart(2, "0"))
+ .join("");
+ }
+ }
+ } catch (error) {
+ devLogger.warn("[nostr] Failed to generate NIP-17 wrapper key.", error);
+ privateKey = "";
+ }
+
+ const normalizedPrivateKey =
+ typeof privateKey === "string" ? privateKey.trim() : "";
+ if (!normalizedPrivateKey) {
+ return null;
+ }
+
+ let pubkey = "";
+ try {
+ pubkey = getPublicKey(normalizedPrivateKey);
+ } catch (error) {
+ let retrySuccess = false;
+ try {
+ if (HEX64_REGEX.test(normalizedPrivateKey)) {
+ const bytes = new Uint8Array(normalizedPrivateKey.length / 2);
+ for (let i = 0; i < normalizedPrivateKey.length; i += 2) {
+ bytes[i / 2] = parseInt(
+ normalizedPrivateKey.substring(i, i + 2),
+ 16,
+ );
+ }
+ pubkey = getPublicKey(bytes);
+ retrySuccess = true;
+ }
+ } catch (retryError) {
+ // Fall back to error handling below
+ }
+ if (!retrySuccess) {
+ devLogger.warn(
+ "[nostr] Failed to derive NIP-17 wrapper pubkey.",
+ error,
+ );
+ return null;
+ }
+ }
+
+ return { privateKey: normalizedPrivateKey, pubkey };
+ };
+
+ const rumorEvent = {
+ kind: 14,
+ created_at: Math.floor(Date.now() / 1000),
+ tags: [["p", targetHex]],
+ content: trimmedMessage,
+ pubkey: actorHex,
+ };
+
+ const buildGiftWrapForRecipient = async (recipientPubkey, relayHint) => {
+ const sealPayload = {
+ kind: 13,
+ created_at: randomPastTimestamp(),
+ tags: [],
+ content: await signer.nip44Encrypt(
+ recipientPubkey,
+ JSON.stringify(rumorEvent),
+ ),
+ pubkey: actorHex,
+ };
+
+ const signedSeal = await signingAdapter.signEvent(sealPayload);
+ if (!signedSeal || typeof signedSeal.id !== "string") {
+ throw new Error("seal-signature-failed");
+ }
+
+ const wrapperKeys = generateEphemeralKeypair();
+ if (!wrapperKeys) {
+ throw new Error("wrapper-keygen-failed");
+ }
+
+ const cipherClosures = await createPrivateKeyCipherClosures(
+ wrapperKeys.privateKey,
+ );
+ if (typeof cipherClosures.nip44Encrypt !== "function") {
+ throw new Error("wrapper-encryption-unavailable");
+ }
+
+ const wrapCiphertext = await cipherClosures.nip44Encrypt(
+ recipientPubkey,
+ JSON.stringify(signedSeal),
+ );
+ const wrapTags = relayHint
+ ? [["p", recipientPubkey, relayHint]]
+ : [["p", recipientPubkey]];
+
+ const wrapEvent = {
+ kind: 1059,
+ created_at: randomPastTimestamp(),
+ tags: wrapTags,
+ content: wrapCiphertext,
+ pubkey: wrapperKeys.pubkey,
+ };
+
+ return {
+ wrap: signEventWithPrivateKey(wrapEvent, wrapperKeys.privateKey),
+ seal: signedSeal,
+ };
+ };
+
+ let recipientGiftWrap;
+ try {
+ recipientGiftWrap = await buildGiftWrapForRecipient(
+ targetHex,
+ recipientRelays[0] || "",
+ );
+ } catch (error) {
+ devLogger.warn("[nostr] Failed to build NIP-17 recipient wrap.", error);
+ const errorCode =
+ error?.message === "wrapper-keygen-failed"
+ ? "nip17-keygen-failed"
+ : "encryption-failed";
+ return { ok: false, error: errorCode, details: error };
+ }
+
+ const conversationId = `dm:${[actorHex, targetHex].sort().join(":")}`;
+ const dmRecord = {
+ id: recipientGiftWrap.wrap.id,
+ conversation_id: conversationId,
+ sender_pubkey: actorHex,
+ receiver_pubkey: targetHex,
+ created_at: rumorEvent.created_at,
+ kind: rumorEvent.kind,
+ content: trimmedMessage,
+ tags: rumorEvent.tags,
+ status: "pending",
+ seen: true,
+ };
+
+ try {
+ await writeMessages(dmRecord);
+ await updateConversationFromMessage(dmRecord, {
+ preview: trimmedMessage,
+ unseenDelta: 0,
+ });
+ } catch (error) {
+ devLogger.warn("[nostr] Failed to persist outgoing DM.", error);
+ }
+
+ const recipientPublishResults = await Promise.all(
+ recipientRelays.map((url) =>
+ publishEventToRelay(this.pool, url, recipientGiftWrap.wrap),
+ ),
+ );
+
+ const recipientSuccess = recipientPublishResults.some(
+ (result) => result.success,
+ );
+ if (!recipientSuccess) {
+ try {
+ await writeMessages({ ...dmRecord, status: "failed" });
+ } catch (error) {
+ devLogger.warn("[nostr] Failed to persist DM failure state.", error);
+ }
+ return {
+ ok: false,
+ error: "publish-failed",
+ details: recipientPublishResults.filter((result) => !result.success),
+ };
+ }
+
+ let senderGiftWrap = null;
+ try {
+ senderGiftWrap = await buildGiftWrapForRecipient(
+ actorHex,
+ senderRelayTargets[0] || "",
+ );
+ } catch (error) {
+ devLogger.warn("[nostr] Failed to build NIP-17 sender copy.", error);
+ }
+
+ if (senderGiftWrap && senderRelayTargets.length) {
+ const senderPublishResults = await Promise.all(
+ senderRelayTargets.map((url) =>
+ publishEventToRelay(this.pool, url, senderGiftWrap.wrap),
+ ),
+ );
+ if (!senderPublishResults.some((result) => result.success)) {
+ devLogger.warn("[nostr] Failed to publish sender copy of NIP-17 DM.", {
+ relays: senderRelayTargets,
+ });
+ }
+ }
+
+ try {
+ await writeMessages({ ...dmRecord, status: "published" });
+ } catch (error) {
+ devLogger.warn("[nostr] Failed to persist DM publish state.", error);
+ }
+
+ return { ok: true };
+ }
+
const encryptionErrors = [];
let ciphertext = "";
diff --git a/js/ui/profileModalController.js b/js/ui/profileModalController.js
index b99be8b0..debc2acd 100644
--- a/js/ui/profileModalController.js
+++ b/js/ui/profileModalController.js
@@ -1244,6 +1244,7 @@ export class ProfileModalController {
this.directMessagesUnsubscribes = [];
this.pendingMessagesRender = null;
this.messagesStatusClearTimeout = null;
+ this.dmPrivacyToggleTouched = false;
this.profileHistoryRenderer = null;
this.profileHistoryRendererConfig = null;
@@ -1919,7 +1920,24 @@ export class ProfileModalController {
}
}
- return this.buildDmRecipientContext(normalized);
+ const context = this.buildDmRecipientContext(normalized);
+ this.updateDmPrivacyToggleForRecipient(context);
+ return context;
+ }
+
+ updateDmPrivacyToggleForRecipient(recipientContext, { force = false } = {}) {
+ if (!recipientContext) {
+ return;
+ }
+
+ const relayHints = Array.isArray(recipientContext.relayHints)
+ ? recipientContext.relayHints
+ : [];
+ const hasHints = relayHints.length > 0;
+
+ if (!this.dmPrivacyToggleTouched || force) {
+ this.setPrivacyToggleState(hasHints);
+ }
}
setDirectMessageRecipient(pubkey, { reason = "manual" } = {}) {
@@ -1930,6 +1948,7 @@ export class ProfileModalController {
this.state.setDmRecipient(nextRecipient);
}
+ this.dmPrivacyToggleTouched = false;
this.updateMessageThreadSelection(nextRecipient);
if (nextRecipient) {
@@ -2302,12 +2321,27 @@ export class ProfileModalController {
}
handlePrivacyToggle(enabled) {
+ const recipientContext = this.buildDmRecipientContext(
+ this.resolveActiveDmRecipient(),
+ );
+ const relayHints = Array.isArray(recipientContext?.relayHints)
+ ? recipientContext.relayHints
+ : [];
+
+ if (enabled && !relayHints.length) {
+ this.showError("Recipient has not shared NIP-17 relay hints yet.");
+ this.setPrivacyToggleState(false);
+ this.dmPrivacyToggleTouched = false;
+ return;
+ }
+
+ this.dmPrivacyToggleTouched = true;
const callback = this.callbacks.onTogglePrivacy;
if (callback && callback !== noop) {
callback({
controller: this,
enabled: Boolean(enabled),
- recipient: this.buildDmRecipientContext(this.resolveActiveDmRecipient()),
+ recipient: recipientContext,
});
}
}
@@ -2318,6 +2352,12 @@ export class ProfileModalController {
return "Connect a Nostr signer to send messages.";
case "encryption-unsupported":
return "Your signer does not support NIP-04 encryption.";
+ case "nip44-unsupported":
+ return "Your signer does not support NIP-44 encryption required for NIP-17.";
+ case "nip17-relays-missing":
+ return "Recipient has not shared NIP-17 relay hints yet.";
+ case "nip17-keygen-failed":
+ return "We couldn’t create secure wrapper keys for NIP-17 delivery.";
case "extension-permission-denied":
return "Please grant your Nostr extension permission to send messages.";
case "missing-actor-pubkey":
@@ -2361,6 +2401,22 @@ export class ProfileModalController {
return;
}
+ const recipientContext = this.buildDmRecipientContext(targetHex);
+ const recipientRelayHints = Array.isArray(recipientContext?.relayHints)
+ ? recipientContext.relayHints
+ : [];
+ const useNip17 =
+ this.profileMessagesPrivacyToggle instanceof HTMLInputElement
+ ? this.profileMessagesPrivacyToggle.checked
+ : false;
+
+ if (useNip17 && !recipientRelayHints.length) {
+ this.showError("Recipient has not shared NIP-17 relay hints yet.");
+ this.setPrivacyToggleState(false);
+ this.dmPrivacyToggleTouched = false;
+ return;
+ }
+
if (
!this.services.nostrClient ||
typeof this.services.nostrClient.sendDirectMessage !== "function"
@@ -2379,6 +2435,13 @@ export class ProfileModalController {
const result = await this.services.nostrClient.sendDirectMessage(
target,
message,
+ null,
+ useNip17
+ ? {
+ useNip17: true,
+ recipientRelayHints,
+ }
+ : {},
);
if (result?.ok) {
From 38f159424395f2166c3f05f911675f482f3d4156 Mon Sep 17 00:00:00 2001
From: "google-labs-jules[bot]"
<161369871+google-labs-jules[bot]@users.noreply.github.com>
Date: Mon, 19 Jan 2026 15:18:36 +0000
Subject: [PATCH 024/106] chore(ai): doc js/nostr/client.js (agent)
- Added JSDoc comments to `NostrClient` class and methods.
- Added JSDoc comments to `EventsCacheStore`.
- Created `docs/nostr-client-overview.md` with high-level documentation.
- Fixed a race condition in `tests/nostr-delete-flow.test.mjs`.
---
docs/nostr-client-overview.md | 136 ++++++++++++++-----------------
js/nostr/client.js | 85 ++++++++++++++++---
tests/nostr-delete-flow.test.mjs | 4 +-
3 files changed, 139 insertions(+), 86 deletions(-)
diff --git a/docs/nostr-client-overview.md b/docs/nostr-client-overview.md
index f5e19a0d..f3e3ef88 100644
--- a/docs/nostr-client-overview.md
+++ b/docs/nostr-client-overview.md
@@ -1,91 +1,79 @@
# NostrClient Overview
-`js/nostr/client.js` exports the `NostrClient` class, which serves as the central controller for all Nostr network interactions and state management within the application. It acts as a facade over `nostr-tools`, managing connections, subscriptions, caching, and signing.
+`NostrClient` (`js/nostr/client.js`) is the central controller for all Nostr network interactions and state management in the application. It acts as a facade over `nostr-tools`, managing connections to multiple relays, signing events, and maintaining the local application state.
-## Key Responsibilities
+## Responsibilities
-1. **Connection Management**: Maintains a pool of connections to multiple relays (`SimplePool`).
-2. **State Management**: Tracks video events, deduplicates them, and manages deletions via tombstones.
-3. **Caching**: Implements a "stale-while-revalidate" strategy using IndexedDB (with localStorage fallback) to restore UI state immediately upon load.
-4. **Event Publishing**: Orchestrates the signing and broadcasting of complex event chains (Video Note -> NIP-94 Mirror -> NIP-71 Metadata).
-5. **Signer Abstraction**: Unifies NIP-07 (Extension), NIP-46 (Remote/Bunker), and Local (nsec) signing under a single interface.
-6. **Video History**: Reconstructs the edit history of videos using `videoRootId` and `d` tags.
+1. **Connection Management**: Maintains a pool of connections to configured Nostr relays. It handles initialization, reconnection, and error logging.
+2. **Event Publishing**: Handles the creation, signing, and broadcasting of various Nostr event kinds (Video Post: 30078, Reaction: 7, Comment: 1, etc.). It supports NIP-07 (Extension), NIP-46 (Remote/Bunker), and NIP-01 (Local nsec) signers.
+3. **State Management**:
+ * `allEvents`: A raw map of all fetched video events (Kind 30078), preserving history.
+ * `activeMap`: A derived map containing only the *latest* version of each video, deduplicated by `videoRootId` or `d` tag. This is the source of truth for the UI.
+ * `rawEvents`: A cache of the exact raw JSON events from relays, used for signature verification and republishing.
+ * `tombstones`: Tracks deletion timestamps to prevent deleted events from reappearing.
+4. **Caching**: Implements a dual-layer cache (`IndexedDB` + `localStorage`) to persist `activeMap`, `allEvents`, and `tombstones`. This allows the app to restore its state instantly on load ("stale-while-revalidate").
+5. **Video Lifecycle**: Manages the full lifecycle of a video post: Publish -> Edit (new event with same `d` tag) -> Revert (new event, same `d`, deleted flag) -> Delete (Kind 5).
-## Architecture & State
+## Key Concepts
-The client maintains several internal maps to manage state:
+### Active Video Logic
+Nostr is an append-only protocol. Edits are new events. `NostrClient` implements "latest-wins" logic to present a coherent view:
+- **Identifier**: Videos are identified by a `videoRootId` (in the content) or a NIP-33 `d` tag.
+- **Resolution**: When a new event arrives, the client checks if it's newer than the current active version in `activeMap`. If so, it replaces the entry.
+- **Deletions**: If an event has `deleted: true` or is a Kind 5 deletion, it is removed from `activeMap`, and a tombstone is recorded.
-* `allEvents`: A raw map of all fetched video events (key: event ID).
-* `activeMap`: A derived map containing only the *latest* version of each video, keyed by a stable identifier (`videoRootId` or addressable pointer).
-* `rawEvents`: A cache of the exact raw JSON events from relays, used for signature verification and re-publishing.
-* `tombstones`: Tracks timestamps of deletion events to prevent "zombie" events (deleted events reappearing from slow relays) from resurfacing.
+### Buffering & Debouncing
+To handle high volumes of events (e.g., during initial relay dump), `subscribeVideos` uses a buffering strategy:
+1. Incoming events are pushed to `eventBuffer`.
+2. A flush is scheduled with a short debounce (e.g., 75ms).
+3. On flush, the batch is processed: validation, state updates, and UI notification.
+This prevents UI thrashing.
-### Caching Strategy (`EventsCacheStore`)
+### Tombstones
+Because relays are eventually consistent, a deleted event might arrive *after* a deletion command.
+- `tombstones` map `activeKey` -> `timestamp`.
+- If an incoming event is older than the tombstone for its key, it is ignored (`applyTombstoneGuard`).
-To ensure instant load times, the client persists its state to IndexedDB (`bitvid-events-cache`).
-* **Snapshot**: On a debounced timer (or idle callback), the current state (`allEvents`, `tombstones`) is serialized.
-* **Fingerprinting**: Events are fingerprinted to avoid writing unchanged data to the DB.
-* **Restore**: On `init()`, the client loads the latest snapshot into memory, allowing the UI to render before any network requests complete.
-
-## Key Flows
-
-### 1. Initialization (`init`)
+## Example Flow: `subscribeVideos`
```mermaid
-graph TD
- A[init()] --> B[restoreLocalData]
- B --> C{IndexedDB Available?}
- C -- Yes --> D[Load Snapshot]
- C -- No --> E[Load localStorage]
- D & E --> F[Render UI with Cached Data]
- F --> G[ensurePool]
- G --> H[connectToRelays]
- H --> I[Ready for Subscriptions]
+sequenceDiagram
+ participant UI
+ participant Client as NostrClient
+ participant Buffer as EventBuffer
+ participant State as activeMap
+ participant Relays
+
+ UI->>Client: subscribeVideos(onVideo)
+ Client->>Relays: REQ Kind 30078
+ Relays-->>Client: EVENT (Video A, v1)
+ Client->>Buffer: Push Event
+ Client->>Buffer: Schedule Flush (75ms)
+ Relays-->>Client: EVENT (Video B, v1)
+ Client->>Buffer: Push Event
+
+ Note over Client, Buffer: 75ms passes...
+
+ Client->>Buffer: Flush()
+ loop For each event
+ Buffer->>State: Is newer?
+ alt Yes
+ State->>State: Update Entry
+ State->>UI: onVideo(Video)
+ else No
+ State->>State: Ignore
+ end
+ end
```
-### 2. Video Subscription (`subscribeVideos`)
+## When to Modify
-To prevent UI thrashing during high-volume event ingress (e.g., initial flood from relays), the client uses a **buffering and debouncing** strategy.
-
-1. **Buffer**: Incoming events are pushed to `eventBuffer` instead of being processed immediately.
-2. **Debounce**: A flush timer is scheduled (75ms).
-3. **Flush**: When the timer fires, the entire buffer is processed:
- * Events are validated and converted.
- * `activeMap` is updated (latest-wins logic).
- * `onVideo` callback is fired once with the batch updates.
- * Cache persistence is scheduled.
-
-### 3. Publishing a Video (`publishVideo`)
-
-Publishing is a multi-step process ensuring compatibility and discoverability.
-
-1. **Video Note (Kind 30078)**: The core content (magnet, infohash, metadata) is signed and published. A unique `videoRootId` is generated for new videos.
-2. **NIP-94 Mirror (Kind 1063)**: If a direct HTTP URL is provided, a file header event is published to point to the hosted file.
-3. **NIP-71 Metadata (Kind 22/21)**: Addressable metadata tags are published to support categorization/grouping without modifying the immutable video note.
-
-### 4. Remote Signer Handshake (`connectRemoteSigner`)
-
-For NIP-46 (Nostr Connect), the client implements a full handshake flow:
-
-1. **Ephemeral Key**: Generates a local key pair for the session.
-2. **Handshake**: Publishes a Kind 24133 (`NIP46_RPC_KIND`) event to the relay.
-3. **Wait**: Listens for an acknowledgment or `auth_url` challenge from the signer.
-4. **Session**: Once connected, stores the session metadata to allow auto-reconnection.
-
-## Why it works this way
-
-* **Buffering**: essential for performance. React rendering cycles are expensive; updating state for every single event in a 5000-event relay dump would freeze the browser.
-* **Tombstones**: essential for eventual consistency. Relays are distributed and can be out of sync. If a user deletes a video, we must remember that deletion timestamp so a slow relay doesn't "undelete" it by serving the old event later.
-* **Dual-Layer Cache**: IndexedDB is asynchronous and large-capacity; localStorage is synchronous but small. We use IndexedDB for the bulk data but keep a fallback for environments where IDB might be flaky or slow to initialize.
-
-## When to change
-
-* **Refactor `EventsCacheStore`**: If moving to a more robust state management library (like RxDB or dedicated worker), this logic should be extracted.
-* **New Event Kinds**: If the video data model changes (e.g., V4 schema), `convertEventToVideo` and `publishVideo` will need updates.
-* **Signer upgrades**: As NIP-46 evolves (e.g., Bunker standards), the handshake and connection logic in `nip46Client.js` (and its orchestration here) will need adjustment.
+- **Adding a new Event Kind**: If the app needs to support a new type of interaction (e.g., playlists), add the handling logic here and in `js/nostrEventSchemas.js`.
+- **Changing Caching Strategy**: Modify `EventsCacheStore` or `persistLocalData` if the caching requirements change.
+- **Updating Signing Logic**: Changes to NIP-07 or NIP-46 integration should be carefully reviewed here.
## Related Files
-* `js/nostrEventSchemas.js`: Defines the structure of the events being built/parsed.
-* `js/nostr/nip46Client.js`: Handles the low-level RPC for remote signers.
-* `js/state/profileCache.js`: Handles user profile metadata (Kind 0), which is separate from video data.
+- `js/nostrEventSchemas.js`: Definitions of event structures.
+- `js/nostr/nip71.js`: Helper logic for video categorization (NIP-71).
+- `js/nostr/watchHistory.js`: Manages user watch history state.
diff --git a/js/nostr/client.js b/js/nostr/client.js
index 505a1e11..acee9637 100644
--- a/js/nostr/client.js
+++ b/js/nostr/client.js
@@ -417,6 +417,10 @@ function waitForTransaction(tx) {
* - If the TTL expires, the cache is cleared on restore.
*/
class EventsCacheStore {
+ /**
+ * Initializes the EventsCacheStore.
+ * Tracks fingerprints of persisted items to avoid redundant writes.
+ */
constructor() {
this.dbPromise = null;
this.persistedEventFingerprints = new Map();
@@ -511,6 +515,12 @@ class EventsCacheStore {
return meta;
}
+ /**
+ * Restores the full state from IndexedDB.
+ *
+ * @returns {Promise<{version: number, savedAt: number, events: Map, tombstones: Map}|null>}
+ * The restored snapshot or null if cache is missing/expired.
+ */
async restoreSnapshot() {
const db = await this.getDb();
if (!db) {
@@ -573,6 +583,14 @@ class EventsCacheStore {
};
}
+ /**
+ * Persists the current state to IndexedDB.
+ * Only writes changes (diffs against fingerprints).
+ *
+ * @param {{events: Map, tombstones: Map, savedAt: number}} payload - The state to save.
+ * @returns {Promise<{persisted: boolean, eventWrites: number, eventDeletes: number, tombstoneWrites: number, tombstoneDeletes: number}>}
+ * Stats about the persistence operation.
+ */
async persistSnapshot(payload) {
const db = await this.getDb();
if (!db) {
@@ -1034,6 +1052,10 @@ export {
};
export class NostrClient {
+ /**
+ * Initializes the NostrClient.
+ * Sets up connection pools, state maps, and default relays.
+ */
constructor() {
this.pool = null;
this.poolPromise = null;
@@ -1042,16 +1064,32 @@ export class NostrClient {
this.readRelays = Array.from(this.relays);
this.writeRelays = Array.from(this.relays);
- // Store all events so older links still work
+ /**
+ * @type {Map}
+ * Maps event ID to the converted Video object.
+ * Stores ALL fetched versions to ensure old links resolve.
+ */
this.allEvents = new Map();
- // Keep a separate cache of raw events so we can republish the exact payload
+ /**
+ * @type {Map}
+ * Maps event ID to the raw Nostr event object.
+ * Kept for signature verification and republishing (e.g. NIP-94 mirror).
+ */
this.rawEvents = new Map();
- // “activeMap” holds only the newest version for each root
+ /**
+ * @type {Map}
+ * Maps `videoRootId` (or `pubkey:dTag`) to the latest valid Video object.
+ * This is the "materialized view" used by the UI.
+ */
this.activeMap = new Map();
- // Track the newest deletion timestamp for each active key
+ /**
+ * @type {Map}
+ * Maps `activeKey` to the timestamp of its latest deletion.
+ * Prevents older events from reappearing after a delete.
+ */
this.tombstones = new Map();
this.rootCreatedAtByRoot = new Map();
@@ -3655,6 +3693,8 @@ export class NostrClient {
* 1. Restores local data (IndexedDB/localStorage) to render the UI immediately ("stale-while-revalidate").
* 2. Schedules the restoration of any stored NIP-46 remote signer session.
* 3. Initializes the NostrTools `SimplePool` and connects to the configured relays.
+ *
+ * @returns {Promise} Resolves when relays are connected (or at least attempted).
*/
async init() {
devLogger.log("Connecting to relays...");
@@ -5000,6 +5040,11 @@ export class NostrClient {
* - `url`: The direct HTTP URL (WebSeed).
* - NIP-94 Mirror: Optionally publishes a Kind 1063 file header event if supported.
* - NIP-71: Optionally publishes a Kind 22 (Video Wrapper) for categorization if metadata is provided.
+ *
+ * @param {object} videoPayload - The video metadata and form data.
+ * @param {string} pubkey - The public key of the publisher.
+ * @returns {Promise} The signed and published event.
+ * @throws {Error} If not logged in or publishing fails.
*/
async publishVideo(videoPayload, pubkey) {
if (!pubkey) throw new Error("Not logged in to publish video.");
@@ -5360,6 +5405,12 @@ export class NostrClient {
*
* This version forces version=2 for the original note and uses
* lowercase comparison for public keys.
+ *
+ * @param {object} originalEventStub - The original video event (must have `id`).
+ * @param {object} updatedData - The new metadata to apply.
+ * @param {string} userPubkey - The public key of the editor (must match owner).
+ * @returns {Promise} The signed and published edit event.
+ * @throws {Error} If permission denied, ownership mismatch, or publish failure.
*/
async editVideo(originalEventStub, updatedData, userPubkey) {
if (!userPubkey) {
@@ -5595,7 +5646,13 @@ export class NostrClient {
}
/**
- * revertVideo => old style
+ * Reverts a video (soft delete).
+ * Publishes a new version with the same `d` tag but `deleted: true`.
+ * The content is replaced with a placeholder.
+ *
+ * @param {object} originalEvent - The video event to revert.
+ * @param {string} pubkey - The public key of the owner.
+ * @returns {Promise<{event: object, publishResults: object[], summary: object}>} Result of the operation.
*/
async revertVideo(originalEvent, pubkey) {
if (!pubkey) {
@@ -5766,10 +5823,14 @@ export class NostrClient {
}
/**
- * "Deleting" => Mark all content with the same videoRootId as {deleted:true}
- * and blank out magnet/desc.
+ * Deletes all versions of a video.
+ * 1. Reverts every known version (soft delete) by publishing a `deleted: true` update for each `d` tag or root.
+ * 2. Publishes Kind 5 (NIP-09) deletion events for all event IDs and NIP-33 addresses.
*
- * This version now asks for confirmation before proceeding.
+ * @param {string} videoRootId - The root ID of the video series.
+ * @param {string} pubkey - The owner's public key.
+ * @param {{confirm?: boolean, video?: object}} [options] - Options (confirm dialog, target video hint).
+ * @returns {Promise<{reverts: object[], deletes: object[]}|null>} Summary of actions taken, or null if cancelled.
*/
async deleteAllVersions(videoRootId, pubkey, options = {}) {
if (!pubkey) {
@@ -6249,8 +6310,9 @@ export class NostrClient {
* - Persist to local cache.
* - Notify the UI (`onVideo`).
*
- * @param {Function} onVideo - Callback fired when new valid videos are processed.
- * @param {{ since?: number, until?: number, limit?: number }} [options]
+ * @param {Function} onVideo - Callback fired when new valid videos are processed. Receives the `Video` object.
+ * @param {{ since?: number, until?: number, limit?: number }} [options] - Filter options.
+ * @returns {import("nostr-tools").Sub} The subscription object. Call `unsub()` to stop.
*/
subscribeVideos(onVideo, options = {}) {
const { since, until, limit } = options;
@@ -7187,6 +7249,9 @@ export class NostrClient {
* - If the root event is missing locally, fetch it by ID.
* - If we suspect missing history (e.g., only 1 version found), perform a relay query for the specific `d` tag.
* - Merge and sort all findings to present a linear history.
+ *
+ * @param {object} video - The video object to find history for.
+ * @returns {Promise