dsh-diff-approval 0.31.0 → 0.33.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_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;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)}";
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");
@@ -2700,6 +2700,60 @@ window.__ModuleLoader__.load({
2700
2700
  });
2701
2701
  return blocks;
2702
2702
  }
2703
+ /** The maximal run of non-context rows around `index` — the change region it belongs to. */
2704
+ function changeRunOf(rows, index) {
2705
+ let start = index;
2706
+ while (start > 0 && rows[start - 1] !== void 0 && rows[start - 1].kind !== "context") start--;
2707
+ let end = index;
2708
+ while (end + 1 < rows.length && rows[end + 1] !== void 0 && rows[end + 1].kind !== "context") end++;
2709
+ return {
2710
+ start,
2711
+ end
2712
+ };
2713
+ }
2714
+ /**
2715
+ * The change region a row range sits in, widened to whole runs: from the first row of the run `start`
2716
+ * belongs to, to the last row of the run `end` belongs to. A row range that names one side of a change —
2717
+ * one line of a replacement, or the additions alone — grows to cover that change's removals as well, which
2718
+ * is what a reader pointing at it means. Rows that are context stand alone (a run is a maximal non-context
2719
+ * run), so a range that touches no change is returned as it is.
2720
+ * @param rows - the whole-file diff rows.
2721
+ * @param start - the range's first row.
2722
+ * @param end - the range's last row.
2723
+ * @returns the widened row range.
2724
+ */
2725
+ function changeRunSpanOf(rows, start, end) {
2726
+ return {
2727
+ start: changeRunOf(rows, start).start,
2728
+ end: changeRunOf(rows, Math.max(start, end)).end
2729
+ };
2730
+ }
2731
+ /**
2732
+ * The line a side's missing lines would be inserted before. A change run lists all its removals before any
2733
+ * addition, so the row next to a mid-run removal has no new-file line at all: reading one row back would
2734
+ * put the insertion point at the top of the file. The line that side ends at inside the whole run is the
2735
+ * position the pairing implies (a lone removal belongs after the lines that replaced its neighbours), and
2736
+ * a run with no line on that side at all — a pure deletion asking where the new side is — falls back to
2737
+ * the line above the run.
2738
+ * @param rows - the whole-file diff rows.
2739
+ * @param index - a row of the range whose side has no lines.
2740
+ * @param side - which side is missing its lines.
2741
+ * @returns the 1-based line the missing lines go before.
2742
+ */
2743
+ function insertionPointOf(rows, index, side) {
2744
+ const { start, end } = changeRunOf(rows, index);
2745
+ let last;
2746
+ for (let at = start; at <= end; at++) {
2747
+ const line = side === "old" ? rows[at]?.oldLine : rows[at]?.newLine;
2748
+ if (line !== void 0) last = last === void 0 ? line : Math.max(last, line);
2749
+ }
2750
+ if (last !== void 0) return last + 1;
2751
+ for (let at = start - 1; at >= 0; at--) {
2752
+ const line = side === "old" ? rows[at]?.oldLine : rows[at]?.newLine;
2753
+ if (line !== void 0) return line + 1;
2754
+ }
2755
+ return 1;
2756
+ }
2703
2757
  /**
2704
2758
  * One diff block's old/new line ranges, 1-based inclusive, for block-level
2705
2759
  * keep/revert. A side with no lines (a pure addition or deletion) is empty; its
@@ -2729,13 +2783,12 @@ window.__ModuleLoader__.load({
2729
2783
  newEnd = Math.max(newEnd, row.newLine);
2730
2784
  }
2731
2785
  }
2732
- const before = rows[block.start - 1];
2733
2786
  if (oldStart === Infinity) {
2734
- oldStart = (before?.oldLine ?? 0) + 1;
2787
+ oldStart = insertionPointOf(rows, block.start, "old");
2735
2788
  oldEnd = oldStart - 1;
2736
2789
  }
2737
2790
  if (newStart === Infinity) {
2738
- newStart = (before?.newLine ?? 0) + 1;
2791
+ newStart = insertionPointOf(rows, block.start, "new");
2739
2792
  newEnd = newStart - 1;
2740
2793
  }
2741
2794
  return {
@@ -2745,6 +2798,76 @@ window.__ModuleLoader__.load({
2745
2798
  newEnd
2746
2799
  };
2747
2800
  }
2801
+ /** The row indices one pair holds, old side first. */
2802
+ function pairRowsOf(pair) {
2803
+ const list = [];
2804
+ if (pair.old !== void 0) list.push(pair.old);
2805
+ if (pair.new !== void 0) list.push(pair.new);
2806
+ return list;
2807
+ }
2808
+ /** Whether any row the pair holds is a change; a pair of context rows is not one. */
2809
+ function pairIsChanged(rows, pair) {
2810
+ return pairRowsOf(pair).some((index) => rows[index] !== void 0 && rows[index].kind !== "context");
2811
+ }
2812
+ /**
2813
+ * One side-by-side pair's old/new line ranges, 1-based inclusive, for pair-level keep/revert. A pair is
2814
+ * one old line against one new line, so each side contributes a single line; a side the pair does not
2815
+ * have (an unpaired insertion or removal) is the empty range at that side's insertion point, read off the
2816
+ * row before the pair — the same rule `blockRangesOf` applies to a side with no lines at all.
2817
+ * @param rows - the whole-file diff rows.
2818
+ * @param pair - the rows the pair holds.
2819
+ * @returns the old and new line ranges, or undefined for a pair that holds no row.
2820
+ */
2821
+ function pairRangeOf(rows, pair) {
2822
+ const oldRow = pair.old === void 0 ? void 0 : rows[pair.old];
2823
+ const newRow = pair.new === void 0 ? void 0 : rows[pair.new];
2824
+ if (oldRow === void 0 && newRow === void 0) return void 0;
2825
+ const first = Math.min(pair.old ?? Number.POSITIVE_INFINITY, pair.new ?? Number.POSITIVE_INFINITY);
2826
+ const oldStart = oldRow?.oldLine ?? insertionPointOf(rows, first, "old");
2827
+ const newStart = newRow?.newLine ?? insertionPointOf(rows, first, "new");
2828
+ return {
2829
+ oldStart,
2830
+ oldEnd: oldRow?.oldLine ?? oldStart - 1,
2831
+ newStart,
2832
+ newEnd: newRow?.newLine ?? newStart - 1
2833
+ };
2834
+ }
2835
+ /**
2836
+ * The old/new ranges keep/revert act on for the pairs a side-by-side selection names, in the order they
2837
+ * must be sent. Pairs of context rows are dropped (nothing to act on). When the changed pairs occupy one
2838
+ * contiguous span of the row list with no other changed row inside it, ONE range covers them all: one
2839
+ * host call, one undo step, and the same range a whole-block action would send. Otherwise each pair gets
2840
+ * its own range, ordered from the BOTTOM of the file up, so a splice never moves the line numbers of a
2841
+ * pair still to be applied.
2842
+ * @param rows - the whole-file diff rows.
2843
+ * @param pairs - the pairs the selection names, in row order.
2844
+ * @returns one range, several, or none when the selection carries no change.
2845
+ */
2846
+ function pairsRangeOf(rows, pairs) {
2847
+ const changed = pairs.filter((pair) => pairIsChanged(rows, pair));
2848
+ if (changed.length === 0) return [];
2849
+ if (changed.length === 1) {
2850
+ const single = pairRangeOf(rows, changed[0]);
2851
+ return single === void 0 ? [] : [single];
2852
+ }
2853
+ const selected = /* @__PURE__ */ new Set();
2854
+ for (const pair of changed) for (const index of pairRowsOf(pair)) selected.add(index);
2855
+ const start = Math.min(...selected);
2856
+ const end = Math.max(...selected);
2857
+ let oneSpan = true;
2858
+ for (let index = start; index <= end; index++) {
2859
+ const row = rows[index];
2860
+ if (row !== void 0 && row.kind !== "context" && !selected.has(index)) {
2861
+ oneSpan = false;
2862
+ break;
2863
+ }
2864
+ }
2865
+ if (oneSpan) return [blockRangesOf(rows, {
2866
+ start,
2867
+ end
2868
+ })];
2869
+ return [...changed].sort((left, right) => Math.max(...pairRowsOf(right)) - Math.max(...pairRowsOf(left))).map((pair) => pairRangeOf(rows, pair)).filter((range) => range !== void 0);
2870
+ }
2748
2871
  /**
2749
2872
  * Compute the whole-file view between two contents. The context budget is the
2750
2873
  * side lengths, so every hunk covers the file and unchanged lines survive as
@@ -3735,11 +3858,11 @@ window.__ModuleLoader__.load({
3735
3858
  /**
3736
3859
  * Decide the selection frame's contents.
3737
3860
  *
3738
- * Keep/revert needs covered change blocks; commenting needs a range that has no
3861
+ * Keep/revert needs the selection to touch a change; commenting needs a range that has no
3739
3862
  * discussion yet. A frame with neither would be an empty floating box, so it is
3740
3863
  * not rendered at all.
3741
3864
  *
3742
- * @param options - whether change blocks are covered, and whether this range already has a discussion.
3865
+ * @param options - whether the selection touches a change, and whether this range already has a discussion.
3743
3866
  * @returns the three flags the caller branches on.
3744
3867
  */
