dsh-diff-approval 0.21.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js
CHANGED
|
@@ -16,12 +16,12 @@ window.__ModuleLoader__.load({
|
|
|
16
16
|
return target;
|
|
17
17
|
};
|
|
18
18
|
//#endregion
|
|
19
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
20
19
|
let react = require("react");
|
|
20
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
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_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);border-radius:12px;flex-direction:column;display:flex;position:fixed;inset:8px 8px 128px;overflow:hidden}.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{flex:1;min-width:0;min-height:0;display:flex;position:relative}.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-shadow-lv2);border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute}.F1KBNa_fileListKnob:hover{background: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:var(--dsw-shadow-lv2);transform-origin:0 0;border-radius:12px;flex-direction:column;padding:6px 8px 10px;animation:.14s ease-out F1KBNa_fileListGrow;display:flex;position:absolute;overflow:hidden}@keyframes F1KBNa_fileListGrow{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){.F1KBNa_fileListFloat{animation:none}}.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 2px 12px 8px;display:flex}.F1KBNa_listScroll{scrollbar-gutter:stable;flex:1;min-height:0;overflow-y:auto}.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;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;background:0 0;width:8px;position:absolute;top:0;bottom:0;right:0}.F1KBNa_floatResizeHandle:hover{background: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:5;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{scrollbar-gutter:stable;border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex:auto;min-height:0;padding:4px 2px 4px 4px;overflow:auto}.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:4px;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:baseline;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;font:var(--dsw-font-markdown-code-block);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_diffPath{white-space:nowrap;min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block);-webkit-user-select:text;user-select:text;flex:1;font-size:12px;line-height:18px;overflow:auto hidden}.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_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{flex:1;min-height:0;display:flex;position:relative}.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_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}@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{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.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);border-radius:12px;flex-direction:column;display:flex;position:fixed;inset:8px 8px 128px;overflow:hidden}.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{flex:1;min-width:0;min-height:0;display:flex;position:relative}.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);opacity:.45;width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;box-shadow:var(--dsw-shadow-lv2);border-radius:8px;justify-content:center;align-items:center;padding:0;transition:opacity .12s;display:inline-flex;position:absolute}.F1KBNa_fileListKnob:hover,.F1KBNa_fileListKnob:focus-visible{opacity:1;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:var(--dsw-shadow-lv2);transform-origin:0 0;border-radius:12px;flex-direction:column;padding:6px 2px 10px 8px;animation:.14s ease-out F1KBNa_fileListGrow;display:flex;position:absolute;overflow:hidden}@keyframes F1KBNa_fileListGrow{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){.F1KBNa_fileListFloat{animation:none}}.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 2px 12px 8px;display:flex}.F1KBNa_listScroll{scrollbar-gutter:stable;flex:1;min-height:0;overflow-y:auto}.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:5;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{scrollbar-gutter:stable;border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex:auto;min-height:0;padding:4px 2px 4px 4px;overflow:auto}.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:4px;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:baseline;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;font:var(--dsw-font-markdown-code-block);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_diffPath{white-space:nowrap;scrollbar-width:none;min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block);-webkit-user-select:text;user-select:text;flex:1;font-size:12px;line-height:18px;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_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{flex:1;min-height:0;display:flex;position:relative}.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_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}@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{flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.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)}";
|
|
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,201 +31,204 @@ window.__ModuleLoader__.load({
|
|
|
31
31
|
document.head.appendChild(tag);
|
|
32
32
|
}
|
|
33
33
|
var PendingPanel_module_css_default = {
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
34
|
+
"searchToggle": "F1KBNa_searchToggle",
|
|
35
|
+
"diffPreviewScroll": "F1KBNa_diffPreviewScroll",
|
|
36
|
+
"diffPath": "F1KBNa_diffPath",
|
|
37
|
+
"settingsRow": "F1KBNa_settingsRow",
|
|
37
38
|
"panel": "F1KBNa_panel",
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
39
|
+
"kindTag": "F1KBNa_kindTag",
|
|
40
|
+
"colorPickerPreview": "F1KBNa_colorPickerPreview",
|
|
41
|
+
"toggle": "F1KBNa_toggle",
|
|
42
|
+
"headerEntry": "F1KBNa_headerEntry",
|
|
41
43
|
"fileList": "F1KBNa_fileList",
|
|
42
|
-
"colorSwatch": "F1KBNa_colorSwatch",
|
|
43
|
-
"colorPicker": "F1KBNa_colorPicker",
|
|
44
44
|
"confirmActions": "F1KBNa_confirmActions",
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"rowFailed": "F1KBNa_rowFailed",
|
|
50
|
-
"searchCount": "F1KBNa_searchCount",
|
|
51
|
-
"searchMatch": "F1KBNa_searchMatch",
|
|
52
|
-
"diffPath": "F1KBNa_diffPath",
|
|
53
|
-
"blockFlashShake": "F1KBNa_blockFlashShake",
|
|
54
|
-
"coverNoticeFade": "F1KBNa_coverNoticeFade",
|
|
55
|
-
"langSelect": "F1KBNa_langSelect",
|
|
56
|
-
"pickerIcon": "F1KBNa_pickerIcon",
|
|
57
|
-
"noticeText": "F1KBNa_noticeText",
|
|
58
|
-
"mirrored": "F1KBNa_mirrored",
|
|
59
|
-
"row": "F1KBNa_row",
|
|
60
|
-
"treeName": "F1KBNa_treeName",
|
|
45
|
+
"importButton": "F1KBNa_importButton",
|
|
46
|
+
"missing": "F1KBNa_missing",
|
|
47
|
+
"diffHeader": "F1KBNa_diffHeader",
|
|
48
|
+
"diffStats": "F1KBNa_diffStats",
|
|
61
49
|
"actionPrimary": "F1KBNa_actionPrimary",
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"colorPickerPanel": "F1KBNa_colorPickerPanel",
|
|
68
|
-
"colorHue": "F1KBNa_colorHue",
|
|
69
|
-
"mdPreviewContent": "F1KBNa_mdPreviewContent",
|
|
70
|
-
"resizeHandle": "F1KBNa_resizeHandle",
|
|
71
|
-
"settingsRow": "F1KBNa_settingsRow",
|
|
72
|
-
"pickerInput": "F1KBNa_pickerInput",
|
|
73
|
-
"del": "F1KBNa_del",
|
|
74
|
-
"splitCol": "F1KBNa_splitCol",
|
|
75
|
-
"splitHScrollRow": "F1KBNa_splitHScrollRow",
|
|
76
|
-
"pickerCard": "F1KBNa_pickerCard",
|
|
77
|
-
"readError": "F1KBNa_readError",
|
|
78
|
-
"splitRdel": "F1KBNa_splitRdel",
|
|
79
|
-
"title": "F1KBNa_title",
|
|
80
|
-
"splitHScrollFill": "F1KBNa_splitHScrollFill",
|
|
81
|
-
"group": "F1KBNa_group",
|
|
82
|
-
"coverBackdrop": "F1KBNa_coverBackdrop",
|
|
83
|
-
"colorHueCursor": "F1KBNa_colorHueCursor",
|
|
84
|
-
"stepperValue": "F1KBNa_stepperValue",
|
|
85
|
-
"diffBodySplit": "F1KBNa_diffBodySplit",
|
|
86
|
-
"tree": "F1KBNa_tree",
|
|
87
|
-
"splitLadd": "F1KBNa_splitLadd",
|
|
88
|
-
"noteCentered": "F1KBNa_noteCentered",
|
|
89
|
-
"header": "F1KBNa_header",
|
|
90
|
-
"close": "F1KBNa_close",
|
|
91
|
-
"pickerNote": "F1KBNa_pickerNote",
|
|
92
|
-
"coverCard": "F1KBNa_coverCard",
|
|
93
|
-
"add": "F1KBNa_add",
|
|
50
|
+
"diffBody": "F1KBNa_diffBody",
|
|
51
|
+
"searchBar": "F1KBNa_searchBar",
|
|
52
|
+
"diffFlashFade": "F1KBNa_diffFlashFade",
|
|
53
|
+
"actionError": "F1KBNa_actionError",
|
|
54
|
+
"floatResizeHandle": "F1KBNa_floatResizeHandle",
|
|
94
55
|
"detail": "F1KBNa_detail",
|
|
95
|
-
"
|
|
56
|
+
"action": "F1KBNa_action",
|
|
57
|
+
"pickerCard": "F1KBNa_pickerCard",
|
|
58
|
+
"lines": "F1KBNa_lines",
|
|
59
|
+
"coverButton": "F1KBNa_coverButton",
|
|
60
|
+
"settingsGroupChevron": "F1KBNa_settingsGroupChevron",
|
|
61
|
+
"panelDocked": "F1KBNa_panelDocked",
|
|
62
|
+
"fileListKnob": "F1KBNa_fileListKnob",
|
|
63
|
+
"pickerInput": "F1KBNa_pickerInput",
|
|
64
|
+
"mirrored": "F1KBNa_mirrored",
|
|
65
|
+
"note": "F1KBNa_note",
|
|
96
66
|
"coverNoticeCard": "F1KBNa_coverNoticeCard",
|
|
97
|
-
"
|
|
67
|
+
"rowPath": "F1KBNa_rowPath",
|
|
68
|
+
"searchMatch": "F1KBNa_searchMatch",
|
|
98
69
|
"chipLabel": "F1KBNa_chipLabel",
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
70
|
+
"settingsGroupText": "F1KBNa_settingsGroupText",
|
|
71
|
+
"chip": "F1KBNa_chip",
|
|
72
|
+
"stepper": "F1KBNa_stepper",
|
|
73
|
+
"flexSpacer": "F1KBNa_flexSpacer",
|
|
74
|
+
"badgeLabel": "F1KBNa_badgeLabel",
|
|
75
|
+
"missingHint": "F1KBNa_missingHint",
|
|
76
|
+
"add": "F1KBNa_add",
|
|
77
|
+
"addCount": "F1KBNa_addCount",
|
|
78
|
+
"coverNoticeFade": "F1KBNa_coverNoticeFade",
|
|
79
|
+
"coverBackdrop": "F1KBNa_coverBackdrop",
|
|
80
|
+
"vSpacer": "F1KBNa_vSpacer",
|
|
81
|
+
"confirmCard": "F1KBNa_confirmCard",
|
|
82
|
+
"tree": "F1KBNa_tree",
|
|
83
|
+
"coverNoticeText": "F1KBNa_coverNoticeText",
|
|
84
|
+
"footerButtons": "F1KBNa_footerButtons",
|
|
85
|
+
"colorPickerPanel": "F1KBNa_colorPickerPanel",
|
|
86
|
+
"badge": "F1KBNa_badge",
|
|
87
|
+
"chipPresentation": "F1KBNa_chipPresentation",
|
|
88
|
+
"dockHost": "F1KBNa_dockHost",
|
|
89
|
+
"splitRdel": "F1KBNa_splitRdel",
|
|
90
|
+
"panelFailureRetry": "F1KBNa_panelFailureRetry",
|
|
91
|
+
"searchCount": "F1KBNa_searchCount",
|
|
92
|
+
"notice": "F1KBNa_notice",
|
|
93
|
+
"fileListGrow": "F1KBNa_fileListGrow",
|
|
103
94
|
"treeNote": "F1KBNa_treeNote",
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
"iconAction": "F1KBNa_iconAction",
|
|
95
|
+
"colorSwatch": "F1KBNa_colorSwatch",
|
|
96
|
+
"settingsSelector": "F1KBNa_settingsSelector",
|
|
107
97
|
"hint": "F1KBNa_hint",
|
|
108
|
-
"diffHeader": "F1KBNa_diffHeader",
|
|
109
98
|
"blockFlash": "F1KBNa_blockFlash",
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
"
|
|
99
|
+
"coverHost": "F1KBNa_coverHost",
|
|
100
|
+
"diffPreview": "F1KBNa_diffPreview",
|
|
101
|
+
"pickerForm": "F1KBNa_pickerForm",
|
|
102
|
+
"subline": "F1KBNa_subline",
|
|
103
|
+
"coverNoticeGlyph": "F1KBNa_coverNoticeGlyph",
|
|
104
|
+
"intraAdd": "F1KBNa_intraAdd",
|
|
105
|
+
"pickerClose": "F1KBNa_pickerClose",
|
|
106
|
+
"settingsGroupDesc": "F1KBNa_settingsGroupDesc",
|
|
107
|
+
"layer": "F1KBNa_layer",
|
|
108
|
+
"settingsGroupTitle": "F1KBNa_settingsGroupTitle",
|
|
109
|
+
"settingsRowText": "F1KBNa_settingsRowText",
|
|
110
|
+
"context": "F1KBNa_context",
|
|
111
|
+
"colorSvCursor": "F1KBNa_colorSvCursor",
|
|
112
|
+
"diffBodyWrap": "F1KBNa_diffBodyWrap",
|
|
113
|
+
"kindHint": "F1KBNa_kindHint",
|
|
114
|
+
"panelFailure": "F1KBNa_panelFailure",
|
|
115
|
+
"settingsGroup": "F1KBNa_settingsGroup",
|
|
116
|
+
"coverPopover": "F1KBNa_coverPopover",
|
|
117
|
+
"treeRow": "F1KBNa_treeRow",
|
|
118
|
+
"settingsRowTitle": "F1KBNa_settingsRowTitle",
|
|
119
|
+
"readError": "F1KBNa_readError",
|
|
120
|
+
"settingsRowDesc": "F1KBNa_settingsRowDesc",
|
|
121
|
+
"colorPickerInput": "F1KBNa_colorPickerInput",
|
|
115
122
|
"searchToggleOn": "F1KBNa_searchToggleOn",
|
|
123
|
+
"colorValue": "F1KBNa_colorValue",
|
|
124
|
+
"delCount": "F1KBNa_delCount",
|
|
125
|
+
"stepperButton": "F1KBNa_stepperButton",
|
|
126
|
+
"markerDel": "F1KBNa_markerDel",
|
|
116
127
|
"statusAction": "F1KBNa_statusAction",
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
120
|
-
"importButton": "F1KBNa_importButton",
|
|
121
|
-
"searchToggle": "F1KBNa_searchToggle",
|
|
128
|
+
"diff": "F1KBNa_diff",
|
|
129
|
+
"stepperValue": "F1KBNa_stepperValue",
|
|
130
|
+
"del": "F1KBNa_del",
|
|
122
131
|
"pickerName": "F1KBNa_pickerName",
|
|
123
|
-
"
|
|
124
|
-
"diffBodyWrap": "F1KBNa_diffBodyWrap",
|
|
125
|
-
"settingsGroup": "F1KBNa_settingsGroup",
|
|
126
|
-
"settingsGroupText": "F1KBNa_settingsGroupText",
|
|
127
|
-
"layer": "F1KBNa_layer",
|
|
128
|
-
"lines": "F1KBNa_lines",
|
|
129
|
-
"line": "F1KBNa_line",
|
|
130
|
-
"stepper": "F1KBNa_stepper",
|
|
131
|
-
"presentationSelect": "F1KBNa_presentationSelect",
|
|
132
|
-
"settingsGroupChevron": "F1KBNa_settingsGroupChevron",
|
|
133
|
-
"colorPickerPreview": "F1KBNa_colorPickerPreview",
|
|
134
|
-
"listScroll": "F1KBNa_listScroll",
|
|
135
|
-
"groupHead": "F1KBNa_groupHead",
|
|
136
|
-
"divergedHint": "F1KBNa_divergedHint",
|
|
132
|
+
"colorPicker": "F1KBNa_colorPicker",
|
|
137
133
|
"rowMeta": "F1KBNa_rowMeta",
|
|
138
|
-
"
|
|
139
|
-
"
|
|
134
|
+
"close": "F1KBNa_close",
|
|
135
|
+
"mdPreviewContent": "F1KBNa_mdPreviewContent",
|
|
136
|
+
"groupHead": "F1KBNa_groupHead",
|
|
137
|
+
"colorHueCursor": "F1KBNa_colorHueCursor",
|
|
138
|
+
"group": "F1KBNa_group",
|
|
139
|
+
"statusBar": "F1KBNa_statusBar",
|
|
140
|
+
"presentationHost": "F1KBNa_presentationHost",
|
|
141
|
+
"emptyActions": "F1KBNa_emptyActions",
|
|
142
|
+
"noticeButton": "F1KBNa_noticeButton",
|
|
143
|
+
"splitCol": "F1KBNa_splitCol",
|
|
144
|
+
"noteCentered": "F1KBNa_noteCentered",
|
|
145
|
+
"toggleThumb": "F1KBNa_toggleThumb",
|
|
146
|
+
"header": "F1KBNa_header",
|
|
147
|
+
"colorPickerChevron": "F1KBNa_colorPickerChevron",
|
|
148
|
+
"resizeHandle": "F1KBNa_resizeHandle",
|
|
149
|
+
"rail": "F1KBNa_rail",
|
|
140
150
|
"stepperButtonUp": "F1KBNa_stepperButtonUp",
|
|
141
|
-
"
|
|
142
|
-
"
|
|
143
|
-
"
|
|
144
|
-
"
|
|
151
|
+
"settingsReset": "F1KBNa_settingsReset",
|
|
152
|
+
"addButton": "F1KBNa_addButton",
|
|
153
|
+
"diffFlashShake": "F1KBNa_diffFlashShake",
|
|
154
|
+
"code": "F1KBNa_code",
|
|
155
|
+
"splitRoot": "F1KBNa_splitRoot",
|
|
156
|
+
"fileListFloat": "F1KBNa_fileListFloat",
|
|
157
|
+
"settingsGroupBody": "F1KBNa_settingsGroupBody",
|
|
158
|
+
"detailEmpty": "F1KBNa_detailEmpty",
|
|
145
159
|
"splitLdel": "F1KBNa_splitLdel",
|
|
146
160
|
"colorBackdrop": "F1KBNa_colorBackdrop",
|
|
147
|
-
"blockActions": "F1KBNa_blockActions",
|
|
148
|
-
"intraAdd": "F1KBNa_intraAdd",
|
|
149
|
-
"diffBody": "F1KBNa_diffBody",
|
|
150
|
-
"flexSpacer": "F1KBNa_flexSpacer",
|
|
151
|
-
"confirmText": "F1KBNa_confirmText",
|
|
152
|
-
"missing": "F1KBNa_missing",
|
|
153
|
-
"panelDocked": "F1KBNa_panelDocked",
|
|
154
|
-
"toggle": "F1KBNa_toggle",
|
|
155
|
-
"kindHint": "F1KBNa_kindHint",
|
|
156
|
-
"colorPickerChevron": "F1KBNa_colorPickerChevron",
|
|
157
|
-
"diff": "F1KBNa_diff",
|
|
158
|
-
"coverNoticeText": "F1KBNa_coverNoticeText",
|
|
159
|
-
"importNote": "F1KBNa_importNote",
|
|
160
|
-
"missingHint": "F1KBNa_missingHint",
|
|
161
|
-
"mdPreviewBody": "F1KBNa_mdPreviewBody",
|
|
162
|
-
"coverHost": "F1KBNa_coverHost",
|
|
163
|
-
"footerButtons": "F1KBNa_footerButtons",
|
|
164
|
-
"headerEntryCount": "F1KBNa_headerEntryCount",
|
|
165
161
|
"mdPreviewWrap": "F1KBNa_mdPreviewWrap",
|
|
166
|
-
"
|
|
162
|
+
"blockPosition": "F1KBNa_blockPosition",
|
|
163
|
+
"title": "F1KBNa_title",
|
|
164
|
+
"coverCard": "F1KBNa_coverCard",
|
|
165
|
+
"settingsGroupHeader": "F1KBNa_settingsGroupHeader",
|
|
166
|
+
"mdPreviewBody": "F1KBNa_mdPreviewBody",
|
|
167
|
+
"emptyState": "F1KBNa_emptyState",
|
|
168
|
+
"divider": "F1KBNa_divider",
|
|
169
|
+
"line": "F1KBNa_line",
|
|
170
|
+
"presentationSelect": "F1KBNa_presentationSelect",
|
|
171
|
+
"langSelect": "F1KBNa_langSelect",
|
|
167
172
|
"splitCols": "F1KBNa_splitCols",
|
|
168
|
-
"
|
|
169
|
-
"
|
|
170
|
-
"
|
|
171
|
-
"split": "F1KBNa_split",
|
|
172
|
-
"emptyActions": "F1KBNa_emptyActions",
|
|
173
|
-
"settingsGroupTitle": "F1KBNa_settingsGroupTitle",
|
|
174
|
-
"searchMatchCurrent": "F1KBNa_searchMatchCurrent",
|
|
175
|
-
"headerEntry": "F1KBNa_headerEntry",
|
|
176
|
-
"colorPickerInput": "F1KBNa_colorPickerInput",
|
|
177
|
-
"colorSvCursor": "F1KBNa_colorSvCursor",
|
|
178
|
-
"treeRow": "F1KBNa_treeRow",
|
|
173
|
+
"coverNotice": "F1KBNa_coverNotice",
|
|
174
|
+
"settingsPage": "F1KBNa_settingsPage",
|
|
175
|
+
"treeName": "F1KBNa_treeName",
|
|
179
176
|
"mdPreviewDouble": "F1KBNa_mdPreviewDouble",
|
|
180
|
-
"pickerTitle": "F1KBNa_pickerTitle",
|
|
181
|
-
"overviewRuler": "F1KBNa_overviewRuler",
|
|
182
|
-
"toggleOn": "F1KBNa_toggleOn",
|
|
183
|
-
"mdPreviewFallback": "F1KBNa_mdPreviewFallback",
|
|
184
|
-
"detailEmpty": "F1KBNa_detailEmpty",
|
|
185
|
-
"gutter": "F1KBNa_gutter",
|
|
186
|
-
"wrapActive": "F1KBNa_wrapActive",
|
|
187
|
-
"diffStats": "F1KBNa_diffStats",
|
|
188
|
-
"pickerCheck": "F1KBNa_pickerCheck",
|
|
189
|
-
"badgeCount": "F1KBNa_badgeCount",
|
|
190
|
-
"diffPreviewScroll": "F1KBNa_diffPreviewScroll",
|
|
191
|
-
"noticeButton": "F1KBNa_noticeButton",
|
|
192
|
-
"intraDel": "F1KBNa_intraDel",
|
|
193
177
|
"rows": "F1KBNa_rows",
|
|
194
|
-
"
|
|
195
|
-
"
|
|
196
|
-
"
|
|
197
|
-
"
|
|
198
|
-
"
|
|
199
|
-
"searchBar": "F1KBNa_searchBar",
|
|
200
|
-
"settingsGroupBody": "F1KBNa_settingsGroupBody",
|
|
201
|
-
"stepperButton": "F1KBNa_stepperButton",
|
|
202
|
-
"coverNoticeGlyph": "F1KBNa_coverNoticeGlyph",
|
|
203
|
-
"context": "F1KBNa_context",
|
|
204
|
-
"splitRoot": "F1KBNa_splitRoot",
|
|
205
|
-
"headerActions": "F1KBNa_headerActions",
|
|
206
|
-
"diffFlashShake": "F1KBNa_diffFlashShake",
|
|
207
|
-
"mdPreviewSingle": "F1KBNa_mdPreviewSingle",
|
|
178
|
+
"row": "F1KBNa_row",
|
|
179
|
+
"rowHead": "F1KBNa_rowHead",
|
|
180
|
+
"colorPickerTrigger": "F1KBNa_colorPickerTrigger",
|
|
181
|
+
"searchInput": "F1KBNa_searchInput",
|
|
182
|
+
"blockFlashShake": "F1KBNa_blockFlashShake",
|
|
208
183
|
"overviewMarker": "F1KBNa_overviewMarker",
|
|
184
|
+
"treeCaret": "F1KBNa_treeCaret",
|
|
185
|
+
"confirmBackdrop": "F1KBNa_confirmBackdrop",
|
|
186
|
+
"gutter": "F1KBNa_gutter",
|
|
187
|
+
"splitLadd": "F1KBNa_splitLadd",
|
|
188
|
+
"diffBodySplit": "F1KBNa_diffBodySplit",
|
|
209
189
|
"splitRadd": "F1KBNa_splitRadd",
|
|
210
|
-
"
|
|
211
|
-
"
|
|
212
|
-
"settingsReset": "F1KBNa_settingsReset",
|
|
213
|
-
"fileListGrow": "F1KBNa_fileListGrow",
|
|
190
|
+
"headerActions": "F1KBNa_headerActions",
|
|
191
|
+
"colorHue": "F1KBNa_colorHue",
|
|
214
192
|
"diffActions": "F1KBNa_diffActions",
|
|
215
|
-
"
|
|
216
|
-
"
|
|
217
|
-
"
|
|
218
|
-
"
|
|
219
|
-
"
|
|
193
|
+
"confirmText": "F1KBNa_confirmText",
|
|
194
|
+
"blockActions": "F1KBNa_blockActions",
|
|
195
|
+
"divergedHint": "F1KBNa_divergedHint",
|
|
196
|
+
"rowFailed": "F1KBNa_rowFailed",
|
|
197
|
+
"pickerIcon": "F1KBNa_pickerIcon",
|
|
198
|
+
"listScroll": "F1KBNa_listScroll",
|
|
199
|
+
"pickerNote": "F1KBNa_pickerNote",
|
|
200
|
+
"expand": "F1KBNa_expand",
|
|
201
|
+
"iconAction": "F1KBNa_iconAction",
|
|
202
|
+
"headerEntryCount": "F1KBNa_headerEntryCount",
|
|
203
|
+
"toggleOn": "F1KBNa_toggleOn",
|
|
204
|
+
"searchMatchCurrent": "F1KBNa_searchMatchCurrent",
|
|
205
|
+
"diffPreviewTitle": "F1KBNa_diffPreviewTitle",
|
|
206
|
+
"mdPreviewFallback": "F1KBNa_mdPreviewFallback",
|
|
220
207
|
"colorSv": "F1KBNa_colorSv",
|
|
221
|
-
"
|
|
222
|
-
"
|
|
208
|
+
"pickerTitle": "F1KBNa_pickerTitle",
|
|
209
|
+
"overviewRuler": "F1KBNa_overviewRuler",
|
|
210
|
+
"langLabel": "F1KBNa_langLabel",
|
|
211
|
+
"actionQuietDisabled": "F1KBNa_actionQuietDisabled",
|
|
212
|
+
"markerAdd": "F1KBNa_markerAdd",
|
|
213
|
+
"noticeText": "F1KBNa_noticeText",
|
|
214
|
+
"wrap": "F1KBNa_wrap",
|
|
215
|
+
"wrapActive": "F1KBNa_wrapActive",
|
|
216
|
+
"splitHScrollRow": "F1KBNa_splitHScrollRow",
|
|
217
|
+
"splitHScrollFill": "F1KBNa_splitHScrollFill",
|
|
223
218
|
"states": "F1KBNa_states",
|
|
224
|
-
"
|
|
225
|
-
"
|
|
226
|
-
"
|
|
227
|
-
"
|
|
228
|
-
"
|
|
219
|
+
"panelFailureText": "F1KBNa_panelFailureText",
|
|
220
|
+
"intraDel": "F1KBNa_intraDel",
|
|
221
|
+
"split": "F1KBNa_split",
|
|
222
|
+
"colorPickerInputRow": "F1KBNa_colorPickerInputRow",
|
|
223
|
+
"bulkActions": "F1KBNa_bulkActions",
|
|
224
|
+
"badgeCount": "F1KBNa_badgeCount",
|
|
225
|
+
"splitDivider": "F1KBNa_splitDivider",
|
|
226
|
+
"splitHScroll": "F1KBNa_splitHScroll",
|
|
227
|
+
"pickerCheck": "F1KBNa_pickerCheck",
|
|
228
|
+
"importNote": "F1KBNa_importNote",
|
|
229
|
+
"mdPreviewSingle": "F1KBNa_mdPreviewSingle",
|
|
230
|
+
"colorPickerPopover": "F1KBNa_colorPickerPopover",
|
|
231
|
+
"expandExpanded": "F1KBNa_expandExpanded"
|
|
229
232
|
};
|
|
230
233
|
//#endregion
|
|
231
234
|
//#region lib/types/client/PathPicker.js
|
|
@@ -18543,6 +18546,55 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
18543
18546
|
};
|
|
18544
18547
|
}
|
|
18545
18548
|
//#endregion
|
|
18549
|
+
//#region lib/types/client/boundary.js
|
|
18550
|
+
/**
|
|
18551
|
+
* A crash inside the panel must not take the review away for the rest of the page.
|
|
18552
|
+
*
|
|
18553
|
+
* The slot renderer wraps every seat in its own boundary, but a crash there
|
|
18554
|
+
* *abdicates* the entry: the footer row, the header button and the docked tab
|
|
18555
|
+
* disappear for the life of the page, with nothing on screen to say why and no way
|
|
18556
|
+
* back but a reload. This boundary keeps a failure inside our own tree instead —
|
|
18557
|
+
* the entry stays registered, it says what happened, and one press retries the
|
|
18558
|
+
* render — so a broken panel can never present as "the panel is gone" or as a
|
|
18559
|
+
* blank surface with no explanation.
|
|
18560
|
+
*
|
|
18561
|
+
* @module dsh-diff-approval/client/boundary
|
|
18562
|
+
*/
|
|
18563
|
+
/**
|
|
18564
|
+
* Keep one panel mount's crash inside its own slot entry, with a visible note and
|
|
18565
|
+
* a retry that re-renders it.
|
|
18566
|
+
*/
|
|
18567
|
+
var PanelBoundary = class extends react.Component {
|
|
18568
|
+
state = { failed: false };
|
|
18569
|
+
static getDerivedStateFromError() {
|
|
18570
|
+
return { failed: true };
|
|
18571
|
+
}
|
|
18572
|
+
componentDidCatch(error, info) {
|
|
18573
|
+
console.error("diff-approval panel crashed:", error, info.componentStack);
|
|
18574
|
+
}
|
|
18575
|
+
render() {
|
|
18576
|
+
if (!this.state.failed) return this.props.children;
|
|
18577
|
+
const { t } = this.props;
|
|
18578
|
+
return (0, react_jsx_runtime.jsxs)("div", {
|
|
18579
|
+
className: PendingPanel_module_css_default.panelFailure,
|
|
18580
|
+
role: "alert",
|
|
18581
|
+
"data-diff-approval-failed": true,
|
|
18582
|
+
children: [(0, react_jsx_runtime.jsx)("span", {
|
|
18583
|
+
className: PendingPanel_module_css_default.panelFailureText,
|
|
18584
|
+
children: t("panel.crashed")
|
|
18585
|
+
}), (0, react_jsx_runtime.jsx)("button", {
|
|
18586
|
+
type: "button",
|
|
18587
|
+
className: PendingPanel_module_css_default.panelFailureRetry,
|
|
18588
|
+
"data-diff-approval-failed-retry": true,
|
|
18589
|
+
onClick: () => {
|
|
18590
|
+
this.setState({ failed: false });
|
|
18591
|
+
},
|
|
18592
|
+
children: t("action.retry")
|
|
18593
|
+
})]
|
|
18594
|
+
});
|
|
18595
|
+
}
|
|
18596
|
+
};
|
|
18597
|
+
//#endregion
|
|
18546
18598
|
//#region lib/types/client/dock.js
|
|
18547
18599
|
/**
|
|
18548
18600
|
* The app's right sidebar (the docking surface) as a host for the review panel.
|
|
@@ -18575,6 +18627,12 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
18575
18627
|
/** The floating panel's own visibility, published on every change so a second
|
|
18576
18628
|
* entry can light up while the panel is open (`detail.open`). */
|
|
18577
18629
|
const PANEL_STATE_EVENT = "diff-approval:panel-state";
|
|
18630
|
+
/** Name a file for the panel to show, from a mount that is not the panel itself
|
|
18631
|
+
* (the produced-file chip): every mounted panel instance switches to it and lands
|
|
18632
|
+
* on its first change — the ask is "show me this diff", not "put me back where I
|
|
18633
|
+
* was". The file is also recorded as the last one, so an instance that only
|
|
18634
|
+
* appears afterwards (the docked tab) opens the same file the same way. */
|
|
18635
|
+
const OPEN_PANEL_FILE_EVENT = "diff-approval:panel-file";
|
|
18578
18636
|
/** How often the optional sidebar services are looked up, and for how long. The
|
|
18579
18637
|
* sidebar's plugin may attach after this one; ~15s of patience covers a slow
|
|
18580
18638
|
* boot, and finding them stops the timer. */
|
|
@@ -18698,17 +18756,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
18698
18756
|
* @param props - the seat's runtime props, this plugin's face, and `useTabInfo`.
|
|
18699
18757
|
* @returns the host element and, once it exists, the docked panel inside it.
|
|
18700
18758
|
*/
|
|
18701
|
-
/** Keeps a failure inside the tab from
|
|
18702
|
-
* the
|
|
18703
|
-
|
|
18704
|
-
state = { failed: false };
|
|
18705
|
-
static getDerivedStateFromError() {
|
|
18706
|
-
return { failed: true };
|
|
18707
|
-
}
|
|
18708
|
-
render() {
|
|
18709
|
-
return this.state.failed ? null : this.props.children;
|
|
18710
|
-
}
|
|
18711
|
-
};
|
|
18759
|
+
/** Keeps a failure inside the tab from taking the app's tree down with it, and
|
|
18760
|
+
* from leaving the pane blank: {@link PanelBoundary} says what happened and can
|
|
18761
|
+
* re-render the panel without a reload. */
|
|
18712
18762
|
function DiffDockBody(props) {
|
|
18713
18763
|
const { t, useTabInfo, onDockShowing, ...panelProps } = props;
|
|
18714
18764
|
const [host, setHost] = (0, react.useState)(null);
|
|
@@ -18723,12 +18773,15 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
18723
18773
|
ref: setHost,
|
|
18724
18774
|
className: PendingPanel_module_css_default.dockHost,
|
|
18725
18775
|
"data-diff-approval-dock": true
|
|
18726
|
-
}), host !== null && (0, react_jsx_runtime.jsx)(
|
|
18727
|
-
...panelProps,
|
|
18776
|
+
}), host !== null && (0, react_jsx_runtime.jsx)(PanelBoundary, {
|
|
18728
18777
|
t,
|
|
18729
|
-
|
|
18730
|
-
|
|
18731
|
-
|
|
18778
|
+
children: (0, react_jsx_runtime.jsx)(PendingPanel, {
|
|
18779
|
+
...panelProps,
|
|
18780
|
+
t,
|
|
18781
|
+
docked: true,
|
|
18782
|
+
dockHost: host
|
|
18783
|
+
})
|
|
18784
|
+
})] });
|
|
18732
18785
|
}
|
|
18733
18786
|
/**
|
|
18734
18787
|
* The tab chip: the mode switch, then the panel's title with the pending count —
|
|
@@ -18880,6 +18933,167 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
18880
18933
|
timer = window.setTimeout(tick, DOCK_LOOKUP_INTERVAL_MS);
|
|
18881
18934
|
}
|
|
18882
18935
|
//#endregion
|
|
18936
|
+
//#region lib/types/client/panel-memory.js
|
|
18937
|
+
/**
|
|
18938
|
+
* Where the review panel was left, for this page's lifetime.
|
|
18939
|
+
*
|
|
18940
|
+
* Closing the panel is not "done reviewing": reopening it should put the reader
|
|
18941
|
+
* back on the file they were in, at the offset they were at. That is a fact about
|
|
18942
|
+
* this visit rather than a stored preference, so it lives in module state — which
|
|
18943
|
+
* also gives the two mounts that show the panel (the floating overlay and the
|
|
18944
|
+
* docked tab) one shared memory, so switching presentation does not lose the
|
|
18945
|
+
* place, and a reload starts clean.
|
|
18946
|
+
*
|
|
18947
|
+
* Keyed by session: two sessions have their own pending lists, and one session's
|
|
18948
|
+
* panel must not resume another's file.
|
|
18949
|
+
*
|
|
18950
|
+
* @module dsh-diff-approval/client/panel-memory
|
|
18951
|
+
*/
|
|
18952
|
+
const views = /* @__PURE__ */ new Map();
|
|
18953
|
+
/** This session's record, created on first use. */
|
|
18954
|
+
function viewOf(sessionId) {
|
|
18955
|
+
let view = views.get(sessionId);
|
|
18956
|
+
if (view === void 0) {
|
|
18957
|
+
view = { offsets: /* @__PURE__ */ new Map() };
|
|
18958
|
+
views.set(sessionId, view);
|
|
18959
|
+
}
|
|
18960
|
+
return view;
|
|
18961
|
+
}
|
|
18962
|
+
/**
|
|
18963
|
+
* Remember that a session's panel was left showing one file, and where in it.
|
|
18964
|
+
* @param sessionId - the session the panel was reviewing; nothing is recorded
|
|
18965
|
+
* without one.
|
|
18966
|
+
* @param view - the pending entry that was open, and the code view's scrollTop.
|
|
18967
|
+
* An absent offset *forgets* any remembered place for that file, which is what
|
|
18968
|
+
* a caller that is about to open it at its first change wants: a mount that only
|
|
18969
|
+
* appears afterwards then lands there too, instead of on a stale offset.
|
|
18970
|
+
*/
|
|
18971
|
+
function rememberPanelView(sessionId, view) {
|
|
18972
|
+
if (sessionId === void 0) return;
|
|
18973
|
+
const record = viewOf(sessionId);
|
|
18974
|
+
record.last = view.fileId;
|
|
18975
|
+
if (view.scrollTop === void 0) record.offsets.delete(view.fileId);
|
|
18976
|
+
else record.offsets.set(view.fileId, view.scrollTop);
|
|
18977
|
+
}
|
|
18978
|
+
/**
|
|
18979
|
+
* The file a session's panel was last showing.
|
|
18980
|
+
* @param sessionId - the session, if any.
|
|
18981
|
+
* @returns the pending entry id, or undefined when that session's panel has never
|
|
18982
|
+
* closed on a file.
|
|
18983
|
+
*/
|
|
18984
|
+
function lastPanelFile(sessionId) {
|
|
18985
|
+
return sessionId === void 0 ? void 0 : views.get(sessionId)?.last;
|
|
18986
|
+
}
|
|
18987
|
+
/**
|
|
18988
|
+
* How far down one file was left, when it has been left before.
|
|
18989
|
+
* @param sessionId - the session, if any.
|
|
18990
|
+
* @param fileId - the pending entry id.
|
|
18991
|
+
* @returns the remembered scrollTop, or undefined when there is none.
|
|
18992
|
+
*/
|
|
18993
|
+
function panelFileOffset(sessionId, fileId) {
|
|
18994
|
+
return sessionId === void 0 ? void 0 : views.get(sessionId)?.offsets.get(fileId);
|
|
18995
|
+
}
|
|
18996
|
+
//#endregion
|
|
18997
|
+
//#region lib/types/client/composer-cover.js
|
|
18998
|
+
/**
|
|
18999
|
+
* Pasting a copied reference into the composer, and where the caret goes.
|
|
19000
|
+
*
|
|
19001
|
+
* The reference lands in the draft whatever the panel is doing. The caret is a
|
|
19002
|
+
* different question: the review panel can be over the composer, and moving the
|
|
19003
|
+
* focus into a field the reader cannot see would take their next keystrokes with it.
|
|
19004
|
+
* So the focus is asked for only when the composer is really visible.
|
|
19005
|
+
*
|
|
19006
|
+
* @module dsh-diff-approval/client/composer-cover
|
|
19007
|
+
*/
|
|
19008
|
+
/** The panel's own element, whichever way it is being presented. */
|
|
19009
|
+
const PANEL_SELECTOR = "[data-diff-approval-panel]";
|
|
19010
|
+
/** The composer's parts, most specific first: the editable input itself, its card,
|
|
19011
|
+
* and the seat that hosts them (the seat stays mounted through a takeover). */
|
|
19012
|
+
const COMPOSER_PART_SELECTORS = [
|
|
19013
|
+
"[data-composer-input]",
|
|
19014
|
+
"[data-composer-card]",
|
|
19015
|
+
"[data-composer-seat]"
|
|
19016
|
+
];
|
|
19017
|
+
/** The composer's own editable box: a contenteditable div, not a `<textarea>`. */
|
|
19018
|
+
const COMPOSER_INPUT_SELECTOR$1 = "[data-composer-input]";
|
|
19019
|
+
/**
|
|
19020
|
+
* How much of the composer the panel has to cover before the composer counts as
|
|
19021
|
+
* hidden, as a fraction of the composer's own area. Plain intersection is too eager
|
|
19022
|
+
* — a box that grazes the composer's edge by a pixel is not covering it, and the
|
|
19023
|
+
* caret belongs there as much as ever — while demanding near-total coverage would
|
|
19024
|
+
* miss the real cases (a covered composer edge, the short-window floor, a fullscreen
|
|
19025
|
+
* docked pane) where the composer ends up *entirely* inside the panel's box. Half is
|
|
19026
|
+
* the line between the two: more of it hidden than not.
|
|
19027
|
+
*/
|
|
19028
|
+
const COMPOSER_COVERED_RATIO = .5;
|
|
19029
|
+
/**
|
|
19030
|
+
* Whether the review panel is covering the chat composer as it stands right now.
|
|
19031
|
+
*
|
|
19032
|
+
* Measured, not inferred from the presentation, because the cases do not line up one
|
|
19033
|
+
* per mode:
|
|
19034
|
+
* - floating with the composer edge left uncovered, the panel stops above the
|
|
19035
|
+
* composer — except when the window is too short for the panel's own minimum
|
|
19036
|
+
* height, and then it covers every edge, the composer's included (the phone case);
|
|
19037
|
+
* - floating over an undocked ("hero") composer, the panel spans the conversation
|
|
19038
|
+
* and the composer sits inside it;
|
|
19039
|
+
* - docked in the right sidebar, the composer is normally in the conversation column
|
|
19040
|
+
* beside the pane and stays visible — but a fullscreen sidebar spans the window,
|
|
19041
|
+
* and the panel inside it spans the window too.
|
|
19042
|
+
* Whatever a layout does next, an overlap is an overlap, so this measures the two
|
|
19043
|
+
* boxes and the fraction of the composer they share.
|
|
19044
|
+
* @returns whether the panel covers more than {@link COMPOSER_COVERED_RATIO} of the
|
|
19045
|
+
* composer.
|
|
19046
|
+
*/
|
|
19047
|
+
function composerCoveredByPanel() {
|
|
19048
|
+
if (typeof document === "undefined") return false;
|
|
19049
|
+
const panel = document.querySelector(PANEL_SELECTOR);
|
|
19050
|
+
if (panel === null) return false;
|
|
19051
|
+
let composer = null;
|
|
19052
|
+
for (const selector of COMPOSER_PART_SELECTORS) {
|
|
19053
|
+
composer = document.querySelector(selector);
|
|
19054
|
+
if (composer !== null) break;
|
|
19055
|
+
}
|
|
19056
|
+
if (composer === null) return false;
|
|
19057
|
+
const p = panel.getBoundingClientRect();
|
|
19058
|
+
const c = composer.getBoundingClientRect();
|
|
19059
|
+
if (p.width <= 0 || p.height <= 0 || c.width <= 0 || c.height <= 0) return false;
|
|
19060
|
+
const overlapWidth = Math.min(p.right, c.right) - Math.max(p.left, c.left);
|
|
19061
|
+
const overlapHeight = Math.min(p.bottom, c.bottom) - Math.max(p.top, c.top);
|
|
19062
|
+
if (overlapWidth <= 0 || overlapHeight <= 0) return false;
|
|
19063
|
+
return overlapWidth * overlapHeight / (c.width * c.height) > COMPOSER_COVERED_RATIO;
|
|
19064
|
+
}
|
|
19065
|
+
/** Everything the composer is made of, for "is the caret in the composer?". */
|
|
19066
|
+
const COMPOSER_SCOPE_SELECTOR = "[data-composer-input],[data-composer-card]";
|
|
19067
|
+
/**
|
|
19068
|
+
* Take the caret out of the composer when it is holding it.
|
|
19069
|
+
*
|
|
19070
|
+
* Declining to *move* the caret there is not enough on its own: the chord works with
|
|
19071
|
+
* the caret wherever it is, and the caret is usually in the composer — someone who
|
|
19072
|
+
* was typing, then selected a few lines in the diff with the mouse (a selection does
|
|
19073
|
+
* not move the focus), would have the reference pasted into a composer they cannot
|
|
19074
|
+
* see and their next keystrokes land in it. So a hidden composer loses the caret.
|
|
19075
|
+
*/
|
|
19076
|
+
function leaveComposerCaret() {
|
|
19077
|
+
const active = document.activeElement;
|
|
19078
|
+
if (!(active instanceof HTMLElement)) return;
|
|
19079
|
+
if (active.closest(COMPOSER_SCOPE_SELECTOR) === null) return;
|
|
19080
|
+
active.blur();
|
|
19081
|
+
}
|
|
19082
|
+
/**
|
|
19083
|
+
* Append a copied reference to the composer's draft, and leave the caret there only
|
|
19084
|
+
* when the composer is not behind the panel.
|
|
19085
|
+
* @param appendDraft - writes the reference into the addressed session's draft.
|
|
19086
|
+
* @param reference - the copied `(file:line)` reference.
|
|
19087
|
+
*/
|
|
19088
|
+
function pasteReferenceIntoComposer(appendDraft, reference) {
|
|
19089
|
+
appendDraft(reference);
|
|
19090
|
+
if (composerCoveredByPanel()) {
|
|
19091
|
+
leaveComposerCaret();
|
|
19092
|
+
return;
|
|
19093
|
+
}
|
|
19094
|
+
document.querySelector(COMPOSER_INPUT_SELECTOR$1)?.focus();
|
|
19095
|
+
}
|
|
19096
|
+
//#endregion
|
|
18883
19097
|
//#region lib/types/client/PendingPanel.js
|
|
18884
19098
|
/** Sidebar-foot pending-edit review action and the split review panel it opens. */
|
|
18885
19099
|
/**
|
|
@@ -18969,6 +19183,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
18969
19183
|
const MAX_LIST_WIDTH_PX = 560;
|
|
18970
19184
|
/** Inset of the floating file-list card from the code scroll box, in px. */
|
|
18971
19185
|
const FLOAT_LIST_MARGIN_PX = 12;
|
|
19186
|
+
/** The folded card's width grip: how wide its hit strip is, and how much of it
|
|
19187
|
+
* lies over the card (the rest overhangs the code view, so the card's own
|
|
19188
|
+
* scrollbar strip stays clear). */
|
|
19189
|
+
const FLOAT_GRIP_WIDTH_PX = 9;
|
|
19190
|
+
const FLOAT_GRIP_OVERHANG_PX = 3;
|
|
18972
19191
|
/** Normalize a path for comparison: forward slashes, no trailing slash. */
|
|
18973
19192
|
function normalizeDiffPath(p) {
|
|
18974
19193
|
return p.replaceAll("\\", "/").replace(/\/+$/, "");
|
|
@@ -19069,6 +19288,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
19069
19288
|
/** Total width of the two line-number gutters, subtracted from the code width
|
|
19070
19289
|
* when measuring wrapped line heights. */
|
|
19071
19290
|
const WRAP_GUTTERS_PX = 88;
|
|
19291
|
+
/** How long a requested dock may take to actually show the panel before the
|
|
19292
|
+
* overlay steps in. The tab body mounts a frame or two after the ask, so the
|
|
19293
|
+
* wait is short — but a sidebar that accepts the ask and never brings the tab up
|
|
19294
|
+
* must not swallow the click. */
|
|
19295
|
+
const DOCK_REVEAL_GRACE_MS = 400;
|
|
19072
19296
|
/** A shared canvas for measuring wrapped line heights (CPU-only, no DOM reflow). */
|
|
19073
19297
|
let measureCanvas;
|
|
19074
19298
|
/**
|
|
@@ -20677,7 +20901,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20677
20901
|
});
|
|
20678
20902
|
}
|
|
20679
20903
|
/** The selected file's diff, actions, jump controls, and copy toolbar. */
|
|
20680
|
-
function PendingDiff({ file, busy, workspacePath, jumpSignal, undoFlash, failedMessage, onPasteReference, onToast, t, onKeep, onRevert, onRefreshVcs, onBlockKeep, onBlockRevert, onOpen, onPreviewImage }) {
|
|
20904
|
+
function PendingDiff({ file, busy, workspacePath, jumpSignal, undoFlash, landingTop, landingTick, failedMessage, onPasteReference, onToast, t, onKeep, onRevert, onRefreshVcs, onBlockKeep, onBlockRevert, onOpen, onPreviewImage }) {
|
|
20681
20905
|
const [langOverride, setLangOverride] = (0, react.useState)(void 0);
|
|
20682
20906
|
const [langMenuOpen, setLangMenuOpen] = (0, react.useState)(false);
|
|
20683
20907
|
const langMenuItems = (0, react.useMemo)(() => [{
|
|
@@ -20842,6 +21066,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20842
21066
|
const [previewFlash, setPreviewFlash] = (0, react.useState)(void 0);
|
|
20843
21067
|
const previewFlashRef = (0, react.useRef)(null);
|
|
20844
21068
|
const previewFlashPendingRef = (0, react.useRef)(false);
|
|
21069
|
+
/** The offset the file now showing was asked to open at, held until the landing
|
|
21070
|
+
* effect below spends it (that effect runs a render later than the switch). */
|
|
21071
|
+
const landingTopRef = (0, react.useRef)(void 0);
|
|
20845
21072
|
const selectionTextRef = (0, react.useRef)("");
|
|
20846
21073
|
const [copied, setCopied] = (0, react.useState)(false);
|
|
20847
21074
|
const [searchOpen, setSearchOpen] = (0, react.useState)(false);
|
|
@@ -20857,10 +21084,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20857
21084
|
previewFlashPendingRef.current = true;
|
|
20858
21085
|
};
|
|
20859
21086
|
(0, react.useEffect)(() => {
|
|
20860
|
-
|
|
21087
|
+
landingTopRef.current = landingTop;
|
|
21088
|
+
if (landingTop === void 0) {
|
|
21089
|
+
setFocus(0);
|
|
21090
|
+
bumpFlash(false);
|
|
21091
|
+
} else setFocus(blockIndexAtOffset(landingTop));
|
|
20861
21092
|
setScrollTick((tick) => tick + 1);
|
|
20862
21093
|
bodyRef.current?.focus();
|
|
20863
|
-
bumpFlash(false);
|
|
20864
21094
|
setHoveredBlock(void 0);
|
|
20865
21095
|
setSelection(void 0);
|
|
20866
21096
|
setLangOverride(void 0);
|
|
@@ -20869,7 +21099,11 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
20869
21099
|
setSearchOpen(false);
|
|
20870
21100
|
setSearchQuery("");
|
|
20871
21101
|
setSearchIndex(0);
|
|
20872
|
-
}, [
|
|
21102
|
+
}, [
|
|
21103
|
+
file.id,
|
|
21104
|
+
landingTop,
|
|
21105
|
+
landingTick
|
|
21106
|
+
]);
|
|
20873
21107
|
(0, react.useEffect)(() => {
|
|
20874
21108
|
if (undoFlash === 0) return;
|
|
20875
21109
|
setFocus(0);
|
|
@@ -21470,6 +21704,19 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
21470
21704
|
]);
|
|
21471
21705
|
(0, react.useLayoutEffect)(() => {
|
|
21472
21706
|
if (rowCount === 0) return;
|
|
21707
|
+
const resumed = landingTopRef.current;
|
|
21708
|
+
if (resumed !== void 0) {
|
|
21709
|
+
landingTopRef.current = void 0;
|
|
21710
|
+
if (!previewActive) {
|
|
21711
|
+
const resumeBody = bodyRef.current;
|
|
21712
|
+
if (resumeBody !== null) {
|
|
21713
|
+
const clamped = Math.max(0, Math.min(resumed, resumeBody.scrollHeight - resumeBody.clientHeight));
|
|
21714
|
+
if (resumeBody.scrollTop !== clamped) resumeBody.scrollTop = clamped;
|
|
21715
|
+
setScrollTop(clamped);
|
|
21716
|
+
}
|
|
21717
|
+
}
|
|
21718
|
+
return;
|
|
21719
|
+
}
|
|
21473
21720
|
const block = model.blocks[focus];
|
|
21474
21721
|
if (block === void 0) return;
|
|
21475
21722
|
if (previewActive) {
|
|
@@ -21571,6 +21818,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
21571
21818
|
if (jumpSignal === 0) return;
|
|
21572
21819
|
jumpBlock(1, true, false);
|
|
21573
21820
|
}, [jumpSignal]);
|
|
21821
|
+
/**
|
|
21822
|
+
* The change block the view is in at one scroll offset: the last block at or
|
|
21823
|
+
* above the offset, i.e. the same anchor `onScroll` re-focuses from. Used when
|
|
21824
|
+
* a resumed view starts away from the first change, so prev/next walk from the
|
|
21825
|
+
* block the reader was actually in.
|
|
21826
|
+
* @param offset - a code view scrollTop.
|
|
21827
|
+
* @returns the block index; 0 when the offset is above every change.
|
|
21828
|
+
*/
|
|
21829
|
+
const blockIndexAtOffset = (offset) => {
|
|
21830
|
+
const anchor = offset + leadRows * ROW_HEIGHT_PX;
|
|
21831
|
+
let found = 0;
|
|
21832
|
+
for (let index = 0; index < model.blocks.length; index++) {
|
|
21833
|
+
const block = model.blocks[index];
|
|
21834
|
+
if (block !== void 0 && offsetOf(block.start) <= anchor + NAV_ANCHOR_TOLERANCE_PX) found = index;
|
|
21835
|
+
}
|
|
21836
|
+
return found;
|
|
21837
|
+
};
|
|
21574
21838
|
const onScroll = () => {
|
|
21575
21839
|
const body = bodyRef.current;
|
|
21576
21840
|
if (body === null) return;
|
|
@@ -22525,6 +22789,15 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22525
22789
|
const dockAvailable = useDock?.((state) => state.available) === true;
|
|
22526
22790
|
/** Why the dock is unavailable, when it is (shown once, if asked for). */
|
|
22527
22791
|
const dockReason = useDock?.((state) => state.reason);
|
|
22792
|
+
/** The dock's visibility as the latest render has it, for the reveal fallback's
|
|
22793
|
+
* timer (which runs outside this render's closure). */
|
|
22794
|
+
const dockShowingRef = (0, react.useRef)(false);
|
|
22795
|
+
dockShowingRef.current = dockShowing;
|
|
22796
|
+
/** The pending "did the dock actually come up" check, if any. */
|
|
22797
|
+
const revealTimerRef = (0, react.useRef)(void 0);
|
|
22798
|
+
(0, react.useEffect)(() => () => {
|
|
22799
|
+
if (revealTimerRef.current !== void 0) window.clearTimeout(revealTimerRef.current);
|
|
22800
|
+
}, []);
|
|
22528
22801
|
const revealRef = (0, react.useRef)(() => {});
|
|
22529
22802
|
/** The header entry's toggle, deferred to the latest render (see `toggleOpen`):
|
|
22530
22803
|
* this instance owns the overlay's open state, and the entry is a second mount
|
|
@@ -22551,6 +22824,29 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22551
22824
|
const snapshot = usePending((snapshot) => snapshot);
|
|
22552
22825
|
const [open, setOpen] = (0, react.useState)(false);
|
|
22553
22826
|
const [selected, setSelected] = (0, react.useState)("");
|
|
22827
|
+
/**
|
|
22828
|
+
* Where the diff should land for the file it is about to show, and a nonce so a
|
|
22829
|
+
* repeated request for the *same* file lands again. `top` carries the offset the
|
|
22830
|
+
* reader was left at when the panel resumes a view (see `panel-memory`); it is
|
|
22831
|
+
* absent when the request means "show me this diff" — a file picked from the
|
|
22832
|
+
* list, the advance a decision leaves behind, or the produced-file chip — and
|
|
22833
|
+
* that lands on the file's first change.
|
|
22834
|
+
*/
|
|
22835
|
+
const [landing, setLanding] = (0, react.useState)(void 0);
|
|
22836
|
+
/** Ask the diff to land on one file: its first change unless `top` says where.
|
|
22837
|
+
* The nonce makes the request an event rather than a value, so re-clicking the
|
|
22838
|
+
* chip for the file already open lands on its first change again. */
|
|
22839
|
+
const landOn = (fileId, top) => {
|
|
22840
|
+
setLanding((prev) => ({
|
|
22841
|
+
fileId,
|
|
22842
|
+
top,
|
|
22843
|
+
n: (prev?.n ?? 0) + 1
|
|
22844
|
+
}));
|
|
22845
|
+
};
|
|
22846
|
+
/** The selection as the latest render has it, for the closers that run from a
|
|
22847
|
+
* cleanup (the docked tab unmounting) rather than from a handler. */
|
|
22848
|
+
const selectedRef = (0, react.useRef)(selected);
|
|
22849
|
+
selectedRef.current = selected;
|
|
22554
22850
|
/** Bumped when the already-open file is clicked again, to jump to the next
|
|
22555
22851
|
* diff block in the open file's detail pane. */
|
|
22556
22852
|
const [jumpSignal, setJumpSignal] = (0, react.useState)(0);
|
|
@@ -22585,7 +22881,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22585
22881
|
return;
|
|
22586
22882
|
}
|
|
22587
22883
|
revealPanel();
|
|
22588
|
-
|
|
22884
|
+
rememberPanelView(current, { fileId: entry.id });
|
|
22885
|
+
window.dispatchEvent(new CustomEvent(OPEN_PANEL_FILE_EVENT, { detail: { fileId: entry.id } }));
|
|
22589
22886
|
};
|
|
22590
22887
|
(0, react.useEffect)(() => {
|
|
22591
22888
|
const onOpenFile = (event) => {
|
|
@@ -22598,6 +22895,18 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22598
22895
|
window.removeEventListener(OPEN_FILE_EVENT, onOpenFile);
|
|
22599
22896
|
};
|
|
22600
22897
|
}, []);
|
|
22898
|
+
(0, react.useEffect)(() => {
|
|
22899
|
+
const onPanelFile = (event) => {
|
|
22900
|
+
const detail = event.detail;
|
|
22901
|
+
if (detail === void 0 || typeof detail.fileId !== "string") return;
|
|
22902
|
+
setSelected(detail.fileId);
|
|
22903
|
+
landOn(detail.fileId);
|
|
22904
|
+
};
|
|
22905
|
+
window.addEventListener(OPEN_PANEL_FILE_EVENT, onPanelFile);
|
|
22906
|
+
return () => {
|
|
22907
|
+
window.removeEventListener(OPEN_PANEL_FILE_EVENT, onPanelFile);
|
|
22908
|
+
};
|
|
22909
|
+
}, []);
|
|
22601
22910
|
/** Whether the redo-cleared notice is showing (bottom-right, OK to dismiss). */
|
|
22602
22911
|
const [redoClearedNotice, setRedoClearedNotice] = (0, react.useState)(false);
|
|
22603
22912
|
/** A last-block keep/revert awaiting the user's remove-or-keep choice; the
|
|
@@ -22626,7 +22935,6 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22626
22935
|
const [coverNotice, setCoverNotice] = (0, react.useState)(null);
|
|
22627
22936
|
/** File-list pane width, adjustable by dragging the divider. */
|
|
22628
22937
|
const [listWidth, setListWidth] = (0, react.useState)(240);
|
|
22629
|
-
const resizeDrag = (0, react.useRef)(null);
|
|
22630
22938
|
/** Whether the floating (collapsed) file list is currently shown. */
|
|
22631
22939
|
const [floatOpen, setFloatOpen] = (0, react.useState)(false);
|
|
22632
22940
|
/** Whether the file list is always folded, whatever the width allows. */
|
|
@@ -22665,11 +22973,22 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22665
22973
|
};
|
|
22666
22974
|
}, [open, docked]);
|
|
22667
22975
|
const floatMode = forceFloat || (docked ? panelWidth > 0 && panelWidth < DOCK_TWO_COLUMN_MIN_PX : viewportWidth < 1024);
|
|
22976
|
+
/**
|
|
22977
|
+
* Set when a fresh showing of the panel should start with the folded list open —
|
|
22978
|
+
* the panel opens to show the list, and the knob that reveals it is for folding
|
|
22979
|
+
* it away again — and spent by the first frame it can be spent on. The folded
|
|
22980
|
+
* mode is not always known on that frame: a docked panel measures its own width a
|
|
22981
|
+
* frame after it mounts. A hand on the list's own switches clears it, so the
|
|
22982
|
+
* reader's choice always wins over the default.
|
|
22983
|
+
*/
|
|
22984
|
+
const startListOpenRef = (0, react.useRef)(false);
|
|
22668
22985
|
const toggleFileList = () => {
|
|
22986
|
+
startListOpenRef.current = false;
|
|
22669
22987
|
setFloatOpen((value) => !value);
|
|
22670
22988
|
};
|
|
22671
22989
|
/** Flip the always-fold preference, remembered for the next open. */
|
|
22672
22990
|
const toggleForceFloat = () => {
|
|
22991
|
+
startListOpenRef.current = false;
|
|
22673
22992
|
const next = !forceFloat;
|
|
22674
22993
|
setForceFloat(next);
|
|
22675
22994
|
setFileListFloat(next);
|
|
@@ -22685,13 +23004,24 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22685
23004
|
window.removeEventListener("resize", onResize);
|
|
22686
23005
|
};
|
|
22687
23006
|
}, []);
|
|
23007
|
+
(0, react.useEffect)(() => {
|
|
23008
|
+
if (!startListOpenRef.current) return;
|
|
23009
|
+
if (!open && !docked) return;
|
|
23010
|
+
if (!floatMode) return;
|
|
23011
|
+
startListOpenRef.current = false;
|
|
23012
|
+
setFloatOpen(true);
|
|
23013
|
+
}, [
|
|
23014
|
+
open,
|
|
23015
|
+
docked,
|
|
23016
|
+
floatMode
|
|
23017
|
+
]);
|
|
22688
23018
|
(0, react.useEffect)(() => {
|
|
22689
23019
|
if (!floatMode || !floatOpen) return;
|
|
22690
23020
|
const el = panelRef.current;
|
|
22691
23021
|
if (el === null) return;
|
|
22692
23022
|
const onPointerDown = (event) => {
|
|
22693
23023
|
const target = event.target;
|
|
22694
|
-
if (target instanceof Element && (target.closest("[data-diff-floating-file-list]") !== null || target.closest("[data-diff-file-list-toggle]") !== null)) return;
|
|
23024
|
+
if (target instanceof Element && (target.closest("[data-diff-floating-file-list]") !== null || target.closest("[data-diff-file-list-toggle]") !== null || target.closest("[data-diff-float-resize]") !== null)) return;
|
|
22695
23025
|
setFloatOpen(false);
|
|
22696
23026
|
};
|
|
22697
23027
|
el.addEventListener("pointerdown", onPointerDown, true);
|
|
@@ -22719,7 +23049,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22719
23049
|
measureFloatBoxRef.current = measureFloatBox;
|
|
22720
23050
|
(0, react.useLayoutEffect)(() => {
|
|
22721
23051
|
measureFloatBoxRef.current();
|
|
22722
|
-
}
|
|
23052
|
+
}, [
|
|
23053
|
+
floatMode,
|
|
23054
|
+
floatOpen,
|
|
23055
|
+
panelWidth,
|
|
23056
|
+
selected,
|
|
23057
|
+
snapshot.files.length
|
|
23058
|
+
]);
|
|
22723
23059
|
(0, react.useEffect)(() => {
|
|
22724
23060
|
if (!floatMode) return;
|
|
22725
23061
|
const split = splitRef.current;
|
|
@@ -22783,6 +23119,19 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22783
23119
|
window.removeEventListener("resize", measure);
|
|
22784
23120
|
};
|
|
22785
23121
|
}, [open]);
|
|
23122
|
+
(0, react.useEffect)(() => {
|
|
23123
|
+
if (!open && !docked) return;
|
|
23124
|
+
if (!composerCoveredByPanel()) return;
|
|
23125
|
+
leaveComposerCaret();
|
|
23126
|
+
}, [
|
|
23127
|
+
open,
|
|
23128
|
+
docked,
|
|
23129
|
+
floatMode,
|
|
23130
|
+
cover.composer,
|
|
23131
|
+
selected,
|
|
23132
|
+
panelWidth,
|
|
23133
|
+
snapshot.files.length
|
|
23134
|
+
]);
|
|
22786
23135
|
const files = snapshot.files.filter((file) => current !== void 0 && (file.sessionIds ?? [file.sessionId]).includes(current)).sort((left, right) => compareFileNames(left.path, right.path));
|
|
22787
23136
|
const blockKeepWithPrompt = (sessionId, id, block, removeWhenResolved) => {
|
|
22788
23137
|
const file = files.find((entry) => entry.id === id);
|
|
@@ -22848,13 +23197,24 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22848
23197
|
if (fresh.length > 0) setActionToast(fresh[0][1]);
|
|
22849
23198
|
failedRef.current = current;
|
|
22850
23199
|
}, [snapshot.failed]);
|
|
23200
|
+
const wasShowingRef = (0, react.useRef)(false);
|
|
22851
23201
|
(0, react.useLayoutEffect)(() => {
|
|
22852
|
-
|
|
22853
|
-
|
|
22854
|
-
|
|
22855
|
-
if (
|
|
23202
|
+
const showing = open || docked;
|
|
23203
|
+
const started = showing && !wasShowingRef.current;
|
|
23204
|
+
wasShowingRef.current = showing;
|
|
23205
|
+
if (!showing) return;
|
|
23206
|
+
if (started) startListOpenRef.current = true;
|
|
23207
|
+
const pending = (id) => files.some((file) => file.id === id);
|
|
23208
|
+
const keep = selected !== "" && pending(selected) ? selected : void 0;
|
|
23209
|
+
const remembered = keep === void 0 && started ? lastPanelFile(current) : void 0;
|
|
23210
|
+
const resumed = remembered !== void 0 && pending(remembered) ? remembered : void 0;
|
|
23211
|
+
const pick = keep ?? resumed ?? files[0]?.id;
|
|
23212
|
+
if (pick === void 0) return;
|
|
23213
|
+
if (pick !== selected) setSelected(pick);
|
|
23214
|
+
if (started) landOn(pick, panelFileOffset(current, pick));
|
|
22856
23215
|
}, [
|
|
22857
23216
|
open,
|
|
23217
|
+
docked,
|
|
22858
23218
|
current,
|
|
22859
23219
|
files,
|
|
22860
23220
|
selected
|
|
@@ -22880,19 +23240,51 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22880
23240
|
/**
|
|
22881
23241
|
* Show the panel the way the user last had it. `dock` hands off to the app's
|
|
22882
23242
|
* right sidebar, where the panel lives in its own tab; `float` opens this
|
|
22883
|
-
* floating panel, covering whatever {@link panelCover} says.
|
|
22884
|
-
*
|
|
22885
|
-
*
|
|
23243
|
+
* floating panel, covering whatever {@link panelCover} says.
|
|
23244
|
+
*
|
|
23245
|
+
* A remembered dock is only taken when the dock can actually show the panel.
|
|
23246
|
+
* "dock" is remembered from a page where the right sidebar existed, and the ask
|
|
23247
|
+
* itself is not proof: `onOpenDock` is always wired, and a sidebar whose
|
|
23248
|
+
* services never came up (or a controller that has since gone stale) accepts the
|
|
23249
|
+
* call and shows nothing. That used to swallow the click whole — the badge, the
|
|
23250
|
+
* header entry, the chord and the produced-file chips all did nothing, and the
|
|
23251
|
+
* only switch back to floating lives *inside* the panel, so the page had to be
|
|
23252
|
+
* reloaded to reach the review again. Now the overlay steps in whenever the tab
|
|
23253
|
+
* does not come up.
|
|
22886
23254
|
*/
|
|
22887
23255
|
const revealPanel = () => {
|
|
22888
|
-
if (panelPresentation() === "dock" && onOpenDock !== void 0)
|
|
22889
|
-
|
|
23256
|
+
if (panelPresentation() === "dock" && onOpenDock !== void 0 && dockAvailable) {
|
|
23257
|
+
try {
|
|
23258
|
+
onOpenDock();
|
|
23259
|
+
} catch {
|
|
23260
|
+
collapseSidebar();
|
|
23261
|
+
setOpen(true);
|
|
23262
|
+
return;
|
|
23263
|
+
}
|
|
23264
|
+
if (revealTimerRef.current !== void 0) window.clearTimeout(revealTimerRef.current);
|
|
23265
|
+
revealTimerRef.current = window.setTimeout(() => {
|
|
23266
|
+
revealTimerRef.current = void 0;
|
|
23267
|
+
if (dockShowingRef.current) return;
|
|
23268
|
+
collapseSidebar();
|
|
23269
|
+
setOpen(true);
|
|
23270
|
+
}, DOCK_REVEAL_GRACE_MS);
|
|
22890
23271
|
return;
|
|
22891
|
-
}
|
|
23272
|
+
}
|
|
22892
23273
|
collapseSidebar();
|
|
22893
23274
|
setOpen(true);
|
|
22894
23275
|
};
|
|
22895
23276
|
revealRef.current = revealPanel;
|
|
23277
|
+
const wasDockShowingRef = (0, react.useRef)(false);
|
|
23278
|
+
(0, react.useEffect)(() => {
|
|
23279
|
+
const was = wasDockShowingRef.current;
|
|
23280
|
+
wasDockShowingRef.current = dockShowing;
|
|
23281
|
+
if (docked) return;
|
|
23282
|
+
if (!was && dockShowing && open) setOpen(false);
|
|
23283
|
+
}, [
|
|
23284
|
+
docked,
|
|
23285
|
+
dockShowing,
|
|
23286
|
+
open
|
|
23287
|
+
]);
|
|
22896
23288
|
/** Move the panel into the right sidebar's tab: the tab is opened and this
|
|
22897
23289
|
* overlay steps aside, with the presentation remembered for the entry. The
|
|
22898
23290
|
* sidebar's controller throws when it is mounted but cannot act on a session
|
|
@@ -22906,6 +23298,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22906
23298
|
return;
|
|
22907
23299
|
}
|
|
22908
23300
|
setPanelPresentation("dock");
|
|
23301
|
+
rememberView();
|
|
22909
23302
|
setOpen(false);
|
|
22910
23303
|
};
|
|
22911
23304
|
/** Where the panel is showing right now: the mode switch's checked row. */
|
|
@@ -22957,6 +23350,33 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22957
23350
|
};
|
|
22958
23351
|
}, []);
|
|
22959
23352
|
/**
|
|
23353
|
+
* Remember what this panel is showing, so the next open resumes it: the file
|
|
23354
|
+
* that is open and how far down it the code view is. Called on every way out —
|
|
23355
|
+
* the overlay's close, the hand-off to the dock, and the docked tab unmounting.
|
|
23356
|
+
* With no code view (the Markdown preview is showing) the file's offset is kept
|
|
23357
|
+
* as it was: the file is what the reader comes back to.
|
|
23358
|
+
*/
|
|
23359
|
+
const rememberView = () => {
|
|
23360
|
+
const id = selectedRef.current;
|
|
23361
|
+
if (id === "" || current === void 0) return;
|
|
23362
|
+
const body = panelRef.current?.querySelector("[data-diff-body]");
|
|
23363
|
+
const previous = panelFileOffset(current, id);
|
|
23364
|
+
rememberPanelView(current, {
|
|
23365
|
+
fileId: id,
|
|
23366
|
+
scrollTop: body?.scrollTop ?? previous ?? 0
|
|
23367
|
+
});
|
|
23368
|
+
};
|
|
23369
|
+
/** The latest `rememberView`, for the docked instance's unmount cleanup: that
|
|
23370
|
+
* closer runs outside this render's closure. */
|
|
23371
|
+
const rememberViewRef = (0, react.useRef)(rememberView);
|
|
23372
|
+
rememberViewRef.current = rememberView;
|
|
23373
|
+
(0, react.useLayoutEffect)(() => {
|
|
23374
|
+
if (!docked) return;
|
|
23375
|
+
return () => {
|
|
23376
|
+
rememberViewRef.current();
|
|
23377
|
+
};
|
|
23378
|
+
}, [docked]);
|
|
23379
|
+
/**
|
|
22960
23380
|
* Close the floating panel and hand the caret back to the chat composer:
|
|
22961
23381
|
* closing the review is a "done reviewing, back to typing" move. A close the
|
|
22962
23382
|
* user made by clicking somewhere else is the exception — that press is an
|
|
@@ -22964,6 +23384,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
22964
23384
|
* closes without touching focus.
|
|
22965
23385
|
*/
|
|
22966
23386
|
const closePanel = () => {
|
|
23387
|
+
rememberView();
|
|
22967
23388
|
setOpen(false);
|
|
22968
23389
|
focusComposer();
|
|
22969
23390
|
};
|
|
@@ -23037,10 +23458,25 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23037
23458
|
t,
|
|
23038
23459
|
onSelect: (id) => {
|
|
23039
23460
|
if (id === selected) setJumpSignal((signal) => signal + 1);
|
|
23040
|
-
else
|
|
23461
|
+
else {
|
|
23462
|
+
setSelected(id);
|
|
23463
|
+
landOn(id);
|
|
23464
|
+
}
|
|
23041
23465
|
}
|
|
23042
23466
|
}, entry.id);
|
|
23043
23467
|
const selectedFile = files.find((file) => file.id === selected);
|
|
23468
|
+
/**
|
|
23469
|
+
* The folded card's own box, derived from the measured one, or undefined while
|
|
23470
|
+
* the list is not folded open. The card and its width grip are both placed from
|
|
23471
|
+
* these numbers, which is what keeps the grip on the card's right edge as the
|
|
23472
|
+
* width changes.
|
|
23473
|
+
*/
|
|
23474
|
+
const floatCard = !floatMode || !floatOpen || files.length === 0 || floatBox === null ? void 0 : {
|
|
23475
|
+
left: floatBox.left + FLOAT_LIST_MARGIN_PX,
|
|
23476
|
+
top: floatBox.top + FLOAT_LIST_MARGIN_PX,
|
|
23477
|
+
width: Math.min(listWidth, Math.max(0, floatBox.width - 24)),
|
|
23478
|
+
height: Math.max(0, floatBox.height - 24)
|
|
23479
|
+
};
|
|
23044
23480
|
/** The file whose removal is being confirmed (a last-block action), if any. */
|
|
23045
23481
|
const promptFile = blockPrompt === null ? void 0 : files.find((file) => file.id === blockPrompt.id);
|
|
23046
23482
|
/** The file whose removal is being confirmed (a whole-file action), if any. */
|
|
@@ -23121,13 +23557,19 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23121
23557
|
const id = await onUndo(sessionId);
|
|
23122
23558
|
if (id === void 0) return;
|
|
23123
23559
|
if (id === selected) setUndoFlash((signal) => signal + 1);
|
|
23124
|
-
else
|
|
23560
|
+
else {
|
|
23561
|
+
setSelected(id);
|
|
23562
|
+
landOn(id);
|
|
23563
|
+
}
|
|
23125
23564
|
};
|
|
23126
23565
|
const handleRedo = async (sessionId) => {
|
|
23127
23566
|
const id = await onRedo(sessionId);
|
|
23128
23567
|
if (id === void 0) return;
|
|
23129
23568
|
if (id === selected) setUndoFlash((signal) => signal + 1);
|
|
23130
|
-
else
|
|
23569
|
+
else {
|
|
23570
|
+
setSelected(id);
|
|
23571
|
+
landOn(id);
|
|
23572
|
+
}
|
|
23131
23573
|
};
|
|
23132
23574
|
(0, react.useEffect)(() => {
|
|
23133
23575
|
if (!open || current === void 0) return;
|
|
@@ -23195,7 +23637,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23195
23637
|
event.preventDefault();
|
|
23196
23638
|
const index = files.findIndex((file) => file.id === selected);
|
|
23197
23639
|
const next = files[(index + direction + files.length) % files.length];
|
|
23198
|
-
if (next !== void 0)
|
|
23640
|
+
if (next !== void 0) {
|
|
23641
|
+
setSelected(next.id);
|
|
23642
|
+
landOn(next.id);
|
|
23643
|
+
}
|
|
23199
23644
|
};
|
|
23200
23645
|
window.addEventListener("keydown", onKeyDown, true);
|
|
23201
23646
|
return () => {
|
|
@@ -23248,32 +23693,40 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23248
23693
|
window.removeEventListener("keydown", onKeyDown, true);
|
|
23249
23694
|
};
|
|
23250
23695
|
}, [open, docked]);
|
|
23251
|
-
/**
|
|
23696
|
+
/**
|
|
23697
|
+
* Drag the list's width, from a mouse *or* a finger. Pointer events rather than
|
|
23698
|
+
* mouse ones, because a touch drag never produces the mouse events this used to
|
|
23699
|
+
* wait for: the browser's synthetic `mousemove` does not exist, and the synthetic
|
|
23700
|
+
* `mousedown`/`mouseup` pair arrives together at the *end* of the gesture — so on
|
|
23701
|
+
* a phone the grip read as a tap and the width never changed. The handles also
|
|
23702
|
+
* declare `touch-action: none` (see the stylesheet), without which the browser
|
|
23703
|
+
* would take the drag as a pan and cancel the pointer stream outright.
|
|
23704
|
+
*/
|
|
23252
23705
|
const startResize = (event) => {
|
|
23253
|
-
if (event.button !== 0) return;
|
|
23706
|
+
if (event.button !== 0 || event.isPrimary === false) return;
|
|
23254
23707
|
event.preventDefault();
|
|
23708
|
+
const startX = event.clientX;
|
|
23709
|
+
const startWidth = listWidth;
|
|
23255
23710
|
const cap = floatMode && floatBox !== null ? Math.max(MIN_LIST_WIDTH_PX, floatBox.width - 24) : MAX_LIST_WIDTH_PX;
|
|
23256
|
-
|
|
23257
|
-
|
|
23258
|
-
|
|
23259
|
-
};
|
|
23711
|
+
try {
|
|
23712
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
23713
|
+
} catch {}
|
|
23260
23714
|
document.body.style.userSelect = "none";
|
|
23261
23715
|
document.body.style.cursor = "col-resize";
|
|
23262
23716
|
const onMove = (move) => {
|
|
23263
|
-
const
|
|
23264
|
-
if (start === null) return;
|
|
23265
|
-
const next = start.startWidth + (move.clientX - start.startX);
|
|
23717
|
+
const next = startWidth + (move.clientX - startX);
|
|
23266
23718
|
setListWidth(Math.min(Math.max(next, MIN_LIST_WIDTH_PX), cap));
|
|
23267
23719
|
};
|
|
23268
|
-
const
|
|
23269
|
-
resizeDrag.current = null;
|
|
23720
|
+
const finish = () => {
|
|
23270
23721
|
document.body.style.userSelect = "";
|
|
23271
23722
|
document.body.style.cursor = "";
|
|
23272
|
-
window.removeEventListener("
|
|
23273
|
-
window.removeEventListener("
|
|
23723
|
+
window.removeEventListener("pointermove", onMove);
|
|
23724
|
+
window.removeEventListener("pointerup", finish);
|
|
23725
|
+
window.removeEventListener("pointercancel", finish);
|
|
23274
23726
|
};
|
|
23275
|
-
window.addEventListener("
|
|
23276
|
-
window.addEventListener("
|
|
23727
|
+
window.addEventListener("pointermove", onMove);
|
|
23728
|
+
window.addEventListener("pointerup", finish);
|
|
23729
|
+
window.addEventListener("pointercancel", finish);
|
|
23277
23730
|
};
|
|
23278
23731
|
const content = (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
23279
23732
|
importToast !== null && (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
|
|
@@ -23442,7 +23895,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23442
23895
|
!floatMode && (0, react_jsx_runtime.jsx)("div", {
|
|
23443
23896
|
className: PendingPanel_module_css_default.resizeHandle,
|
|
23444
23897
|
"data-diff-resize": true,
|
|
23445
|
-
|
|
23898
|
+
onPointerDown: startResize
|
|
23446
23899
|
}),
|
|
23447
23900
|
(0, react_jsx_runtime.jsx)("div", {
|
|
23448
23901
|
className: PendingPanel_module_css_default.detail,
|
|
@@ -23456,6 +23909,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23456
23909
|
workspacePath: snapshot.workspacePath,
|
|
23457
23910
|
jumpSignal,
|
|
23458
23911
|
undoFlash,
|
|
23912
|
+
landingTop: landing !== void 0 && landing.fileId === selectedFile.id ? landing.top : void 0,
|
|
23913
|
+
landingTick: landing !== void 0 && landing.fileId === selectedFile.id ? landing.n : 0,
|
|
23459
23914
|
failedMessage: failed.get(selectedFile.id),
|
|
23460
23915
|
onPasteReference,
|
|
23461
23916
|
onToast: showCopyToast,
|
|
@@ -23471,21 +23926,27 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
23471
23926
|
onPreviewImage
|
|
23472
23927
|
})
|
|
23473
23928
|
}),
|
|
23474
|
-
|
|
23929
|
+
floatCard !== void 0 && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
|
|
23475
23930
|
className: PendingPanel_module_css_default.fileListFloat,
|
|
23476
23931
|
style: {
|
|
23477
|
-
left:
|
|
23478
|
-
top:
|
|
23479
|
-
width:
|
|
23480
|
-
height:
|
|
23932
|
+
left: floatCard.left,
|
|
23933
|
+
top: floatCard.top,
|
|
23934
|
+
width: floatCard.width,
|
|
23935
|
+
height: floatCard.height
|
|
23481
23936
|
},
|
|
23482
23937
|
"data-diff-floating-file-list": true,
|
|
23483
|
-
children:
|
|
23484
|
-
|
|
23485
|
-
|
|
23486
|
-
|
|
23487
|
-
|
|
23488
|
-
|
|
23938
|
+
children: fileListBody
|
|
23939
|
+
}), (0, react_jsx_runtime.jsx)("div", {
|
|
23940
|
+
className: PendingPanel_module_css_default.floatResizeHandle,
|
|
23941
|
+
style: {
|
|
23942
|
+
left: floatCard.left + floatCard.width - FLOAT_GRIP_OVERHANG_PX,
|
|
23943
|
+
top: floatCard.top,
|
|
23944
|
+
width: FLOAT_GRIP_WIDTH_PX,
|
|
23945
|
+
height: floatCard.height
|
|
23946
|
+
},
|
|
23947
|
+
"data-diff-float-resize": true,
|
|
23948
|
+
onPointerDown: startResize
|
|
23949
|
+
})] })
|
|
23489
23950
|
]
|
|
23490
23951
|
}),
|
|
23491
23952
|
blockPrompt !== null && promptFile !== void 0 && (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -25510,6 +25971,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25510
25971
|
"action.closeHint": "关闭(Esc / {chord})",
|
|
25511
25972
|
"action.closeHintEsc": "关闭(Esc)",
|
|
25512
25973
|
"action.summonHint": "待处理改动({chord})",
|
|
25974
|
+
"action.retry": "重试",
|
|
25975
|
+
"panel.crashed": "审阅面板出错了,详情见控制台",
|
|
25513
25976
|
"status.kept": "已保留",
|
|
25514
25977
|
"status.reverted": "已回退",
|
|
25515
25978
|
"status.missing": "该改动已不存在",
|
|
@@ -25692,6 +26155,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25692
26155
|
"action.closeHint": "Close (Esc / {chord})",
|
|
25693
26156
|
"action.closeHintEsc": "Close (Esc)",
|
|
25694
26157
|
"action.summonHint": "Pending changes ({chord})",
|
|
26158
|
+
"action.retry": "Retry",
|
|
26159
|
+
"panel.crashed": "The review panel hit an error; see the console for details",
|
|
25695
26160
|
"status.kept": "Kept",
|
|
25696
26161
|
"status.reverted": "Reverted",
|
|
25697
26162
|
"status.missing": "This change no longer exists",
|
|
@@ -25733,6 +26198,25 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25733
26198
|
//#endregion
|
|
25734
26199
|
//#region lib/types/client/index.js
|
|
25735
26200
|
/** Pending-edit review panel, browser half: footer action, pending list, and whole-file diff viewer. */
|
|
26201
|
+
/**
|
|
26202
|
+
* The footer seat's registrant: the panel inside its own error boundary, so a
|
|
26203
|
+
* crash there cannot retire the entry for the life of the page (see
|
|
26204
|
+
* {@link PanelBoundary}).
|
|
26205
|
+
* @param props - the seat's runtime props, this plugin's face, and the locale `t`.
|
|
26206
|
+
* @returns the boundary-wrapped panel.
|
|
26207
|
+
*/
|
|
26208
|
+
function PendingPanelEntry(props) {
|
|
26209
|
+
return (0, react.createElement)(PanelBoundary, { t: props.t }, (0, react.createElement)(PendingPanel, props));
|
|
26210
|
+
}
|
|
26211
|
+
/**
|
|
26212
|
+
* The header seat's registrant: the entry button inside the same boundary, so a
|
|
26213
|
+
* crash costs a visible note rather than the whole button for the page's life.
|
|
26214
|
+
* @param props - the seat's runtime props, the face's hooks, and the locale `t`.
|
|
26215
|
+
* @returns the boundary-wrapped entry.
|
|
26216
|
+
*/
|
|
26217
|
+
function HeaderEntry(props) {
|
|
26218
|
+
return (0, react.createElement)(PanelBoundary, { t: props.t }, (0, react.createElement)(DiffApprovalHeaderEntry, props));
|
|
26219
|
+
}
|
|
25736
26220
|
/** Required services: locale, slots, the wire channel, the current session, and
|
|
25737
26221
|
* the layout controller (this plugin collapses the sidebar before its modal opens). */
|
|
25738
26222
|
const inject = [
|
|
@@ -25743,6 +26227,22 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25743
26227
|
"layout"
|
|
25744
26228
|
];
|
|
25745
26229
|
/**
|
|
26230
|
+
* Fill one slot, with the failure contained: a registration runs inside the
|
|
26231
|
+
* client's boot (or, for a seat declared later, inside the slot machinery), so a
|
|
26232
|
+
* throw here would take down more than this panel. A refused seat costs that one
|
|
26233
|
+
* surface, and the reason goes to the console rather than being swallowed.
|
|
26234
|
+
* @param slots - the client slot service.
|
|
26235
|
+
* @param name - the SlotMap key to fill.
|
|
26236
|
+
* @param register - the registration, run when the seat's declaration is live.
|
|
26237
|
+
*/
|
|
26238
|
+
function seat(slots, name, register) {
|
|
26239
|
+
try {
|
|
26240
|
+
slots.inject(name, () => register());
|
|
26241
|
+
} catch (error) {
|
|
26242
|
+
console.error(`diff-approval could not fill ${name}:`, error);
|
|
26243
|
+
}
|
|
26244
|
+
}
|
|
26245
|
+
/**
|
|
25746
26246
|
* The dsh web-react renderer gives `div[data-slot="sidebar.footer.action"]` an
|
|
25747
26247
|
* inline `display: contents`, so every plugin's footer entry root participates
|
|
25748
26248
|
* directly in the `.footerActions` flex row — several plugins (e.g. this one
|
|
@@ -25872,17 +26372,18 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25872
26372
|
onRevertAll: (sessionId) => store.revertAll(sessionId),
|
|
25873
26373
|
onAckRedoCleared: () => store.clearRedoCleared(),
|
|
25874
26374
|
onPasteReference: (sessionId, reference) => {
|
|
25875
|
-
|
|
25876
|
-
|
|
26375
|
+
pasteReferenceIntoComposer((text) => {
|
|
26376
|
+
conversationAccess(ctx, () => sessionId).appendDraft(text);
|
|
26377
|
+
}, reference);
|
|
25877
26378
|
},
|
|
25878
26379
|
collapseSidebar
|
|
25879
26380
|
});
|
|
25880
|
-
ctx.slots
|
|
26381
|
+
seat(ctx.slots, "sidebar.footer.action", () => ctx.slots.register({
|
|
25881
26382
|
name: "sidebar.footer.action",
|
|
25882
26383
|
id: "diff-approval-panel",
|
|
25883
26384
|
locale: NS,
|
|
25884
26385
|
inject: buildFace
|
|
25885
|
-
},
|
|
26386
|
+
}, PendingPanelEntry));
|
|
25886
26387
|
const looseSlots = ctx.slots;
|
|
25887
26388
|
try {
|
|
25888
26389
|
looseSlots.inject("conversation.session.header.utilities", () => looseSlots.register({
|
|
@@ -25891,7 +26392,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25891
26392
|
order: -5,
|
|
25892
26393
|
locale: NS,
|
|
25893
26394
|
inject: () => ({ ...buildFace() })
|
|
25894
|
-
},
|
|
26395
|
+
}, HeaderEntry));
|
|
25895
26396
|
} catch {}
|
|
25896
26397
|
try {
|
|
25897
26398
|
looseSlots.inject("sidebar.right.pane.tab", () => looseSlots.register({
|
|
@@ -25917,7 +26418,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
|
|
|
25917
26418
|
guideDescription: () => t("panel.dockGuide")
|
|
25918
26419
|
}, (sidebar, reason) => dock.attach(sidebar, reason));
|
|
25919
26420
|
} catch {}
|
|
25920
|
-
ctx.slots
|
|
26421
|
+
seat(ctx.slots, "settings.section", () => ctx.slots.register({
|
|
25921
26422
|
name: "settings.section",
|
|
25922
26423
|
id: "diff-approval",
|
|
25923
26424
|
order: 100,
|