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
- "actionQuietDisabled": "F1KBNa_actionQuietDisabled",
35
- "vSpacer": "F1KBNa_vSpacer",
36
- "presentationHost": "F1KBNa_presentationHost",
34
+ "searchToggle": "F1KBNa_searchToggle",
35
+ "diffPreviewScroll": "F1KBNa_diffPreviewScroll",
36
+ "diffPath": "F1KBNa_diffPath",
37
+ "settingsRow": "F1KBNa_settingsRow",
37
38
  "panel": "F1KBNa_panel",
38
- "note": "F1KBNa_note",
39
- "code": "F1KBNa_code",
40
- "settingsRowText": "F1KBNa_settingsRowText",
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
- "markerDel": "F1KBNa_markerDel",
46
- "dockHost": "F1KBNa_dockHost",
47
- "settingsRowTitle": "F1KBNa_settingsRowTitle",
48
- "toggleThumb": "F1KBNa_toggleThumb",
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
- "wrap": "F1KBNa_wrap",
63
- "settingsGroupHeader": "F1KBNa_settingsGroupHeader",
64
- "emptyState": "F1KBNa_emptyState",
65
- "addButton": "F1KBNa_addButton",
66
- "statusBar": "F1KBNa_statusBar",
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
- "fileListFloat": "F1KBNa_fileListFloat",
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
- "blockPosition": "F1KBNa_blockPosition",
67
+ "rowPath": "F1KBNa_rowPath",
68
+ "searchMatch": "F1KBNa_searchMatch",
98
69
  "chipLabel": "F1KBNa_chipLabel",
99
- "coverButton": "F1KBNa_coverButton",
100
- "expand": "F1KBNa_expand",
101
- "diffPreviewTitle": "F1KBNa_diffPreviewTitle",
102
- "settingsPage": "F1KBNa_settingsPage",
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
- "fileListKnob": "F1KBNa_fileListKnob",
105
- "bulkActions": "F1KBNa_bulkActions",
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
- "langLabel": "F1KBNa_langLabel",
111
- "markerAdd": "F1KBNa_markerAdd",
112
- "chip": "F1KBNa_chip",
113
- "actionError": "F1KBNa_actionError",
114
- "addCount": "F1KBNa_addCount",
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
- "notice": "F1KBNa_notice",
118
- "coverNotice": "F1KBNa_coverNotice",
119
- "colorPickerInputRow": "F1KBNa_colorPickerInputRow",
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
- "badge": "F1KBNa_badge",
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
- "expandExpanded": "F1KBNa_expandExpanded",
139
- "diffPreview": "F1KBNa_diffPreview",
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
- "searchInput": "F1KBNa_searchInput",
142
- "subline": "F1KBNa_subline",
143
- "colorValue": "F1KBNa_colorValue",
144
- "splitHScroll": "F1KBNa_splitHScroll",
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
- "confirmBackdrop": "F1KBNa_confirmBackdrop",
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
- "badgeLabel": "F1KBNa_badgeLabel",
169
- "settingsRowDesc": "F1KBNa_settingsRowDesc",
170
- "splitDivider": "F1KBNa_splitDivider",
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
- "delCount": "F1KBNa_delCount",
195
- "pickerForm": "F1KBNa_pickerForm",
196
- "rowPath": "F1KBNa_rowPath",
197
- "kindTag": "F1KBNa_kindTag",
198
- "chipPresentation": "F1KBNa_chipPresentation",
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
- "colorPickerPopover": "F1KBNa_colorPickerPopover",
211
- "floatResizeHandle": "F1KBNa_floatResizeHandle",
212
- "settingsReset": "F1KBNa_settingsReset",
213
- "fileListGrow": "F1KBNa_fileListGrow",
190
+ "headerActions": "F1KBNa_headerActions",
191
+ "colorHue": "F1KBNa_colorHue",
214
192
  "diffActions": "F1KBNa_diffActions",