3745
3868
  function selectionFrame(options) {
@@ -19687,16 +19810,27 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
19687
19810
  * `[data-produced-files-row] button` 0.1.5's produced-file card `title` = the path
19688
19811
  * `[data-presented-files-row] button` 0.1.7's presented-file card `title` = the path
19689
19812
  * `[data-changed-files] button` 0.1.7's changed-files row `aria-describedby` = the path
19690
- * `button[title]` a message's file LINK (0.1.7) `title` = the path
19691
19813
  * `button[data-ref-chip]` a `@file` chip in a message `title` = the token
19692
- * `a[href]` any other link naming a file `href` = the path
19693
- *
19694
- * Everything else is left entirely alone: a link to a URL, an in-page anchor, a chip naming something
19695
- * that is not a file, a file LINK whose file this panel does not hold, a modified press (Ctrl/Cmd/Shift/
19696
- * Alt, or a middle click — gestures the harness may give its own meaning later), and any press inside this
19697
- * plugin's own surface, whose buttons carry paths too and belong to the panel that is already showing
19698
- * the file. A file-list ROW is the one press taken over whether or not the panel holds its file (see
19699
- * `ROW_SELECTOR`); "we do not hold it" then decides what the menu offers, not whether it appears.
19814
+ * `button._fileLink_…` / `._fileMention_…` a message's file LINK `title` = the path
19815
+ *
19816
+ * A PRESS IS ADMITTED BY THE SHELL'S OWN MARK, NEVER BY THE SHAPE OF ITS TEXT. The link row's classes are
19817
+ * the shell's CSS-module names — measured on the live shell as `_fileMention_1ypvv_85 _fileLink_1ypvv_59`,
19818
+ * carrying `title="src/client/produced-diff.ts"` — and that name survives the hash and line suffix the
19819
+ * module adds per build, so the marker is the `_fileLink_` / `_fileMention_` substring rather than the
19820
+ * whole class.
19821
+ *
19822
+ * This replaced two blanket rules, `button[title]` and every `a[href]`, which admitted a press by how its
19823
+ * text was spelled and were measured wrong twice on 2026-10-09: a model picker's button carries a tooltip
19824
+ * naming the model, and a version-like name (`…v3.2`) ends in the ".extension" the text filter accepted, so
19825
+ * pressing 修改模型 raised this menu over the shell's own control; an in-app route link (`/settings`) holds a
19826
+ * separator and was admitted the same way. A file press is one the shell marks as one.
19827
+ *
19828
+ * Everything else is left entirely alone: a link to a URL, an in-page anchor, a button whose tooltip names
19829
+ * something that is not a file, a file LINK whose file this panel does not hold, a modified press
19830
+ * (Ctrl/Cmd/Shift/Alt, or a middle click — gestures the harness may give its own meaning later), and any
19831
+ * press inside this plugin's own surface, whose buttons carry paths too and belong to the panel that is
19832
+ * already showing the file. A file-list ROW is the one press taken over whether or not the panel holds its
19833
+ * file (see `ROW_SELECTOR`); "we do not hold it" then decides what the menu offers, not whether it appears.
19700
19834
  *
19701
19835
  * The name of the module (and of the event it raises) dates from when the produced-file card was the
19702
19836
  * only press of this kind; `data-presented-files-row` is that same list under 0.1.7's name for it.
@@ -19739,13 +19873,24 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
19739
19873
  *
19740
19874
  * A press this list misses is not a crash — it is one menu the reader does not get.
19741
19875
  */
19876
+ /**
19877
+ * The shell's OWN mark on a file link, as the name part of its CSS-module classes: measured on the live
19878
+ * shell as `class="_fileMention_1ypvv_85 _fileLink_1ypvv_59"` on the `<button title="src/client/
19879
+ * produced-diff.ts">` a message draws for a file. The hash and the line number after the name are per
19880
+ * build, so the marker is the `_name_` substring and not the whole class.
19881
+ *
19882
+ * A CSS-module class name is the shell telling this module what the element IS, which is why this replaced
19883
+ * the text-shape rules (see the module doc). It is a name, not an API: if the shell ever renames or
19884
+ * minifies these classes, this marker stops matching and file links fall back to the shell's own press —
19885
+ * fewer menus, never a menu over the wrong control, which is the direction a wrong guess must fail in.
19886
+ */
19887
+ const MARKED_LINK_SELECTOR = "[class*=\"_fileLink_\"], [class*=\"_fileMention_\"]";
19742
19888
  const PRESS_SELECTOR = [
19743
19889
  "[data-produced-files-row] button",
19744
19890
  "[data-presented-files-row] button",
19745
19891
  "[data-changed-files] button",
19746
- "button[title]",
19747
19892
  "button[data-ref-chip]",
19748
- "a[href]"
19893
+ MARKED_LINK_SELECTOR
19749
19894
  ].join(", ");
19750
19895
  /**
19751
19896
  * A shell press that looks like one of the above and is NOT one: the review pane's file picker.
@@ -19789,41 +19934,65 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
19789
19934
  return stripSuffix(text.replace(/^@/, "").replace(/^"|"$/g, "").trim());
19790
19935
  }
19791
19936
  /**
19792
- * Whether this text names a file, rather than a URL, an in-page anchor or a plain label.
19937
+ * Whether this text is spelled as something that is not a file at all: an in-page anchor, a query, or
19938
+ * another scheme's URL. A Windows drive letter is a file despite the colon it starts with.
19793
19939
  *
19794
- * A shell tooltip lives in `title` too, so "the element has a title" is not enough: a URL scheme is not
19795
- * a file (a Windows drive letter is), and a label with neither a separator nor an extension is a label.
19796
- * This is a filter, not a decision — `isPending` is what decides — so it errs towards letting a press
19797
- * through untouched rather than towards taking one over.
19940
+ * @param value - the candidate text.
19941
+ * @returns whether it is spelled as a non-file.
19942
+ */
19943
+ function isNonFileSpelling(value) {
19944
+ if (value === "" || value.startsWith("#") || value.startsWith("?")) return true;
19945
+ return /^[A-Za-z][A-Za-z0-9+.-]*:/.test(value) && !/^[A-Za-z]:[\\/]/.test(value);
19946
+ }
19947
+ /**
19948
+ * Whether this text has the SHAPE of a path: a `.extension` tail or a separator.
19949
+ *
19950
+ * Only a press the shell did NOT mark is held to this, because its text is all there is to go on. A marked
19951
+ * press is a file link by the shell's own word, so its value is taken as written and an extension-less path
19952
+ * (`Makefile`) is read as the file it is instead of being dismissed as a label.
19798
19953
  *
19799
19954
  * @param value - the candidate text.
19800
19955
  * @returns whether it could name a file.
19801
19956
  */
19802
19957
  function looksLikePath(value) {
19803
- if (value === "" || value.startsWith("#") || value.startsWith("?")) return false;
19804
- if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(value) && !/^[A-Za-z]:[\\/]/.test(value)) return false;
19958
+ if (isNonFileSpelling(value)) return false;
19805
19959
  return /\.[A-Za-z0-9]{1,8}$/.test(value) || value.includes("/") || value.includes("\\");
19806
19960
  }
