dsh-diff-approval 0.33.0 → 0.35.0

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
@@ -330,7 +330,7 @@ window.__ModuleLoader__.load({
330
330
  });
331
331
  //#endregion
332
332
  //#region \0dsh-css:/home/runner/work/dsh-diff-approval/dsh-diff-approval/src/client/PendingPanel.module.css.mjs
333
- const css = ".F1KBNa_panelFailure{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);border-radius:8px;align-items:center;gap:8px;padding:8px 10px;font-size:12px;line-height:16px;display:flex}.F1KBNa_panelFailureText{min-width:0}.F1KBNa_panelFailureRetry{border:1px solid var(--dsw-alias-border-l2);color:inherit;font:inherit;cursor:pointer;background:0 0;border-radius:6px;flex:none;margin-left:auto;padding:2px 8px}.F1KBNa_panelFailureRetry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_layer{box-sizing:border-box;flex:none;align-items:center;width:calc(100% + 4px);height:42px;margin:4px -2px;display:flex;position:relative}.F1KBNa_headerEntry{box-sizing:border-box;width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:28px;flex:none;justify-content:center;align-items:center;padding:6px;display:inline-flex;position:relative}.F1KBNa_headerEntry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_headerEntry[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.F1KBNa_headerEntry:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_headerEntryCount{box-sizing:border-box;background:var(--dsw-alias-button-primary-fill);min-width:14px;height:14px;color:var(--dsw-alias-label-primary-foreground);text-align:center;font-variant-numeric:tabular-nums;pointer-events:none;border-radius:7px;padding:0 3px;font-size:10px;line-height:14px;position:absolute;top:-1px;right:-1px}.F1KBNa_headerEntry svg{display:block}.F1KBNa_footerButtons{align-items:center;width:100%;display:flex}.F1KBNa_badge{box-sizing:border-box;width:100%;height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}.F1KBNa_badge:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_badge[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_badge:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_badgeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.F1KBNa_badgeCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;font-size:12px;line-height:16px}.F1KBNa_layer.F1KBNa_rail{width:36px;height:36px;margin:8px 0 10px}.F1KBNa_rail .F1KBNa_badge{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;padding:0}.F1KBNa_rail .F1KBNa_badgeLabel{display:none}.F1KBNa_rail .F1KBNa_badgeCount{box-sizing:border-box;background:var(--dsw-alias-state-business-primary);min-width:18px;height:18px;color:var(--dsw-alias-label-primary-foreground);font-variant-numeric:tabular-nums;border-radius:9px;justify-content:center;align-items:center;padding:0 4px;font-size:11px;line-height:18px;display:flex;position:absolute;top:-3px;right:-7px}.F1KBNa_coverBackdrop{z-index:29;background:var(--dsw-specific-sidebar-fill);position:fixed;inset:0}.F1KBNa_panel,.F1KBNa_diffPreview{--diff-gutter-surface:var(--dsw-alias-bg-base)}.F1KBNa_panel{z-index:30;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:auto;max-width:none;box-shadow:var(--dsw-shadow-lv2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);-webkit-user-select:none;user-select:none;border-radius:12px;flex-direction:column;display:flex;position:fixed;inset:8px 8px 128px;overflow:hidden}.F1KBNa_panel .F1KBNa_code,.F1KBNa_panel .F1KBNa_mdPreviewBody,.F1KBNa_panel .F1KBNa_diffPath,.F1KBNa_panel input,.F1KBNa_panel textarea,.F1KBNa_panel [contenteditable]{-webkit-user-select:text;user-select:text}.F1KBNa_panelDocked{width:100%;max-width:none;height:100%;box-shadow:none;border:none;border-radius:0;position:static;inset:auto}.F1KBNa_dockHost{flex-direction:column;min-height:0;display:flex;position:absolute;inset:0}.F1KBNa_header{box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:10px 12px;display:flex}.F1KBNa_headerActions{align-items:center;gap:2px;display:flex}.F1KBNa_settingsPage{padding:8px 12px}.F1KBNa_settingsGroup{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupHeader{z-index:3;background:var(--dsw-alias-bg-base);width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;border:none;align-items:center;gap:8px;padding:16px 0;display:flex;position:sticky;top:0}.F1KBNa_settingsGroupText{text-align:left;flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.F1KBNa_settingsGroupTitle{font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsGroupDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsGroupChevron{margin-left:auto;transition:transform .15s}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupChevron{transform:rotate(180deg)}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupHeader{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupBody{flex-direction:column;display:flex}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow{padding-left:16px}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow:last-child,.F1KBNa_settingsPage>.F1KBNa_settingsRow:last-child{border-bottom:none}.F1KBNa_settingsRow{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.F1KBNa_settingsRowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.F1KBNa_settingsRowTitle{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsRowDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsRowLink{color:inherit;cursor:pointer;text-decoration:none}.F1KBNa_settingsRowLink:hover{color:var(--dsw-alias-label-secondary);text-underline-offset:2px;text-decoration:underline}.F1KBNa_settingsSelector{background:var(--dsw-alias-bg-module-platform);min-width:72px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;justify-content:center;align-items:center;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.F1KBNa_settingsSelector:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_settingsSelector[data-recording]{box-shadow:inset 0 0 0 1px var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-secondary)}.F1KBNa_settingsSelectorChevron{flex:none}.F1KBNa_settingsReset{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;margin-left:6px;padding:0;display:inline-flex}.F1KBNa_settingsReset:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_settingsReset:disabled{opacity:.4;cursor:default}.F1KBNa_colorPicker{position:relative}.F1KBNa_colorPickerTrigger{background:var(--dsw-alias-bg-module-platform);width:120px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_colorPickerTrigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_colorSwatch{border:1px solid var(--dsw-alias-border-l2);border-radius:50%;flex:none;width:24px;height:24px}.F1KBNa_colorValue{text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;flex:1;min-width:0;overflow:hidden}.F1KBNa_colorPickerChevron{flex:none}.F1KBNa_colorBackdrop{z-index:40;position:fixed;inset:0}.F1KBNa_colorPickerPopover{z-index:41;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:10px;padding:10px;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_colorPickerPanel{flex-direction:column;gap:8px;display:flex}.F1KBNa_colorPickerInputRow{align-items:center;gap:8px;display:flex}.F1KBNa_colorPickerPreview{border:1px solid var(--dsw-alias-border-l2);border-radius:6px;flex:none;width:22px;height:22px}.F1KBNa_colorPickerInput{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-module-platform);min-width:0;height:30px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;flex:1;padding:0 8px;font-size:12px;line-height:28px}.F1KBNa_colorPickerInput:focus{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-1px}.F1KBNa_colorSv{border:1px solid var(--dsw-alias-border-l1);cursor:crosshair;touch-action:none;border-radius:8px;height:140px;position:relative}.F1KBNa_colorSvCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:14px;height:14px;position:absolute;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_colorHue{border:1px solid var(--dsw-alias-border-l1);cursor:pointer;touch-action:none;border-radius:7px;height:14px;position:relative}.F1KBNa_colorHueCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:16px;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_diffPreview{top:var(--settings-header-h,76px);z-index:2;border:1px solid var(--dsw-alias-border-l1);font:var(--dsw-font-markdown-code-block);background:var(--dsw-alias-markdown-code-block);border-radius:8px;margin:16px 0 8px;padding:8px;position:sticky;overflow:hidden}.F1KBNa_diffPreviewTitle{color:var(--dsw-alias-label-tertiary);margin-bottom:6px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_diffPreviewScroll{height:132px;overflow-y:auto}.F1KBNa_mdPreviewWrap{isolation:isolate;flex:1;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_mdPreviewBody{overscroll-behavior:none;min-width:0;min-height:0;color:var(--dsw-alias-label-primary);flex:1;padding:12px 16px;position:relative;overflow:auto}.F1KBNa_mdPreviewContent{width:100%;min-width:0;margin:0 auto}.F1KBNa_mdPreviewSingle{display:block}.F1KBNa_mdPreviewDouble{display:flex}.F1KBNa_mdPreviewBody .mdBlock{border-radius:4px;margin-bottom:12px;padding:2px 6px}.F1KBNa_mdPreviewBody .mdAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 10%, transparent)}.F1KBNa_mdPreviewBody .mdDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 12%, transparent)}.F1KBNa_mdPreviewBody .mdWordDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdWordAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdDouble{flex-direction:column;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleRow{align-items:flex-start;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleCol{flex:1;min-width:0}.F1KBNa_mdPreviewBody .mdDoubleRule{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:0 12px}.F1KBNa_mdPreviewFallback{font-family:var(--dsw-font-markdown-code-block);color:var(--dsw-alias-label-tertiary);padding:12px 16px;font-size:12px;line-height:18px}.F1KBNa_mdPreviewBody{word-break:break-word;font-size:13px;line-height:20px}.F1KBNa_mdPreviewBody>:first-child{margin-top:0}.F1KBNa_mdPreviewBody>:last-child{margin-bottom:0}.F1KBNa_mdPreviewBody h1,.F1KBNa_mdPreviewBody h2,.F1KBNa_mdPreviewBody h3,.F1KBNa_mdPreviewBody h4,.F1KBNa_mdPreviewBody h5,.F1KBNa_mdPreviewBody h6{margin:16px 0 8px;font-weight:600;line-height:1.3}.F1KBNa_mdPreviewBody h1{font-size:22px}.F1KBNa_mdPreviewBody h2{font-size:19px}.F1KBNa_mdPreviewBody h3{font-size:16px}.F1KBNa_mdPreviewBody h4{font-size:15px}.F1KBNa_mdPreviewBody h5{font-size:14px}.F1KBNa_mdPreviewBody h6{font-size:13px}.F1KBNa_mdPreviewBody p{margin:8px 0}.F1KBNa_mdPreviewBody ul,.F1KBNa_mdPreviewBody ol{margin:8px 0;padding-left:22px}.F1KBNa_mdPreviewBody li{margin:2px 0}.F1KBNa_mdPreviewBody a{color:var(--dsw-alias-state-business-primary);text-decoration:none}.F1KBNa_mdPreviewBody a:hover{text-decoration:underline}.F1KBNa_mdPreviewBody code{font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:4px;padding:1px 5px;font-size:12.5px}.F1KBNa_mdPreviewBody pre{overscroll-behavior-x:none;border:1px solid var(--dsw-alias-border-l1);font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:8px;margin:8px 0;padding:10px 12px;font-size:12.5px;line-height:18px;overflow:auto}.F1KBNa_mdPreviewBody pre code{background:0 0;padding:0}.F1KBNa_mdPreviewBody blockquote{border-left:3px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);margin:8px 0;padding:0 12px}.F1KBNa_mdPreviewBody hr{background:var(--dsw-alias-border-l1);border:none;height:1px;margin:16px 0}.F1KBNa_mdPreviewBody table{border-collapse:collapse;margin:8px 0}.F1KBNa_mdPreviewBody th,.F1KBNa_mdPreviewBody td{border:1px solid var(--dsw-alias-border-l1);padding:4px 10px}.F1KBNa_mdPreviewBody img{max-width:100%}.F1KBNa_mdPreviewBody .mdImageFallback{border:1px dashed var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-markdown-code-block) 45%, transparent);width:100%;min-height:120px;color:var(--dsw-alias-label-secondary);font-family:var(--dsw-font-markdown-code-block);text-align:center;white-space:pre-wrap;word-break:break-all;border-radius:4px;justify-content:center;align-items:center;margin:0 auto;padding:8px 12px;font-size:12px;line-height:16px;display:flex}.F1KBNa_toggle{border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:18px;flex:none;width:60px;height:36px;padding:0;position:relative}.F1KBNa_toggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_toggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.F1KBNa_toggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleOn:hover{background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleThumb{background:var(--dsw-alias-label-primary);border-radius:50%;width:28px;height:28px;transition:left .12s;position:absolute;top:3px;left:3px}.F1KBNa_toggleOn .F1KBNa_toggleThumb{background:#fff;left:27px}.F1KBNa_stepper{align-items:center;gap:6px;display:inline-flex}.F1KBNa_stepperButton{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);width:32px;height:32px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;padding:0;position:relative}.F1KBNa_stepperButton:before,.F1KBNa_stepperButton:after{content:\"\";background:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_stepperButton:before{width:10px;height:1px}.F1KBNa_stepperButton:after{width:1px;height:10px;display:none}.F1KBNa_stepperButtonUp:after{display:block}.F1KBNa_stepperButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_stepperButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_stepperValue{text-align:center;min-width:2ch;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:14px;line-height:22px}.F1KBNa_states{flex-direction:column;flex:1;min-height:0;padding:4px 12px 12px;display:flex;overflow-y:auto}.F1KBNa_split{flex:1;align-items:stretch;min-height:0;display:flex;position:relative}.F1KBNa_fileListKnob{z-index:39;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;box-shadow:var(--dsw-elevation-prominent);border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute}.F1KBNa_fileListKnob[data-open]{box-shadow:none;opacity:0}.F1KBNa_fileListKnob:not([data-open]){animation:.32s ease-in-out .5s both F1KBNa_fileListKnobIn}@keyframes F1KBNa_fileListKnobIn{0%{opacity:0}to{opacity:1}}.F1KBNa_fileListKnob:hover,.F1KBNa_fileListKnob:focus-visible{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-interactive-bg-hover), var(--dsw-alias-interactive-bg-hover))}.F1KBNa_fileListFloat{z-index:40;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);box-shadow:none;transform-origin:0 0;border-radius:12px;flex-direction:column;padding:6px 0 10px 8px;display:flex;position:absolute;overflow:hidden}.F1KBNa_fileListFloatClosing{pointer-events:none;animation:.14s ease-in forwards F1KBNa_fileListShrink}@keyframes F1KBNa_fileListShrink{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.96)}}.F1KBNa_fileList{box-sizing:border-box;border-right:1px solid var(--dsw-alias-border-l2);flex-direction:column;flex:none;width:260px;min-height:0;padding:4px 0 12px 8px;display:flex}.F1KBNa_listScroll{scrollbar-gutter:stable;flex:1;min-height:0;padding-right:2px;overflow-y:scroll}.F1KBNa_fileListFloat .F1KBNa_listScroll{margin-right:2px}.F1KBNa_bulkActions{flex:none;gap:6px;padding:8px 8px 0 0;display:flex}.F1KBNa_bulkActions .F1KBNa_action{text-align:center;flex:auto}.F1KBNa_bulkActions .F1KBNa_action:disabled{opacity:.4;cursor:default}.F1KBNa_addPath{justify-content:center;align-items:center;gap:4px;display:inline-flex}.F1KBNa_resizeHandle{cursor:col-resize;touch-action:none;background:0 0;flex:none;width:5px;margin:0 -2px}.F1KBNa_resizeHandle:hover{background:var(--dsw-alias-border-l2)}.F1KBNa_floatResizeHandle{z-index:41;cursor:col-resize;-webkit-user-select:none;user-select:none;touch-action:none;background:0 0;border-radius:4px;position:absolute}.F1KBNa_floatResizeHandle:hover{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-border-l2), var(--dsw-alias-border-l2))}.F1KBNa_detail{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.F1KBNa_detailEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;flex:1;justify-content:center;align-items:center;margin:0;padding:24px;font-size:12px;line-height:18px;display:flex}.F1KBNa_confirmBackdrop{z-index:55;background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);justify-content:center;align-items:center;padding:24px;display:flex;position:absolute;inset:0}.F1KBNa_confirmBackdropFixed{z-index:60;position:fixed}.F1KBNa_confirmCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:340px;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:12px;padding:16px;display:flex}.F1KBNa_confirmTitle{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;flex:none;margin:0;font-size:13px;font-weight:500;line-height:20px}.F1KBNa_confirmText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;margin:0;line-height:1.5}.F1KBNa_confirmBlock{flex-direction:column;gap:6px;min-width:0;display:flex}.F1KBNa_confirmList{overscroll-behavior:contain;scrollbar-gutter:stable;background:var(--dsw-alias-bg-module-platform);max-height:104px;font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;border-radius:6px;margin:0;padding:0 6px;font-size:11px;line-height:16px;list-style:none;overflow-y:auto}.F1KBNa_confirmActions{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;display:flex}.F1KBNa_pickerCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:420px;max-width:100%;height:70%;max-height:100%;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:8px;padding:14px 16px 16px;display:flex;position:relative;overflow:hidden}.F1KBNa_pickerTitle{color:var(--dsw-alias-label-primary);flex:none;font-size:13px;font-weight:500;line-height:20px}.F1KBNa_pickerClose{width:22px;height:22px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;top:10px;right:10px}.F1KBNa_pickerClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_pickerForm{flex:none;gap:8px;display:flex}.F1KBNa_pickerInput{border:1px solid var(--dsw-alias-border-l1);min-width:0;color:var(--dsw-alias-label-primary);background:0 0;border-radius:8px;flex:auto;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_pickerInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_tree{scrollbar-gutter:stable;border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex:auto;min-height:0;padding:4px 2px 4px 4px;overflow:auto scroll}.F1KBNa_treeRow{border-radius:6px;align-items:center;gap:2px;padding-right:4px;display:flex}.F1KBNa_treeRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_treeRow[data-selected]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)}.F1KBNa_treeCaret{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_treeCaret:hover{color:var(--dsw-alias-label-primary)}.F1KBNa_treeName{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:auto;align-items:center;gap:6px;padding:2px 4px;font-family:inherit;font-size:12px;line-height:18px;display:flex}.F1KBNa_treeName:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_treeNote{color:var(--dsw-alias-label-tertiary);margin:2px 0;font-size:12px;line-height:18px}.F1KBNa_pickerIcon{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_pickerName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_pickerNote{color:var(--dsw-alias-label-tertiary);flex:none;margin:0;font-size:12px;line-height:18px}.F1KBNa_pickerCheck{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;margin-right:auto;font-size:12px;line-height:18px;display:flex}.F1KBNa_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}.F1KBNa_note,.F1KBNa_readError{color:var(--dsw-alias-label-tertiary);margin:4px 0;font-size:12px;line-height:18px}.F1KBNa_noteCentered{text-align:center;margin:auto}.F1KBNa_emptyState{flex-direction:column;align-items:center;gap:10px;margin:auto;display:flex}.F1KBNa_importButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:5px 14px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_importButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_importButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_importNote{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;font-size:12px;line-height:18px}.F1KBNa_readError{color:var(--dsw-alias-state-error-primary)}.F1KBNa_action.F1KBNa_addButton{box-sizing:border-box;border-radius:6px;flex:none;justify-content:center;align-items:center;width:20px;height:20px;min-height:0;padding:0;display:inline-flex}.F1KBNa_listHead{flex:none;align-items:center;gap:4px;margin:8px 1px 2px;padding-right:8px;display:flex}.F1KBNa_action.F1KBNa_addButton.F1KBNa_listFold{width:26px;height:26px}.F1KBNa_listTitle{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_listTabs{background:var(--dsw-alias-interactive-bg-hover);border-radius:8px;flex:auto;gap:2px;min-width:0;padding:2px;display:flex}.F1KBNa_listTab{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:6px;padding:3px 8px;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_tabCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}.F1KBNa_listTab[aria-selected=true]{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.F1KBNa_commentGroup{margin:0 0 6px}.F1KBNa_commentGroup:last-child{margin-bottom:0}.F1KBNa_commentGroupName{color:var(--dsw-alias-label-tertiary);margin:0;padding:4px 13px 2px;font-size:11px;font-weight:500;line-height:16px}.F1KBNa_commentRow{box-sizing:border-box;width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;padding:6px 8px;display:block;position:relative}.F1KBNa_commentRow:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_commentRow[data-selected]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_commentHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.F1KBNa_commentLabel{white-space:nowrap;text-align:right;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:12px;line-height:18px}.F1KBNa_commentTitle{-webkit-line-clamp:3;text-overflow:ellipsis;overflow-wrap:anywhere;text-align:left;min-width:0;color:var(--dsw-alias-label-primary);-webkit-box-orient:vertical;flex:1;margin-left:4px;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.F1KBNa_commentTitleEmpty{color:var(--dsw-alias-label-tertiary)}.F1KBNa_listEmpty{color:var(--dsw-alias-label-tertiary);margin:8px 12px;font-size:12px;line-height:18px}.F1KBNa_emptyActions{flex-wrap:wrap;justify-content:center;gap:8px;display:flex}.F1KBNa_rows{margin:0;padding:0;list-style:none}.F1KBNa_row{border:1px solid #0000;border-radius:10px;margin:2px 0}.F1KBNa_rowMenuAnchor{display:none}.F1KBNa_rowHead{width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;align-items:center;gap:8px;padding:6px 8px;display:flex;position:relative}.F1KBNa_rowHead:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_rowHead[data-selected],.F1KBNa_rowHead[data-picked]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_rowPath{text-overflow:ellipsis;white-space:nowrap;min-width:0;margin-left:4px;font-size:12px;line-height:18px;overflow:hidden}.F1KBNa_unseenDot{flex:none;align-self:center;position:absolute;top:50%;left:5px;overflow:visible;transform:translateY(-50%)}.F1KBNa_categoryDot{pointer-events:none;-webkit-user-select:none;user-select:none;border-radius:50%;width:3px;height:3px;position:absolute;top:13.5px;left:5px}.F1KBNa_rowFailed{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_actionError{border-bottom:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere;margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_rowMeta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;gap:6px;margin-left:auto;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_addCount{color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_delCount{color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_diff{background:var(--dsw-alias-markdown-code-block);flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffHeader{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_panelDocked .F1KBNa_diffHeader{background:var(--dsw-alias-bg-base)}.F1KBNa_diffPath{appearance:none;min-width:0;font:inherit;text-overflow:ellipsis;color:var(--dsw-alias-label-primary);background:0 0;border:0;flex:1;margin-left:4px;padding:0;font-size:12px;line-height:18px;position:relative;top:1px}.F1KBNa_diffPath:focus{outline:none}.F1KBNa_diffActions{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffActionInfo{flex:auto;align-items:center;gap:8px;min-width:0;display:flex;overflow:hidden}.F1KBNa_diffActionDecisions{flex:none;align-items:center;gap:8px;display:flex}.F1KBNa_diffStats{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:16px}.F1KBNa_flexSpacer{flex:1}.F1KBNa_gotoLayer{z-index:30;place-items:center;display:grid;position:absolute;inset:0}.F1KBNa_gotoLayerRight{left:50%;right:var(--dsh-scrollbar-width,8px);bottom:calc(var(--dsh-scrollbar-width,8px) + 1px)}.F1KBNa_gotoBackdrop{z-index:29;position:fixed;inset:0}.F1KBNa_gotoBox{z-index:1;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;flex-direction:column;align-items:stretch;gap:4px;padding:4px;display:flex;position:relative}.F1KBNa_gotoRow{align-items:center;gap:4px;display:flex}.F1KBNa_gotoInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:9em;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;flex:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_gotoInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_gotoAction{white-space:nowrap;flex:none}.F1KBNa_divider{background:var(--dsw-alias-border-l1);align-self:stretch;width:1px;margin:2px 0}.F1KBNa_action{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;text-decoration:none}.F1KBNa_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_action:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_actionChord{color:var(--dsw-alias-label-tertiary);margin-left:6px;font-size:11px}.F1KBNa_actionPrimary{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_actionPrimary:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_actionPrimary:disabled{background:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:.55}.F1KBNa_actionQuietDisabled:disabled{cursor:pointer;color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l1);background:0 0}.F1KBNa_actionPrimary.F1KBNa_actionQuietDisabled:disabled{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:1}.F1KBNa_iconAction{justify-content:center;align-items:center;min-height:25px;padding:4px 6px;display:inline-flex}.F1KBNa_close{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_expand{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_expand:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_diffBodyWrap{isolation:isolate;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBody{overscroll-behavior:none;min-width:0;font:var(--dsw-font-markdown-code-block);-webkit-text-size-adjust:100%;text-size-adjust:100%;cursor:text;outline:none;flex:1;padding:0;position:relative;overflow:auto}.F1KBNa_diffBody::-webkit-scrollbar,.F1KBNa_diffBody::-webkit-scrollbar-track,.F1KBNa_diffBody::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_blockActions{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);z-index:2;border-radius:10px;align-items:center;gap:9px;padding:5px;display:flex;position:absolute;right:8px}.F1KBNa_blockActions[data-diff-selection-actions]{pointer-events:none}.F1KBNa_blockActions[data-diff-selection-actions] button{pointer-events:auto}.F1KBNa_blockActions[data-diff-frame-drag],.F1KBNa_blockActions[data-diff-frame-drag] button{pointer-events:none}.F1KBNa_blockActionsDivider{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:2px 0}.F1KBNa_blockPosition{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;margin-top:1px;margin-left:7px;font-size:12px;line-height:16px}.F1KBNa_searchBar{z-index:3;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;align-items:center;gap:4px;padding:4px;display:flex;position:absolute;top:8px;right:8px}.F1KBNa_searchInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:150px;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_searchInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchCount{text-align:center;min-width:34px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:16px}.F1KBNa_searchToggle{border:1px solid var(--dsw-alias-border-l1);min-height:25px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;justify-content:center;align-items:center;padding:4px 6px;display:inline-flex}.F1KBNa_searchToggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_searchToggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchMatch{color:inherit;background-color:#facc1542;border-radius:2px}.F1KBNa_searchMatchCurrent{color:inherit;background-color:#facc1599;border-radius:2px}.F1KBNa_blockFlash{z-index:3;box-sizing:border-box;border:2px solid var(--dsw-alias-state-business-primary);pointer-events:none;border-radius:4px;animation:1s ease-out forwards F1KBNa_diffFlashFade;position:absolute;left:0;right:0}.F1KBNa_blockFlashShake{animation:.7s ease-out forwards F1KBNa_diffFlashShake}.F1KBNa_discussionRow{background:var(--dsw-alias-bg-base);display:table-row}.F1KBNa_discussionCell{display:table-cell}.F1KBNa_discussionPin{z-index:2;width:0;height:0;position:sticky;left:0}.F1KBNa_discussion{z-index:2;box-sizing:border-box;border-left:3px solid var(--dsw-alias-state-business-primary);box-shadow:inset 0 1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset 0 -1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset -1px 0 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent);cursor:default;background:0 0;flex-direction:column;display:flex;position:absolute;top:0;left:0;overflow:hidden}.F1KBNa_discussionHead{font:var(--dsw-font-markdown-code-block)}.F1KBNa_discussionHead .F1KBNa_unseenDot{vertical-align:middle;flex:none;align-self:center;margin-right:6px;display:inline-block;position:static;transform:none}.F1KBNa_discussionBody,.F1KBNa_threadFontProbe{font:var(--dsw-font-markdown-base);font-size:calc(var(--dsh-content-font-size,14px) - 2px)}.F1KBNa_threadFontProbe{visibility:hidden;pointer-events:none;width:0;height:0;position:absolute;overflow:hidden}.F1KBNa_discussionBody{flex-direction:column;flex:auto;min-height:0;padding:0 12px;display:flex;overflow:hidden}.F1KBNa_discussion[data-lost]{border-left-color:var(--dsw-alias-label-secondary);background:repeating-linear-gradient(135deg, var(--dsw-alias-interactive-bg-hover) 0 4px, transparent 4px 8px);background-origin:border-box}.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend,.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:hover:not(:disabled),.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:disabled{background:var(--dsw-alias-label-secondary);border-color:var(--dsw-alias-label-secondary);color:var(--dsw-alias-label-primary-foreground)}.F1KBNa_discussion[data-lost] .F1KBNa_discussionUser{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 30%, transparent)}.F1KBNa_discussionAnswer{color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionUser{box-sizing:border-box;background:var(--dsw-specific-bubble,var(--dsw-alias-bg-layer-2,var(--dsw-alias-interactive-bg-hover)));width:fit-content;max-width:82%;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:8px 0 8px 8px;margin:6.6px 0 6.6px auto;padding:4.4px 11px;font-family:inherit;line-height:22px}.F1KBNa_discussionCode{box-sizing:border-box;font:var(--dsw-font-markdown-code);font-family:var(--ds-font-family-code);background:color-mix(in srgb, var(--dsw-alias-markdown-inline-code,var(--dsw-alias-interactive-bg-hover-solid)) 90%, var(--dsw-alias-label-secondary));border:.5px solid var(--dsw-alias-border-l1);border-radius:6px;align-items:center;padding:0 5px;font-size:.875em;line-height:16px;display:inline-flex}.F1KBNa_discussionBody strong{font-weight:700}.F1KBNa_discussionNote{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionNote[data-diff-discussion-hidden]{color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionDots{margin-left:1px}.F1KBNa_discussionDots>span{animation:1.2s ease-in-out infinite F1KBNa_discussionDot}.F1KBNa_discussionDots>span:nth-child(2){animation-delay:.15s}.F1KBNa_discussionDots>span:nth-child(3){animation-delay:.3s}@keyframes F1KBNa_discussionDot{0%,60%,to{opacity:.25}30%{opacity:1}}.F1KBNa_quoteLines{table-layout:fixed;border-spacing:0;width:calc(100% + 27px);min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block);line-height:var(--dsh-diff-line-height,22px);background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover) 55%, transparent);margin:0 -12px 0 -15px;display:table}.F1KBNa_quoteAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 12%, transparent)}.F1KBNa_quoteDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 13%, transparent)}.F1KBNa_quoteLine{font-size:calc(1em * var(--dsh-diff-font-scale,1));height:var(--dsh-diff-line-height,22px);display:table-row}.F1KBNa_quoteCode{display:table-cell}.F1KBNa_quoteText{white-space:pre-wrap;overflow-wrap:anywhere;display:block}.F1KBNa_quoteNoWrap .F1KBNa_quoteText{white-space:pre;overflow-wrap:normal;overflow:hidden}.F1KBNa_quoteNoWrap .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-diff-quote-width,0px) + 100%);display:inline-block}.F1KBNa_quoteSplit{align-self:stretch;align-items:flex-start;margin:0 -12px;display:flex}.F1KBNa_quoteSplitSide{flex:1 1 0;min-width:0}.F1KBNa_quoteSplitSide+.F1KBNa_quoteSplitSide{border-left:1px solid var(--dsw-alias-border-l2)}.F1KBNa_quoteSplitTable{table-layout:fixed;border-spacing:0;width:100%;display:table}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=left] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-left,0px) + 100%);display:inline-block}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=right] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-right,0px) + 100%);display:inline-block}.F1KBNa_discussionHead{box-sizing:border-box;flex:none;align-items:center;gap:8px;height:22px;padding:0 6px;font-size:12px;line-height:16px;display:flex}.F1KBNa_discussionCompose{box-sizing:border-box;flex:none;align-items:flex-end;gap:8px;height:44px;margin:0 -6px;padding:0 0 6.6px;display:flex}.F1KBNa_discussionSlack{flex:1 1 0;min-height:0;max-height:22px}.F1KBNa_discussionInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);min-width:0;height:26px;color:var(--dsw-alias-label-primary);cursor:text;border-radius:6px;flex:auto;padding:3px 8px;font-family:inherit;line-height:18px}.F1KBNa_discussionToggle{width:18px;height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_discussionToggle:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_discussionRangeWrap{min-width:0;font:var(--dsw-font-markdown-code-block);flex:0 auto;overflow:hidden}.F1KBNa_discussionHead>:not(.F1KBNa_discussionRangeWrap){flex:none}.F1KBNa_discussionHead>.F1KBNa_flexSpacer{flex:1}.F1KBNa_discussionRange{white-space:nowrap;text-overflow:ellipsis;text-align:left;color:var(--dsw-alias-label-tertiary);direction:rtl;font-family:inherit;display:block;overflow:hidden}.F1KBNa_discussionInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_discussionInput::placeholder{font-family:inherit;font-size:inherit;color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionSend{box-sizing:border-box;white-space:nowrap;flex:none;justify-content:center;align-items:center;gap:6px;height:26px;padding-left:9px;padding-right:9px;display:inline-flex}.F1KBNa_rowDiscussed{--diff-row-wash:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);background-image:linear-gradient(var(--diff-row-wash), var(--diff-row-wash))}@keyframes F1KBNa_diffFlashFade{0%{opacity:1}to{opacity:0}}@keyframes F1KBNa_diffFlashShake{0%{opacity:1;transform:translateY(0)}10%{transform:translateY(1px)}20%{transform:translateY(-1px)}30%{transform:translateY(1px)}40%{transform:translateY(-1px)}50%{transform:translateY(1px)}60%{transform:translateY(-1px)}70%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(0)}}.F1KBNa_overviewRuler{pointer-events:none;opacity:.5;width:4px;position:absolute;top:0;bottom:0;right:0}.F1KBNa_overviewRulerSplit{width:var(--dsh-scrollbar-width,8px);bottom:calc(var(--dsh-scrollbar-width,8px) + 1px)}.F1KBNa_overviewMarker{border-radius:2px;width:100%;min-height:2px;position:absolute;right:0}.F1KBNa_markerDel{background-color:var(--dsw-alias-state-error-primary)}.F1KBNa_markerAdd{background-color:var(--dsw-alias-state-success-primary)}.F1KBNa_markerSplitDel{width:50%;left:0;right:auto}.F1KBNa_markerSplitAdd{width:50%;left:auto;right:0}.F1KBNa_lines{border-spacing:0;width:max-content;min-width:100%;font-size:calc(1em * var(--dsh-diff-font-scale,1));display:table}.F1KBNa_line{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);-webkit-user-select:none;user-select:none;display:table-row}.F1KBNa_vSpacer{display:table-row}.F1KBNa_gutter{box-sizing:border-box;text-align:right;width:44px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;cursor:default;padding-right:10px;display:table-cell}.F1KBNa_line>.F1KBNa_gutter{z-index:1;background-color:var(--diff-gutter-surface);background-image:linear-gradient(var(--diff-row-tint,transparent), var(--diff-row-tint,transparent)), linear-gradient(var(--diff-row-wash,transparent), var(--diff-row-wash,transparent));position:sticky;left:0}.F1KBNa_line>.F1KBNa_gutter+.F1KBNa_gutter{left:44px}.F1KBNa_gutter[data-diff-quote-gutter]{background-color:var(--diff-gutter-surface)}.F1KBNa_code{white-space:pre;-webkit-user-select:text;user-select:text;display:table-cell}.F1KBNa_context{color:var(--dsw-alias-label-primary)}.F1KBNa_del{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_add{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_statusBar{box-sizing:border-box;border-top:1px solid var(--dsw-alias-border-l2);height:34px;color:var(--dsw-alias-label-tertiary);font-family:var(--dsw-font-markdown-code-block);font-variant-numeric:tabular-nums;flex:none;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:flex}.F1KBNa_statusAction{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);white-space:nowrap;cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_statusAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langSelect{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;flex:none;align-items:center;gap:4px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_langSelect:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langLabel{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.F1KBNa_presentationSelect{cursor:pointer;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_presentationSelect:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_chip{justify-content:flex-end;align-items:center;gap:5px;min-width:0;padding-right:14px;display:inline-flex}.F1KBNa_chipLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_coverHost{align-items:center;display:inline-flex;position:relative}.F1KBNa_coverCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:12px;align-items:center;gap:4px;padding:6px;display:flex}.F1KBNa_coverPopover{z-index:50;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_coverNotice{z-index:80;pointer-events:none;animation:1.25s ease-out forwards F1KBNa_coverNoticeFade;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_coverNoticeCard{gap:4px;padding:6px 8px}@keyframes F1KBNa_coverNoticeFade{0%,78%{opacity:1}to{opacity:0}}.F1KBNa_coverNoticeGlyph{width:44px;height:44px;color:var(--dsw-alias-label-tertiary);border-radius:10px;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_coverNoticeGlyph[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_coverNoticeGlyph[data-changed]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_coverNoticeText{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.F1KBNa_coverButton{width:32px;height:32px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_coverButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_coverButton[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_presentationHost{align-items:center;display:inline-flex}.F1KBNa_chipPresentation{min-width:36px;height:20px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:20px;flex:none;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_chipPresentation:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_mirrored{transform:scaleX(-1)}.F1KBNa_notice{z-index:60;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:360px;box-shadow:var(--dsw-shadow-lv3);border-radius:10px;align-items:flex-start;gap:12px;padding:12px 14px;display:flex;position:fixed;bottom:24px;right:24px}.F1KBNa_noticeText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);flex:1;margin:0;line-height:1.45}.F1KBNa_noticeButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font:var(--dsw-font-caption);cursor:pointer;border-radius:6px;flex:none;padding:4px 10px}.F1KBNa_noticeButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_wrap .F1KBNa_line{height:auto;min-height:var(--dsh-diff-line-height,22px)}.F1KBNa_subline{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);white-space:pre;display:block;overflow:hidden}.F1KBNa_wrapActive{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_wrapActive:hover{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_splitRoot{isolation:isolate;flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBodySplit{flex:1;min-height:0;overflow-x:hidden}.F1KBNa_splitCols{width:100%;min-width:0;min-height:100%;display:flex}.F1KBNa_splitCol{box-sizing:border-box;flex:1 1 0;min-width:0;overflow:hidden}.F1KBNa_splitDivider{background:var(--dsw-alias-border-l2);flex:0 0 1px}.F1KBNa_splitDiscussions{z-index:3;pointer-events:none;width:100%;height:0;position:absolute;top:0;left:0}.F1KBNa_splitDiscussion{box-sizing:border-box;pointer-events:auto;background:var(--dsw-alias-bg-base);position:absolute;left:0}.F1KBNa_splitSealed,.F1KBNa_splitSealed *{-webkit-user-select:none!important;user-select:none!important}.F1KBNa_splitSealedLeft [data-diff-split-side=left],.F1KBNa_splitSealedLeft [data-diff-split-side=left] *,.F1KBNa_splitSealedRight [data-diff-split-side=right],.F1KBNa_splitSealedRight [data-diff-split-side=right] *{-webkit-user-select:text!important;user-select:text!important}.F1KBNa_splitCol .F1KBNa_gutter,.F1KBNa_splitCol .F1KBNa_code{vertical-align:top}.F1KBNa_splitHScrollRow{border-top:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;width:100%;min-width:0;display:flex}.F1KBNa_splitHScroll{overscroll-behavior-x:none;min-width:0;height:var(--dsh-scrollbar-width,8px);flex:1 1 0;overflow:auto hidden}.F1KBNa_splitHScroll::-webkit-scrollbar{height:var(--dsh-scrollbar-width,8px)}.F1KBNa_splitHScroll::-webkit-scrollbar-track{cursor:default}.F1KBNa_splitHScroll::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_splitHScrollFill{height:1px}.F1KBNa_splitLdel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent)}.F1KBNa_splitRadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent)}.F1KBNa_intraDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);text-decoration:line-through}.F1KBNa_intraAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 32%, transparent)}";
333
+ const css = ".F1KBNa_panelFailure{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);border-radius:8px;align-items:center;gap:8px;padding:8px 10px;font-size:12px;line-height:16px;display:flex}.F1KBNa_panelFailureText{min-width:0}.F1KBNa_panelFailureRetry{border:1px solid var(--dsw-alias-border-l2);color:inherit;font:inherit;cursor:pointer;background:0 0;border-radius:6px;flex:none;margin-left:auto;padding:2px 8px}.F1KBNa_panelFailureRetry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_layer{box-sizing:border-box;flex:none;align-items:center;width:calc(100% + 4px);height:42px;margin:4px -2px;display:flex;position:relative}.F1KBNa_headerEntry{box-sizing:border-box;width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:28px;flex:none;justify-content:center;align-items:center;padding:6px;display:inline-flex;position:relative}.F1KBNa_headerEntry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_headerEntry[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.F1KBNa_headerEntry:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_headerEntryCount{box-sizing:border-box;background:var(--dsw-alias-button-primary-fill);min-width:14px;height:14px;color:var(--dsw-alias-label-primary-foreground);text-align:center;font-variant-numeric:tabular-nums;pointer-events:none;border-radius:7px;padding:0 3px;font-size:10px;line-height:14px;position:absolute;top:-1px;right:-1px}.F1KBNa_headerEntry svg{display:block}.F1KBNa_footerButtons{align-items:center;width:100%;display:flex}.F1KBNa_badge{box-sizing:border-box;width:100%;height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}.F1KBNa_badge:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_badge[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_badge:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_badgeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.F1KBNa_badgeCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;font-size:12px;line-height:16px}.F1KBNa_layer.F1KBNa_rail{width:36px;height:36px;margin:8px 0 10px}.F1KBNa_rail .F1KBNa_badge{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;padding:0}.F1KBNa_rail .F1KBNa_badgeLabel{display:none}.F1KBNa_rail .F1KBNa_badgeCount{box-sizing:border-box;background:var(--dsw-alias-state-business-primary);min-width:18px;height:18px;color:var(--dsw-alias-label-primary-foreground);font-variant-numeric:tabular-nums;border-radius:9px;justify-content:center;align-items:center;padding:0 4px;font-size:11px;line-height:18px;display:flex;position:absolute;top:-3px;right:-7px}.F1KBNa_coverBackdrop{z-index:29;background:var(--dsw-specific-sidebar-fill);position:fixed;inset:0}.F1KBNa_panel,.F1KBNa_diffPreview{--diff-gutter-surface:var(--dsw-alias-bg-base)}.F1KBNa_panel{z-index:30;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:auto;max-width:none;box-shadow:var(--dsw-shadow-lv2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);-webkit-user-select:none;user-select:none;border-radius:12px;flex-direction:column;display:flex;position:fixed;inset:8px 8px 128px;overflow:hidden}.F1KBNa_panel .F1KBNa_code,.F1KBNa_panel .F1KBNa_mdPreviewBody,.F1KBNa_panel .F1KBNa_diffPath,.F1KBNa_panel input,.F1KBNa_panel textarea,.F1KBNa_panel [contenteditable]{-webkit-user-select:text;user-select:text}.F1KBNa_panelDocked{width:100%;max-width:none;height:100%;box-shadow:none;border:none;border-radius:0;position:static;inset:auto}.F1KBNa_dockHost{flex-direction:column;min-height:0;display:flex;position:absolute;inset:0}.F1KBNa_header{box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:10px 12px;display:flex}.F1KBNa_headerActions{align-items:center;gap:2px;display:flex}.F1KBNa_settingsPage{padding:8px 12px}.F1KBNa_settingsGroup{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupHeader{z-index:3;background:var(--dsw-alias-bg-base);width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;border:none;align-items:center;gap:8px;padding:16px 0;display:flex;position:sticky;top:0}.F1KBNa_settingsGroupText{text-align:left;flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.F1KBNa_settingsGroupTitle{font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsGroupDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsGroupChevron{margin-left:auto;transition:transform .15s}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupChevron{transform:rotate(180deg)}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupHeader{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupBody{flex-direction:column;display:flex}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow{padding-left:16px}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow:last-child,.F1KBNa_settingsPage>.F1KBNa_settingsRow:last-child{border-bottom:none}.F1KBNa_settingsRow{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.F1KBNa_settingsRowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.F1KBNa_settingsRowTitle{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsRowDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsRowLink{color:inherit;cursor:pointer;text-decoration:none}.F1KBNa_settingsRowLink:hover{color:var(--dsw-alias-label-secondary);text-underline-offset:2px;text-decoration:underline}.F1KBNa_settingsSelector{background:var(--dsw-alias-bg-module-platform);min-width:72px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;justify-content:center;align-items:center;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.F1KBNa_settingsSelector:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_settingsSelector[data-recording]{box-shadow:inset 0 0 0 1px var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-secondary)}.F1KBNa_settingsSelectorChevron{flex:none}.F1KBNa_settingsReset{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;margin-left:6px;padding:0;display:inline-flex}.F1KBNa_settingsReset:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_settingsReset:disabled{opacity:.4;cursor:default}.F1KBNa_colorPicker{position:relative}.F1KBNa_colorPickerTrigger{background:var(--dsw-alias-bg-module-platform);width:120px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_colorPickerTrigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_colorSwatch{border:1px solid var(--dsw-alias-border-l2);border-radius:50%;flex:none;width:24px;height:24px}.F1KBNa_colorValue{text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;flex:1;min-width:0;overflow:hidden}.F1KBNa_colorPickerChevron{flex:none}.F1KBNa_colorBackdrop{z-index:40;position:fixed;inset:0}.F1KBNa_colorPickerPopover{z-index:41;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:10px;padding:10px;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_colorPickerPanel{flex-direction:column;gap:8px;display:flex}.F1KBNa_colorPickerInputRow{align-items:center;gap:8px;display:flex}.F1KBNa_colorPickerPreview{border:1px solid var(--dsw-alias-border-l2);border-radius:6px;flex:none;width:22px;height:22px}.F1KBNa_colorPickerInput{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-module-platform);min-width:0;height:30px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;flex:1;padding:0 8px;font-size:12px;line-height:28px}.F1KBNa_colorPickerInput:focus{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-1px}.F1KBNa_colorSv{border:1px solid var(--dsw-alias-border-l1);cursor:crosshair;touch-action:none;border-radius:8px;height:140px;position:relative}.F1KBNa_colorSvCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:14px;height:14px;position:absolute;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_colorHue{border:1px solid var(--dsw-alias-border-l1);cursor:pointer;touch-action:none;border-radius:7px;height:14px;position:relative}.F1KBNa_colorHueCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:16px;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_diffPreview{top:var(--settings-header-h,76px);z-index:2;border:1px solid var(--dsw-alias-border-l1);font:var(--dsw-font-markdown-code-block);background:var(--dsw-alias-markdown-code-block);border-radius:8px;margin:16px 0 8px;padding:8px;position:sticky;overflow:hidden}.F1KBNa_diffPreviewTitle{color:var(--dsw-alias-label-tertiary);margin-bottom:6px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_diffPreviewScroll{height:132px;overflow-y:auto}.F1KBNa_mdPreviewWrap{isolation:isolate;flex:1;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_mdPreviewBody{overscroll-behavior:none;min-width:0;min-height:0;color:var(--dsw-alias-label-primary);flex:1;padding:12px 16px;position:relative;overflow:auto}.F1KBNa_mdPreviewContent{width:100%;min-width:0;margin:0 auto}.F1KBNa_mdPreviewSingle{display:block}.F1KBNa_mdPreviewDouble{display:flex}.F1KBNa_mdPreviewBody .mdBlock{border-radius:4px;margin-bottom:12px;padding:2px 6px}.F1KBNa_mdPreviewBody .mdAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 10%, transparent)}.F1KBNa_mdPreviewBody .mdDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 12%, transparent)}.F1KBNa_mdPreviewBody .mdWordDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdWordAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdDouble{flex-direction:column;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleRow{align-items:flex-start;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleCol{flex:1;min-width:0}.F1KBNa_mdPreviewBody .mdDoubleRule{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:0 12px}.F1KBNa_mdPreviewFallback{font-family:var(--dsw-font-markdown-code-block);color:var(--dsw-alias-label-tertiary);padding:12px 16px;font-size:12px;line-height:18px}.F1KBNa_mdPreviewBody{word-break:break-word;font-size:13px;line-height:20px}.F1KBNa_mdPreviewBody>:first-child{margin-top:0}.F1KBNa_mdPreviewBody>:last-child{margin-bottom:0}.F1KBNa_mdPreviewBody h1,.F1KBNa_mdPreviewBody h2,.F1KBNa_mdPreviewBody h3,.F1KBNa_mdPreviewBody h4,.F1KBNa_mdPreviewBody h5,.F1KBNa_mdPreviewBody h6{margin:16px 0 8px;font-weight:600;line-height:1.3}.F1KBNa_mdPreviewBody h1{font-size:22px}.F1KBNa_mdPreviewBody h2{font-size:19px}.F1KBNa_mdPreviewBody h3{font-size:16px}.F1KBNa_mdPreviewBody h4{font-size:15px}.F1KBNa_mdPreviewBody h5{font-size:14px}.F1KBNa_mdPreviewBody h6{font-size:13px}.F1KBNa_mdPreviewBody p{margin:8px 0}.F1KBNa_mdPreviewBody ul,.F1KBNa_mdPreviewBody ol{margin:8px 0;padding-left:22px}.F1KBNa_mdPreviewBody li{margin:2px 0}.F1KBNa_mdPreviewBody a{color:var(--dsw-alias-state-business-primary);text-decoration:none}.F1KBNa_mdPreviewBody a:hover{text-decoration:underline}.F1KBNa_mdPreviewBody code{font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:4px;padding:1px 5px;font-size:12.5px}.F1KBNa_mdPreviewBody pre{overscroll-behavior-x:none;border:1px solid var(--dsw-alias-border-l1);font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:8px;margin:8px 0;padding:10px 12px;font-size:12.5px;line-height:18px;overflow:auto}.F1KBNa_mdPreviewBody pre code{background:0 0;padding:0}.F1KBNa_mdPreviewBody blockquote{border-left:3px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);margin:8px 0;padding:0 12px}.F1KBNa_mdPreviewBody hr{background:var(--dsw-alias-border-l1);border:none;height:1px;margin:16px 0}.F1KBNa_mdPreviewBody table{border-collapse:collapse;margin:8px 0}.F1KBNa_mdPreviewBody th,.F1KBNa_mdPreviewBody td{border:1px solid var(--dsw-alias-border-l1);padding:4px 10px}.F1KBNa_mdPreviewBody img{max-width:100%}.F1KBNa_mdPreviewBody .mdImageFallback{border:1px dashed var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-markdown-code-block) 45%, transparent);width:100%;min-height:120px;color:var(--dsw-alias-label-secondary);font-family:var(--dsw-font-markdown-code-block);text-align:center;white-space:pre-wrap;word-break:break-all;border-radius:4px;justify-content:center;align-items:center;margin:0 auto;padding:8px 12px;font-size:12px;line-height:16px;display:flex}.F1KBNa_toggle{border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:18px;flex:none;width:60px;height:36px;padding:0;position:relative}.F1KBNa_toggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_toggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.F1KBNa_toggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleOn:hover{background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleThumb{background:var(--dsw-alias-label-primary);border-radius:50%;width:28px;height:28px;transition:left .12s;position:absolute;top:3px;left:3px}.F1KBNa_toggleOn .F1KBNa_toggleThumb{background:#fff;left:27px}.F1KBNa_stepper{align-items:center;gap:6px;display:inline-flex}.F1KBNa_stepperButton{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);width:32px;height:32px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;padding:0;position:relative}.F1KBNa_stepperButton:before,.F1KBNa_stepperButton:after{content:\"\";background:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_stepperButton:before{width:10px;height:1px}.F1KBNa_stepperButton:after{width:1px;height:10px;display:none}.F1KBNa_stepperButtonUp:after{display:block}.F1KBNa_stepperButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_stepperButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_stepperValue{text-align:center;min-width:2ch;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:14px;line-height:22px}.F1KBNa_states{flex-direction:column;flex:1;min-height:0;padding:4px 12px 12px;display:flex;overflow-y:auto}.F1KBNa_split{flex:1;align-items:stretch;min-height:0;display:flex;position:relative}.F1KBNa_fileListKnob{z-index:39;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;box-shadow:var(--dsw-elevation-prominent);border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute}.F1KBNa_fileListKnob[data-open]{box-shadow:none;opacity:0}.F1KBNa_fileListKnob:not([data-open]){animation:.32s ease-in-out .5s both F1KBNa_fileListKnobIn}@keyframes F1KBNa_fileListKnobIn{0%{opacity:0}to{opacity:1}}.F1KBNa_fileListKnob:hover,.F1KBNa_fileListKnob:focus-visible{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-interactive-bg-hover), var(--dsw-alias-interactive-bg-hover))}.F1KBNa_fileListFloat{z-index:40;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);box-shadow:none;transform-origin:0 0;border-radius:12px;flex-direction:column;padding:6px 0 10px 8px;display:flex;position:absolute;overflow:hidden}.F1KBNa_fileListFloatClosing{pointer-events:none;animation:.14s ease-in forwards F1KBNa_fileListShrink}@keyframes F1KBNa_fileListShrink{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.96)}}.F1KBNa_fileList{box-sizing:border-box;border-right:1px solid var(--dsw-alias-border-l2);flex-direction:column;flex:none;width:260px;min-height:0;padding:4px 0 12px 8px;display:flex}.F1KBNa_listScroll{scrollbar-gutter:stable;flex:1;min-height:0;padding-right:2px;overflow-y:scroll}.F1KBNa_fileListFloat .F1KBNa_listScroll{margin-right:2px}.F1KBNa_bulkActions{flex:none;gap:6px;padding:8px 8px 0 0;display:flex}.F1KBNa_bulkActions .F1KBNa_action{text-align:center;flex:auto}.F1KBNa_bulkActions .F1KBNa_action:disabled{opacity:.4;cursor:default}.F1KBNa_addPath{justify-content:center;align-items:center;gap:4px;display:inline-flex}.F1KBNa_resizeHandle{cursor:col-resize;touch-action:none;background:0 0;flex:none;width:5px;margin:0 -2px}.F1KBNa_resizeHandle:hover{background:var(--dsw-alias-border-l2)}.F1KBNa_floatResizeHandle{z-index:41;cursor:col-resize;-webkit-user-select:none;user-select:none;touch-action:none;background:0 0;border-radius:4px;position:absolute}.F1KBNa_floatResizeHandle:hover{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-border-l2), var(--dsw-alias-border-l2))}.F1KBNa_detail{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.F1KBNa_detailEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;flex:1;justify-content:center;align-items:center;margin:0;padding:24px;font-size:12px;line-height:18px;display:flex}.F1KBNa_confirmBackdrop{z-index:55;background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);justify-content:center;align-items:center;padding:24px;display:flex;position:absolute;inset:0}.F1KBNa_confirmBackdropFixed{z-index:60;position:fixed}.F1KBNa_confirmCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:340px;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:12px;padding:16px;display:flex}.F1KBNa_confirmTitle{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;flex:none;margin:0;font-size:13px;font-weight:500;line-height:20px}.F1KBNa_confirmText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;margin:0;line-height:1.5}.F1KBNa_confirmBlock{flex-direction:column;gap:6px;min-width:0;display:flex}.F1KBNa_confirmList{overscroll-behavior:contain;scrollbar-gutter:stable;background:var(--dsw-alias-bg-module-platform);max-height:104px;font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;border-radius:6px;margin:0;padding:0 6px;font-size:11px;line-height:16px;list-style:none;overflow-y:auto}.F1KBNa_confirmActions{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;display:flex}.F1KBNa_pickerCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:420px;max-width:100%;height:70%;max-height:100%;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:8px;padding:14px 16px 16px;display:flex;position:relative;overflow:hidden}.F1KBNa_pickerTitle{color:var(--dsw-alias-label-primary);flex:none;font-size:13px;font-weight:500;line-height:20px}.F1KBNa_pickerClose{width:22px;height:22px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;top:10px;right:10px}.F1KBNa_pickerClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_pickerForm{flex:none;gap:8px;display:flex}.F1KBNa_pickerInput{border:1px solid var(--dsw-alias-border-l1);min-width:0;color:var(--dsw-alias-label-primary);background:0 0;border-radius:8px;flex:auto;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_pickerInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_tree{scrollbar-gutter:stable;border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex:auto;min-height:0;padding:4px 2px 4px 4px;overflow:auto scroll}.F1KBNa_treeRow{border-radius:6px;align-items:center;gap:2px;padding-right:4px;display:flex}.F1KBNa_treeRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_treeRow[data-selected]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)}.F1KBNa_treeCaret{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_treeCaret:hover{color:var(--dsw-alias-label-primary)}.F1KBNa_treeName{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:auto;align-items:center;gap:6px;padding:2px 4px;font-family:inherit;font-size:12px;line-height:18px;display:flex}.F1KBNa_treeName:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_treeNote{color:var(--dsw-alias-label-tertiary);margin:2px 0;font-size:12px;line-height:18px}.F1KBNa_pickerIcon{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_pickerName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_pickerNote{color:var(--dsw-alias-label-tertiary);flex:none;margin:0;font-size:12px;line-height:18px}.F1KBNa_pickerCheck{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;margin-right:auto;font-size:12px;line-height:18px;display:flex}.F1KBNa_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}.F1KBNa_note,.F1KBNa_readError{color:var(--dsw-alias-label-tertiary);margin:4px 0;font-size:12px;line-height:18px}.F1KBNa_noteCentered{text-align:center;margin:auto}.F1KBNa_emptyState{flex-direction:column;align-items:center;gap:10px;margin:auto;display:flex}.F1KBNa_importButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:5px 14px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_importButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_importButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_importNote{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;font-size:12px;line-height:18px}.F1KBNa_readError{color:var(--dsw-alias-state-error-primary)}.F1KBNa_action.F1KBNa_addButton{box-sizing:border-box;border-radius:6px;flex:none;justify-content:center;align-items:center;width:20px;height:20px;min-height:0;padding:0;display:inline-flex}.F1KBNa_listHead{flex:none;align-items:center;gap:4px;margin:8px 1px 2px;padding-right:8px;display:flex}.F1KBNa_action.F1KBNa_addButton.F1KBNa_listFold{width:26px;height:26px}.F1KBNa_listTitle{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_listTabs{background:var(--dsw-alias-interactive-bg-hover);border-radius:8px;flex:auto;gap:2px;min-width:0;padding:2px;display:flex}.F1KBNa_listTab{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:6px;padding:3px 8px;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_tabCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}.F1KBNa_listTab[aria-selected=true]{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.F1KBNa_commentGroup{margin:0 0 6px}.F1KBNa_commentGroup:last-child{margin-bottom:0}.F1KBNa_commentGroupName{color:var(--dsw-alias-label-tertiary);margin:0;padding:4px 13px 2px;font-size:11px;font-weight:500;line-height:16px}.F1KBNa_commentRow{box-sizing:border-box;width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;padding:6px 8px;display:block;position:relative}.F1KBNa_commentRow:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_commentRow[data-selected]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_commentHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.F1KBNa_commentLabel{white-space:nowrap;text-align:right;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:12px;line-height:18px}.F1KBNa_commentTitle{-webkit-line-clamp:3;text-overflow:ellipsis;overflow-wrap:anywhere;text-align:left;min-width:0;color:var(--dsw-alias-label-primary);-webkit-box-orient:vertical;flex:1;margin-left:4px;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.F1KBNa_commentTitleEmpty{color:var(--dsw-alias-label-tertiary)}.F1KBNa_listEmpty{color:var(--dsw-alias-label-tertiary);margin:8px 12px;font-size:12px;line-height:18px}.F1KBNa_emptyActions{flex-wrap:wrap;justify-content:center;gap:8px;display:flex}.F1KBNa_rows{margin:0;padding:0;list-style:none}.F1KBNa_row{border:1px solid #0000;border-radius:10px;margin:2px 0}.F1KBNa_rowMenuAnchor{display:none}.F1KBNa_rowHead{width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;align-items:center;gap:8px;padding:6px 8px;display:flex;position:relative}.F1KBNa_rowHead:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_rowHead[data-selected],.F1KBNa_rowHead[data-picked]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_rowPath{text-overflow:ellipsis;white-space:nowrap;min-width:0;margin-left:4px;font-size:12px;line-height:18px;overflow:hidden}.F1KBNa_unseenDot{flex:none;align-self:center;position:absolute;top:50%;left:5px;overflow:visible;transform:translateY(-50%)}.F1KBNa_categoryDot{pointer-events:none;-webkit-user-select:none;user-select:none;border-radius:50%;width:3px;height:3px;position:absolute;top:13.5px;left:5px}.F1KBNa_rowFailed{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_actionError{border-bottom:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere;margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_rowMeta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;gap:6px;margin-left:auto;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_addCount{color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_delCount{color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_diff{background:var(--dsw-alias-markdown-code-block);flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffHeader{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_panelDocked .F1KBNa_diffHeader{background:var(--dsw-alias-bg-base)}.F1KBNa_diffPath{appearance:none;min-width:0;font:inherit;text-overflow:ellipsis;color:var(--dsw-alias-label-primary);background:0 0;border:0;flex:1;margin-left:4px;padding:0;font-size:12px;line-height:18px;position:relative;top:1px}.F1KBNa_diffPath:focus{outline:none}.F1KBNa_diffActions{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffActionInfo{flex:auto;align-items:center;gap:8px;min-width:0;display:flex;overflow:hidden}.F1KBNa_diffActionDecisions{flex:none;align-items:center;gap:8px;display:flex}.F1KBNa_diffStats{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:16px}.F1KBNa_flexSpacer{flex:1}.F1KBNa_gotoLayer{z-index:30;place-items:center;display:grid;position:absolute;inset:0}.F1KBNa_gotoLayerRight{left:50%;right:var(--dsh-scrollbar-width,8px);bottom:calc(var(--dsh-scrollbar-width,8px) + 1px)}.F1KBNa_gotoBackdrop{z-index:29;position:fixed;inset:0}.F1KBNa_gotoBox{z-index:1;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;flex-direction:column;align-items:stretch;gap:4px;padding:4px;display:flex;position:relative}.F1KBNa_gotoRow{align-items:center;gap:4px;display:flex}.F1KBNa_gotoInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:9em;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;flex:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_gotoInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_gotoAction{white-space:nowrap;flex:none}.F1KBNa_divider{background:var(--dsw-alias-border-l1);align-self:stretch;width:1px;margin:2px 0}.F1KBNa_action{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;text-decoration:none}.F1KBNa_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_action:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_actionChord{color:var(--dsw-alias-label-tertiary);margin-left:6px;font-size:11px}.F1KBNa_actionPrimary{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_actionPrimary:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_actionPrimary:disabled{background:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:.55}.F1KBNa_actionQuietDisabled:disabled{cursor:pointer;color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l1);background:0 0}.F1KBNa_actionPrimary.F1KBNa_actionQuietDisabled:disabled{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:1}.F1KBNa_iconAction{justify-content:center;align-items:center;min-height:25px;padding:4px 6px;display:inline-flex}.F1KBNa_close{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_expand{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_expand:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_diffBodyWrap{isolation:isolate;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBody{overscroll-behavior:none;scrollbar-gutter:stable;min-width:0;font:var(--dsw-font-markdown-code-block);-webkit-text-size-adjust:100%;text-size-adjust:100%;cursor:text;outline:none;flex:1;padding:0;position:relative;overflow:auto}.F1KBNa_diffBody::-webkit-scrollbar,.F1KBNa_diffBody::-webkit-scrollbar-track,.F1KBNa_diffBody::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_diffBody::-webkit-scrollbar-thumb:vertical{background:color-mix(in srgb, var(--dsh-scrollbar-thumb) 90%, var(--dsw-alias-label-secondary) 10%)}.F1KBNa_diffBody::-webkit-scrollbar-thumb:vertical:hover{background:color-mix(in srgb, var(--dsh-scrollbar-thumb-hover) 90%, var(--dsw-alias-label-secondary) 10%)}.F1KBNa_blockActions{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);z-index:2;border-radius:10px;align-items:center;gap:9px;padding:5px;display:flex;position:absolute;right:8px}.F1KBNa_blockActions[data-diff-selection-actions]{pointer-events:none}.F1KBNa_blockActions[data-diff-selection-actions] button{pointer-events:auto}.F1KBNa_blockActions[data-diff-frame-drag],.F1KBNa_blockActions[data-diff-frame-drag] button{pointer-events:none}.F1KBNa_blockActionsDivider{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:2px 0}.F1KBNa_blockPosition{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;margin-top:1px;margin-left:7px;font-size:12px;line-height:16px}.F1KBNa_searchBar{z-index:3;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;align-items:center;gap:4px;padding:4px;display:flex;position:absolute;top:8px;right:8px}.F1KBNa_searchInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:150px;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_searchInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchCount{text-align:center;min-width:34px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:16px}.F1KBNa_searchToggle{border:1px solid var(--dsw-alias-border-l1);min-height:25px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;justify-content:center;align-items:center;padding:4px 6px;display:inline-flex}.F1KBNa_searchToggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_searchToggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchMatch{color:inherit;background-color:#facc1542;border-radius:2px}.F1KBNa_searchMatchCurrent{color:inherit;background-color:#facc1599;border-radius:2px}.F1KBNa_blockFlash{z-index:3;box-sizing:border-box;border:2px solid var(--dsw-alias-state-business-primary);pointer-events:none;border-radius:4px;animation:1s ease-out forwards F1KBNa_diffFlashFade;position:absolute;left:0;right:0}.F1KBNa_blockFlashShake{animation:.7s ease-out forwards F1KBNa_diffFlashShake}.F1KBNa_discussionRow{background:var(--dsw-alias-bg-base);display:table-row}.F1KBNa_discussionCell{display:table-cell}.F1KBNa_discussionPin{z-index:2;width:0;height:0;position:sticky;left:0}.F1KBNa_discussion{z-index:2;box-sizing:border-box;border-left:3px solid var(--dsw-alias-state-business-primary);box-shadow:inset 0 1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset 0 -1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset -1px 0 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent);cursor:default;background:0 0;flex-direction:column;display:flex;position:absolute;top:0;left:0;overflow:hidden}.F1KBNa_discussionHead{font:var(--dsw-font-markdown-code-block)}.F1KBNa_discussionHead .F1KBNa_unseenDot{vertical-align:middle;flex:none;align-self:center;margin-right:6px;display:inline-block;position:static;transform:none}.F1KBNa_discussionBody,.F1KBNa_threadFontProbe{font:var(--dsw-font-markdown-base);font-size:calc(var(--dsh-content-font-size,14px) - 2px)}.F1KBNa_threadFontProbe{visibility:hidden;pointer-events:none;width:0;height:0;position:absolute;overflow:hidden}.F1KBNa_discussionBody{flex-direction:column;flex:auto;min-height:0;padding:0 12px;display:flex;overflow:hidden}.F1KBNa_discussionBody>:not(.F1KBNa_discussionSlack){flex:none}.F1KBNa_discussion[data-lost]{border-left-color:var(--dsw-alias-label-secondary);background:repeating-linear-gradient(135deg, var(--dsw-alias-interactive-bg-hover) 0 4px, transparent 4px 8px);background-origin:border-box}.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend,.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:hover:not(:disabled),.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:disabled{background:var(--dsw-alias-label-secondary);border-color:var(--dsw-alias-label-secondary);color:var(--dsw-alias-label-primary-foreground)}.F1KBNa_discussion[data-lost] .F1KBNa_discussionUser{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 30%, transparent)}.F1KBNa_discussionAnswer{color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionUser{box-sizing:border-box;background:var(--dsw-specific-bubble,var(--dsw-alias-bg-layer-2,var(--dsw-alias-interactive-bg-hover)));width:fit-content;max-width:82%;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:8px 0 8px 8px;margin:6.6px 0 6.6px auto;padding:4.4px 11px;font-family:inherit;line-height:22px}.F1KBNa_discussionCode{box-sizing:border-box;font:var(--dsw-font-markdown-code);font-family:var(--ds-font-family-code);background:color-mix(in srgb, var(--dsw-alias-markdown-inline-code,var(--dsw-alias-interactive-bg-hover-solid)) 90%, var(--dsw-alias-label-secondary));border:.5px solid var(--dsw-alias-border-l1);border-radius:6px;align-items:center;padding:0 5px;font-size:.875em;line-height:16px;display:inline-flex}.F1KBNa_discussionBody strong{font-weight:700}.F1KBNa_discussionNote{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionNote[data-diff-discussion-hidden]{color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionDots{margin-left:1px}.F1KBNa_discussionDots>span{animation:1.2s ease-in-out infinite F1KBNa_discussionDot}.F1KBNa_discussionDots>span:nth-child(2){animation-delay:.15s}.F1KBNa_discussionDots>span:nth-child(3){animation-delay:.3s}@keyframes F1KBNa_discussionDot{0%,60%,to{opacity:.25}30%{opacity:1}}.F1KBNa_quoteLines{table-layout:fixed;border-spacing:0;width:calc(100% + 27px);min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block);line-height:var(--dsh-diff-line-height,22px);background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover) 55%, transparent);margin:0 -12px 0 -15px;display:table}.F1KBNa_quoteAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 12%, transparent)}.F1KBNa_quoteDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 13%, transparent)}.F1KBNa_quoteLine{font-size:calc(1em * var(--dsh-diff-font-scale,1));height:var(--dsh-diff-line-height,22px);display:table-row}.F1KBNa_quoteCode{display:table-cell}.F1KBNa_quoteText{white-space:pre-wrap;overflow-wrap:anywhere;display:block}.F1KBNa_quoteNoWrap .F1KBNa_quoteText{white-space:pre;overflow-wrap:normal;overflow:hidden}.F1KBNa_quoteNoWrap .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-diff-quote-width,0px) + 100%);display:inline-block}.F1KBNa_quoteSplit{align-self:stretch;align-items:flex-start;margin:0 -12px;display:flex}.F1KBNa_quoteSplitSide{flex:1 1 0;min-width:0}.F1KBNa_quoteSplitSide+.F1KBNa_quoteSplitSide{border-left:1px solid var(--dsw-alias-border-l2)}.F1KBNa_quoteSplitTable{table-layout:fixed;border-spacing:0;width:100%;display:table}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=left] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-left,0px) + 100%);display:inline-block}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=right] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-right,0px) + 100%);display:inline-block}.F1KBNa_discussionHead{box-sizing:border-box;flex:none;align-items:center;gap:8px;height:22px;padding:0 6px;font-size:12px;line-height:16px;display:flex}.F1KBNa_discussionCompose{box-sizing:border-box;flex:none;align-items:flex-end;gap:8px;height:auto;min-height:44px;margin:0 -6px;padding:0 0 6.6px;display:flex}.F1KBNa_discussionSlack{flex:1 1 0;min-height:0;max-height:22px}.F1KBNa_discussionInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);min-width:0;min-height:26px;max-height:152px;color:var(--dsw-alias-label-primary);font-family:inherit;font-size:inherit;white-space:pre-wrap;overflow-wrap:anywhere;resize:none;cursor:text;border-radius:6px;flex:auto;padding:3px 8px;line-height:18px;overflow-y:auto}.F1KBNa_discussionToggle{width:18px;height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_discussionToggle:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_discussionRangeWrap{min-width:0;font:var(--dsw-font-markdown-code-block);flex:0 auto;overflow:hidden}.F1KBNa_discussionHead>:not(.F1KBNa_discussionRangeWrap){flex:none}.F1KBNa_discussionHead>.F1KBNa_flexSpacer{flex:1}.F1KBNa_discussionRange{white-space:nowrap;text-overflow:ellipsis;text-align:left;color:var(--dsw-alias-label-tertiary);direction:rtl;font-family:inherit;display:block;overflow:hidden}.F1KBNa_discussionInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_discussionInput::placeholder{font-family:inherit;font-size:inherit;color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionSend{box-sizing:border-box;white-space:nowrap;flex:none;justify-content:center;align-items:center;gap:6px;height:26px;padding-left:9px;padding-right:9px;display:inline-flex}.F1KBNa_rowDiscussed{--diff-row-wash:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);background-image:linear-gradient(var(--diff-row-wash), var(--diff-row-wash))}@keyframes F1KBNa_diffFlashFade{0%{opacity:1}to{opacity:0}}@keyframes F1KBNa_diffFlashShake{0%{opacity:1;transform:translateY(0)}10%{transform:translateY(1px)}20%{transform:translateY(-1px)}30%{transform:translateY(1px)}40%{transform:translateY(-1px)}50%{transform:translateY(1px)}60%{transform:translateY(-1px)}70%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(0)}}.F1KBNa_overviewRuler{pointer-events:none;opacity:.35;width:4px;position:absolute;top:0;bottom:0;right:0}.F1KBNa_overviewRulerSplit{width:var(--dsh-scrollbar-width,8px);bottom:calc(var(--dsh-scrollbar-width,8px) + 1px)}.F1KBNa_overviewMarker{border-radius:2px;width:100%;min-height:2px;position:absolute;right:0}.F1KBNa_markerDel{background-color:var(--dsw-alias-state-error-primary)}.F1KBNa_markerAdd{background-color:var(--dsw-alias-state-success-primary)}.F1KBNa_markerSplitDel{width:50%;left:0;right:auto}.F1KBNa_markerSplitAdd{width:50%;left:auto;right:0}.F1KBNa_lines{border-spacing:0;width:max-content;min-width:100%;font-size:calc(1em * var(--dsh-diff-font-scale,1));display:table}.F1KBNa_line{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);-webkit-user-select:none;user-select:none;display:table-row}.F1KBNa_vSpacer{display:table-row}.F1KBNa_gutter{box-sizing:border-box;text-align:right;width:44px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;cursor:default;padding-right:10px;display:table-cell}.F1KBNa_line>.F1KBNa_gutter{z-index:1;background-color:var(--diff-gutter-surface);background-image:linear-gradient(var(--diff-row-tint,transparent), var(--diff-row-tint,transparent)), linear-gradient(var(--diff-row-wash,transparent), var(--diff-row-wash,transparent));position:sticky;left:0}.F1KBNa_line>.F1KBNa_gutter+.F1KBNa_gutter{left:44px}.F1KBNa_gutter[data-diff-quote-gutter]{background-color:var(--diff-gutter-surface)}.F1KBNa_code{white-space:pre;-webkit-user-select:text;user-select:text;display:table-cell}.F1KBNa_context{color:var(--dsw-alias-label-primary)}.F1KBNa_del{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_add{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_statusBar{box-sizing:border-box;border-top:1px solid var(--dsw-alias-border-l2);height:34px;color:var(--dsw-alias-label-tertiary);font-family:var(--dsw-font-markdown-code-block);font-variant-numeric:tabular-nums;flex:none;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:flex}.F1KBNa_statusAction{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);white-space:nowrap;cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_statusAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langSelect{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;flex:none;align-items:center;gap:4px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_langSelect:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langLabel{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.F1KBNa_presentationSelect{cursor:pointer;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_presentationSelect:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_chip{justify-content:flex-end;align-items:center;gap:5px;min-width:0;padding-right:14px;display:inline-flex}.F1KBNa_chipLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_coverHost{align-items:center;display:inline-flex;position:relative}.F1KBNa_coverCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:12px;align-items:center;gap:4px;padding:6px;display:flex}.F1KBNa_coverPopover{z-index:50;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_coverNotice{z-index:80;pointer-events:none;animation:1.25s ease-out forwards F1KBNa_coverNoticeFade;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_coverNoticeCard{gap:4px;padding:6px 8px}@keyframes F1KBNa_coverNoticeFade{0%,78%{opacity:1}to{opacity:0}}.F1KBNa_coverNoticeGlyph{width:44px;height:44px;color:var(--dsw-alias-label-tertiary);border-radius:10px;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_coverNoticeGlyph[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_coverNoticeGlyph[data-changed]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_coverNoticeText{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.F1KBNa_coverButton{width:32px;height:32px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_coverButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_coverButton[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_presentationHost{align-items:center;display:inline-flex}.F1KBNa_chipPresentation{min-width:36px;height:20px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:20px;flex:none;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_chipPresentation:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_mirrored{transform:scaleX(-1)}.F1KBNa_notice{z-index:60;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:360px;box-shadow:var(--dsw-shadow-lv3);border-radius:10px;align-items:flex-start;gap:12px;padding:12px 14px;display:flex;position:fixed;bottom:24px;right:24px}.F1KBNa_noticeText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);flex:1;margin:0;line-height:1.45}.F1KBNa_noticeButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font:var(--dsw-font-caption);cursor:pointer;border-radius:6px;flex:none;padding:4px 10px}.F1KBNa_noticeButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_wrap .F1KBNa_line{height:auto;min-height:var(--dsh-diff-line-height,22px)}.F1KBNa_subline{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);white-space:pre;display:block;overflow:hidden}.F1KBNa_wrapActive{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_wrapActive:hover{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_splitRoot{isolation:isolate;flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBodySplit{flex:1;min-height:0;overflow-x:hidden}.F1KBNa_splitCols{width:100%;min-width:0;min-height:100%;display:flex}.F1KBNa_splitCol{box-sizing:border-box;flex:1 1 0;min-width:0;overflow:hidden}.F1KBNa_splitDivider{background:var(--dsw-alias-border-l2);flex:0 0 1px}.F1KBNa_splitDiscussions{z-index:3;pointer-events:none;width:100%;height:0;position:absolute;top:0;left:0}.F1KBNa_splitDiscussion{box-sizing:border-box;pointer-events:auto;background:var(--dsw-alias-bg-base);position:absolute;left:0}.F1KBNa_splitSealed,.F1KBNa_splitSealed *{-webkit-user-select:none!important;user-select:none!important}.F1KBNa_splitSealedLeft [data-diff-split-side=left],.F1KBNa_splitSealedLeft [data-diff-split-side=left] *,.F1KBNa_splitSealedRight [data-diff-split-side=right],.F1KBNa_splitSealedRight [data-diff-split-side=right] *{-webkit-user-select:text!important;user-select:text!important}.F1KBNa_splitCol .F1KBNa_gutter,.F1KBNa_splitCol .F1KBNa_code{vertical-align:top}.F1KBNa_splitHScrollRow{border-top:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;width:100%;min-width:0;display:flex}.F1KBNa_splitHScroll{overscroll-behavior-x:none;min-width:0;height:var(--dsh-scrollbar-width,8px);flex:1 1 0;overflow:auto hidden}.F1KBNa_splitHScroll::-webkit-scrollbar{height:var(--dsh-scrollbar-width,8px)}.F1KBNa_splitHScroll::-webkit-scrollbar-track{cursor:default}.F1KBNa_splitHScroll::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_splitHScrollFill{height:1px}.F1KBNa_splitLdel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent)}.F1KBNa_splitRadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent)}.F1KBNa_intraDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);text-decoration:line-through}.F1KBNa_intraAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 32%, transparent)}";
334
334
  const tagId = "dsh-diff-approval/PendingPanel.module.css";
