diff --git a/stacks/portal/dist/assets/index-6-qoGEVu.css b/stacks/portal/dist/assets/index-6-qoGEVu.css deleted file mode 100644 index 17c619d..0000000 --- a/stacks/portal/dist/assets/index-6-qoGEVu.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.3.5 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--spacing:.25rem;--container-xl:36rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--blur-sm:8px;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.top-0{top:0}.right-5{right:calc(var(--spacing) * 5)}.bottom-5{bottom:calc(var(--spacing) * 5)}.z-30{z-index:30}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-10{height:calc(var(--spacing) * 10)}.h-full{height:100%}.max-h-80{max-height:calc(var(--spacing) * 80)}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-6{width:calc(var(--spacing) * 6)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-full{max-width:100%}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.bg-black{background-color:var(--color-black)}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-transparent{background-color:#0000}.object-contain{object-fit:contain}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.pt-1{padding-top:var(--spacing)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pr-1{padding-right:var(--spacing)}.text-center{text-align:center}.text-left{text-align:left}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.uppercase{text-transform:uppercase}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-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-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(var(--blur-sm));-webkit-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-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, )}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}@media(hover:hover){:is(:where(.group):hover .group-hover\:underline),.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}}@media(min-width:40rem){.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:48rem){.md\:flex{display:flex}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}}@media(min-width:80rem){.xl\:flex{display:flex}}}:root,[data-theme=zinc-dark]{--bg-page:#09090b;--bg-card:#121215;--bg-widget:#16161a;--bg-muted:#18181b;--bg-hover:#1c1c21;--text-main:#f4f4f5;--text-muted:#a1a1aa;--text-subtle:#71717a;--border-color:#27272a;--border-subtle:#ffffff0f;--border-hover:#3f3f46;--primary:#fafafa;--primary-fg:#09090b;--accent:#3b82f6;--accent-soft:#3b82f624;--success:#10b981;--success-soft:#10b98124;--card-shadow:0 2px 8px -2px #00000080}[data-theme=zinc-light]{--bg-page:#f8fafc;--bg-card:#fff;--bg-widget:#f8fafc;--bg-muted:#f1f5f9;--bg-hover:#fff;--text-main:#0f172a;--text-muted:#64748b;--text-subtle:#94a3b8;--border-color:#e2e8f0;--border-subtle:#f1f5f9;--border-hover:#cbd5e1;--primary:#0f172a;--primary-fg:#fff;--accent:#2563eb;--accent-soft:#2563eb14;--success:#10b981;--success-soft:#10b9811a;--card-shadow:0 1px 3px 0 #0f172a0a, 0 1px 2px -1px #0f172a08}[data-theme=catppuccin]{--bg-page:#11111b;--bg-card:#1e1e2e;--bg-widget:#181825;--bg-muted:#313244;--bg-hover:#242438;--text-main:#cdd6f4;--text-muted:#a6adc8;--text-subtle:#6c7086;--border-color:#313244;--border-subtle:#cdd6f40f;--border-hover:#45475a;--primary:#cba6f7;--primary-fg:#11111b;--accent:#89b4fa;--accent-soft:#89b4fa26;--success:#a6e3a1;--success-soft:#a6e3a126;--card-shadow:0 4px 16px -4px #11111b99}[data-theme=nord]{--bg-page:#242933;--bg-card:#2e3440;--bg-widget:#292e39;--bg-muted:#3b4252;--bg-hover:#353c4a;--text-main:#eceff4;--text-muted:#d8dee9;--text-subtle:#81a1c1;--border-color:#3b4252;--border-subtle:#eceff40f;--border-hover:#4c566a;--primary:#88c0d0;--primary-fg:#2e3440;--accent:#88c0d0;--accent-soft:#88c0d026;--success:#a3be8c;--success-soft:#a3be8c26;--card-shadow:0 4px 12px -2px #00000059}body{background-color:var(--bg-page);color:var(--text-main);-webkit-font-smoothing:antialiased;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei,sans-serif;transition:background-color .2s,color .2s}.font-mono-num{font-variant-numeric:tabular-nums;font-family:JetBrains Mono,SF Mono,Menlo,monospace}.hl-card{background-color:var(--bg-card);border:1px solid var(--border-color);box-shadow:var(--card-shadow);border-radius:.75rem;transition:border-color .16s,transform .16s,box-shadow .16s}.hl-card-interactive:hover{border-color:var(--border-hover);background-color:var(--bg-hover);transform:translateY(-1px)}.hl-widget-footer{background-color:var(--bg-widget);border-top:1px solid var(--border-color)}.hl-pill{background-color:var(--bg-card);border:1px solid var(--border-color);border-radius:.5rem}.hl-muted{background-color:var(--bg-muted)}.hl-border{border-color:var(--border-color)}.hl-btn-primary{background-color:var(--primary);color:var(--primary-fg);border-radius:.5rem;font-weight:500;transition:opacity .15s}.hl-btn-primary:hover{opacity:.9}.hl-btn-outline{background-color:var(--bg-card);color:var(--text-main);border:1px solid var(--border-color);border-radius:.5rem;transition:background-color .15s,border-color .15s}.hl-btn-outline:hover{background-color:var(--bg-muted);border-color:var(--border-hover)}.hl-bar-fill{background-color:var(--accent);transition:width .5s cubic-bezier(.22,1,.36,1)}.hl-bar-fill-green{background-color:var(--success);transition:width .5s cubic-bezier(.22,1,.36,1)}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false} diff --git a/stacks/portal/dist/assets/index-B_rkFolS.css b/stacks/portal/dist/assets/index-B_rkFolS.css new file mode 100644 index 0000000..d4765f3 --- /dev/null +++ b/stacks/portal/dist/assets/index-B_rkFolS.css @@ -0,0 +1 @@ +/*! tailwindcss v4.3.5 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--spacing:.25rem;--container-md:28rem;--container-xl:36rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--blur-sm:8px;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.top-0{top:0}.right-5{right:calc(var(--spacing) * 5)}.bottom-5{bottom:calc(var(--spacing) * 5)}.z-30{z-index:30}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-full{height:100%}.max-h-80{max-height:calc(var(--spacing) * 80)}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-\[1px\]{width:1px}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.bg-black{background-color:var(--color-black)}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-black\/75{background-color:#000000bf}@supports (color:color-mix(in lab,red,red)){.bg-black\/75{background-color:color-mix(in oklab,var(--color-black) 75%,transparent)}}.bg-transparent{background-color:#0000}.object-contain{object-fit:contain}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, )}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-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-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(var(--blur-sm));-webkit-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-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, )}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}@media(hover:hover){:is(:where(.group):hover .group-hover\:underline),.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}}@media(min-width:40rem){.sm\:inline{display:inline}.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\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-20{top:calc(var(--spacing) * 20)}.lg\:col-span-3{grid-column:span 3/span 3}.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\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}}}:root,[data-theme=zinc-dark]{--bg-page:#09090b;--bg-card:#121215;--bg-widget:#16161a;--bg-muted:#18181b;--bg-hover:#1c1c21;--text-main:#f4f4f5;--text-muted:#a1a1aa;--text-subtle:#71717a;--border-color:#27272a;--border-subtle:#ffffff0f;--border-hover:#3f3f46;--primary:#fafafa;--primary-fg:#09090b;--accent:#3b82f6;--accent-soft:#3b82f624;--success:#10b981;--success-soft:#10b98124;--card-shadow:0 2px 8px -2px #00000080}[data-theme=zinc-light]{--bg-page:#f8fafc;--bg-card:#fff;--bg-widget:#f8fafc;--bg-muted:#f1f5f9;--bg-hover:#fff;--text-main:#0f172a;--text-muted:#64748b;--text-subtle:#94a3b8;--border-color:#e2e8f0;--border-subtle:#f1f5f9;--border-hover:#cbd5e1;--primary:#0f172a;--primary-fg:#fff;--accent:#2563eb;--accent-soft:#2563eb14;--success:#10b981;--success-soft:#10b9811a;--card-shadow:0 1px 3px 0 #0f172a0a, 0 1px 2px -1px #0f172a08}[data-theme=catppuccin]{--bg-page:#11111b;--bg-card:#1e1e2e;--bg-widget:#181825;--bg-muted:#313244;--bg-hover:#242438;--text-main:#cdd6f4;--text-muted:#a6adc8;--text-subtle:#6c7086;--border-color:#313244;--border-subtle:#cdd6f40f;--border-hover:#45475a;--primary:#cba6f7;--primary-fg:#11111b;--accent:#89b4fa;--accent-soft:#89b4fa26;--success:#a6e3a1;--success-soft:#a6e3a126;--card-shadow:0 4px 16px -4px #11111b99}[data-theme=nord]{--bg-page:#242933;--bg-card:#2e3440;--bg-widget:#292e39;--bg-muted:#3b4252;--bg-hover:#353c4a;--text-main:#eceff4;--text-muted:#d8dee9;--text-subtle:#81a1c1;--border-color:#3b4252;--border-subtle:#eceff40f;--border-hover:#4c566a;--primary:#88c0d0;--primary-fg:#2e3440;--accent:#88c0d0;--accent-soft:#88c0d026;--success:#a3be8c;--success-soft:#a3be8c26;--card-shadow:0 4px 12px -2px #00000059}body{background-color:var(--bg-page);color:var(--text-main);-webkit-font-smoothing:antialiased;font-family:Inter,-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei,sans-serif;transition:background-color .2s,color .2s}.font-mono-num{font-variant-numeric:tabular-nums;font-family:JetBrains Mono,SF Mono,Menlo,monospace}.hl-card{background-color:var(--bg-card);border:1px solid var(--border-color);box-shadow:var(--card-shadow);border-radius:.75rem;transition:border-color .16s,transform .16s,box-shadow .16s}.hl-card-interactive:hover{border-color:var(--border-hover);background-color:var(--bg-hover);transform:translateY(-1px)}.hl-widget-footer{background-color:var(--bg-widget);border-top:1px solid var(--border-color)}.hl-pill{background-color:var(--bg-card);border:1px solid var(--border-color);border-radius:.5rem}.hl-muted{background-color:var(--bg-muted)}.hl-border{border-color:var(--border-color)}.hl-btn-primary{background-color:var(--primary);color:var(--primary-fg);border-radius:.5rem;font-weight:500;transition:opacity .15s}.hl-btn-primary:hover{opacity:.9}.hl-btn-outline{background-color:var(--bg-card);color:var(--text-main);border:1px solid var(--border-color);border-radius:.5rem;transition:background-color .15s,border-color .15s}.hl-btn-outline:hover{background-color:var(--bg-muted);border-color:var(--border-hover)}.hl-bar-fill{background-color:var(--accent);transition:width .5s cubic-bezier(.22,1,.36,1)}.hl-bar-fill-green{background-color:var(--success);transition:width .5s cubic-bezier(.22,1,.36,1)}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false} diff --git a/stacks/portal/dist/assets/index-D9ftMUDG.js b/stacks/portal/dist/assets/index-D9ftMUDG.js new file mode 100644 index 0000000..76eb4fe --- /dev/null +++ b/stacks/portal/dist/assets/index-D9ftMUDG.js @@ -0,0 +1,124 @@ +(function(){const A=document.createElement("link").relList;if(A&&A.supports&&A.supports("modulepreload"))return;for(const O of document.querySelectorAll('link[rel="modulepreload"]'))d(O);new MutationObserver(O=>{for(const q of O)if(q.type==="childList")for(const al of q.addedNodes)al.tagName==="LINK"&&al.rel==="modulepreload"&&d(al)}).observe(document,{childList:!0,subtree:!0});function N(O){const q={};return O.integrity&&(q.integrity=O.integrity),O.referrerPolicy&&(q.referrerPolicy=O.referrerPolicy),O.crossOrigin==="use-credentials"?q.credentials="include":O.crossOrigin==="anonymous"?q.credentials="omit":q.credentials="same-origin",q}function d(O){if(O.ep)return;O.ep=!0;const q=N(O);fetch(O.href,q)}})();function m0(x){return x&&x.__esModule&&Object.prototype.hasOwnProperty.call(x,"default")?x.default:x}var Ns={exports:{}},nn={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var t0;function b1(){if(t0)return nn;t0=1;var x=Symbol.for("react.transitional.element"),A=Symbol.for("react.fragment");function N(d,O,q){var al=null;if(q!==void 0&&(al=""+q),O.key!==void 0&&(al=""+O.key),"key"in O){q={};for(var W in O)W!=="key"&&(q[W]=O[W])}else q=O;return O=q.ref,{$$typeof:x,type:d,key:al,ref:O!==void 0?O:null,props:q}}return nn.Fragment=A,nn.jsx=N,nn.jsxs=N,nn}var e0;function S1(){return e0||(e0=1,Ns.exports=b1()),Ns.exports}var s=S1(),Es={exports:{}},V={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var a0;function x1(){if(a0)return V;a0=1;var x=Symbol.for("react.transitional.element"),A=Symbol.for("react.portal"),N=Symbol.for("react.fragment"),d=Symbol.for("react.strict_mode"),O=Symbol.for("react.profiler"),q=Symbol.for("react.consumer"),al=Symbol.for("react.context"),W=Symbol.for("react.forward_ref"),k=Symbol.for("react.suspense"),F=Symbol.for("react.memo"),D=Symbol.for("react.lazy"),S=Symbol.for("react.activity"),_=Symbol.for("react.view_transition"),B=Symbol.iterator;function G(r){return r===null||typeof r!="object"?null:(r=B&&r[B]||r["@@iterator"],typeof r=="function"?r:null)}var $={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},ul=Object.assign,Bl={};function nt(r,E,H){this.props=r,this.context=E,this.refs=Bl,this.updater=H||$}nt.prototype.isReactComponent={},nt.prototype.setState=function(r,E){if(typeof r!="object"&&typeof r!="function"&&r!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,r,E,"setState")},nt.prototype.forceUpdate=function(r){this.updater.enqueueForceUpdate(this,r,"forceUpdate")};function ke(){}ke.prototype=nt.prototype;function Bt(r,E,H){this.props=r,this.context=E,this.refs=Bl,this.updater=H||$}var Gt=Bt.prototype=new ke;Gt.constructor=Bt,ul(Gt,nt.prototype),Gt.isPureReactComponent=!0;var ct=Array.isArray;function I(){}var sl={H:null,A:null,T:null,S:null},wt=Object.prototype.hasOwnProperty;function St(r,E,H){var Y=H.ref;return{$$typeof:x,type:r,key:E,ref:Y!==void 0?Y:null,props:H}}function xt(r,E){return St(r.type,E,r.props)}function it(r){return typeof r=="object"&&r!==null&&r.$$typeof===x}function ge(r){var E={"=":"=0",":":"=2"};return"$"+r.replace(/[=:]/g,function(H){return E[H]})}var $e=/\/+/g;function Ul(r,E){return typeof r=="object"&&r!==null&&r.key!=null?ge(""+r.key):E.toString(36)}function M(r){switch(r.status){case"fulfilled":return r.value;case"rejected":throw r.reason;default:switch(typeof r.status=="string"?r.then(I,I):(r.status="pending",r.then(function(E){r.status==="pending"&&(r.status="fulfilled",r.value=E)},function(E){r.status==="pending"&&(r.status="rejected",r.reason=E)})),r.status){case"fulfilled":return r.value;case"rejected":throw r.reason}}throw r}function Q(r,E,H,Y,cl){var il=typeof r;(il==="undefined"||il==="boolean")&&(r=null);var ol=!1;if(r===null)ol=!0;else switch(il){case"bigint":case"string":case"number":ol=!0;break;case"object":switch(r.$$typeof){case x:case A:ol=!0;break;case D:return ol=r._init,Q(ol(r._payload),E,H,Y,cl)}}if(ol)return cl=cl(r),ol=Y===""?"."+Ul(r,0):Y,ct(cl)?(H="",ol!=null&&(H=ol.replace($e,"$&/")+"/"),Q(cl,E,H,"",function(te){return te})):cl!=null&&(it(cl)&&(cl=xt(cl,H+(cl.key==null||r&&r.key===cl.key?"":(""+cl.key).replace($e,"$&/")+"/")+ol)),E.push(cl)),1;ol=0;var U=Y===""?".":Y+":";if(ct(r))for(var Z=0;Z>>1,dl=M[bl];if(0>>1;blO(We,X))rO(E,We)?(M[bl]=E,M[r]=X,bl=r):(M[bl]=We,M[le]=X,bl=le);else if(rO(E,X))M[bl]=E,M[r]=X,bl=r;else break l}}return Q}function O(M,Q){var X=M.sortIndex-Q.sortIndex;return X!==0?X:M.id-Q.id}if(x.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var q=performance;x.unstable_now=function(){return q.now()}}else{var al=Date,W=al.now();x.unstable_now=function(){return al.now()-W}}var k=[],F=[],D=1,S=null,_=3,B=!1,G=!1,$=!1,ul=!1,Bl=typeof setTimeout=="function"?setTimeout:null,nt=typeof clearTimeout=="function"?clearTimeout:null,ke=typeof setImmediate<"u"?setImmediate:null;function Bt(M){for(var Q=N(F);Q!==null;){if(Q.callback===null)d(F);else if(Q.startTime<=M)d(F),Q.sortIndex=Q.expirationTime,A(k,Q);else break;Q=N(F)}}function Gt(M){if($=!1,Bt(M),!G)if(N(k)!==null)G=!0,ct||(ct=!0,it());else{var Q=N(F);Q!==null&&Ul(Gt,Q.startTime-M)}}var ct=!1,I=-1,sl=5,wt=-1;function St(){return ul?!0:!(x.unstable_now()-wtM&&St());){var bl=S.callback;if(typeof bl=="function"){S.callback=null,_=S.priorityLevel;var dl=bl(S.expirationTime<=M);if(M=x.unstable_now(),typeof dl=="function"){S.callback=dl,Bt(M),Q=!0;break t}S===N(k)&&d(k),Bt(M)}else d(k);S=N(k)}if(S!==null)Q=!0;else{var jt=N(F);jt!==null&&Ul(Gt,jt.startTime-M),Q=!1}}break l}finally{S=null,_=X,B=!1}Q=void 0}}finally{Q?it():ct=!1}}}var it;if(typeof ke=="function")it=function(){ke(xt)};else if(typeof MessageChannel<"u"){var ge=new MessageChannel,$e=ge.port2;ge.port1.onmessage=xt,it=function(){$e.postMessage(null)}}else it=function(){Bl(xt,0)};function Ul(M,Q){I=Bl(function(){M(x.unstable_now())},Q)}x.unstable_IdlePriority=5,x.unstable_ImmediatePriority=1,x.unstable_LowPriority=4,x.unstable_NormalPriority=3,x.unstable_Profiling=null,x.unstable_UserBlockingPriority=2,x.unstable_cancelCallback=function(M){M.callback=null},x.unstable_forceFrameRate=function(M){0>M||125bl?(M.sortIndex=X,A(F,M),N(k)===null&&M===N(F)&&($?(nt(I),I=-1):$=!0,Ul(Gt,X-bl))):(M.sortIndex=dl,A(k,M),G||B||(G=!0,ct||(ct=!0,it()))),M},x.unstable_shouldYield=St,x.unstable_wrapCallback=function(M){var Q=_;return function(){var X=_;_=Q;try{return M.apply(this,arguments)}finally{_=X}}}})(Os)),Os}var c0;function T1(){return c0||(c0=1,zs.exports=p1()),zs.exports}var As={exports:{}},Kl={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var i0;function N1(){if(i0)return Kl;i0=1;var x=Ms();function A(D){var S="https://react.dev/errors/"+D;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(x)}catch(A){console.error(A)}}return x(),As.exports=N1(),As.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var s0;function _1(){if(s0)return cn;s0=1;var x=T1(),A=Ms(),N=E1();function d(l){var t="https://react.dev/errors/"+l;if(1xa||(l.current=Qc[xa],Qc[xa]=null,xa--)}function xl(l,t){xa++,Qc[xa]=l.current,l.current=t}var Xt=Qt(null),ru=Qt(null),be=Qt(null),fn=Qt(null);function sn(l,t){switch(xl(be,t),xl(ru,l),xl(Xt,null),t.nodeType){case 9:case 11:l=(l=t.documentElement)&&(l=l.namespaceURI)?om(l):0;break;default:if(l=t.tagName,t=t.namespaceURI)t=om(t),l=rm(t,l);else switch(l){case"svg":l=1;break;case"math":l=2;break;default:l=0}}Gl(Xt),xl(Xt,l)}function pa(){Gl(Xt),Gl(ru),Gl(be)}function Xc(l){var t=l.memoizedState;t!==null&&(fu._currentValue=t.memoizedState,xl(fn,l)),t=Xt.current;var e=rm(t,l.type);t!==e&&(xl(ru,l),xl(Xt,e))}function on(l){ru.current===l&&(Gl(Xt),Gl(ru)),fn.current===l&&(Gl(fn),fu._currentValue=te)}var Zc,js;function Se(l){if(Zc===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Zc=t&&t[1]||"",js=-1)":-1u||f[a]!==v[u]){var b=` +`+f[a].replace(" at new "," at ");return l.displayName&&b.includes("")&&(b=b.replace("",l.displayName)),b}while(1<=a&&0<=u);break}}}finally{Vc=!1,Error.prepareStackTrace=e}return(e=l?l.displayName||l.name:"")?Se(e):""}function T0(l,t){switch(l.tag){case 26:case 27:case 5:return Se(l.type);case 16:return Se("Lazy");case 13:return l.child!==t&&t!==null?Se("Suspense Fallback"):Se("Suspense");case 19:return Se("SuspenseList");case 0:case 15:return Lc(l.type,!1);case 11:return Lc(l.type.render,!1);case 1:return Lc(l.type,!0);case 31:return Se("Activity");case 30:return Se("ViewTransition");default:return""}}function Cs(l){try{var t="",e=null;do t+=T0(l,e),e=l,l=l.return;while(l);return t}catch(a){return` +Error generating stack: `+a.message+` +`+a.stack}}var Kc=Object.prototype.hasOwnProperty,Jc=x.unstable_scheduleCallback,kc=x.unstable_cancelCallback,N0=x.unstable_shouldYield,E0=x.unstable_requestPaint,ft=x.unstable_now,_0=x.unstable_getCurrentPriorityLevel,Ds=x.unstable_ImmediatePriority,Us=x.unstable_UserBlockingPriority,rn=x.unstable_NormalPriority,z0=x.unstable_LowPriority,Rs=x.unstable_IdlePriority,O0=x.log,A0=x.unstable_setDisableYieldValue,du=null,st=null;function xe(l){if(typeof O0=="function"&&A0(l),st&&typeof st.setStrictMode=="function")try{st.setStrictMode(du,l)}catch{}}var ot=Math.clz32?Math.clz32:C0,M0=Math.log,j0=Math.LN2;function C0(l){return l>>>=0,l===0?32:31-(M0(l)/j0|0)|0}var dn=256,mn=262144,hn=4194304;function Fe(l){var t=l&42;if(t!==0)return t;switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return l&-l;case 262144:case 524288:case 1048576:case 2097152:return l&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function vn(l,t,e){var a=l.pendingLanes;if(a===0)return 0;var u=0,n=l.suspendedLanes,c=l.pingedLanes;l=l.warmLanes;var i=a&134217727;return i!==0?(a=i&~n,a!==0?u=Fe(a):(c&=i,c!==0?u=Fe(c):e||(e=i&~l,e!==0&&(u=Fe(e))))):(i=a&~n,i!==0?u=Fe(i):c!==0?u=Fe(c):e||(e=a&~l,e!==0&&(u=Fe(e)))),u===0?0:t!==0&&t!==u&&(t&n)===0&&(n=u&-u,e=t&-t,n>=e||n===32&&(e&4194048)!==0)?t:u}function mu(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function Hs(l,t){(t&8)!==0&&(t|=t&32);var e=l.entangledLanes;if(e!==0)for(l=l.entanglements,e&=t;0e;e++)t.push(l);return t}function hu(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function U0(l,t,e,a,u,n){var c=l.pendingLanes;l.pendingLanes=e,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=e,l.entangledLanes&=e,l.errorRecoveryDisabledLanes&=e,l.shellSuspendCounter=0;var i=l.entanglements,f=l.expirationTimes,v=l.hiddenUpdates;for(e=c&~e;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ni=!1;if(ue)try{var bu={};Object.defineProperty(bu,"passive",{get:function(){ni=!0}}),window.addEventListener("test",bu,bu),window.removeEventListener("test",bu,bu)}catch{ni=!1}var pe=null,ci=null,pn=null;function no(){if(pn)return pn;var l,t=ci,e=t.length,a,u="value"in pe?pe.value:pe.textContent,n=u.length;for(l=0;l=pu),ro=" ",mo=!1;function ho(l,t){switch(l){case"keyup":return vh.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function vo(l){return l=l.detail,typeof l=="object"&&"data"in l?l.data:null}var ja=!1;function gh(l,t){switch(l){case"compositionend":return vo(t);case"keypress":return t.which!==32?null:(mo=!0,ro);case"textInput":return l=t.data,l===ro&&mo?null:l;default:return null}}function bh(l,t){if(ja)return l==="compositionend"||!ri&&ho(l,t)?(l=no(),pn=ci=pe=null,ja=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1"u")return null;try{return l.activeElement||l.body}catch{return l.body}}function No(l){for(;l&&l.firstChild;)l=l.firstChild;return l}function Eo(l,t){var e=No(l);l=0;for(var a;e;){if(e.nodeType===3){if(a=l+e.textContent.length,l<=t&&a>=t)return{node:e,offset:t-l};l=a}l:{for(;e;){if(e.nextSibling){e=e.nextSibling;break l}e=e.parentNode}e=void 0}e=No(e)}}function _o(l,t){return l&&t?l===t?!0:l&&l.nodeType===3?!1:t&&t.nodeType===3?_o(l,t.parentNode):"contains"in l?l.contains(t):l.compareDocumentPosition?!!(l.compareDocumentPosition(t)&16):!1:!1}function zo(l){l=l!=null&&l.ownerDocument!=null&&l.ownerDocument.defaultView!=null?l.ownerDocument.defaultView:window;for(var t=hi(l.document);t instanceof l.HTMLIFrameElement;){try{var e=typeof t.contentWindow.location.href=="string"}catch{e=!1}if(e)l=t.contentWindow;else break;t=hi(l.document)}return t}function vi(l){var t=l&&l.nodeName&&l.nodeName.toLowerCase();return t&&(t==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||t==="textarea"||l.contentEditable==="true")}var zh=ue&&"documentMode"in document&&11>=document.documentMode,Ca=null,yi=null,_u=null,gi=!1;function Oo(l,t,e){var a=e.window===e?e.document:e.nodeType===9?e:e.ownerDocument;gi||Ca==null||Ca!==hi(a)||(a=Ca,"selectionStart"in a&&vi(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),_u&&Eu(_u,a)||(_u=a,a=zc(yi,"onSelect"),0>=c,u-=c,Vt=1<<32-ot(t)+u|e<w?(Cl=R,R=null):Cl=R.sibling;var nl=m(h,R,y[w],p);if(nl===null){R===null&&(R=Cl);break}l&&R&&nl.alternate===null&&t(h,R),o=n(nl,o,w),el===null?j=nl:el.sibling=nl,el=nl,R=Cl}if(w===y.length)return e(h,R),J&&fe(h,w),j;if(R===null){for(;ww?(Cl=R,R=null):Cl=R.sibling;var Ke=m(h,R,nl.value,p);if(Ke===null){R===null&&(R=Cl);break}l&&R&&Ke.alternate===null&&t(h,R),o=n(Ke,o,w),el===null?j=Ke:el.sibling=Ke,el=Ke,R=Cl}if(nl.done)return e(h,R),J&&fe(h,w),j;if(R===null){for(;!nl.done;w++,nl=y.next())nl=T(h,nl.value,p),nl!==null&&(o=n(nl,o,w),el===null?j=nl:el.sibling=nl,el=nl);return J&&fe(h,w),j}for(R=a(R);!nl.done;w++,nl=y.next())nl=g(R,h,w,nl.value,p),nl!==null&&(l&&(Cl=nl.alternate,Cl!==null&&R.delete(Cl.key===null?w:Cl.key)),o=n(nl,o,w),el===null?j=nl:el.sibling=nl,el=nl);return l&&R.forEach(function(g1){return t(h,g1)}),J&&fe(h,w),j}function K(h,o,y,p){if(typeof y=="object"&&y!==null&&y.type===xt&&y.key===null&&y.props.ref===void 0&&(y=y.props.children),typeof y=="object"&&y!==null){switch(y.$$typeof){case wt:l:{for(var j=y.key;o!==null;){if(o.key===j){if(j=y.type,j===xt){if(o.tag===7){e(h,o.sibling),p=u(o,y.props.children),Oe(p,y),p.return=h,h=p;break l}}else if(o.elementType===j||typeof j=="object"&&j!==null&&j.$$typeof===dl&&oa(j)===o.type){e(h,o.sibling),p=u(o,y.props),Oe(p,y),p.return=h,h=p;break l}e(h,o);break}else t(h,o);o=o.sibling}y.type===xt?(p=aa(y.props.children,h.mode,p,y.key),Oe(p,y),p.return=h,h=p):(p=Cn(y.type,y.key,y.props,null,h.mode,p),Oe(p,y),p.return=h,h=p)}return c(h);case St:l:{for(j=y.key;o!==null;){if(o.key===j)if(o.tag===4&&o.stateNode.containerInfo===y.containerInfo&&o.stateNode.implementation===y.implementation){e(h,o.sibling),p=u(o,y.children||[]),p.return=h,h=p;break l}else{e(h,o);break}else t(h,o);o=o.sibling}p=Ei(y,h.mode,p),p.return=h,h=p}return c(h);case dl:return y=oa(y),K(h,o,y,p)}if(ol(y))return z(h,o,y,p);if(Y(y)){if(j=Y(y),typeof j!="function")throw Error(d(150));return y=j.call(y),C(h,o,y,p)}if(typeof y.then=="function")return K(h,o,Qn(y),p);if(y.$$typeof===Ul)return K(h,o,qn(h,y),p);Xn(h,y)}return typeof y=="string"&&y!==""||typeof y=="number"||typeof y=="bigint"?(y=""+y,o!==null&&o.tag===6?(e(h,o.sibling),p=u(o,y),p.return=h,h=p):(e(h,o),p=Ni(y,h.mode,p),p.return=h,h=p),c(h)):e(h,o)}return function(h,o,y,p){try{Cu=0;var j=K(h,o,y,p);return wa=null,j}catch(R){if(R===Ga||R===Gn)throw R;var el=lt(29,R,null,h.mode);return el.lanes=p,el.return=h,el}finally{}}}var da=Fo(!0),Io=Fo(!1),Ae=!1;function Ri(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Hi(l,t){l=l.updateQueue,t.updateQueue===l&&(t.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,callbacks:null})}function Me(l){return{lane:l,tag:0,payload:null,callback:null,next:null}}function je(l,t,e){var a=l.updateQueue;if(a===null)return null;if(a=a.shared,(rl&2)!==0){var u=a.pending;return u===null?t.next=t:(t.next=u.next,u.next=t),a.pending=t,t=jn(l),Ho(l,null,e),t}return Mn(l,a,t,e),jn(l)}function Du(l,t,e){if(t=t.updateQueue,t!==null&&(t=t.shared,(e&4194048)!==0)){var a=t.lanes;a&=l.pendingLanes,e|=a,t.lanes=e,Bs(l,e)}}function Yi(l,t){var e=l.updateQueue,a=l.alternate;if(a!==null&&(a=a.updateQueue,e===a)){var u=null,n=null;if(e=e.firstBaseUpdate,e!==null){do{var c={lane:e.lane,tag:e.tag,payload:e.payload,callback:null,next:null};n===null?u=n=c:n=n.next=c,e=e.next}while(e!==null);n===null?u=n=t:n=n.next=t}else u=n=t;e={baseState:a.baseState,firstBaseUpdate:u,lastBaseUpdate:n,shared:a.shared,callbacks:a.callbacks},l.updateQueue=e;return}l=e.lastBaseUpdate,l===null?e.firstBaseUpdate=t:l.next=t,e.lastBaseUpdate=t}var qi=!1;function Uu(){if(qi){var l=Ba;if(l!==null)throw l}}function Ru(l,t,e,a){qi=!1;var u=l.updateQueue;Ae=!1;var n=u.firstBaseUpdate,c=u.lastBaseUpdate,i=u.shared.pending;if(i!==null){u.shared.pending=null;var f=i,v=f.next;f.next=null,c===null?n=v:c.next=v,c=f;var b=l.alternate;b!==null&&(b=b.updateQueue,i=b.lastBaseUpdate,i!==c&&(i===null?b.firstBaseUpdate=v:i.next=v,b.lastBaseUpdate=f))}if(n!==null){var T=u.baseState;c=0,b=v=f=null,i=n;do{var m=i.lane&-536870913,g=m!==i.lane;if(g?(tl&m)===m:(a&m)===m){m!==0&&m===fa&&(qi=!0),b!==null&&(b=b.next={lane:0,tag:i.tag,payload:i.payload,callback:null,next:null});l:{var z=l,C=i;m=t;var K=e;switch(C.tag){case 1:if(z=C.payload,typeof z=="function"){T=z.call(K,T,m);break l}T=z;break l;case 3:z.flags=z.flags&-65537|128;case 0:if(z=C.payload,m=typeof z=="function"?z.call(K,T,m):z,m==null)break l;T=I({},T,m);break l;case 2:Ae=!0}}m=i.callback,m!==null&&(l.flags|=64,g&&(l.flags|=8192),g=u.callbacks,g===null?u.callbacks=[m]:g.push(m))}else g={lane:m,tag:i.tag,payload:i.payload,callback:i.callback,next:null},b===null?(v=b=g,f=T):b=b.next=g,c|=m;if(i=i.next,i===null){if(i=u.shared.pending,i===null)break;g=i,i=g.next,g.next=null,u.lastBaseUpdate=g,u.shared.pending=null}}while(!0);b===null&&(f=T),u.baseState=f,u.firstBaseUpdate=v,u.lastBaseUpdate=b,n===null&&(u.shared.lanes=0),qe|=c,l.lanes=c,l.memoizedState=T}}function Po(l,t){if(typeof l!="function")throw Error(d(191,l));l.call(t)}function lr(l,t){var e=l.callbacks;if(e!==null)for(l.callbacks=null,l=0;ln?n:8;var c=U.T,i={};i.types=c!==null?c.types:null,U.T=i,af(l,!1,t,e);try{var f=u(),v=U.S;if(v!==null&&v(i,f),f!==null&&typeof f=="object"&&typeof f.then=="function"){var b=qh(f,a);Bu(l,t,b,gt(l))}else Bu(l,t,a,gt(l))}catch(T){Bu(l,t,{then:function(){},status:"rejected",reason:T},gt())}finally{Z.p=n,c!==null&&i.types!==null&&(c.types=i.types),U.T=c}}function Zh(){}function tf(l,t,e,a){if(l.tag!==5)throw Error(d(476));var u=Dr(l).queue;Cr(l,u,t,te,e===null?Zh:function(){return Ur(l),e(a)})}function Dr(l){var t=l.memoizedState;if(t!==null)return t;t={memoizedState:te,baseState:te,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:de,lastRenderedState:te},next:null};var e={};return t.next={memoizedState:e,baseState:e,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:de,lastRenderedState:e},next:null},l.memoizedState=t,l=l.alternate,l!==null&&(l.memoizedState=t),t}function Ur(l){var t=Dr(l);t.next===null&&(t=l.alternate.memoizedState),Bu(l,t.next.queue,{},gt())}function ef(){return Ql(fu)}function Rr(){return Ol().memoizedState}function Hr(){return Ol().memoizedState}function Vh(l){for(var t=l.return;t!==null;){switch(t.tag){case 24:case 3:var e=gt();l=Me(e);var a=je(t,l,e);a!==null&&(ut(a,t,e),Du(a,t,e)),t={cache:ji()},l.payload=t;return}t=t.return}}function Lh(l,t,e){var a=gt();e={lane:a,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null},In(l)?qr(t,e):(e=pi(l,t,e,a),e!==null&&(ut(e,l,a),Br(e,t,a)))}function Yr(l,t,e){var a=gt();Bu(l,t,e,a)}function Bu(l,t,e,a){var u={lane:a,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null};if(In(l))qr(t,u);else{var n=l.alternate;if(l.lanes===0&&(n===null||n.lanes===0)&&(n=t.lastRenderedReducer,n!==null))try{var c=t.lastRenderedState,i=n(c,e);if(u.hasEagerState=!0,u.eagerState=i,dt(i,c))return Mn(l,t,u,0),Sl===null&&An(),!1}catch{}finally{}if(e=pi(l,t,u,a),e!==null)return ut(e,l,a),Br(e,t,a),!0}return!1}function af(l,t,e,a){if(a={lane:2,revertLane:kf(),gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},In(l)){if(t)throw Error(d(479))}else t=pi(l,e,a,2),t!==null&&ut(t,l,2)}function In(l){var t=l.alternate;return l===L||t!==null&&t===L}function qr(l,t){Qa=Ln=!0;var e=l.pending;e===null?t.next=t:(t.next=e.next,e.next=t),l.pending=t}function Br(l,t,e){if((e&4194048)!==0){var a=t.lanes;a&=l.pendingLanes,e|=a,t.lanes=e,Bs(l,e)}}var Pn={readContext:Ql,use:kn,useCallback:_l,useContext:_l,useEffect:_l,useImperativeHandle:_l,useLayoutEffect:_l,useInsertionEffect:_l,useMemo:_l,useReducer:_l,useRef:_l,useState:_l,useDebugValue:_l,useDeferredValue:_l,useTransition:_l,useSyncExternalStore:_l,useId:_l,useHostTransitionStatus:_l,useFormState:_l,useActionState:_l,useOptimistic:_l,useMemoCache:_l,useCacheRefresh:_l,useEffectEvent:_l},Gr={readContext:Ql,use:kn,useCallback:function(l,t){return Wl().memoizedState=[l,t===void 0?null:t],l},useContext:Ql,useEffect:Tr,useImperativeHandle:function(l,t,e){e=e!=null?e.concat([l]):null,Wn(4194308,4,zr.bind(null,t,l),e)},useLayoutEffect:function(l,t){return Wn(4194308,4,l,t)},useInsertionEffect:function(l,t){Wn(4,2,l,t)},useMemo:function(l,t){var e=Wl();t=t===void 0?null:t;var a=l();if(ma){xe(!0);try{l()}finally{xe(!1)}}return e.memoizedState=[a,t],a},useReducer:function(l,t,e){var a=Wl();if(e!==void 0){var u=e(t);if(ma){xe(!0);try{e(t)}finally{xe(!1)}}}else u=t;return a.memoizedState=a.baseState=u,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:u},a.queue=l,l=l.dispatch=Lh.bind(null,L,l),[a.memoizedState,l]},useRef:function(l){var t=Wl();return l={current:l},t.memoizedState=l},useState:function(l){l=Wi(l);var t=l.queue,e=Yr.bind(null,L,t);return t.dispatch=e,[l.memoizedState,e]},useDebugValue:Pi,useDeferredValue:function(l,t){var e=Wl();return lf(e,l,t)},useTransition:function(){var l=Wi(!1);return l=Cr.bind(null,L,l.queue,!0,!1),Wl().memoizedState=l,[!1,l]},useSyncExternalStore:function(l,t,e){var a=L,u=Wl();if(J){if(e===void 0)throw Error(d(407));e=e()}else{if(e=t(),Sl===null)throw Error(d(349));(tl&127)!==0||cr(a,t,e)}u.memoizedState=e;var n={value:e,getSnapshot:t};return u.queue=n,Tr(fr.bind(null,a,n,l),[l]),a.flags|=2048,Za(9,{destroy:void 0},ir.bind(null,a,n,e,t),null),e},useId:function(){var l=Wl(),t=Sl.identifierPrefix;if(J){var e=Lt,a=Vt;e=(a&~(1<<32-ot(a)-1)).toString(32)+e,t="_"+t+"R_"+e,e=Kn++,0<\/script>",n=n.removeChild(n.firstChild);break;case"select":n=typeof a.is=="string"?c.createElement("select",{is:a.is}):c.createElement("select"),a.multiple?n.multiple=!0:a.size&&(n.size=a.size);break;default:n=typeof a.is=="string"?c.createElement(u,{is:a.is}):c.createElement(u)}}n[wl]=t,n[Pl]=a;l:for(c=t.child;c!==null;){if(c.tag===5||c.tag===6)n.appendChild(c.stateNode);else if(c.tag!==4&&c.tag!==27&&c.child!==null){c.child.return=c,c=c.child;continue}if(c===t)break l;for(;c.sibling===null;){if(c.return===null||c.return===t)break l;c=c.return}c.sibling.return=c.return,c=c.sibling}t.stateNode=n;l:switch(Ll(n,u,a),u){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break l;case"img":a=!0;break l;default:a=!1}a&&he(t)}}return Tl(t),t.subtreeFlags&=-33554433,gf(t,t.type,l===null?null:l.memoizedProps,t.pendingProps,e),null;case 6:if(l&&t.stateNode!=null)l.memoizedProps!==a&&he(t);else{if(typeof a!="string"&&t.stateNode===null)throw Error(d(166));if(l=be.current,qa(t)){if(l=t.stateNode,e=t.memoizedProps,a=null,u=Hl,u!==null)switch(u.tag){case 27:case 5:a=u.memoizedProps}l[wl]=t,l=!!(l.nodeValue===e||a!==null&&a.suppressHydrationWarning===!0||fm(l.nodeValue,e)),l||_e(t,!0)}else l=Fu(l).createTextNode(a),l[wl]=t,t.stateNode=l}return Tl(t),null;case 31:if(e=t.memoizedState,l===null||l.memoizedState!==null){if(a=qa(t),e!==null){if(l===null){if(!a)throw Error(d(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(d(557));l[wl]=t}else ua(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Tl(t),l=!1}else e=Oi(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=e),l=!0;if(!l)return t.flags&256?(mt(t),t):(mt(t),null);if((t.flags&128)!==0)throw Error(d(558))}return Tl(t),null;case 13:if(a=t.memoizedState,l===null||l.memoizedState!==null&&l.memoizedState.dehydrated!==null){if(u=qa(t),a!==null&&a.dehydrated!==null){if(l===null){if(!u)throw Error(d(318));if(u=t.memoizedState,u=u!==null?u.dehydrated:null,!u)throw Error(d(317));u[wl]=t}else ua(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Tl(t),u=!1}else u=Oi(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=u),u=!0;if(!u)return t.flags&256?(mt(t),t):(mt(t),null)}return mt(t),(t.flags&128)!==0?(t.lanes=e,t):(e=a!==null,l=l!==null&&l.memoizedState!==null,e&&(a=t.child,u=null,a.alternate!==null&&a.alternate.memoizedState!==null&&a.alternate.memoizedState.cachePool!==null&&(u=a.alternate.memoizedState.cachePool.pool),n=null,a.memoizedState!==null&&a.memoizedState.cachePool!==null&&(n=a.memoizedState.cachePool.pool),n!==u&&(a.flags|=2048)),e!==l&&e&&(t.child.flags|=8192),nc(t,t.updateQueue),Tl(t),null);case 4:return pa(),l===null&&If(t.stateNode.containerInfo),t.flags|=67108864,Tl(t),null;case 10:return oe(t.type),Tl(t),null;case 19:if(Qi(t),a=t.memoizedState,a===null)return Tl(t),null;if(u=(t.flags&128)!==0,n=a.rendering,n===null)if(u)wu(a,!1);else{if(zl!==0||l!==null&&(l.flags&128)!==0)for(l=t.child;l!==null;){if(n=Vn(l),n!==null){for(t.flags|=128,wu(a,!1),l=n.updateQueue,t.updateQueue=l,nc(t,l),t.subtreeFlags=0,l=e,e=t.child;e!==null;)Yo(e,l),e=e.sibling;return Hu(t,Zl.current&1|2),J&&fe(t,a.treeForkCount),t.child}l=l.sibling}a.tail!==null&&ft()>gc&&(t.flags|=128,u=!0,wu(a,!1),t.lanes=4194304)}else{if(!u)if(l=Vn(n),l!==null){if(t.flags|=128,u=!0,l=l.updateQueue,t.updateQueue=l,nc(t,l),wu(a,!0),a.tail===null&&a.tailMode!=="collapsed"&&a.tailMode!=="visible"&&!n.alternate&&!J)return Tl(t),null}else 2*ft()-a.renderingStartTime>gc&&e!==536870912&&(t.flags|=128,u=!0,wu(a,!1),t.lanes=4194304);a.isBackwards?(n.sibling=t.child,t.child=n):(l=a.last,l!==null?l.sibling=n:t.child=n,a.last=n)}if(a.tail!==null){l=a.tail;l:{for(e=l;e!==null;){if(e.alternate!==null){e=!1;break l}e=e.sibling}e=!0}return a.rendering=l,a.tail=l.sibling,a.renderingStartTime=ft(),l.sibling=null,n=Zl.current,n=u?n&1|2:n&1,a.tailMode==="visible"||a.tailMode==="collapsed"||!e||J?Hu(t,n):(e=n,xl(Xl,t),xl(Zl,e),kl===null&&(kl=t)),J&&fe(t,a.treeForkCount),l}return Tl(t),null;case 22:case 23:return mt(t),Gi(),a=t.memoizedState!==null,l!==null?l.memoizedState!==null!==a&&(t.flags|=8192):a&&(t.flags|=8192),a?(e&536870912)!==0&&(t.flags&128)===0&&(Tl(t),t.subtreeFlags&6&&(t.flags|=8192)):Tl(t),e=t.updateQueue,e!==null&&nc(t,e.retryQueue),e=null,l!==null&&l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(e=l.memoizedState.cachePool.pool),a=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(a=t.memoizedState.cachePool.pool),a!==e&&(t.flags|=2048),l!==null&&Gl(sa),null;case 24:return e=null,l!==null&&(e=l.memoizedState.cache),t.memoizedState.cache!==e&&(t.flags|=2048),oe(Al),Tl(t),null;case 25:return null;case 30:return t.flags|=33554432,Tl(t),null}throw Error(d(156,t.tag))}function Ih(l,t){switch(_i(t),t.tag){case 1:return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 3:return oe(Al),pa(),l=t.flags,(l&65536)!==0&&(l&128)===0?(t.flags=l&-65537|128,t):null;case 26:case 27:case 5:return on(t),null;case 31:if(t.memoizedState!==null){if(mt(t),t.alternate===null)throw Error(d(340));ua()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 13:if(mt(t),l=t.memoizedState,l!==null&&l.dehydrated!==null){if(t.alternate===null)throw Error(d(340));ua()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 19:return Qi(t),l=t.flags,l&65536?(t.flags=l&-65537|128,l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null),t.flags|=4,t):null;case 4:return pa(),null;case 10:return oe(t.type),null;case 22:case 23:return mt(t),Gi(),l!==null&&Gl(sa),l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 24:return oe(Al),null;case 25:return null;default:return null}}function od(l,t){switch(_i(t),t.tag){case 3:oe(Al),pa();break;case 26:case 27:case 5:on(t);break;case 4:pa();break;case 31:t.memoizedState!==null&&mt(t);break;case 13:mt(t);break;case 19:Qi(t);break;case 10:oe(t.type);break;case 22:case 23:mt(t),Gi(),l!==null&&Gl(sa);break;case 24:oe(Al)}}function Qu(l,t){try{var e=t.updateQueue,a=e!==null?e.lastEffect:null;if(a!==null){var u=a.next;e=u;do{if((e.tag&l)===l){a=void 0;var n=e.create,c=e.inst;a=n(),c.destroy=a}e=e.next}while(e!==u)}}catch(i){vl(t,t.return,i)}}function Re(l,t,e){try{var a=t.updateQueue,u=a!==null?a.lastEffect:null;if(u!==null){var n=u.next;a=n;do{if((a.tag&l)===l){var c=a.inst,i=c.destroy;if(i!==void 0){c.destroy=void 0,u=t;var f=e,v=i;try{v()}catch(b){vl(u,f,b)}}}a=a.next}while(a!==n)}}catch(b){vl(t,t.return,b)}}function rd(l){var t=l.updateQueue;if(t!==null){var e=l.stateNode;try{lr(t,e)}catch(a){vl(l,l.return,a)}}}function dd(l,t,e){e.props=ha(l.type,l.memoizedProps),e.state=l.memoizedState;try{e.componentWillUnmount()}catch(a){vl(l,t,a)}}function Kt(l,t){try{var e=l.ref;if(e!==null){switch(l.tag){case 26:case 27:case 5:var a=l.stateNode;break;case 30:var u=l.stateNode,n=ne(l.memoizedProps,u);(u.ref===null||u.ref.name!==n)&&(u.ref=Sm(n)),a=u.ref;break;case 7:if(l.stateNode===null){var c=new bt(l);S(l.child,!1,Xv,c,void 0,void 0),l.stateNode=c}a=l.stateNode;break;default:a=l.stateNode}typeof e=="function"?l.refCleanup=e(a):e.current=a}}catch(i){vl(l,t,i)}}function Vl(l,t){var e=l.ref,a=l.refCleanup;if(e!==null)if(typeof a=="function")try{a()}catch(u){vl(l,t,u)}finally{l.refCleanup=null,l=l.alternate,l!=null&&(l.refCleanup=null)}else if(typeof e=="function")try{e(null)}catch(u){vl(l,t,u)}else e.current=null}function cc(l,t){if((l.tag===5||l.tag===27||l.tag===6)&&l.alternate===null&&t!==null)for(var e=0;e title"))),Ll(a,t,e),a[wl]=l,Rl(a),t=a;break l;case"link":if(n=Ym("link","href",u).get(t+(e.href||""))){for(c=0;cK&&(c=K,K=C,C=c);var h=Eo(i,C),o=Eo(i,K);if(h&&o&&(g.rangeCount!==1||g.anchorNode!==h.node||g.anchorOffset!==h.offset||g.focusNode!==o.node||g.focusOffset!==o.offset)){var y=T.createRange();y.setStart(h.node,h.offset),g.removeAllRanges(),C>K?(g.addRange(y),g.extend(o.node,o.offset)):(y.setEnd(o.node,o.offset),g.addRange(y))}}}}for(T=[],g=i;g=g.parentNode;)g.nodeType===1&&T.push({element:g,left:g.scrollLeft,top:g.scrollTop});for(typeof i.focus=="function"&&i.focus(),i=0;ie?32:e,U.T=null,e=Bf,Bf=null;var n=Ht,c=It;if(El=0,ba=Ht=null,It=0,(rl&6)!==0)throw Error(d(331));var i=rl;if(rl|=4,Hd(n.current),Dd(n,n.current,c,e),rl=i,ku(0,!1),st&&typeof st.onPostCommitFiberRoot=="function")try{st.onPostCommitFiberRoot(du,n)}catch{}return!0}finally{Z.p=u,U.T=a,Wd(l,t)}}function Fd(l,t,e){t=Nt(e,t),t=cf(l.stateNode,t,2),l=je(l,t,2),l!==null&&(hu(l,2),Pt(l))}function vl(l,t,e){if(l.tag===3)Fd(l,l,e);else for(;t!==null;){if(t.tag===3){Fd(t,l,e);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(Be===null||!Be.has(a))){l=Nt(e,l),e=Jr(2),a=je(t,e,2),a!==null&&(kr(e,a,t,l),hu(a,2),Pt(a));break}}t=t.return}}function Lf(l,t,e){var a=l.pingCache;if(a===null){a=l.pingCache=new ev;var u=new Set;a.set(t,u)}else u=a.get(t),u===void 0&&(u=new Set,a.set(t,u));u.has(e)||(Hf=!0,u.add(e),l=ov.bind(null,l,t,e),t.then(l,l))}function ov(l,t,e){var a=l.pingCache;a!==null&&a.delete(t),l.pingedLanes|=l.suspendedLanes&e,l.warmLanes&=~e,Sl===l&&(tl&e)===e&&((zl===4||zl===3&&(tl&62914560)===tl&&300>ft()-yc)&&(rl&2)===0?lu(l,0):vc|=e,$a===tl&&($a=0)),Pt(l)}function Id(l,t){t===0&&(t=Ys()),l=ea(l,t),l!==null&&(hu(l,t),Pt(l))}function rv(l){var t=l.memoizedState,e=0;t!==null&&(e=t.retryLane),Id(l,e)}function dv(l,t){var e=0;switch(l.tag){case 31:case 13:var a=l.stateNode,u=l.memoizedState;u!==null&&(e=u.retryLane);break;case 19:a=l.stateNode;break;case 22:a=l.stateNode._retryCache;break;default:throw Error(d(314))}a!==null&&a.delete(t),Id(l,e)}function mv(l,t){return Jc(l,t)}var eu=null,au=null,Kf=!1,Ec=!1,Jf=!1,we=0;function Pt(l){l!==au&&l.next===null&&(au===null?eu=au=l:au=au.next=l),Ec=!0,Kf||(Kf=!0,vv())}function ku(l,t){if(!Jf&&Ec){Jf=!0;do for(var e=!1,a=eu;a!==null;){if(l!==0){var u=a.pendingLanes;if(u===0)var n=0;else{var c=a.suspendedLanes,i=a.pingedLanes;n=(1<<31-ot(42|l)+1)-1,n&=u&~(c&~i),n=n&201326741?n&201326741|1:n?n|2:0}n!==0&&(e=!0,em(a,n))}else n=tl,n=vn(a,a===Sl?n:0,a.cancelPendingCommit!==null||a.timeoutHandle!==-1),(n&3)===0||mu(a,n)||(e=!0,em(a,n));a=a.next}while(e);Jf=!1}}function hv(){Pd()}function Pd(){Ec=Kf=!1;var l=0;we!==0&&zv()&&(l=we);for(var t=ft(),e=null,a=eu;a!==null;){var u=a.next,n=lm(a,t);n===0?(a.next=null,e===null?eu=u:e.next=u,u===null&&(au=e)):(e=a,(l!==0||(n&3)!==0)&&(Ec=!0)),a=u}El!==0&&El!==5||ku(l),we!==0&&(we=0)}function lm(l,t){for(var e=l.suspendedLanes,a=l.pingedLanes,u=l.expirationTimes,n=l.pendingLanes&-62914561;0i)break;var b=f.transferSize,T=f.initiatorType;b&&sm(T)&&(f=f.responseEnd,c+=b*(fMc){C.length=z;break}y=new Promise(Dv.bind(y)),C.push(y)}}}if(0"u"?null:document;function Dm(l,t,e){var a=nu;if(a&&typeof t=="string"&&t){var u=pt(t);u='link[rel="'+l+'"][href="'+u+'"]',typeof e=="string"&&(u+='[crossorigin="'+e+'"]'),Cm.has(u)||(Cm.add(u),l={rel:l,crossOrigin:e,href:t},a.querySelector(u)===null&&(t=a.createElement("link"),Ll(t,"link",l),Rl(t),a.head.appendChild(t)))}}function Fv(l){ye.D(l),Dm("dns-prefetch",l,null)}function Iv(l,t){ye.C(l,t),Dm("preconnect",l,t)}function Pv(l,t,e){ye.L(l,t,e);var a=nu;if(a&&l&&t){var u='link[rel="preload"][as="'+pt(t)+'"]';t==="image"&&e&&e.imageSrcSet?(u+='[imagesrcset="'+pt(e.imageSrcSet)+'"]',typeof e.imageSizes=="string"&&(u+='[imagesizes="'+pt(e.imageSizes)+'"]')):u+='[href="'+pt(l)+'"]';var n=u;switch(t){case"style":n=cu(l);break;case"script":n=iu(l)}if(!(Mt.has(n)||(l=I({rel:"preload",href:t==="image"&&e&&e.imageSrcSet?void 0:l,as:t},e),Mt.set(n,l),a.querySelector(u)!==null||t==="style"&&a.querySelector(Pu(n))||t==="script"&&a.querySelector(ln(n))))){var c=a.createElement("link");Ll(c,"link",l),t==="style"&&(c[yn]=!0,c.onload=c.onerror=function(){Vs(c)}),Rl(c),a.head.appendChild(c)}}}function l1(l,t){ye.m(l,t);var e=nu;if(e&&l){var a=t&&typeof t.as=="string"?t.as:"script",u='link[rel="modulepreload"][as="'+pt(a)+'"][href="'+pt(l)+'"]',n=u;switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":n=iu(l)}if(!Mt.has(n)&&(l=I({rel:"modulepreload",href:l},t),Mt.set(n,l),e.querySelector(u)===null)){switch(a){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(e.querySelector(ln(n)))return}a=e.createElement("link"),Ll(a,"link",l),Rl(a),e.head.appendChild(a)}}}function t1(l,t,e){ye.S(l,t,e);var a=nu;if(a&&l){var u=Ea(a).hoistableStyles,n=cu(l);t=t||"default";var c=u.get(n);if(!c){var i={loading:0,preload:null};if(c=a.querySelector(Pu(n)))i.loading=5;else{l=I({rel:"stylesheet",href:l,"data-precedence":t},e),(e=Mt.get(n))&&hs(l,e);var f=c=a.createElement("link");Rl(f),Ll(f,"link",l),f._p=new Promise(function(v,b){f.onload=v,f.onerror=b}),f.addEventListener("load",function(){i.loading|=1}),f.addEventListener("error",function(){i.loading|=2}),i.loading|=4,Oc(c,t,a)}c={type:"stylesheet",instance:c,count:1,state:i},u.set(n,c)}}}function e1(l,t){ye.X(l,t);var e=nu;if(e&&l){var a=Ea(e).hoistableScripts,u=iu(l),n=a.get(u);n||(n=e.querySelector(ln(u)),n||(l=I({src:l,async:!0},t),(t=Mt.get(u))&&vs(l,t),n=e.createElement("script"),Rl(n),Ll(n,"link",l),e.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},a.set(u,n))}}function a1(l,t){ye.M(l,t);var e=nu;if(e&&l){var a=Ea(e).hoistableScripts,u=iu(l),n=a.get(u);n||(n=e.querySelector(ln(u)),n||(l=I({src:l,async:!0,type:"module"},t),(t=Mt.get(u))&&vs(l,t),n=e.createElement("script"),Rl(n),Ll(n,"link",l),e.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},a.set(u,n))}}function Um(l,t,e,a){var u=(u=be.current)?Iu(u):null;if(!u)throw Error(d(446));switch(l){case"meta":case"title":return null;case"style":return typeof e.precedence=="string"&&typeof e.href=="string"?(e=cu(e.href),t=Ea(u).hoistableStyles,a=t.get(e),a||(a={type:"style",instance:null,count:0,state:null},t.set(e,a)),a):{type:"void",instance:null,count:0,state:null};case"link":if(e.rel==="stylesheet"&&typeof e.href=="string"&&typeof e.precedence=="string"){l=cu(e.href);var n=Ea(u).hoistableStyles,c=n.get(l);if(c||(u=u.ownerDocument||u,c={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},n.set(l,c),(n=u.querySelector(Pu(l)))?n._p||(c.instance=n,c.state.loading=5):(n=Mt.get(l),n||(n={rel:"preload",as:"style",href:e.href,crossOrigin:e.crossOrigin,integrity:e.integrity,media:e.media,hrefLang:e.hrefLang,referrerPolicy:e.referrerPolicy},Mt.set(l,n)),u1(u,l,n,c.state))),t&&a===null)throw Error(d(528,""));return c}if(t&&a!==null)throw Error(d(529,""));return null;case"script":return t=e.async,e=e.src,typeof e=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(e=iu(e),t=Ea(u).hoistableScripts,a=t.get(e),a||(a={type:"script",instance:null,count:0,state:null},t.set(e,a)),a):{type:"void",instance:null,count:0,state:null};default:throw Error(d(444,l))}}function cu(l){return'href="'+pt(l)+'"'}function Pu(l){return'link[rel="stylesheet"]['+l+"]"}function Rm(l){return I({},l,{"data-precedence":l.precedence,precedence:null})}function u1(l,t,e,a){if(t=l.querySelector('link[rel="preload"][as="style"]['+t+"]")){if(t[yn]!==!0){a.loading=1;return}}else t=l.createElement("link"),t[yn]=!0,t.onload=t.onerror=Vs.bind(null,t),Ll(t,"link",e),Rl(t),l.head.appendChild(t);a.preload=t,t.addEventListener("load",function(){return a.loading|=1}),t.addEventListener("error",function(){return a.loading|=2})}function iu(l){return'[src="'+pt(l)+'"]'}function ln(l){return"script[async]"+l}function Hm(l,t,e){if(t.count++,t.instance===null)switch(t.type){case"style":var a=l.querySelector('style[data-href~="'+pt(e.href)+'"]');if(a)return t.instance=a,Rl(a),a;var u=I({},e,{"data-href":e.href,"data-precedence":e.precedence,href:null,precedence:null});return a=(l.ownerDocument||l).createElement("style"),Rl(a),Ll(a,"style",u),Oc(a,e.precedence,l),t.instance=a;case"stylesheet":u=cu(e.href);var n=l.querySelector(Pu(u));if(n)return t.state.loading|=4,t.instance=n,Rl(n),n;a=Rm(e),(u=Mt.get(u))&&hs(a,u),n=(l.ownerDocument||l).createElement("link"),Rl(n);var c=n;return c._p=new Promise(function(i,f){c.onload=i,c.onerror=f}),Ll(n,"link",a),t.state.loading|=4,Oc(n,e.precedence,l),t.instance=n;case"script":return n=iu(e.src),(u=l.querySelector(ln(n)))?(t.instance=u,Rl(u),u):(a=e,(u=Mt.get(n))&&(a=I({},e),vs(a,u)),l=l.ownerDocument||l,u=l.createElement("script"),Rl(u),Ll(u,"link",a),l.head.appendChild(u),t.instance=u);case"void":return null;default:throw Error(d(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(a=t.instance,t.state.loading|=4,Oc(a,e.precedence,l));return t.instance}function Oc(l,t,e){for(var a=e.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),u=a.length?a[a.length-1]:null,n=u,c=0;c title"):null)}function n1(l,t,e){if(e===1||t.itemProp!=null)return!1;switch(l){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return l=t.disabled,typeof t.precedence=="string"&&l==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function qm(l,t){return l==="img"&&t.src!=null&&t.src!==""&&t.onLoad==null&&t.loading!=="lazy"}function Bm(l){return!(l.type==="stylesheet"&&(l.state.loading&3)===0)}function Gm(l){return(l.width||100)*(l.height||100)*(typeof devicePixelRatio=="number"?devicePixelRatio:1)*.25}function wm(l,t){typeof t.decode=="function"&&(l.imgCount++,t.complete||(l.imgBytes+=Gm(t),l.suspenseyImages.push(t)),l=f1.bind(l),t.decode().then(l,l))}function c1(l,t,e,a){if(e.type==="stylesheet"&&(typeof a.media!="string"||matchMedia(a.media).matches!==!1)&&(e.state.loading&4)===0){if(e.instance===null){var u=cu(a.href),n=t.querySelector(Pu(u));if(n){t=n._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(l.count++,l=tn.bind(l),t.then(l,l)),e.state.loading|=4,e.instance=n,Rl(n);return}n=t.ownerDocument||t,a=Rm(a),(u=Mt.get(u))&&hs(a,u),n=n.createElement("link"),Rl(n);var c=n;c._p=new Promise(function(i,f){c.onload=i,c.onerror=f}),Ll(n,"link",a),e.instance=n}l.stylesheets===null&&(l.stylesheets=new Map),l.stylesheets.set(e,t),(t=e.state.preload)&&(e.state.loading&3)===0&&(l.count++,e=tn.bind(l),t.addEventListener("load",e),t.addEventListener("error",e))}}var Mc=0;function i1(l,t){return l.stylesheets&&l.count===0&&Cc(l,l.stylesheets),0Mc?50:800)+t);return l.unsuspend=e,function(){l.unsuspend=null,clearTimeout(a),clearTimeout(u)}}:null}function Qm(l){if(l.count===0&&(l.imgCount===0||!l.waitingForImages)){if(l.stylesheets)Cc(l,l.stylesheets);else if(l.unsuspend){var t=l.unsuspend;l.unsuspend=null,t()}}}function tn(){this.count--,Qm(this)}function f1(){this.imgCount--,Qm(this)}var jc=null;function Cc(l,t){l.stylesheets=null,l.unsuspend!==null&&(l.count++,jc=new Map,t.forEach(s1,l),jc=null,tn.call(l))}function s1(l,t){if(!(t.state.loading&4)){var e=jc.get(l);if(e)var a=e.get(null);else{e=new Map,jc.set(l,e);for(var u=l.querySelectorAll("link[data-precedence],style[data-precedence]"),n=0;n"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(x)}catch(A){console.error(A)}}return x(),_s.exports=_1(),_s.exports}var O1=z1();const A1=m0(O1),r0=x=>{let A;const N=new Set,d=(F,D)=>{const S=typeof F=="function"?F(A):F;if(!Object.is(S,A)){const _=A;A=D??(typeof S!="object"||S===null)?S:Object.assign({},A,S),N.forEach(B=>B(A,_))}},O=()=>A,W={setState:d,getState:O,getInitialState:()=>k,subscribe:F=>(N.add(F),()=>N.delete(F))},k=A=x(d,O,W);return W},M1=(x=>x?r0(x):r0),j1=x=>x;function C1(x,A=j1){const N=Gc.useSyncExternalStore(x.subscribe,Gc.useCallback(()=>A(x.getState()),[x,A]),()=>A(x.getInitialState()));return Gc.useDebugValue(N),N}const d0=x=>{const A=M1(x),N=d=>C1(A,d);return Object.assign(N,A),N},D1=(x=>x?d0(x):d0),U1=()=>typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,h0=x=>{const A=x==="system"?U1():x==="dark",N=A?"catppuccin":"zinc-light";return typeof document<"u"&&document.documentElement.setAttribute("data-theme",N),A?"dark":"light"},Bc=localStorage.getItem("hl_theme_v2"),v0=Bc==="light"||Bc==="dark"||Bc==="system"?Bc:"system",R1=h0(v0),H1=localStorage.getItem("hl_route_mode")||"auto",Y1=localStorage.getItem("hl_layout_preset")||"homepage-3col",q1=typeof window<"u"&&window.location.pathname.startsWith("/storybook")?"storybook":"dashboard",Je=D1((x,A)=>({theme:v0,resolvedTheme:R1,routeMode:H1,layoutPreset:Y1,viewMode:q1,showAgyModal:!1,showCmdPalette:!1,toast:"",actionLoading:!1,telemetry:{mini:{chip:"Apple M6 (12核)",ip:"192.168.31.164",tailscale_ip:"100.108.205.40",cpu_pct:6.5,load_1m:.85,mem_used_gb:11.8,mem_total_gb:24,mem_pct:49.2,disk_used_gb:59.9,disk_total_gb:460.4,disk_pct:13,uptime:"运行中",agy_tmux:!0},nas:{ip:"192.168.31.185",online:!0,mounted:!0,total_tb:19.94,used_tb:3.36,free_tb:16.58,pct:16.8,latest_backup:"11-06 23:17"},network:{home_wan_ip:"124.90.142.21",ai_policy:"Ai平台 → 狮城节点",sg_node:"233boy-sea",sg_egress_ip:"104.43.105.243",sg_delay_ms:68},services:{agy:!0,vaultwarden:!0,nas:!0,clash:!0,router:!0,uptime:!0}},setTheme:N=>{localStorage.setItem("hl_theme_v2",N);const d=h0(N);x({theme:N,resolvedTheme:d})},toggleTheme:()=>{const{resolvedTheme:N,setTheme:d}=A();d(N==="dark"?"light":"dark")},setRouteMode:N=>{localStorage.setItem("hl_route_mode",N),x({routeMode:N})},setLayoutPreset:N=>{localStorage.setItem("hl_layout_preset",N),x({layoutPreset:N})},setViewMode:N=>{if(typeof window<"u"){const d=N==="storybook"?"/storybook":"/";window.history.pushState({},"",d)}x({viewMode:N})},setShowAgyModal:N=>x({showAgyModal:N}),setShowCmdPalette:N=>x({showCmdPalette:N}),showToast:N=>{x({toast:N}),setTimeout(()=>{A().toast===N&&x({toast:""})},3e3)},fetchTelemetry:async()=>{try{const N=await fetch("/api/telemetry");if(N.ok){const d=await N.json();x({telemetry:d})}}catch{}},triggerAction:async(N,d)=>{const{showToast:O,fetchTelemetry:q}=A();x({actionLoading:!0}),O(d);try{const W=await(await fetch(`/api/action/${N}`,{method:"POST"})).json();O(W.message||"操作已完成"),await q()}catch{O("请求失败,请稍后重试")}finally{x({actionLoading:!1})}},copyCmd:async(N,d)=>{const{showToast:O}=A();try{await navigator.clipboard.writeText(N),O(`已复制「${d}」: ${N}`)}catch{O(N)}},getEffectiveMode:()=>{const{routeMode:N}=A();if(N!=="auto")return N;const d=window.location.hostname;return d.startsWith("192.168.")||d.startsWith("100.")||d==="localhost"?"lan":d.includes(".home.961504.xyz")||window.location.port==="10443"?"home10443":"edge443"}}));typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{const x=Je.getState();x.theme==="system"&&x.setTheme("system")});/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const B1=x=>x.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),y0=(...x)=>x.filter((A,N,d)=>!!A&&A.trim()!==""&&d.indexOf(A)===N).join(" ").trim();/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var G1={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const w1=Jl.forwardRef(({color:x="currentColor",size:A=24,strokeWidth:N=2,absoluteStrokeWidth:d,className:O="",children:q,iconNode:al,...W},k)=>Jl.createElement("svg",{ref:k,...G1,width:A,height:A,stroke:x,strokeWidth:d?Number(N)*24/Number(A):N,className:y0("lucide",O),...W},[...al.map(([F,D])=>Jl.createElement(F,D)),...Array.isArray(q)?q:[q]]));/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const qt=(x,A)=>{const N=Jl.forwardRef(({className:d,...O},q)=>Jl.createElement(w1,{ref:q,iconNode:A,className:y0(`lucide-${B1(x)}`,d),...O}));return N.displayName=`${x}`,N};/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Q1=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],g0=qt("BookOpen",Q1);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const X1=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Z1=qt("Check",X1);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const V1=[["path",{d:"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z",key:"zw3jo"}],["path",{d:"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12",key:"1wduqc"}],["path",{d:"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17",key:"kqbvx6"}]],L1=qt("Layers",V1);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const K1=[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]],J1=qt("LayoutGrid",K1);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const k1=[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]],$1=qt("Moon",k1);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const W1=[["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z",key:"12rzf8"}]],F1=qt("Palette",W1);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const I1=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M3 9h18",key:"1pudct"}],["path",{d:"M9 21V9",key:"1oto5p"}]],P1=qt("PanelsTopLeft",I1);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ly=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],b0=qt("Search",ly);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ty=[["path",{d:"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z",key:"4pj2yx"}],["path",{d:"M20 3v4",key:"1olli1"}],["path",{d:"M22 5h-4",key:"1gvqau"}],["path",{d:"M4 17v2",key:"vumght"}],["path",{d:"M5 18H3",key:"zchphs"}]],ey=qt("Sparkles",ty);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ay=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],uy=qt("Sun",ay);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ny=[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]],S0=qt("Terminal",ny),cy=[{id:"auto",label:"智能路由"},{id:"edge443",label:"443 免端口"},{id:"home10443",label:"10443 家宽"},{id:"lan",label:"LAN 局域网"}],iy=()=>{const{theme:x,resolvedTheme:A,routeMode:N,viewMode:d,telemetry:O,setTheme:q,toggleTheme:al,setRouteMode:W,setViewMode:k,setShowAgyModal:F,setShowCmdPalette:D}=Je();return s.jsxs(s.Fragment,{children:[s.jsx("header",{className:"border-b hl-border sticky top-0 z-30 backdrop-blur-md",style:{backgroundColor:"color-mix(in srgb, var(--bg-card) 88%, transparent)"},children:s.jsxs("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-14 flex items-center justify-between gap-4",children:[s.jsxs("div",{className:"flex items-center gap-4 shrink-0",children:[s.jsxs("div",{onClick:()=>k("dashboard"),className:"flex items-center gap-2.5 cursor-pointer",children:[s.jsx("img",{src:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/apple.png",alt:"Mac mini",className:"w-6 h-6 rounded"}),s.jsx("span",{className:"font-semibold text-sm tracking-tight",children:"HomeLab"}),s.jsx("span",{className:"w-2 h-2 rounded-full",style:{backgroundColor:"var(--success)"},title:"全屋 4 节点在线"})]}),s.jsx("div",{className:"h-4 w-[1px] hl-muted"}),s.jsxs("nav",{className:"flex items-center gap-1 text-xs",children:[s.jsxs("button",{onClick:()=>k("dashboard"),className:"px-2.5 py-1.5 rounded-md font-medium flex items-center gap-1.5 transition-all cursor-pointer",style:d==="dashboard"?{backgroundColor:"var(--bg-muted)",color:"var(--text-main)"}:{color:"var(--text-muted)"},children:[s.jsx(J1,{className:"w-3.5 h-3.5"}),s.jsx("span",{children:"中控台"})]}),s.jsxs("button",{onClick:()=>k("storybook"),className:"px-2.5 py-1.5 rounded-md font-medium flex items-center gap-1.5 transition-all cursor-pointer",style:d==="storybook"?{backgroundColor:"var(--bg-muted)",color:"var(--text-main)"}:{color:"var(--text-muted)"},children:[s.jsx(g0,{className:"w-3.5 h-3.5"}),s.jsx("span",{children:"Storybook 设计规范"})]})]})]}),s.jsxs("div",{className:"flex items-center gap-2.5 shrink-0 ml-auto",children:[s.jsxs("button",{onClick:()=>D(!0),className:"hl-btn-outline px-3 py-1.5 text-xs flex items-center gap-3 cursor-pointer",title:"按 Cmd+K 唤起全局命令面板",children:[s.jsxs("span",{className:"flex items-center gap-1.5",style:{color:"var(--text-muted)"},children:[s.jsx(b0,{className:"w-3.5 h-3.5"}),s.jsx("span",{className:"hidden sm:inline",children:"搜索服务或指令..."})]}),s.jsx("kbd",{className:"px-1.5 py-0.5 text-[10px] font-mono-num rounded hl-muted",style:{color:"var(--text-muted)"},children:"⌘K"})]}),s.jsxs("button",{onClick:()=>F(!0),className:"hl-btn-primary px-3 py-1.5 text-xs flex items-center gap-1.5 cursor-pointer",children:[s.jsx(S0,{className:"w-3.5 h-3.5"}),s.jsx("span",{children:"AGY 终端"})]}),s.jsxs("div",{className:"flex items-center p-0.5 rounded-lg hl-muted border hl-border text-xs",children:[s.jsx("button",{onClick:al,className:"px-2.5 py-1 rounded-md font-medium transition-all flex items-center gap-1.5 cursor-pointer",style:{backgroundColor:"var(--bg-card)",color:"var(--text-main)",boxShadow:"0 1px 2px rgba(0,0,0,0.08)"},title:"点击切换深色 / 浅色主题(默认跟随系统)",children:A==="dark"?s.jsxs(s.Fragment,{children:[s.jsx($1,{className:"w-3.5 h-3.5"}),s.jsx("span",{children:"深色"})]}):s.jsxs(s.Fragment,{children:[s.jsx(uy,{className:"w-3.5 h-3.5"}),s.jsx("span",{children:"浅色"})]})}),x!=="system"&&s.jsx("button",{onClick:()=>q("system"),className:"px-2 py-1 rounded-md text-[11px] transition-all cursor-pointer",style:{color:"var(--text-muted)"},title:"恢复跟随设备系统深浅色自动切换",children:"自动"})]})]})]})}),d==="dashboard"&&s.jsx("div",{className:"border-b hl-border",style:{backgroundColor:"var(--bg-card)"},children:s.jsxs("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-2.5 flex flex-wrap items-center justify-between gap-3",children:[s.jsxs("div",{className:"flex flex-wrap items-center gap-2 text-xs font-mono-num",children:[s.jsxs("div",{className:"hl-pill px-2.5 py-1 flex items-center gap-2",children:[s.jsx("span",{style:{color:"var(--text-muted)"},children:"M6 CPU"}),s.jsx("div",{className:"w-12 h-1.5 rounded-full hl-muted overflow-hidden",children:s.jsx("div",{className:"h-full hl-bar-fill",style:{width:`${Math.max(5,O.mini.cpu_pct)}%`}})}),s.jsxs("span",{className:"font-medium",children:[O.mini.cpu_pct,"%"]})]}),s.jsxs("div",{className:"hl-pill px-2.5 py-1 flex items-center gap-2",children:[s.jsx("span",{style:{color:"var(--text-muted)"},children:"RAM"}),s.jsx("div",{className:"w-12 h-1.5 rounded-full hl-muted overflow-hidden",children:s.jsx("div",{className:"h-full hl-bar-fill",style:{width:`${Math.max(5,O.mini.mem_pct)}%`}})}),s.jsxs("span",{className:"font-medium",children:[O.mini.mem_used_gb,"G"]})]}),s.jsxs("div",{className:"hl-pill px-2.5 py-1 flex items-center gap-2",children:[s.jsx("span",{style:{color:"var(--text-muted)"},children:"NAS 余量"}),s.jsx("div",{className:"w-12 h-1.5 rounded-full hl-muted overflow-hidden",children:s.jsx("div",{className:"h-full hl-bar-fill-green",style:{width:`${Math.max(5,O.nas.pct)}%`}})}),s.jsxs("span",{className:"font-medium",style:{color:"var(--success)"},children:[O.nas.free_tb," TB"]})]}),s.jsxs("div",{className:"hl-pill px-2.5 py-1 flex items-center gap-1.5",children:[s.jsx("span",{className:"w-1.5 h-1.5 rounded-full",style:{backgroundColor:"var(--success)"}}),s.jsx("span",{style:{color:"var(--text-muted)"},children:"SG 专线"}),s.jsx("span",{className:"font-medium",children:O.network.sg_delay_ms>0?`${O.network.sg_delay_ms}ms`:"直连"})]})]}),s.jsx("div",{className:"flex items-center p-0.5 rounded-lg hl-muted border hl-border text-xs ml-auto",children:cy.map(S=>s.jsx("button",{onClick:()=>W(S.id),className:"px-2.5 py-1 rounded-md font-medium transition-all cursor-pointer",style:N===S.id?{backgroundColor:"var(--bg-card)",color:"var(--text-main)",boxShadow:"0 1px 2px rgba(0,0,0,0.08)"}:{color:"var(--text-muted)"},children:S.label},S.id))})]})})]})},x0=({card:x})=>{const{getEffectiveMode:A,setShowAgyModal:N,triggerAction:d}=Je(),O=A(),q=O==="lan"?x.lanUrl:O==="home10443"?x.homeUrl:x.edgeUrl,al=O==="lan"?"LAN 直连":O==="home10443"?"10443":"443 免端口";return s.jsxs("a",{href:q,target:"_blank",rel:"noopener noreferrer",className:"hl-card hl-card-interactive flex flex-col justify-between overflow-hidden group cursor-pointer",children:[s.jsxs("div",{className:"p-4 sm:p-5 space-y-3",children:[s.jsxs("div",{className:"flex items-start justify-between gap-3",children:[s.jsxs("div",{className:"flex items-center gap-3.5 min-w-0",children:[s.jsx("div",{className:"w-10 h-10 rounded-xl hl-muted border hl-border p-1.5 flex items-center justify-center shrink-0",children:s.jsx("img",{src:x.iconUrl,alt:x.title,className:"w-full h-full object-contain"})}),s.jsxs("div",{className:"min-w-0",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("h3",{className:"text-sm font-semibold truncate group-hover:underline",children:x.title}),s.jsx("span",{className:"w-2 h-2 rounded-full shrink-0",style:{backgroundColor:x.online!==!1?"var(--success)":"#ef4444"}})]}),s.jsx("p",{className:"text-[11px] font-mono-num truncate mt-0.5",style:{color:"var(--text-muted)"},children:x.subtitle})]})]}),x.actionType==="drawer"?s.jsx("button",{onClick:W=>{W.preventDefault(),N(!0)},className:"px-2 py-1 rounded-md text-[11px] font-medium shrink-0 transition-opacity hover:opacity-80 cursor-pointer",style:{backgroundColor:"var(--accent-soft)",color:"var(--accent)"},children:"页内终端"}):x.actionType==="backup"?s.jsx("button",{onClick:W=>{W.preventDefault(),d("backup_nas","正在打包备份至极空间 Z4...")},className:"px-2 py-1 rounded-md text-[11px] font-medium shrink-0 transition-opacity hover:opacity-80 cursor-pointer",style:{backgroundColor:"var(--success-soft)",color:"var(--success)"},children:"立即备份"}):s.jsx("span",{className:"text-xs font-mono-num px-2 py-0.5 rounded hl-muted shrink-0",style:{color:"var(--text-muted)"},children:al})]}),s.jsx("p",{className:"text-xs leading-relaxed line-clamp-2",style:{color:"var(--text-muted)"},children:x.desc})]}),s.jsx("div",{className:"hl-widget-footer grid grid-cols-3 divide-x hl-border text-center",children:x.stats.map((W,k)=>s.jsxs("div",{className:"py-2.5 px-2 flex flex-col items-center justify-center",children:[s.jsx("span",{className:"text-[10px] uppercase tracking-wider truncate max-w-full",style:{color:"var(--text-subtle)"},children:W.label}),s.jsx("span",{className:"text-xs font-semibold font-mono-num mt-0.5 truncate max-w-full",style:{color:W.highlight?"var(--success)":"var(--text-main)"},children:W.value})]},k))})]})},fy=[{label:"SSH 连接 Mac mini",cmd:"ssh mini"},{label:"终端接力 AGY 会话",cmd:'ssh mini -t "tmux attach -t agy"'},{label:"SSH 连接新加坡 Azure",cmd:"ssh azure"},{label:"SSH 连接小米主路由",cmd:"ssh root@192.168.31.1"}],p0=()=>{const{copyCmd:x,triggerAction:A}=Je();return s.jsxs("section",{className:"space-y-3 pt-1",children:[s.jsxs("div",{className:"flex items-center justify-between px-0.5",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("h2",{className:"text-xs font-semibold uppercase tracking-wider",style:{color:"var(--text-muted)"},children:"终端快捷指令与备用直连书签"}),s.jsx("span",{className:"text-[11px] font-mono-num",style:{color:"var(--text-subtle)"},children:"· 点击指令即复制"})]}),s.jsxs("div",{className:"flex items-center gap-3 text-xs",children:[s.jsx("button",{onClick:()=>A("refresh_ddns","正在同步 Cloudflare DDNS..."),className:"hover:underline font-medium cursor-pointer",style:{color:"var(--accent)"},children:"刷新 DDNS 解析"}),s.jsx("button",{onClick:()=>A("mount_nas","正在巡检极空间 20TB SMB 挂载..."),className:"hover:underline font-medium cursor-pointer",style:{color:"var(--accent)"},children:"巡检极空间挂载"})]})]}),s.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3",children:fy.map(N=>s.jsxs("button",{onClick:()=>x(N.cmd,N.label),className:"hl-card hl-card-interactive px-4 py-3 text-left flex items-center justify-between gap-2 cursor-pointer",children:[s.jsxs("div",{className:"min-w-0",children:[s.jsx("div",{className:"text-xs font-semibold",children:N.label}),s.jsx("div",{className:"text-[11px] font-mono-num truncate mt-0.5",style:{color:"var(--accent)"},children:N.cmd})]}),s.jsx("span",{className:"text-[10px] font-mono-num px-1.5 py-0.5 rounded hl-muted shrink-0",style:{color:"var(--text-muted)"},children:"COPY"})]},N.cmd))})]})},sy=()=>{const{showCmdPalette:x,setShowCmdPalette:A,setShowAgyModal:N,setTheme:d,triggerAction:O,copyCmd:q,getEffectiveMode:al}=Je(),[W,k]=Jl.useState(""),F=Jl.useRef(null);Jl.useEffect(()=>{x&&(k(""),setTimeout(()=>{var B;return(B=F.current)==null?void 0:B.focus()},20))},[x]);const D=Jl.useMemo(()=>{const B=al(),G=($,ul,Bl)=>B==="lan"?Bl:B==="home10443"?ul:$;return[{id:"open-agy-drawer",title:"在页内唤起 AGY 云端终端",hint:"tmux attach -t agy",type:"终端",run:()=>N(!0)},{id:"open-agy",title:"新窗口打开 AGY 云端工作台",hint:"https://agy.961504.xyz",type:"跳转",run:()=>window.open(G("https://agy.961504.xyz","https://agy.home.961504.xyz:10443","http://192.168.31.164:7681"),"_blank")},{id:"open-z4",title:"打开 极空间 Z4 私有云 (20TB)",hint:"192.168.31.185:5055",type:"跳转",run:()=>window.open(G("https://z4.home.961504.xyz:10443","https://z4.home.961504.xyz:10443","http://192.168.31.185:5055"),"_blank")},{id:"open-vw",title:"打开 Vaultwarden 密码保险箱",hint:"https://vw.961504.xyz",type:"跳转",run:()=>window.open(G("https://vw.961504.xyz","https://vw.home.961504.xyz:10443","http://192.168.31.164:8222"),"_blank")},{id:"open-clash",title:"打开 Mihomo 路由分流面板",hint:"192.168.31.1:9999",type:"跳转",run:()=>window.open(G("https://clash.home.961504.xyz:10443/ui/","https://clash.home.961504.xyz:10443/ui/","http://192.168.31.1:9999/ui/"),"_blank")},{id:"act-backup",title:"立即打包备份核心数据至极空间 Z4",hint:"backup-to-nas.sh",type:"运维",run:()=>O("backup_nas","正在打包备份至极空间 Z4...")},{id:"act-ddns",title:"立即刷新 Cloudflare DDNS 解析",hint:"cloudflare-ddns.sh",type:"运维",run:()=>O("refresh_ddns","正在同步 Cloudflare DDNS...")},{id:"ssh-mini",title:"复制 SSH 连接 Mac mini 指令",hint:"ssh mini",type:"SSH",run:()=>q("ssh mini","SSH Mac mini")},{id:"ssh-agy",title:"复制 终端接力 AGY 会话指令",hint:'ssh mini -t "tmux attach -t agy"',type:"SSH",run:()=>q('ssh mini -t "tmux attach -t agy"',"接力 AGY")},{id:"theme-system",title:"主题模式: 跟随设备系统深浅色自动切换",hint:"system",type:"主题",run:()=>d("system")},{id:"theme-light",title:"切换主题: 浅色纯净 (Light)",hint:"light",type:"主题",run:()=>d("light")},{id:"theme-dark",title:"切换主题: 深色极客 (Dark)",hint:"dark",type:"主题",run:()=>d("dark")}]},[al,N,d,O,q]),S=Jl.useMemo(()=>{const B=W.trim().toLowerCase();return B?D.filter(G=>G.title.toLowerCase().includes(B)||G.hint.toLowerCase().includes(B)):D},[W,D]);if(!x)return null;const _=B=>{A(!1),B.run()};return s.jsx("div",{onClick:B=>{B.target===B.currentTarget&&A(!1)},className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-start justify-center pt-20 px-4",children:s.jsxs("div",{className:"w-full max-w-xl hl-card overflow-hidden shadow-2xl",children:[s.jsxs("div",{className:"px-4 py-3 border-b hl-border flex items-center gap-3",children:[s.jsx(b0,{className:"w-4 h-4",style:{color:"var(--text-muted)"}}),s.jsx("input",{ref:F,value:W,onChange:B=>k(B.target.value),type:"text",placeholder:"输入服务名称、SSH 指令、路由模式或主题...",className:"w-full bg-transparent text-sm outline-none",onKeyDown:B=>{B.key==="Escape"&&A(!1),B.key==="Enter"&&S.length>0&&_(S[0])}}),s.jsx("kbd",{className:"px-1.5 py-0.5 text-[10px] font-mono-num rounded hl-muted",style:{color:"var(--text-muted)"},children:"ESC"})]}),s.jsxs("div",{className:"max-h-80 overflow-y-auto p-2 text-xs",children:[s.jsx("div",{className:"px-2.5 py-1 text-[10px] font-semibold uppercase tracking-wider",style:{color:"var(--text-subtle)"},children:"快速操作与服务直达"}),S.map(B=>s.jsxs("button",{onClick:()=>_(B),className:"w-full px-3 py-2 rounded-lg text-left flex items-center justify-between transition-colors cursor-pointer",onMouseEnter:G=>{G.currentTarget.style.backgroundColor="var(--bg-muted)"},onMouseLeave:G=>{G.currentTarget.style.backgroundColor="transparent"},children:[s.jsxs("div",{className:"flex items-center gap-2.5",children:[s.jsx("span",{className:"font-medium",children:B.title}),s.jsx("span",{className:"font-mono-num text-[11px]",style:{color:"var(--text-muted)"},children:B.hint})]}),s.jsx("span",{className:"text-[10px] font-mono-num px-1.5 py-0.5 rounded hl-muted",style:{color:"var(--text-muted)"},children:B.type})]},B.id))]})]})})},oy=()=>{const{showAgyModal:x,setShowAgyModal:A,getEffectiveMode:N}=Je();if(!x)return null;const d=N(),O=d==="lan"?"http://192.168.31.164:7681":d==="home10443"?"https://agy.home.961504.xyz:10443":"https://agy.961504.xyz";return s.jsx("div",{className:"fixed inset-0 z-50 bg-black/75 backdrop-blur-sm flex items-center justify-center p-3 sm:p-6",children:s.jsxs("div",{className:"w-full h-full max-w-6xl hl-card flex flex-col overflow-hidden shadow-2xl",children:[s.jsxs("div",{className:"px-4 py-2.5 border-b hl-border flex items-center justify-between hl-muted",children:[s.jsxs("div",{className:"flex items-center gap-2.5",children:[s.jsx("img",{src:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/google-gemini.png",alt:"AGY",className:"w-4 h-4"}),s.jsx("span",{className:"text-xs font-mono-num font-medium",children:"AGY 云端工作台 · tmux 持久会话 (关窗不断连)"})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("a",{href:O,target:"_blank",rel:"noopener noreferrer",className:"hl-btn-outline px-2.5 py-1 text-xs font-mono-num",children:"新标签页全屏 ↗"}),s.jsx("button",{onClick:()=>A(!1),className:"hl-btn-primary px-3 py-1 text-xs cursor-pointer",children:"收起终端"})]})]}),s.jsx("iframe",{src:O,title:"AGY Cloud Workbench",className:"w-full flex-1 bg-black border-0"})]})})},ry={light:{id:"light",name:"Shadcn Clean Light (浅色纯净)",description:"对标 Apple / Stripe / Linear 浅色日光模式,高对比深灰文字配纯净白卡片与冷灰微边框。",tokens:{"--bg-page":"#f8fafc","--bg-card":"#ffffff","--bg-widget":"#f8fafc","--bg-muted":"#f1f5f9","--bg-hover":"#ffffff","--text-main":"#0f172a","--text-muted":"#64748b","--text-subtle":"#94a3b8","--border-color":"#e2e8f0","--border-hover":"#cbd5e1","--primary":"#0f172a","--primary-fg":"#ffffff","--accent":"#2563eb","--accent-soft":"rgba(37, 99, 235, 0.08)","--success":"#10b981","--success-soft":"rgba(16, 185, 129, 0.10)"}},dark:{id:"dark",name:"Catppuccin / Linear Dark (深色极客)",description:"融合 Catppuccin Mocha 与 Linear 暗黑规范,柔和护眼的深邃蓝黑基底配高辨识度状态色。",tokens:{"--bg-page":"#11111b","--bg-card":"#1e1e2e","--bg-widget":"#181825","--bg-muted":"#313244","--bg-hover":"#242438","--text-main":"#cdd6f4","--text-muted":"#a6adc8","--text-subtle":"#6c7086","--border-color":"#313244","--border-hover":"#45475a","--primary":"#cba6f7","--primary-fg":"#11111b","--accent":"#89b4fa","--accent-soft":"rgba(137, 180, 250, 0.15)","--success":"#a6e3a1","--success-soft":"rgba(166, 227, 161, 0.15)"}}},wc={"homepage-3col":{id:"homepage-3col",name:"Homepage 经典三列矩阵 (3-Column Grid)",description:"gethomepage.dev 标志性对称 3 列分组卡片,底部内嵌 3 格实时遥测单元。",gridClass:"grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},"bento-split":{id:"bento-split",name:"Shadcn 双列宽屏卡片 (2-Column Wide Bento)",description:"适合大字号阅读的 2 列宽体卡片布局,留白更充裕。",gridClass:"grid-cols-1 lg:grid-cols-2 gap-5"},"compact-2col":{id:"compact-2col",name:"高密度四列紧凑矩阵 (4-Column Dense)",description:"适合超宽显示器的一屏高密度 4 列布局。",gridClass:"grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3.5"}},dy=()=>{const[x,A]=Jl.useState("layout-architecture"),{theme:N,resolvedTheme:d,layoutPreset:O,setTheme:q,setLayoutPreset:al,setViewMode:W,telemetry:k}=Je(),[F,D]=Jl.useState(!0),[S,_]=Jl.useState("drawer"),B=[{id:"layout-architecture",group:"FOUNDATIONS / 架构与布局",title:"01. AppShell 双层顶栏与网格布局",icon:s.jsx(P1,{className:"w-3.5 h-3.5"})},{id:"theme-tokens",group:"FOUNDATIONS / 架构与布局",title:"02. 双主题色板与自动切换规范",icon:s.jsx(F1,{className:"w-3.5 h-3.5"})},{id:"service-card",group:"COMPONENTS / 核心组件",title:"03. ServiceCard 内联遥测卡片",icon:s.jsx(L1,{className:"w-3.5 h-3.5"})},{id:"ssh-shelf",group:"COMPONENTS / 核心组件",title:"04. SshShelf 快捷指令栏",icon:s.jsx(S0,{className:"w-3.5 h-3.5"})}];return s.jsx("div",{className:"flex-1 max-w-7xl w-full mx-auto px-4 sm:px-6 lg:px-8 py-6",children:s.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-4 gap-6 items-start",children:[s.jsxs("aside",{className:"hl-card p-4 space-y-4 lg:sticky lg:top-20",children:[s.jsxs("div",{className:"flex items-center justify-between border-b hl-border pb-3",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx(g0,{className:"w-4 h-4",style:{color:"var(--accent)"}}),s.jsx("span",{className:"text-xs font-bold uppercase tracking-wider",children:"Storybook 组件库"})]}),s.jsx("span",{className:"text-[10px] font-mono-num px-1.5 py-0.5 rounded hl-muted",children:"v3.1"})]}),s.jsx("div",{className:"space-y-1",children:B.map(G=>s.jsxs("button",{onClick:()=>A(G.id),className:"w-full px-3 py-2 rounded-lg text-left text-xs font-medium flex items-center gap-2.5 transition-all cursor-pointer",style:x===G.id?{backgroundColor:"var(--accent-soft)",color:"var(--accent)"}:{color:"var(--text-muted)"},children:[G.icon,s.jsx("span",{className:"truncate",children:G.title})]},G.id))}),s.jsxs("div",{className:"pt-3 border-t hl-border space-y-2 text-xs",children:[s.jsx("div",{className:"text-[11px] font-semibold",style:{color:"var(--text-muted)"},children:"全局外观状态预览"}),s.jsx("div",{className:"grid grid-cols-3 gap-1 p-1 rounded-lg hl-muted border hl-border",children:["system","light","dark"].map(G=>s.jsx("button",{onClick:()=>q(G),className:"py-1 rounded text-[11px] font-medium cursor-pointer",style:N===G?{backgroundColor:"var(--bg-card)",color:"var(--text-main)"}:{color:"var(--text-muted)"},children:G==="system"?"自动":G==="light"?"浅色":"深色"},G))}),s.jsx("button",{onClick:()=>W("dashboard"),className:"w-full hl-btn-primary py-2 text-xs text-center mt-2 cursor-pointer",children:"返回中控台主页"})]})]}),s.jsxs("div",{className:"lg:col-span-3 space-y-6",children:[x==="layout-architecture"&&s.jsx("div",{className:"space-y-6",children:s.jsxs("div",{className:"hl-card p-6 space-y-4",children:[s.jsx("div",{className:"flex items-center justify-between border-b hl-border pb-4",children:s.jsxs("div",{children:[s.jsx("span",{className:"text-[11px] font-mono-num uppercase tracking-wider",style:{color:"var(--accent)"},children:"Foundations / AppShell Layout"}),s.jsx("h2",{className:"text-lg font-bold mt-0.5",children:"标准双层顶栏架构 (Two-Tier AppShell) & 响应式网格切换"})]})}),s.jsxs("p",{className:"text-xs leading-relaxed",style:{color:"var(--text-muted)"},children:["参考 ",s.jsx("strong",{children:"Vercel Geist / shadcn/ui Dashboard-01 / GitHub AppShell"})," ","标准规范,将原本容易挤压折行的单层顶栏拆分为职责清晰的双层结构:"]}),s.jsxs("div",{className:"p-4 rounded-xl hl-muted border hl-border space-y-2.5 font-mono-num text-xs",children:[s.jsxs("div",{className:"p-3 rounded-lg hl-card flex items-center justify-between",children:[s.jsx("span",{children:"[左] 🍎 HomeLab · 导航切换 (中控台 / Storybook)"}),s.jsx("span",{style:{color:"var(--accent)"},children:"[最右固定] 🔍 搜索 ⌘K · >_ AGY 终端 · ☀️/🌙 主题切换"})]}),s.jsxs("div",{className:"p-3 rounded-lg hl-card flex items-center justify-between",children:[s.jsx("span",{style:{color:"var(--success)"},children:"[左] 实时硬件遥测条 (M6 CPU · RAM · Z4 20TB · SG 专线)"}),s.jsx("span",{children:"[右对齐] 路由模式切换器 (智能路由 / 443 / 10443 / LAN)"})]})]}),s.jsxs("div",{className:"pt-2 space-y-3",children:[s.jsx("div",{className:"text-xs font-semibold",children:"选择主页卡片网格布局预设(点击立即应用到主页):"}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-3.5",children:Object.keys(wc).map(G=>{const $=wc[G],ul=O===G;return s.jsxs("div",{onClick:()=>al(G),className:"hl-card hl-card-interactive p-4 cursor-pointer space-y-2",style:ul?{borderColor:"var(--accent)"}:{},children:[s.jsxs("div",{className:"flex items-center justify-between",children:[s.jsx("span",{className:"text-xs font-bold",children:$.name}),ul&&s.jsx("span",{className:"w-4 h-4 rounded-full flex items-center justify-center",style:{backgroundColor:"var(--accent)",color:"#fff"},children:s.jsx(Z1,{className:"w-2.5 h-2.5"})})]}),s.jsx("p",{className:"text-[11px]",style:{color:"var(--text-muted)"},children:$.description}),s.jsx("code",{className:"text-[10px] font-mono-num block pt-1",style:{color:"var(--accent)"},children:$.gridClass})]},G)})})]})]})}),x==="theme-tokens"&&s.jsxs("div",{className:"hl-card p-6 space-y-6",children:[s.jsxs("div",{className:"border-b hl-border pb-4 flex items-center justify-between",children:[s.jsxs("div",{children:[s.jsx("span",{className:"text-[11px] font-mono-num uppercase tracking-wider",style:{color:"var(--accent)"},children:"Foundations / Color System"}),s.jsxs("h2",{className:"text-lg font-bold mt-0.5",children:["主流双主题色板规范(当前生效:",d==="dark"?"深色极客":"浅色纯净",")"]})]}),s.jsxs("span",{className:"text-xs font-mono-num px-2.5 py-1 rounded hl-muted",children:["模式: ",N==="system"?"跟随设备自动切换":"手动锁定"]})]}),s.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-5",children:["light","dark"].map(G=>{const $=ry[G];return s.jsxs("div",{className:"rounded-xl p-5 space-y-4 border",style:{backgroundColor:$.tokens["--bg-page"],color:$.tokens["--text-main"],borderColor:$.tokens["--border-color"]},children:[s.jsxs("div",{className:"flex items-center justify-between border-b pb-3",style:{borderColor:$.tokens["--border-color"]},children:[s.jsxs("div",{children:[s.jsx("div",{className:"text-sm font-bold",children:$.name}),s.jsx("div",{className:"text-xs mt-0.5",style:{color:$.tokens["--text-muted"]},children:$.description})]}),s.jsx("button",{onClick:()=>q(G),className:"px-2.5 py-1 rounded-md text-xs font-mono-num font-semibold cursor-pointer",style:{backgroundColor:$.tokens["--primary"],color:$.tokens["--primary-fg"]},children:"预览此主题"})]}),s.jsx("div",{className:"grid grid-cols-2 gap-2",children:Object.entries($.tokens).map(([ul,Bl])=>s.jsxs("div",{className:"p-2 rounded-lg border flex items-center gap-2",style:{backgroundColor:$.tokens["--bg-card"],borderColor:$.tokens["--border-color"]},children:[s.jsx("span",{className:"w-5 h-5 rounded border shrink-0",style:{backgroundColor:Bl,borderColor:$.tokens["--border-hover"]}}),s.jsxs("div",{className:"min-w-0",children:[s.jsx("div",{className:"text-[10px] font-mono-num font-semibold truncate",children:ul}),s.jsx("div",{className:"text-[10px] font-mono-num truncate",style:{color:$.tokens["--text-muted"]},children:Bl})]})]},ul))})]},$.id)})})]}),x==="service-card"&&s.jsxs("div",{className:"hl-card p-6 space-y-6",children:[s.jsxs("div",{className:"border-b hl-border pb-4 flex items-center justify-between",children:[s.jsxs("div",{children:[s.jsx("span",{className:"text-[11px] font-mono-num uppercase tracking-wider",style:{color:"var(--accent)"},children:"Components / ServiceCard"}),s.jsx("h2",{className:"text-lg font-bold mt-0.5",children:"三段式内联遥测卡片 (ServiceCard Interactive Story)"})]}),s.jsx(ey,{className:"w-4 h-4",style:{color:"var(--accent)"}})]}),s.jsxs("div",{className:"p-4 rounded-xl hl-muted border hl-border flex flex-wrap items-center gap-6 text-xs",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"font-semibold",children:"在线状态 (online):"}),s.jsx("button",{onClick:()=>D(!F),className:"px-2.5 py-1 rounded hl-card font-mono-num cursor-pointer",children:F?"true (绿灯)":"false (离线红灯)"})]}),s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("span",{className:"font-semibold",children:"右上角动作按钮 (actionType):"}),["drawer","backup",void 0].map((G,$)=>s.jsx("button",{onClick:()=>_(G),className:"px-2.5 py-1 rounded hl-card font-mono-num cursor-pointer",style:S===G?{borderColor:"var(--accent)"}:{},children:G||"route-badge"},$))]})]}),s.jsx("div",{className:"max-w-md mx-auto py-4",children:s.jsx(x0,{card:{id:"agy",title:"AGY 云端工作台",subtitle:"agy.961504.xyz · ttyd + tmux",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/google-gemini.png",online:F,actionType:S,desc:"M6 Mac mini 上的 24 小时常驻 AI 编程终端,已同步 Google 登录态并锁定新加坡出口,关掉网页后台继续运行。",edgeUrl:"https://agy.961504.xyz",homeUrl:"https://agy.home.961504.xyz:10443",lanUrl:"http://192.168.31.164:7681",stats:[{label:"M6 CPU 负载",value:`${k.mini.cpu_pct}%`},{label:"已用内存",value:`${k.mini.mem_used_gb} / 24 GB`},{label:"tmux 会话",value:"常驻运行中",highlight:!0}]}})})]}),x==="ssh-shelf"&&s.jsxs("div",{className:"hl-card p-6 space-y-6",children:[s.jsxs("div",{className:"border-b hl-border pb-4",children:[s.jsx("span",{className:"text-[11px] font-mono-num uppercase tracking-wider",style:{color:"var(--accent)"},children:"Components / SshShelf"}),s.jsx("h2",{className:"text-lg font-bold mt-0.5",children:"底部 SSH 快捷复制与运维操作栏"})]}),s.jsx(p0,{})]})]})]})})},my=()=>{var S;const{telemetry:x,toast:A,viewMode:N,layoutPreset:d,fetchTelemetry:O,setShowCmdPalette:q,getEffectiveMode:al,routeMode:W}=Je();Jl.useEffect(()=>{O();const _=setInterval(O,3e3),B=G=>{(G.metaKey||G.ctrlKey)&&G.key.toLowerCase()==="k"&&(G.preventDefault(),q(!0))};return window.addEventListener("keydown",B),()=>{clearInterval(_),window.removeEventListener("keydown",B)}},[O,q]);const k=Jl.useMemo(()=>{const _=al();return _==="lan"?"LAN 局域网极速直连 (192.168.31.x)":_==="home10443"?"10443 家宽公网 HTTPS 直连":"443 免端口 HTTPS 直达 (*.961504.xyz)"},[al,W]),F=((S=wc[d])==null?void 0:S.gridClass)||wc["homepage-3col"].gridClass,D=Jl.useMemo(()=>{const _=x;return[{title:"核心工作台与私有云存储",subtitle:"Core Workbench & Storage",showRouteHint:!0,items:[{id:"agy",title:"AGY 云端工作台",subtitle:"agy.961504.xyz · ttyd + tmux",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/google-gemini.png",online:_.services.agy,actionType:"drawer",desc:"M6 Mac mini 上的 24 小时常驻 AI 编程终端,已同步 Google 登录态并锁定新加坡出口,关掉网页后台继续运行。",edgeUrl:"https://agy.961504.xyz",homeUrl:"https://agy.home.961504.xyz:10443",lanUrl:"http://192.168.31.164:7681",stats:[{label:"M6 CPU 负载",value:`${_.mini.cpu_pct}%`},{label:"已用内存",value:`${_.mini.mem_used_gb} / 24 GB`},{label:"tmux 会话",value:_.mini.agy_tmux?"常驻运行中":"待机",highlight:!0}]},{id:"zspace",title:"极空间 Z4 私有云",subtitle:"192.168.31.185 · 20TB RAID 存储池",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/synology-drive.png",online:_.services.nas,desc:"家庭 20TB 大容量存储中心、极影视蓝光影院与手机相册备份,已自动 SMB 挂载至 Mac mini ~/nas。",edgeUrl:"https://z4.home.961504.xyz:10443",homeUrl:"https://z4.home.961504.xyz:10443",lanUrl:"http://192.168.31.185:5055",stats:[{label:"剩余可用",value:`${_.nas.free_tb} TB`,highlight:!0},{label:"已用容量",value:`${_.nas.used_tb} TB (${_.nas.pct}%)`},{label:"SMB 挂载",value:_.nas.mounted?"~/nas 已挂载":"重连中"}]},{id:"vaultwarden",title:"Vaultwarden 密码保险箱",subtitle:"vw.961504.xyz · Bitwarden 兼容",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/vaultwarden.png",online:_.services.vaultwarden,actionType:"backup",desc:"自托管全平台加密密码库,支持 iOS / Android / 浏览器插件自动填充,每天凌晨 03:30 自动打包灾备至极空间。",edgeUrl:"https://vw.961504.xyz",homeUrl:"https://vw.home.961504.xyz:10443",lanUrl:"http://192.168.31.164:8222",stats:[{label:"容器状态",value:"Healthy",highlight:!0},{label:"最近极空间灾备",value:_.nas.latest_backup},{label:"Mac SSD 占用",value:`${_.mini.disk_pct}%`}]}]},{title:"网络网关、AI 专线与外部哨兵",subtitle:"Network Gateway & Cloud Edge",showRouteHint:!1,items:[{id:"clash",title:"Mihomo 路由分流面板",subtitle:"192.168.31.1:9999 · ShellCrash",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/clash.png",online:_.services.clash,desc:"小米主路由器透明网关控制台,实时监控全屋设备流量、分流规则与狮城 AI 算力专线锁定状态。",edgeUrl:"https://clash.home.961504.xyz:10443/ui/",homeUrl:"https://clash.home.961504.xyz:10443/ui/",lanUrl:"http://192.168.31.1:9999/ui/",stats:[{label:"AI 锁定策略",value:"狮城节点",highlight:!0},{label:"新加坡延迟",value:_.network.sg_delay_ms>0?`${_.network.sg_delay_ms} ms`:"直连"},{label:"固定出口 IP",value:_.network.sg_egress_ip}]},{id:"router",title:"小米主路由器后台",subtitle:"192.168.31.1 · PPPoE 公网网关",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/openwrt.png",online:_.services.router,desc:"管理家庭联通公网宽带拨号、DHCP 静态 IP 绑定、10443 与 41641 端口转发及全屋内网 Split-DNS。",edgeUrl:"https://router.home.961504.xyz:10443",homeUrl:"https://router.home.961504.xyz:10443",lanUrl:"http://192.168.31.1",stats:[{label:"联通公网 IPv4",value:_.network.home_wan_ip,highlight:!0},{label:"泛域名 DDNS",value:"*.home.961504.xyz"},{label:"内网网关",value:"192.168.31.1"}]},{id:"uptime",title:"Uptime Kuma 外部哨兵",subtitle:"status.961504.xyz · SG Azure",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/uptime-kuma.png",online:_.services.uptime,desc:"独立部署在新加坡 Azure 公有云上的 24 小时外部监控哨兵,通过 Tailscale P2P 专线实时探测家庭服务。",edgeUrl:"https://status.961504.xyz",homeUrl:"https://status.961504.xyz",lanUrl:"https://status.961504.xyz",stats:[{label:"云端公网 IP",value:"104.43.105.243"},{label:"Tailscale 专线",value:"100.115.204.51"},{label:"外部探测状态",value:"100% 在线",highlight:!0}]}]}]},[x]);return s.jsxs("div",{className:"min-h-screen flex flex-col",children:[A&&s.jsxs("div",{className:"fixed bottom-5 right-5 z-50 hl-card px-4 py-3 flex items-center gap-2.5 shadow-2xl",children:[s.jsx("span",{className:"w-2 h-2 rounded-full",style:{backgroundColor:"var(--success)"}}),s.jsx("span",{className:"text-xs font-medium",children:A})]}),s.jsx(iy,{}),N==="storybook"?s.jsx(dy,{}):s.jsxs("main",{className:"flex-1 max-w-7xl w-full mx-auto px-4 sm:px-6 lg:px-8 py-6 space-y-7",children:[D.map(_=>s.jsxs("section",{className:"space-y-3",children:[s.jsxs("div",{className:"flex items-center justify-between px-0.5",children:[s.jsxs("div",{className:"flex items-center gap-2",children:[s.jsx("h2",{className:"text-xs font-semibold uppercase tracking-wider",style:{color:"var(--text-muted)"},children:_.title}),s.jsxs("span",{className:"text-[11px] font-mono-num",style:{color:"var(--text-subtle)"},children:["· ",_.subtitle]})]}),_.showRouteHint&&s.jsxs("span",{className:"text-[11px] font-mono-num hidden sm:inline",style:{color:"var(--text-subtle)"},children:["当前路由模式: ",k]})]}),s.jsx("div",{className:`grid ${F}`,children:_.items.map(B=>s.jsx(x0,{card:B},B.id))})]},_.title)),s.jsx(p0,{})]}),s.jsx(sy,{}),s.jsx(oy,{})]})};A1.createRoot(document.getElementById("root")).render(s.jsx(Gc.StrictMode,{children:s.jsx(my,{})})); diff --git a/stacks/portal/dist/assets/index-KlI07XBk.js b/stacks/portal/dist/assets/index-KlI07XBk.js deleted file mode 100644 index 491d49d..0000000 --- a/stacks/portal/dist/assets/index-KlI07XBk.js +++ /dev/null @@ -1,89 +0,0 @@ -(function(){const p=document.createElement("link").relList;if(p&&p.supports&&p.supports("modulepreload"))return;for(const A of document.querySelectorAll('link[rel="modulepreload"]'))o(A);new MutationObserver(A=>{for(const q of A)if(q.type==="childList")for(const nl of q.addedNodes)nl.tagName==="LINK"&&nl.rel==="modulepreload"&&o(nl)}).observe(document,{childList:!0,subtree:!0});function N(A){const q={};return A.integrity&&(q.integrity=A.integrity),A.referrerPolicy&&(q.referrerPolicy=A.referrerPolicy),A.crossOrigin==="use-credentials"?q.credentials="include":A.crossOrigin==="anonymous"?q.credentials="omit":q.credentials="same-origin",q}function o(A){if(A.ep)return;A.ep=!0;const q=N(A);fetch(A.href,q)}})();function m0(b){return b&&b.__esModule&&Object.prototype.hasOwnProperty.call(b,"default")?b.default:b}var zs={exports:{}},an={};/** - * @license React - * react-jsx-runtime.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var l0;function ry(){if(l0)return an;l0=1;var b=Symbol.for("react.transitional.element"),p=Symbol.for("react.fragment");function N(o,A,q){var nl=null;if(q!==void 0&&(nl=""+q),A.key!==void 0&&(nl=""+A.key),"key"in A){q={};for(var ll in A)ll!=="key"&&(q[ll]=A[ll])}else q=A;return A=q.ref,{$$typeof:b,type:o,key:nl,ref:A!==void 0?A:null,props:q}}return an.Fragment=p,an.jsx=N,an.jsxs=N,an}var t0;function vy(){return t0||(t0=1,zs.exports=ry()),zs.exports}var E=vy(),_s={exports:{}},L={};/** - * @license React - * react.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var e0;function hy(){if(e0)return L;e0=1;var b=Symbol.for("react.transitional.element"),p=Symbol.for("react.portal"),N=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),A=Symbol.for("react.profiler"),q=Symbol.for("react.consumer"),nl=Symbol.for("react.context"),ll=Symbol.for("react.forward_ref"),U=Symbol.for("react.suspense"),J=Symbol.for("react.memo"),C=Symbol.for("react.lazy"),S=Symbol.for("react.activity"),B=Symbol.for("react.view_transition"),Z=Symbol.iterator;function El(d){return d===null||typeof d!="object"?null:(d=Z&&d[Z]||d["@@iterator"],typeof d=="function"?d:null)}var wl={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},vl=Object.assign,kl={};function nt(d,_,H){this.props=d,this.context=_,this.refs=kl,this.updater=H||wl}nt.prototype.isReactComponent={},nt.prototype.setState=function(d,_){if(typeof d!="object"&&typeof d!="function"&&d!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,d,_,"setState")},nt.prototype.forceUpdate=function(d){this.updater.enqueueForceUpdate(this,d,"forceUpdate")};function Ke(){}Ke.prototype=nt.prototype;function Bt(d,_,H){this.props=d,this.context=_,this.refs=kl,this.updater=H||wl}var qt=Bt.prototype=new Ke;qt.constructor=Bt,vl(qt,nt.prototype),qt.isPureReactComponent=!0;var it=Array.isArray;function W(){}var il={H:null,A:null,T:null,S:null},Gt=Object.prototype.hasOwnProperty;function bt(d,_,H){var Y=H.ref;return{$$typeof:b,type:d,key:_,ref:Y!==void 0?Y:null,props:H}}function Tt(d,_){return bt(d.type,_,d.props)}function ct(d){return typeof d=="object"&&d!==null&&d.$$typeof===b}function ye(d){var _={"=":"=0",":":"=2"};return"$"+d.replace(/[=:]/g,function(H){return _[H]})}var Je=/\/+/g;function Cl(d,_){return typeof d=="object"&&d!==null&&d.key!=null?ye(""+d.key):_.toString(36)}function O(d){switch(d.status){case"fulfilled":return d.value;case"rejected":throw d.reason;default:switch(typeof d.status=="string"?d.then(W,W):(d.status="pending",d.then(function(_){d.status==="pending"&&(d.status="fulfilled",d.value=_)},function(_){d.status==="pending"&&(d.status="rejected",d.reason=_)})),d.status){case"fulfilled":return d.value;case"rejected":throw d.reason}}throw d}function Q(d,_,H,Y,el){var ul=typeof d;(ul==="undefined"||ul==="boolean")&&(d=null);var cl=!1;if(d===null)cl=!0;else switch(ul){case"bigint":case"string":case"number":cl=!0;break;case"object":switch(d.$$typeof){case b:case p:cl=!0;break;case C:return cl=d._init,Q(cl(d._payload),_,H,Y,el)}}if(cl)return el=el(d),cl=Y===""?"."+Cl(d,0):Y,it(el)?(H="",cl!=null&&(H=cl.replace(Je,"$&/")+"/"),Q(el,_,H,"",function(le){return le})):el!=null&&(ct(el)&&(el=Tt(el,H+(el.key==null||d&&d.key===el.key?"":(""+el.key).replace(Je,"$&/")+"/")+cl)),_.push(el)),1;cl=0;var R=Y===""?".":Y+":";if(it(d))for(var V=0;V>>1,sl=O[yl];if(0>>1;ylA($e,X))dA(_,$e)?(O[yl]=_,O[d]=X,yl=d):(O[yl]=$e,O[Pt]=X,yl=Pt);else if(dA(_,X))O[yl]=_,O[d]=X,yl=d;else break l}}return Q}function A(O,Q){var X=O.sortIndex-Q.sortIndex;return X!==0?X:O.id-Q.id}if(b.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var q=performance;b.unstable_now=function(){return q.now()}}else{var nl=Date,ll=nl.now();b.unstable_now=function(){return nl.now()-ll}}var U=[],J=[],C=1,S=null,B=3,Z=!1,El=!1,wl=!1,vl=!1,kl=typeof setTimeout=="function"?setTimeout:null,nt=typeof clearTimeout=="function"?clearTimeout:null,Ke=typeof setImmediate<"u"?setImmediate:null;function Bt(O){for(var Q=N(J);Q!==null;){if(Q.callback===null)o(J);else if(Q.startTime<=O)o(J),Q.sortIndex=Q.expirationTime,p(U,Q);else break;Q=N(J)}}function qt(O){if(wl=!1,Bt(O),!El)if(N(U)!==null)El=!0,it||(it=!0,ct());else{var Q=N(J);Q!==null&&Cl(qt,Q.startTime-O)}}var it=!1,W=-1,il=5,Gt=-1;function bt(){return vl?!0:!(b.unstable_now()-GtO&&bt());){var yl=S.callback;if(typeof yl=="function"){S.callback=null,B=S.priorityLevel;var sl=yl(S.expirationTime<=O);if(O=b.unstable_now(),typeof sl=="function"){S.callback=sl,Bt(O),Q=!0;break t}S===N(U)&&o(U),Bt(O)}else o(U);S=N(U)}if(S!==null)Q=!0;else{var Dt=N(J);Dt!==null&&Cl(qt,Dt.startTime-O),Q=!1}}break l}finally{S=null,B=X,Z=!1}Q=void 0}}finally{Q?ct():it=!1}}}var ct;if(typeof Ke=="function")ct=function(){Ke(Tt)};else if(typeof MessageChannel<"u"){var ye=new MessageChannel,Je=ye.port2;ye.port1.onmessage=Tt,ct=function(){Je.postMessage(null)}}else ct=function(){kl(Tt,0)};function Cl(O,Q){W=kl(function(){O(b.unstable_now())},Q)}b.unstable_IdlePriority=5,b.unstable_ImmediatePriority=1,b.unstable_LowPriority=4,b.unstable_NormalPriority=3,b.unstable_Profiling=null,b.unstable_UserBlockingPriority=2,b.unstable_cancelCallback=function(O){O.callback=null},b.unstable_forceFrameRate=function(O){0>O||125yl?(O.sortIndex=X,p(J,O),N(U)===null&&O===N(J)&&(wl?(nt(W),W=-1):wl=!0,Cl(qt,X-yl))):(O.sortIndex=sl,p(U,O),El||Z||(El=!0,it||(it=!0,ct()))),O},b.unstable_shouldYield=bt,b.unstable_wrapCallback=function(O){var Q=B;return function(){var X=B;B=Q;try{return O.apply(this,arguments)}finally{B=X}}}})(ps)),ps}var n0;function gy(){return n0||(n0=1,xs.exports=yy()),xs.exports}var Os={exports:{}},Ll={};/** - * @license React - * react-dom.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var i0;function Sy(){if(i0)return Ll;i0=1;var b=As();function p(C){var S="https://react.dev/errors/"+C;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(b)}catch(p){console.error(p)}}return b(),Os.exports=Sy(),Os.exports}/** - * @license React - * react-dom-client.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var f0;function Ty(){if(f0)return nn;f0=1;var b=gy(),p=As(),N=by();function o(l){var t="https://react.dev/errors/"+l;if(1bu||(l.current=Qi[bu],Qi[bu]=null,bu--)}function Sl(l,t){bu++,Qi[bu]=l.current,l.current=t}var Xt=Qt(null),oa=Qt(null),ge=Qt(null),cn=Qt(null);function fn(l,t){switch(Sl(ge,t),Sl(oa,l),Sl(Xt,null),t.nodeType){case 9:case 11:l=(l=t.documentElement)&&(l=l.namespaceURI)?sr(l):0;break;default:if(l=t.tagName,t=t.namespaceURI)t=sr(t),l=or(t,l);else switch(l){case"svg":l=1;break;case"math":l=2;break;default:l=0}}Bl(Xt),Sl(Xt,l)}function Tu(){Bl(Xt),Bl(oa),Bl(ge)}function Xi(l){var t=l.memoizedState;t!==null&&(ca._currentValue=t.memoizedState,Sl(cn,l)),t=Xt.current;var e=or(t,l.type);t!==e&&(Sl(oa,l),Sl(Xt,e))}function sn(l){oa.current===l&&(Bl(Xt),Bl(oa)),cn.current===l&&(Bl(cn),ca._currentValue=le)}var Zi,Ms;function Se(l){if(Zi===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Zi=t&&t[1]||"",Ms=-1)":-1a||f[u]!==v[a]){var g=` -`+f[u].replace(" at new "," at ");return l.displayName&&g.includes("")&&(g=g.replace("",l.displayName)),g}while(1<=u&&0<=a);break}}}finally{Vi=!1,Error.prepareStackTrace=e}return(e=l?l.displayName||l.name:"")?Se(e):""}function g0(l,t){switch(l.tag){case 26:case 27:case 5:return Se(l.type);case 16:return Se("Lazy");case 13:return l.child!==t&&t!==null?Se("Suspense Fallback"):Se("Suspense");case 19:return Se("SuspenseList");case 0:case 15:return Li(l.type,!1);case 11:return Li(l.type.render,!1);case 1:return Li(l.type,!0);case 31:return Se("Activity");case 30:return Se("ViewTransition");default:return""}}function Ds(l){try{var t="",e=null;do t+=g0(l,e),e=l,l=l.return;while(l);return t}catch(u){return` -Error generating stack: `+u.message+` -`+u.stack}}var wi=Object.prototype.hasOwnProperty,Ki=b.unstable_scheduleCallback,Ji=b.unstable_cancelCallback,S0=b.unstable_shouldYield,b0=b.unstable_requestPaint,ft=b.unstable_now,T0=b.unstable_getCurrentPriorityLevel,Us=b.unstable_ImmediatePriority,Cs=b.unstable_UserBlockingPriority,on=b.unstable_NormalPriority,E0=b.unstable_LowPriority,Rs=b.unstable_IdlePriority,z0=b.log,_0=b.unstable_setDisableYieldValue,da=null,st=null;function be(l){if(typeof z0=="function"&&_0(l),st&&typeof st.setStrictMode=="function")try{st.setStrictMode(da,l)}catch{}}var ot=Math.clz32?Math.clz32:p0,N0=Math.log,x0=Math.LN2;function p0(l){return l>>>=0,l===0?32:31-(N0(l)/x0|0)|0}var dn=256,mn=262144,rn=4194304;function We(l){var t=l&42;if(t!==0)return t;switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return l&-l;case 262144:case 524288:case 1048576:case 2097152:return l&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function vn(l,t,e){var u=l.pendingLanes;if(u===0)return 0;var a=0,n=l.suspendedLanes,i=l.pingedLanes;l=l.warmLanes;var c=u&134217727;return c!==0?(u=c&~n,u!==0?a=We(u):(i&=c,i!==0?a=We(i):e||(e=c&~l,e!==0&&(a=We(e))))):(c=u&~n,c!==0?a=We(c):i!==0?a=We(i):e||(e=u&~l,e!==0&&(a=We(e)))),a===0?0:t!==0&&t!==a&&(t&n)===0&&(n=a&-a,e=t&-t,n>=e||n===32&&(e&4194048)!==0)?t:a}function ma(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function js(l,t){(t&8)!==0&&(t|=t&32);var e=l.entangledLanes;if(e!==0)for(l=l.entanglements,e&=t;0e;e++)t.push(l);return t}function ra(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function A0(l,t,e,u,a,n){var i=l.pendingLanes;l.pendingLanes=e,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=e,l.entangledLanes&=e,l.errorRecoveryDisabledLanes&=e,l.shellSuspendCounter=0;var c=l.entanglements,f=l.expirationTimes,v=l.hiddenUpdates;for(e=i&~e;0"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),ac=!1;if(ue)try{var ga={};Object.defineProperty(ga,"passive",{get:function(){ac=!0}}),window.addEventListener("test",ga,ga),window.removeEventListener("test",ga,ga)}catch{ac=!1}var Te=null,nc=null,Tn=null;function ao(){if(Tn)return Tn;var l,t=nc,e=t.length,u,a="value"in Te?Te.value:Te.textContent,n=a.length;for(l=0;l=Ta),oo=" ",mo=!1;function ro(l,t){switch(l){case"keyup":return ov.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function vo(l){return l=l.detail,typeof l=="object"&&"data"in l?l.data:null}var Mu=!1;function mv(l,t){switch(l){case"compositionend":return vo(t);case"keypress":return t.which!==32?null:(mo=!0,oo);case"textInput":return l=t.data,l===oo&&mo?null:l;default:return null}}function rv(l,t){if(Mu)return l==="compositionend"||!oc&&ro(l,t)?(l=ao(),Tn=nc=Te=null,Mu=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1"u")return null;try{return l.activeElement||l.body}catch{return l.body}}function zo(l){for(;l&&l.firstChild;)l=l.firstChild;return l}function _o(l,t){var e=zo(l);l=0;for(var u;e;){if(e.nodeType===3){if(u=l+e.textContent.length,l<=t&&u>=t)return{node:e,offset:t-l};l=u}l:{for(;e;){if(e.nextSibling){e=e.nextSibling;break l}e=e.parentNode}e=void 0}e=zo(e)}}function No(l,t){return l&&t?l===t?!0:l&&l.nodeType===3?!1:t&&t.nodeType===3?No(l,t.parentNode):"contains"in l?l.contains(t):l.compareDocumentPosition?!!(l.compareDocumentPosition(t)&16):!1:!1}function xo(l){l=l!=null&&l.ownerDocument!=null&&l.ownerDocument.defaultView!=null?l.ownerDocument.defaultView:window;for(var t=rc(l.document);t instanceof l.HTMLIFrameElement;){try{var e=typeof t.contentWindow.location.href=="string"}catch{e=!1}if(e)l=t.contentWindow;else break;t=rc(l.document)}return t}function vc(l){var t=l&&l.nodeName&&l.nodeName.toLowerCase();return t&&(t==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||t==="textarea"||l.contentEditable==="true")}var Ev=ue&&"documentMode"in document&&11>=document.documentMode,Du=null,hc=null,Na=null,yc=!1;function po(l,t,e){var u=e.window===e?e.document:e.nodeType===9?e:e.ownerDocument;yc||Du==null||Du!==rc(u)||(u=Du,"selectionStart"in u&&vc(u)?u={start:u.selectionStart,end:u.selectionEnd}:(u=(u.ownerDocument&&u.ownerDocument.defaultView||window).getSelection(),u={anchorNode:u.anchorNode,anchorOffset:u.anchorOffset,focusNode:u.focusNode,focusOffset:u.focusOffset}),Na&&_a(Na,u)||(Na=u,u=xi(hc,"onSelect"),0>=i,a-=i,Vt=1<<32-ot(t)+a|e<G?(Dl=j,j=null):Dl=j.sibling;var tl=m(r,j,h[G],T);if(tl===null){j===null&&(j=Dl);break}l&&j&&tl.alternate===null&&t(r,j),s=n(tl,s,G),P===null?M=tl:P.sibling=tl,P=tl,j=Dl}if(G===h.length)return e(r,j),$&&ce(r,G),M;if(j===null){for(;GG?(Dl=j,j=null):Dl=j.sibling;var we=m(r,j,tl.value,T);if(we===null){j===null&&(j=Dl);break}l&&j&&we.alternate===null&&t(r,j),s=n(we,s,G),P===null?M=we:P.sibling=we,P=we,j=Dl}if(tl.done)return e(r,j),$&&ce(r,G),M;if(j===null){for(;!tl.done;G++,tl=h.next())tl=z(r,tl.value,T),tl!==null&&(s=n(tl,s,G),P===null?M=tl:P.sibling=tl,P=tl);return $&&ce(r,G),M}for(j=u(j);!tl.done;G++,tl=h.next())tl=y(j,r,G,tl.value,T),tl!==null&&(l&&(Dl=tl.alternate,Dl!==null&&j.delete(Dl.key===null?G:Dl.key)),s=n(tl,s,G),P===null?M=tl:P.sibling=tl,P=tl);return l&&j.forEach(function(my){return t(r,my)}),$&&ce(r,G),M}function K(r,s,h,T){if(typeof h=="object"&&h!==null&&h.type===Tt&&h.key===null&&h.props.ref===void 0&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Gt:l:{for(var M=h.key;s!==null;){if(s.key===M){if(M=h.type,M===Tt){if(s.tag===7){e(r,s.sibling),T=a(s,h.props.children),pe(T,h),T.return=r,r=T;break l}}else if(s.elementType===M||typeof M=="object"&&M!==null&&M.$$typeof===sl&&fu(M)===s.type){e(r,s.sibling),T=a(s,h.props),pe(T,h),T.return=r,r=T;break l}e(r,s);break}else t(r,s);s=s.sibling}h.type===Tt?(T=tu(h.props.children,r.mode,T,h.key),pe(T,h),T.return=r,r=T):(T=Dn(h.type,h.key,h.props,null,r.mode,T),pe(T,h),T.return=r,r=T)}return i(r);case bt:l:{for(M=h.key;s!==null;){if(s.key===M)if(s.tag===4&&s.stateNode.containerInfo===h.containerInfo&&s.stateNode.implementation===h.implementation){e(r,s.sibling),T=a(s,h.children||[]),T.return=r,r=T;break l}else{e(r,s);break}else t(r,s);s=s.sibling}T=_c(h,r.mode,T),T.return=r,r=T}return i(r);case sl:return h=fu(h),K(r,s,h,T)}if(cl(h))return x(r,s,h,T);if(Y(h)){if(M=Y(h),typeof M!="function")throw Error(o(150));return h=M.call(h),D(r,s,h,T)}if(typeof h.then=="function")return K(r,s,Qn(h),T);if(h.$$typeof===Cl)return K(r,s,Yn(r,h),T);Xn(r,h)}return typeof h=="string"&&h!==""||typeof h=="number"||typeof h=="bigint"?(h=""+h,s!==null&&s.tag===6?(e(r,s.sibling),T=a(s,h),T.return=r,r=T):(e(r,s),T=zc(h,r.mode,T),T.return=r,r=T),i(r)):e(r,s)}return function(r,s,h,T){try{Da=0;var M=K(r,s,h,T);return Gu=null,M}catch(j){if(j===qu||j===qn)throw j;var P=Pl(29,j,null,r.mode);return P.lanes=T,P.return=r,P}finally{}}}var ou=Fo(!0),ko=Fo(!1),Oe=!1;function Rc(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function jc(l,t){l=l.updateQueue,t.updateQueue===l&&(t.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,callbacks:null})}function Ae(l){return{lane:l,tag:0,payload:null,callback:null,next:null}}function Me(l,t,e){var u=l.updateQueue;if(u===null)return null;if(u=u.shared,(fl&2)!==0){var a=u.pending;return a===null?t.next=t:(t.next=a.next,a.next=t),u.pending=t,t=Mn(l),jo(l,null,e),t}return An(l,u,t,e),Mn(l)}function Ua(l,t,e){if(t=t.updateQueue,t!==null&&(t=t.shared,(e&4194048)!==0)){var u=t.lanes;u&=l.pendingLanes,e|=u,t.lanes=e,Bs(l,e)}}function Hc(l,t){var e=l.updateQueue,u=l.alternate;if(u!==null&&(u=u.updateQueue,e===u)){var a=null,n=null;if(e=e.firstBaseUpdate,e!==null){do{var i={lane:e.lane,tag:e.tag,payload:e.payload,callback:null,next:null};n===null?a=n=i:n=n.next=i,e=e.next}while(e!==null);n===null?a=n=t:n=n.next=t}else a=n=t;e={baseState:u.baseState,firstBaseUpdate:a,lastBaseUpdate:n,shared:u.shared,callbacks:u.callbacks},l.updateQueue=e;return}l=e.lastBaseUpdate,l===null?e.firstBaseUpdate=t:l.next=t,e.lastBaseUpdate=t}var Yc=!1;function Ca(){if(Yc){var l=Bu;if(l!==null)throw l}}function Ra(l,t,e,u){Yc=!1;var a=l.updateQueue;Oe=!1;var n=a.firstBaseUpdate,i=a.lastBaseUpdate,c=a.shared.pending;if(c!==null){a.shared.pending=null;var f=c,v=f.next;f.next=null,i===null?n=v:i.next=v,i=f;var g=l.alternate;g!==null&&(g=g.updateQueue,c=g.lastBaseUpdate,c!==i&&(c===null?g.firstBaseUpdate=v:c.next=v,g.lastBaseUpdate=f))}if(n!==null){var z=a.baseState;i=0,g=v=f=null,c=n;do{var m=c.lane&-536870913,y=m!==c.lane;if(y?(I&m)===m:(u&m)===m){m!==0&&m===iu&&(Yc=!0),g!==null&&(g=g.next={lane:0,tag:c.tag,payload:c.payload,callback:null,next:null});l:{var x=l,D=c;m=t;var K=e;switch(D.tag){case 1:if(x=D.payload,typeof x=="function"){z=x.call(K,z,m);break l}z=x;break l;case 3:x.flags=x.flags&-65537|128;case 0:if(x=D.payload,m=typeof x=="function"?x.call(K,z,m):x,m==null)break l;z=W({},z,m);break l;case 2:Oe=!0}}m=c.callback,m!==null&&(l.flags|=64,y&&(l.flags|=8192),y=a.callbacks,y===null?a.callbacks=[m]:y.push(m))}else y={lane:m,tag:c.tag,payload:c.payload,callback:c.callback,next:null},g===null?(v=g=y,f=z):g=g.next=y,i|=m;if(c=c.next,c===null){if(c=a.shared.pending,c===null)break;y=c,c=y.next,y.next=null,a.lastBaseUpdate=y,a.shared.pending=null}}while(!0);g===null&&(f=z),a.baseState=f,a.firstBaseUpdate=v,a.lastBaseUpdate=g,n===null&&(a.shared.lanes=0),Ye|=i,l.lanes=i,l.memoizedState=z}}function Io(l,t){if(typeof l!="function")throw Error(o(191,l));l.call(t)}function Po(l,t){var e=l.callbacks;if(e!==null)for(l.callbacks=null,l=0;ln?n:8;var i=R.T,c={};c.types=i!==null?i.types:null,R.T=c,ef(l,!1,t,e);try{var f=a(),v=R.S;if(v!==null&&v(c,f),f!==null&&typeof f=="object"&&typeof f.then=="function"){var g=Cv(f,u);Ba(l,t,g,gt(l))}else Ba(l,t,u,gt(l))}catch(z){Ba(l,t,{then:function(){},status:"rejected",reason:z},gt())}finally{V.p=n,i!==null&&c.types!==null&&(i.types=c.types),R.T=i}}function qv(){}function lf(l,t,e,u){if(l.tag!==5)throw Error(o(476));var a=Ud(l).queue;Dd(l,a,t,le,e===null?qv:function(){return Cd(l),e(u)})}function Ud(l){var t=l.memoizedState;if(t!==null)return t;t={memoizedState:le,baseState:le,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:de,lastRenderedState:le},next:null};var e={};return t.next={memoizedState:e,baseState:e,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:de,lastRenderedState:e},next:null},l.memoizedState=t,l=l.alternate,l!==null&&(l.memoizedState=t),t}function Cd(l){var t=Ud(l);t.next===null&&(t=l.alternate.memoizedState),Ba(l,t.next.queue,{},gt())}function tf(){return Gl(ca)}function Rd(){return pl().memoizedState}function jd(){return pl().memoizedState}function Gv(l){for(var t=l.return;t!==null;){switch(t.tag){case 24:case 3:var e=gt();l=Ae(e);var u=Me(t,l,e);u!==null&&(ut(u,t,e),Ua(u,t,e)),t={cache:Mc()},l.payload=t;return}t=t.return}}function Qv(l,t,e){var u=gt();e={lane:u,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null},kn(l)?Yd(t,e):(e=Tc(l,t,e,u),e!==null&&(ut(e,l,u),Bd(e,t,u)))}function Hd(l,t,e){var u=gt();Ba(l,t,e,u)}function Ba(l,t,e,u){var a={lane:u,revertLane:0,gesture:null,action:e,hasEagerState:!1,eagerState:null,next:null};if(kn(l))Yd(t,a);else{var n=l.alternate;if(l.lanes===0&&(n===null||n.lanes===0)&&(n=t.lastRenderedReducer,n!==null))try{var i=t.lastRenderedState,c=n(i,e);if(a.hasEagerState=!0,a.eagerState=c,mt(c,i))return An(l,t,a,0),gl===null&&On(),!1}catch{}finally{}if(e=Tc(l,t,a,u),e!==null)return ut(e,l,u),Bd(e,t,u),!0}return!1}function ef(l,t,e,u){if(u={lane:2,revertLane:Jf(),gesture:null,action:u,hasEagerState:!1,eagerState:null,next:null},kn(l)){if(t)throw Error(o(479))}else t=Tc(l,e,u,2),t!==null&&ut(t,l,2)}function kn(l){var t=l.alternate;return l===w||t!==null&&t===w}function Yd(l,t){Qu=Ln=!0;var e=l.pending;e===null?t.next=t:(t.next=e.next,e.next=t),l.pending=t}function Bd(l,t,e){if((e&4194048)!==0){var u=t.lanes;u&=l.pendingLanes,e|=u,t.lanes=e,Bs(l,e)}}var In={readContext:Gl,use:Jn,useCallback:Nl,useContext:Nl,useEffect:Nl,useImperativeHandle:Nl,useLayoutEffect:Nl,useInsertionEffect:Nl,useMemo:Nl,useReducer:Nl,useRef:Nl,useState:Nl,useDebugValue:Nl,useDeferredValue:Nl,useTransition:Nl,useSyncExternalStore:Nl,useId:Nl,useHostTransitionStatus:Nl,useFormState:Nl,useActionState:Nl,useOptimistic:Nl,useMemoCache:Nl,useCacheRefresh:Nl,useEffectEvent:Nl},qd={readContext:Gl,use:Jn,useCallback:function(l,t){return $l().memoizedState=[l,t===void 0?null:t],l},useContext:Gl,useEffect:Ed,useImperativeHandle:function(l,t,e){e=e!=null?e.concat([l]):null,Wn(4194308,4,xd.bind(null,t,l),e)},useLayoutEffect:function(l,t){return Wn(4194308,4,l,t)},useInsertionEffect:function(l,t){Wn(4,2,l,t)},useMemo:function(l,t){var e=$l();t=t===void 0?null:t;var u=l();if(du){be(!0);try{l()}finally{be(!1)}}return e.memoizedState=[u,t],u},useReducer:function(l,t,e){var u=$l();if(e!==void 0){var a=e(t);if(du){be(!0);try{e(t)}finally{be(!1)}}}else a=t;return u.memoizedState=u.baseState=a,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:a},u.queue=l,l=l.dispatch=Qv.bind(null,w,l),[u.memoizedState,l]},useRef:function(l){var t=$l();return l={current:l},t.memoizedState=l},useState:function(l){l=Wc(l);var t=l.queue,e=Hd.bind(null,w,t);return t.dispatch=e,[l.memoizedState,e]},useDebugValue:Ic,useDeferredValue:function(l,t){var e=$l();return Pc(e,l,t)},useTransition:function(){var l=Wc(!1);return l=Dd.bind(null,w,l.queue,!0,!1),$l().memoizedState=l,[!1,l]},useSyncExternalStore:function(l,t,e){var u=w,a=$l();if($){if(e===void 0)throw Error(o(407));e=e()}else{if(e=t(),gl===null)throw Error(o(349));(I&127)!==0||nd(u,t,e)}a.memoizedState=e;var n={value:e,getSnapshot:t};return a.queue=n,Ed(cd.bind(null,u,n,l),[l]),u.flags|=2048,Zu(9,{destroy:void 0},id.bind(null,u,n,e,t),null),e},useId:function(){var l=$l(),t=gl.identifierPrefix;if($){var e=Lt,u=Vt;e=(u&~(1<<32-ot(u)-1)).toString(32)+e,t="_"+t+"R_"+e,e=wn++,0<\/script>",n=n.removeChild(n.firstChild);break;case"select":n=typeof u.is=="string"?i.createElement("select",{is:u.is}):i.createElement("select"),u.multiple?n.multiple=!0:u.size&&(n.size=u.size);break;default:n=typeof u.is=="string"?i.createElement(a,{is:u.is}):i.createElement(a)}}n[ql]=t,n[Il]=u;l:for(i=t.child;i!==null;){if(i.tag===5||i.tag===6)n.appendChild(i.stateNode);else if(i.tag!==4&&i.tag!==27&&i.child!==null){i.child.return=i,i=i.child;continue}if(i===t)break l;for(;i.sibling===null;){if(i.return===null||i.return===t)break l;i=i.return}i.sibling.return=i.return,i=i.sibling}t.stateNode=n;l:switch(Vl(n,a,u),a){case"button":case"input":case"select":case"textarea":u=!!u.autoFocus;break l;case"img":u=!0;break l;default:u=!1}u&&re(t)}}return Tl(t),t.subtreeFlags&=-33554433,yf(t,t.type,l===null?null:l.memoizedProps,t.pendingProps,e),null;case 6:if(l&&t.stateNode!=null)l.memoizedProps!==u&&re(t);else{if(typeof u!="string"&&t.stateNode===null)throw Error(o(166));if(l=ge.current,Yu(t)){if(l=t.stateNode,e=t.memoizedProps,u=null,a=jl,a!==null)switch(a.tag){case 27:case 5:u=a.memoizedProps}l[ql]=t,l=!!(l.nodeValue===e||u!==null&&u.suppressHydrationWarning===!0||cr(l.nodeValue,e)),l||Ne(t,!0)}else l=Fa(l).createTextNode(u),l[ql]=t,t.stateNode=l}return Tl(t),null;case 31:if(e=t.memoizedState,l===null||l.memoizedState!==null){if(u=Yu(t),e!==null){if(l===null){if(!u)throw Error(o(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(o(557));l[ql]=t}else eu(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Tl(t),l=!1}else e=pc(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=e),l=!0;if(!l)return t.flags&256?(rt(t),t):(rt(t),null);if((t.flags&128)!==0)throw Error(o(558))}return Tl(t),null;case 13:if(u=t.memoizedState,l===null||l.memoizedState!==null&&l.memoizedState.dehydrated!==null){if(a=Yu(t),u!==null&&u.dehydrated!==null){if(l===null){if(!a)throw Error(o(318));if(a=t.memoizedState,a=a!==null?a.dehydrated:null,!a)throw Error(o(317));a[ql]=t}else eu(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Tl(t),a=!1}else a=pc(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=a),a=!0;if(!a)return t.flags&256?(rt(t),t):(rt(t),null)}return rt(t),(t.flags&128)!==0?(t.lanes=e,t):(e=u!==null,l=l!==null&&l.memoizedState!==null,e&&(u=t.child,a=null,u.alternate!==null&&u.alternate.memoizedState!==null&&u.alternate.memoizedState.cachePool!==null&&(a=u.alternate.memoizedState.cachePool.pool),n=null,u.memoizedState!==null&&u.memoizedState.cachePool!==null&&(n=u.memoizedState.cachePool.pool),n!==a&&(u.flags|=2048)),e!==l&&e&&(t.child.flags|=8192),ai(t,t.updateQueue),Tl(t),null);case 4:return Tu(),l===null&&kf(t.stateNode.containerInfo),t.flags|=67108864,Tl(t),null;case 10:return se(t.type),Tl(t),null;case 19:if(Qc(t),u=t.memoizedState,u===null)return Tl(t),null;if(a=(t.flags&128)!==0,n=u.rendering,n===null)if(a)Ga(u,!1);else{if(xl!==0||l!==null&&(l.flags&128)!==0)for(l=t.child;l!==null;){if(n=Vn(l),n!==null){for(t.flags|=128,Ga(u,!1),l=n.updateQueue,t.updateQueue=l,ai(t,l),t.subtreeFlags=0,l=e,e=t.child;e!==null;)Ho(e,l),e=e.sibling;return ja(t,Xl.current&1|2),$&&ce(t,u.treeForkCount),t.child}l=l.sibling}u.tail!==null&&ft()>yi&&(t.flags|=128,a=!0,Ga(u,!1),t.lanes=4194304)}else{if(!a)if(l=Vn(n),l!==null){if(t.flags|=128,a=!0,l=l.updateQueue,t.updateQueue=l,ai(t,l),Ga(u,!0),u.tail===null&&u.tailMode!=="collapsed"&&u.tailMode!=="visible"&&!n.alternate&&!$)return Tl(t),null}else 2*ft()-u.renderingStartTime>yi&&e!==536870912&&(t.flags|=128,a=!0,Ga(u,!1),t.lanes=4194304);u.isBackwards?(n.sibling=t.child,t.child=n):(l=u.last,l!==null?l.sibling=n:t.child=n,u.last=n)}if(u.tail!==null){l=u.tail;l:{for(e=l;e!==null;){if(e.alternate!==null){e=!1;break l}e=e.sibling}e=!0}return u.rendering=l,u.tail=l.sibling,u.renderingStartTime=ft(),l.sibling=null,n=Xl.current,n=a?n&1|2:n&1,u.tailMode==="visible"||u.tailMode==="collapsed"||!e||$?ja(t,n):(e=n,Sl(Ql,t),Sl(Xl,e),Kl===null&&(Kl=t)),$&&ce(t,u.treeForkCount),l}return Tl(t),null;case 22:case 23:return rt(t),qc(),u=t.memoizedState!==null,l!==null?l.memoizedState!==null!==u&&(t.flags|=8192):u&&(t.flags|=8192),u?(e&536870912)!==0&&(t.flags&128)===0&&(Tl(t),t.subtreeFlags&6&&(t.flags|=8192)):Tl(t),e=t.updateQueue,e!==null&&ai(t,e.retryQueue),e=null,l!==null&&l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(e=l.memoizedState.cachePool.pool),u=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(u=t.memoizedState.cachePool.pool),u!==e&&(t.flags|=2048),l!==null&&Bl(cu),null;case 24:return e=null,l!==null&&(e=l.memoizedState.cache),t.memoizedState.cache!==e&&(t.flags|=2048),se(Ol),Tl(t),null;case 25:return null;case 30:return t.flags|=33554432,Tl(t),null}throw Error(o(156,t.tag))}function Jv(l,t){switch(Nc(t),t.tag){case 1:return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 3:return se(Ol),Tu(),l=t.flags,(l&65536)!==0&&(l&128)===0?(t.flags=l&-65537|128,t):null;case 26:case 27:case 5:return sn(t),null;case 31:if(t.memoizedState!==null){if(rt(t),t.alternate===null)throw Error(o(340));eu()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 13:if(rt(t),l=t.memoizedState,l!==null&&l.dehydrated!==null){if(t.alternate===null)throw Error(o(340));eu()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 19:return Qc(t),l=t.flags,l&65536?(t.flags=l&-65537|128,l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null),t.flags|=4,t):null;case 4:return Tu(),null;case 10:return se(t.type),null;case 22:case 23:return rt(t),qc(),l!==null&&Bl(cu),l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 24:return se(Ol),null;case 25:return null;default:return null}}function sm(l,t){switch(Nc(t),t.tag){case 3:se(Ol),Tu();break;case 26:case 27:case 5:sn(t);break;case 4:Tu();break;case 31:t.memoizedState!==null&&rt(t);break;case 13:rt(t);break;case 19:Qc(t);break;case 10:se(t.type);break;case 22:case 23:rt(t),qc(),l!==null&&Bl(cu);break;case 24:se(Ol)}}function Qa(l,t){try{var e=t.updateQueue,u=e!==null?e.lastEffect:null;if(u!==null){var a=u.next;e=a;do{if((e.tag&l)===l){u=void 0;var n=e.create,i=e.inst;u=n(),i.destroy=u}e=e.next}while(e!==a)}}catch(c){ml(t,t.return,c)}}function Re(l,t,e){try{var u=t.updateQueue,a=u!==null?u.lastEffect:null;if(a!==null){var n=a.next;u=n;do{if((u.tag&l)===l){var i=u.inst,c=i.destroy;if(c!==void 0){i.destroy=void 0,a=t;var f=e,v=c;try{v()}catch(g){ml(a,f,g)}}}u=u.next}while(u!==n)}}catch(g){ml(t,t.return,g)}}function om(l){var t=l.updateQueue;if(t!==null){var e=l.stateNode;try{Po(t,e)}catch(u){ml(l,l.return,u)}}}function dm(l,t,e){e.props=mu(l.type,l.memoizedProps),e.state=l.memoizedState;try{e.componentWillUnmount()}catch(u){ml(l,t,u)}}function wt(l,t){try{var e=l.ref;if(e!==null){switch(l.tag){case 26:case 27:case 5:var u=l.stateNode;break;case 30:var a=l.stateNode,n=ae(l.memoizedProps,a);(a.ref===null||a.ref.name!==n)&&(a.ref=Sr(n)),u=a.ref;break;case 7:if(l.stateNode===null){var i=new St(l);S(l.child,!1,Bh,i,void 0,void 0),l.stateNode=i}u=l.stateNode;break;default:u=l.stateNode}typeof e=="function"?l.refCleanup=e(u):e.current=u}}catch(c){ml(l,t,c)}}function Zl(l,t){var e=l.ref,u=l.refCleanup;if(e!==null)if(typeof u=="function")try{u()}catch(a){ml(l,t,a)}finally{l.refCleanup=null,l=l.alternate,l!=null&&(l.refCleanup=null)}else if(typeof e=="function")try{e(null)}catch(a){ml(l,t,a)}else e.current=null}function ni(l,t){if((l.tag===5||l.tag===27||l.tag===6)&&l.alternate===null&&t!==null)for(var e=0;e title"))),Vl(u,t,e),u[ql]=l,Rl(u),t=u;break l;case"link":if(n=Hr("link","href",a).get(t+(e.href||""))){for(i=0;iK&&(i=K,K=D,D=i);var r=_o(c,D),s=_o(c,K);if(r&&s&&(y.rangeCount!==1||y.anchorNode!==r.node||y.anchorOffset!==r.offset||y.focusNode!==s.node||y.focusOffset!==s.offset)){var h=z.createRange();h.setStart(r.node,r.offset),y.removeAllRanges(),D>K?(y.addRange(h),y.extend(s.node,s.offset)):(h.setEnd(s.node,s.offset),y.addRange(h))}}}}for(z=[],y=c;y=y.parentNode;)y.nodeType===1&&z.push({element:y,left:y.scrollLeft,top:y.scrollTop});for(typeof c.focus=="function"&&c.focus(),c=0;ce?32:e,R.T=null,e=Bf,Bf=null;var n=Ht,i=kt;if(_l=0,yu=Ht=null,kt=0,(fl&6)!==0)throw Error(o(331));var c=fl;if(fl|=4,jm(n.current),Um(n,n.current,i,e),fl=c,Ja(0,!1),st&&typeof st.onPostCommitFiberRoot=="function")try{st.onPostCommitFiberRoot(da,n)}catch{}return!0}finally{V.p=a,R.T=u,Wm(l,t)}}function Fm(l,t,e){t=_t(e,t),t=nf(l.stateNode,t,2),l=Me(l,t,2),l!==null&&(ra(l,2),It(l))}function ml(l,t,e){if(l.tag===3)Fm(l,l,e);else for(;t!==null;){if(t.tag===3){Fm(t,l,e);break}else if(t.tag===1){var u=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof u.componentDidCatch=="function"&&(Be===null||!Be.has(u))){l=_t(e,l),e=Kd(2),u=Me(t,e,2),u!==null&&(Jd(e,u,t,l),ra(u,2),It(u));break}}t=t.return}}function Lf(l,t,e){var u=l.pingCache;if(u===null){u=l.pingCache=new kv;var a=new Set;u.set(t,a)}else a=u.get(t),a===void 0&&(a=new Set,u.set(t,a));a.has(e)||(jf=!0,a.add(e),l=nh.bind(null,l,t,e),t.then(l,l))}function nh(l,t,e){var u=l.pingCache;u!==null&&u.delete(t),l.pingedLanes|=l.suspendedLanes&e,l.warmLanes&=~e,gl===l&&(I&e)===e&&((xl===4||xl===3&&(I&62914560)===I&&300>ft()-hi)&&(fl&2)===0?Pu(l,0):vi|=e,$u===I&&($u=0)),It(l)}function km(l,t){t===0&&(t=Hs()),l=lu(l,t),l!==null&&(ra(l,t),It(l))}function ih(l){var t=l.memoizedState,e=0;t!==null&&(e=t.retryLane),km(l,e)}function ch(l,t){var e=0;switch(l.tag){case 31:case 13:var u=l.stateNode,a=l.memoizedState;a!==null&&(e=a.retryLane);break;case 19:u=l.stateNode;break;case 22:u=l.stateNode._retryCache;break;default:throw Error(o(314))}u!==null&&u.delete(t),km(l,e)}function fh(l,t){return Ki(l,t)}var ta=null,ea=null,wf=!1,_i=!1,Kf=!1,Ge=0;function It(l){l!==ea&&l.next===null&&(ea===null?ta=ea=l:ea=ea.next=l),_i=!0,wf||(wf=!0,oh())}function Ja(l,t){if(!Kf&&_i){Kf=!0;do for(var e=!1,u=ta;u!==null;){if(l!==0){var a=u.pendingLanes;if(a===0)var n=0;else{var i=u.suspendedLanes,c=u.pingedLanes;n=(1<<31-ot(42|l)+1)-1,n&=a&~(i&~c),n=n&201326741?n&201326741|1:n?n|2:0}n!==0&&(e=!0,tr(u,n))}else n=I,n=vn(u,u===gl?n:0,u.cancelPendingCommit!==null||u.timeoutHandle!==-1),(n&3)===0||ma(u,n)||(e=!0,tr(u,n));u=u.next}while(e);Kf=!1}}function sh(){Im()}function Im(){_i=wf=!1;var l=0;Ge!==0&&Eh()&&(l=Ge);for(var t=ft(),e=null,u=ta;u!==null;){var a=u.next,n=Pm(u,t);n===0?(u.next=null,e===null?ta=a:e.next=a,a===null&&(ea=e)):(e=u,(l!==0||(n&3)!==0)&&(_i=!0)),u=a}_l!==0&&_l!==5||Ja(l),Ge!==0&&(Ge=0)}function Pm(l,t){for(var e=l.suspendedLanes,u=l.pingedLanes,a=l.expirationTimes,n=l.pendingLanes&-62914561;0c)break;var g=f.transferSize,z=f.initiatorType;g&&fr(z)&&(f=f.responseEnd,i+=g*(fAi){D.length=x;break}h=new Promise(Oh.bind(h)),D.push(h)}}}if(0"u"?null:document;function Ur(l,t,e){var u=aa;if(u&&typeof t=="string"&&t){var a=Et(t);a='link[rel="'+l+'"][href="'+a+'"]',typeof e=="string"&&(a+='[crossorigin="'+e+'"]'),Dr.has(a)||(Dr.add(a),l={rel:l,crossOrigin:e,href:t},u.querySelector(a)===null&&(t=u.createElement("link"),Vl(t,"link",l),Rl(t),u.head.appendChild(t)))}}function Kh(l){he.D(l),Ur("dns-prefetch",l,null)}function Jh(l,t){he.C(l,t),Ur("preconnect",l,t)}function $h(l,t,e){he.L(l,t,e);var u=aa;if(u&&l&&t){var a='link[rel="preload"][as="'+Et(t)+'"]';t==="image"&&e&&e.imageSrcSet?(a+='[imagesrcset="'+Et(e.imageSrcSet)+'"]',typeof e.imageSizes=="string"&&(a+='[imagesizes="'+Et(e.imageSizes)+'"]')):a+='[href="'+Et(l)+'"]';var n=a;switch(t){case"style":n=na(l);break;case"script":n=ia(l)}if(!(Mt.has(n)||(l=W({rel:"preload",href:t==="image"&&e&&e.imageSrcSet?void 0:l,as:t},e),Mt.set(n,l),u.querySelector(a)!==null||t==="style"&&u.querySelector(Ia(n))||t==="script"&&u.querySelector(Pa(n))))){var i=u.createElement("link");Vl(i,"link",l),t==="style"&&(i[hn]=!0,i.onload=i.onerror=function(){Vs(i)}),Rl(i),u.head.appendChild(i)}}}function Wh(l,t){he.m(l,t);var e=aa;if(e&&l){var u=t&&typeof t.as=="string"?t.as:"script",a='link[rel="modulepreload"][as="'+Et(u)+'"][href="'+Et(l)+'"]',n=a;switch(u){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":n=ia(l)}if(!Mt.has(n)&&(l=W({rel:"modulepreload",href:l},t),Mt.set(n,l),e.querySelector(a)===null)){switch(u){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(e.querySelector(Pa(n)))return}u=e.createElement("link"),Vl(u,"link",l),Rl(u),e.head.appendChild(u)}}}function Fh(l,t,e){he.S(l,t,e);var u=aa;if(u&&l){var a=_u(u).hoistableStyles,n=na(l);t=t||"default";var i=a.get(n);if(!i){var c={loading:0,preload:null};if(i=u.querySelector(Ia(n)))c.loading=5;else{l=W({rel:"stylesheet",href:l,"data-precedence":t},e),(e=Mt.get(n))&&rs(l,e);var f=i=u.createElement("link");Rl(f),Vl(f,"link",l),f._p=new Promise(function(v,g){f.onload=v,f.onerror=g}),f.addEventListener("load",function(){c.loading|=1}),f.addEventListener("error",function(){c.loading|=2}),c.loading|=4,pi(i,t,u)}i={type:"stylesheet",instance:i,count:1,state:c},a.set(n,i)}}}function kh(l,t){he.X(l,t);var e=aa;if(e&&l){var u=_u(e).hoistableScripts,a=ia(l),n=u.get(a);n||(n=e.querySelector(Pa(a)),n||(l=W({src:l,async:!0},t),(t=Mt.get(a))&&vs(l,t),n=e.createElement("script"),Rl(n),Vl(n,"link",l),e.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},u.set(a,n))}}function Ih(l,t){he.M(l,t);var e=aa;if(e&&l){var u=_u(e).hoistableScripts,a=ia(l),n=u.get(a);n||(n=e.querySelector(Pa(a)),n||(l=W({src:l,async:!0,type:"module"},t),(t=Mt.get(a))&&vs(l,t),n=e.createElement("script"),Rl(n),Vl(n,"link",l),e.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},u.set(a,n))}}function Cr(l,t,e,u){var a=(a=ge.current)?ka(a):null;if(!a)throw Error(o(446));switch(l){case"meta":case"title":return null;case"style":return typeof e.precedence=="string"&&typeof e.href=="string"?(e=na(e.href),t=_u(a).hoistableStyles,u=t.get(e),u||(u={type:"style",instance:null,count:0,state:null},t.set(e,u)),u):{type:"void",instance:null,count:0,state:null};case"link":if(e.rel==="stylesheet"&&typeof e.href=="string"&&typeof e.precedence=="string"){l=na(e.href);var n=_u(a).hoistableStyles,i=n.get(l);if(i||(a=a.ownerDocument||a,i={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},n.set(l,i),(n=a.querySelector(Ia(l)))?n._p||(i.instance=n,i.state.loading=5):(n=Mt.get(l),n||(n={rel:"preload",as:"style",href:e.href,crossOrigin:e.crossOrigin,integrity:e.integrity,media:e.media,hrefLang:e.hrefLang,referrerPolicy:e.referrerPolicy},Mt.set(l,n)),Ph(a,l,n,i.state))),t&&u===null)throw Error(o(528,""));return i}if(t&&u!==null)throw Error(o(529,""));return null;case"script":return t=e.async,e=e.src,typeof e=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(e=ia(e),t=_u(a).hoistableScripts,u=t.get(e),u||(u={type:"script",instance:null,count:0,state:null},t.set(e,u)),u):{type:"void",instance:null,count:0,state:null};default:throw Error(o(444,l))}}function na(l){return'href="'+Et(l)+'"'}function Ia(l){return'link[rel="stylesheet"]['+l+"]"}function Rr(l){return W({},l,{"data-precedence":l.precedence,precedence:null})}function Ph(l,t,e,u){if(t=l.querySelector('link[rel="preload"][as="style"]['+t+"]")){if(t[hn]!==!0){u.loading=1;return}}else t=l.createElement("link"),t[hn]=!0,t.onload=t.onerror=Vs.bind(null,t),Vl(t,"link",e),Rl(t),l.head.appendChild(t);u.preload=t,t.addEventListener("load",function(){return u.loading|=1}),t.addEventListener("error",function(){return u.loading|=2})}function ia(l){return'[src="'+Et(l)+'"]'}function Pa(l){return"script[async]"+l}function jr(l,t,e){if(t.count++,t.instance===null)switch(t.type){case"style":var u=l.querySelector('style[data-href~="'+Et(e.href)+'"]');if(u)return t.instance=u,Rl(u),u;var a=W({},e,{"data-href":e.href,"data-precedence":e.precedence,href:null,precedence:null});return u=(l.ownerDocument||l).createElement("style"),Rl(u),Vl(u,"style",a),pi(u,e.precedence,l),t.instance=u;case"stylesheet":a=na(e.href);var n=l.querySelector(Ia(a));if(n)return t.state.loading|=4,t.instance=n,Rl(n),n;u=Rr(e),(a=Mt.get(a))&&rs(u,a),n=(l.ownerDocument||l).createElement("link"),Rl(n);var i=n;return i._p=new Promise(function(c,f){i.onload=c,i.onerror=f}),Vl(n,"link",u),t.state.loading|=4,pi(n,e.precedence,l),t.instance=n;case"script":return n=ia(e.src),(a=l.querySelector(Pa(n)))?(t.instance=a,Rl(a),a):(u=e,(a=Mt.get(n))&&(u=W({},e),vs(u,a)),l=l.ownerDocument||l,a=l.createElement("script"),Rl(a),Vl(a,"link",u),l.head.appendChild(a),t.instance=a);case"void":return null;default:throw Error(o(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(u=t.instance,t.state.loading|=4,pi(u,e.precedence,l));return t.instance}function pi(l,t,e){for(var u=e.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),a=u.length?u[u.length-1]:null,n=a,i=0;i title"):null)}function ly(l,t,e){if(e===1||t.itemProp!=null)return!1;switch(l){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return l=t.disabled,typeof t.precedence=="string"&&l==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function Yr(l,t){return l==="img"&&t.src!=null&&t.src!==""&&t.onLoad==null&&t.loading!=="lazy"}function Br(l){return!(l.type==="stylesheet"&&(l.state.loading&3)===0)}function qr(l){return(l.width||100)*(l.height||100)*(typeof devicePixelRatio=="number"?devicePixelRatio:1)*.25}function Gr(l,t){typeof t.decode=="function"&&(l.imgCount++,t.complete||(l.imgBytes+=qr(t),l.suspenseyImages.push(t)),l=uy.bind(l),t.decode().then(l,l))}function ty(l,t,e,u){if(e.type==="stylesheet"&&(typeof u.media!="string"||matchMedia(u.media).matches!==!1)&&(e.state.loading&4)===0){if(e.instance===null){var a=na(u.href),n=t.querySelector(Ia(a));if(n){t=n._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(l.count++,l=ln.bind(l),t.then(l,l)),e.state.loading|=4,e.instance=n,Rl(n);return}n=t.ownerDocument||t,u=Rr(u),(a=Mt.get(a))&&rs(u,a),n=n.createElement("link"),Rl(n);var i=n;i._p=new Promise(function(c,f){i.onload=c,i.onerror=f}),Vl(n,"link",u),e.instance=n}l.stylesheets===null&&(l.stylesheets=new Map),l.stylesheets.set(e,t),(t=e.state.preload)&&(e.state.loading&3)===0&&(l.count++,e=ln.bind(l),t.addEventListener("load",e),t.addEventListener("error",e))}}var Ai=0;function ey(l,t){return l.stylesheets&&l.count===0&&Di(l,l.stylesheets),0Ai?50:800)+t);return l.unsuspend=e,function(){l.unsuspend=null,clearTimeout(u),clearTimeout(a)}}:null}function Qr(l){if(l.count===0&&(l.imgCount===0||!l.waitingForImages)){if(l.stylesheets)Di(l,l.stylesheets);else if(l.unsuspend){var t=l.unsuspend;l.unsuspend=null,t()}}}function ln(){this.count--,Qr(this)}function uy(){this.imgCount--,Qr(this)}var Mi=null;function Di(l,t){l.stylesheets=null,l.unsuspend!==null&&(l.count++,Mi=new Map,t.forEach(ay,l),Mi=null,ln.call(l))}function ay(l,t){if(!(t.state.loading&4)){var e=Mi.get(l);if(e)var u=e.get(null);else{e=new Map,Mi.set(l,e);for(var a=l.querySelectorAll("link[data-precedence],style[data-precedence]"),n=0;n"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(b)}catch(p){console.error(p)}}return b(),Ns.exports=Ty(),Ns.exports}var zy=Ey();const _y=m0(zy),o0=b=>{let p;const N=new Set,o=(J,C)=>{const S=typeof J=="function"?J(p):J;if(!Object.is(S,p)){const B=p;p=C??(typeof S!="object"||S===null)?S:Object.assign({},p,S),N.forEach(Z=>Z(p,B))}},A=()=>p,ll={setState:o,getState:A,getInitialState:()=>U,subscribe:J=>(N.add(J),()=>N.delete(J))},U=p=b(o,A,ll);return ll},Ny=(b=>b?o0(b):o0),xy=b=>b;function py(b,p=xy){const N=qi.useSyncExternalStore(b.subscribe,qi.useCallback(()=>p(b.getState()),[b,p]),()=>p(b.getInitialState()));return qi.useDebugValue(N),N}const d0=b=>{const p=Ny(b),N=o=>py(p,o);return Object.assign(N,p),N},Oy=(b=>b?d0(b):d0),Ay=()=>typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches,r0=b=>{const p=b==="system"?Ay():b==="dark",N=p?"catppuccin":"zinc-light";return typeof document<"u"&&document.documentElement.setAttribute("data-theme",N),p?"dark":"light"},Bi=localStorage.getItem("hl_theme_v2"),v0=Bi==="light"||Bi==="dark"||Bi==="system"?Bi:"system",My=r0(v0),Dy=localStorage.getItem("hl_route_mode")||"auto",Su=Oy((b,p)=>({theme:v0,resolvedTheme:My,routeMode:Dy,showAgyModal:!1,showCmdPalette:!1,toast:"",actionLoading:!1,telemetry:{mini:{chip:"Apple M6 (12核)",ip:"192.168.31.164",tailscale_ip:"100.108.205.40",cpu_pct:6.5,load_1m:.85,mem_used_gb:11.8,mem_total_gb:24,mem_pct:49.2,disk_used_gb:59.9,disk_total_gb:460.4,disk_pct:13,uptime:"运行中",agy_tmux:!0},nas:{ip:"192.168.31.185",online:!0,mounted:!0,total_tb:19.94,used_tb:3.36,free_tb:16.58,pct:16.8,latest_backup:"11-06 23:17"},network:{home_wan_ip:"124.90.142.21",ai_policy:"Ai平台 → 狮城节点",sg_node:"233boy-sea",sg_egress_ip:"104.43.105.243",sg_delay_ms:68},services:{agy:!0,vaultwarden:!0,nas:!0,clash:!0,router:!0,uptime:!0}},setTheme:N=>{localStorage.setItem("hl_theme_v2",N);const o=r0(N);b({theme:N,resolvedTheme:o})},toggleTheme:()=>{const{resolvedTheme:N,setTheme:o}=p();o(N==="dark"?"light":"dark")},setRouteMode:N=>{localStorage.setItem("hl_route_mode",N),b({routeMode:N})},setShowAgyModal:N=>b({showAgyModal:N}),setShowCmdPalette:N=>b({showCmdPalette:N}),showToast:N=>{b({toast:N}),setTimeout(()=>{p().toast===N&&b({toast:""})},3e3)},fetchTelemetry:async()=>{try{const N=await fetch("/api/telemetry");if(N.ok){const o=await N.json();b({telemetry:o})}}catch{}},triggerAction:async(N,o)=>{const{showToast:A,fetchTelemetry:q}=p();b({actionLoading:!0}),A(o);try{const ll=await(await fetch(`/api/action/${N}`,{method:"POST"})).json();A(ll.message||"操作已完成"),await q()}catch{A("请求失败,请稍后重试")}finally{b({actionLoading:!1})}},copyCmd:async(N,o)=>{const{showToast:A}=p();try{await navigator.clipboard.writeText(N),A(`已复制「${o}」: ${N}`)}catch{A(N)}},getEffectiveMode:()=>{const{routeMode:N}=p();if(N!=="auto")return N;const o=window.location.hostname;return o.startsWith("192.168.")||o.startsWith("100.")||o==="localhost"?"lan":o.includes(".home.961504.xyz")||window.location.port==="10443"?"home10443":"edge443"}}));typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{const b=Su.getState();b.theme==="system"&&b.setTheme("system")});/** - * @license lucide-react v0.475.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Uy=b=>b.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),h0=(...b)=>b.filter((p,N,o)=>!!p&&p.trim()!==""&&o.indexOf(p)===N).join(" ").trim();/** - * @license lucide-react v0.475.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */var Cy={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** - * @license lucide-react v0.475.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Ry=at.forwardRef(({color:b="currentColor",size:p=24,strokeWidth:N=2,absoluteStrokeWidth:o,className:A="",children:q,iconNode:nl,...ll},U)=>at.createElement("svg",{ref:U,...Cy,width:p,height:p,stroke:b,strokeWidth:o?Number(N)*24/Number(p):N,className:h0("lucide",A),...ll},[...nl.map(([J,C])=>at.createElement(J,C)),...Array.isArray(q)?q:[q]]));/** - * @license lucide-react v0.475.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Gi=(b,p)=>{const N=at.forwardRef(({className:o,...A},q)=>at.createElement(Ry,{ref:q,iconNode:p,className:h0(`lucide-${Uy(b)}`,o),...A}));return N.displayName=`${b}`,N};/** - * @license lucide-react v0.475.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const jy=[["path",{d:"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z",key:"a7tn18"}]],Hy=Gi("Moon",jy);/** - * @license lucide-react v0.475.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Yy=[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],y0=Gi("Search",Yy);/** - * @license lucide-react v0.475.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const By=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],qy=Gi("Sun",By);/** - * @license lucide-react v0.475.0 - ISC - * - * This source code is licensed under the ISC license. - * See the LICENSE file in the root directory of this source tree. - */const Gy=[["polyline",{points:"4 17 10 11 4 5",key:"akl6gq"}],["line",{x1:"12",x2:"20",y1:"19",y2:"19",key:"q2wloq"}]],Qy=Gi("Terminal",Gy),Xy=[{id:"auto",label:"智能路由"},{id:"edge443",label:"443 免端口"},{id:"home10443",label:"10443 家宽"},{id:"lan",label:"LAN 局域网"}],Zy=()=>{const{theme:b,resolvedTheme:p,routeMode:N,telemetry:o,setTheme:A,toggleTheme:q,setRouteMode:nl,setShowAgyModal:ll,setShowCmdPalette:U}=Su();return E.jsx("header",{className:"border-b hl-border sticky top-0 z-30 backdrop-blur-md",style:{backgroundColor:"color-mix(in srgb, var(--bg-page) 86%, transparent)"},children:E.jsxs("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-3 flex flex-wrap items-center justify-between gap-3",children:[E.jsxs("div",{className:"flex flex-wrap items-center gap-2.5 sm:gap-3",children:[E.jsxs("div",{className:"flex items-center gap-2.5 pr-1",children:[E.jsx("img",{src:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/apple.png",alt:"Mac mini",className:"w-6 h-6 rounded"}),E.jsx("span",{className:"font-semibold text-sm tracking-tight",children:"HomeLab"}),E.jsx("span",{className:"w-2 h-2 rounded-full",style:{backgroundColor:"var(--success)"},title:"全屋 4 节点在线"})]}),E.jsxs("div",{className:"hidden xl:flex items-center gap-2 text-xs font-mono-num",children:[E.jsxs("div",{className:"hl-pill px-2.5 py-1 flex items-center gap-2",title:"Apple M6 12核处理器负载",children:[E.jsx("span",{style:{color:"var(--text-muted)"},children:"M6 CPU"}),E.jsx("div",{className:"w-12 h-1.5 rounded-full hl-muted overflow-hidden",children:E.jsx("div",{className:"h-full hl-bar-fill",style:{width:`${Math.max(5,o.mini.cpu_pct)}%`}})}),E.jsxs("span",{className:"font-medium",children:[o.mini.cpu_pct,"%"]})]}),E.jsxs("div",{className:"hl-pill px-2.5 py-1 flex items-center gap-2",title:"Mac mini 24GB 统一内存",children:[E.jsx("span",{style:{color:"var(--text-muted)"},children:"RAM"}),E.jsx("div",{className:"w-12 h-1.5 rounded-full hl-muted overflow-hidden",children:E.jsx("div",{className:"h-full hl-bar-fill",style:{width:`${Math.max(5,o.mini.mem_pct)}%`}})}),E.jsxs("span",{className:"font-medium",children:[o.mini.mem_used_gb,"G"]})]}),E.jsxs("div",{className:"hl-pill px-2.5 py-1 flex items-center gap-2",title:"极空间 Z4 20TB 存储阵列",children:[E.jsx("span",{style:{color:"var(--text-muted)"},children:"NAS 余量"}),E.jsx("div",{className:"w-12 h-1.5 rounded-full hl-muted overflow-hidden",children:E.jsx("div",{className:"h-full hl-bar-fill-green",style:{width:`${Math.max(5,o.nas.pct)}%`}})}),E.jsxs("span",{className:"font-medium",style:{color:"var(--success)"},children:[o.nas.free_tb," TB"]})]}),E.jsxs("div",{className:"hl-pill px-2.5 py-1 flex items-center gap-1.5",title:"AGY 锁定新加坡 Azure 专线出口",children:[E.jsx("span",{className:"w-1.5 h-1.5 rounded-full",style:{backgroundColor:"var(--success)"}}),E.jsx("span",{style:{color:"var(--text-muted)"},children:"SG 专线"}),E.jsx("span",{className:"font-medium",children:o.network.sg_delay_ms>0?`${o.network.sg_delay_ms}ms`:"直连"})]})]})]}),E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsxs("button",{onClick:()=>U(!0),className:"hl-btn-outline px-2.5 py-1 text-xs flex items-center gap-3 cursor-pointer",title:"按 Cmd+K 唤起全局命令面板",children:[E.jsxs("span",{className:"flex items-center gap-1.5",style:{color:"var(--text-muted)"},children:[E.jsx(y0,{className:"w-3.5 h-3.5"}),E.jsx("span",{className:"hidden sm:inline",children:"搜索..."})]}),E.jsx("kbd",{className:"px-1.5 py-0.5 text-[10px] font-mono-num rounded hl-muted",style:{color:"var(--text-muted)"},children:"⌘K"})]}),E.jsx("div",{className:"hidden md:flex items-center p-0.5 rounded-lg hl-muted border hl-border text-xs",children:Xy.map(J=>E.jsx("button",{onClick:()=>nl(J.id),className:"px-2 py-1 rounded-md font-medium transition-all cursor-pointer",style:N===J.id?{backgroundColor:"var(--bg-card)",color:"var(--text-main)",boxShadow:"0 1px 2px rgba(0,0,0,0.08)"}:{color:"var(--text-muted)"},children:J.label},J.id))}),E.jsxs("button",{onClick:()=>ll(!0),className:"hl-btn-primary px-3 py-1.5 text-xs flex items-center gap-1.5 cursor-pointer",children:[E.jsx(Qy,{className:"w-3.5 h-3.5"}),E.jsx("span",{children:"AGY 终端"})]}),E.jsxs("div",{className:"flex items-center p-0.5 rounded-lg hl-muted border hl-border text-xs",children:[E.jsx("button",{onClick:q,className:"px-2.5 py-1 rounded-md font-medium transition-all flex items-center gap-1.5 cursor-pointer",style:{backgroundColor:"var(--bg-card)",color:"var(--text-main)",boxShadow:"0 1px 2px rgba(0,0,0,0.08)"},title:"点击切换深色 / 浅色主题",children:p==="dark"?E.jsxs(E.Fragment,{children:[E.jsx(Hy,{className:"w-3.5 h-3.5"}),E.jsx("span",{className:"hidden sm:inline",children:"深色"})]}):E.jsxs(E.Fragment,{children:[E.jsx(qy,{className:"w-3.5 h-3.5"}),E.jsx("span",{className:"hidden sm:inline",children:"浅色"})]})}),b!=="system"&&E.jsx("button",{onClick:()=>A("system"),className:"px-2 py-1 rounded-md text-[11px] transition-all cursor-pointer",style:{color:"var(--text-muted)"},title:"恢复跟随设备系统深浅色自动切换",children:"自动"})]})]})]})})},Vy=({card:b})=>{const{getEffectiveMode:p,setShowAgyModal:N,triggerAction:o}=Su(),A=p(),q=A==="lan"?b.lanUrl:A==="home10443"?b.homeUrl:b.edgeUrl,nl=A==="lan"?"LAN 直连":A==="home10443"?"10443":"443 免端口";return E.jsxs("a",{href:q,target:"_blank",rel:"noopener noreferrer",className:"hl-card hl-card-interactive flex flex-col justify-between overflow-hidden group cursor-pointer",children:[E.jsxs("div",{className:"p-4 sm:p-5 space-y-3",children:[E.jsxs("div",{className:"flex items-start justify-between gap-3",children:[E.jsxs("div",{className:"flex items-center gap-3.5 min-w-0",children:[E.jsx("div",{className:"w-10 h-10 rounded-xl hl-muted border hl-border p-1.5 flex items-center justify-center shrink-0",children:E.jsx("img",{src:b.iconUrl,alt:b.title,className:"w-full h-full object-contain"})}),E.jsxs("div",{className:"min-w-0",children:[E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsx("h3",{className:"text-sm font-semibold truncate group-hover:underline",children:b.title}),E.jsx("span",{className:"w-2 h-2 rounded-full shrink-0",style:{backgroundColor:b.online!==!1?"var(--success)":"#ef4444"}})]}),E.jsx("p",{className:"text-[11px] font-mono-num truncate mt-0.5",style:{color:"var(--text-muted)"},children:b.subtitle})]})]}),b.actionType==="drawer"?E.jsx("button",{onClick:ll=>{ll.preventDefault(),N(!0)},className:"px-2 py-1 rounded-md text-[11px] font-medium shrink-0 transition-opacity hover:opacity-80 cursor-pointer",style:{backgroundColor:"var(--accent-soft)",color:"var(--accent)"},children:"页内终端"}):b.actionType==="backup"?E.jsx("button",{onClick:ll=>{ll.preventDefault(),o("backup_nas","正在打包备份至极空间 Z4...")},className:"px-2 py-1 rounded-md text-[11px] font-medium shrink-0 transition-opacity hover:opacity-80 cursor-pointer",style:{backgroundColor:"var(--success-soft)",color:"var(--success)"},children:"立即备份"}):E.jsx("span",{className:"text-xs font-mono-num px-2 py-0.5 rounded hl-muted shrink-0",style:{color:"var(--text-muted)"},children:nl})]}),E.jsx("p",{className:"text-xs leading-relaxed line-clamp-2",style:{color:"var(--text-muted)"},children:b.desc})]}),E.jsx("div",{className:"hl-widget-footer grid grid-cols-3 divide-x hl-border text-center",children:b.stats.map((ll,U)=>E.jsxs("div",{className:"py-2.5 px-2 flex flex-col items-center justify-center",children:[E.jsx("span",{className:"text-[10px] uppercase tracking-wider truncate max-w-full",style:{color:"var(--text-subtle)"},children:ll.label}),E.jsx("span",{className:"text-xs font-semibold font-mono-num mt-0.5 truncate max-w-full",style:{color:ll.highlight?"var(--success)":"var(--text-main)"},children:ll.value})]},U))})]})},Ly=[{label:"SSH 连接 Mac mini",cmd:"ssh mini"},{label:"终端接力 AGY 会话",cmd:'ssh mini -t "tmux attach -t agy"'},{label:"SSH 连接新加坡 Azure",cmd:"ssh azure"},{label:"SSH 连接小米主路由",cmd:"ssh root@192.168.31.1"}],wy=()=>{const{copyCmd:b,triggerAction:p}=Su();return E.jsxs("section",{className:"space-y-3 pt-1",children:[E.jsxs("div",{className:"flex items-center justify-between px-0.5",children:[E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsx("h2",{className:"text-xs font-semibold uppercase tracking-wider",style:{color:"var(--text-muted)"},children:"终端快捷指令与备用直连书签"}),E.jsx("span",{className:"text-[11px] font-mono-num",style:{color:"var(--text-subtle)"},children:"· 点击指令即复制"})]}),E.jsxs("div",{className:"flex items-center gap-3 text-xs",children:[E.jsx("button",{onClick:()=>p("refresh_ddns","正在同步 Cloudflare DDNS..."),className:"hover:underline font-medium cursor-pointer",style:{color:"var(--accent)"},children:"刷新 DDNS 解析"}),E.jsx("button",{onClick:()=>p("mount_nas","正在巡检极空间 20TB SMB 挂载..."),className:"hover:underline font-medium cursor-pointer",style:{color:"var(--accent)"},children:"巡检极空间挂载"})]})]}),E.jsx("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3",children:Ly.map(N=>E.jsxs("button",{onClick:()=>b(N.cmd,N.label),className:"hl-card hl-card-interactive px-4 py-3 text-left flex items-center justify-between gap-2 cursor-pointer",children:[E.jsxs("div",{className:"min-w-0",children:[E.jsx("div",{className:"text-xs font-semibold",children:N.label}),E.jsx("div",{className:"text-[11px] font-mono-num truncate mt-0.5",style:{color:"var(--accent)"},children:N.cmd})]}),E.jsx("span",{className:"text-[10px] font-mono-num px-1.5 py-0.5 rounded hl-muted shrink-0",style:{color:"var(--text-muted)"},children:"COPY"})]},N.cmd))})]})},Ky=()=>{const{showCmdPalette:b,setShowCmdPalette:p,setShowAgyModal:N,setTheme:o,triggerAction:A,copyCmd:q,getEffectiveMode:nl}=Su(),[ll,U]=at.useState(""),J=at.useRef(null);at.useEffect(()=>{b&&(U(""),setTimeout(()=>{var Z;return(Z=J.current)==null?void 0:Z.focus()},20))},[b]);const C=at.useMemo(()=>{const Z=nl(),El=(wl,vl,kl)=>Z==="lan"?kl:Z==="home10443"?vl:wl;return[{id:"open-agy-drawer",title:"在页内唤起 AGY 云端终端",hint:"tmux attach -t agy",type:"终端",run:()=>N(!0)},{id:"open-agy",title:"新窗口打开 AGY 云端工作台",hint:"https://agy.961504.xyz",type:"跳转",run:()=>window.open(El("https://agy.961504.xyz","https://agy.home.961504.xyz:10443","http://192.168.31.164:7681"),"_blank")},{id:"open-z4",title:"打开 极空间 Z4 私有云 (20TB)",hint:"192.168.31.185:5055",type:"跳转",run:()=>window.open(El("https://z4.home.961504.xyz:10443","https://z4.home.961504.xyz:10443","http://192.168.31.185:5055"),"_blank")},{id:"open-vw",title:"打开 Vaultwarden 密码保险箱",hint:"https://vw.961504.xyz",type:"跳转",run:()=>window.open(El("https://vw.961504.xyz","https://vw.home.961504.xyz:10443","http://192.168.31.164:8222"),"_blank")},{id:"open-clash",title:"打开 Mihomo 路由分流面板",hint:"192.168.31.1:9999",type:"跳转",run:()=>window.open(El("https://clash.home.961504.xyz:10443/ui/","https://clash.home.961504.xyz:10443/ui/","http://192.168.31.1:9999/ui/"),"_blank")},{id:"act-backup",title:"立即打包备份核心数据至极空间 Z4",hint:"backup-to-nas.sh",type:"运维",run:()=>A("backup_nas","正在打包备份至极空间 Z4...")},{id:"act-ddns",title:"立即刷新 Cloudflare DDNS 解析",hint:"cloudflare-ddns.sh",type:"运维",run:()=>A("refresh_ddns","正在同步 Cloudflare DDNS...")},{id:"ssh-mini",title:"复制 SSH 连接 Mac mini 指令",hint:"ssh mini",type:"SSH",run:()=>q("ssh mini","SSH Mac mini")},{id:"ssh-agy",title:"复制 终端接力 AGY 会话指令",hint:'ssh mini -t "tmux attach -t agy"',type:"SSH",run:()=>q('ssh mini -t "tmux attach -t agy"',"接力 AGY")},{id:"theme-system",title:"主题模式: 跟随设备系统深浅色自动切换",hint:"system",type:"主题",run:()=>o("system")},{id:"theme-light",title:"切换主题: 浅色纯净 (Light)",hint:"light",type:"主题",run:()=>o("light")},{id:"theme-dark",title:"切换主题: 深色极客 (Dark)",hint:"dark",type:"主题",run:()=>o("dark")}]},[nl,N,o,A,q]),S=at.useMemo(()=>{const Z=ll.trim().toLowerCase();return Z?C.filter(El=>El.title.toLowerCase().includes(Z)||El.hint.toLowerCase().includes(Z)):C},[ll,C]);if(!b)return null;const B=Z=>{p(!1),Z.run()};return E.jsx("div",{onClick:Z=>{Z.target===Z.currentTarget&&p(!1)},className:"fixed inset-0 z-50 bg-black/60 backdrop-blur-sm flex items-start justify-center pt-20 px-4",children:E.jsxs("div",{className:"w-full max-w-xl hl-card overflow-hidden shadow-2xl",children:[E.jsxs("div",{className:"px-4 py-3 border-b hl-border flex items-center gap-3",children:[E.jsx(y0,{className:"w-4 h-4",style:{color:"var(--text-muted)"}}),E.jsx("input",{ref:J,value:ll,onChange:Z=>U(Z.target.value),type:"text",placeholder:"输入服务名称、SSH 指令、路由模式或主题...",className:"w-full bg-transparent text-sm outline-none",onKeyDown:Z=>{Z.key==="Escape"&&p(!1),Z.key==="Enter"&&S.length>0&&B(S[0])}}),E.jsx("kbd",{className:"px-1.5 py-0.5 text-[10px] font-mono-num rounded hl-muted",style:{color:"var(--text-muted)"},children:"ESC"})]}),E.jsxs("div",{className:"max-h-80 overflow-y-auto p-2 text-xs",children:[E.jsx("div",{className:"px-2.5 py-1 text-[10px] font-semibold uppercase tracking-wider",style:{color:"var(--text-subtle)"},children:"快速操作与服务直达"}),S.map(Z=>E.jsxs("button",{onClick:()=>B(Z),className:"w-full px-3 py-2 rounded-lg text-left flex items-center justify-between transition-colors cursor-pointer",onMouseEnter:El=>{El.currentTarget.style.backgroundColor="var(--bg-muted)"},onMouseLeave:El=>{El.currentTarget.style.backgroundColor="transparent"},children:[E.jsxs("div",{className:"flex items-center gap-2.5",children:[E.jsx("span",{className:"font-medium",children:Z.title}),E.jsx("span",{className:"font-mono-num text-[11px]",style:{color:"var(--text-muted)"},children:Z.hint})]}),E.jsx("span",{className:"text-[10px] font-mono-num px-1.5 py-0.5 rounded hl-muted",style:{color:"var(--text-muted)"},children:Z.type})]},Z.id))]})]})})},Jy=()=>{const{showAgyModal:b,setShowAgyModal:p,getEffectiveMode:N}=Su();if(!b)return null;const o=N(),A=o==="lan"?"http://192.168.31.164:7681":o==="home10443"?"https://agy.home.961504.xyz:10443":"https://agy.961504.xyz";return E.jsx("div",{className:"fixed inset-0 z-50 bg-black/75 backdrop-blur-sm flex items-center justify-center p-3 sm:p-6",children:E.jsxs("div",{className:"w-full h-full max-w-6xl hl-card flex flex-col overflow-hidden shadow-2xl",children:[E.jsxs("div",{className:"px-4 py-2.5 border-b hl-border flex items-center justify-between hl-muted",children:[E.jsxs("div",{className:"flex items-center gap-2.5",children:[E.jsx("img",{src:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/google-gemini.png",alt:"AGY",className:"w-4 h-4"}),E.jsx("span",{className:"text-xs font-mono-num font-medium",children:"AGY 云端工作台 · tmux 持久会话 (关窗不断连)"})]}),E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsx("a",{href:A,target:"_blank",rel:"noopener noreferrer",className:"hl-btn-outline px-2.5 py-1 text-xs font-mono-num",children:"新标签页全屏 ↗"}),E.jsx("button",{onClick:()=>p(!1),className:"hl-btn-primary px-3 py-1 text-xs cursor-pointer",children:"收起终端"})]})]}),E.jsx("iframe",{src:A,title:"AGY Cloud Workbench",className:"w-full flex-1 bg-black border-0"})]})})},$y=()=>{const{telemetry:b,toast:p,fetchTelemetry:N,setShowCmdPalette:o,getEffectiveMode:A,routeMode:q}=Su();at.useEffect(()=>{N();const U=setInterval(N,3e3),J=C=>{(C.metaKey||C.ctrlKey)&&C.key.toLowerCase()==="k"&&(C.preventDefault(),o(!0))};return window.addEventListener("keydown",J),()=>{clearInterval(U),window.removeEventListener("keydown",J)}},[N,o]);const nl=at.useMemo(()=>{const U=A();return U==="lan"?"LAN 局域网极速直连 (192.168.31.x)":U==="home10443"?"10443 家宽公网 HTTPS 直连":"443 免端口 HTTPS 直达 (*.961504.xyz)"},[A,q]),ll=at.useMemo(()=>{const U=b;return[{title:"核心工作台与私有云存储",subtitle:"Core Workbench & Storage",showRouteHint:!0,items:[{id:"agy",title:"AGY 云端工作台",subtitle:"agy.961504.xyz · ttyd + tmux",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/google-gemini.png",online:U.services.agy,actionType:"drawer",desc:"M6 Mac mini 上的 24 小时常驻 AI 编程终端,已同步 Google 登录态并锁定新加坡出口,关掉网页后台继续运行。",edgeUrl:"https://agy.961504.xyz",homeUrl:"https://agy.home.961504.xyz:10443",lanUrl:"http://192.168.31.164:7681",stats:[{label:"M6 CPU 负载",value:`${U.mini.cpu_pct}%`},{label:"已用内存",value:`${U.mini.mem_used_gb} / 24 GB`},{label:"tmux 会话",value:U.mini.agy_tmux?"常驻运行中":"待机",highlight:!0}]},{id:"zspace",title:"极空间 Z4 私有云",subtitle:"192.168.31.185 · 20TB RAID 存储池",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/synology-drive.png",online:U.services.nas,desc:"家庭 20TB 大容量存储中心、极影视蓝光影院与手机相册备份,已自动 SMB 挂载至 Mac mini ~/nas。",edgeUrl:"https://z4.home.961504.xyz:10443",homeUrl:"https://z4.home.961504.xyz:10443",lanUrl:"http://192.168.31.185:5055",stats:[{label:"剩余可用",value:`${U.nas.free_tb} TB`,highlight:!0},{label:"已用容量",value:`${U.nas.used_tb} TB (${U.nas.pct}%)`},{label:"SMB 挂载",value:U.nas.mounted?"~/nas 已挂载":"重连中"}]},{id:"vaultwarden",title:"Vaultwarden 密码保险箱",subtitle:"vw.961504.xyz · Bitwarden 兼容",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/vaultwarden.png",online:U.services.vaultwarden,actionType:"backup",desc:"自托管全平台加密密码库,支持 iOS / Android / 浏览器插件自动填充,每天凌晨 03:30 自动打包灾备至极空间。",edgeUrl:"https://vw.961504.xyz",homeUrl:"https://vw.home.961504.xyz:10443",lanUrl:"http://192.168.31.164:8222",stats:[{label:"容器状态",value:"Healthy",highlight:!0},{label:"最近极空间灾备",value:U.nas.latest_backup},{label:"Mac SSD 占用",value:`${U.mini.disk_pct}%`}]}]},{title:"网络网关、AI 专线与外部哨兵",subtitle:"Network Gateway & Cloud Edge",showRouteHint:!1,items:[{id:"clash",title:"Mihomo 路由分流面板",subtitle:"192.168.31.1:9999 · ShellCrash",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/clash.png",online:U.services.clash,desc:"小米主路由器透明网关控制台,实时监控全屋设备流量、分流规则与狮城 AI 算力专线锁定状态。",edgeUrl:"https://clash.home.961504.xyz:10443/ui/",homeUrl:"https://clash.home.961504.xyz:10443/ui/",lanUrl:"http://192.168.31.1:9999/ui/",stats:[{label:"AI 锁定策略",value:"狮城节点",highlight:!0},{label:"新加坡延迟",value:U.network.sg_delay_ms>0?`${U.network.sg_delay_ms} ms`:"直连"},{label:"固定出口 IP",value:U.network.sg_egress_ip}]},{id:"router",title:"小米主路由器后台",subtitle:"192.168.31.1 · PPPoE 公网网关",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/openwrt.png",online:U.services.router,desc:"管理家庭联通公网宽带拨号、DHCP 静态 IP 绑定、10443 与 41641 端口转发及全屋内网 Split-DNS。",edgeUrl:"https://router.home.961504.xyz:10443",homeUrl:"https://router.home.961504.xyz:10443",lanUrl:"http://192.168.31.1",stats:[{label:"联通公网 IPv4",value:U.network.home_wan_ip,highlight:!0},{label:"泛域名 DDNS",value:"*.home.961504.xyz"},{label:"内网网关",value:"192.168.31.1"}]},{id:"uptime",title:"Uptime Kuma 外部哨兵",subtitle:"status.961504.xyz · SG Azure",iconUrl:"https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/uptime-kuma.png",online:U.services.uptime,desc:"独立部署在新加坡 Azure 公有云上的 24 小时外部监控哨兵,通过 Tailscale P2P 专线实时探测家庭服务。",edgeUrl:"https://status.961504.xyz",homeUrl:"https://status.961504.xyz",lanUrl:"https://status.961504.xyz",stats:[{label:"云端公网 IP",value:"104.43.105.243"},{label:"Tailscale 专线",value:"100.115.204.51"},{label:"外部探测状态",value:"100% 在线",highlight:!0}]}]}]},[b]);return E.jsxs("div",{className:"min-h-screen flex flex-col",children:[p&&E.jsxs("div",{className:"fixed bottom-5 right-5 z-50 hl-card px-4 py-3 flex items-center gap-2.5 shadow-2xl",children:[E.jsx("span",{className:"w-2 h-2 rounded-full",style:{backgroundColor:"var(--success)"}}),E.jsx("span",{className:"text-xs font-medium",children:p})]}),E.jsx(Zy,{}),E.jsxs("main",{className:"flex-1 max-w-7xl w-full mx-auto px-4 sm:px-6 lg:px-8 py-6 space-y-7",children:[ll.map(U=>E.jsxs("section",{className:"space-y-3",children:[E.jsxs("div",{className:"flex items-center justify-between px-0.5",children:[E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsx("h2",{className:"text-xs font-semibold uppercase tracking-wider",style:{color:"var(--text-muted)"},children:U.title}),E.jsxs("span",{className:"text-[11px] font-mono-num",style:{color:"var(--text-subtle)"},children:["· ",U.subtitle]})]}),U.showRouteHint&&E.jsxs("span",{className:"text-[11px] font-mono-num hidden sm:inline",style:{color:"var(--text-subtle)"},children:["当前路由模式: ",nl]})]}),E.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:U.items.map(J=>E.jsx(Vy,{card:J},J.id))})]},U.title)),E.jsx(wy,{})]}),E.jsx(Ky,{}),E.jsx(Jy,{})]})};_y.createRoot(document.getElementById("root")).render(E.jsx(qi.StrictMode,{children:E.jsx($y,{})})); diff --git a/stacks/portal/dist/index.html b/stacks/portal/dist/index.html index 1323d83..0a965cc 100644 --- a/stacks/portal/dist/index.html +++ b/stacks/portal/dist/index.html @@ -11,8 +11,8 @@ href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet" /> - - + +
diff --git a/stacks/portal/web/src/App.tsx b/stacks/portal/web/src/App.tsx index 99a303b..4256ed5 100644 --- a/stacks/portal/web/src/App.tsx +++ b/stacks/portal/web/src/App.tsx @@ -5,12 +5,16 @@ import { ServiceCard } from './components/ServiceCard'; import { SshShelf } from './components/SshShelf'; import { CommandPalette } from './components/CommandPalette'; import { AgyTerminalModal } from './components/AgyTerminalModal'; +import { StorybookWorkbench } from './components/StorybookWorkbench'; +import { LAYOUT_PRESETS } from './design-system/tokens'; import type { ServiceGroup } from './types/telemetry'; export const App: React.FC = () => { const { telemetry, toast, + viewMode, + layoutPreset, fetchTelemetry, setShowCmdPalette, getEffectiveMode, @@ -41,6 +45,8 @@ export const App: React.FC = () => { return '443 免端口 HTTPS 直达 (*.961504.xyz)'; }, [getEffectiveMode, routeMode]); + const gridClass = LAYOUT_PRESETS[layoutPreset]?.gridClass || LAYOUT_PRESETS['homepage-3col'].gridClass; + const serviceGroups = useMemo(() => { const t = telemetry; return [ @@ -176,49 +182,53 @@ export const App: React.FC = () => { )} - {/* 1. Top Utility & System Resources Ribbon */} + {/* 1. Standard Two-Tier AppShell Header & Telemetry Subheader */} - {/* 2. Main Categorized 3-Column Rows */} -
- {serviceGroups.map((group) => ( -
-
-
-

- {group.title} -

- - · {group.subtitle} - + {/* 2. View Switch: Dashboard vs Storybook Workbench */} + {viewMode === 'storybook' ? ( + + ) : ( +
+ {serviceGroups.map((group) => ( +
+
+
+

+ {group.title} +

+ + · {group.subtitle} + +
+ {group.showRouteHint && ( + + 当前路由模式: {activeModeLabel} + + )}
- {group.showRouteHint && ( - - 当前路由模式: {activeModeLabel} - - )} -
-
- {group.items.map((card) => ( - - ))} -
-
- ))} +
+ {group.items.map((card) => ( + + ))} +
+ + ))} - {/* 3. Bottom SSH Quick Copy & Maintenance Shelf */} - -
+ {/* 3. Bottom SSH Quick Copy & Maintenance Shelf */} + + + )} {/* 4. Global Cmd+K Command Palette */} diff --git a/stacks/portal/web/src/components/StorybookWorkbench.tsx b/stacks/portal/web/src/components/StorybookWorkbench.tsx new file mode 100644 index 0000000..196100f --- /dev/null +++ b/stacks/portal/web/src/components/StorybookWorkbench.tsx @@ -0,0 +1,388 @@ +import React, { useState } from 'react'; +import { BookOpen, Check, Layers, Layout, Palette, Sparkles, Terminal } from 'lucide-react'; +import { LAYOUT_PRESETS, THEME_PALETTES, type LayoutPresetId } from '../design-system/tokens'; +import { usePortalStore } from '../store/usePortalStore'; +import { ServiceCard } from './ServiceCard'; +import { SshShelf } from './SshShelf'; + +type StoryId = 'layout-architecture' | 'theme-tokens' | 'service-card' | 'ssh-shelf'; + +export const StorybookWorkbench: React.FC = () => { + const [activeStory, setActiveStory] = useState('layout-architecture'); + const { + theme, + resolvedTheme, + layoutPreset, + setTheme, + setLayoutPreset, + setViewMode, + telemetry, + } = usePortalStore(); + + // Interactive Playground Props for ServiceCard story + const [demoOnline, setDemoOnline] = useState(true); + const [demoAction, setDemoAction] = useState<'drawer' | 'backup' | undefined>('drawer'); + + const stories: Array<{ id: StoryId; group: string; title: string; icon: React.ReactNode }> = [ + { + id: 'layout-architecture', + group: 'FOUNDATIONS / 架构与布局', + title: '01. AppShell 双层顶栏与网格布局', + icon: , + }, + { + id: 'theme-tokens', + group: 'FOUNDATIONS / 架构与布局', + title: '02. 双主题色板与自动切换规范', + icon: , + }, + { + id: 'service-card', + group: 'COMPONENTS / 核心组件', + title: '03. ServiceCard 内联遥测卡片', + icon: , + }, + { + id: 'ssh-shelf', + group: 'COMPONENTS / 核心组件', + title: '04. SshShelf 快捷指令栏', + icon: , + }, + ]; + + return ( +
+
+ {/* Left Sidebar: Storybook Navigation Tree */} + + + {/* Right Canvas: Interactive Story Preview & Controls */} +
+ {/* STORY 1: Layout Architecture */} + {activeStory === 'layout-architecture' && ( +
+
+
+
+ + Foundations / AppShell Layout + +

+ 标准双层顶栏架构 (Two-Tier AppShell) & 响应式网格切换 +

+
+
+ +

+ 参考 Vercel Geist / shadcn/ui Dashboard-01 / GitHub AppShell{' '} + 标准规范,将原本容易挤压折行的单层顶栏拆分为职责清晰的双层结构: +

+ + {/* Visual Blueprint Diagram of Two-Tier Header */} +
+
+ [左] 🍎 HomeLab · 导航切换 (中控台 / Storybook) + + [最右固定] 🔍 搜索 ⌘K · >_ AGY 终端 · ☀️/🌙 主题切换 + +
+
+ + [左] 实时硬件遥测条 (M6 CPU · RAM · Z4 20TB · SG 专线) + + [右对齐] 路由模式切换器 (智能路由 / 443 / 10443 / LAN) +
+
+ + {/* Interactive Grid Preset Selector */} +
+
+ 选择主页卡片网格布局预设(点击立即应用到主页): +
+
+ {(Object.keys(LAYOUT_PRESETS) as LayoutPresetId[]).map((key) => { + const preset = LAYOUT_PRESETS[key]; + const active = layoutPreset === key; + return ( +
setLayoutPreset(key)} + className="hl-card hl-card-interactive p-4 cursor-pointer space-y-2" + style={active ? { borderColor: 'var(--accent)' } : {}} + > +
+ {preset.name} + {active && ( + + + + )} +
+

+ {preset.description} +

+ + {preset.gridClass} + +
+ ); + })} +
+
+
+
+ )} + + {/* STORY 2: Theme Tokens */} + {activeStory === 'theme-tokens' && ( +
+
+
+ + Foundations / Color System + +

+ 主流双主题色板规范(当前生效:{resolvedTheme === 'dark' ? '深色极客' : '浅色纯净'}) +

+
+ + 模式: {theme === 'system' ? '跟随设备自动切换' : '手动锁定'} + +
+ +
+ {(['light', 'dark'] as const).map((modeKey) => { + const p = THEME_PALETTES[modeKey]; + return ( +
+
+
+
{p.name}
+
+ {p.description} +
+
+ +
+ +
+ {Object.entries(p.tokens).map(([tokenName, hex]) => ( +
+ +
+
+ {tokenName} +
+
+ {hex} +
+
+
+ ))} +
+
+ ); + })} +
+
+ )} + + {/* STORY 3: ServiceCard Interactive Playground */} + {activeStory === 'service-card' && ( +
+
+
+ + Components / ServiceCard + +

+ 三段式内联遥测卡片 (ServiceCard Interactive Story) +

+
+ +
+ + {/* Interactive Controls */} +
+
+ 在线状态 (online): + +
+ +
+ 右上角动作按钮 (actionType): + {(['drawer', 'backup', undefined] as const).map((act, i) => ( + + ))} +
+
+ + {/* Live Component Canvas */} +
+ +
+
+ )} + + {/* STORY 4: SshShelf */} + {activeStory === 'ssh-shelf' && ( +
+
+ + Components / SshShelf + +

底部 SSH 快捷复制与运维操作栏

+
+ +
+ )} +
+
+
+ ); +}; diff --git a/stacks/portal/web/src/components/TopRibbon.tsx b/stacks/portal/web/src/components/TopRibbon.tsx index 984ad69..5dc72c9 100644 --- a/stacks/portal/web/src/components/TopRibbon.tsx +++ b/stacks/portal/web/src/components/TopRibbon.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Moon, Search, Sun, Terminal } from 'lucide-react'; +import { BookOpen, LayoutGrid, Moon, Search, Sun, Terminal } from 'lucide-react'; import { usePortalStore } from '../store/usePortalStore'; import type { RouteModeId } from '../types/telemetry'; @@ -15,171 +15,232 @@ export const TopRibbon: React.FC = () => { theme, resolvedTheme, routeMode, + viewMode, telemetry, setTheme, toggleTheme, setRouteMode, + setViewMode, setShowAgyModal, setShowCmdPalette, } = usePortalStore(); return ( -
-
- {/* Left: Brand + Live System Micro-Gauges Ribbon */} -
-
- Mac mini - HomeLab - -
- -
- {/* CPU Gauge */} -
- M6 CPU -
-
-
- {telemetry.mini.cpu_pct}% -
- - {/* RAM Gauge */} -
- RAM -
-
-
- {telemetry.mini.mem_used_gb}G -
- - {/* ZSpace 20TB Gauge */} -
- NAS 余量 -
-
-
- - {telemetry.nas.free_tb} TB - -
- - {/* SG AI Line Gauge */} -
- - SG 专线 - - {telemetry.network.sg_delay_ms > 0 ? `${telemetry.network.sg_delay_ms}ms` : '直连'} - -
-
-
- - {/* Right: Search (Cmd+K), Route Switcher, AGY Terminal, Top-Right Theme Switcher */} -
- + Mac mini + HomeLab + +
-
- {MODES.map((m) => ( +
+ + {/* View Switcher Tabs: Dashboard vs Storybook */} +
- - - {/* Top-Right Mainstream Theme Switcher (Auto System + Light/Dark 2 Mainstream Themes) */} -
+ {/* Far Right Group: Pinned to Right Edge (Search + AGY + Theme Switcher) */} +
- {theme !== 'system' && ( - + + + + {/* Top-Right Theme Toggle (Pinned at Far Right Corner!) */} +
+ - )} + {theme !== 'system' && ( + + )} +
-
-
+ + + {/* ===================================================================== + Tier 2: Subheader Telemetry & Route Mode Bar (Aligned with Grid) + Left: 4 Hardware & Network Gauges + Right: Route Mode Segmented Switcher (智能路由 / 443 / 10443 / LAN) + ===================================================================== */} + {viewMode === 'dashboard' && ( +
+
+ {/* Left: System Telemetry Strip */} +
+
+ M6 CPU +
+
+
+ {telemetry.mini.cpu_pct}% +
+ +
+ RAM +
+
+
+ {telemetry.mini.mem_used_gb}G +
+ +
+ NAS 余量 +
+
+
+ + {telemetry.nas.free_tb} TB + +
+ +
+ + SG 专线 + + {telemetry.network.sg_delay_ms > 0 ? `${telemetry.network.sg_delay_ms}ms` : '直连'} + +
+
+ + {/* Right: Route Mode Switcher (Pinned to Right Edge of Subheader) */} +
+ {MODES.map((m) => ( + + ))} +
+
+
+ )} + ); }; diff --git a/stacks/portal/web/src/design-system/DesignSystemDocs.tsx b/stacks/portal/web/src/design-system/DesignSystemDocs.tsx new file mode 100644 index 0000000..c6c4ee7 --- /dev/null +++ b/stacks/portal/web/src/design-system/DesignSystemDocs.tsx @@ -0,0 +1,135 @@ +import React from 'react'; +import { THEME_PALETTES, LAYOUT_PRESETS } from './tokens'; + +export const DesignTokensShowcase: React.FC = () => { + return ( +
+ {/* Header */} +
+
+ HomeLab Design System · Storybook v3.0 +
+

主题色彩、排版与布局规范 (Design Tokens)

+

+ 全系统仅保留两套高标准主流主题(浅色纯净 Light & 深色极客 Dark),默认通过{' '} + prefers-color-scheme{' '} + 自动跟随设备切换,并支持右上角一键手动覆盖。 +

+
+ + {/* Side-by-Side Theme Palettes */} +
+

1. 双主题色彩变量对照表 (Dual Mainstream Palettes)

+
+ {(['light', 'dark'] as const).map((key) => { + const p = THEME_PALETTES[key]; + return ( +
+
+
+
{p.name}
+
+ {p.description} +
+
+ + {p.id.toUpperCase()} + +
+ +
+ {Object.entries(p.tokens).map(([tokenName, hex]) => ( +
+ +
+
{tokenName}
+
+ {hex} +
+
+
+ ))} +
+
+ ); + })} +
+
+ + {/* Typography Scale */} +
+

2. 字体与等宽数字规范 (Typography & Tabular Numbers)

+
+
+
+
+ UI Sans Font · Inter / SF Pro Display +
+
AGY 云端工作台 · 极空间 Z4 私有云
+

+ 正文描述统一采用 12px (0.75rem) 搭配 1.625 行高,限制最最多 2 行截断 (line-clamp-2),确保所有卡片高度严格对齐。 +

+
+
+
+ Telemetry Mono Font · JetBrains Mono (tabular-nums) +
+
+ 16.58 TB FREE · 68 ms · 104.43.105.243 +
+

+ 所有实时跳动的 CPU 百分比、内存、存储余量、网络延迟强制启用{' '} + font-variant-numeric: tabular-nums,杜绝每 3 秒刷新时产生像素抖动。 +

+
+
+
+
+ + {/* Layout Grid Presets */} +
+

3. 响应式布局网格预设 (Layout Grid Presets)

+
+ {Object.values(LAYOUT_PRESETS).map((lp) => ( +
+
{lp.name}
+ + {lp.gridClass} + +

+ {lp.description} +

+
+ ))} +
+
+
+ ); +}; diff --git a/stacks/portal/web/src/design-system/tokens.ts b/stacks/portal/web/src/design-system/tokens.ts new file mode 100644 index 0000000..4aeb432 --- /dev/null +++ b/stacks/portal/web/src/design-system/tokens.ts @@ -0,0 +1,102 @@ +export interface ThemePalette { + id: 'light' | 'dark'; + name: string; + description: string; + tokens: { + '--bg-page': string; + '--bg-card': string; + '--bg-widget': string; + '--bg-muted': string; + '--bg-hover': string; + '--text-main': string; + '--text-muted': string; + '--text-subtle': string; + '--border-color': string; + '--border-hover': string; + '--primary': string; + '--primary-fg': string; + '--accent': string; + '--accent-soft': string; + '--success': string; + '--success-soft': string; + }; +} + +export const THEME_PALETTES: Record<'light' | 'dark', ThemePalette> = { + light: { + id: 'light', + name: 'Shadcn Clean Light (浅色纯净)', + description: '对标 Apple / Stripe / Linear 浅色日光模式,高对比深灰文字配纯净白卡片与冷灰微边框。', + tokens: { + '--bg-page': '#f8fafc', + '--bg-card': '#ffffff', + '--bg-widget': '#f8fafc', + '--bg-muted': '#f1f5f9', + '--bg-hover': '#ffffff', + '--text-main': '#0f172a', + '--text-muted': '#64748b', + '--text-subtle': '#94a3b8', + '--border-color': '#e2e8f0', + '--border-hover': '#cbd5e1', + '--primary': '#0f172a', + '--primary-fg': '#ffffff', + '--accent': '#2563eb', + '--accent-soft': 'rgba(37, 99, 235, 0.08)', + '--success': '#10b981', + '--success-soft': 'rgba(16, 185, 129, 0.10)', + }, + }, + dark: { + id: 'dark', + name: 'Catppuccin / Linear Dark (深色极客)', + description: '融合 Catppuccin Mocha 与 Linear 暗黑规范,柔和护眼的深邃蓝黑基底配高辨识度状态色。', + tokens: { + '--bg-page': '#11111b', + '--bg-card': '#1e1e2e', + '--bg-widget': '#181825', + '--bg-muted': '#313244', + '--bg-hover': '#242438', + '--text-main': '#cdd6f4', + '--text-muted': '#a6adc8', + '--text-subtle': '#6c7086', + '--border-color': '#313244', + '--border-hover': '#45475a', + '--primary': '#cba6f7', + '--primary-fg': '#11111b', + '--accent': '#89b4fa', + '--accent-soft': 'rgba(137, 180, 250, 0.15)', + '--success': '#a6e3a1', + '--success-soft': 'rgba(166, 227, 161, 0.15)', + }, + }, +}; + +export type LayoutPresetId = 'homepage-3col' | 'bento-split' | 'compact-2col'; + +export interface LayoutPreset { + id: LayoutPresetId; + name: string; + description: string; + gridClass: string; +} + +export const LAYOUT_PRESETS: Record = { + 'homepage-3col': { + id: 'homepage-3col', + name: 'Homepage 经典三列矩阵 (3-Column Grid)', + description: 'gethomepage.dev 标志性对称 3 列分组卡片,底部内嵌 3 格实时遥测单元。', + gridClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4', + }, + 'bento-split': { + id: 'bento-split', + name: 'Shadcn 双列宽屏卡片 (2-Column Wide Bento)', + description: '适合大字号阅读的 2 列宽体卡片布局,留白更充裕。', + gridClass: 'grid-cols-1 lg:grid-cols-2 gap-5', + }, + 'compact-2col': { + id: 'compact-2col', + name: '高密度四列紧凑矩阵 (4-Column Dense)', + description: '适合超宽显示器的一屏高密度 4 列布局。', + gridClass: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3.5', + }, +}; diff --git a/stacks/portal/web/src/store/usePortalStore.ts b/stacks/portal/web/src/store/usePortalStore.ts index 688fcb8..7499f4d 100644 --- a/stacks/portal/web/src/store/usePortalStore.ts +++ b/stacks/portal/web/src/store/usePortalStore.ts @@ -1,10 +1,13 @@ import { create } from 'zustand'; import type { RouteModeId, TelemetryData, ThemeId } from '../types/telemetry'; +import type { LayoutPresetId } from '../design-system/tokens'; interface PortalState { theme: ThemeId; resolvedTheme: 'light' | 'dark'; routeMode: RouteModeId; + layoutPreset: LayoutPresetId; + viewMode: 'dashboard' | 'storybook'; showAgyModal: boolean; showCmdPalette: boolean; toast: string; @@ -13,6 +16,8 @@ interface PortalState { setTheme: (theme: ThemeId) => void; toggleTheme: () => void; setRouteMode: (mode: RouteModeId) => void; + setLayoutPreset: (preset: LayoutPresetId) => void; + setViewMode: (view: 'dashboard' | 'storybook') => void; setShowAgyModal: (open: boolean) => void; setShowCmdPalette: (open: boolean) => void; showToast: (msg: string) => void; @@ -43,11 +48,19 @@ const initialTheme: ThemeId = : 'system'; const initialResolved = applyDomTheme(initialTheme); const initialRouteMode = (localStorage.getItem('hl_route_mode') as RouteModeId) || 'auto'; +const initialLayout = + (localStorage.getItem('hl_layout_preset') as LayoutPresetId) || 'homepage-3col'; +const initialView = + typeof window !== 'undefined' && window.location.pathname.startsWith('/storybook') + ? 'storybook' + : 'dashboard'; export const usePortalStore = create((set, get) => ({ theme: initialTheme, resolvedTheme: initialResolved, routeMode: initialRouteMode, + layoutPreset: initialLayout, + viewMode: initialView, showAgyModal: false, showCmdPalette: false, toast: '', @@ -111,6 +124,19 @@ export const usePortalStore = create((set, get) => ({ set({ routeMode }); }, + setLayoutPreset: (layoutPreset) => { + localStorage.setItem('hl_layout_preset', layoutPreset); + set({ layoutPreset }); + }, + + setViewMode: (viewMode) => { + if (typeof window !== 'undefined') { + const nextUrl = viewMode === 'storybook' ? '/storybook' : '/'; + window.history.pushState({}, '', nextUrl); + } + set({ viewMode }); + }, + setShowAgyModal: (showAgyModal) => set({ showAgyModal }), setShowCmdPalette: (showCmdPalette) => set({ showCmdPalette }),