19961
+ /** Whether the shell itself marked this press as one of its file links (see `MARKED_LINK_SELECTOR`). */
19962
+ function isMarkedFileLink(press) {
19963
+ return press.matches(MARKED_LINK_SELECTOR);
19964
+ }
19807
19965
  /**
19808
19966
  * The path a press names, or undefined when it names no file.
19809
19967
  *
19968
+ * Every shape is read from the same three places — `title`, the text its `aria-describedby` points at, an
19969
+ * anchor's `href` — and what differs is the test the value must pass: a press the shell marked must only
19970
+ * not be spelled as a non-file, while one it did not mark must ALSO have the shape of a path.
19971
+ *
19810
19972
  * @param press - the element the reader pressed.
19811
19973
  * @returns the path, as the shell spelled it (the panel matches it against its own spelling).
19812
19974
  */
19813
19975
  function pressPathOf(press) {
19976
+ const marked = isMarkedFileLink(press);
19977
+ const accept = (value) => {
19978
+ const path = pathOfReference(value);
19979
+ if (path === "") return void 0;
19980
+ if (marked) return isNonFileSpelling(path) ? void 0 : path;
19981
+ return looksLikePath(path) ? path : void 0;
19982
+ };
19814
19983
  const title = press.getAttribute("title")?.trim();
19815
19984
  if (title !== void 0) {
19816
- const path = pathOfReference(title);
19817
- if (looksLikePath(path)) return path;
19985
+ const path = accept(title);
19986
+ if (path !== void 0) return path;
19818
19987
  }
19819
19988
  const describedBy = press.getAttribute("aria-describedby");
19820
19989
  if (describedBy !== null) {
19821
- const path = press.ownerDocument.getElementById(describedBy)?.textContent?.trim() ?? "";
19822
- if (looksLikePath(path)) return path;
19990
+ const path = accept(press.ownerDocument.getElementById(describedBy)?.textContent?.trim() ?? "");
19991
+ if (path !== void 0) return path;
19823
19992
  }
19824
19993
  if (press instanceof HTMLAnchorElement) {
19825
- const path = stripSuffix(press.getAttribute("href")?.trim() ?? "");
19826
- if (looksLikePath(path)) return path;
19994
+ const path = accept(stripSuffix(press.getAttribute("href")?.trim() ?? ""));
19995
+ if (path !== void 0) return path;
19827
19996
  }
19828
19997
  }
19829
19998
  /** The press `replayFilePress` is replaying, if any: that press is the shell's, not the menu's. */
@@ -22567,7 +22736,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
22567
22736
  });
22568
22737
  }
22569
22738
  /** The two-column (side-by-side) whole-file diff view. */
22570
- const SplitDiff = (0, react.forwardRef)(function SplitDiff({ file, sessionId, model, runs, langWrap, tabWidthSpaces, busy, t, selection, leadRows, onBlockKeep, onBlockRevert, onWrapToast, onVisibleLines, discussions, renderDiscussion, selectionComment, rulerRuns, gotoDialog }, ref) {
22739
+ const SplitDiff = (0, react.forwardRef)(function SplitDiff({ file, sessionId, model, runs, langWrap, tabWidthSpaces, busy, t, selection, leadRows, onBlockKeep, onBlockRevert, onWrapToast, onVisibleLines, discussions, renderDiscussion, selectionKeepRevert, selectionComment, selectionDragging, rulerRuns, gotoDialog }, ref) {
22571
22740
  const hintCase = actionTooltip(t("action.matchCase"), "matchCase");
22572
22741
  const hintWords = actionTooltip(t("action.matchWholeWord"), "matchWholeWord");
22573
22742
  const hintPrev = actionTooltip(t("action.prevDiff"), "searchPrev");
@@ -22961,14 +23130,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
22961
23130
  const body = bodyRef.current;
22962
23131
  if (body === null) return;
22963
23132
  if (body.clientHeight <= 0) return;
22964
- const viewTop = body.scrollTop;
22965
- const viewBottom = viewTop + body.clientHeight;
22966
- const pairTop = off(pairIndex);
22967
- const pairBottom = pairTop + ROW_HEIGHT_PX;
22968
- let target;
22969
- if (pairTop < viewTop) target = pairTop;
22970
- else if (pairBottom > viewBottom) target = pairBottom - body.clientHeight;
22971
- if (target === void 0) return;
23133
+ const target = off(pairIndex) + ROW_HEIGHT_PX / 2 - body.clientHeight / 2;
22972
23134
  const clamped = Math.max(0, Math.min(target, body.scrollHeight - body.clientHeight));
22973
23135
  if (body.scrollTop !== clamped) body.scrollTop = clamped;
22974
23136
  setScrollTop(clamped);
@@ -23307,6 +23469,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
23307
23469
  stop();
23308
23470
  };
23309
23471
  }, []);
23472
+ const selectionFrameUp = (selectionKeepRevert !== void 0 || selectionComment !== void 0) && selection !== void 0;
23310
23473
  return (0, react_jsx_runtime.jsxs)("div", {
23311
23474
  className: PendingPanel_module_css_default.splitRoot,
23312
23475
  ref: splitRootRef,
@@ -23459,11 +23622,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
23459
23622
  }, index))
