dsh-diff-approval 0.31.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -23
- package/README.zh.md +6 -21
- package/lib/client.js +469 -91
- package/lib/index.js +83 -4
- package/lib/types/client/PendingPanel.d.ts +4 -0
- package/lib/types/client/discussion.d.ts +3 -3
- package/lib/types/client/locales.d.ts +10 -0
- package/lib/types/client/produced-diff.d.ts +19 -8
- package/lib/types/client/whole-file-diff.d.ts +42 -0
- package/lib/types/types.d.ts +6 -0
- package/lib/types/vcs.d.ts +33 -0
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -330,7 +330,7 @@ window.__ModuleLoader__.load({
|
|
|
330
330
|
});
|
|
331
331
|
//#endregion
|
|
332
332
|
//#region \0dsh-css:/home/runner/work/dsh-diff-approval/dsh-diff-approval/src/client/PendingPanel.module.css.mjs
|
|
333
|
-
const css = ".F1KBNa_panelFailure{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);border-radius:8px;align-items:center;gap:8px;padding:8px 10px;font-size:12px;line-height:16px;display:flex}.F1KBNa_panelFailureText{min-width:0}.F1KBNa_panelFailureRetry{border:1px solid var(--dsw-alias-border-l2);color:inherit;font:inherit;cursor:pointer;background:0 0;border-radius:6px;flex:none;margin-left:auto;padding:2px 8px}.F1KBNa_panelFailureRetry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_layer{box-sizing:border-box;flex:none;align-items:center;width:calc(100% + 4px);height:42px;margin:4px -2px;display:flex;position:relative}.F1KBNa_headerEntry{box-sizing:border-box;width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:28px;flex:none;justify-content:center;align-items:center;padding:6px;display:inline-flex;position:relative}.F1KBNa_headerEntry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_headerEntry[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.F1KBNa_headerEntry:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_headerEntryCount{box-sizing:border-box;background:var(--dsw-alias-button-primary-fill);min-width:14px;height:14px;color:var(--dsw-alias-label-primary-foreground);text-align:center;font-variant-numeric:tabular-nums;pointer-events:none;border-radius:7px;padding:0 3px;font-size:10px;line-height:14px;position:absolute;top:-1px;right:-1px}.F1KBNa_headerEntry svg{display:block}.F1KBNa_footerButtons{align-items:center;width:100%;display:flex}.F1KBNa_badge{box-sizing:border-box;width:100%;height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}.F1KBNa_badge:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_badge[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_badge:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_badgeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.F1KBNa_badgeCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;font-size:12px;line-height:16px}.F1KBNa_layer.F1KBNa_rail{width:36px;height:36px;margin:8px 0 10px}.F1KBNa_rail .F1KBNa_badge{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;padding:0}.F1KBNa_rail .F1KBNa_badgeLabel{display:none}.F1KBNa_rail .F1KBNa_badgeCount{box-sizing:border-box;background:var(--dsw-alias-state-business-primary);min-width:18px;height:18px;color:var(--dsw-alias-label-primary-foreground);font-variant-numeric:tabular-nums;border-radius:9px;justify-content:center;align-items:center;padding:0 4px;font-size:11px;line-height:18px;display:flex;position:absolute;top:-3px;right:-7px}.F1KBNa_coverBackdrop{z-index:29;background:var(--dsw-specific-sidebar-fill);position:fixed;inset:0}.F1KBNa_panel,.F1KBNa_diffPreview{--diff-gutter-surface:var(--dsw-alias-bg-base)}.F1KBNa_panel{z-index:30;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:auto;max-width:none;box-shadow:var(--dsw-shadow-lv2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);-webkit-user-select:none;user-select:none;border-radius:12px;flex-direction:column;display:flex;position:fixed;inset:8px 8px 128px;overflow:hidden}.F1KBNa_panel .F1KBNa_code,.F1KBNa_panel .F1KBNa_mdPreviewBody,.F1KBNa_panel .F1KBNa_diffPath,.F1KBNa_panel input,.F1KBNa_panel textarea,.F1KBNa_panel [contenteditable]{-webkit-user-select:text;user-select:text}.F1KBNa_panelDocked{width:100%;max-width:none;height:100%;box-shadow:none;border:none;border-radius:0;position:static;inset:auto}.F1KBNa_dockHost{flex-direction:column;min-height:0;display:flex;position:absolute;inset:0}.F1KBNa_header{box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:10px 12px;display:flex}.F1KBNa_headerActions{align-items:center;gap:2px;display:flex}.F1KBNa_settingsPage{padding:8px 12px}.F1KBNa_settingsGroup{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupHeader{z-index:3;background:var(--dsw-alias-bg-base);width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;border:none;align-items:center;gap:8px;padding:16px 0;display:flex;position:sticky;top:0}.F1KBNa_settingsGroupText{text-align:left;flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.F1KBNa_settingsGroupTitle{font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsGroupDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsGroupChevron{margin-left:auto;transition:transform .15s}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupChevron{transform:rotate(180deg)}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupHeader{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupBody{flex-direction:column;display:flex}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow{padding-left:16px}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow:last-child,.F1KBNa_settingsPage>.F1KBNa_settingsRow:last-child{border-bottom:none}.F1KBNa_settingsRow{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.F1KBNa_settingsRowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.F1KBNa_settingsRowTitle{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsRowDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsRowLink{color:inherit;cursor:pointer;text-decoration:none}.F1KBNa_settingsRowLink:hover{color:var(--dsw-alias-label-secondary);text-underline-offset:2px;text-decoration:underline}.F1KBNa_settingsSelector{background:var(--dsw-alias-bg-module-platform);min-width:72px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;justify-content:center;align-items:center;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.F1KBNa_settingsSelector:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_settingsSelector[data-recording]{box-shadow:inset 0 0 0 1px var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-secondary)}.F1KBNa_settingsSelectorChevron{flex:none}.F1KBNa_settingsReset{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;margin-left:6px;padding:0;display:inline-flex}.F1KBNa_settingsReset:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_settingsReset:disabled{opacity:.4;cursor:default}.F1KBNa_colorPicker{position:relative}.F1KBNa_colorPickerTrigger{background:var(--dsw-alias-bg-module-platform);width:120px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_colorPickerTrigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_colorSwatch{border:1px solid var(--dsw-alias-border-l2);border-radius:50%;flex:none;width:24px;height:24px}.F1KBNa_colorValue{text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;flex:1;min-width:0;overflow:hidden}.F1KBNa_colorPickerChevron{flex:none}.F1KBNa_colorBackdrop{z-index:40;position:fixed;inset:0}.F1KBNa_colorPickerPopover{z-index:41;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:10px;padding:10px;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_colorPickerPanel{flex-direction:column;gap:8px;display:flex}.F1KBNa_colorPickerInputRow{align-items:center;gap:8px;display:flex}.F1KBNa_colorPickerPreview{border:1px solid var(--dsw-alias-border-l2);border-radius:6px;flex:none;width:22px;height:22px}.F1KBNa_colorPickerInput{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-module-platform);min-width:0;height:30px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;flex:1;padding:0 8px;font-size:12px;line-height:28px}.F1KBNa_colorPickerInput:focus{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-1px}.F1KBNa_colorSv{border:1px solid var(--dsw-alias-border-l1);cursor:crosshair;touch-action:none;border-radius:8px;height:140px;position:relative}.F1KBNa_colorSvCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:14px;height:14px;position:absolute;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_colorHue{border:1px solid var(--dsw-alias-border-l1);cursor:pointer;touch-action:none;border-radius:7px;height:14px;position:relative}.F1KBNa_colorHueCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:16px;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_diffPreview{top:var(--settings-header-h,76px);z-index:2;border:1px solid var(--dsw-alias-border-l1);font:var(--dsw-font-markdown-code-block);background:var(--dsw-alias-markdown-code-block);border-radius:8px;margin:16px 0 8px;padding:8px;position:sticky;overflow:hidden}.F1KBNa_diffPreviewTitle{color:var(--dsw-alias-label-tertiary);margin-bottom:6px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_diffPreviewScroll{height:132px;overflow-y:auto}.F1KBNa_mdPreviewWrap{isolation:isolate;flex:1;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_mdPreviewBody{overscroll-behavior:none;min-width:0;min-height:0;color:var(--dsw-alias-label-primary);flex:1;padding:12px 16px;position:relative;overflow:auto}.F1KBNa_mdPreviewContent{width:100%;min-width:0;margin:0 auto}.F1KBNa_mdPreviewSingle{display:block}.F1KBNa_mdPreviewDouble{display:flex}.F1KBNa_mdPreviewBody .mdBlock{border-radius:4px;margin-bottom:12px;padding:2px 6px}.F1KBNa_mdPreviewBody .mdAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 10%, transparent)}.F1KBNa_mdPreviewBody .mdDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 12%, transparent)}.F1KBNa_mdPreviewBody .mdWordDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdWordAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdDouble{flex-direction:column;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleRow{align-items:flex-start;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleCol{flex:1;min-width:0}.F1KBNa_mdPreviewBody .mdDoubleRule{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:0 12px}.F1KBNa_mdPreviewFallback{font-family:var(--dsw-font-markdown-code-block);color:var(--dsw-alias-label-tertiary);padding:12px 16px;font-size:12px;line-height:18px}.F1KBNa_mdPreviewBody{word-break:break-word;font-size:13px;line-height:20px}.F1KBNa_mdPreviewBody>:first-child{margin-top:0}.F1KBNa_mdPreviewBody>:last-child{margin-bottom:0}.F1KBNa_mdPreviewBody h1,.F1KBNa_mdPreviewBody h2,.F1KBNa_mdPreviewBody h3,.F1KBNa_mdPreviewBody h4,.F1KBNa_mdPreviewBody h5,.F1KBNa_mdPreviewBody h6{margin:16px 0 8px;font-weight:600;line-height:1.3}.F1KBNa_mdPreviewBody h1{font-size:22px}.F1KBNa_mdPreviewBody h2{font-size:19px}.F1KBNa_mdPreviewBody h3{font-size:16px}.F1KBNa_mdPreviewBody h4{font-size:15px}.F1KBNa_mdPreviewBody h5{font-size:14px}.F1KBNa_mdPreviewBody h6{font-size:13px}.F1KBNa_mdPreviewBody p{margin:8px 0}.F1KBNa_mdPreviewBody ul,.F1KBNa_mdPreviewBody ol{margin:8px 0;padding-left:22px}.F1KBNa_mdPreviewBody li{margin:2px 0}.F1KBNa_mdPreviewBody a{color:var(--dsw-alias-state-business-primary);text-decoration:none}.F1KBNa_mdPreviewBody a:hover{text-decoration:underline}.F1KBNa_mdPreviewBody code{font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:4px;padding:1px 5px;font-size:12.5px}.F1KBNa_mdPreviewBody pre{overscroll-behavior-x:none;border:1px solid var(--dsw-alias-border-l1);font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:8px;margin:8px 0;padding:10px 12px;font-size:12.5px;line-height:18px;overflow:auto}.F1KBNa_mdPreviewBody pre code{background:0 0;padding:0}.F1KBNa_mdPreviewBody blockquote{border-left:3px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);margin:8px 0;padding:0 12px}.F1KBNa_mdPreviewBody hr{background:var(--dsw-alias-border-l1);border:none;height:1px;margin:16px 0}.F1KBNa_mdPreviewBody table{border-collapse:collapse;margin:8px 0}.F1KBNa_mdPreviewBody th,.F1KBNa_mdPreviewBody td{border:1px solid var(--dsw-alias-border-l1);padding:4px 10px}.F1KBNa_mdPreviewBody img{max-width:100%}.F1KBNa_mdPreviewBody .mdImageFallback{border:1px dashed var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-markdown-code-block) 45%, transparent);width:100%;min-height:120px;color:var(--dsw-alias-label-secondary);font-family:var(--dsw-font-markdown-code-block);text-align:center;white-space:pre-wrap;word-break:break-all;border-radius:4px;justify-content:center;align-items:center;margin:0 auto;padding:8px 12px;font-size:12px;line-height:16px;display:flex}.F1KBNa_toggle{border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:18px;flex:none;width:60px;height:36px;padding:0;position:relative}.F1KBNa_toggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_toggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.F1KBNa_toggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleOn:hover{background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleThumb{background:var(--dsw-alias-label-primary);border-radius:50%;width:28px;height:28px;transition:left .12s;position:absolute;top:3px;left:3px}.F1KBNa_toggleOn .F1KBNa_toggleThumb{background:#fff;left:27px}.F1KBNa_stepper{align-items:center;gap:6px;display:inline-flex}.F1KBNa_stepperButton{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);width:32px;height:32px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;padding:0;position:relative}.F1KBNa_stepperButton:before,.F1KBNa_stepperButton:after{content:\"\";background:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_stepperButton:before{width:10px;height:1px}.F1KBNa_stepperButton:after{width:1px;height:10px;display:none}.F1KBNa_stepperButtonUp:after{display:block}.F1KBNa_stepperButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_stepperButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_stepperValue{text-align:center;min-width:2ch;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:14px;line-height:22px}.F1KBNa_states{flex-direction:column;flex:1;min-height:0;padding:4px 12px 12px;display:flex;overflow-y:auto}.F1KBNa_split{flex:1;align-items:stretch;min-height:0;display:flex;position:relative}.F1KBNa_fileListKnob{z-index:39;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;box-shadow:var(--dsw-elevation-prominent);border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute}.F1KBNa_fileListKnob[data-open]{box-shadow:none;opacity:0}.F1KBNa_fileListKnob:not([data-open]){animation:.32s ease-in-out .5s both F1KBNa_fileListKnobIn}@keyframes F1KBNa_fileListKnobIn{0%{opacity:0}to{opacity:1}}.F1KBNa_fileListKnob:hover,.F1KBNa_fileListKnob:focus-visible{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-interactive-bg-hover), var(--dsw-alias-interactive-bg-hover))}.F1KBNa_fileListFloat{z-index:40;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);box-shadow:none;transform-origin:0 0;border-radius:12px;flex-direction:column;padding:6px 0 10px 8px;display:flex;position:absolute;overflow:hidden}.F1KBNa_fileListFloatClosing{pointer-events:none;animation:.14s ease-in forwards F1KBNa_fileListShrink}@keyframes F1KBNa_fileListShrink{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.96)}}.F1KBNa_fileList{box-sizing:border-box;border-right:1px solid var(--dsw-alias-border-l2);flex-direction:column;flex:none;width:260px;min-height:0;padding:4px 0 12px 8px;display:flex}.F1KBNa_listScroll{scrollbar-gutter:stable;flex:1;min-height:0;padding-right:2px;overflow-y:scroll}.F1KBNa_fileListFloat .F1KBNa_listScroll{margin-right:2px}.F1KBNa_bulkActions{flex:none;gap:6px;padding:8px 8px 0 0;display:flex}.F1KBNa_bulkActions .F1KBNa_action{text-align:center;flex:auto}.F1KBNa_bulkActions .F1KBNa_action:disabled{opacity:.4;cursor:default}.F1KBNa_addPath{justify-content:center;align-items:center;gap:4px;display:inline-flex}.F1KBNa_resizeHandle{cursor:col-resize;touch-action:none;background:0 0;flex:none;width:5px;margin:0 -2px}.F1KBNa_resizeHandle:hover{background:var(--dsw-alias-border-l2)}.F1KBNa_floatResizeHandle{z-index:41;cursor:col-resize;-webkit-user-select:none;user-select:none;touch-action:none;background:0 0;border-radius:4px;position:absolute}.F1KBNa_floatResizeHandle:hover{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-border-l2), var(--dsw-alias-border-l2))}.F1KBNa_detail{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.F1KBNa_detailEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;flex:1;justify-content:center;align-items:center;margin:0;padding:24px;font-size:12px;line-height:18px;display:flex}.F1KBNa_confirmBackdrop{z-index:55;background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);justify-content:center;align-items:center;padding:24px;display:flex;position:absolute;inset:0}.F1KBNa_confirmBackdropFixed{z-index:60;position:fixed}.F1KBNa_confirmCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:340px;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:12px;padding:16px;display:flex}.F1KBNa_confirmTitle{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;flex:none;margin:0;font-size:13px;font-weight:500;line-height:20px}.F1KBNa_confirmText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;margin:0;line-height:1.5}.F1KBNa_confirmBlock{flex-direction:column;gap:6px;min-width:0;display:flex}.F1KBNa_confirmList{overscroll-behavior:contain;scrollbar-gutter:stable;background:var(--dsw-alias-bg-module-platform);max-height:104px;font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;border-radius:6px;margin:0;padding:0 6px;font-size:11px;line-height:16px;list-style:none;overflow-y:auto}.F1KBNa_confirmActions{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;display:flex}.F1KBNa_pickerCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:420px;max-width:100%;height:70%;max-height:100%;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:8px;padding:14px 16px 16px;display:flex;position:relative;overflow:hidden}.F1KBNa_pickerTitle{color:var(--dsw-alias-label-primary);flex:none;font-size:13px;font-weight:500;line-height:20px}.F1KBNa_pickerClose{width:22px;height:22px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;top:10px;right:10px}.F1KBNa_pickerClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_pickerForm{flex:none;gap:8px;display:flex}.F1KBNa_pickerInput{border:1px solid var(--dsw-alias-border-l1);min-width:0;color:var(--dsw-alias-label-primary);background:0 0;border-radius:8px;flex:auto;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_pickerInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_tree{scrollbar-gutter:stable;border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex:auto;min-height:0;padding:4px 2px 4px 4px;overflow:auto scroll}.F1KBNa_treeRow{border-radius:6px;align-items:center;gap:2px;padding-right:4px;display:flex}.F1KBNa_treeRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_treeRow[data-selected]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)}.F1KBNa_treeCaret{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_treeCaret:hover{color:var(--dsw-alias-label-primary)}.F1KBNa_treeName{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:auto;align-items:center;gap:6px;padding:2px 4px;font-family:inherit;font-size:12px;line-height:18px;display:flex}.F1KBNa_treeName:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_treeNote{color:var(--dsw-alias-label-tertiary);margin:2px 0;font-size:12px;line-height:18px}.F1KBNa_pickerIcon{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_pickerName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_pickerNote{color:var(--dsw-alias-label-tertiary);flex:none;margin:0;font-size:12px;line-height:18px}.F1KBNa_pickerCheck{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;margin-right:auto;font-size:12px;line-height:18px;display:flex}.F1KBNa_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}.F1KBNa_note,.F1KBNa_readError{color:var(--dsw-alias-label-tertiary);margin:4px 0;font-size:12px;line-height:18px}.F1KBNa_noteCentered{text-align:center;margin:auto}.F1KBNa_emptyState{flex-direction:column;align-items:center;gap:10px;margin:auto;display:flex}.F1KBNa_importButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:5px 14px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_importButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_importButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_importNote{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;font-size:12px;line-height:18px}.F1KBNa_readError{color:var(--dsw-alias-state-error-primary)}.F1KBNa_action.F1KBNa_addButton{box-sizing:border-box;border-radius:6px;flex:none;justify-content:center;align-items:center;width:20px;height:20px;min-height:0;padding:0;display:inline-flex}.F1KBNa_listHead{flex:none;align-items:center;gap:4px;margin:8px 1px 2px;padding-right:8px;display:flex}.F1KBNa_action.F1KBNa_addButton.F1KBNa_listFold{width:26px;height:26px}.F1KBNa_listTitle{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_listTabs{background:var(--dsw-alias-interactive-bg-hover);border-radius:8px;flex:auto;gap:2px;min-width:0;padding:2px;display:flex}.F1KBNa_listTab{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:6px;padding:3px 8px;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_tabCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}.F1KBNa_listTab[aria-selected=true]{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.F1KBNa_commentGroup{margin:0 0 6px}.F1KBNa_commentGroup:last-child{margin-bottom:0}.F1KBNa_commentGroupName{color:var(--dsw-alias-label-tertiary);margin:0;padding:4px 13px 2px;font-size:11px;font-weight:500;line-height:16px}.F1KBNa_commentRow{box-sizing:border-box;width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;padding:6px 8px;display:block;position:relative}.F1KBNa_commentRow:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_commentRow[data-selected]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_commentHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.F1KBNa_commentLabel{white-space:nowrap;text-align:right;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:12px;line-height:18px}.F1KBNa_commentTitle{-webkit-line-clamp:3;text-overflow:ellipsis;overflow-wrap:anywhere;text-align:left;min-width:0;color:var(--dsw-alias-label-primary);-webkit-box-orient:vertical;flex:1;margin-left:4px;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.F1KBNa_commentTitleEmpty{color:var(--dsw-alias-label-tertiary)}.F1KBNa_listEmpty{color:var(--dsw-alias-label-tertiary);margin:8px 12px;font-size:12px;line-height:18px}.F1KBNa_emptyActions{flex-wrap:wrap;justify-content:center;gap:8px;display:flex}.F1KBNa_rows{margin:0;padding:0;list-style:none}.F1KBNa_row{border:1px solid #0000;border-radius:10px;margin:2px 0}.F1KBNa_rowMenuAnchor{display:none}.F1KBNa_rowHead{width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;align-items:center;gap:8px;padding:6px 8px;display:flex;position:relative}.F1KBNa_rowHead:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_rowHead[data-selected],.F1KBNa_rowHead[data-picked]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_rowPath{text-overflow:ellipsis;white-space:nowrap;min-width:0;margin-left:4px;font-size:12px;line-height:18px;overflow:hidden}.F1KBNa_unseenDot{flex:none;align-self:center;position:absolute;top:50%;left:5px;overflow:visible;transform:translateY(-50%)}.F1KBNa_categoryDot{pointer-events:none;-webkit-user-select:none;user-select:none;border-radius:50%;width:3px;height:3px;position:absolute;top:13.5px;left:5px}.F1KBNa_rowFailed{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_actionError{border-bottom:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere;margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_rowMeta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;gap:6px;margin-left:auto;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_addCount{color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_delCount{color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_diff{background:var(--dsw-alias-markdown-code-block);flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffHeader{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_panelDocked .F1KBNa_diffHeader{background:var(--dsw-alias-bg-base)}.F1KBNa_diffPath{appearance:none;min-width:0;font:inherit;text-overflow:ellipsis;color:var(--dsw-alias-label-primary);background:0 0;border:0;flex:1;margin-left:4px;padding:0;font-size:12px;line-height:18px;position:relative;top:1px}.F1KBNa_diffPath:focus{outline:none}.F1KBNa_diffActions{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffActionInfo{flex:auto;align-items:center;gap:8px;min-width:0;display:flex;overflow:hidden}.F1KBNa_diffActionDecisions{flex:none;align-items:center;gap:8px;display:flex}.F1KBNa_diffStats{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:16px}.F1KBNa_flexSpacer{flex:1}.F1KBNa_gotoLayer{z-index:30;place-items:center;display:grid;position:absolute;inset:0}.F1KBNa_gotoLayerRight{left:50%;right:var(--dsh-scrollbar-width,8px);bottom:calc(var(--dsh-scrollbar-width,8px) + 1px)}.F1KBNa_gotoBackdrop{z-index:29;position:fixed;inset:0}.F1KBNa_gotoBox{z-index:1;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;flex-direction:column;align-items:stretch;gap:4px;padding:4px;display:flex;position:relative}.F1KBNa_gotoRow{align-items:center;gap:4px;display:flex}.F1KBNa_gotoInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:9em;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;flex:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_gotoInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_gotoAction{white-space:nowrap;flex:none}.F1KBNa_divider{background:var(--dsw-alias-border-l1);align-self:stretch;width:1px;margin:2px 0}.F1KBNa_action{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;text-decoration:none}.F1KBNa_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_action:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_actionChord{color:var(--dsw-alias-label-tertiary);margin-left:6px;font-size:11px}.F1KBNa_actionPrimary{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_actionPrimary:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_actionPrimary:disabled{background:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:.55}.F1KBNa_actionQuietDisabled:disabled{cursor:pointer;color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l1);background:0 0}.F1KBNa_actionPrimary.F1KBNa_actionQuietDisabled:disabled{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:1}.F1KBNa_iconAction{justify-content:center;align-items:center;min-height:25px;padding:4px 6px;display:inline-flex}.F1KBNa_close{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_expand{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_expand:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_diffBodyWrap{isolation:isolate;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBody{overscroll-behavior:none;min-width:0;font:var(--dsw-font-markdown-code-block);-webkit-text-size-adjust:100%;text-size-adjust:100%;cursor:text;outline:none;flex:1;padding:0;position:relative;overflow:auto}.F1KBNa_diffBody::-webkit-scrollbar,.F1KBNa_diffBody::-webkit-scrollbar-track,.F1KBNa_diffBody::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_blockActions{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);z-index:2;border-radius:10px;align-items:center;gap:9px;padding:5px;display:flex;position:absolute;right:8px}.F1KBNa_blockActionsDivider{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:2px 0}.F1KBNa_blockPosition{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;margin-top:1px;margin-left:7px;font-size:12px;line-height:16px}.F1KBNa_searchBar{z-index:3;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;align-items:center;gap:4px;padding:4px;display:flex;position:absolute;top:8px;right:8px}.F1KBNa_searchInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:150px;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_searchInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchCount{text-align:center;min-width:34px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:16px}.F1KBNa_searchToggle{border:1px solid var(--dsw-alias-border-l1);min-height:25px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;justify-content:center;align-items:center;padding:4px 6px;display:inline-flex}.F1KBNa_searchToggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_searchToggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchMatch{color:inherit;background-color:#facc1542;border-radius:2px}.F1KBNa_searchMatchCurrent{color:inherit;background-color:#facc1599;border-radius:2px}.F1KBNa_blockFlash{z-index:3;box-sizing:border-box;border:2px solid var(--dsw-alias-state-business-primary);pointer-events:none;border-radius:4px;animation:1s ease-out forwards F1KBNa_diffFlashFade;position:absolute;left:0;right:0}.F1KBNa_blockFlashShake{animation:.7s ease-out forwards F1KBNa_diffFlashShake}.F1KBNa_discussionRow{background:var(--dsw-alias-bg-base);display:table-row}.F1KBNa_discussionCell{display:table-cell}.F1KBNa_discussionPin{z-index:2;width:0;height:0;position:sticky;left:0}.F1KBNa_discussion{z-index:2;box-sizing:border-box;border-left:3px solid var(--dsw-alias-state-business-primary);box-shadow:inset 0 1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset 0 -1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset -1px 0 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent);cursor:default;background:0 0;flex-direction:column;display:flex;position:absolute;top:0;left:0;overflow:hidden}.F1KBNa_discussionHead{font:var(--dsw-font-markdown-code-block)}.F1KBNa_discussionHead .F1KBNa_unseenDot{vertical-align:middle;flex:none;align-self:center;margin-right:6px;display:inline-block;position:static;transform:none}.F1KBNa_discussionBody,.F1KBNa_threadFontProbe{font:var(--dsw-font-markdown-base);font-size:calc(var(--dsh-content-font-size,14px) - 2px)}.F1KBNa_threadFontProbe{visibility:hidden;pointer-events:none;width:0;height:0;position:absolute;overflow:hidden}.F1KBNa_discussionBody{flex-direction:column;flex:auto;min-height:0;padding:0 12px;display:flex;overflow:hidden}.F1KBNa_discussion[data-lost]{border-left-color:var(--dsw-alias-label-secondary);background:repeating-linear-gradient(135deg, var(--dsw-alias-interactive-bg-hover) 0 4px, transparent 4px 8px);background-origin:border-box}.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend,.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:hover:not(:disabled),.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:disabled{background:var(--dsw-alias-label-secondary);border-color:var(--dsw-alias-label-secondary);color:var(--dsw-alias-label-primary-foreground)}.F1KBNa_discussion[data-lost] .F1KBNa_discussionUser{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 30%, transparent)}.F1KBNa_discussionAnswer{color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionUser{box-sizing:border-box;background:var(--dsw-specific-bubble,var(--dsw-alias-bg-layer-2,var(--dsw-alias-interactive-bg-hover)));width:fit-content;max-width:82%;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:8px 0 8px 8px;margin:6.6px 0 6.6px auto;padding:4.4px 11px;font-family:inherit;line-height:22px}.F1KBNa_discussionCode{box-sizing:border-box;font:var(--dsw-font-markdown-code);font-family:var(--ds-font-family-code);background:color-mix(in srgb, var(--dsw-alias-markdown-inline-code,var(--dsw-alias-interactive-bg-hover-solid)) 90%, var(--dsw-alias-label-secondary));border:.5px solid var(--dsw-alias-border-l1);border-radius:6px;align-items:center;padding:0 5px;font-size:.875em;line-height:16px;display:inline-flex}.F1KBNa_discussionBody strong{font-weight:700}.F1KBNa_discussionNote{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionNote[data-diff-discussion-hidden]{color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionDots{margin-left:1px}.F1KBNa_discussionDots>span{animation:1.2s ease-in-out infinite F1KBNa_discussionDot}.F1KBNa_discussionDots>span:nth-child(2){animation-delay:.15s}.F1KBNa_discussionDots>span:nth-child(3){animation-delay:.3s}@keyframes F1KBNa_discussionDot{0%,60%,to{opacity:.25}30%{opacity:1}}.F1KBNa_quoteLines{table-layout:fixed;border-spacing:0;width:calc(100% + 27px);min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block);line-height:var(--dsh-diff-line-height,22px);background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover) 55%, transparent);margin:0 -12px 0 -15px;display:table}.F1KBNa_quoteAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 12%, transparent)}.F1KBNa_quoteDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 13%, transparent)}.F1KBNa_quoteLine{font-size:calc(1em * var(--dsh-diff-font-scale,1));height:var(--dsh-diff-line-height,22px);display:table-row}.F1KBNa_quoteCode{display:table-cell}.F1KBNa_quoteText{white-space:pre-wrap;overflow-wrap:anywhere;display:block}.F1KBNa_quoteNoWrap .F1KBNa_quoteText{white-space:pre;overflow-wrap:normal;overflow:hidden}.F1KBNa_quoteNoWrap .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-diff-quote-width,0px) + 100%);display:inline-block}.F1KBNa_quoteSplit{align-self:stretch;align-items:flex-start;margin:0 -12px;display:flex}.F1KBNa_quoteSplitSide{flex:1 1 0;min-width:0}.F1KBNa_quoteSplitSide+.F1KBNa_quoteSplitSide{border-left:1px solid var(--dsw-alias-border-l2)}.F1KBNa_quoteSplitTable{table-layout:fixed;border-spacing:0;width:100%;display:table}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=left] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-left,0px) + 100%);display:inline-block}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=right] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-right,0px) + 100%);display:inline-block}.F1KBNa_discussionHead{box-sizing:border-box;flex:none;align-items:center;gap:8px;height:22px;padding:0 6px;font-size:12px;line-height:16px;display:flex}.F1KBNa_discussionCompose{box-sizing:border-box;flex:none;align-items:flex-end;gap:8px;height:44px;margin:0 -6px;padding:0 0 6.6px;display:flex}.F1KBNa_discussionSlack{flex:1 1 0;min-height:0;max-height:22px}.F1KBNa_discussionInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);min-width:0;height:26px;color:var(--dsw-alias-label-primary);cursor:text;border-radius:6px;flex:auto;padding:3px 8px;font-family:inherit;line-height:18px}.F1KBNa_discussionToggle{width:18px;height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_discussionToggle:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_discussionRangeWrap{min-width:0;font:var(--dsw-font-markdown-code-block);flex:0 auto;overflow:hidden}.F1KBNa_discussionHead>:not(.F1KBNa_discussionRangeWrap){flex:none}.F1KBNa_discussionHead>.F1KBNa_flexSpacer{flex:1}.F1KBNa_discussionRange{white-space:nowrap;text-overflow:ellipsis;text-align:left;color:var(--dsw-alias-label-tertiary);direction:rtl;font-family:inherit;display:block;overflow:hidden}.F1KBNa_discussionInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_discussionInput::placeholder{font-family:inherit;font-size:inherit;color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionSend{box-sizing:border-box;white-space:nowrap;flex:none;justify-content:center;align-items:center;gap:6px;height:26px;padding-left:9px;padding-right:9px;display:inline-flex}.F1KBNa_rowDiscussed{--diff-row-wash:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);background-image:linear-gradient(var(--diff-row-wash), var(--diff-row-wash))}@keyframes F1KBNa_diffFlashFade{0%{opacity:1}to{opacity:0}}@keyframes F1KBNa_diffFlashShake{0%{opacity:1;transform:translateY(0)}10%{transform:translateY(1px)}20%{transform:translateY(-1px)}30%{transform:translateY(1px)}40%{transform:translateY(-1px)}50%{transform:translateY(1px)}60%{transform:translateY(-1px)}70%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(0)}}.F1KBNa_overviewRuler{pointer-events:none;opacity:.5;width:4px;position:absolute;top:0;bottom:0;right:0}.F1KBNa_overviewRulerSplit{width:var(--dsh-scrollbar-width,8px);bottom:calc(var(--dsh-scrollbar-width,8px) + 1px)}.F1KBNa_overviewMarker{border-radius:2px;width:100%;min-height:2px;position:absolute;right:0}.F1KBNa_markerDel{background-color:var(--dsw-alias-state-error-primary)}.F1KBNa_markerAdd{background-color:var(--dsw-alias-state-success-primary)}.F1KBNa_markerSplitDel{width:50%;left:0;right:auto}.F1KBNa_markerSplitAdd{width:50%;left:auto;right:0}.F1KBNa_lines{border-spacing:0;width:max-content;min-width:100%;font-size:calc(1em * var(--dsh-diff-font-scale,1));display:table}.F1KBNa_line{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);-webkit-user-select:none;user-select:none;display:table-row}.F1KBNa_vSpacer{display:table-row}.F1KBNa_gutter{box-sizing:border-box;text-align:right;width:44px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;cursor:default;padding-right:10px;display:table-cell}.F1KBNa_line>.F1KBNa_gutter{z-index:1;background-color:var(--diff-gutter-surface);background-image:linear-gradient(var(--diff-row-tint,transparent), var(--diff-row-tint,transparent)), linear-gradient(var(--diff-row-wash,transparent), var(--diff-row-wash,transparent));position:sticky;left:0}.F1KBNa_line>.F1KBNa_gutter+.F1KBNa_gutter{left:44px}.F1KBNa_gutter[data-diff-quote-gutter]{background-color:var(--diff-gutter-surface)}.F1KBNa_code{white-space:pre;-webkit-user-select:text;user-select:text;display:table-cell}.F1KBNa_context{color:var(--dsw-alias-label-primary)}.F1KBNa_del{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_add{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_statusBar{box-sizing:border-box;border-top:1px solid var(--dsw-alias-border-l2);height:34px;color:var(--dsw-alias-label-tertiary);font-family:var(--dsw-font-markdown-code-block);font-variant-numeric:tabular-nums;flex:none;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:flex}.F1KBNa_statusAction{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);white-space:nowrap;cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_statusAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langSelect{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;flex:none;align-items:center;gap:4px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_langSelect:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langLabel{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.F1KBNa_presentationSelect{cursor:pointer;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_presentationSelect:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_chip{justify-content:flex-end;align-items:center;gap:5px;min-width:0;padding-right:14px;display:inline-flex}.F1KBNa_chipLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_coverHost{align-items:center;display:inline-flex;position:relative}.F1KBNa_coverCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:12px;align-items:center;gap:4px;padding:6px;display:flex}.F1KBNa_coverPopover{z-index:50;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_coverNotice{z-index:80;pointer-events:none;animation:1.25s ease-out forwards F1KBNa_coverNoticeFade;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_coverNoticeCard{gap:4px;padding:6px 8px}@keyframes F1KBNa_coverNoticeFade{0%,78%{opacity:1}to{opacity:0}}.F1KBNa_coverNoticeGlyph{width:44px;height:44px;color:var(--dsw-alias-label-tertiary);border-radius:10px;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_coverNoticeGlyph[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_coverNoticeGlyph[data-changed]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_coverNoticeText{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.F1KBNa_coverButton{width:32px;height:32px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_coverButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_coverButton[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_presentationHost{align-items:center;display:inline-flex}.F1KBNa_chipPresentation{min-width:36px;height:20px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:20px;flex:none;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_chipPresentation:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_mirrored{transform:scaleX(-1)}.F1KBNa_notice{z-index:60;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:360px;box-shadow:var(--dsw-shadow-lv3);border-radius:10px;align-items:flex-start;gap:12px;padding:12px 14px;display:flex;position:fixed;bottom:24px;right:24px}.F1KBNa_noticeText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);flex:1;margin:0;line-height:1.45}.F1KBNa_noticeButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font:var(--dsw-font-caption);cursor:pointer;border-radius:6px;flex:none;padding:4px 10px}.F1KBNa_noticeButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_wrap .F1KBNa_line{height:auto;min-height:var(--dsh-diff-line-height,22px)}.F1KBNa_subline{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);white-space:pre;display:block;overflow:hidden}.F1KBNa_wrapActive{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_wrapActive:hover{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_splitRoot{isolation:isolate;flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBodySplit{flex:1;min-height:0;overflow-x:hidden}.F1KBNa_splitCols{width:100%;min-width:0;min-height:100%;display:flex}.F1KBNa_splitCol{box-sizing:border-box;flex:1 1 0;min-width:0;overflow:hidden}.F1KBNa_splitDivider{background:var(--dsw-alias-border-l2);flex:0 0 1px}.F1KBNa_splitDiscussions{z-index:3;pointer-events:none;width:100%;height:0;position:absolute;top:0;left:0}.F1KBNa_splitDiscussion{box-sizing:border-box;pointer-events:auto;background:var(--dsw-alias-bg-base);position:absolute;left:0}.F1KBNa_splitSealed,.F1KBNa_splitSealed *{-webkit-user-select:none!important;user-select:none!important}.F1KBNa_splitSealedLeft [data-diff-split-side=left],.F1KBNa_splitSealedLeft [data-diff-split-side=left] *,.F1KBNa_splitSealedRight [data-diff-split-side=right],.F1KBNa_splitSealedRight [data-diff-split-side=right] *{-webkit-user-select:text!important;user-select:text!important}.F1KBNa_splitCol .F1KBNa_gutter,.F1KBNa_splitCol .F1KBNa_code{vertical-align:top}.F1KBNa_splitHScrollRow{border-top:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;width:100%;min-width:0;display:flex}.F1KBNa_splitHScroll{overscroll-behavior-x:none;min-width:0;height:var(--dsh-scrollbar-width,8px);flex:1 1 0;overflow:auto hidden}.F1KBNa_splitHScroll::-webkit-scrollbar{height:var(--dsh-scrollbar-width,8px)}.F1KBNa_splitHScroll::-webkit-scrollbar-track{cursor:default}.F1KBNa_splitHScroll::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_splitHScrollFill{height:1px}.F1KBNa_splitLdel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent)}.F1KBNa_splitRadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent)}.F1KBNa_intraDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);text-decoration:line-through}.F1KBNa_intraAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 32%, transparent)}";
|
|
333
|
+
const css = ".F1KBNa_panelFailure{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);border-radius:8px;align-items:center;gap:8px;padding:8px 10px;font-size:12px;line-height:16px;display:flex}.F1KBNa_panelFailureText{min-width:0}.F1KBNa_panelFailureRetry{border:1px solid var(--dsw-alias-border-l2);color:inherit;font:inherit;cursor:pointer;background:0 0;border-radius:6px;flex:none;margin-left:auto;padding:2px 8px}.F1KBNa_panelFailureRetry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_layer{box-sizing:border-box;flex:none;align-items:center;width:calc(100% + 4px);height:42px;margin:4px -2px;display:flex;position:relative}.F1KBNa_headerEntry{box-sizing:border-box;width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:28px;flex:none;justify-content:center;align-items:center;padding:6px;display:inline-flex;position:relative}.F1KBNa_headerEntry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_headerEntry[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.F1KBNa_headerEntry:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_headerEntryCount{box-sizing:border-box;background:var(--dsw-alias-button-primary-fill);min-width:14px;height:14px;color:var(--dsw-alias-label-primary-foreground);text-align:center;font-variant-numeric:tabular-nums;pointer-events:none;border-radius:7px;padding:0 3px;font-size:10px;line-height:14px;position:absolute;top:-1px;right:-1px}.F1KBNa_headerEntry svg{display:block}.F1KBNa_footerButtons{align-items:center;width:100%;display:flex}.F1KBNa_badge{box-sizing:border-box;width:100%;height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}.F1KBNa_badge:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_badge[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_badge:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_badgeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.F1KBNa_badgeCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;font-size:12px;line-height:16px}.F1KBNa_layer.F1KBNa_rail{width:36px;height:36px;margin:8px 0 10px}.F1KBNa_rail .F1KBNa_badge{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;padding:0}.F1KBNa_rail .F1KBNa_badgeLabel{display:none}.F1KBNa_rail .F1KBNa_badgeCount{box-sizing:border-box;background:var(--dsw-alias-state-business-primary);min-width:18px;height:18px;color:var(--dsw-alias-label-primary-foreground);font-variant-numeric:tabular-nums;border-radius:9px;justify-content:center;align-items:center;padding:0 4px;font-size:11px;line-height:18px;display:flex;position:absolute;top:-3px;right:-7px}.F1KBNa_coverBackdrop{z-index:29;background:var(--dsw-specific-sidebar-fill);position:fixed;inset:0}.F1KBNa_panel,.F1KBNa_diffPreview{--diff-gutter-surface:var(--dsw-alias-bg-base)}.F1KBNa_panel{z-index:30;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:auto;max-width:none;box-shadow:var(--dsw-shadow-lv2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);-webkit-user-select:none;user-select:none;border-radius:12px;flex-direction:column;display:flex;position:fixed;inset:8px 8px 128px;overflow:hidden}.F1KBNa_panel .F1KBNa_code,.F1KBNa_panel .F1KBNa_mdPreviewBody,.F1KBNa_panel .F1KBNa_diffPath,.F1KBNa_panel input,.F1KBNa_panel textarea,.F1KBNa_panel [contenteditable]{-webkit-user-select:text;user-select:text}.F1KBNa_panelDocked{width:100%;max-width:none;height:100%;box-shadow:none;border:none;border-radius:0;position:static;inset:auto}.F1KBNa_dockHost{flex-direction:column;min-height:0;display:flex;position:absolute;inset:0}.F1KBNa_header{box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:10px 12px;display:flex}.F1KBNa_headerActions{align-items:center;gap:2px;display:flex}.F1KBNa_settingsPage{padding:8px 12px}.F1KBNa_settingsGroup{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupHeader{z-index:3;background:var(--dsw-alias-bg-base);width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;border:none;align-items:center;gap:8px;padding:16px 0;display:flex;position:sticky;top:0}.F1KBNa_settingsGroupText{text-align:left;flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.F1KBNa_settingsGroupTitle{font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsGroupDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsGroupChevron{margin-left:auto;transition:transform .15s}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupChevron{transform:rotate(180deg)}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupHeader{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupBody{flex-direction:column;display:flex}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow{padding-left:16px}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow:last-child,.F1KBNa_settingsPage>.F1KBNa_settingsRow:last-child{border-bottom:none}.F1KBNa_settingsRow{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.F1KBNa_settingsRowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.F1KBNa_settingsRowTitle{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsRowDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsRowLink{color:inherit;cursor:pointer;text-decoration:none}.F1KBNa_settingsRowLink:hover{color:var(--dsw-alias-label-secondary);text-underline-offset:2px;text-decoration:underline}.F1KBNa_settingsSelector{background:var(--dsw-alias-bg-module-platform);min-width:72px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;justify-content:center;align-items:center;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.F1KBNa_settingsSelector:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_settingsSelector[data-recording]{box-shadow:inset 0 0 0 1px var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-secondary)}.F1KBNa_settingsSelectorChevron{flex:none}.F1KBNa_settingsReset{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;margin-left:6px;padding:0;display:inline-flex}.F1KBNa_settingsReset:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_settingsReset:disabled{opacity:.4;cursor:default}.F1KBNa_colorPicker{position:relative}.F1KBNa_colorPickerTrigger{background:var(--dsw-alias-bg-module-platform);width:120px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_colorPickerTrigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_colorSwatch{border:1px solid var(--dsw-alias-border-l2);border-radius:50%;flex:none;width:24px;height:24px}.F1KBNa_colorValue{text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;flex:1;min-width:0;overflow:hidden}.F1KBNa_colorPickerChevron{flex:none}.F1KBNa_colorBackdrop{z-index:40;position:fixed;inset:0}.F1KBNa_colorPickerPopover{z-index:41;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:10px;padding:10px;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_colorPickerPanel{flex-direction:column;gap:8px;display:flex}.F1KBNa_colorPickerInputRow{align-items:center;gap:8px;display:flex}.F1KBNa_colorPickerPreview{border:1px solid var(--dsw-alias-border-l2);border-radius:6px;flex:none;width:22px;height:22px}.F1KBNa_colorPickerInput{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-module-platform);min-width:0;height:30px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;flex:1;padding:0 8px;font-size:12px;line-height:28px}.F1KBNa_colorPickerInput:focus{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-1px}.F1KBNa_colorSv{border:1px solid var(--dsw-alias-border-l1);cursor:crosshair;touch-action:none;border-radius:8px;height:140px;position:relative}.F1KBNa_colorSvCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:14px;height:14px;position:absolute;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_colorHue{border:1px solid var(--dsw-alias-border-l1);cursor:pointer;touch-action:none;border-radius:7px;height:14px;position:relative}.F1KBNa_colorHueCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:16px;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_diffPreview{top:var(--settings-header-h,76px);z-index:2;border:1px solid var(--dsw-alias-border-l1);font:var(--dsw-font-markdown-code-block);background:var(--dsw-alias-markdown-code-block);border-radius:8px;margin:16px 0 8px;padding:8px;position:sticky;overflow:hidden}.F1KBNa_diffPreviewTitle{color:var(--dsw-alias-label-tertiary);margin-bottom:6px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_diffPreviewScroll{height:132px;overflow-y:auto}.F1KBNa_mdPreviewWrap{isolation:isolate;flex:1;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_mdPreviewBody{overscroll-behavior:none;min-width:0;min-height:0;color:var(--dsw-alias-label-primary);flex:1;padding:12px 16px;position:relative;overflow:auto}.F1KBNa_mdPreviewContent{width:100%;min-width:0;margin:0 auto}.F1KBNa_mdPreviewSingle{display:block}.F1KBNa_mdPreviewDouble{display:flex}.F1KBNa_mdPreviewBody .mdBlock{border-radius:4px;margin-bottom:12px;padding:2px 6px}.F1KBNa_mdPreviewBody .mdAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 10%, transparent)}.F1KBNa_mdPreviewBody .mdDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 12%, transparent)}.F1KBNa_mdPreviewBody .mdWordDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdWordAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdDouble{flex-direction:column;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleRow{align-items:flex-start;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleCol{flex:1;min-width:0}.F1KBNa_mdPreviewBody .mdDoubleRule{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:0 12px}.F1KBNa_mdPreviewFallback{font-family:var(--dsw-font-markdown-code-block);color:var(--dsw-alias-label-tertiary);padding:12px 16px;font-size:12px;line-height:18px}.F1KBNa_mdPreviewBody{word-break:break-word;font-size:13px;line-height:20px}.F1KBNa_mdPreviewBody>:first-child{margin-top:0}.F1KBNa_mdPreviewBody>:last-child{margin-bottom:0}.F1KBNa_mdPreviewBody h1,.F1KBNa_mdPreviewBody h2,.F1KBNa_mdPreviewBody h3,.F1KBNa_mdPreviewBody h4,.F1KBNa_mdPreviewBody h5,.F1KBNa_mdPreviewBody h6{margin:16px 0 8px;font-weight:600;line-height:1.3}.F1KBNa_mdPreviewBody h1{font-size:22px}.F1KBNa_mdPreviewBody h2{font-size:19px}.F1KBNa_mdPreviewBody h3{font-size:16px}.F1KBNa_mdPreviewBody h4{font-size:15px}.F1KBNa_mdPreviewBody h5{font-size:14px}.F1KBNa_mdPreviewBody h6{font-size:13px}.F1KBNa_mdPreviewBody p{margin:8px 0}.F1KBNa_mdPreviewBody ul,.F1KBNa_mdPreviewBody ol{margin:8px 0;padding-left:22px}.F1KBNa_mdPreviewBody li{margin:2px 0}.F1KBNa_mdPreviewBody a{color:var(--dsw-alias-state-business-primary);text-decoration:none}.F1KBNa_mdPreviewBody a:hover{text-decoration:underline}.F1KBNa_mdPreviewBody code{font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:4px;padding:1px 5px;font-size:12.5px}.F1KBNa_mdPreviewBody pre{overscroll-behavior-x:none;border:1px solid var(--dsw-alias-border-l1);font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:8px;margin:8px 0;padding:10px 12px;font-size:12.5px;line-height:18px;overflow:auto}.F1KBNa_mdPreviewBody pre code{background:0 0;padding:0}.F1KBNa_mdPreviewBody blockquote{border-left:3px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);margin:8px 0;padding:0 12px}.F1KBNa_mdPreviewBody hr{background:var(--dsw-alias-border-l1);border:none;height:1px;margin:16px 0}.F1KBNa_mdPreviewBody table{border-collapse:collapse;margin:8px 0}.F1KBNa_mdPreviewBody th,.F1KBNa_mdPreviewBody td{border:1px solid var(--dsw-alias-border-l1);padding:4px 10px}.F1KBNa_mdPreviewBody img{max-width:100%}.F1KBNa_mdPreviewBody .mdImageFallback{border:1px dashed var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-markdown-code-block) 45%, transparent);width:100%;min-height:120px;color:var(--dsw-alias-label-secondary);font-family:var(--dsw-font-markdown-code-block);text-align:center;white-space:pre-wrap;word-break:break-all;border-radius:4px;justify-content:center;align-items:center;margin:0 auto;padding:8px 12px;font-size:12px;line-height:16px;display:flex}.F1KBNa_toggle{border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:18px;flex:none;width:60px;height:36px;padding:0;position:relative}.F1KBNa_toggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_toggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.F1KBNa_toggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleOn:hover{background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleThumb{background:var(--dsw-alias-label-primary);border-radius:50%;width:28px;height:28px;transition:left .12s;position:absolute;top:3px;left:3px}.F1KBNa_toggleOn .F1KBNa_toggleThumb{background:#fff;left:27px}.F1KBNa_stepper{align-items:center;gap:6px;display:inline-flex}.F1KBNa_stepperButton{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);width:32px;height:32px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;padding:0;position:relative}.F1KBNa_stepperButton:before,.F1KBNa_stepperButton:after{content:\"\";background:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_stepperButton:before{width:10px;height:1px}.F1KBNa_stepperButton:after{width:1px;height:10px;display:none}.F1KBNa_stepperButtonUp:after{display:block}.F1KBNa_stepperButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_stepperButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_stepperValue{text-align:center;min-width:2ch;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:14px;line-height:22px}.F1KBNa_states{flex-direction:column;flex:1;min-height:0;padding:4px 12px 12px;display:flex;overflow-y:auto}.F1KBNa_split{flex:1;align-items:stretch;min-height:0;display:flex;position:relative}.F1KBNa_fileListKnob{z-index:39;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;box-shadow:var(--dsw-elevation-prominent);border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute}.F1KBNa_fileListKnob[data-open]{box-shadow:none;opacity:0}.F1KBNa_fileListKnob:not([data-open]){animation:.32s ease-in-out .5s both F1KBNa_fileListKnobIn}@keyframes F1KBNa_fileListKnobIn{0%{opacity:0}to{opacity:1}}.F1KBNa_fileListKnob:hover,.F1KBNa_fileListKnob:focus-visible{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-interactive-bg-hover), var(--dsw-alias-interactive-bg-hover))}.F1KBNa_fileListFloat{z-index:40;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);box-shadow:none;transform-origin:0 0;border-radius:12px;flex-direction:column;padding:6px 0 10px 8px;display:flex;position:absolute;overflow:hidden}.F1KBNa_fileListFloatClosing{pointer-events:none;animation:.14s ease-in forwards F1KBNa_fileListShrink}@keyframes F1KBNa_fileListShrink{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.96)}}.F1KBNa_fileList{box-sizing:border-box;border-right:1px solid var(--dsw-alias-border-l2);flex-direction:column;flex:none;width:260px;min-height:0;padding:4px 0 12px 8px;display:flex}.F1KBNa_listScroll{scrollbar-gutter:stable;flex:1;min-height:0;padding-right:2px;overflow-y:scroll}.F1KBNa_fileListFloat .F1KBNa_listScroll{margin-right:2px}.F1KBNa_bulkActions{flex:none;gap:6px;padding:8px 8px 0 0;display:flex}.F1KBNa_bulkActions .F1KBNa_action{text-align:center;flex:auto}.F1KBNa_bulkActions .F1KBNa_action:disabled{opacity:.4;cursor:default}.F1KBNa_addPath{justify-content:center;align-items:center;gap:4px;display:inline-flex}.F1KBNa_resizeHandle{cursor:col-resize;touch-action:none;background:0 0;flex:none;width:5px;margin:0 -2px}.F1KBNa_resizeHandle:hover{background:var(--dsw-alias-border-l2)}.F1KBNa_floatResizeHandle{z-index:41;cursor:col-resize;-webkit-user-select:none;user-select:none;touch-action:none;background:0 0;border-radius:4px;position:absolute}.F1KBNa_floatResizeHandle:hover{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-border-l2), var(--dsw-alias-border-l2))}.F1KBNa_detail{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.F1KBNa_detailEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;flex:1;justify-content:center;align-items:center;margin:0;padding:24px;font-size:12px;line-height:18px;display:flex}.F1KBNa_confirmBackdrop{z-index:55;background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);justify-content:center;align-items:center;padding:24px;display:flex;position:absolute;inset:0}.F1KBNa_confirmBackdropFixed{z-index:60;position:fixed}.F1KBNa_confirmCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:340px;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:12px;padding:16px;display:flex}.F1KBNa_confirmTitle{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;flex:none;margin:0;font-size:13px;font-weight:500;line-height:20px}.F1KBNa_confirmText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;margin:0;line-height:1.5}.F1KBNa_confirmBlock{flex-direction:column;gap:6px;min-width:0;display:flex}.F1KBNa_confirmList{overscroll-behavior:contain;scrollbar-gutter:stable;background:var(--dsw-alias-bg-module-platform);max-height:104px;font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;border-radius:6px;margin:0;padding:0 6px;font-size:11px;line-height:16px;list-style:none;overflow-y:auto}.F1KBNa_confirmActions{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;display:flex}.F1KBNa_pickerCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:420px;max-width:100%;height:70%;max-height:100%;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:8px;padding:14px 16px 16px;display:flex;position:relative;overflow:hidden}.F1KBNa_pickerTitle{color:var(--dsw-alias-label-primary);flex:none;font-size:13px;font-weight:500;line-height:20px}.F1KBNa_pickerClose{width:22px;height:22px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;top:10px;right:10px}.F1KBNa_pickerClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_pickerForm{flex:none;gap:8px;display:flex}.F1KBNa_pickerInput{border:1px solid var(--dsw-alias-border-l1);min-width:0;color:var(--dsw-alias-label-primary);background:0 0;border-radius:8px;flex:auto;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_pickerInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_tree{scrollbar-gutter:stable;border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex:auto;min-height:0;padding:4px 2px 4px 4px;overflow:auto scroll}.F1KBNa_treeRow{border-radius:6px;align-items:center;gap:2px;padding-right:4px;display:flex}.F1KBNa_treeRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_treeRow[data-selected]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)}.F1KBNa_treeCaret{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_treeCaret:hover{color:var(--dsw-alias-label-primary)}.F1KBNa_treeName{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:auto;align-items:center;gap:6px;padding:2px 4px;font-family:inherit;font-size:12px;line-height:18px;display:flex}.F1KBNa_treeName:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_treeNote{color:var(--dsw-alias-label-tertiary);margin:2px 0;font-size:12px;line-height:18px}.F1KBNa_pickerIcon{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_pickerName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_pickerNote{color:var(--dsw-alias-label-tertiary);flex:none;margin:0;font-size:12px;line-height:18px}.F1KBNa_pickerCheck{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;margin-right:auto;font-size:12px;line-height:18px;display:flex}.F1KBNa_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}.F1KBNa_note,.F1KBNa_readError{color:var(--dsw-alias-label-tertiary);margin:4px 0;font-size:12px;line-height:18px}.F1KBNa_noteCentered{text-align:center;margin:auto}.F1KBNa_emptyState{flex-direction:column;align-items:center;gap:10px;margin:auto;display:flex}.F1KBNa_importButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:5px 14px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_importButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_importButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_importNote{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;font-size:12px;line-height:18px}.F1KBNa_readError{color:var(--dsw-alias-state-error-primary)}.F1KBNa_action.F1KBNa_addButton{box-sizing:border-box;border-radius:6px;flex:none;justify-content:center;align-items:center;width:20px;height:20px;min-height:0;padding:0;display:inline-flex}.F1KBNa_listHead{flex:none;align-items:center;gap:4px;margin:8px 1px 2px;padding-right:8px;display:flex}.F1KBNa_action.F1KBNa_addButton.F1KBNa_listFold{width:26px;height:26px}.F1KBNa_listTitle{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_listTabs{background:var(--dsw-alias-interactive-bg-hover);border-radius:8px;flex:auto;gap:2px;min-width:0;padding:2px;display:flex}.F1KBNa_listTab{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:6px;padding:3px 8px;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_tabCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}.F1KBNa_listTab[aria-selected=true]{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.F1KBNa_commentGroup{margin:0 0 6px}.F1KBNa_commentGroup:last-child{margin-bottom:0}.F1KBNa_commentGroupName{color:var(--dsw-alias-label-tertiary);margin:0;padding:4px 13px 2px;font-size:11px;font-weight:500;line-height:16px}.F1KBNa_commentRow{box-sizing:border-box;width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;padding:6px 8px;display:block;position:relative}.F1KBNa_commentRow:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_commentRow[data-selected]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_commentHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.F1KBNa_commentLabel{white-space:nowrap;text-align:right;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;font-size:12px;line-height:18px}.F1KBNa_commentTitle{-webkit-line-clamp:3;text-overflow:ellipsis;overflow-wrap:anywhere;text-align:left;min-width:0;color:var(--dsw-alias-label-primary);-webkit-box-orient:vertical;flex:1;margin-left:4px;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.F1KBNa_commentTitleEmpty{color:var(--dsw-alias-label-tertiary)}.F1KBNa_listEmpty{color:var(--dsw-alias-label-tertiary);margin:8px 12px;font-size:12px;line-height:18px}.F1KBNa_emptyActions{flex-wrap:wrap;justify-content:center;gap:8px;display:flex}.F1KBNa_rows{margin:0;padding:0;list-style:none}.F1KBNa_row{border:1px solid #0000;border-radius:10px;margin:2px 0}.F1KBNa_rowMenuAnchor{display:none}.F1KBNa_rowHead{width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;align-items:center;gap:8px;padding:6px 8px;display:flex;position:relative}.F1KBNa_rowHead:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_rowHead[data-selected],.F1KBNa_rowHead[data-picked]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_rowPath{text-overflow:ellipsis;white-space:nowrap;min-width:0;margin-left:4px;font-size:12px;line-height:18px;overflow:hidden}.F1KBNa_unseenDot{flex:none;align-self:center;position:absolute;top:50%;left:5px;overflow:visible;transform:translateY(-50%)}.F1KBNa_categoryDot{pointer-events:none;-webkit-user-select:none;user-select:none;border-radius:50%;width:3px;height:3px;position:absolute;top:13.5px;left:5px}.F1KBNa_rowFailed{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_actionError{border-bottom:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere;margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_rowMeta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;gap:6px;margin-left:auto;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_addCount{color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_delCount{color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_diff{background:var(--dsw-alias-markdown-code-block);flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffHeader{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_panelDocked .F1KBNa_diffHeader{background:var(--dsw-alias-bg-base)}.F1KBNa_diffPath{appearance:none;min-width:0;font:inherit;text-overflow:ellipsis;color:var(--dsw-alias-label-primary);background:0 0;border:0;flex:1;margin-left:4px;padding:0;font-size:12px;line-height:18px;position:relative;top:1px}.F1KBNa_diffPath:focus{outline:none}.F1KBNa_diffActions{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffActionInfo{flex:auto;align-items:center;gap:8px;min-width:0;display:flex;overflow:hidden}.F1KBNa_diffActionDecisions{flex:none;align-items:center;gap:8px;display:flex}.F1KBNa_diffStats{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:16px}.F1KBNa_flexSpacer{flex:1}.F1KBNa_gotoLayer{z-index:30;place-items:center;display:grid;position:absolute;inset:0}.F1KBNa_gotoLayerRight{left:50%;right:var(--dsh-scrollbar-width,8px);bottom:calc(var(--dsh-scrollbar-width,8px) + 1px)}.F1KBNa_gotoBackdrop{z-index:29;position:fixed;inset:0}.F1KBNa_gotoBox{z-index:1;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;flex-direction:column;align-items:stretch;gap:4px;padding:4px;display:flex;position:relative}.F1KBNa_gotoRow{align-items:center;gap:4px;display:flex}.F1KBNa_gotoInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:9em;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;flex:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_gotoInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_gotoAction{white-space:nowrap;flex:none}.F1KBNa_divider{background:var(--dsw-alias-border-l1);align-self:stretch;width:1px;margin:2px 0}.F1KBNa_action{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;white-space:nowrap;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;text-decoration:none}.F1KBNa_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_action:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_actionChord{color:var(--dsw-alias-label-tertiary);margin-left:6px;font-size:11px}.F1KBNa_actionPrimary{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_actionPrimary:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_actionPrimary:disabled{background:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:.55}.F1KBNa_actionQuietDisabled:disabled{cursor:pointer;color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l1);background:0 0}.F1KBNa_actionPrimary.F1KBNa_actionQuietDisabled:disabled{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:1}.F1KBNa_iconAction{justify-content:center;align-items:center;min-height:25px;padding:4px 6px;display:inline-flex}.F1KBNa_close{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_expand{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_expand:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_diffBodyWrap{isolation:isolate;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBody{overscroll-behavior:none;min-width:0;font:var(--dsw-font-markdown-code-block);-webkit-text-size-adjust:100%;text-size-adjust:100%;cursor:text;outline:none;flex:1;padding:0;position:relative;overflow:auto}.F1KBNa_diffBody::-webkit-scrollbar,.F1KBNa_diffBody::-webkit-scrollbar-track,.F1KBNa_diffBody::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_blockActions{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);z-index:2;border-radius:10px;align-items:center;gap:9px;padding:5px;display:flex;position:absolute;right:8px}.F1KBNa_blockActions[data-diff-selection-actions]{pointer-events:none}.F1KBNa_blockActions[data-diff-selection-actions] button{pointer-events:auto}.F1KBNa_blockActions[data-diff-frame-drag],.F1KBNa_blockActions[data-diff-frame-drag] button{pointer-events:none}.F1KBNa_blockActionsDivider{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:2px 0}.F1KBNa_blockPosition{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;margin-top:1px;margin-left:7px;font-size:12px;line-height:16px}.F1KBNa_searchBar{z-index:3;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;align-items:center;gap:4px;padding:4px;display:flex;position:absolute;top:8px;right:8px}.F1KBNa_searchInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:150px;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_searchInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchCount{text-align:center;min-width:34px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:16px}.F1KBNa_searchToggle{border:1px solid var(--dsw-alias-border-l1);min-height:25px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;justify-content:center;align-items:center;padding:4px 6px;display:inline-flex}.F1KBNa_searchToggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_searchToggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchMatch{color:inherit;background-color:#facc1542;border-radius:2px}.F1KBNa_searchMatchCurrent{color:inherit;background-color:#facc1599;border-radius:2px}.F1KBNa_blockFlash{z-index:3;box-sizing:border-box;border:2px solid var(--dsw-alias-state-business-primary);pointer-events:none;border-radius:4px;animation:1s ease-out forwards F1KBNa_diffFlashFade;position:absolute;left:0;right:0}.F1KBNa_blockFlashShake{animation:.7s ease-out forwards F1KBNa_diffFlashShake}.F1KBNa_discussionRow{background:var(--dsw-alias-bg-base);display:table-row}.F1KBNa_discussionCell{display:table-cell}.F1KBNa_discussionPin{z-index:2;width:0;height:0;position:sticky;left:0}.F1KBNa_discussion{z-index:2;box-sizing:border-box;border-left:3px solid var(--dsw-alias-state-business-primary);box-shadow:inset 0 1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset 0 -1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset -1px 0 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent);cursor:default;background:0 0;flex-direction:column;display:flex;position:absolute;top:0;left:0;overflow:hidden}.F1KBNa_discussionHead{font:var(--dsw-font-markdown-code-block)}.F1KBNa_discussionHead .F1KBNa_unseenDot{vertical-align:middle;flex:none;align-self:center;margin-right:6px;display:inline-block;position:static;transform:none}.F1KBNa_discussionBody,.F1KBNa_threadFontProbe{font:var(--dsw-font-markdown-base);font-size:calc(var(--dsh-content-font-size,14px) - 2px)}.F1KBNa_threadFontProbe{visibility:hidden;pointer-events:none;width:0;height:0;position:absolute;overflow:hidden}.F1KBNa_discussionBody{flex-direction:column;flex:auto;min-height:0;padding:0 12px;display:flex;overflow:hidden}.F1KBNa_discussion[data-lost]{border-left-color:var(--dsw-alias-label-secondary);background:repeating-linear-gradient(135deg, var(--dsw-alias-interactive-bg-hover) 0 4px, transparent 4px 8px);background-origin:border-box}.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend,.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:hover:not(:disabled),.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:disabled{background:var(--dsw-alias-label-secondary);border-color:var(--dsw-alias-label-secondary);color:var(--dsw-alias-label-primary-foreground)}.F1KBNa_discussion[data-lost] .F1KBNa_discussionUser{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 30%, transparent)}.F1KBNa_discussionAnswer{color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionUser{box-sizing:border-box;background:var(--dsw-specific-bubble,var(--dsw-alias-bg-layer-2,var(--dsw-alias-interactive-bg-hover)));width:fit-content;max-width:82%;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:8px 0 8px 8px;margin:6.6px 0 6.6px auto;padding:4.4px 11px;font-family:inherit;line-height:22px}.F1KBNa_discussionCode{box-sizing:border-box;font:var(--dsw-font-markdown-code);font-family:var(--ds-font-family-code);background:color-mix(in srgb, var(--dsw-alias-markdown-inline-code,var(--dsw-alias-interactive-bg-hover-solid)) 90%, var(--dsw-alias-label-secondary));border:.5px solid var(--dsw-alias-border-l1);border-radius:6px;align-items:center;padding:0 5px;font-size:.875em;line-height:16px;display:inline-flex}.F1KBNa_discussionBody strong{font-weight:700}.F1KBNa_discussionNote{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionNote[data-diff-discussion-hidden]{color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionDots{margin-left:1px}.F1KBNa_discussionDots>span{animation:1.2s ease-in-out infinite F1KBNa_discussionDot}.F1KBNa_discussionDots>span:nth-child(2){animation-delay:.15s}.F1KBNa_discussionDots>span:nth-child(3){animation-delay:.3s}@keyframes F1KBNa_discussionDot{0%,60%,to{opacity:.25}30%{opacity:1}}.F1KBNa_quoteLines{table-layout:fixed;border-spacing:0;width:calc(100% + 27px);min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block);line-height:var(--dsh-diff-line-height,22px);background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover) 55%, transparent);margin:0 -12px 0 -15px;display:table}.F1KBNa_quoteAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 12%, transparent)}.F1KBNa_quoteDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 13%, transparent)}.F1KBNa_quoteLine{font-size:calc(1em * var(--dsh-diff-font-scale,1));height:var(--dsh-diff-line-height,22px);display:table-row}.F1KBNa_quoteCode{display:table-cell}.F1KBNa_quoteText{white-space:pre-wrap;overflow-wrap:anywhere;display:block}.F1KBNa_quoteNoWrap .F1KBNa_quoteText{white-space:pre;overflow-wrap:normal;overflow:hidden}.F1KBNa_quoteNoWrap .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-diff-quote-width,0px) + 100%);display:inline-block}.F1KBNa_quoteSplit{align-self:stretch;align-items:flex-start;margin:0 -12px;display:flex}.F1KBNa_quoteSplitSide{flex:1 1 0;min-width:0}.F1KBNa_quoteSplitSide+.F1KBNa_quoteSplitSide{border-left:1px solid var(--dsw-alias-border-l2)}.F1KBNa_quoteSplitTable{table-layout:fixed;border-spacing:0;width:100%;display:table}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=left] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-left,0px) + 100%);display:inline-block}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=right] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-right,0px) + 100%);display:inline-block}.F1KBNa_discussionHead{box-sizing:border-box;flex:none;align-items:center;gap:8px;height:22px;padding:0 6px;font-size:12px;line-height:16px;display:flex}.F1KBNa_discussionCompose{box-sizing:border-box;flex:none;align-items:flex-end;gap:8px;height:44px;margin:0 -6px;padding:0 0 6.6px;display:flex}.F1KBNa_discussionSlack{flex:1 1 0;min-height:0;max-height:22px}.F1KBNa_discussionInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);min-width:0;height:26px;color:var(--dsw-alias-label-primary);cursor:text;border-radius:6px;flex:auto;padding:3px 8px;font-family:inherit;line-height:18px}.F1KBNa_discussionToggle{width:18px;height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_discussionToggle:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_discussionRangeWrap{min-width:0;font:var(--dsw-font-markdown-code-block);flex:0 auto;overflow:hidden}.F1KBNa_discussionHead>:not(.F1KBNa_discussionRangeWrap){flex:none}.F1KBNa_discussionHead>.F1KBNa_flexSpacer{flex:1}.F1KBNa_discussionRange{white-space:nowrap;text-overflow:ellipsis;text-align:left;color:var(--dsw-alias-label-tertiary);direction:rtl;font-family:inherit;display:block;overflow:hidden}.F1KBNa_discussionInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_discussionInput::placeholder{font-family:inherit;font-size:inherit;color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionSend{box-sizing:border-box;white-space:nowrap;flex:none;justify-content:center;align-items:center;gap:6px;height:26px;padding-left:9px;padding-right:9px;display:inline-flex}.F1KBNa_rowDiscussed{--diff-row-wash:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);background-image:linear-gradient(var(--diff-row-wash), var(--diff-row-wash))}@keyframes F1KBNa_diffFlashFade{0%{opacity:1}to{opacity:0}}@keyframes F1KBNa_diffFlashShake{0%{opacity:1;transform:translateY(0)}10%{transform:translateY(1px)}20%{transform:translateY(-1px)}30%{transform:translateY(1px)}40%{transform:translateY(-1px)}50%{transform:translateY(1px)}60%{transform:translateY(-1px)}70%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(0)}}.F1KBNa_overviewRuler{pointer-events:none;opacity:.5;width:4px;position:absolute;top:0;bottom:0;right:0}.F1KBNa_overviewRulerSplit{width:var(--dsh-scrollbar-width,8px);bottom:calc(var(--dsh-scrollbar-width,8px) + 1px)}.F1KBNa_overviewMarker{border-radius:2px;width:100%;min-height:2px;position:absolute;right:0}.F1KBNa_markerDel{background-color:var(--dsw-alias-state-error-primary)}.F1KBNa_markerAdd{background-color:var(--dsw-alias-state-success-primary)}.F1KBNa_markerSplitDel{width:50%;left:0;right:auto}.F1KBNa_markerSplitAdd{width:50%;left:auto;right:0}.F1KBNa_lines{border-spacing:0;width:max-content;min-width:100%;font-size:calc(1em * var(--dsh-diff-font-scale,1));display:table}.F1KBNa_line{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);-webkit-user-select:none;user-select:none;display:table-row}.F1KBNa_vSpacer{display:table-row}.F1KBNa_gutter{box-sizing:border-box;text-align:right;width:44px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;cursor:default;padding-right:10px;display:table-cell}.F1KBNa_line>.F1KBNa_gutter{z-index:1;background-color:var(--diff-gutter-surface);background-image:linear-gradient(var(--diff-row-tint,transparent), var(--diff-row-tint,transparent)), linear-gradient(var(--diff-row-wash,transparent), var(--diff-row-wash,transparent));position:sticky;left:0}.F1KBNa_line>.F1KBNa_gutter+.F1KBNa_gutter{left:44px}.F1KBNa_gutter[data-diff-quote-gutter]{background-color:var(--diff-gutter-surface)}.F1KBNa_code{white-space:pre;-webkit-user-select:text;user-select:text;display:table-cell}.F1KBNa_context{color:var(--dsw-alias-label-primary)}.F1KBNa_del{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_add{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_statusBar{box-sizing:border-box;border-top:1px solid var(--dsw-alias-border-l2);height:34px;color:var(--dsw-alias-label-tertiary);font-family:var(--dsw-font-markdown-code-block);font-variant-numeric:tabular-nums;flex:none;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:flex}.F1KBNa_statusAction{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);white-space:nowrap;cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_statusAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langSelect{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;flex:none;align-items:center;gap:4px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_langSelect:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langLabel{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.F1KBNa_presentationSelect{cursor:pointer;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_presentationSelect:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_chip{justify-content:flex-end;align-items:center;gap:5px;min-width:0;padding-right:14px;display:inline-flex}.F1KBNa_chipLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_coverHost{align-items:center;display:inline-flex;position:relative}.F1KBNa_coverCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:12px;align-items:center;gap:4px;padding:6px;display:flex}.F1KBNa_coverPopover{z-index:50;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_coverNotice{z-index:80;pointer-events:none;animation:1.25s ease-out forwards F1KBNa_coverNoticeFade;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_coverNoticeCard{gap:4px;padding:6px 8px}@keyframes F1KBNa_coverNoticeFade{0%,78%{opacity:1}to{opacity:0}}.F1KBNa_coverNoticeGlyph{width:44px;height:44px;color:var(--dsw-alias-label-tertiary);border-radius:10px;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_coverNoticeGlyph[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_coverNoticeGlyph[data-changed]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_coverNoticeText{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.F1KBNa_coverButton{width:32px;height:32px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_coverButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_coverButton[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_presentationHost{align-items:center;display:inline-flex}.F1KBNa_chipPresentation{min-width:36px;height:20px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:20px;flex:none;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_chipPresentation:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_mirrored{transform:scaleX(-1)}.F1KBNa_notice{z-index:60;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:360px;box-shadow:var(--dsw-shadow-lv3);border-radius:10px;align-items:flex-start;gap:12px;padding:12px 14px;display:flex;position:fixed;bottom:24px;right:24px}.F1KBNa_noticeText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);flex:1;margin:0;line-height:1.45}.F1KBNa_noticeButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font:var(--dsw-font-caption);cursor:pointer;border-radius:6px;flex:none;padding:4px 10px}.F1KBNa_noticeButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_wrap .F1KBNa_line{height:auto;min-height:var(--dsh-diff-line-height,22px)}.F1KBNa_subline{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);white-space:pre;display:block;overflow:hidden}.F1KBNa_wrapActive{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_wrapActive:hover{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_splitRoot{isolation:isolate;flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBodySplit{flex:1;min-height:0;overflow-x:hidden}.F1KBNa_splitCols{width:100%;min-width:0;min-height:100%;display:flex}.F1KBNa_splitCol{box-sizing:border-box;flex:1 1 0;min-width:0;overflow:hidden}.F1KBNa_splitDivider{background:var(--dsw-alias-border-l2);flex:0 0 1px}.F1KBNa_splitDiscussions{z-index:3;pointer-events:none;width:100%;height:0;position:absolute;top:0;left:0}.F1KBNa_splitDiscussion{box-sizing:border-box;pointer-events:auto;background:var(--dsw-alias-bg-base);position:absolute;left:0}.F1KBNa_splitSealed,.F1KBNa_splitSealed *{-webkit-user-select:none!important;user-select:none!important}.F1KBNa_splitSealedLeft [data-diff-split-side=left],.F1KBNa_splitSealedLeft [data-diff-split-side=left] *,.F1KBNa_splitSealedRight [data-diff-split-side=right],.F1KBNa_splitSealedRight [data-diff-split-side=right] *{-webkit-user-select:text!important;user-select:text!important}.F1KBNa_splitCol .F1KBNa_gutter,.F1KBNa_splitCol .F1KBNa_code{vertical-align:top}.F1KBNa_splitHScrollRow{border-top:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;width:100%;min-width:0;display:flex}.F1KBNa_splitHScroll{overscroll-behavior-x:none;min-width:0;height:var(--dsh-scrollbar-width,8px);flex:1 1 0;overflow:auto hidden}.F1KBNa_splitHScroll::-webkit-scrollbar{height:var(--dsh-scrollbar-width,8px)}.F1KBNa_splitHScroll::-webkit-scrollbar-track{cursor:default}.F1KBNa_splitHScroll::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_splitHScrollFill{height:1px}.F1KBNa_splitLdel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent)}.F1KBNa_splitRadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent)}.F1KBNa_intraDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);text-decoration:line-through}.F1KBNa_intraAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 32%, transparent)}";
|
|
334
334
|
const tagId = "dsh-diff-approval/PendingPanel.module.css";
|
|
335
335
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
336
336
|
const tag = document.createElement("style");
|
|
@@ -2700,6 +2700,60 @@ window.__ModuleLoader__.load({
|
|
|
2700
2700
|
});
|
|
2701
2701
|
return blocks;
|
|
2702
2702
|
}
|
|
2703
|
+
/** The maximal run of non-context rows around `index` — the change region it belongs to. */
|
|
2704
|
+
function changeRunOf(rows, index) {
|
|
2705
|
+
let start = index;
|
|
2706
|
+
while (start > 0 && rows[start - 1] !== void 0 && rows[start - 1].kind !== "context") start--;
|
|
2707
|
+
let end = index;
|
|
2708
|
+
while (end + 1 < rows.length && rows[end + 1] !== void 0 && rows[end + 1].kind !== "context") end++;
|
|
2709
|
+
return {
|
|
2710
|
+
start,
|
|
2711
|
+
end
|
|
2712
|
+
};
|
|
2713
|
+
}
|
|
2714
|
+
/**
|
|
2715
|
+
* The change region a row range sits in, widened to whole runs: from the first row of the run `start`
|
|
2716
|
+
* belongs to, to the last row of the run `end` belongs to. A row range that names one side of a change —
|
|
2717
|
+
* one line of a replacement, or the additions alone — grows to cover that change's removals as well, which
|
|
2718
|
+
* is what a reader pointing at it means. Rows that are context stand alone (a run is a maximal non-context
|
|
2719
|
+
* run), so a range that touches no change is returned as it is.
|
|
2720
|
+
* @param rows - the whole-file diff rows.
|
|
2721
|
+
* @param start - the range's first row.
|
|
2722
|
+
* @param end - the range's last row.
|
|
2723
|
+
* @returns the widened row range.
|
|
2724
|
+
*/
|
|
2725
|
+
function changeRunSpanOf(rows, start, end) {
|
|
2726
|
+
return {
|
|
2727
|
+
start: changeRunOf(rows, start).start,
|
|
2728
|
+
end: changeRunOf(rows, Math.max(start, end)).end
|
|
2729
|
+
};
|
|
2730
|
+
}
|
|
2731
|
+
/**
|
|
2732
|
+
* The line a side's missing lines would be inserted before. A change run lists all its removals before any
|
|
2733
|
+
* addition, so the row next to a mid-run removal has no new-file line at all: reading one row back would
|
|
2734
|
+
* put the insertion point at the top of the file. The line that side ends at inside the whole run is the
|
|
2735
|
+
* position the pairing implies (a lone removal belongs after the lines that replaced its neighbours), and
|
|
2736
|
+
* a run with no line on that side at all — a pure deletion asking where the new side is — falls back to
|
|
2737
|
+
* the line above the run.
|
|
2738
|
+
* @param rows - the whole-file diff rows.
|
|
2739
|
+
* @param index - a row of the range whose side has no lines.
|
|
2740
|
+
* @param side - which side is missing its lines.
|
|
2741
|
+
* @returns the 1-based line the missing lines go before.
|
|
2742
|
+
*/
|
|
2743
|
+
function insertionPointOf(rows, index, side) {
|
|
2744
|
+
const { start, end } = changeRunOf(rows, index);
|
|
2745
|
+
let last;
|
|
2746
|
+
for (let at = start; at <= end; at++) {
|
|
2747
|
+
const line = side === "old" ? rows[at]?.oldLine : rows[at]?.newLine;
|
|
2748
|
+
if (line !== void 0) last = last === void 0 ? line : Math.max(last, line);
|
|
2749
|
+
}
|
|
2750
|
+
if (last !== void 0) return last + 1;
|
|
2751
|
+
for (let at = start - 1; at >= 0; at--) {
|
|
2752
|
+
const line = side === "old" ? rows[at]?.oldLine : rows[at]?.newLine;
|
|
2753
|
+
if (line !== void 0) return line + 1;
|
|
2754
|
+
}
|
|
2755
|
+
return 1;
|
|
2756
|
+
}
|
|
2703
2757
|
/**
|
|
2704
2758
|
* One diff block's old/new line ranges, 1-based inclusive, for block-level
|
|
2705
2759
|
* keep/revert. A side with no lines (a pure addition or deletion) is empty; its
|
|
@@ -2729,13 +2783,12 @@ window.__ModuleLoader__.load({
|
|
|
2729
2783
|
newEnd = Math.max(newEnd, row.newLine);
|
|
2730
2784
|
}
|
|
2731
2785
|
}
|
|
2732
|
-
const before = rows[block.start - 1];
|
|
2733
2786
|
if (oldStart === Infinity) {
|
|
2734
|
-
oldStart = (
|
|
2787
|
+
oldStart = insertionPointOf(rows, block.start, "old");
|
|
2735
2788
|
oldEnd = oldStart - 1;
|
|
2736
2789
|
}
|
|
2737
2790
|
if (newStart === Infinity) {
|
|
2738
|
-
newStart = (
|
|
2791
|
+
newStart = insertionPointOf(rows, block.start, "new");
|
|
2739
2792
|
newEnd = newStart - 1;
|
|
2740
2793
|
}
|
|
2741
2794
|
return {
|
|
@@ -2745,6 +2798,76 @@ window.__ModuleLoader__.load({
|
|
|
2745
2798
|
newEnd
|
|
2746
2799
|
};
|
|
2747
2800
|
}
|
|
2801
|
+
/** The row indices one pair holds, old side first. */
|
|
2802
|
+
function pairRowsOf(pair) {
|
|
2803
|
+
const list = [];
|
|
2804
|
+
if (pair.old !== void 0) list.push(pair.old);
|
|
2805
|
+
if (pair.new !== void 0) list.push(pair.new);
|
|
2806
|
+
return list;
|
|
2807
|
+
}
|
|
2808
|
+
/** Whether any row the pair holds is a change; a pair of context rows is not one. */
|
|
2809
|
+
function pairIsChanged(rows, pair) {
|
|
2810
|
+
return pairRowsOf(pair).some((index) => rows[index] !== void 0 && rows[index].kind !== "context");
|
|
2811
|
+
}
|
|
2812
|
+
/**
|
|
2813
|
+
* One side-by-side pair's old/new line ranges, 1-based inclusive, for pair-level keep/revert. A pair is
|
|
2814
|
+
* one old line against one new line, so each side contributes a single line; a side the pair does not
|
|
2815
|
+
* have (an unpaired insertion or removal) is the empty range at that side's insertion point, read off the
|
|
2816
|
+
* row before the pair — the same rule `blockRangesOf` applies to a side with no lines at all.
|
|
2817
|
+
* @param rows - the whole-file diff rows.
|
|
2818
|
+
* @param pair - the rows the pair holds.
|
|
2819
|
+
* @returns the old and new line ranges, or undefined for a pair that holds no row.
|
|
2820
|
+
*/
|
|
2821
|
+
function pairRangeOf(rows, pair) {
|
|
2822
|
+
const oldRow = pair.old === void 0 ? void 0 : rows[pair.old];
|
|
2823
|
+
const newRow = pair.new === void 0 ? void 0 : rows[pair.new];
|
|
2824
|
+
if (oldRow === void 0 && newRow === void 0) return void 0;
|
|
2825
|
+
const first = Math.min(pair.old ?? Number.POSITIVE_INFINITY, pair.new ?? Number.POSITIVE_INFINITY);
|
|
2826
|
+
const oldStart = oldRow?.oldLine ?? insertionPointOf(rows, first, "old");
|
|
2827
|
+
const newStart = newRow?.newLine ?? insertionPointOf(rows, first, "new");
|
|
2828
|
+
return {
|
|
2829
|
+
oldStart,
|
|
2830
|
+
oldEnd: oldRow?.oldLine ?? oldStart - 1,
|
|
2831
|
+
newStart,
|
|
2832
|
+
newEnd: newRow?.newLine ?? newStart - 1
|
|
2833
|
+
};
|
|
2834
|
+
}
|
|
2835
|
+
/**
|
|
2836
|
+
* The old/new ranges keep/revert act on for the pairs a side-by-side selection names, in the order they
|
|
2837
|
+
* must be sent. Pairs of context rows are dropped (nothing to act on). When the changed pairs occupy one
|
|
2838
|
+
* contiguous span of the row list with no other changed row inside it, ONE range covers them all: one
|
|
2839
|
+
* host call, one undo step, and the same range a whole-block action would send. Otherwise each pair gets
|
|
2840
|
+
* its own range, ordered from the BOTTOM of the file up, so a splice never moves the line numbers of a
|
|
2841
|
+
* pair still to be applied.
|
|
2842
|
+
* @param rows - the whole-file diff rows.
|
|
2843
|
+
* @param pairs - the pairs the selection names, in row order.
|
|
2844
|
+
* @returns one range, several, or none when the selection carries no change.
|
|
2845
|
+
*/
|
|
2846
|
+
function pairsRangeOf(rows, pairs) {
|
|
2847
|
+
const changed = pairs.filter((pair) => pairIsChanged(rows, pair));
|
|
2848
|
+
if (changed.length === 0) return [];
|
|
2849
|
+
if (changed.length === 1) {
|
|
2850
|
+
const single = pairRangeOf(rows, changed[0]);
|
|
2851
|
+
return single === void 0 ? [] : [single];
|
|
2852
|
+
}
|
|
2853
|
+
const selected = /* @__PURE__ */ new Set();
|
|
2854
|
+
for (const pair of changed) for (const index of pairRowsOf(pair)) selected.add(index);
|
|
2855
|
+
const start = Math.min(...selected);
|
|
2856
|
+
const end = Math.max(...selected);
|
|
2857
|
+
let oneSpan = true;
|
|
2858
|
+
for (let index = start; index <= end; index++) {
|
|
2859
|
+
const row = rows[index];
|
|
2860
|
+
if (row !== void 0 && row.kind !== "context" && !selected.has(index)) {
|
|
2861
|
+
oneSpan = false;
|
|
2862
|
+
break;
|
|
2863
|
+
}
|
|
2864
|
+
}
|
|
2865
|
+
if (oneSpan) return [blockRangesOf(rows, {
|
|
2866
|
+
start,
|
|
2867
|
+
end
|
|
2868
|
+
})];
|
|
2869
|
+
return [...changed].sort((left, right) => Math.max(...pairRowsOf(right)) - Math.max(...pairRowsOf(left))).map((pair) => pairRangeOf(rows, pair)).filter((range) => range !== void 0);
|
|
2870
|
+
}
|
|
2748
2871
|
/**
|
|
2749
2872
|
* Compute the whole-file view between two contents. The context budget is the
|
|
2750
2873
|
* side lengths, so every hunk covers the file and unchanged lines survive as
|
|
@@ -3735,11 +3858,11 @@ window.__ModuleLoader__.load({
|
|
|
3735
3858
|
/**
|
|
3736
3859
|
* Decide the selection frame's contents.
|
|
3737
3860
|
*
|
|
3738
|
-
* Keep/revert needs
|
|
3861
|
+
* Keep/revert needs the selection to touch a change; commenting needs a range that has no
|
|
3739
3862
|
* discussion yet. A frame with neither would be an empty floating box, so it is
|
|
3740
3863
|
* not rendered at all.
|
|
3741
3864
|
*
|
|
3742
|
-
* @param options - whether
|
|
3865
|
+
* @param options - whether the selection touches a change, and whether this range already has a discussion.
|
|
3743
3866
|
* @returns the three flags the caller branches on.
|
|
3744
3867
|
*/
|
|
3745
3868
|
function selectionFrame(options) {
|
|
@@ -19687,16 +19810,27 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19687
19810
|
* `[data-produced-files-row] button` 0.1.5's produced-file card `title` = the path
|
|
19688
19811
|
* `[data-presented-files-row] button` 0.1.7's presented-file card `title` = the path
|
|
19689
19812
|
* `[data-changed-files] button` 0.1.7's changed-files row `aria-describedby` = the path
|
|
19690
|
-
* `button[title]` a message's file LINK (0.1.7) `title` = the path
|
|
19691
19813
|
* `button[data-ref-chip]` a `@file` chip in a message `title` = the token
|
|
19692
|
-
* `
|
|
19693
|
-
*
|
|
19694
|
-
*
|
|
19695
|
-
*
|
|
19696
|
-
*
|
|
19697
|
-
*
|
|
19698
|
-
*
|
|
19699
|
-
*
|
|
19814
|
+
* `button._fileLink_…` / `._fileMention_…` a message's file LINK `title` = the path
|
|
19815
|
+
*
|
|
19816
|
+
* A PRESS IS ADMITTED BY THE SHELL'S OWN MARK, NEVER BY THE SHAPE OF ITS TEXT. The link row's classes are
|
|
19817
|
+
* the shell's CSS-module names — measured on the live shell as `_fileMention_1ypvv_85 _fileLink_1ypvv_59`,
|
|
19818
|
+
* carrying `title="src/client/produced-diff.ts"` — and that name survives the hash and line suffix the
|
|
19819
|
+
* module adds per build, so the marker is the `_fileLink_` / `_fileMention_` substring rather than the
|
|
19820
|
+
* whole class.
|
|
19821
|
+
*
|
|
19822
|
+
* This replaced two blanket rules, `button[title]` and every `a[href]`, which admitted a press by how its
|
|
19823
|
+
* text was spelled and were measured wrong twice on 2026-10-09: a model picker's button carries a tooltip
|
|
19824
|
+
* naming the model, and a version-like name (`…v3.2`) ends in the ".extension" the text filter accepted, so
|
|
19825
|
+
* pressing 修改模型 raised this menu over the shell's own control; an in-app route link (`/settings`) holds a
|
|
19826
|
+
* separator and was admitted the same way. A file press is one the shell marks as one.
|
|
19827
|
+
*
|
|
19828
|
+
* Everything else is left entirely alone: a link to a URL, an in-page anchor, a button whose tooltip names
|
|
19829
|
+
* something that is not a file, a file LINK whose file this panel does not hold, a modified press
|
|
19830
|
+
* (Ctrl/Cmd/Shift/Alt, or a middle click — gestures the harness may give its own meaning later), and any
|
|
19831
|
+
* press inside this plugin's own surface, whose buttons carry paths too and belong to the panel that is
|
|
19832
|
+
* already showing the file. A file-list ROW is the one press taken over whether or not the panel holds its
|
|
19833
|
+
* file (see `ROW_SELECTOR`); "we do not hold it" then decides what the menu offers, not whether it appears.
|
|
19700
19834
|
*
|
|
19701
19835
|
* The name of the module (and of the event it raises) dates from when the produced-file card was the
|
|
19702
19836
|
* only press of this kind; `data-presented-files-row` is that same list under 0.1.7's name for it.
|
|
@@ -19739,13 +19873,24 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19739
19873
|
*
|
|
19740
19874
|
* A press this list misses is not a crash — it is one menu the reader does not get.
|
|
19741
19875
|
*/
|
|
19876
|
+
/**
|
|
19877
|
+
* The shell's OWN mark on a file link, as the name part of its CSS-module classes: measured on the live
|
|
19878
|
+
* shell as `class="_fileMention_1ypvv_85 _fileLink_1ypvv_59"` on the `<button title="src/client/
|
|
19879
|
+
* produced-diff.ts">` a message draws for a file. The hash and the line number after the name are per
|
|
19880
|
+
* build, so the marker is the `_name_` substring and not the whole class.
|
|
19881
|
+
*
|
|
19882
|
+
* A CSS-module class name is the shell telling this module what the element IS, which is why this replaced
|
|
19883
|
+
* the text-shape rules (see the module doc). It is a name, not an API: if the shell ever renames or
|
|
19884
|
+
* minifies these classes, this marker stops matching and file links fall back to the shell's own press —
|
|
19885
|
+
* fewer menus, never a menu over the wrong control, which is the direction a wrong guess must fail in.
|
|
19886
|
+
*/
|
|
19887
|
+
const MARKED_LINK_SELECTOR = "[class*=\"_fileLink_\"], [class*=\"_fileMention_\"]";
|
|
19742
19888
|
const PRESS_SELECTOR = [
|
|
19743
19889
|
"[data-produced-files-row] button",
|
|
19744
19890
|
"[data-presented-files-row] button",
|
|
19745
19891
|
"[data-changed-files] button",
|
|
19746
|
-
"button[title]",
|
|
19747
19892
|
"button[data-ref-chip]",
|
|
19748
|
-
|
|
19893
|
+
MARKED_LINK_SELECTOR
|
|
19749
19894
|
].join(", ");
|
|
19750
19895
|
/**
|
|
19751
19896
|
* A shell press that looks like one of the above and is NOT one: the review pane's file picker.
|
|
@@ -19789,41 +19934,65 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19789
19934
|
return stripSuffix(text.replace(/^@/, "").replace(/^"|"$/g, "").trim());
|
|
19790
19935
|
}
|
|
19791
19936
|
/**
|
|
19792
|
-
* Whether this text
|
|
19937
|
+
* Whether this text is spelled as something that is not a file at all: an in-page anchor, a query, or
|
|
19938
|
+
* another scheme's URL. A Windows drive letter is a file despite the colon it starts with.
|
|
19793
19939
|
*
|
|
19794
|
-
*
|
|
19795
|
-
*
|
|
19796
|
-
|
|
19797
|
-
|
|
19940
|
+
* @param value - the candidate text.
|
|
19941
|
+
* @returns whether it is spelled as a non-file.
|
|
19942
|
+
*/
|
|
19943
|
+
function isNonFileSpelling(value) {
|
|
19944
|
+
if (value === "" || value.startsWith("#") || value.startsWith("?")) return true;
|
|
19945
|
+
return /^[A-Za-z][A-Za-z0-9+.-]*:/.test(value) && !/^[A-Za-z]:[\\/]/.test(value);
|
|
19946
|
+
}
|
|
19947
|
+
/**
|
|
19948
|
+
* Whether this text has the SHAPE of a path: a `.extension` tail or a separator.
|
|
19949
|
+
*
|
|
19950
|
+
* Only a press the shell did NOT mark is held to this, because its text is all there is to go on. A marked
|
|
19951
|
+
* press is a file link by the shell's own word, so its value is taken as written and an extension-less path
|
|
19952
|
+
* (`Makefile`) is read as the file it is instead of being dismissed as a label.
|
|
19798
19953
|
*
|
|
19799
19954
|
* @param value - the candidate text.
|
|
19800
19955
|
* @returns whether it could name a file.
|
|
19801
19956
|
*/
|
|
19802
19957
|
function looksLikePath(value) {
|
|
19803
|
-
if (
|
|
19804
|
-
if (/^[A-Za-z][A-Za-z0-9+.-]*:/.test(value) && !/^[A-Za-z]:[\\/]/.test(value)) return false;
|
|
19958
|
+
if (isNonFileSpelling(value)) return false;
|
|
19805
19959
|
return /\.[A-Za-z0-9]{1,8}$/.test(value) || value.includes("/") || value.includes("\\");
|
|
19806
19960
|
}
|
|
19961
|
+
/** Whether the shell itself marked this press as one of its file links (see `MARKED_LINK_SELECTOR`). */
|
|
19962
|
+
function isMarkedFileLink(press) {
|
|
19963
|
+
return press.matches(MARKED_LINK_SELECTOR);
|
|
19964
|
+
}
|
|
19807
19965
|
/**
|
|
19808
19966
|
* The path a press names, or undefined when it names no file.
|
|
19809
19967
|
*
|
|
19968
|
+
* Every shape is read from the same three places — `title`, the text its `aria-describedby` points at, an
|
|
19969
|
+
* anchor's `href` — and what differs is the test the value must pass: a press the shell marked must only
|
|
19970
|
+
* not be spelled as a non-file, while one it did not mark must ALSO have the shape of a path.
|
|
19971
|
+
*
|
|
19810
19972
|
* @param press - the element the reader pressed.
|
|
19811
19973
|
* @returns the path, as the shell spelled it (the panel matches it against its own spelling).
|
|
19812
19974
|
*/
|
|
19813
19975
|
function pressPathOf(press) {
|
|
19976
|
+
const marked = isMarkedFileLink(press);
|
|
19977
|
+
const accept = (value) => {
|
|
19978
|
+
const path = pathOfReference(value);
|
|
19979
|
+
if (path === "") return void 0;
|
|
19980
|
+
if (marked) return isNonFileSpelling(path) ? void 0 : path;
|
|
19981
|
+
return looksLikePath(path) ? path : void 0;
|
|
19982
|
+
};
|
|
19814
19983
|
const title = press.getAttribute("title")?.trim();
|
|
19815
19984
|
if (title !== void 0) {
|
|
19816
|
-
const path =
|
|
19817
|
-
if (
|
|
19985
|
+
const path = accept(title);
|
|
19986
|
+
if (path !== void 0) return path;
|
|
19818
19987
|
}
|
|
19819
19988
|
const describedBy = press.getAttribute("aria-describedby");
|
|
19820
19989
|
if (describedBy !== null) {
|
|
19821
|
-
const path = press.ownerDocument.getElementById(describedBy)?.textContent?.trim() ?? "";
|
|
19822
|
-
if (
|
|
19990
|
+
const path = accept(press.ownerDocument.getElementById(describedBy)?.textContent?.trim() ?? "");
|
|
19991
|
+
if (path !== void 0) return path;
|
|
19823
19992
|
}
|
|
19824
19993
|
if (press instanceof HTMLAnchorElement) {
|
|
19825
|
-
const path = stripSuffix(press.getAttribute("href")?.trim() ?? "");
|
|
19826
|
-
if (
|
|
19994
|
+
const path = accept(stripSuffix(press.getAttribute("href")?.trim() ?? ""));
|
|
19995
|
+
if (path !== void 0) return path;
|
|
19827
19996
|
}
|
|
19828
19997
|
}
|
|
19829
19998
|
/** The press `replayFilePress` is replaying, if any: that press is the shell's, not the menu's. */
|
|
@@ -22567,7 +22736,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22567
22736
|
});
|
|
22568
22737
|
}
|
|
22569
22738
|
/** The two-column (side-by-side) whole-file diff view. */
|
|
22570
|
-
const SplitDiff = (0, react.forwardRef)(function SplitDiff({ file, sessionId, model, runs, langWrap, tabWidthSpaces, busy, t, selection, leadRows, onBlockKeep, onBlockRevert, onWrapToast, onVisibleLines, discussions, renderDiscussion, selectionComment, rulerRuns, gotoDialog }, ref) {
|
|
22739
|
+
const SplitDiff = (0, react.forwardRef)(function SplitDiff({ file, sessionId, model, runs, langWrap, tabWidthSpaces, busy, t, selection, leadRows, onBlockKeep, onBlockRevert, onWrapToast, onVisibleLines, discussions, renderDiscussion, selectionKeepRevert, selectionComment, selectionDragging, rulerRuns, gotoDialog }, ref) {
|
|
22571
22740
|
const hintCase = actionTooltip(t("action.matchCase"), "matchCase");
|
|
22572
22741
|
const hintWords = actionTooltip(t("action.matchWholeWord"), "matchWholeWord");
|
|
22573
22742
|
const hintPrev = actionTooltip(t("action.prevDiff"), "searchPrev");
|
|
@@ -22961,14 +23130,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22961
23130
|
const body = bodyRef.current;
|
|
22962
23131
|
if (body === null) return;
|
|
22963
23132
|
if (body.clientHeight <= 0) return;
|
|
22964
|
-
const
|
|
22965
|
-
const viewBottom = viewTop + body.clientHeight;
|
|
22966
|
-
const pairTop = off(pairIndex);
|
|
22967
|
-
const pairBottom = pairTop + ROW_HEIGHT_PX;
|
|
22968
|
-
let target;
|
|
22969
|
-
if (pairTop < viewTop) target = pairTop;
|
|
22970
|
-
else if (pairBottom > viewBottom) target = pairBottom - body.clientHeight;
|
|
22971
|
-
if (target === void 0) return;
|
|
23133
|
+
const target = off(pairIndex) + ROW_HEIGHT_PX / 2 - body.clientHeight / 2;
|
|
22972
23134
|
const clamped = Math.max(0, Math.min(target, body.scrollHeight - body.clientHeight));
|
|
22973
23135
|
if (body.scrollTop !== clamped) body.scrollTop = clamped;
|
|
22974
23136
|
setScrollTop(clamped);
|
|
@@ -23307,6 +23469,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23307
23469
|
stop();
|
|
23308
23470
|
};
|
|
23309
23471
|
}, []);
|
|
23472
|
+
const selectionFrameUp = (selectionKeepRevert !== void 0 || selectionComment !== void 0) && selection !== void 0;
|
|
23310
23473
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
23311
23474
|
className: PendingPanel_module_css_default.splitRoot,
|
|
23312
23475
|
ref: splitRootRef,
|
|
@@ -23459,11 +23622,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23459
23622
|
}, index))
|
|
23460
23623
|
}),
|
|
23461
23624
|
gotoDialog,
|
|
23462
|
-
|
|
23625
|
+
selectionFrameUp && (0, react_jsx_runtime.jsxs)("div", {
|
|
23463
23626
|
className: PendingPanel_module_css_default.blockActions,
|
|
23464
23627
|
"data-diff-selection-actions": true,
|
|
23628
|
+
"data-diff-selection-pair": selection.end,
|
|
23629
|
+
"data-diff-frame-drag": selectionDragging ? "" : void 0,
|
|
23465
23630
|
style: { top: Math.max(0, Math.min(off(selection.end + 1) - scrollTop, Math.max(0, viewportH - 32))) },
|
|
23466
|
-
children:
|
|
23631
|
+
children: [
|
|
23632
|
+
selectionKeepRevert,
|
|
23633
|
+
selectionKeepRevert !== void 0 && selectionComment !== void 0 && (0, react_jsx_runtime.jsx)("span", {
|
|
23634
|
+
className: PendingPanel_module_css_default.blockActionsDivider,
|
|
23635
|
+
"data-diff-selection-divider": true,
|
|
23636
|
+
"aria-hidden": "true"
|
|
23637
|
+
}),
|
|
23638
|
+
selectionComment
|
|
23639
|
+
]
|
|
23467
23640
|
}),
|
|
23468
23641
|
(0, react_jsx_runtime.jsxs)("div", {
|
|
23469
23642
|
className: PendingPanel_module_css_default.splitHScrollRow,
|
|
@@ -23640,7 +23813,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23640
23813
|
height: flashHeight
|
|
23641
23814
|
}
|
|
23642
23815
|
}, flashKey),
|
|
23643
|
-
hoveredBlock !== void 0 && blockOfPair[hoveredBlock] !== void 0 && (0, react_jsx_runtime.jsxs)("div", {
|
|
23816
|
+
!selectionFrameUp && hoveredBlock !== void 0 && blockOfPair[hoveredBlock] !== void 0 && (0, react_jsx_runtime.jsxs)("div", {
|
|
23644
23817
|
className: PendingPanel_module_css_default.blockActions,
|
|
23645
23818
|
"data-diff-block-actions": true,
|
|
23646
23819
|
style: { top: blockActionsTop },
|
|
@@ -24181,13 +24354,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24181
24354
|
return map;
|
|
24182
24355
|
}, [splitModel, model]);
|
|
24183
24356
|
/**
|
|
24184
|
-
* The rows a selection names, whichever view made it: the pair range of a side-by-side selection
|
|
24185
|
-
*
|
|
24357
|
+
* The rows a selection names, whichever view made it: the pair range of a side-by-side selection mapped
|
|
24358
|
+
* to the rows of the column it began in, and a single-column range left as it is.
|
|
24186
24359
|
*
|
|
24187
|
-
*
|
|
24188
|
-
* the
|
|
24189
|
-
*
|
|
24190
|
-
* the
|
|
24360
|
+
* Both columns are read. A right-column selection names the NEW file's rows and a left-column one the OLD
|
|
24361
|
+
* file's — which is what the reader pointed at, and what a removal the alignment left unpaired can only
|
|
24362
|
+
* be reached by (it is drawn in the old column alone). A thread stays anchored to a new-file line wherever
|
|
24363
|
+
* the range has one; where it does not, the label falls back to the old-file number exactly as it does for
|
|
24364
|
+
* a removals-only selection in the single-column view (see `addDiscussion` and `frameNamesNoCurrentLine`).
|
|
24191
24365
|
*
|
|
24192
24366
|
* @param range - the selection to read.
|
|
24193
24367
|
* @returns the same lines as a row range, or undefined when the view named none.
|
|
@@ -24195,10 +24369,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24195
24369
|
const selectionRows = (range) => {
|
|
24196
24370
|
if (range === void 0) return void 0;
|
|
24197
24371
|
if (!splitView || range.side === void 0 || splitModel === null) return range;
|
|
24198
|
-
|
|
24372
|
+
const side = range.side;
|
|
24199
24373
|
const rows = [];
|
|
24200
24374
|
for (let index = range.start; index <= range.end; index++) {
|
|
24201
|
-
const row = pairRows.get(index)?.
|
|
24375
|
+
const row = pairRows.get(index)?.[side];
|
|
24202
24376
|
if (row !== void 0) rows.push(row);
|
|
24203
24377
|
}
|
|
24204
24378
|
return rows.length === 0 ? void 0 : {
|
|
@@ -24829,25 +25003,17 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24829
25003
|
applyPreviewFrames();
|
|
24830
25004
|
};
|
|
24831
25005
|
/**
|
|
24832
|
-
*
|
|
24833
|
-
*
|
|
24834
|
-
*
|
|
24835
|
-
*
|
|
24836
|
-
* bottom edge. The settled offset is mirrored into the frames, as for a jump.
|
|
25006
|
+
* Put one preview search occurrence in the middle of the pane. Its only caller is the search JUMP — the
|
|
25007
|
+
* bar's next / previous, Enter, F3 — and the point of that jump is to read the occurrence it landed on,
|
|
25008
|
+
* which is the rule the code view and the side-by-side view now follow too. The settled offset is
|
|
25009
|
+
* mirrored into the frames, as for a jump.
|
|
24837
25010
|
* @param hit - the highlighted occurrence to reveal.
|
|
24838
25011
|
*/
|
|
24839
25012
|
const scrollPreviewHitIntoView = (hit) => {
|
|
24840
25013
|
const body = mdPreviewBodyRef.current;
|
|
24841
25014
|
if (body === null) return;
|
|
24842
25015
|
const bodyRect = body.getBoundingClientRect();
|
|
24843
|
-
const
|
|
24844
|
-
const hitBottom = hit.getBoundingClientRect().bottom - bodyRect.top + body.scrollTop;
|
|
24845
|
-
const viewTop = body.scrollTop;
|
|
24846
|
-
const viewBottom = viewTop + body.clientHeight;
|
|
24847
|
-
let target;
|
|
24848
|
-
if (hitTop - leadRows * ROW_HEIGHT_PX < viewTop) target = hitTop - leadRows * ROW_HEIGHT_PX;
|
|
24849
|
-
else if (hitBottom > viewBottom) target = hitBottom - body.clientHeight;
|
|
24850
|
-
if (target === void 0) return;
|
|
25016
|
+
const target = (hit.getBoundingClientRect().top - bodyRect.top + body.scrollTop + (hit.getBoundingClientRect().bottom - bodyRect.top + body.scrollTop)) / 2 - body.clientHeight / 2;
|
|
24851
25017
|
const maxTop = Math.max(0, body.scrollHeight - body.clientHeight);
|
|
24852
25018
|
const clamped = Math.max(0, Math.min(target, maxTop));
|
|
24853
25019
|
if (body.scrollTop !== clamped) body.scrollTop = clamped;
|
|
@@ -24943,9 +25109,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24943
25109
|
}
|
|
24944
25110
|
if (searchMatches.length === 0) return;
|
|
24945
25111
|
if (cursorPosRef.current !== void 0) {
|
|
25112
|
+
centerSearchRef.current = true;
|
|
25113
|
+
setSearchJump((jump) => jump + 1);
|
|
24946
25114
|
setSearchIndex(startIndexFor(searchQuery));
|
|
24947
25115
|
return;
|
|
24948
25116
|
}
|
|
25117
|
+
centerSearchRef.current = true;
|
|
25118
|
+
setSearchJump((jump) => jump + 1);
|
|
24949
25119
|
setSearchIndex((current) => (current + direction + searchMatches.length) % searchMatches.length);
|
|
24950
25120
|
};
|
|
24951
25121
|
/**
|
|
@@ -24967,6 +25137,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24967
25137
|
return at === -1 ? 0 : at;
|
|
24968
25138
|
};
|
|
24969
25139
|
const cursorPosRef = (0, react.useRef)(void 0);
|
|
25140
|
+
/** Set by a search JUMP: the next match is centred, where a typed query only brings it into view. */
|
|
25141
|
+
const centerSearchRef = (0, react.useRef)(false);
|
|
25142
|
+
/** Bumped by every JUMP, so the centring effect runs even when the match itself does not change (a single
|
|
25143
|
+
* hit, or a wrap back onto the same row). */
|
|
25144
|
+
const [searchJump, setSearchJump] = (0, react.useState)(0);
|
|
24970
25145
|
const lastRecordedCursorRef = (0, react.useRef)(void 0);
|
|
24971
25146
|
const openSearchWithSelection = () => {
|
|
24972
25147
|
if (searchOpen) {
|
|
@@ -25033,18 +25208,25 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25033
25208
|
const body = bodyRef.current;
|
|
25034
25209
|
if (body === null) return;
|
|
25035
25210
|
if (body.clientHeight <= 0) return;
|
|
25211
|
+
const centring = centerSearchRef.current;
|
|
25212
|
+
centerSearchRef.current = false;
|
|
25036
25213
|
const viewTop = body.scrollTop;
|
|
25037
25214
|
const viewBottom = viewTop + body.clientHeight;
|
|
25038
25215
|
const rowTop = offsetOf(row);
|
|
25039
25216
|
const rowBottom = rowTop + extentOf(row, row);
|
|
25040
25217
|
let target;
|
|
25041
|
-
if (rowTop
|
|
25218
|
+
if (centring) target = (rowTop + rowBottom) / 2 - body.clientHeight / 2;
|
|
25219
|
+
else if (rowTop < viewTop) target = rowTop;
|
|
25042
25220
|
else if (rowBottom > viewBottom) target = rowBottom - body.clientHeight;
|
|
25043
25221
|
if (target === void 0) return;
|
|
25044
25222
|
const clamped = Math.max(0, Math.min(target, body.scrollHeight - body.clientHeight));
|
|
25045
25223
|
if (body.scrollTop !== clamped) body.scrollTop = clamped;
|
|
25046
25224
|
setScrollTop(clamped);
|
|
25047
|
-
}, [
|
|
25225
|
+
}, [
|
|
25226
|
+
currentSearchRow,
|
|
25227
|
+
searchMatches,
|
|
25228
|
+
searchJump
|
|
25229
|
+
]);
|
|
25048
25230
|
const blockIndexByRow = (0, react.useMemo)(() => {
|
|
25049
25231
|
const map = /* @__PURE__ */ new Map();
|
|
25050
25232
|
model.blocks.forEach((block, blockIndex) => {
|
|
@@ -25359,7 +25541,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25359
25541
|
if (!commentMode) return;
|
|
25360
25542
|
const range = selectionRows(selection);
|
|
25361
25543
|
if (range === void 0) return;
|
|
25362
|
-
|
|
25544
|
+
const quoteRange = splitView && !previewActive ? changeRunSpanOf(model.diff.rows, range.start, range.end) : range;
|
|
25545
|
+
if (discussionOverlapping(discussions, quoteRange) !== void 0) return;
|
|
25363
25546
|
const newLines = newLinesInRows(model.diff.rows, range);
|
|
25364
25547
|
const first = model.diff.rows[range.start];
|
|
25365
25548
|
const last = model.diff.rows[range.end] ?? first;
|
|
@@ -25369,14 +25552,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25369
25552
|
const body = bodyRef.current;
|
|
25370
25553
|
if (body !== null && offsetOf(range.start) - body.scrollTop < 0) pendingScrollShiftRef.current += 66;
|
|
25371
25554
|
const id = `draft-${Date.now().toString(36)}-${draftThreads.length}`;
|
|
25372
|
-
const quoted = model.diff.rows.slice(
|
|
25555
|
+
const quoted = model.diff.rows.slice(quoteRange.start, quoteRange.end + 1);
|
|
25373
25556
|
const quote = quoted.map((row) => row.text).join("\n");
|
|
25374
25557
|
const quoteLines = quoted.map((row) => ({
|
|
25375
25558
|
old: row.oldLine,
|
|
25376
25559
|
new: row.newLine,
|
|
25377
25560
|
kind: row.kind
|
|
25378
25561
|
}));
|
|
25379
|
-
const quoteContext = model.diff.rows.slice(Math.max(0,
|
|
25562
|
+
const quoteContext = model.diff.rows.slice(Math.max(0, quoteRange.start - 1), Math.min(model.diff.rows.length, quoteRange.end + 2)).map((row) => row.text).join("\n");
|
|
25380
25563
|
setDraftThreads((current) => [...current, {
|
|
25381
25564
|
id,
|
|
25382
25565
|
fileId: file.id,
|
|
@@ -26140,10 +26323,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26140
26323
|
await runBlockAction(action, range, operated);
|
|
26141
26324
|
};
|
|
26142
26325
|
const handleSelectionAction = async (action) => {
|
|
26143
|
-
if (busy ||
|
|
26144
|
-
const
|
|
26145
|
-
if (firstCovered === void 0) return;
|
|
26146
|
-
await runBlockAction(action, selectionRange, firstCovered);
|
|
26326
|
+
if (busy || selectionTargetRanges.length === 0) return;
|
|
26327
|
+
for (const range of selectionTargetRanges) await (action === "keep" ? onBlockKeep(sessionId, file.id, range) : onBlockRevert(sessionId, file.id, range));
|
|
26147
26328
|
setSelection(void 0);
|
|
26148
26329
|
setPreviewCovered([]);
|
|
26149
26330
|
window.getSelection()?.removeAllRanges?.();
|
|
@@ -26373,12 +26554,64 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26373
26554
|
* annotation at most).
|
|
26374
26555
|
*/
|
|
26375
26556
|
const selectionHasDiscussion = selectionRowRange !== void 0 && discussionOverlapping(discussions, selectionRowRange) !== void 0;
|
|
26557
|
+
/**
|
|
26558
|
+
* The change blocks the selected rows touch, in order. A selection that stops inside a block still
|
|
26559
|
+
* touches it, so this — rather than the blocks it fully covers — is what says whether keep/revert
|
|
26560
|
+
* have anything to act on at all (an all-context range touches none, and offers the comment alone).
|
|
26561
|
+
*/
|
|
26562
|
+
const selectionBlocks = [];
|
|
26563
|
+
if (selectionRowRange !== void 0) for (let index = 0; index < model.blocks.length; index++) {
|
|
26564
|
+
const block = model.blocks[index];
|
|
26565
|
+
if (selectionRowRange.start <= block.end && block.start <= selectionRowRange.end) selectionBlocks.push(index);
|
|
26566
|
+
}
|
|
26567
|
+
/**
|
|
26568
|
+
* The side-by-side pairs the selection names, in row order. That view selects PAIRS (see
|
|
26569
|
+
* `splitRowRangeOf`), and a pair is one old line against one new line. The list is the same whichever
|
|
26570
|
+
* column the selection came from — a pair holds both its sides, and a removal the alignment left unpaired
|
|
26571
|
+
* holds only its old one, which is exactly the pair a left-column selection is about.
|
|
26572
|
+
*/
|
|
26573
|
+
const splitSelectionPairs = [];
|
|
26574
|
+
if (splitView && !previewActive && selection !== void 0 && selection.side !== void 0) for (let index = selection.start; index <= selection.end; index++) {
|
|
26575
|
+
const pair = pairRows.get(index);
|
|
26576
|
+
if (pair !== void 0) splitSelectionPairs.push(pair);
|
|
26577
|
+
}
|
|
26578
|
+
/**
|
|
26579
|
+
* The old/new ranges the frame's keep/revert send, in the order they must be sent. Taking part of a
|
|
26580
|
+
* change is the point: keep folds only those lines into the baseline and only those leave it, and the
|
|
26581
|
+
* context lines a selection spans ride along unchanged. The code view sends the one range the SELECTED
|
|
26582
|
+
* ROWS name; the side-by-side view sends the range(s) of the PAIRS it names (`pairsRangeOf`), which
|
|
26583
|
+
* covers both sides of every pair the reader touched. The Markdown preview keeps its own block-derived
|
|
26584
|
+
* range (`selectionRange`): its selection names rendered elements, not rows.
|
|
26585
|
+
*/
|
|
26586
|
+
const selectionTargetRanges = previewActive ? selectionRange === void 0 ? [] : [selectionRange] : splitView ? pairsRangeOf(model.diff.rows, splitSelectionPairs) : selectionRowRange === void 0 ? [] : [blockRangesOf(model.diff.rows, selectionRowRange)];
|
|
26376
26587
|
const frameForSelection = selectionRowRange !== void 0 ? selectionFrame({
|
|
26377
|
-
coversBlocks:
|
|
26588
|
+
coversBlocks: selectionTargetRanges.length > 0 && selectionBlocks.length > 0,
|
|
26378
26589
|
hasDiscussion: selectionHasDiscussion
|
|
26379
26590
|
}) : void 0;
|
|
26380
26591
|
const selectionCommentOffered = commentMode && frameForSelection?.comment === true;
|
|
26592
|
+
/** Whether the frame carries keep/revert (they stay in the DOM, `hidden`, when it does not). */
|
|
26593
|
+
const selectionKeepRevert = frameForSelection?.keepRevert === true;
|
|
26381
26594
|
const selectionFrameVisible = frameForSelection !== void 0 && (frameForSelection.keepRevert || selectionCommentOffered);
|
|
26595
|
+
const [pressInCode, setPressInCode] = (0, react.useState)(false);
|
|
26596
|
+
(0, react.useEffect)(() => {
|
|
26597
|
+
const down = (event) => {
|
|
26598
|
+
const target = event.target;
|
|
26599
|
+
setPressInCode(target instanceof Element && target.closest("[data-diff-selection-actions]") === null);
|
|
26600
|
+
};
|
|
26601
|
+
const up = () => {
|
|
26602
|
+
setPressInCode(false);
|
|
26603
|
+
};
|
|
26604
|
+
document.addEventListener("pointerdown", down, true);
|
|
26605
|
+
document.addEventListener("pointerup", up, true);
|
|
26606
|
+
document.addEventListener("pointercancel", up, true);
|
|
26607
|
+
window.addEventListener("blur", up);
|
|
26608
|
+
return () => {
|
|
26609
|
+
document.removeEventListener("pointerdown", down, true);
|
|
26610
|
+
document.removeEventListener("pointerup", up, true);
|
|
26611
|
+
document.removeEventListener("pointercancel", up, true);
|
|
26612
|
+
window.removeEventListener("blur", up);
|
|
26613
|
+
};
|
|
26614
|
+
}, []);
|
|
26382
26615
|
const commentChord = chordLabel$1("addComment");
|
|
26383
26616
|
(0, react.useEffect)(() => {
|
|
26384
26617
|
if (!selectionCommentOffered) return;
|
|
@@ -27046,6 +27279,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27046
27279
|
ref: previewSelectionFrameRef,
|
|
27047
27280
|
className: PendingPanel_module_css_default.blockActions,
|
|
27048
27281
|
"data-diff-selection-actions": true,
|
|
27282
|
+
"data-diff-frame-drag": pressInCode ? "" : void 0,
|
|
27049
27283
|
style: {
|
|
27050
27284
|
top: previewFrameTop(previewSelectionFrame, previewScrollTopRef.current) ?? 0,
|
|
27051
27285
|
right: previewSelectionFrame.right
|
|
@@ -27165,6 +27399,25 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27165
27399
|
renderDiscussion,
|
|
27166
27400
|
rulerRuns: rulerMarkers,
|
|
27167
27401
|
gotoDialog,
|
|
27402
|
+
selectionKeepRevert: splitView && selectionKeepRevert ? (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("button", {
|
|
27403
|
+
type: "button",
|
|
27404
|
+
className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary}`,
|
|
27405
|
+
"data-diff-selection-keep": true,
|
|
27406
|
+
disabled: busy,
|
|
27407
|
+
onClick: () => {
|
|
27408
|
+
handleSelectionAction("keep");
|
|
27409
|
+
},
|
|
27410
|
+
children: t("action.keep")
|
|
27411
|
+
}), (0, react_jsx_runtime.jsx)("button", {
|
|
27412
|
+
type: "button",
|
|
27413
|
+
className: PendingPanel_module_css_default.action,
|
|
27414
|
+
"data-diff-selection-revert": true,
|
|
27415
|
+
disabled: busy,
|
|
27416
|
+
onClick: () => {
|
|
27417
|
+
handleSelectionAction("revert");
|
|
27418
|
+
},
|
|
27419
|
+
children: t("action.revert")
|
|
27420
|
+
})] }) : void 0,
|
|
27168
27421
|
selectionComment: splitView && selectionCommentOffered ? (0, react_jsx_runtime.jsxs)("button", {
|
|
27169
27422
|
type: "button",
|
|
27170
27423
|
className: PendingPanel_module_css_default.action,
|
|
@@ -27175,7 +27428,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27175
27428
|
"data-diff-selection-comment-chord": true,
|
|
27176
27429
|
children: commentChord
|
|
27177
27430
|
})]
|
|
27178
|
-
}) : void 0
|
|
27431
|
+
}) : void 0,
|
|
27432
|
+
selectionDragging: pressInCode
|
|
27179
27433
|
}) : (0, react_jsx_runtime.jsxs)("div", {
|
|
27180
27434
|
className: PendingPanel_module_css_default.diffBodyWrap,
|
|
27181
27435
|
ref: bodyWrapRef,
|
|
@@ -27259,13 +27513,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27259
27513
|
ref: frameRef,
|
|
27260
27514
|
className: PendingPanel_module_css_default.blockActions,
|
|
27261
27515
|
"data-diff-selection-actions": true,
|
|
27516
|
+
"data-diff-frame-drag": pressInCode ? "" : void 0,
|
|
27262
27517
|
style: { top: frameTop },
|
|
27263
27518
|
children: [
|
|
27264
27519
|
(0, react_jsx_runtime.jsx)("button", {
|
|
27265
27520
|
type: "button",
|
|
27266
27521
|
className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary}`,
|
|
27267
27522
|
"data-diff-selection-keep": true,
|
|
27268
|
-
hidden:
|
|
27523
|
+
hidden: !selectionKeepRevert,
|
|
27269
27524
|
disabled: busy,
|
|
27270
27525
|
onClick: () => {
|
|
27271
27526
|
handleSelectionAction("keep");
|
|
@@ -27276,14 +27531,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27276
27531
|
type: "button",
|
|
27277
27532
|
className: PendingPanel_module_css_default.action,
|
|
27278
27533
|
"data-diff-selection-revert": true,
|
|
27279
|
-
hidden:
|
|
27534
|
+
hidden: !selectionKeepRevert,
|
|
27280
27535
|
disabled: busy,
|
|
27281
27536
|
onClick: () => {
|
|
27282
27537
|
handleSelectionAction("revert");
|
|
27283
27538
|
},
|
|
27284
27539
|
children: t("action.revert")
|
|
27285
27540
|
}),
|
|
27286
|
-
|
|
27541
|
+
selectionKeepRevert && selectionCommentOffered && (0, react_jsx_runtime.jsx)("span", {
|
|
27287
27542
|
className: PendingPanel_module_css_default.blockActionsDivider,
|
|
27288
27543
|
"data-diff-selection-divider": true,
|
|
27289
27544
|
"aria-hidden": "true"
|
|
@@ -27848,6 +28103,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27848
28103
|
doomed
|
|
27849
28104
|
}) : t("panel.batchRevertAllAsk", { count: prompt.ids.length });
|
|
27850
28105
|
}
|
|
28106
|
+
if (kind === "refresh-picked") return t("panel.batchRefreshVcsAsk", { count: prompt.ids.length });
|
|
27851
28107
|
return t(kind === "keep-picked" ? "panel.batchKeepAsk" : kind === "keep-remove-picked" ? "panel.batchKeepRemoveAsk" : kind === "revert-picked" ? "panel.batchRevertAsk" : kind === "revert-remove-picked" ? "panel.batchRevertRemoveAsk" : kind === "keep-all" ? "panel.batchKeepAllAsk" : "panel.batchCloseAsk", { count: prompt.ids.length });
|
|
27852
28108
|
};
|
|
27853
28109
|
/**
|
|
@@ -27888,7 +28144,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27888
28144
|
if (prompt.kind === "keep-picked") onKeepMany(prompt.sessionId, ids, true);
|
|
27889
28145
|
else if (prompt.kind === "keep-remove-picked") onKeepMany(prompt.sessionId, ids, void 0);
|
|
27890
28146
|
else if (prompt.kind === "revert-picked") onRevertMany(prompt.sessionId, ids, true);
|
|
27891
|
-
else onRevertMany(prompt.sessionId, ids, void 0);
|
|
28147
|
+
else if (prompt.kind === "revert-remove-picked") onRevertMany(prompt.sessionId, ids, void 0);
|
|
28148
|
+
else runRefreshPicked(ids);
|
|
27892
28149
|
};
|
|
27893
28150
|
/**
|
|
27894
28151
|
* The comments the reader has picked in the list (Ctrl/Cmd-click), by id.
|
|
@@ -28649,20 +28906,45 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28649
28906
|
}
|
|
28650
28907
|
};
|
|
28651
28908
|
/**
|
|
28909
|
+
* Reset ONE file's diff to what the VCS scan reports, up to the point where the result is said out loud.
|
|
28910
|
+
*
|
|
28911
|
+
* Both presses come through here: the open file's toolbar button reports one result per file, and the row
|
|
28912
|
+
* menu's reset over a pick reports one summary for the whole selection (see `runRefreshVcs` and
|
|
28913
|
+
* `runRefreshPicked`). A `committed` outcome — the file already holds its baseline — is settled by the
|
|
28914
|
+
* whole-file KEEP, through the same wrapper the Keep button runs, so the "ask after a whole-file keep"
|
|
28915
|
+
* preference and the comments a drop would take with it are honoured identically whichever press found it.
|
|
28916
|
+
*
|
|
28917
|
+
* @param entry - the entry to reset.
|
|
28918
|
+
* @param sessionId - the session to ask about it in.
|
|
28919
|
+
* @returns the outcome, or the error the call raised (the callers word those differently).
|
|
28920
|
+
*/
|
|
28921
|
+
const refreshVcsOnce = async (entry, sessionId) => {
|
|
28922
|
+
let outcome;
|
|
28923
|
+
try {
|
|
28924
|
+
outcome = (await onRefreshVcs(sessionId, entry.id, includeUntrackedEnabled())).outcome;
|
|
28925
|
+
} catch (error) {
|
|
28926
|
+
return { error };
|
|
28927
|
+
}
|
|
28928
|
+
if (outcome === "committed") await keepWithPrompt(entry.sessionId, entry.id);
|
|
28929
|
+
return { outcome };
|
|
28930
|
+
};
|
|
28931
|
+
/**
|
|
28652
28932
|
* Replace one file's diff with its current local VCS change, then report what
|
|
28653
28933
|
* the scan found. A scan that sees no change leaves the entry alone, so the
|
|
28654
28934
|
* message names the file rather than silently blanking a review in progress.
|
|
28935
|
+
*
|
|
28936
|
+
* This is the open file's own toolbar press, reached from a single row's menu too: one file in, one
|
|
28937
|
+
* message out, and no confirmation (the button has none either).
|
|
28655
28938
|
*/
|
|
28656
28939
|
const runRefreshVcs = async (entry) => {
|
|
28657
28940
|
if (current === void 0) return;
|
|
28658
|
-
const
|
|
28659
|
-
|
|
28660
|
-
|
|
28661
|
-
outcome = (await onRefreshVcs(current, entry.id, includeUntracked)).outcome;
|
|
28662
|
-
} catch (error) {
|
|
28941
|
+
const result = await refreshVcsOnce(entry, current);
|
|
28942
|
+
if ("error" in result) {
|
|
28943
|
+
const { error } = result;
|
|
28663
28944
|
showCopyToast(t("panel.refreshFailed", { message: error instanceof Error ? error.message : String(error) }));
|
|
28664
28945
|
return;
|
|
28665
28946
|
}
|
|
28947
|
+
const outcome = result.outcome;
|
|
28666
28948
|
if (outcome === "refreshed") {
|
|
28667
28949
|
showCopyToast(t("panel.refreshDone"));
|
|
28668
28950
|
return;
|
|
@@ -28672,10 +28954,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28672
28954
|
return;
|
|
28673
28955
|
}
|
|
28674
28956
|
if (outcome === "no-change") {
|
|
28675
|
-
const hint =
|
|
28957
|
+
const hint = includeUntrackedEnabled() ? "" : ` ${t("panel.refreshUntrackedHint")}`;
|
|
28676
28958
|
showCopyToast(`${t("panel.refreshNone")}${hint}`);
|
|
28677
28959
|
return;
|
|
28678
28960
|
}
|
|
28961
|
+
if (outcome === "committed") {
|
|
28962
|
+
showCopyToast(t("panel.refreshCommitted"));
|
|
28963
|
+
return;
|
|
28964
|
+
}
|
|
28679
28965
|
if (outcome === "no-vcs") {
|
|
28680
28966
|
showCopyToast(t("panel.importNoVcs"));
|
|
28681
28967
|
return;
|
|
@@ -28683,6 +28969,46 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28683
28969
|
showCopyToast(t("panel.fileNotPending"));
|
|
28684
28970
|
};
|
|
28685
28971
|
/**
|
|
28972
|
+
* The row menu's reset over a pick: the SAME single-entry path, one file at a time, and ONE summary when
|
|
28973
|
+
* it is done.
|
|
28974
|
+
*
|
|
28975
|
+
* Per-file messages are deliberately not raised — the reader answered ONE question (the confirm dialog,
|
|
28976
|
+
* which counted the files) and gets one answer — and a `committed` entry is still settled through the
|
|
28977
|
+
* keep `refreshVcsOnce` runs, because it is the same call that found it. The reset itself is never
|
|
28978
|
+
* confirmed a second time: the batch dialog is that confirmation, and the single-file press has none at
|
|
28979
|
+
* all. (A committed entry's KEEP keeps its own remove-or-keep question, the one the Keep button asks,
|
|
28980
|
+
* because that question is about the row leaving the list rather than about the reset.)
|
|
28981
|
+
*
|
|
28982
|
+
* @param ids - the picked entries, in the list's own order.
|
|
28983
|
+
*/
|
|
28984
|
+
const runRefreshPicked = async (ids) => {
|
|
28985
|
+
if (current === void 0) return;
|
|
28986
|
+
let done = 0;
|
|
28987
|
+
let none = 0;
|
|
28988
|
+
let failed = 0;
|
|
28989
|
+
for (const id of ids) {
|
|
28990
|
+
const entry = files.find((file) => file.id === id);
|
|
28991
|
+
if (entry === void 0) {
|
|
28992
|
+
none += 1;
|
|
28993
|
+
continue;
|
|
28994
|
+
}
|
|
28995
|
+
const result = await refreshVcsOnce(entry, current);
|
|
28996
|
+
if ("error" in result) failed += 1;
|
|
28997
|
+
else if (result.outcome === "refreshed" || result.outcome === "committed") done += 1;
|
|
28998
|
+
else none += 1;
|
|
28999
|
+
}
|
|
29000
|
+
if (failed > 0) showCopyToast(t("panel.refreshManyFailed", {
|
|
29001
|
+
done,
|
|
29002
|
+
none,
|
|
29003
|
+
failed
|
|
29004
|
+
}));
|
|
29005
|
+
else if (none > 0) showCopyToast(t("panel.refreshManyMixed", {
|
|
29006
|
+
done,
|
|
29007
|
+
none
|
|
29008
|
+
}));
|
|
29009
|
+
else showCopyToast(t("panel.refreshManyDone", { count: done }));
|
|
29010
|
+
};
|
|
29011
|
+
/**
|
|
28686
29012
|
* Open a path typed into the detail header's field: add it to the list when it is not there
|
|
28687
29013
|
* yet, then select the file the host says it landed as.
|
|
28688
29014
|
*
|
|
@@ -28821,7 +29147,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28821
29147
|
}
|
|
28822
29148
|
}
|
|
28823
29149
|
}, entry.id);
|
|
28824
|
-
/** The row menu's rows: the pair the file's own toolbar offers, or its single 移出. */
|
|
29150
|
+
/** The row menu's rows: the pair the file's own toolbar offers plus that toolbar's own reset, or its single 移出. */
|
|
28825
29151
|
const rowMenuItems = (0, react.useMemo)(() => {
|
|
28826
29152
|
if (rowMenu === null) return [];
|
|
28827
29153
|
if (rowMenu.picked) return [
|
|
@@ -28840,6 +29166,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28840
29166
|
{
|
|
28841
29167
|
id: "revert-remove-picked",
|
|
28842
29168
|
label: t("row.revertRemove")
|
|
29169
|
+
},
|
|
29170
|
+
{
|
|
29171
|
+
type: "separator",
|
|
29172
|
+
id: "refresh-picked-separator"
|
|
29173
|
+
},
|
|
29174
|
+
{
|
|
29175
|
+
id: "refresh-picked",
|
|
29176
|
+
label: t("action.refreshVcs")
|
|
28843
29177
|
}
|
|
28844
29178
|
];
|
|
28845
29179
|
const openRows = [
|
|
@@ -28856,10 +29190,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28856
29190
|
label: t("action.revealFile")
|
|
28857
29191
|
}
|
|
28858
29192
|
];
|
|
28859
|
-
if (fileHasNoDiff(rowMenu.file)) return [
|
|
28860
|
-
|
|
28861
|
-
|
|
28862
|
-
|
|
29193
|
+
if (fileHasNoDiff(rowMenu.file)) return [
|
|
29194
|
+
{
|
|
29195
|
+
id: "remove",
|
|
29196
|
+
label: t("row.dismiss")
|
|
29197
|
+
},
|
|
29198
|
+
{
|
|
29199
|
+
type: "separator",
|
|
29200
|
+
id: "refresh-vcs-separator"
|
|
29201
|
+
},
|
|
29202
|
+
{
|
|
29203
|
+
id: "refresh-vcs",
|
|
29204
|
+
label: t("action.refreshVcs")
|
|
29205
|
+
},
|
|
29206
|
+
...openRows
|
|
29207
|
+
];
|
|
28863
29208
|
const revertLabel = rowMenu.file.earlierVersion === "none" ? t("action.delete") : t("action.revert");
|
|
28864
29209
|
return [
|
|
28865
29210
|
{
|
|
@@ -28878,6 +29223,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28878
29223
|
id: "revert-remove",
|
|
28879
29224
|
label: rowMenu.file.earlierVersion === "none" ? t("row.deleteRemove") : t("row.revertRemove")
|
|
28880
29225
|
},
|
|
29226
|
+
{
|
|
29227
|
+
type: "separator",
|
|
29228
|
+
id: "refresh-vcs-separator"
|
|
29229
|
+
},
|
|
29230
|
+
{
|
|
29231
|
+
id: "refresh-vcs",
|
|
29232
|
+
label: t("action.refreshVcs")
|
|
29233
|
+
},
|
|
28881
29234
|
...openRows
|
|
28882
29235
|
];
|
|
28883
29236
|
}, [
|
|
@@ -28902,6 +29255,15 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28902
29255
|
clearPickedFiles();
|
|
28903
29256
|
return;
|
|
28904
29257
|
}
|
|
29258
|
+
if (id === "refresh-picked") {
|
|
29259
|
+
setBatchPrompt({
|
|
29260
|
+
sessionId: current,
|
|
29261
|
+
kind: "refresh-picked",
|
|
29262
|
+
ids,
|
|
29263
|
+
doomed: []
|
|
29264
|
+
});
|
|
29265
|
+
return;
|
|
29266
|
+
}
|
|
28905
29267
|
if (id !== "keep-picked" && id !== "keep-remove-picked" && id !== "revert-picked" && id !== "revert-remove-picked") return;
|
|
28906
29268
|
const doomed = id.startsWith("revert") ? picked.filter((file) => file.earlierVersion === "none").map((file) => file.id) : [];
|
|
28907
29269
|
setBatchPrompt({
|
|
@@ -28925,6 +29287,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28925
29287
|
else if (id === "keep-remove" || id === "remove") onKeep(current, target.file.id);
|
|
28926
29288
|
else if (id === "revert") onRevert(current, target.file.id, true);
|
|
28927
29289
|
else if (id === "revert-remove") onRevert(current, target.file.id);
|
|
29290
|
+
else if (id === "refresh-vcs") runRefreshVcs(target.file);
|
|
28928
29291
|
else if (id === "open-file") onOpen(target.file.sessionId, target.file.id, "open");
|
|
28929
29292
|
else if (id === "open-folder") onOpen(target.file.sessionId, target.file.id, "reveal");
|
|
28930
29293
|
};
|
|
@@ -31825,8 +32188,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
31825
32188
|
const value = result.value;
|
|
31826
32189
|
if (typeof value !== "object" || value === null) throw new Error("the refresh returned a malformed value");
|
|
31827
32190
|
const outcome = value.outcome;
|
|
31828
|
-
if (outcome !== "refreshed" && outcome !== "unchanged" && outcome !== "no-change" && outcome !== "missing" && outcome !== "no-vcs") throw new Error("the refresh returned a malformed outcome");
|
|
31829
|
-
|
|
32191
|
+
if (outcome !== "refreshed" && outcome !== "unchanged" && outcome !== "no-change" && outcome !== "committed" && outcome !== "missing" && outcome !== "no-vcs") throw new Error("the refresh returned a malformed outcome");
|
|
32192
|
+
const resolved = value.resolved;
|
|
32193
|
+
if (resolved !== void 0 && typeof resolved !== "boolean") throw new Error("the refresh returned a malformed value");
|
|
32194
|
+
return resolved === void 0 ? { outcome } : {
|
|
32195
|
+
outcome,
|
|
32196
|
+
resolved
|
|
32197
|
+
};
|
|
31830
32198
|
}
|
|
31831
32199
|
/** Narrow the list-path endpoint's value; a malformed wire value is a browse failure. */
|
|
31832
32200
|
function browseValueOf(result) {
|
|
@@ -33206,8 +33574,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
33206
33574
|
"panel.refreshDone": "已重置成版本控制的差异",
|
|
33207
33575
|
"panel.refreshUnchanged": "条目已经是版本控制的差异,未变",
|
|
33208
33576
|
"panel.refreshNone": "版本控制报告该文件没有未提交的改动",
|
|
33577
|
+
"panel.refreshCommitted": "改动已经提交,条目已保留",
|
|
33209
33578
|
"panel.refreshUntrackedHint": "(未跟踪的新文件需要在设置里开启「包含版本控制未跟踪文件」)",
|
|
33210
33579
|
"panel.refreshFailed": "版本控制重置失败:{message}",
|
|
33580
|
+
"panel.batchRefreshVcsAsk": "把 {count} 个文件重置成版本控制的差异?",
|
|
33581
|
+
"panel.refreshManyDone": "已把 {count} 个文件重置成版本控制的差异",
|
|
33582
|
+
"panel.refreshManyMixed": "已把 {done} 个文件重置成版本控制的差异,{none} 个没有可重置的改动",
|
|
33583
|
+
"panel.refreshManyFailed": "已把 {done} 个文件重置成版本控制的差异,{none} 个没有可重置的改动,{failed} 个失败",
|
|
33211
33584
|
"action.addPath": "按文件或目录添加",
|
|
33212
33585
|
"panel.addTitle": "添加到列表",
|
|
33213
33586
|
"panel.addPathPlaceholder": "输入或粘贴绝对路径",
|
|
@@ -33459,8 +33832,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
33459
33832
|
"panel.refreshDone": "Reset this entry to the version-control diff",
|
|
33460
33833
|
"panel.refreshUnchanged": "Already the version-control diff; the entry is unchanged",
|
|
33461
33834
|
"panel.refreshNone": "Version control reports no uncommitted change for this file",
|
|
33835
|
+
"panel.refreshCommitted": "The change is already committed; the entry was kept",
|
|
33462
33836
|
"panel.refreshUntrackedHint": "(a new, untracked file needs \"Include files version control has not seen\" in Settings)",
|
|
33463
33837
|
"panel.refreshFailed": "Version-control reset failed: {message}",
|
|
33838
|
+
"panel.batchRefreshVcsAsk": "Reset {count} file(s) to the version-control diff?",
|
|
33839
|
+
"panel.refreshManyDone": "Reset {count} file(s) to the version-control diff",
|
|
33840
|
+
"panel.refreshManyMixed": "Reset {done} file(s) to the version-control diff; {none} had nothing to reset",
|
|
33841
|
+
"panel.refreshManyFailed": "Reset {done} file(s) to the version-control diff; {none} had nothing to reset; {failed} failed",
|
|
33464
33842
|
"action.addPath": "Add by file or by directory",
|
|
33465
33843
|
"panel.addTitle": "Add to list",
|
|
33466
33844
|
"panel.addPathPlaceholder": "Type or paste an absolute path",
|