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