@linxin666/dsh-remote-web-ui 0.3.18 → 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 +249 -90
- package/lib/client.js.map +1 -1
- package/lib/index.js +128 -30
- package/lib/types/client/mobile-adapt.d.ts.map +1 -1
- package/lib/types/client/mobile-adapt.js +313 -117
- package/lib/types/routes.d.ts +23 -0
- package/lib/types/routes.d.ts.map +1 -1
- package/lib/types/routes.js +94 -29
- package/lib/types/tunnel.d.ts +8 -0
- package/lib/types/tunnel.d.ts.map +1 -1
- package/lib/types/tunnel.js +11 -1
- package/lib/types/update.d.ts.map +1 -1
- package/lib/types/update.js +31 -11
- package/package.json +1 -1
- package/src/client/mobile-adapt.ts +293 -112
- package/src/client/remote.module.css +10 -4
- package/src/routes.ts +92 -25
- package/src/tunnel.ts +12 -1
- package/src/update.ts +30 -11
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.
|
|
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
|
|
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
|
|
4566
|
-
"[class
|
|
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
|
|
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
|
|
4577
|
-
"[class
|
|
4578
|
-
"[class
|
|
4579
|
-
"[class
|
|
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
|
-
|
|
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(
|
|
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
|
|
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,
|
|
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(
|
|
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,
|
|
4773
|
-
if (document.getElementById(EFFORT_BTN_ID) === null) tools.appendChild(makeCompactButton(EFFORT_BTN_ID, surfaceText("mobile.composer.pickEffort", "Pick reasoning effort"), LEVELS_ICON,
|
|
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
|
-
*
|
|
4793
|
-
* the
|
|
4794
|
-
*
|
|
4795
|
-
*
|
|
4796
|
-
*
|
|
4797
|
-
|
|
4798
|
-
|
|
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 =
|
|
4802
|
-
const collapsedBefore = frame
|
|
4803
|
-
w.__dshRemoteAdapt?.toggleSidebar
|
|
4804
|
-
|
|
4805
|
-
|
|
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 =
|
|
4808
|
-
if (
|
|
4882
|
+
const frameNow = appFrame();
|
|
4883
|
+
if (frameNow === null) return;
|
|
4809
4884
|
if (frameNow.hasAttribute("data-sidebar-collapsed") !== collapsedBefore) return;
|
|
4810
|
-
|
|
4811
|
-
|
|
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
|
-
|
|
4835
|
-
|
|
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",
|
|
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
|
|
4897
|
-
for (const row of rows) if (row.getAttribute("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 =
|
|
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
|
|
4924
|
-
const
|
|
4925
|
-
const
|
|
4926
|
-
|
|
4927
|
-
|
|
4928
|
-
|
|
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
|
|
4934
|
-
if (
|
|
4935
|
-
const
|
|
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
|
|
4952
|
-
|
|
4953
|
-
|
|
4954
|
-
|
|
4955
|
-
|
|
4956
|
-
|
|
4957
|
-
if (
|
|
4958
|
-
|
|
4959
|
-
|
|
4960
|
-
|
|
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
|
-
|
|
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
|
-
|
|
4969
|
-
const
|
|
4970
|
-
const
|
|
4971
|
-
|
|
4972
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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
|
|
5126
|
-
if (row === null || t.closest("[class
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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,
|