@linxin666/dsh-remote-web-ui 0.3.17 → 0.3.19

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/lib/client.js CHANGED
@@ -1376,7 +1376,7 @@ window.__ModuleLoader__.load({
1376
1376
  }
1377
1377
  //#endregion
1378
1378
  //#region \0dsh-css:packages/dsh-remote-web-ui/src/client/remote.module.css.mjs
1379
- const css$1 = ".fThDlq_overlay{z-index:1000;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.fThDlq_mask{background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);position:absolute;inset:0}.fThDlq_trigger{width:36px;height:36px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,box-shadow .12s;display:inline-flex;position:relative}.fThDlq_trigger[data-update-available]{color:var(--dsw-alias-brand-primary)}.fThDlq_trigger[data-update-available]:after{box-sizing:border-box;border:2px solid var(--dsw-alias-bg-layer-1);background:var(--dsw-alias-brand-primary);content:\"\";pointer-events:none;border-radius:50%;width:8px;height:8px;position:absolute;top:4px;right:4px}.fThDlq_trigger[data-wide=wide]{border-radius:999px;flex:auto;justify-content:flex-start;gap:8px;width:auto;min-width:0;padding:0 10px}.fThDlq_trigger[data-update-available][data-wide=wide]{flex:none;gap:6px}.fThDlq_trigger[data-update-available][data-wide=wide]:after{display:none}.fThDlq_updateBadgeText{white-space:nowrap;font-size:13px;font-weight:500;line-height:1}.fThDlq_trigger:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.fThDlq_trigger:active:not(:disabled){background:var(--dsw-alias-interactive-bg-active)}.fThDlq_trigger:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-2), 0 0 0 4px var(--dsw-alias-brand-primary);outline:none}.fThDlq_trigger:disabled{opacity:.5;cursor:default}.fThDlq_panel{z-index:1;box-sizing:border-box;background:var(--dsw-alias-bg-layer-2);width:560px;max-width:calc(100vw - 48px);max-height:calc(100vh - 48px);box-shadow:var(--dsw-shadow-lv3);color:var(--dsw-alias-label-primary);border-radius:24px;flex-direction:column;gap:14px;padding:24px;font-size:14px;line-height:22px;display:flex;position:relative;overflow:auto}.fThDlq_header{align-items:flex-start;gap:12px;display:flex}.fThDlq_heading{flex:1;min-width:0}.fThDlq_title{margin:0;font-size:18px;font-weight:600;line-height:26px}.fThDlq_subtitle{color:var(--dsw-alias-label-secondary);margin:4px 0 0;font-size:13px}.fThDlq_close{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,box-shadow .12s;display:inline-flex}.fThDlq_close:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_close:active:not(:disabled){background:var(--dsw-alias-interactive-bg-active)}.fThDlq_close:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-2), 0 0 0 4px var(--dsw-alias-brand-primary);outline:none}.fThDlq_close:disabled{opacity:.5;cursor:default}.fThDlq_card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;align-items:center;gap:12px;padding:16px;display:flex}.fThDlq_cardHeader{justify-content:space-between;align-items:center;gap:12px;width:100%;display:flex}.fThDlq_cardTitle{font-weight:500}.fThDlq_badge{white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:6px;min-width:0;padding:2px 10px;font-size:12px;line-height:18px;display:inline-flex}.fThDlq_badge:before{content:\"\";background:currentColor;border-radius:50%;width:8px;height:8px}.fThDlq_badge-waiting{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_badge-connected{color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_badge-disconnected{color:var(--dsw-alias-state-warn-primary);background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_badge-stopped{color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_badgePublic{color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_badges{flex:none;align-items:center;gap:6px;display:inline-flex}.fThDlq_qrWrap{background:var(--dsw-alias-bg-base);border-radius:12px;justify-content:center;align-items:center;padding:12px;display:flex}.fThDlq_qr{display:block}.fThDlq_expired{color:var(--dsw-alias-state-error-primary);margin:0;font-size:13px}.fThDlq_expiry{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px}.fThDlq_hint{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px}.fThDlq_link{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-caption);font-family:var(--dsw-font-mono,ui-monospace, monospace);margin:0;font-size:12px;display:block;overflow:hidden}.fThDlq_pairLinks{flex-direction:column;gap:8px;display:flex}.fThDlq_pairLinkRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:10px;align-items:center;gap:10px;min-width:0;padding:10px 12px;display:flex}.fThDlq_pairLinkText{flex:1;min-width:0}.fThDlq_pairLinkLabel{color:var(--dsw-alias-label-secondary);margin-bottom:3px;font-size:12px;display:block}.fThDlq_copyLink{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;flex:none;align-items:center;gap:5px;padding:0 10px;display:inline-flex}.fThDlq_oneTimeHint{color:var(--dsw-alias-label-caption);margin:0;font-size:12px}.fThDlq_stoppedHint{color:var(--dsw-alias-state-error-primary);margin:0;font-size:13px}.fThDlq_tunnelNote{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px}.fThDlq_tunnelFailed{color:var(--dsw-alias-state-error-primary);margin:0;font-size:13px}.fThDlq_actions{gap:8px;display:flex}.fThDlq_action{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);height:34px;color:var(--dsw-alias-label-primary);cursor:pointer;white-space:nowrap;border-radius:10px;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:13px;transition:background-color .12s,border-color .12s,box-shadow .12s;display:inline-flex}.fThDlq_action:hover:not(:disabled){background:var(--dsw-alias-button-floating-hover)}.fThDlq_action:active:not(:disabled){background:var(--dsw-alias-interactive-bg-active)}.fThDlq_action:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-2), 0 0 0 4px var(--dsw-alias-brand-primary);outline:none}.fThDlq_action:disabled{opacity:.5;cursor:default}.fThDlq_banner{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:16px;padding:16px}.fThDlq_bannerTitle{color:var(--dsw-alias-state-warn-primary);margin:0;font-weight:500}.fThDlq_bannerHint{color:var(--dsw-alias-label-secondary);margin:6px 0 0;font-size:13px}.fThDlq_fencePage{z-index:2000;box-sizing:border-box;background:var(--dsw-alias-bg-base);text-align:center;flex-direction:column;justify-content:center;align-items:center;padding:40px 24px;display:flex;position:fixed;inset:0;overflow:auto}.fThDlq_fenceCard{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:min(520px,100%);box-shadow:var(--dsw-shadow-lv3);text-align:center;border-radius:20px;margin-inline:auto;padding:36px 40px}.fThDlq_fenceMark{background:var(--dsw-alias-state-error-secondary);width:44px;height:44px;color:var(--dsw-alias-state-error-primary);border-radius:50%;place-items:center;margin-inline:auto;font-size:24px;line-height:1;display:grid}.fThDlq_fenceEyebrow{color:var(--dsw-alias-state-error-primary);margin:22px 0 8px;font-size:13px;font-weight:600}.fThDlq_fenceTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:24px;line-height:1.35}.fThDlq_fenceDetail{color:var(--dsw-alias-label-secondary);margin:12px 0 0;font-size:14px;line-height:1.65}.fThDlq_fenceSteps{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);text-align:left;border-radius:12px;margin:24px auto 0;padding:20px 20px 20px 42px;font-size:14px;line-height:1.65}.fThDlq_fenceSteps li+li{margin-top:8px}.fThDlq_fenceForm{width:100%;margin-top:20px}.fThDlq_fenceInputRow{gap:8px;width:100%;display:flex}.fThDlq_fenceInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);min-width:0;color:var(--dsw-alias-label-primary);font:inherit;border-radius:10px;flex:1;padding:10px 14px;font-size:13px;transition:border-color .12s,box-shadow .12s}.fThDlq_fenceInput:focus{border-color:var(--dsw-alias-brand-primary);outline:none;box-shadow:0 0 0 2px #0066ff26}.fThDlq_fencePairButton{border:1px solid var(--dsw-alias-brand-primary);background:var(--dsw-alias-brand-primary);color:#fff;font:inherit;cursor:pointer;border-radius:10px;flex-shrink:0;padding:10px 18px;font-size:13px;font-weight:500;transition:filter .12s,opacity .12s}.fThDlq_fencePairButton:hover:not(:disabled){filter:brightness(.96)}.fThDlq_fencePairButton:disabled{opacity:.55;cursor:not-allowed}.fThDlq_fencePairButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.fThDlq_fenceError{color:var(--dsw-alias-state-error-primary);text-align:left;margin:10px 0 0;font-size:13px;line-height:1.4}.fThDlq_fenceRetry{border:1px solid var(--dsw-alias-border-l2);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border-radius:10px;margin-top:12px;padding:10px 16px;font-weight:500;transition:background-color .12s,color .12s}.fThDlq_fenceRetry:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.fThDlq_fenceRetry:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:3px}.fThDlq_fenceFootnote{color:var(--dsw-alias-label-tertiary);margin:14px 0 0;font-size:12px;line-height:1.55}.fThDlq_addresses{border:none;margin:12px 0 0;padding:0}.fThDlq_addresses legend{color:var(--dsw-alias-label-secondary);padding:0;font-size:13px}.fThDlq_address{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;cursor:pointer;border-radius:6px;align-items:center;gap:8px;margin-top:6px;padding:4px 6px;font-size:13px;transition:background-color .12s;display:flex}.fThDlq_address:hover{background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_address input:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-2), 0 0 0 4px var(--dsw-alias-brand-primary);border-radius:50%;outline:none}.fThDlq_addressValue{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:1;font-size:12px;overflow:hidden}.fThDlq_addressHint{color:var(--dsw-alias-label-tertiary);margin:6px 0 0;font-size:12px}.fThDlq_devices{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;gap:8px;padding:12px 16px 14px;display:flex}.fThDlq_devicesTitle{margin:0;font-size:13px;font-weight:500;line-height:20px}.fThDlq_devicesEmpty{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px}.fThDlq_deviceList{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.fThDlq_deviceRow{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.fThDlq_deviceMeta{flex-direction:column;gap:2px;min-width:0;display:flex}.fThDlq_deviceName{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;overflow:hidden}.fThDlq_devicePresence{font-size:12px;line-height:18px}.fThDlq_deviceOnline{color:var(--dsw-alias-state-success-primary)}.fThDlq_deviceOffline{color:var(--dsw-alias-label-secondary)}.fThDlq_deviceSeen{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px}.fThDlq_deviceRevoke{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:8px;flex:none;padding:6px 10px;font-size:12px;transition:background-color .12s,color .12s}.fThDlq_deviceRevoke:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.fThDlq_deviceRevoke:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-2), 0 0 0 4px var(--dsw-alias-brand-primary);outline:none}@media (prefers-reduced-motion:reduce){.fThDlq_trigger,.fThDlq_close,.fThDlq_action,.fThDlq_address,.fThDlq_deviceRevoke{transition:none}}.fThDlq_entryRow{flex:none;align-items:center;gap:6px;min-width:0;display:flex}.fThDlq_entryRow[data-rail=rail]{flex-direction:column-reverse;gap:4px}.fThDlq_updateStatus{margin:0;font-weight:600}.fThDlq_updateDetail{color:var(--dsw-alias-label-secondary);margin:6px 0 0;font-size:13px}.fThDlq_updateError{color:var(--dsw-alias-text-danger,var(--dsw-alias-label-primary));margin:0;font-weight:600}.fThDlq_updateOutput{background:var(--dsw-alias-bg-layer-1);max-height:180px;color:var(--dsw-alias-label-secondary);white-space:pre-wrap;word-break:break-all;border-radius:10px;margin:10px 0 0;padding:10px 12px;font-size:12px;line-height:18px;overflow:auto}.fThDlq_updateList{flex-direction:column;gap:6px;margin:12px 0 0;padding:0;list-style:none;display:flex}.fThDlq_updateListItem{justify-content:space-between;align-items:baseline;gap:12px;font-size:13px;display:flex}.fThDlq_updateListName{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);overflow:hidden}.fThDlq_updateListVersions{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none}.fThDlq_updateNotes{margin-top:14px}.fThDlq_updateNotesTitle{margin:0 0 8px;font-size:14px;font-weight:600}.fThDlq_updateNoteSection{flex-direction:column;gap:4px;margin-top:10px;display:flex}.fThDlq_updateNoteHeading{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px;font-weight:600}.fThDlq_updateNoteList{flex-direction:column;gap:4px;margin:0;padding-left:18px;font-size:13px;display:flex}.fThDlq_updateNoteItem{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}.fThDlq_updateVersions{margin-top:12px}.fThDlq_updateVersionsSummary{cursor:pointer;color:var(--dsw-alias-label-secondary);user-select:none;font-size:12px}.fThDlq_updateActions{justify-content:flex-end;margin-top:16px;display:flex}.fThDlq_updateRetry{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:10px;align-items:center;gap:6px;padding:8px 14px;font-size:13px;transition:background-color .12s,color .12s;display:inline-flex}.fThDlq_updateRetry:hover{background:var(--dsw-alias-interactive-bg-active)}@media (prefers-reduced-motion:reduce){.fThDlq_updateRetry{transition:none}}";
1379
+ const css$1 = ".fThDlq_overlay{z-index:1000;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.fThDlq_mask{background:var(--dsw-alias-bg-mask-1);backdrop-filter:var(--dsw-mask-blur);position:absolute;inset:0}.fThDlq_trigger{width:36px;height:36px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,box-shadow .12s;display:inline-flex;position:relative}.fThDlq_trigger[data-update-available]{color:var(--dsw-alias-brand-primary)}.fThDlq_trigger[data-update-available]:after{box-sizing:border-box;border:2px solid var(--dsw-alias-bg-layer-1);background:var(--dsw-alias-brand-primary);content:\"\";pointer-events:none;border-radius:50%;width:8px;height:8px;position:absolute;top:4px;right:4px}.fThDlq_trigger[data-wide=wide]{border-radius:999px;flex:auto;justify-content:flex-start;gap:8px;width:auto;min-width:0;padding:0 10px}.fThDlq_trigger[data-update-available][data-wide=wide]{flex:none;gap:6px}.fThDlq_trigger[data-update-available][data-wide=wide]:after{display:none}.fThDlq_updateBadgeText{white-space:nowrap;font-size:13px;font-weight:500;line-height:1}.fThDlq_trigger:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.fThDlq_trigger:active:not(:disabled){background:var(--dsw-alias-interactive-bg-active)}.fThDlq_trigger:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-2), 0 0 0 4px var(--dsw-alias-brand-primary);outline:none}.fThDlq_trigger:disabled{opacity:.5;cursor:default}.fThDlq_panel{z-index:1;box-sizing:border-box;background:var(--dsw-alias-bg-layer-2);width:560px;max-width:calc(100vw - 48px);max-height:calc(100vh - 48px);box-shadow:var(--dsw-shadow-lv3);color:var(--dsw-alias-label-primary);border-radius:24px;flex-direction:column;gap:14px;padding:24px;font-size:14px;line-height:22px;display:flex;position:relative;overflow:auto}.fThDlq_header{align-items:flex-start;gap:12px;display:flex}.fThDlq_heading{flex:1;min-width:0}.fThDlq_title{margin:0;font-size:18px;font-weight:600;line-height:26px}.fThDlq_subtitle{color:var(--dsw-alias-label-secondary);margin:4px 0 0;font-size:13px}.fThDlq_close{width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,box-shadow .12s;display:inline-flex}.fThDlq_close:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_close:active:not(:disabled){background:var(--dsw-alias-interactive-bg-active)}.fThDlq_close:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-2), 0 0 0 4px var(--dsw-alias-brand-primary);outline:none}.fThDlq_close:disabled{opacity:.5;cursor:default}.fThDlq_card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;align-items:center;gap:12px;padding:16px;display:flex}.fThDlq_cardHeader{justify-content:space-between;align-items:center;gap:12px;width:100%;display:flex}.fThDlq_cardTitle{font-weight:500}.fThDlq_badge{white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:6px;min-width:0;padding:2px 10px;font-size:12px;line-height:18px;display:inline-flex}.fThDlq_badge:before{content:\"\";background:currentColor;border-radius:50%;width:8px;height:8px}.fThDlq_badge-waiting{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_badge-connected{color:var(--dsw-alias-state-success-primary);background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_badge-disconnected{color:var(--dsw-alias-state-warn-primary);background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_badge-stopped{color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_badgePublic{color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_badges{flex:none;align-items:center;gap:6px;display:inline-flex}.fThDlq_qrWrap{background:var(--dsw-alias-bg-base);border-radius:12px;justify-content:center;align-items:center;padding:12px;display:flex}.fThDlq_qr{display:block}.fThDlq_expired{color:var(--dsw-alias-state-error-primary);margin:0;font-size:13px}.fThDlq_expiry{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px}.fThDlq_hint{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px}.fThDlq_link{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-caption);font-family:var(--dsw-font-mono,ui-monospace, monospace);margin:0;font-size:12px;display:block;overflow:hidden}.fThDlq_pairLinks{flex-direction:column;gap:8px;display:flex}.fThDlq_pairLinkRow{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:10px;align-items:center;gap:10px;min-width:0;padding:10px 12px;display:flex}.fThDlq_pairLinkText{flex:1;min-width:0}.fThDlq_pairLinkLabel{color:var(--dsw-alias-label-secondary);margin-bottom:3px;font-size:12px;display:block}.fThDlq_copyLink{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;flex:none;align-items:center;gap:5px;padding:0 10px;display:inline-flex}.fThDlq_oneTimeHint{color:var(--dsw-alias-label-caption);margin:0;font-size:12px}.fThDlq_stoppedHint{color:var(--dsw-alias-state-error-primary);margin:0;font-size:13px}.fThDlq_tunnelNote{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px}.fThDlq_tunnelFailed{color:var(--dsw-alias-state-error-primary);margin:0;font-size:13px}.fThDlq_actions{gap:8px;display:flex}.fThDlq_action{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-elevated-fill);height:34px;color:var(--dsw-alias-label-primary);cursor:pointer;white-space:nowrap;border-radius:10px;justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:13px;transition:background-color .12s,border-color .12s,box-shadow .12s;display:inline-flex}.fThDlq_action:hover:not(:disabled){background:var(--dsw-alias-button-floating-hover)}.fThDlq_action:active:not(:disabled){background:var(--dsw-alias-interactive-bg-active)}.fThDlq_action:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-2), 0 0 0 4px var(--dsw-alias-brand-primary);outline:none}.fThDlq_action:disabled{opacity:.5;cursor:default}.fThDlq_banner{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:16px;padding:16px}.fThDlq_bannerTitle{color:var(--dsw-alias-state-warn-primary);margin:0;font-weight:500}.fThDlq_bannerHint{color:var(--dsw-alias-label-secondary);margin:6px 0 0;font-size:13px}.fThDlq_fencePage{z-index:2000;box-sizing:border-box;background:var(--dsw-alias-bg-base);text-align:center;flex-direction:column;justify-content:center;align-items:center;padding:40px 24px;display:flex;position:fixed;inset:0;overflow:auto}.fThDlq_fenceCard{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);width:min(520px,100%);box-shadow:var(--dsw-shadow-lv3);text-align:center;border-radius:20px;margin-inline:auto;padding:36px 40px}.fThDlq_fenceMark{background:var(--dsw-alias-state-error-secondary);width:44px;height:44px;color:var(--dsw-alias-state-error-primary);border-radius:50%;place-items:center;margin-inline:auto;font-size:24px;line-height:1;display:grid}.fThDlq_fenceEyebrow{color:var(--dsw-alias-state-error-primary);margin:22px 0 8px;font-size:13px;font-weight:600}.fThDlq_fenceTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:24px;line-height:1.35}.fThDlq_fenceDetail{color:var(--dsw-alias-label-secondary);margin:12px 0 0;font-size:14px;line-height:1.65}.fThDlq_fenceSteps{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);text-align:left;border-radius:12px;margin:24px auto 0;padding:20px 20px 20px 42px;font-size:14px;line-height:1.65}.fThDlq_fenceSteps li+li{margin-top:8px}.fThDlq_fenceForm{width:100%;margin-top:20px}.fThDlq_fenceInputRow{gap:8px;width:100%;display:flex}.fThDlq_fenceInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);min-width:0;color:var(--dsw-alias-label-primary);font:inherit;border-radius:10px;flex:1;padding:10px 14px;font-size:13px;transition:border-color .12s,box-shadow .12s}.fThDlq_fenceInput:focus{border-color:var(--dsw-alias-brand-primary);outline:none;box-shadow:0 0 0 2px #0066ff26}.fThDlq_fencePairButton{border:1px solid var(--dsw-alias-button-primary-fill);background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground);font:inherit;cursor:pointer;border-radius:10px;flex-shrink:0;padding:10px 18px;font-size:13px;font-weight:500;transition:filter .12s,opacity .12s}.fThDlq_fencePairButton:hover:not(:disabled){background:var(--dsw-alias-button-primary-hover,var(--dsw-alias-button-primary-fill));border-color:var(--dsw-alias-button-primary-hover,var(--dsw-alias-button-primary-fill))}.fThDlq_fencePairButton:disabled{opacity:.55;cursor:not-allowed}.fThDlq_fencePairButton:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:2px}.fThDlq_fenceError{color:var(--dsw-alias-state-error-primary);text-align:left;margin:10px 0 0;font-size:13px;line-height:1.4}.fThDlq_fenceRetry{border:1px solid var(--dsw-alias-border-l2);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border-radius:10px;margin-top:12px;padding:10px 16px;font-weight:500;transition:background-color .12s,color .12s}.fThDlq_fenceRetry:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.fThDlq_fenceRetry:focus-visible{outline:2px solid var(--dsw-alias-brand-primary);outline-offset:3px}.fThDlq_fenceFootnote{color:var(--dsw-alias-label-tertiary);margin:14px 0 0;font-size:12px;line-height:1.55}.fThDlq_addresses{border:none;margin:12px 0 0;padding:0}.fThDlq_addresses legend{color:var(--dsw-alias-label-secondary);padding:0;font-size:13px}.fThDlq_address{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;cursor:pointer;border-radius:6px;align-items:center;gap:8px;margin-top:6px;padding:4px 6px;font-size:13px;transition:background-color .12s;display:flex}.fThDlq_address:hover{background:var(--dsw-alias-interactive-bg-hover)}.fThDlq_address input:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-2), 0 0 0 4px var(--dsw-alias-brand-primary);border-radius:50%;outline:none}.fThDlq_addressValue{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:1;font-size:12px;overflow:hidden}.fThDlq_addressHint{color:var(--dsw-alias-label-tertiary);margin:6px 0 0;font-size:12px}.fThDlq_devices{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;gap:8px;padding:12px 16px 14px;display:flex}.fThDlq_devicesTitle{margin:0;font-size:13px;font-weight:500;line-height:20px}.fThDlq_devicesEmpty{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px}.fThDlq_deviceList{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.fThDlq_deviceRow{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.fThDlq_deviceMeta{flex-direction:column;gap:2px;min-width:0;display:flex}.fThDlq_deviceName{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:500;overflow:hidden}.fThDlq_devicePresence{font-size:12px;line-height:18px}.fThDlq_deviceOnline{color:var(--dsw-alias-state-success-primary)}.fThDlq_deviceOffline{color:var(--dsw-alias-label-secondary)}.fThDlq_deviceSeen{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px}.fThDlq_deviceRevoke{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:8px;flex:none;padding:6px 10px;font-size:12px;transition:background-color .12s,color .12s}.fThDlq_deviceRevoke:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.fThDlq_deviceRevoke:focus-visible{box-shadow:0 0 0 2px var(--dsw-alias-bg-layer-2), 0 0 0 4px var(--dsw-alias-brand-primary);outline:none}@media (prefers-reduced-motion:reduce){.fThDlq_trigger,.fThDlq_close,.fThDlq_action,.fThDlq_address,.fThDlq_deviceRevoke{transition:none}}.fThDlq_entryRow{flex:none;align-items:center;gap:6px;min-width:0;display:flex}.fThDlq_entryRow[data-rail=rail]{flex-direction:column-reverse;gap:4px}.fThDlq_updateStatus{margin:0;font-weight:600}.fThDlq_updateDetail{color:var(--dsw-alias-label-secondary);margin:6px 0 0;font-size:13px}.fThDlq_updateError{color:var(--dsw-alias-text-danger,var(--dsw-alias-label-primary));margin:0;font-weight:600}.fThDlq_updateOutput{background:var(--dsw-alias-bg-layer-1);max-height:180px;color:var(--dsw-alias-label-secondary);white-space:pre-wrap;word-break:break-all;border-radius:10px;margin:10px 0 0;padding:10px 12px;font-size:12px;line-height:18px;overflow:auto}.fThDlq_updateList{flex-direction:column;gap:6px;margin:12px 0 0;padding:0;list-style:none;display:flex}.fThDlq_updateListItem{justify-content:space-between;align-items:baseline;gap:12px;font-size:13px;display:flex}.fThDlq_updateListName{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);overflow:hidden}.fThDlq_updateListVersions{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none}.fThDlq_updateNotes{margin-top:14px}.fThDlq_updateNotesTitle{margin:0 0 8px;font-size:14px;font-weight:600}.fThDlq_updateNoteSection{flex-direction:column;gap:4px;margin-top:10px;display:flex}.fThDlq_updateNoteHeading{color:var(--dsw-alias-label-secondary);margin:0;font-size:13px;font-weight:600}.fThDlq_updateNoteList{flex-direction:column;gap:4px;margin:0;padding-left:18px;font-size:13px;display:flex}.fThDlq_updateNoteItem{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}.fThDlq_updateVersions{margin-top:12px}.fThDlq_updateVersionsSummary{cursor:pointer;color:var(--dsw-alias-label-secondary);user-select:none;font-size:12px}.fThDlq_updateActions{justify-content:flex-end;margin-top:16px;display:flex}.fThDlq_updateRetry{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:10px;align-items:center;gap:6px;padding:8px 14px;font-size:13px;transition:background-color .12s,color .12s;display:inline-flex}.fThDlq_updateRetry:hover{background:var(--dsw-alias-interactive-bg-active)}@media (prefers-reduced-motion:reduce){.fThDlq_updateRetry{transition:none}}";
1380
1380
  const tagId$1 = "@linxin666/dsh-remote-web-ui/packages/dsh-remote-web-ui/src/client/remote.module.css";
1381
1381
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
1382
1382
  const tag = document.createElement("style");
@@ -4453,7 +4453,7 @@ window.__ModuleLoader__.load({
4453
4453
  /** The building package's version, when the bundle carries it. */
4454
4454
  function bakedVersion() {
4455
4455
  try {
4456
- return "0.3.17";
4456
+ return "0.3.19";
4457
4457
  } catch {
4458
4458
  return;
4459
4459
  }
@@ -4535,6 +4535,37 @@ window.__ModuleLoader__.load({
4535
4535
  const EFFORT_BTN_ID = "dshRemoteEffortPick";
4536
4536
  /** Body class while the compact picker buttons are wired. */
4537
4537
  const COMPACT_CLASS = "dsh-remote-compact-picker";
4538
+ /** Body class while the header actions are seated in the tabs row. */
4539
+ const HEADER_SEATED_CLASS = "dsh-remote-header-seated";
4540
+ /** Locale-dependent fast path for the official picker cells (zh/en). */
4541
+ const PICKER_CELL_PATTERN = {
4542
+ model: /模型|Model/,
4543
+ effort: /推理等级|Reasoning|Effort/i
4544
+ };
4545
+ /** Position of each drill cell among the sheet's chevron cells. */
4546
+ const DRILL_INDEX = {
4547
+ model: 0,
4548
+ effort: 1
4549
+ };
4550
+ /**
4551
+ * The official application frame. The layout column classes are the anchor:
4552
+ * `_frame` is shared by unrelated official components (the chat turn rail,
4553
+ * message-image thumbnails, the subagent pill, PlanReviewPanel), so a bare
4554
+ * suffix match would restyle and hit-block those. `data-dsh-frame` is the
4555
+ * aggregate compat stamp, kept as the fast path.
4556
+ */
4557
+ const APP_FRAME_SELECTOR = "[data-dsh-frame], [class*=\"_frame\"]:has([class*=\"_centerCol\"])";
4558
+ /**
4559
+ * The official composer surface. `_composerSeat` is the plugin's historical
4560
+ * anchor; the official `data-dsh-surface="composer"` part attribute is the
4561
+ * stable alternative if the class ever gains a modifier.
4562
+ */
4563
+ const COMPOSER_SELECTOR = "[class$=\"_composerSeat\"], [data-dsh-surface=\"composer\"]";
4564
+ /** Resolve the official application frame (never a nested `_frame` surface). */
4565
+ function appFrame() {
4566
+ const frame = document.querySelector(APP_FRAME_SELECTOR);
4567
+ return frame instanceof HTMLElement ? frame : null;
4568
+ }
4538
4569
  /**
4539
4570
  * Whether the current viewport is a portrait touch device small enough to
4540
4571
  * need the adaptation.
@@ -4554,7 +4585,7 @@ window.__ModuleLoader__.load({
4554
4585
  */
4555
4586
  const ADAPT_CSS = [
4556
4587
  "html,body{height:100%}",
4557
- "[class$=\"_frame\"]{width:100%;height:100dvh}",
4588
+ "[class*=\"_frame\"]:has([class*=\"_centerCol\"]){width:100%;height:100dvh}",
4558
4589
  "[class$=\"_railFish\"] button,[class$=\"_panelIcon\"],[class$=\"_newSession\"]{min-width:44px;min-height:44px}",
4559
4590
  "[class$=\"_scroll\"]{padding:8px 10px}",
4560
4591
  "[class$=\"_input\"],textarea,input{font-size:16px}",
@@ -4562,10 +4593,10 @@ window.__ModuleLoader__.load({
4562
4593
  "[class$=\"_scrollBody\"] [class$=\"_root\"]{font-size:14.5px}",
4563
4594
  "[class$=\"_scrollBody\"] [class$=\"_bubble\"]{font-size:14.5px}",
4564
4595
  "[class$=\"_titleRow\"] *{font-size:13px}",
4565
- "[class$=\"_sidebarCol\"] [class$=\"_root\"],[class$=\"_sidebarCol\"] [class$=\"_newSession\"],[class$=\"_sidebarCol\"] [class$=\"_trigger\"],[class$=\"_sidebarCol\"] [class$=\"_title\"]{font-size:13px}",
4566
- "[class$=\"_sidebarCol\"] [class$=\"_meta\"],[class$=\"_sidebarCol\"] [class$=\"_time\"]{font-size:11.5px}",
4596
+ "[class*=\"_sidebarCol\"] [class$=\"_root\"],[class*=\"_sidebarCol\"] [class$=\"_newSession\"],[class*=\"_sidebarCol\"] [class$=\"_trigger\"],[class*=\"_sidebarCol\"] [class$=\"_title\"]{font-size:13px}",
4597
+ "[class*=\"_sidebarCol\"] [class$=\"_meta\"],[class*=\"_sidebarCol\"] [class$=\"_time\"]{font-size:11.5px}",
4567
4598
  "[class$=\"_frame\"][data-sidebar-collapsed]{grid-template-columns:0 minmax(0,1fr) 0 !important}",
4568
- "[class$=\"_frame\"][data-sidebar-collapsed] [class$=\"_sidebarCol\"]{grid-column:1/2}",
4599
+ "[class$=\"_frame\"][data-sidebar-collapsed] [class*=\"_sidebarCol\"]{grid-column:1/2}",
4569
4600
  "[class$=\"_frame\"][data-sidebar-collapsed] [class$=\"_centerCol\"]{grid-column:2/3}",
4570
4601
  "[class$=\"_frame\"][data-sidebar-collapsed] [class$=\"_detailsCol\"]{grid-column:3/4}",
4571
4602
  `body.${RAIL_HIDDEN_CLASS} [class$="_titleRow"]{padding-left:52px}`,
@@ -4573,10 +4604,10 @@ window.__ModuleLoader__.load({
4573
4604
  `#${WHALE_ID} svg{width:20px;height:15px;display:block}`,
4574
4605
  `#${WHALE_ID}:active{opacity:.72}`,
4575
4606
  `#${WHALE_ID}{touch-action:none}`,
4576
- "[class$=\"_sidebarCol\"] [class$=\"_logoRow\"] [class*=\"_iconButton\"]{width:18px;height:18px}",
4577
- "[class$=\"_sidebarCol\"] [class$=\"_logoRow\"] [class*=\"_iconButton\"] svg{width:13px;height:13px;min-width:0;min-height:0}",
4578
- "[class$=\"_sidebarCol\"] [class$=\"_projectRow\"] [class$=\"_rowActions\"]{display:inline-flex}",
4579
- "[class$=\"_sidebarCol\"] [class$=\"_sessionRow\"],[class$=\"_sidebarCol\"] [class$=\"_projectRow\"]{-webkit-user-drag:none;user-select:none}",
4607
+ "[class*=\"_sidebarCol\"] [class$=\"_logoRow\"] [class*=\"_iconButton\"]{width:18px;height:18px}",
4608
+ "[class*=\"_sidebarCol\"] [class$=\"_logoRow\"] [class*=\"_iconButton\"] svg{width:13px;height:13px;min-width:0;min-height:0}",
4609
+ "[class*=\"_sidebarCol\"] [class*=\"_projectRow\"] [class*=\"_rowActions\"]{display:inline-flex}",
4610
+ "[class*=\"_sidebarCol\"] [class*=\"_sessionRow\"],[class*=\"_sidebarCol\"] [class*=\"_projectRow\"]{-webkit-user-drag:none;user-select:none}",
4580
4611
  "[class$=\"_headerUtilities\"]{display:none}",
4581
4612
  "[class$=\"_composerSeat\"] [class$=\"_card\"]{margin-bottom:1px}",
4582
4613
  "[class$=\"_composerSeat\"] [class$=\"_row\"]{flex-wrap:wrap;row-gap:0;padding:2px 8px 1px;position:relative}",
@@ -4602,10 +4633,8 @@ window.__ModuleLoader__.load({
4602
4633
  "[class*=\"_bubble\"][role=\"tooltip\"]{display:none}",
4603
4634
  "[class$=\"_composerSeat\"] [class$=\"_frame\"]{box-sizing:border-box;width:100%;max-width:100%;padding-left:12px;padding-right:12px;height:auto;max-height:calc(100dvh - 96px);align-items:flex-start;overflow-y:auto}",
4604
4635
  "[class$=\"_composerSeat\"] [class$=\"_frame\"] [class$=\"_card\"]{max-width:none;width:100%}",
4605
- "[class$=\"_header\"] [class$=\"_titleCluster\"] [class$=\"_headerActions\"]{display:none}",
4606
- "[class$=\"_header\"] [class$=\"_tabs\"]{margin-right:-58px}",
4636
+ `body.${HEADER_SEATED_CLASS} [class$="_header"] [class$="_titleCluster"] [class$="_headerActions"]{position:absolute;left:0;top:0;margin:0;display:flex;align-items:center;gap:6px;flex:none;z-index:2}`,
4607
4637
  "[class$=\"_header\"] [class$=\"_tabs\"] [class*=\"_tab\"]{font-size:12px;white-space:nowrap}",
4608
- "[class$=\"_header\"] [class$=\"_tabs\"] [class$=\"_headerActions\"]{margin-left:auto;display:flex;align-items:center;gap:6px;flex:none}",
4609
4638
  `body.${ACTIVE_CLASS} [class$=\"_detailsCol\"]{display:none !important}`,
4610
4639
  `body.${ACTIVE_CLASS} [data-dsh-plugin=\"ssh\"],`,
4611
4640
  `body.${ACTIVE_CLASS} [data-dsh-plugin=\"skill-explorer\"],`,
@@ -4654,6 +4683,11 @@ window.__ModuleLoader__.load({
4654
4683
  let savedViewportContent = null;
4655
4684
  let whaleEl = null;
4656
4685
  let whaleObserver = null;
4686
+ /** Header subtree observer: marks the geometry measurement dirty on re-render. */
4687
+ let headerObserver = null;
4688
+ let observedHeader = null;
4689
+ /** Whether the seated-actions geometry needs re-measuring (see alignActionsText). */
4690
+ let headerGeometryDirty = true;
4657
4691
  let whaleTimer = null;
4658
4692
  let whaleSuppressClick = false;
4659
4693
  let whaleShown = false;
@@ -4698,6 +4732,7 @@ window.__ModuleLoader__.load({
4698
4732
  if (!active) return;
4699
4733
  active = false;
4700
4734
  unseatHeaderActions();
4735
+ restoreRowDrag();
4701
4736
  removeCompactPicker();
4702
4737
  document.body.classList.remove(ACTIVE_CLASS);
4703
4738
  document.body.classList.remove(RAIL_HIDDEN_CLASS);
@@ -4709,6 +4744,10 @@ window.__ModuleLoader__.load({
4709
4744
  }
4710
4745
  if (whaleEl !== null) whaleEl.style.display = "none";
4711
4746
  setWhaleTimer(false);
4747
+ if (whaleObserver !== null) {
4748
+ whaleObserver.disconnect();
4749
+ whaleObserver = null;
4750
+ }
4712
4751
  }
4713
4752
  /** Start/stop the 600ms sync tick; a no-op when already in the asked state. */
4714
4753
  function setWhaleTimer(on) {
@@ -4732,14 +4771,17 @@ window.__ModuleLoader__.load({
4732
4771
  document.getElementById(MODEL_BTN_ID)?.remove();
4733
4772
  document.getElementById(EFFORT_BTN_ID)?.remove();
4734
4773
  }
4735
- function drillIntoPicker(cellPattern) {
4774
+ function drillIntoPicker(kind) {
4736
4775
  const trigger = document.querySelector("[class$=\"_composerSeat\"] [class$=\"_trailing\"] [class$=\"_trigger\"]:has([class$=\"_triggerEffort\"])");
4737
4776
  if (trigger === null) return;
4738
4777
  trigger.click();
4739
4778
  let tries = 0;
4740
4779
  const tapCell = () => {
4741
4780
  tries += 1;
4742
- const cell = Array.from(document.querySelectorAll("[class$=\"_composerSeat\"] [class$=\"_menu\"] [class$=\"_cell\"]")).find((c) => cellPattern.test(c.textContent ?? ""));
4781
+ const cells = Array.from(document.querySelectorAll("[class$=\"_composerSeat\"] [class$=\"_menu\"] [class$=\"_cell\"]"));
4782
+ const byLabel = cells.find((c) => PICKER_CELL_PATTERN[kind].test(c.textContent ?? ""));
4783
+ const drillable = cells.filter((c) => c.querySelector("[class*=\"_cellChevron\"], [class*=\"_chevron\"]"));
4784
+ const cell = byLabel ?? drillable[DRILL_INDEX[kind]];
4743
4785
  if (cell !== void 0) {
4744
4786
  cell.click();
4745
4787
  return;
@@ -4748,7 +4790,7 @@ window.__ModuleLoader__.load({
4748
4790
  };
4749
4791
  window.setTimeout(tapCell, 150);
4750
4792
  }
4751
- function makeCompactButton(id, title, icon, cellPattern) {
4793
+ function makeCompactButton(id, title, icon, kind) {
4752
4794
  const btn = document.createElement("button");
4753
4795
  btn.id = id;
4754
4796
  btn.type = "button";
@@ -4757,7 +4799,7 @@ window.__ModuleLoader__.load({
4757
4799
  btn.setAttribute("aria-label", title);
4758
4800
  btn.innerHTML = `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${icon}</svg>`;
4759
4801
  btn.addEventListener("click", () => {
4760
- drillIntoPicker(cellPattern);
4802
+ drillIntoPicker(kind);
4761
4803
  });
4762
4804
  return btn;
4763
4805
  }
@@ -4769,8 +4811,8 @@ window.__ModuleLoader__.load({
4769
4811
  removeCompactPicker();
4770
4812
  return;
4771
4813
  }
4772
- if (document.getElementById(MODEL_BTN_ID) === null) tools.appendChild(makeCompactButton(MODEL_BTN_ID, surfaceText("mobile.composer.pickModel", "Pick model"), CUBE_ICON, /模型|Model/));
4773
- if (document.getElementById(EFFORT_BTN_ID) === null) tools.appendChild(makeCompactButton(EFFORT_BTN_ID, surfaceText("mobile.composer.pickEffort", "Pick reasoning effort"), LEVELS_ICON, /推理等级|Reasoning|Effort/i));
4814
+ if (document.getElementById(MODEL_BTN_ID) === null) tools.appendChild(makeCompactButton(MODEL_BTN_ID, surfaceText("mobile.composer.pickModel", "Pick model"), CUBE_ICON, "model"));
4815
+ if (document.getElementById(EFFORT_BTN_ID) === null) tools.appendChild(makeCompactButton(EFFORT_BTN_ID, surfaceText("mobile.composer.pickEffort", "Pick reasoning effort"), LEVELS_ICON, "effort"));
4774
4816
  for (const [id, key, fallback] of [[
4775
4817
  MODEL_BTN_ID,
4776
4818
  "mobile.composer.pickModel",
@@ -4789,26 +4831,65 @@ window.__ModuleLoader__.load({
4789
4831
  document.body.classList.add(COMPACT_CLASS);
4790
4832
  }
4791
4833
  /**
4792
- * Toggle the sidebar through the wired layout face, then verify the flip:
4793
- * the official LayoutController can be mounted yet inert (its bound store
4794
- * actions race the root entry on this cohort — observed on the running
4795
- * local build, where the face call silently did nothing and the whale
4796
- * was dead). When the frame state did not change shortly after the call,
4797
- * drive the official rail/logo toggle instead: that button owns its own
4798
- * store actions and flips the same state on every cohort we support.
4834
+ * The official sidebar toggle in the logo row. The row's own `_toggle` class
4835
+ * is the precise anchor; the row's last button is the fallback for cohorts
4836
+ * that only expose the generic icon-button class (the first button is the
4837
+ * brand, which navigates home — never click that one). `_railFish` is kept
4838
+ * for older compositions that carried a rail fish button.
4839
+ */
4840
+ function officialSidebarToggle() {
4841
+ const rail = document.querySelector("[class$=\"_railFish\"] button");
4842
+ if (rail instanceof HTMLElement) return rail;
4843
+ const row = document.querySelector("[class$=\"_logoRow\"]");
4844
+ if (row === null) return null;
4845
+ const toggles = row.querySelectorAll("button[class*=\"_toggle\"]");
4846
+ const last = toggles.length > 0 ? toggles[toggles.length - 1] : row.querySelectorAll("button")[row.querySelectorAll("button").length - 1];
4847
+ return last instanceof HTMLElement ? last : null;
4848
+ }
4849
+ /**
4850
+ * Toggle the sidebar through the official rail/logo toggle first, then
4851
+ * verify the flip and fall back to the wired layout face.
4852
+ *
4853
+ * The order is evidence-driven: the official toggle owns its own store
4854
+ * actions and flips the state on every cohort we support, while the wired
4855
+ * LayoutController is mounted yet inert on the installed cohort — calling it
4856
+ * left `data-sidebar-collapsed` untouched for the whole 800ms observation
4857
+ * window, so face-first made every whale tap wait out the verification
4858
+ * delay before anything moved. The face stays the fallback for compositions
4859
+ * that render no logo-row toggle, and it is only called after the toggle
4860
+ * demonstrably failed, so the two can never cancel each other out.
4799
4861
  */
4800
4862
  function toggleSidebarVerified() {
4801
- const frame = document.querySelector("[class$=\"_frame\"]");
4802
- const collapsedBefore = frame instanceof HTMLElement ? frame.hasAttribute("data-sidebar-collapsed") : null;
4803
- w.__dshRemoteAdapt?.toggleSidebar?.();
4804
- if (collapsedBefore === null) return;
4805
- window.setTimeout(() => {
4863
+ const frame = appFrame();
4864
+ const collapsedBefore = frame !== null ? frame.hasAttribute("data-sidebar-collapsed") : null;
4865
+ const face = w.__dshRemoteAdapt?.toggleSidebar;
4866
+ const callFace = () => {
4867
+ if (typeof face !== "function") return;
4868
+ try {
4869
+ face();
4870
+ } catch {}
4871
+ };
4872
+ const toggle = officialSidebarToggle();
4873
+ if (collapsedBefore === null || toggle === null) {
4874
+ if (toggle !== null) toggle.click();
4875
+ else callFace();
4876
+ return;
4877
+ }
4878
+ toggle.click();
4879
+ let tries = 0;
4880
+ const verify = () => {
4806
4881
  if (!active) return;
4807
- const frameNow = document.querySelector("[class$=\"_frame\"]");
4808
- if (!(frameNow instanceof HTMLElement)) return;
4882
+ const frameNow = appFrame();
4883
+ if (frameNow === null) return;
4809
4884
  if (frameNow.hasAttribute("data-sidebar-collapsed") !== collapsedBefore) return;
4810
- document.querySelector("[class$=\"_railFish\"] button, [class$=\"_logoRow\"] [class*=\"_iconButton\"]")?.click();
4811
- }, 150);
4885
+ tries += 1;
4886
+ if (tries < 2) {
4887
+ window.setTimeout(verify, 120);
4888
+ return;
4889
+ }
4890
+ callFace();
4891
+ };
4892
+ window.setTimeout(verify, 120);
4812
4893
  }
4813
4894
  function ensureWhale() {
4814
4895
  if (whaleEl !== null || !document.body) return;
@@ -4830,12 +4911,9 @@ window.__ModuleLoader__.load({
4830
4911
  whale.addEventListener("pointerdown", (e) => {
4831
4912
  if (whaleEl === null) return;
4832
4913
  if (e.button !== 0 && e.pointerType === "mouse") return;
4833
- if (active) {
4834
- const ta = document.querySelector("[class$=\"_composerSeat\"] textarea, [class$=\"_composerSeat\"] input");
4835
- if (ta !== null && document.activeElement === ta) {
4836
- ta.blur();
4837
- lastComposerTap = 0;
4838
- }
4914
+ if (active && isComposerField(document.activeElement)) {
4915
+ document.activeElement.blur();
4916
+ lastComposerTap = 0;
4839
4917
  }
4840
4918
  drag = {
4841
4919
  x: e.clientX,
@@ -4873,10 +4951,27 @@ window.__ModuleLoader__.load({
4873
4951
  } catch {}
4874
4952
  };
4875
4953
  whale.addEventListener("pointerup", endWhaleDrag);
4876
- whale.addEventListener("pointercancel", endWhaleDrag);
4954
+ whale.addEventListener("pointercancel", () => {
4955
+ drag = null;
4956
+ whaleSuppressClick = false;
4957
+ });
4877
4958
  whaleEl = whale;
4878
4959
  document.body.appendChild(whale);
4879
4960
  }
4961
+ /**
4962
+ * Restore the official draggable state this layer overrode while active.
4963
+ * Rows are React-owned and may have been re-created meanwhile, so only the
4964
+ * tracked elements are touched; a detached element is skipped.
4965
+ */
4966
+ function restoreRowDrag() {
4967
+ if (dragOverridden.size === 0) return;
4968
+ for (const [row, original] of dragOverridden) {
4969
+ if (!row.isConnected) continue;
4970
+ if (original === null) row.removeAttribute("draggable");
4971
+ else row.setAttribute("draggable", original);
4972
+ }
4973
+ dragOverridden.clear();
4974
+ }
4880
4975
  /** Restore a dragged position when the whale becomes visible again. */
4881
4976
  function applyWhalePos() {
4882
4977
  if (whaleEl === null) return;
@@ -4891,10 +4986,15 @@ window.__ModuleLoader__.load({
4891
4986
  whaleEl.style.top = `${y}px`;
4892
4987
  }
4893
4988
  }
4989
+ /** Rows whose official draggable state this layer overrode (restored on revert). */
4990
+ const dragOverridden = /* @__PURE__ */ new Map();
4894
4991
  function disableRowDrag() {
4895
4992
  if (!active) return;
4896
- const rows = document.querySelectorAll("[class$=\"_sidebarCol\"] [class$=\"_sessionRow\"], [class$=\"_sidebarCol\"] [class$=\"_projectRow\"]");
4897
- for (const row of rows) if (row.getAttribute("draggable") !== "false") row.setAttribute("draggable", "false");
4993
+ const rows = document.querySelectorAll("[class*=\"_sidebarCol\"] [class*=\"_sessionRow\"], [class*=\"_sidebarCol\"] [class*=\"_projectRow\"]");
4994
+ for (const row of rows) if (row.getAttribute("draggable") !== "false") {
4995
+ if (!dragOverridden.has(row)) dragOverridden.set(row, row.getAttribute("draggable"));
4996
+ row.setAttribute("draggable", "false");
4997
+ }
4898
4998
  }
4899
4999
  function syncWhale() {
4900
5000
  if (active) ensureAdaptStyle();
@@ -4903,7 +5003,7 @@ window.__ModuleLoader__.load({
4903
5003
  whaleEl.style.display = "none";
4904
5004
  return;
4905
5005
  }
4906
- const collapsed = document.querySelector("[class$=\"_frame\"][data-sidebar-collapsed]") !== null;
5006
+ const collapsed = appFrame()?.hasAttribute("data-sidebar-collapsed") === true;
4907
5007
  const overlayUp = document.querySelector("[class$=\"_overlay\"]") !== null;
4908
5008
  const show = collapsed && !overlayUp;
4909
5009
  if (show && !whaleShown) applyWhalePos();
@@ -4920,21 +5020,23 @@ window.__ModuleLoader__.load({
4920
5020
  }
4921
5021
  function seatHeaderActions() {
4922
5022
  if (!active) return;
4923
- const tabs = document.querySelector("[class$=\"_header\"] [class$=\"_tabs\"]");
4924
- const fresh = document.querySelector("[class$=\"_titleCluster\"] [class$=\"_headerActions\"]");
4925
- const seated = tabs !== null ? tabs.querySelector(":scope > [class$=\"_headerActions\"]") : null;
4926
- if (fresh !== null && tabs !== null) {
4927
- seated?.remove();
4928
- tabs.appendChild(fresh);
4929
- }
5023
+ const header = document.querySelector("[class$=\"_header\"]");
5024
+ const tabs = header !== null ? header.querySelector("[class$=\"_tabs\"]") : null;
5025
+ const actions = header !== null ? header.querySelector("[class$=\"_titleCluster\"] [class$=\"_headerActions\"]") : null;
5026
+ const seated = header !== null && tabs !== null && actions !== null;
5027
+ document.body.classList.toggle(HEADER_SEATED_CLASS, seated);
5028
+ ensureHeaderObserver(seated ? header : null);
4930
5029
  }
4931
5030
  function alignActionsText() {
4932
5031
  if (!active) return;
4933
- const tabs = document.querySelector("[class$=\"_header\"] [class$=\"_tabs\"]");
4934
- if (tabs === null) return;
4935
- const actions = tabs.querySelector(":scope > [class$=\"_headerActions\"]");
5032
+ const header = document.querySelector("[class$=\"_header\"]");
5033
+ if (header === null) return;
5034
+ const tabs = header.querySelector("[class$=\"_tabs\"]");
5035
+ const actions = header.querySelector("[class$=\"_titleCluster\"] [class$=\"_headerActions\"]");
5036
+ if (tabs === null || actions === null || !(tabs instanceof HTMLElement) || !(actions instanceof HTMLElement)) return;
5037
+ if (!headerGeometryDirty) return;
5038
+ headerGeometryDirty = false;
4936
5039
  const tabBtn = tabs.querySelector(":scope > [class*=\"_tab\"]");
4937
- if (actions === null || tabBtn === null) return;
4938
5040
  const textBottom = (el) => {
4939
5041
  if (el === null) return null;
4940
5042
  const text = Array.from(el.childNodes).find((n) => n.nodeType === 3 && n.textContent !== null && n.textContent.trim() !== "");
@@ -4947,29 +5049,41 @@ window.__ModuleLoader__.load({
4947
5049
  return null;
4948
5050
  }
4949
5051
  };
5052
+ const translate = /translate\((-?[\d.]+)px,\s*(-?[\d.]+)px\)/.exec(actions.style.transform ?? "");
5053
+ let dx = translate !== null ? parseFloat(translate[1] ?? "0") : 0;
5054
+ let dy = translate !== null ? parseFloat(translate[2] ?? "0") : 0;
5055
+ const actionsRect = actions.getBoundingClientRect();
5056
+ const rightDiff = tabs.getBoundingClientRect().right - actionsRect.right;
5057
+ if (Math.abs(rightDiff) >= .5) dx = Math.round((dx + rightDiff) * 10) / 10;
4950
5058
  const tabBottom = textBottom(tabBtn);
4951
- if (tabBottom === null) return;
4952
- const curMatch = /translateY\((-?[\d.]+)px\)/.exec(actions.style.transform ?? "");
4953
- const cur = curMatch !== null ? parseFloat(curMatch[1] ?? "0") : 0;
4954
- let maxBottom = null;
4955
- for (const sel of ["[class$=\"_label\"]", "[class$=\"_count\"]"]) {
4956
- const b = textBottom(actions.querySelector(sel));
4957
- if (b !== null && (maxBottom === null || b - cur > maxBottom)) maxBottom = b - cur;
4958
- }
4959
- if (maxBottom === null) return;
4960
- const delta = Math.round((tabBottom - maxBottom) * 10) / 10;
4961
- if (Math.abs(delta) < .5) {
4962
- if (actions.style.transform !== "") actions.style.transform = "";
4963
- return;
5059
+ if (tabBottom !== null) {
5060
+ let maxBottom = null;
5061
+ for (const sel of ["[class$=\"_label\"]", "[class$=\"_count\"]"]) {
5062
+ const b = textBottom(actions.querySelector(sel));
5063
+ if (b !== null && (maxBottom === null || b > maxBottom)) maxBottom = b;
5064
+ }
5065
+ if (maxBottom !== null) {
5066
+ const bottomDiff = tabBottom - maxBottom;
5067
+ if (Math.abs(bottomDiff) >= .5) dy = Math.round((dy + bottomDiff) * 10) / 10;
5068
+ }
4964
5069
  }
4965
- actions.style.transform = `translateY(${delta}px)`;
5070
+ const next = `translate(${dx}px, ${dy}px)`;
5071
+ if (actions.style.transform !== next) actions.style.transform = next;
5072
+ const reserve = `${Math.ceil(actionsRect.width) + 8}px`;
5073
+ if (tabs.style.paddingRight !== reserve) tabs.style.paddingRight = reserve;
4966
5074
  }
4967
5075
  function unseatHeaderActions() {
4968
- const tabs = document.querySelector("[class$=\"_header\"] [class$=\"_tabs\"]");
4969
- const seated = tabs !== null ? tabs.querySelector(":scope > [class$=\"_headerActions\"]") : null;
4970
- const wrap = document.querySelector("[class$=\"_titleCluster\"] > div");
4971
- if (seated !== null) if (wrap !== null) wrap.appendChild(seated);
4972
- else seated.remove();
5076
+ document.body.classList.remove(HEADER_SEATED_CLASS);
5077
+ const header = document.querySelector("[class$=\"_header\"]");
5078
+ const tabs = header !== null ? header.querySelector("[class$=\"_tabs\"]") : null;
5079
+ const actions = header !== null ? header.querySelector("[class$=\"_titleCluster\"] [class$=\"_headerActions\"]") : null;
5080
+ if (actions instanceof HTMLElement) actions.style.transform = "";
5081
+ if (tabs instanceof HTMLElement) tabs.style.paddingRight = "";
5082
+ if (headerObserver !== null) {
5083
+ headerObserver.disconnect();
5084
+ headerObserver = null;
5085
+ observedHeader = null;
5086
+ }
4973
5087
  }
4974
5088
  function ensureWhaleObserver() {
4975
5089
  if (whaleObserver !== null || typeof MutationObserver === "undefined" || !document.body) return;
@@ -4982,7 +5096,35 @@ window.__ModuleLoader__.load({
4982
5096
  subtree: true
4983
5097
  });
4984
5098
  }
5099
+ /**
5100
+ * Observe the conversation header subtree and mark its geometry dirty on any
5101
+ * re-render (label text, badge count, node replacement). The per-tick
5102
+ * alignment then reads layout only when the header actually changed instead
5103
+ * of on every tick while a message streams. The observer is swapped when the
5104
+ * header node is replaced and disconnected with the layer.
5105
+ */
5106
+ function ensureHeaderObserver(header) {
5107
+ if (typeof MutationObserver === "undefined") return;
5108
+ if (observedHeader === header && headerObserver !== null) return;
5109
+ headerObserver?.disconnect();
5110
+ headerObserver = null;
5111
+ observedHeader = null;
5112
+ if (header === null) return;
5113
+ headerObserver = new MutationObserver(() => {
5114
+ headerGeometryDirty = true;
5115
+ });
5116
+ headerObserver.observe(header, {
5117
+ childList: true,
5118
+ subtree: true,
5119
+ characterData: true,
5120
+ attributes: true,
5121
+ attributeFilter: ["class"]
5122
+ });
5123
+ observedHeader = header;
5124
+ headerGeometryDirty = true;
5125
+ }
4985
5126
  function evaluate() {
5127
+ headerGeometryDirty = true;
4986
5128
  if (!adaptEnabled) {
4987
5129
  revert();
4988
5130
  return;
@@ -5003,7 +5145,7 @@ window.__ModuleLoader__.load({
5003
5145
  if (e.key !== "Enter" || e.shiftKey || e.ctrlKey || e.metaKey || e.altKey) return;
5004
5146
  const t = e.target;
5005
5147
  if (!(t instanceof HTMLElement)) return;
5006
- if (t.closest("[class$=\"_input\"]") === null) return;
5148
+ if (composerFieldOf(t) === null) return;
5007
5149
  if (e.isComposing || e.keyCode === 229) return;
5008
5150
  e.preventDefault();
5009
5151
  e.stopPropagation();
@@ -5017,21 +5159,21 @@ window.__ModuleLoader__.load({
5017
5159
  }
5018
5160
  function onClickCapture(e) {
5019
5161
  if (!active) return;
5020
- const frame = document.querySelector("[class$=\"_frame\"]");
5162
+ const frame = appFrame();
5021
5163
  if (frame === null || frame.hasAttribute("data-sidebar-collapsed")) return;
5022
5164
  const t = e.target;
5023
5165
  if (!(t instanceof Element)) return;
5024
- if (t.closest("[class$=\"_sidebarCol\"]") !== null) {
5166
+ if (t.closest("[class*=\"_sidebarCol\"]") !== null) {
5025
5167
  const topNewSessionClicked = t.closest("[class$=\"_newSession\"], [class$=\"_brand\"]") !== null;
5026
5168
  let projectNewSessionClicked = false;
5027
- const projectActions = t.closest("[class$=\"_projectRow\"] [class$=\"_rowActions\"]");
5169
+ const projectActions = t.closest("[class*=\"_projectRow\"] [class*=\"_rowActions\"]");
5028
5170
  if (projectActions !== null) {
5029
5171
  const btn = t.closest("button");
5030
5172
  const btns = projectActions.querySelectorAll("button");
5031
5173
  projectNewSessionClicked = btn !== null && btns.length > 0 && btn === btns[btns.length - 1];
5032
5174
  }
5033
5175
  let shouldCollapse = false;
5034
- if (t.closest("[class$=\"_sessionRow\"]") !== null) shouldCollapse = t.closest("[class$=\"_rowActions\"]") === null;
5176
+ if (t.closest("[class*=\"_sessionRow\"]") !== null) shouldCollapse = t.closest("[class*=\"_rowActions\"]") === null;
5035
5177
  else if (t.closest("[class$=\"_settingsArea\"]") !== null || topNewSessionClicked || projectNewSessionClicked) shouldCollapse = true;
5036
5178
  if (shouldCollapse) collapseSidebar();
5037
5179
  return;
@@ -5051,8 +5193,13 @@ window.__ModuleLoader__.load({
5051
5193
  }
5052
5194
  document.addEventListener("touchstart", (e) => {
5053
5195
  if (!active) return;
5196
+ if (e.touches.length > 1) {
5197
+ swipeTouch = null;
5198
+ return;
5199
+ }
5054
5200
  const t = e.target;
5055
- if (t instanceof Element && (t.tagName === "TEXTAREA" || t.tagName === "INPUT" || t.closest(`#${WHALE_ID}`) !== null || insideHScrollable(t) || t.closest("table, [class$=\"_table\"], [class$=\"_tablePane\"]") !== null)) {
5201
+ const editable = t instanceof HTMLElement && t.isContentEditable;
5202
+ if (t instanceof Element && (t.tagName === "TEXTAREA" || t.tagName === "INPUT" || editable || t.closest(`#${WHALE_ID}`) !== null || insideHScrollable(t) || t.closest("table, [class$=\"_table\"], [class$=\"_tablePane\"]") !== null)) {
5056
5203
  swipeTouch = null;
5057
5204
  return;
5058
5205
  }
@@ -5069,6 +5216,7 @@ window.__ModuleLoader__.load({
5069
5216
  });
5070
5217
  document.addEventListener("touchend", (e) => {
5071
5218
  if (swipeTouch === null) return;
5219
+ if (e.touches.length > 0) return;
5072
5220
  const ct = e.changedTouches[0];
5073
5221
  if (ct === void 0 || ct.identifier !== swipeTouch.id) return;
5074
5222
  const dx = ct.clientX - swipeTouch.x;
@@ -5076,7 +5224,7 @@ window.__ModuleLoader__.load({
5076
5224
  swipeTouch = null;
5077
5225
  if (!active) return;
5078
5226
  if (Math.abs(dx) < 60 || Math.abs(dx) < Math.abs(dy) * 1.5) return;
5079
- const frame = document.querySelector("[class$=\"_frame\"]");
5227
+ const frame = appFrame();
5080
5228
  if (frame === null) return;
5081
5229
  if (document.querySelector("[class$=\"_overlay\"], [class$=\"_dialog\"], [class$=\"_menu\"], [class*=\"_portal\"]") !== null) return;
5082
5230
  const collapsed = frame.hasAttribute("data-sidebar-collapsed");
@@ -5102,7 +5250,7 @@ window.__ModuleLoader__.load({
5102
5250
  }
5103
5251
  }
5104
5252
  function openSessionMenu(row) {
5105
- const actions = row.querySelector("[class$=\"_rowActions\"]");
5253
+ const actions = row.querySelector("[class*=\"_rowActions\"]");
5106
5254
  const btn = actions?.querySelector("button");
5107
5255
  if (actions === null || btn === null) return;
5108
5256
  longPressMenuGuardUntil = Date.now() + 1200;
@@ -5122,8 +5270,8 @@ window.__ModuleLoader__.load({
5122
5270
  clearLongPress();
5123
5271
  return;
5124
5272
  }
5125
- const row = t.closest("[class$=\"_sessionRow\"]");
5126
- if (row === null || t.closest("[class$=\"_rowActions\"]") !== null) {
5273
+ const row = t.closest("[class*=\"_sessionRow\"]");
5274
+ if (row === null || t.closest("[class*=\"_rowActions\"]") !== null) {
5127
5275
  clearLongPress();
5128
5276
  return;
5129
5277
  }
@@ -5190,22 +5338,33 @@ window.__ModuleLoader__.load({
5190
5338
  if (!active) return;
5191
5339
  const t = e.target;
5192
5340
  if (!(t instanceof Element)) return;
5193
- if (t.closest("[class$=\"_sessionRow\"]") !== null && (longPress !== null && longPress.triggered || Date.now() <= suppressSessionClickUntil)) e.preventDefault();
5341
+ if (t.closest("[class*=\"_sessionRow\"]") !== null && (longPress !== null && longPress.triggered || Date.now() <= suppressSessionClickUntil)) e.preventDefault();
5194
5342
  }, true);
5195
5343
  document.addEventListener("pointerleave", (e) => {
5196
5344
  if (!active || Date.now() > longPressMenuGuardUntil) return;
5197
5345
  const t = e.target;
5198
- if (t instanceof Element && (t.closest("[class$=\"_rowActions\"]") !== null || t.closest("[class$=\"_sessionRow\"]") !== null || t.closest("[class$=\"_projectRow\"]") !== null)) e.stopPropagation();
5346
+ if (t instanceof Element && (t.closest("[class*=\"_rowActions\"]") !== null || t.closest("[class*=\"_sessionRow\"]") !== null || t.closest("[class*=\"_projectRow\"]") !== null)) e.stopPropagation();
5199
5347
  }, true);
5348
+ const isComposerField = (el) => {
5349
+ if (!(el instanceof HTMLElement)) return false;
5350
+ if (el.closest(COMPOSER_SELECTOR) === null) return false;
5351
+ if (el.matches("[data-composer-input]")) return true;
5352
+ if (el.tagName === "TEXTAREA") return true;
5353
+ return el.tagName === "INPUT" && el.matches("[class*=\"_input\"]");
5354
+ };
5355
+ /** The composer field that owns an event target, if any. */
5356
+ const composerFieldOf = (target) => {
5357
+ const el = target instanceof Element ? target.closest("[data-composer-input], [class*=\"_input\"], textarea") : null;
5358
+ return isComposerField(el) ? el : null;
5359
+ };
5200
5360
  const lanOrigFocus = HTMLElement.prototype.focus;
5201
5361
  HTMLElement.prototype.focus = function(options) {
5202
- if (active && (this.tagName === "TEXTAREA" || this.tagName === "INPUT") && this.closest("[class$=\"_composerSeat\"]") !== null && Date.now() - lastComposerTap >= 800) return;
5362
+ if (active && isComposerField(this) && Date.now() - lastComposerTap >= 800) return;
5203
5363
  lanOrigFocus.call(this, options);
5204
5364
  };
5205
5365
  document.addEventListener("pointerdown", (e) => {
5206
5366
  if (!active) return;
5207
- const t = e.target;
5208
- if (t instanceof Element && (t.tagName === "TEXTAREA" || t.tagName === "INPUT") && t.closest("[class$=\"_composerSeat\"]") !== null) lastComposerTap = Date.now();
5367
+ if (composerFieldOf(e.target) !== null) lastComposerTap = Date.now();
5209
5368
  }, true);
5210
5369
  w.__dshRemoteAdapt = {
5211
5370
  evaluate,