23460
23623
  }),
23461
23624
  gotoDialog,
23462
- selectionComment !== void 0 && selection !== void 0 && (0, react_jsx_runtime.jsx)("div", {
23625
+ selectionFrameUp && (0, react_jsx_runtime.jsxs)("div", {
23463
23626
  className: PendingPanel_module_css_default.blockActions,
23464
23627
  "data-diff-selection-actions": true,
23628
+ "data-diff-selection-pair": selection.end,
23629
+ "data-diff-frame-drag": selectionDragging ? "" : void 0,
23465
23630
  style: { top: Math.max(0, Math.min(off(selection.end + 1) - scrollTop, Math.max(0, viewportH - 32))) },
23466
- children: selectionComment
23631
+ children: [
23632
+ selectionKeepRevert,
23633
+ selectionKeepRevert !== void 0 && selectionComment !== void 0 && (0, react_jsx_runtime.jsx)("span", {
23634
+ className: PendingPanel_module_css_default.blockActionsDivider,
23635
+ "data-diff-selection-divider": true,
23636
+ "aria-hidden": "true"
23637
+ }),
23638
+ selectionComment
23639
+ ]
23467
23640
  }),
23468
23641
  (0, react_jsx_runtime.jsxs)("div", {
23469
23642
  className: PendingPanel_module_css_default.splitHScrollRow,
@@ -23640,7 +23813,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
23640
23813
  height: flashHeight
23641
23814
  }
23642
23815
  }, flashKey),
23643
- hoveredBlock !== void 0 && blockOfPair[hoveredBlock] !== void 0 && (0, react_jsx_runtime.jsxs)("div", {
23816
+ !selectionFrameUp && hoveredBlock !== void 0 && blockOfPair[hoveredBlock] !== void 0 && (0, react_jsx_runtime.jsxs)("div", {
23644
23817
  className: PendingPanel_module_css_default.blockActions,
23645
23818
  "data-diff-block-actions": true,
23646
23819
  style: { top: blockActionsTop },
@@ -24181,13 +24354,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24181
24354
  return map;
24182
24355
  }, [splitModel, model]);
24183
24356
  /**
24184
- * The rows a selection names, whichever view made it: the pair range of a side-by-side selection
24185
- * mapped to that column's rows, and a single-column range left as it is.
24357
+ * The rows a selection names, whichever view made it: the pair range of a side-by-side selection mapped
24358
+ * to the rows of the column it began in, and a single-column range left as it is.
24186
24359
  *
24187
- * Only the NEW side can be named. A thread is anchored to new-file lines — those are what survive
24188
- * the model being rebuilt, and what its reference label shows — so a left-column selection (the
24189
- * old file, code that may not exist any more) has nothing to anchor to: it reads as no rows, and
24190
- * the comment is not offered on it.
24360
+ * Both columns are read. A right-column selection names the NEW file's rows and a left-column one the OLD
24361
+ * file's — which is what the reader pointed at, and what a removal the alignment left unpaired can only
24362
+ * be reached by (it is drawn in the old column alone). A thread stays anchored to a new-file line wherever
24363
+ * the range has one; where it does not, the label falls back to the old-file number exactly as it does for
24364
+ * a removals-only selection in the single-column view (see `addDiscussion` and `frameNamesNoCurrentLine`).
24191
24365
  *
24192
24366
  * @param range - the selection to read.
24193
24367
  * @returns the same lines as a row range, or undefined when the view named none.
@@ -24195,10 +24369,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24195
24369
  const selectionRows = (range) => {
24196
24370
  if (range === void 0) return void 0;
24197
24371
  if (!splitView || range.side === void 0 || splitModel === null) return range;
24198
- if (range.side !== "new") return void 0;
24372
+ const side = range.side;
24199
24373
  const rows = [];
24200
24374
  for (let index = range.start; index <= range.end; index++) {
24201
- const row = pairRows.get(index)?.new;
24375
+ const row = pairRows.get(index)?.[side];
24202
24376
  if (row !== void 0) rows.push(row);
24203
24377
  }
24204
24378
  return rows.length === 0 ? void 0 : {
@@ -24829,25 +25003,17 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24829
25003
  applyPreviewFrames();
24830
25004
  };
24831
25005
  /**
24832
- * Bring one preview search occurrence into view. The code view's search rule is
24833
- * reused: a hit that is already fully visible is left alone (a search must not
24834
- * yank the pane off what the user can see), one above the viewport lands with
24835
- * the lead rows above it — the block-jump rule — and one below lands at the
24836
- * bottom edge. The settled offset is mirrored into the frames, as for a jump.
25006
+ * Put one preview search occurrence in the middle of the pane. Its only caller is the search JUMP — the
25007
+ * bar's next / previous, Enter, F3 — and the point of that jump is to read the occurrence it landed on,
25008
+ * which is the rule the code view and the side-by-side view now follow too. The settled offset is
25009
+ * mirrored into the frames, as for a jump.
24837
25010
  * @param hit - the highlighted occurrence to reveal.
24838
25011
  */
24839
25012
  const scrollPreviewHitIntoView = (hit) => {
24840
25013
  const body = mdPreviewBodyRef.current;
24841
25014
  if (body === null) return;
24842
25015
  const bodyRect = body.getBoundingClientRect();
24843
- const hitTop = hit.getBoundingClientRect().top - bodyRect.top + body.scrollTop;
24844
- const hitBottom = hit.getBoundingClientRect().bottom - bodyRect.top + body.scrollTop;
24845
- const viewTop = body.scrollTop;
24846
- const viewBottom = viewTop + body.clientHeight;
24847
- let target;
24848
- if (hitTop - leadRows * ROW_HEIGHT_PX < viewTop) target = hitTop - leadRows * ROW_HEIGHT_PX;
24849
- else if (hitBottom > viewBottom) target = hitBottom - body.clientHeight;
24850
- if (target === void 0) return;
25016
+ const target = (hit.getBoundingClientRect().top - bodyRect.top + body.scrollTop + (hit.getBoundingClientRect().bottom - bodyRect.top + body.scrollTop)) / 2 - body.clientHeight / 2;
24851
25017
  const maxTop = Math.max(0, body.scrollHeight - body.clientHeight);
24852
25018
  const clamped = Math.max(0, Math.min(target, maxTop));
24853
25019
  if (body.scrollTop !== clamped) body.scrollTop = clamped;
@@ -24943,9 +25109,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24943
25109
  }
24944
25110
  if (searchMatches.length === 0) return;
24945
25111
  if (cursorPosRef.current !== void 0) {
25112
+ centerSearchRef.current = true;
25113
+ setSearchJump((jump) => jump + 1);
24946
25114
  setSearchIndex(startIndexFor(searchQuery));
24947
25115
  return;
24948
25116
  }
25117
+ centerSearchRef.current = true;
25118
+ setSearchJump((jump) => jump + 1);
24949
25119
  setSearchIndex((current) => (current + direction + searchMatches.length) % searchMatches.length);
24950
25120
  };
24951
25121
  /**
@@ -24967,6 +25137,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24967
25137
  return at === -1 ? 0 : at;
24968
25138
  };
24969
25139
  const cursorPosRef = (0, react.useRef)(void 0);
25140
+ /** Set by a search JUMP: the next match is centred, where a typed query only brings it into view. */
25141
+ const centerSearchRef = (0, react.useRef)(false);
25142
+ /** Bumped by every JUMP, so the centring effect runs even when the match itself does not change (a single
25143
+ * hit, or a wrap back onto the same row). */
25144
+ const [searchJump, setSearchJump] = (0, react.useState)(0);
24970
25145
  const lastRecordedCursorRef = (0, react.useRef)(void 0);
24971
25146
  const openSearchWithSelection = () => {
24972
25147
  if (searchOpen) {
@@ -25033,18 +25208,25 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25033
25208
  const body = bodyRef.current;
25034
25209
  if (body === null) return;
25035
25210
  if (body.clientHeight <= 0) return;
25211
+ const centring = centerSearchRef.current;
25212
+ centerSearchRef.current = false;
25036
25213
  const viewTop = body.scrollTop;
25037
25214
  const viewBottom = viewTop + body.clientHeight;
25038
25215
  const rowTop = offsetOf(row);
25039
25216
  const rowBottom = rowTop + extentOf(row, row);
25040
25217
  let target;
25041
- if (rowTop < viewTop) target = rowTop;
25218
+ if (centring) target = (rowTop + rowBottom) / 2 - body.clientHeight / 2;
25219
+ else if (rowTop < viewTop) target = rowTop;
25042
25220
  else if (rowBottom > viewBottom) target = rowBottom - body.clientHeight;
25043
25221
  if (target === void 0) return;
25044
25222
  const clamped = Math.max(0, Math.min(target, body.scrollHeight - body.clientHeight));
25045
25223
  if (body.scrollTop !== clamped) body.scrollTop = clamped;
25046
25224
  setScrollTop(clamped);
25047
- }, [currentSearchRow, searchMatches]);
25225
+ }, [
25226
+ currentSearchRow,
25227
+ searchMatches,
25228
+ searchJump
25229
+ ]);
25048
25230
  const blockIndexByRow = (0, react.useMemo)(() => {
25049
25231
  const map = /* @__PURE__ */ new Map();
25050
25232
  model.blocks.forEach((block, blockIndex) => {
@@ -25359,7 +25541,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25359
25541
  if (!commentMode) return;
25360
25542
  const range = selectionRows(selection);
25361
25543
  if (range === void 0) return;
25362
- if (discussionOverlapping(discussions, range) !== void 0) return;
25544
+ const quoteRange = splitView && !previewActive ? changeRunSpanOf(model.diff.rows, range.start, range.end) : range;
25545
+ if (discussionOverlapping(discussions, quoteRange) !== void 0) return;
25363
25546
  const newLines = newLinesInRows(model.diff.rows, range);
25364
25547
  const first = model.diff.rows[range.start];
25365
25548
  const last = model.diff.rows[range.end] ?? first;
@@ -25369,14 +25552,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25369
25552
  const body = bodyRef.current;
25370
25553
  if (body !== null && offsetOf(range.start) - body.scrollTop < 0) pendingScrollShiftRef.current += 66;
25371
25554
  const id = `draft-${Date.now().toString(36)}-${draftThreads.length}`;
25372
- const quoted = model.diff.rows.slice(range.start, range.end + 1);
25555
+ const quoted = model.diff.rows.slice(quoteRange.start, quoteRange.end + 1);
25373
25556
  const quote = quoted.map((row) => row.text).join("\n");
25374
25557
  const quoteLines = quoted.map((row) => ({
25375
25558
  old: row.oldLine,
25376
25559
  new: row.newLine,
25377
25560
  kind: row.kind
25378
25561
  }));
25379
- const quoteContext = model.diff.rows.slice(Math.max(0, range.start - 1), Math.min(model.diff.rows.length, range.end + 2)).map((row) => row.text).join("\n");
25562
+ const quoteContext = model.diff.rows.slice(Math.max(0, quoteRange.start - 1), Math.min(model.diff.rows.length, quoteRange.end + 2)).map((row) => row.text).join("\n");
25380
25563
  setDraftThreads((current) => [...current, {
25381
25564
  id,
25382
25565
  fileId: file.id,
@@ -26140,10 +26323,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
26140
26323
  await runBlockAction(action, range, operated);
26141
26324
  };
26142
26325
  const handleSelectionAction = async (action) => {
26143
- if (busy || selectionRange === void 0) return;
26144
- const firstCovered = coveredBlockIndices[0];
26145
- if (firstCovered === void 0) return;
26146
- await runBlockAction(action, selectionRange, firstCovered);
26326
+ if (busy || selectionTargetRanges.length === 0) return;
26327
+ for (const range of selectionTargetRanges) await (action === "keep" ? onBlockKeep(sessionId, file.id, range) : onBlockRevert(sessionId, file.id, range));
26147
26328
  setSelection(void 0);
26148
26329
  setPreviewCovered([]);
26149
26330
  window.getSelection()?.removeAllRanges?.();
@@ -26373,12 +26554,64 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
26373
26554
  * annotation at most).
26374
26555
  */
26375
26556
  const selectionHasDiscussion = selectionRowRange !== void 0 && discussionOverlapping(discussions, selectionRowRange) !== void 0;
26557
+ /**
26558
+ * The change blocks the selected rows touch, in order. A selection that stops inside a block still
26559
+ * touches it, so this — rather than the blocks it fully covers — is what says whether keep/revert
26560
+ * have anything to act on at all (an all-context range touches none, and offers the comment alone).
26561
+ */
26562
+ const selectionBlocks = [];
26563
+ if (selectionRowRange !== void 0) for (let index = 0; index < model.blocks.length; index++) {
26564
+ const block = model.blocks[index];
26565
+ if (selectionRowRange.start <= block.end && block.start <= selectionRowRange.end) selectionBlocks.push(index);
26566
+ }
26567
+ /**
26568
+ * The side-by-side pairs the selection names, in row order. That view selects PAIRS (see
26569
+ * `splitRowRangeOf`), and a pair is one old line against one new line. The list is the same whichever
26570
+ * column the selection came from — a pair holds both its sides, and a removal the alignment left unpaired
26571
+ * holds only its old one, which is exactly the pair a left-column selection is about.
26572
+ */
26573
+ const splitSelectionPairs = [];
26574
+ if (splitView && !previewActive && selection !== void 0 && selection.side !== void 0) for (let index = selection.start; index <= selection.end; index++) {
26575
+ const pair = pairRows.get(index);
26576
+ if (pair !== void 0) splitSelectionPairs.push(pair);
26577
+ }
26578
+ /**
26579
+ * The old/new ranges the frame's keep/revert send, in the order they must be sent. Taking part of a
26580
+ * change is the point: keep folds only those lines into the baseline and only those leave it, and the
26581
+ * context lines a selection spans ride along unchanged. The code view sends the one range the SELECTED
26582
+ * ROWS name; the side-by-side view sends the range(s) of the PAIRS it names (`pairsRangeOf`), which
26583
+ * covers both sides of every pair the reader touched. The Markdown preview keeps its own block-derived
26584
+ * range (`selectionRange`): its selection names rendered elements, not rows.
26585
+ */
26586
+ const selectionTargetRanges = previewActive ? selectionRange === void 0 ? [] : [selectionRange] : splitView ? pairsRangeOf(model.diff.rows, splitSelectionPairs) : selectionRowRange === void 0 ? [] : [blockRangesOf(model.diff.rows, selectionRowRange)];
26376
26587
  const frameForSelection = selectionRowRange !== void 0 ? selectionFrame({
26377
- coversBlocks: !splitView && selectionRange !== void 0,
26588
+ coversBlocks: selectionTargetRanges.length > 0 && selectionBlocks.length > 0,
26378
26589
  hasDiscussion: selectionHasDiscussion
26379
26590
  }) : void 0;
26380
26591
  const selectionCommentOffered = commentMode && frameForSelection?.comment === true;
26592
+ /** Whether the frame carries keep/revert (they stay in the DOM, `hidden`, when it does not). */
26593
+ const selectionKeepRevert = frameForSelection?.keepRevert === true;
26381
26594
  const selectionFrameVisible = frameForSelection !== void 0 && (frameForSelection.keepRevert || selectionCommentOffered);
26595
+ const [pressInCode, setPressInCode] = (0, react.useState)(false);
26596
+ (0, react.useEffect)(() => {
26597
+ const down = (event) => {
26598
+ const target = event.target;
26599
+ setPressInCode(target instanceof Element && target.closest("[data-diff-selection-actions]") === null);
26600
+ };
26601
+ const up = () => {
26602
+ setPressInCode(false);
26603
+ };
26604
+ document.addEventListener("pointerdown", down, true);
26605
+ document.addEventListener("pointerup", up, true);
26606
+ document.addEventListener("pointercancel", up, true);
26607
+ window.addEventListener("blur", up);
26608
+ return () => {
26609
+ document.removeEventListener("pointerdown", down, true);
26610
+ document.removeEventListener("pointerup", up, true);
26611
+ document.removeEventListener("pointercancel", up, true);
26612
+ window.removeEventListener("blur", up);
26613
+ };
26614
+ }, []);
26382
26615
  const commentChord = chordLabel$1("addComment");
26383
26616
  (0, react.useEffect)(() => {
26384
26617
  if (!selectionCommentOffered) return;
@@ -27046,6 +27279,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27046
27279
  ref: previewSelectionFrameRef,
27047
27280
  className: PendingPanel_module_css_default.blockActions,
27048
27281
  "data-diff-selection-actions": true,
27282
+ "data-diff-frame-drag": pressInCode ? "" : void 0,
27049
27283
  style: {
27050
27284
  top: previewFrameTop(previewSelectionFrame, previewScrollTopRef.current) ?? 0,
27051
27285
  right: previewSelectionFrame.right
@@ -27165,6 +27399,25 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27165
27399
  renderDiscussion,
27166
27400
  rulerRuns: rulerMarkers,
27167
27401
  gotoDialog,
27402
+ selectionKeepRevert: splitView && selectionKeepRevert ? (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("button", {
27403
+ type: "button",
27404
+ className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary}`,
27405
+ "data-diff-selection-keep": true,
27406
+ disabled: busy,
27407
+ onClick: () => {
27408
+ handleSelectionAction("keep");
27409
+ },
27410
+ children: t("action.keep")
27411
+ }), (0, react_jsx_runtime.jsx)("button", {
27412
+ type: "button",
27413
+ className: PendingPanel_module_css_default.action,
27414
+ "data-diff-selection-revert": true,
27415
+ disabled: busy,
27416
+ onClick: () => {
27417
+ handleSelectionAction("revert");
27418
+ },
27419
+ children: t("action.revert")
27420
+ })] }) : void 0,
27168
27421
  selectionComment: splitView && selectionCommentOffered ? (0, react_jsx_runtime.jsxs)("button", {
27169
27422
  type: "button",
27170
27423
  className: PendingPanel_module_css_default.action,
@@ -27175,7 +27428,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27175
27428
  "data-diff-selection-comment-chord": true,
27176
27429
  children: commentChord
27177
27430
  })]
27178
- }) : void 0
27431
+ }) : void 0,
27432
+ selectionDragging: pressInCode
27179
27433
  }) : (0, react_jsx_runtime.jsxs)("div", {
27180
27434
  className: PendingPanel_module_css_default.diffBodyWrap,
27181
27435
  ref: bodyWrapRef,
@@ -27259,13 +27513,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27259
27513
  ref: frameRef,
27260
27514
  className: PendingPanel_module_css_default.blockActions,
27261
27515
  "data-diff-selection-actions": true,
27516
+ "data-diff-frame-drag": pressInCode ? "" : void 0,
27262
27517
  style: { top: frameTop },
27263
27518
  children: [
27264
27519
  (0, react_jsx_runtime.jsx)("button", {
27265
27520
  type: "button",
27266
27521
  className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary}`,
27267
27522
  "data-diff-selection-keep": true,
27268
- hidden: selectionRange === void 0,
27523
+ hidden: !selectionKeepRevert,
27269
27524
  disabled: busy,
27270
27525
  onClick: () => {
27271
27526
  handleSelectionAction("keep");
@@ -27276,14 +27531,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27276
27531
  type: "button",
27277
27532
  className: PendingPanel_module_css_default.action,
27278
27533
  "data-diff-selection-revert": true,
27279
- hidden: selectionRange === void 0,
27534
+ hidden: !selectionKeepRevert,
27280
27535
  disabled: busy,
27281
27536
  onClick: () => {
27282
27537
  handleSelectionAction("revert");
27283
27538
  },
27284
27539
  children: t("action.revert")
27285
27540
  }),
27286
- selectionRange !== void 0 && selectionCommentOffered && (0, react_jsx_runtime.jsx)("span", {
27541
+ selectionKeepRevert && selectionCommentOffered && (0, react_jsx_runtime.jsx)("span", {
27287
27542
  className: PendingPanel_module_css_default.blockActionsDivider,
27288
27543
  "data-diff-selection-divider": true,
27289
27544
  "aria-hidden": "true"
@@ -27848,6 +28103,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27848
28103
  doomed
27849
28104
  }) : t("panel.batchRevertAllAsk", { count: prompt.ids.length });
27850
28105
  }
28106
+ if (kind === "refresh-picked") return t("panel.batchRefreshVcsAsk", { count: prompt.ids.length });
27851
28107
  return t(kind === "keep-picked" ? "panel.batchKeepAsk" : kind === "keep-remove-picked" ? "panel.batchKeepRemoveAsk" : kind === "revert-picked" ? "panel.batchRevertAsk" : kind === "revert-remove-picked" ? "panel.batchRevertRemoveAsk" : kind === "keep-all" ? "panel.batchKeepAllAsk" : "panel.batchCloseAsk", { count: prompt.ids.length });
27852
28108
  };
27853
28109
  /**
@@ -27888,7 +28144,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27888
28144
  if (prompt.kind === "keep-picked") onKeepMany(prompt.sessionId, ids, true);
27889
28145
  else if (prompt.kind === "keep-remove-picked") onKeepMany(prompt.sessionId, ids, void 0);
27890
28146
  else if (prompt.kind === "revert-picked") onRevertMany(prompt.sessionId, ids, true);
27891
- else onRevertMany(prompt.sessionId, ids, void 0);
28147
+ else if (prompt.kind === "revert-remove-picked") onRevertMany(prompt.sessionId, ids, void 0);
28148
+ else runRefreshPicked(ids);
27892
28149
  };
27893
28150
  /**
27894
28151
  * The comments the reader has picked in the list (Ctrl/Cmd-click), by id.
@@ -28649,20 +28906,45 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28649
28906
  }
28650
28907
  };
28651
28908
  /**
28909
+ * Reset ONE file's diff to what the VCS scan reports, up to the point where the result is said out loud.
28910
+ *
28911
+ * Both presses come through here: the open file's toolbar button reports one result per file, and the row
28912
+ * menu's reset over a pick reports one summary for the whole selection (see `runRefreshVcs` and
28913
+ * `runRefreshPicked`). A `committed` outcome — the file already holds its baseline — is settled by the
28914
+ * whole-file KEEP, through the same wrapper the Keep button runs, so the "ask after a whole-file keep"
28915
+ * preference and the comments a drop would take with it are honoured identically whichever press found it.
28916
+ *
28917
+ * @param entry - the entry to reset.
28918
+ * @param sessionId - the session to ask about it in.
28919
+ * @returns the outcome, or the error the call raised (the callers word those differently).
28920
+ */
28921
+ const refreshVcsOnce = async (entry, sessionId) => {
28922
+ let outcome;
28923
+ try {
28924
+ outcome = (await onRefreshVcs(sessionId, entry.id, includeUntrackedEnabled())).outcome;
28925
+ } catch (error) {
28926
+ return { error };
28927
+ }
28928
+ if (outcome === "committed") await keepWithPrompt(entry.sessionId, entry.id);
28929
+ return { outcome };
28930
+ };
28931
+ /**
28652
28932
  * Replace one file's diff with its current local VCS change, then report what
28653
28933
  * the scan found. A scan that sees no change leaves the entry alone, so the
28654
28934
  * message names the file rather than silently blanking a review in progress.
28935
+ *
28936
+ * This is the open file's own toolbar press, reached from a single row's menu too: one file in, one
28937
+ * message out, and no confirmation (the button has none either).
28655
28938
  */
28656
28939
  const runRefreshVcs = async (entry) => {
28657
28940
  if (current === void 0) return;
28658
- const includeUntracked = includeUntrackedEnabled();
28659
- let outcome;
28660
- try {
28661
- outcome = (await onRefreshVcs(current, entry.id, includeUntracked)).outcome;
28662
- } catch (error) {
28941
+ const result = await refreshVcsOnce(entry, current);
28942
+ if ("error" in result) {
28943
+ const { error } = result;
28663
28944
  showCopyToast(t("panel.refreshFailed", { message: error instanceof Error ? error.message : String(error) }));
28664
28945
  return;
28665
28946
  }
28947
+ const outcome = result.outcome;
28666
28948
  if (outcome === "refreshed") {
28667
28949
  showCopyToast(t("panel.refreshDone"));
28668
28950
  return;
@@ -28672,10 +28954,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28672
28954
  return;
28673
28955
  }
28674
28956
  if (outcome === "no-change") {
28675
- const hint = includeUntracked ? "" : ` ${t("panel.refreshUntrackedHint")}`;
28957
+ const hint = includeUntrackedEnabled() ? "" : ` ${t("panel.refreshUntrackedHint")}`;
28676
28958
  showCopyToast(`${t("panel.refreshNone")}${hint}`);
28677
28959
  return;
28678
28960
  }
28961
+ if (outcome === "committed") {
28962
+ showCopyToast(t("panel.refreshCommitted"));
28963
+ return;
28964
+ }
28679
28965
  if (outcome === "no-vcs") {
28680
28966
  showCopyToast(t("panel.importNoVcs"));
28681
28967
  return;
@@ -28683,6 +28969,46 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28683
28969
  showCopyToast(t("panel.fileNotPending"));
28684
28970
  };
28685
28971
  /**
28972
+ * The row menu's reset over a pick: the SAME single-entry path, one file at a time, and ONE summary when
28973
+ * it is done.
28974
+ *
28975
+ * Per-file messages are deliberately not raised — the reader answered ONE question (the confirm dialog,
28976
+ * which counted the files) and gets one answer — and a `committed` entry is still settled through the
28977
+ * keep `refreshVcsOnce` runs, because it is the same call that found it. The reset itself is never
28978
+ * confirmed a second time: the batch dialog is that confirmation, and the single-file press has none at
28979
+ * all. (A committed entry's KEEP keeps its own remove-or-keep question, the one the Keep button asks,
28980
+ * because that question is about the row leaving the list rather than about the reset.)
28981
+ *
28982
+ * @param ids - the picked entries, in the list's own order.
28983
+ */
28984
+ const runRefreshPicked = async (ids) => {
28985
+ if (current === void 0) return;
28986
+ let done = 0;
28987
+ let none = 0;
28988
+ let failed = 0;
28989
+ for (const id of ids) {
28990
+ const entry = files.find((file) => file.id === id);
28991
+ if (entry === void 0) {
28992
+ none += 1;
28993
+ continue;
28994
+ }
28995
+ const result = await refreshVcsOnce(entry, current);
28996
+ if ("error" in result) failed += 1;
28997
+ else if (result.outcome === "refreshed" || result.outcome === "committed") done += 1;
28998
+ else none += 1;
28999
+ }
29000
+ if (failed > 0) showCopyToast(t("panel.refreshManyFailed", {
29001
+ done,
29002
+ none,
29003
+ failed
29004
+ }));
29005
+ else if (none > 0) showCopyToast(t("panel.refreshManyMixed", {
29006
+ done,
29007
+ none
29008
+ }));
29009
+ else showCopyToast(t("panel.refreshManyDone", { count: done }));
29010
+ };
29011
+ /**
28686
29012
  * Open a path typed into the detail header's field: add it to the list when it is not there
28687
29013
  * yet, then select the file the host says it landed as.
28688
29014
  *
@@ -28821,7 +29147,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28821
29147
  }
28822
29148
  }
28823
29149
  }, entry.id);
28824
- /** The row menu's rows: the pair the file's own toolbar offers, or its single 移出. */
29150
+ /** The row menu's rows: the pair the file's own toolbar offers plus that toolbar's own reset, or its single 移出. */
28825
29151
  const rowMenuItems = (0, react.useMemo)(() => {
28826
29152
  if (rowMenu === null) return [];
28827
29153
  if (rowMenu.picked) return [
@@ -28840,6 +29166,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28840
29166
  {
28841
29167
  id: "revert-remove-picked",
28842
29168
  label: t("row.revertRemove")
29169
+ },
29170
+ {
29171
+ type: "separator",
29172
+ id: "refresh-picked-separator"
29173
+ },
29174
+ {
29175
+ id: "refresh-picked",
29176
+ label: t("action.refreshVcs")
28843
29177
  }
28844
29178
  ];
28845
29179
  const openRows = [
@@ -28856,10 +29190,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28856
29190
  label: t("action.revealFile")
28857
29191
  }
28858
29192
  ];
28859
- if (fileHasNoDiff(rowMenu.file)) return [{
28860
- id: "remove",
28861
- label: t("row.dismiss")
28862
- }, ...openRows];
29193
+ if (fileHasNoDiff(rowMenu.file)) return [
29194
+ {
29195
+ id: "remove",
29196
+ label: t("row.dismiss")
29197
+ },
29198
+ {
29199
+ type: "separator",
29200
+ id: "refresh-vcs-separator"
29201
+ },
29202
+ {
29203
+ id: "refresh-vcs",
29204
+ label: t("action.refreshVcs")
29205
+ },
29206
+ ...openRows
29207
+ ];
28863
29208
  const revertLabel = rowMenu.file.earlierVersion === "none" ? t("action.delete") : t("action.revert");
28864
29209
  return [
28865
29210
  {
@@ -28878,6 +29223,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28878
29223
  id: "revert-remove",
28879
29224
  label: rowMenu.file.earlierVersion === "none" ? t("row.deleteRemove") : t("row.revertRemove")
28880
29225
  },
29226
+ {
29227
+ type: "separator",
29228
+ id: "refresh-vcs-separator"
29229
+ },
29230
+ {
29231
+ id: "refresh-vcs",
29232
+ label: t("action.refreshVcs")
29233
+ },
28881
29234
  ...openRows
28882
29235
  ];
28883
29236
  }, [
@@ -28902,6 +29255,15 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28902
29255
  clearPickedFiles();
28903
29256
  return;
28904
29257
  }
29258
+ if (id === "refresh-picked") {
29259
+ setBatchPrompt({
29260
+ sessionId: current,
29261
+ kind: "refresh-picked",
29262
+ ids,
29263
+ doomed: []
29264
+ });
29265
+ return;
29266
+ }
28905
29267
  if (id !== "keep-picked" && id !== "keep-remove-picked" && id !== "revert-picked" && id !== "revert-remove-picked") return;
28906
29268
  const doomed = id.startsWith("revert") ? picked.filter((file) => file.earlierVersion === "none").map((file) => file.id) : [];
28907
29269
  setBatchPrompt({
@@ -28925,6 +29287,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28925
29287
  else if (id === "keep-remove" || id === "remove") onKeep(current, target.file.id);
28926
29288
  else if (id === "revert") onRevert(current, target.file.id, true);
28927
29289
  else if (id === "revert-remove") onRevert(current, target.file.id);
29290
+ else if (id === "refresh-vcs") runRefreshVcs(target.file);
28928
29291
  else if (id === "open-file") onOpen(target.file.sessionId, target.file.id, "open");
28929
29292
  else if (id === "open-folder") onOpen(target.file.sessionId, target.file.id, "reveal");
28930
29293
  };
@@ -31825,8 +32188,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
31825
32188
  const value = result.value;
31826
32189
  if (typeof value !== "object" || value === null) throw new Error("the refresh returned a malformed value");
31827
32190
  const outcome = value.outcome;
31828
- if (outcome !== "refreshed" && outcome !== "unchanged" && outcome !== "no-change" && outcome !== "missing" && outcome !== "no-vcs") throw new Error("the refresh returned a malformed outcome");
31829
- return { outcome };
32191
+ if (outcome !== "refreshed" && outcome !== "unchanged" && outcome !== "no-change" && outcome !== "committed" && outcome !== "missing" && outcome !== "no-vcs") throw new Error("the refresh returned a malformed outcome");
32192
+ const resolved = value.resolved;
32193
+ if (resolved !== void 0 && typeof resolved !== "boolean") throw new Error("the refresh returned a malformed value");
32194
+ return resolved === void 0 ? { outcome } : {
32195
+ outcome,
32196
+ resolved
32197
+ };
31830
32198
  }
31831
32199
  /** Narrow the list-path endpoint's value; a malformed wire value is a browse failure. */
31832
32200
  function browseValueOf(result) {
@@ -33206,8 +33574,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
33206
33574
  "panel.refreshDone": "已重置成版本控制的差异",
33207
33575
  "panel.refreshUnchanged": "条目已经是版本控制的差异,未变",
33208
33576
  "panel.refreshNone": "版本控制报告该文件没有未提交的改动",
33577
+ "panel.refreshCommitted": "改动已经提交,条目已保留",
33209
33578
  "panel.refreshUntrackedHint": "(未跟踪的新文件需要在设置里开启「包含版本控制未跟踪文件」)",
33210
33579
  "panel.refreshFailed": "版本控制重置失败:{message}",
33580
+ "panel.batchRefreshVcsAsk": "把 {count} 个文件重置成版本控制的差异?",
33581
+ "panel.refreshManyDone": "已把 {count} 个文件重置成版本控制的差异",
33582
+ "panel.refreshManyMixed": "已把 {done} 个文件重置成版本控制的差异,{none} 个没有可重置的改动",
33583
+ "panel.refreshManyFailed": "已把 {done} 个文件重置成版本控制的差异,{none} 个没有可重置的改动,{failed} 个失败",
33211
33584
  "action.addPath": "按文件或目录添加",
33212
33585
  "panel.addTitle": "添加到列表",
33213
33586
  "panel.addPathPlaceholder": "输入或粘贴绝对路径",
@@ -33459,8 +33832,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
33459
33832
  "panel.refreshDone": "Reset this entry to the version-control diff",
33460
33833
  "panel.refreshUnchanged": "Already the version-control diff; the entry is unchanged",
33461
33834
  "panel.refreshNone": "Version control reports no uncommitted change for this file",
33835
+ "panel.refreshCommitted": "The change is already committed; the entry was kept",
33462
33836
  "panel.refreshUntrackedHint": "(a new, untracked file needs \"Include files version control has not seen\" in Settings)",
33463
33837
  "panel.refreshFailed": "Version-control reset failed: {message}",
33838
+ "panel.batchRefreshVcsAsk": "Reset {count} file(s) to the version-control diff?",
33839
+ "panel.refreshManyDone": "Reset {count} file(s) to the version-control diff",
33840
+ "panel.refreshManyMixed": "Reset {done} file(s) to the version-control diff; {none} had nothing to reset",
33841
+ "panel.refreshManyFailed": "Reset {done} file(s) to the version-control diff; {none} had nothing to reset; {failed} failed",
33464
33842
  "action.addPath": "Add by file or by directory",
33465
33843
  "panel.addTitle": "Add to list",
33466
33844
  "panel.addPathPlaceholder": "Type or paste an absolute path",