215
- "action": "F1KBNa_action",
216
- "colorPickerTrigger": "F1KBNa_colorPickerTrigger",
217
- "confirmCard": "F1KBNa_confirmCard",
218
- "diffFlashFade": "F1KBNa_diffFlashFade",
219
- "coverPopover": "F1KBNa_coverPopover",
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
- "divider": "F1KBNa_divider",
222
- "pickerClose": "F1KBNa_pickerClose",
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
- "rail": "F1KBNa_rail",
225
- "treeCaret": "F1KBNa_treeCaret",
226
- "settingsGroupDesc": "F1KBNa_settingsGroupDesc",
227
- "rowHead": "F1KBNa_rowHead",
228
- "settingsSelector": "F1KBNa_settingsSelector"
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 unmounting the app's tree and with it
18702
- * the footer entry that opened this tab. */
18703
- var DockBoundary = class extends react.Component {
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)(DockBoundary, { children: (0, react_jsx_runtime.jsx)(PendingPanel, {
18727
- ...panelProps,
18776
+ }), host !== null && (0, react_jsx_runtime.jsx)(PanelBoundary, {
18728
18777
  t,
18729
- docked: true,
18730
- dockHost: host
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
- setFocus(0);
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
- }, [file.id]);
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
- setSelected(entry.id);
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
- if (!open) return;
22853
- if (selected !== "" && files.some((file) => file.id === selected)) return;
22854
- const next = files[0];
22855
- if (next !== void 0 && next.id !== selected) setSelected(next.id);
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. A remembered dock
22884
- * in a build without a right sidebar falls back to the floating panel instead
22885
- * of doing nothing.
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) try {
22889
- onOpenDock();
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
- } catch {}
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 setSelected(id);
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 setSelected(id);
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 setSelected(id);
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) setSelected(next.id);
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
- /** Drag the list/detail divider; width follows the pointer within its bounds. */
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
- resizeDrag.current = {
23257
- startX: event.clientX,
23258
- startWidth: listWidth
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 start = resizeDrag.current;
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 onUp = () => {
23269
- resizeDrag.current = null;
23720
+ const finish = () => {
23270
23721
  document.body.style.userSelect = "";
23271
23722
  document.body.style.cursor = "";
23272
- window.removeEventListener("mousemove", onMove);
23273
- window.removeEventListener("mouseup", onUp);
23723
+ window.removeEventListener("pointermove", onMove);
23724
+ window.removeEventListener("pointerup", finish);
23725
+ window.removeEventListener("pointercancel", finish);
23274
23726
  };
23275
- window.addEventListener("mousemove", onMove);
23276
- window.addEventListener("mouseup", onUp);
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
- onMouseDown: startResize
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
- floatMode && floatOpen && files.length > 0 && floatBox !== null && (0, react_jsx_runtime.jsxs)("div", {
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: floatBox.left + FLOAT_LIST_MARGIN_PX,
23478
- top: floatBox.top + FLOAT_LIST_MARGIN_PX,
23479
- width: Math.min(listWidth, Math.max(0, floatBox.width - 24)),
23480
- height: Math.max(0, floatBox.height - 24)
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: [fileListBody, (0, react_jsx_runtime.jsx)("div", {
23484
- className: PendingPanel_module_css_default.floatResizeHandle,
23485
- "data-diff-float-resize": true,
23486
- onMouseDown: startResize
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
- conversationAccess(ctx, () => sessionId).appendDraft(reference);
25876
- document.querySelector("[data-composer-input]")?.focus();
26375
+ pasteReferenceIntoComposer((text) => {
26376
+ conversationAccess(ctx, () => sessionId).appendDraft(text);
26377
+ }, reference);
25877
26378
  },
25878
26379
  collapseSidebar
25879
26380
  });
25880
- ctx.slots.inject("sidebar.footer.action", () => ctx.slots.register({
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
- }, PendingPanel));
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
- }, DiffApprovalHeaderEntry));
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.inject("settings.section", () => ctx.slots.register({
26421
+ seat(ctx.slots, "settings.section", () => ctx.slots.register({
25921
26422
  name: "settings.section",
25922
26423
  id: "diff-approval",
25923
26424
  order: 100,