dsh-diff-approval 0.33.0 → 0.34.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 +313 -34
- package/lib/index.js +36 -11
- package/lib/types/annotate-tool.d.ts +7 -6
- package/lib/types/client/panel-memory.d.ts +30 -0
- package/lib/types/client/split-diff.d.ts +5 -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: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);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 } : {}
|
|
@@ -22279,20 +22376,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22279
22376
|
}),
|
|
22280
22377
|
(0, react_jsx_runtime.jsxs)("div", {
|
|
22281
22378
|
className: PendingPanel_module_css_default.discussionCompose,
|
|
22282
|
-
children: [(0, react_jsx_runtime.jsx)("
|
|
22379
|
+
children: [(0, react_jsx_runtime.jsx)("textarea", {
|
|
22283
22380
|
className: PendingPanel_module_css_default.discussionInput,
|
|
22284
22381
|
"data-diff-discussion-input": true,
|
|
22382
|
+
rows: 1,
|
|
22285
22383
|
ref: (element) => {
|
|
22286
22384
|
registerInput(discussion.id, element);
|
|
22287
22385
|
},
|
|
22288
22386
|
value: discussion.draft,
|
|
22289
22387
|
placeholder: t("discussion.placeholder"),
|
|
22388
|
+
disabled: asking,
|
|
22290
22389
|
onChange: (event) => {
|
|
22291
22390
|
onDraft(discussion.id, event.target.value);
|
|
22292
22391
|
},
|
|
22293
22392
|
onKeyDown: (event) => {
|
|
22294
22393
|
if (event.key !== "Enter") return;
|
|
22295
22394
|
if (event.nativeEvent.isComposing || event.keyCode === 229) return;
|
|
22395
|
+
if (event.shiftKey) return;
|
|
22296
22396
|
event.preventDefault();
|
|
22297
22397
|
if (asking) return;
|
|
22298
22398
|
onSend(discussion.id);
|
|
@@ -24515,9 +24615,24 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24515
24615
|
rememberPlacedThreads(sessionId, draftThreads);
|
|
24516
24616
|
}, [sessionId, draftThreads]);
|
|
24517
24617
|
/**
|
|
24618
|
+
* Cards the reader placed and then discarded while the placement's own write was still in flight.
|
|
24619
|
+
*
|
|
24620
|
+
* A placement is a host write now (see `addDiscussion`), so discarding one asks the host to end it —
|
|
24621
|
+
* but between the click and the acknowledgement the record may not exist yet, and an `ending` that
|
|
24622
|
+
* arrives first would be answered `missing` while the write landed after it. The placement's own
|
|
24623
|
+
* acknowledgement reads this set and takes the record back, so no card can be left stored with nothing
|
|
24624
|
+
* on screen to end it from.
|
|
24625
|
+
*/
|
|
24626
|
+
const discardedByReader = (0, react.useRef)(/* @__PURE__ */ new Set());
|
|
24627
|
+
/**
|
|
24518
24628
|
* The threads this pane draws, in the order their rows run: the host's records re-anchored, plus
|
|
24519
24629
|
* the blocks that have not been written yet.
|
|
24520
24630
|
*
|
|
24631
|
+
* A PLACED CARD IS DRAWN FROM ITS PAGE-LOCAL BLOCK even though the host holds a record for it from the
|
|
24632
|
+
* moment it was placed: the words the reader has typed live on that block until the send writes them
|
|
24633
|
+
* onto the record (see `addDiscussion` and `sendDiscussion`), so the record's copy of the same id is
|
|
24634
|
+
* skipped here — one card, drawn from the block that owns what is in the box.
|
|
24635
|
+
*
|
|
24521
24636
|
* Re-anchoring runs here rather than in an effect that rewrites state: the anchor's new-file lines
|
|
24522
24637
|
* are what survive a rebuild, and the record's quote is what says whether they still hold the code
|
|
24523
24638
|
* the comment was written about. When they do not, the thread follows the quote; when even that
|
|
@@ -24525,7 +24640,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24525
24640
|
* the quote (see `remapDiscussion`).
|
|
24526
24641
|
*/
|
|
24527
24642
|
const discussions = (0, react.useMemo)(() => {
|
|
24528
|
-
|
|
24643
|
+
const placed = draftThreads.filter((thread) => thread.fileId === file.id);
|
|
24644
|
+
const placedIds = new Set(placed.map((thread) => thread.id));
|
|
24645
|
+
return remapDiscussions([...fileComments.filter((record) => !placedIds.has(record.id)).map((record) => discussionOfRecord(record, commentSource.answers, threadState)), ...placed.map((thread) => discussionOfDraft(thread, threadState))], (row) => {
|
|
24529
24646
|
const entry = model.diff.rows[row];
|
|
24530
24647
|
return entry?.newLine ?? entry?.oldLine;
|
|
24531
24648
|
}, (row) => model.diff.rows[row]?.text ?? "", model.diff.rows.length, (row) => model.diff.rows[row]?.newLine !== void 0);
|
|
@@ -24713,6 +24830,16 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24713
24830
|
const landedFileRef = (0, react.useRef)(void 0);
|
|
24714
24831
|
/** The file the placement effect below has decided the opening place for (see `placedFileRef`). */
|
|
24715
24832
|
const placedFileRef = (0, react.useRef)(void 0);
|
|
24833
|
+
/** `scrollTick`/view as the landing effect last saw them, so "was this a landing ask?" is answerable. */
|
|
24834
|
+
const lastLandKeyRef = (0, react.useRef)("");
|
|
24835
|
+
/**
|
|
24836
|
+
* The view belongs to the reader until the panel asks for a place again (see `readerTookOver`).
|
|
24837
|
+
*
|
|
24838
|
+
* A landing that is not asked for — the wrap table becoming readable as rows the reader scrolls into are
|
|
24839
|
+
* measured — must not recentre them: that is the same "it dragged me back to the card" as the retry, by
|
|
24840
|
+
* another route (`offsetsFromWrap` is the second dependency of that effect).
|
|
24841
|
+
*/
|
|
24842
|
+
const readerOwnsViewRef = (0, react.useRef)(false);
|
|
24716
24843
|
(0, react.useEffect)(() => {
|
|
24717
24844
|
const landing = (landingTick ?? 0) > 0;
|
|
24718
24845
|
const opened = landedFileRef.current !== file.id;
|
|
@@ -24720,6 +24847,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24720
24847
|
placedFileRef.current = file.id;
|
|
24721
24848
|
if (!landing && !opened) return;
|
|
24722
24849
|
if (landing) {
|
|
24850
|
+
readerOwnsViewRef.current = false;
|
|
24723
24851
|
const cardEnd = landingComment === void 0 ? void 0 : discussions.find((entry) => entry.id === landingComment)?.anchor.end;
|
|
24724
24852
|
const cardRow = cardEnd === void 0 ? void 0 : Math.max(0, Math.min(cardEnd, Math.max(0, model.diff.rows.length - 1)));
|
|
24725
24853
|
const row = landingRow ?? cardRow ?? (landingLine === void 0 ? void 0 : rowOfLine(model.diff.rows, landingLine, landingOld === true));
|
|
@@ -25108,6 +25236,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25108
25236
|
return;
|
|
25109
25237
|
}
|
|
25110
25238
|
if (searchMatches.length === 0) return;
|
|
25239
|
+
rememberJumpAway(sessionId, file.id);
|
|
25111
25240
|
if (cursorPosRef.current !== void 0) {
|
|
25112
25241
|
centerSearchRef.current = true;
|
|
25113
25242
|
setSearchJump((jump) => jump + 1);
|
|
@@ -25551,7 +25680,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25551
25680
|
const endLine = newLines?.endLine ?? last?.newLine ?? last?.oldLine ?? startLine;
|
|
25552
25681
|
const body = bodyRef.current;
|
|
25553
25682
|
if (body !== null && offsetOf(range.start) - body.scrollTop < 0) pendingScrollShiftRef.current += 66;
|
|
25554
|
-
const id =
|
|
25683
|
+
const id = newId();
|
|
25555
25684
|
const quoted = model.diff.rows.slice(quoteRange.start, quoteRange.end + 1);
|
|
25556
25685
|
const quote = quoted.map((row) => row.text).join("\n");
|
|
25557
25686
|
const quoteLines = quoted.map((row) => ({
|
|
@@ -25575,6 +25704,34 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25575
25704
|
draft: ""
|
|
25576
25705
|
}]);
|
|
25577
25706
|
focusPendingRef.current = id;
|
|
25707
|
+
(async () => {
|
|
25708
|
+
let added = false;
|
|
25709
|
+
try {
|
|
25710
|
+
added = (await onCommentAdd(sessionId, {
|
|
25711
|
+
id,
|
|
25712
|
+
entryId: file.id,
|
|
25713
|
+
anchor: {
|
|
25714
|
+
startLine,
|
|
25715
|
+
endLine
|
|
25716
|
+
},
|
|
25717
|
+
quote,
|
|
25718
|
+
text: "",
|
|
25719
|
+
quoteContext,
|
|
25720
|
+
quoteLines: [...quoteLines]
|
|
25721
|
+
})).outcome === "added";
|
|
25722
|
+
} catch (error) {
|
|
25723
|
+
onToast(error instanceof Error ? error.message : String(error));
|
|
25724
|
+
}
|
|
25725
|
+
if (added) {
|
|
25726
|
+
if (discardedByReader.current.delete(id)) onCommentRemove(sessionId, id).catch((error) => {
|
|
25727
|
+
onToast(error instanceof Error ? error.message : String(error));
|
|
25728
|
+
});
|
|
25729
|
+
return;
|
|
25730
|
+
}
|
|
25731
|
+
discardedByReader.current.delete(id);
|
|
25732
|
+
onToast(t("discussion.addMissing"));
|
|
25733
|
+
setDraftThreads((current) => current.filter((thread) => thread.id !== id));
|
|
25734
|
+
})();
|
|
25578
25735
|
const live = window.getSelection();
|
|
25579
25736
|
if (typeof live?.removeAllRanges === "function") live.removeAllRanges();
|
|
25580
25737
|
selectionTextRef.current = "";
|
|
@@ -25671,13 +25828,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25671
25828
|
const frame = quotedFrame(discussion.quote, discussion.quoteLines);
|
|
25672
25829
|
const legend = frameCoversRemovedRow(discussion.quoteLines) ? `\n${t("discussion.frameLegend")}` : "";
|
|
25673
25830
|
const prompt = frame === "" ? `${marker}\n${text}\n\n${rule}` : `${marker}\n${frame}${legend}\n\n${text}\n\n${rule}`;
|
|
25674
|
-
|
|
25831
|
+
const held = fileComments.find((record) => record.id === id);
|
|
25832
|
+
if (held !== void 0 && held.text !== "") {
|
|
25675
25833
|
askComment(id, prompt, text);
|
|
25676
25834
|
return;
|
|
25677
25835
|
}
|
|
25678
|
-
const commentId = newId();
|
|
25679
25836
|
const draft = {
|
|
25680
|
-
id
|
|
25837
|
+
id,
|
|
25681
25838
|
entryId: file.id,
|
|
25682
25839
|
anchor: {
|
|
25683
25840
|
startLine: discussion.anchor.startLine,
|
|
@@ -25701,8 +25858,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25701
25858
|
return;
|
|
25702
25859
|
}
|
|
25703
25860
|
setDraftThreads((current) => current.filter((thread) => thread.id !== id));
|
|
25704
|
-
discussionRefocusRef.current =
|
|
25705
|
-
await askComment(
|
|
25861
|
+
discussionRefocusRef.current = id;
|
|
25862
|
+
await askComment(id, prompt, text);
|
|
25706
25863
|
})();
|
|
25707
25864
|
};
|
|
25708
25865
|
/** Discard one block, keeping the code the user is reading in place. */
|
|
@@ -25712,12 +25869,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25712
25869
|
const shift = discussionRows(discussion) * THREAD_ROW_PX * -1;
|
|
25713
25870
|
const body = bodyRef.current;
|
|
25714
25871
|
if (body !== null && offsetOf(discussion.anchor.start) - body.scrollTop < 0) pendingScrollShiftRef.current += shift;
|
|
25872
|
+
const placed = draftThreads.some((thread) => thread.id === id);
|
|
25715
25873
|
if (fileComments.some((record) => record.id === id)) {
|
|
25716
25874
|
onCommentRemove(sessionId, id).catch((error) => {
|
|
25717
25875
|
onToast(error instanceof Error ? error.message : String(error));
|
|
25718
25876
|
});
|
|
25877
|
+
if (placed) {
|
|
25878
|
+
setDraftThreads((current) => current.filter((thread) => thread.id !== id));
|
|
25879
|
+
forgetThreads([id]);
|
|
25880
|
+
}
|
|
25719
25881
|
return;
|
|
25720
25882
|
}
|
|
25883
|
+
discardedByReader.current.add(id);
|
|
25884
|
+
onCommentRemove(sessionId, id).catch((error) => {
|
|
25885
|
+
onToast(error instanceof Error ? error.message : String(error));
|
|
25886
|
+
});
|
|
25721
25887
|
setDraftThreads((current) => current.filter((thread) => thread.id !== id));
|
|
25722
25888
|
forgetThreads([id]);
|
|
25723
25889
|
};
|
|
@@ -25841,6 +26007,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25841
26007
|
if (width !== bodyWidth) setBodyWidth(width);
|
|
25842
26008
|
});
|
|
25843
26009
|
const fitWidthRef = (0, react.useRef)(0);
|
|
26010
|
+
const measuredWritesRef = (0, react.useRef)({});
|
|
25844
26011
|
const [, bumpFixTick] = (0, react.useReducer)((n) => n + 1, 0);
|
|
25845
26012
|
const fixTickArmedRef = (0, react.useRef)(false);
|
|
25846
26013
|
(0, react.useLayoutEffect)(() => {
|
|
@@ -25869,6 +26036,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25869
26036
|
const drawn = last.getBoundingClientRect().bottom + (Number.parseFloat(getComputedStyle(last).marginBottom) || 0) - body.getBoundingClientRect().top - (slack?.getBoundingClientRect().height ?? 0);
|
|
25870
26037
|
if (drawn <= 0) continue;
|
|
25871
26038
|
const want = Math.max(1, Math.ceil((drawn - DISCUSSION_ROW_SNAP_PX) / THREAD_ROW_PX));
|
|
26039
|
+
const current = threadState[id]?.bodyRows;
|
|
26040
|
+
if (current !== void 0 && Math.abs(drawn - (current * THREAD_ROW_PX + DISCUSSION_ROW_SNAP_PX)) <= 1) continue;
|
|
26041
|
+
const now = Date.now();
|
|
26042
|
+
const writes = (measuredWritesRef.current[id] ?? []).filter((at) => now - at < 1e3);
|
|
26043
|
+
measuredWritesRef.current[id] = writes;
|
|
26044
|
+
if (writes.length >= 3) continue;
|
|
26045
|
+
writes.push(now);
|
|
25872
26046
|
if (threadState[id]?.bodyRows !== want) measured[id] = { bodyRows: want };
|
|
25873
26047
|
}
|
|
25874
26048
|
if (Object.keys(measured).length > 0) patchThreads(measured);
|
|
@@ -26038,6 +26212,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26038
26212
|
(0, react.useLayoutEffect)(() => {
|
|
26039
26213
|
if (rowCount === 0) return;
|
|
26040
26214
|
if (placedFileRef.current !== file.id) return;
|
|
26215
|
+
const landKey = `${scrollTick}|${previewActive === true ? 1 : 0}`;
|
|
26216
|
+
const asked = lastLandKeyRef.current !== landKey;
|
|
26217
|
+
lastLandKeyRef.current = landKey;
|
|
26218
|
+
if (!asked && readerOwnsViewRef.current) return;
|
|
26041
26219
|
const resumed = landingTopRef.current;
|
|
26042
26220
|
if (resumed !== void 0) {
|
|
26043
26221
|
landingTopRef.current = void 0;
|
|
@@ -26157,6 +26335,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26157
26335
|
bumpFlash(false);
|
|
26158
26336
|
};
|
|
26159
26337
|
const jumpBlock = (direction, wrapGuard = false, singleToast = wrapGuard) => {
|
|
26338
|
+
rememberJumpAway(sessionId, file.id);
|
|
26160
26339
|
if (splitView && !previewActive) {
|
|
26161
26340
|
splitDiffRef.current?.jump(direction, wrapGuard, singleToast);
|
|
26162
26341
|
return;
|
|
@@ -26173,6 +26352,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26173
26352
|
* configured lead rows above it and the block it lands in flashed.
|
|
26174
26353
|
*/
|
|
26175
26354
|
const gotoLine = (line) => {
|
|
26355
|
+
rememberJumpAway(sessionId, file.id);
|
|
26176
26356
|
const row = model.diff.rows.findIndex((entry) => entry.newLine === line);
|
|
26177
26357
|
if (row === -1) {
|
|
26178
26358
|
onToast(t("panel.gotoMissing", { line }));
|
|
@@ -26354,15 +26534,28 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26354
26534
|
if (body === null) return;
|
|
26355
26535
|
for (const text of body.querySelectorAll("[data-diff-quote-text]")) text.scrollLeft = body.scrollLeft;
|
|
26356
26536
|
}, []);
|
|
26537
|
+
/**
|
|
26538
|
+
* The reader has taken the view in hand: whatever landing was being kept true stops being true.
|
|
26539
|
+
*
|
|
26540
|
+
* This is the ONLY reliable way to tell their scroll from the panel's own. `onScroll` compares the
|
|
26541
|
+
* position in the event with the last offset the panel wrote (`selfScrollRef`), and a landing retry that
|
|
26542
|
+
* writes the very same frame makes those two the same number: the reader's wheel is then read as the
|
|
26543
|
+
* panel's own write, the retry is never cancelled, and it keeps pulling the view back to the card it
|
|
26544
|
+
* landed on (seen live on 2026-10-11 as `applyScrollTop 1417 -> 1627` every frame while the reader
|
|
26545
|
+
* scrolled up). A `wheel` event cannot be raised by a programmatic `scrollTop` write, so it is the
|
|
26546
|
+
* unmistakable signal — and it arrives BEFORE the scroll it causes, so the loop is cancelled in time.
|
|
26547
|
+
*/
|
|
26548
|
+
const readerTookOver = () => {
|
|
26549
|
+
landingGoalRef.current = void 0;
|
|
26550
|
+
landingPendingRef.current = false;
|
|
26551
|
+
readerOwnsViewRef.current = true;
|
|
26552
|
+
};
|
|
26357
26553
|
const onScroll = () => {
|
|
26358
26554
|
const body = bodyRef.current;
|
|
26359
26555
|
if (body === null) return;
|
|
26360
26556
|
const written = selfScrollRef.current;
|
|
26361
26557
|
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
|
-
}
|
|
26558
|
+
if (written === void 0 || Math.abs(body.scrollTop - written) >= 1) readerTookOver();
|
|
26366
26559
|
syncQuoteScroll(body);
|
|
26367
26560
|
rememberPanelView(sessionId, {
|
|
26368
26561
|
fileId: file.id,
|
|
@@ -27442,6 +27635,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27442
27635
|
ref: bodyRef,
|
|
27443
27636
|
tabIndex: 0,
|
|
27444
27637
|
onScroll,
|
|
27638
|
+
onWheel: readerTookOver,
|
|
27445
27639
|
style: {
|
|
27446
27640
|
tabSize: tabWidthSpaces,
|
|
27447
27641
|
"--dsh-diff-quote-width": `${widestLine}ch`
|
|
@@ -27888,6 +28082,58 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27888
28082
|
n: (prev?.n ?? 0) + 1
|
|
27889
28083
|
}));
|
|
27890
28084
|
};
|
|
28085
|
+
/** Whether the panel is stepping back through the reader's jumps (see `jumpBack`). */
|
|
28086
|
+
const jumpingBackRef = (0, react.useRef)(false);
|
|
28087
|
+
/**
|
|
28088
|
+
* Put the place the reader is leaving on the back stack.
|
|
28089
|
+
*
|
|
28090
|
+
* The JUMPS themselves call this — a row click, a path typed into the header, the file keys, an undo/redo's
|
|
28091
|
+
* re-landing, a comment jump — and `landOn` deliberately does NOT: the panel also lands itself on a file (a
|
|
28092
|
+
* fresh showing, the advance a decision leaves behind, the rest of this list arriving), which is not a jump
|
|
28093
|
+
* the reader made, and recording those would put a step on the stack that only leads back to where they
|
|
28094
|
+
* already are.
|
|
28095
|
+
*
|
|
28096
|
+
* A back step records nothing at all, which is what `jumpingBackRef` says: it is already leaving the place
|
|
28097
|
+
* it is about to land on, and recording it would keep the stack from ever shrinking.
|
|
28098
|
+
*/
|
|
28099
|
+
const leftPlace = () => {
|
|
28100
|
+
if (!jumpingBackRef.current) rememberJumpAway(current, selected);
|
|
28101
|
+
};
|
|
28102
|
+
/**
|
|
28103
|
+
* Step back to where the last deliberate jump was made from — the mouse's BACK side button, while the
|
|
28104
|
+
* pointer is over this panel.
|
|
28105
|
+
*
|
|
28106
|
+
* The stack holds PLACES rather than files, one per jump the reader made, and it spans files: the step that
|
|
28107
|
+
* matters most is coming back out of a file a jump took them into. A place whose entry has left the list
|
|
28108
|
+
* since is skipped rather than landing nowhere, because the list is a live view of the store and a file can
|
|
28109
|
+
* vanish between two jumps.
|
|
28110
|
+
*/
|
|
28111
|
+
const jumpBack = () => {
|
|
28112
|
+
for (;;) {
|
|
28113
|
+
const place = popJumpAway(current);
|
|
28114
|
+
if (place === void 0) return;
|
|
28115
|
+
if (!files.some((entry) => entry.id === place.fileId)) continue;
|
|
28116
|
+
jumpingBackRef.current = true;
|
|
28117
|
+
try {
|
|
28118
|
+
if (place.fileId === selected) {
|
|
28119
|
+
const body = panelRef.current?.querySelector("[data-diff-body]");
|
|
28120
|
+
if (body !== null && body !== void 0) {
|
|
28121
|
+
body.scrollTop = place.scrollTop;
|
|
28122
|
+
rememberPanelView(current, {
|
|
28123
|
+
fileId: place.fileId,
|
|
28124
|
+
scrollTop: place.scrollTop
|
|
28125
|
+
});
|
|
28126
|
+
}
|
|
28127
|
+
} else {
|
|
28128
|
+
setSelected(place.fileId);
|
|
28129
|
+
landOn(place.fileId, place.scrollTop);
|
|
28130
|
+
}
|
|
28131
|
+
} finally {
|
|
28132
|
+
jumpingBackRef.current = false;
|
|
28133
|
+
}
|
|
28134
|
+
return;
|
|
28135
|
+
}
|
|
28136
|
+
};
|
|
27891
28137
|
/** The selection as the latest render has it, for the closers that run from a
|
|
27892
28138
|
* cleanup (the docked tab unmounting) rather than from a handler. */
|
|
27893
28139
|
const selectedRef = (0, react.useRef)(selected);
|
|
@@ -28046,6 +28292,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28046
28292
|
const onPanelFile = (event) => {
|
|
28047
28293
|
const detail = event.detail;
|
|
28048
28294
|
if (detail === void 0 || typeof detail.fileId !== "string") return;
|
|
28295
|
+
leftPlace();
|
|
28049
28296
|
setSelected(detail.fileId);
|
|
28050
28297
|
landOn(detail.fileId);
|
|
28051
28298
|
};
|
|
@@ -28287,6 +28534,30 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28287
28534
|
/** The window's height, for the panel's minimum-size floor (see {@link panelInsets}). */
|
|
28288
28535
|
const [viewportHeight, setViewportHeight] = (0, react.useState)(() => window.innerHeight);
|
|
28289
28536
|
const panelRef = (0, react.useRef)(null);
|
|
28537
|
+
/** The latest `jumpBack`, for the side-button listener, which is attached once and must not go stale. */
|
|
28538
|
+
const jumpBackRef = (0, react.useRef)(jumpBack);
|
|
28539
|
+
jumpBackRef.current = jumpBack;
|
|
28540
|
+
/**
|
|
28541
|
+
* The mouse's BACK side button steps back through the reader's jumps.
|
|
28542
|
+
*
|
|
28543
|
+
* The listener is on the panel's own element, so the press only counts while the pointer is over the panel
|
|
28544
|
+
* — a side button pressed anywhere else in the harness is none of this plugin's business. `button === 3` is
|
|
28545
|
+
* the X1 (back) button; its default is prevented so Chromium's own history does not answer the same press
|
|
28546
|
+
* and leave the page as well as the panel.
|
|
28547
|
+
*/
|
|
28548
|
+
(0, react.useEffect)(() => {
|
|
28549
|
+
const root = panelRef.current;
|
|
28550
|
+
if (root === null) return;
|
|
28551
|
+
const onSideButton = (event) => {
|
|
28552
|
+
if (event.button !== 3) return;
|
|
28553
|
+
event.preventDefault();
|
|
28554
|
+
jumpBackRef.current();
|
|
28555
|
+
};
|
|
28556
|
+
root.addEventListener("mousedown", onSideButton, true);
|
|
28557
|
+
return () => {
|
|
28558
|
+
root.removeEventListener("mousedown", onSideButton, true);
|
|
28559
|
+
};
|
|
28560
|
+
}, [docked, open]);
|
|
28290
28561
|
const splitRef = (0, react.useRef)(null);
|
|
28291
28562
|
/** The code scroll box's bounds within the split, so the floating card is
|
|
28292
28563
|
* constrained to it. */
|
|
@@ -28657,7 +28928,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28657
28928
|
if (pick === void 0) return;
|
|
28658
28929
|
if (pick !== selected) setSelected(pick);
|
|
28659
28930
|
if (started) landOn(pick, panelFileOffset(current, pick));
|
|
28660
|
-
else if (typed !== void 0)
|
|
28931
|
+
else if (typed !== void 0) {
|
|
28932
|
+
leftPlace();
|
|
28933
|
+
landOn(pick);
|
|
28934
|
+
}
|
|
28661
28935
|
}, [
|
|
28662
28936
|
open,
|
|
28663
28937
|
docked,
|
|
@@ -29142,6 +29416,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
29142
29416
|
clearPickedFiles();
|
|
29143
29417
|
if (id === selected) setJumpSignal((signal) => signal + 1);
|
|
29144
29418
|
else {
|
|
29419
|
+
leftPlace();
|
|
29145
29420
|
setSelected(id);
|
|
29146
29421
|
landOn(id);
|
|
29147
29422
|
}
|
|
@@ -29398,6 +29673,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
29398
29673
|
* line, and the detail lands on the removal carrying it rather than on the current line that now
|
|
29399
29674
|
* reads that number (see `frameNamesNoCurrentLine`). */
|
|
29400
29675
|
const jumpToComment = (fileId, line, id, oldSide) => {
|
|
29676
|
+
leftPlace();
|
|
29401
29677
|
if (fileId !== selected) setSelected(fileId);
|
|
29402
29678
|
landOn(fileId, void 0, void 0, true, line, id, oldSide);
|
|
29403
29679
|
};
|
|
@@ -29774,6 +30050,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
29774
30050
|
if (id === void 0) return;
|
|
29775
30051
|
if (id === selected) setUndoFlash((signal) => signal + 1);
|
|
29776
30052
|
else {
|
|
30053
|
+
leftPlace();
|
|
29777
30054
|
setSelected(id);
|
|
29778
30055
|
landOn(id);
|
|
29779
30056
|
}
|
|
@@ -29783,6 +30060,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
29783
30060
|
if (id === void 0) return;
|
|
29784
30061
|
if (id === selected) setUndoFlash((signal) => signal + 1);
|
|
29785
30062
|
else {
|
|
30063
|
+
leftPlace();
|
|
29786
30064
|
setSelected(id);
|
|
29787
30065
|
landOn(id);
|
|
29788
30066
|
}
|
|
@@ -29854,6 +30132,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
29854
30132
|
const index = files.findIndex((file) => file.id === selected);
|
|
29855
30133
|
const next = files[(index + direction + files.length) % files.length];
|
|
29856
30134
|
if (next !== void 0) {
|
|
30135
|
+
leftPlace();
|
|
29857
30136
|
setSelected(next.id);
|
|
29858
30137
|
landOn(next.id);
|
|
29859
30138
|
}
|
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",
|
|
@@ -6888,8 +6913,8 @@ function apply(ctx, config) {
|
|
|
6888
6913
|
if (target === void 0) return rpcError("sessionId and path must be non-empty strings");
|
|
6889
6914
|
const workspace = workspaceOf(target.sessionId);
|
|
6890
6915
|
if (workspace === void 0) return rpcError("add unavailable: the session has no workspace");
|
|
6891
|
-
const absolute =
|
|
6892
|
-
if (absolute === void 0) return {
|
|
6916
|
+
const absolute = resolveForListing(workspace.path, target.path);
|
|
6917
|
+
if (!target.exact && workspaceRelativeOf(workspace.path, absolute) === void 0) return {
|
|
6893
6918
|
ok: true,
|
|
6894
6919
|
value: {
|
|
6895
6920
|
outcome: "outside",
|
|
@@ -7316,7 +7341,7 @@ function commentAddOf(payload) {
|
|
|
7316
7341
|
if (typeof startLine !== "number" || !Number.isFinite(startLine)) return void 0;
|
|
7317
7342
|
if (typeof endLine !== "number" || !Number.isFinite(endLine)) return void 0;
|
|
7318
7343
|
if (typeof quote !== "string") return void 0;
|
|
7319
|
-
if (typeof text !== "string"
|
|
7344
|
+
if (typeof text !== "string") return void 0;
|
|
7320
7345
|
const id = body.id;
|
|
7321
7346
|
const quoteContext = body.quoteContext;
|
|
7322
7347
|
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
|
*
|
|
@@ -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/package.json
CHANGED