@ash-qw/dsh-theme-prts 0.1.93 → 0.1.95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -1
- package/README.en.md +21 -50
- package/README.md +22 -51
- package/lib/client.js +172 -2462
- package/package.json +2 -2
- package/src/client/composer-glass-adapter.js +6 -5
- package/src/client/index.js +1 -11
- package/src/client/operations-shell-v2.js +120 -8
- package/src/client/particle-field-adapter.js +45 -3
- package/src/client/preferences.js +1 -35
- package/src/client/resize-shield-adapter.js +5 -0
- package/src/client/theme-settings-workbench.js +3 -234
- package/src/styles/prts.css +42 -72
- package/src/styles/theme-settings-workbench.css +1 -174
- package/src/client/conversation-scale-adapter.js +0 -2320
- package/src/styles/conversation-scale.css +0 -471
package/lib/client.js
CHANGED
|
@@ -3,8 +3,8 @@ window.__ModuleLoader__.load({
|
|
|
3
3
|
factory: (require) => {
|
|
4
4
|
var module = { exports: {} };
|
|
5
5
|
var exports = module.exports;
|
|
6
|
-
const PRTS_VERSION = "0.1.
|
|
7
|
-
const PRTS_CSS = "html[data-dsh-prts]{--prts-canvas: #080a0c; --prts-canvas-elevated: #0d1114; --prts-rail: #060809; --prts-panel: #11161a; --prts-panel-raised: #171d21; --prts-panel-muted: #20272c; --prts-ink: #edf1f2; --prts-muted: #98a3a9; --prts-dim: #68747a; --prts-line: #38434a; --prts-line-strong: #5e6a70; --prts-yellow: #f0c800; --prts-yellow-ink: #161300; --prts-cyan: #5ccddb; --prts-red: #ee625a; --prts-green: #8fcf79; --prts-host-top-inset: 0px; --prts-rail-width: 52px; --prts-nav-width: 52px; --prts-sessions-width: 286px; --prts-sessions-compact: 54px; --prts-workspace-height: 38px; --prts-session-height: 36px; --prts-facility-gap: 7px; --prts-facility-height: var(--prts-workspace-height); --prts-spine-width: 8px; --prts-spine-rest: .25; --prts-spine-travel: 6px; --prts-chamfer: 3px; --prts-radius-control: 3px; --prts-radius-card: 3px; --prts-radius-overlay: 4px; --prts-body: 'Noto Sans SC','Microsoft YaHei UI','Segoe UI',sans-serif; --prts-display: 'Arial Narrow','Noto Sans SC',sans-serif; --prts-mono: 'Roboto Mono','Noto Sans Mono CJK SC',Consolas,monospace; --prts-ease-spring: cubic-bezier(.2,.86,.28,1.16); --prts-ease-snap: cubic-bezier(.22,1,.36,1); --prts-shadow-glass-overlay: 0 18px 48px rgba(0,0,0,.32),inset 0 1px rgba(255,255,255,.06); --prts-glass-border: rgba(119,140,150,.52); --prts-glass-soft-surface: rgba(15,21,25,.82); --prts-glass-standard-surface: rgba(15,21,25,.9); --prts-glass-clear-surface: rgba(15,21,25,.72); --prts-glass-dense: rgba(7,10,12,.94); --prts-active-glass: var(--prts-glass-standard-surface); --prts-active-glass-filter: blur(18px) saturate(145%); color-scheme: dark; accent-color: var(--prts-yellow)}html[data-dsh-prts][data-prts-scheme=\"dark\"]{color-scheme: dark}html[data-dsh-prts][data-prts-scheme=\"light\"]{--prts-canvas: #eef1f3; --prts-canvas-elevated: #e5eaed; --prts-rail: #111518; --prts-panel: #f7f9fa; --prts-panel-raised: #e5eaed; --prts-panel-muted: #d5dde1; --prts-ink: #15191c; --prts-muted: #4f5c63; --prts-dim: #738087; --prts-line: #9eabb1; --prts-line-strong: #65727a; --prts-glass-border: rgba(62,82,92,.48); --prts-glass-soft-surface: rgba(247,250,251,.9); --prts-glass-standard-surface: rgba(244,249,251,.94); --prts-glass-clear-surface: rgba(244,249,251,.78); --prts-glass-dense: rgba(249,251,252,.97); --prts-shadow-glass-overlay: 0 18px 44px rgba(48,63,70,.18),inset 0 1px rgba(255,255,255,.86); color-scheme: light}html[data-dsh-prts][data-prts-glass=\"soft\"]{--prts-active-glass: var(--prts-glass-soft-surface); --prts-active-glass-filter: blur(18px) saturate(145%)}html[data-dsh-prts][data-prts-glass=\"standard\"]{--prts-active-glass: var(--prts-glass-standard-surface); --prts-active-glass-filter: blur(22px) saturate(155%)}html[data-dsh-prts][data-prts-glass=\"clear\"]{--prts-active-glass: var(--prts-glass-clear-surface); --prts-active-glass-filter: blur(28px) saturate(180%)}html[data-dsh-prts][data-prts-glass=\"off\"]{--prts-active-glass: var(--prts-panel); --prts-active-glass-filter: none}html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-conversation-scale],[data-prts-conversation-scale] *,[data-prts-conversation-preview],[data-prts-conversation-preview] *,[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] ),html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-conversation-scale],[data-prts-conversation-scale] *,[data-prts-conversation-preview],[data-prts-conversation-preview] *,[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] )::before,html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-conversation-scale],[data-prts-conversation-scale] *,[data-prts-conversation-preview],[data-prts-conversation-preview] *,[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] )::after{box-sizing: border-box}html[data-dsh-prts] body{--dsw-alias-bg-base: var(--prts-canvas); --dsw-alias-bg-layer-1: var(--prts-panel); --dsw-alias-bg-layer-2: var(--prts-panel-raised); --dsw-alias-bg-layer-3: var(--prts-panel-muted); --dsw-alias-label-primary: var(--prts-ink); --dsw-alias-label-secondary: var(--prts-muted); --dsw-alias-border-l2: var(--prts-line); min-height: 100dvh; margin: 0; overflow: hidden; background: var(--prts-canvas); color: var(--prts-ink); font-family: var(--prts-body)}html[data-dsh-prts] ::selection{background: var(--prts-yellow); color: var(--prts-yellow-ink)}html[data-dsh-prts] a{color: var(--prts-cyan); text-underline-offset: 3px}html[data-dsh-prts] [data-prts-shell] :is(button,input,textarea,select),html[data-dsh-prts] [data-prts-theme-settings] :is(button,input,textarea,select){font: inherit}html[data-dsh-prts] [data-prts-shell] button,html[data-dsh-prts] [data-prts-theme-settings] button{color: inherit}html[data-dsh-prts] :focus-visible{outline: 2px solid var(--prts-yellow) !important; outline-offset: 2px !important}html[data-dsh-prts] [hidden]{display: none !important}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"]{--prts-nav-width: 0px}html[data-dsh-prts] [data-prts-shell]{position: fixed; z-index: 124; inset: var(--prts-host-top-inset) auto 0 0; width: var(--prts-nav-width); pointer-events: none; font-family: var(--prts-mono)}html[data-dsh-prts] [data-prts-shell] button,html[data-dsh-prts] [data-prts-nav-rail]{pointer-events: auto}html[data-dsh-prts] [data-prts-topbar]{display: none}html[data-dsh-prts] [data-prts-nav-rail]{position: fixed; z-index: 120; inset: var(--prts-host-top-inset) auto 0 0; width: var(--prts-rail-width); display: flex; flex-direction: column; align-items: stretch; border-right: 1px solid #30383d; background: var(--prts-rail); color: #e8edef; box-shadow: 4px 0 18px rgba(0,0,0,.18)}html[data-dsh-prts] [data-prts-rail-launcher]{display: none}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-nav-rail]{opacity: 0; visibility: hidden; transform: translate3d(-100%,0,0); transition: transform 180ms var(--prts-ease-snap),opacity 120ms ease,visibility 0s linear 180ms; pointer-events: none}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"][data-prts-rail-open] [data-prts-nav-rail]{opacity: 1; visibility: visible; transform: translate3d(0,0,0); transition-delay: 0s; pointer-events: auto}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"][data-prts-rail-open] [data-prts-rail-launcher]{opacity: 0; visibility: hidden; pointer-events: none}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher]{position: fixed; z-index: 121; top: 50%; left: 0; width: 12px; height: 96px; display: grid; place-items: center; padding: 0; overflow: hidden; border: 1px solid color-mix(in srgb,var(--prts-yellow) 40%,transparent); border-left: 0; border-radius: 0 3px 3px 0; opacity: .34; background: color-mix(in srgb,var(--prts-rail) 86%,transparent); color: var(--prts-yellow); font: 700 8px/1 var(--prts-mono); letter-spacing: .08em; transform: translateY(-50%); transition: width 140ms var(--prts-ease-snap),opacity 120ms ease,background-color 120ms ease; cursor: pointer}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher] > span{opacity: 0; writing-mode: vertical-rl; transition: opacity 100ms ease}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher]:is(:hover,:focus-visible){width: 40px; opacity: 1; background: var(--prts-rail)}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher]:is(:hover,:focus-visible) > span{opacity: 1}@media (hover: none),(pointer: coarse){html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher]{top: calc(var(--prts-host-top-inset) + 12px); width: 40px; height: 40px; opacity: .92; transform: none}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher] > span{opacity: 1}}html[data-dsh-prts] [data-prts-rail-brand]{height: 64px; display: grid; place-items: center; padding: 8px 5px; border-bottom: 1px solid #30383d; overflow: hidden}html[data-dsh-prts] [data-prts-rail-brand] svg{width: 38px; height: 38px; color: #edf1f2}html[data-dsh-prts] [data-prts-rail-brand] > span{position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0)}html[data-dsh-prts] [data-prts-nav-rail] > button{position: relative; width: 100%; min-height: 52px; display: grid; place-items: center; gap: 2px; padding: 7px 2px 6px; border: 0; border-bottom: 1px solid #242b2f; background: transparent; color: #9fa9ae; cursor: pointer; clip-path: polygon(0 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,0 100%)}html[data-dsh-prts] [data-prts-nav-rail] > button::after{content: \"\"; position: absolute; inset: 8px auto 8px 0; width: 2px; background: transparent}html[data-dsh-prts] [data-prts-nav-rail] > button:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-nav-rail] > button[aria-expanded=\"true\"]{background: #151a1d; color: #f0f3f4}html[data-dsh-prts] [data-prts-nav-rail] > button[aria-expanded=\"true\"]::after{background: var(--prts-yellow)}html[data-dsh-prts] [data-prts-nav-rail] > button:active{transform: translateY(1px) scale(.98)}html[data-dsh-prts] [data-prts-nav-rail] b{font-size: 15px; line-height: 1}html[data-dsh-prts] [data-prts-nav-rail] small{font-size: 8px; letter-spacing: .04em}html[data-dsh-prts] [data-prts-nav-bottom]{display: grid; margin-top: auto; border-top: 1px solid #30383d}html[data-dsh-prts] [data-prts-connection-indicator]{min-height: 40px; display: grid; place-items: center; gap: 3px; padding: 6px 2px; color: #8c969b; font-size: 7px; text-align: center}html[data-dsh-prts] [data-prts-connection-indicator] i{width: 6px; height: 6px; border: 1px solid currentColor; background: currentColor; transform: rotate(45deg)}html[data-dsh-prts] [data-prts-connection-indicator][data-state=\"connected\"]{color: var(--prts-cyan)}html[data-dsh-prts] [data-prts-connection-indicator][data-state=\"disconnected\"]{color: var(--prts-red)}html[data-dsh-prts] [data-prts-scheme-toggle] svg{width: 17px; height: 17px; fill: none; stroke: currentColor; stroke-width: 1.7}html[data-dsh-prts] [data-prts-scheme-toggle]{touch-action: none; user-select: none}html[data-dsh-prts][data-prts-scheme-transition-interactive] [data-prts-scheme-toggle]{cursor: ew-resize}html[data-dsh-prts] [data-prts-scheme-toggle][data-prts-scheme-press]{animation: prts-scheme-toggle-press 100ms var(--prts-ease-snap) both}@keyframes prts-scheme-toggle-press{0%,100%{transform: translateY(0) scale(1)}50%{transform: translateY(0) scale(.96)}}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(root){animation: prts-scheme-view-hold var(--prts-scheme-duration,520ms) linear both}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(root),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(root){animation: none; mix-blend-mode: normal}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(root){z-index: 1}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(root){z-index: 2; clip-path: inset(0 max(0px,calc(100vw - var(--prts-scheme-reveal-x))) 0 0)}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-grid),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-edge),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-node),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-mark){animation: none}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-grid){z-index: 3}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-edge){z-index: 4}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-node),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-mark){z-index: 5}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(prts-scheme-grid),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(prts-scheme-edge),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(prts-scheme-node),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(prts-scheme-mark){opacity: 0; animation: none}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-grid),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-edge),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-node),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-mark){opacity: 1; animation: none; mix-blend-mode: normal}@keyframes prts-scheme-view-hold{from,to{opacity: 1}}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]{--prts-scheme-grid-cell: 20px; --prts-scheme-grid-diagonal-cell: 40px; --prts-scheme-grid-axis: rgba(132,158,166,.14); --prts-scheme-grid-node: rgba(150,180,188,.22); --prts-scheme-grid-diagonal-opacity: .16}html[data-dsh-prts][data-prts-scheme-transition=\"light\"]{--prts-scheme-grid-axis: rgba(28,36,41,.12); --prts-scheme-grid-node: rgba(24,31,35,.2); --prts-scheme-grid-diagonal-opacity: .14}html[data-dsh-prts] [data-prts-scheme-reveal]{box-sizing: border-box; position: fixed; z-index: 2147483647; inset: 0; width: 100vw; max-width: none; height: 100dvh; max-height: none; margin: 0; padding: 0; overflow: hidden; border: 0; background: transparent; color: #ffd400; --prts-scheme-grid-cell: 20px; --prts-scheme-grid-diagonal-cell: 40px; --prts-scheme-grid-axis: rgba(132,158,166,.08); --prts-scheme-grid-node: rgba(150,180,188,.13); --prts-scheme-grid-diagonal-opacity: .075; pointer-events: none}html[data-dsh-prts] [data-prts-scheme-reveal=\"light\"]{--prts-scheme-grid-axis: rgba(28,36,41,.065); --prts-scheme-grid-node: rgba(24,31,35,.105); --prts-scheme-grid-diagonal-opacity: .06}html[data-dsh-prts] [data-prts-scheme-reveal-edge]{isolation: isolate; position: absolute; top: 0; left: 0; width: 29px; height: 100vh; background: linear-gradient(90deg,transparent 13px,rgba(244,247,247,.96) 13px 14px,rgba(255,212,0,.22) 14px 15px,transparent 15px); transform: translate3d(-14px,0,0); transform-origin: 50% 50%; view-transition-name: prts-scheme-edge; will-change: transform}html[data-dsh-prts] [data-prts-scheme-reveal-grid]{position: absolute; z-index: -2; inset: 0 auto 0 -206px; display: block; width: 220px; height: 100vh; view-transition-name: prts-scheme-grid; pointer-events: none}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-grid){background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Cg fill='none' stroke='%2396b4bc' stroke-width='.55'%3E%3Cpath d='M0 0H40M0 20H40M0 40H40M0 0V40M20 0V40M40 0V40' stroke-opacity='.22'/%3E%3Cpath d='M0 0L20 20L0 40M20 0L40 20L20 40' stroke-opacity='.46'/%3E%3Cpath d='M20 0L0 20L20 40M40 0L20 20L40 40' stroke-opacity='.22'/%3E%3C/g%3E%3Cg fill='%2396b4bc' fill-opacity='.36'%3E%3Ccircle cx='0' cy='0' r='1'/%3E%3Ccircle cx='20' cy='0' r='1'/%3E%3Ccircle cx='40' cy='0' r='1'/%3E%3Ccircle cx='0' cy='20' r='1'/%3E%3Ccircle cx='20' cy='20' r='1'/%3E%3Ccircle cx='40' cy='20' r='1'/%3E%3Ccircle cx='0' cy='40' r='1'/%3E%3Ccircle cx='20' cy='40' r='1'/%3E%3Ccircle cx='40' cy='40' r='1'/%3E%3C/g%3E%3C/svg%3E\"); background-repeat: repeat; background-position: calc(220px - var(--prts-scheme-reveal-x)) 0; background-size: var(--prts-scheme-grid-diagonal-cell) var(--prts-scheme-grid-diagonal-cell); -webkit-mask-image: linear-gradient(90deg,transparent 0,rgba(0,0,0,.12) 16%,rgba(0,0,0,.48) 56%,#000 100%); mask-image: linear-gradient(90deg,transparent 0,rgba(0,0,0,.12) 16%,rgba(0,0,0,.48) 56%,#000 100%)}html[data-dsh-prts][data-prts-scheme-transition=\"light\"]::view-transition-new(prts-scheme-grid){background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Cg fill='none' stroke='%231c2429' stroke-width='.55'%3E%3Cpath d='M0 0H40M0 20H40M0 40H40M0 0V40M20 0V40M40 0V40' stroke-opacity='.2'/%3E%3Cpath d='M0 0L20 20L0 40M20 0L40 20L20 40' stroke-opacity='.42'/%3E%3Cpath d='M20 0L0 20L20 40M40 0L20 20L40 40' stroke-opacity='.2'/%3E%3C/g%3E%3Cg fill='%231c2429' fill-opacity='.32'%3E%3Ccircle cx='0' cy='0' r='1'/%3E%3Ccircle cx='20' cy='0' r='1'/%3E%3Ccircle cx='40' cy='0' r='1'/%3E%3Ccircle cx='0' cy='20' r='1'/%3E%3Ccircle cx='20' cy='20' r='1'/%3E%3Ccircle cx='40' cy='20' r='1'/%3E%3Ccircle cx='0' cy='40' r='1'/%3E%3Ccircle cx='20' cy='40' r='1'/%3E%3Ccircle cx='40' cy='40' r='1'/%3E%3C/g%3E%3C/svg%3E\")}html[data-dsh-prts] [data-prts-scheme-reveal-blend]{position: absolute; z-index: -1; inset: 0; width: 29px; background: linear-gradient(90deg,transparent,rgba(255,212,0,.025) 43%,rgba(235,244,245,.11) 50%,rgba(255,212,0,.018) 58%,transparent); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); opacity: .54}html[data-dsh-prts] [data-prts-scheme-reveal=\"light\"] [data-prts-scheme-reveal-blend]{background: linear-gradient(90deg,transparent,rgba(28,36,41,.04) 42%,rgba(255,255,255,.2) 50%,rgba(255,212,0,.018) 58%,transparent)}html[data-dsh-prts] [data-prts-scheme-reveal=\"dark\"] [data-prts-scheme-reveal-blend]{background: linear-gradient(90deg,transparent,rgba(132,158,166,.035) 42%,rgba(235,244,245,.12) 50%,rgba(255,212,0,.018) 58%,transparent)}html[data-dsh-prts] [data-prts-scheme-reveal-edge]::before{content: \"\"; position: absolute; top: 18%; left: 7px; width: 15px; height: 28px; border-top: 1px solid rgba(235,244,245,.58); border-bottom: 1px solid rgba(235,244,245,.58); background: linear-gradient(rgba(255,212,0,.72),rgba(255,212,0,.72)) 50% 50% / 100% 1px no-repeat}html[data-dsh-prts] [data-prts-scheme-reveal-edge]::after{content: \"\"; position: absolute; top: calc(18% + 12px); left: 12px; width: 5px; height: 5px; border: 1px solid rgba(255,212,0,.78); background: rgba(8,12,14,.68); transform: rotate(45deg)}html[data-dsh-prts] [data-prts-scheme-reveal-node]{position: absolute; z-index: 2; bottom: clamp(88px,18vh,176px); left: 14px; display: block; box-sizing: border-box; width: 46px; height: 62px; color: #ffd400; font-style: normal; transform: translateX(10px); view-transition-name: prts-scheme-node; transition: transform 120ms var(--prts-ease-snap)}html[data-dsh-prts] [data-prts-scheme-reveal-edge][data-prts-scheme-reveal-side=\"left\"] [data-prts-scheme-reveal-node]{transform: translateX(calc(-100% - 10px))}html[data-dsh-prts] [data-prts-scheme-reveal-node]::before{content: \"\"; position: absolute; top: 30px; left: -10px; width: 10px; border-top: 1px solid rgba(255,212,0,.76)}html[data-dsh-prts] [data-prts-scheme-reveal-edge][data-prts-scheme-reveal-side=\"left\"] [data-prts-scheme-reveal-node]::before{right: -10px; left: auto}html[data-dsh-prts] [data-prts-scheme-reveal-mark]{position: absolute; top: 20px; left: 20px; display: block; width: 6px; height: 6px; border-top: 1px solid currentColor; border-right: 1px solid currentColor; view-transition-name: prts-scheme-mark}html[data-dsh-prts] [data-prts-scheme-reveal-meter]{position: absolute; top: 6px; left: 0; display: block; box-sizing: border-box; width: 6px; height: 50px; border: 1px solid rgba(255,212,0,.34); background: rgba(8,12,14,.32)}html[data-dsh-prts] [data-prts-scheme-reveal-meter]::after{content: \"\"; position: absolute; top: -1px; left: 6px; width: 3px; border-top: 1px solid rgba(255,212,0,.64); box-shadow: 0 24px rgba(255,212,0,.42),0 49px rgba(255,212,0,.64)}html[data-dsh-prts] [data-prts-scheme-reveal-meter-fill]{position: absolute; inset: 1px; display: block; background: currentColor; box-shadow: 0 0 5px rgba(255,212,0,.28); opacity: 0; transform-origin: 50% 100%}html[data-dsh-prts] [data-prts-scheme-reveal-label],html[data-dsh-prts] [data-prts-scheme-reveal-value]{position: absolute; left: 12px; display: block; color: currentColor; font-family: var(--prts-mono); font-style: normal; line-height: 1; white-space: nowrap}html[data-dsh-prts] [data-prts-scheme-reveal-label]{top: 7px; font-size: 7px; font-weight: 600; letter-spacing: .16em; opacity: .72}html[data-dsh-prts] [data-prts-scheme-reveal-value]{bottom: 7px; width: 24px; height: 11px; font-size: 11px; font-weight: 700; letter-spacing: .08em}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-node){background-image: linear-gradient(#ffd400,#ffd400); background-position: left 1px bottom 7px; background-repeat: no-repeat; background-size: 2px var(--prts-scheme-control-meter-height,0); object-fit: none}html[data-dsh-prts][data-prts-scheme-transition-interactive]::view-transition-new(prts-scheme-node){background-image: var(--prts-scheme-control-value-image),linear-gradient(#ffd400,#ffd400); background-position: left 12px bottom 7px,left 1px bottom 7px; background-size: 24px 11px,2px var(--prts-scheme-control-meter-height,0)}html[data-dsh-prts][data-prts-scheme-transition-complete]::view-transition-group(prts-scheme-grid),html[data-dsh-prts][data-prts-scheme-transition-complete]::view-transition-group(prts-scheme-edge),html[data-dsh-prts][data-prts-scheme-transition-complete]::view-transition-group(prts-scheme-node),html[data-dsh-prts][data-prts-scheme-transition-complete]::view-transition-group(prts-scheme-mark){animation: prts-scheme-hud-release 100ms ease-out both}@keyframes prts-scheme-hud-release{0%,35%{opacity: 1}100%{opacity: 0}}@media (max-width: 640px){html[data-dsh-prts] [data-prts-scheme-reveal]{--prts-scheme-grid-cell: 16px; --prts-scheme-grid-diagonal-cell: 32px}}html[data-dsh-prts] [data-prts-scheme-current=\"dark\"] [data-prts-scheme-icon=\"light\"],html[data-dsh-prts] [data-prts-scheme-current=\"light\"] [data-prts-scheme-icon=\"dark\"]{display: none}html[data-dsh-prts] [data-prts-region=\"frame\"]{width: calc(100vw - var(--prts-nav-width)); height: calc(100dvh - var(--prts-host-top-inset)); min-height: 0; margin-left: var(--prts-nav-width); display: grid !important; background: var(--prts-canvas)}html[data-dsh-prts] [data-prts-region=\"sessions\"],html[data-dsh-prts] [data-prts-region=\"operation\"]{min-width: 0; min-height: 0}html[data-dsh-prts] [data-prts-region=\"sessions\"]{box-sizing: border-box; position: relative; z-index: 4; overflow: hidden; border-right: 1px solid var(--prts-line); background: var(--prts-panel); transition: opacity 180ms ease}html[data-dsh-prts] [data-prts-region=\"operation\"]{position: relative; z-index: 1; overflow: hidden; background: var(--prts-canvas); color: var(--prts-ink)}html[data-dsh-prts][data-prts-sessions-collapsed] [data-prts-region=\"sessions\"] [data-slot=\"sidebar.workspaces\"],html[data-dsh-prts][data-prts-sessions-collapsed] [data-prts-region=\"sessions\"] [data-slot=\"sidebar.settings\"]{opacity: 0; pointer-events: none}html[data-dsh-prts] [data-prts-region=\"sessions\"] > *,html[data-dsh-prts] [data-prts-region=\"sessions\"] [data-slot=\"sidebar\"]{height: 100%}html[data-dsh-prts] [data-prts-region=\"sessions\"] [data-rc7-sidebar-root]{box-sizing: border-box; width: 100% !important; min-width: var(--prts-sessions-width); padding: 14px 10px; overflow-y: auto; background: transparent !important; color: var(--prts-ink)}html[data-dsh-prts] [data-prts-region=\"sessions\"] > * > [data-slot=\"sidebar\"] > :first-child > button[aria-label*=\"new session\" i]{display: none !important}html[data-dsh-prts] [data-prts-workspace-row],html[data-dsh-prts] [data-prts-session-row]{--prts-row-shift: 0px; --prts-row-end-reserve: 29px; --prts-facility-height: var(--prts-workspace-height); position: relative; width: calc(100% - 20px); height: var(--prts-facility-height) !important; min-height: var(--prts-facility-height); display: flex; align-items: center; gap: 0 !important; margin: 0 0 var(--prts-facility-gap) 0; padding: 0 !important; overflow: visible; border: 0 !important; background: transparent !important; color: var(--prts-ink); isolation: isolate}html[data-dsh-prts] [data-prts-session-row]{--prts-facility-height: var(--prts-session-height); margin-left: 8px}@media (max-height: 820px) and (hover: hover) and (pointer: fine){html[data-dsh-prts]{--prts-workspace-height: 34px; --prts-session-height: 32px; --prts-facility-gap: 5px}}html[data-dsh-prts] [data-prts-workspace-row]::before{background: var(--prts-cyan) !important}html[data-dsh-prts] [data-prts-workspace-row][aria-expanded=\"true\"],html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]),html[data-dsh-prts] [data-prts-session-row]:is(:hover,:focus-within,[data-prts-row-menu-open]){--prts-row-shift: var(--prts-spine-travel)}html[data-dsh-prts] [data-prts-workspace-row]::before,html[data-dsh-prts] [data-prts-session-row]::before{content: \"\"; position: absolute; z-index: 2; inset: 0 auto 0 0; width: var(--prts-spine-width); background: var(--prts-line-strong); clip-path: polygon( 3px 0,calc(100% - 3px) 0,100% 3px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 3px ); transform: scaleX(var(--prts-spine-rest)); transform-origin: left center; transition: transform 220ms var(--prts-ease-spring),background-color 160ms ease}html[data-dsh-prts] [data-prts-workspace-row][aria-expanded=\"true\"]::before,html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open])::before,html[data-dsh-prts] [data-prts-session-row]:is(:hover,:focus-within,[data-prts-row-menu-open])::before{transform: scaleX(1)}html[data-dsh-prts] [data-prts-session-row][aria-selected=\"true\"]::before{background: var(--prts-yellow)}html[data-dsh-prts] [data-prts-facility-face]{position: absolute; z-index: -1; inset: 0 0 0 5px; border: 1px solid var(--prts-line); background: var(--prts-panel-raised); clip-path: polygon( 3px 0,calc(50% - 25px) 0,calc(50% - 20px) 3.333px,calc(50% + 20px) 3.333px,calc(50% + 25px) 0,calc(100% - 3px) 0,100% 3px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 3px ); transform: translate3d(var(--prts-row-shift),0,0); transition: transform 220ms var(--prts-ease-spring),border-color 160ms ease,background-color 160ms ease; pointer-events: none}html[data-dsh-prts] :is([data-prts-workspace-row],[data-prts-session-row]) [data-prts-facility-face]{right: var(--prts-row-end-reserve)}html[data-dsh-prts] [data-prts-row-title],html[data-dsh-prts] [data-prts-session-row] > span:not([data-prts-facility-face]):not([data-prts-row-projection]):not([data-prts-session-actions]),html[data-dsh-prts] [data-prts-workspace-row] > span:not([data-prts-facility-face]):not([data-prts-row-projection]):not([data-prts-workspace-actions]){position: relative; z-index: 3; min-width: 0; transform: translate3d(var(--prts-row-shift),0,0); transition: transform 220ms var(--prts-ease-spring),color 160ms ease}html[data-dsh-prts] [data-prts-row-title]{flex: 1; overflow: hidden; padding: 0 10px 0 13px; font-size: 12px; font-weight: 650; line-height: var(--prts-facility-height); text-overflow: ellipsis; white-space: nowrap}html[data-dsh-prts] [data-prts-session-row] [data-prts-row-title]::before{content: attr(data-prts-session-index); margin-right: 8px; color: var(--prts-dim); font-family: var(--prts-mono); font-size: 9px; letter-spacing: .08em}html[data-dsh-prts] [data-prts-workspace-actions],html[data-dsh-prts] [data-prts-session-actions]{position: absolute; z-index: 5; inset: 0 0 auto auto; height: var(--prts-facility-height) !important; align-items: stretch !important; gap: 1px !important; margin: 0 !important; transform: translate3d(var(--prts-row-shift),0,0)}html[data-dsh-prts] [data-prts-workspace-actions]{width: 57px}html[data-dsh-prts] [data-prts-session-actions]{width: 28px}html[data-dsh-prts] [data-prts-workspace-actions] > *,html[data-dsh-prts] [data-prts-session-actions] > *{height: 100% !important}html[data-dsh-prts] [data-prts-workspace-actions] button,html[data-dsh-prts] [data-prts-session-actions] button{width: 28px !important; min-width: 28px !important; height: var(--prts-facility-height) !important; min-height: var(--prts-facility-height) !important; display: grid !important; place-items: center; padding: 0 !important; border: 1px solid var(--prts-line) !important; border-radius: 0 !important; background: var(--prts-panel-raised) !important; color: var(--prts-muted) !important; clip-path: polygon(3px 0,calc(100% - 3px) 0,100% 3px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 3px); cursor: pointer}html[data-dsh-prts] [data-prts-workspace-actions] button:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-session-actions] button:is(:hover,:focus-visible){border-color: var(--prts-yellow) !important; color: var(--prts-yellow) !important}@media (prefers-reduced-motion: no-preference){html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) [data-prts-workspace-actions] button,html[data-dsh-prts] [data-prts-session-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) [data-prts-session-actions] button{animation: prts-facility-button-dock 520ms both}html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) [data-prts-workspace-actions] > :nth-child(1) button{animation-delay: 55ms}html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) [data-prts-workspace-actions] > :nth-child(2){animation-delay: 125ms}}@keyframes prts-facility-button-dock{0%{opacity: 0; transform: translate3d(34px,0,0) scaleX(.94)}52%{opacity: 1; transform: translate3d(-4px,0,0) scaleX(.96)}72%{transform: translate3d(3px,0,0) scaleX(1.035)}88%{transform: translate3d(-1px,0,0) scaleX(.99)}100%{opacity: 1; transform: translate3d(0,0,0) scaleX(1)}}html[data-dsh-prts] [data-slot=\"conversation\"]{min-width: 0; height: 100%; background: transparent}html[data-dsh-prts] [data-slot=\"conversation.session.header\"]{border-bottom: 1px solid var(--prts-line); background: color-mix(in srgb,var(--prts-canvas-elevated) 92%,transparent); font-family: var(--prts-mono)}html[data-dsh-prts] [data-session-code]{color: var(--prts-yellow); font-size: 11px; letter-spacing: .12em}html[data-dsh-prts] [data-prts-conversation-control=\"header\"]{margin-left: auto}html[data-dsh-prts] [data-conversation-scroll]{position: relative; z-index: 2}html[data-dsh-prts] [data-conversation-scroll]::before{content: \"\"; position: absolute; z-index: -1; top: 28px; bottom: 140px; left: clamp(30px,3.6vw,52px); width: 1px; background: linear-gradient(var(--prts-line-strong),var(--prts-line),transparent)}html[data-dsh-prts] [data-message-role=\"user\"],html[data-dsh-prts] [data-chat-flow-kind=\"user\"]{position: relative; color: var(--prts-ink)}html[data-dsh-prts] [data-message-role=\"user\"]::before,html[data-dsh-prts] [data-chat-flow-kind=\"user\"]::before{content: \"\"; position: absolute; top: 8px; left: calc(clamp(-66px,-4vw,-42px)); width: 11px; height: 11px; border: 2px solid var(--prts-canvas); background: var(--prts-yellow); box-shadow: 0 0 0 1px var(--prts-yellow); transform: rotate(45deg)}html[data-dsh-prts] [data-message-role=\"user\"],html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"]{border: 1px solid var(--prts-line-strong) !important; border-left: 4px solid var(--prts-yellow) !important; border-radius: var(--prts-radius-card) !important; background: var(--prts-panel-raised) !important; color: var(--prts-ink) !important; clip-path: polygon(3px 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,0 100%,0 3px); box-shadow: none !important}html[data-dsh-prts] [data-message-role=\"user\"] :is([data-markdown],[class*=\"markdown\" i]),html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"] :is([data-markdown],[class*=\"markdown\" i]){background: transparent !important}html[data-dsh-prts] [data-message-role=\"user\"] :is(pre,table,blockquote),html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"] :is(pre,table,blockquote){border: 1px solid var(--prts-line); background: var(--prts-glass-dense)}html[data-dsh-prts] [data-message-role=\"user\"] :is(pre,code),html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"] :is(pre,code){font-family: var(--prts-mono) !important}html[data-dsh-prts] [data-message-role=\"user\"] pre,html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"] pre{max-width: 100%; overflow: auto; padding: 14px; border-left: 3px solid var(--prts-cyan) !important; color: var(--prts-ink) !important}html[data-dsh-prts] [aria-invalid=\"true\"],html[data-dsh-prts] [data-status=\"error\"],html[data-dsh-prts] [data-status=\"denied\"]{border-color: var(--prts-red) !important; color: var(--prts-red) !important}html[data-dsh-prts] [data-prts-ambient-layer]{position: absolute; z-index: 0; inset: 0; overflow: hidden; opacity: .86; background: radial-gradient(circle at 48% 35%,color-mix(in srgb,var(--prts-cyan) 7%,transparent),transparent 32%),linear-gradient(115deg,transparent 0 42%,color-mix(in srgb,var(--prts-line) 18%,transparent) 42.2% 42.5%,transparent 42.7%),repeating-linear-gradient(0deg,transparent 0 27px,color-mix(in srgb,var(--prts-line) 12%,transparent) 27px 28px); pointer-events: none}html[data-dsh-prts][data-prts-texture=\"restrained\"] [data-prts-ambient-layer]{opacity: .56}html[data-dsh-prts][data-prts-texture=\"off\"] [data-prts-ambient-layer]{display: none}html[data-dsh-prts] [data-prts-particle-layer]{position: absolute; z-index: 1; inset: 0; width: 100%; height: 100%; pointer-events: none}html[data-dsh-prts] [data-prts-particle-layer]{opacity: 1; transition: opacity 120ms ease-out}html[data-dsh-prts] [data-prts-resize-shield]{content-visibility: hidden !important; contain-intrinsic-size: auto 800px}html[data-dsh-prts] [data-prts-particle-layer][data-prts-resizing]{opacity: .78; transition: none}html[data-dsh-prts] [data-prts-particle-layer][data-prts-resize-restoring]{opacity: 1; transition: opacity 120ms ease-out}html[data-dsh-prts] [data-prts-ambient-layer][data-prts-resizing]{opacity: .42; background: color-mix(in srgb,var(--prts-panel) 92%,var(--prts-canvas)); transition: none}html[data-dsh-prts] [data-prts-ambient-layer][data-prts-resizing] :is( [data-prts-ambient-glow],[data-prts-session-pickup] ){animation-play-state: paused !important}html[data-dsh-prts] :is( [data-prts-conversation-preview][data-prts-resizing],[data-prts-conversation-history-hint][data-prts-resizing],[data-prts-conversation-history-status][data-prts-resizing],[data-prts-theme-settings][data-prts-resizing],[data-prts-settings-backdrop][data-prts-resizing] ),html[data-dsh-prts] [data-prts-resizing] > [data-composer-card]{backdrop-filter: none !important; -webkit-backdrop-filter: none !important; transition: none !important}html[data-dsh-prts] [data-prts-hero-active]::before{content: \"\"; position: absolute; inset: 0; pointer-events: none}html[data-dsh-prts]{--prts-hero-mark-base: clamp(380px,46%,720px); --prts-hero-mark-size: min(var(--prts-hero-mark-base),42dvh)}html[data-dsh-prts] [data-prts-hero-active] [data-composer-seat],html[data-dsh-prts] [data-prts-hero-active] [data-slot=\"conversation.composer\"]{position: relative; z-index: 5}html[data-dsh-prts] [data-composer-card],html[data-dsh-prts] [data-prts-composer-fallback]{position: relative; border: 1px solid var(--prts-line-strong) !important; border-bottom: 3px solid var(--prts-yellow) !important; border-radius: var(--prts-radius-card) !important; background: var(--prts-active-glass) !important; clip-path: polygon(3px 0,calc(50% - 42px) 0,calc(50% - 37px) 5px,calc(50% + 37px) 5px,calc(50% + 42px) 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px); box-shadow: 0 14px 34px rgba(0,0,0,.18); backdrop-filter: var(--prts-active-glass-filter); -webkit-backdrop-filter: var(--prts-active-glass-filter)}html[data-dsh-prts] [data-composer-card] textarea,html[data-dsh-prts] [data-prts-composer-fallback] textarea{border: 0 !important; background: transparent !important; color: var(--prts-ink) !important; caret-color: var(--prts-yellow)}html[data-dsh-prts] [data-composer-card] button,html[data-dsh-prts] [data-prts-conversation-control]{border: 1px solid var(--prts-line) !important; border-radius: var(--prts-radius-control) !important; background: var(--prts-panel-raised) !important; color: var(--prts-ink) !important; clip-path: polygon(3px 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px)}html[data-dsh-prts] [data-composer-card] button:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-conversation-control]:is(:hover,:focus-visible){border-color: var(--prts-yellow) !important}html[data-dsh-prts] [data-composer-card] button[aria-label*=\"send\" i],html[data-dsh-prts] [data-composer-card] button[type=\"submit\"]{background: var(--prts-yellow) !important; color: var(--prts-yellow-ink) !important}html[data-dsh-prts] [data-composer-card] button:active,html[data-dsh-prts] [data-prts-conversation-control]:active{transform: translateY(1px) scale(.98)}html[data-dsh-prts] [data-produced-files-row] > button[type=\"button\"],html[data-dsh-prts] [data-prts-to-bottom]{min-height: 36px; border: 1px solid var(--prts-line) !important; background: var(--prts-active-glass) !important; color: var(--prts-ink) !important; clip-path: polygon(3px 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px)}html[data-dsh-prts] [data-prts-glass-control=\"model\"],html[data-dsh-prts] [data-prts-glass-control=\"permission\"],html[data-dsh-prts] [data-prts-glass-control=\"preset\"]{border: 1px solid var(--prts-line) !important; border-radius: var(--prts-radius-control) !important; background: var(--prts-active-glass) !important; color: var(--prts-ink) !important}html[data-dsh-prts] [data-prts-glass-menu],html[data-dsh-prts] [data-prts-floating-glass=\"menu\"],html[data-dsh-prts] [data-prts-floating-glass=\"listbox\"],html[data-dsh-prts] [data-prts-floating-glass=\"popover\"]{border: 1px solid var(--prts-glass-border) !important; border-radius: var(--prts-radius-overlay) !important; background: var(--prts-active-glass) !important; color: var(--prts-ink) !important; box-shadow: var(--prts-shadow-glass-overlay) !important; backdrop-filter: var(--prts-active-glass-filter); -webkit-backdrop-filter: var(--prts-active-glass-filter)}html[data-dsh-prts] [data-prts-floating-glass=\"dialog\"]{border: 1px solid var(--prts-glass-border) !important; border-radius: var(--prts-radius-overlay) !important; background: var(--prts-panel) !important; color: var(--prts-ink) !important; box-shadow: var(--prts-shadow-glass-overlay) !important; backdrop-filter: none; -webkit-backdrop-filter: none}html[data-dsh-prts] [data-prts-floating-item]{min-height: 38px; border-radius: var(--prts-radius-control) !important; color: var(--prts-ink) !important}html[data-dsh-prts] [data-prts-floating-item]:is(:hover,[data-highlighted]){background: var(--prts-panel-muted) !important}html[data-dsh-prts] [data-prts-floating-input]{min-height: 44px; border: 1px solid var(--prts-line) !important; background: var(--prts-panel) !important; color: var(--prts-ink) !important}html[data-dsh-prts] :is( [data-prts-floating-glass=\"menu\"],[data-prts-floating-glass=\"listbox\"],[data-prts-floating-glass=\"popover\"] ) [data-prts-floating-danger]{color: var(--prts-red) !important}html[data-dsh-prts] [data-prts-floating-scrim]{background: rgba(3,5,6,.62) !important}html[data-dsh-prts-settings] .prts-plugin-settings{width: 100%; display: grid; gap: 16px; color: inherit; font: inherit}html[data-dsh-prts-settings] .prts-plugin-settings__header{display: grid; gap: 5px; padding-bottom: 14px; border-bottom: 1px solid color-mix(in srgb,currentColor 18%,transparent)}html[data-dsh-prts-settings] .prts-plugin-settings__header h3,html[data-dsh-prts-settings] .prts-plugin-settings__header p{margin: 0}html[data-dsh-prts-settings] .prts-plugin-settings__header h3{font-size: 18px; font-weight: 650}html[data-dsh-prts-settings] .prts-plugin-settings__header p,html[data-dsh-prts-settings] .prts-plugin-settings__copy small{color: color-mix(in srgb,currentColor 62%,transparent); font-size: 12px; line-height: 1.5}html[data-dsh-prts-settings] .prts-plugin-settings__safe{margin: 0; padding: 10px 12px; border: 1px solid color-mix(in srgb,#df5750 42%,transparent); border-radius: 8px; background: color-mix(in srgb,#df5750 8%,transparent); color: inherit; font-size: 12px}html[data-dsh-prts-settings] .prts-plugin-settings__list{overflow: hidden; border: 1px solid color-mix(in srgb,currentColor 16%,transparent); border-radius: 10px}html[data-dsh-prts-settings] .prts-plugin-settings__row{min-height: 64px; display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 12px 14px}html[data-dsh-prts-settings] .prts-plugin-settings__row + .prts-plugin-settings__row{border-top: 1px solid color-mix(in srgb,currentColor 12%,transparent)}html[data-dsh-prts-settings] .prts-plugin-settings__copy{min-width: 0; display: grid; gap: 3px}html[data-dsh-prts-settings] .prts-plugin-settings__copy strong{font-size: 13px; font-weight: 600}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch']{position: relative; width: 42px; height: 24px; flex: 0 0 auto; padding: 0; border: 0; border-radius: 999px; background: color-mix(in srgb,currentColor 18%,transparent); color: inherit; cursor: pointer}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch'] > span{position: absolute; top: 3px; left: 3px; width: 18px; height: 18px; border-radius: 50%; background: currentColor; transition: transform 120ms ease}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch'].is-active{background: var(--color-primary,#d9b800); color: #111}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch'].is-active > span{transform: translateX(18px)}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch']:disabled{cursor: not-allowed; opacity: .45}@media (prefers-reduced-motion: reduce){html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch'] > span{transition: none}}@media (max-width: 640px){html[data-dsh-prts]{--prts-nav-width: 52px}html[data-dsh-prts] [data-conversation-scroll]::before{left: 18px}html[data-dsh-prts] [data-message-role]::before,html[data-dsh-prts] [data-chat-flow-kind]::before{left: -25px}html[data-dsh-prts] [data-slot=\"conversation.session.header\"]{padding-inline: 12px}html[data-dsh-prts-settings] .prts-settings{padding: 12px}}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){html[data-dsh-prts] [data-prts-floating-glass],html[data-dsh-prts] [data-composer-card],html[data-dsh-prts] [data-prts-glass-menu]{background: var(--prts-panel) !important}}@media (hover: hover) and (pointer: fine){html[data-dsh-prts] [data-prts-nav-rail] > button:hover b{transform: translateY(-1px)}}@media (prefers-reduced-transparency: reduce){html[data-dsh-prts]{--prts-active-glass: var(--prts-panel); --prts-active-glass-filter: none}}@media (prefers-contrast: more){html[data-dsh-prts]{--prts-line: currentColor; --prts-line-strong: currentColor}}@media (prefers-reduced-motion: reduce){html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-conversation-scale],[data-prts-conversation-scale] *,[data-prts-conversation-preview],[data-prts-conversation-preview] *,[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] ),html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-conversation-scale],[data-prts-conversation-scale] *,[data-prts-conversation-preview],[data-prts-conversation-preview] *,[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] )::before,html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-conversation-scale],[data-prts-conversation-scale] *,[data-prts-conversation-preview],[data-prts-conversation-preview] *,[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] )::after{scroll-behavior: auto !important; animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important}}html[data-dsh-prts]{--prts-hero-mark-base: clamp(300px,38%,520px); --prts-hero-mark-size: min(var(--prts-hero-mark-base),32dvh)}html[data-dsh-prts] [data-prts-region=\"sessions\"] > * > [data-slot=\"sidebar\"] > :first-child > button[aria-label*=\"new session\" i]{min-height: 40px; display: grid !important; place-items: center; margin: 0 0 14px; border: 1px solid var(--prts-line) !important; border-radius: var(--prts-radius-card) !important; background: var(--prts-panel-raised) !important; color: var(--prts-ink) !important}html[data-dsh-prts] [data-prts-rail-brand],html[data-dsh-prts] [data-prts-nav-rail] > button,html[data-dsh-prts] [data-prts-nav-bottom] > button{position: relative; width: 100%; min-width: 0; min-height: 48px; display: grid; place-items: center; padding: 0; border: 0; border-bottom: 1px solid #242b2f; border-radius: 0; background: transparent; color: #aeb8bd !important; cursor: pointer; clip-path: none}html[data-dsh-prts] [data-prts-rail-brand]{height: 64px; border-bottom-color: #30383d}html[data-dsh-prts] [data-prts-rail-brand]:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-rail-brand][aria-expanded=\"true\"],html[data-dsh-prts] [data-prts-nav-rail] > button:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-nav-bottom] > button:is(:hover,:focus-visible){background: #151a1d; color: #f3f6f7 !important}html[data-dsh-prts] [data-prts-rail-brand][aria-expanded=\"true\"]::after{content: \"\"; position: absolute; inset: 7px auto 7px 0; width: 2px; background: var(--prts-yellow)}html[data-dsh-prts] [data-prts-nav-rail] small,html[data-dsh-prts] [data-prts-connection-label]{position: absolute; z-index: 180; top: 50%; left: calc(100% + 9px); width: max-content; max-width: 180px; padding: 6px 8px; border: 1px solid #3d474d; border-radius: 3px; opacity: 0; background: #0e1215; color: #eef2f3; font: 700 9px/1.2 var(--prts-mono); letter-spacing: .04em; text-align: left; transform: translate3d(-5px,-50%,0); transition: opacity 130ms ease,transform 160ms var(--prts-ease-snap); pointer-events: none; white-space: nowrap}html[data-dsh-prts] [data-prts-nav-rail] button:is(:hover,:focus-visible) small,html[data-dsh-prts] [data-prts-connection-indicator]:is(:hover,:focus-visible) [data-prts-connection-label]{opacity: 1; transform: translate3d(0,-50%,0)}html[data-dsh-prts] [data-prts-connection-indicator]{position: relative; min-height: 38px; padding: 0; color: #9da8ad}html[data-dsh-prts] [data-prts-nav-bottom] svg,html[data-dsh-prts] [data-prts-nav-bottom] b{display: block; color: currentColor}html[data-dsh-prts] [data-message-role=\"user\"],html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"],html[data-dsh-prts] [data-composer-card],html[data-dsh-prts] [data-prts-composer-fallback],html[data-dsh-prts] [data-composer-card] button,html[data-dsh-prts] [data-prts-conversation-control],html[data-dsh-prts] [data-produced-files-row] > button[type=\"button\"],html[data-dsh-prts] [data-prts-to-bottom]{border-radius: 3px !important; clip-path: none !important}html[data-dsh-prts] [data-prts-facility-face]{right: 0 !important; border: 0 !important; background: var(--prts-line-strong)}html[data-dsh-prts] [data-prts-facility-face]::after{content: \"\"; position: absolute; inset: 1px; background: var(--prts-panel-raised); clip-path: polygon( 3px 0,calc(50% - 25px) 0,calc(50% - 20px) 3.333px,calc(50% + 20px) 3.333px,calc(50% + 25px) 0,calc(100% - 3px) 0,100% 3px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 3px )}html[data-dsh-prts] [data-prts-workspace-actions] button,html[data-dsh-prts] [data-prts-session-actions] button{border: 1px solid var(--prts-line-strong) !important; border-radius: 3px !important; clip-path: none !important}html[data-dsh-prts] [data-prts-hero-active]{display: grid; grid-template-rows: minmax(220px,1fr) auto; align-content: center; gap: clamp(28px,5dvh,54px); padding-top: 24px; padding-bottom: 34px}html[data-dsh-prts] [data-prts-hero-active] [data-phase=\"hero\"]{min-height: min(36dvh,390px); align-self: end}html[data-dsh-prts] [data-prts-hero-active] [data-composer-seat]{align-self: start; justify-self: center}html[data-dsh-prts]{--prts-hero-mark-base: clamp(320px,42%,580px); --prts-hero-mark-size: min(var(--prts-hero-mark-base),42dvh)}html[data-dsh-prts] [data-prts-region=\"frame\"]{position: relative}html[data-dsh-prts] [data-prts-region=\"frame\"] > [data-shell-overlay]{position: absolute !important; z-index: 120; inset: 0; min-width: 0; min-height: 0; pointer-events: none}html[data-dsh-prts] [data-prts-region=\"frame\"] > [data-shell-overlay] > *{pointer-events: auto}html[data-dsh-prts] [data-prts-region=\"sessions\"] [data-slot=\"sidebar.settings\"]{opacity: 1; visibility: visible; pointer-events: auto}html[data-dsh-prts] [data-prts-region=\"sessions\"] [data-slot=\"sidebar.settings\"] > button{color: var(--prts-ink) !important}html[data-dsh-prts] [data-prts-workspace-icon]{display: none !important}html[data-dsh-prts] [data-prts-workspace-disclosure]{position: relative; z-index: 4; width: 14px; flex: 0 0 14px; display: grid; place-items: center; margin-left: calc(var(--prts-spine-width) + 4px); color: var(--prts-muted); transform: translate3d(var(--prts-row-shift),0,0); transition: transform 220ms var(--prts-ease-spring),color 160ms ease}html[data-dsh-prts] [data-prts-workspace-row]::before,html[data-dsh-prts] [data-prts-session-row]::before{clip-path: polygon( 1px 0,calc(100% - 1px) 0,100% 1px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 1px),calc(100% - 1px) 100%,1px 100%,0 calc(100% - 1px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 1px ) !important}html[data-dsh-prts] :is([data-prts-workspace-row],[data-prts-session-row]) [data-prts-facility-face]{right: var(--prts-row-end-reserve) !important}html[data-dsh-prts] [data-prts-facility-face]{border: 0 !important; background: var(--prts-line-strong) !important; clip-path: polygon( 1px 0,calc(50% - 25px) 0,calc(50% - 20px) 3.333px,calc(50% + 20px) 3.333px,calc(50% + 25px) 0,calc(100% - 1px) 0,100% 1px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 1px),calc(100% - 1px) 100%,1px 100%,0 calc(100% - 1px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 1px ) !important}html[data-dsh-prts] [data-prts-facility-face]::after{content: \"\"; position: absolute; inset: 1px; background: var(--prts-panel-raised); clip-path: polygon( 0 0,calc(50% - 24px) 0,calc(50% - 19px) 3.333px,calc(50% + 19px) 3.333px,calc(50% + 24px) 0,100% 0,100% calc(50% - 4px),calc(100% - 2px) calc(50% - 2px),calc(100% - 2px) calc(50% + 2px),100% calc(50% + 4px),100% 100%,0 100%,0 calc(50% + 4px),2px calc(50% + 2px),2px calc(50% - 2px),0 calc(50% - 4px) )}html[data-dsh-prts] [data-prts-workspace-actions]{width: 57px !important}html[data-dsh-prts] [data-prts-session-actions]{width: 28px !important}html[data-dsh-prts] [data-prts-workspace-actions] button,html[data-dsh-prts] [data-prts-session-actions] button{width: 28px !important; min-width: 28px !important; position: relative; isolation: isolate; overflow: hidden; border: 0 !important; border-radius: 0 !important; background: var(--prts-line) !important; clip-path: polygon( 1px 0,calc(100% - 1px) 0,100% 1px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 1px),calc(100% - 1px) 100%,1px 100%,0 calc(100% - 1px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 1px ) !important}html[data-dsh-prts] [data-prts-workspace-actions] button::before,html[data-dsh-prts] [data-prts-session-actions] button::before{content: \"\"; position: absolute; z-index: -1; inset: 1px; background: var(--prts-panel-raised); clip-path: polygon( 0 0,100% 0,100% calc(50% - 4px),calc(100% - 2px) calc(50% - 2px),calc(100% - 2px) calc(50% + 2px),100% calc(50% + 4px),100% 100%,0 100%,0 calc(50% + 4px),2px calc(50% + 2px),2px calc(50% - 2px),0 calc(50% - 4px) ); pointer-events: none}html[data-dsh-prts] [data-prts-workspace-actions] button:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-session-actions] button:is(:hover,:focus-visible){background: var(--prts-yellow) !important}html[data-dsh-prts] [data-prts-session-time]{position: relative; z-index: 3; flex: 0 0 auto; margin-right: 39px; padding-left: 8px; transform: translate3d(var(--prts-row-shift),0,0); transition: opacity 120ms ease,transform 220ms var(--prts-ease-spring)}html[data-dsh-prts] [data-prts-session-row]:hover [data-prts-session-time]{opacity: 0}html[data-dsh-prts] [data-composer-card],html[data-dsh-prts] [data-prts-composer-fallback]{position: relative; isolation: isolate; overflow: visible; border: 0 !important; border-radius: 0 !important; background: transparent !important; box-shadow: none !important; clip-path: none !important; backdrop-filter: none; -webkit-backdrop-filter: none}html[data-dsh-prts] [data-composer-card]::before,html[data-dsh-prts] [data-prts-composer-fallback]::before{content: \"\"; position: absolute; z-index: 0; inset: 0; background: var(--prts-line-strong); clip-path: polygon( 3px 0,calc(50% - 42px) 0,calc(50% - 37px) 5px,calc(50% + 37px) 5px,calc(50% + 42px) 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px ); box-shadow: 0 14px 34px rgba(0,0,0,.18); pointer-events: none}html[data-dsh-prts] [data-composer-card]::after,html[data-dsh-prts] [data-prts-composer-fallback]::after{content: \"\"; position: absolute; z-index: 1; inset: 1px 1px 3px; background: var(--prts-composer-surface,var(--prts-active-glass)); clip-path: polygon( 2px 0,calc(50% - 41px) 0,calc(50% - 36px) 5px,calc(50% + 36px) 5px,calc(50% + 41px) 0,calc(100% - 2px) 0,100% 2px,100% calc(100% - 2px),calc(100% - 2px) 100%,2px 100%,0 calc(100% - 2px),0 2px ); backdrop-filter: var(--prts-active-glass-filter); -webkit-backdrop-filter: var(--prts-active-glass-filter); pointer-events: none}html[data-dsh-prts] [data-composer-card] > :not([data-prts-composer-signal]),html[data-dsh-prts] [data-prts-composer-fallback] > :not([data-prts-composer-signal]){position: relative; z-index: 2}html[data-dsh-prts] [data-prts-composer-signal]{position: absolute; z-index: 3; inset: 0; overflow: visible; pointer-events: none}html[data-dsh-prts] [data-prts-composer-signal]::before{content: \"\"; position: absolute; left: 50%; background: var(--prts-yellow); opacity: .82; pointer-events: none; transition: transform 160ms var(--prts-ease-snap),opacity 160ms ease}html[data-dsh-prts] [data-prts-composer-signal]::before{bottom: 0; width: calc(100% - 6px); height: 3px; transform: translateX(-50%) scaleX(.16)}html[data-dsh-prts] [data-composer-card]:focus-within,html[data-dsh-prts] [data-prts-composer-fallback]:focus-within{--prts-composer-surface: color-mix(in srgb,var(--prts-active-glass) 94%,var(--prts-ink) 6%)}html[data-dsh-prts] :is([data-composer-card],[data-prts-composer-fallback]):focus-within [data-prts-composer-signal]::before{opacity: 1; transform: translateX(-50%) scaleX(1)}html[data-dsh-prts] [data-composer-card] textarea:focus-visible,html[data-dsh-prts] [data-prts-composer-fallback] textarea:focus-visible{outline: none !important}@media (prefers-reduced-motion: reduce){html[data-dsh-prts] [data-prts-composer-signal]::before{transition: none}}html[data-dsh-prts] [data-prts-theme-settings] :is(input,textarea,select):focus-visible,html[data-dsh-prts] [data-prts-floating-input]:focus-visible{outline: none !important; border-color: var(--prts-yellow) !important; box-shadow: 0 0 0 1px var(--prts-yellow) !important}html[data-dsh-prts] [data-prts-conversation-control=\"header\"]{height: 36px; min-height: 36px; display: inline-flex; align-items: center; gap: 6px; padding: 0 10px}html[data-dsh-prts] [data-prts-conversation-control=\"header\"] svg{width: 16px; height: 16px; flex: 0 0 16px}html[data-dsh-prts] [data-prts-hero-active] [data-composer-card] button[aria-label*=\"send\" i],html[data-dsh-prts] [data-prts-hero-active] [data-composer-card] button[type=\"submit\"]{min-width: 40px !important; padding: 0 !important; font-size: 11px}html[data-dsh-prts] [data-prts-hero-active] [data-prts-glass-control=\"action\"]{width: 36px !important; min-width: 36px !important; padding: 0 !important; flex: 0 0 36px}html[data-dsh-prts] :is( [data-composer-card] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-composer-fallback] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-glass-control],[data-prts-conversation-control]:not([data-prts-conversation-control=\"micro\"]),[data-produced-files-row] > button[type=\"button\"] ){--prts-control-outline: var(--prts-line); --prts-control-surface: var(--prts-panel-raised); position: relative; isolation: isolate; overflow: hidden; border: 0 !important; border-radius: 0 !important; background: var(--prts-control-outline) !important; color: var(--prts-ink) !important; clip-path: polygon( 3px 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px ) !important}html[data-dsh-prts] :is( [data-composer-card] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-composer-fallback] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-glass-control],[data-prts-conversation-control]:not([data-prts-conversation-control=\"micro\"]),[data-produced-files-row] > button[type=\"button\"] )::before{content: \"\"; position: absolute; z-index: -1; inset: 1px; background: var(--prts-control-surface); clip-path: polygon( 2px 0,calc(100% - 2px) 0,100% 2px,100% calc(100% - 2px),calc(100% - 2px) 100%,2px 100%,0 calc(100% - 2px),0 2px ); pointer-events: none}html[data-dsh-prts] :is( [data-composer-card] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-composer-fallback] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-glass-control],[data-prts-conversation-control]:not([data-prts-conversation-control=\"micro\"]),[data-produced-files-row] > button[type=\"button\"] ):is(:hover,:focus-visible){--prts-control-outline: var(--prts-yellow)}html[data-dsh-prts] :is( [data-prts-glass-control=\"model\"],[data-prts-glass-control=\"permission\"],[data-prts-glass-control=\"preset\"],[data-prts-conversation-control=\"utility\"],[data-produced-files-row] > button[type=\"button\"] ){--prts-control-surface: var(--prts-active-glass) !important}html[data-dsh-prts] [data-composer-card] button[aria-label*=\"send\" i],html[data-dsh-prts] [data-composer-card] button[type=\"submit\"],html[data-dsh-prts] [data-prts-conversation-control=\"cta\"]{font-size: 11px; --prts-control-outline: var(--prts-yellow) !important; --prts-control-surface: var(--prts-yellow) !important; color: var(--prts-yellow-ink) !important}html[data-dsh-prts] [data-prts-conversation-control=\"danger\"]{--prts-control-outline: var(--prts-red) !important; --prts-control-surface: color-mix(in srgb,var(--prts-red) 14%,var(--prts-panel-raised)) !important; color: var(--prts-red) !important}html[data-dsh-prts] [data-prts-hero-active]{--prts-hero-narrow-spacer: clamp(24px,8dvh,72px); --prts-hero-wide-spacer: clamp(96px,22dvh,340px); min-height: 100%; height: calc(100% - 48px) !important; overflow-y: auto; display: grid; grid-template-columns: minmax(0,1fr); grid-template-rows: minmax(0,1fr) auto min( var(--prts-hero-wide-spacer),max(var(--prts-hero-narrow-spacer),calc(var(--prts-hero-narrow-spacer) + 63vw - 403.2px)) ); align-content: stretch; gap: clamp(24px,calc(5vw - 8px),40px); padding: clamp(18px,calc(1.875vw + 6px),24px) clamp(12px,3vw,42px) 0 clamp(18px,3vw,42px)}html[data-dsh-prts] [data-prts-hero-active] [data-composer-card],html[data-dsh-prts] [data-prts-hero-active] [data-prts-composer-fallback]{width: 100%; margin-inline: auto; padding: 10px 12px}html[data-dsh-prts] [data-prts-hero-active] [data-composer-card] textarea,html[data-dsh-prts] [data-prts-hero-active] [data-prts-composer-fallback] textarea{min-height: 64px; line-height: 1.55; resize: vertical}html[data-dsh-prts] [data-prts-hero-active] [data-composer-card] button,html[data-dsh-prts] [data-prts-hero-active] [data-prts-glass-control]{min-height: 36px}html[data-dsh-prts] [data-prts-hero-active]::before{margin-top: calc(var(--prts-hero-mark-size) + 44px)}html[data-dsh-prts] [data-prts-hero-active] [data-phase=\"hero\"]{grid-row: 1; min-height: 0; align-self: stretch}html[data-dsh-prts] [data-prts-hero-active] [data-composer-seat]{grid-row: 2; width: min(calc(780px + 32px),100%); min-width: 0 !important; align-self: end; justify-self: center}html[data-dsh-prts] [data-prts-theme-settings]{--prts-settings-text: .875rem; --prts-settings-small: .75rem; --prts-settings-heading: .875rem; position: fixed; z-index: 10000; inset: 50% auto auto 50%; width: min(clamp(50rem,55vw,65rem),calc(100vw - 2rem)); height: auto; max-width: none; max-height: min(60rem,calc(100dvh - 2rem)); container: prts-settings / inline-size; margin: 0; padding: 0; overflow: visible; border: 0; border-radius: 0; background: transparent; color: var(--prts-ink); box-shadow: 0 28px 90px rgba(0,0,0,.46); clip-path: none; opacity: 0; transform: translate(-50%,calc(-50% + 8px)) scale(.992); pointer-events: none; transition: opacity 150ms ease,transform 220ms var(--prts-ease-spring)}html[data-dsh-prts] [data-prts-theme-settings][open]{display: block}html[data-dsh-prts] [data-prts-theme-settings][data-prts-settings-visible]{opacity: 1; transform: translate(-50%,-50%) scale(1); pointer-events: auto}html[data-dsh-prts] [data-prts-theme-settings][data-prts-resizing]{transition: none}html[data-dsh-prts] [data-prts-theme-settings][data-prts-resizing]::backdrop,html[data-dsh-prts] [data-prts-settings-backdrop][data-prts-resizing]{backdrop-filter: none; -webkit-backdrop-filter: none}html[data-dsh-prts] [data-prts-theme-settings][data-prts-resizing] [data-prts-option-sample=\"glass\"]::after{backdrop-filter: none; -webkit-backdrop-filter: none; transition: none}html[data-dsh-prts] [data-prts-theme-settings]::before{content: none}html[data-dsh-prts] [data-prts-theme-settings]::backdrop{background: color-mix(in srgb,var(--prts-canvas) 72%,transparent); backdrop-filter: blur(5px) saturate(.82); -webkit-backdrop-filter: blur(5px) saturate(.82)}html[data-dsh-prts] [data-prts-settings-backdrop]{z-index: 9999; inset: 0; background: color-mix(in srgb,var(--prts-canvas) 72%,transparent); backdrop-filter: blur(5px) saturate(.82); -webkit-backdrop-filter: blur(5px) saturate(.82)}html[data-dsh-prts] [data-prts-settings-frame]{position: relative; height: auto; max-height: inherit; display: grid; grid-template-rows: auto minmax(0,1fr); overflow: hidden; isolation: isolate; border: 1px solid var(--prts-line-strong); background: linear-gradient(125deg,color-mix(in srgb,var(--prts-cyan) 4%,transparent),transparent 34%),var(--prts-panel); clip-path: polygon(4px 0,calc(100% - 38px) 0,100% 38px,100% calc(100% - 4px),calc(100% - 4px) 100%,4px 100%,0 calc(100% - 4px),0 4px)}html[data-dsh-prts] [data-prts-settings-frame]::before{content: \"\"; position: absolute; z-index: 3; top: 0; right: 37px; width: 118px; height: 2px; background: var(--prts-cyan); pointer-events: none}html[data-dsh-prts] [data-prts-theme-settings-header]{display: grid; align-items: center; min-height: 68px; grid-template-columns: minmax(180px,auto) minmax(0,1fr); gap: 14px; padding: 13px 48px 12px 16px; border-bottom: 1px solid var(--prts-line-strong); background: color-mix(in srgb,var(--prts-canvas-elevated) 92%,transparent)}html[data-dsh-prts] [data-prts-theme-settings-header] > span{display: grid; gap: 4px}html[data-dsh-prts] [data-prts-theme-settings-header] small,html[data-dsh-prts] [data-prts-theme-settings] section > header small,html[data-dsh-prts] [data-prts-theme-settings] summary small,html[data-dsh-prts] [data-prts-settings-actions] small{color: var(--prts-muted); font: 700 8px/1.3 var(--prts-mono); letter-spacing: .08em}html[data-dsh-prts] [data-prts-theme-settings-header] strong{font: 800 19px/1 var(--prts-display); letter-spacing: .07em}html[data-dsh-prts] [data-prts-settings-summary]{display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px}html[data-dsh-prts] [data-prts-settings-summary] span{min-height: 22px; padding: 4px 7px; box-shadow: inset 0 0 0 1px var(--prts-line); background: color-mix(in srgb,var(--prts-panel-raised) 86%,transparent); color: var(--prts-cyan); font: 700 8px/1 var(--prts-mono); clip-path: polygon(2px 0,calc(100% - 2px) 0,100% 2px,100% calc(100% - 2px),calc(100% - 2px) 100%,2px 100%,0 calc(100% - 2px),0 2px)}html[data-dsh-prts] [data-prts-theme-settings-close]{position: absolute; z-index: 5; top: 13px; right: 13px; width: 36px; height: 36px; color: var(--prts-ink)}html[data-dsh-prts] [data-prts-theme-settings-scroll]{min-height: 0; overflow-y: auto; padding: 12px; scrollbar-gutter: stable}html[data-dsh-prts] [data-prts-settings-presets],html[data-dsh-prts] [data-prts-settings-common],html[data-dsh-prts] [data-prts-settings-advanced],html[data-dsh-prts] [data-prts-settings-actions]{position: relative; margin: 0; overflow: hidden; border: 0; border-bottom: 1px solid var(--prts-line-strong); background: color-mix(in srgb,var(--prts-canvas-elevated) 82%,transparent); clip-path: none}html[data-dsh-prts] [data-prts-settings-presets] > header,html[data-dsh-prts] [data-prts-settings-common] > header{min-height: 42px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 9px 11px; border-bottom: 1px solid color-mix(in srgb,var(--prts-line) 72%,transparent)}html[data-dsh-prts] [data-prts-settings-presets] > header span,html[data-dsh-prts] [data-prts-settings-common] > header span,html[data-dsh-prts] [data-prts-settings-advanced] summary > span{display: flex; align-items: baseline; gap: 9px}html[data-dsh-prts] [data-prts-settings-presets] > header strong,html[data-dsh-prts] [data-prts-settings-common] > header strong,html[data-dsh-prts] [data-prts-settings-advanced] summary strong{font: 800 13px/1 var(--prts-display); letter-spacing: .05em}html[data-dsh-prts] [data-prts-advanced-summary]{pointer-events: none; color: var(--prts-cyan); font: 800 8px/1 var(--prts-mono); letter-spacing: .06em}html[data-dsh-prts] [data-prts-settings-presets],html[data-dsh-prts] [data-prts-settings-common],html[data-dsh-prts] [data-prts-settings-advanced],html[data-dsh-prts] [data-prts-settings-actions]{border-inline: 1px solid var(--prts-line-strong)}html[data-dsh-prts] [data-prts-settings-presets]{border-top: 1px solid var(--prts-line-strong)}html[data-dsh-prts] [data-prts-settings-presets] > div{display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: 0; padding: 0}html[data-dsh-prts] [data-prts-preset-card]{display: grid; text-align: left; min-height: 66px; align-content: center; gap: 6px; padding: 11px 12px !important; border-right: 1px solid var(--prts-line) !important; position: relative; overflow: hidden; box-shadow: none; background: transparent !important; clip-path: none}html[data-dsh-prts] [data-prts-preset-card]:last-child{border-right: 0 !important}html[data-dsh-prts] [data-prts-preset-card] strong{font-size: 12px}html[data-dsh-prts] [data-prts-preset-card] span{overflow: hidden; font-size: 8px; line-height: 1.35; text-overflow: ellipsis; white-space: nowrap}html[data-dsh-prts] [data-prts-preset-card].is-selected{box-shadow: inset 0 -2px 0 var(--prts-yellow); background: color-mix(in srgb,var(--prts-yellow) 9%,transparent) !important}html[data-dsh-prts] [data-prts-settings-common-grid]{display: grid; grid-template-columns: repeat(2,minmax(0,1fr))}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]{min-height: 50px; grid-template-columns: 94px minmax(0,1fr); align-items: center; gap: 8px; padding: 7px 10px; border-right: 1px solid var(--prts-line); border-bottom: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]:nth-child(2n){border-right: 0}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]:nth-last-child(-n + 2){border-bottom: 0}html[data-dsh-prts] [data-prts-setting-row] > div{min-width: 0; display: flex; gap: 4px}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row] > span{min-width: 0; display: grid; gap: 3px}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row] > span > strong{font: 700 9px/1.1 var(--prts-display)}html[data-dsh-prts] [data-prts-setting-note]{color: var(--prts-yellow); font: 700 7px/1.25 var(--prts-mono); letter-spacing: 0}html[data-dsh-prts] [data-prts-settings-common] button[data-prts-setting-key]{min-width: 0; flex: 1 1 0; display: inline-flex; align-items: center; justify-content: center; gap: 5px}html[data-dsh-prts] [data-prts-option-sample]{position: relative; width: 22px; height: 14px; flex: 0 0 22px; overflow: hidden; border: 1px solid color-mix(in srgb,currentColor 45%,var(--prts-line)); background: var(--prts-canvas)}html[data-dsh-prts] [data-prts-option-sample=\"texture\"][data-prts-option-sample-value=\"off\"]{background: linear-gradient(var(--prts-line),var(--prts-line)) 50% 50% / 12px 1px no-repeat,var(--prts-canvas)}html[data-dsh-prts] [data-prts-option-sample=\"texture\"][data-prts-option-sample-value=\"restrained\"]{background: repeating-linear-gradient(115deg,var(--prts-canvas) 0 6px,color-mix(in srgb,var(--prts-cyan) 38%,var(--prts-canvas)) 6px 7px)}html[data-dsh-prts] [data-prts-option-sample=\"texture\"][data-prts-option-sample-value=\"full\"]{background: repeating-linear-gradient(115deg,transparent 0 4px,color-mix(in srgb,var(--prts-cyan) 62%,transparent) 4px 5px),repeating-linear-gradient(25deg,var(--prts-canvas) 0 7px,color-mix(in srgb,var(--prts-line-strong) 72%,var(--prts-canvas)) 7px 8px)}html[data-dsh-prts] [data-prts-option-sample=\"glass\"]{background: linear-gradient(135deg,color-mix(in srgb,var(--prts-cyan) 54%,transparent) 25%,transparent 25%) 0 0 / 8px 8px,linear-gradient(315deg,color-mix(in srgb,var(--prts-yellow) 38%,transparent) 25%,transparent 25%) 4px 4px / 8px 8px,var(--prts-canvas)}html[data-dsh-prts] [data-prts-option-sample=\"glass\"]::after{content: \"\"; position: absolute; inset: 0; background: color-mix(in srgb,var(--prts-panel-raised) 64%,transparent); backdrop-filter: blur(2px) saturate(1.15); -webkit-backdrop-filter: blur(2px) saturate(1.15)}html[data-dsh-prts] [data-prts-option-sample=\"glass\"][data-prts-option-sample-value=\"off\"]::after{background: var(--prts-panel-raised); backdrop-filter: none; -webkit-backdrop-filter: none}html[data-dsh-prts] [data-prts-option-sample=\"glass\"][data-prts-option-sample-value=\"soft\"]::after{background: color-mix(in srgb,var(--prts-panel-raised) 82%,transparent); backdrop-filter: blur(1px); -webkit-backdrop-filter: blur(1px)}html[data-dsh-prts] [data-prts-option-sample=\"glass\"][data-prts-option-sample-value=\"standard\"]::after{background: color-mix(in srgb,var(--prts-panel-raised) 62%,transparent)}html[data-dsh-prts] [data-prts-option-sample=\"glass\"][data-prts-option-sample-value=\"clear\"]::after{background: color-mix(in srgb,var(--prts-panel-raised) 34%,transparent); backdrop-filter: blur(4px) saturate(1.35); -webkit-backdrop-filter: blur(4px) saturate(1.35)}html[data-dsh-prts] [data-prts-theme-settings] button[data-prts-setting-key],html[data-dsh-prts] [data-prts-retry-save],html[data-dsh-prts] [data-prts-reset-visual],html[data-dsh-prts] [data-prts-reset-confirm-action],html[data-dsh-prts] [data-prts-reset-cancel]{position: relative; overflow: hidden; min-height: 30px; padding: 6px 8px; border: 0 !important; box-shadow: inset 0 0 0 1px var(--prts-line); background: var(--prts-panel-raised); color: var(--prts-muted); font: 700 8px/1 var(--prts-mono); white-space: nowrap; clip-path: polygon(2px 0,calc(100% - 2px) 0,100% 2px,100% calc(100% - 2px),calc(100% - 2px) 100%,2px 100%,0 calc(100% - 2px),0 2px)}html[data-dsh-prts] [data-prts-theme-settings] button[data-prts-setting-key].is-selected{box-shadow: inset 0 0 0 1px var(--prts-yellow); background: color-mix(in srgb,var(--prts-yellow) 12%,var(--prts-panel-raised)); color: var(--prts-ink); html[data-dsh-prts] [data-prts-theme-settings] button[data-prts-setting-key]::after{content: \"\"; position: absolute; z-index: 3; inset: 0; opacity: 0; box-shadow: inset 0 0 0 1px var(--prts-yellow); background: color-mix(in srgb,var(--prts-yellow) 18%,transparent); pointer-events: none}html[data-dsh-prts] [data-prts-theme-settings] button[data-prts-setting-key][data-prts-setting-feedback]::after{opacity: 1}}html[data-dsh-prts] [data-prts-theme-settings] button:focus-visible,html[data-dsh-prts] [data-prts-theme-settings] summary:focus-visible,html[data-dsh-prts] [data-prts-theme-settings] input:focus-visible{outline: 2px solid var(--prts-cyan); outline-offset: 2px}html[data-dsh-prts] [data-prts-settings-advanced] summary{min-height: 52px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 11px; cursor: pointer; list-style: none}html[data-dsh-prts] [data-prts-settings-advanced] summary::-webkit-details-marker{display: none}html[data-dsh-prts] [data-prts-settings-advanced] summary::after{content: \"+\"; width: 24px; height: 24px; display: grid; place-items: center; margin-left: 2px; border: 1px solid var(--prts-line); color: var(--prts-cyan); font: 800 13px/1 var(--prts-mono)}html[data-dsh-prts] [data-prts-settings-advanced][open] summary::after{content: \"−\"}html[data-dsh-prts] [data-prts-settings-advanced-content]{display: grid; grid-template-columns: minmax(0,.8fr) minmax(0,1.2fr); border-top: 1px solid var(--prts-line-strong)}html[data-dsh-prts] [data-prts-settings-advanced-content] > section{padding: 11px}html[data-dsh-prts] [data-prts-settings-advanced-content] > section + section{border-left: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-settings-advanced-content] section > header{min-height: 30px; display: grid; gap: 4px}html[data-dsh-prts] [data-prts-settings-advanced-content] section > header strong{font-size: 10px}html[data-dsh-prts] [data-prts-settings-advanced-content] section > header span{color: var(--prts-muted); font-size: 8px}html[data-dsh-prts] [data-prts-particle-detail] > div{display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: 5px; margin-top: 8px}html[data-dsh-prts] [data-prts-particle-detail] button[role=\"radio\"]{min-width: 0; display: grid; gap: 5px}html[data-dsh-prts] [data-prts-particle-detail-preview]{height: 32px; display: grid; grid-template-columns: repeat(6,1fr); place-items: center; overflow: hidden; border: 1px solid color-mix(in srgb,currentColor 44%,transparent)}html[data-dsh-prts] [data-prts-particle-detail-preview] b{width: 2px; height: 2px; background: currentColor}html[data-dsh-prts] [data-prts-particle-traversal]{margin-top: 9px; padding-top: 9px; border-top: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-particle-traversal] > span{display: grid; gap: 3px}html[data-dsh-prts] [data-prts-particle-traversal] > span strong{font-size: 9px}html[data-dsh-prts] [data-prts-particle-traversal] > span small{color: var(--prts-muted); font: 600 8px/1.35 var(--prts-mono)}html[data-dsh-prts] [data-prts-particle-traversal-output]{min-width: 132px; color: var(--prts-cyan); font: 800 8px/1.2 var(--prts-mono); text-align: right}html[data-dsh-prts] [data-prts-particle-error]{margin: 8px 0 0; color: var(--prts-yellow); font: 700 8px/1.4 var(--prts-mono)}html[data-dsh-prts] [data-prts-scale-calibration]{--prts-calibration-distance: 96px; margin: 8px 0 0; padding: 8px; overflow: hidden; border: 1px solid var(--prts-line); background: color-mix(in srgb,var(--prts-panel-raised) 84%,transparent)}html[data-dsh-prts] [data-prts-scale-calibration-viewport]{position: relative; width: 100%; height: 94px; overflow: hidden}html[data-dsh-prts] [data-prts-scale-calibration-canvas]{position: absolute; top: 0; left: 0; width: 360px; height: 94px; transform-origin: top left}html[data-dsh-prts] [data-prts-scale-calibration-sidebar]{position: absolute; inset: 8px auto 8px 0; width: 4px; background: var(--prts-line-strong); box-shadow: 8px 0 0 color-mix(in srgb,var(--prts-line) 45%,transparent)}html[data-dsh-prts] [data-prts-scale-calibration-measure]{position: absolute; top: 6px; left: 0; width: var(--prts-calibration-distance); height: 18px; border-top: 1px solid var(--prts-cyan); color: var(--prts-cyan)}html[data-dsh-prts] [data-prts-scale-calibration-measure]::before,html[data-dsh-prts] [data-prts-scale-calibration-measure]::after{content: \"\"; position: absolute; top: -4px; width: 1px; height: 7px; background: currentColor}html[data-dsh-prts] [data-prts-scale-calibration-measure]::before{left: 0}html[data-dsh-prts] [data-prts-scale-calibration-measure]::after{right: 0}html[data-dsh-prts] [data-prts-scale-calibration-value]{position: absolute; top: 4px; right: 3px; padding-left: 4px; background: var(--prts-panel-raised); color: currentColor; font: 800 8px/1 var(--prts-mono)}html[data-dsh-prts] [data-prts-scale-calibration-rail]{position: absolute; top: 29px; left: var(--prts-calibration-distance); width: 32px; height: 58px; border: 1px solid var(--prts-line-strong); background: color-mix(in srgb,var(--prts-canvas) 62%,transparent)}html[data-dsh-prts] [data-prts-scale-calibration-rail] i{position: absolute; top: calc(5px + var(--prts-calibration-tick) * 6px); left: 2px; width: 9px; height: 1px; background: var(--prts-muted)}html[data-dsh-prts] [data-prts-scale-calibration-rail] i:nth-child(4n + 1){width: 24px}html[data-dsh-prts] [data-prts-scale-calibration-rail] i:nth-child(4n + 2){width: 18px}html[data-dsh-prts] [data-prts-scale-calibration-rail] i:last-child{width: 24px; background: var(--prts-yellow)}html[data-dsh-prts] [data-prts-scale-calibration-gap]{position: absolute; top: 29px; left: calc(var(--prts-calibration-distance) + 32px); width: 12px; height: 58px; background: repeating-linear-gradient(135deg,transparent 0 3px,color-mix(in srgb,var(--prts-line) 42%,transparent) 3px 4px)}html[data-dsh-prts] [data-prts-scale-calibration-content]{position: absolute; inset: 29px 0 7px calc(var(--prts-calibration-distance) + 44px); min-width: 16px; overflow: hidden; border-left: 1px solid var(--prts-cyan); background: color-mix(in srgb,var(--prts-panel) 84%,transparent)}html[data-dsh-prts] [data-prts-scale-calibration-content] i{display: block; width: min(78%,138px); height: 1px; margin: 18px 10px 9px; background: var(--prts-line-strong); box-shadow: 0 8px 0 var(--prts-line)}html[data-dsh-prts] [data-prts-scale-calibration-content] small{margin-left: 10px; color: var(--prts-dim); font: 700 7px/1 var(--prts-mono); white-space: nowrap}html[data-dsh-prts] [data-prts-scale-calibration-meta]{min-height: 20px; display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 4px; padding-top: 7px; border-top: 1px solid var(--prts-line); font: 700 8px/1.3 var(--prts-mono)}html[data-dsh-prts] [data-prts-scale-calibration-status]{margin-left: auto; color: var(--prts-muted); text-align: right}html[data-dsh-prts] [data-prts-scale-calibration][data-prts-calibration-mode=\"configured\"] [data-prts-scale-calibration-status],html[data-dsh-prts] [data-prts-scale-calibration][data-prts-calibration-mode=\"simulated\"] [data-prts-scale-calibration-status]{color: var(--prts-cyan)}html[data-dsh-prts] [data-prts-scale-calibration][data-prts-calibration-mode=\"centered\"] [data-prts-scale-calibration-status],html[data-dsh-prts] [data-prts-scale-calibration-scale]{color: var(--prts-yellow)}html[data-dsh-prts] [data-prts-setting-range-row]{display: grid; gap: 7px; padding: 8px 0 0; border: 0}html[data-dsh-prts] [data-prts-setting-range-row] > div{display: flex; align-items: center; gap: 8px}html[data-dsh-prts] [data-prts-setting-range-row] input[type=\"range\"]{min-width: 0; flex: 1}html[data-dsh-prts] [data-prts-setting-range]{accent-color: var(--prts-cyan)}html[data-dsh-prts] :is([data-prts-scale-distance-output],[data-prts-scale-focus-output]){min-width: 42px; color: var(--prts-cyan); font: 800 8px/1 var(--prts-mono); text-align: right}html[data-dsh-prts] [data-prts-scale-focus-preview]{width: 34px; min-width: 34px; height: 30px; display: grid; align-content: center; gap: 4px}html[data-dsh-prts] [data-prts-scale-focus-preview] i{display: block; height: 1px; max-width: 30px; background: var(--prts-yellow); transition: width 100ms ease}html[data-dsh-prts] [data-prts-settings-actions]{min-height: 58px; display: block; padding: 0; border-bottom: 1px solid var(--prts-line-strong)}html[data-dsh-prts] [data-prts-persistence-error],html[data-dsh-prts] [data-prts-reset-zone]{min-height: 58px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 9px 11px}html[data-dsh-prts] [data-prts-persistence-error]{border-bottom: 1px solid var(--prts-yellow); background: color-mix(in srgb,var(--prts-yellow) 7%,transparent)}html[data-dsh-prts] [data-prts-persistence-error] > span,html[data-dsh-prts] [data-prts-reset-zone] > span{display: grid; gap: 4px}html[data-dsh-prts] [data-prts-persistence-error] strong{color: var(--prts-yellow)}html[data-dsh-prts] [data-prts-reset-visual],html[data-dsh-prts] [data-prts-reset-confirm-action]{color: var(--prts-yellow); box-shadow: inset 0 0 0 1px var(--prts-yellow)}html[data-dsh-prts] [data-prts-reset-confirm]{display: flex; align-items: center; justify-content: flex-end; gap: 5px; color: var(--prts-yellow); font: 700 8px/1.3 var(--prts-mono)}html[data-dsh-prts] [hidden]{display: none !important}html[data-dsh-prts] :is( [data-prts-theme-settings-header] small,[data-prts-theme-settings] section > header small,[data-prts-theme-settings] summary small,[data-prts-settings-actions] small,[data-prts-settings-summary] span,[data-prts-advanced-summary],[data-prts-preset-card] span,[data-prts-setting-note],[data-prts-settings-advanced-content] section > header span,[data-prts-particle-error],[data-prts-scale-calibration-value],[data-prts-scale-calibration-content] small,[data-prts-scale-calibration-meta],[data-prts-scale-distance-output],[data-prts-reset-confirm] ){font-size: var(--prts-settings-small); line-height: 1.4}html[data-dsh-prts] :is( [data-prts-settings-presets] > header strong,[data-prts-settings-common] > header strong,[data-prts-settings-advanced] summary strong,[data-prts-preset-card] strong,[data-prts-settings-common] [data-prts-setting-row] > span > strong,[data-prts-settings-advanced-content] section > header strong,[data-prts-theme-settings] button[data-prts-setting-key],[data-prts-retry-save],[data-prts-reset-visual],[data-prts-reset-confirm-action],[data-prts-reset-cancel] ){font-size: var(--prts-settings-text); line-height: 1.25}html[data-dsh-prts] [data-prts-theme-settings-header] strong{font-size: 1.375rem; line-height: 1.1}html[data-dsh-prts] [data-prts-settings-summary] span{min-height: 28px; padding: 6px 9px}html[data-dsh-prts] [data-prts-preset-card]{min-height: 84px}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]{min-height: 72px; grid-template-columns: minmax(7.5rem,auto) minmax(0,1fr)}html[data-dsh-prts] :is( [data-prts-theme-settings] button[data-prts-setting-key],[data-prts-retry-save],[data-prts-reset-visual],[data-prts-reset-confirm-action],[data-prts-reset-cancel] ){min-height: 40px; padding: 8px 10px}@container prts-settings (max-width: 52rem){html[data-dsh-prts] [data-prts-settings-common-grid],html[data-dsh-prts] [data-prts-settings-advanced-content]{grid-template-columns: minmax(0,1fr)}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]{border-right: 0}html[data-dsh-prts] [data-prts-settings-advanced-content] > section + section{border-left: 0; border-top: 1px solid var(--prts-line)}}@media (max-height: 820px) and (min-width: 721px){html[data-dsh-prts] [data-prts-theme-settings-header]{min-height: 60px; padding-block: 10px}html[data-dsh-prts] [data-prts-theme-settings-close]{top: 10px}}@media (max-width: 720px){html[data-dsh-prts] [data-prts-theme-settings]{inset: 0; width: 100vw; height: 100dvh; max-height: none; margin: 0; transform: translateY(10px)}html[data-dsh-prts] [data-prts-theme-settings][data-prts-settings-visible]{transform: translateY(0)}html[data-dsh-prts] [data-prts-settings-frame]{height: 100%; max-height: none; clip-path: none; border: 0}html[data-dsh-prts] [data-prts-settings-frame]::before{right: 0}html[data-dsh-prts] [data-prts-theme-settings-header]{grid-template-columns: minmax(0,1fr); padding: 12px 48px 11px 13px}html[data-dsh-prts] [data-prts-settings-summary]{display: none}html[data-dsh-prts] [data-prts-theme-settings-scroll]{padding: 8px; scrollbar-gutter: auto}html[data-dsh-prts] [data-prts-settings-presets] > div{grid-template-columns: minmax(0,1fr)}html[data-dsh-prts] [data-prts-preset-card]{min-height: 54px; border-right: 0 !important; border-bottom: 1px solid var(--prts-line) !important}html[data-dsh-prts] [data-prts-preset-card]:last-child{border-bottom: 0 !important}html[data-dsh-prts] [data-prts-settings-common-grid]{grid-template-columns: minmax(0,1fr)}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]{min-height: 62px}html[data-dsh-prts] [data-prts-settings-common] button[data-prts-setting-key]{min-height: 40px}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]{border-right: 0; border-bottom: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]:nth-last-child(2){border-bottom: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]:last-child{border-bottom: 0}html[data-dsh-prts] [data-prts-settings-advanced-content]{grid-template-columns: minmax(0,1fr)}html[data-dsh-prts] [data-prts-settings-advanced-content] > section + section{border-left: 0; border-top: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-reset-zone]{align-items: flex-start; flex-direction: column}html[data-dsh-prts] [data-prts-reset-confirm]{width: 100%; flex-wrap: wrap; justify-content: flex-start}}@media (prefers-reduced-motion: no-preference){html[data-dsh-prts] [data-prts-theme-settings] button[data-prts-setting-key][data-prts-setting-feedback]::after{animation: prts-setting-feedback 300ms ease-out both}}@keyframes prts-setting-feedback{0%{opacity: .82}100%{opacity: 0}}@media (prefers-reduced-motion: reduce){html[data-dsh-prts] [data-prts-theme-settings]{transition-duration: 1ms}}@media (prefers-reduced-transparency: reduce){html[data-dsh-prts] [data-prts-theme-settings]::backdrop,html[data-dsh-prts] [data-prts-settings-backdrop]{background: color-mix(in srgb,var(--prts-canvas) 94%,transparent); backdrop-filter: none; -webkit-backdrop-filter: none}}html[data-dsh-prts] [data-prts-facility-defs]{position: absolute; width: 0; height: 0; overflow: hidden; pointer-events: none}html[data-dsh-prts] [data-prts-facility-svg]{position: absolute; z-index: -1; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none}html[data-dsh-prts] [data-prts-facility-layer=\"surface\"]{fill: var(--prts-facility-surface,var(--prts-panel-raised))}html[data-dsh-prts] [data-prts-facility-layer=\"texture\"]{fill: none; opacity: 0; pointer-events: none; transition: opacity 160ms ease}html[data-dsh-prts] [data-prts-facility-layer=\"outline\"]{fill: none; stroke: var(--prts-facility-outline,var(--prts-line-strong)); stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 2; vector-effect: non-scaling-stroke; shape-rendering: geometricPrecision; pointer-events: none}html[data-dsh-prts] [data-prts-facility-vector][data-prts-facility-texture=\"grid\"] [data-prts-facility-layer=\"texture\"]{fill: var(--prts-facility-texture-color,var(--prts-cyan)); opacity: var(--prts-facility-texture-opacity,.12); mask: url(\"#prts-facility-grid-mask\")}html[data-dsh-prts] [data-prts-facility-vector][data-prts-facility-texture=\"scanline\"] [data-prts-facility-layer=\"texture\"]{fill: var(--prts-facility-texture-color,var(--prts-cyan)); opacity: var(--prts-facility-texture-opacity,.1); mask: url(\"#prts-facility-scanline-mask\")}html[data-dsh-prts] [data-prts-workspace-row]{--prts-facility-texture-color: var(--prts-cyan); --prts-silhouette-fill: #f3f6f7; --prts-silhouette-far-opacity: .06; --prts-silhouette-near-opacity: .12}html[data-dsh-prts][data-prts-scheme=\"light\"] [data-prts-workspace-row]{--prts-silhouette-fill: #3f4d56; --prts-silhouette-far-opacity: .13; --prts-silhouette-near-opacity: .26}html[data-dsh-prts] [data-prts-workspace-row][aria-expanded=\"true\"],html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]){--prts-silhouette-far-opacity: .24; --prts-silhouette-near-opacity: .52}html[data-dsh-prts][data-prts-scheme=\"light\"] [data-prts-workspace-row][aria-expanded=\"true\"],html[data-dsh-prts][data-prts-scheme=\"light\"] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]){--prts-silhouette-far-opacity: .25; --prts-silhouette-near-opacity: .5}html[data-dsh-prts] [data-prts-facility-texture=\"silhouette\"] [data-prts-facility-layer=\"texture\"]{opacity: 0}html[data-dsh-prts] [data-prts-facility-silhouette]{fill: var(--prts-silhouette-fill); opacity: 0; pointer-events: none}html[data-dsh-prts] [data-prts-facility-texture=\"silhouette\"] [data-prts-facility-silhouette]{opacity: 1}html[data-dsh-prts] [data-prts-silhouette-layer]{transform-box: fill-box; transform-origin: left center; animation-timing-function: linear; animation-iteration-count: infinite; animation-play-state: paused; will-change: transform; transition: opacity 180ms ease}html[data-dsh-prts] [data-prts-silhouette-layer=\"far\"]{opacity: var(--prts-silhouette-far-opacity); animation-name: prts-silhouette-far-drift; animation-duration: 22.4s}html[data-dsh-prts] [data-prts-silhouette-layer=\"near\"]{opacity: var(--prts-silhouette-near-opacity); animation-name: prts-silhouette-near-drift; animation-duration: 6.4s}@media (prefers-reduced-motion: no-preference){html[data-dsh-prts]:not([data-prts-motion=\"reduced\"]) [data-prts-workspace-row]:hover [data-prts-silhouette-layer]{animation-play-state: running}}@keyframes prts-silhouette-far-drift{to{transform: translate3d(-512px,0,0)}}@keyframes prts-silhouette-near-drift{to{transform: translate3d(-512px,0,0)}}html[data-dsh-prts] [data-prts-facility-texture=\"pickup\"] [data-prts-facility-layer=\"texture\"]{opacity: 0}html[data-dsh-prts] [data-prts-session-pickup]{color: var(--prts-session-pickup-fill); fill: currentColor; opacity: 0; transform: translate3d(5px,0,0); transform-box: view-box; transform-origin: center; transition: opacity 150ms ease,transform 240ms cubic-bezier(.22,1,.36,1); pointer-events: none}html[data-dsh-prts] [data-prts-session-row]:hover [data-prts-facility-texture=\"pickup\"] [data-prts-session-pickup]{opacity: .58; transform: translate3d(0,0,0)}html[data-dsh-prts] [data-prts-session-pickup-baseline]{fill: none; stroke: currentColor; stroke-width: 1; opacity: .2; vector-effect: non-scaling-stroke}html[data-dsh-prts] [data-prts-session-pickup-indicator]{fill: var(--prts-yellow)}html[data-dsh-prts] [data-prts-session-pickup-bar]{transform-box: fill-box; transform-origin: center}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(1){--prts-pickup-duration: 520ms; --prts-pickup-delay: -.12s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(2){--prts-pickup-duration: 1180ms; --prts-pickup-delay: -.28s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(3){--prts-pickup-duration: 760ms; --prts-pickup-delay: -.44s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(4){--prts-pickup-duration: 1420ms; --prts-pickup-delay: -.18s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(5){--prts-pickup-duration: 640ms; --prts-pickup-delay: -.36s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(6){--prts-pickup-duration: 980ms; --prts-pickup-delay: -.52s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(7){--prts-pickup-duration: 480ms; --prts-pickup-delay: -.22s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(8){--prts-pickup-duration: 1260ms; --prts-pickup-delay: -.46s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(9){--prts-pickup-duration: 720ms; --prts-pickup-delay: -.14s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(10){--prts-pickup-duration: 1520ms; --prts-pickup-delay: -.4s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(11){--prts-pickup-duration: 560ms; --prts-pickup-delay: -.3s}@media (prefers-reduced-motion: no-preference){html[data-dsh-prts]:not([data-prts-motion=\"reduced\"]) [data-prts-session-row]:hover [data-prts-session-pickup-indicator]{animation: prts-session-record-indicator 1.1s ease-in-out infinite}html[data-dsh-prts]:not([data-prts-motion=\"reduced\"]) [data-prts-session-row]:hover [data-prts-session-pickup-bar]{animation: prts-session-pickup-sample var(--prts-pickup-duration) ease-in-out var(--prts-pickup-delay) infinite}}@keyframes prts-session-record-indicator{0%,100%{opacity: .45}50%{opacity: 1}}@keyframes prts-session-pickup-sample{0%,100%{transform: scaleY(.28)}34%{transform: scaleY(1.08)}57%{transform: scaleY(.46)}78%{transform: scaleY(.86)}}html[data-dsh-prts] [data-prts-session-row]{--prts-facility-texture-color: var(--prts-muted); --prts-session-pickup-fill: #f3f6f7}html[data-dsh-prts][data-prts-scheme=\"light\"] [data-prts-session-row]{--prts-session-pickup-fill: #3f4d56}html[data-dsh-prts] [data-prts-session-row][aria-selected=\"true\"]{--prts-facility-texture-color: var(--prts-yellow)}html[data-dsh-prts] [data-prts-workspace-row] > [data-prts-facility-spine],html[data-dsh-prts] [data-prts-session-row] > [data-prts-facility-spine]{--prts-facility-surface: var(--prts-line-strong); position: absolute !important; z-index: 2 !important; inset: 0 auto 0 0; height: 100% !important; isolation: isolate; width: var(--prts-spine-width); min-width: 0; transform: scaleX(var(--prts-spine-rest)) !important; transform-origin: left center; transition: transform 220ms var(--prts-ease-spring); pointer-events: none}html[data-dsh-prts] [data-prts-workspace-row] > [data-prts-facility-spine]{--prts-facility-surface: var(--prts-cyan)}html[data-dsh-prts] [data-prts-session-row][aria-selected=\"true\"] > [data-prts-facility-spine]{--prts-facility-surface: var(--prts-yellow)}html[data-dsh-prts] [data-prts-facility-spine] [data-prts-facility-layer=\"outline\"]{display: none}html[data-dsh-prts] [data-prts-workspace-row][aria-expanded=\"true\"] > [data-prts-facility-spine],html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) > [data-prts-facility-spine],html[data-dsh-prts] [data-prts-session-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) > [data-prts-facility-spine]{transform: scaleX(1) !important}html[data-dsh-prts] [data-prts-workspace-row][data-prts-spine-vector]::before,html[data-dsh-prts] [data-prts-session-row][data-prts-spine-vector]::before{content: none !important; display: none !important}html[data-dsh-prts] [data-prts-facility-face][data-prts-facility-vector]{border: 0 !important; background: transparent !important; clip-path: none !important}html[data-dsh-prts] [data-prts-facility-face][data-prts-facility-vector]::after{content: none !important; display: none !important}html[data-dsh-prts] :is( [data-prts-workspace-actions],[data-prts-session-actions] ) button[data-prts-facility-vector]{--prts-facility-outline: var(--prts-line); --prts-facility-surface: var(--prts-panel-raised); overflow: visible; border: 0 !important; background: transparent !important; clip-path: none !important}html[data-dsh-prts] :is( [data-prts-workspace-actions],[data-prts-session-actions] ) button[data-prts-facility-vector]::before{content: none !important; display: none !important}html[data-dsh-prts] :is( [data-prts-workspace-actions],[data-prts-session-actions] ) button[data-prts-facility-vector]:is(:hover,:focus-visible){--prts-facility-outline: var(--prts-yellow); background: transparent !important}html[data-dsh-prts] [data-message-role]::before,html[data-dsh-prts] [data-chat-flow-kind]::before{content: none !important; display: none !important}html[data-dsh-prts] [data-conversation-scroll]:not([data-prts-hero-active])[data-prts-conversation-scale-ready]::before,html[data-dsh-prts] [data-conversation-scroll]:not([data-prts-hero-active])[data-prts-conversation-scale-empty]::before{content: none !important; display: none !important}html[data-dsh-prts] [data-prts-conversation-scale]{position: absolute; z-index: 8; width: 32px; min-height: 84px; margin: 0; padding: 0; overflow: hidden; opacity: .54; visibility: visible; transition: opacity 100ms ease,filter 150ms ease,visibility 0s linear; pointer-events: auto; touch-action: none; cursor: pointer; isolation: isolate}html[data-dsh-prts] [data-prts-conversation-scale][data-prts-resizing]{opacity: .38; filter: none; transition: none}html[data-dsh-prts] [data-prts-conversation-scale][data-prts-resizing] :is( [data-prts-conversation-scale-accent],[data-prts-conversation-scale-history] ){filter: none; transition: none}html[data-dsh-prts] [data-prts-conversation-scale]:is( [data-prts-conversation-scale-obstructed],[data-prts-conversation-scale-space-obstructed] ){opacity: 0; visibility: hidden; transition-delay: 0s,0s,100ms; pointer-events: none}html[data-dsh-prts] [data-prts-conversation-scale][data-prts-conversation-scale-blocked]{opacity: 0; visibility: hidden; transition: none; pointer-events: none}html[data-dsh-prts] [data-prts-conversation-scale]:focus{outline: none}html[data-dsh-prts] [data-prts-conversation-scale]:focus-visible{filter: drop-shadow(0 0 7px color-mix(in srgb,var(--prts-cyan) 34%,transparent))}html[data-dsh-prts] [data-prts-conversation-scale-svg]{position: absolute; inset: 0; display: block; width: 100%; height: 100%; overflow: hidden; shape-rendering: geometricPrecision}html[data-dsh-prts] [data-prts-conversation-scale-marks]{pointer-events: none}html[data-dsh-prts] :is( [data-prts-conversation-scale-gray],[data-prts-conversation-scale-accent],[data-prts-conversation-scale-history] ){fill: none; stroke-width: 1; stroke-linecap: square; vector-effect: non-scaling-stroke; pointer-events: none}html[data-dsh-prts] [data-prts-conversation-scale-gray]{stroke: color-mix(in srgb,var(--prts-muted) 76%,var(--prts-line-strong))}html[data-dsh-prts] [data-prts-conversation-scale-accent]{stroke: var(--prts-yellow); filter: drop-shadow(0 0 4px color-mix(in srgb,var(--prts-yellow) 42%,transparent))}html[data-dsh-prts] [data-prts-conversation-scale-history]{stroke: var(--prts-cyan); stroke-width: 1.5; filter: drop-shadow(0 0 4px color-mix(in srgb,var(--prts-cyan) 38%,transparent))}html[data-dsh-prts] [data-prts-conversation-scale-history]{transition: stroke-width 100ms ease,filter 120ms ease}html[data-dsh-prts] [data-prts-conversation-scale][data-prts-conversation-history-selected] [data-prts-conversation-scale-history]{stroke-width: 2.5; filter: drop-shadow(0 0 3px color-mix(in srgb,var(--prts-cyan) 78%,transparent)) drop-shadow(0 0 8px color-mix(in srgb,var(--prts-cyan) 48%,transparent))}html[data-dsh-prts] [data-prts-conversation-history-hint],html[data-dsh-prts] [data-prts-conversation-history-hint] *{box-sizing: border-box}html[data-dsh-prts] [data-prts-conversation-history-hint]{position: absolute; z-index: 13; height: 8px; transform: translateY(-50%); pointer-events: auto}html[data-dsh-prts] [data-prts-conversation-history-hint][hidden],html[data-dsh-prts] [data-prts-conversation-history-tooltip][hidden]{display: none}html[data-dsh-prts] [data-prts-conversation-history-trigger]{width: 30px; min-width: 30px; height: 8px; min-height: 8px; max-height: 8px; padding: 0; display: block; border: 0; border-radius: 0; opacity: 0; background: transparent; cursor: pointer}html[data-dsh-prts] [data-prts-conversation-history-tooltip]{position: absolute; top: var(--prts-history-tooltip-top,50%); left: calc(100% + 10px); width: 360px; height: 128px; margin: 0; padding: 1px; overflow: visible; border: 0; background: var(--prts-line-strong); color: var(--prts-ink); clip-path: polygon( 3px 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px ); opacity: .98; transform: translate3d(0,0,0); pointer-events: none; isolation: isolate; animation: prts-conversation-history-tooltip-in 120ms var(--prts-ease-snap)}html[data-dsh-prts] [data-prts-conversation-history-tooltip]::before{content: \"\"; position: absolute; z-index: 0; inset: 1px; background: var(--prts-active-glass); clip-path: polygon( 2px 0,calc(100% - 2px) 0,100% 2px,100% calc(100% - 2px),calc(100% - 2px) 100%,2px 100%,0 calc(100% - 2px),0 2px ); backdrop-filter: var(--prts-active-glass-filter); -webkit-backdrop-filter: var(--prts-active-glass-filter)}html[data-dsh-prts] [data-prts-conversation-history-tooltip] [data-prts-conversation-preview-row=\"question\"] b{color: var(--prts-cyan)}html[data-dsh-prts] [data-prts-conversation-history-tooltip-label]{overflow: hidden; color: var(--prts-ink); text-overflow: ellipsis; white-space: nowrap}html[data-dsh-prts] [data-prts-conversation-history-tooltip-content]{min-width: 0; display: grid; gap: 3px}html[data-dsh-prts] [data-prts-conversation-history-tooltip-content] strong{color: var(--prts-ink); font-size: 15px; font-weight: 750}html[data-dsh-prts] [data-prts-conversation-history-tooltip-content] span{overflow: hidden; color: var(--prts-muted); font-size: 12px; text-overflow: ellipsis; white-space: nowrap}html[data-dsh-prts] [data-prts-conversation-history-tooltip-connector]{position: absolute; z-index: 2; top: var(--prts-history-tooltip-anchor-y,50%); right: 100%; width: 14px; height: 1px; background: linear-gradient(90deg,var(--prts-cyan),var(--prts-line-strong)); transform: translateY(-.5px); pointer-events: none}html[data-dsh-prts] [data-prts-conversation-history-tooltip-connector]::before{content: \"\"; position: absolute; top: -1px; left: 0; width: 3px; height: 3px; background: var(--prts-cyan)}@keyframes prts-conversation-history-tooltip-in{from{opacity: 0; transform: translate3d(-4px,0,0)}to{opacity: .98; transform: translate3d(0,0,0)}}html[data-dsh-prts] [data-prts-conversation-scale-hit]{pointer-events: all}html[data-dsh-prts] [data-prts-conversation-history-status],html[data-dsh-prts] [data-prts-conversation-history-status] *{box-sizing: border-box}html[data-dsh-prts] [data-prts-conversation-history-status]{position: absolute; z-index: 13; min-height: 34px; max-width: min(320px,calc(100% - 72px)); display: flex; align-items: center; gap: 10px; padding: 5px 6px 5px 10px; border: 1px solid var(--prts-line-strong); background: var(--prts-active-glass); color: var(--prts-ink); box-shadow: 0 8px 22px color-mix(in srgb,var(--prts-canvas) 22%,transparent); clip-path: polygon(3px 0,100% 0,100% calc(100% - 3px),calc(100% - 3px) 100%,0 100%,0 3px); font: 700 12px/1.35 var(--prts-mono); backdrop-filter: var(--prts-active-glass-filter); -webkit-backdrop-filter: var(--prts-active-glass-filter)}html[data-dsh-prts] [data-prts-conversation-history-status][hidden]{display: none}html[data-dsh-prts] [data-prts-conversation-history-text]{min-width: 0}html[data-dsh-prts] [data-prts-conversation-history-action]{min-width: 44px; min-height: 24px; padding: 3px 8px; border: 1px solid var(--prts-cyan); border-radius: 0; background: transparent; color: var(--prts-cyan); font: inherit; cursor: pointer}html[data-dsh-prts] [data-prts-conversation-history-status][data-prts-history-phase=\"error\"]{border-color: var(--prts-yellow)}html[data-dsh-prts] [data-prts-conversation-history-status][data-prts-history-phase=\"loading\"]{color: var(--prts-cyan)}html[data-dsh-prts] [data-prts-conversation-preview]{--prts-preview-anchor-y: 46px; position: absolute; z-index: 12; width: 360px; max-width: calc(100% - 64px); height: 128px; margin: 0; padding: 1px; overflow: visible; border: 0; background: var(--prts-line-strong); color: var(--prts-ink); clip-path: polygon( 3px 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px ); opacity: 0; visibility: hidden; transform: translate3d(-4px,0,0); transition: opacity 100ms ease,transform 120ms var(--prts-ease-snap),visibility 0s linear 120ms; pointer-events: none; isolation: isolate}html[data-dsh-prts] [data-prts-conversation-preview]::before{content: \"\"; position: absolute; z-index: 0; inset: 1px; background: var(--prts-active-glass); clip-path: polygon( 2px 0,calc(100% - 2px) 0,100% 2px,100% calc(100% - 2px),calc(100% - 2px) 100%,2px 100%,0 calc(100% - 2px),0 2px ); backdrop-filter: var(--prts-active-glass-filter); -webkit-backdrop-filter: var(--prts-active-glass-filter)}html[data-dsh-prts] [data-prts-conversation-preview][data-prts-conversation-preview-visible]{opacity: .98; visibility: visible; transform: translate3d(0,0,0); transition-delay: 0s}html[data-dsh-prts] [data-prts-conversation-preview-connector]{position: absolute; z-index: 2; top: var(--prts-preview-anchor-y); right: 100%; width: 14px; height: 1px; background: linear-gradient(90deg,var(--prts-yellow),var(--prts-line-strong)); transform: translateY(-.5px); pointer-events: none}html[data-dsh-prts] [data-prts-conversation-preview-connector]::before{content: \"\"; position: absolute; top: -1px; left: 0; width: 3px; height: 3px; background: var(--prts-yellow)}html[data-dsh-prts] [data-prts-conversation-preview-body]{position: relative; z-index: 1; height: 100%; display: grid; grid-template-rows: 32px minmax(0,1fr); padding: 10px 14px 12px; font-family: var(--prts-mono)}html[data-dsh-prts] [data-prts-conversation-preview-row]{min-width: 0; display: grid; grid-template-columns: 24px minmax(0,1fr); column-gap: 8px; align-items: start; font-size: 15px; line-height: 1.45}html[data-dsh-prts] [data-prts-conversation-preview-row] b{font-size: 14px; font-weight: 750; line-height: 1.55; letter-spacing: .08em}html[data-dsh-prts] [data-prts-conversation-preview-row=\"question\"]{border-bottom: 1px solid color-mix(in srgb,var(--prts-line) 72%,transparent); color: var(--prts-ink)}html[data-dsh-prts] [data-prts-conversation-preview-row=\"question\"] b{color: var(--prts-yellow)}html[data-dsh-prts] [data-prts-conversation-preview-row=\"answer\"]{padding-top: 6px; color: var(--prts-muted)}html[data-dsh-prts] [data-prts-conversation-preview-row=\"answer\"] b{color: var(--prts-cyan)}html[data-dsh-prts] [data-prts-conversation-preview-question]{display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap}html[data-dsh-prts] [data-prts-conversation-preview-answer]{display: -webkit-box; overflow: hidden; -webkit-box-orient: vertical; -webkit-line-clamp: 3}html[data-dsh-prts] [data-prts-conversation-preview][data-prts-preview-state=\"streaming\"] [data-prts-conversation-preview-answer]{color: var(--prts-yellow)}html[data-dsh-prts] [data-prts-conversation-scale][data-prts-conversation-scale-empty]{display: none}@media (max-width: 640px){html[data-dsh-prts] :is( [data-prts-conversation-scale],[data-prts-conversation-preview],[data-prts-conversation-history-hint],[data-prts-conversation-history-status] ){display: none !important}}@media (prefers-reduced-motion: reduce){html[data-dsh-prts] [data-prts-conversation-scale],html[data-dsh-prts] [data-prts-conversation-preview],html[data-dsh-prts] [data-prts-conversation-history-hint],html[data-dsh-prts] [data-prts-conversation-history-tooltip],html[data-dsh-prts] :is( [data-prts-conversation-scale-gray],[data-prts-conversation-scale-accent],[data-prts-conversation-scale-history] ){animation: none !important; transition: none !important}}html[data-dsh-prts] [data-prts-startup]{--prts-startup-bg: #07090b; --prts-startup-ink: #e8edef; --prts-startup-muted: #7d898f; --prts-startup-line: #394349; --prts-startup-accent: #f0c800; --prts-startup-progress: 0; position: fixed; z-index: 2147480000; inset: 0; width: 100vw; max-width: none; height: 100dvh; max-height: none; min-height: 100dvh; margin: 0; padding: 0; border: 0; overflow: hidden; isolation: isolate; box-sizing: border-box; background: transparent; color: var(--prts-startup-ink); font-family: var(--prts-body,sans-serif); opacity: 0; outline: 0; pointer-events: auto; transition: opacity 120ms ease}html[data-dsh-prts] [data-prts-startup]::before,html[data-dsh-prts] [data-prts-startup]::after{content: \"\"; position: absolute; z-index: -3; top: 0; bottom: 0; width: calc(50% + 2px); background: var(--prts-startup-bg); transition: transform 350ms cubic-bezier(.76,0,.24,1)}html[data-dsh-prts] [data-prts-startup]::before{left: 0}html[data-dsh-prts] [data-prts-startup]::after{right: 0}html[data-dsh-prts] [data-prts-startup][data-visible]{opacity: 1}html[data-dsh-prts] [data-prts-startup][data-exiting]::before{transform: translate3d(-101%,0,0)}html[data-dsh-prts] [data-prts-startup][data-exiting]::after{transform: translate3d(101%,0,0)}html[data-dsh-prts] [data-prts-startup-grid]{position: absolute; z-index: -2; inset: 0; opacity: 0; background: linear-gradient(90deg,transparent calc(50% - .5px),rgba(232,237,239,.17) 50%,transparent calc(50% + .5px)),linear-gradient(0deg,transparent calc(50% - .5px),rgba(232,237,239,.09) 50%,transparent calc(50% + .5px)),repeating-linear-gradient(90deg,rgba(232,237,239,.045) 0 1px,transparent 1px 80px),repeating-linear-gradient(0deg,rgba(232,237,239,.035) 0 1px,transparent 1px 80px); transform: scale3d(1.04,1.04,1); transition: opacity 220ms linear,transform 520ms cubic-bezier(.16,1,.3,1)}html[data-dsh-prts] [data-prts-startup][data-visible] [data-prts-startup-grid]{opacity: 1; transform: scale3d(1,1,1)}html[data-dsh-prts] [data-prts-startup-scan]{position: absolute; z-index: 4; top: -18%; right: 0; left: 0; height: 18%; opacity: 0; background: linear-gradient(180deg,transparent,rgba(240,200,0,.035) 68%,rgba(240,200,0,.24)); border-bottom: 1px solid rgba(240,200,0,.62); pointer-events: none}html[data-dsh-prts] [data-prts-startup][data-visible]:not([data-reduced-motion]) [data-prts-startup-scan]{opacity: 1; animation: prts-startup-scan 1100ms linear 120ms 2 both}html[data-dsh-prts] [data-prts-startup-cut]{position: absolute; z-index: 6; top: -15%; width: 8px; height: 130%; opacity: 0; background: var(--prts-startup-accent); transform: skewX(-13deg) translate3d(0,0,0); pointer-events: none}html[data-dsh-prts] [data-prts-startup-cut=\"left\"]{left: calc(50% - 4px)}html[data-dsh-prts] [data-prts-startup-cut=\"right\"]{right: calc(50% - 4px)}html[data-dsh-prts] [data-prts-startup][data-exiting] [data-prts-startup-cut=\"left\"]{animation: prts-startup-cut-left 350ms cubic-bezier(.76,0,.24,1) both}html[data-dsh-prts] [data-prts-startup][data-exiting] [data-prts-startup-cut=\"right\"]{animation: prts-startup-cut-right 350ms cubic-bezier(.76,0,.24,1) both}html[data-dsh-prts] [data-prts-startup-header]{position: absolute; z-index: 2; top: clamp(22px,4.5dvh,52px); right: clamp(22px,4vw,68px); left: clamp(22px,4vw,68px); display: flex; align-items: baseline; justify-content: space-between; gap: 24px; padding-bottom: 10px; border-bottom: 1px solid var(--prts-startup-line); opacity: 0; transform: translate3d(0,-9px,0); transition: opacity 180ms linear 60ms,transform 320ms cubic-bezier(.16,1,.3,1) 60ms}html[data-dsh-prts] [data-prts-startup][data-visible] [data-prts-startup-header]{opacity: 1; transform: translate3d(0,0,0)}html[data-dsh-prts] [data-prts-startup-header] span{font: 800 clamp(10px,1vw,13px)/1 var(--prts-display,sans-serif); letter-spacing: .18em}html[data-dsh-prts] [data-prts-startup-header] small,html[data-dsh-prts] [data-prts-startup-telemetry],html[data-dsh-prts] [data-prts-startup-coordinate]{color: var(--prts-startup-muted); font: 700 8px/1.35 var(--prts-mono,monospace); letter-spacing: .12em}html[data-dsh-prts] [data-prts-startup-telemetry]{position: absolute; z-index: 2; top: 50%; left: clamp(22px,4vw,68px); display: grid; gap: 12px; padding-left: 12px; border-left: 2px solid var(--prts-startup-accent); opacity: 0; transform: translate3d(-9px,-50%,0); transition: opacity 200ms linear 100ms,transform 360ms cubic-bezier(.16,1,.3,1) 100ms}html[data-dsh-prts] [data-prts-startup][data-visible] [data-prts-startup-telemetry]{opacity: 1; transform: translate3d(0,-50%,0)}html[data-dsh-prts] [data-prts-startup-core]{position: absolute; z-index: 3; top: 49%; left: 50%; width: min(76vw,560px); display: grid; justify-items: center; gap: clamp(15px,2.4dvh,26px); transform: translate3d(-50%,-50%,0)}html[data-dsh-prts] [data-prts-startup-frame]{position: relative; width: clamp(220px,27vw,320px); aspect-ratio: 1; display: grid; place-items: center}html[data-dsh-prts] [data-prts-startup-frame-outer],html[data-dsh-prts] [data-prts-startup-frame-inner]{position: absolute; inset: 15%; border: 1px solid var(--prts-startup-line); opacity: 0; transform: rotate(45deg) scale3d(.72,.72,1); transition: opacity 160ms linear,transform 420ms cubic-bezier(.16,1,.3,1)}html[data-dsh-prts] [data-prts-startup-frame-inner]{inset: 23%; border-color: rgba(240,200,0,.76); transform: rotate(-45deg) scale3d(.68,.68,1); transition-delay: 80ms}html[data-dsh-prts] [data-prts-startup-reticle]{position: absolute; inset: 7%; opacity: 0; background: linear-gradient(var(--prts-startup-accent),var(--prts-startup-accent)) 50% 0 / 1px 15% no-repeat,linear-gradient(var(--prts-startup-accent),var(--prts-startup-accent)) 50% 100% / 1px 15% no-repeat,linear-gradient(90deg,var(--prts-startup-accent),var(--prts-startup-accent)) 0 50% / 15% 1px no-repeat,linear-gradient(90deg,var(--prts-startup-accent),var(--prts-startup-accent)) 100% 50% / 15% 1px no-repeat; transform: scale3d(.8,.8,1); transition: opacity 160ms linear,transform 400ms cubic-bezier(.16,1,.3,1)}html[data-dsh-prts] [data-prts-startup-emblem]{position: relative; z-index: 2; width: 180px; max-width: 62%; height: auto; display: block; opacity: 0; clip-path: inset(48% 0 48% 0); transform: scale3d(.96,.96,1); transition: opacity 160ms linear,clip-path 380ms cubic-bezier(.16,1,.3,1),transform 420ms cubic-bezier(.16,1,.3,1)}html[data-dsh-prts] [data-prts-startup][data-stage=\"linking\"] [data-prts-startup-frame-outer],html[data-dsh-prts] [data-prts-startup][data-stage=\"authenticating\"] [data-prts-startup-frame-outer],html[data-dsh-prts] [data-prts-startup][data-stage=\"visualOnline\"] [data-prts-startup-frame-outer],html[data-dsh-prts] [data-prts-startup][data-stage=\"ready\"] [data-prts-startup-frame-outer]{opacity: .92; transform: rotate(45deg) scale3d(1,1,1)}html[data-dsh-prts] [data-prts-startup][data-stage=\"authenticating\"] :is([data-prts-startup-frame-inner],[data-prts-startup-reticle]),html[data-dsh-prts] [data-prts-startup][data-stage=\"visualOnline\"] :is([data-prts-startup-frame-inner],[data-prts-startup-reticle]),html[data-dsh-prts] [data-prts-startup][data-stage=\"ready\"] :is([data-prts-startup-frame-inner],[data-prts-startup-reticle]){opacity: 1; transform: rotate(-45deg) scale3d(1,1,1)}html[data-dsh-prts] [data-prts-startup][data-stage=\"authenticating\"] [data-prts-startup-reticle],html[data-dsh-prts] [data-prts-startup][data-stage=\"visualOnline\"] [data-prts-startup-reticle],html[data-dsh-prts] [data-prts-startup][data-stage=\"ready\"] [data-prts-startup-reticle]{transform: scale3d(1,1,1)}html[data-dsh-prts] [data-prts-startup][data-stage=\"visualOnline\"] [data-prts-startup-emblem],html[data-dsh-prts] [data-prts-startup][data-stage=\"ready\"] [data-prts-startup-emblem]{opacity: 1; clip-path: inset(0 0 0 0); transform: scale3d(1,1,1)}html[data-dsh-prts] [data-prts-startup-signature]{min-height: 44px; display: flex; align-items: center; gap: 10px; opacity: 0; transform: translate3d(0,8px,0); transition: opacity 180ms linear,transform 230ms cubic-bezier(.16,1,.3,1)}html[data-dsh-prts] [data-prts-startup-signature] > span,html[data-dsh-prts] [data-prts-startup-signature] svg{width: 42px; height: 42px; display: block}html[data-dsh-prts] [data-prts-startup-signature] small{color: var(--prts-startup-muted); font: 800 8px/1.3 var(--prts-mono,monospace); letter-spacing: .1em}html[data-dsh-prts] [data-prts-startup][data-stage=\"ready\"] [data-prts-startup-signature]{opacity: 1; transform: translate3d(0,0,0)}html[data-dsh-prts] [data-prts-startup-state]{display: grid; justify-items: center; gap: 6px; text-align: center; opacity: 1; transform: translate3d(0,0,0); transition: opacity 90ms linear,transform 90ms cubic-bezier(.4,0,1,1)}html[data-dsh-prts] [data-prts-startup][data-copy-transition] [data-prts-startup-state]{opacity: 0; transform: translate3d(0,-4px,0)}html[data-dsh-prts] [data-prts-startup-state] strong{font: 900 clamp(18px,2.4vw,30px)/1 var(--prts-display,sans-serif); letter-spacing: .16em}html[data-dsh-prts] [data-prts-startup-state] span{color: var(--prts-startup-muted); font: 700 10px/1.2 var(--prts-mono,monospace); letter-spacing: .12em}html[data-dsh-prts] [data-prts-startup-progress]{position: absolute; z-index: 3; right: clamp(22px,7vw,120px); bottom: clamp(28px,6dvh,70px); left: clamp(22px,7vw,120px); display: grid; gap: 10px; opacity: 0; transform: translate3d(0,10px,0); transition: opacity 220ms linear 100ms,transform 480ms cubic-bezier(.16,1,.3,1) 100ms}html[data-dsh-prts] [data-prts-startup][data-visible] [data-prts-startup-progress]{opacity: 1; transform: translate3d(0,0,0)}html[data-dsh-prts] [data-prts-startup-progress] output{justify-self: start; color: var(--prts-startup-muted); font: 800 9px/1 var(--prts-mono,monospace); letter-spacing: .12em}html[data-dsh-prts] [data-prts-startup-percent]{color: var(--prts-startup-ink)}html[data-dsh-prts] [data-prts-startup-track]{position: relative; height: 18px; border-top: 1px solid var(--prts-startup-line)}html[data-dsh-prts] [data-prts-startup-fill]{position: absolute; top: -2px; right: 0; left: 0; height: 3px; background: var(--prts-startup-accent); transform: scaleX(var(--prts-startup-progress)); transform-origin: left center; will-change: transform}html[data-dsh-prts] [data-prts-startup-ticks]{position: absolute; inset: 4px 0 0; display: grid; grid-template-columns: repeat(21,minmax(0,1fr))}html[data-dsh-prts] [data-prts-startup-ticks] i{width: 1px; height: 4px; background: var(--prts-startup-line)}html[data-dsh-prts] [data-prts-startup-ticks] i[data-major]{height: 9px; background: var(--prts-startup-muted)}html[data-dsh-prts] [data-prts-startup-coordinate]{position: absolute; right: clamp(22px,4vw,68px); top: 50%; writing-mode: vertical-rl; transform: translateY(-50%)}html[data-dsh-prts] [data-prts-startup][data-exit-content] > :not([data-prts-startup-cut]){opacity: 0; transition: opacity 120ms linear}html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-grid],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-header],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-telemetry],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-coordinate],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-state],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-frame-outer],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-frame-inner],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-reticle],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-emblem],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-signature],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-progress]{opacity: 1; clip-path: none; transform: none; animation: none; transition: none}html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-frame-outer]{transform: rotate(45deg)}html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-frame-inner]{transform: rotate(-45deg)}html[data-dsh-prts] [data-prts-startup][data-reduced-motion]{transition: opacity 160ms ease}html[data-dsh-prts] [data-prts-startup][data-reduced-motion][data-exiting]{opacity: 0}html[data-dsh-prts] [data-prts-startup][data-reduced-motion][data-exiting] > :not([data-prts-startup-cut]){opacity: 1}html[data-dsh-prts] [data-prts-startup][data-reduced-motion]::before,html[data-dsh-prts] [data-prts-startup][data-reduced-motion]::after{transform: none; transition: none}html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-cut]{display: none}@keyframes prts-startup-scan{from{transform: translate3d(0,0,0)}to{transform: translate3d(0,660%,0)}}@keyframes prts-startup-cut-left{0%{opacity: 0; transform: skewX(-13deg) translate3d(0,0,0)}18%{opacity: 1}100%{opacity: 0; transform: skewX(-13deg) translate3d(-50vw,0,0)}}@keyframes prts-startup-cut-right{0%{opacity: 0; transform: skewX(-13deg) translate3d(0,0,0)}18%{opacity: .72}100%{opacity: 0; transform: skewX(-13deg) translate3d(50vw,0,0)}}@media (max-width: 640px){html[data-dsh-prts] [data-prts-startup-header]{right: 18px; left: 18px}html[data-dsh-prts] [data-prts-startup-header] small,html[data-dsh-prts] [data-prts-startup-telemetry],html[data-dsh-prts] [data-prts-startup-coordinate]{display: none}html[data-dsh-prts] [data-prts-startup-core]{top: 47%; width: calc(100vw - 32px)}html[data-dsh-prts] [data-prts-startup-frame]{width: min(66vw,240px)}html[data-dsh-prts] [data-prts-startup-signature] > span,html[data-dsh-prts] [data-prts-startup-signature] svg{width: 34px; height: 34px}html[data-dsh-prts] [data-prts-startup-state] strong{max-width: 94vw; font-size: clamp(15px,5vw,22px); letter-spacing: .1em}html[data-dsh-prts] [data-prts-startup-progress]{right: 20px; bottom: max(28px,env(safe-area-inset-bottom)); left: 20px}}@media (prefers-reduced-motion: reduce){html[data-dsh-prts] [data-prts-startup] *,html[data-dsh-prts] [data-prts-startup]::before,html[data-dsh-prts] [data-prts-startup]::after{animation: none !important}}";
|
|
6
|
+
const PRTS_VERSION = "0.1.95";
|
|
7
|
+
const PRTS_CSS = "html[data-dsh-prts]{--prts-canvas: #080a0c; --prts-canvas-elevated: #0d1114; --prts-rail: #060809; --prts-panel: #11161a; --prts-panel-raised: #171d21; --prts-panel-muted: #20272c; --prts-ink: #edf1f2; --prts-muted: #98a3a9; --prts-dim: #68747a; --prts-line: #38434a; --prts-line-strong: #5e6a70; --prts-yellow: #f0c800; --prts-yellow-ink: #161300; --prts-cyan: #5ccddb; --prts-red: #ee625a; --prts-green: #8fcf79; --dsw-alias-label-primary-inverted: #15191c; --prts-host-top-inset: 0px; --prts-rail-width: 52px; --prts-nav-width: 52px; --prts-sessions-width: 286px; --prts-sessions-compact: 54px; --prts-workspace-height: 38px; --prts-session-height: 36px; --prts-facility-gap: 7px; --prts-facility-height: var(--prts-workspace-height); --prts-spine-width: 8px; --prts-spine-rest: .25; --prts-spine-travel: 6px; --prts-chamfer: 3px; --prts-radius-control: 3px; --prts-radius-card: 3px; --prts-radius-overlay: 4px; --prts-body: 'Noto Sans SC','Microsoft YaHei UI','Segoe UI',sans-serif; --prts-display: 'Arial Narrow','Noto Sans SC',sans-serif; --prts-mono: 'Roboto Mono','Noto Sans Mono CJK SC',Consolas,monospace; --prts-ease-spring: cubic-bezier(.2,.86,.28,1.16); --prts-ease-snap: cubic-bezier(.22,1,.36,1); --prts-shadow-glass-overlay: 0 18px 48px rgba(0,0,0,.32),inset 0 1px rgba(255,255,255,.06); --prts-glass-border: rgba(119,140,150,.52); --prts-glass-soft-surface: rgba(15,21,25,.82); --prts-glass-standard-surface: rgba(15,21,25,.9); --prts-glass-clear-surface: rgba(15,21,25,.72); --prts-glass-dense: rgba(7,10,12,.94); --prts-active-glass: var(--prts-glass-standard-surface); --prts-active-glass-filter: blur(18px) saturate(145%); color-scheme: dark; accent-color: var(--prts-yellow)}html[data-dsh-prts][data-prts-scheme=\"dark\"]{color-scheme: dark}html[data-dsh-prts][data-prts-scheme=\"light\"]{--prts-canvas: #eef1f3; --prts-canvas-elevated: #e5eaed; --prts-rail: #111518; --prts-panel: #f7f9fa; --prts-panel-raised: #e5eaed; --prts-panel-muted: #d5dde1; --prts-ink: #15191c; --prts-muted: #4f5c63; --prts-dim: #738087; --prts-line: #9eabb1; --prts-line-strong: #65727a; --dsw-alias-label-primary-inverted: #edf1f2; --prts-glass-border: rgba(62,82,92,.48); --prts-glass-soft-surface: rgba(247,250,251,.9); --prts-glass-standard-surface: rgba(244,249,251,.94); --prts-glass-clear-surface: rgba(244,249,251,.78); --prts-glass-dense: rgba(249,251,252,.97); --prts-shadow-glass-overlay: 0 18px 44px rgba(48,63,70,.18),inset 0 1px rgba(255,255,255,.86); color-scheme: light}html[data-dsh-prts][data-prts-glass=\"soft\"]{--prts-active-glass: var(--prts-glass-soft-surface); --prts-active-glass-filter: blur(18px) saturate(145%)}html[data-dsh-prts][data-prts-glass=\"standard\"]{--prts-active-glass: var(--prts-glass-standard-surface); --prts-active-glass-filter: blur(22px) saturate(155%)}html[data-dsh-prts][data-prts-glass=\"clear\"]{--prts-active-glass: var(--prts-glass-clear-surface); --prts-active-glass-filter: blur(28px) saturate(180%)}html[data-dsh-prts][data-prts-glass=\"off\"]{--prts-active-glass: var(--prts-panel); --prts-active-glass-filter: none}html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] ),html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] )::before,html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] )::after{box-sizing: border-box}html[data-dsh-prts] body{--dsw-alias-bg-base: var(--prts-canvas); --dsw-alias-bg-layer-1: var(--prts-panel); --dsw-alias-bg-layer-2: var(--prts-panel-raised); --dsw-alias-bg-layer-3: var(--prts-panel-muted); --dsw-alias-label-primary: var(--prts-ink); --dsw-alias-label-secondary: var(--prts-muted); --dsw-alias-border-l2: var(--prts-line); min-height: 100dvh; margin: 0; overflow: hidden; background: var(--prts-canvas); color: var(--prts-ink); font-family: var(--prts-body)}html[data-dsh-prts] ::selection{background: var(--prts-yellow); color: var(--prts-yellow-ink)}html[data-dsh-prts] a{color: var(--prts-cyan); text-underline-offset: 3px}html[data-dsh-prts] [data-prts-shell] :is(button,input,textarea,select),html[data-dsh-prts] [data-prts-theme-settings] :is(button,input,textarea,select){font: inherit}html[data-dsh-prts] [data-prts-shell] button,html[data-dsh-prts] [data-prts-theme-settings] button{color: inherit}html[data-dsh-prts] :focus-visible{outline: 2px solid var(--prts-yellow) !important; outline-offset: 2px !important}html[data-dsh-prts] [hidden]{display: none !important}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"]{--prts-nav-width: 0px}html[data-dsh-prts] [data-prts-shell]{position: fixed; z-index: 124; inset: var(--prts-host-top-inset) auto 0 0; width: var(--prts-nav-width); pointer-events: none; font-family: var(--prts-mono)}html[data-dsh-prts] [data-prts-shell] button,html[data-dsh-prts] [data-prts-nav-rail]{pointer-events: auto}html[data-dsh-prts] [data-prts-topbar]{display: none}html[data-dsh-prts] [data-prts-nav-rail]{position: fixed; z-index: 120; inset: var(--prts-host-top-inset) auto 0 0; width: var(--prts-rail-width); display: flex; flex-direction: column; align-items: stretch; border-right: 1px solid #30383d; background: var(--prts-rail); color: #e8edef; box-shadow: 4px 0 18px rgba(0,0,0,.18)}html[data-dsh-prts] [data-prts-rail-launcher]{display: none}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-nav-rail]{opacity: 0; visibility: hidden; transform: translate3d(-100%,0,0); transition: transform 180ms var(--prts-ease-snap),opacity 120ms ease,visibility 0s linear 180ms; pointer-events: none}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"][data-prts-rail-open] [data-prts-nav-rail]{opacity: 1; visibility: visible; transform: translate3d(0,0,0); transition-delay: 0s; pointer-events: auto}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"][data-prts-rail-open] [data-prts-rail-launcher]{opacity: 0; visibility: hidden; pointer-events: none}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher]{position: fixed; z-index: 121; top: 50%; left: 0; width: 12px; height: 96px; display: grid; place-items: center; padding: 0; overflow: hidden; border: 1px solid color-mix(in srgb,var(--prts-yellow) 40%,transparent); border-left: 0; border-radius: 0 3px 3px 0; opacity: .34; background: color-mix(in srgb,var(--prts-rail) 86%,transparent); color: var(--prts-yellow); font: 700 8px/1 var(--prts-mono); letter-spacing: .08em; transform: translateY(-50%); transition: width 140ms var(--prts-ease-snap),opacity 120ms ease,background-color 120ms ease; cursor: pointer}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher] > span{opacity: 0; writing-mode: vertical-rl; transition: opacity 100ms ease}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher]:is(:hover,:focus-visible){width: 40px; opacity: 1; background: var(--prts-rail)}html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher]:is(:hover,:focus-visible) > span{opacity: 1}@media (hover: none),(pointer: coarse){html[data-dsh-prts][data-prts-rail-mode=\"overlay\"] [data-prts-rail-launcher]{top: 50%; width: 24px; height: 88px; opacity: .58; transform: translateY(-50%); touch-action: none}html[data-dsh-prts] [data-prts-rail-launcher] > span{opacity: 0}html[data-dsh-prts] [data-prts-rail-launcher][data-prts-rail-gesture-active]{width: 40px; opacity: 1}html[data-dsh-prts] [data-prts-rail-gesture-cue]{position: absolute; inset: calc(27px + var(--prts-rail-gesture-progress,0px)) 10px auto auto; display: block; opacity: 0; font: 700 14px/8px sans-serif}html[data-dsh-prts] [data-prts-rail-gesture-active] [data-prts-rail-gesture-cue]{opacity: 1; animation: prts-rail-swipe-cue 720ms ease-in-out infinite}html[data-dsh-prts] [data-prts-rail-gesture-ready] [data-prts-rail-gesture-cue]{filter: drop-shadow(0 0 3px currentColor)}}@keyframes prts-rail-swipe-cue{50%{opacity: .45}}html[data-dsh-prts] [data-prts-rail-brand]{height: 64px; display: grid; place-items: center; padding: 8px 5px; border-bottom: 1px solid #30383d; overflow: hidden}html[data-dsh-prts] [data-prts-rail-brand] svg{width: 38px; height: 38px; color: #edf1f2}html[data-dsh-prts] [data-prts-rail-brand] > span{position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0)}html[data-dsh-prts] [data-prts-nav-rail] > button{position: relative; width: 100%; min-height: 52px; display: grid; place-items: center; gap: 2px; padding: 7px 2px 6px; border: 0; border-bottom: 1px solid #242b2f; background: transparent; color: #9fa9ae; cursor: pointer; clip-path: polygon(0 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,0 100%)}html[data-dsh-prts] [data-prts-nav-rail] > button::after{content: \"\"; position: absolute; inset: 8px auto 8px 0; width: 2px; background: transparent}html[data-dsh-prts] [data-prts-nav-rail] > button:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-nav-rail] > button[aria-expanded=\"true\"]{background: #151a1d; color: #f0f3f4}html[data-dsh-prts] [data-prts-nav-rail] > button[aria-expanded=\"true\"]::after{background: var(--prts-yellow)}html[data-dsh-prts] [data-prts-nav-rail] > button:active{transform: translateY(1px) scale(.98)}html[data-dsh-prts] [data-prts-nav-rail] b{font-size: 15px; line-height: 1}html[data-dsh-prts] [data-prts-nav-rail] small{font-size: 8px; letter-spacing: .04em}html[data-dsh-prts] [data-prts-nav-bottom]{display: grid; margin-top: auto; border-top: 1px solid #30383d}html[data-dsh-prts] [data-prts-connection-indicator]{min-height: 40px; display: grid; place-items: center; gap: 3px; padding: 6px 2px; color: #8c969b; font-size: 7px; text-align: center}html[data-dsh-prts] [data-prts-connection-indicator] i{width: 6px; height: 6px; border: 1px solid currentColor; background: currentColor; transform: rotate(45deg)}html[data-dsh-prts] [data-prts-connection-indicator][data-state=\"connected\"]{color: var(--prts-cyan)}html[data-dsh-prts] [data-prts-connection-indicator][data-state=\"disconnected\"]{color: var(--prts-red)}html[data-dsh-prts] [data-prts-scheme-toggle] svg{width: 17px; height: 17px; fill: none; stroke: currentColor; stroke-width: 1.7}html[data-dsh-prts] [data-prts-scheme-toggle]{touch-action: none; user-select: none}html[data-dsh-prts][data-prts-scheme-transition-interactive] [data-prts-scheme-toggle]{cursor: ew-resize}html[data-dsh-prts] [data-prts-scheme-toggle][data-prts-scheme-press]{animation: prts-scheme-toggle-press 100ms var(--prts-ease-snap) both}@keyframes prts-scheme-toggle-press{0%,100%{transform: translateY(0) scale(1)}50%{transform: translateY(0) scale(.96)}}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(root){animation: prts-scheme-view-hold var(--prts-scheme-duration,520ms) linear both}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(root),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(root){animation: none; mix-blend-mode: normal}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(root){z-index: 1}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(root){z-index: 2; clip-path: inset(0 max(0px,calc(100vw - var(--prts-scheme-reveal-x))) 0 0)}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-grid),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-edge),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-node),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-mark){animation: none}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-grid){z-index: 3}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-edge){z-index: 4}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-node),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-group(prts-scheme-mark){z-index: 5}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(prts-scheme-grid),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(prts-scheme-edge),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(prts-scheme-node),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-old(prts-scheme-mark){opacity: 0; animation: none}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-grid),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-edge),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-node),html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-mark){opacity: 1; animation: none; mix-blend-mode: normal}@keyframes prts-scheme-view-hold{from,to{opacity: 1}}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]{--prts-scheme-grid-cell: 20px; --prts-scheme-grid-diagonal-cell: 40px; --prts-scheme-grid-axis: rgba(132,158,166,.14); --prts-scheme-grid-node: rgba(150,180,188,.22); --prts-scheme-grid-diagonal-opacity: .16}html[data-dsh-prts][data-prts-scheme-transition=\"light\"]{--prts-scheme-grid-axis: rgba(28,36,41,.12); --prts-scheme-grid-node: rgba(24,31,35,.2); --prts-scheme-grid-diagonal-opacity: .14}html[data-dsh-prts] [data-prts-scheme-reveal]{box-sizing: border-box; position: fixed; z-index: 2147483647; inset: 0; width: 100vw; max-width: none; height: 100dvh; max-height: none; margin: 0; padding: 0; overflow: hidden; border: 0; background: transparent; color: #ffd400; --prts-scheme-grid-cell: 20px; --prts-scheme-grid-diagonal-cell: 40px; --prts-scheme-grid-axis: rgba(132,158,166,.08); --prts-scheme-grid-node: rgba(150,180,188,.13); --prts-scheme-grid-diagonal-opacity: .075; pointer-events: none}html[data-dsh-prts] [data-prts-scheme-reveal=\"light\"]{--prts-scheme-grid-axis: rgba(28,36,41,.065); --prts-scheme-grid-node: rgba(24,31,35,.105); --prts-scheme-grid-diagonal-opacity: .06}html[data-dsh-prts] [data-prts-scheme-reveal-edge]{isolation: isolate; position: absolute; top: 0; left: 0; width: 29px; height: 100vh; background: linear-gradient(90deg,transparent 13px,rgba(244,247,247,.96) 13px 14px,rgba(255,212,0,.22) 14px 15px,transparent 15px); transform: translate3d(-14px,0,0); transform-origin: 50% 50%; view-transition-name: prts-scheme-edge; will-change: transform}html[data-dsh-prts] [data-prts-scheme-reveal-grid]{position: absolute; z-index: -2; inset: 0 auto 0 -206px; display: block; width: 220px; height: 100vh; view-transition-name: prts-scheme-grid; pointer-events: none}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-grid){background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Cg fill='none' stroke='%2396b4bc' stroke-width='.55'%3E%3Cpath d='M0 0H40M0 20H40M0 40H40M0 0V40M20 0V40M40 0V40' stroke-opacity='.22'/%3E%3Cpath d='M0 0L20 20L0 40M20 0L40 20L20 40' stroke-opacity='.46'/%3E%3Cpath d='M20 0L0 20L20 40M40 0L20 20L40 40' stroke-opacity='.22'/%3E%3C/g%3E%3Cg fill='%2396b4bc' fill-opacity='.36'%3E%3Ccircle cx='0' cy='0' r='1'/%3E%3Ccircle cx='20' cy='0' r='1'/%3E%3Ccircle cx='40' cy='0' r='1'/%3E%3Ccircle cx='0' cy='20' r='1'/%3E%3Ccircle cx='20' cy='20' r='1'/%3E%3Ccircle cx='40' cy='20' r='1'/%3E%3Ccircle cx='0' cy='40' r='1'/%3E%3Ccircle cx='20' cy='40' r='1'/%3E%3Ccircle cx='40' cy='40' r='1'/%3E%3C/g%3E%3C/svg%3E\"); background-repeat: repeat; background-position: calc(220px - var(--prts-scheme-reveal-x)) 0; background-size: var(--prts-scheme-grid-diagonal-cell) var(--prts-scheme-grid-diagonal-cell); -webkit-mask-image: linear-gradient(90deg,transparent 0,rgba(0,0,0,.12) 16%,rgba(0,0,0,.48) 56%,#000 100%); mask-image: linear-gradient(90deg,transparent 0,rgba(0,0,0,.12) 16%,rgba(0,0,0,.48) 56%,#000 100%)}html[data-dsh-prts][data-prts-scheme-transition=\"light\"]::view-transition-new(prts-scheme-grid){background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'%3E%3Cg fill='none' stroke='%231c2429' stroke-width='.55'%3E%3Cpath d='M0 0H40M0 20H40M0 40H40M0 0V40M20 0V40M40 0V40' stroke-opacity='.2'/%3E%3Cpath d='M0 0L20 20L0 40M20 0L40 20L20 40' stroke-opacity='.42'/%3E%3Cpath d='M20 0L0 20L20 40M40 0L20 20L40 40' stroke-opacity='.2'/%3E%3C/g%3E%3Cg fill='%231c2429' fill-opacity='.32'%3E%3Ccircle cx='0' cy='0' r='1'/%3E%3Ccircle cx='20' cy='0' r='1'/%3E%3Ccircle cx='40' cy='0' r='1'/%3E%3Ccircle cx='0' cy='20' r='1'/%3E%3Ccircle cx='20' cy='20' r='1'/%3E%3Ccircle cx='40' cy='20' r='1'/%3E%3Ccircle cx='0' cy='40' r='1'/%3E%3Ccircle cx='20' cy='40' r='1'/%3E%3Ccircle cx='40' cy='40' r='1'/%3E%3C/g%3E%3C/svg%3E\")}html[data-dsh-prts] [data-prts-scheme-reveal-blend]{position: absolute; z-index: -1; inset: 0; width: 29px; background: linear-gradient(90deg,transparent,rgba(255,212,0,.025) 43%,rgba(235,244,245,.11) 50%,rgba(255,212,0,.018) 58%,transparent); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); opacity: .54}html[data-dsh-prts] [data-prts-scheme-reveal=\"light\"] [data-prts-scheme-reveal-blend]{background: linear-gradient(90deg,transparent,rgba(28,36,41,.04) 42%,rgba(255,255,255,.2) 50%,rgba(255,212,0,.018) 58%,transparent)}html[data-dsh-prts] [data-prts-scheme-reveal=\"dark\"] [data-prts-scheme-reveal-blend]{background: linear-gradient(90deg,transparent,rgba(132,158,166,.035) 42%,rgba(235,244,245,.12) 50%,rgba(255,212,0,.018) 58%,transparent)}html[data-dsh-prts] [data-prts-scheme-reveal-edge]::before{content: \"\"; position: absolute; top: 18%; left: 7px; width: 15px; height: 28px; border-top: 1px solid rgba(235,244,245,.58); border-bottom: 1px solid rgba(235,244,245,.58); background: linear-gradient(rgba(255,212,0,.72),rgba(255,212,0,.72)) 50% 50% / 100% 1px no-repeat}html[data-dsh-prts] [data-prts-scheme-reveal-edge]::after{content: \"\"; position: absolute; top: calc(18% + 12px); left: 12px; width: 5px; height: 5px; border: 1px solid rgba(255,212,0,.78); background: rgba(8,12,14,.68); transform: rotate(45deg)}html[data-dsh-prts] [data-prts-scheme-reveal-node]{position: absolute; z-index: 2; bottom: clamp(88px,18vh,176px); left: 14px; display: block; box-sizing: border-box; width: 46px; height: 62px; color: #ffd400; font-style: normal; transform: translateX(10px); view-transition-name: prts-scheme-node; transition: transform 120ms var(--prts-ease-snap)}html[data-dsh-prts] [data-prts-scheme-reveal-edge][data-prts-scheme-reveal-side=\"left\"] [data-prts-scheme-reveal-node]{transform: translateX(calc(-100% - 10px))}html[data-dsh-prts] [data-prts-scheme-reveal-node]::before{content: \"\"; position: absolute; top: 30px; left: -10px; width: 10px; border-top: 1px solid rgba(255,212,0,.76)}html[data-dsh-prts] [data-prts-scheme-reveal-edge][data-prts-scheme-reveal-side=\"left\"] [data-prts-scheme-reveal-node]::before{right: -10px; left: auto}html[data-dsh-prts] [data-prts-scheme-reveal-mark]{position: absolute; top: 20px; left: 20px; display: block; width: 6px; height: 6px; border-top: 1px solid currentColor; border-right: 1px solid currentColor; view-transition-name: prts-scheme-mark}html[data-dsh-prts] [data-prts-scheme-reveal-meter]{position: absolute; top: 6px; left: 0; display: block; box-sizing: border-box; width: 6px; height: 50px; border: 1px solid rgba(255,212,0,.34); background: rgba(8,12,14,.32)}html[data-dsh-prts] [data-prts-scheme-reveal-meter]::after{content: \"\"; position: absolute; top: -1px; left: 6px; width: 3px; border-top: 1px solid rgba(255,212,0,.64); box-shadow: 0 24px rgba(255,212,0,.42),0 49px rgba(255,212,0,.64)}html[data-dsh-prts] [data-prts-scheme-reveal-meter-fill]{position: absolute; inset: 1px; display: block; background: currentColor; box-shadow: 0 0 5px rgba(255,212,0,.28); opacity: 0; transform-origin: 50% 100%}html[data-dsh-prts] [data-prts-scheme-reveal-label],html[data-dsh-prts] [data-prts-scheme-reveal-value]{position: absolute; left: 12px; display: block; color: currentColor; font-family: var(--prts-mono); font-style: normal; line-height: 1; white-space: nowrap}html[data-dsh-prts] [data-prts-scheme-reveal-label]{top: 7px; font-size: 7px; font-weight: 600; letter-spacing: .16em; opacity: .72}html[data-dsh-prts] [data-prts-scheme-reveal-value]{bottom: 7px; width: 24px; height: 11px; font-size: 11px; font-weight: 700; letter-spacing: .08em}html[data-dsh-prts][data-prts-scheme-transition-mode=\"view\"]::view-transition-new(prts-scheme-node){background-image: linear-gradient(#ffd400,#ffd400); background-position: left 1px bottom 7px; background-repeat: no-repeat; background-size: 2px var(--prts-scheme-control-meter-height,0); object-fit: none}html[data-dsh-prts][data-prts-scheme-transition-interactive]::view-transition-new(prts-scheme-node){background-image: var(--prts-scheme-control-value-image),linear-gradient(#ffd400,#ffd400); background-position: left 12px bottom 7px,left 1px bottom 7px; background-size: 24px 11px,2px var(--prts-scheme-control-meter-height,0)}html[data-dsh-prts][data-prts-scheme-transition-complete]::view-transition-group(prts-scheme-grid),html[data-dsh-prts][data-prts-scheme-transition-complete]::view-transition-group(prts-scheme-edge),html[data-dsh-prts][data-prts-scheme-transition-complete]::view-transition-group(prts-scheme-node),html[data-dsh-prts][data-prts-scheme-transition-complete]::view-transition-group(prts-scheme-mark){animation: prts-scheme-hud-release 100ms ease-out both}@keyframes prts-scheme-hud-release{0%,35%{opacity: 1}100%{opacity: 0}}@media (max-width: 640px){html[data-dsh-prts] [data-prts-scheme-reveal]{--prts-scheme-grid-cell: 16px; --prts-scheme-grid-diagonal-cell: 32px}}html[data-dsh-prts] [data-prts-scheme-current=\"dark\"] [data-prts-scheme-icon=\"light\"],html[data-dsh-prts] [data-prts-scheme-current=\"light\"] [data-prts-scheme-icon=\"dark\"]{display: none}html[data-dsh-prts] [data-prts-region=\"frame\"]{width: calc(100vw - var(--prts-nav-width)); height: calc(100dvh - var(--prts-host-top-inset)); min-height: 0; margin-left: var(--prts-nav-width); display: grid !important; background: var(--prts-canvas)}html[data-dsh-prts] [data-prts-region=\"sessions\"],html[data-dsh-prts] [data-prts-region=\"operation\"]{min-width: 0; min-height: 0}html[data-dsh-prts] [data-prts-region=\"sessions\"]{box-sizing: border-box; position: relative; z-index: 4; overflow: hidden; border-right: 1px solid var(--prts-line); background: var(--prts-panel); transition: opacity 180ms ease}html[data-dsh-prts] [data-prts-region=\"operation\"]{position: relative; z-index: 1; overflow: hidden; background: var(--prts-canvas); color: var(--prts-ink)}html[data-dsh-prts] [data-prts-region=\"frame\"][data-sidebar-collapsed] [data-prts-region=\"sessions\"] :is( [data-slot=\"sidebar.workspaces\"],[data-slot=\"sidebar.settings\"] ){opacity: 0; pointer-events: none}html[data-dsh-prts] [data-sidebar-collapsed] :is([data-prts-owned-facility],[data-prts-owned-facility-spine],[data-prts-owned-facility-vector]){visibility: hidden; content-visibility: hidden}html[data-dsh-prts] [data-prts-region=\"sessions\"] > *,html[data-dsh-prts] [data-prts-region=\"sessions\"] [data-slot=\"sidebar\"]{height: 100%}html[data-dsh-prts] [data-prts-region=\"sessions\"] [data-rc7-sidebar-root]{box-sizing: border-box; width: 100% !important; min-width: var(--prts-sessions-width); padding: 14px 10px; overflow: hidden auto; background: transparent !important; color: var(--prts-ink)}html[data-dsh-prts] [data-prts-region=\"sessions\"] [data-slot=\"sidebar.workspaces\"] [role=\"tree\"]{overflow-x: hidden}html[data-dsh-prts] [data-prts-region=\"sessions\"] > * > [data-slot=\"sidebar\"] > :first-child > button[aria-label*=\"new session\" i]{display: none !important}html[data-dsh-prts] [data-prts-workspace-row],html[data-dsh-prts] [data-prts-session-row]{--prts-row-shift: 0px; --prts-row-end-reserve: 29px; --prts-facility-height: var(--prts-workspace-height); position: relative; width: calc(100% - 20px); height: var(--prts-facility-height) !important; min-height: var(--prts-facility-height); display: flex; align-items: center; gap: 0 !important; margin: 0 0 var(--prts-facility-gap) 0; padding: 0 !important; overflow: visible; border: 0 !important; background: transparent !important; color: var(--prts-ink); isolation: isolate}html[data-dsh-prts] [data-prts-session-row]{--prts-facility-height: var(--prts-session-height); margin-left: 8px}@media (max-height: 820px) and (hover: hover) and (pointer: fine){html[data-dsh-prts]{--prts-workspace-height: 34px; --prts-session-height: 32px; --prts-facility-gap: 5px}}html[data-dsh-prts] [data-prts-workspace-row]::before{background: var(--prts-cyan) !important}html[data-dsh-prts] [data-prts-workspace-row][aria-expanded=\"true\"],html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]),html[data-dsh-prts] [data-prts-session-row]:is(:hover,:focus-within,[data-prts-row-menu-open]){--prts-row-shift: var(--prts-spine-travel)}html[data-dsh-prts] [data-prts-workspace-row]::before,html[data-dsh-prts] [data-prts-session-row]::before{content: \"\"; position: absolute; z-index: 2; inset: 0 auto 0 0; width: var(--prts-spine-width); background: var(--prts-line-strong); clip-path: polygon( 3px 0,calc(100% - 3px) 0,100% 3px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 3px ); transform: scaleX(var(--prts-spine-rest)); transform-origin: left center; transition: transform 220ms var(--prts-ease-spring),background-color 160ms ease}html[data-dsh-prts] [data-prts-workspace-row][aria-expanded=\"true\"]::before,html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open])::before,html[data-dsh-prts] [data-prts-session-row]:is(:hover,:focus-within,[data-prts-row-menu-open])::before{transform: scaleX(1)}html[data-dsh-prts] [data-prts-session-row][aria-selected=\"true\"]::before{background: var(--prts-yellow)}html[data-dsh-prts] [data-prts-facility-face]{position: absolute; z-index: -1; inset: 0 0 0 5px; border: 1px solid var(--prts-line); background: var(--prts-panel-raised); clip-path: polygon( 3px 0,calc(50% - 25px) 0,calc(50% - 20px) 3.333px,calc(50% + 20px) 3.333px,calc(50% + 25px) 0,calc(100% - 3px) 0,100% 3px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 3px ); transform: translate3d(var(--prts-row-shift),0,0); transition: transform 220ms var(--prts-ease-spring),border-color 160ms ease,background-color 160ms ease; pointer-events: none}html[data-dsh-prts] :is([data-prts-workspace-row],[data-prts-session-row]) [data-prts-facility-face]{right: var(--prts-row-end-reserve)}html[data-dsh-prts] [data-prts-row-title],html[data-dsh-prts] [data-prts-session-row] > span:not([data-prts-facility-face]):not([data-prts-row-projection]):not([data-prts-session-actions]),html[data-dsh-prts] [data-prts-workspace-row] > span:not([data-prts-facility-face]):not([data-prts-row-projection]):not([data-prts-workspace-actions]){position: relative; z-index: 3; min-width: 0; transform: translate3d(var(--prts-row-shift),0,0); transition: transform 220ms var(--prts-ease-spring),color 160ms ease}html[data-dsh-prts] [data-prts-row-title]{flex: 1; overflow: hidden; padding: 0 10px 0 13px; font-size: 12px; font-weight: 650; line-height: var(--prts-facility-height); text-overflow: ellipsis; white-space: nowrap}html[data-dsh-prts] [data-prts-session-row] [data-prts-row-title]::before{content: attr(data-prts-session-index); margin-right: 8px; color: var(--prts-dim); font-family: var(--prts-mono); font-size: 9px; letter-spacing: .08em}html[data-dsh-prts] [data-prts-workspace-actions],html[data-dsh-prts] [data-prts-session-actions]{position: absolute; z-index: 5; inset: 0 0 auto auto; height: var(--prts-facility-height) !important; align-items: stretch !important; gap: 1px !important; margin: 0 !important; transform: translate3d(var(--prts-row-shift),0,0)}html[data-dsh-prts] [data-prts-workspace-actions]{width: 57px}html[data-dsh-prts] [data-prts-session-actions]{width: 28px}html[data-dsh-prts] [data-prts-workspace-actions] > *,html[data-dsh-prts] [data-prts-session-actions] > *{height: 100% !important}html[data-dsh-prts] [data-prts-workspace-actions] button,html[data-dsh-prts] [data-prts-session-actions] button{width: 28px !important; min-width: 28px !important; height: var(--prts-facility-height) !important; min-height: var(--prts-facility-height) !important; display: grid !important; place-items: center; padding: 0 !important; border: 1px solid var(--prts-line) !important; border-radius: 0 !important; background: var(--prts-panel-raised) !important; color: var(--prts-muted) !important; clip-path: polygon(3px 0,calc(100% - 3px) 0,100% 3px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 3px); cursor: pointer}html[data-dsh-prts] [data-prts-workspace-actions] button:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-session-actions] button:is(:hover,:focus-visible){border-color: var(--prts-yellow) !important; color: var(--prts-yellow) !important}@media (prefers-reduced-motion: no-preference){html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) [data-prts-workspace-actions] button,html[data-dsh-prts] [data-prts-session-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) [data-prts-session-actions] button{animation: prts-facility-button-dock 520ms both}html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) [data-prts-workspace-actions] > :nth-child(1) button{animation-delay: 55ms}html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) [data-prts-workspace-actions] > :nth-child(2){animation-delay: 125ms}}@keyframes prts-facility-button-dock{0%{opacity: 0; transform: translate3d(34px,0,0) scaleX(.94)}52%{opacity: 1; transform: translate3d(-4px,0,0) scaleX(.96)}72%{transform: translate3d(3px,0,0) scaleX(1.035)}88%{transform: translate3d(-1px,0,0) scaleX(.99)}100%{opacity: 1; transform: translate3d(0,0,0) scaleX(1)}}html[data-dsh-prts] [data-slot=\"conversation\"]{min-width: 0; height: 100%; background: transparent}html[data-dsh-prts] [data-slot=\"conversation.session.header\"]{border-bottom: 1px solid var(--prts-line); background: color-mix(in srgb,var(--prts-canvas-elevated) 92%,transparent); font-family: var(--prts-mono)}html[data-dsh-prts] [data-session-code]{color: var(--prts-yellow); font-size: 11px; letter-spacing: .12em}html[data-dsh-prts] [data-prts-conversation-control=\"header\"]{margin-left: auto}html[data-dsh-prts] [data-conversation-scroll]{position: relative; z-index: 2}html[data-dsh-prts] [data-message-role=\"user\"],html[data-dsh-prts] [data-chat-flow-kind=\"user\"]{position: relative; color: var(--prts-ink)}html[data-dsh-prts] [data-message-role=\"user\"],html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"]{border: 1px solid var(--prts-line-strong) !important; border-left: 4px solid var(--prts-yellow) !important; border-radius: var(--prts-radius-card) !important; background: var(--prts-panel-raised) !important; color: var(--prts-ink) !important; clip-path: polygon(3px 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,0 100%,0 3px); box-shadow: none !important}html[data-dsh-prts] [data-message-role=\"user\"] :is([data-markdown],[class*=\"markdown\" i]),html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"] :is([data-markdown],[class*=\"markdown\" i]){background: transparent !important}html[data-dsh-prts] [data-message-role=\"user\"] :is(pre,table,blockquote),html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"] :is(pre,table,blockquote){border: 1px solid var(--prts-line); background: var(--prts-glass-dense)}html[data-dsh-prts] [data-message-role=\"user\"] :is(pre,code),html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"] :is(pre,code){font-family: var(--prts-mono) !important}html[data-dsh-prts] [data-message-role=\"user\"] pre,html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"] pre{max-width: 100%; overflow: auto; padding: 14px; border-left: 3px solid var(--prts-cyan) !important; color: var(--prts-ink) !important}html[data-dsh-prts] [aria-invalid=\"true\"],html[data-dsh-prts] [data-status=\"error\"],html[data-dsh-prts] [data-status=\"denied\"]{border-color: var(--prts-red) !important; color: var(--prts-red) !important}html[data-dsh-prts] [data-prts-ambient-layer]{position: absolute; z-index: 0; inset: 0; overflow: hidden; opacity: .86; background: radial-gradient(circle at 48% 35%,color-mix(in srgb,var(--prts-cyan) 7%,transparent),transparent 32%),linear-gradient(115deg,transparent 0 42%,color-mix(in srgb,var(--prts-line) 18%,transparent) 42.2% 42.5%,transparent 42.7%),repeating-linear-gradient(0deg,transparent 0 27px,color-mix(in srgb,var(--prts-line) 12%,transparent) 27px 28px); pointer-events: none}html[data-dsh-prts][data-prts-texture=\"restrained\"] [data-prts-ambient-layer]{opacity: .56}html[data-dsh-prts][data-prts-texture=\"off\"] [data-prts-ambient-layer]{display: none}html[data-dsh-prts] [data-prts-particle-layer]{position: absolute; z-index: 1; inset: 0; width: 100%; height: 100%; pointer-events: none}html[data-dsh-prts] [data-prts-particle-layer]{opacity: 1; transition: opacity 120ms ease-out}html[data-dsh-prts] [data-prts-resize-shield]{content-visibility: hidden !important; contain-intrinsic-size: auto 800px}html[data-dsh-prts] [data-prts-particle-layer][data-prts-resizing]{opacity: .78; transition: none}html[data-dsh-prts] [data-prts-particle-layer][data-prts-resize-restoring]{opacity: 1; transition: opacity 120ms ease-out}html[data-dsh-prts] [data-prts-ambient-layer][data-prts-resizing]{opacity: .42; background: color-mix(in srgb,var(--prts-panel) 92%,var(--prts-canvas)); transition: none}html[data-dsh-prts] [data-prts-ambient-layer][data-prts-resizing] :is( [data-prts-ambient-glow],[data-prts-session-pickup] ){animation-play-state: paused !important}html[data-dsh-prts] :is( [data-prts-theme-settings][data-prts-resizing],[data-prts-settings-backdrop][data-prts-resizing] ),html[data-dsh-prts] [data-prts-resizing] > [data-composer-card]{backdrop-filter: none !important; -webkit-backdrop-filter: none !important; transition: none !important}html[data-dsh-prts] [data-prts-hero-active]::before{content: \"\"; position: absolute; inset: 0; pointer-events: none}html[data-dsh-prts]{--prts-hero-mark-base: clamp(380px,46%,720px); --prts-hero-mark-size: min(var(--prts-hero-mark-base),42dvh)}html[data-dsh-prts] [data-prts-hero-active] [data-composer-seat],html[data-dsh-prts] [data-prts-hero-active] [data-slot=\"conversation.composer\"]{position: relative; z-index: 5}html[data-dsh-prts] [data-composer-card],html[data-dsh-prts] [data-prts-composer-fallback]{position: relative; border: 1px solid var(--prts-line-strong) !important; border-bottom: 3px solid var(--prts-yellow) !important; border-radius: var(--prts-radius-card) !important; background: var(--prts-active-glass) !important; clip-path: polygon(3px 0,calc(50% - 42px) 0,calc(50% - 37px) 5px,calc(50% + 37px) 5px,calc(50% + 42px) 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px); box-shadow: 0 14px 34px rgba(0,0,0,.18); backdrop-filter: var(--prts-active-glass-filter); -webkit-backdrop-filter: var(--prts-active-glass-filter)}html[data-dsh-prts] [data-composer-card] textarea,html[data-dsh-prts] [data-prts-composer-fallback] textarea{border: 0 !important; background: transparent !important; color: var(--prts-ink) !important; caret-color: var(--prts-yellow)}html[data-dsh-prts] [data-composer-card] button,html[data-dsh-prts] [data-prts-conversation-control]{border: 1px solid var(--prts-line) !important; border-radius: var(--prts-radius-control) !important; background: var(--prts-panel-raised) !important; color: var(--prts-ink) !important; clip-path: polygon(3px 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px)}html[data-dsh-prts] [data-composer-card] button:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-conversation-control]:is(:hover,:focus-visible){border-color: var(--prts-yellow) !important}html[data-dsh-prts] [data-composer-card] button[aria-label*=\"send\" i],html[data-dsh-prts] [data-composer-card] button[type=\"submit\"]{background: var(--prts-yellow) !important; color: var(--prts-yellow-ink) !important}html[data-dsh-prts] [data-composer-card] button:active,html[data-dsh-prts] [data-prts-conversation-control]:active{transform: translateY(1px) scale(.98)}html[data-dsh-prts] [data-produced-files-row] > button[type=\"button\"],html[data-dsh-prts] [data-prts-to-bottom]{min-height: 36px; border: 1px solid var(--prts-line) !important; background: var(--prts-active-glass) !important; color: var(--prts-ink) !important; clip-path: polygon(3px 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px)}html[data-dsh-prts] [data-prts-glass-control=\"model\"],html[data-dsh-prts] [data-prts-glass-control=\"permission\"],html[data-dsh-prts] [data-prts-glass-control=\"preset\"]{border: 1px solid var(--prts-line) !important; border-radius: var(--prts-radius-control) !important; background: var(--prts-active-glass) !important; color: var(--prts-ink) !important}html[data-dsh-prts] [data-prts-glass-menu],html[data-dsh-prts] [data-prts-floating-glass=\"menu\"],html[data-dsh-prts] [data-prts-floating-glass=\"listbox\"],html[data-dsh-prts] [data-prts-floating-glass=\"popover\"]{border: 1px solid var(--prts-glass-border) !important; border-radius: var(--prts-radius-overlay) !important; background: var(--prts-active-glass) !important; color: var(--prts-ink) !important; box-shadow: var(--prts-shadow-glass-overlay) !important; backdrop-filter: var(--prts-active-glass-filter); -webkit-backdrop-filter: var(--prts-active-glass-filter)}html[data-dsh-prts] [data-prts-floating-glass=\"dialog\"]{border: 1px solid var(--prts-glass-border) !important; border-radius: var(--prts-radius-overlay) !important; background: var(--prts-panel) !important; color: var(--prts-ink) !important; box-shadow: var(--prts-shadow-glass-overlay) !important; backdrop-filter: none; -webkit-backdrop-filter: none}html[data-dsh-prts] [data-prts-floating-item]{min-height: 38px; border-radius: var(--prts-radius-control) !important; color: var(--prts-ink) !important}html[data-dsh-prts] [data-prts-floating-item]:is(:hover,[data-highlighted]){background: var(--prts-panel-muted) !important}html[data-dsh-prts] [data-prts-floating-input]{min-height: 44px; border: 1px solid var(--prts-line) !important; background: var(--prts-panel) !important; color: var(--prts-ink) !important}html[data-dsh-prts] :is( [data-prts-floating-glass=\"menu\"],[data-prts-floating-glass=\"listbox\"],[data-prts-floating-glass=\"popover\"] ) [data-prts-floating-danger]{color: var(--prts-red) !important}html[data-dsh-prts] [data-prts-floating-scrim]{background: rgba(3,5,6,.62) !important}html[data-dsh-prts-settings] .prts-plugin-settings{width: 100%; display: grid; gap: 16px; container: prts-plugin-settings / inline-size; color: inherit; font: inherit}html[data-dsh-prts-settings] .prts-plugin-settings__header{display: grid; gap: 5px; padding-bottom: 14px; border-bottom: 1px solid color-mix(in srgb,currentColor 18%,transparent)}html[data-dsh-prts-settings] .prts-plugin-settings__header h3,html[data-dsh-prts-settings] .prts-plugin-settings__header p{margin: 0}html[data-dsh-prts-settings] .prts-plugin-settings__header h3{font-size: 18px; font-weight: 650}html[data-dsh-prts-settings] .prts-plugin-settings__header p,html[data-dsh-prts-settings] .prts-plugin-settings__copy small{color: color-mix(in srgb,currentColor 62%,transparent); font-size: 12px; line-height: 1.5}html[data-dsh-prts-settings] .prts-plugin-settings__safe{margin: 0; padding: 10px 12px; border: 1px solid color-mix(in srgb,#df5750 42%,transparent); border-radius: 8px; background: color-mix(in srgb,#df5750 8%,transparent); color: inherit; font-size: 12px}html[data-dsh-prts-settings] .prts-plugin-settings__list{overflow: hidden; border: 1px solid color-mix(in srgb,currentColor 16%,transparent); border-radius: 10px}html[data-dsh-prts-settings] .prts-plugin-settings__row{min-height: 64px; display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 12px 14px}html[data-dsh-prts-settings] .prts-plugin-settings__row + .prts-plugin-settings__row{border-top: 1px solid color-mix(in srgb,currentColor 12%,transparent)}html[data-dsh-prts-settings] .prts-plugin-settings__copy{min-width: 0; display: grid; gap: 3px}html[data-dsh-prts-settings] .prts-plugin-settings__copy strong{font-size: 13px; font-weight: 600}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch']{position: relative; width: 42px; height: 24px; flex: 0 0 auto; padding: 0; border: 0; border-radius: 999px; background: color-mix(in srgb,currentColor 18%,transparent); color: inherit; cursor: pointer}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch'] > span{position: absolute; top: 3px; left: 3px; width: 18px; height: 18px; border-radius: 50%; background: currentColor; transition: transform 120ms ease}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch'].is-active{background: var(--color-primary,#d9b800); color: #111}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch'].is-active > span{transform: translateX(18px)}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch']:disabled{cursor: not-allowed; opacity: .45}@media (prefers-reduced-motion: reduce){html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch'] > span{transition: none}}@container prts-plugin-settings (max-width: 22rem){html[data-dsh-prts-settings] .prts-plugin-settings__row{flex-direction: column; align-items: stretch; gap: 10px}html[data-dsh-prts-settings] .prts-plugin-settings button[role='switch']{align-self: flex-end}}@media (max-width: 640px){html[data-dsh-prts]{--prts-nav-width: 52px}html[data-dsh-prts] [data-slot=\"conversation.session.header\"]{padding-inline: 12px}html[data-dsh-prts-settings] .prts-settings{padding: 12px}}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){html[data-dsh-prts] [data-prts-floating-glass],html[data-dsh-prts] [data-composer-card],html[data-dsh-prts] [data-prts-glass-menu]{background: var(--prts-panel) !important}}@media (hover: hover) and (pointer: fine){html[data-dsh-prts] [data-prts-nav-rail] > button:hover b{transform: translateY(-1px)}}@media (prefers-reduced-transparency: reduce){html[data-dsh-prts]{--prts-active-glass: var(--prts-panel); --prts-active-glass-filter: none}}@media (prefers-contrast: more){html[data-dsh-prts]{--prts-line: currentColor; --prts-line-strong: currentColor}}@media (prefers-reduced-motion: reduce){html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] ),html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] )::before,html[data-dsh-prts] :is( [data-prts-shell],[data-prts-shell] *,[data-prts-particle-layer],[data-prts-ambient-layer],[data-prts-facility-face],[data-composer-card],[data-prts-composer-fallback],[data-prts-conversation-control],[data-prts-to-bottom] )::after{scroll-behavior: auto !important; animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important}}html[data-dsh-prts]{--prts-hero-mark-base: clamp(300px,38%,520px); --prts-hero-mark-size: min(var(--prts-hero-mark-base),32dvh)}html[data-dsh-prts] [data-prts-region=\"sessions\"] > * > [data-slot=\"sidebar\"] > :first-child > button[aria-label*=\"new session\" i]{min-height: 40px; display: grid !important; place-items: center; margin: 0 0 14px; border: 1px solid var(--prts-line) !important; border-radius: var(--prts-radius-card) !important; background: var(--prts-panel-raised) !important; color: var(--prts-ink) !important}html[data-dsh-prts] [data-prts-rail-brand],html[data-dsh-prts] [data-prts-nav-rail] > button,html[data-dsh-prts] [data-prts-nav-bottom] > button{position: relative; width: 100%; min-width: 0; min-height: 48px; display: grid; place-items: center; padding: 0; border: 0; border-bottom: 1px solid #242b2f; border-radius: 0; background: transparent; color: #aeb8bd !important; cursor: pointer; clip-path: none}html[data-dsh-prts] [data-prts-rail-brand]{height: 64px; border-bottom-color: #30383d}html[data-dsh-prts] [data-prts-rail-brand]:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-rail-brand][aria-expanded=\"true\"],html[data-dsh-prts] [data-prts-nav-rail] > button:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-nav-bottom] > button:is(:hover,:focus-visible){background: #151a1d; color: #f3f6f7 !important}html[data-dsh-prts] [data-prts-rail-brand][aria-expanded=\"true\"]::after{content: \"\"; position: absolute; inset: 7px auto 7px 0; width: 2px; background: var(--prts-yellow)}html[data-dsh-prts] [data-prts-nav-rail] small,html[data-dsh-prts] [data-prts-connection-label]{position: absolute; z-index: 180; top: 50%; left: calc(100% + 9px); width: max-content; max-width: 180px; padding: 6px 8px; border: 1px solid #3d474d; border-radius: 3px; opacity: 0; background: #0e1215; color: #eef2f3; font: 700 9px/1.2 var(--prts-mono); letter-spacing: .04em; text-align: left; transform: translate3d(-5px,-50%,0); transition: opacity 130ms ease,transform 160ms var(--prts-ease-snap); pointer-events: none; white-space: nowrap}html[data-dsh-prts] [data-prts-nav-rail] button:is(:hover,:focus-visible) small,html[data-dsh-prts] [data-prts-connection-indicator]:is(:hover,:focus-visible) [data-prts-connection-label]{opacity: 1; transform: translate3d(0,-50%,0)}html[data-dsh-prts] [data-prts-connection-indicator]{position: relative; min-height: 38px; padding: 0; color: #9da8ad}html[data-dsh-prts] [data-prts-nav-bottom] svg,html[data-dsh-prts] [data-prts-nav-bottom] b{display: block; color: currentColor}html[data-dsh-prts] [data-message-role=\"user\"],html[data-dsh-prts] [data-chat-flow-kind=\"user\"] [class$=\"_bubble\"],html[data-dsh-prts] [data-composer-card],html[data-dsh-prts] [data-prts-composer-fallback],html[data-dsh-prts] [data-composer-card] button,html[data-dsh-prts] [data-prts-conversation-control],html[data-dsh-prts] [data-produced-files-row] > button[type=\"button\"],html[data-dsh-prts] [data-prts-to-bottom]{border-radius: 3px !important; clip-path: none !important}html[data-dsh-prts] [data-prts-facility-face]{right: 0 !important; border: 0 !important; background: var(--prts-line-strong)}html[data-dsh-prts] [data-prts-facility-face]::after{content: \"\"; position: absolute; inset: 1px; background: var(--prts-panel-raised); clip-path: polygon( 3px 0,calc(50% - 25px) 0,calc(50% - 20px) 3.333px,calc(50% + 20px) 3.333px,calc(50% + 25px) 0,calc(100% - 3px) 0,100% 3px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 3px )}html[data-dsh-prts] [data-prts-workspace-actions] button,html[data-dsh-prts] [data-prts-session-actions] button{border: 1px solid var(--prts-line-strong) !important; border-radius: 3px !important; clip-path: none !important}html[data-dsh-prts] [data-prts-hero-active]{display: grid; grid-template-rows: minmax(220px,1fr) auto; align-content: center; gap: clamp(28px,5dvh,54px); padding-top: 24px; padding-bottom: 34px}html[data-dsh-prts] [data-prts-hero-active] [data-phase=\"hero\"]{min-height: min(36dvh,390px); align-self: end}html[data-dsh-prts] [data-prts-hero-active] [data-composer-seat]{align-self: start; justify-self: center}html[data-dsh-prts]{--prts-hero-mark-base: clamp(320px,42%,580px); --prts-hero-mark-size: min(var(--prts-hero-mark-base),42dvh)}html[data-dsh-prts] [data-prts-region=\"frame\"]{position: relative}html[data-dsh-prts] [data-prts-region=\"frame\"] > [data-shell-overlay]{position: absolute !important; z-index: 120; inset: 0; min-width: 0; min-height: 0; pointer-events: none}html[data-dsh-prts] [data-prts-region=\"frame\"] > [data-shell-overlay] > *{pointer-events: auto}html[data-dsh-prts] [data-prts-region=\"sessions\"] [data-slot=\"sidebar.settings\"]{opacity: 1; visibility: visible; pointer-events: auto}html[data-dsh-prts] [data-prts-region=\"sessions\"] [data-slot=\"sidebar.settings\"] > button{color: var(--prts-ink) !important}html[data-dsh-prts] [data-prts-workspace-icon]{display: none !important}html[data-dsh-prts] [data-prts-workspace-disclosure]{position: relative; z-index: 4; width: 14px; flex: 0 0 14px; display: grid; place-items: center; margin-left: calc(var(--prts-spine-width) + 4px); color: var(--prts-muted); transform: translate3d(var(--prts-row-shift),0,0); transition: transform 220ms var(--prts-ease-spring),color 160ms ease}html[data-dsh-prts] [data-prts-workspace-row]::before,html[data-dsh-prts] [data-prts-session-row]::before{clip-path: polygon( 1px 0,calc(100% - 1px) 0,100% 1px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 1px),calc(100% - 1px) 100%,1px 100%,0 calc(100% - 1px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 1px ) !important}html[data-dsh-prts] :is([data-prts-workspace-row],[data-prts-session-row]) [data-prts-facility-face]{right: var(--prts-row-end-reserve) !important}html[data-dsh-prts] [data-prts-facility-face]{border: 0 !important; background: var(--prts-line-strong) !important; clip-path: polygon( 1px 0,calc(50% - 25px) 0,calc(50% - 20px) 3.333px,calc(50% + 20px) 3.333px,calc(50% + 25px) 0,calc(100% - 1px) 0,100% 1px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 1px),calc(100% - 1px) 100%,1px 100%,0 calc(100% - 1px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 1px ) !important}html[data-dsh-prts] [data-prts-facility-face]::after{content: \"\"; position: absolute; inset: 1px; background: var(--prts-panel-raised); clip-path: polygon( 0 0,calc(50% - 24px) 0,calc(50% - 19px) 3.333px,calc(50% + 19px) 3.333px,calc(50% + 24px) 0,100% 0,100% calc(50% - 4px),calc(100% - 2px) calc(50% - 2px),calc(100% - 2px) calc(50% + 2px),100% calc(50% + 4px),100% 100%,0 100%,0 calc(50% + 4px),2px calc(50% + 2px),2px calc(50% - 2px),0 calc(50% - 4px) )}html[data-dsh-prts] [data-prts-workspace-actions]{width: 57px !important}html[data-dsh-prts] [data-prts-session-actions]{width: 28px !important}html[data-dsh-prts] [data-prts-workspace-actions] button,html[data-dsh-prts] [data-prts-session-actions] button{width: 28px !important; min-width: 28px !important; position: relative; isolation: isolate; overflow: hidden; border: 0 !important; border-radius: 0 !important; background: var(--prts-line) !important; clip-path: polygon( 1px 0,calc(100% - 1px) 0,100% 1px,100% calc(50% - 5px),calc(100% - 2px) calc(50% - 3px),calc(100% - 2px) calc(50% + 3px),100% calc(50% + 5px),100% calc(100% - 1px),calc(100% - 1px) 100%,1px 100%,0 calc(100% - 1px),0 calc(50% + 5px),2px calc(50% + 3px),2px calc(50% - 3px),0 calc(50% - 5px),0 1px ) !important}html[data-dsh-prts] [data-prts-workspace-actions] button::before,html[data-dsh-prts] [data-prts-session-actions] button::before{content: \"\"; position: absolute; z-index: -1; inset: 1px; background: var(--prts-panel-raised); clip-path: polygon( 0 0,100% 0,100% calc(50% - 4px),calc(100% - 2px) calc(50% - 2px),calc(100% - 2px) calc(50% + 2px),100% calc(50% + 4px),100% 100%,0 100%,0 calc(50% + 4px),2px calc(50% + 2px),2px calc(50% - 2px),0 calc(50% - 4px) ); pointer-events: none}html[data-dsh-prts] [data-prts-workspace-actions] button:is(:hover,:focus-visible),html[data-dsh-prts] [data-prts-session-actions] button:is(:hover,:focus-visible){background: var(--prts-yellow) !important}html[data-dsh-prts] [data-prts-session-time]{position: relative; z-index: 3; flex: 0 0 auto; margin-right: 39px; padding-left: 8px; transform: translate3d(var(--prts-row-shift),0,0); transition: opacity 120ms ease,transform 220ms var(--prts-ease-spring)}html[data-dsh-prts] [data-prts-session-row]:hover [data-prts-session-time]{opacity: 0}html[data-dsh-prts] [data-composer-card],html[data-dsh-prts] [data-prts-composer-fallback]{position: relative; isolation: isolate; overflow: visible; border: 0 !important; border-radius: 0 !important; background: transparent !important; box-shadow: none !important; clip-path: none !important; backdrop-filter: none; -webkit-backdrop-filter: none}html[data-dsh-prts] [data-composer-card]::before,html[data-dsh-prts] [data-prts-composer-fallback]::before{content: \"\"; position: absolute; z-index: 0; inset: 0; background: var(--prts-line-strong); clip-path: polygon( 3px 0,calc(50% - 42px) 0,calc(50% - 37px) 5px,calc(50% + 37px) 5px,calc(50% + 42px) 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px ); box-shadow: 0 14px 34px rgba(0,0,0,.18); pointer-events: none}html[data-dsh-prts] [data-composer-card]::after,html[data-dsh-prts] [data-prts-composer-fallback]::after{content: \"\"; position: absolute; z-index: 1; inset: 1px 1px 3px; background: var(--prts-composer-surface,var(--prts-active-glass)); clip-path: polygon( 2px 0,calc(50% - 41px) 0,calc(50% - 36px) 5px,calc(50% + 36px) 5px,calc(50% + 41px) 0,calc(100% - 2px) 0,100% 2px,100% calc(100% - 2px),calc(100% - 2px) 100%,2px 100%,0 calc(100% - 2px),0 2px ); backdrop-filter: var(--prts-active-glass-filter); -webkit-backdrop-filter: var(--prts-active-glass-filter); pointer-events: none}html[data-dsh-prts] [data-composer-card] > :not([data-prts-composer-signal]),html[data-dsh-prts] [data-prts-composer-fallback] > :not([data-prts-composer-signal]){position: relative; z-index: 2}html[data-dsh-prts] [data-prts-composer-signal]{position: absolute; z-index: 3; inset: 0; overflow: visible; pointer-events: none}html[data-dsh-prts] [data-prts-composer-signal]::before{content: \"\"; position: absolute; left: 50%; background: var(--prts-yellow); opacity: .82; pointer-events: none; transition: transform 160ms var(--prts-ease-snap),opacity 160ms ease}html[data-dsh-prts] [data-prts-composer-signal]::before{bottom: 0; width: calc(100% - 6px); height: 3px; transform: translateX(-50%) scaleX(.16)}html[data-dsh-prts] [data-composer-card]:focus-within,html[data-dsh-prts] [data-prts-composer-fallback]:focus-within{--prts-composer-surface: color-mix(in srgb,var(--prts-active-glass) 94%,var(--prts-ink) 6%)}html[data-dsh-prts] :is([data-composer-card],[data-prts-composer-fallback]):focus-within [data-prts-composer-signal]::before{opacity: 1; transform: translateX(-50%) scaleX(1)}html[data-dsh-prts] [data-composer-card] textarea:focus-visible,html[data-dsh-prts] [data-prts-composer-fallback] textarea:focus-visible{outline: none !important}@media (prefers-reduced-motion: reduce){html[data-dsh-prts] [data-prts-composer-signal]::before{transition: none}}html[data-dsh-prts] [data-prts-theme-settings] :is(input,textarea,select):focus-visible,html[data-dsh-prts] [data-prts-floating-input]:focus-visible{outline: none !important; border-color: var(--prts-yellow) !important; box-shadow: 0 0 0 1px var(--prts-yellow) !important}html[data-dsh-prts] [data-prts-conversation-control=\"header\"]{height: 36px; min-height: 36px; display: inline-flex; align-items: center; gap: 6px; padding: 0 10px}html[data-dsh-prts] [data-prts-conversation-control=\"header\"] svg{width: 16px; height: 16px; flex: 0 0 16px}html[data-dsh-prts] [data-prts-hero-active] [data-composer-card] button[aria-label*=\"send\" i],html[data-dsh-prts] [data-prts-hero-active] [data-composer-card] button[type=\"submit\"]{min-width: 40px !important; padding: 0 !important; font-size: 11px}html[data-dsh-prts] [data-prts-hero-active] [data-prts-glass-control=\"action\"]{width: 36px !important; min-width: 36px !important; padding: 0 !important; flex: 0 0 36px}html[data-dsh-prts] :is( [data-composer-card] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-composer-fallback] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-glass-control],[data-prts-conversation-control]:not([data-prts-conversation-control=\"micro\"]),[data-produced-files-row] > button[type=\"button\"] ){--prts-control-outline: var(--prts-line); --prts-control-surface: var(--prts-panel-raised); position: relative; isolation: isolate; overflow: hidden; border: 0 !important; border-radius: 0 !important; background: var(--prts-control-outline) !important; color: var(--prts-ink) !important; clip-path: polygon( 3px 0,calc(100% - 3px) 0,100% 3px,100% calc(100% - 3px),calc(100% - 3px) 100%,3px 100%,0 calc(100% - 3px),0 3px ) !important}html[data-dsh-prts] :is( [data-composer-card] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-composer-fallback] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-glass-control],[data-prts-conversation-control]:not([data-prts-conversation-control=\"micro\"]),[data-produced-files-row] > button[type=\"button\"] )::before{content: \"\"; position: absolute; z-index: -1; inset: 1px; background: var(--prts-control-surface); clip-path: polygon( 2px 0,calc(100% - 2px) 0,100% 2px,100% calc(100% - 2px),calc(100% - 2px) 100%,2px 100%,0 calc(100% - 2px),0 2px ); pointer-events: none}html[data-dsh-prts] :is( [data-composer-card] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-composer-fallback] button:not([data-prts-glass-menu] *):not([data-prts-floating-glass] *):not([role=\"menu\"] *):not([role=\"listbox\"] *),[data-prts-glass-control],[data-prts-conversation-control]:not([data-prts-conversation-control=\"micro\"]),[data-produced-files-row] > button[type=\"button\"] ):is(:hover,:focus-visible){--prts-control-outline: var(--prts-yellow)}html[data-dsh-prts] :is( [data-prts-glass-control=\"model\"],[data-prts-glass-control=\"permission\"],[data-prts-glass-control=\"preset\"],[data-prts-conversation-control=\"utility\"],[data-produced-files-row] > button[type=\"button\"] ){--prts-control-surface: var(--prts-active-glass) !important}html[data-dsh-prts] [data-composer-card] button[aria-label*=\"send\" i],html[data-dsh-prts] [data-composer-card] button[type=\"submit\"],html[data-dsh-prts] [data-prts-conversation-control=\"cta\"]{font-size: 11px; --prts-control-outline: var(--prts-yellow) !important; --prts-control-surface: var(--prts-yellow) !important; color: var(--prts-yellow-ink) !important}html[data-dsh-prts] [data-prts-conversation-control=\"danger\"]{--prts-control-outline: var(--prts-red) !important; --prts-control-surface: color-mix(in srgb,var(--prts-red) 14%,var(--prts-panel-raised)) !important; color: var(--prts-red) !important}html[data-dsh-prts] [data-prts-hero-active]{--prts-hero-narrow-spacer: clamp(24px,8dvh,72px); --prts-hero-wide-spacer: clamp(96px,22dvh,340px); min-height: 100%; height: calc(100% - 48px) !important; overflow-y: auto; display: grid; grid-template-columns: minmax(0,1fr); grid-template-rows: minmax(0,1fr) auto min( var(--prts-hero-wide-spacer),max(var(--prts-hero-narrow-spacer),calc(var(--prts-hero-narrow-spacer) + 63vw - 403.2px)) ); align-content: stretch; gap: clamp(24px,calc(5vw - 8px),40px); padding: clamp(18px,calc(1.875vw + 6px),24px) clamp(12px,3vw,42px) 0 clamp(18px,3vw,42px)}html[data-dsh-prts] [data-prts-hero-active] [data-composer-card],html[data-dsh-prts] [data-prts-hero-active] [data-prts-composer-fallback]{width: 100%; margin-inline: auto; padding: 10px 12px}html[data-dsh-prts] [data-prts-hero-active] [data-composer-card] textarea,html[data-dsh-prts] [data-prts-hero-active] [data-prts-composer-fallback] textarea{min-height: 64px; line-height: 1.55; resize: vertical}html[data-dsh-prts] [data-prts-hero-active] [data-composer-card] button,html[data-dsh-prts] [data-prts-hero-active] [data-prts-glass-control]{min-height: 36px}html[data-dsh-prts] [data-prts-hero-active]::before{margin-top: calc(var(--prts-hero-mark-size) + 44px)}html[data-dsh-prts] [data-prts-hero-active] [data-phase=\"hero\"]{grid-row: 1; min-height: 0; align-self: stretch}html[data-dsh-prts] [data-prts-hero-active] [data-composer-seat]{grid-row: 2; width: min(calc(780px + 32px),100%); min-width: 0 !important; align-self: end; justify-self: center}html[data-dsh-prts] [data-prts-theme-settings]{--prts-settings-text: .875rem; --prts-settings-small: .75rem; --prts-settings-heading: .875rem; position: fixed; z-index: 10000; inset: 50% auto auto 50%; width: min(clamp(50rem,55vw,65rem),calc(100vw - 2rem)); height: auto; max-width: none; max-height: min(60rem,calc(100dvh - 2rem)); container: prts-settings / inline-size; margin: 0; padding: 0; overflow: visible; border: 0; border-radius: 0; background: transparent; color: var(--prts-ink); box-shadow: 0 28px 90px rgba(0,0,0,.46); clip-path: none; opacity: 0; transform: translate(-50%,calc(-50% + 8px)) scale(.992); pointer-events: none; transition: opacity 150ms ease,transform 220ms var(--prts-ease-spring)}html[data-dsh-prts] [data-prts-theme-settings][open]{display: block}html[data-dsh-prts] [data-prts-theme-settings][data-prts-settings-visible]{opacity: 1; transform: translate(-50%,-50%) scale(1); pointer-events: auto}html[data-dsh-prts] [data-prts-theme-settings][data-prts-resizing]{transition: none}html[data-dsh-prts] [data-prts-theme-settings][data-prts-resizing]::backdrop,html[data-dsh-prts] [data-prts-settings-backdrop][data-prts-resizing]{backdrop-filter: none; -webkit-backdrop-filter: none}html[data-dsh-prts] [data-prts-theme-settings][data-prts-resizing] [data-prts-option-sample=\"glass\"]::after{backdrop-filter: none; -webkit-backdrop-filter: none; transition: none}html[data-dsh-prts] [data-prts-theme-settings]::before{content: none}html[data-dsh-prts] [data-prts-theme-settings]::backdrop{background: color-mix(in srgb,var(--prts-canvas) 72%,transparent); backdrop-filter: blur(5px) saturate(.82); -webkit-backdrop-filter: blur(5px) saturate(.82)}html[data-dsh-prts] [data-prts-settings-backdrop]{z-index: 9999; inset: 0; background: color-mix(in srgb,var(--prts-canvas) 72%,transparent); backdrop-filter: blur(5px) saturate(.82); -webkit-backdrop-filter: blur(5px) saturate(.82)}html[data-dsh-prts] [data-prts-settings-frame]{position: relative; height: auto; max-height: inherit; display: grid; grid-template-rows: auto minmax(0,1fr); overflow: hidden; isolation: isolate; border: 1px solid var(--prts-line-strong); background: linear-gradient(125deg,color-mix(in srgb,var(--prts-cyan) 4%,transparent),transparent 34%),var(--prts-panel); clip-path: polygon(4px 0,calc(100% - 38px) 0,100% 38px,100% calc(100% - 4px),calc(100% - 4px) 100%,4px 100%,0 calc(100% - 4px),0 4px)}html[data-dsh-prts] [data-prts-settings-frame]::before{content: \"\"; position: absolute; z-index: 3; top: 0; right: 37px; width: 118px; height: 2px; background: var(--prts-cyan); pointer-events: none}html[data-dsh-prts] [data-prts-theme-settings-header]{display: grid; align-items: center; min-height: 68px; grid-template-columns: minmax(180px,auto) minmax(0,1fr); gap: 14px; padding: 13px 48px 12px 16px; border-bottom: 1px solid var(--prts-line-strong); background: color-mix(in srgb,var(--prts-canvas-elevated) 92%,transparent)}html[data-dsh-prts] [data-prts-theme-settings-header] > span{display: grid; gap: 4px}html[data-dsh-prts] [data-prts-theme-settings-header] small,html[data-dsh-prts] [data-prts-theme-settings] section > header small,html[data-dsh-prts] [data-prts-theme-settings] summary small,html[data-dsh-prts] [data-prts-settings-actions] small{color: var(--prts-muted); font: 700 8px/1.3 var(--prts-mono); letter-spacing: .08em}html[data-dsh-prts] [data-prts-theme-settings-header] strong{font: 800 19px/1 var(--prts-display); letter-spacing: .07em}html[data-dsh-prts] [data-prts-settings-summary]{display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px}html[data-dsh-prts] [data-prts-settings-summary] span{min-height: 22px; padding: 4px 7px; box-shadow: inset 0 0 0 1px var(--prts-line); background: color-mix(in srgb,var(--prts-panel-raised) 86%,transparent); color: var(--prts-cyan); font: 700 8px/1 var(--prts-mono); clip-path: polygon(2px 0,calc(100% - 2px) 0,100% 2px,100% calc(100% - 2px),calc(100% - 2px) 100%,2px 100%,0 calc(100% - 2px),0 2px)}html[data-dsh-prts] [data-prts-theme-settings-close]{position: absolute; z-index: 5; top: 13px; right: 13px; width: 36px; height: 36px; color: var(--prts-ink)}html[data-dsh-prts] [data-prts-theme-settings-scroll]{min-height: 0; overflow-y: auto; padding: 12px; scrollbar-gutter: stable}html[data-dsh-prts] [data-prts-settings-presets],html[data-dsh-prts] [data-prts-settings-common],html[data-dsh-prts] [data-prts-settings-advanced],html[data-dsh-prts] [data-prts-settings-actions]{position: relative; margin: 0; overflow: hidden; border: 0; border-bottom: 1px solid var(--prts-line-strong); background: color-mix(in srgb,var(--prts-canvas-elevated) 82%,transparent); clip-path: none}html[data-dsh-prts] [data-prts-settings-presets] > header,html[data-dsh-prts] [data-prts-settings-common] > header{min-height: 42px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 9px 11px; border-bottom: 1px solid color-mix(in srgb,var(--prts-line) 72%,transparent)}html[data-dsh-prts] [data-prts-settings-presets] > header span,html[data-dsh-prts] [data-prts-settings-common] > header span,html[data-dsh-prts] [data-prts-settings-advanced] summary > span{display: flex; align-items: baseline; gap: 9px}html[data-dsh-prts] [data-prts-settings-presets] > header strong,html[data-dsh-prts] [data-prts-settings-common] > header strong,html[data-dsh-prts] [data-prts-settings-advanced] summary strong{font: 800 13px/1 var(--prts-display); letter-spacing: .05em}html[data-dsh-prts] [data-prts-advanced-summary]{pointer-events: none; color: var(--prts-cyan); font: 800 8px/1 var(--prts-mono); letter-spacing: .06em}html[data-dsh-prts] [data-prts-settings-presets],html[data-dsh-prts] [data-prts-settings-common],html[data-dsh-prts] [data-prts-settings-advanced],html[data-dsh-prts] [data-prts-settings-actions]{border-inline: 1px solid var(--prts-line-strong)}html[data-dsh-prts] [data-prts-settings-presets]{border-top: 1px solid var(--prts-line-strong)}html[data-dsh-prts] [data-prts-settings-presets] > div{display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: 0; padding: 0}html[data-dsh-prts] [data-prts-preset-card]{display: grid; text-align: left; min-height: 66px; align-content: center; gap: 6px; padding: 11px 12px !important; border-right: 1px solid var(--prts-line) !important; position: relative; overflow: hidden; box-shadow: none; background: transparent !important; clip-path: none}html[data-dsh-prts] [data-prts-preset-card]:last-child{border-right: 0 !important}html[data-dsh-prts] [data-prts-preset-card] strong{font-size: 12px}html[data-dsh-prts] [data-prts-preset-card] span{overflow: hidden; font-size: 8px; line-height: 1.35; text-overflow: ellipsis; white-space: nowrap}html[data-dsh-prts] [data-prts-preset-card].is-selected{box-shadow: inset 0 -2px 0 var(--prts-yellow); background: color-mix(in srgb,var(--prts-yellow) 9%,transparent) !important}html[data-dsh-prts] [data-prts-settings-common-grid]{display: grid; grid-template-columns: repeat(2,minmax(0,1fr))}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]{min-height: 50px; grid-template-columns: 94px minmax(0,1fr); align-items: center; gap: 8px; padding: 7px 10px; border-right: 1px solid var(--prts-line); border-bottom: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]:nth-child(2n){border-right: 0}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]:nth-last-child(-n + 2){border-bottom: 0}html[data-dsh-prts] [data-prts-setting-row] > div{min-width: 0; display: flex; gap: 4px}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row] > span{min-width: 0; display: grid; gap: 3px}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row] > span > strong{font: 700 9px/1.1 var(--prts-display)}html[data-dsh-prts] [data-prts-setting-note]{color: var(--prts-yellow); font: 700 7px/1.25 var(--prts-mono); letter-spacing: 0}html[data-dsh-prts] [data-prts-settings-common] button[data-prts-setting-key]{min-width: 0; flex: 1 1 0; display: inline-flex; align-items: center; justify-content: center; gap: 5px}html[data-dsh-prts] [data-prts-option-sample]{position: relative; width: 22px; height: 14px; flex: 0 0 22px; overflow: hidden; border: 1px solid color-mix(in srgb,currentColor 45%,var(--prts-line)); background: var(--prts-canvas)}html[data-dsh-prts] [data-prts-option-sample=\"texture\"][data-prts-option-sample-value=\"off\"]{background: linear-gradient(var(--prts-line),var(--prts-line)) 50% 50% / 12px 1px no-repeat,var(--prts-canvas)}html[data-dsh-prts] [data-prts-option-sample=\"texture\"][data-prts-option-sample-value=\"restrained\"]{background: repeating-linear-gradient(115deg,var(--prts-canvas) 0 6px,color-mix(in srgb,var(--prts-cyan) 38%,var(--prts-canvas)) 6px 7px)}html[data-dsh-prts] [data-prts-option-sample=\"texture\"][data-prts-option-sample-value=\"full\"]{background: repeating-linear-gradient(115deg,transparent 0 4px,color-mix(in srgb,var(--prts-cyan) 62%,transparent) 4px 5px),repeating-linear-gradient(25deg,var(--prts-canvas) 0 7px,color-mix(in srgb,var(--prts-line-strong) 72%,var(--prts-canvas)) 7px 8px)}html[data-dsh-prts] [data-prts-option-sample=\"glass\"]{background: linear-gradient(135deg,color-mix(in srgb,var(--prts-cyan) 54%,transparent) 25%,transparent 25%) 0 0 / 8px 8px,linear-gradient(315deg,color-mix(in srgb,var(--prts-yellow) 38%,transparent) 25%,transparent 25%) 4px 4px / 8px 8px,var(--prts-canvas)}html[data-dsh-prts] [data-prts-option-sample=\"glass\"]::after{content: \"\"; position: absolute; inset: 0; background: color-mix(in srgb,var(--prts-panel-raised) 64%,transparent); backdrop-filter: blur(2px) saturate(1.15); -webkit-backdrop-filter: blur(2px) saturate(1.15)}html[data-dsh-prts] [data-prts-option-sample=\"glass\"][data-prts-option-sample-value=\"off\"]::after{background: var(--prts-panel-raised); backdrop-filter: none; -webkit-backdrop-filter: none}html[data-dsh-prts] [data-prts-option-sample=\"glass\"][data-prts-option-sample-value=\"soft\"]::after{background: color-mix(in srgb,var(--prts-panel-raised) 82%,transparent); backdrop-filter: blur(1px); -webkit-backdrop-filter: blur(1px)}html[data-dsh-prts] [data-prts-option-sample=\"glass\"][data-prts-option-sample-value=\"standard\"]::after{background: color-mix(in srgb,var(--prts-panel-raised) 62%,transparent)}html[data-dsh-prts] [data-prts-option-sample=\"glass\"][data-prts-option-sample-value=\"clear\"]::after{background: color-mix(in srgb,var(--prts-panel-raised) 34%,transparent); backdrop-filter: blur(4px) saturate(1.35); -webkit-backdrop-filter: blur(4px) saturate(1.35)}html[data-dsh-prts] [data-prts-theme-settings] button[data-prts-setting-key],html[data-dsh-prts] [data-prts-retry-save],html[data-dsh-prts] [data-prts-reset-visual],html[data-dsh-prts] [data-prts-reset-confirm-action],html[data-dsh-prts] [data-prts-reset-cancel]{position: relative; overflow: hidden; min-height: 30px; padding: 6px 8px; border: 0 !important; box-shadow: inset 0 0 0 1px var(--prts-line); background: var(--prts-panel-raised); color: var(--prts-muted); font: 700 8px/1 var(--prts-mono); white-space: nowrap; clip-path: polygon(2px 0,calc(100% - 2px) 0,100% 2px,100% calc(100% - 2px),calc(100% - 2px) 100%,2px 100%,0 calc(100% - 2px),0 2px)}html[data-dsh-prts] [data-prts-theme-settings] button[data-prts-setting-key].is-selected{box-shadow: inset 0 0 0 1px var(--prts-yellow); background: color-mix(in srgb,var(--prts-yellow) 12%,var(--prts-panel-raised)); color: var(--prts-ink); html[data-dsh-prts] [data-prts-theme-settings] button[data-prts-setting-key]::after{content: \"\"; position: absolute; z-index: 3; inset: 0; opacity: 0; box-shadow: inset 0 0 0 1px var(--prts-yellow); background: color-mix(in srgb,var(--prts-yellow) 18%,transparent); pointer-events: none}html[data-dsh-prts] [data-prts-theme-settings] button[data-prts-setting-key][data-prts-setting-feedback]::after{opacity: 1}}html[data-dsh-prts] [data-prts-theme-settings] button:focus-visible,html[data-dsh-prts] [data-prts-theme-settings] summary:focus-visible,html[data-dsh-prts] [data-prts-theme-settings] input:focus-visible{outline: 2px solid var(--prts-cyan); outline-offset: 2px}html[data-dsh-prts] [data-prts-settings-advanced] summary{min-height: 52px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 11px; cursor: pointer; list-style: none}html[data-dsh-prts] [data-prts-settings-advanced] summary::-webkit-details-marker{display: none}html[data-dsh-prts] [data-prts-settings-advanced] summary::after{content: \"+\"; width: 24px; height: 24px; display: grid; place-items: center; margin-left: 2px; border: 1px solid var(--prts-line); color: var(--prts-cyan); font: 800 13px/1 var(--prts-mono)}html[data-dsh-prts] [data-prts-settings-advanced][open] summary::after{content: \"−\"}html[data-dsh-prts] [data-prts-settings-advanced-content]{display: grid; grid-template-columns: minmax(0,1fr); border-top: 1px solid var(--prts-line-strong)}html[data-dsh-prts] [data-prts-settings-advanced-content] > section{padding: 11px}html[data-dsh-prts] [data-prts-settings-advanced-content] > section + section{border-left: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-settings-advanced-content] section > header{min-height: 30px; display: grid; gap: 4px}html[data-dsh-prts] [data-prts-settings-advanced-content] section > header strong{font-size: 10px}html[data-dsh-prts] [data-prts-settings-advanced-content] section > header span{color: var(--prts-muted); font-size: 8px}html[data-dsh-prts] [data-prts-particle-detail] > div{display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: 5px; margin-top: 8px}html[data-dsh-prts] [data-prts-particle-detail] button[role=\"radio\"]{min-width: 0; display: grid; gap: 5px}html[data-dsh-prts] [data-prts-particle-detail-preview]{height: 32px; display: grid; grid-template-columns: repeat(6,1fr); place-items: center; overflow: hidden; border: 1px solid color-mix(in srgb,currentColor 44%,transparent)}html[data-dsh-prts] [data-prts-particle-detail-preview] b{width: 2px; height: 2px; background: currentColor}html[data-dsh-prts] [data-prts-particle-traversal]{margin-top: 9px; padding-top: 9px; border-top: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-particle-traversal] > span{display: grid; gap: 3px}html[data-dsh-prts] [data-prts-particle-traversal] > span strong{font-size: 9px}html[data-dsh-prts] [data-prts-particle-traversal] > span small{color: var(--prts-muted); font: 600 8px/1.35 var(--prts-mono)}html[data-dsh-prts] [data-prts-particle-traversal-output]{min-width: 132px; color: var(--prts-cyan); font: 800 8px/1.2 var(--prts-mono); text-align: right}html[data-dsh-prts] [data-prts-particle-error]{margin: 8px 0 0; color: var(--prts-yellow); font: 700 8px/1.4 var(--prts-mono)}html[data-dsh-prts] [data-prts-setting-range-row]{display: grid; gap: 7px; padding: 8px 0 0; border: 0}html[data-dsh-prts] [data-prts-setting-range-row] > div{display: flex; align-items: center; gap: 8px}html[data-dsh-prts] [data-prts-setting-range-row] input[type=\"range\"]{min-width: 0; flex: 1}html[data-dsh-prts] [data-prts-setting-range]{accent-color: var(--prts-cyan)}html[data-dsh-prts] [data-prts-settings-actions]{min-height: 58px; display: block; padding: 0; border-bottom: 1px solid var(--prts-line-strong)}html[data-dsh-prts] [data-prts-persistence-error],html[data-dsh-prts] [data-prts-reset-zone]{min-height: 58px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 9px 11px}html[data-dsh-prts] [data-prts-persistence-error]{border-bottom: 1px solid var(--prts-yellow); background: color-mix(in srgb,var(--prts-yellow) 7%,transparent)}html[data-dsh-prts] [data-prts-persistence-error] > span,html[data-dsh-prts] [data-prts-reset-zone] > span{display: grid; gap: 4px}html[data-dsh-prts] [data-prts-persistence-error] strong{color: var(--prts-yellow)}html[data-dsh-prts] [data-prts-reset-visual],html[data-dsh-prts] [data-prts-reset-confirm-action]{color: var(--prts-yellow); box-shadow: inset 0 0 0 1px var(--prts-yellow)}html[data-dsh-prts] [data-prts-reset-confirm]{display: flex; align-items: center; justify-content: flex-end; gap: 5px; color: var(--prts-yellow); font: 700 8px/1.3 var(--prts-mono)}html[data-dsh-prts] [hidden]{display: none !important}html[data-dsh-prts] :is( [data-prts-theme-settings-header] small,[data-prts-theme-settings] section > header small,[data-prts-theme-settings] summary small,[data-prts-settings-actions] small,[data-prts-settings-summary] span,[data-prts-advanced-summary],[data-prts-preset-card] span,[data-prts-setting-note],[data-prts-settings-advanced-content] section > header span,[data-prts-particle-error],[data-prts-reset-confirm] ){font-size: var(--prts-settings-small); line-height: 1.4}html[data-dsh-prts] :is( [data-prts-settings-presets] > header strong,[data-prts-settings-common] > header strong,[data-prts-settings-advanced] summary strong,[data-prts-preset-card] strong,[data-prts-settings-common] [data-prts-setting-row] > span > strong,[data-prts-settings-advanced-content] section > header strong,[data-prts-theme-settings] button[data-prts-setting-key],[data-prts-retry-save],[data-prts-reset-visual],[data-prts-reset-confirm-action],[data-prts-reset-cancel] ){font-size: var(--prts-settings-text); line-height: 1.25}html[data-dsh-prts] [data-prts-theme-settings-header] strong{font-size: 1.375rem; line-height: 1.1}html[data-dsh-prts] [data-prts-settings-summary] span{min-height: 28px; padding: 6px 9px}html[data-dsh-prts] [data-prts-preset-card]{min-height: 84px}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]{min-height: 72px; grid-template-columns: minmax(7.5rem,auto) minmax(0,1fr)}html[data-dsh-prts] :is( [data-prts-theme-settings] button[data-prts-setting-key],[data-prts-retry-save],[data-prts-reset-visual],[data-prts-reset-confirm-action],[data-prts-reset-cancel] ){min-height: 40px; padding: 8px 10px}@container prts-settings (max-width: 52rem){html[data-dsh-prts] [data-prts-settings-common-grid],html[data-dsh-prts] [data-prts-settings-advanced-content]{grid-template-columns: minmax(0,1fr)}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]{border-right: 0}html[data-dsh-prts] [data-prts-settings-advanced-content] > section + section{border-left: 0; border-top: 1px solid var(--prts-line)}}@media (max-height: 820px) and (min-width: 721px){html[data-dsh-prts] [data-prts-theme-settings-header]{min-height: 60px; padding-block: 10px}html[data-dsh-prts] [data-prts-theme-settings-close]{top: 10px}}@media (max-width: 720px){html[data-dsh-prts] [data-prts-theme-settings]{inset: 0; width: 100vw; height: 100dvh; max-height: none; margin: 0; transform: translateY(10px)}html[data-dsh-prts] [data-prts-theme-settings][data-prts-settings-visible]{transform: translateY(0)}html[data-dsh-prts] [data-prts-settings-frame]{height: 100%; max-height: none; clip-path: none; border: 0}html[data-dsh-prts] [data-prts-settings-frame]::before{right: 0}html[data-dsh-prts] [data-prts-theme-settings-header]{grid-template-columns: minmax(0,1fr); padding: 12px 48px 11px 13px}html[data-dsh-prts] [data-prts-settings-summary]{display: none}html[data-dsh-prts] [data-prts-theme-settings-scroll]{padding: 8px; scrollbar-gutter: auto}html[data-dsh-prts] [data-prts-settings-presets] > div{grid-template-columns: minmax(0,1fr)}html[data-dsh-prts] [data-prts-preset-card]{min-height: 54px; border-right: 0 !important; border-bottom: 1px solid var(--prts-line) !important}html[data-dsh-prts] [data-prts-preset-card]:last-child{border-bottom: 0 !important}html[data-dsh-prts] [data-prts-settings-common-grid]{grid-template-columns: minmax(0,1fr)}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]{min-height: 62px}html[data-dsh-prts] [data-prts-settings-common] button[data-prts-setting-key]{min-height: 40px}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]{border-right: 0; border-bottom: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]:nth-last-child(2){border-bottom: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-settings-common] [data-prts-setting-row]:last-child{border-bottom: 0}html[data-dsh-prts] [data-prts-settings-advanced-content]{grid-template-columns: minmax(0,1fr)}html[data-dsh-prts] [data-prts-settings-advanced-content] > section + section{border-left: 0; border-top: 1px solid var(--prts-line)}html[data-dsh-prts] [data-prts-reset-zone]{align-items: flex-start; flex-direction: column}html[data-dsh-prts] [data-prts-reset-confirm]{width: 100%; flex-wrap: wrap; justify-content: flex-start}}@media (prefers-reduced-motion: no-preference){html[data-dsh-prts] [data-prts-theme-settings] button[data-prts-setting-key][data-prts-setting-feedback]::after{animation: prts-setting-feedback 300ms ease-out both}}@keyframes prts-setting-feedback{0%{opacity: .82}100%{opacity: 0}}@media (prefers-reduced-motion: reduce){html[data-dsh-prts] [data-prts-theme-settings]{transition-duration: 1ms}}@media (prefers-reduced-transparency: reduce){html[data-dsh-prts] [data-prts-theme-settings]::backdrop,html[data-dsh-prts] [data-prts-settings-backdrop]{background: color-mix(in srgb,var(--prts-canvas) 94%,transparent); backdrop-filter: none; -webkit-backdrop-filter: none}}html[data-dsh-prts] [data-prts-facility-defs]{position: absolute; width: 0; height: 0; overflow: hidden; pointer-events: none}html[data-dsh-prts] [data-prts-facility-svg]{position: absolute; z-index: -1; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none}html[data-dsh-prts] [data-prts-facility-layer=\"surface\"]{fill: var(--prts-facility-surface,var(--prts-panel-raised))}html[data-dsh-prts] [data-prts-facility-layer=\"texture\"]{fill: none; opacity: 0; pointer-events: none; transition: opacity 160ms ease}html[data-dsh-prts] [data-prts-facility-layer=\"outline\"]{fill: none; stroke: var(--prts-facility-outline,var(--prts-line-strong)); stroke-width: 1; stroke-linejoin: miter; stroke-miterlimit: 2; vector-effect: non-scaling-stroke; shape-rendering: geometricPrecision; pointer-events: none}html[data-dsh-prts] [data-prts-facility-vector][data-prts-facility-texture=\"grid\"] [data-prts-facility-layer=\"texture\"]{fill: var(--prts-facility-texture-color,var(--prts-cyan)); opacity: var(--prts-facility-texture-opacity,.12); mask: url(\"#prts-facility-grid-mask\")}html[data-dsh-prts] [data-prts-facility-vector][data-prts-facility-texture=\"scanline\"] [data-prts-facility-layer=\"texture\"]{fill: var(--prts-facility-texture-color,var(--prts-cyan)); opacity: var(--prts-facility-texture-opacity,.1); mask: url(\"#prts-facility-scanline-mask\")}html[data-dsh-prts] [data-prts-workspace-row]{--prts-facility-texture-color: var(--prts-cyan); --prts-silhouette-fill: #f3f6f7; --prts-silhouette-far-opacity: .06; --prts-silhouette-near-opacity: .12}html[data-dsh-prts][data-prts-scheme=\"light\"] [data-prts-workspace-row]{--prts-silhouette-fill: #3f4d56; --prts-silhouette-far-opacity: .13; --prts-silhouette-near-opacity: .26}html[data-dsh-prts] [data-prts-workspace-row][aria-expanded=\"true\"],html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]){--prts-silhouette-far-opacity: .24; --prts-silhouette-near-opacity: .52}html[data-dsh-prts][data-prts-scheme=\"light\"] [data-prts-workspace-row][aria-expanded=\"true\"],html[data-dsh-prts][data-prts-scheme=\"light\"] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]){--prts-silhouette-far-opacity: .25; --prts-silhouette-near-opacity: .5}html[data-dsh-prts] [data-prts-facility-texture=\"silhouette\"] [data-prts-facility-layer=\"texture\"]{opacity: 0}html[data-dsh-prts] [data-prts-facility-silhouette]{fill: var(--prts-silhouette-fill); opacity: 0; pointer-events: none}html[data-dsh-prts] [data-prts-facility-texture=\"silhouette\"] [data-prts-facility-silhouette]{opacity: 1}html[data-dsh-prts] [data-prts-silhouette-layer]{transform-box: fill-box; transform-origin: left center; animation-timing-function: linear; animation-iteration-count: infinite; animation-play-state: paused; will-change: transform; transition: opacity 180ms ease}html[data-dsh-prts] [data-prts-silhouette-layer=\"far\"]{opacity: var(--prts-silhouette-far-opacity); animation-name: prts-silhouette-far-drift; animation-duration: 22.4s}html[data-dsh-prts] [data-prts-silhouette-layer=\"near\"]{opacity: var(--prts-silhouette-near-opacity); animation-name: prts-silhouette-near-drift; animation-duration: 6.4s}@media (prefers-reduced-motion: no-preference){html[data-dsh-prts]:not([data-prts-motion=\"reduced\"]) [data-prts-workspace-row]:hover [data-prts-silhouette-layer]{animation-play-state: running}}@keyframes prts-silhouette-far-drift{to{transform: translate3d(-512px,0,0)}}@keyframes prts-silhouette-near-drift{to{transform: translate3d(-512px,0,0)}}html[data-dsh-prts] [data-prts-facility-texture=\"pickup\"] [data-prts-facility-layer=\"texture\"]{opacity: 0}html[data-dsh-prts] [data-prts-session-pickup]{color: var(--prts-session-pickup-fill); fill: currentColor; opacity: 0; transform: translate3d(5px,0,0); transform-box: view-box; transform-origin: center; transition: opacity 150ms ease,transform 240ms cubic-bezier(.22,1,.36,1); pointer-events: none}html[data-dsh-prts] [data-prts-session-row]:hover [data-prts-facility-texture=\"pickup\"] [data-prts-session-pickup]{opacity: .58; transform: translate3d(0,0,0)}html[data-dsh-prts] [data-prts-session-pickup-baseline]{fill: none; stroke: currentColor; stroke-width: 1; opacity: .2; vector-effect: non-scaling-stroke}html[data-dsh-prts] [data-prts-session-pickup-indicator]{fill: var(--prts-yellow)}html[data-dsh-prts] [data-prts-session-pickup-bar]{transform-box: fill-box; transform-origin: center}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(1){--prts-pickup-duration: 520ms; --prts-pickup-delay: -.12s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(2){--prts-pickup-duration: 1180ms; --prts-pickup-delay: -.28s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(3){--prts-pickup-duration: 760ms; --prts-pickup-delay: -.44s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(4){--prts-pickup-duration: 1420ms; --prts-pickup-delay: -.18s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(5){--prts-pickup-duration: 640ms; --prts-pickup-delay: -.36s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(6){--prts-pickup-duration: 980ms; --prts-pickup-delay: -.52s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(7){--prts-pickup-duration: 480ms; --prts-pickup-delay: -.22s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(8){--prts-pickup-duration: 1260ms; --prts-pickup-delay: -.46s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(9){--prts-pickup-duration: 720ms; --prts-pickup-delay: -.14s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(10){--prts-pickup-duration: 1520ms; --prts-pickup-delay: -.4s}html[data-dsh-prts] [data-prts-session-pickup-bar]:nth-of-type(11){--prts-pickup-duration: 560ms; --prts-pickup-delay: -.3s}@media (prefers-reduced-motion: no-preference){html[data-dsh-prts]:not([data-prts-motion=\"reduced\"]) [data-prts-session-row]:hover [data-prts-session-pickup-indicator]{animation: prts-session-record-indicator 1.1s ease-in-out infinite}html[data-dsh-prts]:not([data-prts-motion=\"reduced\"]) [data-prts-session-row]:hover [data-prts-session-pickup-bar]{animation: prts-session-pickup-sample var(--prts-pickup-duration) ease-in-out var(--prts-pickup-delay) infinite}}@keyframes prts-session-record-indicator{0%,100%{opacity: .45}50%{opacity: 1}}@keyframes prts-session-pickup-sample{0%,100%{transform: scaleY(.28)}34%{transform: scaleY(1.08)}57%{transform: scaleY(.46)}78%{transform: scaleY(.86)}}html[data-dsh-prts] [data-prts-session-row]{--prts-facility-texture-color: var(--prts-muted); --prts-session-pickup-fill: #f3f6f7}html[data-dsh-prts][data-prts-scheme=\"light\"] [data-prts-session-row]{--prts-session-pickup-fill: #3f4d56}html[data-dsh-prts] [data-prts-session-row][aria-selected=\"true\"]{--prts-facility-texture-color: var(--prts-yellow)}html[data-dsh-prts] [data-prts-workspace-row] > [data-prts-facility-spine],html[data-dsh-prts] [data-prts-session-row] > [data-prts-facility-spine]{--prts-facility-surface: var(--prts-line-strong); position: absolute !important; z-index: 2 !important; inset: 0 auto 0 0; height: 100% !important; isolation: isolate; width: var(--prts-spine-width); min-width: 0; transform: scaleX(var(--prts-spine-rest)) !important; transform-origin: left center; transition: transform 220ms var(--prts-ease-spring); pointer-events: none}html[data-dsh-prts] [data-prts-workspace-row] > [data-prts-facility-spine]{--prts-facility-surface: var(--prts-cyan)}html[data-dsh-prts] [data-prts-session-row][aria-selected=\"true\"] > [data-prts-facility-spine]{--prts-facility-surface: var(--prts-yellow)}html[data-dsh-prts] [data-prts-facility-spine] [data-prts-facility-layer=\"outline\"]{display: none}html[data-dsh-prts] [data-prts-workspace-row][aria-expanded=\"true\"] > [data-prts-facility-spine],html[data-dsh-prts] [data-prts-workspace-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) > [data-prts-facility-spine],html[data-dsh-prts] [data-prts-session-row]:is(:hover,:focus-within,[data-prts-row-menu-open]) > [data-prts-facility-spine]{transform: scaleX(1) !important}html[data-dsh-prts] [data-prts-workspace-row][data-prts-spine-vector]::before,html[data-dsh-prts] [data-prts-session-row][data-prts-spine-vector]::before{content: none !important; display: none !important}html[data-dsh-prts] [data-prts-facility-face][data-prts-facility-vector]{border: 0 !important; background: transparent !important; clip-path: none !important}html[data-dsh-prts] [data-prts-facility-face][data-prts-facility-vector]::after{content: none !important; display: none !important}html[data-dsh-prts] :is( [data-prts-workspace-actions],[data-prts-session-actions] ) button[data-prts-facility-vector]{--prts-facility-outline: var(--prts-line); --prts-facility-surface: var(--prts-panel-raised); overflow: visible; border: 0 !important; background: transparent !important; clip-path: none !important}html[data-dsh-prts] :is( [data-prts-workspace-actions],[data-prts-session-actions] ) button[data-prts-facility-vector]::before{content: none !important; display: none !important}html[data-dsh-prts] :is( [data-prts-workspace-actions],[data-prts-session-actions] ) button[data-prts-facility-vector]:is(:hover,:focus-visible){--prts-facility-outline: var(--prts-yellow); background: transparent !important}html[data-dsh-prts] [data-prts-startup]{--prts-startup-bg: #07090b; --prts-startup-ink: #e8edef; --prts-startup-muted: #7d898f; --prts-startup-line: #394349; --prts-startup-accent: #f0c800; --prts-startup-progress: 0; position: fixed; z-index: 2147480000; inset: 0; width: 100vw; max-width: none; height: 100dvh; max-height: none; min-height: 100dvh; margin: 0; padding: 0; border: 0; overflow: hidden; isolation: isolate; box-sizing: border-box; background: transparent; color: var(--prts-startup-ink); font-family: var(--prts-body,sans-serif); opacity: 0; outline: 0; pointer-events: auto; transition: opacity 120ms ease}html[data-dsh-prts] [data-prts-startup]::before,html[data-dsh-prts] [data-prts-startup]::after{content: \"\"; position: absolute; z-index: -3; top: 0; bottom: 0; width: calc(50% + 2px); background: var(--prts-startup-bg); transition: transform 350ms cubic-bezier(.76,0,.24,1)}html[data-dsh-prts] [data-prts-startup]::before{left: 0}html[data-dsh-prts] [data-prts-startup]::after{right: 0}html[data-dsh-prts] [data-prts-startup][data-visible]{opacity: 1}html[data-dsh-prts] [data-prts-startup][data-exiting]::before{transform: translate3d(-101%,0,0)}html[data-dsh-prts] [data-prts-startup][data-exiting]::after{transform: translate3d(101%,0,0)}html[data-dsh-prts] [data-prts-startup-grid]{position: absolute; z-index: -2; inset: 0; opacity: 0; background: linear-gradient(90deg,transparent calc(50% - .5px),rgba(232,237,239,.17) 50%,transparent calc(50% + .5px)),linear-gradient(0deg,transparent calc(50% - .5px),rgba(232,237,239,.09) 50%,transparent calc(50% + .5px)),repeating-linear-gradient(90deg,rgba(232,237,239,.045) 0 1px,transparent 1px 80px),repeating-linear-gradient(0deg,rgba(232,237,239,.035) 0 1px,transparent 1px 80px); transform: scale3d(1.04,1.04,1); transition: opacity 220ms linear,transform 520ms cubic-bezier(.16,1,.3,1)}html[data-dsh-prts] [data-prts-startup][data-visible] [data-prts-startup-grid]{opacity: 1; transform: scale3d(1,1,1)}html[data-dsh-prts] [data-prts-startup-scan]{position: absolute; z-index: 4; top: -18%; right: 0; left: 0; height: 18%; opacity: 0; background: linear-gradient(180deg,transparent,rgba(240,200,0,.035) 68%,rgba(240,200,0,.24)); border-bottom: 1px solid rgba(240,200,0,.62); pointer-events: none}html[data-dsh-prts] [data-prts-startup][data-visible]:not([data-reduced-motion]) [data-prts-startup-scan]{opacity: 1; animation: prts-startup-scan 1100ms linear 120ms 2 both}html[data-dsh-prts] [data-prts-startup-cut]{position: absolute; z-index: 6; top: -15%; width: 8px; height: 130%; opacity: 0; background: var(--prts-startup-accent); transform: skewX(-13deg) translate3d(0,0,0); pointer-events: none}html[data-dsh-prts] [data-prts-startup-cut=\"left\"]{left: calc(50% - 4px)}html[data-dsh-prts] [data-prts-startup-cut=\"right\"]{right: calc(50% - 4px)}html[data-dsh-prts] [data-prts-startup][data-exiting] [data-prts-startup-cut=\"left\"]{animation: prts-startup-cut-left 350ms cubic-bezier(.76,0,.24,1) both}html[data-dsh-prts] [data-prts-startup][data-exiting] [data-prts-startup-cut=\"right\"]{animation: prts-startup-cut-right 350ms cubic-bezier(.76,0,.24,1) both}html[data-dsh-prts] [data-prts-startup-header]{position: absolute; z-index: 2; top: clamp(22px,4.5dvh,52px); right: clamp(22px,4vw,68px); left: clamp(22px,4vw,68px); display: flex; align-items: baseline; justify-content: space-between; gap: 24px; padding-bottom: 10px; border-bottom: 1px solid var(--prts-startup-line); opacity: 0; transform: translate3d(0,-9px,0); transition: opacity 180ms linear 60ms,transform 320ms cubic-bezier(.16,1,.3,1) 60ms}html[data-dsh-prts] [data-prts-startup][data-visible] [data-prts-startup-header]{opacity: 1; transform: translate3d(0,0,0)}html[data-dsh-prts] [data-prts-startup-header] span{font: 800 clamp(10px,1vw,13px)/1 var(--prts-display,sans-serif); letter-spacing: .18em}html[data-dsh-prts] [data-prts-startup-header] small,html[data-dsh-prts] [data-prts-startup-telemetry],html[data-dsh-prts] [data-prts-startup-coordinate]{color: var(--prts-startup-muted); font: 700 8px/1.35 var(--prts-mono,monospace); letter-spacing: .12em}html[data-dsh-prts] [data-prts-startup-telemetry]{position: absolute; z-index: 2; top: 50%; left: clamp(22px,4vw,68px); display: grid; gap: 12px; padding-left: 12px; border-left: 2px solid var(--prts-startup-accent); opacity: 0; transform: translate3d(-9px,-50%,0); transition: opacity 200ms linear 100ms,transform 360ms cubic-bezier(.16,1,.3,1) 100ms}html[data-dsh-prts] [data-prts-startup][data-visible] [data-prts-startup-telemetry]{opacity: 1; transform: translate3d(0,-50%,0)}html[data-dsh-prts] [data-prts-startup-core]{position: absolute; z-index: 3; top: 49%; left: 50%; width: min(76vw,560px); display: grid; justify-items: center; gap: clamp(15px,2.4dvh,26px); transform: translate3d(-50%,-50%,0)}html[data-dsh-prts] [data-prts-startup-frame]{position: relative; width: clamp(220px,27vw,320px); aspect-ratio: 1; display: grid; place-items: center}html[data-dsh-prts] [data-prts-startup-frame-outer],html[data-dsh-prts] [data-prts-startup-frame-inner]{position: absolute; inset: 15%; border: 1px solid var(--prts-startup-line); opacity: 0; transform: rotate(45deg) scale3d(.72,.72,1); transition: opacity 160ms linear,transform 420ms cubic-bezier(.16,1,.3,1)}html[data-dsh-prts] [data-prts-startup-frame-inner]{inset: 23%; border-color: rgba(240,200,0,.76); transform: rotate(-45deg) scale3d(.68,.68,1); transition-delay: 80ms}html[data-dsh-prts] [data-prts-startup-reticle]{position: absolute; inset: 7%; opacity: 0; background: linear-gradient(var(--prts-startup-accent),var(--prts-startup-accent)) 50% 0 / 1px 15% no-repeat,linear-gradient(var(--prts-startup-accent),var(--prts-startup-accent)) 50% 100% / 1px 15% no-repeat,linear-gradient(90deg,var(--prts-startup-accent),var(--prts-startup-accent)) 0 50% / 15% 1px no-repeat,linear-gradient(90deg,var(--prts-startup-accent),var(--prts-startup-accent)) 100% 50% / 15% 1px no-repeat; transform: scale3d(.8,.8,1); transition: opacity 160ms linear,transform 400ms cubic-bezier(.16,1,.3,1)}html[data-dsh-prts] [data-prts-startup-emblem]{position: relative; z-index: 2; width: 180px; max-width: 62%; height: auto; display: block; opacity: 0; clip-path: inset(48% 0 48% 0); transform: scale3d(.96,.96,1); transition: opacity 160ms linear,clip-path 380ms cubic-bezier(.16,1,.3,1),transform 420ms cubic-bezier(.16,1,.3,1)}html[data-dsh-prts] [data-prts-startup][data-stage=\"linking\"] [data-prts-startup-frame-outer],html[data-dsh-prts] [data-prts-startup][data-stage=\"authenticating\"] [data-prts-startup-frame-outer],html[data-dsh-prts] [data-prts-startup][data-stage=\"visualOnline\"] [data-prts-startup-frame-outer],html[data-dsh-prts] [data-prts-startup][data-stage=\"ready\"] [data-prts-startup-frame-outer]{opacity: .92; transform: rotate(45deg) scale3d(1,1,1)}html[data-dsh-prts] [data-prts-startup][data-stage=\"authenticating\"] :is([data-prts-startup-frame-inner],[data-prts-startup-reticle]),html[data-dsh-prts] [data-prts-startup][data-stage=\"visualOnline\"] :is([data-prts-startup-frame-inner],[data-prts-startup-reticle]),html[data-dsh-prts] [data-prts-startup][data-stage=\"ready\"] :is([data-prts-startup-frame-inner],[data-prts-startup-reticle]){opacity: 1; transform: rotate(-45deg) scale3d(1,1,1)}html[data-dsh-prts] [data-prts-startup][data-stage=\"authenticating\"] [data-prts-startup-reticle],html[data-dsh-prts] [data-prts-startup][data-stage=\"visualOnline\"] [data-prts-startup-reticle],html[data-dsh-prts] [data-prts-startup][data-stage=\"ready\"] [data-prts-startup-reticle]{transform: scale3d(1,1,1)}html[data-dsh-prts] [data-prts-startup][data-stage=\"visualOnline\"] [data-prts-startup-emblem],html[data-dsh-prts] [data-prts-startup][data-stage=\"ready\"] [data-prts-startup-emblem]{opacity: 1; clip-path: inset(0 0 0 0); transform: scale3d(1,1,1)}html[data-dsh-prts] [data-prts-startup-signature]{min-height: 44px; display: flex; align-items: center; gap: 10px; opacity: 0; transform: translate3d(0,8px,0); transition: opacity 180ms linear,transform 230ms cubic-bezier(.16,1,.3,1)}html[data-dsh-prts] [data-prts-startup-signature] > span,html[data-dsh-prts] [data-prts-startup-signature] svg{width: 42px; height: 42px; display: block}html[data-dsh-prts] [data-prts-startup-signature] small{color: var(--prts-startup-muted); font: 800 8px/1.3 var(--prts-mono,monospace); letter-spacing: .1em}html[data-dsh-prts] [data-prts-startup][data-stage=\"ready\"] [data-prts-startup-signature]{opacity: 1; transform: translate3d(0,0,0)}html[data-dsh-prts] [data-prts-startup-state]{display: grid; justify-items: center; gap: 6px; text-align: center; opacity: 1; transform: translate3d(0,0,0); transition: opacity 90ms linear,transform 90ms cubic-bezier(.4,0,1,1)}html[data-dsh-prts] [data-prts-startup][data-copy-transition] [data-prts-startup-state]{opacity: 0; transform: translate3d(0,-4px,0)}html[data-dsh-prts] [data-prts-startup-state] strong{font: 900 clamp(18px,2.4vw,30px)/1 var(--prts-display,sans-serif); letter-spacing: .16em}html[data-dsh-prts] [data-prts-startup-state] span{color: var(--prts-startup-muted); font: 700 10px/1.2 var(--prts-mono,monospace); letter-spacing: .12em}html[data-dsh-prts] [data-prts-startup-progress]{position: absolute; z-index: 3; right: clamp(22px,7vw,120px); bottom: clamp(28px,6dvh,70px); left: clamp(22px,7vw,120px); display: grid; gap: 10px; opacity: 0; transform: translate3d(0,10px,0); transition: opacity 220ms linear 100ms,transform 480ms cubic-bezier(.16,1,.3,1) 100ms}html[data-dsh-prts] [data-prts-startup][data-visible] [data-prts-startup-progress]{opacity: 1; transform: translate3d(0,0,0)}html[data-dsh-prts] [data-prts-startup-progress] output{justify-self: start; color: var(--prts-startup-muted); font: 800 9px/1 var(--prts-mono,monospace); letter-spacing: .12em}html[data-dsh-prts] [data-prts-startup-percent]{color: var(--prts-startup-ink)}html[data-dsh-prts] [data-prts-startup-track]{position: relative; height: 18px; border-top: 1px solid var(--prts-startup-line)}html[data-dsh-prts] [data-prts-startup-fill]{position: absolute; top: -2px; right: 0; left: 0; height: 3px; background: var(--prts-startup-accent); transform: scaleX(var(--prts-startup-progress)); transform-origin: left center; will-change: transform}html[data-dsh-prts] [data-prts-startup-ticks]{position: absolute; inset: 4px 0 0; display: grid; grid-template-columns: repeat(21,minmax(0,1fr))}html[data-dsh-prts] [data-prts-startup-ticks] i{width: 1px; height: 4px; background: var(--prts-startup-line)}html[data-dsh-prts] [data-prts-startup-ticks] i[data-major]{height: 9px; background: var(--prts-startup-muted)}html[data-dsh-prts] [data-prts-startup-coordinate]{position: absolute; right: clamp(22px,4vw,68px); top: 50%; writing-mode: vertical-rl; transform: translateY(-50%)}html[data-dsh-prts] [data-prts-startup][data-exit-content] > :not([data-prts-startup-cut]){opacity: 0; transition: opacity 120ms linear}html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-grid],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-header],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-telemetry],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-coordinate],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-state],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-frame-outer],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-frame-inner],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-reticle],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-emblem],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-signature],html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-progress]{opacity: 1; clip-path: none; transform: none; animation: none; transition: none}html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-frame-outer]{transform: rotate(45deg)}html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-frame-inner]{transform: rotate(-45deg)}html[data-dsh-prts] [data-prts-startup][data-reduced-motion]{transition: opacity 160ms ease}html[data-dsh-prts] [data-prts-startup][data-reduced-motion][data-exiting]{opacity: 0}html[data-dsh-prts] [data-prts-startup][data-reduced-motion][data-exiting] > :not([data-prts-startup-cut]){opacity: 1}html[data-dsh-prts] [data-prts-startup][data-reduced-motion]::before,html[data-dsh-prts] [data-prts-startup][data-reduced-motion]::after{transform: none; transition: none}html[data-dsh-prts] [data-prts-startup][data-reduced-motion] [data-prts-startup-cut]{display: none}@keyframes prts-startup-scan{from{transform: translate3d(0,0,0)}to{transform: translate3d(0,660%,0)}}@keyframes prts-startup-cut-left{0%{opacity: 0; transform: skewX(-13deg) translate3d(0,0,0)}18%{opacity: 1}100%{opacity: 0; transform: skewX(-13deg) translate3d(-50vw,0,0)}}@keyframes prts-startup-cut-right{0%{opacity: 0; transform: skewX(-13deg) translate3d(0,0,0)}18%{opacity: .72}100%{opacity: 0; transform: skewX(-13deg) translate3d(50vw,0,0)}}@media (max-width: 640px){html[data-dsh-prts] [data-prts-startup-header]{right: 18px; left: 18px}html[data-dsh-prts] [data-prts-startup-header] small,html[data-dsh-prts] [data-prts-startup-telemetry],html[data-dsh-prts] [data-prts-startup-coordinate]{display: none}html[data-dsh-prts] [data-prts-startup-core]{top: 47%; width: calc(100vw - 32px)}html[data-dsh-prts] [data-prts-startup-frame]{width: min(66vw,240px)}html[data-dsh-prts] [data-prts-startup-signature] > span,html[data-dsh-prts] [data-prts-startup-signature] svg{width: 34px; height: 34px}html[data-dsh-prts] [data-prts-startup-state] strong{max-width: 94vw; font-size: clamp(15px,5vw,22px); letter-spacing: .1em}html[data-dsh-prts] [data-prts-startup-progress]{right: 20px; bottom: max(28px,env(safe-area-inset-bottom)); left: 20px}}@media (prefers-reduced-motion: reduce){html[data-dsh-prts] [data-prts-startup] *,html[data-dsh-prts] [data-prts-startup]::before,html[data-dsh-prts] [data-prts-startup]::after{animation: none !important}}";
|
|
8
8
|
const PRTS_ASSETS = Object.freeze({
|
|
9
9
|
emblem: "<svg id=\"prts-rhodes-emblem\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 510 510\" aria-hidden=\"true\">\n <title>Rhodes Island</title>\n <!-- Fan-made vector redraw traced and size-corrected from the classic Rhodes Island emblem. -->\n <path data-emblem-ink d=\"M 265 71 C 265.589 72.100, 266.295 73, 266.570 73 C 266.845 73, 266.589 72.100, 266 71 C 265.411 69.900, 264.705 69, 264.430 69 C 264.155 69, 264.411 69.900, 265 71 M 243 76 C 242.411 77.100, 242.155 78, 242.430 78 C 242.705 78, 243.411 77.100, 244 76 C 244.589 74.900, 244.845 74, 244.570 74 C 244.295 74, 243.589 74.900, 243 76 M 268 76 C 268.589 77.100, 269.295 78, 269.570 78 C 269.845 78, 269.589 77.100, 269 76 C 268.411 74.900, 267.705 74, 267.430 74 C 267.155 74, 267.411 74.900, 268 76 M 252.585 90.626 C 251.163 93.170, 250 95.645, 250 96.126 C 250 96.607, 252.700 97, 256 97 C 259.602 97, 262 96.572, 262 95.928 C 262 94.348, 256.947 86, 255.990 86 C 255.540 86, 254.008 88.082, 252.585 90.626 M 227 103 C 226.411 104.100, 226.155 105, 226.430 105 C 226.705 105, 227.411 104.100, 228 103 C 228.589 101.900, 228.845 101, 228.570 101 C 228.295 101, 227.589 101.900, 227 103 M 284 103 C 284.589 104.100, 285.295 105, 285.570 105 C 285.845 105, 285.589 104.100, 285 103 C 284.411 101.900, 283.705 101, 283.430 101 C 283.155 101, 283.411 101.900, 284 103 M 220 115 C 219.411 116.100, 219.155 117, 219.430 117 C 219.705 117, 220.411 116.100, 221 115 C 221.589 113.900, 221.845 113, 221.570 113 C 221.295 113, 220.589 113.900, 220 115 M 245.813 113.683 C 246.534 113.972, 247.397 113.936, 247.729 113.604 C 248.061 113.272, 247.471 113.036, 246.417 113.079 C 245.252 113.127, 245.015 113.364, 245.813 113.683 M 291 115 C 291.589 116.100, 292.295 117, 292.570 117 C 292.845 117, 292.589 116.100, 292 115 C 291.411 113.900, 290.705 113, 290.430 113 C 290.155 113, 290.411 113.900, 291 115 M 285.813 143.683 C 286.534 143.972, 287.397 143.936, 287.729 143.604 C 288.061 143.272, 287.471 143.036, 286.417 143.079 C 285.252 143.127, 285.015 143.364, 285.813 143.683 M 224.813 145.683 C 225.534 145.972, 226.397 145.936, 226.729 145.604 C 227.061 145.272, 226.471 145.036, 225.417 145.079 C 224.252 145.127, 224.015 145.364, 224.813 145.683 M 218.813 150.683 C 219.534 150.972, 220.397 150.936, 220.729 150.604 C 221.061 150.272, 220.471 150.036, 219.417 150.079 C 218.252 150.127, 218.015 150.364, 218.813 150.683 M 288.813 152.683 C 289.534 152.972, 290.397 152.936, 290.729 152.604 C 291.061 152.272, 290.471 152.036, 289.417 152.079 C 288.252 152.127, 288.015 152.364, 288.813 152.683 M 218.813 153.683 C 219.534 153.972, 220.397 153.936, 220.729 153.604 C 221.061 153.272, 220.471 153.036, 219.417 153.079 C 218.252 153.127, 218.015 153.364, 218.813 153.683 M 293.813 154.683 C 294.534 154.972, 295.397 154.936, 295.729 154.604 C 296.061 154.272, 295.471 154.036, 294.417 154.079 C 293.252 154.127, 293.015 154.364, 293.813 154.683 M 191 164 C 190.411 165.100, 190.155 166, 190.430 166 C 190.705 166, 191.411 165.100, 192 164 C 192.589 162.900, 192.845 162, 192.570 162 C 192.295 162, 191.589 162.900, 191 164 M 244.979 167.215 C 244.640 171.758, 242.104 192.216, 241.853 192.434 C 241.659 192.602, 238.304 193.044, 234.397 193.416 L 227.295 194.092 226.750 181.482 C 226.451 174.547, 225.952 168.618, 225.641 168.308 C 224.968 167.635, 209.797 169.889, 208.150 170.907 C 206.946 171.652, 206.004 176.004, 203.477 192.500 C 202.635 198, 201.012 208.575, 199.872 216 C 198.731 223.425, 197.568 232.537, 197.286 236.250 L 196.774 243 200.387 243 C 203.522 243, 204 243.314, 204 245.371 C 204 247.479, 204.583 247.817, 209.250 248.419 C 212.137 248.791, 216.188 249.357, 218.250 249.676 C 221.285 250.145, 222 249.945, 222 248.628 C 222 247.548, 222.862 247, 224.559 247 C 226.017 247, 226.851 246.568, 226.498 245.996 C 226.157 245.444, 224.829 245.256, 223.548 245.577 C 222.267 245.899, 220.918 245.676, 220.550 245.081 C 219.856 243.958, 221.562 243.657, 228.235 243.724 C 230.290 243.744, 231.772 243.440, 231.529 243.047 C 231.005 242.199, 230.032 242.282, 247.500 241.672 C 255.200 241.403, 260.600 241.525, 259.501 241.942 C 258.401 242.359, 254.590 242.795, 251.031 242.910 C 247.473 243.026, 241.523 243.759, 237.810 244.540 C 234.097 245.321, 230.297 245.668, 229.366 245.310 C 228.272 244.890, 227.912 245.049, 228.350 245.758 C 228.739 246.386, 228.061 247.148, 226.765 247.540 C 224.150 248.329, 220 252.687, 220 254.643 C 220 256.030, 197.333 347.969, 196.377 350.460 C 195.900 351.703, 191.807 352.905, 179.274 355.485 C 176.645 356.026, 174.648 358.032, 168.486 366.324 C 155.420 383.909, 156.745 382.630, 150.825 383.376 C 140.257 384.708, 119.119 388.548, 118.401 389.266 C 117.997 389.670, 179.054 389.959, 254.083 389.910 C 332.364 389.858, 389.222 389.452, 387.500 388.957 C 384.541 388.106, 364.079 384.326, 356.712 383.270 C 353.216 382.768, 352.155 381.704, 342.914 369.434 L 332.903 356.142 322.983 353.848 L 313.062 351.555 310.975 342.527 C 309.827 337.562, 307.366 327.200, 305.507 319.500 C 303.647 311.800, 300.474 298.300, 298.456 289.500 C 296.437 280.700, 293.709 269.143, 292.393 263.819 C 291.077 258.494, 290 253.242, 290 252.148 C 290 249.990, 291.302 249.559, 301.250 248.425 C 306.408 247.837, 307 247.531, 307 245.451 C 307 243.665, 307.632 243.060, 309.750 242.816 C 312.382 242.514, 312.499 242.264, 312.475 237 C 312.462 233.975, 311.636 225.875, 310.641 219 C 309.646 212.125, 307.710 198.628, 306.338 189.006 C 304.967 179.384, 303.721 171.388, 303.569 171.236 C 302.800 170.467, 285.388 168.391, 284.709 168.988 C 284.273 169.370, 283.641 175.188, 283.302 181.917 C 282.709 193.711, 282.612 194.131, 280.594 193.589 C 279.442 193.280, 275.978 193.021, 272.895 193.014 L 267.290 193 266.395 180.250 L 265.500 167.500 255.250 167.215 C 249.613 167.058, 244.990 167.058, 244.979 167.215 M 336 191 C 336.589 192.100, 337.295 193, 337.570 193 C 337.845 193, 337.589 192.100, 337 191 C 336.411 189.900, 335.705 189, 335.430 189 C 335.155 189, 335.411 189.900, 336 191 M 168 203 C 167.411 204.100, 167.155 205, 167.430 205 C 167.705 205, 168.411 204.100, 169 203 C 169.589 201.900, 169.845 201, 169.570 201 C 169.295 201, 168.589 201.900, 168 203 M 241 201.965 C 238.525 202.259, 237.175 202.742, 238 203.039 C 239.869 203.710, 247.871 202.699, 246.500 201.965 C 245.950 201.670, 243.475 201.670, 241 201.965 M 274 201.378 C 274 201.585, 274.788 202.373, 275.750 203.128 C 277.336 204.371, 277.371 204.336, 276.128 202.750 C 274.821 201.084, 274 200.555, 274 201.378 M 278 201.378 C 278 201.585, 278.788 202.373, 279.750 203.128 C 281.336 204.371, 281.371 204.336, 280.128 202.750 C 278.821 201.084, 278 200.555, 278 201.378 M 343 203 C 343.589 204.100, 344.295 205, 344.570 205 C 344.845 205, 344.589 204.100, 344 203 C 343.411 201.900, 342.705 201, 342.430 201 C 342.155 201, 342.411 201.900, 343 203 M 233.733 203.124 C 234.412 203.808, 235.219 204.115, 235.526 203.807 C 235.834 203.499, 235.279 202.940, 234.293 202.564 C 232.868 202.022, 232.753 202.136, 233.733 203.124 M 270 202.393 C 270 202.609, 270.698 203.054, 271.552 203.382 C 272.442 203.723, 272.843 203.555, 272.493 202.989 C 271.906 202.038, 270 201.583, 270 202.393 M 227.250 203.689 C 228.213 203.941, 229.787 203.941, 230.750 203.689 C 231.713 203.438, 230.925 203.232, 229 203.232 C 227.075 203.232, 226.287 203.438, 227.250 203.689 M 258.250 235.732 C 253.176 236.189, 252.530 238, 257.441 238 C 259.334 238, 261.190 238.498, 261.566 239.107 C 262.048 239.886, 262.486 239.831, 263.049 238.921 C 263.695 237.875, 264.196 237.897, 265.674 239.034 C 266.678 239.807, 266.409 239.216, 265.076 237.720 C 263.742 236.224, 262.617 235.079, 262.576 235.175 C 262.534 235.271, 260.587 235.522, 258.250 235.732 M 340.504 236.373 C 338.696 237.696, 338.710 237.773, 340.888 238.465 C 342.133 238.860, 343.417 238.917, 343.742 238.591 C 344.067 238.266, 343.528 238, 342.544 238 C 341.067 238, 340.972 237.738, 342 236.500 C 343.552 234.629, 342.958 234.579, 340.504 236.373 M 238.335 236.668 C 239.263 237.596, 252.001 237.673, 252 236.750 C 252 236.338, 248.775 236, 244.833 236 C 240.892 236, 237.967 236.301, 238.335 236.668 M 220.815 240.864 C 222.032 241.636, 227 241.250, 227 240.383 C 227 240.173, 225.313 240.007, 223.250 240.015 C 220.860 240.025, 219.977 240.333, 220.815 240.864 M 343.507 241.989 C 343.157 242.555, 343.558 242.723, 344.448 242.382 C 346.180 241.717, 346.497 241, 345.059 241 C 344.541 241, 343.843 241.445, 343.507 241.989 M 168.813 242.683 C 169.534 242.972, 170.397 242.936, 170.729 242.604 C 171.061 242.272, 170.471 242.036, 169.417 242.079 C 168.252 242.127, 168.015 242.364, 168.813 242.683 M 164.083 243.365 C 164.313 243.565, 165.625 244.265, 167 244.920 C 169.357 246.042, 169.389 246.022, 167.559 244.555 C 165.966 243.279, 162.711 242.164, 164.083 243.365 M 163.269 247.693 C 164.242 247.947, 165.592 247.930, 166.269 247.656 C 166.946 247.382, 166.150 247.175, 164.500 247.195 C 162.850 247.215, 162.296 247.439, 163.269 247.693 M 234.269 247.693 C 235.242 247.947, 236.592 247.930, 237.269 247.656 C 237.946 247.382, 237.150 247.175, 235.500 247.195 C 233.850 247.215, 233.296 247.439, 234.269 247.693 M 230 248.703 C 230 249.857, 232.838 252.523, 233.395 251.893 C 233.586 251.677, 232.900 250.634, 231.871 249.575 C 230.842 248.516, 230 248.124, 230 248.703 M 348.441 250.555 C 346.611 252.022, 346.643 252.042, 349 250.920 C 352.061 249.462, 352.628 249, 351.358 249 C 350.821 249, 349.509 249.700, 348.441 250.555 M 372 252 C 372.589 253.100, 373.295 254, 373.570 254 C 373.845 254, 373.589 253.100, 373 252 C 372.411 250.900, 371.705 250, 371.430 250 C 371.155 250, 371.411 250.900, 372 252 M 351.507 254.989 C 351.157 255.555, 351.558 255.723, 352.448 255.382 C 354.180 254.717, 354.497 254, 353.059 254 C 352.541 254, 351.843 254.445, 351.507 254.989 M 156.083 255.356 C 156.313 255.552, 158.075 256.002, 160 256.355 C 162.462 256.807, 163.055 256.706, 162 256.014 C 160.644 255.125, 155.092 254.508, 156.083 255.356 M 352.500 259 C 351.718 260.266, 353.042 260.266, 355 259 C 356.293 258.165, 356.266 258.029, 354.809 258.015 C 353.879 258.007, 352.840 258.450, 352.500 259 M 154.250 262.689 C 155.213 262.941, 156.787 262.941, 157.750 262.689 C 158.713 262.438, 157.925 262.232, 156 262.232 C 154.075 262.232, 153.287 262.438, 154.250 262.689 M 357.441 266.555 C 355.611 268.022, 355.643 268.042, 358 266.920 C 361.061 265.462, 361.628 265, 360.358 265 C 359.821 265, 358.509 265.700, 357.441 266.555 M 149 269.393 C 149 269.609, 149.698 270.054, 150.552 270.382 C 151.442 270.723, 151.843 270.555, 151.493 269.989 C 150.906 269.038, 149 268.583, 149 269.393 M 360.507 269.989 C 360.157 270.555, 360.558 270.723, 361.448 270.382 C 363.180 269.717, 363.497 269, 362.059 269 C 361.541 269, 360.843 269.445, 360.507 269.989 M 362 275 C 361.099 275.582, 360.975 275.975, 361.691 275.985 C 362.346 275.993, 363.160 275.550, 363.500 275 C 364.267 273.758, 363.921 273.758, 362 275 M 143 277.449 C 143 277.724, 144.350 278.647, 146 279.500 C 147.650 280.353, 149 280.826, 149 280.551 C 149 280.276, 147.650 279.353, 146 278.500 C 144.350 277.647, 143 277.174, 143 277.449 M 364.500 279 C 362.870 279.701, 362.812 279.872, 364.191 279.930 C 365.121 279.968, 366.160 279.550, 366.500 279 C 367.211 277.850, 367.176 277.850, 364.500 279 M 141 281.350 C 141 281.581, 142.180 282.543, 143.623 283.489 C 145.066 284.434, 145.941 284.713, 145.567 284.109 C 144.854 282.955, 141 280.626, 141 281.350 M 367 284 C 366.099 284.582, 365.975 284.975, 366.691 284.985 C 367.346 284.993, 368.160 284.550, 368.500 284 C 369.267 282.758, 368.921 282.758, 367 284 M 116 291 C 115.411 292.100, 115.155 293, 115.430 293 C 115.705 293, 116.411 292.100, 117 291 C 117.589 289.900, 117.845 289, 117.570 289 C 117.295 289, 116.589 289.900, 116 291 M 370 290 C 369.099 290.582, 368.975 290.975, 369.691 290.985 C 370.346 290.993, 371.160 290.550, 371.500 290 C 372.267 288.758, 371.921 288.758, 370 290 M 395 291 C 395.589 292.100, 396.295 293, 396.570 293 C 396.845 293, 396.589 292.100, 396 291 C 395.411 289.900, 394.705 289, 394.430 289 C 394.155 289, 394.411 289.900, 395 291 M 139.813 290.683 C 140.534 290.972, 141.397 290.936, 141.729 290.604 C 142.061 290.272, 141.471 290.036, 140.417 290.079 C 139.252 290.127, 139.015 290.364, 139.813 290.683 M 136.500 293 C 137.600 293.473, 139.175 293.859, 140 293.859 C 140.945 293.859, 140.761 293.542, 139.500 293 C 138.400 292.527, 136.825 292.141, 136 292.141 C 135.055 292.141, 135.239 292.458, 136.500 293 M 113 296 C 112.411 297.100, 112.155 298, 112.430 298 C 112.705 298, 113.411 297.100, 114 296 C 114.589 294.900, 114.845 294, 114.570 294 C 114.295 294, 113.589 294.900, 113 296 M 398 296 C 398.589 297.100, 399.295 298, 399.570 298 C 399.845 298, 399.589 297.100, 399 296 C 398.411 294.900, 397.705 294, 397.430 294 C 397.155 294, 397.411 294.900, 398 296 M 135.813 298.683 C 136.534 298.972, 137.397 298.936, 137.729 298.604 C 138.061 298.272, 137.471 298.036, 136.417 298.079 C 135.252 298.127, 135.015 298.364, 135.813 298.683 M 132.083 299.283 C 132.313 299.439, 133.400 300.226, 134.500 301.033 C 136.350 302.390, 136.397 302.369, 135.128 300.750 C 134.373 299.788, 133.285 299, 132.711 299 C 132.137 299, 131.854 299.127, 132.083 299.283 M 377 301 C 376.099 301.582, 375.975 301.975, 376.691 301.985 C 377.346 301.993, 378.160 301.550, 378.500 301 C 379.267 299.758, 378.921 299.758, 377 301 M 128 303.393 C 128 303.609, 128.698 304.054, 129.552 304.382 C 130.442 304.723, 130.843 304.555, 130.493 303.989 C 129.906 303.038, 128 302.583, 128 303.393 M 381.507 303.989 C 381.157 304.555, 381.558 304.723, 382.448 304.382 C 384.180 303.717, 384.497 303, 383.059 303 C 382.541 303, 381.843 303.445, 381.507 303.989 M 103 313 C 102.411 314.100, 102.155 315, 102.430 315 C 102.705 315, 103.411 314.100, 104 313 C 104.589 311.900, 104.845 311, 104.570 311 C 104.295 311, 103.589 311.900, 103 313 M 408 313 C 408.589 314.100, 409.295 315, 409.570 315 C 409.845 315, 409.589 314.100, 409 313 C 408.411 311.900, 407.705 311, 407.430 311 C 407.155 311, 407.411 311.900, 408 313 M 241.702 312.631 C 241.355 312.979, 238.805 313.212, 236.035 313.149 C 231.923 313.057, 230.979 313.354, 230.885 314.768 C 230.821 315.721, 230.686 316.950, 230.585 317.500 C 229.465 323.573, 228.408 326.065, 225.979 328.358 C 224.404 329.844, 222.855 331.882, 222.536 332.887 C 222.217 333.892, 220.953 335.194, 219.728 335.781 C 217.803 336.703, 218.006 336.792, 221.220 336.434 C 223.266 336.206, 225.291 335.962, 225.720 335.892 C 227.910 335.531, 230 336.124, 230 337.107 C 230 337.718, 229.272 337.935, 228.373 337.590 C 227.479 337.246, 226.202 337.417, 225.537 337.969 C 224.872 338.522, 221.775 339.155, 218.655 339.377 C 215.536 339.599, 211.923 340.476, 210.626 341.325 C 208.793 342.526, 207.968 342.606, 206.911 341.685 C 206.164 341.033, 206.329 341.435, 207.277 342.579 C 209.301 345.020, 209.754 348.154, 207.800 346.200 C 205.694 344.094, 204.842 344.915, 206.872 347.093 C 209.099 349.484, 215 350.365, 215 348.307 C 215 347.302, 217.844 347, 227.327 347 L 239.654 347 240.860 340.457 C 241.523 336.859, 241.799 333.484, 241.474 332.957 C 241.148 332.431, 239.334 332, 237.441 332 C 235.178 332, 234 331.526, 234 330.617 C 234 329.856, 233.100 328.998, 232 328.710 C 230.900 328.423, 230 327.643, 230 326.977 C 230 326.259, 230.814 325.979, 232 326.290 C 233.100 326.577, 234 326.389, 234 325.871 C 234 325.325, 234.841 325.380, 236 326 C 237.434 326.767, 238 326.760, 238 325.976 C 238 325.374, 238.450 325.160, 239 325.500 C 239.550 325.840, 240 325.668, 240 325.118 C 240 323.588, 238.223 322.831, 237.776 324.171 C 237.559 324.822, 236.846 325.023, 236.191 324.618 C 234.473 323.556, 234.723 321.956, 236.500 322.638 C 237.325 322.955, 238 322.700, 238 322.072 C 238 321.276, 238.554 321.226, 239.824 321.906 C 241.394 322.746, 241.881 322.231, 243.329 318.191 C 244.253 315.611, 245.008 313.163, 245.005 312.750 C 244.999 311.839, 242.581 311.753, 241.702 312.631 M 388 315.059 C 388 315.641, 388.450 315.840, 389 315.500 C 389.550 315.160, 390 314.684, 390 314.441 C 390 314.198, 389.550 314, 389 314 C 388.450 314, 388 314.477, 388 315.059 M 389.441 318.555 C 387.577 320.049, 387.589 320.067, 389.750 319.020 C 390.988 318.420, 392 317.720, 392 317.465 C 392 316.700, 391.481 316.921, 389.441 318.555 M 119.589 318.856 C 119.298 319.326, 120.172 319.499, 121.530 319.239 C 122.889 318.979, 124 318.594, 124 318.383 C 124 317.610, 120.101 318.027, 119.589 318.856 M 96.500 324 C 95.647 325.650, 95.174 327, 95.449 327 C 95.724 327, 96.647 325.650, 97.500 324 C 98.353 322.350, 98.826 321, 98.551 321 C 98.276 321, 97.353 322.350, 96.500 324 M 414.500 324 C 415.353 325.650, 416.276 327, 416.551 327 C 416.826 327, 416.353 325.650, 415.500 324 C 414.647 322.350, 413.724 321, 413.449 321 C 413.174 321, 413.647 322.350, 414.500 324 M 117.750 323.662 C 118.438 323.940, 119.563 323.940, 120.250 323.662 C 120.938 323.385, 120.375 323.158, 119 323.158 C 117.625 323.158, 117.063 323.385, 117.750 323.662 M 249 326.893 C 249 327.384, 249.739 328.069, 250.641 328.416 C 252.014 328.943, 252.076 328.796, 251.019 327.523 C 249.579 325.788, 249 325.607, 249 326.893 M 289 328.929 C 289 329.518, 288.298 330, 287.441 330 C 286.584 330, 286.174 330.472, 286.530 331.049 C 286.974 331.766, 287.568 331.774, 288.413 331.072 C 289.266 330.365, 290.012 330.412, 290.824 331.224 C 291.471 331.871, 292 332.053, 292 331.629 C 292 331.204, 291.325 330.182, 290.500 329.357 C 289.675 328.532, 289 328.339, 289 328.929 M 90 335 C 89.411 336.100, 89.155 337, 89.430 337 C 89.705 337, 90.411 336.100, 91 335 C 91.589 333.900, 91.845 333, 91.570 333 C 91.295 333, 90.589 333.900, 90 335 M 421 335 C 421.589 336.100, 422.295 337, 422.570 337 C 422.845 337, 422.589 336.100, 422 335 C 421.411 333.900, 420.705 333, 420.430 333 C 420.155 333, 420.411 333.900, 421 335 M 110 334.430 C 110 334.705, 110.900 335.411, 112 336 C 113.100 336.589, 114 336.845, 114 336.570 C 114 336.295, 113.100 335.589, 112 335 C 110.900 334.411, 110 334.155, 110 334.430 M 87 340 C 86.411 341.100, 86.155 342, 86.430 342 C 86.705 342, 87.411 341.100, 88 340 C 88.589 338.900, 88.845 338, 88.570 338 C 88.295 338, 87.589 338.900, 87 340 M 424 340 C 424.589 341.100, 425.295 342, 425.570 342 C 425.845 342, 425.589 341.100, 425 340 C 424.411 338.900, 423.705 338, 423.430 338 C 423.155 338, 423.411 338.900, 424 340 M 430.500 351 C 431.353 352.650, 432.276 354, 432.551 354 C 432.826 354, 432.353 352.650, 431.500 351 C 430.647 349.350, 429.724 348, 429.449 348 C 429.174 348, 429.647 349.350, 430.500 351 M 239.856 349.990 C 238.402 350.419, 232.777 350.807, 227.356 350.851 C 213.724 350.963, 208.330 351.673, 202.378 354.140 C 198.407 355.785, 197.362 356.668, 197.728 358.067 C 198.151 359.686, 193.687 366.973, 191.744 367.835 C 191.328 368.020, 191.245 368.587, 191.559 369.095 C 191.873 369.603, 191.201 371.201, 190.065 372.645 C 188.929 374.088, 188 376.334, 188 377.635 C 188 379.972, 186.479 380.933, 185.833 379.003 C 185.650 378.454, 184.175 379.144, 182.556 380.536 C 180.937 381.927, 179.025 382.840, 178.308 382.565 C 177.590 382.289, 175.989 382.479, 174.751 382.988 C 173.253 383.603, 178.251 383.899, 189.694 383.873 C 201.878 383.846, 207.003 383.494, 207.282 382.667 C 207.567 381.820, 208.131 381.877, 209.337 382.872 C 210.768 384.054, 211 384.019, 211 382.622 C 211 381.730, 211.563 380.993, 212.250 380.985 C 213.118 380.974, 213.061 380.692, 212.064 380.061 C 211.025 379.403, 210.920 378.786, 211.683 377.826 C 212.262 377.097, 213.301 373.439, 213.991 369.698 C 215.274 362.742, 216.852 360.088, 219.821 359.886 C 225.387 359.508, 227.287 358.868, 228.966 356.807 L 230.843 354.500 233.922 357.437 C 235.615 359.052, 237 359.826, 237 359.156 C 237 358.486, 236.325 357.678, 235.500 357.362 C 233.568 356.620, 233.555 355, 235.481 355 C 236.295 355, 237.228 356.062, 237.554 357.360 C 237.977 359.046, 238.768 359.654, 240.323 359.488 C 241.520 359.360, 243.118 359.198, 243.872 359.128 C 244.921 359.030, 244.976 358.676, 244.105 357.627 C 243.478 356.871, 243.234 355.554, 243.562 354.700 C 244.008 353.536, 243.664 353.275, 242.192 353.660 C 241.110 353.943, 239.887 353.627, 239.474 352.957 C 238.990 352.175, 239.217 351.908, 240.111 352.209 C 240.875 352.467, 242.905 352.093, 244.623 351.378 C 247.581 350.148, 249 350.382, 249 352.099 C 249 352.521, 248.100 353.151, 247 353.500 C 244.293 354.359, 244.476 355.470, 247.352 355.635 C 249.290 355.746, 249.717 355.264, 249.784 352.885 C 249.829 351.298, 249.559 349.970, 249.183 349.933 C 248.807 349.895, 247.150 349.718, 245.500 349.537 C 243.850 349.357, 241.310 349.561, 239.856 349.990 M 80 352 C 79.411 353.100, 79.155 354, 79.430 354 C 79.705 354, 80.411 353.100, 81 352 C 81.589 350.900, 81.845 350, 81.570 350 C 81.295 350, 80.589 350.900, 80 352 M 70.500 368 C 69.647 369.650, 69.174 371, 69.449 371 C 69.724 371, 70.647 369.650, 71.500 368 C 72.353 366.350, 72.826 365, 72.551 365 C 72.276 365, 71.353 366.350, 70.500 368 M 440.500 368 C 441.353 369.650, 442.276 371, 442.551 371 C 442.826 371, 442.353 369.650, 441.500 368 C 440.647 366.350, 439.724 365, 439.449 365 C 439.174 365, 439.647 366.350, 440.500 368 M 62.771 381.250 C 60.583 384.623, 58.621 388.640, 59.718 387.500 C 61.120 386.043, 65.245 379, 64.697 379 C 64.440 379, 63.573 380.012, 62.771 381.250 M 450.500 385 C 451.353 386.650, 452.276 388, 452.551 388 C 452.826 388, 452.353 386.650, 451.500 385 C 450.647 383.350, 449.724 382, 449.449 382 C 449.174 382, 449.647 383.350, 450.500 385 M 54 396 C 53.411 397.100, 53.155 398, 53.430 398 C 53.705 398, 54.411 397.100, 55 396 C 55.589 394.900, 55.845 394, 55.570 394 C 55.295 394, 54.589 394.900, 54 396 M 457 396 C 457.589 397.100, 458.295 398, 458.570 398 C 458.845 398, 458.589 397.100, 458 396 C 457.411 394.900, 456.705 394, 456.430 394 C 456.155 394, 456.411 394.900, 457 396 M 289.157 396.997 C 284.674 398.054, 283.600 399.331, 283.600 403.603 C 283.600 406.653, 284.399 407.957, 288.800 412.089 C 294.065 417.033, 295.289 420.311, 292.800 422.800 C 290.577 425.023, 286.069 424.246, 284.781 421.418 C 283.606 418.840, 283.603 418.840, 282.787 421.047 C 281.591 424.280, 283.566 426, 288.476 426 C 293.949 426, 298 422.553, 298 417.897 C 298 415.333, 296.910 413.643, 292.500 409.372 C 286.734 403.787, 285.693 400.770, 288.934 399.035 C 291.715 397.547, 292.670 397.730, 294.961 400.189 L 297 402.377 297 399.689 C 297 398.210, 296.587 397, 296.082 397 C 295.577 397, 294.564 396.822, 293.832 396.604 C 293.099 396.387, 290.996 396.563, 289.157 396.997 M 338.728 396.605 C 338.328 397.006, 337.986 403.221, 337.968 410.417 C 337.930 425.990, 337.502 425.873, 330.911 408.493 C 328.514 402.172, 326.049 397, 325.433 397 C 324.817 397, 322.105 402.962, 319.407 410.250 C 314.653 423.087, 314.404 423.509, 311.415 423.801 C 306.394 424.291, 305.789 422.590, 306.165 409.044 L 306.500 396.997 303.815 396.999 L 301.130 397 301.677 405.750 C 301.977 410.563, 301.794 416.808, 301.270 419.629 L 300.317 424.757 307.832 425.240 C 317.344 425.850, 319 425.419, 319 422.334 C 319 420.996, 319.700 418.546, 320.556 416.891 C 321.862 414.367, 322.623 413.931, 325.277 414.191 C 328.079 414.465, 328.674 415.102, 330.464 419.750 L 332.486 425 338.493 424.921 C 341.797 424.878, 343.938 424.615, 343.250 424.338 C 342.375 423.985, 342 421.030, 342 414.494 L 342 405.156 352.423 415.821 C 358.156 421.687, 363.070 426.263, 363.343 425.990 C 363.617 425.717, 363.989 419.082, 364.170 411.245 L 364.500 396.997 361.820 396.999 C 359.273 397, 359.186 397.161, 360.070 400.243 C 360.581 402.027, 360.979 406.865, 360.952 410.993 L 360.905 418.500 350.181 407.188 C 344.283 400.967, 339.129 396.204, 338.728 396.605 M 120.500 410.900 L 120.500 424.998 123.500 425.001 L 126.500 425.004 126.161 419.002 C 125.704 410.896, 127.123 411.112, 134.368 420.250 C 138.068 424.917, 138.233 425, 143.817 425.002 L 149.500 425.003 149.500 417.752 L 149.500 410.500 156.500 410.500 L 163.500 410.500 163.808 414.210 C 163.977 416.251, 163.676 419.513, 163.139 421.460 L 162.161 425 166.203 425 C 169.623 425, 170.059 424.777, 169.040 423.548 C 168.199 422.535, 167.935 418.305, 168.167 409.547 L 168.500 396.997 165.741 396.999 C 163.019 397, 162.985 397.077, 163.241 402.750 L 163.500 408.500 156.250 408.794 L 149 409.088 149 403.044 C 149 397.118, 148.947 397, 146.250 396.999 L 143.500 396.997 143.829 409.999 C 144.037 418.172, 143.790 423, 143.164 423 C 141.920 423, 134 414.088, 134 412.688 C 134 412.121, 134.670 410.918, 135.488 410.013 C 138.072 407.158, 138.390 402.703, 136.203 400.002 C 134.546 397.955, 133.173 397.519, 127.370 397.190 L 120.500 396.801 120.500 410.900 M 177.841 398.524 C 173.799 400.720, 171 405.994, 171 411.418 C 171 417.617, 173.179 421.540, 177.981 423.990 C 188.943 429.582, 201.010 422.767, 200.982 411 C 200.968 405.329, 199.381 402.173, 195.088 399.280 C 191.091 396.586, 182.132 396.194, 177.841 398.524 M 203.500 410.958 L 203.500 424.916 208.657 425.562 C 216.392 426.530, 221.727 425.277, 225.811 421.534 C 228.969 418.640, 229.399 417.633, 229.791 412.211 C 230.573 401.402, 225.217 397.001, 211.282 396.999 L 203.500 396.999 203.500 410.958 M 232.500 410.884 L 232.500 424.770 237.848 425.323 C 240.790 425.627, 244.165 425.514, 245.348 425.073 C 246.532 424.631, 248.400 424.627, 249.500 425.064 C 253.138 426.511, 257.686 426.035, 260.365 423.927 C 262.417 422.313, 263 420.981, 263 417.905 C 263 414.428, 262.339 413.315, 257.483 408.612 C 252.678 403.958, 252.078 402.960, 252.841 400.884 C 254.017 397.680, 258.429 397.112, 260.193 399.938 C 261.922 402.706, 263 402.538, 263 399.500 C 263 397.182, 262.652 397, 258.223 397 C 251.989 397, 249 399.075, 249 403.403 C 249 406.046, 250.081 407.790, 254.500 412.281 C 260.269 418.143, 260.827 419.486, 258.701 422.395 C 256.870 424.899, 251.803 424.190, 250.513 421.250 C 249.463 418.856, 248 418.225, 248 420.167 C 248 420.808, 247.703 421.036, 247.340 420.673 C 246.977 420.310, 246.033 420.936, 245.243 422.063 C 244.277 423.442, 242.937 424.014, 241.153 423.807 C 238.635 423.516, 238.485 423.181, 238.202 417.250 C 237.910 411.122, 237.955 411, 240.484 411 C 241.902 411, 243.322 411.675, 243.638 412.500 C 244.605 415.018, 246 414.173, 246 411.070 C 246 408.352, 245.801 408.196, 243.250 408.916 C 238.884 410.148, 238 409.306, 238 403.917 C 238 399.161, 238.095 399, 240.893 399 C 242.709 399, 244.052 399.651, 244.500 400.750 C 245.156 402.356, 245.282 402.336, 246.037 400.500 C 247.428 397.118, 247.215 397, 239.750 396.999 L 232.500 396.999 232.500 410.884 M 273.808 410.154 C 274.042 420.168, 273.803 423.509, 272.808 424.140 C 271.991 424.658, 273.046 424.975, 275.613 424.985 L 279.727 425 278.752 419.750 C 278.216 416.863, 278.023 410.563, 278.323 405.750 L 278.870 397 276.185 396.998 L 273.500 396.996 273.808 410.154 M 369.832 408.912 C 370.033 416.150, 369.742 421.614, 369.089 422.834 C 368.077 424.724, 368.401 424.884, 374.610 425.549 C 388.082 426.991, 396 421.606, 396 411 C 396 401.518, 389.941 397.061, 377 397.021 L 369.500 396.997 369.832 408.912 M 127.243 398.850 C 126.651 399.215, 126.041 402.211, 125.886 405.507 C 125.625 411.061, 125.769 411.524, 127.857 411.827 C 131.104 412.298, 133 410.265, 133 406.312 C 133 400.871, 130.085 397.093, 127.243 398.850 M 180.277 399.973 C 177.304 401.785, 176.817 402.736, 175.540 409.225 C 174.858 412.688, 177.272 419.051, 180.203 421.517 C 184.378 425.030, 189.291 424.862, 193.077 421.077 C 195.615 418.539, 196 417.413, 196 412.527 C 196 400.657, 188.706 394.833, 180.277 399.973 M 74 400.059 C 74 400.641, 74.450 400.840, 75 400.500 C 75.550 400.160, 76 399.684, 76 399.441 C 76 399.198, 75.550 399, 75 399 C 74.450 399, 74 399.477, 74 400.059 M 208.750 399.570 C 207.651 400.688, 207.834 418.433, 208.975 421.435 C 209.820 423.658, 210.544 424, 214.399 424 C 225.450 424, 230.011 409.996, 221.549 402.046 C 219.024 399.674, 210.305 397.987, 208.750 399.570 M 374.667 399.667 C 373.442 400.892, 373.917 421.517, 375.200 422.800 C 377.125 424.725, 384.401 424.259, 387.236 422.029 C 392.912 417.564, 392.511 406.017, 386.521 401.448 C 383.423 399.086, 376.316 398.018, 374.667 399.667 M 438.079 401.583 C 438.127 402.748, 438.364 402.985, 438.683 402.188 C 438.972 401.466, 438.936 400.603, 438.604 400.271 C 438.272 399.939, 438.036 400.529, 438.079 401.583 M 84.567 406.433 C 83.705 407.845, 82.315 410.125, 81.477 411.500 L 79.954 414 86.541 414 L 93.128 414 90.848 409.943 C 87.506 403.997, 86.423 403.392, 84.567 406.433 M 421.542 408.338 C 420.144 410.724, 419 412.974, 419 413.338 C 419 413.702, 421.726 414, 425.058 414 L 431.115 414 428.308 409.001 C 426.763 406.252, 425.181 404.002, 424.792 404.001 C 424.403 404, 422.940 405.952, 421.542 408.338 M 323.613 407.407 C 323.280 408.731, 322.733 410.531, 322.397 411.407 C 321.937 412.607, 322.414 413, 324.334 413 C 327.700 413, 328.092 412.123, 326.459 408.240 C 324.830 404.365, 324.407 404.242, 323.613 407.407 M 47 408 C 46.411 409.100, 46.155 410, 46.430 410 C 46.705 410, 47.411 409.100, 48 408 C 48.589 406.900, 48.845 406, 48.570 406 C 48.295 406, 47.589 406.900, 47 408 M 464 408 C 464.589 409.100, 465.295 410, 465.570 410 C 465.845 410, 465.589 409.100, 465 408 C 464.411 406.900, 463.705 406, 463.430 406 C 463.155 406, 463.411 406.900, 464 408 M 445.813 412.683 C 446.534 412.972, 447.397 412.936, 447.729 412.604 C 448.061 412.272, 447.471 412.036, 446.417 412.079 C 445.252 412.127, 445.015 412.364, 445.813 412.683 M 471 420 C 471.589 421.100, 472.295 422, 472.570 422 C 472.845 422, 472.589 421.100, 472 420 C 471.411 418.900, 470.705 418, 470.430 418 C 470.155 418, 470.411 418.900, 471 420 M 57.216 422.184 C 56.547 422.853, 56 423.992, 56 424.716 C 56 425.778, 61.342 425.980, 83.750 425.766 C 110.745 425.507, 111.500 425.446, 111.500 423.500 C 111.500 421.557, 110.745 421.492, 84.966 421.234 C 65.167 421.036, 58.123 421.277, 57.216 422.184 M 399.380 422.452 C 399.074 423.251, 399.114 424.376, 399.470 424.952 C 400.148 426.049, 456 426.525, 456 425.434 C 456 425.123, 455.534 423.998, 454.965 422.934 C 453.981 421.095, 452.600 421, 426.933 421 C 404.255 421, 399.848 421.232, 399.380 422.452 M 34 430 C 33.411 431.100, 33.155 432, 33.430 432 C 33.705 432, 34.411 431.100, 35 430 C 35.589 428.900, 35.845 428, 35.570 428 C 35.295 428, 34.589 428.900, 34 430 M 477 430 C 477.589 431.100, 478.295 432, 478.570 432 C 478.845 432, 478.589 431.100, 478 430 C 477.411 428.900, 476.705 428, 476.430 428 C 476.155 428, 476.411 428.900, 477 430 M 144.750 442.750 C 205.937 442.892, 306.062 442.892, 367.250 442.750 C 428.437 442.608, 378.375 442.491, 256 442.491 C 133.625 442.491, 83.562 442.608, 144.750 442.750\" fill=\"#07090a\" fill-rule=\"evenodd\"/>\n <path data-emblem-knockout d=\"M 237.383 86.769 C 227.418 103.671, 213.303 127.625, 206.016 140 C 198.728 152.375, 191.761 164.075, 190.532 166 C 189.303 167.925, 184.103 176.700, 178.976 185.500 C 173.848 194.300, 164.855 209.600, 158.991 219.500 C 145.174 242.827, 125.966 275.399, 123.018 280.500 C 121.747 282.700, 114.851 294.400, 107.693 306.500 C 100.536 318.600, 86.593 342.225, 76.709 359 C 66.825 375.775, 52.881 399.400, 45.722 411.500 C 27.127 442.931, 27.633 441.999, 29.165 442.005 C 67.412 442.163, 483.394 441.939, 483.570 441.761 C 483.711 441.617, 482.235 438.800, 480.288 435.500 C 478.341 432.200, 471.467 420.500, 465.012 409.500 C 450.955 385.544, 422.370 337.052, 404 306 C 396.679 293.625, 389.231 280.952, 387.449 277.838 C 385.666 274.724, 379.717 264.599, 374.228 255.338 C 362.449 235.466, 339.219 196.180, 323.472 169.500 C 317.304 159.050, 305.325 138.800, 296.851 124.500 C 288.377 110.200, 275.832 88.950, 268.972 77.279 C 262.112 65.607, 256.275 56.053, 256 56.047 C 255.725 56.042, 247.347 69.866, 237.383 86.769 M 252.585 90.626 C 251.163 93.170, 250 95.645, 250 96.126 C 250 96.607, 252.700 97, 256 97 C 259.602 97, 262 96.572, 262 95.928 C 262 94.348, 256.947 86, 255.990 86 C 255.540 86, 254.008 88.082, 252.585 90.626 M 245.813 113.683 C 246.534 113.972, 247.397 113.936, 247.729 113.604 C 248.061 113.272, 247.471 113.036, 246.417 113.079 C 245.252 113.127, 245.015 113.364, 245.813 113.683 M 285.813 143.683 C 286.534 143.972, 287.397 143.936, 287.729 143.604 C 288.061 143.272, 287.471 143.036, 286.417 143.079 C 285.252 143.127, 285.015 143.364, 285.813 143.683 M 224.813 145.683 C 225.534 145.972, 226.397 145.936, 226.729 145.604 C 227.061 145.272, 226.471 145.036, 225.417 145.079 C 224.252 145.127, 224.015 145.364, 224.813 145.683 M 218.813 150.683 C 219.534 150.972, 220.397 150.936, 220.729 150.604 C 221.061 150.272, 220.471 150.036, 219.417 150.079 C 218.252 150.127, 218.015 150.364, 218.813 150.683 M 288.813 152.683 C 289.534 152.972, 290.397 152.936, 290.729 152.604 C 291.061 152.272, 290.471 152.036, 289.417 152.079 C 288.252 152.127, 288.015 152.364, 288.813 152.683 M 218.813 153.683 C 219.534 153.972, 220.397 153.936, 220.729 153.604 C 221.061 153.272, 220.471 153.036, 219.417 153.079 C 218.252 153.127, 218.015 153.364, 218.813 153.683 M 293.813 154.683 C 294.534 154.972, 295.397 154.936, 295.729 154.604 C 296.061 154.272, 295.471 154.036, 294.417 154.079 C 293.252 154.127, 293.015 154.364, 293.813 154.683 M 244.979 167.215 C 244.640 171.758, 242.104 192.216, 241.853 192.434 C 241.659 192.602, 238.304 193.044, 234.397 193.416 L 227.295 194.092 226.750 181.482 C 226.451 174.547, 225.952 168.618, 225.641 168.308 C 224.968 167.635, 209.797 169.889, 208.150 170.907 C 206.946 171.652, 206.004 176.004, 203.477 192.500 C 202.635 198, 201.012 208.575, 199.872 216 C 198.731 223.425, 197.568 232.537, 197.286 236.250 L 196.774 243 200.387 243 C 203.522 243, 204 243.314, 204 245.371 C 204 247.479, 204.583 247.817, 209.250 248.419 C 212.137 248.791, 216.188 249.357, 218.250 249.676 C 221.285 250.145, 222 249.945, 222 248.628 C 222 247.548, 222.862 247, 224.559 247 C 226.017 247, 226.851 246.568, 226.498 245.996 C 226.157 245.444, 224.829 245.256, 223.548 245.577 C 222.267 245.899, 220.918 245.676, 220.550 245.081 C 219.856 243.958, 221.562 243.657, 228.235 243.724 C 230.290 243.744, 231.772 243.440, 231.529 243.047 C 231.005 242.199, 230.032 242.282, 247.500 241.672 C 255.200 241.403, 260.600 241.525, 259.501 241.942 C 258.401 242.359, 254.590 242.795, 251.031 242.910 C 247.473 243.026, 241.523 243.759, 237.810 244.540 C 234.097 245.321, 230.297 245.668, 229.366 245.310 C 228.272 244.890, 227.912 245.049, 228.350 245.758 C 228.739 246.386, 228.061 247.148, 226.765 247.540 C 224.150 248.329, 220 252.687, 220 254.643 C 220 256.030, 197.333 347.969, 196.377 350.460 C 195.900 351.703, 191.807 352.905, 179.274 355.485 C 176.645 356.026, 174.648 358.032, 168.486 366.324 C 155.420 383.909, 156.745 382.630, 150.825 383.376 C 140.257 384.708, 119.119 388.548, 118.401 389.266 C 117.997 389.670, 179.054 389.959, 254.083 389.910 C 332.364 389.858, 389.222 389.452, 387.500 388.957 C 384.541 388.106, 364.079 384.326, 356.712 383.270 C 353.216 382.768, 352.155 381.704, 342.914 369.434 L 332.903 356.142 322.983 353.848 L 313.062 351.555 310.975 342.527 C 309.827 337.562, 307.366 327.200, 305.507 319.500 C 303.647 311.800, 300.474 298.300, 298.456 289.500 C 296.437 280.700, 293.709 269.143, 292.393 263.819 C 291.077 258.494, 290 253.242, 290 252.148 C 290 249.990, 291.302 249.559, 301.250 248.425 C 306.408 247.837, 307 247.531, 307 245.451 C 307 243.665, 307.632 243.060, 309.750 242.816 C 312.382 242.514, 312.499 242.264, 312.475 237 C 312.462 233.975, 311.636 225.875, 310.641 219 C 309.646 212.125, 307.710 198.628, 306.338 189.006 C 304.967 179.384, 303.721 171.388, 303.569 171.236 C 302.800 170.467, 285.388 168.391, 284.709 168.988 C 284.273 169.370, 283.641 175.188, 283.302 181.917 C 282.709 193.711, 282.612 194.131, 280.594 193.589 C 279.442 193.280, 275.978 193.021, 272.895 193.014 L 267.290 193 266.395 180.250 L 265.500 167.500 255.250 167.215 C 249.613 167.058, 244.990 167.058, 244.979 167.215 M 241 201.965 C 238.525 202.259, 237.175 202.742, 238 203.039 C 239.869 203.710, 247.871 202.699, 246.500 201.965 C 245.950 201.670, 243.475 201.670, 241 201.965 M 274 201.378 C 274 201.585, 274.788 202.373, 275.750 203.128 C 277.336 204.371, 277.371 204.336, 276.128 202.750 C 274.821 201.084, 274 200.555, 274 201.378 M 278 201.378 C 278 201.585, 278.788 202.373, 279.750 203.128 C 281.336 204.371, 281.371 204.336, 280.128 202.750 C 278.821 201.084, 278 200.555, 278 201.378 M 233.733 203.124 C 234.412 203.808, 235.219 204.115, 235.526 203.807 C 235.834 203.499, 235.279 202.940, 234.293 202.564 C 232.868 202.022, 232.753 202.136, 233.733 203.124 M 270 202.393 C 270 202.609, 270.698 203.054, 271.552 203.382 C 272.442 203.723, 272.843 203.555, 272.493 202.989 C 271.906 202.038, 270 201.583, 270 202.393 M 227.250 203.689 C 228.213 203.941, 229.787 203.941, 230.750 203.689 C 231.713 203.438, 230.925 203.232, 229 203.232 C 227.075 203.232, 226.287 203.438, 227.250 203.689 M 258.250 235.732 C 253.176 236.189, 252.530 238, 257.441 238 C 259.334 238, 261.190 238.498, 261.566 239.107 C 262.048 239.886, 262.486 239.831, 263.049 238.921 C 263.695 237.875, 264.196 237.897, 265.674 239.034 C 266.678 239.807, 266.409 239.216, 265.076 237.720 C 263.742 236.224, 262.617 235.079, 262.576 235.175 C 262.534 235.271, 260.587 235.522, 258.250 235.732 M 340.504 236.373 C 338.696 237.696, 338.710 237.773, 340.888 238.465 C 342.133 238.860, 343.417 238.917, 343.742 238.591 C 344.067 238.266, 343.528 238, 342.544 238 C 341.067 238, 340.972 237.738, 342 236.500 C 343.552 234.629, 342.958 234.579, 340.504 236.373 M 238.335 236.668 C 239.263 237.596, 252.001 237.673, 252 236.750 C 252 236.338, 248.775 236, 244.833 236 C 240.892 236, 237.967 236.301, 238.335 236.668 M 220.815 240.864 C 222.032 241.636, 227 241.250, 227 240.383 C 227 240.173, 225.313 240.007, 223.250 240.015 C 220.860 240.025, 219.977 240.333, 220.815 240.864 M 343.507 241.989 C 343.157 242.555, 343.558 242.723, 344.448 242.382 C 346.180 241.717, 346.497 241, 345.059 241 C 344.541 241, 343.843 241.445, 343.507 241.989 M 168.813 242.683 C 169.534 242.972, 170.397 242.936, 170.729 242.604 C 171.061 242.272, 170.471 242.036, 169.417 242.079 C 168.252 242.127, 168.015 242.364, 168.813 242.683 M 164.083 243.365 C 164.313 243.565, 165.625 244.265, 167 244.920 C 169.357 246.042, 169.389 246.022, 167.559 244.555 C 165.966 243.279, 162.711 242.164, 164.083 243.365 M 163.269 247.693 C 164.242 247.947, 165.592 247.930, 166.269 247.656 C 166.946 247.382, 166.150 247.175, 164.500 247.195 C 162.850 247.215, 162.296 247.439, 163.269 247.693 M 234.269 247.693 C 235.242 247.947, 236.592 247.930, 237.269 247.656 C 237.946 247.382, 237.150 247.175, 235.500 247.195 C 233.850 247.215, 233.296 247.439, 234.269 247.693 M 230 248.703 C 230 249.857, 232.838 252.523, 233.395 251.893 C 233.586 251.677, 232.900 250.634, 231.871 249.575 C 230.842 248.516, 230 248.124, 230 248.703 M 348.441 250.555 C 346.611 252.022, 346.643 252.042, 349 250.920 C 352.061 249.462, 352.628 249, 351.358 249 C 350.821 249, 349.509 249.700, 348.441 250.555 M 351.507 254.989 C 351.157 255.555, 351.558 255.723, 352.448 255.382 C 354.180 254.717, 354.497 254, 353.059 254 C 352.541 254, 351.843 254.445, 351.507 254.989 M 156.083 255.356 C 156.313 255.552, 158.075 256.002, 160 256.355 C 162.462 256.807, 163.055 256.706, 162 256.014 C 160.644 255.125, 155.092 254.508, 156.083 255.356 M 352.500 259 C 351.718 260.266, 353.042 260.266, 355 259 C 356.293 258.165, 356.266 258.029, 354.809 258.015 C 353.879 258.007, 352.840 258.450, 352.500 259 M 154.250 262.689 C 155.213 262.941, 156.787 262.941, 157.750 262.689 C 158.713 262.438, 157.925 262.232, 156 262.232 C 154.075 262.232, 153.287 262.438, 154.250 262.689 M 357.441 266.555 C 355.611 268.022, 355.643 268.042, 358 266.920 C 361.061 265.462, 361.628 265, 360.358 265 C 359.821 265, 358.509 265.700, 357.441 266.555 M 149 269.393 C 149 269.609, 149.698 270.054, 150.552 270.382 C 151.442 270.723, 151.843 270.555, 151.493 269.989 C 150.906 269.038, 149 268.583, 149 269.393 M 360.507 269.989 C 360.157 270.555, 360.558 270.723, 361.448 270.382 C 363.180 269.717, 363.497 269, 362.059 269 C 361.541 269, 360.843 269.445, 360.507 269.989 M 362 275 C 361.099 275.582, 360.975 275.975, 361.691 275.985 C 362.346 275.993, 363.160 275.550, 363.500 275 C 364.267 273.758, 363.921 273.758, 362 275 M 143 277.449 C 143 277.724, 144.350 278.647, 146 279.500 C 147.650 280.353, 149 280.826, 149 280.551 C 149 280.276, 147.650 279.353, 146 278.500 C 144.350 277.647, 143 277.174, 143 277.449 M 364.500 279 C 362.870 279.701, 362.812 279.872, 364.191 279.930 C 365.121 279.968, 366.160 279.550, 366.500 279 C 367.211 277.850, 367.176 277.850, 364.500 279 M 141 281.350 C 141 281.581, 142.180 282.543, 143.623 283.489 C 145.066 284.434, 145.941 284.713, 145.567 284.109 C 144.854 282.955, 141 280.626, 141 281.350 M 367 284 C 366.099 284.582, 365.975 284.975, 366.691 284.985 C 367.346 284.993, 368.160 284.550, 368.500 284 C 369.267 282.758, 368.921 282.758, 367 284 M 370 290 C 369.099 290.582, 368.975 290.975, 369.691 290.985 C 370.346 290.993, 371.160 290.550, 371.500 290 C 372.267 288.758, 371.921 288.758, 370 290 M 139.813 290.683 C 140.534 290.972, 141.397 290.936, 141.729 290.604 C 142.061 290.272, 141.471 290.036, 140.417 290.079 C 139.252 290.127, 139.015 290.364, 139.813 290.683 M 136.500 293 C 137.600 293.473, 139.175 293.859, 140 293.859 C 140.945 293.859, 140.761 293.542, 139.500 293 C 138.400 292.527, 136.825 292.141, 136 292.141 C 135.055 292.141, 135.239 292.458, 136.500 293 M 135.813 298.683 C 136.534 298.972, 137.397 298.936, 137.729 298.604 C 138.061 298.272, 137.471 298.036, 136.417 298.079 C 135.252 298.127, 135.015 298.364, 135.813 298.683 M 132.083 299.283 C 132.313 299.439, 133.400 300.226, 134.500 301.033 C 136.350 302.390, 136.397 302.369, 135.128 300.750 C 134.373 299.788, 133.285 299, 132.711 299 C 132.137 299, 131.854 299.127, 132.083 299.283 M 377 301 C 376.099 301.582, 375.975 301.975, 376.691 301.985 C 377.346 301.993, 378.160 301.550, 378.500 301 C 379.267 299.758, 378.921 299.758, 377 301 M 128 303.393 C 128 303.609, 128.698 304.054, 129.552 304.382 C 130.442 304.723, 130.843 304.555, 130.493 303.989 C 129.906 303.038, 128 302.583, 128 303.393 M 381.507 303.989 C 381.157 304.555, 381.558 304.723, 382.448 304.382 C 384.180 303.717, 384.497 303, 383.059 303 C 382.541 303, 381.843 303.445, 381.507 303.989 M 241.702 312.631 C 241.355 312.979, 238.805 313.212, 236.035 313.149 C 231.923 313.057, 230.979 313.354, 230.885 314.768 C 230.821 315.721, 230.686 316.950, 230.585 317.500 C 229.465 323.573, 228.408 326.065, 225.979 328.358 C 224.404 329.844, 222.855 331.882, 222.536 332.887 C 222.217 333.892, 220.953 335.194, 219.728 335.781 C 217.803 336.703, 218.006 336.792, 221.220 336.434 C 223.266 336.206, 225.291 335.962, 225.720 335.892 C 227.910 335.531, 230 336.124, 230 337.107 C 230 337.718, 229.272 337.935, 228.373 337.590 C 227.479 337.246, 226.202 337.417, 225.537 337.969 C 224.872 338.522, 221.775 339.155, 218.655 339.377 C 215.536 339.599, 211.923 340.476, 210.626 341.325 C 208.793 342.526, 207.968 342.606, 206.911 341.685 C 206.164 341.033, 206.329 341.435, 207.277 342.579 C 209.301 345.020, 209.754 348.154, 207.800 346.200 C 205.694 344.094, 204.842 344.915, 206.872 347.093 C 209.099 349.484, 215 350.365, 215 348.307 C 215 347.302, 217.844 347, 227.327 347 L 239.654 347 240.860 340.457 C 241.523 336.859, 241.799 333.484, 241.474 332.957 C 241.148 332.431, 239.334 332, 237.441 332 C 235.178 332, 234 331.526, 234 330.617 C 234 329.856, 233.100 328.998, 232 328.710 C 230.900 328.423, 230 327.643, 230 326.977 C 230 326.259, 230.814 325.979, 232 326.290 C 233.100 326.577, 234 326.389, 234 325.871 C 234 325.325, 234.841 325.380, 236 326 C 237.434 326.767, 238 326.760, 238 325.976 C 238 325.374, 238.450 325.160, 239 325.500 C 239.550 325.840, 240 325.668, 240 325.118 C 240 323.588, 238.223 322.831, 237.776 324.171 C 237.559 324.822, 236.846 325.023, 236.191 324.618 C 234.473 323.556, 234.723 321.956, 236.500 322.638 C 237.325 322.955, 238 322.700, 238 322.072 C 238 321.276, 238.554 321.226, 239.824 321.906 C 241.394 322.746, 241.881 322.231, 243.329 318.191 C 244.253 315.611, 245.008 313.163, 245.005 312.750 C 244.999 311.839, 242.581 311.753, 241.702 312.631 M 388 315.059 C 388 315.641, 388.450 315.840, 389 315.500 C 389.550 315.160, 390 314.684, 390 314.441 C 390 314.198, 389.550 314, 389 314 C 388.450 314, 388 314.477, 388 315.059 M 389.441 318.555 C 387.577 320.049, 387.589 320.067, 389.750 319.020 C 390.988 318.420, 392 317.720, 392 317.465 C 392 316.700, 391.481 316.921, 389.441 318.555 M 119.589 318.856 C 119.298 319.326, 120.172 319.499, 121.530 319.239 C 122.889 318.979, 124 318.594, 124 318.383 C 124 317.610, 120.101 318.027, 119.589 318.856 M 117.750 323.662 C 118.438 323.940, 119.563 323.940, 120.250 323.662 C 120.938 323.385, 120.375 323.158, 119 323.158 C 117.625 323.158, 117.063 323.385, 117.750 323.662 M 249 326.893 C 249 327.384, 249.739 328.069, 250.641 328.416 C 252.014 328.943, 252.076 328.796, 251.019 327.523 C 249.579 325.788, 249 325.607, 249 326.893 M 289 328.929 C 289 329.518, 288.298 330, 287.441 330 C 286.584 330, 286.174 330.472, 286.530 331.049 C 286.974 331.766, 287.568 331.774, 288.413 331.072 C 289.266 330.365, 290.012 330.412, 290.824 331.224 C 291.471 331.871, 292 332.053, 292 331.629 C 292 331.204, 291.325 330.182, 290.500 329.357 C 289.675 328.532, 289 328.339, 289 328.929 M 110 334.430 C 110 334.705, 110.900 335.411, 112 336 C 113.100 336.589, 114 336.845, 114 336.570 C 114 336.295, 113.100 335.589, 112 335 C 110.900 334.411, 110 334.155, 110 334.430 M 239.856 349.990 C 238.402 350.419, 232.777 350.807, 227.356 350.851 C 213.724 350.963, 208.330 351.673, 202.378 354.140 C 198.407 355.785, 197.362 356.668, 197.728 358.067 C 198.151 359.686, 193.687 366.973, 191.744 367.835 C 191.328 368.020, 191.245 368.587, 191.559 369.095 C 191.873 369.603, 191.201 371.201, 190.065 372.645 C 188.929 374.088, 188 376.334, 188 377.635 C 188 379.972, 186.479 380.933, 185.833 379.003 C 185.650 378.454, 184.175 379.144, 182.556 380.536 C 180.937 381.927, 179.025 382.840, 178.308 382.565 C 177.590 382.289, 175.989 382.479, 174.751 382.988 C 173.253 383.603, 178.251 383.899, 189.694 383.873 C 201.878 383.846, 207.003 383.494, 207.282 382.667 C 207.567 381.820, 208.131 381.877, 209.337 382.872 C 210.768 384.054, 211 384.019, 211 382.622 C 211 381.730, 211.563 380.993, 212.250 380.985 C 213.118 380.974, 213.061 380.692, 212.064 380.061 C 211.025 379.403, 210.920 378.786, 211.683 377.826 C 212.262 377.097, 213.301 373.439, 213.991 369.698 C 215.274 362.742, 216.852 360.088, 219.821 359.886 C 225.387 359.508, 227.287 358.868, 228.966 356.807 L 230.843 354.500 233.922 357.437 C 235.615 359.052, 237 359.826, 237 359.156 C 237 358.486, 236.325 357.678, 235.500 357.362 C 233.568 356.620, 233.555 355, 235.481 355 C 236.295 355, 237.228 356.062, 237.554 357.360 C 237.977 359.046, 238.768 359.654, 240.323 359.488 C 241.520 359.360, 243.118 359.198, 243.872 359.128 C 244.921 359.030, 244.976 358.676, 244.105 357.627 C 243.478 356.871, 243.234 355.554, 243.562 354.700 C 244.008 353.536, 243.664 353.275, 242.192 353.660 C 241.110 353.943, 239.887 353.627, 239.474 352.957 C 238.990 352.175, 239.217 351.908, 240.111 352.209 C 240.875 352.467, 242.905 352.093, 244.623 351.378 C 247.581 350.148, 249 350.382, 249 352.099 C 249 352.521, 248.100 353.151, 247 353.500 C 244.293 354.359, 244.476 355.470, 247.352 355.635 C 249.290 355.746, 249.717 355.264, 249.784 352.885 C 249.829 351.298, 249.559 349.970, 249.183 349.933 C 248.807 349.895, 247.150 349.718, 245.500 349.537 C 243.850 349.357, 241.310 349.561, 239.856 349.990 M 289.157 396.997 C 284.674 398.054, 283.600 399.331, 283.600 403.603 C 283.600 406.653, 284.399 407.957, 288.800 412.089 C 294.065 417.033, 295.289 420.311, 292.800 422.800 C 290.577 425.023, 286.069 424.246, 284.781 421.418 C 283.606 418.840, 283.603 418.840, 282.787 421.047 C 281.591 424.280, 283.566 426, 288.476 426 C 293.949 426, 298 422.553, 298 417.897 C 298 415.333, 296.910 413.643, 292.500 409.372 C 286.734 403.787, 285.693 400.770, 288.934 399.035 C 291.715 397.547, 292.670 397.730, 294.961 400.189 L 297 402.377 297 399.689 C 297 398.210, 296.587 397, 296.082 397 C 295.577 397, 294.564 396.822, 293.832 396.604 C 293.099 396.387, 290.996 396.563, 289.157 396.997 M 338.728 396.605 C 338.328 397.006, 337.986 403.221, 337.968 410.417 C 337.930 425.990, 337.502 425.873, 330.911 408.493 C 328.514 402.172, 326.049 397, 325.433 397 C 324.817 397, 322.105 402.962, 319.407 410.250 C 314.653 423.087, 314.404 423.509, 311.415 423.801 C 306.394 424.291, 305.789 422.590, 306.165 409.044 L 306.500 396.997 303.815 396.999 L 301.130 397 301.677 405.750 C 301.977 410.563, 301.794 416.808, 301.270 419.629 L 300.317 424.757 307.832 425.240 C 317.344 425.850, 319 425.419, 319 422.334 C 319 420.996, 319.700 418.546, 320.556 416.891 C 321.862 414.367, 322.623 413.931, 325.277 414.191 C 328.079 414.465, 328.674 415.102, 330.464 419.750 L 332.486 425 338.493 424.921 C 341.797 424.878, 343.938 424.615, 343.250 424.338 C 342.375 423.985, 342 421.030, 342 414.494 L 342 405.156 352.423 415.821 C 358.156 421.687, 363.070 426.263, 363.343 425.990 C 363.617 425.717, 363.989 419.082, 364.170 411.245 L 364.500 396.997 361.820 396.999 C 359.273 397, 359.186 397.161, 360.070 400.243 C 360.581 402.027, 360.979 406.865, 360.952 410.993 L 360.905 418.500 350.181 407.188 C 344.283 400.967, 339.129 396.204, 338.728 396.605 M 120.500 410.900 L 120.500 424.998 123.500 425.001 L 126.500 425.004 126.161 419.002 C 125.704 410.896, 127.123 411.112, 134.368 420.250 C 138.068 424.917, 138.233 425, 143.817 425.002 L 149.500 425.003 149.500 417.752 L 149.500 410.500 156.500 410.500 L 163.500 410.500 163.808 414.210 C 163.977 416.251, 163.676 419.513, 163.139 421.460 L 162.161 425 166.203 425 C 169.623 425, 170.059 424.777, 169.040 423.548 C 168.199 422.535, 167.935 418.305, 168.167 409.547 L 168.500 396.997 165.741 396.999 C 163.019 397, 162.985 397.077, 163.241 402.750 L 163.500 408.500 156.250 408.794 L 149 409.088 149 403.044 C 149 397.118, 148.947 397, 146.250 396.999 L 143.500 396.997 143.829 409.999 C 144.037 418.172, 143.790 423, 143.164 423 C 141.920 423, 134 414.088, 134 412.688 C 134 412.121, 134.670 410.918, 135.488 410.013 C 138.072 407.158, 138.390 402.703, 136.203 400.002 C 134.546 397.955, 133.173 397.519, 127.370 397.190 L 120.500 396.801 120.500 410.900 M 177.841 398.524 C 173.799 400.720, 171 405.994, 171 411.418 C 171 417.617, 173.179 421.540, 177.981 423.990 C 188.943 429.582, 201.010 422.767, 200.982 411 C 200.968 405.329, 199.381 402.173, 195.088 399.280 C 191.091 396.586, 182.132 396.194, 177.841 398.524 M 203.500 410.958 L 203.500 424.916 208.657 425.562 C 216.392 426.530, 221.727 425.277, 225.811 421.534 C 228.969 418.640, 229.399 417.633, 229.791 412.211 C 230.573 401.402, 225.217 397.001, 211.282 396.999 L 203.500 396.999 203.500 410.958 M 232.500 410.884 L 232.500 424.770 237.848 425.323 C 240.790 425.627, 244.165 425.514, 245.348 425.073 C 246.532 424.631, 248.400 424.627, 249.500 425.064 C 253.138 426.511, 257.686 426.035, 260.365 423.927 C 262.417 422.313, 263 420.981, 263 417.905 C 263 414.428, 262.339 413.315, 257.483 408.612 C 252.678 403.958, 252.078 402.960, 252.841 400.884 C 254.017 397.680, 258.429 397.112, 260.193 399.938 C 261.922 402.706, 263 402.538, 263 399.500 C 263 397.182, 262.652 397, 258.223 397 C 251.989 397, 249 399.075, 249 403.403 C 249 406.046, 250.081 407.790, 254.500 412.281 C 260.269 418.143, 260.827 419.486, 258.701 422.395 C 256.870 424.899, 251.803 424.190, 250.513 421.250 C 249.463 418.856, 248 418.225, 248 420.167 C 248 420.808, 247.703 421.036, 247.340 420.673 C 246.977 420.310, 246.033 420.936, 245.243 422.063 C 244.277 423.442, 242.937 424.014, 241.153 423.807 C 238.635 423.516, 238.485 423.181, 238.202 417.250 C 237.910 411.122, 237.955 411, 240.484 411 C 241.902 411, 243.322 411.675, 243.638 412.500 C 244.605 415.018, 246 414.173, 246 411.070 C 246 408.352, 245.801 408.196, 243.250 408.916 C 238.884 410.148, 238 409.306, 238 403.917 C 238 399.161, 238.095 399, 240.893 399 C 242.709 399, 244.052 399.651, 244.500 400.750 C 245.156 402.356, 245.282 402.336, 246.037 400.500 C 247.428 397.118, 247.215 397, 239.750 396.999 L 232.500 396.999 232.500 410.884 M 273.808 410.154 C 274.042 420.168, 273.803 423.509, 272.808 424.140 C 271.991 424.658, 273.046 424.975, 275.613 424.985 L 279.727 425 278.752 419.750 C 278.216 416.863, 278.023 410.563, 278.323 405.750 L 278.870 397 276.185 396.998 L 273.500 396.996 273.808 410.154 M 369.832 408.912 C 370.033 416.150, 369.742 421.614, 369.089 422.834 C 368.077 424.724, 368.401 424.884, 374.610 425.549 C 388.082 426.991, 396 421.606, 396 411 C 396 401.518, 389.941 397.061, 377 397.021 L 369.500 396.997 369.832 408.912 M 127.243 398.850 C 126.651 399.215, 126.041 402.211, 125.886 405.507 C 125.625 411.061, 125.769 411.524, 127.857 411.827 C 131.104 412.298, 133 410.265, 133 406.312 C 133 400.871, 130.085 397.093, 127.243 398.850 M 180.277 399.973 C 177.304 401.785, 176.817 402.736, 175.540 409.225 C 174.858 412.688, 177.272 419.051, 180.203 421.517 C 184.378 425.030, 189.291 424.862, 193.077 421.077 C 195.615 418.539, 196 417.413, 196 412.527 C 196 400.657, 188.706 394.833, 180.277 399.973 M 74 400.059 C 74 400.641, 74.450 400.840, 75 400.500 C 75.550 400.160, 76 399.684, 76 399.441 C 76 399.198, 75.550 399, 75 399 C 74.450 399, 74 399.477, 74 400.059 M 208.750 399.570 C 207.651 400.688, 207.834 418.433, 208.975 421.435 C 209.820 423.658, 210.544 424, 214.399 424 C 225.450 424, 230.011 409.996, 221.549 402.046 C 219.024 399.674, 210.305 397.987, 208.750 399.570 M 374.667 399.667 C 373.442 400.892, 373.917 421.517, 375.200 422.800 C 377.125 424.725, 384.401 424.259, 387.236 422.029 C 392.912 417.564, 392.511 406.017, 386.521 401.448 C 383.423 399.086, 376.316 398.018, 374.667 399.667 M 438.079 401.583 C 438.127 402.748, 438.364 402.985, 438.683 402.188 C 438.972 401.466, 438.936 400.603, 438.604 400.271 C 438.272 399.939, 438.036 400.529, 438.079 401.583 M 84.567 406.433 C 83.705 407.845, 82.315 410.125, 81.477 411.500 L 79.954 414 86.541 414 L 93.128 414 90.848 409.943 C 87.506 403.997, 86.423 403.392, 84.567 406.433 M 421.542 408.338 C 420.144 410.724, 419 412.974, 419 413.338 C 419 413.702, 421.726 414, 425.058 414 L 431.115 414 428.308 409.001 C 426.763 406.252, 425.181 404.002, 424.792 404.001 C 424.403 404, 422.940 405.952, 421.542 408.338 M 323.613 407.407 C 323.280 408.731, 322.733 410.531, 322.397 411.407 C 321.937 412.607, 322.414 413, 324.334 413 C 327.700 413, 328.092 412.123, 326.459 408.240 C 324.830 404.365, 324.407 404.242, 323.613 407.407 M 445.813 412.683 C 446.534 412.972, 447.397 412.936, 447.729 412.604 C 448.061 412.272, 447.471 412.036, 446.417 412.079 C 445.252 412.127, 445.015 412.364, 445.813 412.683 M 57.216 422.184 C 56.547 422.853, 56 423.992, 56 424.716 C 56 425.778, 61.342 425.980, 83.750 425.766 C 110.745 425.507, 111.500 425.446, 111.500 423.500 C 111.500 421.557, 110.745 421.492, 84.966 421.234 C 65.167 421.036, 58.123 421.277, 57.216 422.184 M 399.380 422.452 C 399.074 423.251, 399.114 424.376, 399.470 424.952 C 400.148 426.049, 456 426.525, 456 425.434 C 456 425.123, 455.534 423.998, 454.965 422.934 C 453.981 421.095, 452.600 421, 426.933 421 C 404.255 421, 399.848 421.232, 399.380 422.452\" fill=\"currentColor\" fill-rule=\"evenodd\"/>\n</svg>\n",
|
|
10
10
|
prtsEmblem: "data:image/png;base64,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",
|
|
@@ -13,14 +13,6 @@ window.__ModuleLoader__.load({
|
|
|
13
13
|
heroEmblemMask: {"key":"rhodes-island-hero","width":320,"height":320,"alpha":"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","encoding":"binary-rle-v1","opticalScale":0.94,"latticeHints":{"sparse":{"pitch":5.4,"offsetX":2.2950000000000004,"offsetY":2.835},"light":{"pitch":4.8,"offsetX":3.7199999999999998,"offsetY":0.36},"standard":{"pitch":4.2,"offsetX":0.10500000000000001,"offsetY":2.205},"dense":{"pitch":3.7,"offsetX":0.6475000000000001,"offsetY":3.4225000000000003},"ultra":{"pitch":3.25,"offsetX":1.54375,"offsetY":2.35625}}}
|
|
14
14
|
});
|
|
15
15
|
const PRTS_STORAGE_KEY = 'dsh.ui.prts.v1'
|
|
16
|
-
const CONVERSATION_SCALE_DISTANCE_MIN = 16
|
|
17
|
-
const CONVERSATION_SCALE_DISTANCE_MAX = 240
|
|
18
|
-
const CONVERSATION_SCALE_DISTANCE_STEP = 8
|
|
19
|
-
const CONVERSATION_SCALE_DISTANCE_DEFAULT = 96
|
|
20
|
-
const CONVERSATION_SCALE_FOCUS_CONTRAST_MIN = 0
|
|
21
|
-
const CONVERSATION_SCALE_FOCUS_CONTRAST_MAX = 100
|
|
22
|
-
const CONVERSATION_SCALE_FOCUS_CONTRAST_STEP = 10
|
|
23
|
-
const CONVERSATION_SCALE_FOCUS_CONTRAST_DEFAULT = 70
|
|
24
16
|
const PARTICLE_TRAVERSAL_SPEED_MIN = 0
|
|
25
17
|
const PARTICLE_TRAVERSAL_SPEED_MAX = 2
|
|
26
18
|
const PARTICLE_TRAVERSAL_SPEED_STEP = 0.25
|
|
@@ -38,8 +30,6 @@ heroParticleDensity: 'light',
|
|
|
38
30
|
particleTraversalSpeed: PARTICLE_TRAVERSAL_SPEED_DEFAULT,
|
|
39
31
|
particlePattern: 'orthogonal',
|
|
40
32
|
railDefaultHidden: false,
|
|
41
|
-
conversationScaleMaxDistance: CONVERSATION_SCALE_DISTANCE_DEFAULT,
|
|
42
|
-
conversationScaleFocusContrast: CONVERSATION_SCALE_FOCUS_CONTRAST_DEFAULT,
|
|
43
33
|
})
|
|
44
34
|
const VISUAL_PRESETS = Object.freeze({
|
|
45
35
|
'standard-tactical': Object.freeze({
|
|
@@ -77,7 +67,7 @@ background: Object.freeze(['texture']),
|
|
|
77
67
|
particles: Object.freeze(['conversationParticleDensity', 'heroParticleDensity', 'particleTraversalSpeed']),
|
|
78
68
|
material: Object.freeze(['glass']),
|
|
79
69
|
accessibility: Object.freeze(['motion', 'bootAnimation']),
|
|
80
|
-
navigation: Object.freeze(['railDefaultHidden'
|
|
70
|
+
navigation: Object.freeze(['railDefaultHidden']),
|
|
81
71
|
})
|
|
82
72
|
const TEXTURES = new Set(['off', 'restrained', 'full'])
|
|
83
73
|
const GLASS_STRENGTHS = new Set(['off', 'soft', 'standard', 'clear'])
|
|
@@ -108,18 +98,6 @@ return typeof value === 'boolean' ? value : fallback
|
|
|
108
98
|
function enumOr(value, allowed, fallback) {
|
|
109
99
|
return allowed.has(value) ? value : fallback
|
|
110
100
|
}
|
|
111
|
-
function scaleDistanceOr(value, fallback) {
|
|
112
|
-
const numeric = Number(value)
|
|
113
|
-
if (!Number.isFinite(numeric)) return fallback
|
|
114
|
-
const clamped = Math.min(CONVERSATION_SCALE_DISTANCE_MAX, Math.max(CONVERSATION_SCALE_DISTANCE_MIN, numeric))
|
|
115
|
-
return Math.round(clamped / CONVERSATION_SCALE_DISTANCE_STEP) * CONVERSATION_SCALE_DISTANCE_STEP
|
|
116
|
-
}
|
|
117
|
-
function scaleFocusContrastOr(value, fallback) {
|
|
118
|
-
const numeric = Number(value)
|
|
119
|
-
if (!Number.isFinite(numeric)) return fallback
|
|
120
|
-
const clamped = Math.min(CONVERSATION_SCALE_FOCUS_CONTRAST_MAX, Math.max(CONVERSATION_SCALE_FOCUS_CONTRAST_MIN, numeric))
|
|
121
|
-
return Math.round(clamped / CONVERSATION_SCALE_FOCUS_CONTRAST_STEP) * CONVERSATION_SCALE_FOCUS_CONTRAST_STEP
|
|
122
|
-
}
|
|
123
101
|
function particleTraversalSpeedOr(value, fallback) {
|
|
124
102
|
const numeric = Number(value)
|
|
125
103
|
if (!Number.isFinite(numeric)) return fallback
|
|
@@ -166,14 +144,6 @@ DEFAULT_PREFERENCES.particleTraversalSpeed,
|
|
|
166
144
|
),
|
|
167
145
|
particlePattern: 'orthogonal',
|
|
168
146
|
railDefaultHidden: booleanOr(input.railDefaultHidden, DEFAULT_PREFERENCES.railDefaultHidden),
|
|
169
|
-
conversationScaleMaxDistance: scaleDistanceOr(
|
|
170
|
-
input.conversationScaleMaxDistance,
|
|
171
|
-
DEFAULT_PREFERENCES.conversationScaleMaxDistance,
|
|
172
|
-
),
|
|
173
|
-
conversationScaleFocusContrast: scaleFocusContrastOr(
|
|
174
|
-
input.conversationScaleFocusContrast,
|
|
175
|
-
DEFAULT_PREFERENCES.conversationScaleFocusContrast,
|
|
176
|
-
),
|
|
177
147
|
}
|
|
178
148
|
normalized.preset = matchedVisualPreset(normalized)
|
|
179
149
|
return normalized
|
|
@@ -368,6 +338,7 @@ const COMPOSER_RELEVANCE_SELECTOR = [
|
|
|
368
338
|
'button[aria-haspopup="listbox"]',
|
|
369
339
|
'[role="menu"]',
|
|
370
340
|
'[role="listbox"]',
|
|
341
|
+
'[data-trigger-menu]',
|
|
371
342
|
'[data-slot="conversation.input.overlay"]',
|
|
372
343
|
].join(', ')
|
|
373
344
|
const PRESET_TRIGGER_SELECTOR = [
|
|
@@ -383,7 +354,7 @@ if (!id) return null
|
|
|
383
354
|
return document.getElementById(id)
|
|
384
355
|
}
|
|
385
356
|
function localPopup(trigger) {
|
|
386
|
-
const selector = '[role="menu"], [role="listbox"], [class*="mufS8W_card"]'
|
|
357
|
+
const selector = '[role="menu"], [role="listbox"], [data-trigger-menu], [class*="mufS8W_card"]'
|
|
387
358
|
const sibling = trigger.nextElementSibling
|
|
388
359
|
if (sibling?.matches(selector)) return sibling
|
|
389
360
|
return trigger.parentElement?.querySelector(`:scope > ${selector}`) ?? null
|
|
@@ -391,7 +362,7 @@ return trigger.parentElement?.querySelector(`:scope > ${selector}`) ?? null
|
|
|
391
362
|
function overlayPopup(document) {
|
|
392
363
|
const overlay = document.querySelector('[data-slot="conversation.input.overlay"]')
|
|
393
364
|
if (!overlay) return null
|
|
394
|
-
return overlay.querySelector('[role="listbox"], [role="menu"], [class*="mufS8W_card"]')
|
|
365
|
+
return overlay.querySelector('[data-trigger-menu], [role="listbox"], [role="menu"], [class*="mufS8W_card"]')
|
|
395
366
|
}
|
|
396
367
|
function linkedMenu(document, trigger) {
|
|
397
368
|
return controlledPopup(document, trigger)
|
|
@@ -401,9 +372,9 @@ return controlledPopup(document, trigger)
|
|
|
401
372
|
function markPopup(popup, kind) {
|
|
402
373
|
if (!popup) return
|
|
403
374
|
mark(popup, MENU_ATTRIBUTE, kind)
|
|
404
|
-
const card = popup.closest?.('[class*="mufS8W_card"]')
|
|
375
|
+
const card = popup.closest?.('[data-trigger-menu], [class*="mufS8W_card"]')
|
|
405
376
|
mark(card, MENU_ATTRIBUTE, kind)
|
|
406
|
-
for (const nested of popup.querySelectorAll?.('[role="menu"], [role="listbox"], [class*="mufS8W_card"]') ?? []) {
|
|
377
|
+
for (const nested of popup.querySelectorAll?.('[role="menu"], [role="listbox"], [data-trigger-menu], [class*="mufS8W_card"]') ?? []) {
|
|
407
378
|
mark(nested, MENU_ATTRIBUTE, kind)
|
|
408
379
|
}
|
|
409
380
|
}
|
|
@@ -505,7 +476,7 @@ markPopup(popup, 'preset')
|
|
|
505
476
|
}
|
|
506
477
|
const overlay = document?.querySelector?.('[data-slot="conversation.input.overlay"]')
|
|
507
478
|
if (overlay) {
|
|
508
|
-
for (const popup of overlay.querySelectorAll('[role="menu"], [role="listbox"], [class*="mufS8W_card"]')) {
|
|
479
|
+
for (const popup of overlay.querySelectorAll('[data-trigger-menu], [role="menu"], [role="listbox"], [class*="mufS8W_card"]')) {
|
|
509
480
|
markPopup(popup, popup.hasAttribute('aria-busy') ? 'model' : 'action')
|
|
510
481
|
}
|
|
511
482
|
}
|
|
@@ -1436,6 +1407,7 @@ if (heroActive) return { center: heroCenter(), size: heroLogoSize() }
|
|
|
1436
1407
|
return { center: centerFromAnchor(inspectAnchor()), size: logoSize() }
|
|
1437
1408
|
}
|
|
1438
1409
|
function particleTraversalSpeed(value = preferences) {
|
|
1410
|
+
if (phoneStatic()) return 0
|
|
1439
1411
|
const numeric = Number(value?.particleTraversalSpeed)
|
|
1440
1412
|
return Number.isFinite(numeric) ? clamp(numeric, 0, 2) : 1
|
|
1441
1413
|
}
|
|
@@ -1960,6 +1932,19 @@ resizeObservations += 1
|
|
|
1960
1932
|
const entry = entries.find(candidate => candidate.target === operation) ?? entries[0]
|
|
1961
1933
|
const contentRect = entry?.contentRect
|
|
1962
1934
|
pendingResizeSize = contentRect ? sizeFromRect(contentRect) : readOperationSize()
|
|
1935
|
+
if (phoneStatic()) {
|
|
1936
|
+
const nextSize = pendingResizeSize
|
|
1937
|
+
clearResizeState()
|
|
1938
|
+
const changed = applyFieldSize(nextSize)
|
|
1939
|
+
if (changed && particles.length) snapParticlesToCurrentLayout()
|
|
1940
|
+
resizeCommits += changed ? 1 : 0
|
|
1941
|
+
syncCanvasBackingStore()
|
|
1942
|
+
geometryDirty = false
|
|
1943
|
+
cancelFrame()
|
|
1944
|
+
draw(Number(window.performance?.now?.()) || 0)
|
|
1945
|
+
cancelFrame()
|
|
1946
|
+
return
|
|
1947
|
+
}
|
|
1963
1948
|
if (resizeFrame !== undefined) return
|
|
1964
1949
|
resizeFrame = window.requestAnimationFrame?.(() => {
|
|
1965
1950
|
resizeFrame = undefined
|
|
@@ -2348,7 +2333,7 @@ return
|
|
|
2348
2333
|
if (heroActive) leaveHero()
|
|
2349
2334
|
}
|
|
2350
2335
|
function onScroll() {
|
|
2351
|
-
if (!scroller) return
|
|
2336
|
+
if (!scroller || phoneStatic()) return
|
|
2352
2337
|
if (heroActive) {
|
|
2353
2338
|
scheduleFrame()
|
|
2354
2339
|
return
|
|
@@ -2392,6 +2377,7 @@ hydrationPaused = false
|
|
|
2392
2377
|
updateFrameGate()
|
|
2393
2378
|
}
|
|
2394
2379
|
function registerContentMutations(mutations) {
|
|
2380
|
+
if (phoneStatic()) return
|
|
2395
2381
|
let weight = mutations.length
|
|
2396
2382
|
for (const mutation of mutations) {
|
|
2397
2383
|
for (const node of [...mutation.addedNodes, ...mutation.removedNodes]) {
|
|
@@ -2497,8 +2483,34 @@ mutationBurstTimer = undefined
|
|
|
2497
2483
|
mutationBurstScore = 0
|
|
2498
2484
|
cancelFrame()
|
|
2499
2485
|
}
|
|
2486
|
+
function rebindScroller(nextScroller) {
|
|
2487
|
+
scroller?.removeAttribute('data-prts-hero-active')
|
|
2488
|
+
scroller?.removeEventListener('scroll', onScroll)
|
|
2489
|
+
cancelHydrationResume()
|
|
2490
|
+
hydrationPaused = false
|
|
2491
|
+
mutationBurstScore = 0
|
|
2492
|
+
if (mutationBurstTimer !== undefined) window.clearTimeout?.(mutationBurstTimer)
|
|
2493
|
+
mutationBurstTimer = undefined
|
|
2494
|
+
heroMarker = undefined
|
|
2495
|
+
heroActive = false
|
|
2496
|
+
scroller = nextScroller
|
|
2497
|
+
scroller.addEventListener('scroll', onScroll, { passive: true })
|
|
2498
|
+
syncHeroState()
|
|
2499
|
+
if (!heroActive) {
|
|
2500
|
+
resetTraversal()
|
|
2501
|
+
if (!phoneStatic()) restoreTraversalFromScroll()
|
|
2502
|
+
commitTransitionTargets(segment, true)
|
|
2503
|
+
}
|
|
2504
|
+
scheduleFrame()
|
|
2505
|
+
}
|
|
2500
2506
|
function mount(nextOperation, nextScroller) {
|
|
2501
|
-
if (operation === nextOperation &&
|
|
2507
|
+
if (operation === nextOperation && ambient?.isConnected && canvas?.isConnected) {
|
|
2508
|
+
if (scroller === nextScroller) return
|
|
2509
|
+
if (nextScroller) {
|
|
2510
|
+
rebindScroller(nextScroller)
|
|
2511
|
+
return
|
|
2512
|
+
}
|
|
2513
|
+
}
|
|
2502
2514
|
unmount()
|
|
2503
2515
|
operation = nextOperation
|
|
2504
2516
|
scroller = nextScroller
|
|
@@ -2508,7 +2520,7 @@ ambient = created.layer
|
|
|
2508
2520
|
glow = created.glow
|
|
2509
2521
|
canvas = document.createElement('canvas')
|
|
2510
2522
|
canvas.setAttribute('data-prts-particle-layer', '')
|
|
2511
|
-
canvas.setAttribute('aria-label', '随对话滚动轮换阵营标识的粒子画布')
|
|
2523
|
+
canvas.setAttribute('aria-label', phoneStatic() ? '静态阵营标识粒子画布' : '随对话滚动轮换阵营标识的粒子画布')
|
|
2512
2524
|
canvas.style.visibility = 'hidden'
|
|
2513
2525
|
if (typeof window.CanvasRenderingContext2D === 'function') context = canvas.getContext('2d')
|
|
2514
2526
|
targetCache.clear()
|
|
@@ -2890,2192 +2902,6 @@ operation = undefined
|
|
|
2890
2902
|
}
|
|
2891
2903
|
}
|
|
2892
2904
|
|
|
2893
|
-
const CONVERSATION_USER_TURN_SELECTOR = [
|
|
2894
|
-
'[data-chat-flow-kind="user"]',
|
|
2895
|
-
'[data-chat-flow-kind="user-step"]',
|
|
2896
|
-
'[data-message-role="user"]',
|
|
2897
|
-
].join(',')
|
|
2898
|
-
const CONVERSATION_SCALE_SPACING = 8
|
|
2899
|
-
const CONVERSATION_SCALE_BASE_LENGTHS = Object.freeze([24, 18, 14, 10, 6])
|
|
2900
|
-
const CONVERSATION_SCALE_CONTRAST_DELTAS = Object.freeze([5, -3, -4, -4, -3])
|
|
2901
|
-
function resolveConversationScaleLengths(value = CONVERSATION_SCALE_FOCUS_CONTRAST_DEFAULT) {
|
|
2902
|
-
const numeric = Number(value)
|
|
2903
|
-
const contrast = Number.isFinite(numeric)
|
|
2904
|
-
? Math.min(CONVERSATION_SCALE_FOCUS_CONTRAST_MAX, Math.max(CONVERSATION_SCALE_FOCUS_CONTRAST_MIN, numeric))
|
|
2905
|
-
: CONVERSATION_SCALE_FOCUS_CONTRAST_DEFAULT
|
|
2906
|
-
const ratio = contrast / CONVERSATION_SCALE_FOCUS_CONTRAST_MAX
|
|
2907
|
-
return CONVERSATION_SCALE_BASE_LENGTHS.map((length, index) =>
|
|
2908
|
-
Math.round(length + CONVERSATION_SCALE_CONTRAST_DELTAS[index] * ratio))
|
|
2909
|
-
}
|
|
2910
|
-
const CONVERSATION_SCALE_LENGTHS = Object.freeze(resolveConversationScaleLengths())
|
|
2911
|
-
const CONVERSATION_SCALE_WAVE_DURATION = 140
|
|
2912
|
-
const CONVERSATION_JUMP_BOTTOM_THRESHOLD = 25
|
|
2913
|
-
const CONVERSATION_JUMP_SMOOTH_VIEWPORT_LIMIT = 1.5
|
|
2914
|
-
const CONVERSATION_JUMP_SETTLE_MAX_DISTANCE = 88
|
|
2915
|
-
const CONVERSATION_JUMP_SETTLE_VIEWPORT_RATIO = .12
|
|
2916
|
-
const CONVERSATION_JUMP_SETTLE_DURATION = 180
|
|
2917
|
-
const CONVERSATION_JUMP_VERIFY_DURATION = 900
|
|
2918
|
-
const CONVERSATION_HISTORY_PAGE_LIMIT = 10
|
|
2919
|
-
const CONVERSATION_HISTORY_TIME_LIMIT = 8000
|
|
2920
|
-
const ASSISTANT_SELECTOR = '[data-chat-flow-kind="assistant-step"], [data-message-role="assistant"]'
|
|
2921
|
-
const FORMAL_ANSWER_SELECTOR = '[data-prts-ai-surface], [data-markdown], [data-slot*="markdown" i], .markdown-body'
|
|
2922
|
-
const AUXILIARY_SELECTOR = '[data-chat-flow-kind*="reason" i], [data-chat-flow-kind*="tool" i], [data-slot*="reason" i], [data-slot*="tool" i], [data-role*="reason" i], [data-role*="tool" i]'
|
|
2923
|
-
const STREAMING_SELECTOR = '[aria-busy="true"], [data-streaming], [data-status*="stream" i], [data-state*="stream" i]'
|
|
2924
|
-
const CONVERSATION_THIRD_PARTY_OVERLAY_SELECTOR = [
|
|
2925
|
-
'[data-shell-overlay] [data-plugin]:not([data-plugin="dsh-theme-prts"])',
|
|
2926
|
-
'[data-slot="shell.overlay"] [data-plugin]:not([data-plugin="dsh-theme-prts"])',
|
|
2927
|
-
].join(', ')
|
|
2928
|
-
const CONVERSATION_BLOCKING_OVERLAY_SELECTOR = [
|
|
2929
|
-
'[role="dialog"]',
|
|
2930
|
-
'[aria-modal="true"]',
|
|
2931
|
-
'dialog[open]',
|
|
2932
|
-
'[data-prts-floating-glass="dialog"]',
|
|
2933
|
-
'[data-prts-floating-scrim]',
|
|
2934
|
-
'[data-slot*="dialog" i]',
|
|
2935
|
-
'[data-slot*="modal" i]',
|
|
2936
|
-
'[class*="_dialog"]',
|
|
2937
|
-
'[class*="_modal"]',
|
|
2938
|
-
'[class*="_scrim"]',
|
|
2939
|
-
'[class*="_backdrop"]',
|
|
2940
|
-
].join(', ')
|
|
2941
|
-
const CONVERSATION_OVERLAY_SELECTOR = [
|
|
2942
|
-
CONVERSATION_THIRD_PARTY_OVERLAY_SELECTOR,
|
|
2943
|
-
'[role="dialog"]',
|
|
2944
|
-
'[role="menu"]',
|
|
2945
|
-
'[role="listbox"]',
|
|
2946
|
-
'[popover]',
|
|
2947
|
-
'[data-prts-floating-glass]',
|
|
2948
|
-
'[aria-modal="true"]',
|
|
2949
|
-
'dialog[open]',
|
|
2950
|
-
'[data-slot*="dialog" i]',
|
|
2951
|
-
'[data-slot*="modal" i]',
|
|
2952
|
-
'[data-prts-floating-scrim]',
|
|
2953
|
-
'[class*="_dialog"]',
|
|
2954
|
-
'[class*="_modal"]',
|
|
2955
|
-
'[class*="_scrim"]',
|
|
2956
|
-
'[class*="_backdrop"]',
|
|
2957
|
-
].join(', ')
|
|
2958
|
-
const CONVERSATION_PORTAL_ROOT_SELECTOR = [
|
|
2959
|
-
'[role="presentation"]',
|
|
2960
|
-
'[class*="_portal_"]',
|
|
2961
|
-
'[data-floating-ui-portal]',
|
|
2962
|
-
'[data-radix-portal]',
|
|
2963
|
-
].join(', ')
|
|
2964
|
-
const PREVIEW_REMOVE_SELECTOR = [
|
|
2965
|
-
'[hidden]',
|
|
2966
|
-
'[aria-hidden="true"]',
|
|
2967
|
-
'button',
|
|
2968
|
-
'[role="toolbar"]',
|
|
2969
|
-
'[data-slot*="toolbar" i]',
|
|
2970
|
-
'[data-slot*="action" i]',
|
|
2971
|
-
'[data-slot*="sentinel" i]',
|
|
2972
|
-
'script',
|
|
2973
|
-
'style',
|
|
2974
|
-
].join(',')
|
|
2975
|
-
const SVG_NAMESPACE = 'http://www.w3.org/2000/svg'
|
|
2976
|
-
const MINIMUM_TURNS = 2
|
|
2977
|
-
const CONVERSATION_SCALE_WIDTH = 32
|
|
2978
|
-
const CONVERSATION_SCALE_CONTENT_GAP = 12
|
|
2979
|
-
const CONVERSATION_SCALE_PREVIEW_WIDTH = 360
|
|
2980
|
-
const CONVERSATION_SCALE_PREVIEW_GAP = 8
|
|
2981
|
-
const CONVERSATION_SCALE_RIGHT_GAP = 12
|
|
2982
|
-
const CONVERSATION_SCALE_HYSTERESIS = 16
|
|
2983
|
-
const CONVERSATION_SCALE_DEFAULT_MAX_DISTANCE = 96
|
|
2984
|
-
const SCALE_WIDTH = CONVERSATION_SCALE_WIDTH
|
|
2985
|
-
const PREVIEW_WIDTH = CONVERSATION_SCALE_PREVIEW_WIDTH
|
|
2986
|
-
const PREVIEW_GAP = CONVERSATION_SCALE_PREVIEW_GAP
|
|
2987
|
-
const PREVIEW_FALLBACK_HEIGHT = 128
|
|
2988
|
-
const PREVIEW_DELAY = 100
|
|
2989
|
-
const HISTORY_TRIGGER_HEIGHT = CONVERSATION_SCALE_SPACING
|
|
2990
|
-
const PREVIEW_REFRESH_INTERVAL = 100
|
|
2991
|
-
const PREVIEW_TOUCH_DURATION = 1200
|
|
2992
|
-
const SNAP_DELAY = 110
|
|
2993
|
-
const TOUCH_WAVE_DURATION = 620
|
|
2994
|
-
const HISTORY_PAGE_SETTLE_LIMIT = 4000
|
|
2995
|
-
const GEOMETRY_SETTLE_FRAME_LIMIT = 24
|
|
2996
|
-
let scaleInstanceSeed = 0
|
|
2997
|
-
function clamp(value, minimum, maximum) {
|
|
2998
|
-
return Math.min(maximum, Math.max(minimum, value))
|
|
2999
|
-
}
|
|
3000
|
-
function resolveConversationScaleGeometry({
|
|
3001
|
-
operationWidth,
|
|
3002
|
-
contentLeft,
|
|
3003
|
-
maximumDistance = CONVERSATION_SCALE_DEFAULT_MAX_DISTANCE,
|
|
3004
|
-
previouslyHidden = false,
|
|
3005
|
-
} = {}) {
|
|
3006
|
-
const width = Number(operationWidth)
|
|
3007
|
-
const content = Number(contentLeft)
|
|
3008
|
-
const maximum = Number(maximumDistance)
|
|
3009
|
-
if (!Number.isFinite(width) || width <= 0 || !Number.isFinite(content) || content <= 0) {
|
|
3010
|
-
return { visible: false, reason: 'unmeasured' }
|
|
3011
|
-
}
|
|
3012
|
-
const recovery = previouslyHidden ? CONVERSATION_SCALE_HYSTERESIS : 0
|
|
3013
|
-
const minimumCorridor = CONVERSATION_SCALE_WIDTH + CONVERSATION_SCALE_CONTENT_GAP * 2 + recovery
|
|
3014
|
-
if (content < minimumCorridor) return { visible: false, reason: 'corridor' }
|
|
3015
|
-
const configuredLeft = clamp(
|
|
3016
|
-
Number.isFinite(maximum) ? maximum : CONVERSATION_SCALE_DEFAULT_MAX_DISTANCE,
|
|
3017
|
-
CONVERSATION_SCALE_CONTENT_GAP,
|
|
3018
|
-
Math.max(CONVERSATION_SCALE_CONTENT_GAP, width - CONVERSATION_SCALE_WIDTH - CONVERSATION_SCALE_RIGHT_GAP),
|
|
3019
|
-
)
|
|
3020
|
-
const centered = configuredLeft + CONVERSATION_SCALE_WIDTH + CONVERSATION_SCALE_CONTENT_GAP > content
|
|
3021
|
-
const left = centered ? (content - CONVERSATION_SCALE_WIDTH) / 2 : configuredLeft
|
|
3022
|
-
const previewRight = left
|
|
3023
|
-
+ CONVERSATION_SCALE_WIDTH
|
|
3024
|
-
+ CONVERSATION_SCALE_PREVIEW_GAP
|
|
3025
|
-
+ CONVERSATION_SCALE_PREVIEW_WIDTH
|
|
3026
|
-
+ CONVERSATION_SCALE_RIGHT_GAP
|
|
3027
|
-
+ recovery
|
|
3028
|
-
if (previewRight > width) return { visible: false, reason: 'preview', left, centered }
|
|
3029
|
-
return { visible: true, reason: 'ready', left, centered }
|
|
3030
|
-
}
|
|
3031
|
-
function resolveConversationScaleCalibrationState({
|
|
3032
|
-
operationWidth,
|
|
3033
|
-
contentLeft,
|
|
3034
|
-
maximumDistance = CONVERSATION_SCALE_DEFAULT_MAX_DISTANCE,
|
|
3035
|
-
turnCount = 0,
|
|
3036
|
-
drawerMode,
|
|
3037
|
-
viewportWidth,
|
|
3038
|
-
previouslyHidden = false,
|
|
3039
|
-
} = {}) {
|
|
3040
|
-
const numeric = Number(maximumDistance)
|
|
3041
|
-
const normalizedMaximum = Number.isFinite(numeric)
|
|
3042
|
-
? clamp(Math.round(numeric / 8) * 8, 16, 240)
|
|
3043
|
-
: CONVERSATION_SCALE_DEFAULT_MAX_DISTANCE
|
|
3044
|
-
const resolution = drawerMode === 'overlay'
|
|
3045
|
-
? { visible: false, reason: 'drawer' }
|
|
3046
|
-
: Number(viewportWidth) <= 640
|
|
3047
|
-
? { visible: false, reason: 'phone' }
|
|
3048
|
-
: resolveConversationScaleGeometry({
|
|
3049
|
-
operationWidth,
|
|
3050
|
-
contentLeft,
|
|
3051
|
-
maximumDistance: normalizedMaximum,
|
|
3052
|
-
previouslyHidden,
|
|
3053
|
-
})
|
|
3054
|
-
if (!resolution.visible) return {
|
|
3055
|
-
...resolution,
|
|
3056
|
-
mode: 'hidden',
|
|
3057
|
-
maximumDistance: normalizedMaximum,
|
|
3058
|
-
}
|
|
3059
|
-
if (Number(turnCount) < MINIMUM_TURNS) return {
|
|
3060
|
-
visible: false,
|
|
3061
|
-
reason: 'turns',
|
|
3062
|
-
mode: 'hidden',
|
|
3063
|
-
maximumDistance: normalizedMaximum,
|
|
3064
|
-
left: resolution.left,
|
|
3065
|
-
centered: resolution.centered,
|
|
3066
|
-
}
|
|
3067
|
-
return {
|
|
3068
|
-
...resolution,
|
|
3069
|
-
mode: resolution.centered ? 'centered' : 'configured',
|
|
3070
|
-
maximumDistance: normalizedMaximum,
|
|
3071
|
-
}
|
|
3072
|
-
}
|
|
3073
|
-
function visible(node) {
|
|
3074
|
-
return node && !node.hidden && node.getAttribute('aria-hidden') !== 'true'
|
|
3075
|
-
}
|
|
3076
|
-
function follows(first, second) {
|
|
3077
|
-
return Boolean(first?.compareDocumentPosition?.(second) & 4)
|
|
3078
|
-
}
|
|
3079
|
-
function truncateText(value, limit) {
|
|
3080
|
-
const characters = Array.from(value)
|
|
3081
|
-
return characters.length > limit ? `${characters.slice(0, limit).join('')}…` : value
|
|
3082
|
-
}
|
|
3083
|
-
function attachmentSummary(node) {
|
|
3084
|
-
const named = node?.querySelector?.('[data-file-name], [download], img[alt]')
|
|
3085
|
-
const name = named?.getAttribute('data-file-name')
|
|
3086
|
-
|| named?.getAttribute('download')
|
|
3087
|
-
|| named?.getAttribute('alt')
|
|
3088
|
-
if (name?.trim()) return `${named?.matches('img') ? '图片' : '附件'} · ${name.trim()}`
|
|
3089
|
-
if (node?.querySelector?.('img, [data-file], [data-attachment], input[type="file"]')) return '附件消息'
|
|
3090
|
-
return ''
|
|
3091
|
-
}
|
|
3092
|
-
function sanitizeConversationPreviewNode(node, limit = 360) {
|
|
3093
|
-
if (!node) return ''
|
|
3094
|
-
const clone = node.cloneNode(true)
|
|
3095
|
-
for (const removable of clone.querySelectorAll?.(PREVIEW_REMOVE_SELECTOR) || []) removable.remove()
|
|
3096
|
-
for (const block of clone.querySelectorAll?.('pre') || []) {
|
|
3097
|
-
const firstLine = block.textContent?.split(/\r?\n/).map(line => line.trim()).find(Boolean) || ''
|
|
3098
|
-
block.textContent = firstLine ? `代码:${firstLine}` : '代码'
|
|
3099
|
-
}
|
|
3100
|
-
const text = clone.textContent?.replace(/\s+/g, ' ').trim() || attachmentSummary(node)
|
|
3101
|
-
return truncateText(text, limit)
|
|
3102
|
-
}
|
|
3103
|
-
function collectConversationTurns(scroller) {
|
|
3104
|
-
if (!scroller) return []
|
|
3105
|
-
return Array.from(scroller.querySelectorAll(CONVERSATION_USER_TURN_SELECTOR)).filter(node => {
|
|
3106
|
-
if (!visible(node) || node.closest('[data-prts-conversation-scale], [data-prts-conversation-preview]')) return false
|
|
3107
|
-
const parent = node.parentElement?.closest?.(CONVERSATION_USER_TURN_SELECTOR)
|
|
3108
|
-
return !parent || !scroller.contains(parent)
|
|
3109
|
-
})
|
|
3110
|
-
}
|
|
3111
|
-
function hasClassSuffix(node, suffix) {
|
|
3112
|
-
return [...(node?.classList ?? [])].some(token => token.endsWith(suffix))
|
|
3113
|
-
}
|
|
3114
|
-
function findConversationOlderButton(root) {
|
|
3115
|
-
for (const button of root?.querySelectorAll?.('button') ?? []) {
|
|
3116
|
-
for (let current = button.parentElement; current && root.contains(current); current = current.parentElement) {
|
|
3117
|
-
if (hasClassSuffix(current, '_older')) return button
|
|
3118
|
-
}
|
|
3119
|
-
}
|
|
3120
|
-
return null
|
|
3121
|
-
}
|
|
3122
|
-
function resolveConversationHistorySnapshot(sessions) {
|
|
3123
|
-
try {
|
|
3124
|
-
const listSnapshot = sessions?.list?.getSnapshot?.()
|
|
3125
|
-
const current = listSnapshot?.current
|
|
3126
|
-
?? listSnapshot?.currentId
|
|
3127
|
-
?? listSnapshot?.currentSessionId
|
|
3128
|
-
if (current === undefined || current === null) return {}
|
|
3129
|
-
const binding = sessions?.binding?.(current)
|
|
3130
|
-
const session = binding?.session
|
|
3131
|
-
const snapshot = session?.getSnapshot?.() ?? binding?.getSnapshot?.()
|
|
3132
|
-
return { key: current, hasMore: snapshot?.hasMore === true, loading: snapshot?.loadingOlder === true }
|
|
3133
|
-
} catch {
|
|
3134
|
-
return {}
|
|
3135
|
-
}
|
|
3136
|
-
}
|
|
3137
|
-
function collectAssistantCandidates(scroller, turn, nextTurn) {
|
|
3138
|
-
return Array.from(scroller?.querySelectorAll?.(ASSISTANT_SELECTOR) || []).filter(node => {
|
|
3139
|
-
if (!visible(node)) return false
|
|
3140
|
-
const parent = node.parentElement?.closest?.(ASSISTANT_SELECTOR)
|
|
3141
|
-
if (parent && scroller.contains(parent)) return false
|
|
3142
|
-
if (!follows(turn, node)) return false
|
|
3143
|
-
return !nextTurn || follows(node, nextTurn)
|
|
3144
|
-
})
|
|
3145
|
-
}
|
|
3146
|
-
function formalBodies(candidate) {
|
|
3147
|
-
const bodies = []
|
|
3148
|
-
if (candidate.matches?.(FORMAL_ANSWER_SELECTOR)) bodies.push(candidate)
|
|
3149
|
-
bodies.push(...candidate.querySelectorAll?.(FORMAL_ANSWER_SELECTOR) || [])
|
|
3150
|
-
return bodies.filter(body => !body.closest?.(AUXILIARY_SELECTOR))
|
|
3151
|
-
}
|
|
3152
|
-
function getConversationTurnPreview(scroller, turns, index) {
|
|
3153
|
-
const turn = turns?.[index]
|
|
3154
|
-
if (!turn) return { question: '', answer: '尚无有效回复', state: 'empty', answerSource: undefined }
|
|
3155
|
-
const nextTurn = turns[index + 1]
|
|
3156
|
-
const questionSource = turn.querySelector?.('[class$="_bubble"], [data-message-role="user"]') || turn
|
|
3157
|
-
const question = sanitizeConversationPreviewNode(questionSource, 180) || attachmentSummary(turn) || '附件消息'
|
|
3158
|
-
const candidates = collectAssistantCandidates(scroller, turn, nextTurn)
|
|
3159
|
-
for (const candidate of candidates) {
|
|
3160
|
-
for (const body of formalBodies(candidate)) {
|
|
3161
|
-
const answer = sanitizeConversationPreviewNode(body, 420)
|
|
3162
|
-
if (answer) return { question, answer, state: 'answer', answerSource: body }
|
|
3163
|
-
}
|
|
3164
|
-
}
|
|
3165
|
-
for (const candidate of candidates) {
|
|
3166
|
-
const answer = sanitizeConversationPreviewNode(candidate, 420)
|
|
3167
|
-
if (answer) return { question, answer, state: 'fallback', answerSource: candidate }
|
|
3168
|
-
}
|
|
3169
|
-
const streaming = candidates.some(candidate => candidate.matches?.(STREAMING_SELECTOR) || candidate.querySelector?.(STREAMING_SELECTOR))
|
|
3170
|
-
return {
|
|
3171
|
-
question,
|
|
3172
|
-
answer: streaming ? '正在生成…' : '尚无有效回复',
|
|
3173
|
-
state: streaming ? 'streaming' : 'empty',
|
|
3174
|
-
answerSource: candidates[0],
|
|
3175
|
-
}
|
|
3176
|
-
}
|
|
3177
|
-
function getConversationScaleLayout(count, height, requestedOffset = 0) {
|
|
3178
|
-
const safeCount = Math.max(0, Math.floor(Number(count) || 0))
|
|
3179
|
-
const safeHeight = Math.max(1, Number(height) || 1)
|
|
3180
|
-
const span = Math.max(0, safeCount - 1) * CONVERSATION_SCALE_SPACING
|
|
3181
|
-
const usableHeight = Math.max(0, safeHeight - 1)
|
|
3182
|
-
const maxOffset = Math.max(0, span - usableHeight)
|
|
3183
|
-
const offset = clamp(Number(requestedOffset) || 0, 0, maxOffset)
|
|
3184
|
-
const start = .5 + (maxOffset === 0 ? (usableHeight - span) / 2 : 0)
|
|
3185
|
-
const positions = Array.from({ length: safeCount }, (_, index) =>
|
|
3186
|
-
start + index * CONVERSATION_SCALE_SPACING - offset)
|
|
3187
|
-
return { count: safeCount, height: safeHeight, span, maxOffset, offset, start, positions }
|
|
3188
|
-
}
|
|
3189
|
-
function conversationScaleWaveLength(distance, lengths = CONVERSATION_SCALE_LENGTHS) {
|
|
3190
|
-
const safeDistance = Math.abs(Number(distance) || 0)
|
|
3191
|
-
const lower = Math.floor(safeDistance)
|
|
3192
|
-
if (lower >= lengths.length - 1) return lengths.at(-1)
|
|
3193
|
-
const progress = safeDistance - lower
|
|
3194
|
-
const from = lengths[lower]
|
|
3195
|
-
const to = lengths[lower + 1]
|
|
3196
|
-
return from + (to - from) * progress
|
|
3197
|
-
}
|
|
3198
|
-
function visibleConversationTickRange(layout, buffer = 2) {
|
|
3199
|
-
if (!layout?.count) return { minimum: 0, maximum: -1 }
|
|
3200
|
-
const padding = Math.max(0, Math.floor(Number(buffer) || 0))
|
|
3201
|
-
const minimum = Math.max(
|
|
3202
|
-
0,
|
|
3203
|
-
Math.ceil((layout.offset - layout.start) / CONVERSATION_SCALE_SPACING) - padding,
|
|
3204
|
-
)
|
|
3205
|
-
const maximum = Math.min(
|
|
3206
|
-
layout.count - 1,
|
|
3207
|
-
Math.floor((layout.height - .5 + layout.offset - layout.start) / CONVERSATION_SCALE_SPACING) + padding,
|
|
3208
|
-
)
|
|
3209
|
-
return { minimum, maximum }
|
|
3210
|
-
}
|
|
3211
|
-
function nearestVisibleConversationTick(layout, localY) {
|
|
3212
|
-
if (!layout?.count) return -1
|
|
3213
|
-
const minimum = Math.max(0, Math.ceil((layout.offset - layout.start) / CONVERSATION_SCALE_SPACING))
|
|
3214
|
-
const maximum = Math.min(
|
|
3215
|
-
layout.count - 1,
|
|
3216
|
-
Math.floor((layout.height - .5 + layout.offset - layout.start) / CONVERSATION_SCALE_SPACING),
|
|
3217
|
-
)
|
|
3218
|
-
if (maximum < minimum) return -1
|
|
3219
|
-
const raw = Math.round((Number(localY) + layout.offset - layout.start) / CONVERSATION_SCALE_SPACING)
|
|
3220
|
-
return clamp(raw, minimum, maximum)
|
|
3221
|
-
}
|
|
3222
|
-
function snapConversationScaleOffset(offset, maximum) {
|
|
3223
|
-
return clamp(
|
|
3224
|
-
Math.round((Number(offset) || 0) / CONVERSATION_SCALE_SPACING) * CONVERSATION_SCALE_SPACING,
|
|
3225
|
-
0,
|
|
3226
|
-
Math.max(0, Number(maximum) || 0),
|
|
3227
|
-
)
|
|
3228
|
-
}
|
|
3229
|
-
function shouldFollowConversationScaleBottom(offset, maximum) {
|
|
3230
|
-
return Math.max(0, Number(maximum) || 0) - (Number(offset) || 0) <= 1
|
|
3231
|
-
}
|
|
3232
|
-
function calculateConversationJumpTop({
|
|
3233
|
-
scrollTop,
|
|
3234
|
-
scrollHeight,
|
|
3235
|
-
clientHeight,
|
|
3236
|
-
turnTop,
|
|
3237
|
-
visibleTop,
|
|
3238
|
-
visibleHeight,
|
|
3239
|
-
}) {
|
|
3240
|
-
const target = (Number(scrollTop) || 0)
|
|
3241
|
-
+ (Number(turnTop) || 0)
|
|
3242
|
-
- (Number(visibleTop) || 0)
|
|
3243
|
-
- Math.max(0, Number(visibleHeight) || 0) * .28
|
|
3244
|
-
return clamp(target, 0, Math.max(0, (Number(scrollHeight) || 0) - (Number(clientHeight) || 0)))
|
|
3245
|
-
}
|
|
3246
|
-
function resolveConversationJumpBehavior(distance, viewportHeight, prefersReducedMotion = false) {
|
|
3247
|
-
if (prefersReducedMotion) return 'auto'
|
|
3248
|
-
const height = Math.max(0, Number(viewportHeight) || 0)
|
|
3249
|
-
const delta = Math.abs(Number(distance) || 0)
|
|
3250
|
-
return height > 0 && delta <= height * CONVERSATION_JUMP_SMOOTH_VIEWPORT_LIMIT ? 'smooth' : 'auto'
|
|
3251
|
-
}
|
|
3252
|
-
function resolveConversationJumpSettle(distance, viewportHeight, prefersReducedMotion = false) {
|
|
3253
|
-
if (prefersReducedMotion || resolveConversationJumpBehavior(distance, viewportHeight) === 'smooth') {
|
|
3254
|
-
return { offset: 0, duration: 0 }
|
|
3255
|
-
}
|
|
3256
|
-
const height = Math.max(0, Number(viewportHeight) || 0)
|
|
3257
|
-
const delta = Number(distance) || 0
|
|
3258
|
-
if (height <= 0 || Math.abs(delta) <= 2) return { offset: 0, duration: 0 }
|
|
3259
|
-
const offset = Math.sign(delta) * Math.min(
|
|
3260
|
-
Math.abs(delta),
|
|
3261
|
-
CONVERSATION_JUMP_SETTLE_MAX_DISTANCE,
|
|
3262
|
-
height * CONVERSATION_JUMP_SETTLE_VIEWPORT_RATIO,
|
|
3263
|
-
)
|
|
3264
|
-
return { offset, duration: CONVERSATION_JUMP_SETTLE_DURATION }
|
|
3265
|
-
}
|
|
3266
|
-
function scrollConversationTo(scroller, top, behavior) {
|
|
3267
|
-
if (typeof scroller?.scrollTo === 'function') scroller.scrollTo({ top, behavior })
|
|
3268
|
-
else if (scroller) scroller.scrollTop = top
|
|
3269
|
-
}
|
|
3270
|
-
async function performConversationJump({
|
|
3271
|
-
scroller,
|
|
3272
|
-
getTargetTop,
|
|
3273
|
-
prefersReducedMotion = false,
|
|
3274
|
-
requestFrame = callback => globalThis.requestAnimationFrame?.(callback) ?? globalThis.setTimeout?.(callback, 16),
|
|
3275
|
-
now = () => globalThis.performance?.now?.() ?? Date.now(),
|
|
3276
|
-
cancelled = () => false,
|
|
3277
|
-
onFrame = () => {},
|
|
3278
|
-
} = {}) {
|
|
3279
|
-
if (!scroller || typeof getTargetTop !== 'function') return false
|
|
3280
|
-
const nextFrame = () => new Promise(resolve => requestFrame(timestamp => {
|
|
3281
|
-
resolve(Number.isFinite(timestamp) ? timestamp : now())
|
|
3282
|
-
}))
|
|
3283
|
-
const targetTop = () => {
|
|
3284
|
-
const raw = getTargetTop()
|
|
3285
|
-
if (raw === null || raw === undefined) return null
|
|
3286
|
-
const value = Number(raw)
|
|
3287
|
-
return Number.isFinite(value) ? value : null
|
|
3288
|
-
}
|
|
3289
|
-
let top = targetTop()
|
|
3290
|
-
if (top === null) return false
|
|
3291
|
-
const floor = Math.max(0, Number(scroller.scrollHeight) - Number(scroller.clientHeight))
|
|
3292
|
-
const bottomDistance = floor - Number(scroller.scrollTop)
|
|
3293
|
-
if (bottomDistance <= CONVERSATION_JUMP_BOTTOM_THRESHOLD && top < Number(scroller.scrollTop)) {
|
|
3294
|
-
scroller.scrollTop = Math.max(0, Number(scroller.scrollTop) - 1)
|
|
3295
|
-
await nextFrame()
|
|
3296
|
-
if (cancelled()) return null
|
|
3297
|
-
top = targetTop()
|
|
3298
|
-
if (top === null) return false
|
|
3299
|
-
}
|
|
3300
|
-
const distance = top - Number(scroller.scrollTop)
|
|
3301
|
-
const behavior = resolveConversationJumpBehavior(distance, scroller.clientHeight, prefersReducedMotion)
|
|
3302
|
-
const settle = resolveConversationJumpSettle(distance, scroller.clientHeight, prefersReducedMotion)
|
|
3303
|
-
if (settle.duration > 0) {
|
|
3304
|
-
const limit = () => Math.max(0, Number(scroller.scrollHeight) - Number(scroller.clientHeight))
|
|
3305
|
-
const beforeTarget = clamp(top - settle.offset, 0, limit())
|
|
3306
|
-
scrollConversationTo(scroller, beforeTarget, 'auto')
|
|
3307
|
-
await nextFrame()
|
|
3308
|
-
if (cancelled()) return null
|
|
3309
|
-
const from = Number(scroller.scrollTop)
|
|
3310
|
-
const startedAt = now()
|
|
3311
|
-
let progress = 0
|
|
3312
|
-
while (progress < 1) {
|
|
3313
|
-
const timestamp = await nextFrame()
|
|
3314
|
-
if (cancelled()) return null
|
|
3315
|
-
progress = Math.min(1, (timestamp - startedAt) / settle.duration)
|
|
3316
|
-
const eased = 1 - (1 - progress) ** 3
|
|
3317
|
-
const liveTarget = targetTop()
|
|
3318
|
-
if (liveTarget === null) return false
|
|
3319
|
-
scroller.scrollTop = from + (liveTarget - from) * eased
|
|
3320
|
-
onFrame()
|
|
3321
|
-
}
|
|
3322
|
-
} else {
|
|
3323
|
-
scrollConversationTo(scroller, top, behavior)
|
|
3324
|
-
onFrame()
|
|
3325
|
-
}
|
|
3326
|
-
let stableFrames = 0
|
|
3327
|
-
let verificationFrames = 0
|
|
3328
|
-
const verificationStartedAt = now()
|
|
3329
|
-
while (now() - verificationStartedAt < CONVERSATION_JUMP_VERIFY_DURATION && verificationFrames < 72) {
|
|
3330
|
-
await nextFrame()
|
|
3331
|
-
verificationFrames += 1
|
|
3332
|
-
if (cancelled()) return null
|
|
3333
|
-
const liveTarget = targetTop()
|
|
3334
|
-
if (liveTarget === null) return false
|
|
3335
|
-
stableFrames = Math.abs(Number(scroller.scrollTop) - liveTarget) <= 2 ? stableFrames + 1 : 0
|
|
3336
|
-
if (stableFrames >= 2) return true
|
|
3337
|
-
}
|
|
3338
|
-
top = targetTop()
|
|
3339
|
-
if (top === null) return false
|
|
3340
|
-
scrollConversationTo(scroller, top, 'auto')
|
|
3341
|
-
await nextFrame()
|
|
3342
|
-
await nextFrame()
|
|
3343
|
-
if (cancelled()) return null
|
|
3344
|
-
const correctedTarget = targetTop()
|
|
3345
|
-
return correctedTarget !== null && Math.abs(Number(scroller.scrollTop) - correctedTarget) <= 2
|
|
3346
|
-
}
|
|
3347
|
-
function buildConversationScalePaths(layout, interactionIndex = -1, animation, lengths = CONVERSATION_SCALE_LENGTHS) {
|
|
3348
|
-
const gray = []
|
|
3349
|
-
const yellow = []
|
|
3350
|
-
const history = []
|
|
3351
|
-
const hovering = interactionIndex >= 0 && interactionIndex < layout.count
|
|
3352
|
-
const animatedCenter = Number.isFinite(animation?.center) ? animation.center : interactionIndex
|
|
3353
|
-
const animatedIntensity = animation
|
|
3354
|
-
? clamp(Number(animation.intensity) || 0, 0, 1)
|
|
3355
|
-
: hovering ? 1 : 0
|
|
3356
|
-
const restingLength = lengths.at(-1)
|
|
3357
|
-
const { minimum, maximum } = visibleConversationTickRange(layout)
|
|
3358
|
-
for (let index = minimum; index <= maximum; index += 1) {
|
|
3359
|
-
const rawY = layout.start + index * CONVERSATION_SCALE_SPACING - layout.offset
|
|
3360
|
-
if (rawY < .5 || rawY > layout.height - .5) continue
|
|
3361
|
-
const y = Number(rawY.toFixed(2))
|
|
3362
|
-
const waveLength = conversationScaleWaveLength(Math.abs(index - animatedCenter), lengths)
|
|
3363
|
-
if (animation?.historyAvailable && index === 0) {
|
|
3364
|
-
const selected = interactionIndex === 0
|
|
3365
|
-
const intensity = selected ? animatedIntensity : 0
|
|
3366
|
-
const restingFirstEnd = 2 + restingLength
|
|
3367
|
-
const restingSecondStart = restingFirstEnd + 4
|
|
3368
|
-
const restingSecondEnd = restingSecondStart + restingLength
|
|
3369
|
-
const firstEnd = Number((
|
|
3370
|
-
restingFirstEnd + (14 - restingFirstEnd) * intensity
|
|
3371
|
-
).toFixed(2))
|
|
3372
|
-
const secondStart = Number((
|
|
3373
|
-
restingSecondStart + (16 - restingSecondStart) * intensity
|
|
3374
|
-
).toFixed(2))
|
|
3375
|
-
const secondEnd = Number((
|
|
3376
|
-
restingSecondEnd + (30 - restingSecondEnd) * intensity
|
|
3377
|
-
).toFixed(2))
|
|
3378
|
-
history.push(`M2 ${y}H${firstEnd}M${secondStart} ${y}H${secondEnd}`)
|
|
3379
|
-
continue
|
|
3380
|
-
}
|
|
3381
|
-
const length = restingLength + (waveLength - restingLength) * animatedIntensity
|
|
3382
|
-
const command = `M2 ${y}H${Number((2 + length).toFixed(2))}`
|
|
3383
|
-
const accented = hovering ? index === interactionIndex : index === layout.count - 1
|
|
3384
|
-
;(accented ? yellow : gray).push(command)
|
|
3385
|
-
}
|
|
3386
|
-
return { gray: gray.join(''), yellow: yellow.join(''), history: history.join('') }
|
|
3387
|
-
}
|
|
3388
|
-
function createPreview(document, id) {
|
|
3389
|
-
const preview = document.createElement('aside')
|
|
3390
|
-
preview.id = id
|
|
3391
|
-
preview.setAttribute('data-prts-conversation-preview', '')
|
|
3392
|
-
preview.setAttribute('data-prts-owned-conversation-preview', '')
|
|
3393
|
-
preview.setAttribute('role', 'tooltip')
|
|
3394
|
-
preview.setAttribute('aria-hidden', 'true')
|
|
3395
|
-
const connector = document.createElement('span')
|
|
3396
|
-
connector.setAttribute('data-prts-conversation-preview-connector', '')
|
|
3397
|
-
connector.setAttribute('aria-hidden', 'true')
|
|
3398
|
-
const body = document.createElement('div')
|
|
3399
|
-
body.setAttribute('data-prts-conversation-preview-body', '')
|
|
3400
|
-
const question = document.createElement('div')
|
|
3401
|
-
question.setAttribute('data-prts-conversation-preview-row', 'question')
|
|
3402
|
-
const questionLabel = document.createElement('b')
|
|
3403
|
-
questionLabel.textContent = 'Q'
|
|
3404
|
-
const questionText = document.createElement('span')
|
|
3405
|
-
questionText.setAttribute('data-prts-conversation-preview-question', '')
|
|
3406
|
-
question.append(questionLabel, questionText)
|
|
3407
|
-
const answer = document.createElement('div')
|
|
3408
|
-
answer.setAttribute('data-prts-conversation-preview-row', 'answer')
|
|
3409
|
-
const answerLabel = document.createElement('b')
|
|
3410
|
-
answerLabel.textContent = 'A'
|
|
3411
|
-
const answerText = document.createElement('span')
|
|
3412
|
-
answerText.setAttribute('data-prts-conversation-preview-answer', '')
|
|
3413
|
-
answer.append(answerLabel, answerText)
|
|
3414
|
-
body.append(question, answer)
|
|
3415
|
-
preview.append(connector, body)
|
|
3416
|
-
preview._prtsBody = body
|
|
3417
|
-
preview._prtsQuestion = questionText
|
|
3418
|
-
preview._prtsAnswer = answerText
|
|
3419
|
-
return preview
|
|
3420
|
-
}
|
|
3421
|
-
function createScale(document) {
|
|
3422
|
-
const instance = ++scaleInstanceSeed
|
|
3423
|
-
const maskId = `prts-conversation-scale-fade-${instance}`
|
|
3424
|
-
const previewId = `prts-conversation-preview-${instance}`
|
|
3425
|
-
const historyTooltipId = `prts-conversation-history-tooltip-${instance}`
|
|
3426
|
-
const scale = document.createElement('div')
|
|
3427
|
-
scale.setAttribute('data-prts-conversation-scale', '')
|
|
3428
|
-
scale.setAttribute('data-prts-owned-conversation-scale', '')
|
|
3429
|
-
scale.setAttribute('role', 'slider')
|
|
3430
|
-
scale.setAttribute('aria-label', '会话刻度导航')
|
|
3431
|
-
scale.setAttribute('aria-orientation', 'vertical')
|
|
3432
|
-
scale.tabIndex = 0
|
|
3433
|
-
const svg = document.createElementNS(SVG_NAMESPACE, 'svg')
|
|
3434
|
-
svg.setAttribute('data-prts-conversation-scale-svg', '')
|
|
3435
|
-
svg.setAttribute('aria-hidden', 'true')
|
|
3436
|
-
svg.setAttribute('preserveAspectRatio', 'none')
|
|
3437
|
-
const defs = document.createElementNS(SVG_NAMESPACE, 'defs')
|
|
3438
|
-
const gradient = document.createElementNS(SVG_NAMESPACE, 'linearGradient')
|
|
3439
|
-
gradient.id = `${maskId}-gradient`
|
|
3440
|
-
gradient.setAttribute('gradientUnits', 'userSpaceOnUse')
|
|
3441
|
-
gradient.setAttribute('x1', '0')
|
|
3442
|
-
gradient.setAttribute('y1', '0')
|
|
3443
|
-
gradient.setAttribute('x2', '0')
|
|
3444
|
-
gradient.setAttribute('y2', '24')
|
|
3445
|
-
const transparent = document.createElementNS(SVG_NAMESPACE, 'stop')
|
|
3446
|
-
transparent.setAttribute('offset', '0')
|
|
3447
|
-
transparent.setAttribute('stop-color', 'white')
|
|
3448
|
-
transparent.setAttribute('stop-opacity', '0')
|
|
3449
|
-
const opaque = document.createElementNS(SVG_NAMESPACE, 'stop')
|
|
3450
|
-
opaque.setAttribute('offset', '1')
|
|
3451
|
-
opaque.setAttribute('stop-color', 'white')
|
|
3452
|
-
gradient.append(transparent, opaque)
|
|
3453
|
-
const mask = document.createElementNS(SVG_NAMESPACE, 'mask')
|
|
3454
|
-
mask.id = maskId
|
|
3455
|
-
mask.setAttribute('maskUnits', 'userSpaceOnUse')
|
|
3456
|
-
mask.setAttribute('x', '0')
|
|
3457
|
-
mask.setAttribute('y', '0')
|
|
3458
|
-
mask.setAttribute('width', String(SCALE_WIDTH))
|
|
3459
|
-
const maskRect = document.createElementNS(SVG_NAMESPACE, 'rect')
|
|
3460
|
-
maskRect.setAttribute('x', '0')
|
|
3461
|
-
maskRect.setAttribute('y', '0')
|
|
3462
|
-
maskRect.setAttribute('width', String(SCALE_WIDTH))
|
|
3463
|
-
maskRect.setAttribute('fill', `url(#${gradient.id})`)
|
|
3464
|
-
mask.append(maskRect)
|
|
3465
|
-
defs.append(gradient, mask)
|
|
3466
|
-
const marks = document.createElementNS(SVG_NAMESPACE, 'g')
|
|
3467
|
-
marks.setAttribute('data-prts-conversation-scale-marks', '')
|
|
3468
|
-
const gray = document.createElementNS(SVG_NAMESPACE, 'path')
|
|
3469
|
-
gray.setAttribute('data-prts-conversation-scale-gray', '')
|
|
3470
|
-
const yellow = document.createElementNS(SVG_NAMESPACE, 'path')
|
|
3471
|
-
yellow.setAttribute('data-prts-conversation-scale-accent', '')
|
|
3472
|
-
const history = document.createElementNS(SVG_NAMESPACE, 'path')
|
|
3473
|
-
history.setAttribute('data-prts-conversation-scale-history', '')
|
|
3474
|
-
marks.append(gray, yellow, history)
|
|
3475
|
-
const hit = document.createElementNS(SVG_NAMESPACE, 'rect')
|
|
3476
|
-
hit.setAttribute('data-prts-conversation-scale-hit', '')
|
|
3477
|
-
hit.setAttribute('x', '0')
|
|
3478
|
-
hit.setAttribute('y', '0')
|
|
3479
|
-
hit.setAttribute('width', String(SCALE_WIDTH))
|
|
3480
|
-
hit.setAttribute('fill', 'transparent')
|
|
3481
|
-
svg.append(defs, marks, hit)
|
|
3482
|
-
scale.append(svg)
|
|
3483
|
-
scale._prtsSvg = svg
|
|
3484
|
-
scale._prtsMarks = marks
|
|
3485
|
-
scale._prtsMask = mask
|
|
3486
|
-
scale._prtsMaskRect = maskRect
|
|
3487
|
-
scale._prtsMaskId = maskId
|
|
3488
|
-
scale._prtsGray = gray
|
|
3489
|
-
scale._prtsAccent = yellow
|
|
3490
|
-
scale._prtsHistory = history
|
|
3491
|
-
scale._prtsHit = hit
|
|
3492
|
-
scale._prtsPreview = createPreview(document, previewId)
|
|
3493
|
-
const historyStatus = document.createElement('div')
|
|
3494
|
-
historyStatus.setAttribute('data-prts-conversation-history-status', '')
|
|
3495
|
-
historyStatus.setAttribute('role', 'status')
|
|
3496
|
-
historyStatus.setAttribute('aria-live', 'polite')
|
|
3497
|
-
historyStatus.hidden = true
|
|
3498
|
-
const historyText = document.createElement('span')
|
|
3499
|
-
historyText.setAttribute('data-prts-conversation-history-text', '')
|
|
3500
|
-
const historyAction = document.createElement('button')
|
|
3501
|
-
historyAction.type = 'button'
|
|
3502
|
-
historyAction.setAttribute('data-prts-conversation-history-action', '')
|
|
3503
|
-
historyStatus.append(historyText, historyAction)
|
|
3504
|
-
const historyHint = document.createElement('div')
|
|
3505
|
-
historyHint.setAttribute('data-prts-conversation-history-hint', '')
|
|
3506
|
-
historyHint.setAttribute('data-prts-owned-conversation-scale', '')
|
|
3507
|
-
historyHint.hidden = true
|
|
3508
|
-
const historyTrigger = document.createElement('button')
|
|
3509
|
-
historyTrigger.type = 'button'
|
|
3510
|
-
historyTrigger.tabIndex = -1
|
|
3511
|
-
historyTrigger.setAttribute('data-prts-conversation-history-trigger', '')
|
|
3512
|
-
historyTrigger.setAttribute('aria-label', '载入更早内容并前往会话开头')
|
|
3513
|
-
const historyTooltip = document.createElement('div')
|
|
3514
|
-
historyTooltip.id = historyTooltipId
|
|
3515
|
-
historyTooltip.setAttribute('data-prts-conversation-history-tooltip', '')
|
|
3516
|
-
historyTooltip.setAttribute('role', 'tooltip')
|
|
3517
|
-
historyTooltip.setAttribute('aria-hidden', 'true')
|
|
3518
|
-
historyTooltip.hidden = true
|
|
3519
|
-
const historyTooltipConnector = document.createElement('span')
|
|
3520
|
-
historyTooltipConnector.setAttribute('data-prts-conversation-history-tooltip-connector', '')
|
|
3521
|
-
historyTooltipConnector.setAttribute('aria-hidden', 'true')
|
|
3522
|
-
const historyTooltipBody = document.createElement('div')
|
|
3523
|
-
historyTooltipBody.setAttribute('data-prts-conversation-preview-body', '')
|
|
3524
|
-
historyTooltipBody.setAttribute('data-prts-conversation-history-tooltip-body', '')
|
|
3525
|
-
const historyTooltipHeader = document.createElement('div')
|
|
3526
|
-
historyTooltipHeader.setAttribute('data-prts-conversation-preview-row', 'question')
|
|
3527
|
-
const historyTooltipHeaderLabel = document.createElement('b')
|
|
3528
|
-
historyTooltipHeaderLabel.textContent = 'H'
|
|
3529
|
-
const historyTooltipHeaderText = document.createElement('span')
|
|
3530
|
-
historyTooltipHeaderText.setAttribute('data-prts-conversation-history-tooltip-label', '')
|
|
3531
|
-
historyTooltipHeaderText.textContent = '历史断点'
|
|
3532
|
-
historyTooltipHeader.append(historyTooltipHeaderLabel, historyTooltipHeaderText)
|
|
3533
|
-
const historyTooltipDetail = document.createElement('div')
|
|
3534
|
-
historyTooltipDetail.setAttribute('data-prts-conversation-preview-row', 'answer')
|
|
3535
|
-
const historyTooltipDetailLabel = document.createElement('b')
|
|
3536
|
-
historyTooltipDetailLabel.textContent = '↥'
|
|
3537
|
-
const historyTooltipContent = document.createElement('div')
|
|
3538
|
-
historyTooltipContent.setAttribute('data-prts-conversation-history-tooltip-content', '')
|
|
3539
|
-
const historyTooltipTitle = document.createElement('strong')
|
|
3540
|
-
historyTooltipTitle.textContent = '更早内容尚未加载'
|
|
3541
|
-
const historyTooltipDescription = document.createElement('span')
|
|
3542
|
-
historyTooltipDescription.textContent = '点击断点,载入历史并前往会话开头'
|
|
3543
|
-
historyTooltipContent.append(historyTooltipTitle, historyTooltipDescription)
|
|
3544
|
-
historyTooltipDetail.append(historyTooltipDetailLabel, historyTooltipContent)
|
|
3545
|
-
historyTooltipBody.append(historyTooltipHeader, historyTooltipDetail)
|
|
3546
|
-
historyTooltip.append(historyTooltipConnector, historyTooltipBody)
|
|
3547
|
-
historyHint.append(historyTrigger, historyTooltip)
|
|
3548
|
-
scale._prtsHistoryStatus = historyStatus
|
|
3549
|
-
scale._prtsHistoryText = historyText
|
|
3550
|
-
scale._prtsHistoryAction = historyAction
|
|
3551
|
-
scale._prtsHistoryHint = historyHint
|
|
3552
|
-
scale._prtsHistoryTrigger = historyTrigger
|
|
3553
|
-
scale._prtsHistoryTooltip = historyTooltip
|
|
3554
|
-
return scale
|
|
3555
|
-
}
|
|
3556
|
-
function createConversationScaleAdapter({ document, window, sessions }) {
|
|
3557
|
-
let operation
|
|
3558
|
-
let scroller
|
|
3559
|
-
let composer
|
|
3560
|
-
let scale
|
|
3561
|
-
let preview
|
|
3562
|
-
let historyStatus
|
|
3563
|
-
let historyHint
|
|
3564
|
-
let mutationObserver
|
|
3565
|
-
let resizeObserver
|
|
3566
|
-
let previewObserver
|
|
3567
|
-
let previewSource
|
|
3568
|
-
let frame
|
|
3569
|
-
let waveFrame
|
|
3570
|
-
let snapTimer
|
|
3571
|
-
let touchTimer
|
|
3572
|
-
let previewDelayTimer
|
|
3573
|
-
let previewHideTimer
|
|
3574
|
-
let previewRefreshTimer
|
|
3575
|
-
let turns = []
|
|
3576
|
-
let resizeSettleTimer
|
|
3577
|
-
let resizeActive = false
|
|
3578
|
-
let layout
|
|
3579
|
-
let geometry
|
|
3580
|
-
let scaleOffset = 0
|
|
3581
|
-
let previousMaximum = 0
|
|
3582
|
-
let followBottom = true
|
|
3583
|
-
let cursorIndex = 0
|
|
3584
|
-
let hoverIndex = -1
|
|
3585
|
-
let previewIndex = -1
|
|
3586
|
-
let pendingPreviewIndex = -1
|
|
3587
|
-
let keyboardActive = false
|
|
3588
|
-
let pointerInside = false
|
|
3589
|
-
let pointerStart
|
|
3590
|
-
let lastDirectJump = 0
|
|
3591
|
-
let jumpRequest = 0
|
|
3592
|
-
let historyRequest = 0
|
|
3593
|
-
let historyMutationRevision = 0
|
|
3594
|
-
let historyAvailable = false
|
|
3595
|
-
let historyPhase = 'idle'
|
|
3596
|
-
let historyPages = 0
|
|
3597
|
-
let historyMessage = ''
|
|
3598
|
-
let historySessionKey
|
|
3599
|
-
let historyHintHovered = false
|
|
3600
|
-
let scanPending = false
|
|
3601
|
-
let fullScanPending = false
|
|
3602
|
-
let pendingMutations = []
|
|
3603
|
-
let obstructionDirty = true
|
|
3604
|
-
const overlayCandidates = new Set()
|
|
3605
|
-
let overlayScanPending = false
|
|
3606
|
-
let scaleObstructed = false
|
|
3607
|
-
let scaleBlockingObstructed = false
|
|
3608
|
-
let scaleSpaceObstructed = true
|
|
3609
|
-
let maximumDistance = CONVERSATION_SCALE_DEFAULT_MAX_DISTANCE
|
|
3610
|
-
let focusContrast = CONVERSATION_SCALE_FOCUS_CONTRAST_DEFAULT
|
|
3611
|
-
let scaleLengths = resolveConversationScaleLengths(focusContrast)
|
|
3612
|
-
let contentLeft
|
|
3613
|
-
let geometryDirty = true
|
|
3614
|
-
let geometrySettleFrame
|
|
3615
|
-
let geometrySettleFramesRemaining = 0
|
|
3616
|
-
let geometrySettleSignature
|
|
3617
|
-
let observedOperationWidth
|
|
3618
|
-
let observedOperationHeight
|
|
3619
|
-
let started = false
|
|
3620
|
-
let failed = false
|
|
3621
|
-
let waveCenter = 0
|
|
3622
|
-
let waveIntensity = 0
|
|
3623
|
-
let waveStartCenter = 0
|
|
3624
|
-
let waveStartIntensity = 0
|
|
3625
|
-
let waveTargetCenter = 0
|
|
3626
|
-
let waveTargetIntensity = 0
|
|
3627
|
-
let waveStartedAt = 0
|
|
3628
|
-
const requestFrame = callback => window?.requestAnimationFrame?.(callback) ?? window?.setTimeout?.(callback, 0)
|
|
3629
|
-
const cancelFrame = id => {
|
|
3630
|
-
if (id === undefined) return
|
|
3631
|
-
if (window?.cancelAnimationFrame) window.cancelAnimationFrame(id)
|
|
3632
|
-
else window?.clearTimeout?.(id)
|
|
3633
|
-
}
|
|
3634
|
-
const currentTime = timestamp => Number.isFinite(timestamp)
|
|
3635
|
-
? timestamp
|
|
3636
|
-
: window?.performance?.now?.() ?? Date.now()
|
|
3637
|
-
function currentGeometrySignature() {
|
|
3638
|
-
if (!operation || !scroller) return undefined
|
|
3639
|
-
const operationBox = operation.getBoundingClientRect?.()
|
|
3640
|
-
const scrollerBox = scroller.getBoundingClientRect?.()
|
|
3641
|
-
const composerBox = composer?.getBoundingClientRect?.()
|
|
3642
|
-
if (!operationBox || !scrollerBox) return undefined
|
|
3643
|
-
const values = [
|
|
3644
|
-
operationBox.width,
|
|
3645
|
-
operationBox.height,
|
|
3646
|
-
scrollerBox.top - operationBox.top,
|
|
3647
|
-
scrollerBox.bottom - operationBox.top,
|
|
3648
|
-
scrollerBox.left - operationBox.left,
|
|
3649
|
-
scrollerBox.right - operationBox.left,
|
|
3650
|
-
composerBox ? composerBox.top - operationBox.top : -1,
|
|
3651
|
-
composerBox ? composerBox.bottom - operationBox.top : -1,
|
|
3652
|
-
composerBox ? composerBox.left - operationBox.left : -1,
|
|
3653
|
-
composerBox ? composerBox.right - operationBox.left : -1,
|
|
3654
|
-
]
|
|
3655
|
-
if (!values.every(Number.isFinite)) return undefined
|
|
3656
|
-
return values.map(value => Number(value.toFixed(2))).join(':')
|
|
3657
|
-
}
|
|
3658
|
-
function sampleGeometryStabilization() {
|
|
3659
|
-
geometrySettleFrame = undefined
|
|
3660
|
-
if (!started || failed || geometrySettleFramesRemaining <= 0) return
|
|
3661
|
-
geometrySettleFramesRemaining -= 1
|
|
3662
|
-
const signature = currentGeometrySignature()
|
|
3663
|
-
if (signature !== undefined && signature !== geometrySettleSignature) {
|
|
3664
|
-
geometrySettleSignature = signature
|
|
3665
|
-
geometryDirty = true
|
|
3666
|
-
obstructionDirty = true
|
|
3667
|
-
schedule()
|
|
3668
|
-
}
|
|
3669
|
-
if (geometrySettleFramesRemaining > 0) {
|
|
3670
|
-
geometrySettleFrame = requestFrame(sampleGeometryStabilization)
|
|
3671
|
-
}
|
|
3672
|
-
}
|
|
3673
|
-
function requestGeometryStabilization() {
|
|
3674
|
-
if (!started || failed) return
|
|
3675
|
-
geometrySettleFramesRemaining = GEOMETRY_SETTLE_FRAME_LIMIT
|
|
3676
|
-
if (geometrySettleFrame === undefined) {
|
|
3677
|
-
geometrySettleFrame = requestFrame(sampleGeometryStabilization)
|
|
3678
|
-
}
|
|
3679
|
-
}
|
|
3680
|
-
function stopGeometryStabilization() {
|
|
3681
|
-
cancelFrame(geometrySettleFrame)
|
|
3682
|
-
geometrySettleFrame = undefined
|
|
3683
|
-
geometrySettleFramesRemaining = 0
|
|
3684
|
-
geometrySettleSignature = undefined
|
|
3685
|
-
}
|
|
3686
|
-
function onHostGeometryChange() {
|
|
3687
|
-
requestGeometryStabilization()
|
|
3688
|
-
}
|
|
3689
|
-
function reducedMotion() {
|
|
3690
|
-
return window?.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches
|
|
3691
|
-
|| document.documentElement.dataset.prtsMotion === 'reduced'
|
|
3692
|
-
}
|
|
3693
|
-
function sampleWave(timestamp = currentTime()) {
|
|
3694
|
-
if (waveFrame === undefined) return
|
|
3695
|
-
const progress = clamp((currentTime(timestamp) - waveStartedAt) / CONVERSATION_SCALE_WAVE_DURATION, 0, 1)
|
|
3696
|
-
const eased = 1 - (1 - progress) ** 3
|
|
3697
|
-
waveCenter = waveStartCenter + (waveTargetCenter - waveStartCenter) * eased
|
|
3698
|
-
waveIntensity = waveStartIntensity + (waveTargetIntensity - waveStartIntensity) * eased
|
|
3699
|
-
}
|
|
3700
|
-
function animateWave(timestamp) {
|
|
3701
|
-
waveFrame = undefined
|
|
3702
|
-
if (!started || failed) return
|
|
3703
|
-
const time = currentTime(timestamp)
|
|
3704
|
-
const progress = clamp((time - waveStartedAt) / CONVERSATION_SCALE_WAVE_DURATION, 0, 1)
|
|
3705
|
-
const eased = 1 - (1 - progress) ** 3
|
|
3706
|
-
waveCenter = waveStartCenter + (waveTargetCenter - waveStartCenter) * eased
|
|
3707
|
-
waveIntensity = waveStartIntensity + (waveTargetIntensity - waveStartIntensity) * eased
|
|
3708
|
-
schedule()
|
|
3709
|
-
if (progress < 1) waveFrame = requestFrame(animateWave)
|
|
3710
|
-
}
|
|
3711
|
-
function retargetWave(index) {
|
|
3712
|
-
const time = currentTime()
|
|
3713
|
-
sampleWave(time)
|
|
3714
|
-
cancelFrame(waveFrame)
|
|
3715
|
-
waveFrame = undefined
|
|
3716
|
-
waveStartCenter = waveCenter
|
|
3717
|
-
waveStartIntensity = waveIntensity
|
|
3718
|
-
waveTargetCenter = index >= 0 ? index : waveCenter
|
|
3719
|
-
waveTargetIntensity = index >= 0 ? 1 : 0
|
|
3720
|
-
waveStartedAt = time
|
|
3721
|
-
if (reducedMotion()) {
|
|
3722
|
-
waveCenter = waveTargetCenter
|
|
3723
|
-
waveIntensity = waveTargetIntensity
|
|
3724
|
-
schedule()
|
|
3725
|
-
return
|
|
3726
|
-
}
|
|
3727
|
-
waveFrame = requestFrame(animateWave)
|
|
3728
|
-
}
|
|
3729
|
-
function resetWave() {
|
|
3730
|
-
cancelFrame(waveFrame)
|
|
3731
|
-
waveFrame = undefined
|
|
3732
|
-
waveCenter = 0
|
|
3733
|
-
waveIntensity = 0
|
|
3734
|
-
waveStartCenter = 0
|
|
3735
|
-
waveStartIntensity = 0
|
|
3736
|
-
waveTargetCenter = 0
|
|
3737
|
-
waveTargetIntensity = 0
|
|
3738
|
-
waveStartedAt = 0
|
|
3739
|
-
}
|
|
3740
|
-
function cancelJump() {
|
|
3741
|
-
jumpRequest += 1
|
|
3742
|
-
}
|
|
3743
|
-
function historyPrefix() {
|
|
3744
|
-
return historyAvailable ? 1 : 0
|
|
3745
|
-
}
|
|
3746
|
-
function scaleItemCount() {
|
|
3747
|
-
return turns.length + historyPrefix()
|
|
3748
|
-
}
|
|
3749
|
-
function scaleToTurnIndex(index) {
|
|
3750
|
-
return index - historyPrefix()
|
|
3751
|
-
}
|
|
3752
|
-
function turnToScaleIndex(index) {
|
|
3753
|
-
return index + historyPrefix()
|
|
3754
|
-
}
|
|
3755
|
-
function syncHistoryStatus() {
|
|
3756
|
-
if (!historyStatus || !scale) return
|
|
3757
|
-
const visible = historyPhase === 'loading' || historyPhase === 'paused' || historyPhase === 'error'
|
|
3758
|
-
historyStatus.hidden = !visible
|
|
3759
|
-
historyStatus.dataset.prtsHistoryPhase = historyPhase
|
|
3760
|
-
scale.dataset.prtsHistoryPhase = historyPhase
|
|
3761
|
-
scale.toggleAttribute('data-prts-conversation-history-available', historyAvailable)
|
|
3762
|
-
if (!visible) {
|
|
3763
|
-
syncHistoryHint()
|
|
3764
|
-
return
|
|
3765
|
-
}
|
|
3766
|
-
const page = historyPhase === 'loading' ? historyPages + 1 : historyPages
|
|
3767
|
-
const fallback = historyPhase === 'loading'
|
|
3768
|
-
? `正在载入更早内容 · 第 ${page} 页`
|
|
3769
|
-
: historyPhase === 'error'
|
|
3770
|
-
? historyMessage || '更早内容载入失败'
|
|
3771
|
-
: historyPages > 0
|
|
3772
|
-
? `已载入 ${historyPages} 页 · 尚未到达开头`
|
|
3773
|
-
: '已载入部分内容 · 尚未到达开头'
|
|
3774
|
-
scale._prtsHistoryText.textContent = fallback
|
|
3775
|
-
scale._prtsHistoryAction.textContent = historyPhase === 'loading' ? '取消' : '继续'
|
|
3776
|
-
scale._prtsHistoryAction.setAttribute(
|
|
3777
|
-
'aria-label',
|
|
3778
|
-
historyPhase === 'loading' ? '取消前往会话开头' : '继续前往会话开头',
|
|
3779
|
-
)
|
|
3780
|
-
syncHistoryHint()
|
|
3781
|
-
}
|
|
3782
|
-
function syncHistoryHint() {
|
|
3783
|
-
if (!historyHint || !scale) return
|
|
3784
|
-
const railUnavailable = scaleSpaceObstructed || scaleBlockingObstructed || scaleObstructed
|
|
3785
|
-
|| scaleItemCount() < MINIMUM_TURNS
|
|
3786
|
-
const visible = historyAvailable && historyPhase === 'idle' && !railUnavailable
|
|
3787
|
-
if (!visible) historyHintHovered = false
|
|
3788
|
-
const selected = visible && (
|
|
3789
|
-
historyHintHovered
|
|
3790
|
-
|| (pointerInside && hoverIndex === 0)
|
|
3791
|
-
)
|
|
3792
|
-
historyHint.hidden = !visible
|
|
3793
|
-
historyHint.toggleAttribute('data-prts-history-selected', selected)
|
|
3794
|
-
scale.toggleAttribute('data-prts-conversation-history-selected', selected)
|
|
3795
|
-
const tooltip = scale._prtsHistoryTooltip
|
|
3796
|
-
tooltip.hidden = !selected
|
|
3797
|
-
tooltip.setAttribute('aria-hidden', String(!selected))
|
|
3798
|
-
const tooltipId = tooltip.id
|
|
3799
|
-
for (const target of [scale, scale._prtsHistoryTrigger]) {
|
|
3800
|
-
if (selected) target.setAttribute('aria-describedby', tooltipId)
|
|
3801
|
-
else if (target.getAttribute('aria-describedby') === tooltipId) target.removeAttribute('aria-describedby')
|
|
3802
|
-
}
|
|
3803
|
-
}
|
|
3804
|
-
function selectHistoryHint({ keyboard = false } = {}) {
|
|
3805
|
-
if (!historyAvailable || historyPhase !== 'idle') return
|
|
3806
|
-
keyboardActive = keyboard
|
|
3807
|
-
hoverIndex = 0
|
|
3808
|
-
cursorIndex = 0
|
|
3809
|
-
ensureVisible(0)
|
|
3810
|
-
retargetWave(0)
|
|
3811
|
-
syncAccessibility()
|
|
3812
|
-
schedule()
|
|
3813
|
-
}
|
|
3814
|
-
function setHistoryAvailable(next) {
|
|
3815
|
-
const available = Boolean(next)
|
|
3816
|
-
if (available === historyAvailable) return
|
|
3817
|
-
const previousPrefix = historyPrefix()
|
|
3818
|
-
historyAvailable = available
|
|
3819
|
-
const delta = historyPrefix() - previousPrefix
|
|
3820
|
-
if (cursorIndex >= previousPrefix) cursorIndex = Math.max(0, cursorIndex + delta)
|
|
3821
|
-
if (hoverIndex >= previousPrefix) hoverIndex = Math.max(0, hoverIndex + delta)
|
|
3822
|
-
if (!followBottom && scaleOffset > 0) scaleOffset = Math.max(0, scaleOffset + delta * CONVERSATION_SCALE_SPACING)
|
|
3823
|
-
geometryDirty = true
|
|
3824
|
-
syncHistoryStatus()
|
|
3825
|
-
}
|
|
3826
|
-
function readHistoryState() {
|
|
3827
|
-
const snapshot = resolveConversationHistorySnapshot(sessions)
|
|
3828
|
-
const olderButton = findConversationOlderButton(operation)
|
|
3829
|
-
if (snapshot.key !== undefined && snapshot.key !== historySessionKey) {
|
|
3830
|
-
historyRequest += 1
|
|
3831
|
-
historySessionKey = snapshot.key
|
|
3832
|
-
historyPages = 0
|
|
3833
|
-
historyPhase = 'idle'
|
|
3834
|
-
historyMessage = ''
|
|
3835
|
-
}
|
|
3836
|
-
const available = snapshot.hasMore || Boolean(olderButton) || historyPhase === 'loading'
|
|
3837
|
-
setHistoryAvailable(available)
|
|
3838
|
-
if (!available && historyPhase !== 'loading') {
|
|
3839
|
-
historyPhase = 'idle'
|
|
3840
|
-
historyMessage = ''
|
|
3841
|
-
syncHistoryStatus()
|
|
3842
|
-
}
|
|
3843
|
-
return { ...snapshot, olderButton }
|
|
3844
|
-
}
|
|
3845
|
-
function cancelHistory({ paused = true } = {}) {
|
|
3846
|
-
if (historyPhase !== 'loading') return
|
|
3847
|
-
historyRequest += 1
|
|
3848
|
-
historyPhase = paused && historyAvailable ? 'paused' : 'idle'
|
|
3849
|
-
historyMessage = ''
|
|
3850
|
-
syncHistoryStatus()
|
|
3851
|
-
schedule()
|
|
3852
|
-
}
|
|
3853
|
-
function cancelNavigation() {
|
|
3854
|
-
cancelJump()
|
|
3855
|
-
cancelHistory()
|
|
3856
|
-
}
|
|
3857
|
-
function onHistoryAction(event) {
|
|
3858
|
-
event.preventDefault()
|
|
3859
|
-
event.stopPropagation()
|
|
3860
|
-
if (historyPhase === 'loading') cancelHistory()
|
|
3861
|
-
else void loadHistoryToStart()
|
|
3862
|
-
}
|
|
3863
|
-
function onHistoryHintPointerEnter() {
|
|
3864
|
-
historyHintHovered = true
|
|
3865
|
-
selectHistoryHint()
|
|
3866
|
-
}
|
|
3867
|
-
function onHistoryHintPointerLeave() {
|
|
3868
|
-
historyHintHovered = false
|
|
3869
|
-
if (!pointerInside) {
|
|
3870
|
-
hoverIndex = -1
|
|
3871
|
-
retargetWave(-1)
|
|
3872
|
-
}
|
|
3873
|
-
schedule()
|
|
3874
|
-
}
|
|
3875
|
-
function schedule(scan = false) {
|
|
3876
|
-
if (scan) {
|
|
3877
|
-
scanPending = true
|
|
3878
|
-
fullScanPending = true
|
|
3879
|
-
}
|
|
3880
|
-
if (resizeActive) return
|
|
3881
|
-
if (frame !== undefined || failed) return
|
|
3882
|
-
frame = requestFrame(flush)
|
|
3883
|
-
}
|
|
3884
|
-
function clearTimers() {
|
|
3885
|
-
for (const timer of [snapTimer, touchTimer, previewDelayTimer, previewHideTimer, previewRefreshTimer, resizeSettleTimer]) {
|
|
3886
|
-
if (timer !== undefined) window?.clearTimeout?.(timer)
|
|
3887
|
-
}
|
|
3888
|
-
snapTimer = undefined
|
|
3889
|
-
touchTimer = undefined
|
|
3890
|
-
previewDelayTimer = undefined
|
|
3891
|
-
previewHideTimer = undefined
|
|
3892
|
-
previewRefreshTimer = undefined
|
|
3893
|
-
resizeSettleTimer = undefined
|
|
3894
|
-
}
|
|
3895
|
-
function setScaleResizeState(active) {
|
|
3896
|
-
resizeActive = Boolean(active)
|
|
3897
|
-
for (const node of [scale, preview, historyHint, historyStatus, composer]) {
|
|
3898
|
-
if (!node || node.hasAttribute('data-prts-resizing') === resizeActive) continue
|
|
3899
|
-
node.toggleAttribute('data-prts-resizing', resizeActive)
|
|
3900
|
-
}
|
|
3901
|
-
}
|
|
3902
|
-
function disconnectPreviewObserver() {
|
|
3903
|
-
resizeSettleTimer = undefined
|
|
3904
|
-
previewObserver?.disconnect()
|
|
3905
|
-
previewObserver = undefined
|
|
3906
|
-
previewSource = undefined
|
|
3907
|
-
}
|
|
3908
|
-
function observePreviewSource(source) {
|
|
3909
|
-
if (source === previewSource) return
|
|
3910
|
-
disconnectPreviewObserver()
|
|
3911
|
-
const MutationObserver = window?.MutationObserver
|
|
3912
|
-
if (!source || typeof MutationObserver !== 'function') return
|
|
3913
|
-
previewSource = source
|
|
3914
|
-
previewObserver = new MutationObserver(queuePreviewRefresh)
|
|
3915
|
-
previewObserver.observe(source, {
|
|
3916
|
-
subtree: true,
|
|
3917
|
-
childList: true,
|
|
3918
|
-
characterData: true,
|
|
3919
|
-
attributes: true,
|
|
3920
|
-
attributeFilter: ['hidden', 'aria-hidden'],
|
|
3921
|
-
})
|
|
3922
|
-
}
|
|
3923
|
-
function resolveRoots() {
|
|
3924
|
-
const nextOperation = document?.querySelector?.('[data-prts-region="operation"]')
|
|
3925
|
-
const nextScroller = nextOperation?.querySelector?.('[data-conversation-scroll]')
|
|
3926
|
-
if (!nextOperation || !nextScroller) {
|
|
3927
|
-
if (operation || scroller || scale || preview) disconnectRoots()
|
|
3928
|
-
return false
|
|
3929
|
-
}
|
|
3930
|
-
const nextComposer = nextScroller.querySelector('[data-composer-seat], [data-slot="conversation.composer"]')
|
|
3931
|
-
if (operation === nextOperation && scroller === nextScroller && scale?.isConnected && preview?.isConnected
|
|
3932
|
-
&& historyHint?.isConnected && historyStatus?.isConnected) {
|
|
3933
|
-
if (composer !== nextComposer) {
|
|
3934
|
-
if (composer) resizeObserver?.unobserve?.(composer)
|
|
3935
|
-
composer = nextComposer
|
|
3936
|
-
if (composer) resizeObserver?.observe(composer)
|
|
3937
|
-
geometryDirty = true
|
|
3938
|
-
}
|
|
3939
|
-
return true
|
|
3940
|
-
}
|
|
3941
|
-
disconnectRoots()
|
|
3942
|
-
operation = nextOperation
|
|
3943
|
-
scroller = nextScroller
|
|
3944
|
-
composer = nextComposer
|
|
3945
|
-
scale = createScale(document)
|
|
3946
|
-
preview = scale._prtsPreview
|
|
3947
|
-
historyHint = scale._prtsHistoryHint
|
|
3948
|
-
historyStatus = scale._prtsHistoryStatus
|
|
3949
|
-
operation.append(scale, preview, historyHint, historyStatus)
|
|
3950
|
-
scale._prtsHistoryTrigger.addEventListener('click', onHistoryAction)
|
|
3951
|
-
scale._prtsHistoryTrigger.addEventListener('pointerenter', onHistoryHintPointerEnter)
|
|
3952
|
-
scale._prtsHistoryTrigger.addEventListener('pointerleave', onHistoryHintPointerLeave)
|
|
3953
|
-
scale._prtsHistoryAction.addEventListener('click', onHistoryAction)
|
|
3954
|
-
scroller.setAttribute('data-prts-conversation-scale-ready', '')
|
|
3955
|
-
scale.addEventListener('pointermove', onPointerMove)
|
|
3956
|
-
scale.addEventListener('pointerleave', onPointerLeave)
|
|
3957
|
-
scale.addEventListener('pointerdown', onPointerDown)
|
|
3958
|
-
scale.addEventListener('pointerup', onPointerUp)
|
|
3959
|
-
scale.addEventListener('pointercancel', onPointerCancel)
|
|
3960
|
-
scale.addEventListener('click', onClick)
|
|
3961
|
-
scale.addEventListener('wheel', onWheel, { passive: false })
|
|
3962
|
-
scale.addEventListener('keydown', onKeydown)
|
|
3963
|
-
scale.addEventListener('focus', onFocus)
|
|
3964
|
-
scale.addEventListener('blur', onBlur)
|
|
3965
|
-
scroller.addEventListener('wheel', cancelNavigation, { passive: true })
|
|
3966
|
-
scroller.addEventListener('touchstart', cancelNavigation, { passive: true })
|
|
3967
|
-
scroller.addEventListener('pointerdown', cancelNavigation, { passive: true })
|
|
3968
|
-
resizeObserver?.observe(operation)
|
|
3969
|
-
resizeObserver?.observe(scroller)
|
|
3970
|
-
if (composer) resizeObserver?.observe(composer)
|
|
3971
|
-
turns = []
|
|
3972
|
-
scaleOffset = 0
|
|
3973
|
-
previousMaximum = 0
|
|
3974
|
-
followBottom = true
|
|
3975
|
-
obstructionDirty = true
|
|
3976
|
-
cursorIndex = 0
|
|
3977
|
-
hoverIndex = -1
|
|
3978
|
-
previewIndex = -1
|
|
3979
|
-
pendingPreviewIndex = -1
|
|
3980
|
-
contentLeft = undefined
|
|
3981
|
-
geometryDirty = true
|
|
3982
|
-
scaleSpaceObstructed = true
|
|
3983
|
-
overlayScanPending = true
|
|
3984
|
-
historyRequest += 1
|
|
3985
|
-
historyAvailable = false
|
|
3986
|
-
historyPhase = 'idle'
|
|
3987
|
-
historyPages = 0
|
|
3988
|
-
historyMessage = ''
|
|
3989
|
-
historySessionKey = undefined
|
|
3990
|
-
historyHintHovered = false
|
|
3991
|
-
setScaleResizeState(resizeActive)
|
|
3992
|
-
cancelJump()
|
|
3993
|
-
resetWave()
|
|
3994
|
-
requestGeometryStabilization()
|
|
3995
|
-
return true
|
|
3996
|
-
}
|
|
3997
|
-
function disconnectRoots() {
|
|
3998
|
-
stopGeometryStabilization()
|
|
3999
|
-
clearTimers()
|
|
4000
|
-
hidePreview()
|
|
4001
|
-
disconnectPreviewObserver()
|
|
4002
|
-
if (scroller) {
|
|
4003
|
-
scroller.removeAttribute('data-prts-conversation-scale-ready')
|
|
4004
|
-
scroller.removeAttribute('data-prts-conversation-scale-empty')
|
|
4005
|
-
scroller.removeEventListener('wheel', cancelNavigation)
|
|
4006
|
-
scroller.removeEventListener('touchstart', cancelNavigation)
|
|
4007
|
-
scroller.removeEventListener('pointerdown', cancelNavigation)
|
|
4008
|
-
}
|
|
4009
|
-
if (scale) {
|
|
4010
|
-
scale.removeEventListener('pointermove', onPointerMove)
|
|
4011
|
-
scale.removeEventListener('pointerleave', onPointerLeave)
|
|
4012
|
-
scale.removeEventListener('pointerdown', onPointerDown)
|
|
4013
|
-
scale.removeEventListener('pointerup', onPointerUp)
|
|
4014
|
-
scale.removeEventListener('pointercancel', onPointerCancel)
|
|
4015
|
-
scale.removeEventListener('click', onClick)
|
|
4016
|
-
scale.removeEventListener('wheel', onWheel)
|
|
4017
|
-
scale.removeEventListener('keydown', onKeydown)
|
|
4018
|
-
scale.removeEventListener('focus', onFocus)
|
|
4019
|
-
scale.removeEventListener('blur', onBlur)
|
|
4020
|
-
scale._prtsHistoryTrigger?.removeEventListener('click', onHistoryAction)
|
|
4021
|
-
scale._prtsHistoryTrigger?.removeEventListener('pointerenter', onHistoryHintPointerEnter)
|
|
4022
|
-
scale._prtsHistoryTrigger?.removeEventListener('pointerleave', onHistoryHintPointerLeave)
|
|
4023
|
-
scale._prtsHistoryAction?.removeEventListener('click', onHistoryAction)
|
|
4024
|
-
scale.remove()
|
|
4025
|
-
}
|
|
4026
|
-
preview?.remove()
|
|
4027
|
-
historyHint?.remove()
|
|
4028
|
-
historyStatus?.remove()
|
|
4029
|
-
resizeObserver?.disconnect()
|
|
4030
|
-
historyRequest += 1
|
|
4031
|
-
operation = undefined
|
|
4032
|
-
scroller = undefined
|
|
4033
|
-
composer = undefined
|
|
4034
|
-
scale = undefined
|
|
4035
|
-
preview = undefined
|
|
4036
|
-
historyHint = undefined
|
|
4037
|
-
historyStatus = undefined
|
|
4038
|
-
turns = []
|
|
4039
|
-
layout = undefined
|
|
4040
|
-
geometry = undefined
|
|
4041
|
-
hoverIndex = -1
|
|
4042
|
-
previewIndex = -1
|
|
4043
|
-
keyboardActive = false
|
|
4044
|
-
pointerInside = false
|
|
4045
|
-
pointerStart = undefined
|
|
4046
|
-
historyHintHovered = false
|
|
4047
|
-
resizeActive = false
|
|
4048
|
-
cancelJump()
|
|
4049
|
-
resetWave()
|
|
4050
|
-
overlayCandidates.clear()
|
|
4051
|
-
obstructionDirty = true
|
|
4052
|
-
overlayScanPending = false
|
|
4053
|
-
scaleObstructed = false
|
|
4054
|
-
scaleBlockingObstructed = false
|
|
4055
|
-
scaleSpaceObstructed = true
|
|
4056
|
-
contentLeft = undefined
|
|
4057
|
-
observedOperationWidth = undefined
|
|
4058
|
-
observedOperationHeight = undefined
|
|
4059
|
-
geometryDirty = true
|
|
4060
|
-
pendingMutations = []
|
|
4061
|
-
fullScanPending = false
|
|
4062
|
-
}
|
|
4063
|
-
function isTopLevelTurn(node) {
|
|
4064
|
-
if (!node?.matches?.(CONVERSATION_USER_TURN_SELECTOR) || !scroller?.contains(node) || !visible(node)) return false
|
|
4065
|
-
if (node.closest('[data-prts-conversation-scale], [data-prts-conversation-preview]')) return false
|
|
4066
|
-
const parent = node.parentElement?.closest?.(CONVERSATION_USER_TURN_SELECTOR)
|
|
4067
|
-
return !parent || !scroller.contains(parent)
|
|
4068
|
-
}
|
|
4069
|
-
function collectTurnsFromNode(node, target) {
|
|
4070
|
-
if (node?.nodeType !== 1) return
|
|
4071
|
-
if (node.matches?.(CONVERSATION_USER_TURN_SELECTOR)) target.add(node)
|
|
4072
|
-
for (const turn of node.querySelectorAll?.(CONVERSATION_USER_TURN_SELECTOR) ?? []) target.add(turn)
|
|
4073
|
-
}
|
|
4074
|
-
function collectOverlayCandidates(node) {
|
|
4075
|
-
if (node?.nodeType !== 1) return
|
|
4076
|
-
if (node.matches?.(CONVERSATION_OVERLAY_SELECTOR)) overlayCandidates.add(node)
|
|
4077
|
-
for (const candidate of node.querySelectorAll?.(CONVERSATION_OVERLAY_SELECTOR) ?? []) {
|
|
4078
|
-
overlayCandidates.add(candidate)
|
|
4079
|
-
}
|
|
4080
|
-
}
|
|
4081
|
-
function mutationNodeAffectsScale(node) {
|
|
4082
|
-
if (node?.nodeType !== 1) return false
|
|
4083
|
-
if (node.matches?.(CONVERSATION_OVERLAY_SELECTOR)
|
|
4084
|
-
|| node.matches?.(CONVERSATION_PORTAL_ROOT_SELECTOR)
|
|
4085
|
-
|| node.matches?.('[data-prts-region="operation"], [data-slot="conversation"]')) return true
|
|
4086
|
-
return Boolean(node.querySelector?.([
|
|
4087
|
-
CONVERSATION_OVERLAY_SELECTOR,
|
|
4088
|
-
CONVERSATION_PORTAL_ROOT_SELECTOR,
|
|
4089
|
-
'[data-prts-region="operation"]',
|
|
4090
|
-
'[data-slot="conversation"]',
|
|
4091
|
-
].join(', ')))
|
|
4092
|
-
}
|
|
4093
|
-
function mutationAffectsTurns(mutation) {
|
|
4094
|
-
if (mutation.type === 'attributes') {
|
|
4095
|
-
if (mutation.attributeName === 'data-chat-flow-kind'
|
|
4096
|
-
|| mutation.attributeName === 'data-message-role') return true
|
|
4097
|
-
if (mutation.target?.matches?.(CONVERSATION_USER_TURN_SELECTOR)
|
|
4098
|
-
|| mutation.target?.querySelector?.(CONVERSATION_USER_TURN_SELECTOR)) return true
|
|
4099
|
-
}
|
|
4100
|
-
for (const node of [...(mutation.addedNodes ?? []), ...(mutation.removedNodes ?? [])]) {
|
|
4101
|
-
if (node?.nodeType !== 1) continue
|
|
4102
|
-
if (node.matches?.(CONVERSATION_USER_TURN_SELECTOR)
|
|
4103
|
-
|| node.querySelector?.(CONVERSATION_USER_TURN_SELECTOR)) return true
|
|
4104
|
-
}
|
|
4105
|
-
return false
|
|
4106
|
-
}
|
|
4107
|
-
function mutationAffectsOverlay(mutation) {
|
|
4108
|
-
if (overlayCandidates.has(mutation.target)) return true
|
|
4109
|
-
if (mutationNodeAffectsScale(mutation.target)) return true
|
|
4110
|
-
for (const node of mutation.addedNodes ?? []) if (mutationNodeAffectsScale(node)) return true
|
|
4111
|
-
for (const node of mutation.removedNodes ?? []) {
|
|
4112
|
-
if (mutationNodeAffectsScale(node)) return true
|
|
4113
|
-
if ([...overlayCandidates].some(candidate => candidate === node || node?.contains?.(candidate))) return true
|
|
4114
|
-
}
|
|
4115
|
-
return false
|
|
4116
|
-
}
|
|
4117
|
-
function collectExternalOverlayCandidates() {
|
|
4118
|
-
for (const child of document?.body?.children ?? []) {
|
|
4119
|
-
if (child === operation || child.contains?.(operation)) continue
|
|
4120
|
-
collectOverlayCandidates(child)
|
|
4121
|
-
}
|
|
4122
|
-
}
|
|
4123
|
-
function updateOverlayCandidates(mutations, full = false) {
|
|
4124
|
-
if (full || overlayScanPending) {
|
|
4125
|
-
overlayCandidates.clear()
|
|
4126
|
-
collectOverlayCandidates(operation)
|
|
4127
|
-
collectExternalOverlayCandidates()
|
|
4128
|
-
overlayScanPending = false
|
|
4129
|
-
} else {
|
|
4130
|
-
for (const mutation of mutations) {
|
|
4131
|
-
if (mutation.type === 'attributes') {
|
|
4132
|
-
if (mutation.target?.matches?.(CONVERSATION_OVERLAY_SELECTOR)) overlayCandidates.add(mutation.target)
|
|
4133
|
-
else overlayCandidates.delete(mutation.target)
|
|
4134
|
-
}
|
|
4135
|
-
for (const node of mutation.addedNodes ?? []) collectOverlayCandidates(node)
|
|
4136
|
-
}
|
|
4137
|
-
}
|
|
4138
|
-
for (const candidate of [...overlayCandidates]) {
|
|
4139
|
-
if (!candidate.isConnected) overlayCandidates.delete(candidate)
|
|
4140
|
-
}
|
|
4141
|
-
}
|
|
4142
|
-
function applyTurns(nextTurns) {
|
|
4143
|
-
const wasAtBottom = shouldFollowConversationScaleBottom(scaleOffset, previousMaximum)
|
|
4144
|
-
const previousList = turns
|
|
4145
|
-
const previousTurns = new Set(previousList)
|
|
4146
|
-
const previousCount = turns.length
|
|
4147
|
-
const previousPrefix = historyPrefix()
|
|
4148
|
-
const turnAtScaleIndex = index => previousList[index - previousPrefix]
|
|
4149
|
-
const cursorTurn = turnAtScaleIndex(cursorIndex)
|
|
4150
|
-
const hoverTurn = turnAtScaleIndex(hoverIndex)
|
|
4151
|
-
const cursorWasHistory = historyAvailable && cursorIndex === 0
|
|
4152
|
-
const hoverWasHistory = historyAvailable && hoverIndex === 0
|
|
4153
|
-
const previewTurn = previousList[previewIndex]
|
|
4154
|
-
const pendingPreviewTurn = previousList[pendingPreviewIndex]
|
|
4155
|
-
const previewWasVisible = previewIndex >= 0
|
|
4156
|
-
const anchorScaleIndex = layout
|
|
4157
|
-
? nearestVisibleConversationTick(layout, .5)
|
|
4158
|
-
: -1
|
|
4159
|
-
const anchorTurn = turnAtScaleIndex(anchorScaleIndex)
|
|
4160
|
-
const anchorY = layout && anchorScaleIndex >= 0
|
|
4161
|
-
? layout.start + anchorScaleIndex * CONVERSATION_SCALE_SPACING - scaleOffset
|
|
4162
|
-
: undefined
|
|
4163
|
-
const replaced = previousCount > 0 && nextTurns.length > 0 && !nextTurns.some(turn => previousTurns.has(turn))
|
|
4164
|
-
turns = nextTurns
|
|
4165
|
-
if (replaced || turns.length !== previousCount) geometryDirty = true
|
|
4166
|
-
if (replaced || turns.length > previousCount) cancelJump()
|
|
4167
|
-
followBottom = replaced || previousCount === 0 || (turns.length > previousCount && wasAtBottom)
|
|
4168
|
-
const nextScaleIndex = node => {
|
|
4169
|
-
const index = node ? turns.indexOf(node) : -1
|
|
4170
|
-
return index < 0 ? -1 : turnToScaleIndex(index)
|
|
4171
|
-
}
|
|
4172
|
-
cursorIndex = cursorWasHistory ? 0 : nextScaleIndex(cursorTurn)
|
|
4173
|
-
if (cursorIndex < 0) cursorIndex = Math.max(0, scaleItemCount() - 1)
|
|
4174
|
-
hoverIndex = hoverWasHistory ? 0 : nextScaleIndex(hoverTurn)
|
|
4175
|
-
previewIndex = previewTurn ? turns.indexOf(previewTurn) : -1
|
|
4176
|
-
pendingPreviewIndex = pendingPreviewTurn ? turns.indexOf(pendingPreviewTurn) : -1
|
|
4177
|
-
if (previewWasVisible && previewIndex < 0) hidePreview()
|
|
4178
|
-
if (!followBottom && anchorTurn && Number.isFinite(anchorY)) {
|
|
4179
|
-
const nextAnchor = nextScaleIndex(anchorTurn)
|
|
4180
|
-
if (nextAnchor >= 0) {
|
|
4181
|
-
scaleOffset = Math.max(0, nextAnchor * CONVERSATION_SCALE_SPACING + (layout?.start ?? .5) - anchorY)
|
|
4182
|
-
}
|
|
4183
|
-
}
|
|
4184
|
-
if ((previousCount === 0 || replaced) && turns.length) cursorIndex = scaleItemCount() - 1
|
|
4185
|
-
const empty = scaleItemCount() < MINIMUM_TURNS
|
|
4186
|
-
scale.dataset.prtsScaleCount = String(turns.length)
|
|
4187
|
-
scale.toggleAttribute('data-prts-conversation-scale-partial', historyAvailable)
|
|
4188
|
-
scale.toggleAttribute('data-prts-conversation-scale-empty', empty)
|
|
4189
|
-
scroller.toggleAttribute('data-prts-conversation-scale-empty', empty)
|
|
4190
|
-
syncAccessibility()
|
|
4191
|
-
}
|
|
4192
|
-
function syncTurns(mutations = [], full = false) {
|
|
4193
|
-
updateOverlayCandidates(mutations, full)
|
|
4194
|
-
const conversationMutations = mutations.filter(mutation => operation?.contains?.(mutation.target))
|
|
4195
|
-
if (full || !turns.length) {
|
|
4196
|
-
applyTurns(collectConversationTurns(scroller))
|
|
4197
|
-
return
|
|
4198
|
-
}
|
|
4199
|
-
const next = new Set(turns.filter(turn => turn.isConnected && scroller.contains(turn)))
|
|
4200
|
-
const touched = new Set()
|
|
4201
|
-
for (const mutation of conversationMutations) {
|
|
4202
|
-
if (mutation.type === 'attributes') {
|
|
4203
|
-
collectTurnsFromNode(mutation.target, touched)
|
|
4204
|
-
const closest = mutation.target?.closest?.(CONVERSATION_USER_TURN_SELECTOR)
|
|
4205
|
-
if (closest) touched.add(closest)
|
|
4206
|
-
}
|
|
4207
|
-
for (const node of mutation.addedNodes ?? []) collectTurnsFromNode(node, touched)
|
|
4208
|
-
for (const node of mutation.removedNodes ?? []) {
|
|
4209
|
-
if (node?.nodeType !== 1) continue
|
|
4210
|
-
for (const turn of next) {
|
|
4211
|
-
if (turn === node || node.contains?.(turn)) next.delete(turn)
|
|
4212
|
-
}
|
|
4213
|
-
}
|
|
4214
|
-
}
|
|
4215
|
-
for (const turn of touched) {
|
|
4216
|
-
if (isTopLevelTurn(turn)) next.add(turn)
|
|
4217
|
-
else next.delete(turn)
|
|
4218
|
-
}
|
|
4219
|
-
const ordered = [...next].filter(isTopLevelTurn).sort((left, right) => {
|
|
4220
|
-
if (left === right) return 0
|
|
4221
|
-
return follows(left, right) ? -1 : 1
|
|
4222
|
-
})
|
|
4223
|
-
applyTurns(ordered)
|
|
4224
|
-
}
|
|
4225
|
-
function representativeContentLeft(operationBox) {
|
|
4226
|
-
if (!geometryDirty) return contentLeft
|
|
4227
|
-
const assistant = scroller.querySelector?.([
|
|
4228
|
-
'[data-prts-ai-surface]:not([hidden])',
|
|
4229
|
-
'[data-chat-flow-kind="assistant-step"]:not([hidden])',
|
|
4230
|
-
'[data-message-role="assistant"]:not([hidden])',
|
|
4231
|
-
].join(', '))
|
|
4232
|
-
const representatives = [assistant, turns[0], turns.at(-1)].filter(Boolean)
|
|
4233
|
-
const positions = []
|
|
4234
|
-
for (const node of representatives) {
|
|
4235
|
-
if (!visible(node)) continue
|
|
4236
|
-
const style = window?.getComputedStyle?.(node)
|
|
4237
|
-
if (style?.display === 'none' || style?.visibility === 'hidden') continue
|
|
4238
|
-
const box = node.getBoundingClientRect?.()
|
|
4239
|
-
if (!box || box.width <= 0 || box.height <= 0) continue
|
|
4240
|
-
positions.push(box.left - operationBox.left)
|
|
4241
|
-
}
|
|
4242
|
-
contentLeft = positions.length ? Math.min(...positions) : undefined
|
|
4243
|
-
geometryDirty = false
|
|
4244
|
-
return contentLeft
|
|
4245
|
-
}
|
|
4246
|
-
function visibleGeometry() {
|
|
4247
|
-
const operationBox = operation.getBoundingClientRect()
|
|
4248
|
-
const scrollerBox = scroller.getBoundingClientRect()
|
|
4249
|
-
const composerBox = composer?.getBoundingClientRect?.()
|
|
4250
|
-
const top = clamp(scrollerBox.top - operationBox.top + 12, 8, Math.max(8, operationBox.height - 92))
|
|
4251
|
-
const bottomEdge = composerBox && composerBox.height > 0 && composerBox.top < operationBox.bottom
|
|
4252
|
-
? composerBox.top - operationBox.top - 12
|
|
4253
|
-
: Math.min(scrollerBox.bottom, operationBox.bottom) - operationBox.top - 18
|
|
4254
|
-
const height = Math.max(84, bottomEdge - top)
|
|
4255
|
-
const drawerMode = document.documentElement.dataset.prtsDrawerMode
|
|
4256
|
-
const scaleGeometry = drawerMode === 'overlay'
|
|
4257
|
-
? { visible: false, reason: 'drawer' }
|
|
4258
|
-
: window.innerWidth <= 640
|
|
4259
|
-
? { visible: false, reason: 'phone' }
|
|
4260
|
-
: resolveConversationScaleGeometry({
|
|
4261
|
-
operationWidth: operationBox.width,
|
|
4262
|
-
contentLeft: representativeContentLeft(operationBox),
|
|
4263
|
-
maximumDistance,
|
|
4264
|
-
previouslyHidden: scaleSpaceObstructed,
|
|
4265
|
-
})
|
|
4266
|
-
const left = Number.isFinite(scaleGeometry.left)
|
|
4267
|
-
? scaleGeometry.left
|
|
4268
|
-
: CONVERSATION_SCALE_CONTENT_GAP
|
|
4269
|
-
return { operationBox, scrollerBox, composerBox, top, height, left, scaleGeometry }
|
|
4270
|
-
}
|
|
4271
|
-
function boxesIntersect(left, right) {
|
|
4272
|
-
return left.right > right.left
|
|
4273
|
-
&& left.left < right.right
|
|
4274
|
-
&& left.bottom > right.top
|
|
4275
|
-
&& left.top < right.bottom
|
|
4276
|
-
}
|
|
4277
|
-
function overlayIntersects(candidate, targets) {
|
|
4278
|
-
if (!candidate?.isConnected || candidate.hidden || candidate.getAttribute('aria-hidden') === 'true') return false
|
|
4279
|
-
if (candidate.closest?.('[data-prts-owned-conversation-scale], [data-prts-owned-conversation-preview]')) return false
|
|
4280
|
-
const style = window?.getComputedStyle?.(candidate)
|
|
4281
|
-
if (style?.display === 'none' || style?.visibility === 'hidden' || style?.opacity === '0') return false
|
|
4282
|
-
const box = candidate.getBoundingClientRect?.()
|
|
4283
|
-
if (!box || box.width <= 0 || box.height <= 0) return false
|
|
4284
|
-
return targets.some(target => target?.width > 0 && target?.height > 0 && boxesIntersect(box, target))
|
|
4285
|
-
}
|
|
4286
|
-
function blockingOverlay(candidate) {
|
|
4287
|
-
if (candidate?.matches?.(CONVERSATION_BLOCKING_OVERLAY_SELECTOR)) return true
|
|
4288
|
-
const plugin = candidate?.matches?.('[data-plugin]') ? candidate : candidate?.closest?.('[data-plugin]')
|
|
4289
|
-
return Boolean(plugin
|
|
4290
|
-
&& plugin.getAttribute('data-plugin') !== 'dsh-theme-prts'
|
|
4291
|
-
&& plugin.closest?.('[data-shell-overlay], [data-slot="shell.overlay"]'))
|
|
4292
|
-
}
|
|
4293
|
-
function syncScaleInteractiveState() {
|
|
4294
|
-
if (!scale) return true
|
|
4295
|
-
const hidden = scaleSpaceObstructed || scaleBlockingObstructed || scaleObstructed || scaleItemCount() < MINIMUM_TURNS
|
|
4296
|
-
const wasHidden = scale.tabIndex === -1
|
|
4297
|
-
if (hidden && !wasHidden) {
|
|
4298
|
-
hidePreview()
|
|
4299
|
-
pointerInside = false
|
|
4300
|
-
hoverIndex = -1
|
|
4301
|
-
keyboardActive = false
|
|
4302
|
-
retargetWave(-1)
|
|
4303
|
-
scale.tabIndex = -1
|
|
4304
|
-
scale.setAttribute('aria-hidden', 'true')
|
|
4305
|
-
if (document.activeElement === scale) scale.blur?.()
|
|
4306
|
-
} else if (!hidden && wasHidden) {
|
|
4307
|
-
scale.tabIndex = 0
|
|
4308
|
-
scale.removeAttribute('aria-hidden')
|
|
4309
|
-
}
|
|
4310
|
-
syncHistoryHint()
|
|
4311
|
-
return hidden
|
|
4312
|
-
}
|
|
4313
|
-
function syncScaleSpaceObstruction(resolution) {
|
|
4314
|
-
const obstructed = !resolution.visible
|
|
4315
|
-
scaleSpaceObstructed = obstructed
|
|
4316
|
-
scale.toggleAttribute('data-prts-conversation-scale-space-obstructed', obstructed)
|
|
4317
|
-
if (obstructed) scale.dataset.prtsScaleHiddenReason = resolution.reason || 'space'
|
|
4318
|
-
else delete scale.dataset.prtsScaleHiddenReason
|
|
4319
|
-
scale.toggleAttribute('data-prts-conversation-scale-centered', Boolean(resolution.centered))
|
|
4320
|
-
syncScaleInteractiveState()
|
|
4321
|
-
return scaleSpaceObstructed || scaleItemCount() < MINIMUM_TURNS
|
|
4322
|
-
}
|
|
4323
|
-
function syncScaleObstruction(currentGeometry) {
|
|
4324
|
-
if (!scale) return false
|
|
4325
|
-
obstructionDirty = false
|
|
4326
|
-
if (scaleSpaceObstructed) {
|
|
4327
|
-
scaleBlockingObstructed = false
|
|
4328
|
-
scaleObstructed = false
|
|
4329
|
-
scale.removeAttribute('data-prts-conversation-scale-blocked')
|
|
4330
|
-
scale.removeAttribute('data-prts-conversation-scale-obstructed')
|
|
4331
|
-
syncScaleInteractiveState()
|
|
4332
|
-
return false
|
|
4333
|
-
}
|
|
4334
|
-
const candidates = [...overlayCandidates]
|
|
4335
|
-
const operationBox = currentGeometry?.operationBox
|
|
4336
|
-
const blocked = Boolean(operationBox?.width && operationBox?.height)
|
|
4337
|
-
&& candidates.some(candidate => blockingOverlay(candidate) && overlayIntersects(candidate, [operationBox]))
|
|
4338
|
-
const scaleBox = scale.getBoundingClientRect?.()
|
|
4339
|
-
const previewBox = preview?.hasAttribute?.('data-prts-conversation-preview-visible')
|
|
4340
|
-
? preview.getBoundingClientRect?.()
|
|
4341
|
-
: undefined
|
|
4342
|
-
const historyHintBox = historyHint && !historyHint.hidden
|
|
4343
|
-
? historyHint.getBoundingClientRect?.()
|
|
4344
|
-
: undefined
|
|
4345
|
-
const historyTooltipBox = scale._prtsHistoryTooltip && !scale._prtsHistoryTooltip.hidden
|
|
4346
|
-
? scale._prtsHistoryTooltip.getBoundingClientRect?.()
|
|
4347
|
-
: undefined
|
|
4348
|
-
const historyStatusBox = historyStatus && !historyStatus.hidden
|
|
4349
|
-
? historyStatus.getBoundingClientRect?.()
|
|
4350
|
-
: undefined
|
|
4351
|
-
const localTargets = [scaleBox, previewBox, historyHintBox, historyTooltipBox, historyStatusBox].filter(Boolean)
|
|
4352
|
-
const obstructed = !blocked
|
|
4353
|
-
&& localTargets.length > 0
|
|
4354
|
-
&& candidates.some(candidate => !blockingOverlay(candidate) && overlayIntersects(candidate, localTargets))
|
|
4355
|
-
scaleBlockingObstructed = blocked
|
|
4356
|
-
scaleObstructed = obstructed
|
|
4357
|
-
scale.toggleAttribute('data-prts-conversation-scale-blocked', blocked)
|
|
4358
|
-
scale.toggleAttribute('data-prts-conversation-scale-obstructed', obstructed)
|
|
4359
|
-
syncScaleInteractiveState()
|
|
4360
|
-
return blocked || obstructed
|
|
4361
|
-
}
|
|
4362
|
-
function positionPreview(index) {
|
|
4363
|
-
if (!preview || !layout || !geometry || index < 0 || index >= layout.count) return
|
|
4364
|
-
const scaleIndex = turnToScaleIndex(index)
|
|
4365
|
-
const tickY = clamp(layout.positions[scaleIndex], .5, layout.height - .5)
|
|
4366
|
-
const anchor = geometry.top + tickY
|
|
4367
|
-
const previewBox = preview.getBoundingClientRect?.()
|
|
4368
|
-
const measuredHeight = previewBox?.height || preview.offsetHeight || PREVIEW_FALLBACK_HEIGHT
|
|
4369
|
-
const maximumTop = Math.max(geometry.top, geometry.top + geometry.height - measuredHeight)
|
|
4370
|
-
const top = clamp(anchor - measuredHeight / 2, geometry.top, maximumTop)
|
|
4371
|
-
const left = geometry.left + SCALE_WIDTH + PREVIEW_GAP
|
|
4372
|
-
preview.style.left = `${Number(left.toFixed(2))}px`
|
|
4373
|
-
preview.style.top = `${Number(top.toFixed(2))}px`
|
|
4374
|
-
preview.style.setProperty('--prts-preview-anchor-y', `${Number(clamp(anchor - top, 1, measuredHeight - 1).toFixed(2))}px`)
|
|
4375
|
-
}
|
|
4376
|
-
function render() {
|
|
4377
|
-
if (!operation || !scroller || !scale) return
|
|
4378
|
-
geometry = visibleGeometry()
|
|
4379
|
-
scale.style.top = `${Number(geometry.top.toFixed(2))}px`
|
|
4380
|
-
scale.style.left = `${Number(geometry.left.toFixed(2))}px`
|
|
4381
|
-
scale.style.height = `${Number(geometry.height.toFixed(2))}px`
|
|
4382
|
-
historyStatus.style.top = `${Number(geometry.top.toFixed(2))}px`
|
|
4383
|
-
historyStatus.style.left = `${Number((geometry.left + SCALE_WIDTH + PREVIEW_GAP).toFixed(2))}px`
|
|
4384
|
-
scale.dataset.prtsScaleMaxDistance = String(maximumDistance)
|
|
4385
|
-
scale.dataset.prtsScaleFocusContrast = String(focusContrast)
|
|
4386
|
-
syncHistoryStatus()
|
|
4387
|
-
if (syncScaleSpaceObstruction(geometry.scaleGeometry)) return
|
|
4388
|
-
if (obstructionDirty) {
|
|
4389
|
-
if (syncScaleObstruction(geometry)) return
|
|
4390
|
-
} else if (scaleBlockingObstructed || scaleObstructed) {
|
|
4391
|
-
return
|
|
4392
|
-
}
|
|
4393
|
-
const provisional = getConversationScaleLayout(scaleItemCount(), geometry.height, scaleOffset)
|
|
4394
|
-
if (followBottom) scaleOffset = provisional.maxOffset
|
|
4395
|
-
layout = getConversationScaleLayout(scaleItemCount(), geometry.height, scaleOffset)
|
|
4396
|
-
scaleOffset = layout.offset
|
|
4397
|
-
previousMaximum = layout.maxOffset
|
|
4398
|
-
followBottom = false
|
|
4399
|
-
const historyY = layout.positions[0] ?? .5
|
|
4400
|
-
historyHint.style.top = `${Number((geometry.top + historyY).toFixed(2))}px`
|
|
4401
|
-
historyHint.style.left = `${Number(geometry.left.toFixed(2))}px`
|
|
4402
|
-
syncHistoryHint()
|
|
4403
|
-
const historyAnchor = geometry.top + historyY
|
|
4404
|
-
const historyTooltipTop = clamp(
|
|
4405
|
-
historyAnchor - PREVIEW_FALLBACK_HEIGHT / 2,
|
|
4406
|
-
geometry.top,
|
|
4407
|
-
Math.max(geometry.top, geometry.top + geometry.height - PREVIEW_FALLBACK_HEIGHT),
|
|
4408
|
-
)
|
|
4409
|
-
const historyTooltip = scale._prtsHistoryTooltip
|
|
4410
|
-
historyTooltip.style.setProperty('--prts-history-tooltip-top', `${Number((historyTooltipTop - historyAnchor + HISTORY_TRIGGER_HEIGHT / 2).toFixed(2))}px`)
|
|
4411
|
-
historyTooltip.style.setProperty('--prts-history-tooltip-anchor-y', `${Number(clamp(historyAnchor - historyTooltipTop, 1, PREVIEW_FALLBACK_HEIGHT - 1).toFixed(2))}px`)
|
|
4412
|
-
const interactionIndex = hoverIndex >= 0
|
|
4413
|
-
? hoverIndex
|
|
4414
|
-
: keyboardActive && scale.matches(':focus') ? cursorIndex : -1
|
|
4415
|
-
const paths = buildConversationScalePaths(layout, interactionIndex, {
|
|
4416
|
-
center: waveCenter,
|
|
4417
|
-
intensity: waveIntensity,
|
|
4418
|
-
historyAvailable,
|
|
4419
|
-
}, scaleLengths)
|
|
4420
|
-
scale._prtsSvg.setAttribute('viewBox', `0 0 ${SCALE_WIDTH} ${layout.height}`)
|
|
4421
|
-
scale._prtsGray.setAttribute('d', paths.gray)
|
|
4422
|
-
scale._prtsAccent.setAttribute('d', paths.yellow)
|
|
4423
|
-
scale._prtsHistory.setAttribute('d', paths.history)
|
|
4424
|
-
scale._prtsHit.setAttribute('height', String(layout.height))
|
|
4425
|
-
scale._prtsMask.setAttribute('height', String(layout.height))
|
|
4426
|
-
scale._prtsMaskRect.setAttribute('height', String(layout.height))
|
|
4427
|
-
if (scaleOffset > 0) {
|
|
4428
|
-
scale._prtsMarks.setAttribute('mask', `url(#${scale._prtsMaskId})`)
|
|
4429
|
-
scale.setAttribute('data-prts-conversation-scale-top-fade', '')
|
|
4430
|
-
} else {
|
|
4431
|
-
scale._prtsMarks.removeAttribute('mask')
|
|
4432
|
-
scale.removeAttribute('data-prts-conversation-scale-top-fade')
|
|
4433
|
-
}
|
|
4434
|
-
scale.dataset.prtsScaleCount = String(turns.length)
|
|
4435
|
-
scale.toggleAttribute('data-prts-conversation-scale-partial', historyAvailable)
|
|
4436
|
-
scale.dataset.prtsScaleOffset = String(Number(scaleOffset.toFixed(2)))
|
|
4437
|
-
scale.dataset.prtsScaleMaximum = String(Number(layout.maxOffset.toFixed(2)))
|
|
4438
|
-
if (interactionIndex >= 0) scale.dataset.prtsScaleWave = String(interactionIndex + 1)
|
|
4439
|
-
else delete scale.dataset.prtsScaleWave
|
|
4440
|
-
if (previewIndex >= 0) positionPreview(previewIndex)
|
|
4441
|
-
syncAccessibility()
|
|
4442
|
-
}
|
|
4443
|
-
function syncAccessibility() {
|
|
4444
|
-
if (!scale) return
|
|
4445
|
-
const maximum = Math.max(1, scaleItemCount())
|
|
4446
|
-
const current = clamp(cursorIndex + 1, 1, maximum)
|
|
4447
|
-
scale.setAttribute('aria-valuemin', '1')
|
|
4448
|
-
scale.setAttribute('aria-valuemax', String(maximum))
|
|
4449
|
-
scale.setAttribute('aria-valuenow', String(current))
|
|
4450
|
-
scale.setAttribute(
|
|
4451
|
-
'aria-valuetext',
|
|
4452
|
-
historyAvailable && cursorIndex === 0
|
|
4453
|
-
? '更早内容尚未载入,按回车前往会话开头'
|
|
4454
|
-
: turns.length
|
|
4455
|
-
? `当前已载入第 ${scaleToTurnIndex(cursorIndex) + 1} 轮,共 ${turns.length} 轮${historyAvailable ? ',前方仍有更早内容' : ''}`
|
|
4456
|
-
: '无可用会话刻度',
|
|
4457
|
-
)
|
|
4458
|
-
}
|
|
4459
|
-
function flush() {
|
|
4460
|
-
frame = undefined
|
|
4461
|
-
if (!started || failed) return
|
|
4462
|
-
try {
|
|
4463
|
-
if (!resolveRoots()) return
|
|
4464
|
-
readHistoryState()
|
|
4465
|
-
if (scanPending) {
|
|
4466
|
-
scanPending = false
|
|
4467
|
-
const mutations = pendingMutations
|
|
4468
|
-
const full = fullScanPending
|
|
4469
|
-
pendingMutations = []
|
|
4470
|
-
fullScanPending = false
|
|
4471
|
-
syncTurns(mutations, full)
|
|
4472
|
-
}
|
|
4473
|
-
render()
|
|
4474
|
-
} catch {
|
|
4475
|
-
failed = true
|
|
4476
|
-
disconnectRoots()
|
|
4477
|
-
}
|
|
4478
|
-
}
|
|
4479
|
-
function localIndex(event) {
|
|
4480
|
-
if (!layout || scaleItemCount() < MINIMUM_TURNS) return -1
|
|
4481
|
-
const box = scale.getBoundingClientRect()
|
|
4482
|
-
return nearestVisibleConversationTick(layout, event.clientY - box.top)
|
|
4483
|
-
}
|
|
4484
|
-
function ensureVisible(index) {
|
|
4485
|
-
if (!layout || index < 0) return
|
|
4486
|
-
const target = layout.start + index * CONVERSATION_SCALE_SPACING - scaleOffset
|
|
4487
|
-
if (target < .5) scaleOffset += target - .5
|
|
4488
|
-
else if (target > layout.height - .5) scaleOffset += target - (layout.height - .5)
|
|
4489
|
-
scaleOffset = clamp(scaleOffset, 0, layout.maxOffset)
|
|
4490
|
-
}
|
|
4491
|
-
function animatePreviewContent() {
|
|
4492
|
-
if (reducedMotion() || typeof preview?._prtsBody?.animate !== 'function') return
|
|
4493
|
-
preview._prtsBody.animate([
|
|
4494
|
-
{ opacity: .28 },
|
|
4495
|
-
{ opacity: 1 },
|
|
4496
|
-
], { duration: 70, easing: 'ease-out' })
|
|
4497
|
-
}
|
|
4498
|
-
function updatePreviewContent(index, animate = false) {
|
|
4499
|
-
if (!preview || index < 0 || index >= turns.length) return
|
|
4500
|
-
const content = getConversationTurnPreview(scroller, turns, index)
|
|
4501
|
-
const changed = preview._prtsQuestion.textContent !== content.question
|
|
4502
|
-
|| preview._prtsAnswer.textContent !== content.answer
|
|
4503
|
-
preview._prtsQuestion.textContent = content.question
|
|
4504
|
-
preview._prtsAnswer.textContent = content.answer
|
|
4505
|
-
preview.dataset.prtsPreviewState = content.state
|
|
4506
|
-
preview.dataset.prtsPreviewTurn = String(index + 1)
|
|
4507
|
-
observePreviewSource(content.answerSource)
|
|
4508
|
-
if (changed && animate && preview.hasAttribute('data-prts-conversation-preview-visible')) animatePreviewContent()
|
|
4509
|
-
}
|
|
4510
|
-
function showPreview(index, { animate = true, temporary = false } = {}) {
|
|
4511
|
-
if (!preview || index < 0 || index >= turns.length) return
|
|
4512
|
-
if (previewDelayTimer !== undefined) window?.clearTimeout?.(previewDelayTimer)
|
|
4513
|
-
if (previewHideTimer !== undefined) window?.clearTimeout?.(previewHideTimer)
|
|
4514
|
-
previewDelayTimer = undefined
|
|
4515
|
-
previewHideTimer = undefined
|
|
4516
|
-
pendingPreviewIndex = -1
|
|
4517
|
-
const switched = previewIndex !== index
|
|
4518
|
-
previewIndex = index
|
|
4519
|
-
updatePreviewContent(index, animate && switched)
|
|
4520
|
-
preview.setAttribute('data-prts-conversation-preview-visible', '')
|
|
4521
|
-
preview.setAttribute('aria-hidden', 'false')
|
|
4522
|
-
scale?.setAttribute('aria-describedby', preview.id)
|
|
4523
|
-
positionPreview(index)
|
|
4524
|
-
if (temporary) {
|
|
4525
|
-
previewHideTimer = window?.setTimeout?.(() => {
|
|
4526
|
-
previewHideTimer = undefined
|
|
4527
|
-
hidePreview()
|
|
4528
|
-
}, PREVIEW_TOUCH_DURATION)
|
|
4529
|
-
}
|
|
4530
|
-
}
|
|
4531
|
-
function queuePreview(index) {
|
|
4532
|
-
if (index < 0 || index >= turns.length) return
|
|
4533
|
-
if (preview?.hasAttribute('data-prts-conversation-preview-visible')) {
|
|
4534
|
-
showPreview(index)
|
|
4535
|
-
return
|
|
4536
|
-
}
|
|
4537
|
-
if (pendingPreviewIndex === index && previewDelayTimer !== undefined) return
|
|
4538
|
-
if (previewDelayTimer !== undefined) window?.clearTimeout?.(previewDelayTimer)
|
|
4539
|
-
pendingPreviewIndex = index
|
|
4540
|
-
previewDelayTimer = window?.setTimeout?.(() => {
|
|
4541
|
-
previewDelayTimer = undefined
|
|
4542
|
-
const pending = pendingPreviewIndex
|
|
4543
|
-
pendingPreviewIndex = -1
|
|
4544
|
-
if (pointerInside && scaleToTurnIndex(hoverIndex) === pending) showPreview(pending)
|
|
4545
|
-
}, PREVIEW_DELAY)
|
|
4546
|
-
}
|
|
4547
|
-
function hidePreview() {
|
|
4548
|
-
if (previewDelayTimer !== undefined) window?.clearTimeout?.(previewDelayTimer)
|
|
4549
|
-
if (previewHideTimer !== undefined) window?.clearTimeout?.(previewHideTimer)
|
|
4550
|
-
if (previewRefreshTimer !== undefined) window?.clearTimeout?.(previewRefreshTimer)
|
|
4551
|
-
previewDelayTimer = undefined
|
|
4552
|
-
previewHideTimer = undefined
|
|
4553
|
-
previewRefreshTimer = undefined
|
|
4554
|
-
pendingPreviewIndex = -1
|
|
4555
|
-
previewIndex = -1
|
|
4556
|
-
disconnectPreviewObserver()
|
|
4557
|
-
preview?.removeAttribute('data-prts-conversation-preview-visible')
|
|
4558
|
-
preview?.setAttribute('aria-hidden', 'true')
|
|
4559
|
-
scale?.removeAttribute('aria-describedby')
|
|
4560
|
-
}
|
|
4561
|
-
function queuePreviewRefresh() {
|
|
4562
|
-
if (previewIndex < 0 || previewRefreshTimer !== undefined) return
|
|
4563
|
-
previewRefreshTimer = window?.setTimeout?.(() => {
|
|
4564
|
-
previewRefreshTimer = undefined
|
|
4565
|
-
if (previewIndex >= 0) {
|
|
4566
|
-
updatePreviewContent(previewIndex, true)
|
|
4567
|
-
positionPreview(previewIndex)
|
|
4568
|
-
}
|
|
4569
|
-
}, PREVIEW_REFRESH_INTERVAL)
|
|
4570
|
-
}
|
|
4571
|
-
function wait(milliseconds) {
|
|
4572
|
-
return new Promise(resolve => window?.setTimeout?.(resolve, milliseconds))
|
|
4573
|
-
}
|
|
4574
|
-
async function waitForHistoryPage(request, before, deadline) {
|
|
4575
|
-
let sawLoading = false
|
|
4576
|
-
while (Date.now() < deadline) {
|
|
4577
|
-
await wait(40)
|
|
4578
|
-
if (request !== historyRequest) return 'cancelled'
|
|
4579
|
-
const state = readHistoryState()
|
|
4580
|
-
sawLoading ||= state.loading || Boolean(state.olderButton?.disabled)
|
|
4581
|
-
const firstTurn = collectConversationTurns(scroller)[0]
|
|
4582
|
-
const progressed = historyMutationRevision > before.revision
|
|
4583
|
-
&& (firstTurn !== before.firstTurn || !state.loading)
|
|
4584
|
-
if (!state.hasMore && !state.olderButton && !state.loading) return 'complete'
|
|
4585
|
-
if (progressed && !state.loading && !state.olderButton?.disabled) return 'progress'
|
|
4586
|
-
if (sawLoading && !state.loading && !state.olderButton?.disabled) return 'progress'
|
|
4587
|
-
}
|
|
4588
|
-
return 'timeout'
|
|
4589
|
-
}
|
|
4590
|
-
async function loadHistoryToStart() {
|
|
4591
|
-
if (!operation || !scroller || historyPhase === 'loading') return
|
|
4592
|
-
const initial = readHistoryState()
|
|
4593
|
-
if (!historyAvailable) {
|
|
4594
|
-
if (turns[0]) jump(0)
|
|
4595
|
-
return
|
|
4596
|
-
}
|
|
4597
|
-
const request = historyRequest + 1
|
|
4598
|
-
historyRequest = request
|
|
4599
|
-
const startedAt = Date.now()
|
|
4600
|
-
const sessionKey = initial.key
|
|
4601
|
-
let loadedThisRun = 0
|
|
4602
|
-
historyPhase = 'loading'
|
|
4603
|
-
historyMessage = ''
|
|
4604
|
-
hidePreview()
|
|
4605
|
-
syncHistoryStatus()
|
|
4606
|
-
schedule()
|
|
4607
|
-
while (loadedThisRun < CONVERSATION_HISTORY_PAGE_LIMIT
|
|
4608
|
-
&& Date.now() - startedAt < CONVERSATION_HISTORY_TIME_LIMIT) {
|
|
4609
|
-
if (request !== historyRequest) return
|
|
4610
|
-
const state = readHistoryState()
|
|
4611
|
-
if (sessionKey !== undefined && state.key !== undefined && state.key !== sessionKey) {
|
|
4612
|
-
cancelHistory({ paused: false })
|
|
4613
|
-
return
|
|
4614
|
-
}
|
|
4615
|
-
if (!state.hasMore && !state.olderButton && !state.loading) {
|
|
4616
|
-
setHistoryAvailable(false)
|
|
4617
|
-
historyPhase = 'idle'
|
|
4618
|
-
syncTurns([], true)
|
|
4619
|
-
schedule()
|
|
4620
|
-
if (turns[0]) jump(0)
|
|
4621
|
-
return
|
|
4622
|
-
}
|
|
4623
|
-
if (state.loading || state.olderButton?.disabled) {
|
|
4624
|
-
const result = await waitForHistoryPage(
|
|
4625
|
-
request,
|
|
4626
|
-
{
|
|
4627
|
-
firstTurn: collectConversationTurns(scroller)[0],
|
|
4628
|
-
revision: historyMutationRevision,
|
|
4629
|
-
},
|
|
4630
|
-
Math.min(startedAt + CONVERSATION_HISTORY_TIME_LIMIT, Date.now() + HISTORY_PAGE_SETTLE_LIMIT),
|
|
4631
|
-
)
|
|
4632
|
-
if (result === 'cancelled') return
|
|
4633
|
-
if (result === 'timeout') {
|
|
4634
|
-
historyPhase = 'error'
|
|
4635
|
-
historyMessage = '载入超时,可继续重试'
|
|
4636
|
-
break
|
|
4637
|
-
}
|
|
4638
|
-
historyPages += 1
|
|
4639
|
-
loadedThisRun += 1
|
|
4640
|
-
syncTurns([], true)
|
|
4641
|
-
syncHistoryStatus()
|
|
4642
|
-
schedule()
|
|
4643
|
-
continue
|
|
4644
|
-
}
|
|
4645
|
-
if (!state.olderButton) {
|
|
4646
|
-
const availableDeadline = Math.min(startedAt + CONVERSATION_HISTORY_TIME_LIMIT, Date.now() + 600)
|
|
4647
|
-
while (request === historyRequest && Date.now() < availableDeadline && !findConversationOlderButton(operation)) {
|
|
4648
|
-
await wait(40)
|
|
4649
|
-
}
|
|
4650
|
-
}
|
|
4651
|
-
const button = findConversationOlderButton(operation)
|
|
4652
|
-
if (!button || button.disabled) {
|
|
4653
|
-
historyPhase = 'error'
|
|
4654
|
-
historyMessage = '暂时无法载入更早内容'
|
|
4655
|
-
break
|
|
4656
|
-
}
|
|
4657
|
-
const before = {
|
|
4658
|
-
firstTurn: collectConversationTurns(scroller)[0],
|
|
4659
|
-
revision: historyMutationRevision,
|
|
4660
|
-
}
|
|
4661
|
-
button.click()
|
|
4662
|
-
const result = await waitForHistoryPage(
|
|
4663
|
-
request,
|
|
4664
|
-
before,
|
|
4665
|
-
Math.min(startedAt + CONVERSATION_HISTORY_TIME_LIMIT, Date.now() + HISTORY_PAGE_SETTLE_LIMIT),
|
|
4666
|
-
)
|
|
4667
|
-
if (result === 'cancelled') return
|
|
4668
|
-
if (result === 'timeout') {
|
|
4669
|
-
historyPhase = 'error'
|
|
4670
|
-
historyMessage = '载入超时,可继续重试'
|
|
4671
|
-
break
|
|
4672
|
-
}
|
|
4673
|
-
historyPages += 1
|
|
4674
|
-
loadedThisRun += 1
|
|
4675
|
-
syncTurns([], true)
|
|
4676
|
-
syncHistoryStatus()
|
|
4677
|
-
schedule()
|
|
4678
|
-
}
|
|
4679
|
-
if (request !== historyRequest) return
|
|
4680
|
-
const finalState = readHistoryState()
|
|
4681
|
-
if (!finalState.hasMore && !finalState.olderButton && !finalState.loading) {
|
|
4682
|
-
setHistoryAvailable(false)
|
|
4683
|
-
historyPhase = 'idle'
|
|
4684
|
-
syncTurns([], true)
|
|
4685
|
-
if (turns[0]) jump(0)
|
|
4686
|
-
} else if (historyPhase === 'loading') {
|
|
4687
|
-
historyPhase = 'paused'
|
|
4688
|
-
}
|
|
4689
|
-
syncHistoryStatus()
|
|
4690
|
-
schedule()
|
|
4691
|
-
}
|
|
4692
|
-
function jump(index) {
|
|
4693
|
-
const turn = turns[index]
|
|
4694
|
-
if (!turn || !scroller || !operation) return
|
|
4695
|
-
const jumpScroller = scroller
|
|
4696
|
-
const jumpOperation = operation
|
|
4697
|
-
const jumpComposer = composer
|
|
4698
|
-
const request = jumpRequest + 1
|
|
4699
|
-
jumpRequest = request
|
|
4700
|
-
const getTargetTop = () => {
|
|
4701
|
-
if (!turn.isConnected || scroller !== jumpScroller || operation !== jumpOperation) return Number.NaN
|
|
4702
|
-
const operationBox = jumpOperation.getBoundingClientRect()
|
|
4703
|
-
const scrollerBox = jumpScroller.getBoundingClientRect()
|
|
4704
|
-
const composerBox = jumpComposer?.getBoundingClientRect?.()
|
|
4705
|
-
const visibleTop = Math.max(scrollerBox.top, operationBox.top)
|
|
4706
|
-
const visibleBottom = Math.min(scrollerBox.bottom, operationBox.bottom, composerBox?.top ?? operationBox.bottom)
|
|
4707
|
-
return calculateConversationJumpTop({
|
|
4708
|
-
scrollTop: jumpScroller.scrollTop,
|
|
4709
|
-
scrollHeight: jumpScroller.scrollHeight,
|
|
4710
|
-
clientHeight: jumpScroller.clientHeight,
|
|
4711
|
-
turnTop: turn.getBoundingClientRect().top,
|
|
4712
|
-
visibleTop,
|
|
4713
|
-
visibleHeight: Math.max(0, visibleBottom - visibleTop),
|
|
4714
|
-
})
|
|
4715
|
-
}
|
|
4716
|
-
void performConversationJump({
|
|
4717
|
-
scroller: jumpScroller,
|
|
4718
|
-
getTargetTop,
|
|
4719
|
-
prefersReducedMotion: reducedMotion(),
|
|
4720
|
-
requestFrame,
|
|
4721
|
-
now: () => currentTime(),
|
|
4722
|
-
cancelled: () => request !== jumpRequest,
|
|
4723
|
-
onFrame: schedule,
|
|
4724
|
-
}).catch(() => {
|
|
4725
|
-
if (request === jumpRequest) cancelJump()
|
|
4726
|
-
})
|
|
4727
|
-
cursorIndex = turnToScaleIndex(index)
|
|
4728
|
-
syncAccessibility()
|
|
4729
|
-
}
|
|
4730
|
-
function showScalePreview(index, options) {
|
|
4731
|
-
const turnIndex = scaleToTurnIndex(index)
|
|
4732
|
-
if (turnIndex < 0) {
|
|
4733
|
-
hidePreview()
|
|
4734
|
-
return
|
|
4735
|
-
}
|
|
4736
|
-
showPreview(turnIndex, options)
|
|
4737
|
-
}
|
|
4738
|
-
function queueScalePreview(index) {
|
|
4739
|
-
const turnIndex = scaleToTurnIndex(index)
|
|
4740
|
-
if (turnIndex < 0) {
|
|
4741
|
-
hidePreview()
|
|
4742
|
-
return
|
|
4743
|
-
}
|
|
4744
|
-
queuePreview(turnIndex)
|
|
4745
|
-
}
|
|
4746
|
-
function activateScaleIndex(index, options) {
|
|
4747
|
-
if (historyAvailable && index === 0) {
|
|
4748
|
-
hidePreview()
|
|
4749
|
-
void loadHistoryToStart()
|
|
4750
|
-
return
|
|
4751
|
-
}
|
|
4752
|
-
const turnIndex = scaleToTurnIndex(index)
|
|
4753
|
-
if (turnIndex < 0) return
|
|
4754
|
-
showPreview(turnIndex, options)
|
|
4755
|
-
jump(turnIndex)
|
|
4756
|
-
}
|
|
4757
|
-
function showWave(index, temporary = false) {
|
|
4758
|
-
if (index < 0) return
|
|
4759
|
-
hoverIndex = index
|
|
4760
|
-
cursorIndex = index
|
|
4761
|
-
ensureVisible(index)
|
|
4762
|
-
retargetWave(index)
|
|
4763
|
-
if (touchTimer !== undefined) window?.clearTimeout?.(touchTimer)
|
|
4764
|
-
if (temporary) {
|
|
4765
|
-
touchTimer = window?.setTimeout?.(() => {
|
|
4766
|
-
touchTimer = undefined
|
|
4767
|
-
hoverIndex = -1
|
|
4768
|
-
retargetWave(-1)
|
|
4769
|
-
schedule()
|
|
4770
|
-
}, TOUCH_WAVE_DURATION)
|
|
4771
|
-
}
|
|
4772
|
-
schedule()
|
|
4773
|
-
}
|
|
4774
|
-
function onPointerMove(event) {
|
|
4775
|
-
if (event.pointerType === 'touch') return
|
|
4776
|
-
pointerInside = true
|
|
4777
|
-
keyboardActive = false
|
|
4778
|
-
const index = localIndex(event)
|
|
4779
|
-
if (index === hoverIndex) return
|
|
4780
|
-
showWave(index)
|
|
4781
|
-
queueScalePreview(index)
|
|
4782
|
-
}
|
|
4783
|
-
function onPointerLeave(event) {
|
|
4784
|
-
if (event.pointerType === 'touch') return
|
|
4785
|
-
pointerInside = false
|
|
4786
|
-
hoverIndex = -1
|
|
4787
|
-
retargetWave(-1)
|
|
4788
|
-
hidePreview()
|
|
4789
|
-
schedule()
|
|
4790
|
-
}
|
|
4791
|
-
function onPointerDown(event) {
|
|
4792
|
-
cancelNavigation()
|
|
4793
|
-
if (event.pointerType !== 'touch' && event.pointerType !== 'pen') return
|
|
4794
|
-
pointerInside = true
|
|
4795
|
-
pointerStart = { x: event.clientX, y: event.clientY, id: event.pointerId }
|
|
4796
|
-
scale.setPointerCapture?.(event.pointerId)
|
|
4797
|
-
event.preventDefault()
|
|
4798
|
-
}
|
|
4799
|
-
function onPointerUp(event) {
|
|
4800
|
-
if (!pointerStart || pointerStart.id !== event.pointerId) return
|
|
4801
|
-
const distance = Math.hypot(event.clientX - pointerStart.x, event.clientY - pointerStart.y)
|
|
4802
|
-
pointerStart = undefined
|
|
4803
|
-
if (event.pointerType === 'touch') pointerInside = false
|
|
4804
|
-
scale.releasePointerCapture?.(event.pointerId)
|
|
4805
|
-
if (distance > 8) return
|
|
4806
|
-
const index = localIndex(event)
|
|
4807
|
-
if (index < 0) return
|
|
4808
|
-
lastDirectJump = Date.now()
|
|
4809
|
-
keyboardActive = false
|
|
4810
|
-
showWave(index, true)
|
|
4811
|
-
activateScaleIndex(index, { temporary: true })
|
|
4812
|
-
scale.focus({ preventScroll: true })
|
|
4813
|
-
event.preventDefault()
|
|
4814
|
-
}
|
|
4815
|
-
function onPointerCancel(event) {
|
|
4816
|
-
if (pointerStart?.id === event.pointerId) {
|
|
4817
|
-
pointerStart = undefined
|
|
4818
|
-
if (event.pointerType === 'touch') pointerInside = false
|
|
4819
|
-
}
|
|
4820
|
-
}
|
|
4821
|
-
function onClick(event) {
|
|
4822
|
-
if (Date.now() - lastDirectJump < 300) return
|
|
4823
|
-
keyboardActive = false
|
|
4824
|
-
const index = localIndex(event)
|
|
4825
|
-
if (index < 0) return
|
|
4826
|
-
showWave(index)
|
|
4827
|
-
activateScaleIndex(index)
|
|
4828
|
-
scale.focus({ preventScroll: true })
|
|
4829
|
-
}
|
|
4830
|
-
function queueSnap() {
|
|
4831
|
-
if (snapTimer !== undefined) window?.clearTimeout?.(snapTimer)
|
|
4832
|
-
snapTimer = window?.setTimeout?.(() => {
|
|
4833
|
-
snapTimer = undefined
|
|
4834
|
-
if (!layout) return
|
|
4835
|
-
scaleOffset = snapConversationScaleOffset(scaleOffset, layout.maxOffset)
|
|
4836
|
-
schedule()
|
|
4837
|
-
}, SNAP_DELAY)
|
|
4838
|
-
}
|
|
4839
|
-
function onWheel(event) {
|
|
4840
|
-
cancelNavigation()
|
|
4841
|
-
event.preventDefault()
|
|
4842
|
-
event.stopPropagation()
|
|
4843
|
-
hidePreview()
|
|
4844
|
-
if (!layout || layout.maxOffset <= 0) return
|
|
4845
|
-
const factor = event.deltaMode === 1 ? CONVERSATION_SCALE_SPACING : event.deltaMode === 2 ? layout.height : 1
|
|
4846
|
-
scaleOffset = clamp(scaleOffset + event.deltaY * factor, 0, layout.maxOffset)
|
|
4847
|
-
keyboardActive = false
|
|
4848
|
-
hoverIndex = -1
|
|
4849
|
-
retargetWave(-1)
|
|
4850
|
-
schedule()
|
|
4851
|
-
queueSnap()
|
|
4852
|
-
}
|
|
4853
|
-
function page(direction) {
|
|
4854
|
-
if (!layout) return
|
|
4855
|
-
const distance = Math.max(CONVERSATION_SCALE_SPACING, Math.floor(layout.height / CONVERSATION_SCALE_SPACING) * CONVERSATION_SCALE_SPACING)
|
|
4856
|
-
scaleOffset = clamp(scaleOffset + direction * distance, 0, layout.maxOffset)
|
|
4857
|
-
const edgeY = direction < 0 ? .5 : layout.height - .5
|
|
4858
|
-
const nextLayout = getConversationScaleLayout(scaleItemCount(), layout.height, scaleOffset)
|
|
4859
|
-
cursorIndex = nearestVisibleConversationTick(nextLayout, edgeY)
|
|
4860
|
-
hoverIndex = cursorIndex
|
|
4861
|
-
retargetWave(cursorIndex)
|
|
4862
|
-
showScalePreview(cursorIndex)
|
|
4863
|
-
schedule()
|
|
4864
|
-
}
|
|
4865
|
-
function onKeydown(event) {
|
|
4866
|
-
if (scaleItemCount() < MINIMUM_TURNS) return
|
|
4867
|
-
if (event.key === 'Escape' && historyPhase === 'loading') {
|
|
4868
|
-
cancelHistory()
|
|
4869
|
-
event.preventDefault()
|
|
4870
|
-
return
|
|
4871
|
-
}
|
|
4872
|
-
if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {
|
|
4873
|
-
keyboardActive = true
|
|
4874
|
-
cursorIndex = clamp(cursorIndex + (event.key === 'ArrowUp' ? -1 : 1), 0, scaleItemCount() - 1)
|
|
4875
|
-
hoverIndex = cursorIndex
|
|
4876
|
-
ensureVisible(cursorIndex)
|
|
4877
|
-
showScalePreview(cursorIndex)
|
|
4878
|
-
} else if (event.key === 'Home' || event.key === 'End') {
|
|
4879
|
-
keyboardActive = true
|
|
4880
|
-
cursorIndex = event.key === 'Home' ? 0 : scaleItemCount() - 1
|
|
4881
|
-
hoverIndex = cursorIndex
|
|
4882
|
-
ensureVisible(cursorIndex)
|
|
4883
|
-
showScalePreview(cursorIndex)
|
|
4884
|
-
} else if (event.key === 'PageUp' || event.key === 'PageDown') {
|
|
4885
|
-
keyboardActive = true
|
|
4886
|
-
page(event.key === 'PageUp' ? -1 : 1)
|
|
4887
|
-
event.preventDefault()
|
|
4888
|
-
return
|
|
4889
|
-
} else if (event.key === 'Enter' || event.key === ' ') {
|
|
4890
|
-
event.preventDefault()
|
|
4891
|
-
activateScaleIndex(cursorIndex)
|
|
4892
|
-
return
|
|
4893
|
-
} else return
|
|
4894
|
-
event.preventDefault()
|
|
4895
|
-
retargetWave(cursorIndex)
|
|
4896
|
-
schedule()
|
|
4897
|
-
}
|
|
4898
|
-
function onFocus() {
|
|
4899
|
-
ensureVisible(cursorIndex)
|
|
4900
|
-
schedule()
|
|
4901
|
-
}
|
|
4902
|
-
function onBlur() {
|
|
4903
|
-
keyboardActive = false
|
|
4904
|
-
hoverIndex = -1
|
|
4905
|
-
retargetWave(-1)
|
|
4906
|
-
if (!pointerInside) hidePreview()
|
|
4907
|
-
schedule()
|
|
4908
|
-
}
|
|
4909
|
-
return {
|
|
4910
|
-
getCalibrationState(candidate = maximumDistance) {
|
|
4911
|
-
if (!started || failed || (!operation && !resolveRoots())) {
|
|
4912
|
-
const fallback = resolveConversationScaleCalibrationState({
|
|
4913
|
-
maximumDistance: candidate,
|
|
4914
|
-
viewportWidth: window?.innerWidth,
|
|
4915
|
-
})
|
|
4916
|
-
return { ...fallback, simulated: true }
|
|
4917
|
-
}
|
|
4918
|
-
const cachedOperationBox = geometry?.operationBox
|
|
4919
|
-
const operationBox = cachedOperationBox ?? operation.getBoundingClientRect?.()
|
|
4920
|
-
const cachedContentLeft = Number.isFinite(contentLeft) ? contentLeft : undefined
|
|
4921
|
-
return resolveConversationScaleCalibrationState({
|
|
4922
|
-
operationWidth: operationBox?.width,
|
|
4923
|
-
contentLeft: cachedContentLeft ?? representativeContentLeft(operationBox),
|
|
4924
|
-
maximumDistance: candidate,
|
|
4925
|
-
turnCount: turns.length,
|
|
4926
|
-
drawerMode: document.documentElement.dataset.prtsDrawerMode,
|
|
4927
|
-
viewportWidth: window?.innerWidth,
|
|
4928
|
-
previouslyHidden: scaleSpaceObstructed,
|
|
4929
|
-
})
|
|
4930
|
-
},
|
|
4931
|
-
update(nextPreferences = {}) {
|
|
4932
|
-
const distanceNumeric = Number(nextPreferences.conversationScaleMaxDistance)
|
|
4933
|
-
const nextDistance = Number.isFinite(distanceNumeric)
|
|
4934
|
-
? clamp(Math.round(distanceNumeric / 8) * 8, 16, 240)
|
|
4935
|
-
: CONVERSATION_SCALE_DEFAULT_MAX_DISTANCE
|
|
4936
|
-
const contrastNumeric = Number(nextPreferences.conversationScaleFocusContrast)
|
|
4937
|
-
const nextContrast = Number.isFinite(contrastNumeric)
|
|
4938
|
-
? clamp(Math.round(contrastNumeric / 10) * 10, 0, 100)
|
|
4939
|
-
: CONVERSATION_SCALE_FOCUS_CONTRAST_DEFAULT
|
|
4940
|
-
if (nextDistance === maximumDistance && nextContrast === focusContrast) return
|
|
4941
|
-
maximumDistance = nextDistance
|
|
4942
|
-
if (nextContrast !== focusContrast) {
|
|
4943
|
-
focusContrast = nextContrast
|
|
4944
|
-
scaleLengths = resolveConversationScaleLengths(focusContrast)
|
|
4945
|
-
}
|
|
4946
|
-
schedule()
|
|
4947
|
-
},
|
|
4948
|
-
start() {
|
|
4949
|
-
if (started || !document) return
|
|
4950
|
-
started = true
|
|
4951
|
-
failed = false
|
|
4952
|
-
window?.addEventListener?.('resize', onHostGeometryChange)
|
|
4953
|
-
window?.addEventListener?.('orientationchange', onHostGeometryChange)
|
|
4954
|
-
window?.addEventListener?.('pageshow', onHostGeometryChange)
|
|
4955
|
-
window?.visualViewport?.addEventListener?.('resize', onHostGeometryChange)
|
|
4956
|
-
const ResizeObserver = window?.ResizeObserver
|
|
4957
|
-
if (typeof ResizeObserver === 'function') {
|
|
4958
|
-
resizeObserver = new ResizeObserver((entries = []) => {
|
|
4959
|
-
geometryDirty = true
|
|
4960
|
-
requestGeometryStabilization()
|
|
4961
|
-
const operationEntry = entries.find(entry => entry.target === operation)
|
|
4962
|
-
const width = Number(operationEntry?.contentRect?.width)
|
|
4963
|
-
const height = Number(operationEntry?.contentRect?.height)
|
|
4964
|
-
const operationChanged = !entries.length || Boolean(operationEntry) && (
|
|
4965
|
-
!Number.isFinite(width)
|
|
4966
|
-
|| !Number.isFinite(height)
|
|
4967
|
-
|| width !== observedOperationWidth
|
|
4968
|
-
|| height !== observedOperationHeight
|
|
4969
|
-
)
|
|
4970
|
-
if (operationEntry) {
|
|
4971
|
-
if (Number.isFinite(width)) observedOperationWidth = width
|
|
4972
|
-
if (Number.isFinite(height)) observedOperationHeight = height
|
|
4973
|
-
}
|
|
4974
|
-
if (!operationChanged) {
|
|
4975
|
-
schedule()
|
|
4976
|
-
return
|
|
4977
|
-
}
|
|
4978
|
-
if (!resizeActive) {
|
|
4979
|
-
setScaleResizeState(true)
|
|
4980
|
-
if (frame !== undefined) {
|
|
4981
|
-
if (window?.cancelAnimationFrame) window.cancelAnimationFrame(frame)
|
|
4982
|
-
else window?.clearTimeout?.(frame)
|
|
4983
|
-
frame = undefined
|
|
4984
|
-
}
|
|
4985
|
-
}
|
|
4986
|
-
if (resizeSettleTimer !== undefined) window?.clearTimeout?.(resizeSettleTimer)
|
|
4987
|
-
resizeSettleTimer = window?.setTimeout?.(() => {
|
|
4988
|
-
resizeSettleTimer = undefined
|
|
4989
|
-
obstructionDirty = true
|
|
4990
|
-
setScaleResizeState(false)
|
|
4991
|
-
schedule()
|
|
4992
|
-
}, 160)
|
|
4993
|
-
})
|
|
4994
|
-
}
|
|
4995
|
-
const MutationObserver = window?.MutationObserver
|
|
4996
|
-
if (typeof MutationObserver === 'function' && document.body) {
|
|
4997
|
-
mutationObserver = new MutationObserver(mutations => {
|
|
4998
|
-
const external = mutations.filter(mutation =>
|
|
4999
|
-
!mutation.target?.closest?.('[data-prts-conversation-scale], [data-prts-conversation-preview], [data-prts-conversation-history-hint], [data-prts-conversation-history-status]')
|
|
5000
|
-
)
|
|
5001
|
-
if (external.length) requestGeometryStabilization()
|
|
5002
|
-
const historyRelevant = external.some(mutation =>
|
|
5003
|
-
mutation.type === 'childList'
|
|
5004
|
-
&& operation?.contains?.(mutation.target)
|
|
5005
|
-
&& ((mutation.addedNodes?.length ?? 0) > 0 || (mutation.removedNodes?.length ?? 0) > 0)
|
|
5006
|
-
)
|
|
5007
|
-
if (historyRelevant) historyMutationRevision += 1
|
|
5008
|
-
const relevant = external.filter(mutation =>
|
|
5009
|
-
mutationAffectsTurns(mutation) || mutationAffectsOverlay(mutation)
|
|
5010
|
-
)
|
|
5011
|
-
if (relevant.some(mutationAffectsOverlay)) obstructionDirty = true
|
|
5012
|
-
if (!relevant.length && !historyRelevant) return
|
|
5013
|
-
if (previewIndex >= 0) queuePreviewRefresh()
|
|
5014
|
-
pendingMutations.push(...relevant)
|
|
5015
|
-
scanPending ||= relevant.length > 0
|
|
5016
|
-
schedule()
|
|
5017
|
-
})
|
|
5018
|
-
mutationObserver.observe(document.body, {
|
|
5019
|
-
subtree: true,
|
|
5020
|
-
childList: true,
|
|
5021
|
-
attributes: true,
|
|
5022
|
-
attributeFilter: [
|
|
5023
|
-
'data-chat-flow-kind',
|
|
5024
|
-
'data-message-role',
|
|
5025
|
-
'data-prts-floating-glass',
|
|
5026
|
-
'hidden',
|
|
5027
|
-
'aria-hidden',
|
|
5028
|
-
'aria-modal',
|
|
5029
|
-
'role',
|
|
5030
|
-
'open',
|
|
5031
|
-
'popover',
|
|
5032
|
-
'class',
|
|
5033
|
-
'data-slot',
|
|
5034
|
-
'data-plugin',
|
|
5035
|
-
'style',
|
|
5036
|
-
],
|
|
5037
|
-
})
|
|
5038
|
-
}
|
|
5039
|
-
document.fonts?.ready?.then?.(() => {
|
|
5040
|
-
if (started) requestGeometryStabilization()
|
|
5041
|
-
}).catch?.(() => {})
|
|
5042
|
-
schedule(true)
|
|
5043
|
-
},
|
|
5044
|
-
dispose() {
|
|
5045
|
-
window?.removeEventListener?.('resize', onHostGeometryChange)
|
|
5046
|
-
window?.removeEventListener?.('orientationchange', onHostGeometryChange)
|
|
5047
|
-
window?.removeEventListener?.('pageshow', onHostGeometryChange)
|
|
5048
|
-
window?.visualViewport?.removeEventListener?.('resize', onHostGeometryChange)
|
|
5049
|
-
stopGeometryStabilization()
|
|
5050
|
-
started = false
|
|
5051
|
-
failed = false
|
|
5052
|
-
mutationObserver?.disconnect()
|
|
5053
|
-
mutationObserver = undefined
|
|
5054
|
-
resizeObserver?.disconnect()
|
|
5055
|
-
resizeObserver = undefined
|
|
5056
|
-
disconnectPreviewObserver()
|
|
5057
|
-
if (frame !== undefined) {
|
|
5058
|
-
if (window?.cancelAnimationFrame) window.cancelAnimationFrame(frame)
|
|
5059
|
-
else window?.clearTimeout?.(frame)
|
|
5060
|
-
}
|
|
5061
|
-
frame = undefined
|
|
5062
|
-
scanPending = false
|
|
5063
|
-
fullScanPending = false
|
|
5064
|
-
pendingMutations = []
|
|
5065
|
-
overlayCandidates.clear()
|
|
5066
|
-
overlayScanPending = false
|
|
5067
|
-
scaleObstructed = false
|
|
5068
|
-
scaleBlockingObstructed = false
|
|
5069
|
-
scaleSpaceObstructed = true
|
|
5070
|
-
contentLeft = undefined
|
|
5071
|
-
geometryDirty = true
|
|
5072
|
-
clearTimers()
|
|
5073
|
-
setScaleResizeState(false)
|
|
5074
|
-
disconnectRoots()
|
|
5075
|
-
},
|
|
5076
|
-
}
|
|
5077
|
-
}
|
|
5078
|
-
|
|
5079
2905
|
const USER_TURN_SELECTOR = [
|
|
5080
2906
|
'[data-chat-flow-kind="user"]',
|
|
5081
2907
|
'[data-chat-flow-kind="user-step"]',
|
|
@@ -7068,23 +4894,6 @@ return PARTICLE_OPTIONS.map(([value, label, count]) => `<button type="button" ro
|
|
|
7068
4894
|
<i data-prts-particle-detail-preview aria-hidden="true">${Array.from({ length: count }, () => '<b></b>').join('')}</i><span>${label}</span>
|
|
7069
4895
|
</button>`).join('')
|
|
7070
4896
|
}
|
|
7071
|
-
function calibrationMarkup() {
|
|
7072
|
-
return `<div data-prts-scale-calibration data-prts-calibration-mode="hidden" data-prts-calibration-reason="unmeasured">
|
|
7073
|
-
<div data-prts-scale-calibration-viewport>
|
|
7074
|
-
<div data-prts-scale-calibration-canvas aria-hidden="true">
|
|
7075
|
-
<i data-prts-scale-calibration-sidebar></i>
|
|
7076
|
-
<span data-prts-scale-calibration-measure><i></i><output data-prts-scale-calibration-value>96 px</output></span>
|
|
7077
|
-
<span data-prts-scale-calibration-rail>${Array.from({ length: 9 }, (_, index) => `<i style="--prts-calibration-tick:${index}"></i>`).join('')}</span>
|
|
7078
|
-
<i data-prts-scale-calibration-gap></i>
|
|
7079
|
-
<span data-prts-scale-calibration-content><i></i><small>会话内容区</small></span>
|
|
7080
|
-
</div>
|
|
7081
|
-
</div>
|
|
7082
|
-
<div data-prts-scale-calibration-meta>
|
|
7083
|
-
<span data-prts-scale-calibration-scale hidden>缩放预览</span>
|
|
7084
|
-
<output data-prts-scale-calibration-status aria-live="polite">当前视图:几何测量中</output>
|
|
7085
|
-
</div>
|
|
7086
|
-
</div>`
|
|
7087
|
-
}
|
|
7088
4897
|
function themeSettingsMarkup() {
|
|
7089
4898
|
return `<div data-prts-settings-backdrop hidden aria-hidden="true"></div>
|
|
7090
4899
|
<dialog id="prts-theme-settings" data-prts-theme-settings aria-label="P.R.T.S. 主题设置" aria-hidden="true">
|
|
@@ -7107,7 +4916,7 @@ return `<div data-prts-settings-backdrop hidden aria-hidden="true"></div>
|
|
|
7107
4916
|
<div data-prts-settings-common-grid>${COMMON_CONTROLS.map(([key, label, options]) => settingButtons(key, label, options)).join('')}</div>
|
|
7108
4917
|
</section>
|
|
7109
4918
|
<details data-prts-settings-advanced>
|
|
7110
|
-
<summary><span><small>精细调整</small><strong
|
|
4919
|
+
<summary><span><small>精细调整</small><strong>粒子效果</strong></span><output data-prts-advanced-summary>标准 / 1×</output></summary>
|
|
7111
4920
|
<div data-prts-settings-advanced-content>
|
|
7112
4921
|
<section data-prts-particle-detail>
|
|
7113
4922
|
<header><strong>粒子精度</strong><span>同时调整会话与新会话徽记</span></header>
|
|
@@ -7118,22 +4927,6 @@ return `<div data-prts-settings-backdrop hidden aria-hidden="true"></div>
|
|
|
7118
4927
|
</label>
|
|
7119
4928
|
<span data-prts-particle-error role="alert" hidden>粒子资源加载异常,主题已使用静态后备效果</span>
|
|
7120
4929
|
</section>
|
|
7121
|
-
<section data-prts-scale-adjustment>
|
|
7122
|
-
<header><strong>会话刻度</strong><span>调整位置距离与悬停焦点的视觉区分</span></header>
|
|
7123
|
-
${calibrationMarkup()}
|
|
7124
|
-
<label data-prts-setting-row="conversationScaleMaxDistance" data-prts-setting-range-row>
|
|
7125
|
-
<span>最大距离</span>
|
|
7126
|
-
<div><input type="range" min="16" max="240" step="8" value="96" data-prts-setting-range data-prts-setting-key="conversationScaleMaxDistance" aria-label="会话刻度最大距离"><output data-prts-scale-distance-output>96 px</output></div>
|
|
7127
|
-
</label>
|
|
7128
|
-
<label data-prts-setting-row="conversationScaleFocusContrast" data-prts-setting-range-row>
|
|
7129
|
-
<span>聚焦区分度</span>
|
|
7130
|
-
<div data-prts-scale-focus-control>
|
|
7131
|
-
<span data-prts-scale-focus-preview aria-hidden="true">${Array.from({ length: 5 }, (_, index) => `<i data-prts-scale-focus-preview-tick="${index}"></i>`).join('')}</span>
|
|
7132
|
-
<input type="range" min="0" max="100" step="10" value="70" data-prts-setting-range data-prts-setting-key="conversationScaleFocusContrast" aria-label="会话刻度聚焦区分度">
|
|
7133
|
-
<output data-prts-scale-focus-output>70</output>
|
|
7134
|
-
</div>
|
|
7135
|
-
</label>
|
|
7136
|
-
</section>
|
|
7137
4930
|
</div>
|
|
7138
4931
|
</details>
|
|
7139
4932
|
<footer data-prts-settings-actions>
|
|
@@ -7165,7 +4958,6 @@ onPreferenceChange = () => {},
|
|
|
7165
4958
|
onPreferencePreview = () => {},
|
|
7166
4959
|
onResetVisual = () => {},
|
|
7167
4960
|
onRetrySave = () => {},
|
|
7168
|
-
getConversationScalePreview = () => ({ visible: false, reason: 'unmeasured', mode: 'hidden' }),
|
|
7169
4961
|
}) {
|
|
7170
4962
|
const window = document?.defaultView
|
|
7171
4963
|
const transparencyMedia = window?.matchMedia?.('(prefers-reduced-transparency: reduce)')
|
|
@@ -7176,17 +4968,8 @@ let previousFocus
|
|
|
7176
4968
|
let currentPreferences
|
|
7177
4969
|
let currentStatus
|
|
7178
4970
|
let currentPersistence = { phase: 'idle', revision: 0 }
|
|
7179
|
-
let scaleDistanceDraft
|
|
7180
|
-
let scaleDistanceDirty = false
|
|
7181
|
-
let scaleFocusContrastDraft
|
|
7182
|
-
let scaleFocusContrastDirty = false
|
|
7183
4971
|
let particleTraversalSpeedDraft
|
|
7184
4972
|
let particleTraversalSpeedDirty = false
|
|
7185
|
-
let calibrationResizeObserver
|
|
7186
|
-
let calibrationSettleTimer
|
|
7187
|
-
let calibrationFrame
|
|
7188
|
-
let calibrationViewportWidth
|
|
7189
|
-
let calibrationFactor
|
|
7190
4973
|
let savedTimer
|
|
7191
4974
|
let feedbackTimer
|
|
7192
4975
|
let feedbackTarget
|
|
@@ -7229,8 +5012,6 @@ if (!panel || !backdrop || !trigger) return false
|
|
|
7229
5012
|
const value = Boolean(next)
|
|
7230
5013
|
if (value === isOpen) return isOpen
|
|
7231
5014
|
if (!value) {
|
|
7232
|
-
commitScaleDistance()
|
|
7233
|
-
commitScaleFocusContrast()
|
|
7234
5015
|
commitParticleTraversalSpeed()
|
|
7235
5016
|
}
|
|
7236
5017
|
isOpen = value
|
|
@@ -7242,7 +5023,6 @@ previousFocus = document.activeElement
|
|
|
7242
5023
|
onOpen()
|
|
7243
5024
|
showPanel()
|
|
7244
5025
|
panel.setAttribute('data-prts-settings-visible', '')
|
|
7245
|
-
renderScaleCalibration()
|
|
7246
5026
|
;(panel.querySelector('[data-prts-theme-settings-close]') ?? focusable()[0] ?? panel).focus?.()
|
|
7247
5027
|
} else {
|
|
7248
5028
|
panel.removeAttribute('data-prts-settings-visible')
|
|
@@ -7252,23 +5032,6 @@ if (restoreFocus) (trigger.isConnected ? trigger : previousFocus)?.focus?.()
|
|
|
7252
5032
|
}
|
|
7253
5033
|
return isOpen
|
|
7254
5034
|
}
|
|
7255
|
-
function normalizeScaleDistance(value) {
|
|
7256
|
-
const numeric = Number(value)
|
|
7257
|
-
if (!Number.isFinite(numeric)) return 96
|
|
7258
|
-
return Math.min(240, Math.max(16, Math.round(numeric / 8) * 8))
|
|
7259
|
-
}
|
|
7260
|
-
function currentScaleDistance() {
|
|
7261
|
-
return normalizeScaleDistance(scaleDistanceDirty ? scaleDistanceDraft : currentPreferences?.conversationScaleMaxDistance)
|
|
7262
|
-
}
|
|
7263
|
-
function normalizeScaleFocusContrast(value) {
|
|
7264
|
-
const numeric = Number(value)
|
|
7265
|
-
if (!Number.isFinite(numeric)) return CONVERSATION_SCALE_FOCUS_CONTRAST_DEFAULT
|
|
7266
|
-
const clamped = Math.min(CONVERSATION_SCALE_FOCUS_CONTRAST_MAX, Math.max(CONVERSATION_SCALE_FOCUS_CONTRAST_MIN, numeric))
|
|
7267
|
-
return Math.round(clamped / CONVERSATION_SCALE_FOCUS_CONTRAST_STEP) * CONVERSATION_SCALE_FOCUS_CONTRAST_STEP
|
|
7268
|
-
}
|
|
7269
|
-
function currentScaleFocusContrast() {
|
|
7270
|
-
return normalizeScaleFocusContrast(scaleFocusContrastDirty ? scaleFocusContrastDraft : currentPreferences?.conversationScaleFocusContrast)
|
|
7271
|
-
}
|
|
7272
5035
|
function normalizeParticleTraversalSpeed(value) {
|
|
7273
5036
|
const numeric = Number(value)
|
|
7274
5037
|
if (!Number.isFinite(numeric)) return PARTICLE_TRAVERSAL_SPEED_DEFAULT
|
|
@@ -7295,131 +5058,9 @@ const range = panel.querySelector('input[data-prts-setting-range][data-prts-sett
|
|
|
7295
5058
|
if (range && range.value !== String(value)) range.value = String(value)
|
|
7296
5059
|
setText(panel.querySelector('[data-prts-particle-traversal-output]'), particleTraversalLabel(value))
|
|
7297
5060
|
}
|
|
7298
|
-
function calibrationStatus(state, value) {
|
|
7299
|
-
if (state?.mode === 'configured') return `当前视图:使用配置上限 / ${Math.round(Number(state.left) || value)} px`
|
|
7300
|
-
if (state?.simulated) return `模拟布局:使用配置上限 / ${value} px`
|
|
7301
|
-
if (state?.mode === 'centered') return `当前视图:自动居中 / 距侧栏 ${Math.round(Number(state.left) || 0)} px`
|
|
7302
|
-
const reasons = {
|
|
7303
|
-
drawer: '抽屉布局', phone: '手机布局', turns: '消息不足', corridor: '会话走廊不足',
|
|
7304
|
-
preview: '会话预览空间不足', unmeasured: '模拟布局',
|
|
7305
|
-
}
|
|
7306
|
-
return `当前视图:隐藏 / ${reasons[state?.reason] || '空间不足'}`
|
|
7307
|
-
}
|
|
7308
5061
|
function setText(node, value) {
|
|
7309
5062
|
if (node && node.textContent !== value) node.textContent = value
|
|
7310
5063
|
}
|
|
7311
|
-
function setCalibrationResizeState(active) {
|
|
7312
|
-
for (const node of [panel, backdrop]) {
|
|
7313
|
-
if (!node || node.hasAttribute('data-prts-resizing') === active) continue
|
|
7314
|
-
node.toggleAttribute('data-prts-resizing', active)
|
|
7315
|
-
}
|
|
7316
|
-
}
|
|
7317
|
-
function cancelCalibrationFrame() {
|
|
7318
|
-
if (calibrationFrame === undefined) return
|
|
7319
|
-
window?.cancelAnimationFrame?.(calibrationFrame)
|
|
7320
|
-
window?.clearTimeout?.(calibrationFrame)
|
|
7321
|
-
calibrationFrame = undefined
|
|
7322
|
-
}
|
|
7323
|
-
function measureScaleCalibration() {
|
|
7324
|
-
calibrationFrame = undefined
|
|
7325
|
-
if (!isOpen) return
|
|
7326
|
-
const viewport = panel?.querySelector?.('[data-prts-scale-calibration-viewport]')
|
|
7327
|
-
const canvas = panel?.querySelector?.('[data-prts-scale-calibration-canvas]')
|
|
7328
|
-
const calibration = panel?.querySelector?.('[data-prts-scale-calibration]')
|
|
7329
|
-
const scaleNote = panel?.querySelector?.('[data-prts-scale-calibration-scale]')
|
|
7330
|
-
if (!viewport || !canvas || !calibration) return
|
|
7331
|
-
const available = calibrationViewportWidth || viewport.clientWidth
|
|
7332
|
-
const factor = available > 0 ? Math.min(1, available / 360) : 1
|
|
7333
|
-
const roundedFactor = Number(factor.toFixed(4))
|
|
7334
|
-
const value = currentScaleDistance()
|
|
7335
|
-
let state
|
|
7336
|
-
try { state = getConversationScalePreview(value) } catch { state = { visible: false, reason: 'unmeasured', mode: 'hidden' } }
|
|
7337
|
-
if (roundedFactor !== calibrationFactor) {
|
|
7338
|
-
calibrationFactor = roundedFactor
|
|
7339
|
-
canvas.style.transform = `scale(${roundedFactor})`
|
|
7340
|
-
viewport.style.height = `${Math.ceil(94 * roundedFactor)}px`
|
|
7341
|
-
}
|
|
7342
|
-
const scaled = factor < .999
|
|
7343
|
-
if (calibration.hasAttribute('data-prts-calibration-scaled') !== scaled) calibration.toggleAttribute('data-prts-calibration-scaled', scaled)
|
|
7344
|
-
if (scaleNote && scaleNote.hidden !== !scaled) scaleNote.hidden = !scaled
|
|
7345
|
-
const mode = state?.simulated ? 'simulated' : state?.mode || 'hidden'
|
|
7346
|
-
const reason = state?.reason || 'unmeasured'
|
|
7347
|
-
if (calibration.dataset.prtsCalibrationMode !== mode) calibration.dataset.prtsCalibrationMode = mode
|
|
7348
|
-
if (calibration.dataset.prtsCalibrationReason !== reason) calibration.dataset.prtsCalibrationReason = reason
|
|
7349
|
-
setText(panel.querySelector('[data-prts-scale-calibration-status]'), calibrationStatus(state, value))
|
|
7350
|
-
}
|
|
7351
|
-
function scheduleCalibrationMeasurement() {
|
|
7352
|
-
if (!isOpen) return
|
|
7353
|
-
cancelCalibrationFrame()
|
|
7354
|
-
calibrationFrame = window?.requestAnimationFrame?.(measureScaleCalibration)
|
|
7355
|
-
?? window?.setTimeout?.(measureScaleCalibration, 16)
|
|
7356
|
-
}
|
|
7357
|
-
function scheduleScalePreviewRefresh(entries = []) {
|
|
7358
|
-
const viewportEntry = entries.find?.(entry => entry.target?.matches?.('[data-prts-scale-calibration-viewport]'))
|
|
7359
|
-
const observedWidth = Number(viewportEntry?.contentRect?.width)
|
|
7360
|
-
if (Number.isFinite(observedWidth) && observedWidth > 0) {
|
|
7361
|
-
calibrationViewportWidth = observedWidth
|
|
7362
|
-
}
|
|
7363
|
-
if (!isOpen) return
|
|
7364
|
-
setCalibrationResizeState(true)
|
|
7365
|
-
if (calibrationSettleTimer !== undefined) window?.clearTimeout?.(calibrationSettleTimer)
|
|
7366
|
-
calibrationSettleTimer = window?.setTimeout?.(() => {
|
|
7367
|
-
calibrationSettleTimer = undefined
|
|
7368
|
-
setCalibrationResizeState(false)
|
|
7369
|
-
renderScaleCalibration()
|
|
7370
|
-
}, 160)
|
|
7371
|
-
}
|
|
7372
|
-
function renderScaleCalibration() {
|
|
7373
|
-
if (!isOpen) return
|
|
7374
|
-
if (!panel || !currentPreferences) return
|
|
7375
|
-
const value = currentScaleDistance()
|
|
7376
|
-
const contrast = currentScaleFocusContrast()
|
|
7377
|
-
const lengths = resolveConversationScaleLengths(contrast)
|
|
7378
|
-
const calibration = panel.querySelector('[data-prts-scale-calibration]')
|
|
7379
|
-
const distanceRange = panel.querySelector('input[data-prts-setting-range][data-prts-setting-key="conversationScaleMaxDistance"]')
|
|
7380
|
-
const contrastRange = panel.querySelector('input[data-prts-setting-range][data-prts-setting-key="conversationScaleFocusContrast"]')
|
|
7381
|
-
const distanceOutput = panel.querySelector('[data-prts-scale-distance-output]')
|
|
7382
|
-
const contrastOutput = panel.querySelector('[data-prts-scale-focus-output]')
|
|
7383
|
-
const calibrationValue = panel.querySelector('[data-prts-scale-calibration-value]')
|
|
7384
|
-
if (distanceRange && distanceRange.value !== String(value)) distanceRange.value = String(value)
|
|
7385
|
-
if (contrastRange && contrastRange.value !== String(contrast)) contrastRange.value = String(contrast)
|
|
7386
|
-
setText(distanceOutput, `${value} px`)
|
|
7387
|
-
setText(contrastOutput, String(contrast))
|
|
7388
|
-
setText(calibrationValue, `${value} px`)
|
|
7389
|
-
for (const tick of panel.querySelectorAll('[data-prts-scale-focus-preview-tick]')) {
|
|
7390
|
-
const length = lengths[Number(tick.dataset.prtsScaleFocusPreviewTick)] ?? lengths.at(-1)
|
|
7391
|
-
const width = `${length}px`
|
|
7392
|
-
if (tick.style.width !== width) tick.style.width = width
|
|
7393
|
-
}
|
|
7394
|
-
const detail = resolveParticleDetail(currentPreferences)
|
|
7395
|
-
const detailLabels = { compact: '精简', standard: '标准', precise: '精细' }
|
|
7396
|
-
const advanced = panel.querySelector('[data-prts-advanced-summary]')
|
|
7397
|
-
setText(advanced, `${detailLabels[detail]} / ${conciseNumber(currentParticleTraversalSpeed())}× / 区分度 ${contrast} / ${value} px`)
|
|
7398
|
-
if (!calibration) return
|
|
7399
|
-
const distance = `${value}px`
|
|
7400
|
-
if (calibration.style.getPropertyValue('--prts-calibration-distance') !== distance) {
|
|
7401
|
-
calibration.style.setProperty('--prts-calibration-distance', distance)
|
|
7402
|
-
}
|
|
7403
|
-
scheduleCalibrationMeasurement()
|
|
7404
|
-
}
|
|
7405
|
-
function commitScaleDistance() {
|
|
7406
|
-
if (!scaleDistanceDirty || !currentPreferences) return false
|
|
7407
|
-
const value = currentScaleDistance()
|
|
7408
|
-
scaleDistanceDirty = false
|
|
7409
|
-
scaleDistanceDraft = value
|
|
7410
|
-
if (value !== normalizeScaleDistance(currentPreferences.conversationScaleMaxDistance)) onPreferenceChange('conversationScaleMaxDistance', value)
|
|
7411
|
-
else renderScaleCalibration()
|
|
7412
|
-
return true
|
|
7413
|
-
}
|
|
7414
|
-
function commitScaleFocusContrast() {
|
|
7415
|
-
if (!scaleFocusContrastDirty || !currentPreferences) return false
|
|
7416
|
-
const value = currentScaleFocusContrast()
|
|
7417
|
-
scaleFocusContrastDirty = false
|
|
7418
|
-
scaleFocusContrastDraft = value
|
|
7419
|
-
if (value !== normalizeScaleFocusContrast(currentPreferences.conversationScaleFocusContrast)) onPreferenceChange('conversationScaleFocusContrast', value)
|
|
7420
|
-
else renderScaleCalibration()
|
|
7421
|
-
return true
|
|
7422
|
-
}
|
|
7423
5064
|
function commitParticleTraversalSpeed() {
|
|
7424
5065
|
if (!particleTraversalSpeedDirty || !currentPreferences) return false
|
|
7425
5066
|
const value = currentParticleTraversalSpeed()
|
|
@@ -7471,11 +5112,8 @@ const transparency = panel.querySelector('[data-prts-transparency-status]')
|
|
|
7471
5112
|
if (transparency) transparency.hidden = !(currentPreferences.glass !== 'off' && transparencyMedia?.matches)
|
|
7472
5113
|
const particleError = panel.querySelector('[data-prts-particle-error]')
|
|
7473
5114
|
if (particleError) particleError.hidden = currentStatus?.particle?.phase !== 'error'
|
|
7474
|
-
if (!scaleDistanceDirty) scaleDistanceDraft = normalizeScaleDistance(currentPreferences.conversationScaleMaxDistance)
|
|
7475
|
-
if (!scaleFocusContrastDirty) scaleFocusContrastDraft = normalizeScaleFocusContrast(currentPreferences.conversationScaleFocusContrast)
|
|
7476
5115
|
if (!particleTraversalSpeedDirty) particleTraversalSpeedDraft = normalizeParticleTraversalSpeed(currentPreferences.particleTraversalSpeed)
|
|
7477
5116
|
renderParticleTraversal()
|
|
7478
|
-
renderScaleCalibration()
|
|
7479
5117
|
renderPersistence()
|
|
7480
5118
|
}
|
|
7481
5119
|
function markFeedback(target) {
|
|
@@ -7505,10 +5143,6 @@ if (target.hasAttribute('data-prts-retry-save')) { onRetrySave(); return }
|
|
|
7505
5143
|
if (target.hasAttribute('data-prts-reset-visual')) { setResetConfirmation(true); return }
|
|
7506
5144
|
if (target.hasAttribute('data-prts-reset-cancel')) { setResetConfirmation(false); return }
|
|
7507
5145
|
if (target.hasAttribute('data-prts-reset-confirm-action')) {
|
|
7508
|
-
scaleDistanceDirty = false
|
|
7509
|
-
scaleDistanceDraft = undefined
|
|
7510
|
-
scaleFocusContrastDirty = false
|
|
7511
|
-
scaleFocusContrastDraft = undefined
|
|
7512
5146
|
particleTraversalSpeedDirty = false
|
|
7513
5147
|
particleTraversalSpeedDraft = undefined
|
|
7514
5148
|
setResetConfirmation(false)
|
|
@@ -7520,13 +5154,7 @@ const target = event.target
|
|
|
7520
5154
|
if (!target?.matches?.('input[data-prts-setting-range]')) return
|
|
7521
5155
|
const value = Number(target.value)
|
|
7522
5156
|
if (!Number.isFinite(value)) return
|
|
7523
|
-
if (target.dataset.prtsSettingKey === '
|
|
7524
|
-
scaleDistanceDraft = value
|
|
7525
|
-
scaleDistanceDirty = true
|
|
7526
|
-
} else if (target.dataset.prtsSettingKey === 'conversationScaleFocusContrast') {
|
|
7527
|
-
scaleFocusContrastDraft = value
|
|
7528
|
-
scaleFocusContrastDirty = true
|
|
7529
|
-
} else if (target.dataset.prtsSettingKey === 'particleTraversalSpeed') {
|
|
5157
|
+
if (target.dataset.prtsSettingKey === 'particleTraversalSpeed') {
|
|
7530
5158
|
particleTraversalSpeedDraft = normalizeParticleTraversalSpeed(value)
|
|
7531
5159
|
particleTraversalSpeedDirty = true
|
|
7532
5160
|
renderParticleTraversal()
|
|
@@ -7535,7 +5163,6 @@ return
|
|
|
7535
5163
|
} else {
|
|
7536
5164
|
return
|
|
7537
5165
|
}
|
|
7538
|
-
renderScaleCalibration()
|
|
7539
5166
|
}
|
|
7540
5167
|
function onKeydown(event) {
|
|
7541
5168
|
if (!isOpen) return
|
|
@@ -7555,8 +5182,6 @@ const renderMediaState = () => renderState()
|
|
|
7555
5182
|
const commitFromControl = event => {
|
|
7556
5183
|
const target = event.target
|
|
7557
5184
|
if (!target?.matches?.('input[data-prts-setting-range]')) return
|
|
7558
|
-
if (target.dataset.prtsSettingKey === 'conversationScaleMaxDistance') commitScaleDistance()
|
|
7559
|
-
if (target.dataset.prtsSettingKey === 'conversationScaleFocusContrast') commitScaleFocusContrast()
|
|
7560
5185
|
if (target.dataset.prtsSettingKey === 'particleTraversalSpeed') commitParticleTraversalSpeed()
|
|
7561
5186
|
}
|
|
7562
5187
|
trigger?.addEventListener('click', toggle)
|
|
@@ -7570,23 +5195,14 @@ backdrop?.addEventListener('click', closeFromBackdrop)
|
|
|
7570
5195
|
document.addEventListener('keydown', onKeydown)
|
|
7571
5196
|
transparencyMedia?.addEventListener?.('change', renderMediaState)
|
|
7572
5197
|
motionMedia?.addEventListener?.('change', renderMediaState)
|
|
7573
|
-
if (typeof window?.ResizeObserver === 'function') {
|
|
7574
|
-
calibrationResizeObserver = new window.ResizeObserver(scheduleScalePreviewRefresh)
|
|
7575
|
-
const viewport = panel?.querySelector?.('[data-prts-scale-calibration-viewport]')
|
|
7576
|
-
if (viewport) calibrationResizeObserver.observe(viewport)
|
|
7577
|
-
}
|
|
7578
5198
|
return {
|
|
7579
5199
|
update(preferences, status, persistenceState = currentPersistence) {
|
|
7580
5200
|
currentPreferences = preferences
|
|
7581
5201
|
currentStatus = status
|
|
7582
5202
|
currentPersistence = persistenceState ?? { phase: 'idle', revision: 0 }
|
|
7583
|
-
if (!scaleDistanceDirty) scaleDistanceDraft = normalizeScaleDistance(preferences?.conversationScaleMaxDistance)
|
|
7584
|
-
if (!scaleFocusContrastDirty) scaleFocusContrastDraft = normalizeScaleFocusContrast(preferences?.conversationScaleFocusContrast)
|
|
7585
5203
|
if (!particleTraversalSpeedDirty) particleTraversalSpeedDraft = normalizeParticleTraversalSpeed(preferences?.particleTraversalSpeed)
|
|
7586
5204
|
renderState()
|
|
7587
5205
|
},
|
|
7588
|
-
refreshScalePreview: renderScaleCalibration,
|
|
7589
|
-
scheduleScalePreviewRefresh,
|
|
7590
5206
|
open: () => setOpen(true),
|
|
7591
5207
|
close: () => setOpen(false),
|
|
7592
5208
|
toggle,
|
|
@@ -7595,10 +5211,6 @@ isOpen = false
|
|
|
7595
5211
|
hidePanel()
|
|
7596
5212
|
if (savedTimer !== undefined) window?.clearTimeout?.(savedTimer)
|
|
7597
5213
|
if (feedbackTimer !== undefined) window?.clearTimeout?.(feedbackTimer)
|
|
7598
|
-
if (calibrationSettleTimer !== undefined) window?.clearTimeout?.(calibrationSettleTimer)
|
|
7599
|
-
calibrationSettleTimer = undefined
|
|
7600
|
-
cancelCalibrationFrame()
|
|
7601
|
-
setCalibrationResizeState(false)
|
|
7602
5214
|
feedbackTarget?.removeAttribute?.('data-prts-setting-feedback')
|
|
7603
5215
|
trigger?.setAttribute('aria-expanded', 'false')
|
|
7604
5216
|
trigger?.removeEventListener('click', toggle)
|
|
@@ -7612,7 +5224,6 @@ backdrop?.removeEventListener('click', closeFromBackdrop)
|
|
|
7612
5224
|
document.removeEventListener('keydown', onKeydown)
|
|
7613
5225
|
transparencyMedia?.removeEventListener?.('change', renderMediaState)
|
|
7614
5226
|
motionMedia?.removeEventListener?.('change', renderMediaState)
|
|
7615
|
-
calibrationResizeObserver?.disconnect()
|
|
7616
5227
|
document.documentElement.removeAttribute('data-prts-settings-open')
|
|
7617
5228
|
},
|
|
7618
5229
|
}
|
|
@@ -7644,6 +5255,11 @@ setActive(false)
|
|
|
7644
5255
|
}
|
|
7645
5256
|
function onResize() {
|
|
7646
5257
|
if (!started) return
|
|
5258
|
+
if (Number(window?.innerWidth) <= 640) {
|
|
5259
|
+
clearTimer()
|
|
5260
|
+
setActive(false)
|
|
5261
|
+
return
|
|
5262
|
+
}
|
|
7647
5263
|
setActive(true)
|
|
7648
5264
|
clearTimer()
|
|
7649
5265
|
settleTimer = window?.setTimeout?.(settle, settleDelay)
|
|
@@ -7676,6 +5292,11 @@ dispose,
|
|
|
7676
5292
|
}
|
|
7677
5293
|
}
|
|
7678
5294
|
|
|
5295
|
+
const PHONE_RAIL_BREAKPOINT = 640
|
|
5296
|
+
const RAIL_HOLD_DELAY_MS = 350
|
|
5297
|
+
const RAIL_HOLD_MOVE_TOLERANCE = 8
|
|
5298
|
+
const RAIL_SWIPE_THRESHOLD = 32
|
|
5299
|
+
const RAIL_SWIPE_AXIS_RATIO = 1.25
|
|
7679
5300
|
function setText(root, selector, value) {
|
|
7680
5301
|
const node = root?.querySelector(selector)
|
|
7681
5302
|
const next = String(value ?? '')
|
|
@@ -7683,7 +5304,7 @@ if (node && node.textContent !== next) node.textContent = next
|
|
|
7683
5304
|
}
|
|
7684
5305
|
function markup(emblem) {
|
|
7685
5306
|
return `<div data-prts-shell data-plugin="dsh-theme-prts">
|
|
7686
|
-
<button type="button" data-prts-rail-launcher aria-label="打开 P.R.T.S. 导航" aria-controls="prts-nav-rail" aria-expanded="false"><span aria-hidden="true">P.R.T.S.</span></button>
|
|
5307
|
+
<button type="button" data-prts-rail-launcher aria-label="打开 P.R.T.S. 导航" aria-controls="prts-nav-rail" aria-expanded="false"><span aria-hidden="true">P.R.T.S.</span><i data-prts-rail-gesture-cue aria-hidden="true">⌄<br>⌄</i></button>
|
|
7687
5308
|
<nav id="prts-nav-rail" data-prts-nav-rail aria-label="P.R.T.S. 导航">
|
|
7688
5309
|
<button type="button" data-prts-rail-brand aria-label="P.R.T.S. 终端设置" aria-controls="prts-theme-settings" aria-expanded="false">${emblem || ''}<span>P.R.T.S.</span></button>
|
|
7689
5310
|
<div data-prts-nav-bottom>
|
|
@@ -7713,7 +5334,6 @@ onThemeDisable = () => {},
|
|
|
7713
5334
|
onPreferenceChange = () => {},
|
|
7714
5335
|
onPreferencePreview = () => {},
|
|
7715
5336
|
onVisualReset = () => {},
|
|
7716
|
-
getConversationScalePreview = () => ({ visible: false, reason: 'unmeasured', mode: 'hidden' }),
|
|
7717
5337
|
onRetrySave = () => {},
|
|
7718
5338
|
}) {
|
|
7719
5339
|
const root = document.documentElement
|
|
@@ -7725,6 +5345,10 @@ let railMode
|
|
|
7725
5345
|
let railViewport
|
|
7726
5346
|
let railDefaultHidden = false
|
|
7727
5347
|
let railViewportQuery
|
|
5348
|
+
let railPointerQuery
|
|
5349
|
+
let railHoverQuery
|
|
5350
|
+
let railPointer
|
|
5351
|
+
let railHoldTimer
|
|
7728
5352
|
let settingsOverlay
|
|
7729
5353
|
let schemeToggle
|
|
7730
5354
|
let schemeIntent
|
|
@@ -7743,6 +5367,81 @@ function reducedMotion() {
|
|
|
7743
5367
|
if (root.dataset.prtsMotion === 'reduced') return true
|
|
7744
5368
|
try { return window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches === true } catch { return false }
|
|
7745
5369
|
}
|
|
5370
|
+
function phoneRailGesture() {
|
|
5371
|
+
if (railMode !== 'overlay' || Number(window.innerWidth) > PHONE_RAIL_BREAKPOINT) return false
|
|
5372
|
+
return railPointerQuery?.matches === true
|
|
5373
|
+
|| railHoverQuery?.matches === true
|
|
5374
|
+
|| Number(window.navigator?.maxTouchPoints) > 0
|
|
5375
|
+
}
|
|
5376
|
+
function clearRailGesture({ release = true } = {}) {
|
|
5377
|
+
if (railHoldTimer !== undefined) window.clearTimeout(railHoldTimer)
|
|
5378
|
+
railHoldTimer = undefined
|
|
5379
|
+
const pointer = railPointer
|
|
5380
|
+
railPointer = undefined
|
|
5381
|
+
if (release && pointer) {
|
|
5382
|
+
try { railLauncher?.releasePointerCapture?.(pointer.pointerId) } catch {}
|
|
5383
|
+
}
|
|
5384
|
+
railLauncher?.removeAttribute('data-prts-rail-gesture-active')
|
|
5385
|
+
railLauncher?.removeAttribute('data-prts-rail-gesture-ready')
|
|
5386
|
+
railLauncher?.style?.removeProperty('--prts-rail-gesture-progress')
|
|
5387
|
+
}
|
|
5388
|
+
function armRailGesture() {
|
|
5389
|
+
railHoldTimer = undefined
|
|
5390
|
+
if (!railPointer || !phoneRailGesture()) return
|
|
5391
|
+
railPointer.armed = true
|
|
5392
|
+
railLauncher?.setAttribute('data-prts-rail-gesture-active', '')
|
|
5393
|
+
}
|
|
5394
|
+
function onRailPointerDown(event) {
|
|
5395
|
+
if (!phoneRailGesture() || railPointer || (event.button ?? 0) !== 0) return
|
|
5396
|
+
const pointerId = event.pointerId ?? 1
|
|
5397
|
+
railPointer = {
|
|
5398
|
+
pointerId,
|
|
5399
|
+
startX: Number(event.clientX) || 0,
|
|
5400
|
+
startY: Number(event.clientY) || 0,
|
|
5401
|
+
armed: false,
|
|
5402
|
+
ready: false,
|
|
5403
|
+
}
|
|
5404
|
+
try { railLauncher?.setPointerCapture?.(pointerId) } catch {}
|
|
5405
|
+
railHoldTimer = window.setTimeout(armRailGesture, RAIL_HOLD_DELAY_MS)
|
|
5406
|
+
}
|
|
5407
|
+
function onRailPointerMove(event) {
|
|
5408
|
+
const pointer = railPointer
|
|
5409
|
+
if (!pointer || (event.pointerId ?? 1) !== pointer.pointerId) return
|
|
5410
|
+
const deltaX = (Number(event.clientX) || 0) - pointer.startX
|
|
5411
|
+
const deltaY = (Number(event.clientY) || 0) - pointer.startY
|
|
5412
|
+
if (!pointer.armed) {
|
|
5413
|
+
if (Math.hypot(deltaX, deltaY) > RAIL_HOLD_MOVE_TOLERANCE) clearRailGesture()
|
|
5414
|
+
return
|
|
5415
|
+
}
|
|
5416
|
+
event.preventDefault?.()
|
|
5417
|
+
if (Math.abs(deltaX) > Math.max(RAIL_HOLD_MOVE_TOLERANCE, Math.max(0, deltaY) / RAIL_SWIPE_AXIS_RATIO)) {
|
|
5418
|
+
clearRailGesture()
|
|
5419
|
+
return
|
|
5420
|
+
}
|
|
5421
|
+
const progress = Math.min(1, Math.max(0, deltaY) / RAIL_SWIPE_THRESHOLD)
|
|
5422
|
+
pointer.ready = deltaY >= RAIL_SWIPE_THRESHOLD
|
|
5423
|
+
&& deltaY >= Math.abs(deltaX) * RAIL_SWIPE_AXIS_RATIO
|
|
5424
|
+
railLauncher?.style?.setProperty('--prts-rail-gesture-progress', Math.round(progress * 12) + 'px')
|
|
5425
|
+
railLauncher?.toggleAttribute('data-prts-rail-gesture-ready', pointer.ready)
|
|
5426
|
+
}
|
|
5427
|
+
function onRailPointerUp(event) {
|
|
5428
|
+
const pointer = railPointer
|
|
5429
|
+
if (!pointer || (event.pointerId ?? 1) !== pointer.pointerId) return
|
|
5430
|
+
const shouldOpen = pointer.armed && pointer.ready
|
|
5431
|
+
clearRailGesture()
|
|
5432
|
+
if (shouldOpen) openRail()
|
|
5433
|
+
}
|
|
5434
|
+
function onRailLostPointerCapture(event) {
|
|
5435
|
+
if (!railPointer || (event.pointerId ?? 1) !== railPointer.pointerId) return
|
|
5436
|
+
clearRailGesture({ release: false })
|
|
5437
|
+
}
|
|
5438
|
+
function onRailClick(event) {
|
|
5439
|
+
if (phoneRailGesture() && Number(event?.detail) > 0) {
|
|
5440
|
+
event.preventDefault?.()
|
|
5441
|
+
return
|
|
5442
|
+
}
|
|
5443
|
+
toggleRail()
|
|
5444
|
+
}
|
|
7746
5445
|
function playSchemePress() {
|
|
7747
5446
|
if (!schemeToggle || reducedMotion()) return
|
|
7748
5447
|
const revision = ++schemePressRevision
|
|
@@ -7794,7 +5493,6 @@ const candidate = operationRegion.querySelector(
|
|
|
7794
5493
|
)
|
|
7795
5494
|
const active = Boolean(candidate)
|
|
7796
5495
|
root.dataset.prtsConversationState = active ? 'active' : 'idle'
|
|
7797
|
-
settingsOverlay?.refreshScalePreview()
|
|
7798
5496
|
}
|
|
7799
5497
|
function toggleScheme(event) {
|
|
7800
5498
|
if (suppressSchemeClick) {
|
|
@@ -7910,7 +5608,8 @@ if (!navRail || !railLauncher) return
|
|
|
7910
5608
|
const overlay = railMode === 'overlay'
|
|
7911
5609
|
const open = overlay && root.hasAttribute('data-prts-rail-open')
|
|
7912
5610
|
railLauncher.setAttribute('aria-expanded', String(open))
|
|
7913
|
-
|
|
5611
|
+
const closedLabel = phoneRailGesture() ? '长按并向下滑动打开 P.R.T.S. 导航' : '打开 P.R.T.S. 导航'
|
|
5612
|
+
railLauncher.setAttribute('aria-label', open ? '关闭 P.R.T.S. 导航' : closedLabel)
|
|
7914
5613
|
if (overlay && !open) {
|
|
7915
5614
|
navRail.setAttribute('aria-hidden', 'true')
|
|
7916
5615
|
navRail.setAttribute('inert', '')
|
|
@@ -7944,6 +5643,7 @@ const modeChanged = nextMode !== railMode
|
|
|
7944
5643
|
if (!viewportChanged && !modeChanged && !forceClose) return railMode
|
|
7945
5644
|
railViewport = nextViewport
|
|
7946
5645
|
railMode = nextMode
|
|
5646
|
+
clearRailGesture()
|
|
7947
5647
|
root.dataset.prtsRailMode = nextMode
|
|
7948
5648
|
root.removeAttribute('data-prts-rail-open')
|
|
7949
5649
|
syncRailState()
|
|
@@ -7966,12 +5666,17 @@ if (navRail?.contains?.(event.target) || railLauncher?.contains?.(event.target)
|
|
|
7966
5666
|
closeRail()
|
|
7967
5667
|
}
|
|
7968
5668
|
function onResponsiveChange() {
|
|
5669
|
+
clearRailGesture()
|
|
7969
5670
|
setRailViewport(window.innerWidth)
|
|
7970
|
-
|
|
5671
|
+
syncRailState()
|
|
7971
5672
|
}
|
|
7972
5673
|
function bindResponsiveQueries() {
|
|
7973
5674
|
railViewportQuery = window.matchMedia?.('(min-width: 1180px)')
|
|
5675
|
+
railPointerQuery = window.matchMedia?.('(pointer: coarse)')
|
|
5676
|
+
railHoverQuery = window.matchMedia?.('(hover: none)')
|
|
7974
5677
|
railViewportQuery?.addEventListener?.('change', onResponsiveChange)
|
|
5678
|
+
railPointerQuery?.addEventListener?.('change', onResponsiveChange)
|
|
5679
|
+
railHoverQuery?.addEventListener?.('change', onResponsiveChange)
|
|
7975
5680
|
}
|
|
7976
5681
|
function disableTheme() { onThemeDisable() }
|
|
7977
5682
|
function mount() {
|
|
@@ -8000,7 +5705,6 @@ onPreferenceChange,
|
|
|
8000
5705
|
onPreferencePreview,
|
|
8001
5706
|
onResetVisual: onVisualReset,
|
|
8002
5707
|
onRetrySave,
|
|
8003
|
-
getConversationScalePreview,
|
|
8004
5708
|
})
|
|
8005
5709
|
resizeShield.start([
|
|
8006
5710
|
operationRegion,
|
|
@@ -8011,7 +5715,12 @@ conversationObserver = new window.MutationObserver(syncConversationState)
|
|
|
8011
5715
|
conversationObserver.observe(operationRegion, { childList: true, subtree: true, attributes: true, attributeFilter: ['hidden', 'data-chat-flow-kind', 'data-message-role'] })
|
|
8012
5716
|
schemeObserver = new window.MutationObserver(syncSchemeToggle)
|
|
8013
5717
|
schemeObserver.observe(root, { attributes: true, attributeFilter: ['data-prts-scheme'] })
|
|
8014
|
-
railLauncher.addEventListener('click',
|
|
5718
|
+
railLauncher.addEventListener('click', onRailClick)
|
|
5719
|
+
railLauncher.addEventListener('pointerdown', onRailPointerDown)
|
|
5720
|
+
railLauncher.addEventListener('pointermove', onRailPointerMove)
|
|
5721
|
+
railLauncher.addEventListener('pointerup', onRailPointerUp)
|
|
5722
|
+
railLauncher.addEventListener('pointercancel', clearRailGesture)
|
|
5723
|
+
railLauncher.addEventListener('lostpointercapture', onRailLostPointerCapture)
|
|
8015
5724
|
document.addEventListener('keydown', onRailKeydown)
|
|
8016
5725
|
document.addEventListener('click', onDocumentClick)
|
|
8017
5726
|
schemeToggle.addEventListener('click', toggleScheme)
|
|
@@ -8027,10 +5736,16 @@ syncSchemeToggle()
|
|
|
8027
5736
|
return true
|
|
8028
5737
|
}
|
|
8029
5738
|
function dispose() {
|
|
5739
|
+
clearRailGesture()
|
|
8030
5740
|
cancelSchemePointer()
|
|
8031
5741
|
clearSchemeClickSuppression()
|
|
8032
5742
|
clearSchemePressDelays()
|
|
8033
|
-
railLauncher?.removeEventListener('click',
|
|
5743
|
+
railLauncher?.removeEventListener('click', onRailClick)
|
|
5744
|
+
railLauncher?.removeEventListener('pointerdown', onRailPointerDown)
|
|
5745
|
+
railLauncher?.removeEventListener('pointermove', onRailPointerMove)
|
|
5746
|
+
railLauncher?.removeEventListener('pointerup', onRailPointerUp)
|
|
5747
|
+
railLauncher?.removeEventListener('pointercancel', clearRailGesture)
|
|
5748
|
+
railLauncher?.removeEventListener('lostpointercapture', onRailLostPointerCapture)
|
|
8034
5749
|
document.removeEventListener('keydown', onRailKeydown)
|
|
8035
5750
|
document.removeEventListener('click', onDocumentClick)
|
|
8036
5751
|
schemeToggle?.removeEventListener('click', toggleScheme)
|
|
@@ -8042,7 +5757,11 @@ schemeToggle?.removeEventListener('lostpointercapture', onSchemeLostPointerCaptu
|
|
|
8042
5757
|
window.removeEventListener?.('blur', cancelSchemePointer)
|
|
8043
5758
|
themeDisable?.removeEventListener('click', disableTheme)
|
|
8044
5759
|
railViewportQuery?.removeEventListener?.('change', onResponsiveChange)
|
|
5760
|
+
railPointerQuery?.removeEventListener?.('change', onResponsiveChange)
|
|
5761
|
+
railHoverQuery?.removeEventListener?.('change', onResponsiveChange)
|
|
8045
5762
|
railViewportQuery = undefined
|
|
5763
|
+
railPointerQuery = undefined
|
|
5764
|
+
railHoverQuery = undefined
|
|
8046
5765
|
resizeShield.dispose()
|
|
8047
5766
|
settingsOverlay?.dispose()
|
|
8048
5767
|
conversationObserver?.disconnect()
|
|
@@ -8136,10 +5855,8 @@ onTransitionStateChange(active) {
|
|
|
8136
5855
|
particleField.setSchemeTransitionActive(active)
|
|
8137
5856
|
},
|
|
8138
5857
|
})
|
|
8139
|
-
const sessions = contextService(ctx, 'sessions')
|
|
8140
5858
|
const toBottom = createToBottomAdapter({ document, window })
|
|
8141
5859
|
const conversationControls = createConversationControlAdapter({ document, window })
|
|
8142
|
-
const conversationScale = createConversationScaleAdapter({ document, window, sessions })
|
|
8143
5860
|
const layoutDiagnostics = createLayoutStabilityDiagnostics({ document, window })
|
|
8144
5861
|
const sidebarControls = createSidebarControlAdapter({ document, window })
|
|
8145
5862
|
const floatingGlass = createFloatingGlassAdapter({ document, window })
|
|
@@ -8213,7 +5930,6 @@ assistantGlass.dispose()
|
|
|
8213
5930
|
particleField.update({ ...preferences, enabled: false })
|
|
8214
5931
|
toBottom.dispose()
|
|
8215
5932
|
conversationControls.dispose()
|
|
8216
|
-
conversationScale.dispose()
|
|
8217
5933
|
layoutDiagnostics.dispose()
|
|
8218
5934
|
sidebarControls.dispose()
|
|
8219
5935
|
floatingGlass.dispose()
|
|
@@ -8253,9 +5969,6 @@ bootAnimation: preferences.bootAnimation,
|
|
|
8253
5969
|
onRetrySave() {
|
|
8254
5970
|
retryPersistence()
|
|
8255
5971
|
},
|
|
8256
|
-
getConversationScalePreview(value) {
|
|
8257
|
-
return conversationScale.getCalibrationState(value)
|
|
8258
|
-
},
|
|
8259
5972
|
})
|
|
8260
5973
|
if (!operations.update(preferences, status, settingsPersistence)) {
|
|
8261
5974
|
if (!mountWarningIssued) {
|
|
@@ -8275,8 +5988,6 @@ composerGlass.start()
|
|
|
8275
5988
|
assistantGlass.start()
|
|
8276
5989
|
toBottom.start()
|
|
8277
5990
|
conversationControls.start()
|
|
8278
|
-
conversationScale.update(preferences)
|
|
8279
|
-
conversationScale.start()
|
|
8280
5991
|
layoutDiagnostics.start()
|
|
8281
5992
|
sidebarControls.start()
|
|
8282
5993
|
floatingGlass.start()
|
|
@@ -8369,7 +6080,6 @@ assistantGlass.dispose()
|
|
|
8369
6080
|
particleField.dispose()
|
|
8370
6081
|
toBottom.dispose()
|
|
8371
6082
|
conversationControls.dispose()
|
|
8372
|
-
conversationScale.dispose()
|
|
8373
6083
|
layoutDiagnostics.dispose()
|
|
8374
6084
|
sidebarControls.dispose()
|
|
8375
6085
|
floatingGlass.dispose()
|
|
@@ -8412,7 +6122,7 @@ inject: injectActions,
|
|
|
8412
6122
|
}
|
|
8413
6123
|
function apply(ctx) {
|
|
8414
6124
|
const React = require('react')
|
|
8415
|
-
const { defineStore } = require('@deepseek-ai/dsh-client-
|
|
6125
|
+
const { defineStore } = require('@deepseek-ai/dsh-client-store')
|
|
8416
6126
|
applyPrtsPlugin(ctx, {
|
|
8417
6127
|
document,
|
|
8418
6128
|
window,
|