335
335
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
336
336
  const tag = document.createElement("style");
@@ -8310,6 +8310,11 @@ Please report this to https://github.com/markedjs/marked.`, e) {
8310
8310
  * alignment, each deletion pairs with its most-similar addition (order
8311
8311
  * preserved, threshold-bounded) so a mixed insert/delete block does not force a
8312
8312
  * wrong line together. A stray deletion or addition stays a one-sided pair.
8313
+ *
8314
+ * THE ORDER OF THE RESULT IS PART OF THE CONTRACT: going down `pairs`, neither
8315
+ * column's line numbers ever go backwards. Alignment may therefore move a line
8316
+ * onto the row opposite it, but never past a line of its own side — an unpaired
8317
+ * line between two pairs is emitted where it belongs, not after them.
8313
8318
  * @param rows - the whole-file diff rows.
8314
8319
  * @param alignBySimilarity - align a change block by similarity instead of order.
8315
8320
  * @returns the split pairs plus the row→pair index map.
@@ -8357,25 +8362,73 @@ Please report this to https://github.com/markedjs/marked.`, e) {
8357
8362
  index: a.index,
8358
8363
  text: a.row.text
8359
8364
  })), alignBySimilarity);
8365
+ const partnerOfDel = /* @__PURE__ */ new Map();
8366
+ const partnerOfAdd = /* @__PURE__ */ new Map();
8360
8367
  for (const p of alignment.pairs) {
8361
- const del = delRows.find((d) => d.index === p.delIndex);
8362
- const add = addRows.find((a) => a.index === p.addIndex);
8363
- push({
8364
- kind: "replace",
8365
- left: leftSideOf(del.row),
8366
- right: rightSideOf(add.row)
8367
- }, [p.delIndex, p.addIndex]);
8368
+ partnerOfDel.set(p.delIndex, p.addIndex);
8369
+ partnerOfAdd.set(p.addIndex, p.delIndex);
8370
+ }
8371
+ const delAt = new Map(delRows.map((d) => [d.index, d.row]));
8372
+ const addAt = new Map(addRows.map((a) => [a.index, a.row]));
8373
+ let d = 0;
8374
+ let a = 0;
8375
+ while (d < delRows.length || a < addRows.length) {
8376
+ const delIndex = delRows[d]?.index;
8377
+ const addIndex = addRows[a]?.index;
8378
+ const delRow = delIndex === void 0 ? void 0 : delAt.get(delIndex);
8379
+ const addRow = addIndex === void 0 ? void 0 : addAt.get(addIndex);
8380
+ if (delIndex !== void 0 && addIndex !== void 0 && partnerOfDel.get(delIndex) === addIndex) {
8381
+ push({
8382
+ kind: "replace",
8383
+ left: leftSideOf(delRow),
8384
+ right: rightSideOf(addRow)
8385
+ }, [delIndex, addIndex]);
8386
+ d++;
8387
+ a++;
8388
+ continue;
8389
+ }
8390
+ if (delIndex !== void 0 && delRow !== void 0 && !partnerOfDel.has(delIndex)) {
8391
+ push({
8392
+ kind: "del",
8393
+ left: leftSideOf(delRow),
8394
+ right: void 0
8395
+ }, [delIndex]);
8396
+ d++;
8397
+ continue;
8398
+ }
8399
+ if (addIndex !== void 0 && addRow !== void 0 && !partnerOfAdd.has(addIndex)) {
8400
+ push({
8401
+ kind: "add",
8402
+ left: void 0,
8403
+ right: rightSideOf(addRow)
8404
+ }, [addIndex]);
8405
+ a++;
8406
+ continue;
8407
+ }
8408
+ if (delRow !== void 0 && addRow !== void 0) {
8409
+ push({
8410
+ kind: "replace",
8411
+ left: leftSideOf(delRow),
8412
+ right: rightSideOf(addRow)
8413
+ }, [delIndex, addIndex]);
8414
+ d++;
8415
+ a++;
8416
+ } else if (delRow !== void 0) {
8417
+ push({
8418
+ kind: "del",
8419
+ left: leftSideOf(delRow),
8420
+ right: void 0
8421
+ }, [delIndex]);
8422
+ d++;
8423
+ } else if (addRow !== void 0) {
8424
+ push({
8425
+ kind: "add",
8426
+ left: void 0,
8427
+ right: rightSideOf(addRow)
8428
+ }, [addIndex]);
8429
+ a++;
8430
+ }
8368
8431
  }
