dsh-diff-approval 0.32.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
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,
|
|
@@ -19810,16 +19863,27 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19810
19863
|
* `[data-produced-files-row] button` 0.1.5's produced-file card `title` = the path
|
|
19811
19864
|
* `[data-presented-files-row] button` 0.1.7's presented-file card `title` = the path
|
|
19812
19865
|
* `[data-changed-files] button` 0.1.7's changed-files row `aria-describedby` = the path
|
|
19813
|
-
* `button[title]` a message's file LINK (0.1.7) `title` = the path
|
|
19814
19866
|
* `button[data-ref-chip]` a `@file` chip in a message `title` = the token
|
|
19815
|
-
* `
|
|
19816
|
-
*
|
|
19817
|
-
*
|
|
19818
|
-
*
|
|
19819
|
-
*
|
|
19820
|
-
*
|
|
19821
|
-
*
|
|
19822
|
-
*
|
|
19867
|
+
* `button._fileLink_…` / `._fileMention_…` a message's file LINK `title` = the path
|
|
19868
|
+
*
|
|
19869
|
+
* A PRESS IS ADMITTED BY THE SHELL'S OWN MARK, NEVER BY THE SHAPE OF ITS TEXT. The link row's classes are
|
|
19870
|
+
* the shell's CSS-module names — measured on the live shell as `_fileMention_1ypvv_85 _fileLink_1ypvv_59`,
|
|
19871
|
+
* carrying `title="src/client/produced-diff.ts"` — and that name survives the hash and line suffix the
|
|
19872
|
+
* module adds per build, so the marker is the `_fileLink_` / `_fileMention_` substring rather than the
|
|
19873
|
+
* whole class.
|
|
19874
|
+
*
|
|
19875
|
+
* This replaced two blanket rules, `button[title]` and every `a[href]`, which admitted a press by how its
|
|
19876
|
+
* text was spelled and were measured wrong twice on 2026-10-09: a model picker's button carries a tooltip
|
|
19877
|
+
* naming the model, and a version-like name (`…v3.2`) ends in the ".extension" the text filter accepted, so
|
|
19878
|
+
* pressing 修改模型 raised this menu over the shell's own control; an in-app route link (`/settings`) holds a
|
|
19879
|
+
* separator and was admitted the same way. A file press is one the shell marks as one.
|
|
19880
|
+
*
|
|
19881
|
+
* Everything else is left entirely alone: a link to a URL, an in-page anchor, a button whose tooltip names
|
|
19882
|
+
* something that is not a file, a file LINK whose file this panel does not hold, a modified press
|
|
19883
|
+
* (Ctrl/Cmd/Shift/Alt, or a middle click — gestures the harness may give its own meaning later), and any
|
|
19884
|
+
* press inside this plugin's own surface, whose buttons carry paths too and belong to the panel that is
|
|
19885
|
+
* already showing the file. A file-list ROW is the one press taken over whether or not the panel holds its
|
|
19886
|
+
* file (see `ROW_SELECTOR`); "we do not hold it" then decides what the menu offers, not whether it appears.
|
|
19823
19887
|
*
|
|
19824
19888
|
* The name of the module (and of the event it raises) dates from when the produced-file card was the
|
|
19825
19889
|
* only press of this kind; `data-presented-files-row` is that same list under 0.1.7's name for it.
|
|
@@ -19862,13 +19926,24 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19862
19926
|
*
|
|
19863
19927
|
* A press this list misses is not a crash — it is one menu the reader does not get.
|
|
19864
19928
|
*/
|
|
19929
|
+
/**
|
|
19930
|
+
* The shell's OWN mark on a file link, as the name part of its CSS-module classes: measured on the live
|
|
19931
|
+
* shell as `class="_fileMention_1ypvv_85 _fileLink_1ypvv_59"` on the `<button title="src/client/
|
|
19932
|
+
* produced-diff.ts">` a message draws for a file. The hash and the line number after the name are per
|
|
19933
|
+
* build, so the marker is the `_name_` substring and not the whole class.
|
|
19934
|
+
*
|
|
19935
|
+
* A CSS-module class name is the shell telling this module what the element IS, which is why this replaced
|
|
19936
|
+
* the text-shape rules (see the module doc). It is a name, not an API: if the shell ever renames or
|
|
19937
|
+
* minifies these classes, this marker stops matching and file links fall back to the shell's own press —
|
|
19938
|
+
* fewer menus, never a menu over the wrong control, which is the direction a wrong guess must fail in.
|
|
19939
|
+
*/
|
|
19940
|
+
const MARKED_LINK_SELECTOR = "[class*=\"_fileLink_\"], [class*=\"_fileMention_\"]";
|
|
19865
19941
|
const PRESS_SELECTOR = [
|
|
19866
19942
|
"[data-produced-files-row] button",
|
|
19867
19943
|
"[data-presented-files-row] button",
|
|
19868
19944
|
"[data-changed-files] button",
|
|
19869
|
-
"button[title]",
|
|
19870
19945
|
"button[data-ref-chip]",
|
|
19871
|
-
|
|
19946
|
+
MARKED_LINK_SELECTOR
|
|
19872
19947
|
].join(", ");
|
|
19873
19948
|
/**
|
|
19874
19949
|
* A shell press that looks like one of the above and is NOT one: the review pane's file picker.
|
|
@@ -19912,41 +19987,65 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19912
19987
|
return stripSuffix(text.replace(/^@/, "").replace(/^"|"$/g, "").trim());
|
|
19913
19988
|
}
|
|
19914
19989
|
/**
|
|
19915
|
-
* Whether this text
|
|
19990
|
+
* Whether this text is spelled as something that is not a file at all: an in-page anchor, a query, or
|
|
19991
|
+
* another scheme's URL. A Windows drive letter is a file despite the colon it starts with.
|
|
19992
|
+
*
|
|
19993
|
+
* @param value - the candidate text.
|
|
19994
|
+
* @returns whether it is spelled as a non-file.
|
|
19995
|
+
*/
|
|
19996
|
+
function isNonFileSpelling(value) {
|
|
19997
|
+
if (value === "" || value.startsWith("#") || value.startsWith("?")) return true;
|
|
19998
|
+
return /^[A-Za-z][A-Za-z0-9+.-]*:/.test(value) && !/^[A-Za-z]:[\\/]/.test(value);
|
|
19999
|
+
}
|
|
20000
|
+
/**
|
|
20001
|
+
* Whether this text has the SHAPE of a path: a `.extension` tail or a separator.
|
|
19916
20002
|
*
|
|
19917
|
-
*
|
|
19918
|
-
* a file
|
|
19919
|
-
*
|
|
19920
|
-
* through untouched rather than towards taking one over.
|
|
20003
|
+
* Only a press the shell did NOT mark is held to this, because its text is all there is to go on. A marked
|
|
20004
|
+
* press is a file link by the shell's own word, so its value is taken as written and an extension-less path
|
|
20005
|
+
* (`Makefile`) is read as the file it is instead of being dismissed as a label.
|
|
19921
20006
|
*
|
|
19922
20007
|
* @param value - the candidate text.
|
|
19923
20008
|
* @returns whether it could name a file.
|
|
19924
20009
|
*/
|
|
19925
20010
|
function looksLikePath(value) {
|
|
19926
|
-
if (
|
|
19927
|
-
if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(value) && !/^[A-Za-z]:[\\/]/.test(value)) return false;
|
|
20011
|
+
if (isNonFileSpelling(value)) return false;
|
|
19928
20012
|
return /\.[A-Za-z0-9]{1,8}$/.test(value) || value.includes("/") || value.includes("\\");
|
|
19929
20013
|
}
|
|
20014
|
+
/** Whether the shell itself marked this press as one of its file links (see `MARKED_LINK_SELECTOR`). */
|
|
20015
|
+
function isMarkedFileLink(press) {
|
|
20016
|
+
return press.matches(MARKED_LINK_SELECTOR);
|
|
20017
|
+
}
|
|
19930
20018
|
/**
|
|
19931
20019
|
* The path a press names, or undefined when it names no file.
|
|
19932
20020
|
*
|
|
20021
|
+
* Every shape is read from the same three places — `title`, the text its `aria-describedby` points at, an
|
|
20022
|
+
* anchor's `href` — and what differs is the test the value must pass: a press the shell marked must only
|
|
20023
|
+
* not be spelled as a non-file, while one it did not mark must ALSO have the shape of a path.
|
|
20024
|
+
*
|
|
19933
20025
|
* @param press - the element the reader pressed.
|
|
19934
20026
|
* @returns the path, as the shell spelled it (the panel matches it against its own spelling).
|
|
19935
20027
|
*/
|
|
19936
20028
|
function pressPathOf(press) {
|
|
20029
|
+
const marked = isMarkedFileLink(press);
|
|
20030
|
+
const accept = (value) => {
|
|
20031
|
+
const path = pathOfReference(value);
|
|
20032
|
+
if (path === "") return void 0;
|
|
20033
|
+
if (marked) return isNonFileSpelling(path) ? void 0 : path;
|
|
20034
|
+
return looksLikePath(path) ? path : void 0;
|
|
20035
|
+
};
|
|
19937
20036
|
const title = press.getAttribute("title")?.trim();
|
|
19938
20037
|
if (title !== void 0) {
|
|
19939
|
-
const path =
|
|
19940
|
-
if (
|
|
20038
|
+
const path = accept(title);
|
|
20039
|
+
if (path !== void 0) return path;
|
|
19941
20040
|
}
|
|
19942
20041
|
const describedBy = press.getAttribute("aria-describedby");
|
|
19943
20042
|
if (describedBy !== null) {
|
|
19944
|
-
const path = press.ownerDocument.getElementById(describedBy)?.textContent?.trim() ?? "";
|
|
19945
|
-
if (
|
|
20043
|
+
const path = accept(press.ownerDocument.getElementById(describedBy)?.textContent?.trim() ?? "");
|
|
20044
|
+
if (path !== void 0) return path;
|
|
19946
20045
|
}
|
|
19947
20046
|
if (press instanceof HTMLAnchorElement) {
|
|
19948
|
-
const path = stripSuffix(press.getAttribute("href")?.trim() ?? "");
|
|
19949
|
-
if (
|
|
20047
|
+
const path = accept(stripSuffix(press.getAttribute("href")?.trim() ?? ""));
|
|
20048
|
+
if (path !== void 0) return path;
|
|
19950
20049
|
}
|
|
19951
20050
|
}
|
|
19952
20051
|
/** The press `replayFilePress` is replaying, if any: that press is the shell's, not the menu's. */
|
|
@@ -20457,6 +20556,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20457
20556
|
*
|
|
20458
20557
|
* @module dsh-diff-approval/client/panel-memory
|
|
20459
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;
|
|
20460
20564
|
const views = /* @__PURE__ */ new Map();
|
|
20461
20565
|
/** Nothing is known about a thread until the reader types or folds it. */
|
|
20462
20566
|
const NO_THREAD_STATE = {};
|
|
@@ -20646,7 +20750,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20646
20750
|
function viewOf(sessionId) {
|
|
20647
20751
|
let view = views.get(sessionId);
|
|
20648
20752
|
if (view === void 0) {
|
|
20649
|
-
view = {
|
|
20753
|
+
view = {
|
|
20754
|
+
offsets: /* @__PURE__ */ new Map(),
|
|
20755
|
+
jumps: []
|
|
20756
|
+
};
|
|
20650
20757
|
views.set(sessionId, view);
|
|
20651
20758
|
}
|
|
20652
20759
|
return view;
|
|
@@ -20685,6 +20792,42 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20685
20792
|
function panelFileOffset(sessionId, fileId) {
|
|
20686
20793
|
return sessionId === void 0 ? void 0 : views.get(sessionId)?.offsets.get(fileId);
|
|
20687
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
|
+
}
|
|
20688
20831
|
//#endregion
|
|
20689
20832
|
//#region lib/types/client/composer-cover.js
|
|
20690
20833
|
/**
|
|
@@ -21751,7 +21894,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
21751
21894
|
const asks = record.asks ?? [];
|
|
21752
21895
|
const last = asks.at(-1);
|
|
21753
21896
|
const answered = last === void 0 ? void 0 : answers[last.requestId];
|
|
21754
|
-
const messages = [{
|
|
21897
|
+
const messages = record.text === "" ? [] : [{
|
|
21755
21898
|
role: record.author === "agent" ? "assistant" : "user",
|
|
21756
21899
|
text: record.text
|
|
21757
21900
|
}];
|
|
@@ -21781,7 +21924,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
21781
21924
|
quote: record.quote,
|
|
21782
21925
|
...record.quoteContext === void 0 ? {} : { quoteContext: record.quoteContext },
|
|
21783
21926
|
...record.quoteLines === void 0 ? {} : { quoteLines: quoteLinesOf(record.quoteLines) },
|
|
21784
|
-
...last !== void 0 &&
|
|
21927
|
+
...last !== void 0 && last.dropped !== true && last.ended !== true ? { asking: true } : {},
|
|
21785
21928
|
...state?.failed === true || last !== void 0 && last.dropped === true ? { failed: true } : {},
|
|
21786
21929
|
...last !== void 0 && answered === void 0 && last.ended === true && last.dropped !== true ? { stopped: true } : {},
|
|
21787
21930
|
...record.unseen === true ? { unseen: true } : {}
|
|
@@ -22233,20 +22376,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22233
22376
|
}),
|
|
22234
22377
|
(0, react_jsx_runtime.jsxs)("div", {
|
|
22235
22378
|
className: PendingPanel_module_css_default.discussionCompose,
|
|
22236
|
-
children: [(0, react_jsx_runtime.jsx)("
|
|
22379
|
+
children: [(0, react_jsx_runtime.jsx)("textarea", {
|
|
22237
22380
|
className: PendingPanel_module_css_default.discussionInput,
|
|
22238
22381
|
"data-diff-discussion-input": true,
|
|
22382
|
+
rows: 1,
|
|
22239
22383
|
ref: (element) => {
|
|
22240
22384
|
registerInput(discussion.id, element);
|
|
22241
22385
|
},
|
|
22242
22386
|
value: discussion.draft,
|
|
22243
22387
|
placeholder: t("discussion.placeholder"),
|
|
22388
|
+
disabled: asking,
|
|
22244
22389
|
onChange: (event) => {
|
|
22245
22390
|
onDraft(discussion.id, event.target.value);
|
|
22246
22391
|
},
|
|
22247
22392
|
onKeyDown: (event) => {
|
|
22248
22393
|
if (event.key !== "Enter") return;
|
|
22249
22394
|
if (event.nativeEvent.isComposing || event.keyCode === 229) return;
|
|
22395
|
+
if (event.shiftKey) return;
|
|
22250
22396
|
event.preventDefault();
|
|
22251
22397
|
if (asking) return;
|
|
22252
22398
|
onSend(discussion.id);
|
|
@@ -23084,14 +23230,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23084
23230
|
const body = bodyRef.current;
|
|
23085
23231
|
if (body === null) return;
|
|
23086
23232
|
if (body.clientHeight <= 0) return;
|
|
23087
|
-
const
|
|
23088
|
-
const viewBottom = viewTop + body.clientHeight;
|
|
23089
|
-
const pairTop = off(pairIndex);
|
|
23090
|
-
const pairBottom = pairTop + ROW_HEIGHT_PX;
|
|
23091
|
-
let target;
|
|
23092
|
-
if (pairTop < viewTop) target = pairTop;
|
|
23093
|
-
else if (pairBottom > viewBottom) target = pairBottom - body.clientHeight;
|
|
23094
|
-
if (target === void 0) return;
|
|
23233
|
+
const target = off(pairIndex) + ROW_HEIGHT_PX / 2 - body.clientHeight / 2;
|
|
23095
23234
|
const clamped = Math.max(0, Math.min(target, body.scrollHeight - body.clientHeight));
|
|
23096
23235
|
if (body.scrollTop !== clamped) body.scrollTop = clamped;
|
|
23097
23236
|
setScrollTop(clamped);
|
|
@@ -24476,9 +24615,24 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24476
24615
|
rememberPlacedThreads(sessionId, draftThreads);
|
|
24477
24616
|
}, [sessionId, draftThreads]);
|
|
24478
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
|
+
/**
|
|
24479
24628
|
* The threads this pane draws, in the order their rows run: the host's records re-anchored, plus
|
|
24480
24629
|
* the blocks that have not been written yet.
|
|
24481
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
|
+
*
|
|
24482
24636
|
* Re-anchoring runs here rather than in an effect that rewrites state: the anchor's new-file lines
|
|
24483
24637
|
* are what survive a rebuild, and the record's quote is what says whether they still hold the code
|
|
24484
24638
|
* the comment was written about. When they do not, the thread follows the quote; when even that
|
|
@@ -24486,7 +24640,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24486
24640
|
* the quote (see `remapDiscussion`).
|
|
24487
24641
|
*/
|
|
24488
24642
|
const discussions = (0, react.useMemo)(() => {
|
|
24489
|
-
|
|
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) => {
|
|
24490
24646
|
const entry = model.diff.rows[row];
|
|
24491
24647
|
return entry?.newLine ?? entry?.oldLine;
|
|
24492
24648
|
}, (row) => model.diff.rows[row]?.text ?? "", model.diff.rows.length, (row) => model.diff.rows[row]?.newLine !== void 0);
|
|
@@ -24674,6 +24830,16 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24674
24830
|
const landedFileRef = (0, react.useRef)(void 0);
|
|
24675
24831
|
/** The file the placement effect below has decided the opening place for (see `placedFileRef`). */
|
|
24676
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);
|
|
24677
24843
|
(0, react.useEffect)(() => {
|
|
24678
24844
|
const landing = (landingTick ?? 0) > 0;
|
|
24679
24845
|
const opened = landedFileRef.current !== file.id;
|
|
@@ -24681,6 +24847,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24681
24847
|
placedFileRef.current = file.id;
|
|
24682
24848
|
if (!landing && !opened) return;
|
|
24683
24849
|
if (landing) {
|
|
24850
|
+
readerOwnsViewRef.current = false;
|
|
24684
24851
|
const cardEnd = landingComment === void 0 ? void 0 : discussions.find((entry) => entry.id === landingComment)?.anchor.end;
|
|
24685
24852
|
const cardRow = cardEnd === void 0 ? void 0 : Math.max(0, Math.min(cardEnd, Math.max(0, model.diff.rows.length - 1)));
|
|
24686
24853
|
const row = landingRow ?? cardRow ?? (landingLine === void 0 ? void 0 : rowOfLine(model.diff.rows, landingLine, landingOld === true));
|
|
@@ -24964,25 +25131,17 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24964
25131
|
applyPreviewFrames();
|
|
24965
25132
|
};
|
|
24966
25133
|
/**
|
|
24967
|
-
*
|
|
24968
|
-
*
|
|
24969
|
-
*
|
|
24970
|
-
*
|
|
24971
|
-
* bottom edge. The settled offset is mirrored into the frames, as for a jump.
|
|
25134
|
+
* Put one preview search occurrence in the middle of the pane. Its only caller is the search JUMP — the
|
|
25135
|
+
* bar's next / previous, Enter, F3 — and the point of that jump is to read the occurrence it landed on,
|
|
25136
|
+
* which is the rule the code view and the side-by-side view now follow too. The settled offset is
|
|
25137
|
+
* mirrored into the frames, as for a jump.
|
|
24972
25138
|
* @param hit - the highlighted occurrence to reveal.
|
|
24973
25139
|
*/
|
|
24974
25140
|
const scrollPreviewHitIntoView = (hit) => {
|
|
24975
25141
|
const body = mdPreviewBodyRef.current;
|
|
24976
25142
|
if (body === null) return;
|
|
24977
25143
|
const bodyRect = body.getBoundingClientRect();
|
|
24978
|
-
const
|
|
24979
|
-
const hitBottom = hit.getBoundingClientRect().bottom - bodyRect.top + body.scrollTop;
|
|
24980
|
-
const viewTop = body.scrollTop;
|
|
24981
|
-
const viewBottom = viewTop + body.clientHeight;
|
|
24982
|
-
let target;
|
|
24983
|
-
if (hitTop - leadRows * ROW_HEIGHT_PX < viewTop) target = hitTop - leadRows * ROW_HEIGHT_PX;
|
|
24984
|
-
else if (hitBottom > viewBottom) target = hitBottom - body.clientHeight;
|
|
24985
|
-
if (target === void 0) return;
|
|
25144
|
+
const target = (hit.getBoundingClientRect().top - bodyRect.top + body.scrollTop + (hit.getBoundingClientRect().bottom - bodyRect.top + body.scrollTop)) / 2 - body.clientHeight / 2;
|
|
24986
25145
|
const maxTop = Math.max(0, body.scrollHeight - body.clientHeight);
|
|
24987
25146
|
const clamped = Math.max(0, Math.min(target, maxTop));
|
|
24988
25147
|
if (body.scrollTop !== clamped) body.scrollTop = clamped;
|
|
@@ -25077,10 +25236,15 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25077
25236
|
return;
|
|
25078
25237
|
}
|
|
25079
25238
|
if (searchMatches.length === 0) return;
|
|
25239
|
+
rememberJumpAway(sessionId, file.id);
|
|
25080
25240
|
if (cursorPosRef.current !== void 0) {
|
|
25241
|
+
centerSearchRef.current = true;
|
|
25242
|
+
setSearchJump((jump) => jump + 1);
|
|
25081
25243
|
setSearchIndex(startIndexFor(searchQuery));
|
|
25082
25244
|
return;
|
|
25083
25245
|
}
|
|
25246
|
+
centerSearchRef.current = true;
|
|
25247
|
+
setSearchJump((jump) => jump + 1);
|
|
25084
25248
|
setSearchIndex((current) => (current + direction + searchMatches.length) % searchMatches.length);
|
|
25085
25249
|
};
|
|
25086
25250
|
/**
|
|
@@ -25102,6 +25266,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25102
25266
|
return at === -1 ? 0 : at;
|
|
25103
25267
|
};
|
|
25104
25268
|
const cursorPosRef = (0, react.useRef)(void 0);
|
|
25269
|
+
/** Set by a search JUMP: the next match is centred, where a typed query only brings it into view. */
|
|
25270
|
+
const centerSearchRef = (0, react.useRef)(false);
|
|
25271
|
+
/** Bumped by every JUMP, so the centring effect runs even when the match itself does not change (a single
|
|
25272
|
+
* hit, or a wrap back onto the same row). */
|
|
25273
|
+
const [searchJump, setSearchJump] = (0, react.useState)(0);
|
|
25105
25274
|
const lastRecordedCursorRef = (0, react.useRef)(void 0);
|
|
25106
25275
|
const openSearchWithSelection = () => {
|
|
25107
25276
|
if (searchOpen) {
|
|
@@ -25168,18 +25337,25 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25168
25337
|
const body = bodyRef.current;
|
|
25169
25338
|
if (body === null) return;
|
|
25170
25339
|
if (body.clientHeight <= 0) return;
|
|
25340
|
+
const centring = centerSearchRef.current;
|
|
25341
|
+
centerSearchRef.current = false;
|
|
25171
25342
|
const viewTop = body.scrollTop;
|
|
25172
25343
|
const viewBottom = viewTop + body.clientHeight;
|
|
25173
25344
|
const rowTop = offsetOf(row);
|
|
25174
25345
|
const rowBottom = rowTop + extentOf(row, row);
|
|
25175
25346
|
let target;
|
|
25176
|
-
if (rowTop
|
|
25347
|
+
if (centring) target = (rowTop + rowBottom) / 2 - body.clientHeight / 2;
|
|
25348
|
+
else if (rowTop < viewTop) target = rowTop;
|
|
25177
25349
|
else if (rowBottom > viewBottom) target = rowBottom - body.clientHeight;
|
|
25178
25350
|
if (target === void 0) return;
|
|
25179
25351
|
const clamped = Math.max(0, Math.min(target, body.scrollHeight - body.clientHeight));
|
|
25180
25352
|
if (body.scrollTop !== clamped) body.scrollTop = clamped;
|
|
25181
25353
|
setScrollTop(clamped);
|
|
25182
|
-
}, [
|
|
25354
|
+
}, [
|
|
25355
|
+
currentSearchRow,
|
|
25356
|
+
searchMatches,
|
|
25357
|
+
searchJump
|
|
25358
|
+
]);
|
|
25183
25359
|
const blockIndexByRow = (0, react.useMemo)(() => {
|
|
25184
25360
|
const map = /* @__PURE__ */ new Map();
|
|
25185
25361
|
model.blocks.forEach((block, blockIndex) => {
|
|
@@ -25504,7 +25680,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25504
25680
|
const endLine = newLines?.endLine ?? last?.newLine ?? last?.oldLine ?? startLine;
|
|
25505
25681
|
const body = bodyRef.current;
|
|
25506
25682
|
if (body !== null && offsetOf(range.start) - body.scrollTop < 0) pendingScrollShiftRef.current += 66;
|
|
25507
|
-
const id =
|
|
25683
|
+
const id = newId();
|
|
25508
25684
|
const quoted = model.diff.rows.slice(quoteRange.start, quoteRange.end + 1);
|
|
25509
25685
|
const quote = quoted.map((row) => row.text).join("\n");
|
|
25510
25686
|
const quoteLines = quoted.map((row) => ({
|
|
@@ -25528,6 +25704,34 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25528
25704
|
draft: ""
|
|
25529
25705
|
}]);
|
|
25530
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
|
+
})();
|
|
25531
25735
|
const live = window.getSelection();
|
|
25532
25736
|
if (typeof live?.removeAllRanges === "function") live.removeAllRanges();
|
|
25533
25737
|
selectionTextRef.current = "";
|
|
@@ -25624,13 +25828,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25624
25828
|
const frame = quotedFrame(discussion.quote, discussion.quoteLines);
|
|
25625
25829
|
const legend = frameCoversRemovedRow(discussion.quoteLines) ? `\n${t("discussion.frameLegend")}` : "";
|
|
25626
25830
|
const prompt = frame === "" ? `${marker}\n${text}\n\n${rule}` : `${marker}\n${frame}${legend}\n\n${text}\n\n${rule}`;
|
|
25627
|
-
|
|
25831
|
+
const held = fileComments.find((record) => record.id === id);
|
|
25832
|
+
if (held !== void 0 && held.text !== "") {
|
|
25628
25833
|
askComment(id, prompt, text);
|
|
25629
25834
|
return;
|
|
25630
25835
|
}
|
|
25631
|
-
const commentId = newId();
|
|
25632
25836
|
const draft = {
|
|
25633
|
-
id
|
|
25837
|
+
id,
|
|
25634
25838
|
entryId: file.id,
|
|
25635
25839
|
anchor: {
|
|
25636
25840
|
startLine: discussion.anchor.startLine,
|
|
@@ -25654,8 +25858,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25654
25858
|
return;
|
|
25655
25859
|
}
|
|
25656
25860
|
setDraftThreads((current) => current.filter((thread) => thread.id !== id));
|
|
25657
|
-
discussionRefocusRef.current =
|
|
25658
|
-
await askComment(
|
|
25861
|
+
discussionRefocusRef.current = id;
|
|
25862
|
+
await askComment(id, prompt, text);
|
|
25659
25863
|
})();
|
|
25660
25864
|
};
|
|
25661
25865
|
/** Discard one block, keeping the code the user is reading in place. */
|
|
@@ -25665,12 +25869,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25665
25869
|
const shift = discussionRows(discussion) * THREAD_ROW_PX * -1;
|
|
25666
25870
|
const body = bodyRef.current;
|
|
25667
25871
|
if (body !== null && offsetOf(discussion.anchor.start) - body.scrollTop < 0) pendingScrollShiftRef.current += shift;
|
|
25872
|
+
const placed = draftThreads.some((thread) => thread.id === id);
|
|
25668
25873
|
if (fileComments.some((record) => record.id === id)) {
|
|
25669
25874
|
onCommentRemove(sessionId, id).catch((error) => {
|
|
25670
25875
|
onToast(error instanceof Error ? error.message : String(error));
|
|
25671
25876
|
});
|
|
25877
|
+
if (placed) {
|
|
25878
|
+
setDraftThreads((current) => current.filter((thread) => thread.id !== id));
|
|
25879
|
+
forgetThreads([id]);
|
|
25880
|
+
}
|
|
25672
25881
|
return;
|
|
25673
25882
|
}
|
|
25883
|
+
discardedByReader.current.add(id);
|
|
25884
|
+
onCommentRemove(sessionId, id).catch((error) => {
|
|
25885
|
+
onToast(error instanceof Error ? error.message : String(error));
|
|
25886
|
+
});
|
|
25674
25887
|
setDraftThreads((current) => current.filter((thread) => thread.id !== id));
|
|
25675
25888
|
forgetThreads([id]);
|
|
25676
25889
|
};
|
|
@@ -25794,6 +26007,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25794
26007
|
if (width !== bodyWidth) setBodyWidth(width);
|
|
25795
26008
|
});
|
|
25796
26009
|
const fitWidthRef = (0, react.useRef)(0);
|
|
26010
|
+
const measuredWritesRef = (0, react.useRef)({});
|
|
25797
26011
|
const [, bumpFixTick] = (0, react.useReducer)((n) => n + 1, 0);
|
|
25798
26012
|
const fixTickArmedRef = (0, react.useRef)(false);
|
|
25799
26013
|
(0, react.useLayoutEffect)(() => {
|
|
@@ -25822,6 +26036,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25822
26036
|
const drawn = last.getBoundingClientRect().bottom + (Number.parseFloat(getComputedStyle(last).marginBottom) || 0) - body.getBoundingClientRect().top - (slack?.getBoundingClientRect().height ?? 0);
|
|
25823
26037
|
if (drawn <= 0) continue;
|
|
25824
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);
|
|
25825
26046
|
if (threadState[id]?.bodyRows !== want) measured[id] = { bodyRows: want };
|
|
25826
26047
|
}
|
|
25827
26048
|
if (Object.keys(measured).length > 0) patchThreads(measured);
|
|
@@ -25991,6 +26212,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25991
26212
|
(0, react.useLayoutEffect)(() => {
|
|
25992
26213
|
if (rowCount === 0) return;
|
|
25993
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;
|
|
25994
26219
|
const resumed = landingTopRef.current;
|
|
25995
26220
|
if (resumed !== void 0) {
|
|
25996
26221
|
landingTopRef.current = void 0;
|
|
@@ -26110,6 +26335,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26110
26335
|
bumpFlash(false);
|
|
26111
26336
|
};
|
|
26112
26337
|
const jumpBlock = (direction, wrapGuard = false, singleToast = wrapGuard) => {
|
|
26338
|
+
rememberJumpAway(sessionId, file.id);
|
|
26113
26339
|
if (splitView && !previewActive) {
|
|
26114
26340
|
splitDiffRef.current?.jump(direction, wrapGuard, singleToast);
|
|
26115
26341
|
return;
|
|
@@ -26126,6 +26352,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26126
26352
|
* configured lead rows above it and the block it lands in flashed.
|
|
26127
26353
|
*/
|
|
26128
26354
|
const gotoLine = (line) => {
|
|
26355
|
+
rememberJumpAway(sessionId, file.id);
|
|
26129
26356
|
const row = model.diff.rows.findIndex((entry) => entry.newLine === line);
|
|
26130
26357
|
if (row === -1) {
|
|
26131
26358
|
onToast(t("panel.gotoMissing", { line }));
|
|
@@ -26307,15 +26534,28 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26307
26534
|
if (body === null) return;
|
|
26308
26535
|
for (const text of body.querySelectorAll("[data-diff-quote-text]")) text.scrollLeft = body.scrollLeft;
|
|
26309
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
|
+
};
|
|
26310
26553
|
const onScroll = () => {
|
|
26311
26554
|
const body = bodyRef.current;
|
|
26312
26555
|
if (body === null) return;
|
|
26313
26556
|
const written = selfScrollRef.current;
|
|
26314
26557
|
selfScrollRef.current = void 0;
|
|
26315
|
-
if (written === void 0 || Math.abs(body.scrollTop - written) >= 1)
|
|
26316
|
-
landingGoalRef.current = void 0;
|
|
26317
|
-
landingPendingRef.current = false;
|
|
26318
|
-
}
|
|
26558
|
+
if (written === void 0 || Math.abs(body.scrollTop - written) >= 1) readerTookOver();
|
|
26319
26559
|
syncQuoteScroll(body);
|
|
26320
26560
|
rememberPanelView(sessionId, {
|
|
26321
26561
|
fileId: file.id,
|
|
@@ -27395,6 +27635,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27395
27635
|
ref: bodyRef,
|
|
27396
27636
|
tabIndex: 0,
|
|
27397
27637
|
onScroll,
|
|
27638
|
+
onWheel: readerTookOver,
|
|
27398
27639
|
style: {
|
|
27399
27640
|
tabSize: tabWidthSpaces,
|
|
27400
27641
|
"--dsh-diff-quote-width": `${widestLine}ch`
|
|
@@ -27841,6 +28082,58 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27841
28082
|
n: (prev?.n ?? 0) + 1
|
|
27842
28083
|
}));
|
|
27843
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
|
+
};
|
|
27844
28137
|
/** The selection as the latest render has it, for the closers that run from a
|
|
27845
28138
|
* cleanup (the docked tab unmounting) rather than from a handler. */
|
|
27846
28139
|
const selectedRef = (0, react.useRef)(selected);
|
|
@@ -27999,6 +28292,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27999
28292
|
const onPanelFile = (event) => {
|
|
28000
28293
|
const detail = event.detail;
|
|
28001
28294
|
if (detail === void 0 || typeof detail.fileId !== "string") return;
|
|
28295
|
+
leftPlace();
|
|
28002
28296
|
setSelected(detail.fileId);
|
|
28003
28297
|
landOn(detail.fileId);
|
|
28004
28298
|
};
|
|
@@ -28240,6 +28534,30 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28240
28534
|
/** The window's height, for the panel's minimum-size floor (see {@link panelInsets}). */
|
|
28241
28535
|
const [viewportHeight, setViewportHeight] = (0, react.useState)(() => window.innerHeight);
|
|
28242
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]);
|
|
28243
28561
|
const splitRef = (0, react.useRef)(null);
|
|
28244
28562
|
/** The code scroll box's bounds within the split, so the floating card is
|
|
28245
28563
|
* constrained to it. */
|
|
@@ -28610,7 +28928,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28610
28928
|
if (pick === void 0) return;
|
|
28611
28929
|
if (pick !== selected) setSelected(pick);
|
|
28612
28930
|
if (started) landOn(pick, panelFileOffset(current, pick));
|
|
28613
|
-
else if (typed !== void 0)
|
|
28931
|
+
else if (typed !== void 0) {
|
|
28932
|
+
leftPlace();
|
|
28933
|
+
landOn(pick);
|
|
28934
|
+
}
|
|
28614
28935
|
}, [
|
|
28615
28936
|
open,
|
|
28616
28937
|
docked,
|
|
@@ -29095,6 +29416,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
29095
29416
|
clearPickedFiles();
|
|
29096
29417
|
if (id === selected) setJumpSignal((signal) => signal + 1);
|
|
29097
29418
|
else {
|
|
29419
|
+
leftPlace();
|
|
29098
29420
|
setSelected(id);
|
|
29099
29421
|
landOn(id);
|
|
29100
29422
|
}
|
|
@@ -29351,6 +29673,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
29351
29673
|
* line, and the detail lands on the removal carrying it rather than on the current line that now
|
|
29352
29674
|
* reads that number (see `frameNamesNoCurrentLine`). */
|
|
29353
29675
|
const jumpToComment = (fileId, line, id, oldSide) => {
|
|
29676
|
+
leftPlace();
|
|
29354
29677
|
if (fileId !== selected) setSelected(fileId);
|
|
29355
29678
|
landOn(fileId, void 0, void 0, true, line, id, oldSide);
|
|
29356
29679
|
};
|
|
@@ -29727,6 +30050,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
29727
30050
|
if (id === void 0) return;
|
|
29728
30051
|
if (id === selected) setUndoFlash((signal) => signal + 1);
|
|
29729
30052
|
else {
|
|
30053
|
+
leftPlace();
|
|
29730
30054
|
setSelected(id);
|
|
29731
30055
|
landOn(id);
|
|
29732
30056
|
}
|
|
@@ -29736,6 +30060,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
29736
30060
|
if (id === void 0) return;
|
|
29737
30061
|
if (id === selected) setUndoFlash((signal) => signal + 1);
|
|
29738
30062
|
else {
|
|
30063
|
+
leftPlace();
|
|
29739
30064
|
setSelected(id);
|
|
29740
30065
|
landOn(id);
|
|
29741
30066
|
}
|
|
@@ -29807,6 +30132,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
29807
30132
|
const index = files.findIndex((file) => file.id === selected);
|
|
29808
30133
|
const next = files[(index + direction + files.length) % files.length];
|
|
29809
30134
|
if (next !== void 0) {
|
|
30135
|
+
leftPlace();
|
|
29810
30136
|
setSelected(next.id);
|
|
29811
30137
|
landOn(next.id);
|
|
29812
30138
|
}
|