dsh-diff-approval 0.24.1 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +1078 -374
- package/lib/index.js +56 -20
- package/lib/types/client/PendingPanel.d.ts +24 -0
- package/lib/types/client/discussion.d.ts +68 -16
- package/lib/types/client/locales.d.ts +24 -6
- package/lib/types/client/panel-memory.d.ts +7 -0
- package/lib/types/client/port.d.ts +5 -2
- package/lib/types/client/settings.d.ts +13 -0
- package/lib/types/client/slots.d.ts +1 -1
- package/lib/types/client/store.d.ts +1 -1
- package/lib/types/types.d.ts +11 -0
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -21,7 +21,7 @@ window.__ModuleLoader__.load({
|
|
|
21
21
|
let react_dom = require("react-dom");
|
|
22
22
|
let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
23
23
|
//#region \0dsh-css:/home/runner/work/dsh-diff-approval/dsh-diff-approval/src/client/PendingPanel.module.css.mjs
|
|
24
|
-
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{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_discussionUser,.F1KBNa_panel .F1KBNa_discussionAnswer,.F1KBNa_panel .F1KBNa_quoteText,.F1KBNa_panel .F1KBNa_diffPath,.F1KBNa_panel .F1KBNa_rowPath,.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{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:8px;padding:16px 0;display:flex}.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_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_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{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;top:0;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{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{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:240px;min-height:0;padding:4px 8px 12px;display:flex}.F1KBNa_listScroll{flex:1;min-height:0;overflow-y:scroll}.F1KBNa_bulkActions{flex:none;gap:6px;padding:8px 8px 0 0;display:flex}.F1KBNa_bulkActions .F1KBNa_action{text-align:center;flex:1}.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_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_confirmText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;margin:0;line-height:1.5}.F1KBNa_confirmActions{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{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,.F1KBNa_hint{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_group{color:var(--dsw-alias-label-tertiary);margin:8px 0 4px;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_groupHead{align-items:center;gap:4px;margin:8px 0 4px;padding-right:8px;display:flex}.F1KBNa_action.F1KBNa_addButton{box-sizing:border-box;border-radius:6px;justify-content:center;align-items:center;width:20px;height:20px;min-height:0;padding:0;display:inline-flex}.F1KBNa_groupHead>.F1KBNa_group{margin:0}.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_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}.F1KBNa_rowHead:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_rowHead[data-selected]{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_kindTag{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_kindHint{color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px;line-height:16px}.F1KBNa_divergedHint,.F1KBNa_missingHint{border-bottom:1px solid var(--dsw-alias-border-l2);margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_missing{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary));white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.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_missingHint{color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary))}.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{white-space:nowrap;scrollbar-width:none;min-width:0;color:var(--dsw-alias-label-primary);flex:1;margin-left:4px;font-size:12px;line-height:18px;position:relative;top:1px;overflow:auto hidden}.F1KBNa_diffPath::-webkit-scrollbar{display:none}.F1KBNa_diffActions{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffStats{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;line-height:16px}.F1KBNa_flexSpacer{flex:1}.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;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.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_expandExpanded svg{transform:rotate(180deg)}.F1KBNa_diffBodyWrap{isolation:isolate;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBody{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:1;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{width:0;height:0;position:sticky;left:0}.F1KBNa_discussion{z-index:2;box-sizing:border-box;border-left:3px solid var(--dsw-alias-label-secondary);cursor:default;background:0 0;flex-direction:column;display:flex;position:absolute;top:0;left:0;overflow:hidden}.F1KBNa_discussionHead,.F1KBNa_discussionBody{font:var(--dsw-font-markdown-code-block)}.F1KBNa_discussionBody{flex-direction:column;flex:auto;min-height:0;padding:0 12px;display:flex;overflow:hidden}.F1KBNa_discussionAnswer{color:var(--dsw-alias-label-primary);font-family:inherit;font-size:calc(1em * var(--dsh-diff-font-scale,1));line-height:var(--dsh-diff-line-height,22px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0}.F1KBNa_discussionUser{padding:calc(var(--dsh-diff-line-height,22px) * .2) calc(var(--dsh-diff-line-height,22px) * .5);margin:calc(var(--dsh-diff-line-height,22px) * .3) 0 calc(var(--dsh-diff-line-height,22px) * .3) auto;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);font-family:inherit;font-size:calc(1em * var(--dsh-diff-font-scale,1));line-height:var(--dsh-diff-line-height,22px);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:8px 0 8px 8px}.F1KBNa_discussionNote{color:var(--dsw-alias-label-secondary);font-family:inherit;font-size:calc(1em * var(--dsh-diff-font-scale,1));line-height:var(--dsh-diff-line-height,22px);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0}.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-size:calc(1em * var(--dsh-diff-font-scale,1));line-height:var(--dsh-diff-line-height,22px);margin:0 -12px 0 -15px;display:table}.F1KBNa_quoteLine{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_discussionOutdated{color:var(--dsw-alias-label-tertiary);font-size:12px;line-height:16px}.F1KBNa_discussionHead{box-sizing:border-box;height:var(--dsh-diff-line-height,22px);flex:none;align-items:center;gap:8px;padding:0 12px;font-size:12px;line-height:16px;display:flex}.F1KBNa_discussionCompose{box-sizing:border-box;height:calc(var(--dsh-diff-line-height,22px) * 2);flex:none;align-items:center;gap:8px;margin:0 -6px;padding:0;display:flex}.F1KBNa_discussionInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);min-width:0;color:var(--dsw-alias-label-primary);font-family:inherit;font-size:calc(1em * var(--dsh-diff-font-scale,1));cursor:text;border-radius:6px;flex:auto;padding:3px 8px;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{font:var(--dsw-font-markdown-code-block);flex:none}.F1KBNa_discussionRange{color:var(--dsw-alias-label-tertiary);font-family:inherit;font-size:calc(1em * var(--dsh-diff-font-scale,1))}.F1KBNa_discussionInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_discussionInput:disabled{border-color:var(--dsw-alias-border-l1);background:var(--dsw-alias-markdown-code-block);color:var(--dsw-alias-label-tertiary);cursor:default}.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;padding-left:9px;padding-right:9px;display:inline-flex}.F1KBNa_rowDiscussed{background-image:linear-gradient(color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent), color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent))}@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_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_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_code{white-space:pre;-webkit-user-select:text;user-select:text;display:table-cell}.F1KBNa_context{color:var(--dsw-alias-label-primary)}.F1KBNa_del{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 12%, transparent)}.F1KBNa_add{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 10%, transparent)}.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;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_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{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)) 12%, transparent)}.F1KBNa_splitLadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 10%, transparent)}.F1KBNa_splitRdel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 12%, transparent)}.F1KBNa_splitRadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 10%, transparent)}.F1KBNa_intraDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 26%, transparent);text-decoration:line-through}.F1KBNa_intraAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 24%, transparent)}";
|
|
24
|
+
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{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_discussionUser,.F1KBNa_panel .F1KBNa_discussionAnswer,.F1KBNa_panel .F1KBNa_quoteText,.F1KBNa_panel .F1KBNa_diffPath,.F1KBNa_panel .F1KBNa_rowPath,.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{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:8px;padding:16px 0;display:flex}.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_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_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{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;top:0;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:240px;min-height:0;padding:4px 8px 12px;display:flex}.F1KBNa_listScroll{flex:1;min-height:0;overflow-y:scroll}.F1KBNa_bulkActions{flex:none;gap:6px;padding:8px 8px 0 0;display:flex}.F1KBNa_bulkActions .F1KBNa_action{text-align:center;flex:auto}.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_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_confirmText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;margin:0;line-height:1.5}.F1KBNa_confirmActions{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{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,.F1KBNa_hint{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_group{color:var(--dsw-alias-label-tertiary);margin:8px 0 4px;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_groupHead{align-items:center;gap:4px;margin:8px 0 4px;padding-right:8px;display:flex}.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_groupHead>.F1KBNa_group{margin:0}.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;padding:3px 8px;font-size:12px;line-height:16px}.F1KBNa_listTab[aria-selected=true]{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.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}.F1KBNa_commentRow:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_commentHead{align-items:baseline;gap:6px;min-width:0;display:flex}.F1KBNa_commentLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-markdown-code-block);font-size:11px;line-height:16px;overflow:hidden}.F1KBNa_commentLost{color:var(--dsw-alias-label-tertiary);flex:none;font-size:11px;line-height:16px}.F1KBNa_commentTitle{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);font-size:12px;line-height:18px;display:block;overflow:hidden}.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}.F1KBNa_rowHead:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_rowHead[data-selected]{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_kindTag{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_kindHint{color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px;line-height:16px}.F1KBNa_divergedHint,.F1KBNa_missingHint{border-bottom:1px solid var(--dsw-alias-border-l2);margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_missing{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary));white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.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_missingHint{color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary))}.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_diffStats{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;line-height:16px}.F1KBNa_flexSpacer{flex:1}.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;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.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_expandExpanded svg{transform:rotate(180deg)}.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_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;cursor:text;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;cursor:text;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;cursor:text;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_discussionHead{box-sizing:border-box;flex:none;align-items:center;gap:8px;height:22px;padding:0 12px;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:auto -6px 0;padding:0 0 6.6px;display:flex}.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{font:var(--dsw-font-markdown-code-block);flex:none}.F1KBNa_discussionRange{color:var(--dsw-alias-label-tertiary);font-family:inherit}.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_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_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(--dsw-alias-markdown-code-block);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_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;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_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_splitLadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent)}.F1KBNa_splitRdel{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)}";
|
|
25
25
|
const tagId = "dsh-diff-approval/PendingPanel.module.css";
|
|
26
26
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
27
27
|
const tag = document.createElement("style");
|
|
@@ -31,232 +31,248 @@ window.__ModuleLoader__.load({
|
|
|
31
31
|
document.head.appendChild(tag);
|
|
32
32
|
}
|
|
33
33
|
var PendingPanel_module_css_default = {
|
|
34
|
-
"
|
|
34
|
+
"colorHue": "F1KBNa_colorHue",
|
|
35
|
+
"splitHScrollFill": "F1KBNa_splitHScrollFill",
|
|
36
|
+
"detailEmpty": "F1KBNa_detailEmpty",
|
|
37
|
+
"settingsGroupTitle": "F1KBNa_settingsGroupTitle",
|
|
38
|
+
"discussionDots": "F1KBNa_discussionDots",
|
|
39
|
+
"searchInput": "F1KBNa_searchInput",
|
|
40
|
+
"gutter": "F1KBNa_gutter",
|
|
41
|
+
"overviewRuler": "F1KBNa_overviewRuler",
|
|
42
|
+
"diffFlashFade": "F1KBNa_diffFlashFade",
|
|
43
|
+
"stepper": "F1KBNa_stepper",
|
|
44
|
+
"delCount": "F1KBNa_delCount",
|
|
45
|
+
"blockFlashShake": "F1KBNa_blockFlashShake",
|
|
46
|
+
"rowHead": "F1KBNa_rowHead",
|
|
47
|
+
"stepperValue": "F1KBNa_stepperValue",
|
|
48
|
+
"discussionRow": "F1KBNa_discussionRow",
|
|
49
|
+
"confirmText": "F1KBNa_confirmText",
|
|
50
|
+
"statusBar": "F1KBNa_statusBar",
|
|
51
|
+
"chip": "F1KBNa_chip",
|
|
52
|
+
"subline": "F1KBNa_subline",
|
|
53
|
+
"threadFontProbe": "F1KBNa_threadFontProbe",
|
|
54
|
+
"discussionDot": "F1KBNa_discussionDot",
|
|
55
|
+
"split": "F1KBNa_split",
|
|
56
|
+
"settingsGroupText": "F1KBNa_settingsGroupText",
|
|
35
57
|
"coverButton": "F1KBNa_coverButton",
|
|
36
|
-
"
|
|
37
|
-
"
|
|
58
|
+
"quoteNoWrap": "F1KBNa_quoteNoWrap",
|
|
59
|
+
"listTabs": "F1KBNa_listTabs",
|
|
60
|
+
"colorBackdrop": "F1KBNa_colorBackdrop",
|
|
61
|
+
"iconAction": "F1KBNa_iconAction",
|
|
62
|
+
"coverBackdrop": "F1KBNa_coverBackdrop",
|
|
63
|
+
"treeCaret": "F1KBNa_treeCaret",
|
|
64
|
+
"missing": "F1KBNa_missing",
|
|
65
|
+
"importButton": "F1KBNa_importButton",
|
|
66
|
+
"splitRoot": "F1KBNa_splitRoot",
|
|
67
|
+
"layer": "F1KBNa_layer",
|
|
68
|
+
"settingsRow": "F1KBNa_settingsRow",
|
|
38
69
|
"colorPicker": "F1KBNa_colorPicker",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
70
|
+
"rowMenuAnchor": "F1KBNa_rowMenuAnchor",
|
|
71
|
+
"pickerCheck": "F1KBNa_pickerCheck",
|
|
72
|
+
"chipLabel": "F1KBNa_chipLabel",
|
|
73
|
+
"listScroll": "F1KBNa_listScroll",
|
|
74
|
+
"discussionHead": "F1KBNa_discussionHead",
|
|
75
|
+
"colorPickerChevron": "F1KBNa_colorPickerChevron",
|
|
76
|
+
"pickerName": "F1KBNa_pickerName",
|
|
77
|
+
"listTitle": "F1KBNa_listTitle",
|
|
78
|
+
"diffBody": "F1KBNa_diffBody",
|
|
79
|
+
"note": "F1KBNa_note",
|
|
80
|
+
"settingsPage": "F1KBNa_settingsPage",
|
|
50
81
|
"fileListKnob": "F1KBNa_fileListKnob",
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"tree": "F1KBNa_tree",
|
|
55
|
-
"discussionPin": "F1KBNa_discussionPin",
|
|
56
|
-
"emptyActions": "F1KBNa_emptyActions",
|
|
57
|
-
"coverCard": "F1KBNa_coverCard",
|
|
58
|
-
"importButton": "F1KBNa_importButton",
|
|
59
|
-
"settingsRowDesc": "F1KBNa_settingsRowDesc",
|
|
60
|
-
"panelDocked": "F1KBNa_panelDocked",
|
|
61
|
-
"treeName": "F1KBNa_treeName",
|
|
62
|
-
"blockFlash": "F1KBNa_blockFlash",
|
|
63
|
-
"coverPopover": "F1KBNa_coverPopover",
|
|
64
|
-
"noticeButton": "F1KBNa_noticeButton",
|
|
65
|
-
"intraAdd": "F1KBNa_intraAdd",
|
|
66
|
-
"mdPreviewSingle": "F1KBNa_mdPreviewSingle",
|
|
67
|
-
"expand": "F1KBNa_expand",
|
|
68
|
-
"blockPosition": "F1KBNa_blockPosition",
|
|
69
|
-
"overviewRuler": "F1KBNa_overviewRuler",
|
|
70
|
-
"badge": "F1KBNa_badge",
|
|
71
|
-
"line": "F1KBNa_line",
|
|
72
|
-
"states": "F1KBNa_states",
|
|
73
|
-
"quoteCode": "F1KBNa_quoteCode",
|
|
74
|
-
"confirmText": "F1KBNa_confirmText",
|
|
75
|
-
"dockHost": "F1KBNa_dockHost",
|
|
76
|
-
"searchInput": "F1KBNa_searchInput",
|
|
77
|
-
"diffPreviewScroll": "F1KBNa_diffPreviewScroll",
|
|
78
|
-
"discussionDots": "F1KBNa_discussionDots",
|
|
79
|
-
"vSpacer": "F1KBNa_vSpacer",
|
|
80
|
-
"splitCols": "F1KBNa_splitCols",
|
|
81
|
-
"colorSvCursor": "F1KBNa_colorSvCursor",
|
|
82
|
-
"settingsGroupTitle": "F1KBNa_settingsGroupTitle",
|
|
83
|
-
"diffHeader": "F1KBNa_diffHeader",
|
|
84
|
-
"actionError": "F1KBNa_actionError",
|
|
85
|
-
"colorHueCursor": "F1KBNa_colorHueCursor",
|
|
86
|
-
"fileListFloatClosing": "F1KBNa_fileListFloatClosing",
|
|
87
|
-
"mdPreviewBody": "F1KBNa_mdPreviewBody",
|
|
88
|
-
"badgeLabel": "F1KBNa_badgeLabel",
|
|
82
|
+
"fileList": "F1KBNa_fileList",
|
|
83
|
+
"addCount": "F1KBNa_addCount",
|
|
84
|
+
"coverNoticeCard": "F1KBNa_coverNoticeCard",
|
|
89
85
|
"wrap": "F1KBNa_wrap",
|
|
86
|
+
"listEmpty": "F1KBNa_listEmpty",
|
|
87
|
+
"mdPreviewWrap": "F1KBNa_mdPreviewWrap",
|
|
90
88
|
"kindHint": "F1KBNa_kindHint",
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"searchToggle": "F1KBNa_searchToggle",
|
|
96
|
-
"headerActions": "F1KBNa_headerActions",
|
|
97
|
-
"notice": "F1KBNa_notice",
|
|
98
|
-
"quoteNoWrap": "F1KBNa_quoteNoWrap",
|
|
99
|
-
"pickerCheck": "F1KBNa_pickerCheck",
|
|
100
|
-
"intraDel": "F1KBNa_intraDel",
|
|
101
|
-
"quoteLine": "F1KBNa_quoteLine",
|
|
102
|
-
"splitLdel": "F1KBNa_splitLdel",
|
|
103
|
-
"searchCount": "F1KBNa_searchCount",
|
|
104
|
-
"footerButtons": "F1KBNa_footerButtons",
|
|
105
|
-
"confirmCard": "F1KBNa_confirmCard",
|
|
106
|
-
"discussionUser": "F1KBNa_discussionUser",
|
|
107
|
-
"noteCentered": "F1KBNa_noteCentered",
|
|
108
|
-
"discussionInput": "F1KBNa_discussionInput",
|
|
109
|
-
"fileListFloat": "F1KBNa_fileListFloat",
|
|
110
|
-
"mdPreviewContent": "F1KBNa_mdPreviewContent",
|
|
89
|
+
"toggleThumb": "F1KBNa_toggleThumb",
|
|
90
|
+
"discussionPin": "F1KBNa_discussionPin",
|
|
91
|
+
"commentHead": "F1KBNa_commentHead",
|
|
92
|
+
"settingsGroupChevron": "F1KBNa_settingsGroupChevron",
|
|
111
93
|
"diffFlashShake": "F1KBNa_diffFlashShake",
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
115
|
-
"bulkActions": "F1KBNa_bulkActions",
|
|
116
|
-
"presentationHost": "F1KBNa_presentationHost",
|
|
117
|
-
"mdPreviewFallback": "F1KBNa_mdPreviewFallback",
|
|
118
|
-
"treeNote": "F1KBNa_treeNote",
|
|
119
|
-
"discussionHead": "F1KBNa_discussionHead",
|
|
120
|
-
"headerEntryCount": "F1KBNa_headerEntryCount",
|
|
121
|
-
"chipLabel": "F1KBNa_chipLabel",
|
|
122
|
-
"header": "F1KBNa_header",
|
|
123
|
-
"discussionCell": "F1KBNa_discussionCell",
|
|
124
|
-
"confirmActions": "F1KBNa_confirmActions",
|
|
125
|
-
"lines": "F1KBNa_lines",
|
|
126
|
-
"rail": "F1KBNa_rail",
|
|
127
|
-
"colorPickerPanel": "F1KBNa_colorPickerPanel",
|
|
128
|
-
"settingsGroup": "F1KBNa_settingsGroup",
|
|
129
|
-
"rowMeta": "F1KBNa_rowMeta",
|
|
130
|
-
"badgeCount": "F1KBNa_badgeCount",
|
|
94
|
+
"noticeButton": "F1KBNa_noticeButton",
|
|
95
|
+
"splitRadd": "F1KBNa_splitRadd",
|
|
96
|
+
"coverNoticeFade": "F1KBNa_coverNoticeFade",
|
|
131
97
|
"pickerClose": "F1KBNa_pickerClose",
|
|
132
|
-
"
|
|
133
|
-
"
|
|
98
|
+
"colorSwatch": "F1KBNa_colorSwatch",
|
|
99
|
+
"colorHueCursor": "F1KBNa_colorHueCursor",
|
|
100
|
+
"coverNoticeText": "F1KBNa_coverNoticeText",
|
|
134
101
|
"close": "F1KBNa_close",
|
|
135
|
-
"
|
|
136
|
-
"
|
|
137
|
-
"
|
|
138
|
-
"
|
|
139
|
-
"
|
|
140
|
-
"
|
|
141
|
-
"
|
|
142
|
-
"
|
|
143
|
-
"
|
|
144
|
-
"
|
|
145
|
-
"pickerInput": "F1KBNa_pickerInput",
|
|
102
|
+
"lines": "F1KBNa_lines",
|
|
103
|
+
"discussionSend": "F1KBNa_discussionSend",
|
|
104
|
+
"searchBar": "F1KBNa_searchBar",
|
|
105
|
+
"noticeText": "F1KBNa_noticeText",
|
|
106
|
+
"badge": "F1KBNa_badge",
|
|
107
|
+
"rows": "F1KBNa_rows",
|
|
108
|
+
"discussionNote": "F1KBNa_discussionNote",
|
|
109
|
+
"coverPopover": "F1KBNa_coverPopover",
|
|
110
|
+
"coverNoticeGlyph": "F1KBNa_coverNoticeGlyph",
|
|
111
|
+
"diffPath": "F1KBNa_diffPath",
|
|
146
112
|
"markerDel": "F1KBNa_markerDel",
|
|
147
|
-
"addCount": "F1KBNa_addCount",
|
|
148
|
-
"colorSv": "F1KBNa_colorSv",
|
|
149
|
-
"diffPreview": "F1KBNa_diffPreview",
|
|
150
|
-
"discussionRow": "F1KBNa_discussionRow",
|
|
151
|
-
"markerAdd": "F1KBNa_markerAdd",
|
|
152
|
-
"fileList": "F1KBNa_fileList",
|
|
153
|
-
"coverNoticeCard": "F1KBNa_coverNoticeCard",
|
|
154
113
|
"colorPickerInput": "F1KBNa_colorPickerInput",
|
|
155
114
|
"treeRow": "F1KBNa_treeRow",
|
|
156
|
-
"
|
|
157
|
-
"
|
|
158
|
-
"
|
|
115
|
+
"blockPosition": "F1KBNa_blockPosition",
|
|
116
|
+
"discussionRangeWrap": "F1KBNa_discussionRangeWrap",
|
|
117
|
+
"coverNotice": "F1KBNa_coverNotice",
|
|
118
|
+
"splitLadd": "F1KBNa_splitLadd",
|
|
119
|
+
"overviewMarker": "F1KBNa_overviewMarker",
|
|
120
|
+
"commentLost": "F1KBNa_commentLost",
|
|
121
|
+
"settingsGroupDesc": "F1KBNa_settingsGroupDesc",
|
|
122
|
+
"quoteLines": "F1KBNa_quoteLines",
|
|
159
123
|
"row": "F1KBNa_row",
|
|
160
|
-
"discussionSend": "F1KBNa_discussionSend",
|
|
161
|
-
"flexSpacer": "F1KBNa_flexSpacer",
|
|
162
|
-
"settingsGroupText": "F1KBNa_settingsGroupText",
|
|
163
|
-
"panelFailureRetry": "F1KBNa_panelFailureRetry",
|
|
164
124
|
"discussionCompose": "F1KBNa_discussionCompose",
|
|
165
|
-
"
|
|
166
|
-
"
|
|
167
|
-
"splitRdel": "F1KBNa_splitRdel",
|
|
168
|
-
"importNote": "F1KBNa_importNote",
|
|
169
|
-
"settingsRowText": "F1KBNa_settingsRowText",
|
|
170
|
-
"toggleOn": "F1KBNa_toggleOn",
|
|
125
|
+
"chipPresentation": "F1KBNa_chipPresentation",
|
|
126
|
+
"diffPreviewScroll": "F1KBNa_diffPreviewScroll",
|
|
171
127
|
"divider": "F1KBNa_divider",
|
|
172
|
-
"
|
|
128
|
+
"blockFlash": "F1KBNa_blockFlash",
|
|
129
|
+
"badgeCount": "F1KBNa_badgeCount",
|
|
130
|
+
"expandExpanded": "F1KBNa_expandExpanded",
|
|
131
|
+
"splitRdel": "F1KBNa_splitRdel",
|
|
132
|
+
"mirrored": "F1KBNa_mirrored",
|
|
133
|
+
"searchToggleOn": "F1KBNa_searchToggleOn",
|
|
134
|
+
"quoteAdd": "F1KBNa_quoteAdd",
|
|
135
|
+
"emptyActions": "F1KBNa_emptyActions",
|
|
136
|
+
"quoteCode": "F1KBNa_quoteCode",
|
|
137
|
+
"quoteText": "F1KBNa_quoteText",
|
|
138
|
+
"stepperButton": "F1KBNa_stepperButton",
|
|
139
|
+
"fileListKnobIn": "F1KBNa_fileListKnobIn",
|
|
140
|
+
"splitLdel": "F1KBNa_splitLdel",
|
|
141
|
+
"presentationHost": "F1KBNa_presentationHost",
|
|
142
|
+
"readError": "F1KBNa_readError",
|
|
143
|
+
"settingsRowTitle": "F1KBNa_settingsRowTitle",
|
|
144
|
+
"splitHScroll": "F1KBNa_splitHScroll",
|
|
145
|
+
"settingsGroupBody": "F1KBNa_settingsGroupBody",
|
|
146
|
+
"diffStats": "F1KBNa_diffStats",
|
|
173
147
|
"coverHost": "F1KBNa_coverHost",
|
|
174
|
-
"
|
|
175
|
-
"
|
|
176
|
-
"
|
|
177
|
-
"
|
|
178
|
-
"
|
|
148
|
+
"settingsReset": "F1KBNa_settingsReset",
|
|
149
|
+
"mdPreviewFallback": "F1KBNa_mdPreviewFallback",
|
|
150
|
+
"confirmCard": "F1KBNa_confirmCard",
|
|
151
|
+
"discussionToggle": "F1KBNa_discussionToggle",
|
|
152
|
+
"rowDiscussed": "F1KBNa_rowDiscussed",
|
|
153
|
+
"coverCard": "F1KBNa_coverCard",
|
|
154
|
+
"settingsSelector": "F1KBNa_settingsSelector",
|
|
155
|
+
"pickerTitle": "F1KBNa_pickerTitle",
|
|
156
|
+
"colorPickerPreview": "F1KBNa_colorPickerPreview",
|
|
157
|
+
"headerEntry": "F1KBNa_headerEntry",
|
|
158
|
+
"panelDocked": "F1KBNa_panelDocked",
|
|
159
|
+
"listFold": "F1KBNa_listFold",
|
|
160
|
+
"rowPath": "F1KBNa_rowPath",
|
|
161
|
+
"toggleOn": "F1KBNa_toggleOn",
|
|
162
|
+
"missingHint": "F1KBNa_missingHint",
|
|
179
163
|
"rowFailed": "F1KBNa_rowFailed",
|
|
180
|
-
"
|
|
181
|
-
"
|
|
182
|
-
"discussionNote": "F1KBNa_discussionNote",
|
|
164
|
+
"mdPreviewDouble": "F1KBNa_mdPreviewDouble",
|
|
165
|
+
"discussionBody": "F1KBNa_discussionBody",
|
|
183
166
|
"detail": "F1KBNa_detail",
|
|
184
|
-
"coverNoticeText": "F1KBNa_coverNoticeText",
|
|
185
|
-
"pickerForm": "F1KBNa_pickerForm",
|
|
186
|
-
"del": "F1KBNa_del",
|
|
187
|
-
"splitLadd": "F1KBNa_splitLadd",
|
|
188
|
-
"pickerTitle": "F1KBNa_pickerTitle",
|
|
189
|
-
"toggleThumb": "F1KBNa_toggleThumb",
|
|
190
|
-
"pickerName": "F1KBNa_pickerName",
|
|
191
|
-
"code": "F1KBNa_code",
|
|
192
|
-
"statusAction": "F1KBNa_statusAction",
|
|
193
|
-
"confirmBackdrop": "F1KBNa_confirmBackdrop",
|
|
194
|
-
"overviewMarker": "F1KBNa_overviewMarker",
|
|
195
|
-
"mdPreviewWrap": "F1KBNa_mdPreviewWrap",
|
|
196
167
|
"splitCol": "F1KBNa_splitCol",
|
|
197
|
-
"
|
|
198
|
-
"
|
|
199
|
-
"
|
|
200
|
-
"
|
|
201
|
-
"
|
|
202
|
-
"
|
|
203
|
-
"
|
|
204
|
-
"
|
|
205
|
-
"
|
|
206
|
-
"
|
|
168
|
+
"code": "F1KBNa_code",
|
|
169
|
+
"mdPreviewContent": "F1KBNa_mdPreviewContent",
|
|
170
|
+
"diffPreview": "F1KBNa_diffPreview",
|
|
171
|
+
"quoteLine": "F1KBNa_quoteLine",
|
|
172
|
+
"colorSv": "F1KBNa_colorSv",
|
|
173
|
+
"mdPreviewBody": "F1KBNa_mdPreviewBody",
|
|
174
|
+
"discussionUser": "F1KBNa_discussionUser",
|
|
175
|
+
"addButton": "F1KBNa_addButton",
|
|
176
|
+
"discussionCode": "F1KBNa_discussionCode",
|
|
177
|
+
"headerEntryCount": "F1KBNa_headerEntryCount",
|
|
178
|
+
"settingsRowText": "F1KBNa_settingsRowText",
|
|
179
|
+
"panelFailure": "F1KBNa_panelFailure",
|
|
180
|
+
"pickerIcon": "F1KBNa_pickerIcon",
|
|
181
|
+
"rail": "F1KBNa_rail",
|
|
182
|
+
"pickerForm": "F1KBNa_pickerForm",
|
|
183
|
+
"langSelect": "F1KBNa_langSelect",
|
|
207
184
|
"discussionAnswer": "F1KBNa_discussionAnswer",
|
|
208
|
-
"
|
|
209
|
-
"
|
|
210
|
-
"readError": "F1KBNa_readError",
|
|
211
|
-
"missing": "F1KBNa_missing",
|
|
212
|
-
"actionChord": "F1KBNa_actionChord",
|
|
213
|
-
"headerEntry": "F1KBNa_headerEntry",
|
|
214
|
-
"statusBar": "F1KBNa_statusBar",
|
|
185
|
+
"fileListFloat": "F1KBNa_fileListFloat",
|
|
186
|
+
"diff": "F1KBNa_diff",
|
|
215
187
|
"panelFailureText": "F1KBNa_panelFailureText",
|
|
216
|
-
"
|
|
217
|
-
"
|
|
218
|
-
"rowDiscussed": "F1KBNa_rowDiscussed",
|
|
219
|
-
"noticeText": "F1KBNa_noticeText",
|
|
188
|
+
"splitCols": "F1KBNa_splitCols",
|
|
189
|
+
"intraAdd": "F1KBNa_intraAdd",
|
|
220
190
|
"colorPickerTrigger": "F1KBNa_colorPickerTrigger",
|
|
221
|
-
"
|
|
222
|
-
"
|
|
191
|
+
"divergedHint": "F1KBNa_divergedHint",
|
|
192
|
+
"intraDel": "F1KBNa_intraDel",
|
|
193
|
+
"panelFailureRetry": "F1KBNa_panelFailureRetry",
|
|
194
|
+
"diffPreviewTitle": "F1KBNa_diffPreviewTitle",
|
|
195
|
+
"kindTag": "F1KBNa_kindTag",
|
|
196
|
+
"context": "F1KBNa_context",
|
|
197
|
+
"groupHead": "F1KBNa_groupHead",
|
|
198
|
+
"panel": "F1KBNa_panel",
|
|
199
|
+
"bulkActions": "F1KBNa_bulkActions",
|
|
200
|
+
"group": "F1KBNa_group",
|
|
201
|
+
"resizeHandle": "F1KBNa_resizeHandle",
|
|
202
|
+
"actionError": "F1KBNa_actionError",
|
|
203
|
+
"searchMatch": "F1KBNa_searchMatch",
|
|
204
|
+
"colorPickerPanel": "F1KBNa_colorPickerPanel",
|
|
205
|
+
"searchMatchCurrent": "F1KBNa_searchMatchCurrent",
|
|
206
|
+
"markerAdd": "F1KBNa_markerAdd",
|
|
207
|
+
"states": "F1KBNa_states",
|
|
223
208
|
"actionPrimary": "F1KBNa_actionPrimary",
|
|
224
|
-
"
|
|
209
|
+
"discussionCell": "F1KBNa_discussionCell",
|
|
210
|
+
"dockHost": "F1KBNa_dockHost",
|
|
211
|
+
"del": "F1KBNa_del",
|
|
212
|
+
"quoteDel": "F1KBNa_quoteDel",
|
|
213
|
+
"searchCount": "F1KBNa_searchCount",
|
|
214
|
+
"add": "F1KBNa_add",
|
|
215
|
+
"blockActions": "F1KBNa_blockActions",
|
|
216
|
+
"hint": "F1KBNa_hint",
|
|
217
|
+
"splitDivider": "F1KBNa_splitDivider",
|
|
218
|
+
"commentLabel": "F1KBNa_commentLabel",
|
|
219
|
+
"emptyState": "F1KBNa_emptyState",
|
|
220
|
+
"tree": "F1KBNa_tree",
|
|
221
|
+
"pickerNote": "F1KBNa_pickerNote",
|
|
222
|
+
"title": "F1KBNa_title",
|
|
223
|
+
"line": "F1KBNa_line",
|
|
224
|
+
"discussionInput": "F1KBNa_discussionInput",
|
|
225
|
+
"colorSvCursor": "F1KBNa_colorSvCursor",
|
|
226
|
+
"confirmBackdrop": "F1KBNa_confirmBackdrop",
|
|
227
|
+
"blockActionsDivider": "F1KBNa_blockActionsDivider",
|
|
228
|
+
"colorValue": "F1KBNa_colorValue",
|
|
229
|
+
"badgeLabel": "F1KBNa_badgeLabel",
|
|
230
|
+
"diffHeader": "F1KBNa_diffHeader",
|
|
231
|
+
"diffActions": "F1KBNa_diffActions",
|
|
232
|
+
"noteCentered": "F1KBNa_noteCentered",
|
|
225
233
|
"diffBodySplit": "F1KBNa_diffBodySplit",
|
|
226
|
-
"colorPickerChevron": "F1KBNa_colorPickerChevron",
|
|
227
|
-
"toggle": "F1KBNa_toggle",
|
|
228
|
-
"fileListShrink": "F1KBNa_fileListShrink",
|
|
229
234
|
"pickerCard": "F1KBNa_pickerCard",
|
|
230
|
-
"
|
|
231
|
-
"
|
|
235
|
+
"settingsRowDesc": "F1KBNa_settingsRowDesc",
|
|
236
|
+
"treeName": "F1KBNa_treeName",
|
|
237
|
+
"langLabel": "F1KBNa_langLabel",
|
|
238
|
+
"action": "F1KBNa_action",
|
|
239
|
+
"rowMeta": "F1KBNa_rowMeta",
|
|
240
|
+
"stepperButtonUp": "F1KBNa_stepperButtonUp",
|
|
241
|
+
"pickerInput": "F1KBNa_pickerInput",
|
|
242
|
+
"listHead": "F1KBNa_listHead",
|
|
243
|
+
"addPath": "F1KBNa_addPath",
|
|
244
|
+
"actionQuietDisabled": "F1KBNa_actionQuietDisabled",
|
|
245
|
+
"colorPickerInputRow": "F1KBNa_colorPickerInputRow",
|
|
246
|
+
"wrapActive": "F1KBNa_wrapActive",
|
|
247
|
+
"settingsGroup": "F1KBNa_settingsGroup",
|
|
248
|
+
"listTab": "F1KBNa_listTab",
|
|
249
|
+
"mdPreviewSingle": "F1KBNa_mdPreviewSingle",
|
|
232
250
|
"presentationSelect": "F1KBNa_presentationSelect",
|
|
233
|
-
"
|
|
234
|
-
"
|
|
235
|
-
"
|
|
236
|
-
"quoteLines": "F1KBNa_quoteLines",
|
|
251
|
+
"flexSpacer": "F1KBNa_flexSpacer",
|
|
252
|
+
"discussionRange": "F1KBNa_discussionRange",
|
|
253
|
+
"diffBodyWrap": "F1KBNa_diffBodyWrap",
|
|
237
254
|
"floatResizeHandle": "F1KBNa_floatResizeHandle",
|
|
238
|
-
"settingsRow": "F1KBNa_settingsRow",
|
|
239
|
-
"missingHint": "F1KBNa_missingHint",
|
|
240
|
-
"mirrored": "F1KBNa_mirrored",
|
|
241
|
-
"rowPath": "F1KBNa_rowPath",
|
|
242
255
|
"splitHScrollRow": "F1KBNa_splitHScrollRow",
|
|
243
|
-
"
|
|
244
|
-
"
|
|
245
|
-
"
|
|
246
|
-
"
|
|
247
|
-
"
|
|
248
|
-
"
|
|
249
|
-
"
|
|
250
|
-
"
|
|
251
|
-
"
|
|
252
|
-
"
|
|
253
|
-
"
|
|
254
|
-
"
|
|
255
|
-
"
|
|
256
|
-
"
|
|
257
|
-
"
|
|
258
|
-
"
|
|
259
|
-
"
|
|
256
|
+
"searchToggle": "F1KBNa_searchToggle",
|
|
257
|
+
"fileListFloatClosing": "F1KBNa_fileListFloatClosing",
|
|
258
|
+
"actionChord": "F1KBNa_actionChord",
|
|
259
|
+
"fileListShrink": "F1KBNa_fileListShrink",
|
|
260
|
+
"commentTitle": "F1KBNa_commentTitle",
|
|
261
|
+
"importNote": "F1KBNa_importNote",
|
|
262
|
+
"confirmActions": "F1KBNa_confirmActions",
|
|
263
|
+
"footerButtons": "F1KBNa_footerButtons",
|
|
264
|
+
"header": "F1KBNa_header",
|
|
265
|
+
"expand": "F1KBNa_expand",
|
|
266
|
+
"toggle": "F1KBNa_toggle",
|
|
267
|
+
"discussion": "F1KBNa_discussion",
|
|
268
|
+
"headerActions": "F1KBNa_headerActions",
|
|
269
|
+
"statusAction": "F1KBNa_statusAction",
|
|
270
|
+
"treeNote": "F1KBNa_treeNote",
|
|
271
|
+
"commentRow": "F1KBNa_commentRow",
|
|
272
|
+
"vSpacer": "F1KBNa_vSpacer",
|
|
273
|
+
"colorPickerPopover": "F1KBNa_colorPickerPopover",
|
|
274
|
+
"settingsGroupHeader": "F1KBNa_settingsGroupHeader",
|
|
275
|
+
"notice": "F1KBNa_notice"
|
|
260
276
|
};
|
|
261
277
|
//#endregion
|
|
262
278
|
//#region lib/types/client/PathPicker.js
|
|
@@ -770,6 +786,7 @@ window.__ModuleLoader__.load({
|
|
|
770
786
|
const PASTE_ON_COPY_KEY = "diff-approval:paste-on-copy";
|
|
771
787
|
const IMPORT_UNTRACKED_KEY = "diff-approval:import-untracked";
|
|
772
788
|
const CONFIRM_FILE_REMOVE_KEY = "diff-approval:confirm-file-remove";
|
|
789
|
+
const DISCUSSION_ROUNDS_KEY = "diff-approval:discussion-rounds";
|
|
773
790
|
const SEARCH_CASE_KEY = "diff-approval:search-case";
|
|
774
791
|
const SEARCH_WORD_KEY = "diff-approval:search-word";
|
|
775
792
|
const TAB_WIDTH_KEY = "diff-approval:tab-size";
|
|
@@ -1131,6 +1148,19 @@ window.__ModuleLoader__.load({
|
|
|
1131
1148
|
if (!Number.isInteger(raw)) return 2;
|
|
1132
1149
|
return Math.max(0, Math.min(10, raw));
|
|
1133
1150
|
}
|
|
1151
|
+
/**
|
|
1152
|
+
* How many rounds of a comment thread the panel keeps.
|
|
1153
|
+
* @returns the configured round count, or the default when nothing valid is stored.
|
|
1154
|
+
*/
|
|
1155
|
+
function discussionRoundLimit() {
|
|
1156
|
+
const raw = Number.parseInt(localStorage.getItem(DISCUSSION_ROUNDS_KEY) ?? "", 10);
|
|
1157
|
+
if (!Number.isInteger(raw)) return 2;
|
|
1158
|
+
return Math.max(1, Math.min(10, raw));
|
|
1159
|
+
}
|
|
1160
|
+
/** Persist the comment thread's round limit. */
|
|
1161
|
+
function setDiscussionRoundLimit(value) {
|
|
1162
|
+
localStorage.setItem(DISCUSSION_ROUNDS_KEY, String(Math.max(1, Math.min(10, value))));
|
|
1163
|
+
}
|
|
1134
1164
|
/** Persist the block-jump lead row count. */
|
|
1135
1165
|
function setNavLeadRows(value) {
|
|
1136
1166
|
localStorage.setItem(NAV_LEAD_KEY, String(Math.max(0, Math.min(10, value))));
|
|
@@ -2732,33 +2762,88 @@ window.__ModuleLoader__.load({
|
|
|
2732
2762
|
return (text.endsWith("\n") ? text.slice(0, -1) : text).split("\n");
|
|
2733
2763
|
}
|
|
2734
2764
|
/**
|
|
2735
|
-
* The newest
|
|
2736
|
-
*
|
|
2737
|
-
*
|
|
2738
|
-
*
|
|
2739
|
-
*
|
|
2765
|
+
* The newest rounds of a thread, and how many older turns were left out.
|
|
2766
|
+
*
|
|
2767
|
+
* A thread grows without bound, so the block shows its tail and says what it is hiding. The unit
|
|
2768
|
+
* is the round rather than a row budget: a block keeps the last `rounds` questions and
|
|
2769
|
+
* everything said after them, however long those turns are (the count is a preference). That is possible
|
|
2770
|
+
* because the block reserves exactly what it draws (see `discussionRows`), so a long answer is
|
|
2771
|
+
* shown in full instead of being sliced — the row budget this replaces existed to stop an old
|
|
2772
|
+
* thread from swamping the diff, and a round cap does that without ever cutting a turn in half.
|
|
2740
2773
|
*
|
|
2741
2774
|
* @param messages - the whole thread, oldest first.
|
|
2775
|
+
* @param rounds - how many rounds to keep (at least one: something has to be visible).
|
|
2742
2776
|
* @param sizeOf - the size one message needs when rendered (text plus its chrome).
|
|
2743
|
-
* @param capRows - the body budget.
|
|
2744
2777
|
* @returns the messages to render, the count left out, and the size they need.
|
|
2745
2778
|
*/
|
|
2746
|
-
function
|
|
2747
|
-
|
|
2748
|
-
let
|
|
2779
|
+
function discussionRounds(messages, rounds, sizeOf) {
|
|
2780
|
+
const keep = Math.max(1, Math.floor(rounds));
|
|
2781
|
+
let questions = 0;
|
|
2782
|
+
let start = 0;
|
|
2749
2783
|
for (let index = messages.length - 1; index >= 0; index--) {
|
|
2750
|
-
|
|
2751
|
-
|
|
2752
|
-
if (
|
|
2753
|
-
|
|
2754
|
-
|
|
2784
|
+
if (messages[index].role !== "user") continue;
|
|
2785
|
+
questions += 1;
|
|
2786
|
+
if (questions === keep) {
|
|
2787
|
+
start = index;
|
|
2788
|
+
break;
|
|
2789
|
+
}
|
|
2755
2790
|
}
|
|
2756
|
-
const
|
|
2791
|
+
const kept = messages.slice(start);
|
|
2792
|
+
const hidden = start;
|
|
2757
2793
|
return {
|
|
2758
|
-
messages:
|
|
2794
|
+
messages: kept,
|
|
2759
2795
|
hidden,
|
|
2760
|
-
rows:
|
|
2796
|
+
rows: kept.reduce((total, message) => total + Math.max(1, sizeOf(message)), 0) + (hidden > 0 ? 1 : 0)
|
|
2797
|
+
};
|
|
2798
|
+
}
|
|
2799
|
+
/**
|
|
2800
|
+
* Read one turn's inline Markdown: `code` and **strong**.
|
|
2801
|
+
*
|
|
2802
|
+
* Deliberately tiny. The thread is laid out on the diff's own row grid — one line box per code
|
|
2803
|
+
* row — so nothing here may become a block: no headings, lists, quotes or fenced code. A marker
|
|
2804
|
+
* with no partner, or one spanning a line break, is left exactly as typed, and so is everything
|
|
2805
|
+
* this does not know about.
|
|
2806
|
+
*
|
|
2807
|
+
* @param text - the turn's text.
|
|
2808
|
+
* @returns its runs, in order.
|
|
2809
|
+
*/
|
|
2810
|
+
function discussionRuns(text) {
|
|
2811
|
+
const runs = [];
|
|
2812
|
+
let literal = "";
|
|
2813
|
+
const flush = () => {
|
|
2814
|
+
if (literal === "") return;
|
|
2815
|
+
runs.push({
|
|
2816
|
+
kind: "text",
|
|
2817
|
+
text: literal
|
|
2818
|
+
});
|
|
2819
|
+
literal = "";
|
|
2761
2820
|
};
|
|
2821
|
+
for (let index = 0; index < text.length; index++) {
|
|
2822
|
+
const rest = text.slice(index);
|
|
2823
|
+
const code = /^`([^`\n]+)`/.exec(rest);
|
|
2824
|
+
const strong = code === null ? /^\*\*([^*\n]+)\*\*/.exec(rest) : null;
|
|
2825
|
+
if (code !== null) {
|
|
2826
|
+
flush();
|
|
2827
|
+
runs.push({
|
|
2828
|
+
kind: "code",
|
|
2829
|
+
text: code[1]
|
|
2830
|
+
});
|
|
2831
|
+
index += code[0].length - 1;
|
|
2832
|
+
continue;
|
|
2833
|
+
}
|
|
2834
|
+
if (strong !== null) {
|
|
2835
|
+
flush();
|
|
2836
|
+
runs.push({
|
|
2837
|
+
kind: "strong",
|
|
2838
|
+
text: strong[1]
|
|
2839
|
+
});
|
|
2840
|
+
index += strong[0].length - 1;
|
|
2841
|
+
continue;
|
|
2842
|
+
}
|
|
2843
|
+
literal += text[index];
|
|
2844
|
+
}
|
|
2845
|
+
flush();
|
|
2846
|
+
return runs;
|
|
2762
2847
|
}
|
|
2763
2848
|
/**
|
|
2764
2849
|
* An answer with its blank lines dropped.
|
|
@@ -2860,26 +2945,51 @@ window.__ModuleLoader__.load({
|
|
|
2860
2945
|
return next;
|
|
2861
2946
|
}
|
|
2862
2947
|
/**
|
|
2863
|
-
* Re-anchor
|
|
2948
|
+
* Re-anchor a whole file's blocks in one pass.
|
|
2864
2949
|
*
|
|
2865
|
-
*
|
|
2866
|
-
*
|
|
2867
|
-
*
|
|
2868
|
-
*
|
|
2869
|
-
*
|
|
2870
|
-
* outdated: it says so and keeps its quote for the reader, rather than being silently moved
|
|
2871
|
-
* onto whatever took those lines. Only when the whole range is gone from the model does the
|
|
2872
|
-
* block move, and then by line number, back to where the range used to be (see `gone`). The mark
|
|
2873
|
-
* is derived, not sticky — the lines coming back with their quote clears it (GitHub recomputes
|
|
2874
|
-
* `isOutdated` the same way).
|
|
2950
|
+
* Each block is re-anchored exactly as `remapDiscussion` does it — same rules, same identities,
|
|
2951
|
+
* same "nothing moved, same object back" contract — but the row windows every quote is looked up
|
|
2952
|
+
* in are joined ONCE for the whole list. A rebuild (a keep, an edit, a switched file) runs this
|
|
2953
|
+
* over every block a file has, and joining the rows per block is what made the pass cost grow with
|
|
2954
|
+
* the number of comments on a long file.
|
|
2875
2955
|
*
|
|
2876
|
-
* @param
|
|
2956
|
+
* @param discussions - the blocks to re-anchor.
|
|
2877
2957
|
* @param lineOf - the new-file line number of a row, or `undefined` for a row that has none.
|
|
2878
2958
|
* @param textOf - the text of a row, for the quote comparison.
|
|
2879
2959
|
* @param rowCount - how many rows the current model has.
|
|
2880
|
-
* @returns the re-anchored
|
|
2960
|
+
* @returns the re-anchored blocks, in the order they came in.
|
|
2881
2961
|
*/
|
|
2882
|
-
function
|
|
2962
|
+
function remapDiscussions(discussions, lineOf, textOf, rowCount) {
|
|
2963
|
+
const windows = windowCache(textOf, rowCount);
|
|
2964
|
+
return discussions.map((discussion) => remapOne(discussion, lineOf, textOf, rowCount, windows));
|
|
2965
|
+
}
|
|
2966
|
+
/** Every row window of one span, indexed by its text, in one pass over the rows. */
|
|
2967
|
+
function windowIndex(textOf, rowCount, span) {
|
|
2968
|
+
const byText = /* @__PURE__ */ new Map();
|
|
2969
|
+
for (let row = 0; row + span < rowCount; row++) {
|
|
2970
|
+
const parts = [];
|
|
2971
|
+
for (let index = row; index <= row + span; index++) parts.push(index < rowCount ? textOf(index) : "");
|
|
2972
|
+
const text = parts.join("\n");
|
|
2973
|
+
const rows = byText.get(text);
|
|
2974
|
+
if (rows === void 0) byText.set(text, [row]);
|
|
2975
|
+
else rows.push(row);
|
|
2976
|
+
}
|
|
2977
|
+
return byText;
|
|
2978
|
+
}
|
|
2979
|
+
/** One window index per span, built the first time a span is asked for. */
|
|
2980
|
+
function windowCache(textOf, rowCount) {
|
|
2981
|
+
const cache = /* @__PURE__ */ new Map();
|
|
2982
|
+
return (span) => {
|
|
2983
|
+
let index = cache.get(span);
|
|
2984
|
+
if (index === void 0) {
|
|
2985
|
+
index = windowIndex(textOf, rowCount, span);
|
|
2986
|
+
cache.set(span, index);
|
|
2987
|
+
}
|
|
2988
|
+
return index;
|
|
2989
|
+
};
|
|
2990
|
+
}
|
|
2991
|
+
/** The body both entry points share: one block, with the row windows read through `windows`. */
|
|
2992
|
+
function remapOne(discussion, lineOf, textOf, rowCount, windows) {
|
|
2883
2993
|
const { startLine, endLine } = discussion.anchor;
|
|
2884
2994
|
let start = -1;
|
|
2885
2995
|
let end = -1;
|
|
@@ -2896,7 +3006,7 @@ window.__ModuleLoader__.load({
|
|
|
2896
3006
|
end = row;
|
|
2897
3007
|
}
|
|
2898
3008
|
const quote = discussion.quote;
|
|
2899
|
-
const span = Math.max(0,
|
|
3009
|
+
const span = Math.max(0, (quote ?? "").split("\n").length - 1);
|
|
2900
3010
|
const textAt = (row) => {
|
|
2901
3011
|
const parts = [];
|
|
2902
3012
|
for (let index = row; index <= row + span; index++) parts.push(index < rowCount ? textOf(index) : "");
|
|
@@ -2939,10 +3049,7 @@ window.__ModuleLoader__.load({
|
|
|
2939
3049
|
});
|
|
2940
3050
|
}
|
|
2941
3051
|
let found = -1;
|
|
2942
|
-
for (
|
|
2943
|
-
if (textAt(row) !== quote) continue;
|
|
2944
|
-
if (found === -1 || Math.abs(row - start) < Math.abs(found - start)) found = row;
|
|
2945
|
-
}
|
|
3052
|
+
for (const row of windows(span).get(quote) ?? []) if (found === -1 || Math.abs(row - start) < Math.abs(found - start)) found = row;
|
|
2946
3053
|
if (found === -1) return start === -1 ? gone() : markOutdated(discussion);
|
|
2947
3054
|
return clearOutdated({
|
|
2948
3055
|
...discussion,
|
|
@@ -19314,6 +19421,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19314
19421
|
*/
|
|
19315
19422
|
const threads = /* @__PURE__ */ new Map();
|
|
19316
19423
|
/**
|
|
19424
|
+
* Fired on `window` whenever a session's threads change. The threads are written by the file
|
|
19425
|
+
* detail (which owns them) and read by the list pane (whose comments tab shows them all), so the
|
|
19426
|
+
* event is what keeps the two in step: a reader who posts a comment sees it in the list at once
|
|
19427
|
+
* instead of on the next poll.
|
|
19428
|
+
*/
|
|
19429
|
+
const COMMENTS_CHANGED_EVENT = "dsh-diff-approval:comments-changed";
|
|
19430
|
+
/**
|
|
19317
19431
|
* The comment threads a session's panel is holding.
|
|
19318
19432
|
* @param sessionId - the session, if any.
|
|
19319
19433
|
* @returns the threads by pending entry id; empty when there are none.
|
|
@@ -19329,7 +19443,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19329
19443
|
*/
|
|
19330
19444
|
function rememberDiscussions(sessionId, byFile) {
|
|
19331
19445
|
if (sessionId === void 0) return;
|
|
19446
|
+
const before = threads.get(sessionId);
|
|
19332
19447
|
threads.set(sessionId, byFile);
|
|
19448
|
+
if (before === byFile) return;
|
|
19449
|
+
if (typeof window === "undefined") return;
|
|
19450
|
+
window.dispatchEvent(new CustomEvent(COMMENTS_CHANGED_EVENT, { detail: { sessionId } }));
|
|
19333
19451
|
}
|
|
19334
19452
|
/** This session's record, created on first use. */
|
|
19335
19453
|
function viewOf(sessionId) {
|
|
@@ -19708,6 +19826,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19708
19826
|
/** A shared canvas for measuring wrapped line heights (CPU-only, no DOM reflow). */
|
|
19709
19827
|
let measureCanvas;
|
|
19710
19828
|
/**
|
|
19829
|
+
* The font `measureCanvas` is currently set to, so a measurer can put its own back before it asks
|
|
19830
|
+
* for a width (see `makeMeasurer`). Every measurer shares the one context, and two of them are
|
|
19831
|
+
* alive at once — the thread's prose and its inline-code chips.
|
|
19832
|
+
*/
|
|
19833
|
+
let measureCanvasFont;
|
|
19834
|
+
/**
|
|
19711
19835
|
* Compute a diff line's visual sub-lines for soft wrap the way VSCode does it:
|
|
19712
19836
|
* a Unicode line-break model — break at whitespace and between any two CJK
|
|
19713
19837
|
* characters (Chinese han, Japanese kana, fullwidth forms), keep Latin and
|
|
@@ -19816,6 +19940,88 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19816
19940
|
if (out.length > 1 && out[out.length - 1] === "") out.pop();
|
|
19817
19941
|
return out;
|
|
19818
19942
|
}
|
|
19943
|
+
/**
|
|
19944
|
+
* Wrap one line of a turn the way the browser lays it out: the prose by character, each inline-code
|
|
19945
|
+
* chip as one box that cannot be broken.
|
|
19946
|
+
*
|
|
19947
|
+
* `wrapInto` walks characters and nothing else, which is right for the code view and wrong here:
|
|
19948
|
+
* a turn's chip is an inline-flex box (the chat's own inline code, see `.discussionCode`), so half
|
|
19949
|
+
* of a chip never lands on the next line — it moves over whole, and the text after it starts after
|
|
19950
|
+
* the box rather than inside it. Measuring the chip as ordinary text therefore reserves the wrong
|
|
19951
|
+
* number of rows on exactly the lines that carry one, and a row too few is a clipped last line.
|
|
19952
|
+
*
|
|
19953
|
+
* The prose segments are wrapped by `wrapInto` itself, so a line with a chip in it breaks its words
|
|
19954
|
+
* and its spaces exactly where a line without one does; only the chips are placed as boxes.
|
|
19955
|
+
*
|
|
19956
|
+
* @param line - the line's text, markers and all: the runs are read the way the render reads them.
|
|
19957
|
+
* @param room - the width the line wraps in.
|
|
19958
|
+
* @param measure - the prose measurer.
|
|
19959
|
+
* @param chipWidth - the width of one chip's BOX (its text in the chip's own font, plus its padding
|
|
19960
|
+
* and its hairline).
|
|
19961
|
+
* @param tabPx - one tab stop, in px.
|
|
19962
|
+
* @returns the row count for the line.
|
|
19963
|
+
*/
|
|
19964
|
+
function wrapChipRows(line, room, measure, chipWidth, tabPx) {
|
|
19965
|
+
let rows = 1;
|
|
19966
|
+
let used = 0;
|
|
19967
|
+
for (const run of discussionRuns(line)) {
|
|
19968
|
+
if (run.kind === "code") {
|
|
19969
|
+
const width = chipWidth(run.text);
|
|
19970
|
+
if (used > 0 && used + width > room) {
|
|
19971
|
+
rows += 1;
|
|
19972
|
+
used = 0;
|
|
19973
|
+
}
|
|
19974
|
+
used += width;
|
|
19975
|
+
continue;
|
|
19976
|
+
}
|
|
19977
|
+
if (run.text === "") continue;
|
|
19978
|
+
if (used > room) {
|
|
19979
|
+
rows += 1;
|
|
19980
|
+
used = 0;
|
|
19981
|
+
}
|
|
19982
|
+
const parts = wrapInto(run.text, room - used, measure, tabPx);
|
|
19983
|
+
rows += parts.length - 1;
|
|
19984
|
+
const last = parts[parts.length - 1] ?? "";
|
|
19985
|
+
used = parts.length === 1 ? used + charsWidth(Array.from(run.text), measure, tabPx) : charsWidth(Array.from(last), measure, tabPx);
|
|
19986
|
+
}
|
|
19987
|
+
return rows;
|
|
19988
|
+
}
|
|
19989
|
+
/**
|
|
19990
|
+
* Resolve the thread's own prose font for canvas measurement: the font the turns are drawn in.
|
|
19991
|
+
*
|
|
19992
|
+
* That is the app's message text (see `.discussionBody`), and the probe span is what carries it:
|
|
19993
|
+
* the turns themselves may not be in the DOM yet when a block is measured — the first render of a
|
|
19994
|
+
* new annotation happens before its bubble exists — while the probe is there as long as the panel
|
|
19995
|
+
* is. Reading the code cell was what this used to do, back when the thread was set in the code's
|
|
19996
|
+
* own face; the code cell still answers `codeFontOf`, and the chip its own (see `chipFontOf`).
|
|
19997
|
+
*
|
|
19998
|
+
* The string is rebuilt from the individual properties because canvas accepts no line height.
|
|
19999
|
+
*
|
|
20000
|
+
* @returns a canvas `font` string, or undefined when the panel is not mounted.
|
|
20001
|
+
*/
|
|
20002
|
+
function threadFontOf() {
|
|
20003
|
+
const probe = document.querySelector("[data-diff-thread-font]");
|
|
20004
|
+
if (probe === null) return void 0;
|
|
20005
|
+
const computed = getComputedStyle(probe);
|
|
20006
|
+
return `${computed.fontStyle} ${computed.fontWeight} ${computed.fontSize} ${computed.fontFamily}`;
|
|
20007
|
+
}
|
|
20008
|
+
/**
|
|
20009
|
+
* Resolve the inline-code chip's font for canvas measurement: the code face at
|
|
20010
|
+
* `DISCUSSION_CODE_FONT_SCALE` of the thread's prose size, which is what `.discussionCode` asks
|
|
20011
|
+
* for with `font-size: 0.875em`. The family comes off a code cell, which wears the same code token
|
|
20012
|
+
* the chip does.
|
|
20013
|
+
*
|
|
20014
|
+
* @returns a canvas `font` string, or undefined when there is no code cell to read.
|
|
20015
|
+
*/
|
|
20016
|
+
function chipFontOf() {
|
|
20017
|
+
const prose = document.querySelector("[data-diff-thread-font]");
|
|
20018
|
+
const code = document.querySelector("[data-diff-code]");
|
|
20019
|
+
if (prose === null || code === null) return void 0;
|
|
20020
|
+
const size = Number.parseFloat(getComputedStyle(prose).fontSize);
|
|
20021
|
+
if (!Number.isFinite(size)) return void 0;
|
|
20022
|
+
const computed = getComputedStyle(code);
|
|
20023
|
+
return `${computed.fontStyle} ${computed.fontWeight} ${size * DISCUSSION_CODE_FONT_SCALE}px ${computed.fontFamily}`;
|
|
20024
|
+
}
|
|
19819
20025
|
/** Resolve the code cell's computed font for canvas measurement. */
|
|
19820
20026
|
function codeFontOf() {
|
|
19821
20027
|
const code = document.querySelector("[data-diff-code]");
|
|
@@ -19833,8 +20039,22 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19833
20039
|
}
|
|
19834
20040
|
const ctx = measureCanvas;
|
|
19835
20041
|
if (ctx === void 0) return void 0;
|
|
19836
|
-
|
|
19837
|
-
|
|
20042
|
+
const current = () => {
|
|
20043
|
+
if (font !== void 0 && measureCanvasFont !== font) {
|
|
20044
|
+
ctx.font = font;
|
|
20045
|
+
measureCanvasFont = font;
|
|
20046
|
+
}
|
|
20047
|
+
return ctx;
|
|
20048
|
+
};
|
|
20049
|
+
const widths = /* @__PURE__ */ new Map();
|
|
20050
|
+
return (text) => {
|
|
20051
|
+
if (text.length !== 1) return current().measureText(text).width;
|
|
20052
|
+
const cached = widths.get(text);
|
|
20053
|
+
if (cached !== void 0) return cached;
|
|
20054
|
+
const width = current().measureText(text).width;
|
|
20055
|
+
widths.set(text, width);
|
|
20056
|
+
return width;
|
|
20057
|
+
};
|
|
19838
20058
|
}
|
|
19839
20059
|
/** How long a question the session has let go stays "queued" before the block hands
|
|
19840
20060
|
* its writing row back. The local submission echo and the host's queue row are a
|
|
@@ -19853,6 +20073,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19853
20073
|
* `.discussionUser`): its own 0.5 per side, and no margin outside it, so the fill is
|
|
19854
20074
|
* flush with the thread's right column and this is what comes off the wrap width. */
|
|
19855
20075
|
const DISCUSSION_BUBBLE_SIDE_PADDING_ROWS = .5;
|
|
20076
|
+
/**
|
|
20077
|
+
* The comment thread's own row height, in px — a fixed number, NOT the code's line height.
|
|
20078
|
+
* A thread is prose: it keeps the size the default settings show whatever the reader sets the
|
|
20079
|
+
* code's line height and font scale to, so a thread reads the same in a 10px code row as in a
|
|
20080
|
+
* 36px one. The block still reserves whole rows of its own, and the diff's height table takes
|
|
20081
|
+
* its exact pixel height (see the discussion extras below), so the rows under it stay exact.
|
|
20082
|
+
* Mirrors the literal 22px the thread's rules use in the stylesheet.
|
|
20083
|
+
*/
|
|
20084
|
+
const THREAD_ROW_PX = 22;
|
|
20085
|
+
/**
|
|
20086
|
+
* The share of the thread's prose size an inline-code chip is drawn at (mirrors
|
|
20087
|
+
* `.discussionCode`'s `font-size: 0.875em`, which is the chat's own inline code against its own
|
|
20088
|
+
* message text). The chip is measured in its own font, not in the prose one — a code face at
|
|
20089
|
+
* twelve and a bit pixels is not the UI face at fourteen — so the row count follows the run the
|
|
20090
|
+
* reader actually sees.
|
|
20091
|
+
*/
|
|
20092
|
+
const DISCUSSION_CODE_FONT_SCALE = .875;
|
|
19856
20093
|
/** Rows rendered beyond the visible window in each direction. */
|
|
19857
20094
|
const OVERSCAN_ROWS = 8;
|
|
19858
20095
|
/** The identity a file with no discussions shares, so memos stay stable. */
|
|
@@ -20012,6 +20249,25 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20012
20249
|
right
|
|
20013
20250
|
};
|
|
20014
20251
|
}
|
|
20252
|
+
/**
|
|
20253
|
+
* The one-line title a comment is listed under in the comments tab: the first sentence of the first
|
|
20254
|
+
* thing the reader said in it. The thread's first turn IS the annotation (later turns are follow-ups
|
|
20255
|
+
* on the same rows), so that is the comment's own voice; the sentence is cut at its own full stop,
|
|
20256
|
+
* and the list ellipsises whatever is still too long for the column (see `.commentTitle`).
|
|
20257
|
+
*
|
|
20258
|
+
* A thread that has not been sent yet has no turn at all: what the reader has typed so far is its
|
|
20259
|
+
* draft, and that is what the item shows, so a comment being written is not listed as a blank line.
|
|
20260
|
+
* A thread with neither has nothing to quote — an empty comment box the reader placed and left — and
|
|
20261
|
+
* the caller passes in the word for that (see the list).
|
|
20262
|
+
*
|
|
20263
|
+
* @param discussion - the thread to name.
|
|
20264
|
+
* @returns the title, or an empty string when there is nothing to say yet.
|
|
20265
|
+
*/
|
|
20266
|
+
function commentTitle(discussion) {
|
|
20267
|
+
const line = (discussion.messages.find((message) => message.role === "user")?.text ?? discussion.draft ?? "").split("\n").find((text) => text.trim() !== "") ?? "";
|
|
20268
|
+
const stop = /[。!?!?]/.exec(line);
|
|
20269
|
+
return (stop === null ? line : line.slice(0, stop.index + 1)).trim();
|
|
20270
|
+
}
|
|
20015
20271
|
/** The diff body's row class per line kind. */
|
|
20016
20272
|
const ROW_CLASS = {
|
|
20017
20273
|
context: PendingPanel_module_css_default.context,
|
|
@@ -20058,7 +20314,28 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20058
20314
|
* @param props.wrap - the code view's wrap setting: off, the quote is one line per quoted line,
|
|
20059
20315
|
* as the file renders it.
|
|
20060
20316
|
*/
|
|
20317
|
+
/**
|
|
20318
|
+
* One turn's text as the thread draws it: its literal runs, its inline `code`, its **bold**.
|
|
20319
|
+
*
|
|
20320
|
+
* The thread draws on the diff's own row grid, so these two are the whole of the inline
|
|
20321
|
+
* Markdown it knows (see `discussionRuns`); everything else is left exactly as written.
|
|
20322
|
+
*
|
|
20323
|
+
* @param text - the turn's text.
|
|
20324
|
+
* @returns its nodes, in order.
|
|
20325
|
+
*/
|
|
20326
|
+
function discussionNodes(text) {
|
|
20327
|
+
return discussionRuns(text).map((run, index) => {
|
|
20328
|
+
if (run.kind === "code") return (0, react_jsx_runtime.jsx)("code", {
|
|
20329
|
+
className: PendingPanel_module_css_default.discussionCode,
|
|
20330
|
+
children: run.text
|
|
20331
|
+
}, index);
|
|
20332
|
+
if (run.kind === "strong") return (0, react_jsx_runtime.jsx)("strong", { children: run.text }, index);
|
|
20333
|
+
return run.text;
|
|
20334
|
+
});
|
|
20335
|
+
}
|
|
20061
20336
|
function DiscussionQuote({ quote, lines, lang, wrap }) {
|
|
20337
|
+
/** The diff's own wash for a quoted row, or nothing for context (and for older threads). */
|
|
20338
|
+
const wash = (kind) => kind === "add" ? ` ${PendingPanel_module_css_default.quoteAdd}` : kind === "del" ? ` ${PendingPanel_module_css_default.quoteDel}` : "";
|
|
20062
20339
|
const rows = (0, react.useMemo)(() => {
|
|
20063
20340
|
const texts = quote.split("\n");
|
|
20064
20341
|
const runs = highlightWindow(texts, lang, 0, texts.length)?.runs;
|
|
@@ -20084,7 +20361,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20084
20361
|
className: `${PendingPanel_module_css_default.quoteLines}${wrap ? "" : " " + PendingPanel_module_css_default.quoteNoWrap}`,
|
|
20085
20362
|
"data-diff-discussion-quote": true,
|
|
20086
20363
|
children: rows.map((row, index) => (0, react_jsx_runtime.jsxs)("div", {
|
|
20087
|
-
className: PendingPanel_module_css_default.quoteLine
|
|
20364
|
+
className: `${PendingPanel_module_css_default.quoteLine}${wash(row.gutter?.kind)}`,
|
|
20365
|
+
"data-diff-quote-kind": row.gutter?.kind,
|
|
20088
20366
|
children: [
|
|
20089
20367
|
(0, react_jsx_runtime.jsx)("span", {
|
|
20090
20368
|
className: PendingPanel_module_css_default.gutter,
|
|
@@ -20216,6 +20494,29 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20216
20494
|
return target instanceof Element && target.closest("[data-diff-approval-panel]") !== null;
|
|
20217
20495
|
}
|
|
20218
20496
|
/**
|
|
20497
|
+
* What a press inside the panel must NOT drop the text selection for: the content itself, and the
|
|
20498
|
+
* frame that acts on the selection.
|
|
20499
|
+
*
|
|
20500
|
+
* The content mirrors the `user-select` whitelist in `.panel`: the code, the rendered Markdown
|
|
20501
|
+
* preview, a thread's own turns, the code a comment quotes, and any field. Everything else is
|
|
20502
|
+
* chrome (see `.panel`), and a press on chrome ends the selection rather than leaving it standing
|
|
20503
|
+
* — see `onPanelMouseDown`. The frame is the exception that is not content: its 评论 / 保留 / 回退
|
|
20504
|
+
* buttons are about exactly that selection, so dropping it on the way to them would leave them
|
|
20505
|
+
* acting on nothing.
|
|
20506
|
+
*/
|
|
20507
|
+
const KEEPS_SELECTION = [
|
|
20508
|
+
"input",
|
|
20509
|
+
"textarea",
|
|
20510
|
+
"[contenteditable]",
|
|
20511
|
+
"[data-diff-code]",
|
|
20512
|
+
"[data-diff-md-preview-body]",
|
|
20513
|
+
"[data-diff-discussion-user]",
|
|
20514
|
+
"[data-diff-discussion-reply]",
|
|
20515
|
+
"[data-diff-quote-text]",
|
|
20516
|
+
"[data-diff-selection-actions]",
|
|
20517
|
+
"[data-diff-copy]"
|
|
20518
|
+
].join(", ");
|
|
20519
|
+
/**
|
|
20219
20520
|
* Whether a key event came from a text field that owns its own keys (`Esc`,
|
|
20220
20521
|
* cursor moves). The chat composer is the one that matters: the panel leaves it
|
|
20221
20522
|
* alone even while its own search bar is open.
|
|
@@ -20328,6 +20629,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20328
20629
|
]
|
|
20329
20630
|
});
|
|
20330
20631
|
});
|
|
20632
|
+
/** Whether a pending file has nothing left to review: its content already matches the tracked
|
|
20633
|
+
* baseline. The file list's context menu offers its actions off this answer, and the detail
|
|
20634
|
+
* toolbar derives the same answer from the diff it already holds (its `model.blocks`), so a row
|
|
20635
|
+
* and the file it opens can never disagree about which actions they are. */
|
|
20636
|
+
function fileHasNoDiff(file) {
|
|
20637
|
+
return changeBlocksOf(computeWholeFileDiff(file.oldText, file.newText)).length === 0;
|
|
20638
|
+
}
|
|
20331
20639
|
/** Whether a block keep/revert range covers the file's entire change region, so
|
|
20332
20640
|
* applying it leaves the file with no pending diff — the "remove or keep in
|
|
20333
20641
|
* list" prompt applies. This generalises the single-block case to a selection
|
|
@@ -21364,10 +21672,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
21364
21672
|
return markers;
|
|
21365
21673
|
}
|
|
21366
21674
|
/** One row of the file list: the clickable head in the left pane. */
|
|
21367
|
-
function PendingFileRow({ file, selected, failedMessage, t, onSelect }) {
|
|
21675
|
+
function PendingFileRow({ file, selected, failedMessage, t, onSelect, onMenu }) {
|
|
21368
21676
|
const stats = (0, react.useMemo)(() => computeWholeFileDiff(file.oldText, file.newText), [file.oldText, file.newText]);
|
|
21369
21677
|
return (0, react_jsx_runtime.jsx)("li", {
|
|
21370
21678
|
className: PendingPanel_module_css_default.row,
|
|
21679
|
+
onContextMenu: (event) => {
|
|
21680
|
+
event.preventDefault();
|
|
21681
|
+
onMenu(event);
|
|
21682
|
+
},
|
|
21371
21683
|
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
21372
21684
|
label: file.path,
|
|
21373
21685
|
delayMs: 500,
|
|
@@ -21414,7 +21726,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
21414
21726
|
});
|
|
21415
21727
|
}
|
|
21416
21728
|
/** The selected file's diff, actions, jump controls, and copy toolbar. */
|
|
21417
|
-
function PendingDiff({ file, busy, workspacePath, jumpSignal, undoFlash, landingTop, landingTick, failedMessage, commentSkill, onPasteReference, onAskAgent, watchChat, onToast, t, onKeep, onRevert, onRefreshVcs, onBlockKeep, onBlockRevert, onOpen, onPreviewImage }) {
|
|
21729
|
+
function PendingDiff({ file, busy, workspacePath, jumpSignal, undoFlash, landingTop, landingTick, landingRow, failedMessage, commentSkill, onPasteReference, onAskAgent, watchChat, onToast, t, onAddTypedPath, onKeep, onRevert, onRefreshVcs, onBlockKeep, onBlockRevert, onOpen, onPreviewImage }) {
|
|
21730
|
+
/** The path being typed into the header field; null shows the open file's own path. */
|
|
21731
|
+
const [pathDraft, setPathDraft] = (0, react.useState)(null);
|
|
21418
21732
|
const [langOverride, setLangOverride] = (0, react.useState)(void 0);
|
|
21419
21733
|
const [langMenuOpen, setLangMenuOpen] = (0, react.useState)(false);
|
|
21420
21734
|
const langMenuItems = (0, react.useMemo)(() => [{
|
|
@@ -21572,6 +21886,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
21572
21886
|
const [commentMode, setCommentMode] = (0, react.useState)(commentModeEnabled);
|
|
21573
21887
|
const [discussionsByFile, setDiscussionsByFile] = (0, react.useState)(() => rememberedDiscussions(file.sessionId));
|
|
21574
21888
|
const discussions = discussionsByFile[file.id] ?? EMPTY_DISCUSSIONS;
|
|
21889
|
+
const askingId = (0, react.useMemo)(() => {
|
|
21890
|
+
for (const list of Object.values(discussionsByFile)) {
|
|
21891
|
+
const waiting = list.find((entry) => entry.asking === true);
|
|
21892
|
+
if (waiting !== void 0) return waiting.id;
|
|
21893
|
+
}
|
|
21894
|
+
}, [discussionsByFile]);
|
|
21575
21895
|
const setDiscussions = (update) => {
|
|
21576
21896
|
setDiscussionsByFile((all) => ({
|
|
21577
21897
|
...all,
|
|
@@ -21625,6 +21945,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
21625
21945
|
/** The offset the file now showing was asked to open at, held until the landing
|
|
21626
21946
|
* effect below spends it (that effect runs a render later than the switch). */
|
|
21627
21947
|
const landingTopRef = (0, react.useRef)(void 0);
|
|
21948
|
+
/** The model row a jump to a comment asked for, spent the same way and by the same effect. */
|
|
21949
|
+
const landingRowRef = (0, react.useRef)(void 0);
|
|
21628
21950
|
const selectionTextRef = (0, react.useRef)("");
|
|
21629
21951
|
const [copied, setCopied] = (0, react.useState)(false);
|
|
21630
21952
|
const [searchOpen, setSearchOpen] = (0, react.useState)(false);
|
|
@@ -21641,7 +21963,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
21641
21963
|
};
|
|
21642
21964
|
(0, react.useEffect)(() => {
|
|
21643
21965
|
landingTopRef.current = landingTop;
|
|
21644
|
-
|
|
21966
|
+
landingRowRef.current = landingRow;
|
|
21967
|
+
if (landingRow !== void 0) {
|
|
21968
|
+
setFocus(blockIndexAtOffset(offsetOf(landingRow)));
|
|
21969
|
+
bumpFlash(false);
|
|
21970
|
+
} else if (landingTop === void 0) {
|
|
21645
21971
|
setFocus(0);
|
|
21646
21972
|
bumpFlash(false);
|
|
21647
21973
|
} else setFocus(blockIndexAtOffset(landingTop));
|
|
@@ -21658,7 +21984,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
21658
21984
|
}, [
|
|
21659
21985
|
file.id,
|
|
21660
21986
|
landingTop,
|
|
21661
|
-
landingTick
|
|
21987
|
+
landingTick,
|
|
21988
|
+
landingRow
|
|
21662
21989
|
]);
|
|
21663
21990
|
(0, react.useEffect)(() => {
|
|
21664
21991
|
if (undoFlash === 0) return;
|
|
@@ -22171,13 +22498,15 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22171
22498
|
const lines = text.split("\n");
|
|
22172
22499
|
const bubble = role === "user";
|
|
22173
22500
|
const chrome = bubble ? 1 : 0;
|
|
22174
|
-
const measure = makeMeasurer(
|
|
22501
|
+
const measure = makeMeasurer(threadFontOf());
|
|
22175
22502
|
if (measure === void 0 || bodyWidth === 0) return lines.length + chrome;
|
|
22176
22503
|
const body = Math.max(0, bodyWidth - discussionRightInsetPx - 3 - 24);
|
|
22177
|
-
const wrapping = (widthPx ?? (bubble ? body * DISCUSSION_BUBBLE_MAX_WIDTH - 2 * DISCUSSION_BUBBLE_SIDE_PADDING_ROWS *
|
|
22504
|
+
const wrapping = (widthPx ?? (bubble ? body * DISCUSSION_BUBBLE_MAX_WIDTH - 2 * DISCUSSION_BUBBLE_SIDE_PADDING_ROWS * THREAD_ROW_PX : body)) - measure("0");
|
|
22178
22505
|
if (wrapping <= 0) return lines.length + chrome;
|
|
22179
22506
|
const tabPx = tabWidthSpaces * measure(" ");
|
|
22180
|
-
|
|
22507
|
+
const chipMeasure = makeMeasurer(chipFontOf());
|
|
22508
|
+
const chipWidth = (text) => (chipMeasure === void 0 ? measure(text) : chipMeasure(text)) + 12;
|
|
22509
|
+
return chrome + lines.reduce((rows, line) => rows + Math.max(1, wrapChipRows(line, wrapping, measure, chipWidth, tabPx)), 0);
|
|
22181
22510
|
}, [
|
|
22182
22511
|
bodyWidth,
|
|
22183
22512
|
tabWidthSpaces,
|
|
@@ -22195,18 +22524,25 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22195
22524
|
*/
|
|
22196
22525
|
const quoteRowsOf = (0, react.useCallback)((quote, wrap) => {
|
|
22197
22526
|
if (!wrap) return quote.split("\n").length;
|
|
22527
|
+
const lines = quote.split("\n");
|
|
22528
|
+
const measure = makeMeasurer(codeFontOf());
|
|
22198
22529
|
const width = Math.max(0, bodyWidth - discussionRightInsetPx) - WRAP_GUTTERS_PX;
|
|
22199
|
-
|
|
22530
|
+
if (measure === void 0) return lines.length;
|
|
22531
|
+
const wrapping = width - measure("0");
|
|
22532
|
+
if (wrapping <= 0) return lines.length;
|
|
22533
|
+
const tabPx = tabWidthSpaces * measure(" ");
|
|
22534
|
+
return lines.reduce((rows, line) => rows + Math.max(1, wrapInto(line, wrapping, measure, tabPx).length), 0);
|
|
22200
22535
|
}, [
|
|
22201
22536
|
bodyWidth,
|
|
22202
22537
|
discussionRightInsetPx,
|
|
22203
|
-
|
|
22538
|
+
tabWidthSpaces
|
|
22204
22539
|
]);
|
|
22205
22540
|
/**
|
|
22206
22541
|
* The size one rendered message needs in code rows: its wrapped lines plus its own
|
|
22207
22542
|
* padding — which for a bubble is exactly one row (half a row above, half below).
|
|
22208
22543
|
* Every turn is therefore a whole number of rows and the thread stays on the code's
|
|
22209
|
-
* own grid.
|
|
22544
|
+
* own grid. The text is measured with its inline markers gone, because that is what the
|
|
22545
|
+
* turn draws: counting `` and ** would reserve room for characters nobody sees.
|
|
22210
22546
|
*
|
|
22211
22547
|
* @param message - the message to size.
|
|
22212
22548
|
* @returns its size in code rows.
|
|
@@ -22223,24 +22559,26 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22223
22559
|
* @param discussion - the block to lay out.
|
|
22224
22560
|
* @returns the messages to render, the hidden count, and the body height.
|
|
22225
22561
|
*/
|
|
22562
|
+
const roundLimit = discussionRoundLimit();
|
|
22226
22563
|
const layoutDiscussion = (0, react.useCallback)((discussion) => {
|
|
22227
22564
|
const answer = discussion.reply === void 0 ? void 0 : stripBlankLines(discussion.reply);
|
|
22228
22565
|
const stoppedNote = discussion.stopped === true && (answer === void 0 || answer === "") && discussion.failed !== true;
|
|
22229
|
-
const trailing = (discussion.lost === true && discussion.quote !== void 0 && discussion.quote !== "" ? 1 + quoteRowsOf(discussion.quote, langWrap) : 0) + (answer !== void 0 && answer !== "" ? messageSizeOf({
|
|
22566
|
+
const trailing = (discussion.lost === true && discussion.quote !== void 0 && discussion.quote !== "" ? 1 + quoteRowsOf(discussion.quote, langWrap) * (ROW_HEIGHT_PX / THREAD_ROW_PX) : 0) + (answer !== void 0 && answer !== "" ? messageSizeOf({
|
|
22230
22567
|
role: "assistant",
|
|
22231
22568
|
text: answer
|
|
22232
22569
|
}) : discussion.failed === true || discussion.asking === true ? 1 : 2 + (stoppedNote ? 1 : 0));
|
|
22233
|
-
const
|
|
22234
|
-
const tail = discussionTail(discussion.messages, messageSizeOf, Math.max(1, tailCap));
|
|
22570
|
+
const tail = discussionRounds(discussion.messages, roundLimit, messageSizeOf);
|
|
22235
22571
|
return {
|
|
22236
22572
|
messages: tail.messages,
|
|
22237
22573
|
hidden: tail.hidden,
|
|
22238
|
-
rows:
|
|
22574
|
+
rows: tail.rows + trailing
|
|
22239
22575
|
};
|
|
22240
22576
|
}, [
|
|
22241
22577
|
langWrap,
|
|
22242
22578
|
quoteRowsOf,
|
|
22243
|
-
messageSizeOf
|
|
22579
|
+
messageSizeOf,
|
|
22580
|
+
roundLimit,
|
|
22581
|
+
ROW_HEIGHT_PX
|
|
22244
22582
|
]);
|
|
22245
22583
|
/**
|
|
22246
22584
|
* The discussions as the render will draw them: the body height the measurement
|
|
@@ -22296,7 +22634,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22296
22634
|
const heights = wrapped === null ? new Array(rows.length).fill(ROW_HEIGHT_PX) : [...wrapped];
|
|
22297
22635
|
for (const [after, extra] of discussionExtras) {
|
|
22298
22636
|
const index = Math.max(0, Math.min(after, heights.length - 1));
|
|
22299
|
-
heights[index] = (heights[index] ?? ROW_HEIGHT_PX) + extra *
|
|
22637
|
+
heights[index] = (heights[index] ?? ROW_HEIGHT_PX) + extra * THREAD_ROW_PX;
|
|
22300
22638
|
}
|
|
22301
22639
|
return heights;
|
|
22302
22640
|
}, [
|
|
@@ -22532,10 +22870,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22532
22870
|
(0, react.useEffect)(() => {
|
|
22533
22871
|
setDiscussionsByFile((all) => {
|
|
22534
22872
|
const list = all[file.id] ?? EMPTY_DISCUSSIONS;
|
|
22535
|
-
const next = list
|
|
22873
|
+
const next = remapDiscussions(list, (row) => {
|
|
22536
22874
|
const entry = model.diff.rows[row];
|
|
22537
22875
|
return entry?.newLine ?? entry?.oldLine;
|
|
22538
|
-
}, (row) => model.diff.rows[row]?.text ?? "", model.diff.rows.length)
|
|
22876
|
+
}, (row) => model.diff.rows[row]?.text ?? "", model.diff.rows.length);
|
|
22539
22877
|
return next.some((discussion, index) => discussion !== list[index]) ? {
|
|
22540
22878
|
...all,
|
|
22541
22879
|
[file.id]: next
|
|
@@ -22597,13 +22935,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22597
22935
|
if (startLine === void 0) return;
|
|
22598
22936
|
const endLine = last?.newLine ?? last?.oldLine ?? startLine;
|
|
22599
22937
|
const body = bodyRef.current;
|
|
22600
|
-
if (body !== null && offsetOf(selection.start) - body.scrollTop < 0) pendingScrollShiftRef.current +=
|
|
22938
|
+
if (body !== null && offsetOf(selection.start) - body.scrollTop < 0) pendingScrollShiftRef.current += 66;
|
|
22601
22939
|
const id = `discussion-${Date.now().toString(36)}-${discussions.length}`;
|
|
22602
22940
|
const quoted = model.diff.rows.slice(selection.start, selection.end + 1);
|
|
22603
22941
|
const quote = quoted.map((row) => row.text).join("\n");
|
|
22604
22942
|
const quoteLines = quoted.map((row) => ({
|
|
22605
22943
|
old: row.oldLine,
|
|
22606
|
-
new: row.newLine
|
|
22944
|
+
new: row.newLine,
|
|
22945
|
+
kind: row.kind
|
|
22607
22946
|
}));
|
|
22608
22947
|
setDiscussions((current) => [...current, {
|
|
22609
22948
|
id,
|
|
@@ -22637,7 +22976,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22637
22976
|
if (discussion === void 0) return;
|
|
22638
22977
|
const next = collapsed ?? !discussion.collapsed;
|
|
22639
22978
|
if (next === discussion.collapsed) return;
|
|
22640
|
-
const shift = ((next ? 1 : discussionRows(discussion)) - discussionRows(discussion)) *
|
|
22979
|
+
const shift = ((next ? 1 : discussionRows(discussion)) - discussionRows(discussion)) * THREAD_ROW_PX;
|
|
22641
22980
|
const body = bodyRef.current;
|
|
22642
22981
|
if (body !== null && offsetOf(discussion.anchor.start) - body.scrollTop < 0) pendingScrollShiftRef.current += shift;
|
|
22643
22982
|
setDiscussions((current) => current.map((entry) => entry.id === id ? {
|
|
@@ -22663,7 +23002,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22663
23002
|
*/
|
|
22664
23003
|
const sendDiscussion = (id) => {
|
|
22665
23004
|
const discussion = discussions.find((entry) => entry.id === id);
|
|
22666
|
-
if (discussion === void 0
|
|
23005
|
+
if (discussion === void 0) return;
|
|
23006
|
+
if (askingId !== void 0 && askingId !== id) return;
|
|
23007
|
+
if (pendingAskRef.current !== void 0 && pendingAskRef.current.id !== id) return;
|
|
22667
23008
|
const text = discussion.draft.trim();
|
|
22668
23009
|
if (text === "") return;
|
|
22669
23010
|
const reference = `(${discussionLineRange(discussion.anchor)})`;
|
|
@@ -22705,7 +23046,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22705
23046
|
const removeDiscussion = (id) => {
|
|
22706
23047
|
const discussion = discussions.find((entry) => entry.id === id);
|
|
22707
23048
|
if (discussion === void 0) return;
|
|
22708
|
-
const shift = discussionRows(discussion) *
|
|
23049
|
+
const shift = discussionRows(discussion) * THREAD_ROW_PX * -1;
|
|
22709
23050
|
const body = bodyRef.current;
|
|
22710
23051
|
if (body !== null && offsetOf(discussion.anchor.start) - body.scrollTop < 0) pendingScrollShiftRef.current += shift;
|
|
22711
23052
|
setDiscussions((current) => current.filter((entry) => entry.id !== id));
|
|
@@ -22828,6 +23169,17 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22828
23169
|
}
|
|
22829
23170
|
return;
|
|
22830
23171
|
}
|
|
23172
|
+
const row = landingRowRef.current;
|
|
23173
|
+
if (row !== void 0 && !previewActive) {
|
|
23174
|
+
landingRowRef.current = void 0;
|
|
23175
|
+
const rowBody = bodyRef.current;
|
|
23176
|
+
if (rowBody !== null) {
|
|
23177
|
+
const target = Math.max(0, Math.min(offsetOf(row) - leadRows * ROW_HEIGHT_PX, rowBody.scrollHeight - rowBody.clientHeight));
|
|
23178
|
+
if (rowBody.scrollTop !== target) rowBody.scrollTop = target;
|
|
23179
|
+
setScrollTop(target);
|
|
23180
|
+
}
|
|
23181
|
+
return;
|
|
23182
|
+
}
|
|
22831
23183
|
const block = model.blocks[focus];
|
|
22832
23184
|
if (block === void 0) return;
|
|
22833
23185
|
if (previewActive) {
|
|
@@ -22946,9 +23298,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22946
23298
|
}
|
|
22947
23299
|
return found;
|
|
22948
23300
|
};
|
|
23301
|
+
const syncQuoteScroll = (0, react.useCallback)((body) => {
|
|
23302
|
+
if (body === null) return;
|
|
23303
|
+
for (const text of body.querySelectorAll("[data-diff-quote-text]")) text.scrollLeft = body.scrollLeft;
|
|
23304
|
+
}, []);
|
|
22949
23305
|
const onScroll = () => {
|
|
22950
23306
|
const body = bodyRef.current;
|
|
22951
23307
|
if (body === null) return;
|
|
23308
|
+
syncQuoteScroll(body);
|
|
22952
23309
|
setScrollTop(body.scrollTop);
|
|
22953
23310
|
setViewportHeight(body.clientHeight);
|
|
22954
23311
|
const count = model.blocks.length;
|
|
@@ -23364,6 +23721,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23364
23721
|
maxScroll,
|
|
23365
23722
|
viewportHeight
|
|
23366
23723
|
]);
|
|
23724
|
+
(0, react.useLayoutEffect)(() => {
|
|
23725
|
+
syncQuoteScroll(bodyRef.current);
|
|
23726
|
+
});
|
|
23367
23727
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
23368
23728
|
className: PendingPanel_module_css_default.diff,
|
|
23369
23729
|
"data-diff-approval-diff": true,
|
|
@@ -23373,9 +23733,37 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23373
23733
|
className: PendingPanel_module_css_default.diffHeader,
|
|
23374
23734
|
"data-diff-toolbar": true,
|
|
23375
23735
|
children: [
|
|
23376
|
-
(0, react_jsx_runtime.jsx)("
|
|
23736
|
+
(0, react_jsx_runtime.jsx)("input", {
|
|
23377
23737
|
className: PendingPanel_module_css_default.diffPath,
|
|
23378
|
-
|
|
23738
|
+
"data-diff-path-input": true,
|
|
23739
|
+
type: "text",
|
|
23740
|
+
value: pathDraft ?? file.path,
|
|
23741
|
+
spellCheck: false,
|
|
23742
|
+
autoComplete: "off",
|
|
23743
|
+
"aria-label": t("action.pathField"),
|
|
23744
|
+
onChange: (event) => {
|
|
23745
|
+
setPathDraft(event.target.value);
|
|
23746
|
+
},
|
|
23747
|
+
onBlur: () => {
|
|
23748
|
+
setPathDraft(null);
|
|
23749
|
+
},
|
|
23750
|
+
onKeyDown: (event) => {
|
|
23751
|
+
if (event.key === "Enter") {
|
|
23752
|
+
event.preventDefault();
|
|
23753
|
+
const typed = (pathDraft ?? "").trim();
|
|
23754
|
+
if (typed === "" || typed === file.path) {
|
|
23755
|
+
setPathDraft(null);
|
|
23756
|
+
return;
|
|
23757
|
+
}
|
|
23758
|
+
onAddTypedPath(typed).finally(() => {
|
|
23759
|
+
setPathDraft(null);
|
|
23760
|
+
});
|
|
23761
|
+
} else if (event.key === "Escape") {
|
|
23762
|
+
event.preventDefault();
|
|
23763
|
+
setPathDraft(null);
|
|
23764
|
+
event.currentTarget.blur();
|
|
23765
|
+
}
|
|
23766
|
+
}
|
|
23379
23767
|
}),
|
|
23380
23768
|
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
23381
23769
|
label: t("action.openFile"),
|
|
@@ -23511,7 +23899,16 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23511
23899
|
})
|
|
23512
23900
|
}),
|
|
23513
23901
|
(0, react_jsx_runtime.jsx)("span", { className: PendingPanel_module_css_default.flexSpacer }),
|
|
23514
|
-
(0, react_jsx_runtime.jsx)("button", {
|
|
23902
|
+
model.blocks.length === 0 ? (0, react_jsx_runtime.jsx)("button", {
|
|
23903
|
+
type: "button",
|
|
23904
|
+
className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary} ${PendingPanel_module_css_default.actionQuietDisabled}`,
|
|
23905
|
+
"data-diff-remove": true,
|
|
23906
|
+
disabled: busy,
|
|
23907
|
+
onClick: () => {
|
|
23908
|
+
onKeep(file.sessionId, file.id, false);
|
|
23909
|
+
},
|
|
23910
|
+
children: t("row.dismiss")
|
|
23911
|
+
}) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("button", {
|
|
23515
23912
|
type: "button",
|
|
23516
23913
|
className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary} ${PendingPanel_module_css_default.actionQuietDisabled}`,
|
|
23517
23914
|
"data-diff-keep": true,
|
|
@@ -23520,8 +23917,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23520
23917
|
onKeep(file.sessionId, file.id);
|
|
23521
23918
|
},
|
|
23522
23919
|
children: t("action.keep")
|
|
23523
|
-
}),
|
|
23524
|
-
(0, react_jsx_runtime.jsx)("button", {
|
|
23920
|
+
}), (0, react_jsx_runtime.jsx)("button", {
|
|
23525
23921
|
type: "button",
|
|
23526
23922
|
className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionQuietDisabled}`,
|
|
23527
23923
|
"data-diff-revert": true,
|
|
@@ -23530,7 +23926,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23530
23926
|
onRevert(file.sessionId, file.id);
|
|
23531
23927
|
},
|
|
23532
23928
|
children: file.kind === "create" ? t("action.delete") : t("action.revert")
|
|
23533
|
-
})
|
|
23929
|
+
})] })
|
|
23534
23930
|
]
|
|
23535
23931
|
}),
|
|
23536
23932
|
failedMessage !== void 0 && (0, react_jsx_runtime.jsx)("p", {
|
|
@@ -23718,7 +24114,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23718
24114
|
ref: bodyRef,
|
|
23719
24115
|
tabIndex: 0,
|
|
23720
24116
|
onScroll,
|
|
23721
|
-
style: {
|
|
24117
|
+
style: {
|
|
24118
|
+
tabSize: tabWidthSpaces,
|
|
24119
|
+
"--dsh-diff-quote-width": `${widestLine}ch`
|
|
24120
|
+
},
|
|
23722
24121
|
"data-diff-body": true,
|
|
23723
24122
|
children: (0, react_jsx_runtime.jsxs)("div", {
|
|
23724
24123
|
className: `${PendingPanel_module_css_default.lines}${langWrap ? " " + PendingPanel_module_css_default.wrap : ""}`,
|
|
@@ -23752,7 +24151,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23752
24151
|
return (0, react_jsx_runtime.jsxs)("div", {
|
|
23753
24152
|
className: PendingPanel_module_css_default.discussionRow,
|
|
23754
24153
|
"data-diff-discussion-space": rows,
|
|
23755
|
-
style: { height: rows *
|
|
24154
|
+
style: { height: rows * THREAD_ROW_PX },
|
|
23756
24155
|
children: [
|
|
23757
24156
|
(0, react_jsx_runtime.jsx)("div", {
|
|
23758
24157
|
className: PendingPanel_module_css_default.gutter,
|
|
@@ -23772,8 +24171,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23772
24171
|
"data-diff-discussion": true,
|
|
23773
24172
|
"data-lost": discussion.lost === true ? "" : void 0,
|
|
23774
24173
|
style: {
|
|
23775
|
-
width: Math.max(0, bodyWidth
|
|
23776
|
-
height: rows *
|
|
24174
|
+
width: Math.max(0, bodyWidth),
|
|
24175
|
+
height: rows * THREAD_ROW_PX
|
|
23777
24176
|
},
|
|
23778
24177
|
children: [(0, react_jsx_runtime.jsxs)("div", {
|
|
23779
24178
|
className: PendingPanel_module_css_default.discussionHead,
|
|
@@ -23789,17 +24188,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23789
24188
|
},
|
|
23790
24189
|
children: discussion.collapsed ? (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 12 }) : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronUpOutline14, { size: 12 })
|
|
23791
24190
|
}),
|
|
23792
|
-
(0, react_jsx_runtime.
|
|
24191
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
23793
24192
|
className: PendingPanel_module_css_default.discussionRangeWrap,
|
|
23794
|
-
children:
|
|
24193
|
+
children: (0, react_jsx_runtime.jsx)("span", {
|
|
23795
24194
|
className: PendingPanel_module_css_default.discussionRange,
|
|
23796
24195
|
"data-diff-discussion-range": true,
|
|
23797
24196
|
children: discussionLineRange(discussion.anchor)
|
|
23798
|
-
})
|
|
23799
|
-
className: PendingPanel_module_css_default.discussionOutdated,
|
|
23800
|
-
"data-diff-discussion-outdated": true,
|
|
23801
|
-
children: t("discussion.outdated")
|
|
23802
|
-
})]
|
|
24197
|
+
})
|
|
23803
24198
|
}),
|
|
23804
24199
|
(0, react_jsx_runtime.jsx)("span", { className: PendingPanel_module_css_default.flexSpacer }),
|
|
23805
24200
|
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
|
|
@@ -23833,7 +24228,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23833
24228
|
discussion.lost === true && discussion.quote !== void 0 && discussion.quote !== "" && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("p", {
|
|
23834
24229
|
className: PendingPanel_module_css_default.discussionNote,
|
|
23835
24230
|
"data-diff-discussion-quote-label": true,
|
|
23836
|
-
children: t("discussion.
|
|
24231
|
+
children: t("discussion.outdatedQuote")
|
|
23837
24232
|
}), (0, react_jsx_runtime.jsx)(DiscussionQuote, {
|
|
23838
24233
|
quote: discussion.quote,
|
|
23839
24234
|
lines: discussion.quoteLines,
|
|
@@ -23853,16 +24248,16 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23853
24248
|
discussion.messages.map((message, index) => message.role === "user" ? (0, react_jsx_runtime.jsx)("p", {
|
|
23854
24249
|
className: PendingPanel_module_css_default.discussionUser,
|
|
23855
24250
|
"data-diff-discussion-user": true,
|
|
23856
|
-
children: message.text
|
|
24251
|
+
children: discussionNodes(message.text)
|
|
23857
24252
|
}, `u${index}`) : (0, react_jsx_runtime.jsx)("p", {
|
|
23858
24253
|
className: PendingPanel_module_css_default.discussionAnswer,
|
|
23859
24254
|
"data-diff-discussion-reply": true,
|
|
23860
|
-
children: message.text
|
|
24255
|
+
children: discussionNodes(message.text)
|
|
23861
24256
|
}, `a${index}`)),
|
|
23862
24257
|
discussion.reply !== void 0 && discussion.reply !== "" ? (0, react_jsx_runtime.jsx)("p", {
|
|
23863
24258
|
className: PendingPanel_module_css_default.discussionAnswer,
|
|
23864
24259
|
"data-diff-discussion-reply": true,
|
|
23865
|
-
children: discussion.reply
|
|
24260
|
+
children: discussionNodes(discussion.reply)
|
|
23866
24261
|
}) : discussion.failed === true ? (0, react_jsx_runtime.jsx)("p", {
|
|
23867
24262
|
className: PendingPanel_module_css_default.discussionNote,
|
|
23868
24263
|
"data-diff-discussion-failed": true,
|
|
@@ -23885,13 +24280,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23885
24280
|
children: [(0, react_jsx_runtime.jsx)("input", {
|
|
23886
24281
|
className: PendingPanel_module_css_default.discussionInput,
|
|
23887
24282
|
"data-diff-discussion-input": true,
|
|
23888
|
-
disabled: discussion.lost === true,
|
|
23889
24283
|
ref: (element) => {
|
|
23890
24284
|
if (element === null) discussionInputEls.current.delete(discussion.id);
|
|
23891
24285
|
else discussionInputEls.current.set(discussion.id, element);
|
|
23892
24286
|
},
|
|
23893
24287
|
value: discussion.draft,
|
|
23894
|
-
placeholder: t(
|
|
24288
|
+
placeholder: t("discussion.placeholder"),
|
|
23895
24289
|
onChange: (event) => {
|
|
23896
24290
|
const value = event.target.value;
|
|
23897
24291
|
setDiscussions((current) => current.map((entry) => entry.id === discussion.id ? {
|
|
@@ -23909,7 +24303,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23909
24303
|
type: "button",
|
|
23910
24304
|
className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary} ${PendingPanel_module_css_default.discussionSend}`,
|
|
23911
24305
|
"data-diff-discussion-send": true,
|
|
23912
|
-
disabled:
|
|
24306
|
+
disabled: askingId !== void 0,
|
|
23913
24307
|
onClick: () => {
|
|
23914
24308
|
sendDiscussion(discussion.id);
|
|
23915
24309
|
},
|
|
@@ -24196,6 +24590,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24196
24590
|
const [open, setOpen] = (0, react.useState)(false);
|
|
24197
24591
|
const [selected, setSelected] = (0, react.useState)("");
|
|
24198
24592
|
/**
|
|
24593
|
+
* A file the detail header's path field just added, waiting for it to show up in the list so it
|
|
24594
|
+
* can be selected. The add's own refresh lands a poll later, and a selection made to an id that
|
|
24595
|
+
* is not in the list yet would be replaced by the list's first row, so the id waits here.
|
|
24596
|
+
*/
|
|
24597
|
+
const [pendingSelect, setPendingSelect] = (0, react.useState)(null);
|
|
24598
|
+
/**
|
|
24199
24599
|
* Where the diff should land for the file it is about to show, and a nonce so a
|
|
24200
24600
|
* repeated request for the *same* file lands again. `top` carries the offset the
|
|
24201
24601
|
* reader was left at when the panel resumes a view (see `panel-memory`); it is
|
|
@@ -24204,13 +24604,15 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24204
24604
|
* that lands on the file's first change.
|
|
24205
24605
|
*/
|
|
24206
24606
|
const [landing, setLanding] = (0, react.useState)(void 0);
|
|
24207
|
-
/** Ask the diff to land on one file: its first change unless `top` says where
|
|
24607
|
+
/** Ask the diff to land on one file: its first change unless `top` says where, or the row a jump
|
|
24608
|
+
* to a comment names (which lands the way a change-block jump does, see `landingRow`).
|
|
24208
24609
|
* The nonce makes the request an event rather than a value, so re-clicking the
|
|
24209
24610
|
* chip for the file already open lands on its first change again. */
|
|
24210
|
-
const landOn = (fileId, top) => {
|
|
24611
|
+
const landOn = (fileId, top, row) => {
|
|
24211
24612
|
setLanding((prev) => ({
|
|
24212
24613
|
fileId,
|
|
24213
24614
|
top,
|
|
24615
|
+
row,
|
|
24214
24616
|
n: (prev?.n ?? 0) + 1
|
|
24215
24617
|
}));
|
|
24216
24618
|
};
|
|
@@ -24218,6 +24620,44 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24218
24620
|
* cleanup (the docked tab unmounting) rather than from a handler. */
|
|
24219
24621
|
const selectedRef = (0, react.useRef)(selected);
|
|
24220
24622
|
selectedRef.current = selected;
|
|
24623
|
+
/**
|
|
24624
|
+
* Which tab the list pane shows: the pending files, or every comment the files in the list carry.
|
|
24625
|
+
* The pane's own state rather than a remembered preference: a reader who came to the list for a
|
|
24626
|
+
* comment is in the comments tab while they read it, and the next time the panel opens it is the
|
|
24627
|
+
* list they are shown — the pending list is what the panel is for.
|
|
24628
|
+
*/
|
|
24629
|
+
const [listTab, setListTab] = (0, react.useState)("pending");
|
|
24630
|
+
/**
|
|
24631
|
+
* Whether this panel is commenting at all: with comment mode off there are no comments to list, so
|
|
24632
|
+
* the pane is the pending list alone and shows no tabs. It follows the setting like the frame does
|
|
24633
|
+
* (the Settings section is another mount).
|
|
24634
|
+
*/
|
|
24635
|
+
const [commentMode, setCommentMode] = (0, react.useState)(commentModeEnabled);
|
|
24636
|
+
/** The tabs the pane offers: the comments one exists only while the panel is commenting, so with
|
|
24637
|
+
* the mode off the pane has one view and no switch to offer. */
|
|
24638
|
+
const listTabs = commentMode ? ["pending", "comments"] : ["pending"];
|
|
24639
|
+
/** The tab actually shown: the comments one only exists while the mode is on. */
|
|
24640
|
+
const activeTab = commentMode ? listTab : "pending";
|
|
24641
|
+
(0, react.useEffect)(() => {
|
|
24642
|
+
const onCommentMode = () => {
|
|
24643
|
+
setCommentMode(commentModeEnabled());
|
|
24644
|
+
};
|
|
24645
|
+
window.addEventListener(COMMENT_MODE_CHANGED_EVENT, onCommentMode);
|
|
24646
|
+
return () => {
|
|
24647
|
+
window.removeEventListener(COMMENT_MODE_CHANGED_EVENT, onCommentMode);
|
|
24648
|
+
};
|
|
24649
|
+
}, []);
|
|
24650
|
+
/** Bumped when the threads change, so the comments tab re-reads them (see `rememberDiscussions`). */
|
|
24651
|
+
const [commentsTick, setCommentsTick] = (0, react.useState)(0);
|
|
24652
|
+
(0, react.useEffect)(() => {
|
|
24653
|
+
const changed = () => {
|
|
24654
|
+
setCommentsTick((tick) => tick + 1);
|
|
24655
|
+
};
|
|
24656
|
+
window.addEventListener(COMMENTS_CHANGED_EVENT, changed);
|
|
24657
|
+
return () => {
|
|
24658
|
+
window.removeEventListener(COMMENTS_CHANGED_EVENT, changed);
|
|
24659
|
+
};
|
|
24660
|
+
}, []);
|
|
24221
24661
|
/** Bumped when the already-open file is clicked again, to jump to the next
|
|
24222
24662
|
* diff block in the open file's detail pane. */
|
|
24223
24663
|
const [jumpSignal, setJumpSignal] = (0, react.useState)(0);
|
|
@@ -24284,6 +24724,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24284
24724
|
* choice rides the same block RPC as its `removeWhenResolved` flag. */
|
|
24285
24725
|
const [blockPrompt, setBlockPrompt] = (0, react.useState)(null);
|
|
24286
24726
|
const [filePrompt, setFilePrompt] = (0, react.useState)(null);
|
|
24727
|
+
/** The file list row whose action menu is open, and where the right-click landed. */
|
|
24728
|
+
const [rowMenu, setRowMenu] = (0, react.useState)(null);
|
|
24287
24729
|
/** Whether the add-path dialog is open. One dialog covers both shapes: what
|
|
24288
24730
|
* the browser settles on decides whether a file or a directory is added. */
|
|
24289
24731
|
const [addOpen, setAddOpen] = (0, react.useState)(false);
|
|
@@ -24631,19 +25073,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24631
25073
|
if (!showing) return;
|
|
24632
25074
|
if (started) startListOpenRef.current = true;
|
|
24633
25075
|
const pending = (id) => files.some((file) => file.id === id);
|
|
25076
|
+
const typed = pendingSelect !== null && pending(pendingSelect) ? pendingSelect : void 0;
|
|
25077
|
+
if (typed !== void 0) setPendingSelect(null);
|
|
24634
25078
|
const keep = selected !== "" && pending(selected) ? selected : void 0;
|
|
24635
25079
|
const remembered = keep === void 0 && started ? lastPanelFile(current) : void 0;
|
|
24636
25080
|
const resumed = remembered !== void 0 && pending(remembered) ? remembered : void 0;
|
|
24637
|
-
const pick = keep ?? resumed ?? files[0]?.id;
|
|
25081
|
+
const pick = typed ?? keep ?? resumed ?? files[0]?.id;
|
|
24638
25082
|
if (pick === void 0) return;
|
|
24639
25083
|
if (pick !== selected) setSelected(pick);
|
|
24640
25084
|
if (started) landOn(pick, panelFileOffset(current, pick));
|
|
25085
|
+
else if (typed !== void 0) landOn(pick);
|
|
24641
25086
|
}, [
|
|
24642
25087
|
open,
|
|
24643
25088
|
docked,
|
|
24644
25089
|
current,
|
|
24645
25090
|
files,
|
|
24646
|
-
selected
|
|
25091
|
+
selected,
|
|
25092
|
+
pendingSelect
|
|
24647
25093
|
]);
|
|
24648
25094
|
const runImportVcs = async () => {
|
|
24649
25095
|
if (current === void 0 || importBusy) return;
|
|
@@ -24831,6 +25277,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24831
25277
|
setAddOpen(false);
|
|
24832
25278
|
setBlockPrompt(null);
|
|
24833
25279
|
setFilePrompt(null);
|
|
25280
|
+
setRowMenu(null);
|
|
24834
25281
|
}, [open]);
|
|
24835
25282
|
/** Run the same decision over every current-session file, sequentially. */
|
|
24836
25283
|
const runBulk = async (kind) => {
|
|
@@ -24877,11 +25324,36 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24877
25324
|
}
|
|
24878
25325
|
showCopyToast(t("panel.fileNotPending"));
|
|
24879
25326
|
};
|
|
25327
|
+
/**
|
|
25328
|
+
* Open a path typed into the detail header's field: add it to the list when it is not there
|
|
25329
|
+
* yet, then select the file the host says it landed as. Only one exact file counts — a path
|
|
25330
|
+
* that is missing, is a directory, or has nothing readable in it leaves the list untouched,
|
|
25331
|
+
* and the field falls back to the path it was showing.
|
|
25332
|
+
*
|
|
25333
|
+
* @param path - the path as typed.
|
|
25334
|
+
* @returns whether a file was opened.
|
|
25335
|
+
*/
|
|
25336
|
+
const addTypedPath = async (path) => {
|
|
25337
|
+
if (current === void 0) return false;
|
|
25338
|
+
const value = await onAddPath(current, path, true, true).catch(() => void 0);
|
|
25339
|
+
if (value === void 0) return false;
|
|
25340
|
+
if (value.outcome !== "added" && value.outcome !== "duplicate") return false;
|
|
25341
|
+
if (value.id !== void 0) setPendingSelect(value.id);
|
|
25342
|
+
onRefresh(current);
|
|
25343
|
+
return true;
|
|
25344
|
+
};
|
|
24880
25345
|
const renderEntry = (entry) => (0, react_jsx_runtime.jsx)(PendingFileRow, {
|
|
24881
25346
|
file: entry,
|
|
24882
25347
|
selected: selected === entry.id,
|
|
24883
25348
|
failedMessage: failed.get(entry.id),
|
|
24884
25349
|
t,
|
|
25350
|
+
onMenu: (event) => {
|
|
25351
|
+
setRowMenu({
|
|
25352
|
+
file: entry,
|
|
25353
|
+
x: event.clientX,
|
|
25354
|
+
y: event.clientY
|
|
25355
|
+
});
|
|
25356
|
+
},
|
|
24885
25357
|
onSelect: (id) => {
|
|
24886
25358
|
if (id === selected) setJumpSignal((signal) => signal + 1);
|
|
24887
25359
|
else {
|
|
@@ -24890,8 +25362,64 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24890
25362
|
}
|
|
24891
25363
|
}
|
|
24892
25364
|
}, entry.id);
|
|
25365
|
+
/** The row menu's rows: the pair the file's own toolbar offers, or its single 移出. */
|
|
25366
|
+
const rowMenuItems = (0, react.useMemo)(() => {
|
|
25367
|
+
if (rowMenu === null) return [];
|
|
25368
|
+
if (fileHasNoDiff(rowMenu.file)) return [{
|
|
25369
|
+
id: "remove",
|
|
25370
|
+
label: t("row.dismiss")
|
|
25371
|
+
}];
|
|
25372
|
+
return [{
|
|
25373
|
+
id: "keep",
|
|
25374
|
+
label: t("action.keep")
|
|
25375
|
+
}, {
|
|
25376
|
+
id: "revert",
|
|
25377
|
+
label: rowMenu.file.kind === "create" ? t("action.delete") : t("action.revert")
|
|
25378
|
+
}];
|
|
25379
|
+
}, [rowMenu, t]);
|
|
25380
|
+
/** Run a row-menu choice through the same handlers the open file uses. 移出 is a keep: the
|
|
25381
|
+
* host folds the content and drops the entry, so the file itself is left alone. */
|
|
25382
|
+
const runRowMenu = (id) => {
|
|
25383
|
+
const target = rowMenu;
|
|
25384
|
+
setRowMenu(null);
|
|
25385
|
+
if (target === null) return;
|
|
25386
|
+
if (id === "keep" || id === "remove") onKeep(target.file.sessionId, target.file.id);
|
|
25387
|
+
else if (id === "revert") onRevert(target.file.sessionId, target.file.id);
|
|
25388
|
+
};
|
|
24893
25389
|
const selectedFile = files.find((file) => file.id === selected);
|
|
24894
25390
|
/**
|
|
25391
|
+
* Every comment the files in the list carry, in list order and then in the order their rows run:
|
|
25392
|
+
* what the comments tab shows. A comment IS a block of rows in one file, so its label is the same
|
|
25393
|
+
* `path:lines` reference the thread's own header wears, its title is the first sentence of what
|
|
25394
|
+
* the reader asked (the first turn is the annotation; later ones are follow-ups), and an outdated
|
|
25395
|
+
* one says so — the same state the block itself is wearing (see `[data-lost]`).
|
|
25396
|
+
*
|
|
25397
|
+
* The threads are held by the file detail, which is one mount at a time, so they are read back
|
|
25398
|
+
* out of the memory the two share, and re-read whenever they change (`commentsTick`).
|
|
25399
|
+
*/
|
|
25400
|
+
const commentEntries = (0, react.useMemo)(() => {
|
|
25401
|
+
const threads = rememberedDiscussions(current);
|
|
25402
|
+
return files.flatMap((file) => (threads[file.id] ?? []).map((discussion) => ({
|
|
25403
|
+
id: discussion.id,
|
|
25404
|
+
fileId: file.id,
|
|
25405
|
+
row: discussion.anchor.start,
|
|
25406
|
+
label: referenceLabelOf(file.path, snapshot.workspacePath, discussion.anchor.startLine, discussion.anchor.endLine),
|
|
25407
|
+
title: commentTitle(discussion) || t("panel.commentEmptyTitle"),
|
|
25408
|
+
lost: discussion.lost === true
|
|
25409
|
+
})));
|
|
25410
|
+
}, [
|
|
25411
|
+
files,
|
|
25412
|
+
current,
|
|
25413
|
+
snapshot.workspacePath,
|
|
25414
|
+
commentsTick,
|
|
25415
|
+
t
|
|
25416
|
+
]);
|
|
25417
|
+
/** Open the file a comment hangs in and land on the comment, the way a change-block jump lands. */
|
|
25418
|
+
const jumpToComment = (fileId, row) => {
|
|
25419
|
+
if (fileId !== selected) setSelected(fileId);
|
|
25420
|
+
landOn(fileId, void 0, row);
|
|
25421
|
+
};
|
|
25422
|
+
/**
|
|
24895
25423
|
* The folded card's own box, derived from the measured one, or undefined while
|
|
24896
25424
|
* the list is not folded open. The card and its width grip are both placed from
|
|
24897
25425
|
* these numbers, which is what keeps the grip on the card's right edge as the
|
|
@@ -24907,59 +25435,113 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24907
25435
|
const promptFile = blockPrompt === null ? void 0 : files.find((file) => file.id === blockPrompt.id);
|
|
24908
25436
|
/** The file whose removal is being confirmed (a whole-file action), if any. */
|
|
24909
25437
|
const promptEntry = filePrompt === null ? void 0 : files.find((file) => file.id === filePrompt.id);
|
|
24910
|
-
const fileListBody = (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
24911
|
-
|
|
24912
|
-
|
|
24913
|
-
|
|
24914
|
-
|
|
24915
|
-
|
|
24916
|
-
|
|
24917
|
-
|
|
24918
|
-
|
|
24919
|
-
|
|
24920
|
-
|
|
24921
|
-
|
|
24922
|
-
|
|
24923
|
-
|
|
24924
|
-
|
|
24925
|
-
|
|
24926
|
-
|
|
24927
|
-
|
|
24928
|
-
|
|
24929
|
-
|
|
24930
|
-
|
|
24931
|
-
|
|
24932
|
-
|
|
24933
|
-
|
|
24934
|
-
|
|
24935
|
-
|
|
24936
|
-
|
|
24937
|
-
|
|
24938
|
-
|
|
24939
|
-
|
|
24940
|
-
|
|
24941
|
-
|
|
24942
|
-
|
|
24943
|
-
|
|
24944
|
-
|
|
24945
|
-
|
|
24946
|
-
|
|
24947
|
-
|
|
25438
|
+
const fileListBody = (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [files.length > 0 && (0, react_jsx_runtime.jsxs)("div", {
|
|
25439
|
+
className: PendingPanel_module_css_default.listHead,
|
|
25440
|
+
children: [
|
|
25441
|
+
listTabs.length > 1 ? (0, react_jsx_runtime.jsxs)("div", {
|
|
25442
|
+
className: PendingPanel_module_css_default.listTabs,
|
|
25443
|
+
role: "tablist",
|
|
25444
|
+
"aria-label": t("panel.tabs"),
|
|
25445
|
+
children: [(0, react_jsx_runtime.jsx)("button", {
|
|
25446
|
+
type: "button",
|
|
25447
|
+
role: "tab",
|
|
25448
|
+
className: PendingPanel_module_css_default.listTab,
|
|
25449
|
+
"data-diff-list-tab": "pending",
|
|
25450
|
+
"aria-selected": activeTab === "pending",
|
|
25451
|
+
onClick: () => {
|
|
25452
|
+
setListTab("pending");
|
|
25453
|
+
},
|
|
25454
|
+
children: t("panel.tab.pending")
|
|
25455
|
+
}), (0, react_jsx_runtime.jsx)("button", {
|
|
25456
|
+
type: "button",
|
|
25457
|
+
role: "tab",
|
|
25458
|
+
className: PendingPanel_module_css_default.listTab,
|
|
25459
|
+
"data-diff-list-tab": "comments",
|
|
25460
|
+
"aria-selected": activeTab === "comments",
|
|
25461
|
+
onClick: () => {
|
|
25462
|
+
setListTab("comments");
|
|
25463
|
+
},
|
|
25464
|
+
children: t("panel.tab.comments")
|
|
25465
|
+
})]
|
|
25466
|
+
}) : (0, react_jsx_runtime.jsx)("h3", {
|
|
25467
|
+
className: PendingPanel_module_css_default.listTitle,
|
|
25468
|
+
"data-diff-list-title": true,
|
|
25469
|
+
children: t(`panel.tab.${activeTab}`)
|
|
25470
|
+
}),
|
|
25471
|
+
listTabs.length <= 1 && (0, react_jsx_runtime.jsx)("span", { className: PendingPanel_module_css_default.flexSpacer }),
|
|
25472
|
+
(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
25473
|
+
label: t(forceFloat ? "action.fileListFloatOff" : "action.fileListFloatOn"),
|
|
25474
|
+
side: "bottom",
|
|
25475
|
+
delayMs: 500,
|
|
25476
|
+
children: (0, react_jsx_runtime.jsx)("button", {
|
|
25477
|
+
type: "button",
|
|
25478
|
+
className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.addButton} ${PendingPanel_module_css_default.listFold}`,
|
|
25479
|
+
"data-diff-file-list-float": true,
|
|
25480
|
+
"data-active": forceFloat ? "" : void 0,
|
|
25481
|
+
"aria-label": t(forceFloat ? "action.fileListFloatOff" : "action.fileListFloatOn"),
|
|
25482
|
+
"aria-pressed": forceFloat,
|
|
25483
|
+
onClick: toggleForceFloat,
|
|
25484
|
+
children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, { size: 12 })
|
|
24948
25485
|
})
|
|
24949
|
-
]
|
|
24950
|
-
}),
|
|
24951
|
-
(0, react_jsx_runtime.jsx)("div", {
|
|
24952
|
-
className: PendingPanel_module_css_default.listScroll,
|
|
24953
|
-
"data-diff-list-scroll": true,
|
|
24954
|
-
ref: attachListScroll,
|
|
24955
|
-
children: files.length > 0 && (0, react_jsx_runtime.jsx)("ul", {
|
|
24956
|
-
className: PendingPanel_module_css_default.rows,
|
|
24957
|
-
children: files.map(renderEntry)
|
|
24958
25486
|
})
|
|
24959
|
-
|
|
24960
|
-
|
|
24961
|
-
|
|
24962
|
-
|
|
25487
|
+
]
|
|
25488
|
+
}), listTab === "comments" ? (0, react_jsx_runtime.jsx)("div", {
|
|
25489
|
+
className: PendingPanel_module_css_default.listScroll,
|
|
25490
|
+
"data-diff-list-scroll": true,
|
|
25491
|
+
children: commentEntries.length === 0 ? (0, react_jsx_runtime.jsx)("p", {
|
|
25492
|
+
className: PendingPanel_module_css_default.listEmpty,
|
|
25493
|
+
"data-diff-comments-empty": true,
|
|
25494
|
+
children: t("panel.commentsEmpty")
|
|
25495
|
+
}) : (0, react_jsx_runtime.jsx)("ul", {
|
|
25496
|
+
className: PendingPanel_module_css_default.rows,
|
|
25497
|
+
"data-diff-comment-list": true,
|
|
25498
|
+
children: commentEntries.map((entry) => (0, react_jsx_runtime.jsx)("li", {
|
|
25499
|
+
className: PendingPanel_module_css_default.row,
|
|
25500
|
+
children: (0, react_jsx_runtime.jsxs)("div", {
|
|
25501
|
+
role: "button",
|
|
25502
|
+
tabIndex: 0,
|
|
25503
|
+
className: PendingPanel_module_css_default.commentRow,
|
|
25504
|
+
"data-diff-comment-link": entry.id,
|
|
25505
|
+
"data-mobile-nav-copy": "1",
|
|
25506
|
+
onClick: () => {
|
|
25507
|
+
jumpToComment(entry.fileId, entry.row);
|
|
25508
|
+
},
|
|
25509
|
+
onKeyDown: (event) => {
|
|
25510
|
+
if (event.key !== "Enter" && event.key !== " ") return;
|
|
25511
|
+
event.preventDefault();
|
|
25512
|
+
jumpToComment(entry.fileId, entry.row);
|
|
25513
|
+
},
|
|
25514
|
+
children: [(0, react_jsx_runtime.jsxs)("span", {
|
|
25515
|
+
className: PendingPanel_module_css_default.commentHead,
|
|
25516
|
+
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
25517
|
+
className: PendingPanel_module_css_default.commentLabel,
|
|
25518
|
+
"data-diff-comment-label": true,
|
|
25519
|
+
children: entry.label
|
|
25520
|
+
}), entry.lost && (0, react_jsx_runtime.jsx)("span", {
|
|
25521
|
+
className: PendingPanel_module_css_default.commentLost,
|
|
25522
|
+
"data-diff-comment-lost": true,
|
|
25523
|
+
children: t("panel.commentOutdated")
|
|
25524
|
+
})]
|
|
25525
|
+
}), (0, react_jsx_runtime.jsx)("span", {
|
|
25526
|
+
className: PendingPanel_module_css_default.commentTitle,
|
|
25527
|
+
"data-diff-comment-title": true,
|
|
25528
|
+
children: entry.title
|
|
25529
|
+
})]
|
|
25530
|
+
})
|
|
25531
|
+
}, entry.id))
|
|
25532
|
+
})
|
|
25533
|
+
}) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
|
|
25534
|
+
className: PendingPanel_module_css_default.listScroll,
|
|
25535
|
+
"data-diff-list-scroll": true,
|
|
25536
|
+
ref: attachListScroll,
|
|
25537
|
+
children: files.length > 0 && (0, react_jsx_runtime.jsx)("ul", {
|
|
25538
|
+
className: PendingPanel_module_css_default.rows,
|
|
25539
|
+
children: files.map(renderEntry)
|
|
25540
|
+
})
|
|
25541
|
+
}), files.length > 0 && (0, react_jsx_runtime.jsxs)("div", {
|
|
25542
|
+
className: PendingPanel_module_css_default.bulkActions,
|
|
25543
|
+
children: [
|
|
25544
|
+
(0, react_jsx_runtime.jsx)("button", {
|
|
24963
25545
|
type: "button",
|
|
24964
25546
|
className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary}`,
|
|
24965
25547
|
"data-diff-keep-all": true,
|
|
@@ -24968,7 +25550,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24968
25550
|
runBulk("keep");
|
|
24969
25551
|
},
|
|
24970
25552
|
children: bulkBusy === "keep" ? t("action.busy") : t("action.keepAll")
|
|
24971
|
-
}),
|
|
25553
|
+
}),
|
|
25554
|
+
(0, react_jsx_runtime.jsx)("button", {
|
|
24972
25555
|
type: "button",
|
|
24973
25556
|
className: PendingPanel_module_css_default.action,
|
|
24974
25557
|
"data-diff-revert-all": true,
|
|
@@ -24977,9 +25560,19 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
24977
25560
|
runBulk("revert");
|
|
24978
25561
|
},
|
|
24979
25562
|
children: bulkBusy === "revert" ? t("action.busy") : t("action.revertAll")
|
|
24980
|
-
})
|
|
24981
|
-
|
|
24982
|
-
|
|
25563
|
+
}),
|
|
25564
|
+
(0, react_jsx_runtime.jsxs)("button", {
|
|
25565
|
+
type: "button",
|
|
25566
|
+
className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.addPath}`,
|
|
25567
|
+
"data-diff-add": true,
|
|
25568
|
+
"aria-label": t("action.addPath"),
|
|
25569
|
+
onClick: () => {
|
|
25570
|
+
setAddOpen(true);
|
|
25571
|
+
},
|
|
25572
|
+
children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPlusOutline16, { size: 12 }), t("panel.addPathGo")]
|
|
25573
|
+
})
|
|
25574
|
+
]
|
|
25575
|
+
})] })] });
|
|
24983
25576
|
const handleUndo = async (sessionId) => {
|
|
24984
25577
|
const id = await onUndo(sessionId);
|
|
24985
25578
|
if (id === void 0) return;
|
|
@@ -25122,6 +25715,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25122
25715
|
const onKeyDown = (event) => {
|
|
25123
25716
|
if (event.key !== "Escape") return;
|
|
25124
25717
|
if (pathPickerOpen()) return;
|
|
25718
|
+
if (event.target instanceof Element && event.target.closest("[data-diff-path-input]") !== null) return;
|
|
25125
25719
|
if (document.querySelector("[data-diff-approval-cover-popover]") !== null) return;
|
|
25126
25720
|
const target = event.target;
|
|
25127
25721
|
if (target instanceof Node && panelRef.current?.contains(target) === true && document.querySelector("[data-diff-searchbar]") !== null) return;
|
|
@@ -25153,11 +25747,22 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25153
25747
|
} catch {}
|
|
25154
25748
|
document.body.style.userSelect = "none";
|
|
25155
25749
|
document.body.style.cursor = "col-resize";
|
|
25750
|
+
let latest = startWidth;
|
|
25751
|
+
let pending = 0;
|
|
25156
25752
|
const onMove = (move) => {
|
|
25157
|
-
|
|
25158
|
-
|
|
25753
|
+
latest = Math.min(Math.max(startWidth + (move.clientX - startX), MIN_LIST_WIDTH_PX), cap);
|
|
25754
|
+
if (pending !== 0) return;
|
|
25755
|
+
pending = requestAnimationFrame(() => {
|
|
25756
|
+
pending = 0;
|
|
25757
|
+
setListWidth(latest);
|
|
25758
|
+
});
|
|
25159
25759
|
};
|
|
25160
25760
|
const finish = () => {
|
|
25761
|
+
if (pending !== 0) {
|
|
25762
|
+
cancelAnimationFrame(pending);
|
|
25763
|
+
pending = 0;
|
|
25764
|
+
setListWidth(latest);
|
|
25765
|
+
}
|
|
25161
25766
|
document.body.style.userSelect = "";
|
|
25162
25767
|
document.body.style.cursor = "";
|
|
25163
25768
|
window.removeEventListener("pointermove", onMove);
|
|
@@ -25168,6 +25773,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25168
25773
|
window.addEventListener("pointerup", finish);
|
|
25169
25774
|
window.addEventListener("pointercancel", finish);
|
|
25170
25775
|
};
|
|
25776
|
+
/**
|
|
25777
|
+
* End the text selection when the press lands on the panel's chrome — blank space, a label, the
|
|
25778
|
+
* toolbar, the file list.
|
|
25779
|
+
*
|
|
25780
|
+
* The chrome is `user-select: none` (see `.panel`), and a press on such an area is one the
|
|
25781
|
+
* browser does NOT clear the selection for: the highlight stayed up, and so did the selection
|
|
25782
|
+
* frame that goes with it, over a gesture that plainly ended. What IS content is left to the
|
|
25783
|
+
* browser — which is also what keeps a drag started on chrome able to select the code it runs
|
|
25784
|
+
* into, since dropping the ranges first costs the drag nothing.
|
|
25785
|
+
*/
|
|
25786
|
+
const onPanelMouseDown = (event) => {
|
|
25787
|
+
const target = event.target;
|
|
25788
|
+
if (!(target instanceof Element)) return;
|
|
25789
|
+
if (target.closest(KEEPS_SELECTION) !== null) return;
|
|
25790
|
+
const live = window.getSelection();
|
|
25791
|
+
if (typeof live?.removeAllRanges === "function") live.removeAllRanges();
|
|
25792
|
+
};
|
|
25171
25793
|
const content = (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
25172
25794
|
importToast !== null && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
|
|
25173
25795
|
text: importToast,
|
|
@@ -25203,6 +25825,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25203
25825
|
height: viewportHeight
|
|
25204
25826
|
}),
|
|
25205
25827
|
"data-diff-approval-panel": true,
|
|
25828
|
+
onMouseDown: onPanelMouseDown,
|
|
25206
25829
|
"data-diff-docked": docked ? "" : void 0,
|
|
25207
25830
|
"aria-label": t("panel.title"),
|
|
25208
25831
|
children: [
|
|
@@ -25352,6 +25975,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25352
25975
|
undoFlash,
|
|
25353
25976
|
landingTop: landing !== void 0 && landing.fileId === selectedFile.id ? landing.top : void 0,
|
|
25354
25977
|
landingTick: landing !== void 0 && landing.fileId === selectedFile.id ? landing.n : 0,
|
|
25978
|
+
landingRow: landing !== void 0 && landing.fileId === selectedFile.id ? landing.row : void 0,
|
|
25355
25979
|
failedMessage: failed.get(selectedFile.id),
|
|
25356
25980
|
commentSkill: snapshot.commentSkill,
|
|
25357
25981
|
onPasteReference,
|
|
@@ -25359,6 +25983,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25359
25983
|
watchChat,
|
|
25360
25984
|
onToast: showCopyToast,
|
|
25361
25985
|
t,
|
|
25986
|
+
onAddTypedPath: addTypedPath,
|
|
25362
25987
|
onKeep: keepWithPrompt,
|
|
25363
25988
|
onRevert: revertWithPrompt,
|
|
25364
25989
|
onRefreshVcs: (entry) => {
|
|
@@ -25465,6 +26090,18 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25465
26090
|
})]
|
|
25466
26091
|
})
|
|
25467
26092
|
}),
|
|
26093
|
+
rowMenu !== null && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
|
|
26094
|
+
open: true,
|
|
26095
|
+
portal: true,
|
|
26096
|
+
compact: true,
|
|
26097
|
+
items: rowMenuItems,
|
|
26098
|
+
onSelect: runRowMenu,
|
|
26099
|
+
onClose: () => {
|
|
26100
|
+
setRowMenu(null);
|
|
26101
|
+
},
|
|
26102
|
+
getAnchorRect: () => new DOMRect(rowMenu.x, rowMenu.y, 0, 0),
|
|
26103
|
+
anchor: (0, react_jsx_runtime.jsx)("span", { className: PendingPanel_module_css_default.rowMenuAnchor })
|
|
26104
|
+
}),
|
|
25468
26105
|
addOpen && current !== void 0 && (0, react_jsx_runtime.jsx)(PathPicker, {
|
|
25469
26106
|
rootPath: snapshot.workspacePath,
|
|
25470
26107
|
onBrowse: (path) => onBrowse(current, path),
|
|
@@ -25474,6 +26111,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25474
26111
|
setAddOpen(false);
|
|
25475
26112
|
},
|
|
25476
26113
|
t
|
|
26114
|
+
}),
|
|
26115
|
+
(0, react_jsx_runtime.jsx)("span", {
|
|
26116
|
+
className: PendingPanel_module_css_default.threadFontProbe,
|
|
26117
|
+
"data-diff-thread-font": true,
|
|
26118
|
+
"aria-hidden": "true"
|
|
25477
26119
|
})
|
|
25478
26120
|
]
|
|
25479
26121
|
})] }), docked && dockHost !== void 0 ? dockHost : document.body),
|
|
@@ -26151,6 +26793,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26151
26793
|
function DiffApprovalSettingsTab({ t }) {
|
|
26152
26794
|
const [pasteOnCopy, setPasteOnCopyState] = (0, react.useState)(pasteOnCopyEnabled);
|
|
26153
26795
|
const [commentMode, setCommentModeState] = (0, react.useState)(commentModeEnabled);
|
|
26796
|
+
const [discussionRounds, setDiscussionRoundsState] = (0, react.useState)(discussionRoundLimit);
|
|
26154
26797
|
const [includeUntracked, setIncludeUntrackedState] = (0, react.useState)(includeUntrackedEnabled);
|
|
26155
26798
|
const [confirmFileRemove, setConfirmFileRemoveState] = (0, react.useState)(confirmFileRemoveEnabled);
|
|
26156
26799
|
const [tab, setTabState] = (0, react.useState)(tabWidth);
|
|
@@ -26186,6 +26829,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26186
26829
|
setPanelCover(value);
|
|
26187
26830
|
};
|
|
26188
26831
|
const [summon, setSummonState] = (0, react.useState)(quickSummonKey);
|
|
26832
|
+
const [commentOpen, setCommentOpen] = (0, react.useState)(false);
|
|
26189
26833
|
const [keysOpen, setKeysOpen] = (0, react.useState)(false);
|
|
26190
26834
|
const [keybindings, setKeybindingsState] = (0, react.useState)(() => {
|
|
26191
26835
|
const initial = {};
|
|
@@ -26207,6 +26851,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26207
26851
|
setPasteOnCopyState(value);
|
|
26208
26852
|
setPasteOnCopyEnabled(value);
|
|
26209
26853
|
};
|
|
26854
|
+
const setDiscussionRounds = (value) => {
|
|
26855
|
+
setDiscussionRoundsState(value);
|
|
26856
|
+
setDiscussionRoundLimit(value);
|
|
26857
|
+
};
|
|
26210
26858
|
const setCommentMode = (value) => {
|
|
26211
26859
|
setCommentModeState(value);
|
|
26212
26860
|
setCommentModeEnabled(value);
|
|
@@ -26372,6 +27020,50 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26372
27020
|
max: 10,
|
|
26373
27021
|
dataAttribute: "data-diff-nav-lead-rows",
|
|
26374
27022
|
t
|
|
27023
|
+
})
|
|
27024
|
+
]
|
|
27025
|
+
})]
|
|
27026
|
+
}),
|
|
27027
|
+
(0, react_jsx_runtime.jsxs)("div", {
|
|
27028
|
+
className: PendingPanel_module_css_default.settingsGroup,
|
|
27029
|
+
"data-open": commentOpen || void 0,
|
|
27030
|
+
children: [(0, react_jsx_runtime.jsxs)("button", {
|
|
27031
|
+
type: "button",
|
|
27032
|
+
className: PendingPanel_module_css_default.settingsGroupHeader,
|
|
27033
|
+
onClick: () => {
|
|
27034
|
+
setCommentOpen((open) => !open);
|
|
27035
|
+
},
|
|
27036
|
+
"data-diff-comment-toggle": true,
|
|
27037
|
+
children: [(0, react_jsx_runtime.jsxs)("span", {
|
|
27038
|
+
className: PendingPanel_module_css_default.settingsGroupText,
|
|
27039
|
+
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
27040
|
+
className: PendingPanel_module_css_default.settingsGroupTitle,
|
|
27041
|
+
children: t("settings.comment")
|
|
27042
|
+
}), (0, react_jsx_runtime.jsx)("span", {
|
|
27043
|
+
className: PendingPanel_module_css_default.settingsGroupDesc,
|
|
27044
|
+
children: t("settings.commentDesc")
|
|
27045
|
+
})]
|
|
27046
|
+
}), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { className: PendingPanel_module_css_default.settingsGroupChevron })]
|
|
27047
|
+
}), commentOpen && (0, react_jsx_runtime.jsxs)("div", {
|
|
27048
|
+
className: PendingPanel_module_css_default.settingsGroupBody,
|
|
27049
|
+
children: [
|
|
27050
|
+
(0, react_jsx_runtime.jsx)(PreferenceRow, {
|
|
27051
|
+
title: t("panel.commentMode"),
|
|
27052
|
+
description: t("panel.commentModeDesc"),
|
|
27053
|
+
value: commentMode,
|
|
27054
|
+
onSelect: setCommentMode,
|
|
27055
|
+
dataAttribute: "data-diff-comment-mode-select",
|
|
27056
|
+
t
|
|
27057
|
+
}),
|
|
27058
|
+
(0, react_jsx_runtime.jsx)(StepperRow, {
|
|
27059
|
+
title: t("panel.discussionRounds"),
|
|
27060
|
+
description: t("panel.discussionRoundsDesc"),
|
|
27061
|
+
value: discussionRounds,
|
|
27062
|
+
onChange: setDiscussionRounds,
|
|
27063
|
+
min: 1,
|
|
27064
|
+
max: 10,
|
|
27065
|
+
dataAttribute: "data-diff-discussion-rounds",
|
|
27066
|
+
t
|
|
26375
27067
|
}),
|
|
26376
27068
|
(0, react_jsx_runtime.jsx)(PreferenceRow, {
|
|
26377
27069
|
title: t("panel.pasteOnCopy"),
|
|
@@ -26380,14 +27072,6 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26380
27072
|
onSelect: setPasteOnCopy,
|
|
26381
27073
|
dataAttribute: "data-diff-paste-on-copy-select",
|
|
26382
27074
|
t
|
|
26383
|
-
}),
|
|
26384
|
-
(0, react_jsx_runtime.jsx)(PreferenceRow, {
|
|
26385
|
-
title: t("panel.commentMode"),
|
|
26386
|
-
description: t("panel.commentModeDesc"),
|
|
26387
|
-
value: commentMode,
|
|
26388
|
-
onSelect: setCommentMode,
|
|
26389
|
-
dataAttribute: "data-diff-comment-mode-select",
|
|
26390
|
-
t
|
|
26391
27075
|
})
|
|
26392
27076
|
]
|
|
26393
27077
|
})]
|
|
@@ -26593,11 +27277,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26593
27277
|
path
|
|
26594
27278
|
}));
|
|
26595
27279
|
},
|
|
26596
|
-
async addPath(sessionId, path, includeUnchanged) {
|
|
27280
|
+
async addPath(sessionId, path, includeUnchanged, exact) {
|
|
26597
27281
|
return addValueOf(await rpc.call(DIFF_APPROVAL_CHANNEL, "add-path", {
|
|
26598
27282
|
sessionId,
|
|
26599
27283
|
path,
|
|
26600
|
-
includeUnchanged
|
|
27284
|
+
includeUnchanged,
|
|
27285
|
+
...exact === true ? { exact: true } : {}
|
|
26601
27286
|
}));
|
|
26602
27287
|
},
|
|
26603
27288
|
async open(sessionId, id, action) {
|
|
@@ -26749,7 +27434,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26749
27434
|
if (typeof value !== "object" || value === null || Array.isArray(value)) throw new Error("the add returned a malformed value");
|
|
26750
27435
|
const record = value;
|
|
26751
27436
|
const outcome = record.outcome;
|
|
26752
|
-
if (outcome !== "added" && outcome !== "duplicate" && outcome !== "unchanged" && outcome !== "empty" && outcome !== "missing" && outcome !== "outside" && outcome !== "no-vcs" && outcome !== "failed") throw new Error("the add returned a malformed outcome");
|
|
27437
|
+
if (outcome !== "added" && outcome !== "duplicate" && outcome !== "unchanged" && outcome !== "empty" && outcome !== "missing" && outcome !== "outside" && outcome !== "no-vcs" && outcome !== "failed" && outcome !== "not-a-file") throw new Error("the add returned a malformed outcome");
|
|
26753
27438
|
const added = record.added;
|
|
26754
27439
|
const duplicates = record.duplicates;
|
|
26755
27440
|
if (typeof added !== "number" || typeof duplicates !== "number") throw new Error("the add returned a malformed value");
|
|
@@ -26758,6 +27443,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
26758
27443
|
outcome,
|
|
26759
27444
|
added,
|
|
26760
27445
|
duplicates,
|
|
27446
|
+
id: typeof record.id === "string" ? record.id : void 0,
|
|
26761
27447
|
truncated: record.truncated === true ? true : void 0,
|
|
26762
27448
|
message: typeof message === "string" && message.length > 0 ? message : void 0
|
|
26763
27449
|
};
|
|
@@ -27048,8 +27734,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27048
27734
|
browse(sessionId, path) {
|
|
27049
27735
|
return port.browse(sessionId, path);
|
|
27050
27736
|
},
|
|
27051
|
-
async addPath(sessionId, path, includeUnchanged) {
|
|
27052
|
-
const value = await port.addPath(sessionId, path, includeUnchanged);
|
|
27737
|
+
async addPath(sessionId, path, includeUnchanged, exact) {
|
|
27738
|
+
const value = await port.addPath(sessionId, path, includeUnchanged, exact);
|
|
27053
27739
|
await this.refresh(sessionId);
|
|
27054
27740
|
return value;
|
|
27055
27741
|
},
|
|
@@ -27480,6 +28166,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27480
28166
|
"panel.readFailed": "读取待处理改动失败:{message}",
|
|
27481
28167
|
"panel.group.current": "当前会话",
|
|
27482
28168
|
"panel.group.others": "其他会话",
|
|
28169
|
+
"panel.tabs": "列表页签",
|
|
28170
|
+
"panel.tab.pending": "待审列表",
|
|
28171
|
+
"panel.tab.comments": "评论",
|
|
28172
|
+
"panel.commentsEmpty": "当前打开的文件里还没有评论",
|
|
28173
|
+
"panel.commentOutdated": "已过期",
|
|
28174
|
+
"panel.commentEmptyTitle": "(未填写)",
|
|
27483
28175
|
"panel.aria": "待处理改动",
|
|
27484
28176
|
"panel.stats": "+{added} -{removed}",
|
|
27485
28177
|
"panel.blockPosition": "第 {current}/{total} 块",
|
|
@@ -27502,8 +28194,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27502
28194
|
"panel.tabWidthDesc": "差异中制表符的缩进宽度,可选 2 / 4 / 8 个空格(默认 4),同时作用于行宽折行测量。",
|
|
27503
28195
|
"panel.splitMode": "双栏对比",
|
|
27504
28196
|
"panel.splitModeDesc": "开启后整文件差异用左「改前」|右「当前」双栏、逐行对齐的视图展示,默认关闭使用单栏(合并)视图。",
|
|
27505
|
-
"panel.navLeadRows": "
|
|
27506
|
-
"panel.navLeadRowsDesc": "
|
|
28197
|
+
"panel.navLeadRows": "跳转行距",
|
|
28198
|
+
"panel.navLeadRowsDesc": "跳转时目标上方保留的行数(默认 2):上/下跳到差异块,或从评论列表跳到某条评论。也用于从当前滚动位置定位上/下一个差异。",
|
|
27507
28199
|
"panel.diffFontSize": "代码字号",
|
|
27508
28200
|
"panel.diffFontSizeDesc": "差异代码的文字大小(按当前字号百分比缩放,默认100%,每次 ±10%)。",
|
|
27509
28201
|
"panel.diffLineHeight": "代码行高",
|
|
@@ -27519,10 +28211,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27519
28211
|
"panel.quickSummon": "快速呼出",
|
|
27520
28212
|
"panel.commentMode": "评论模式",
|
|
27521
28213
|
"panel.commentModeDesc": "选中差异行后可以直接就这几行向智能体提问,回答就显示在这几行下方。",
|
|
28214
|
+
"panel.discussionRounds": "评论里保留的对话轮数",
|
|
28215
|
+
"panel.discussionRoundsDesc": "一条评论里保留最近几轮(你问一句、Agent 答一句算一轮),更早的整轮省略。默认 2 轮,范围 1–10。",
|
|
27522
28216
|
"panel.quickSummonDesc": "用键盘快捷键打开/关闭差异面板。点击右侧按钮后按下新的按键组合即可修改。",
|
|
27523
28217
|
"panel.recordShortcut": "按下快捷键…",
|
|
27524
28218
|
"settings.keybindings": "快捷键",
|
|
27525
28219
|
"settings.keybindingsDesc": "展开后可配置各项操作的按键组合。",
|
|
28220
|
+
"settings.comment": "评论",
|
|
28221
|
+
"settings.commentDesc": "就选中的差异行向智能体提问:评论模式的开关,以及一条评论里保留多少对话。",
|
|
27526
28222
|
"settings.diffView": "差异视图",
|
|
27527
28223
|
"settings.diffViewDesc": "调整差异的显示效果(字号、行高、新增/删除颜色)与布局偏好。",
|
|
27528
28224
|
"settings.diffPreview": "预览",
|
|
@@ -27549,7 +28245,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27549
28245
|
"settings.tabLabel": "改动审批",
|
|
27550
28246
|
"row.create": "新增",
|
|
27551
28247
|
"row.failed": "失败",
|
|
27552
|
-
"row.dismiss": "
|
|
28248
|
+
"row.dismiss": "移出",
|
|
27553
28249
|
"row.added": "+{added}",
|
|
27554
28250
|
"row.removed": "-{removed}",
|
|
27555
28251
|
"action.keep": "保留",
|
|
@@ -27558,14 +28254,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27558
28254
|
"action.discussionExpand": "展开",
|
|
27559
28255
|
"action.discussionCollapse": "收起",
|
|
27560
28256
|
"discussion.placeholder": "写下你的评论…",
|
|
27561
|
-
"discussion.placeholderOutdated": "代码已过期,无法继续评论",
|
|
27562
28257
|
"discussion.marker": "[评论]",
|
|
27563
28258
|
"discussion.promptRule": "(回答只针对这几行,不超过 3 行;行与行之间不要留空行;用纯文本,不要 Markdown 装饰;要求详细时不受长度限制。细则见 dsh-diff-approval-comment skill。)",
|
|
27564
28259
|
"discussion.promptRuleSkill": "(这是一条代码批注:先加载 {skill} skill,按它的规则回答。)",
|
|
27565
28260
|
"discussion.thinking": "思考中",
|
|
27566
28261
|
"discussion.queued": "排队等待中",
|
|
27567
|
-
"discussion.
|
|
27568
|
-
"discussion.quote": "评论代码:",
|
|
28262
|
+
"discussion.outdatedQuote": "评论代码已过期:",
|
|
27569
28263
|
"discussion.hidden": "更早的 {count} 条已省略",
|
|
27570
28264
|
"discussion.failed": "这次提问失败了,可以再试一次。",
|
|
27571
28265
|
"discussion.stopped": "这次回答被停掉了,可以再问一次。",
|
|
@@ -27575,6 +28269,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27575
28269
|
"action.keepAll": "全部保留",
|
|
27576
28270
|
"action.revertAll": "全部回退",
|
|
27577
28271
|
"action.openFile": "打开文件",
|
|
28272
|
+
"action.pathField": "路径(回车打开)",
|
|
27578
28273
|
"action.revealFile": "打开所在目录",
|
|
27579
28274
|
"action.busy": "处理中…",
|
|
27580
28275
|
"action.prevDiff": "上一处差异",
|
|
@@ -27640,8 +28335,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27640
28335
|
"status.missing": "该改动已不存在",
|
|
27641
28336
|
"panel.resolvedAsk": "「{file}」的所有改动都已处理,是否从列表移除?",
|
|
27642
28337
|
"panel.keepInList": "保留在列表",
|
|
27643
|
-
"panel.fileKeptAsk": "「{file}
|
|
27644
|
-
"panel.fileRevertedAsk": "「{file}
|
|
28338
|
+
"panel.fileKeptAsk": "「{file}」的改动已全部保留,是否从列表移出?",
|
|
28339
|
+
"panel.fileRevertedAsk": "「{file}」的改动已全部回退,是否从列表移出?",
|
|
27645
28340
|
"panel.confirmFileRemove": "处理整文件后询问是否移出列表",
|
|
27646
28341
|
"panel.confirmFileRemoveDesc": "对单个文件执行整文件保留 / 回退后,弹窗询问是否把该文件移出列表。关闭后直接移出(不影响全部保留 / 全部回退)。",
|
|
27647
28342
|
"action.refreshVcs": "刷新差异",
|
|
@@ -27684,6 +28379,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27684
28379
|
"panel.readFailed": "Reading pending changes failed: {message}",
|
|
27685
28380
|
"panel.group.current": "This session",
|
|
27686
28381
|
"panel.group.others": "Other sessions",
|
|
28382
|
+
"panel.tabs": "List tabs",
|
|
28383
|
+
"panel.tab.pending": "Pending",
|
|
28384
|
+
"panel.tab.comments": "Comments",
|
|
28385
|
+
"panel.commentsEmpty": "No comments in the open files yet",
|
|
28386
|
+
"panel.commentOutdated": "Outdated",
|
|
28387
|
+
"panel.commentEmptyTitle": "(not written yet)",
|
|
27687
28388
|
"panel.aria": "Pending changes",
|
|
27688
28389
|
"panel.stats": "+{added} -{removed}",
|
|
27689
28390
|
"panel.blockPosition": "{current}/{total}",
|
|
@@ -27706,8 +28407,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27706
28407
|
"panel.tabWidthDesc": "The indent width of a tab character in the differences, as 2 / 4 / 8 spaces (default 4). Also drives the wrapped-line measurement.",
|
|
27707
28408
|
"panel.splitMode": "Side-by-side view",
|
|
27708
28409
|
"panel.splitModeDesc": "When on, the whole-file differences render as a side-by-side (left \"before\" | right \"current\") line-aligned view. Off (default) uses the single-column unified view.",
|
|
27709
|
-
"panel.navLeadRows": "
|
|
27710
|
-
"panel.navLeadRowsDesc": "Rows left above the
|
|
28410
|
+
"panel.navLeadRows": "Jump lead rows",
|
|
28411
|
+
"panel.navLeadRowsDesc": "Rows left above the target when jumping — up/down to a diff block, or from the comments list to a comment (default 2). Also used to locate the previous/next diff from the current scroll position.",
|
|
27711
28412
|
"panel.diffFontSize": "Code font size",
|
|
27712
28413
|
"panel.diffFontSizeDesc": "The diff code text size as a percentage of the current size (default 100%, ±10% per step).",
|
|
27713
28414
|
"panel.diffLineHeight": "Code line height",
|
|
@@ -27723,10 +28424,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27723
28424
|
"panel.quickSummon": "Quick summon",
|
|
27724
28425
|
"panel.commentMode": "Comment mode",
|
|
27725
28426
|
"panel.commentModeDesc": "Ask the agent about the rows you select in the diff; the answer appears in a thread right below them.",
|
|
28427
|
+
"panel.discussionRounds": "Rounds kept in a comment",
|
|
28428
|
+
"panel.discussionRoundsDesc": "How many rounds a comment keeps (one question and the answer to it); older rounds are left out. Default 2, range 1-10.",
|
|
27726
28429
|
"panel.quickSummonDesc": "Open or close the diff panel with a keyboard shortcut. Click the button and press a new chord to change it.",
|
|
27727
28430
|
"panel.recordShortcut": "Press keys…",
|
|
27728
28431
|
"settings.keybindings": "Shortcuts",
|
|
27729
28432
|
"settings.keybindingsDesc": "Expand to configure the key combo for each action.",
|
|
28433
|
+
"settings.comment": "Comments",
|
|
28434
|
+
"settings.commentDesc": "Ask the agent about the diff rows you select: the comment-mode switch, and how much of a thread a comment keeps.",
|
|
27730
28435
|
"settings.diffView": "Diff view",
|
|
27731
28436
|
"settings.diffViewDesc": "Adjust the diff appearance (font size, line height, add/delete colors) and layout preferences.",
|
|
27732
28437
|
"settings.diffPreview": "Preview",
|
|
@@ -27762,14 +28467,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27762
28467
|
"action.discussionExpand": "Expand",
|
|
27763
28468
|
"action.discussionCollapse": "Collapse",
|
|
27764
28469
|
"discussion.placeholder": "Write your comment…",
|
|
27765
|
-
"discussion.placeholderOutdated": "This code is outdated; commenting is off",
|
|
27766
28470
|
"discussion.marker": "[Review]",
|
|
27767
28471
|
"discussion.promptRule": "(Answer only about these lines, in at most 3 lines, with no blank line between them, as plain text without Markdown decoration; ignore the length limit if my annotation asks for detail. Full rules: the dsh-diff-approval-comment skill.)",
|
|
27768
28472
|
"discussion.promptRuleSkill": "(This is a comment on a few diff lines: load the {skill} skill first and answer by its rules.)",
|
|
27769
28473
|
"discussion.thinking": "Thinking",
|
|
27770
28474
|
"discussion.queued": "Queued",
|
|
27771
|
-
"discussion.
|
|
27772
|
-
"discussion.quote": "Commented code:",
|
|
28475
|
+
"discussion.outdatedQuote": "Commented code is outdated:",
|
|
27773
28476
|
"discussion.hidden": "{count} earlier turns omitted",
|
|
27774
28477
|
"discussion.failed": "That question failed; you can try again.",
|
|
27775
28478
|
"discussion.stopped": "That answer was stopped; you can ask again.",
|
|
@@ -27779,6 +28482,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
27779
28482
|
"action.keepAll": "Keep all",
|
|
27780
28483
|
"action.revertAll": "Revert all",
|
|
27781
28484
|
"action.openFile": "Open file",
|
|
28485
|
+
"action.pathField": "Path (Enter to open)",
|
|
27782
28486
|
"action.revealFile": "Reveal in folder",
|
|
27783
28487
|
"action.busy": "Working…",
|
|
27784
28488
|
"action.prevDiff": "Previous diff",
|
|
@@ -28050,7 +28754,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
28050
28754
|
onImportVcs: (sessionId, includeUntracked) => store.importVcs(sessionId, includeUntracked),
|
|
28051
28755
|
onRefreshVcs: (sessionId, id, includeUntracked) => store.refreshVcs(sessionId, id, includeUntracked),
|
|
28052
28756
|
onBrowse: (sessionId, path) => store.browse(sessionId, path),
|
|
28053
|
-
onAddPath: (sessionId, path, includeUnchanged) => store.addPath(sessionId, path, includeUnchanged),
|
|
28757
|
+
onAddPath: (sessionId, path, includeUnchanged, exact) => store.addPath(sessionId, path, includeUnchanged, exact),
|
|
28054
28758
|
onKeepAll: (sessionId) => store.keepAll(sessionId),
|
|
28055
28759
|
onRevertAll: (sessionId) => store.revertAll(sessionId),
|
|
28056
28760
|
onAckRedoCleared: () => store.clearRedoCleared(),
|