8369
- for (const d of alignment.delOnly) push({
8370
- kind: "del",
8371
- left: leftSideOf(delRows.find((x) => x.index === d).row),
8372
- right: void 0
8373
- }, [d]);
8374
- for (const a of alignment.addOnly) push({
8375
- kind: "add",
8376
- left: void 0,
8377
- right: rightSideOf(addRows.find((x) => x.index === a).row)
8378
- }, [a]);
8379
8432
  }
8380
8433
  return {
8381
8434
  pairs,
@@ -20503,6 +20556,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
20503
20556
  *
20504
20557
  * @module dsh-diff-approval/client/panel-memory
20505
20558
  */
20559
+ /**
20560
+ * How many back steps one session may hold. A page-long reading session must not grow this without bound,
20561
+ * and the oldest steps are the ones a reader is least likely to want back; browsers cap their history too.
20562
+ */
20563
+ const JUMP_STACK_LIMIT = 50;
20506
20564
  const views = /* @__PURE__ */ new Map();
20507
20565
  /** Nothing is known about a thread until the reader types or folds it. */
20508
20566
  const NO_THREAD_STATE = {};
@@ -20692,7 +20750,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
20692
20750
  function viewOf(sessionId) {
20693
20751
  let view = views.get(sessionId);
20694
20752
  if (view === void 0) {
20695
- view = { offsets: /* @__PURE__ */ new Map() };
20753
+ view = {
20754
+ offsets: /* @__PURE__ */ new Map(),
20755
+ jumps: []
20756
+ };
20696
20757
  views.set(sessionId, view);
20697
20758
  }
20698
20759
  return view;
@@ -20731,6 +20792,42 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
20731
20792
  function panelFileOffset(sessionId, fileId) {
20732
20793
  return sessionId === void 0 ? void 0 : views.get(sessionId)?.offsets.get(fileId);
20733
20794
  }
20795
+ /**
20796
+ * Remember the place a deliberate jump is leaving, so the reader can come back to it.
20797
+ *
20798
+ * ONLY JUMPS PASS THROUGH HERE — never a scroll of the reader's own, which is the whole point. Their place
20799
+ * is already kept per file (`rememberPanelView`), kept current by every scroll they make, so a back step
20800
+ * has nothing to measure: it hands that same memory back. Reading it from there rather than from the DOM is
20801
+ * also what makes this work in both views, one column and side by side, whose scrollers are different
20802
+ * elements and only one of which is ever mounted.
20803
+ *
20804
+ * A jump that would push the place already on top is dropped: two entries for one place would cost the
20805
+ * reader two presses of the back button to get anywhere.
20806
+ *
20807
+ * @param sessionId - the session the panel is reviewing; nothing is recorded without one.
20808
+ * @param fileId - the entry being LEFT, not the one being jumped to.
20809
+ */
20810
+ function rememberJumpAway(sessionId, fileId) {
20811
+ if (sessionId === void 0 || fileId === void 0) return;
20812
+ const place = {
20813
+ fileId,
20814
+ scrollTop: panelFileOffset(sessionId, fileId) ?? 0
20815
+ };
20816
+ const jumps = viewOf(sessionId).jumps;
20817
+ const top = jumps[jumps.length - 1];
20818
+ if (top !== void 0 && top.fileId === place.fileId && top.scrollTop === place.scrollTop) return;
20819
+ jumps.push(place);
20820
+ if (jumps.length > JUMP_STACK_LIMIT) jumps.shift();
20821
+ }
20822
+ /**
20823
+ * Take the last place a deliberate jump left, for a back step. Spent here, so a second press goes one step
20824
+ * further back rather than landing where the reader already is.
20825
+ * @param sessionId - the session, if any.
20826
+ * @returns that place, or undefined when there is nothing to go back to.
20827
+ */
20828
+ function popJumpAway(sessionId) {
20829
+ return sessionId === void 0 ? void 0 : views.get(sessionId)?.jumps.pop();
20830
+ }
20734
20831
  //#endregion
20735
20832
  //#region lib/types/client/composer-cover.js
20736
20833
  /**
@@ -21797,7 +21894,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
21797
21894
  const asks = record.asks ?? [];
21798
21895
  const last = asks.at(-1);
21799
21896
  const answered = last === void 0 ? void 0 : answers[last.requestId];
21800
- const messages = [{
21897
+ const messages = record.text === "" ? [] : [{
21801
21898
  role: record.author === "agent" ? "assistant" : "user",
21802
21899
  text: record.text
21803
21900
  }];
@@ -21827,7 +21924,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
21827
21924
  quote: record.quote,
21828
21925
  ...record.quoteContext === void 0 ? {} : { quoteContext: record.quoteContext },
21829
21926
  ...record.quoteLines === void 0 ? {} : { quoteLines: quoteLinesOf(record.quoteLines) },
21830
- ...last !== void 0 && answered === void 0 && last.dropped !== true && last.ended !== true ? { asking: true } : {},
21927
+ ...last !== void 0 && last.dropped !== true && last.ended !== true ? { asking: true } : {},
21831
21928
  ...state?.failed === true || last !== void 0 && last.dropped === true ? { failed: true } : {},
21832
21929
  ...last !== void 0 && answered === void 0 && last.ended === true && last.dropped !== true ? { stopped: true } : {},
21833
21930
  ...record.unseen === true ? { unseen: true } : {}
@@ -22147,6 +22244,41 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
22147
22244
  label: t("action.discussionEnd")
22148
22245
  }];
22149
22246
  const { ref: cardRef, dotOff } = useSeenOnView(discussion.unseen === true, onSeen);
22247
+ const inputRef = (0, react.useRef)(null);
22248
+ /**
22249
+ * The writing field's height follows what is written in it: a line the wrap made, or one the reader broke
22250
+ * with Shift+Enter, up to the cap the stylesheet states, past which it scrolls.
22251
+ *
22252
+ * THE WRITE IS SAFE BECAUSE THE LOOP IT ONCE CLOSED HAS NO ENGINE LEFT. A height that follows
22253
+ * `scrollHeight` depends on the field's WIDTH, and that width once depended on whether the code scroller
22254
+ * was showing a bar — which appeared when the card grew tall enough: taller card → bar → narrower card →
22255
+ * one more wrapped line → taller field → …, flipping at the boundary until React's nested-update counter
22256
+ * gave up (`Maximum update depth exceeded`, hit live on 2026-10-11). Two things now stand in that route,
22257
+ * so the write is a function of the TEXT alone and settles on the pass that sees it: the scroller reserves
22258
+ * its gutter, so its inner width — and the card's, which reads its own width from there — never moves (see
22259
+ * `.diffBody`), and the card's reservation is corrected by a pass that ignores a reading within a pixel of
22260
+ * what is already reserved and may act at most three times a second (see the `bodyRows` correction).
22261
+ *
22262
+ * The write goes to the ELEMENT, never into state: this is the field's own box, not the thread's
22263
+ * reservation, and a layout-phase state write here is exactly what that crash was made of.
22264
+ *
22265
+ * A field with no layout at all — jsdom, a hidden pane — reports 0, and the height is then left entirely to
22266
+ * the stylesheet: the row grid the tests measure IS that CSS recipe, and a zero reading written through as
22267
+ * `0px` would collapse the field and move every measurement with it.
22268
+ */
22269
+ (0, react.useLayoutEffect)(() => {
22270
+ const element = inputRef.current;
22271
+ if (element === null) return;
22272
+ element.style.height = "auto";
22273
+ const natural = element.scrollHeight;
22274
+ if (natural <= 0) {
22275
+ element.style.height = "";
22276
+ return;
22277
+ }
22278
+ const style = getComputedStyle(element);
22279
+ const border = (Number.parseFloat(style.borderTopWidth) || 0) + (Number.parseFloat(style.borderBottomWidth) || 0);
22280
+ element.style.height = `${natural + border}px`;
22281
+ });
22150
22282
  return (0, react_jsx_runtime.jsxs)("div", {
22151
22283
  className: PendingPanel_module_css_default.discussion,
22152
22284
  "data-diff-discussion": true,
@@ -22279,20 +22411,24 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
22279
22411
  }),
22280
22412
  (0, react_jsx_runtime.jsxs)("div", {
22281
22413
  className: PendingPanel_module_css_default.discussionCompose,
22282
- children: [(0, react_jsx_runtime.jsx)("input", {
22414
+ children: [(0, react_jsx_runtime.jsx)("textarea", {
22283
22415
  className: PendingPanel_module_css_default.discussionInput,
22284
22416
  "data-diff-discussion-input": true,
22417
+ rows: 1,
22285
22418
  ref: (element) => {
22419
+ inputRef.current = element;
22286
22420
  registerInput(discussion.id, element);
22287
22421
  },
22288
22422
  value: discussion.draft,
22289
22423
  placeholder: t("discussion.placeholder"),
22424
+ disabled: asking,
22290
22425
  onChange: (event) => {
22291
22426
  onDraft(discussion.id, event.target.value);
22292
22427
  },
22293
22428
  onKeyDown: (event) => {
22294
22429
  if (event.key !== "Enter") return;
22295
22430
  if (event.nativeEvent.isComposing || event.keyCode === 229) return;
22431
+ if (event.shiftKey) return;
22296
22432
  event.preventDefault();
22297
22433
  if (asking) return;
22298
22434
  onSend(discussion.id);
@@ -24515,9 +24651,24 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24515
24651
  rememberPlacedThreads(sessionId, draftThreads);
24516
24652
  }, [sessionId, draftThreads]);
24517
24653
  /**
24654
+ * Cards the reader placed and then discarded while the placement's own write was still in flight.
24655
+ *
24656
+ * A placement is a host write now (see `addDiscussion`), so discarding one asks the host to end it —
24657
+ * but between the click and the acknowledgement the record may not exist yet, and an `ending` that
24658
+ * arrives first would be answered `missing` while the write landed after it. The placement's own
24659
+ * acknowledgement reads this set and takes the record back, so no card can be left stored with nothing
24660
+ * on screen to end it from.
24661
+ */
24662
+ const discardedByReader = (0, react.useRef)(/* @__PURE__ */ new Set());
24663
+ /**
24518
24664
  * The threads this pane draws, in the order their rows run: the host's records re-anchored, plus
24519
24665
  * the blocks that have not been written yet.
24520
24666
  *
24667
+ * A PLACED CARD IS DRAWN FROM ITS PAGE-LOCAL BLOCK even though the host holds a record for it from the
24668
+ * moment it was placed: the words the reader has typed live on that block until the send writes them
24669
+ * onto the record (see `addDiscussion` and `sendDiscussion`), so the record's copy of the same id is
24670
+ * skipped here — one card, drawn from the block that owns what is in the box.
24671
+ *
24521
24672
  * Re-anchoring runs here rather than in an effect that rewrites state: the anchor's new-file lines
24522
24673
  * are what survive a rebuild, and the record's quote is what says whether they still hold the code
24523
24674
  * the comment was written about. When they do not, the thread follows the quote; when even that
@@ -24525,7 +24676,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24525
24676
  * the quote (see `remapDiscussion`).
24526
24677
  */
24527
24678
  const discussions = (0, react.useMemo)(() => {
24528
- return remapDiscussions([...fileComments.map((record) => discussionOfRecord(record, commentSource.answers, threadState)), ...draftThreads.filter((thread) => thread.fileId === file.id).map((thread) => discussionOfDraft(thread, threadState))], (row) => {
24679
+ const placed = draftThreads.filter((thread) => thread.fileId === file.id);
24680
+ const placedIds = new Set(placed.map((thread) => thread.id));
24681
+ return remapDiscussions([...fileComments.filter((record) => !placedIds.has(record.id)).map((record) => discussionOfRecord(record, commentSource.answers, threadState)), ...placed.map((thread) => discussionOfDraft(thread, threadState))], (row) => {
24529
24682
  const entry = model.diff.rows[row];
24530
24683
  return entry?.newLine ?? entry?.oldLine;
24531
24684
  }, (row) => model.diff.rows[row]?.text ?? "", model.diff.rows.length, (row) => model.diff.rows[row]?.newLine !== void 0);
@@ -24713,6 +24866,16 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24713
24866
  const landedFileRef = (0, react.useRef)(void 0);
24714
24867
  /** The file the placement effect below has decided the opening place for (see `placedFileRef`). */
24715
24868
  const placedFileRef = (0, react.useRef)(void 0);
24869
+ /** `scrollTick`/view as the landing effect last saw them, so "was this a landing ask?" is answerable. */
24870
+ const lastLandKeyRef = (0, react.useRef)("");
24871
+ /**
24872
+ * The view belongs to the reader until the panel asks for a place again (see `readerTookOver`).
24873
+ *
24874
+ * A landing that is not asked for — the wrap table becoming readable as rows the reader scrolls into are
24875
+ * measured — must not recentre them: that is the same "it dragged me back to the card" as the retry, by
24876
+ * another route (`offsetsFromWrap` is the second dependency of that effect).
24877
+ */
24878
+ const readerOwnsViewRef = (0, react.useRef)(false);
24716
24879
  (0, react.useEffect)(() => {
24717
24880
  const landing = (landingTick ?? 0) > 0;
24718
24881
  const opened = landedFileRef.current !== file.id;
@@ -24720,6 +24883,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24720
24883
  placedFileRef.current = file.id;
24721
24884
  if (!landing && !opened) return;
24722
24885
  if (landing) {
24886
+ readerOwnsViewRef.current = false;
24723
24887
  const cardEnd = landingComment === void 0 ? void 0 : discussions.find((entry) => entry.id === landingComment)?.anchor.end;
24724
24888
  const cardRow = cardEnd === void 0 ? void 0 : Math.max(0, Math.min(cardEnd, Math.max(0, model.diff.rows.length - 1)));
24725
24889
  const row = landingRow ?? cardRow ?? (landingLine === void 0 ? void 0 : rowOfLine(model.diff.rows, landingLine, landingOld === true));
@@ -25108,6 +25272,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25108
25272
  return;
25109
25273
  }
25110
25274
  if (searchMatches.length === 0) return;
25275
+ rememberJumpAway(sessionId, file.id);
25111
25276
  if (cursorPosRef.current !== void 0) {
25112
25277
  centerSearchRef.current = true;
25113
25278
  setSearchJump((jump) => jump + 1);
@@ -25222,11 +25387,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25222
25387
  const clamped = Math.max(0, Math.min(target, body.scrollHeight - body.clientHeight));
25223
25388
  if (body.scrollTop !== clamped) body.scrollTop = clamped;
25224
25389
  setScrollTop(clamped);
25225
- }, [
25226
- currentSearchRow,
25227
- searchMatches,
25228
- searchJump
25229
- ]);
25390
+ }, [currentSearchRow, searchJump]);
25230
25391
  const blockIndexByRow = (0, react.useMemo)(() => {
25231
25392
  const map = /* @__PURE__ */ new Map();
25232
25393
  model.blocks.forEach((block, blockIndex) => {
@@ -25551,7 +25712,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25551
25712
  const endLine = newLines?.endLine ?? last?.newLine ?? last?.oldLine ?? startLine;
25552
25713
  const body = bodyRef.current;
25553
25714
  if (body !== null && offsetOf(range.start) - body.scrollTop < 0) pendingScrollShiftRef.current += 66;
25554
- const id = `draft-${Date.now().toString(36)}-${draftThreads.length}`;
25715
+ const id = newId();
25555
25716
  const quoted = model.diff.rows.slice(quoteRange.start, quoteRange.end + 1);
25556
25717
  const quote = quoted.map((row) => row.text).join("\n");
25557
25718
  const quoteLines = quoted.map((row) => ({
@@ -25575,6 +25736,34 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25575
25736
  draft: ""
25576
25737
  }]);
25577
25738
  focusPendingRef.current = id;
25739
+ (async () => {
25740
+ let added = false;
25741
+ try {
25742
+ added = (await onCommentAdd(sessionId, {
25743
+ id,
25744
+ entryId: file.id,
25745
+ anchor: {
25746
+ startLine,
25747
+ endLine
25748
+ },
25749
+ quote,
25750
+ text: "",
25751
+ quoteContext,
25752
+ quoteLines: [...quoteLines]
25753
+ })).outcome === "added";
25754
+ } catch (error) {
25755
+ onToast(error instanceof Error ? error.message : String(error));
25756
+ }
25757
+ if (added) {
25758
+ if (discardedByReader.current.delete(id)) onCommentRemove(sessionId, id).catch((error) => {
25759
+ onToast(error instanceof Error ? error.message : String(error));
25760
+ });
25761
+ return;
25762
+ }
25763
+ discardedByReader.current.delete(id);
25764
+ onToast(t("discussion.addMissing"));
25765
+ setDraftThreads((current) => current.filter((thread) => thread.id !== id));
25766
+ })();
25578
25767
  const live = window.getSelection();
25579
25768
  if (typeof live?.removeAllRanges === "function") live.removeAllRanges();
25580
25769
  selectionTextRef.current = "";
@@ -25671,13 +25860,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25671
25860
  const frame = quotedFrame(discussion.quote, discussion.quoteLines);
25672
25861
  const legend = frameCoversRemovedRow(discussion.quoteLines) ? `\n${t("discussion.frameLegend")}` : "";
25673
25862
  const prompt = frame === "" ? `${marker}\n${text}\n\n${rule}` : `${marker}\n${frame}${legend}\n\n${text}\n\n${rule}`;
25674
- if (fileComments.some((record) => record.id === id)) {
25863
+ const held = fileComments.find((record) => record.id === id);
25864
+ if (held !== void 0 && held.text !== "") {
25675
25865
  askComment(id, prompt, text);
25676
25866
  return;
25677
25867
  }
25678
- const commentId = newId();
25679
25868
  const draft = {
25680
- id: commentId,
25869
+ id,
25681
25870
  entryId: file.id,
25682
25871
  anchor: {
25683
25872
  startLine: discussion.anchor.startLine,
@@ -25701,8 +25890,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25701
25890
  return;
25702
25891
  }
25703
25892
  setDraftThreads((current) => current.filter((thread) => thread.id !== id));
25704
- discussionRefocusRef.current = commentId;
25705
- await askComment(commentId, prompt, text);
25893
+ discussionRefocusRef.current = id;
25894
+ await askComment(id, prompt, text);
25706
25895
  })();
25707
25896
  };
25708
25897
  /** Discard one block, keeping the code the user is reading in place. */
@@ -25712,12 +25901,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25712
25901
  const shift = discussionRows(discussion) * THREAD_ROW_PX * -1;
25713
25902
  const body = bodyRef.current;
25714
25903
  if (body !== null && offsetOf(discussion.anchor.start) - body.scrollTop < 0) pendingScrollShiftRef.current += shift;
25904
+ const placed = draftThreads.some((thread) => thread.id === id);
25715
25905
  if (fileComments.some((record) => record.id === id)) {
25716
25906
  onCommentRemove(sessionId, id).catch((error) => {
25717
25907
  onToast(error instanceof Error ? error.message : String(error));
25718
25908
  });
25909
+ if (placed) {
25910
+ setDraftThreads((current) => current.filter((thread) => thread.id !== id));
25911
+ forgetThreads([id]);
25912
+ }
25719
25913
  return;
25720
25914
  }
25915
+ discardedByReader.current.add(id);
25916
+ onCommentRemove(sessionId, id).catch((error) => {
25917
+ onToast(error instanceof Error ? error.message : String(error));
25918
+ });
25721
25919
  setDraftThreads((current) => current.filter((thread) => thread.id !== id));
25722
25920
  forgetThreads([id]);
25723
25921
  };
@@ -25841,6 +26039,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25841
26039
  if (width !== bodyWidth) setBodyWidth(width);
25842
26040
  });
25843
26041
  const fitWidthRef = (0, react.useRef)(0);
26042
+ const measuredWritesRef = (0, react.useRef)({});
25844
26043
  const [, bumpFixTick] = (0, react.useReducer)((n) => n + 1, 0);
25845
26044
  const fixTickArmedRef = (0, react.useRef)(false);
25846
26045
  (0, react.useLayoutEffect)(() => {
@@ -25869,6 +26068,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25869
26068
  const drawn = last.getBoundingClientRect().bottom + (Number.parseFloat(getComputedStyle(last).marginBottom) || 0) - body.getBoundingClientRect().top - (slack?.getBoundingClientRect().height ?? 0);
25870
26069
  if (drawn <= 0) continue;
25871
26070
  const want = Math.max(1, Math.ceil((drawn - DISCUSSION_ROW_SNAP_PX) / THREAD_ROW_PX));
26071
+ const current = threadState[id]?.bodyRows;
26072
+ if (current !== void 0 && Math.abs(drawn - (current * THREAD_ROW_PX + DISCUSSION_ROW_SNAP_PX)) <= 1) continue;
26073
+ const now = Date.now();
26074
+ const writes = (measuredWritesRef.current[id] ?? []).filter((at) => now - at < 1e3);
26075
+ measuredWritesRef.current[id] = writes;
26076
+ if (writes.length >= 3) continue;
26077
+ writes.push(now);
25872
26078
  if (threadState[id]?.bodyRows !== want) measured[id] = { bodyRows: want };
25873
26079
  }
25874
26080
  if (Object.keys(measured).length > 0) patchThreads(measured);
@@ -26038,6 +26244,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
26038
26244
  (0, react.useLayoutEffect)(() => {
26039
26245
  if (rowCount === 0) return;
26040
26246
  if (placedFileRef.current !== file.id) return;
26247
+ const landKey = `${scrollTick}|${previewActive === true ? 1 : 0}`;
26248
+ const asked = lastLandKeyRef.current !== landKey;
26249
+ lastLandKeyRef.current = landKey;
26250
+ if (!asked && readerOwnsViewRef.current) return;
26041
26251
  const resumed = landingTopRef.current;
26042
26252
  if (resumed !== void 0) {
26043
26253
  landingTopRef.current = void 0;
@@ -26157,6 +26367,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
26157
26367
  bumpFlash(false);
26158
26368
  };
26159
26369
  const jumpBlock = (direction, wrapGuard = false, singleToast = wrapGuard) => {
26370
+ rememberJumpAway(sessionId, file.id);
26160
26371
  if (splitView && !previewActive) {
26161
26372
  splitDiffRef.current?.jump(direction, wrapGuard, singleToast);
26162
26373
  return;
@@ -26173,6 +26384,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
26173
26384
  * configured lead rows above it and the block it lands in flashed.
26174
26385
  */
26175
26386
  const gotoLine = (line) => {
26387
+ rememberJumpAway(sessionId, file.id);
26176
26388
  const row = model.diff.rows.findIndex((entry) => entry.newLine === line);
26177
26389
  if (row === -1) {
26178
26390
  onToast(t("panel.gotoMissing", { line }));
@@ -26354,15 +26566,28 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
26354
26566
  if (body === null) return;
26355
26567
  for (const text of body.querySelectorAll("[data-diff-quote-text]")) text.scrollLeft = body.scrollLeft;
26356
26568
  }, []);
26569
+ /**
26570
+ * The reader has taken the view in hand: whatever landing was being kept true stops being true.
26571
+ *
26572
+ * This is the ONLY reliable way to tell their scroll from the panel's own. `onScroll` compares the
26573
+ * position in the event with the last offset the panel wrote (`selfScrollRef`), and a landing retry that
26574
+ * writes the very same frame makes those two the same number: the reader's wheel is then read as the
26575
+ * panel's own write, the retry is never cancelled, and it keeps pulling the view back to the card it
26576
+ * landed on (seen live on 2026-10-11 as `applyScrollTop 1417 -> 1627` every frame while the reader
26577
+ * scrolled up). A `wheel` event cannot be raised by a programmatic `scrollTop` write, so it is the
26578
+ * unmistakable signal — and it arrives BEFORE the scroll it causes, so the loop is cancelled in time.
26579
+ */
26580
+ const readerTookOver = () => {
26581
+ landingGoalRef.current = void 0;
26582
+ landingPendingRef.current = false;
26583
+ readerOwnsViewRef.current = true;
26584
+ };
26357
26585
  const onScroll = () => {
26358
26586
  const body = bodyRef.current;
26359
26587
  if (body === null) return;
26360
26588
  const written = selfScrollRef.current;
26361
26589
  selfScrollRef.current = void 0;
26362
- if (written === void 0 || Math.abs(body.scrollTop - written) >= 1) {
26363
- landingGoalRef.current = void 0;
26364
- landingPendingRef.current = false;
26365
- }
26590
+ if (written === void 0 || Math.abs(body.scrollTop - written) >= 1) readerTookOver();
26366
26591
  syncQuoteScroll(body);
26367
26592
  rememberPanelView(sessionId, {
26368
26593
  fileId: file.id,
@@ -27191,9 +27416,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27191
27416
  })
27192
27417
  })
27193
27418
  ]
27194
- }), (0, react_jsx_runtime.jsx)("div", {
27419
+ }), (0, react_jsx_runtime.jsxs)("div", {
27195
27420
  className: PendingPanel_module_css_default.diffActionDecisions,
27196
- children: fileHasNoDiff(file) ? (0, react_jsx_runtime.jsx)("button", {
27421
+ children: [file.textUnavailable === true && (0, react_jsx_runtime.jsx)("p", {
27422
+ className: `${PendingPanel_module_css_default.note} ${PendingPanel_module_css_default.noteCentered}`,
27423
+ "data-diff-text-unavailable": true,
27424
+ children: t("panel.textUnavailable")
27425
+ }), fileHasNoDiff(file) && file.textUnavailable !== true ? (0, react_jsx_runtime.jsx)("button", {
27197
27426
  type: "button",
27198
27427
  className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary} ${PendingPanel_module_css_default.actionQuietDisabled}`,
27199
27428
  "data-diff-remove": true,
@@ -27220,7 +27449,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27220
27449
  onRevert(sessionId, file.id);
27221
27450
  },
27222
27451
  children: file.earlierVersion === "none" ? t("action.delete") : t("action.revert")
27223
- })] })
27452
+ })] })]
27224
27453
  })]
27225
27454
  }),
27226
27455
  failedMessage !== void 0 && (0, react_jsx_runtime.jsx)("p", {
@@ -27442,6 +27671,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27442
27671
  ref: bodyRef,
27443
27672
  tabIndex: 0,
27444
27673
  onScroll,
27674
+ onWheel: readerTookOver,
27445
27675
  style: {
27446
27676
  tabSize: tabWidthSpaces,
27447
27677
  "--dsh-diff-quote-width": `${widestLine}ch`
@@ -27888,6 +28118,58 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27888
28118
  n: (prev?.n ?? 0) + 1
27889
28119
  }));
27890
28120
  };
28121
+ /** Whether the panel is stepping back through the reader's jumps (see `jumpBack`). */
28122
+ const jumpingBackRef = (0, react.useRef)(false);
28123
+ /**
28124
+ * Put the place the reader is leaving on the back stack.
28125
+ *
28126
+ * The JUMPS themselves call this — a row click, a path typed into the header, the file keys, an undo/redo's
28127
+ * re-landing, a comment jump — and `landOn` deliberately does NOT: the panel also lands itself on a file (a
28128
+ * fresh showing, the advance a decision leaves behind, the rest of this list arriving), which is not a jump
28129
+ * the reader made, and recording those would put a step on the stack that only leads back to where they
28130
+ * already are.
28131
+ *
28132
+ * A back step records nothing at all, which is what `jumpingBackRef` says: it is already leaving the place
28133
+ * it is about to land on, and recording it would keep the stack from ever shrinking.
28134
+ */
28135
+ const leftPlace = () => {
28136
+ if (!jumpingBackRef.current) rememberJumpAway(current, selected);
28137
+ };
28138
+ /**
28139
+ * Step back to where the last deliberate jump was made from — the mouse's BACK side button, while the
28140
+ * pointer is over this panel.
28141
+ *
28142
+ * The stack holds PLACES rather than files, one per jump the reader made, and it spans files: the step that
28143
+ * matters most is coming back out of a file a jump took them into. A place whose entry has left the list
28144
+ * since is skipped rather than landing nowhere, because the list is a live view of the store and a file can
28145
+ * vanish between two jumps.
28146
+ */
28147
+ const jumpBack = () => {
28148
+ for (;;) {
28149
+ const place = popJumpAway(current);
28150
+ if (place === void 0) return;
28151
+ if (!files.some((entry) => entry.id === place.fileId)) continue;
28152
+ jumpingBackRef.current = true;
28153
+ try {
28154
+ if (place.fileId === selected) {
28155
+ const body = panelRef.current?.querySelector("[data-diff-body]");
28156
+ if (body !== null && body !== void 0) {
28157
+ body.scrollTop = place.scrollTop;
28158
+ rememberPanelView(current, {
28159
+ fileId: place.fileId,
28160
+ scrollTop: place.scrollTop
28161
+ });
28162
+ }
28163
+ } else {
28164
+ setSelected(place.fileId);
28165
+ landOn(place.fileId, place.scrollTop);
28166
+ }
28167
+ } finally {
28168
+ jumpingBackRef.current = false;
28169
+ }
28170
+ return;
28171
+ }
28172
+ };
27891
28173
  /** The selection as the latest render has it, for the closers that run from a
27892
28174
  * cleanup (the docked tab unmounting) rather than from a handler. */
27893
28175
  const selectedRef = (0, react.useRef)(selected);
@@ -28046,6 +28328,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28046
28328
  const onPanelFile = (event) => {
28047
28329
  const detail = event.detail;
28048
28330
  if (detail === void 0 || typeof detail.fileId !== "string") return;
28331
+ leftPlace();
28049
28332
  setSelected(detail.fileId);
28050
28333
  landOn(detail.fileId);
28051
28334
  };
@@ -28287,6 +28570,30 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28287
28570
  /** The window's height, for the panel's minimum-size floor (see {@link panelInsets}). */
28288
28571
  const [viewportHeight, setViewportHeight] = (0, react.useState)(() => window.innerHeight);
28289
28572
  const panelRef = (0, react.useRef)(null);
28573
+ /** The latest `jumpBack`, for the side-button listener, which is attached once and must not go stale. */
28574
+ const jumpBackRef = (0, react.useRef)(jumpBack);
28575
+ jumpBackRef.current = jumpBack;
28576
+ /**
28577
+ * The mouse's BACK side button steps back through the reader's jumps.
28578
+ *
28579
+ * The listener is on the panel's own element, so the press only counts while the pointer is over the panel
28580
+ * — a side button pressed anywhere else in the harness is none of this plugin's business. `button === 3` is
28581
+ * the X1 (back) button; its default is prevented so Chromium's own history does not answer the same press
28582
+ * and leave the page as well as the panel.
28583
+ */
28584
+ (0, react.useEffect)(() => {
28585
+ const root = panelRef.current;
28586
+ if (root === null) return;
28587
+ const onSideButton = (event) => {
28588
+ if (event.button !== 3) return;
28589
+ event.preventDefault();
28590
+ jumpBackRef.current();
28591
+ };
28592
+ root.addEventListener("mousedown", onSideButton, true);
28593
+ return () => {
28594
+ root.removeEventListener("mousedown", onSideButton, true);
28595
+ };
28596
+ }, [docked, open]);
28290
28597
  const splitRef = (0, react.useRef)(null);
28291
28598
  /** The code scroll box's bounds within the split, so the floating card is
28292
28599
  * constrained to it. */
@@ -28657,7 +28964,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28657
28964
  if (pick === void 0) return;
28658
28965
  if (pick !== selected) setSelected(pick);
28659
28966
  if (started) landOn(pick, panelFileOffset(current, pick));
28660
- else if (typed !== void 0) landOn(pick);
28967
+ else if (typed !== void 0) {
28968
+ leftPlace();
28969
+ landOn(pick);
28970
+ }
28661
28971
  }, [
28662
28972
  open,
28663
28973
  docked,
@@ -29142,6 +29452,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29142
29452
  clearPickedFiles();
29143
29453
  if (id === selected) setJumpSignal((signal) => signal + 1);
29144
29454
  else {
29455
+ leftPlace();
29145
29456
  setSelected(id);
29146
29457
  landOn(id);
29147
29458
  }
@@ -29398,6 +29709,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29398
29709
  * line, and the detail lands on the removal carrying it rather than on the current line that now
29399
29710
  * reads that number (see `frameNamesNoCurrentLine`). */
29400
29711
  const jumpToComment = (fileId, line, id, oldSide) => {
29712
+ leftPlace();
29401
29713
  if (fileId !== selected) setSelected(fileId);
29402
29714
  landOn(fileId, void 0, void 0, true, line, id, oldSide);
29403
29715
  };
@@ -29458,7 +29770,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29458
29770
  return;
29459
29771
  }
29460
29772
  if (id === "copy-path") {
29461
- (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(target.path).then((accepted) => {
29773
+ const listed = files.find((file) => diffPathsMatch(target.path, file.path, snapshot.workspacePath));
29774
+ const absolute = /^([a-zA-Z]:[\\/]|\\\\|\/)/.test(target.path);
29775
+ const root = snapshot.workspacePath;
29776
+ const full = listed?.path ?? (absolute || root === void 0 || root === "" ? target.path : `${root.replace(/[\\/]+$/, "")}/${target.path.replace(/^[\\/]+/, "")}`);
29777
+ (0, _deepseek_ai_dsh_client_ui_primitives.writeClipboard)(full).then((accepted) => {
29462
29778
  if (accepted) showCopyToast(t("action.copied"));
29463
29779
  });
29464
29780
  return;
@@ -29774,6 +30090,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29774
30090
  if (id === void 0) return;
29775
30091
  if (id === selected) setUndoFlash((signal) => signal + 1);
29776
30092
  else {
30093
+ leftPlace();
29777
30094
  setSelected(id);
29778
30095
  landOn(id);
29779
30096
  }
@@ -29783,6 +30100,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29783
30100
  if (id === void 0) return;
29784
30101
  if (id === selected) setUndoFlash((signal) => signal + 1);
29785
30102
  else {
30103
+ leftPlace();
29786
30104
  setSelected(id);
29787
30105
  landOn(id);
29788
30106
  }
@@ -29854,6 +30172,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29854
30172
  const index = files.findIndex((file) => file.id === selected);
29855
30173
  const next = files[(index + direction + files.length) % files.length];
29856
30174
  if (next !== void 0) {
30175
+ leftPlace();
29857
30176
  setSelected(next.id);
29858
30177
  landOn(next.id);
29859
30178
  }
@@ -33350,6 +33669,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
33350
33669
  const zh = {
33351
33670
  "panel.title": "待处理改动",
33352
33671
  "panel.empty": "列表中暂无文件",
33672
+ "panel.textUnavailable": "该文件不是文本(二进制或不支持的文件格式),无法按行比较。可以移出列表,或用默认程序打开。",
33353
33673
  "panel.dockGuide": "逐条审查改动,可保留、回退或评论",
33354
33674
  "panel.dockUnavailable": "这个环境没有可停靠的右侧边栏",
33355
33675
  "panel.dockFailed": "右侧边栏现在还不能接收面板",
@@ -33608,6 +33928,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
33608
33928
  const en = {
33609
33929
  "panel.title": "Pending changes",
33610
33930
  "panel.empty": "No files in the list yet",
33931
+ "panel.textUnavailable": "This file is not text (binary or an unsupported format), so it cannot be compared line by line. You can dismiss it or open it with the default application.",
33611
33932
  "panel.dockGuide": "Review each change: keep, revert, or comment",
33612
33933
  "panel.dockUnavailable": "This build has no right sidebar to dock into",
33613
33934
  "panel.dockFailed": "The right sidebar cannot take the panel yet",
package/lib/index.js CHANGED
@@ -3347,9 +3347,12 @@ function refusalText(refusal, path) {
3347
3347
  /**
3348
3348
  * The sentence a file that could not be listed is refused with.
3349
3349
  *
3350
- * All three are the workspace's rules rather than the annotation's: the panel can only show what the
3351
- * session's workspace contains and the file service can read, and naming which one failed is what lets
3352
- * the agent pick another file, or stop annotating that one.
3350
+ * Both are the workspace's rules rather than the annotation's: there is either no workspace to hold a
3351
+ * list, or the file service could not read the file as text. Naming which one failed is what lets the
3352
+ * agent pick another file, or stop annotating that one.
3353
+ *
3354
+ * A path OUTSIDE the workspace is not in this list: the panel can hold such a file (an edit to one is
3355
+ * captured like any other), so it is listed and annotated rather than refused (see `resolveForListing`).
3353
3356
  *
3354
3357
  * @param kind - why listing failed.
3355
3358
  * @param path - the path the caller named.
@@ -3357,7 +3360,6 @@ function refusalText(refusal, path) {
3357
3360
  */
3358
3361
  function unlistedText(kind, path) {
3359
3362
  switch (kind) {
3360
- case "outside": return `refused: "${path}" is not inside this session's workspace, so the review panel cannot list it. Annotate a file of the workspace the user is working in.`;
3361
3363
  case "no-workspace": return `refused: this session has no workspace, so there is no file list to add "${path}" to.`;
3362
3364
  default: return `refused: "${path}" could not be read as a text file, so there is nothing to annotate. Check the path (a workspace-relative path is fine) and try again.`;
3363
3365
  }
@@ -4392,6 +4394,30 @@ function resolveInsideWorkspace(root, input) {
4392
4394
  const absolute = isAbsolute(input) ? resolve(input) : resolve(root, input);
4393
4395
  return workspaceRelativeOf(root, absolute) === void 0 ? void 0 : absolute;
4394
4396
  }
4397
+ /**
4398
+ * Resolve one caller-supplied path for LISTING, which an absolute path need not keep inside the workspace.
4399
+ *
4400
+ * A relative path is workspace-relative, exactly as before. An absolute one is taken as it is, wherever it
4401
+ * points: the fence `resolveInsideWorkspace` draws is the right one for a SUBTREE question — a scan of the
4402
+ * workspace's own VCS — and the wrong one for "show me this file".
4403
+ *
4404
+ * The panel can already hold a file outside the workspace: the tracked capture behind an `edit`/`write`/`
4405
+ * `str_replace_editor` has never had a workspace fence (`tools/result` folds `outcome.path` as the tool
4406
+ * spelled it), so a file the agent edited elsewhere is listed, kept and reverted like any other. Refusing
4407
+ * to READ one into the list therefore only made the plugin disagree with itself: a card could not hang on a
4408
+ * file the panel was already able to show. Both ways in — the agent's annotate call and the reader's own
4409
+ * "add this path" — go through this, so they agree.
4410
+ *
4411
+ * What is read is still the harness's file service, whose reads are not workspace-confined (only its
4412
+ * mutations are fenced, by the sandbox policy), so this adds no read the deployment does not already allow.
4413
+ *
4414
+ * @param root - the workspace root, for a relative path.
4415
+ * @param input - the caller's path (absolute anywhere, or workspace-relative).
4416
+ * @returns the absolute path to list.
4417
+ */
4418
+ function resolveForListing(root, input) {
4419
+ return isAbsolute(input) ? resolve(input) : resolve(root, input);
4420
+ }
4395
4421
  /** The workspace-relative parent of a relative directory path (`''` at the root). */
4396
4422
  /** Fold one path for comparison: absolute, `/`-separated, case-folded on Windows.
4397
4423
  * Entries are keyed by the path spelling their capture carried (a tool's display
@@ -4610,8 +4636,8 @@ function apply(ctx, config) {
4610
4636
  * already lands with — so the file opens at its own content and the card sits on the lines it names.
4611
4637
  *
4612
4638
  * It is deliberately that ROUTE and not a raw insert: a path already listed is answered from the list
4613
- * (so annotating twice never re-baselines a review in progress), a path outside the workspace is
4614
- * refused here rather than confined later, and what lands goes through the same fold + persist + undo
4639
+ * (so annotating twice never re-baselines a review in progress), a path outside the workspace is listed
4640
+ * like any other (see `resolveForListing`), and what lands goes through the same fold + persist + undo
4615
4641
  * bookkeeping as every other admission.
4616
4642
  *
4617
4643
  * @param sessionId - the session whose list gains the file.
@@ -4623,8 +4649,7 @@ function apply(ctx, config) {
4623
4649
  await ensureLoaded();
4624
4650
  const workspace = workspaceOf(sessionId);
4625
4651
  if (workspace === void 0) return { kind: "no-workspace" };
4626
- const absolute = resolveInsideWorkspace(workspace.path, asked);
4627
- if (absolute === void 0) return { kind: "outside" };
4652
+ const absolute = resolveForListing(workspace.path, asked);
4628
4653
  const listed = store.list(sessionId).find((entry) => pathIdentity(entry.path) === pathIdentity(absolute));
4629
4654
  if (listed !== void 0) return {
4630
4655
  kind: "listed",
@@ -4632,14 +4657,25 @@ function apply(ctx, config) {
4632
4657
  added: false
4633
4658
  };
4634
4659
  const content = await readTextOrNone(absolute, signal ?? new AbortController().signal);
4635
- if (content === void 0) return { kind: "missing" };
4660
+ let existsAsFile = false;
4661
+ if (content === void 0) {
4662
+ const lifetime = signal ?? new AbortController().signal;
4663
+ try {
4664
+ const info = await ctx.fs.stat(await ctx.fs.resolve(absolute, { signal: lifetime }), lifetime);
4665
+ existsAsFile = info !== void 0 && info.type === "file";
4666
+ } catch {
4667
+ existsAsFile = false;
4668
+ }
4669
+ }
4670
+ if (content === void 0 && !existsAsFile) return { kind: "missing" };
4636
4671
  await foldBatch(sessionId, [{
4637
4672
  id: absolute,
4638
4673
  sessionId,
4639
4674
  path: absolute,
4640
4675
  earlierVersion: "file",
4641
- oldText: content,
4642
- newText: content,
4676
+ oldText: content ?? "",
4677
+ newText: content ?? "",
4678
+ textUnavailable: content === void 0 ? true : void 0,
4643
4679
  updatedAt: Date.now(),
4644
4680
  sessionIds: [sessionId],
4645
4681
  unseen: true
@@ -6888,8 +6924,8 @@ function apply(ctx, config) {
6888
6924
  if (target === void 0) return rpcError("sessionId and path must be non-empty strings");
6889
6925
  const workspace = workspaceOf(target.sessionId);
6890
6926
  if (workspace === void 0) return rpcError("add unavailable: the session has no workspace");
6891
- const absolute = resolveInsideWorkspace(workspace.path, target.path);
6892
- if (absolute === void 0) return {
6927
+ const absolute = resolveForListing(workspace.path, target.path);
6928
+ if (!target.exact && workspaceRelativeOf(workspace.path, absolute) === void 0) return {
6893
6929
  ok: true,
6894
6930
  value: {
6895
6931
  outcome: "outside",
@@ -6955,17 +6991,25 @@ function apply(ctx, config) {
6955
6991
  const existing = store.list(target.sessionId).find((entry) => pathIdentity(entry.path) === pathIdentity(absolute));
6956
6992
  if (existing !== void 0) return await admitNamed([existing], false, false);
6957
6993
  const content = await readTextOrNone(absolute, signal);
6958
- return await admitNamed(content === void 0 ? [] : [{
6994
+ let listNamed = content !== void 0;
6995
+ if (!listNamed) try {
6996
+ const info = await ctx.fs.stat(await ctx.fs.resolve(absolute, { signal }), signal);
6997
+ listNamed = info !== void 0 && info.type === "file";
6998
+ } catch {
6999
+ listNamed = false;
7000
+ }
7001
+ return await admitNamed(listNamed ? [{
6959
7002
  id: absolute,
6960
7003
  sessionId: target.sessionId,
6961
7004
  path: absolute,
6962
7005
  earlierVersion: "file",
6963
- oldText: content,
6964
- newText: content,
7006
+ oldText: content ?? "",
7007
+ newText: content ?? "",
7008
+ textUnavailable: content === void 0 ? true : void 0,
6965
7009
  updatedAt: now,
6966
7010
  sessionIds: [target.sessionId],
6967
7011
  lineage: lineageOf(target.sessionId)
6968
- }], false, false);
7012
+ }] : [], false, false);
6969
7013
  }
6970
7014
  const root = detectVcsRoot(workspace.path);
6971
7015
  if (root === void 0) return {
@@ -7316,7 +7360,7 @@ function commentAddOf(payload) {
7316
7360
  if (typeof startLine !== "number" || !Number.isFinite(startLine)) return void 0;
7317
7361
  if (typeof endLine !== "number" || !Number.isFinite(endLine)) return void 0;
7318
7362
  if (typeof quote !== "string") return void 0;
7319
- if (typeof text !== "string" || text.trim().length === 0) return void 0;
7363
+ if (typeof text !== "string") return void 0;
7320
7364
  const id = body.id;
7321
7365
  const quoteContext = body.quoteContext;
7322
7366
  const quoteLines = [];
@@ -168,8 +168,6 @@ export type ListFileOutcome = {
168
168
  kind: 'listed';
169
169
  entry: PendingEntry;
170
170
  added: boolean;
171
- } | {
172
- kind: 'outside';
173
171
  } | {
174
172
  kind: 'missing';
175
173
  } | {
@@ -205,15 +203,18 @@ export interface AnnotateRunDeps {
205
203
  /**
206
204
  * The sentence a file that could not be listed is refused with.
207
205
  *
208
- * All three are the workspace's rules rather than the annotation's: the panel can only show what the
209
- * session's workspace contains and the file service can read, and naming which one failed is what lets
210
- * the agent pick another file, or stop annotating that one.
206
+ * Both are the workspace's rules rather than the annotation's: there is either no workspace to hold a
207
+ * list, or the file service could not read the file as text. Naming which one failed is what lets the
208
+ * agent pick another file, or stop annotating that one.
209
+ *
210
+ * A path OUTSIDE the workspace is not in this list: the panel can hold such a file (an edit to one is
211
+ * captured like any other), so it is listed and annotated rather than refused (see `resolveForListing`).
211
212
  *
212
213
  * @param kind - why listing failed.
213
214
  * @param path - the path the caller named.
214
215
  * @returns the sentence the caller reads.
215
216
  */
216
- export declare function unlistedText(kind: 'outside' | 'missing' | 'no-workspace', path: string): string;
217
+ export declare function unlistedText(kind: 'missing' | 'no-workspace', path: string): string;
217
218
  /**
218
219
  * Build the body one tool call runs: resolve the file, apply the rule, store the record.
219
220
  *
@@ -4,6 +4,7 @@ export declare const NS = "diff-approval";
4
4
  export declare const zh: {
5
5
  'panel.title': string;
6
6
  'panel.empty': string;
7
+ 'panel.textUnavailable': string;
7
8
  'panel.dockGuide': string;
8
9
  'panel.dockUnavailable': string;
9
10
  'panel.dockFailed': string;
@@ -273,6 +274,7 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
273
274
  export declare const en: {
274
275
  'panel.title': string;
275
276
  'panel.empty': string;
277
+ 'panel.textUnavailable': string;
276
278
  'panel.dockGuide': string;
277
279
  'panel.dockUnavailable': string;
278
280
  'panel.dockFailed': string;
@@ -15,6 +15,13 @@
15
15
  * @module dsh-diff-approval/client/panel-memory
16
16
  */
17
17
  import type { Discussion, DiscussionQuoteLine } from './discussion.ts';
18
+ /** One place a deliberate jump left behind: the file, and how far down it was. */
19
+ export interface PanelJumpPlace {
20
+ /** The pending entry the reader was in. */
21
+ fileId: string;
22
+ /** The code view's `scrollTop` there — what `rememberPanelView` keeps current as the reader scrolls. */
23
+ scrollTop: number;
24
+ }
18
25
  /**
19
26
  * What the panel keeps about one thread that is NOT the host's to keep: what the reader is
20
27
  * typing, whether the block is folded, and the body height the panel last measured for it.
@@ -182,6 +189,29 @@ export declare function lastPanelFile(sessionId: string | undefined): string | u
182
189
  * @returns the remembered scrollTop, or undefined when there is none.
183
190
  */
184
191
  export declare function panelFileOffset(sessionId: string | undefined, fileId: string): number | undefined;
192
+ /**
193
+ * Remember the place a deliberate jump is leaving, so the reader can come back to it.
194
+ *
195
+ * ONLY JUMPS PASS THROUGH HERE — never a scroll of the reader's own, which is the whole point. Their place
196
+ * is already kept per file (`rememberPanelView`), kept current by every scroll they make, so a back step
197
+ * has nothing to measure: it hands that same memory back. Reading it from there rather than from the DOM is
198
+ * also what makes this work in both views, one column and side by side, whose scrollers are different
199
+ * elements and only one of which is ever mounted.
200
+ *
201
+ * A jump that would push the place already on top is dropped: two entries for one place would cost the
202
+ * reader two presses of the back button to get anywhere.
203
+ *
204
+ * @param sessionId - the session the panel is reviewing; nothing is recorded without one.
205
+ * @param fileId - the entry being LEFT, not the one being jumped to.
206
+ */
207
+ export declare function rememberJumpAway(sessionId: string | undefined, fileId: string | undefined): void;
208
+ /**
209
+ * Take the last place a deliberate jump left, for a back step. Spent here, so a second press goes one step
210
+ * further back rather than landing where the reader already is.
211
+ * @param sessionId - the session, if any.
212
+ * @returns that place, or undefined when there is nothing to go back to.
213
+ */
214
+ export declare function popJumpAway(sessionId: string | undefined): PanelJumpPlace | undefined;
185
215
  /**
186
216
  * Forget every session's record. A page reload does this by itself; a test calls
187
217
  * it to start from a clean page rather than inheriting the previous case's place.
@@ -38,6 +38,11 @@ export interface SplitDiff {
38
38
  * alignment, each deletion pairs with its most-similar addition (order
39
39
  * preserved, threshold-bounded) so a mixed insert/delete block does not force a
40
40
  * wrong line together. A stray deletion or addition stays a one-sided pair.
41
+ *
42
+ * THE ORDER OF THE RESULT IS PART OF THE CONTRACT: going down `pairs`, neither
43
+ * column's line numbers ever go backwards. Alignment may therefore move a line
44
+ * onto the row opposite it, but never past a line of its own side — an unpaired
45
+ * line between two pairs is emitted where it belongs, not after them.
41
46
  * @param rows - the whole-file diff rows.
42
47
  * @param alignBySimilarity - align a change block by similarity instead of order.
43
48
  * @returns the split pairs plus the row→pair index map.
@@ -43,6 +43,17 @@ export interface PendingEntry {
43
43
  * did not exist, so the whole-file action deletes it.
44
44
  */
45
45
  earlierVersion: PendingEntryKind;
46
+ /**
47
+ * WHETHER THE HOST COULD READ THIS PATH AS TEXT AT ALL. Set when a read failed for a path that EXISTS — a
48
+ * binary, a format the backend will not decode, an unreadable permission — so there is no diff to compute
49
+ * and no line to compare.
50
+ *
51
+ * It is NOT "the file is empty": an empty file reads as `''`, which is a value, and its diff is a real (if
52
+ * trivial) answer. It is NOT "the content matches the baseline" either — that is `fileHasNoDiff` on the
53
+ * client, which needs text to have been read. The panel says this state in its own words and offers only
54
+ * the decisions that make sense without text (dismiss, open with the default application).
55
+ */
56
+ textUnavailable?: boolean | undefined;
46
57
  /** File content before the first captured operation (empty for a creation). */
47
58
  oldText: string;
48
59
  /** File content after the latest captured operation. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-diff-approval",
3
- "version": "0.33.0",
3
+ "version": "0.35.0",
4
4
  "description": "DeepSeek Harness plugin: pending-edit review with whole-file diff and Keep/Revert",
5
5
  "packageManager": "pnpm@11.21.0",
6
6
  "author": "Wu Zhiwei",