dsh-diff-approval 0.27.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +4 -0
  2. package/README.zh.md +4 -0
  3. package/assets/fonts/FONTLOG.md +55 -0
  4. package/assets/fonts/OFL.txt +95 -0
  5. package/assets/fonts/README.md +123 -0
  6. package/assets/fonts/manifest.json +1784 -0
  7. package/assets/fonts/regular-cjk-punctuation.woff2 +0 -0
  8. package/assets/fonts/regular-hanzi-000.woff2 +0 -0
  9. package/assets/fonts/regular-hanzi-001.woff2 +0 -0
  10. package/assets/fonts/regular-hanzi-002.woff2 +0 -0
  11. package/assets/fonts/regular-hanzi-003.woff2 +0 -0
  12. package/assets/fonts/regular-hanzi-004.woff2 +0 -0
  13. package/assets/fonts/regular-hanzi-005.woff2 +0 -0
  14. package/assets/fonts/regular-hanzi-006.woff2 +0 -0
  15. package/assets/fonts/regular-hanzi-007.woff2 +0 -0
  16. package/assets/fonts/regular-hanzi-008.woff2 +0 -0
  17. package/assets/fonts/regular-hanzi-009.woff2 +0 -0
  18. package/assets/fonts/regular-hanzi-010.woff2 +0 -0
  19. package/assets/fonts/regular-hanzi-011.woff2 +0 -0
  20. package/assets/fonts/regular-hanzi-012.woff2 +0 -0
  21. package/assets/fonts/regular-hanzi-013.woff2 +0 -0
  22. package/assets/fonts/regular-hanzi-014.woff2 +0 -0
  23. package/assets/fonts/regular-hanzi-015.woff2 +0 -0
  24. package/assets/fonts/regular-hanzi-016.woff2 +0 -0
  25. package/assets/fonts/regular-hanzi-017.woff2 +0 -0
  26. package/assets/fonts/regular-hanzi-018.woff2 +0 -0
  27. package/assets/fonts/regular-hanzi-019.woff2 +0 -0
  28. package/assets/fonts/regular-hanzi-020.woff2 +0 -0
  29. package/assets/fonts/regular-hanzi-021.woff2 +0 -0
  30. package/assets/fonts/regular-hanzi-022.woff2 +0 -0
  31. package/assets/fonts/regular-hanzi-023.woff2 +0 -0
  32. package/assets/fonts/regular-hanzi-024.woff2 +0 -0
  33. package/assets/fonts/regular-hanzi-025.woff2 +0 -0
  34. package/assets/fonts/regular-hanzi-026.woff2 +0 -0
  35. package/assets/fonts/regular-hanzi-027.woff2 +0 -0
  36. package/assets/fonts/regular-hanzi-028.woff2 +0 -0
  37. package/assets/fonts/regular-hanzi-029.woff2 +0 -0
  38. package/assets/fonts/regular-hanzi-030.woff2 +0 -0
  39. package/assets/fonts/regular-hanzi-031.woff2 +0 -0
  40. package/assets/fonts/regular-hanzi-032.woff2 +0 -0
  41. package/assets/fonts/regular-hanzi-033.woff2 +0 -0
  42. package/assets/fonts/regular-hanzi-034.woff2 +0 -0
  43. package/assets/fonts/regular-hanzi-035.woff2 +0 -0
  44. package/assets/fonts/regular-hanzi-036.woff2 +0 -0
  45. package/assets/fonts/regular-hanzi-037.woff2 +0 -0
  46. package/assets/fonts/regular-hanzi-038.woff2 +0 -0
  47. package/assets/fonts/regular-hanzi-039.woff2 +0 -0
  48. package/assets/fonts/regular-hanzi-040.woff2 +0 -0
  49. package/assets/fonts/regular-hanzi-041.woff2 +0 -0
  50. package/assets/fonts/regular-hanzi-042.woff2 +0 -0
  51. package/assets/fonts/regular-hanzi-043.woff2 +0 -0
  52. package/assets/fonts/regular-hanzi-044.woff2 +0 -0
  53. package/assets/fonts/regular-hanzi-045.woff2 +0 -0
  54. package/assets/fonts/regular-hanzi-046.woff2 +0 -0
  55. package/assets/fonts/regular-hanzi-047.woff2 +0 -0
  56. package/assets/fonts/regular-hanzi-048.woff2 +0 -0
  57. package/assets/fonts/regular-hanzi-049.woff2 +0 -0
  58. package/assets/fonts/regular-hanzi-050.woff2 +0 -0
  59. package/assets/fonts/regular-hanzi-051.woff2 +0 -0
  60. package/assets/fonts/regular-hanzi-052.woff2 +0 -0
  61. package/assets/fonts/regular-hanzi-053.woff2 +0 -0
  62. package/assets/fonts/regular-hanzi-054.woff2 +0 -0
  63. package/assets/fonts/regular-hanzi-055.woff2 +0 -0
  64. package/assets/fonts/regular-hanzi-056.woff2 +0 -0
  65. package/assets/fonts/regular-hanzi-057.woff2 +0 -0
  66. package/assets/fonts/regular-hanzi-058.woff2 +0 -0
  67. package/assets/fonts/regular-hanzi-059.woff2 +0 -0
  68. package/assets/fonts/regular-hanzi-060.woff2 +0 -0
  69. package/assets/fonts/regular-hanzi-061.woff2 +0 -0
  70. package/assets/fonts/regular-hanzi-062.woff2 +0 -0
  71. package/assets/fonts/regular-hanzi-063.woff2 +0 -0
  72. package/assets/fonts/regular-hanzi-064.woff2 +0 -0
  73. package/assets/fonts/regular-latin.woff2 +0 -0
  74. package/assets/fonts/regular-punctuation.woff2 +0 -0
  75. package/assets/fonts/regular-symbols.woff2 +0 -0
  76. package/assets/fonts/semibold-cjk-punctuation.woff2 +0 -0
  77. package/assets/fonts/semibold-hanzi-000.woff2 +0 -0
  78. package/assets/fonts/semibold-hanzi-001.woff2 +0 -0
  79. package/assets/fonts/semibold-hanzi-002.woff2 +0 -0
  80. package/assets/fonts/semibold-hanzi-003.woff2 +0 -0
  81. package/assets/fonts/semibold-hanzi-004.woff2 +0 -0
  82. package/assets/fonts/semibold-hanzi-005.woff2 +0 -0
  83. package/assets/fonts/semibold-hanzi-006.woff2 +0 -0
  84. package/assets/fonts/semibold-hanzi-007.woff2 +0 -0
  85. package/assets/fonts/semibold-hanzi-008.woff2 +0 -0
  86. package/assets/fonts/semibold-hanzi-009.woff2 +0 -0
  87. package/assets/fonts/semibold-hanzi-010.woff2 +0 -0
  88. package/assets/fonts/semibold-hanzi-011.woff2 +0 -0
  89. package/assets/fonts/semibold-hanzi-012.woff2 +0 -0
  90. package/assets/fonts/semibold-hanzi-013.woff2 +0 -0
  91. package/assets/fonts/semibold-hanzi-014.woff2 +0 -0
  92. package/assets/fonts/semibold-hanzi-015.woff2 +0 -0
  93. package/assets/fonts/semibold-hanzi-016.woff2 +0 -0
  94. package/assets/fonts/semibold-hanzi-017.woff2 +0 -0
  95. package/assets/fonts/semibold-hanzi-018.woff2 +0 -0
  96. package/assets/fonts/semibold-hanzi-019.woff2 +0 -0
  97. package/assets/fonts/semibold-hanzi-020.woff2 +0 -0
  98. package/assets/fonts/semibold-hanzi-021.woff2 +0 -0
  99. package/assets/fonts/semibold-hanzi-022.woff2 +0 -0
  100. package/assets/fonts/semibold-hanzi-023.woff2 +0 -0
  101. package/assets/fonts/semibold-hanzi-024.woff2 +0 -0
  102. package/assets/fonts/semibold-hanzi-025.woff2 +0 -0
  103. package/assets/fonts/semibold-hanzi-026.woff2 +0 -0
  104. package/assets/fonts/semibold-hanzi-027.woff2 +0 -0
  105. package/assets/fonts/semibold-hanzi-028.woff2 +0 -0
  106. package/assets/fonts/semibold-hanzi-029.woff2 +0 -0
  107. package/assets/fonts/semibold-hanzi-030.woff2 +0 -0
  108. package/assets/fonts/semibold-hanzi-031.woff2 +0 -0
  109. package/assets/fonts/semibold-hanzi-032.woff2 +0 -0
  110. package/assets/fonts/semibold-hanzi-033.woff2 +0 -0
  111. package/assets/fonts/semibold-hanzi-034.woff2 +0 -0
  112. package/assets/fonts/semibold-hanzi-035.woff2 +0 -0
  113. package/assets/fonts/semibold-hanzi-036.woff2 +0 -0
  114. package/assets/fonts/semibold-hanzi-037.woff2 +0 -0
  115. package/assets/fonts/semibold-hanzi-038.woff2 +0 -0
  116. package/assets/fonts/semibold-hanzi-039.woff2 +0 -0
  117. package/assets/fonts/semibold-hanzi-040.woff2 +0 -0
  118. package/assets/fonts/semibold-hanzi-041.woff2 +0 -0
  119. package/assets/fonts/semibold-hanzi-042.woff2 +0 -0
  120. package/assets/fonts/semibold-hanzi-043.woff2 +0 -0
  121. package/assets/fonts/semibold-hanzi-044.woff2 +0 -0
  122. package/assets/fonts/semibold-hanzi-045.woff2 +0 -0
  123. package/assets/fonts/semibold-hanzi-046.woff2 +0 -0
  124. package/assets/fonts/semibold-hanzi-047.woff2 +0 -0
  125. package/assets/fonts/semibold-hanzi-048.woff2 +0 -0
  126. package/assets/fonts/semibold-hanzi-049.woff2 +0 -0
  127. package/assets/fonts/semibold-hanzi-050.woff2 +0 -0
  128. package/assets/fonts/semibold-hanzi-051.woff2 +0 -0
  129. package/assets/fonts/semibold-hanzi-052.woff2 +0 -0
  130. package/assets/fonts/semibold-hanzi-053.woff2 +0 -0
  131. package/assets/fonts/semibold-hanzi-054.woff2 +0 -0
  132. package/assets/fonts/semibold-hanzi-055.woff2 +0 -0
  133. package/assets/fonts/semibold-hanzi-056.woff2 +0 -0
  134. package/assets/fonts/semibold-hanzi-057.woff2 +0 -0
  135. package/assets/fonts/semibold-hanzi-058.woff2 +0 -0
  136. package/assets/fonts/semibold-hanzi-059.woff2 +0 -0
  137. package/assets/fonts/semibold-hanzi-060.woff2 +0 -0
  138. package/assets/fonts/semibold-hanzi-061.woff2 +0 -0
  139. package/assets/fonts/semibold-hanzi-062.woff2 +0 -0
  140. package/assets/fonts/semibold-hanzi-063.woff2 +0 -0
  141. package/assets/fonts/semibold-hanzi-064.woff2 +0 -0
  142. package/assets/fonts/semibold-latin.woff2 +0 -0
  143. package/assets/fonts/semibold-punctuation.woff2 +0 -0
  144. package/assets/fonts/semibold-symbols.woff2 +0 -0
  145. package/lib/client.js +1026 -437
  146. package/lib/index.js +132 -3
  147. package/lib/types/client/PendingPanel.d.ts +10 -0
  148. package/lib/types/client/code-font.d.ts +64 -0
  149. package/lib/types/client/locales.d.ts +14 -2
  150. package/lib/types/client/panel-memory.d.ts +12 -0
  151. package/lib/types/client/settings.d.ts +15 -0
  152. package/lib/types/client/slots.d.ts +6 -0
  153. package/lib/types/comment-skill.d.ts +1 -1
  154. package/lib/types/font-slices.d.ts +58 -0
  155. package/lib/types/index.d.ts +20 -0
  156. package/lib/types/types.d.ts +6 -0
  157. package/package.json +8 -1
package/lib/client.js CHANGED
@@ -21,7 +21,7 @@ window.__ModuleLoader__.load({
21
21
  let react_dom = require("react-dom");
22
22
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
23
23
  //#region \0dsh-css:/home/runner/work/dsh-diff-approval/dsh-diff-approval/src/client/PendingPanel.module.css.mjs
24
- const css = ".F1KBNa_panelFailure{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);border-radius:8px;align-items:center;gap:8px;padding:8px 10px;font-size:12px;line-height:16px;display:flex}.F1KBNa_panelFailureText{min-width:0}.F1KBNa_panelFailureRetry{border:1px solid var(--dsw-alias-border-l2);color:inherit;font:inherit;cursor:pointer;background:0 0;border-radius:6px;flex:none;margin-left:auto;padding:2px 8px}.F1KBNa_panelFailureRetry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_layer{box-sizing:border-box;flex:none;align-items:center;width:calc(100% + 4px);height:42px;margin:4px -2px;display:flex;position:relative}.F1KBNa_headerEntry{box-sizing:border-box;width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:28px;flex:none;justify-content:center;align-items:center;padding:6px;display:inline-flex;position:relative}.F1KBNa_headerEntry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_headerEntry[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.F1KBNa_headerEntry:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_headerEntryCount{box-sizing:border-box;background:var(--dsw-alias-button-primary-fill);min-width:14px;height:14px;color:var(--dsw-alias-label-primary-foreground);text-align:center;font-variant-numeric:tabular-nums;pointer-events:none;border-radius:7px;padding:0 3px;font-size:10px;line-height:14px;position:absolute;top:-1px;right:-1px}.F1KBNa_headerEntry svg{display:block}.F1KBNa_footerButtons{align-items:center;width:100%;display:flex}.F1KBNa_badge{box-sizing:border-box;width:100%;height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}.F1KBNa_badge:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_badge[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_badge:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_badgeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.F1KBNa_badgeCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;font-size:12px;line-height:16px}.F1KBNa_layer.F1KBNa_rail{width:36px;height:36px;margin:8px 0 10px}.F1KBNa_rail .F1KBNa_badge{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;padding:0}.F1KBNa_rail .F1KBNa_badgeLabel{display:none}.F1KBNa_rail .F1KBNa_badgeCount{box-sizing:border-box;background:var(--dsw-alias-state-business-primary);min-width:18px;height:18px;color:var(--dsw-alias-label-primary-foreground);font-variant-numeric:tabular-nums;border-radius:9px;justify-content:center;align-items:center;padding:0 4px;font-size:11px;line-height:18px;display:flex;position:absolute;top:-3px;right:-7px}.F1KBNa_coverBackdrop{z-index:29;background:var(--dsw-specific-sidebar-fill);position:fixed;inset:0}.F1KBNa_panel{z-index:30;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:auto;max-width:none;box-shadow:var(--dsw-shadow-lv2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);-webkit-user-select:none;user-select:none;border-radius:12px;flex-direction:column;display:flex;position:fixed;inset:8px 8px 128px;overflow:hidden}.F1KBNa_panel .F1KBNa_code,.F1KBNa_panel .F1KBNa_mdPreviewBody,.F1KBNa_panel .F1KBNa_discussionUser,.F1KBNa_panel .F1KBNa_discussionAnswer,.F1KBNa_panel .F1KBNa_quoteText,.F1KBNa_panel .F1KBNa_diffPath,.F1KBNa_panel .F1KBNa_rowPath,.F1KBNa_panel input,.F1KBNa_panel textarea,.F1KBNa_panel [contenteditable]{-webkit-user-select:text;user-select:text}.F1KBNa_panelDocked{width:100%;max-width:none;height:100%;box-shadow:none;border:none;border-radius:0;position:static;inset:auto}.F1KBNa_dockHost{flex-direction:column;min-height:0;display:flex;position:absolute;inset:0}.F1KBNa_header{box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:10px 12px;display:flex}.F1KBNa_headerActions{align-items:center;gap:2px;display:flex}.F1KBNa_settingsPage{padding:8px 12px}.F1KBNa_settingsGroup{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupHeader{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:8px;padding:16px 0;display:flex}.F1KBNa_settingsGroupText{text-align:left;flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.F1KBNa_settingsGroupTitle{font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsGroupDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsGroupChevron{margin-left:auto;transition:transform .15s}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupChevron{transform:rotate(180deg)}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupHeader{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupBody{flex-direction:column;display:flex}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow{padding-left:16px}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow:last-child,.F1KBNa_settingsPage>.F1KBNa_settingsRow:last-child{border-bottom:none}.F1KBNa_settingsRow{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.F1KBNa_settingsRowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.F1KBNa_settingsRowTitle{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsRowDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsSelector{background:var(--dsw-alias-bg-module-platform);min-width:72px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;justify-content:center;align-items:center;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.F1KBNa_settingsSelector:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_settingsSelector[data-recording]{box-shadow:inset 0 0 0 1px var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-secondary)}.F1KBNa_settingsReset{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;margin-left:6px;padding:0;display:inline-flex}.F1KBNa_settingsReset:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_settingsReset:disabled{opacity:.4;cursor:default}.F1KBNa_colorPicker{position:relative}.F1KBNa_colorPickerTrigger{background:var(--dsw-alias-bg-module-platform);width:120px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_colorPickerTrigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_colorSwatch{border:1px solid var(--dsw-alias-border-l2);border-radius:50%;flex:none;width:24px;height:24px}.F1KBNa_colorValue{text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;flex:1;min-width:0;overflow:hidden}.F1KBNa_colorPickerChevron{flex:none}.F1KBNa_colorBackdrop{z-index:40;position:fixed;inset:0}.F1KBNa_colorPickerPopover{z-index:41;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:10px;padding:10px;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_colorPickerPanel{flex-direction:column;gap:8px;display:flex}.F1KBNa_colorPickerInputRow{align-items:center;gap:8px;display:flex}.F1KBNa_colorPickerPreview{border:1px solid var(--dsw-alias-border-l2);border-radius:6px;flex:none;width:22px;height:22px}.F1KBNa_colorPickerInput{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-module-platform);min-width:0;height:30px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;flex:1;padding:0 8px;font-size:12px;line-height:28px}.F1KBNa_colorPickerInput:focus{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-1px}.F1KBNa_colorSv{border:1px solid var(--dsw-alias-border-l1);cursor:crosshair;touch-action:none;border-radius:8px;height:140px;position:relative}.F1KBNa_colorSvCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:14px;height:14px;position:absolute;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_colorHue{border:1px solid var(--dsw-alias-border-l1);cursor:pointer;touch-action:none;border-radius:7px;height:14px;position:relative}.F1KBNa_colorHueCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:16px;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_diffPreview{z-index:2;border:1px solid var(--dsw-alias-border-l1);font:var(--dsw-font-markdown-code-block);background:var(--dsw-alias-markdown-code-block);border-radius:8px;margin:16px 0 8px;padding:8px;position:sticky;top:0;overflow:hidden}.F1KBNa_diffPreviewTitle{color:var(--dsw-alias-label-tertiary);margin-bottom:6px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_diffPreviewScroll{height:132px;overflow-y:auto}.F1KBNa_mdPreviewWrap{isolation:isolate;flex:1;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_mdPreviewBody{overscroll-behavior:none;min-width:0;min-height:0;color:var(--dsw-alias-label-primary);flex:1;padding:12px 16px;position:relative;overflow:auto}.F1KBNa_mdPreviewContent{width:100%;min-width:0;margin:0 auto}.F1KBNa_mdPreviewSingle{display:block}.F1KBNa_mdPreviewDouble{display:flex}.F1KBNa_mdPreviewBody .mdBlock{border-radius:4px;margin-bottom:12px;padding:2px 6px}.F1KBNa_mdPreviewBody .mdAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 10%, transparent)}.F1KBNa_mdPreviewBody .mdDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 12%, transparent)}.F1KBNa_mdPreviewBody .mdWordDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdWordAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdDouble{flex-direction:column;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleRow{align-items:flex-start;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleCol{flex:1;min-width:0}.F1KBNa_mdPreviewBody .mdDoubleRule{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:0 12px}.F1KBNa_mdPreviewFallback{font-family:var(--dsw-font-markdown-code-block);color:var(--dsw-alias-label-tertiary);padding:12px 16px;font-size:12px;line-height:18px}.F1KBNa_mdPreviewBody{word-break:break-word;font-size:13px;line-height:20px}.F1KBNa_mdPreviewBody>:first-child{margin-top:0}.F1KBNa_mdPreviewBody>:last-child{margin-bottom:0}.F1KBNa_mdPreviewBody h1,.F1KBNa_mdPreviewBody h2,.F1KBNa_mdPreviewBody h3,.F1KBNa_mdPreviewBody h4,.F1KBNa_mdPreviewBody h5,.F1KBNa_mdPreviewBody h6{margin:16px 0 8px;font-weight:600;line-height:1.3}.F1KBNa_mdPreviewBody h1{font-size:22px}.F1KBNa_mdPreviewBody h2{font-size:19px}.F1KBNa_mdPreviewBody h3{font-size:16px}.F1KBNa_mdPreviewBody h4{font-size:15px}.F1KBNa_mdPreviewBody h5{font-size:14px}.F1KBNa_mdPreviewBody h6{font-size:13px}.F1KBNa_mdPreviewBody p{margin:8px 0}.F1KBNa_mdPreviewBody ul,.F1KBNa_mdPreviewBody ol{margin:8px 0;padding-left:22px}.F1KBNa_mdPreviewBody li{margin:2px 0}.F1KBNa_mdPreviewBody a{color:var(--dsw-alias-state-business-primary);text-decoration:none}.F1KBNa_mdPreviewBody a:hover{text-decoration:underline}.F1KBNa_mdPreviewBody code{font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:4px;padding:1px 5px;font-size:12.5px}.F1KBNa_mdPreviewBody pre{overscroll-behavior-x:none;border:1px solid var(--dsw-alias-border-l1);font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:8px;margin:8px 0;padding:10px 12px;font-size:12.5px;line-height:18px;overflow:auto}.F1KBNa_mdPreviewBody pre code{background:0 0;padding:0}.F1KBNa_mdPreviewBody blockquote{border-left:3px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);margin:8px 0;padding:0 12px}.F1KBNa_mdPreviewBody hr{background:var(--dsw-alias-border-l1);border:none;height:1px;margin:16px 0}.F1KBNa_mdPreviewBody table{border-collapse:collapse;margin:8px 0}.F1KBNa_mdPreviewBody th,.F1KBNa_mdPreviewBody td{border:1px solid var(--dsw-alias-border-l1);padding:4px 10px}.F1KBNa_mdPreviewBody img{max-width:100%}.F1KBNa_mdPreviewBody .mdImageFallback{border:1px dashed var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-markdown-code-block) 45%, transparent);width:100%;min-height:120px;color:var(--dsw-alias-label-secondary);font-family:var(--dsw-font-markdown-code-block);text-align:center;white-space:pre-wrap;word-break:break-all;border-radius:4px;justify-content:center;align-items:center;margin:0 auto;padding:8px 12px;font-size:12px;line-height:16px;display:flex}.F1KBNa_toggle{border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:18px;flex:none;width:60px;height:36px;padding:0;position:relative}.F1KBNa_toggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_toggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.F1KBNa_toggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleOn:hover{background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleThumb{background:var(--dsw-alias-label-primary);border-radius:50%;width:28px;height:28px;transition:left .12s;position:absolute;top:3px;left:3px}.F1KBNa_toggleOn .F1KBNa_toggleThumb{background:#fff;left:27px}.F1KBNa_stepper{align-items:center;gap:6px;display:inline-flex}.F1KBNa_stepperButton{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);width:32px;height:32px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;padding:0;position:relative}.F1KBNa_stepperButton:before,.F1KBNa_stepperButton:after{content:\"\";background:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_stepperButton:before{width:10px;height:1px}.F1KBNa_stepperButton:after{width:1px;height:10px;display:none}.F1KBNa_stepperButtonUp:after{display:block}.F1KBNa_stepperButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_stepperButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_stepperValue{text-align:center;min-width:2ch;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:14px;line-height:22px}.F1KBNa_states{flex-direction:column;flex:1;min-height:0;padding:4px 12px 12px;display:flex;overflow-y:auto}.F1KBNa_split{flex:1;align-items:stretch;min-height:0;display:flex;position:relative}.F1KBNa_fileListKnob{z-index:39;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;box-shadow:var(--dsw-elevation-prominent);border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute}.F1KBNa_fileListKnob[data-open]{box-shadow:none;opacity:0}.F1KBNa_fileListKnob:not([data-open]){animation:.32s ease-in-out .5s both F1KBNa_fileListKnobIn}@keyframes F1KBNa_fileListKnobIn{0%{opacity:0}to{opacity:1}}.F1KBNa_fileListKnob:hover,.F1KBNa_fileListKnob:focus-visible{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-interactive-bg-hover), var(--dsw-alias-interactive-bg-hover))}.F1KBNa_fileListFloat{z-index:40;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);box-shadow:none;transform-origin:0 0;border-radius:12px;flex-direction:column;padding:6px 0 10px 8px;display:flex;position:absolute;overflow:hidden}.F1KBNa_fileListFloatClosing{pointer-events:none;animation:.14s ease-in forwards F1KBNa_fileListShrink}@keyframes F1KBNa_fileListShrink{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.96)}}.F1KBNa_fileList{box-sizing:border-box;border-right:1px solid var(--dsw-alias-border-l2);flex-direction:column;flex:none;width:260px;min-height:0;padding:4px 8px 12px;display:flex}.F1KBNa_listScroll{flex:1;min-height:0;overflow-y:scroll}.F1KBNa_bulkActions{flex:none;gap:6px;padding:8px 8px 0 0;display:flex}.F1KBNa_bulkActions .F1KBNa_action{text-align:center;flex:auto}.F1KBNa_addPath{justify-content:center;align-items:center;gap:4px;display:inline-flex}.F1KBNa_resizeHandle{cursor:col-resize;touch-action:none;background:0 0;flex:none;width:5px;margin:0 -2px}.F1KBNa_resizeHandle:hover{background:var(--dsw-alias-border-l2)}.F1KBNa_floatResizeHandle{z-index:41;cursor:col-resize;-webkit-user-select:none;user-select:none;touch-action:none;background:0 0;border-radius:4px;position:absolute}.F1KBNa_floatResizeHandle:hover{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-border-l2), var(--dsw-alias-border-l2))}.F1KBNa_detail{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.F1KBNa_detailEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;flex:1;justify-content:center;align-items:center;margin:0;padding:24px;font-size:12px;line-height:18px;display:flex}.F1KBNa_confirmBackdrop{z-index:55;background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);justify-content:center;align-items:center;padding:24px;display:flex;position:absolute;inset:0}.F1KBNa_confirmCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:340px;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:12px;padding:16px;display:flex}.F1KBNa_confirmText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;margin:0;line-height:1.5}.F1KBNa_confirmActions{flex:none;justify-content:flex-end;align-items:center;gap:8px;display:flex}.F1KBNa_pickerCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:420px;max-width:100%;height:70%;max-height:100%;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:8px;padding:14px 16px 16px;display:flex;position:relative;overflow:hidden}.F1KBNa_pickerTitle{color:var(--dsw-alias-label-primary);flex:none;font-size:13px;font-weight:500;line-height:20px}.F1KBNa_pickerClose{width:22px;height:22px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;top:10px;right:10px}.F1KBNa_pickerClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_pickerForm{flex:none;gap:8px;display:flex}.F1KBNa_pickerInput{border:1px solid var(--dsw-alias-border-l1);min-width:0;color:var(--dsw-alias-label-primary);background:0 0;border-radius:8px;flex:auto;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_pickerInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_tree{border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex:auto;min-height:0;padding:4px 2px 4px 4px;overflow:auto scroll}.F1KBNa_treeRow{border-radius:6px;align-items:center;gap:2px;padding-right:4px;display:flex}.F1KBNa_treeRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_treeRow[data-selected]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)}.F1KBNa_treeCaret{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_treeCaret:hover{color:var(--dsw-alias-label-primary)}.F1KBNa_treeName{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:auto;align-items:center;gap:6px;padding:2px 4px;font-family:inherit;font-size:12px;line-height:18px;display:flex}.F1KBNa_treeName:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_treeNote{color:var(--dsw-alias-label-tertiary);margin:2px 0;font-size:12px;line-height:18px}.F1KBNa_pickerIcon{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_pickerName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_pickerNote{color:var(--dsw-alias-label-tertiary);flex:none;margin:0;font-size:12px;line-height:18px}.F1KBNa_pickerCheck{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;margin-right:auto;font-size:12px;line-height:18px;display:flex}.F1KBNa_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}.F1KBNa_note,.F1KBNa_readError,.F1KBNa_hint{color:var(--dsw-alias-label-tertiary);margin:4px 0;font-size:12px;line-height:18px}.F1KBNa_noteCentered{text-align:center;margin:auto}.F1KBNa_emptyState{flex-direction:column;align-items:center;gap:10px;margin:auto;display:flex}.F1KBNa_importButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:5px 14px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_importButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_importButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_importNote{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;font-size:12px;line-height:18px}.F1KBNa_readError{color:var(--dsw-alias-state-error-primary)}.F1KBNa_group{color:var(--dsw-alias-label-tertiary);margin:8px 0 4px;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_groupHead{align-items:center;gap:4px;margin:8px 0 4px;padding-right:8px;display:flex}.F1KBNa_action.F1KBNa_addButton{box-sizing:border-box;border-radius:6px;flex:none;justify-content:center;align-items:center;width:20px;height:20px;min-height:0;padding:0;display:inline-flex}.F1KBNa_groupHead>.F1KBNa_group{margin:0}.F1KBNa_listHead{flex:none;align-items:center;gap:4px;margin:8px 1px 2px;padding-right:8px;display:flex}.F1KBNa_action.F1KBNa_addButton.F1KBNa_listFold{width:26px;height:26px}.F1KBNa_listTitle{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_listTabs{background:var(--dsw-alias-interactive-bg-hover);border-radius:8px;flex:auto;gap:2px;min-width:0;padding:2px;display:flex}.F1KBNa_listTab{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:6px;padding:3px 8px;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_tabCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}.F1KBNa_listTab[aria-selected=true]{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.F1KBNa_commentRow{box-sizing:border-box;width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;padding:6px 8px;display:block}.F1KBNa_commentRow:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_commentHead{align-items:baseline;gap:6px;min-width:0;display:flex}.F1KBNa_commentLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-markdown-code-block);font-size:11px;line-height:16px;overflow:hidden}.F1KBNa_commentLost{color:var(--dsw-alias-label-tertiary);flex:none;font-size:11px;line-height:16px}.F1KBNa_commentTitle{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);font-size:12px;line-height:18px;display:block;overflow:hidden}.F1KBNa_listEmpty{color:var(--dsw-alias-label-tertiary);margin:8px 12px;font-size:12px;line-height:18px}.F1KBNa_emptyActions{flex-wrap:wrap;justify-content:center;gap:8px;display:flex}.F1KBNa_rows{margin:0;padding:0;list-style:none}.F1KBNa_row{border:1px solid #0000;border-radius:10px;margin:2px 0}.F1KBNa_rowMenuAnchor{display:none}.F1KBNa_rowHead{width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_rowHead:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_rowHead[data-selected]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_rowPath{text-overflow:ellipsis;white-space:nowrap;min-width:0;margin-left:4px;font-size:12px;line-height:18px;overflow:hidden}.F1KBNa_kindTag{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_kindHint{color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px;line-height:16px}.F1KBNa_divergedHint,.F1KBNa_missingHint{border-bottom:1px solid var(--dsw-alias-border-l2);margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_missing{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary));white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_rowFailed{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_actionError{border-bottom:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere;margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_missingHint{color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary))}.F1KBNa_rowMeta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;gap:6px;margin-left:auto;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_addCount{color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_delCount{color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_diff{background:var(--dsw-alias-markdown-code-block);flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffHeader{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_panelDocked .F1KBNa_diffHeader{background:var(--dsw-alias-bg-base)}.F1KBNa_diffPath{appearance:none;min-width:0;font:inherit;text-overflow:ellipsis;color:var(--dsw-alias-label-primary);background:0 0;border:0;flex:1;margin-left:4px;padding:0;font-size:12px;line-height:18px;position:relative;top:1px}.F1KBNa_diffPath:focus{outline:none}.F1KBNa_diffActions{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffStats{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;line-height:16px}.F1KBNa_flexSpacer{flex:1}.F1KBNa_gotoBox{background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:12px;align-items:center;gap:8px;padding:12px;display:flex}.F1KBNa_gotoInput{border:1px solid var(--dsw-alias-border-l2);width:8em;color:inherit;font:inherit;background:0 0;border-radius:8px;padding:4px 8px}.F1KBNa_divider{background:var(--dsw-alias-border-l1);align-self:stretch;width:1px;margin:2px 0}.F1KBNa_action{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_action:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_actionChord{color:var(--dsw-alias-label-tertiary);margin-left:6px;font-size:11px}.F1KBNa_actionPrimary{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_actionPrimary:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_actionPrimary:disabled{background:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:.55}.F1KBNa_actionQuietDisabled:disabled{cursor:pointer;color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l1);background:0 0}.F1KBNa_actionPrimary.F1KBNa_actionQuietDisabled:disabled{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:1}.F1KBNa_iconAction{justify-content:center;align-items:center;min-height:25px;padding:4px 6px;display:inline-flex}.F1KBNa_close{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_expand{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_expand:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_expandExpanded svg{transform:rotate(180deg)}.F1KBNa_diffBodyWrap{isolation:isolate;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBody{overscroll-behavior:none;min-width:0;font:var(--dsw-font-markdown-code-block);-webkit-text-size-adjust:100%;text-size-adjust:100%;cursor:text;outline:none;flex:1;padding:0;position:relative;overflow:auto}.F1KBNa_diffBody::-webkit-scrollbar,.F1KBNa_diffBody::-webkit-scrollbar-track,.F1KBNa_diffBody::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_blockActions{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);z-index:2;border-radius:10px;align-items:center;gap:9px;padding:5px;display:flex;position:absolute;right:8px}.F1KBNa_blockActionsDivider{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:2px 0}.F1KBNa_blockPosition{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;margin-top:1px;margin-left:7px;font-size:12px;line-height:16px}.F1KBNa_searchBar{z-index:3;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;align-items:center;gap:4px;padding:4px;display:flex;position:absolute;top:8px;right:8px}.F1KBNa_searchInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:150px;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_searchInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchCount{text-align:center;min-width:34px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:16px}.F1KBNa_searchToggle{border:1px solid var(--dsw-alias-border-l1);min-height:25px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;justify-content:center;align-items:center;padding:4px 6px;display:inline-flex}.F1KBNa_searchToggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_searchToggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchMatch{color:inherit;background-color:#facc1542;border-radius:2px}.F1KBNa_searchMatchCurrent{color:inherit;background-color:#facc1599;border-radius:2px}.F1KBNa_blockFlash{z-index:3;box-sizing:border-box;border:2px solid var(--dsw-alias-state-business-primary);pointer-events:none;border-radius:4px;animation:1s ease-out forwards F1KBNa_diffFlashFade;position:absolute;left:0;right:0}.F1KBNa_blockFlashShake{animation:.7s ease-out forwards F1KBNa_diffFlashShake}.F1KBNa_discussionRow{background:var(--dsw-alias-bg-base);display:table-row}.F1KBNa_discussionCell{display:table-cell}.F1KBNa_discussionPin{z-index:2;width:0;height:0;position:sticky;left:0}.F1KBNa_discussion{z-index:2;box-sizing:border-box;border-left:3px solid var(--dsw-alias-state-business-primary);box-shadow:inset 0 1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset 0 -1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset -1px 0 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent);cursor:default;background:0 0;flex-direction:column;display:flex;position:absolute;top:0;left:0;overflow:hidden}.F1KBNa_discussionHead{font:var(--dsw-font-markdown-code-block)}.F1KBNa_discussionBody,.F1KBNa_threadFontProbe{font:var(--dsw-font-markdown-base);font-size:calc(var(--dsh-content-font-size,14px) - 2px)}.F1KBNa_threadFontProbe{visibility:hidden;pointer-events:none;width:0;height:0;position:absolute;overflow:hidden}.F1KBNa_discussionBody{flex-direction:column;flex:auto;min-height:0;padding:0 12px;display:flex;overflow:hidden}.F1KBNa_discussion[data-lost]{border-left-color:var(--dsw-alias-label-secondary);background:repeating-linear-gradient(135deg, var(--dsw-alias-interactive-bg-hover) 0 4px, transparent 4px 8px);background-origin:border-box}.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend,.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:hover:not(:disabled),.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:disabled{background:var(--dsw-alias-label-secondary);border-color:var(--dsw-alias-label-secondary);color:var(--dsw-alias-label-primary-foreground)}.F1KBNa_discussion[data-lost] .F1KBNa_discussionUser{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 30%, transparent)}.F1KBNa_discussionAnswer{color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;cursor:text;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionUser{box-sizing:border-box;background:var(--dsw-specific-bubble,var(--dsw-alias-bg-layer-2,var(--dsw-alias-interactive-bg-hover)));width:fit-content;max-width:82%;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;cursor:text;border-radius:8px 0 8px 8px;margin:6.6px 0 6.6px auto;padding:4.4px 11px;font-family:inherit;line-height:22px}.F1KBNa_discussionCode{box-sizing:border-box;font:var(--dsw-font-markdown-code);font-family:var(--ds-font-family-code);background:color-mix(in srgb, var(--dsw-alias-markdown-inline-code,var(--dsw-alias-interactive-bg-hover-solid)) 90%, var(--dsw-alias-label-secondary));border:.5px solid var(--dsw-alias-border-l1);border-radius:6px;align-items:center;padding:0 5px;font-size:.875em;line-height:16px;display:inline-flex}.F1KBNa_discussionBody strong{font-weight:700}.F1KBNa_discussionNote{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionNote[data-diff-discussion-hidden]{color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionDots{margin-left:1px}.F1KBNa_discussionDots>span{animation:1.2s ease-in-out infinite F1KBNa_discussionDot}.F1KBNa_discussionDots>span:nth-child(2){animation-delay:.15s}.F1KBNa_discussionDots>span:nth-child(3){animation-delay:.3s}@keyframes F1KBNa_discussionDot{0%,60%,to{opacity:.25}30%{opacity:1}}.F1KBNa_quoteLines{table-layout:fixed;border-spacing:0;width:calc(100% + 27px);min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block);line-height:var(--dsh-diff-line-height,22px);background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover) 55%, transparent);margin:0 -12px 0 -15px;display:table}.F1KBNa_quoteAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 12%, transparent)}.F1KBNa_quoteDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 13%, transparent)}.F1KBNa_quoteLine{font-size:calc(1em * var(--dsh-diff-font-scale,1));height:var(--dsh-diff-line-height,22px);display:table-row}.F1KBNa_quoteCode{display:table-cell}.F1KBNa_quoteText{white-space:pre-wrap;overflow-wrap:anywhere;cursor:text;display:block}.F1KBNa_quoteNoWrap .F1KBNa_quoteText{white-space:pre;overflow-wrap:normal;overflow:hidden}.F1KBNa_quoteNoWrap .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-diff-quote-width,0px) + 100%);display:inline-block}.F1KBNa_quoteSplit{align-self:stretch;align-items:flex-start;margin:0 -12px;display:flex}.F1KBNa_quoteSplitSide{flex:1 1 0;min-width:0}.F1KBNa_quoteSplitSide+.F1KBNa_quoteSplitSide{border-left:1px solid var(--dsw-alias-border-l2)}.F1KBNa_quoteSplitTable{table-layout:fixed;border-spacing:0;width:100%;display:table}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=left] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-left,0px) + 100%);display:inline-block}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=right] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-right,0px) + 100%);display:inline-block}.F1KBNa_discussionHead{box-sizing:border-box;flex:none;align-items:center;gap:8px;height:22px;padding:0 12px;font-size:12px;line-height:16px;display:flex}.F1KBNa_discussionCompose{box-sizing:border-box;flex:none;align-items:flex-end;gap:8px;height:44px;margin:0 -6px;padding:0 0 6.6px;display:flex}.F1KBNa_discussionSlack{flex:1 1 0;min-height:0;max-height:22px}.F1KBNa_discussionInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);min-width:0;height:26px;color:var(--dsw-alias-label-primary);cursor:text;border-radius:6px;flex:auto;padding:3px 8px;font-family:inherit;line-height:18px}.F1KBNa_discussionToggle{width:18px;height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_discussionToggle:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_discussionRangeWrap{font:var(--dsw-font-markdown-code-block);flex:none}.F1KBNa_discussionRange{color:var(--dsw-alias-label-tertiary);font-family:inherit}.F1KBNa_discussionInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_discussionInput::placeholder{font-family:inherit;font-size:inherit;color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionSend{box-sizing:border-box;white-space:nowrap;flex:none;justify-content:center;align-items:center;gap:6px;height:26px;padding-left:9px;padding-right:9px;display:inline-flex}.F1KBNa_rowDiscussed{--diff-row-wash:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);background-image:linear-gradient(var(--diff-row-wash), var(--diff-row-wash))}@keyframes F1KBNa_diffFlashFade{0%{opacity:1}to{opacity:0}}@keyframes F1KBNa_diffFlashShake{0%{opacity:1;transform:translateY(0)}10%{transform:translateY(1px)}20%{transform:translateY(-1px)}30%{transform:translateY(1px)}40%{transform:translateY(-1px)}50%{transform:translateY(1px)}60%{transform:translateY(-1px)}70%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(0)}}.F1KBNa_overviewRuler{pointer-events:none;opacity:.5;width:4px;position:absolute;top:0;bottom:0;right:0}.F1KBNa_overviewMarker{border-radius:2px;width:100%;min-height:2px;position:absolute;right:0}.F1KBNa_markerDel{background-color:var(--dsw-alias-state-error-primary)}.F1KBNa_markerAdd{background-color:var(--dsw-alias-state-success-primary)}.F1KBNa_lines{border-spacing:0;width:max-content;min-width:100%;font-size:calc(1em * var(--dsh-diff-font-scale,1));display:table}.F1KBNa_line{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);-webkit-user-select:none;user-select:none;display:table-row}.F1KBNa_vSpacer{display:table-row}.F1KBNa_gutter{box-sizing:border-box;text-align:right;width:44px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;cursor:default;padding-right:10px;display:table-cell}.F1KBNa_line>.F1KBNa_gutter{z-index:1;background-color:var(--dsw-alias-markdown-code-block);background-image:linear-gradient(var(--diff-row-tint,transparent), var(--diff-row-tint,transparent)), linear-gradient(var(--diff-row-wash,transparent), var(--diff-row-wash,transparent));position:sticky;left:0}.F1KBNa_line>.F1KBNa_gutter+.F1KBNa_gutter{left:44px}.F1KBNa_code{white-space:pre;-webkit-user-select:text;user-select:text;display:table-cell}.F1KBNa_context{color:var(--dsw-alias-label-primary)}.F1KBNa_del{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_add{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_statusBar{box-sizing:border-box;border-top:1px solid var(--dsw-alias-border-l2);height:34px;color:var(--dsw-alias-label-tertiary);font-family:var(--dsw-font-markdown-code-block);font-variant-numeric:tabular-nums;flex:none;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:flex}.F1KBNa_statusAction{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);white-space:nowrap;cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_statusAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langSelect{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;flex:none;align-items:center;gap:4px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_langSelect:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langLabel{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.F1KBNa_presentationSelect{cursor:pointer;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_presentationSelect:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_chip{justify-content:flex-end;align-items:center;gap:5px;min-width:0;padding-right:14px;display:inline-flex}.F1KBNa_chipLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_coverHost{align-items:center;display:inline-flex;position:relative}.F1KBNa_coverCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:12px;align-items:center;gap:4px;padding:6px;display:flex}.F1KBNa_coverPopover{z-index:50;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_coverNotice{z-index:80;pointer-events:none;animation:1.25s ease-out forwards F1KBNa_coverNoticeFade;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_coverNoticeCard{gap:4px;padding:6px 8px}@keyframes F1KBNa_coverNoticeFade{0%,78%{opacity:1}to{opacity:0}}.F1KBNa_coverNoticeGlyph{width:44px;height:44px;color:var(--dsw-alias-label-tertiary);border-radius:10px;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_coverNoticeGlyph[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_coverNoticeGlyph[data-changed]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_coverNoticeText{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.F1KBNa_coverButton{width:32px;height:32px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_coverButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_coverButton[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_presentationHost{align-items:center;display:inline-flex}.F1KBNa_chipPresentation{min-width:36px;height:20px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:20px;flex:none;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_chipPresentation:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_mirrored{transform:scaleX(-1)}.F1KBNa_notice{z-index:60;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:360px;box-shadow:var(--dsw-shadow-lv3);border-radius:10px;align-items:flex-start;gap:12px;padding:12px 14px;display:flex;position:fixed;bottom:24px;right:24px}.F1KBNa_noticeText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);flex:1;margin:0;line-height:1.45}.F1KBNa_noticeButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font:var(--dsw-font-caption);cursor:pointer;border-radius:6px;flex:none;padding:4px 10px}.F1KBNa_noticeButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_wrap .F1KBNa_line{height:auto;min-height:var(--dsh-diff-line-height,22px)}.F1KBNa_subline{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);white-space:pre;display:block;overflow:hidden}.F1KBNa_wrapActive{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_wrapActive:hover{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_splitRoot{isolation:isolate;flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBodySplit{flex:1;min-height:0;overflow-x:hidden}.F1KBNa_splitCols{width:100%;min-width:0;min-height:100%;display:flex}.F1KBNa_splitCol{box-sizing:border-box;flex:1 1 0;min-width:0;overflow:hidden}.F1KBNa_splitDivider{background:var(--dsw-alias-border-l2);flex:0 0 1px}.F1KBNa_splitDiscussions{z-index:3;pointer-events:none;width:100%;height:0;position:absolute;top:0;left:0}.F1KBNa_splitDiscussion{box-sizing:border-box;pointer-events:auto;background:var(--dsw-alias-bg-base);position:absolute;left:0}.F1KBNa_splitSealed,.F1KBNa_splitSealed *{-webkit-user-select:none!important;user-select:none!important}.F1KBNa_splitSealedLeft [data-diff-split-side=left],.F1KBNa_splitSealedLeft [data-diff-split-side=left] *,.F1KBNa_splitSealedRight [data-diff-split-side=right],.F1KBNa_splitSealedRight [data-diff-split-side=right] *{-webkit-user-select:text!important;user-select:text!important}.F1KBNa_splitCol .F1KBNa_gutter,.F1KBNa_splitCol .F1KBNa_code{vertical-align:top}.F1KBNa_splitHScrollRow{border-top:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;width:100%;min-width:0;display:flex}.F1KBNa_splitHScroll{overscroll-behavior-x:none;min-width:0;height:var(--dsh-scrollbar-width,8px);flex:1 1 0;overflow:auto hidden}.F1KBNa_splitHScroll::-webkit-scrollbar{height:var(--dsh-scrollbar-width,8px)}.F1KBNa_splitHScroll::-webkit-scrollbar-track{cursor:default}.F1KBNa_splitHScroll::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_splitHScrollFill{height:1px}.F1KBNa_splitLdel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent)}.F1KBNa_splitLadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent)}.F1KBNa_splitRdel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent)}.F1KBNa_splitRadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent)}.F1KBNa_intraDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);text-decoration:line-through}.F1KBNa_intraAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 32%, transparent)}";
24
+ const css = ".F1KBNa_panelFailure{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary);border-radius:8px;align-items:center;gap:8px;padding:8px 10px;font-size:12px;line-height:16px;display:flex}.F1KBNa_panelFailureText{min-width:0}.F1KBNa_panelFailureRetry{border:1px solid var(--dsw-alias-border-l2);color:inherit;font:inherit;cursor:pointer;background:0 0;border-radius:6px;flex:none;margin-left:auto;padding:2px 8px}.F1KBNa_panelFailureRetry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_layer{box-sizing:border-box;flex:none;align-items:center;width:calc(100% + 4px);height:42px;margin:4px -2px;display:flex;position:relative}.F1KBNa_headerEntry{box-sizing:border-box;width:28px;height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:28px;flex:none;justify-content:center;align-items:center;padding:6px;display:inline-flex;position:relative}.F1KBNa_headerEntry:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_headerEntry[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid);color:var(--dsw-alias-label-primary)}.F1KBNa_headerEntry:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_headerEntryCount{box-sizing:border-box;background:var(--dsw-alias-button-primary-fill);min-width:14px;height:14px;color:var(--dsw-alias-label-primary-foreground);text-align:center;font-variant-numeric:tabular-nums;pointer-events:none;border-radius:7px;padding:0 3px;font-size:10px;line-height:14px;position:absolute;top:-1px;right:-1px}.F1KBNa_headerEntry svg{display:block}.F1KBNa_footerButtons{align-items:center;width:100%;display:flex}.F1KBNa_badge{box-sizing:border-box;width:100%;height:42px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border:none;border-radius:12px;align-items:center;gap:8px;padding:0 10px 0 8px;font-family:inherit;font-size:14px;line-height:22px;display:flex;overflow:hidden}.F1KBNa_badge:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_badge[data-active]{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_badge:disabled{color:var(--dsw-alias-label-tertiary);cursor:default;background:0 0}.F1KBNa_badgeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.F1KBNa_badgeCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;font-size:12px;line-height:16px}.F1KBNa_layer.F1KBNa_rail{width:36px;height:36px;margin:8px 0 10px}.F1KBNa_rail .F1KBNa_badge{border-radius:50%;justify-content:center;gap:0;width:36px;height:36px;padding:0}.F1KBNa_rail .F1KBNa_badgeLabel{display:none}.F1KBNa_rail .F1KBNa_badgeCount{box-sizing:border-box;background:var(--dsw-alias-state-business-primary);min-width:18px;height:18px;color:var(--dsw-alias-label-primary-foreground);font-variant-numeric:tabular-nums;border-radius:9px;justify-content:center;align-items:center;padding:0 4px;font-size:11px;line-height:18px;display:flex;position:absolute;top:-3px;right:-7px}.F1KBNa_coverBackdrop{z-index:29;background:var(--dsw-specific-sidebar-fill);position:fixed;inset:0}.F1KBNa_panel{z-index:30;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:auto;max-width:none;box-shadow:var(--dsw-shadow-lv2);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);-webkit-user-select:none;user-select:none;border-radius:12px;flex-direction:column;display:flex;position:fixed;inset:8px 8px 128px;overflow:hidden}.F1KBNa_panel .F1KBNa_code,.F1KBNa_panel .F1KBNa_mdPreviewBody,.F1KBNa_panel .F1KBNa_discussionUser,.F1KBNa_panel .F1KBNa_discussionAnswer,.F1KBNa_panel .F1KBNa_quoteText,.F1KBNa_panel .F1KBNa_diffPath,.F1KBNa_panel .F1KBNa_rowPath,.F1KBNa_panel input,.F1KBNa_panel textarea,.F1KBNa_panel [contenteditable]{-webkit-user-select:text;user-select:text}.F1KBNa_panelDocked{width:100%;max-width:none;height:100%;box-shadow:none;border:none;border-radius:0;position:static;inset:auto}.F1KBNa_dockHost{flex-direction:column;min-height:0;display:flex;position:absolute;inset:0}.F1KBNa_header{box-sizing:border-box;border-bottom:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:10px 12px;display:flex}.F1KBNa_headerActions{align-items:center;gap:2px;display:flex}.F1KBNa_settingsPage{padding:8px 12px}.F1KBNa_settingsGroup{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupHeader{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:8px;padding:16px 0;display:flex}.F1KBNa_settingsGroupText{text-align:left;flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.F1KBNa_settingsGroupTitle{font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsGroupDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsGroupChevron{margin-left:auto;transition:transform .15s}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupChevron{transform:rotate(180deg)}.F1KBNa_settingsGroup[data-open] .F1KBNa_settingsGroupHeader{border-bottom:1px solid var(--dsw-alias-border-l2)}.F1KBNa_settingsGroupBody{flex-direction:column;display:flex}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow{padding-left:16px}.F1KBNa_settingsGroupBody .F1KBNa_settingsRow:last-child,.F1KBNa_settingsPage>.F1KBNa_settingsRow:last-child{border-bottom:none}.F1KBNa_settingsRow{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:16px 0;display:flex}.F1KBNa_settingsRowText{flex-direction:column;flex:1;gap:4px;min-width:0;padding-right:48px;display:flex}.F1KBNa_settingsRowTitle{color:var(--dsw-alias-label-primary);font-size:14px;font-weight:400;line-height:22px}.F1KBNa_settingsRowDesc{color:var(--dsw-alias-label-tertiary);font-size:12px;font-weight:400;line-height:18px}.F1KBNa_settingsRowLink{color:inherit;cursor:pointer;text-decoration:none}.F1KBNa_settingsRowLink:hover{color:var(--dsw-alias-label-secondary);text-underline-offset:2px;text-decoration:underline}.F1KBNa_settingsSelector{background:var(--dsw-alias-bg-module-platform);min-width:72px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;justify-content:center;align-items:center;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.F1KBNa_settingsSelector:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_settingsSelector[data-recording]{box-shadow:inset 0 0 0 1px var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-secondary)}.F1KBNa_settingsReset{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;margin-left:6px;padding:0;display:inline-flex}.F1KBNa_settingsReset:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_settingsReset:disabled{opacity:.4;cursor:default}.F1KBNa_colorPicker{position:relative}.F1KBNa_colorPickerTrigger{background:var(--dsw-alias-bg-module-platform);width:120px;height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_colorPickerTrigger:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_colorSwatch{border:1px solid var(--dsw-alias-border-l2);border-radius:50%;flex:none;width:24px;height:24px}.F1KBNa_colorValue{text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;flex:1;min-width:0;overflow:hidden}.F1KBNa_colorPickerChevron{flex:none}.F1KBNa_colorBackdrop{z-index:40;position:fixed;inset:0}.F1KBNa_colorPickerPopover{z-index:41;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:10px;padding:10px;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_colorPickerPanel{flex-direction:column;gap:8px;display:flex}.F1KBNa_colorPickerInputRow{align-items:center;gap:8px;display:flex}.F1KBNa_colorPickerPreview{border:1px solid var(--dsw-alias-border-l2);border-radius:6px;flex:none;width:22px;height:22px}.F1KBNa_colorPickerInput{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-module-platform);min-width:0;height:30px;font:inherit;color:var(--dsw-alias-label-primary);border-radius:8px;flex:1;padding:0 8px;font-size:12px;line-height:28px}.F1KBNa_colorPickerInput:focus{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-1px}.F1KBNa_colorSv{border:1px solid var(--dsw-alias-border-l1);cursor:crosshair;touch-action:none;border-radius:8px;height:140px;position:relative}.F1KBNa_colorSvCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:14px;height:14px;position:absolute;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_colorHue{border:1px solid var(--dsw-alias-border-l1);cursor:pointer;touch-action:none;border-radius:7px;height:14px;position:relative}.F1KBNa_colorHueCursor{pointer-events:none;border:2px solid #fff;border-radius:50%;width:16px;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%);box-shadow:0 0 0 1px #00000080}.F1KBNa_diffPreview{z-index:2;border:1px solid var(--dsw-alias-border-l1);font:var(--dsw-font-markdown-code-block);background:var(--dsw-alias-markdown-code-block);border-radius:8px;margin:16px 0 8px;padding:8px;position:sticky;top:0;overflow:hidden}.F1KBNa_diffPreviewTitle{color:var(--dsw-alias-label-tertiary);margin-bottom:6px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_diffPreviewScroll{height:132px;overflow-y:auto}.F1KBNa_mdPreviewWrap{isolation:isolate;flex:1;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_mdPreviewBody{overscroll-behavior:none;min-width:0;min-height:0;color:var(--dsw-alias-label-primary);flex:1;padding:12px 16px;position:relative;overflow:auto}.F1KBNa_mdPreviewContent{width:100%;min-width:0;margin:0 auto}.F1KBNa_mdPreviewSingle{display:block}.F1KBNa_mdPreviewDouble{display:flex}.F1KBNa_mdPreviewBody .mdBlock{border-radius:4px;margin-bottom:12px;padding:2px 6px}.F1KBNa_mdPreviewBody .mdAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 10%, transparent)}.F1KBNa_mdPreviewBody .mdDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 12%, transparent)}.F1KBNa_mdPreviewBody .mdWordDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdWordAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 34%, transparent);border-radius:2px;padding:0 1px}.F1KBNa_mdPreviewBody .mdDouble{flex-direction:column;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleRow{align-items:flex-start;width:100%;min-width:0;display:flex}.F1KBNa_mdPreviewBody .mdDoubleCol{flex:1;min-width:0}.F1KBNa_mdPreviewBody .mdDoubleRule{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:0 12px}.F1KBNa_mdPreviewFallback{font-family:var(--dsw-font-markdown-code-block);color:var(--dsw-alias-label-tertiary);padding:12px 16px;font-size:12px;line-height:18px}.F1KBNa_mdPreviewBody{word-break:break-word;font-size:13px;line-height:20px}.F1KBNa_mdPreviewBody>:first-child{margin-top:0}.F1KBNa_mdPreviewBody>:last-child{margin-bottom:0}.F1KBNa_mdPreviewBody h1,.F1KBNa_mdPreviewBody h2,.F1KBNa_mdPreviewBody h3,.F1KBNa_mdPreviewBody h4,.F1KBNa_mdPreviewBody h5,.F1KBNa_mdPreviewBody h6{margin:16px 0 8px;font-weight:600;line-height:1.3}.F1KBNa_mdPreviewBody h1{font-size:22px}.F1KBNa_mdPreviewBody h2{font-size:19px}.F1KBNa_mdPreviewBody h3{font-size:16px}.F1KBNa_mdPreviewBody h4{font-size:15px}.F1KBNa_mdPreviewBody h5{font-size:14px}.F1KBNa_mdPreviewBody h6{font-size:13px}.F1KBNa_mdPreviewBody p{margin:8px 0}.F1KBNa_mdPreviewBody ul,.F1KBNa_mdPreviewBody ol{margin:8px 0;padding-left:22px}.F1KBNa_mdPreviewBody li{margin:2px 0}.F1KBNa_mdPreviewBody a{color:var(--dsw-alias-state-business-primary);text-decoration:none}.F1KBNa_mdPreviewBody a:hover{text-decoration:underline}.F1KBNa_mdPreviewBody code{font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:4px;padding:1px 5px;font-size:12.5px}.F1KBNa_mdPreviewBody pre{overscroll-behavior-x:none;border:1px solid var(--dsw-alias-border-l1);font-family:var(--dsw-font-markdown-code-block);background:#9e9e9e40;border-radius:8px;margin:8px 0;padding:10px 12px;font-size:12.5px;line-height:18px;overflow:auto}.F1KBNa_mdPreviewBody pre code{background:0 0;padding:0}.F1KBNa_mdPreviewBody blockquote{border-left:3px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);margin:8px 0;padding:0 12px}.F1KBNa_mdPreviewBody hr{background:var(--dsw-alias-border-l1);border:none;height:1px;margin:16px 0}.F1KBNa_mdPreviewBody table{border-collapse:collapse;margin:8px 0}.F1KBNa_mdPreviewBody th,.F1KBNa_mdPreviewBody td{border:1px solid var(--dsw-alias-border-l1);padding:4px 10px}.F1KBNa_mdPreviewBody img{max-width:100%}.F1KBNa_mdPreviewBody .mdImageFallback{border:1px dashed var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-markdown-code-block) 45%, transparent);width:100%;min-height:120px;color:var(--dsw-alias-label-secondary);font-family:var(--dsw-font-markdown-code-block);text-align:center;white-space:pre-wrap;word-break:break-all;border-radius:4px;justify-content:center;align-items:center;margin:0 auto;padding:8px 12px;font-size:12px;line-height:16px;display:flex}.F1KBNa_toggle{border:1px solid var(--dsw-alias-border-l2);cursor:pointer;background:0 0;border-radius:18px;flex:none;width:60px;height:36px;padding:0;position:relative}.F1KBNa_toggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_toggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.F1KBNa_toggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleOn:hover{background:var(--dsw-alias-state-business-primary)}.F1KBNa_toggleThumb{background:var(--dsw-alias-label-primary);border-radius:50%;width:28px;height:28px;transition:left .12s;position:absolute;top:3px;left:3px}.F1KBNa_toggleOn .F1KBNa_toggleThumb{background:#fff;left:27px}.F1KBNa_stepper{align-items:center;gap:6px;display:inline-flex}.F1KBNa_stepperButton{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);width:32px;height:32px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:8px;padding:0;position:relative}.F1KBNa_stepperButton:before,.F1KBNa_stepperButton:after{content:\"\";background:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_stepperButton:before{width:10px;height:1px}.F1KBNa_stepperButton:after{width:1px;height:10px;display:none}.F1KBNa_stepperButtonUp:after{display:block}.F1KBNa_stepperButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_stepperButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_stepperValue{text-align:center;min-width:2ch;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:14px;line-height:22px}.F1KBNa_states{flex-direction:column;flex:1;min-height:0;padding:4px 12px 12px;display:flex;overflow-y:auto}.F1KBNa_split{flex:1;align-items:stretch;min-height:0;display:flex;position:relative}.F1KBNa_fileListKnob{z-index:39;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:28px;height:28px;color:var(--dsw-alias-label-primary);cursor:pointer;box-shadow:var(--dsw-elevation-prominent);border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute}.F1KBNa_fileListKnob[data-open]{box-shadow:none;opacity:0}.F1KBNa_fileListKnob:not([data-open]){animation:.32s ease-in-out .5s both F1KBNa_fileListKnobIn}@keyframes F1KBNa_fileListKnobIn{0%{opacity:0}to{opacity:1}}.F1KBNa_fileListKnob:hover,.F1KBNa_fileListKnob:focus-visible{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-interactive-bg-hover), var(--dsw-alias-interactive-bg-hover))}.F1KBNa_fileListFloat{z-index:40;box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);box-shadow:none;transform-origin:0 0;border-radius:12px;flex-direction:column;padding:6px 0 10px 8px;display:flex;position:absolute;overflow:hidden}.F1KBNa_fileListFloatClosing{pointer-events:none;animation:.14s ease-in forwards F1KBNa_fileListShrink}@keyframes F1KBNa_fileListShrink{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.96)}}.F1KBNa_fileList{box-sizing:border-box;border-right:1px solid var(--dsw-alias-border-l2);flex-direction:column;flex:none;width:260px;min-height:0;padding:4px 8px 12px;display:flex}.F1KBNa_listScroll{flex:1;min-height:0;overflow-y:scroll}.F1KBNa_bulkActions{flex:none;gap:6px;padding:8px 8px 0 0;display:flex}.F1KBNa_bulkActions .F1KBNa_action{text-align:center;flex:auto}.F1KBNa_addPath{justify-content:center;align-items:center;gap:4px;display:inline-flex}.F1KBNa_resizeHandle{cursor:col-resize;touch-action:none;background:0 0;flex:none;width:5px;margin:0 -2px}.F1KBNa_resizeHandle:hover{background:var(--dsw-alias-border-l2)}.F1KBNa_floatResizeHandle{z-index:41;cursor:col-resize;-webkit-user-select:none;user-select:none;touch-action:none;background:0 0;border-radius:4px;position:absolute}.F1KBNa_floatResizeHandle:hover{background-color:var(--dsw-alias-bg-base);background-image:linear-gradient(var(--dsw-alias-border-l2), var(--dsw-alias-border-l2))}.F1KBNa_detail{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.F1KBNa_detailEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;flex:1;justify-content:center;align-items:center;margin:0;padding:24px;font-size:12px;line-height:18px;display:flex}.F1KBNa_confirmBackdrop{z-index:55;background:color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);justify-content:center;align-items:center;padding:24px;display:flex;position:absolute;inset:0}.F1KBNa_confirmCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:340px;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:12px;padding:16px;display:flex}.F1KBNa_confirmText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;margin:0;line-height:1.5}.F1KBNa_confirmActions{flex:none;justify-content:flex-end;align-items:center;gap:8px;display:flex}.F1KBNa_pickerCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);width:420px;max-width:100%;height:70%;max-height:100%;box-shadow:var(--dsw-shadow-lv3);border-radius:12px;flex-direction:column;gap:8px;padding:14px 16px 16px;display:flex;position:relative;overflow:hidden}.F1KBNa_pickerTitle{color:var(--dsw-alias-label-primary);flex:none;font-size:13px;font-weight:500;line-height:20px}.F1KBNa_pickerClose{width:22px;height:22px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;padding:0;display:inline-flex;position:absolute;top:10px;right:10px}.F1KBNa_pickerClose:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_pickerForm{flex:none;gap:8px;display:flex}.F1KBNa_pickerInput{border:1px solid var(--dsw-alias-border-l1);min-width:0;color:var(--dsw-alias-label-primary);background:0 0;border-radius:8px;flex:auto;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_pickerInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_tree{border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex:auto;min-height:0;padding:4px 2px 4px 4px;overflow:auto scroll}.F1KBNa_treeRow{border-radius:6px;align-items:center;gap:2px;padding-right:4px;display:flex}.F1KBNa_treeRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_treeRow[data-selected]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 18%, transparent)}.F1KBNa_treeCaret{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_treeCaret:hover{color:var(--dsw-alias-label-primary)}.F1KBNa_treeName{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;flex:auto;align-items:center;gap:6px;padding:2px 4px;font-family:inherit;font-size:12px;line-height:18px;display:flex}.F1KBNa_treeName:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_treeNote{color:var(--dsw-alias-label-tertiary);margin:2px 0;font-size:12px;line-height:18px}.F1KBNa_pickerIcon{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_pickerName{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_pickerNote{color:var(--dsw-alias-label-tertiary);flex:none;margin:0;font-size:12px;line-height:18px}.F1KBNa_pickerCheck{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;margin-right:auto;font-size:12px;line-height:18px;display:flex}.F1KBNa_title{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:500;line-height:20px}.F1KBNa_note,.F1KBNa_readError,.F1KBNa_hint{color:var(--dsw-alias-label-tertiary);margin:4px 0;font-size:12px;line-height:18px}.F1KBNa_noteCentered{text-align:center;margin:auto}.F1KBNa_emptyState{flex-direction:column;align-items:center;gap:10px;margin:auto;display:flex}.F1KBNa_importButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:5px 14px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_importButton:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_importButton:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_importNote{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;font-size:12px;line-height:18px}.F1KBNa_readError{color:var(--dsw-alias-state-error-primary)}.F1KBNa_group{color:var(--dsw-alias-label-tertiary);margin:8px 0 4px;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_groupHead{align-items:center;gap:4px;margin:8px 0 4px;padding-right:8px;display:flex}.F1KBNa_action.F1KBNa_addButton{box-sizing:border-box;border-radius:6px;flex:none;justify-content:center;align-items:center;width:20px;height:20px;min-height:0;padding:0;display:inline-flex}.F1KBNa_groupHead>.F1KBNa_group{margin:0}.F1KBNa_listHead{flex:none;align-items:center;gap:4px;margin:8px 1px 2px;padding-right:8px;display:flex}.F1KBNa_action.F1KBNa_addButton.F1KBNa_listFold{width:26px;height:26px}.F1KBNa_listTitle{color:var(--dsw-alias-label-tertiary);margin:0;font-size:12px;font-weight:500;line-height:16px}.F1KBNa_listTabs{background:var(--dsw-alias-interactive-bg-hover);border-radius:8px;flex:auto;gap:2px;min-width:0;padding:2px;display:flex}.F1KBNa_listTab{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1;justify-content:center;align-items:center;gap:6px;padding:3px 8px;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_tabCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums}.F1KBNa_listTab[aria-selected=true]{background:var(--dsw-alias-bg-base);color:var(--dsw-alias-label-primary)}.F1KBNa_commentGroup{margin:0 0 6px}.F1KBNa_commentGroup:last-child{margin-bottom:0}.F1KBNa_commentGroupName{color:var(--dsw-alias-label-tertiary);margin:0;padding:4px 8px 2px;font-size:11px;font-weight:500;line-height:16px}.F1KBNa_commentRow{box-sizing:border-box;width:100%;color:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;padding:6px 8px;display:block}.F1KBNa_commentRow:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_commentHead{align-items:baseline;gap:6px;min-width:0;display:flex}.F1KBNa_commentLabel{white-space:nowrap;text-align:right;color:var(--dsw-alias-label-secondary);font:var(--dsw-font-markdown-code-block);font-variant-numeric:tabular-nums;flex:none;font-size:11px;font-weight:700;line-height:16px}.F1KBNa_commentLost{color:var(--dsw-alias-label-tertiary);flex:none;font-size:11px;line-height:16px}.F1KBNa_commentTitle{text-overflow:ellipsis;white-space:nowrap;text-align:left;min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:12px;line-height:18px;overflow:hidden}.F1KBNa_commentTitleEmpty{color:var(--dsw-alias-label-tertiary)}.F1KBNa_listEmpty{color:var(--dsw-alias-label-tertiary);margin:8px 12px;font-size:12px;line-height:18px}.F1KBNa_emptyActions{flex-wrap:wrap;justify-content:center;gap:8px;display:flex}.F1KBNa_rows{margin:0;padding:0;list-style:none}.F1KBNa_row{border:1px solid #0000;border-radius:10px;margin:2px 0}.F1KBNa_rowMenuAnchor{display:none}.F1KBNa_rowHead{width:100%;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:10px;align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_rowHead:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_rowHead[data-selected]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_rowPath{text-overflow:ellipsis;white-space:nowrap;min-width:0;margin-left:4px;font-size:12px;line-height:18px;overflow:hidden}.F1KBNa_kindTag{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_kindHint{color:var(--dsw-alias-label-tertiary);flex:none;font-size:12px;line-height:16px}.F1KBNa_divergedHint,.F1KBNa_missingHint{border-bottom:1px solid var(--dsw-alias-border-l2);margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_missing{border:1px solid var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary));white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_rowFailed{border:1px solid var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);white-space:nowrap;border-radius:6px;flex:none;padding:1px 6px;font-size:11px;line-height:14px}.F1KBNa_actionError{border-bottom:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-state-error-primary);overflow-wrap:anywhere;margin:0;padding:6px 8px;font-size:12px;line-height:18px}.F1KBNa_missingHint{color:var(--dsw-alias-state-warn-label,var(--dsw-alias-state-warn-primary))}.F1KBNa_rowMeta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;flex:none;gap:6px;margin-left:auto;font-size:12px;line-height:16px;display:inline-flex}.F1KBNa_addCount{color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_delCount{color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 60%, var(--dsw-alias-label-primary))}.F1KBNa_diff{background:var(--dsw-alias-markdown-code-block);flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffHeader{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_panelDocked .F1KBNa_diffHeader{background:var(--dsw-alias-bg-base)}.F1KBNa_diffPath{appearance:none;min-width:0;font:inherit;text-overflow:ellipsis;color:var(--dsw-alias-label-primary);background:0 0;border:0;flex:1;margin-left:4px;padding:0;font-size:12px;line-height:18px;position:relative;top:1px}.F1KBNa_diffPath:focus{outline:none}.F1KBNa_diffActions{border-bottom:1px solid var(--dsw-alias-border-l2);align-items:center;gap:8px;padding:6px 8px;display:flex}.F1KBNa_diffStats{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;line-height:16px}.F1KBNa_flexSpacer{flex:1}.F1KBNa_gotoHost{display:inline-flex}.F1KBNa_gotoLayer{z-index:30;place-items:center;display:grid;position:absolute;inset:0}.F1KBNa_gotoLayerRight{left:50%;right:var(--dsh-scrollbar-width,8px);bottom:calc(var(--dsh-scrollbar-width,8px) + 1px)}.F1KBNa_gotoBackdrop{z-index:29;position:fixed;inset:0}.F1KBNa_gotoBox{z-index:1;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;align-items:center;gap:4px;padding:4px;display:flex;position:relative}.F1KBNa_gotoInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:9em;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;flex:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_gotoInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_gotoAction{white-space:nowrap;flex:none}.F1KBNa_divider{background:var(--dsw-alias-border-l1);align-self:stretch;width:1px;margin:2px 0}.F1KBNa_action{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_action:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_action:disabled{color:var(--dsw-alias-label-tertiary);cursor:default}.F1KBNa_actionChord{color:var(--dsw-alias-label-tertiary);margin-left:6px;font-size:11px}.F1KBNa_actionPrimary{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_actionPrimary:hover:not(:disabled){background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_actionPrimary:disabled{background:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:.55}.F1KBNa_actionQuietDisabled:disabled{cursor:pointer;color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-border-l1);background:0 0}.F1KBNa_actionPrimary.F1KBNa_actionQuietDisabled:disabled{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50);opacity:1}.F1KBNa_iconAction{justify-content:center;align-items:center;min-height:25px;padding:4px 6px;display:inline-flex}.F1KBNa_close{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_close:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_expand{cursor:pointer;width:28px;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_expand:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_expandExpanded svg{transform:rotate(180deg)}.F1KBNa_diffBodyWrap{isolation:isolate;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBody{overscroll-behavior:none;min-width:0;font:var(--dsw-font-markdown-code-block);-webkit-text-size-adjust:100%;text-size-adjust:100%;cursor:text;outline:none;flex:1;padding:0;position:relative;overflow:auto}.F1KBNa_diffBody::-webkit-scrollbar,.F1KBNa_diffBody::-webkit-scrollbar-track,.F1KBNa_diffBody::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_blockActions{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);z-index:2;border-radius:10px;align-items:center;gap:9px;padding:5px;display:flex;position:absolute;right:8px}.F1KBNa_blockActionsDivider{background:var(--dsw-alias-border-l2);flex:none;align-self:stretch;width:1px;margin:2px 0}.F1KBNa_blockPosition{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;margin-top:1px;margin-left:7px;font-size:12px;line-height:16px}.F1KBNa_searchBar{z-index:3;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-markdown-code-block);box-shadow:var(--dsw-shadow-lv1);border-radius:10px;align-items:center;gap:4px;padding:4px;display:flex;position:absolute;top:8px;right:8px}.F1KBNa_searchInput{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:150px;color:var(--dsw-alias-label-primary);border-radius:6px;outline:none;padding:3px 8px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_searchInput:focus{border-color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchCount{text-align:center;min-width:34px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:16px}.F1KBNa_searchToggle{border:1px solid var(--dsw-alias-border-l1);min-height:25px;color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;justify-content:center;align-items:center;padding:4px 6px;display:inline-flex}.F1KBNa_searchToggle:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_searchToggleOn{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-state-business-primary)}.F1KBNa_searchMatch{color:inherit;background-color:#facc1542;border-radius:2px}.F1KBNa_searchMatchCurrent{color:inherit;background-color:#facc1599;border-radius:2px}.F1KBNa_blockFlash{z-index:3;box-sizing:border-box;border:2px solid var(--dsw-alias-state-business-primary);pointer-events:none;border-radius:4px;animation:1s ease-out forwards F1KBNa_diffFlashFade;position:absolute;left:0;right:0}.F1KBNa_blockFlashShake{animation:.7s ease-out forwards F1KBNa_diffFlashShake}.F1KBNa_discussionRow{background:var(--dsw-alias-bg-base);display:table-row}.F1KBNa_discussionCell{display:table-cell}.F1KBNa_discussionPin{z-index:2;width:0;height:0;position:sticky;left:0}.F1KBNa_discussion{z-index:2;box-sizing:border-box;border-left:3px solid var(--dsw-alias-state-business-primary);box-shadow:inset 0 1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset 0 -1px 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent), inset -1px 0 0 0 color-mix(in srgb, var(--dsw-alias-label-secondary) 55%, transparent);cursor:default;background:0 0;flex-direction:column;display:flex;position:absolute;top:0;left:0;overflow:hidden}.F1KBNa_discussionHead{font:var(--dsw-font-markdown-code-block)}.F1KBNa_discussionBody,.F1KBNa_threadFontProbe{font:var(--dsw-font-markdown-base);font-size:calc(var(--dsh-content-font-size,14px) - 2px)}.F1KBNa_threadFontProbe{visibility:hidden;pointer-events:none;width:0;height:0;position:absolute;overflow:hidden}.F1KBNa_discussionBody{flex-direction:column;flex:auto;min-height:0;padding:0 12px;display:flex;overflow:hidden}.F1KBNa_discussion[data-lost]{border-left-color:var(--dsw-alias-label-secondary);background:repeating-linear-gradient(135deg, var(--dsw-alias-interactive-bg-hover) 0 4px, transparent 4px 8px);background-origin:border-box}.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend,.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:hover:not(:disabled),.F1KBNa_discussion[data-lost] .F1KBNa_discussionSend:disabled{background:var(--dsw-alias-label-secondary);border-color:var(--dsw-alias-label-secondary);color:var(--dsw-alias-label-primary-foreground)}.F1KBNa_discussion[data-lost] .F1KBNa_discussionUser{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 30%, transparent)}.F1KBNa_discussionAnswer{color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;cursor:text;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionUser{box-sizing:border-box;background:var(--dsw-specific-bubble,var(--dsw-alias-bg-layer-2,var(--dsw-alias-interactive-bg-hover)));width:fit-content;max-width:82%;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow-wrap:anywhere;cursor:text;border-radius:8px 0 8px 8px;margin:6.6px 0 6.6px auto;padding:4.4px 11px;font-family:inherit;line-height:22px}.F1KBNa_discussionCode{box-sizing:border-box;font:var(--dsw-font-markdown-code);font-family:var(--ds-font-family-code);background:color-mix(in srgb, var(--dsw-alias-markdown-inline-code,var(--dsw-alias-interactive-bg-hover-solid)) 90%, var(--dsw-alias-label-secondary));border:.5px solid var(--dsw-alias-border-l1);border-radius:6px;align-items:center;padding:0 5px;font-size:.875em;line-height:16px;display:inline-flex}.F1KBNa_discussionBody strong{font-weight:700}.F1KBNa_discussionNote{color:var(--dsw-alias-label-secondary);white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:0;font-family:inherit;line-height:22px}.F1KBNa_discussionNote[data-diff-discussion-hidden]{color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionDots{margin-left:1px}.F1KBNa_discussionDots>span{animation:1.2s ease-in-out infinite F1KBNa_discussionDot}.F1KBNa_discussionDots>span:nth-child(2){animation-delay:.15s}.F1KBNa_discussionDots>span:nth-child(3){animation-delay:.3s}@keyframes F1KBNa_discussionDot{0%,60%,to{opacity:.25}30%{opacity:1}}.F1KBNa_quoteLines{table-layout:fixed;border-spacing:0;width:calc(100% + 27px);min-width:0;color:var(--dsw-alias-label-primary);font:var(--dsw-font-markdown-code-block);line-height:var(--dsh-diff-line-height,22px);background:color-mix(in srgb, var(--dsw-alias-interactive-bg-hover) 55%, transparent);margin:0 -12px 0 -15px;display:table}.F1KBNa_quoteAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 12%, transparent)}.F1KBNa_quoteDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 13%, transparent)}.F1KBNa_quoteLine{font-size:calc(1em * var(--dsh-diff-font-scale,1));height:var(--dsh-diff-line-height,22px);display:table-row}.F1KBNa_quoteCode{display:table-cell}.F1KBNa_quoteText{white-space:pre-wrap;overflow-wrap:anywhere;cursor:text;display:block}.F1KBNa_quoteNoWrap .F1KBNa_quoteText{white-space:pre;overflow-wrap:normal;overflow:hidden}.F1KBNa_quoteNoWrap .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-diff-quote-width,0px) + 100%);display:inline-block}.F1KBNa_quoteSplit{align-self:stretch;align-items:flex-start;margin:0 -12px;display:flex}.F1KBNa_quoteSplitSide{flex:1 1 0;min-width:0}.F1KBNa_quoteSplitSide+.F1KBNa_quoteSplitSide{border-left:1px solid var(--dsw-alias-border-l2)}.F1KBNa_quoteSplitTable{table-layout:fixed;border-spacing:0;width:100%;display:table}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=left] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-left,0px) + 100%);display:inline-block}.F1KBNa_quoteNoWrap .F1KBNa_quoteSplit [data-diff-quote-side=right] .F1KBNa_quoteText:after{content:\"\";width:calc(var(--dsh-quote-width-right,0px) + 100%);display:inline-block}.F1KBNa_discussionHead{box-sizing:border-box;flex:none;align-items:center;gap:8px;height:22px;padding:0 12px;font-size:12px;line-height:16px;display:flex}.F1KBNa_discussionCompose{box-sizing:border-box;flex:none;align-items:flex-end;gap:8px;height:44px;margin:0 -6px;padding:0 0 6.6px;display:flex}.F1KBNa_discussionSlack{flex:1 1 0;min-height:0;max-height:22px}.F1KBNa_discussionInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);min-width:0;height:26px;color:var(--dsw-alias-label-primary);cursor:text;border-radius:6px;flex:auto;padding:3px 8px;font-family:inherit;line-height:18px}.F1KBNa_discussionToggle{width:18px;height:18px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:4px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_discussionToggle:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_discussionRangeWrap{font:var(--dsw-font-markdown-code-block);flex:none}.F1KBNa_discussionRange{color:var(--dsw-alias-label-tertiary);font-family:inherit}.F1KBNa_discussionInput:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.F1KBNa_discussionInput::placeholder{font-family:inherit;font-size:inherit;color:var(--dsw-alias-label-tertiary)}.F1KBNa_discussionSend{box-sizing:border-box;white-space:nowrap;flex:none;justify-content:center;align-items:center;gap:6px;height:26px;padding-left:9px;padding-right:9px;display:inline-flex}.F1KBNa_rowDiscussed{--diff-row-wash:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);background-image:linear-gradient(var(--diff-row-wash), var(--diff-row-wash))}@keyframes F1KBNa_diffFlashFade{0%{opacity:1}to{opacity:0}}@keyframes F1KBNa_diffFlashShake{0%{opacity:1;transform:translateY(0)}10%{transform:translateY(1px)}20%{transform:translateY(-1px)}30%{transform:translateY(1px)}40%{transform:translateY(-1px)}50%{transform:translateY(1px)}60%{transform:translateY(-1px)}70%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(0)}}.F1KBNa_overviewRuler{pointer-events:none;opacity:.5;width:4px;position:absolute;top:0;bottom:0;right:0}.F1KBNa_overviewRulerSplit{width:var(--dsh-scrollbar-width,8px);bottom:calc(var(--dsh-scrollbar-width,8px) + 1px)}.F1KBNa_overviewMarker{border-radius:2px;width:100%;min-height:2px;position:absolute;right:0}.F1KBNa_markerDel{background-color:var(--dsw-alias-state-error-primary)}.F1KBNa_markerAdd{background-color:var(--dsw-alias-state-success-primary)}.F1KBNa_markerSplitDel{width:50%;left:0;right:auto}.F1KBNa_markerSplitAdd{width:50%;left:auto;right:0}.F1KBNa_lines{border-spacing:0;width:max-content;min-width:100%;font-size:calc(1em * var(--dsh-diff-font-scale,1));display:table}.F1KBNa_line{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);-webkit-user-select:none;user-select:none;display:table-row}.F1KBNa_vSpacer{display:table-row}.F1KBNa_gutter{box-sizing:border-box;text-align:right;width:44px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;-webkit-user-select:none;user-select:none;cursor:default;padding-right:10px;display:table-cell}.F1KBNa_line>.F1KBNa_gutter{z-index:1;background-color:var(--dsw-alias-markdown-code-block);background-image:linear-gradient(var(--diff-row-tint,transparent), var(--diff-row-tint,transparent)), linear-gradient(var(--diff-row-wash,transparent), var(--diff-row-wash,transparent));position:sticky;left:0}.F1KBNa_line>.F1KBNa_gutter+.F1KBNa_gutter{left:44px}.F1KBNa_code{white-space:pre;-webkit-user-select:text;user-select:text;display:table-cell}.F1KBNa_context{color:var(--dsw-alias-label-primary)}.F1KBNa_del{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_add{--diff-row-tint:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent);background-color:var(--diff-row-tint)}.F1KBNa_statusBar{box-sizing:border-box;border-top:1px solid var(--dsw-alias-border-l2);height:34px;color:var(--dsw-alias-label-tertiary);font-family:var(--dsw-font-markdown-code-block);font-variant-numeric:tabular-nums;flex:none;align-items:center;gap:8px;padding:0 8px;font-size:12px;line-height:18px;display:flex}.F1KBNa_statusAction{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);white-space:nowrap;cursor:pointer;background:0 0;border-radius:8px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px}.F1KBNa_statusAction:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langSelect{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);cursor:pointer;background:0 0;border-radius:8px;flex:none;align-items:center;gap:4px;padding:3px 12px;font-family:inherit;font-size:12px;line-height:18px;display:inline-flex}.F1KBNa_langSelect:hover{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_langLabel{text-overflow:ellipsis;white-space:nowrap;max-width:140px;overflow:hidden}.F1KBNa_presentationSelect{cursor:pointer;height:28px;color:var(--dsw-alias-label-tertiary);background:0 0;border:none;border-radius:28px;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_presentationSelect:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_chip{justify-content:flex-end;align-items:center;gap:5px;min-width:0;padding-right:14px;display:inline-flex}.F1KBNa_chipLabel{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.F1KBNa_coverHost{align-items:center;display:inline-flex;position:relative}.F1KBNa_coverCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);box-shadow:var(--dsw-shadow-lv2);border-radius:12px;align-items:center;gap:4px;padding:6px;display:flex}.F1KBNa_coverPopover{z-index:50;position:absolute;top:calc(100% + 6px);right:0}.F1KBNa_coverNotice{z-index:80;pointer-events:none;animation:1.25s ease-out forwards F1KBNa_coverNoticeFade;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.F1KBNa_coverNoticeCard{gap:4px;padding:6px 8px}@keyframes F1KBNa_coverNoticeFade{0%,78%{opacity:1}to{opacity:0}}.F1KBNa_coverNoticeGlyph{width:44px;height:44px;color:var(--dsw-alias-label-tertiary);border-radius:10px;justify-content:center;align-items:center;display:inline-flex}.F1KBNa_coverNoticeGlyph[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_coverNoticeGlyph[data-changed]{background:var(--dsw-alias-interactive-bg-hover)}.F1KBNa_coverNoticeText{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.F1KBNa_coverButton{width:32px;height:32px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;justify-content:center;align-items:center;padding:0;display:inline-flex}.F1KBNa_coverButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_coverButton[data-on]{color:var(--dsw-alias-label-primary)}.F1KBNa_presentationHost{align-items:center;display:inline-flex}.F1KBNa_chipPresentation{min-width:36px;height:20px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:20px;flex:none;justify-content:center;align-items:center;gap:2px;padding:0 6px;display:inline-flex}.F1KBNa_chipPresentation:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.F1KBNa_mirrored{transform:scaleX(-1)}.F1KBNa_notice{z-index:60;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-base);max-width:360px;box-shadow:var(--dsw-shadow-lv3);border-radius:10px;align-items:flex-start;gap:12px;padding:12px 14px;display:flex;position:fixed;bottom:24px;right:24px}.F1KBNa_noticeText{font:var(--dsw-font-caption);color:var(--dsw-alias-label-primary);flex:1;margin:0;line-height:1.45}.F1KBNa_noticeButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font:var(--dsw-font-caption);cursor:pointer;border-radius:6px;flex:none;padding:4px 10px}.F1KBNa_noticeButton:hover{background:var(--dsw-alias-interactive-bg-hover-solid)}.F1KBNa_wrap .F1KBNa_line{height:auto;min-height:var(--dsh-diff-line-height,22px)}.F1KBNa_subline{height:var(--dsh-diff-line-height,22px);line-height:var(--dsh-diff-line-height,22px);white-space:pre;display:block;overflow:hidden}.F1KBNa_wrapActive{background:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-static-neutral-bluish-50)}.F1KBNa_wrapActive:hover{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 85%, var(--dsw-static-neutral-bluish-1000))}.F1KBNa_splitRoot{isolation:isolate;flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.F1KBNa_diffBodySplit{flex:1;min-height:0;overflow-x:hidden}.F1KBNa_splitCols{width:100%;min-width:0;min-height:100%;display:flex}.F1KBNa_splitCol{box-sizing:border-box;flex:1 1 0;min-width:0;overflow:hidden}.F1KBNa_splitDivider{background:var(--dsw-alias-border-l2);flex:0 0 1px}.F1KBNa_splitDiscussions{z-index:3;pointer-events:none;width:100%;height:0;position:absolute;top:0;left:0}.F1KBNa_splitDiscussion{box-sizing:border-box;pointer-events:auto;background:var(--dsw-alias-bg-base);position:absolute;left:0}.F1KBNa_splitSealed,.F1KBNa_splitSealed *{-webkit-user-select:none!important;user-select:none!important}.F1KBNa_splitSealedLeft [data-diff-split-side=left],.F1KBNa_splitSealedLeft [data-diff-split-side=left] *,.F1KBNa_splitSealedRight [data-diff-split-side=right],.F1KBNa_splitSealedRight [data-diff-split-side=right] *{-webkit-user-select:text!important;user-select:text!important}.F1KBNa_splitCol .F1KBNa_gutter,.F1KBNa_splitCol .F1KBNa_code{vertical-align:top}.F1KBNa_splitHScrollRow{border-top:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);flex:none;width:100%;min-width:0;display:flex}.F1KBNa_splitHScroll{overscroll-behavior-x:none;min-width:0;height:var(--dsh-scrollbar-width,8px);flex:1 1 0;overflow:auto hidden}.F1KBNa_splitHScroll::-webkit-scrollbar{height:var(--dsh-scrollbar-width,8px)}.F1KBNa_splitHScroll::-webkit-scrollbar-track{cursor:default}.F1KBNa_splitHScroll::-webkit-scrollbar-thumb{cursor:default}.F1KBNa_splitHScrollFill{height:1px}.F1KBNa_splitLdel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent)}.F1KBNa_splitLadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent)}.F1KBNa_splitRdel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 20%, transparent)}.F1KBNa_splitRadd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 18%, transparent)}.F1KBNa_intraDel{background-color:color-mix(in srgb, var(--dsh-diff-del-color,var(--dsw-alias-state-error-primary)) 34%, transparent);text-decoration:line-through}.F1KBNa_intraAdd{background-color:color-mix(in srgb, var(--dsh-diff-add-color,var(--dsw-alias-state-success-primary)) 32%, transparent)}";
25
25
  const tagId = "dsh-diff-approval/PendingPanel.module.css";
26
26
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
27
27
  const tag = document.createElement("style");
@@ -31,260 +31,272 @@ window.__ModuleLoader__.load({
31
31
  document.head.appendChild(tag);
32
32
  }
33
33
  var PendingPanel_module_css_default = {
34
- "addCount": "F1KBNa_addCount",
35
- "emptyState": "F1KBNa_emptyState",
36
- "diff": "F1KBNa_diff",
37
- "hint": "F1KBNa_hint",
38
- "listScroll": "F1KBNa_listScroll",
39
- "divergedHint": "F1KBNa_divergedHint",
40
- "colorSv": "F1KBNa_colorSv",
41
- "stepperButton": "F1KBNa_stepperButton",
42
- "treeCaret": "F1KBNa_treeCaret",
43
- "blockActionsDivider": "F1KBNa_blockActionsDivider",
44
- "discussionRangeWrap": "F1KBNa_discussionRangeWrap",
45
- "pickerNote": "F1KBNa_pickerNote",
46
- "quoteAdd": "F1KBNa_quoteAdd",
47
- "colorPickerInput": "F1KBNa_colorPickerInput",
48
- "gotoInput": "F1KBNa_gotoInput",
49
- "chipLabel": "F1KBNa_chipLabel",
50
- "splitHScrollRow": "F1KBNa_splitHScrollRow",
51
- "iconAction": "F1KBNa_iconAction",
52
- "footerButtons": "F1KBNa_footerButtons",
53
- "kindHint": "F1KBNa_kindHint",
54
- "del": "F1KBNa_del",
55
- "missingHint": "F1KBNa_missingHint",
56
- "rowDiscussed": "F1KBNa_rowDiscussed",
57
- "tree": "F1KBNa_tree",
58
- "states": "F1KBNa_states",
59
- "diffPreviewScroll": "F1KBNa_diffPreviewScroll",
60
- "settingsGroupDesc": "F1KBNa_settingsGroupDesc",
61
- "confirmBackdrop": "F1KBNa_confirmBackdrop",
62
- "rowMeta": "F1KBNa_rowMeta",
63
- "blockActions": "F1KBNa_blockActions",
64
- "markerDel": "F1KBNa_markerDel",
65
- "subline": "F1KBNa_subline",
66
- "confirmCard": "F1KBNa_confirmCard",
67
- "searchMatch": "F1KBNa_searchMatch",
68
- "badge": "F1KBNa_badge",
69
- "mdPreviewBody": "F1KBNa_mdPreviewBody",
70
- "blockPosition": "F1KBNa_blockPosition",
71
- "splitSealedLeft": "F1KBNa_splitSealedLeft",
72
- "rowMenuAnchor": "F1KBNa_rowMenuAnchor",
73
- "rail": "F1KBNa_rail",
74
- "colorPickerPopover": "F1KBNa_colorPickerPopover",
75
- "settingsGroupText": "F1KBNa_settingsGroupText",
76
- "badgeLabel": "F1KBNa_badgeLabel",
77
- "lines": "F1KBNa_lines",
78
- "fileListFloatClosing": "F1KBNa_fileListFloatClosing",
79
- "group": "F1KBNa_group",
80
- "groupHead": "F1KBNa_groupHead",
81
- "quoteSplit": "F1KBNa_quoteSplit",
34
+ "gotoLayerRight": "F1KBNa_gotoLayerRight",
35
+ "addButton": "F1KBNa_addButton",
36
+ "colorPickerPanel": "F1KBNa_colorPickerPanel",
37
+ "diffPreviewTitle": "F1KBNa_diffPreviewTitle",
38
+ "discussionNote": "F1KBNa_discussionNote",
39
+ "rowFailed": "F1KBNa_rowFailed",
40
+ "pickerForm": "F1KBNa_pickerForm",
41
+ "dockHost": "F1KBNa_dockHost",
42
+ "floatResizeHandle": "F1KBNa_floatResizeHandle",
43
+ "noticeButton": "F1KBNa_noticeButton",
44
+ "notice": "F1KBNa_notice",
82
45
  "splitCol": "F1KBNa_splitCol",
83
- "expand": "F1KBNa_expand",
84
- "chip": "F1KBNa_chip",
85
- "discussionRange": "F1KBNa_discussionRange",
86
- "mdPreviewDouble": "F1KBNa_mdPreviewDouble",
87
- "coverCard": "F1KBNa_coverCard",
88
- "fileListShrink": "F1KBNa_fileListShrink",
89
- "confirmText": "F1KBNa_confirmText",
46
+ "layer": "F1KBNa_layer",
47
+ "colorSwatch": "F1KBNa_colorSwatch",
48
+ "mdPreviewBody": "F1KBNa_mdPreviewBody",
49
+ "divider": "F1KBNa_divider",
50
+ "splitRoot": "F1KBNa_splitRoot",
51
+ "markerSplitDel": "F1KBNa_markerSplitDel",
90
52
  "discussionCode": "F1KBNa_discussionCode",
91
- "stepperButtonUp": "F1KBNa_stepperButtonUp",
92
- "listTab": "F1KBNa_listTab",
93
- "colorSvCursor": "F1KBNa_colorSvCursor",
94
- "diffHeader": "F1KBNa_diffHeader",
95
- "detailEmpty": "F1KBNa_detailEmpty",
96
- "blockFlash": "F1KBNa_blockFlash",
53
+ "group": "F1KBNa_group",
54
+ "badge": "F1KBNa_badge",
55
+ "quoteSplitSide": "F1KBNa_quoteSplitSide",
56
+ "splitHScrollFill": "F1KBNa_splitHScrollFill",
57
+ "fileListFloatClosing": "F1KBNa_fileListFloatClosing",
58
+ "bulkActions": "F1KBNa_bulkActions",
97
59
  "settingsRow": "F1KBNa_settingsRow",
60
+ "discussionHead": "F1KBNa_discussionHead",
61
+ "rowDiscussed": "F1KBNa_rowDiscussed",
62
+ "listTabs": "F1KBNa_listTabs",
63
+ "quoteLine": "F1KBNa_quoteLine",
64
+ "split": "F1KBNa_split",
98
65
  "kindTag": "F1KBNa_kindTag",
99
- "splitSealedRight": "F1KBNa_splitSealedRight",
100
- "context": "F1KBNa_context",
101
- "pickerForm": "F1KBNa_pickerForm",
102
- "importNote": "F1KBNa_importNote",
103
- "searchBar": "F1KBNa_searchBar",
66
+ "gotoLayer": "F1KBNa_gotoLayer",
104
67
  "langLabel": "F1KBNa_langLabel",
105
- "toggleThumb": "F1KBNa_toggleThumb",
106
- "bulkActions": "F1KBNa_bulkActions",
107
- "noticeButton": "F1KBNa_noticeButton",
108
- "discussionDot": "F1KBNa_discussionDot",
109
- "listHead": "F1KBNa_listHead",
110
- "gutter": "F1KBNa_gutter",
111
- "rows": "F1KBNa_rows",
112
- "settingsRowTitle": "F1KBNa_settingsRowTitle",
68
+ "tabCount": "F1KBNa_tabCount",
69
+ "groupHead": "F1KBNa_groupHead",
70
+ "presentationSelect": "F1KBNa_presentationSelect",
71
+ "searchToggleOn": "F1KBNa_searchToggleOn",
72
+ "overviewRuler": "F1KBNa_overviewRuler",
73
+ "coverNotice": "F1KBNa_coverNotice",
74
+ "flexSpacer": "F1KBNa_flexSpacer",
75
+ "panelDocked": "F1KBNa_panelDocked",
113
76
  "action": "F1KBNa_action",
114
- "panelFailureText": "F1KBNa_panelFailureText",
115
- "layer": "F1KBNa_layer",
116
- "mirrored": "F1KBNa_mirrored",
117
- "toggleOn": "F1KBNa_toggleOn",
118
- "actionPrimary": "F1KBNa_actionPrimary",
119
- "note": "F1KBNa_note",
120
- "rowHead": "F1KBNa_rowHead",
121
- "threadFontProbe": "F1KBNa_threadFontProbe",
122
- "settingsPage": "F1KBNa_settingsPage",
123
- "colorSwatch": "F1KBNa_colorSwatch",
124
- "pickerTitle": "F1KBNa_pickerTitle",
125
- "discussionHead": "F1KBNa_discussionHead",
126
- "quoteCode": "F1KBNa_quoteCode",
77
+ "discussionDot": "F1KBNa_discussionDot",
78
+ "splitDiscussions": "F1KBNa_splitDiscussions",
127
79
  "settingsRowText": "F1KBNa_settingsRowText",
128
- "discussionUser": "F1KBNa_discussionUser",
129
- "readError": "F1KBNa_readError",
130
- "panelFailureRetry": "F1KBNa_panelFailureRetry",
131
- "coverNoticeGlyph": "F1KBNa_coverNoticeGlyph",
132
- "fileListFloat": "F1KBNa_fileListFloat",
133
- "coverNotice": "F1KBNa_coverNotice",
134
- "discussionAnswer": "F1KBNa_discussionAnswer",
135
- "coverNoticeFade": "F1KBNa_coverNoticeFade",
136
- "coverBackdrop": "F1KBNa_coverBackdrop",
137
- "listEmpty": "F1KBNa_listEmpty",
138
- "vSpacer": "F1KBNa_vSpacer",
139
- "split": "F1KBNa_split",
140
- "divider": "F1KBNa_divider",
80
+ "discussionSend": "F1KBNa_discussionSend",
81
+ "settingsGroupBody": "F1KBNa_settingsGroupBody",
82
+ "discussionBody": "F1KBNa_discussionBody",
83
+ "intraAdd": "F1KBNa_intraAdd",
84
+ "splitHScroll": "F1KBNa_splitHScroll",
85
+ "colorValue": "F1KBNa_colorValue",
86
+ "tree": "F1KBNa_tree",
87
+ "diffPreview": "F1KBNa_diffPreview",
88
+ "missingHint": "F1KBNa_missingHint",
89
+ "searchMatchCurrent": "F1KBNa_searchMatchCurrent",
90
+ "diffFlashShake": "F1KBNa_diffFlashShake",
91
+ "discussionPin": "F1KBNa_discussionPin",
92
+ "quoteSplit": "F1KBNa_quoteSplit",
93
+ "fileListKnobIn": "F1KBNa_fileListKnobIn",
94
+ "stepperButton": "F1KBNa_stepperButton",
141
95
  "pickerIcon": "F1KBNa_pickerIcon",
142
- "headerActions": "F1KBNa_headerActions",
143
- "settingsReset": "F1KBNa_settingsReset",
144
- "coverPopover": "F1KBNa_coverPopover",
145
- "addButton": "F1KBNa_addButton",
146
- "diffPath": "F1KBNa_diffPath",
147
- "commentLost": "F1KBNa_commentLost",
148
- "stepper": "F1KBNa_stepper",
149
- "searchInput": "F1KBNa_searchInput",
150
- "statusBar": "F1KBNa_statusBar",
151
- "splitLdel": "F1KBNa_splitLdel",
152
- "colorPickerInputRow": "F1KBNa_colorPickerInputRow",
96
+ "kindHint": "F1KBNa_kindHint",
97
+ "rowMenuAnchor": "F1KBNa_rowMenuAnchor",
98
+ "splitSealedRight": "F1KBNa_splitSealedRight",
99
+ "discussionSlack": "F1KBNa_discussionSlack",
100
+ "splitRdel": "F1KBNa_splitRdel",
101
+ "settingsGroupText": "F1KBNa_settingsGroupText",
102
+ "importNote": "F1KBNa_importNote",
103
+ "diffBodyWrap": "F1KBNa_diffBodyWrap",
104
+ "pickerNote": "F1KBNa_pickerNote",
105
+ "diffBodySplit": "F1KBNa_diffBodySplit",
106
+ "coverButton": "F1KBNa_coverButton",
107
+ "quoteDel": "F1KBNa_quoteDel",
153
108
  "listFold": "F1KBNa_listFold",
154
- "quoteSplitSide": "F1KBNa_quoteSplitSide",
155
- "markerAdd": "F1KBNa_markerAdd",
156
- "overviewRuler": "F1KBNa_overviewRuler",
157
- "badgeCount": "F1KBNa_badgeCount",
158
- "settingsGroupBody": "F1KBNa_settingsGroupBody",
159
- "panelDocked": "F1KBNa_panelDocked",
160
- "colorPickerPanel": "F1KBNa_colorPickerPanel",
161
- "pickerCheck": "F1KBNa_pickerCheck",
109
+ "treeCaret": "F1KBNa_treeCaret",
110
+ "mdPreviewDouble": "F1KBNa_mdPreviewDouble",
111
+ "colorSv": "F1KBNa_colorSv",
112
+ "commentHead": "F1KBNa_commentHead",
113
+ "fileListKnob": "F1KBNa_fileListKnob",
114
+ "confirmBackdrop": "F1KBNa_confirmBackdrop",
115
+ "listScroll": "F1KBNa_listScroll",
116
+ "diffFlashFade": "F1KBNa_diffFlashFade",
117
+ "hint": "F1KBNa_hint",
118
+ "actionQuietDisabled": "F1KBNa_actionQuietDisabled",
119
+ "subline": "F1KBNa_subline",
120
+ "gutter": "F1KBNa_gutter",
121
+ "colorPicker": "F1KBNa_colorPicker",
122
+ "colorPickerTrigger": "F1KBNa_colorPickerTrigger",
162
123
  "searchCount": "F1KBNa_searchCount",
163
- "splitHScrollFill": "F1KBNa_splitHScrollFill",
164
- "settingsGroupHeader": "F1KBNa_settingsGroupHeader",
124
+ "splitDiscussion": "F1KBNa_splitDiscussion",
125
+ "settingsSelector": "F1KBNa_settingsSelector",
126
+ "discussionRangeWrap": "F1KBNa_discussionRangeWrap",
127
+ "splitLadd": "F1KBNa_splitLadd",
128
+ "stepper": "F1KBNa_stepper",
129
+ "badgeLabel": "F1KBNa_badgeLabel",
130
+ "commentRow": "F1KBNa_commentRow",
131
+ "rowHead": "F1KBNa_rowHead",
132
+ "colorPickerPreview": "F1KBNa_colorPickerPreview",
133
+ "quoteText": "F1KBNa_quoteText",
165
134
  "expandExpanded": "F1KBNa_expandExpanded",
166
- "searchToggle": "F1KBNa_searchToggle",
167
- "presentationHost": "F1KBNa_presentationHost",
168
- "line": "F1KBNa_line",
135
+ "settingsRowLink": "F1KBNa_settingsRowLink",
136
+ "markerAdd": "F1KBNa_markerAdd",
137
+ "colorPickerInputRow": "F1KBNa_colorPickerInputRow",
138
+ "discussionRow": "F1KBNa_discussionRow",
139
+ "coverHost": "F1KBNa_coverHost",
140
+ "stepperValue": "F1KBNa_stepperValue",
141
+ "colorPickerPopover": "F1KBNa_colorPickerPopover",
142
+ "colorHue": "F1KBNa_colorHue",
169
143
  "close": "F1KBNa_close",
170
- "discussionInput": "F1KBNa_discussionInput",
171
- "settingsRowDesc": "F1KBNa_settingsRowDesc",
172
- "treeName": "F1KBNa_treeName",
173
- "quoteNoWrap": "F1KBNa_quoteNoWrap",
174
- "splitDiscussions": "F1KBNa_splitDiscussions",
175
- "fileListKnobIn": "F1KBNa_fileListKnobIn",
176
- "splitDiscussion": "F1KBNa_splitDiscussion",
177
- "listTitle": "F1KBNa_listTitle",
178
- "commentTitle": "F1KBNa_commentTitle",
179
- "detail": "F1KBNa_detail",
180
- "colorPicker": "F1KBNa_colorPicker",
181
- "diffPreviewTitle": "F1KBNa_diffPreviewTitle",
182
- "colorHueCursor": "F1KBNa_colorHueCursor",
144
+ "mirrored": "F1KBNa_mirrored",
145
+ "settingsRowTitle": "F1KBNa_settingsRowTitle",
146
+ "coverNoticeCard": "F1KBNa_coverNoticeCard",
183
147
  "discussionCompose": "F1KBNa_discussionCompose",
184
- "coverButton": "F1KBNa_coverButton",
185
- "discussionDots": "F1KBNa_discussionDots",
186
- "discussionSlack": "F1KBNa_discussionSlack",
187
- "mdPreviewSingle": "F1KBNa_mdPreviewSingle",
188
- "colorPickerTrigger": "F1KBNa_colorPickerTrigger",
189
- "searchMatchCurrent": "F1KBNa_searchMatchCurrent",
190
148
  "confirmActions": "F1KBNa_confirmActions",
191
- "presentationSelect": "F1KBNa_presentationSelect",
192
- "panel": "F1KBNa_panel",
149
+ "colorBackdrop": "F1KBNa_colorBackdrop",
150
+ "readError": "F1KBNa_readError",
151
+ "importButton": "F1KBNa_importButton",
152
+ "coverCard": "F1KBNa_coverCard",
153
+ "toggle": "F1KBNa_toggle",
193
154
  "noticeText": "F1KBNa_noticeText",
194
- "diffFlashFade": "F1KBNa_diffFlashFade",
195
- "splitHScroll": "F1KBNa_splitHScroll",
196
155
  "resizeHandle": "F1KBNa_resizeHandle",
197
- "stepperValue": "F1KBNa_stepperValue",
198
- "colorBackdrop": "F1KBNa_colorBackdrop",
199
- "quoteText": "F1KBNa_quoteText",
200
- "coverNoticeCard": "F1KBNa_coverNoticeCard",
156
+ "note": "F1KBNa_note",
157
+ "actionPrimary": "F1KBNa_actionPrimary",
201
158
  "coverNoticeText": "F1KBNa_coverNoticeText",
202
- "notice": "F1KBNa_notice",
159
+ "diffPreviewScroll": "F1KBNa_diffPreviewScroll",
203
160
  "settingsGroup": "F1KBNa_settingsGroup",
161
+ "splitSealed": "F1KBNa_splitSealed",
162
+ "footerButtons": "F1KBNa_footerButtons",
163
+ "blockPosition": "F1KBNa_blockPosition",
204
164
  "pickerCard": "F1KBNa_pickerCard",
205
- "splitRoot": "F1KBNa_splitRoot",
206
- "listTabs": "F1KBNa_listTabs",
207
- "splitCols": "F1KBNa_splitCols",
165
+ "panelFailureText": "F1KBNa_panelFailureText",
166
+ "discussionUser": "F1KBNa_discussionUser",
167
+ "settingsRowDesc": "F1KBNa_settingsRowDesc",
208
168
  "delCount": "F1KBNa_delCount",
209
- "splitSealed": "F1KBNa_splitSealed",
210
- "actionQuietDisabled": "F1KBNa_actionQuietDisabled",
211
- "quoteDel": "F1KBNa_quoteDel",
212
- "discussionBody": "F1KBNa_discussionBody",
213
- "diffStats": "F1KBNa_diffStats",
214
- "intraDel": "F1KBNa_intraDel",
215
- "colorPickerChevron": "F1KBNa_colorPickerChevron",
216
- "dockHost": "F1KBNa_dockHost",
217
- "gotoBox": "F1KBNa_gotoBox",
169
+ "discussionInput": "F1KBNa_discussionInput",
170
+ "overviewRulerSplit": "F1KBNa_overviewRulerSplit",
171
+ "commentTitle": "F1KBNa_commentTitle",
172
+ "code": "F1KBNa_code",
173
+ "line": "F1KBNa_line",
174
+ "gotoInput": "F1KBNa_gotoInput",
175
+ "wrapActive": "F1KBNa_wrapActive",
176
+ "iconAction": "F1KBNa_iconAction",
177
+ "commentLost": "F1KBNa_commentLost",
178
+ "mdPreviewFallback": "F1KBNa_mdPreviewFallback",
179
+ "statusAction": "F1KBNa_statusAction",
180
+ "settingsGroupHeader": "F1KBNa_settingsGroupHeader",
181
+ "actionChord": "F1KBNa_actionChord",
182
+ "listTitle": "F1KBNa_listTitle",
183
+ "splitHScrollRow": "F1KBNa_splitHScrollRow",
184
+ "colorHueCursor": "F1KBNa_colorHueCursor",
185
+ "colorSvCursor": "F1KBNa_colorSvCursor",
186
+ "quoteSplitTable": "F1KBNa_quoteSplitTable",
187
+ "pickerInput": "F1KBNa_pickerInput",
188
+ "panel": "F1KBNa_panel",
189
+ "diff": "F1KBNa_diff",
190
+ "gotoHost": "F1KBNa_gotoHost",
191
+ "blockFlash": "F1KBNa_blockFlash",
192
+ "rowMeta": "F1KBNa_rowMeta",
193
+ "panelFailure": "F1KBNa_panelFailure",
194
+ "stepperButtonUp": "F1KBNa_stepperButtonUp",
195
+ "searchMatch": "F1KBNa_searchMatch",
196
+ "overviewMarker": "F1KBNa_overviewMarker",
197
+ "title": "F1KBNa_title",
198
+ "lines": "F1KBNa_lines",
199
+ "wrap": "F1KBNa_wrap",
200
+ "add": "F1KBNa_add",
201
+ "addPath": "F1KBNa_addPath",
202
+ "coverNoticeFade": "F1KBNa_coverNoticeFade",
218
203
  "splitDivider": "F1KBNa_splitDivider",
219
- "discussionToggle": "F1KBNa_discussionToggle",
220
- "diffBodySplit": "F1KBNa_diffBodySplit",
221
- "discussionRow": "F1KBNa_discussionRow",
204
+ "splitLdel": "F1KBNa_splitLdel",
205
+ "listHead": "F1KBNa_listHead",
206
+ "divergedHint": "F1KBNa_divergedHint",
207
+ "blockActionsDivider": "F1KBNa_blockActionsDivider",
208
+ "quoteLines": "F1KBNa_quoteLines",
209
+ "colorPickerChevron": "F1KBNa_colorPickerChevron",
210
+ "mdPreviewSingle": "F1KBNa_mdPreviewSingle",
211
+ "fileList": "F1KBNa_fileList",
222
212
  "commentLabel": "F1KBNa_commentLabel",
223
- "settingsGroupChevron": "F1KBNa_settingsGroupChevron",
224
- "splitLadd": "F1KBNa_splitLadd",
225
- "diffBodyWrap": "F1KBNa_diffBodyWrap",
226
- "colorValue": "F1KBNa_colorValue",
227
- "overviewMarker": "F1KBNa_overviewMarker",
228
- "rowFailed": "F1KBNa_rowFailed",
229
- "searchToggleOn": "F1KBNa_searchToggleOn",
230
- "actionChord": "F1KBNa_actionChord",
231
- "mdPreviewWrap": "F1KBNa_mdPreviewWrap",
232
- "mdPreviewFallback": "F1KBNa_mdPreviewFallback",
233
- "wrapActive": "F1KBNa_wrapActive",
234
- "mdPreviewContent": "F1KBNa_mdPreviewContent",
235
- "pickerName": "F1KBNa_pickerName",
236
213
  "rowPath": "F1KBNa_rowPath",
237
- "fileList": "F1KBNa_fileList",
238
- "settingsSelector": "F1KBNa_settingsSelector",
239
- "commentRow": "F1KBNa_commentRow",
240
- "commentHead": "F1KBNa_commentHead",
241
- "treeRow": "F1KBNa_treeRow",
242
- "diffActions": "F1KBNa_diffActions",
243
- "diffBody": "F1KBNa_diffBody",
244
- "actionError": "F1KBNa_actionError",
245
- "importButton": "F1KBNa_importButton",
246
- "pickerInput": "F1KBNa_pickerInput",
247
- "splitRadd": "F1KBNa_splitRadd",
248
- "code": "F1KBNa_code",
249
- "floatResizeHandle": "F1KBNa_floatResizeHandle",
214
+ "listEmpty": "F1KBNa_listEmpty",
215
+ "expand": "F1KBNa_expand",
250
216
  "blockFlashShake": "F1KBNa_blockFlashShake",
251
- "discussionSend": "F1KBNa_discussionSend",
252
- "noteCentered": "F1KBNa_noteCentered",
253
217
  "header": "F1KBNa_header",
254
- "add": "F1KBNa_add",
218
+ "commentGroupName": "F1KBNa_commentGroupName",
219
+ "discussionAnswer": "F1KBNa_discussionAnswer",
220
+ "mdPreviewWrap": "F1KBNa_mdPreviewWrap",
221
+ "threadFontProbe": "F1KBNa_threadFontProbe",
222
+ "splitCols": "F1KBNa_splitCols",
223
+ "diffBody": "F1KBNa_diffBody",
224
+ "panelFailureRetry": "F1KBNa_panelFailureRetry",
225
+ "markerSplitAdd": "F1KBNa_markerSplitAdd",
226
+ "confirmText": "F1KBNa_confirmText",
227
+ "langSelect": "F1KBNa_langSelect",
228
+ "pickerTitle": "F1KBNa_pickerTitle",
229
+ "chip": "F1KBNa_chip",
230
+ "gotoAction": "F1KBNa_gotoAction",
231
+ "diffActions": "F1KBNa_diffActions",
232
+ "blockActions": "F1KBNa_blockActions",
233
+ "coverNoticeGlyph": "F1KBNa_coverNoticeGlyph",
234
+ "discussionToggle": "F1KBNa_discussionToggle",
235
+ "emptyState": "F1KBNa_emptyState",
236
+ "chipLabel": "F1KBNa_chipLabel",
237
+ "listTab": "F1KBNa_listTab",
238
+ "emptyActions": "F1KBNa_emptyActions",
239
+ "commentGroup": "F1KBNa_commentGroup",
240
+ "coverPopover": "F1KBNa_coverPopover",
241
+ "coverBackdrop": "F1KBNa_coverBackdrop",
242
+ "treeName": "F1KBNa_treeName",
243
+ "rows": "F1KBNa_rows",
244
+ "mdPreviewContent": "F1KBNa_mdPreviewContent",
255
245
  "chipPresentation": "F1KBNa_chipPresentation",
256
- "toggle": "F1KBNa_toggle",
257
- "statusAction": "F1KBNa_statusAction",
258
- "intraAdd": "F1KBNa_intraAdd",
259
- "title": "F1KBNa_title",
246
+ "splitSealedLeft": "F1KBNa_splitSealedLeft",
260
247
  "row": "F1KBNa_row",
261
- "headerEntryCount": "F1KBNa_headerEntryCount",
248
+ "settingsGroupChevron": "F1KBNa_settingsGroupChevron",
249
+ "addCount": "F1KBNa_addCount",
250
+ "vSpacer": "F1KBNa_vSpacer",
251
+ "fileListShrink": "F1KBNa_fileListShrink",
252
+ "statusBar": "F1KBNa_statusBar",
253
+ "presentationHost": "F1KBNa_presentationHost",
254
+ "searchBar": "F1KBNa_searchBar",
255
+ "fileListFloat": "F1KBNa_fileListFloat",
256
+ "context": "F1KBNa_context",
257
+ "discussionRange": "F1KBNa_discussionRange",
258
+ "headerActions": "F1KBNa_headerActions",
259
+ "detailEmpty": "F1KBNa_detailEmpty",
260
+ "quoteAdd": "F1KBNa_quoteAdd",
261
+ "colorPickerInput": "F1KBNa_colorPickerInput",
262
+ "intraDel": "F1KBNa_intraDel",
262
263
  "settingsGroupTitle": "F1KBNa_settingsGroupTitle",
263
- "flexSpacer": "F1KBNa_flexSpacer",
264
- "discussionPin": "F1KBNa_discussionPin",
265
- "discussionNote": "F1KBNa_discussionNote",
266
- "discussionCell": "F1KBNa_discussionCell",
267
- "quoteLine": "F1KBNa_quoteLine",
268
- "splitRdel": "F1KBNa_splitRdel",
269
- "langSelect": "F1KBNa_langSelect",
270
- "coverHost": "F1KBNa_coverHost",
271
- "headerEntry": "F1KBNa_headerEntry",
264
+ "rail": "F1KBNa_rail",
265
+ "settingsReset": "F1KBNa_settingsReset",
266
+ "detail": "F1KBNa_detail",
267
+ "toggleThumb": "F1KBNa_toggleThumb",
268
+ "pickerName": "F1KBNa_pickerName",
269
+ "diffHeader": "F1KBNa_diffHeader",
270
+ "quoteNoWrap": "F1KBNa_quoteNoWrap",
271
+ "badgeCount": "F1KBNa_badgeCount",
272
+ "quoteCode": "F1KBNa_quoteCode",
272
273
  "discussion": "F1KBNa_discussion",
273
- "quoteLines": "F1KBNa_quoteLines",
274
+ "diffStats": "F1KBNa_diffStats",
275
+ "headerEntry": "F1KBNa_headerEntry",
276
+ "gotoBackdrop": "F1KBNa_gotoBackdrop",
277
+ "del": "F1KBNa_del",
278
+ "pickerCheck": "F1KBNa_pickerCheck",
274
279
  "treeNote": "F1KBNa_treeNote",
275
- "colorHue": "F1KBNa_colorHue",
276
- "addPath": "F1KBNa_addPath",
277
- "wrap": "F1KBNa_wrap",
278
- "colorPickerPreview": "F1KBNa_colorPickerPreview",
280
+ "searchInput": "F1KBNa_searchInput",
281
+ "settingsGroupDesc": "F1KBNa_settingsGroupDesc",
282
+ "toggleOn": "F1KBNa_toggleOn",
283
+ "actionError": "F1KBNa_actionError",
284
+ "commentTitleEmpty": "F1KBNa_commentTitleEmpty",
285
+ "markerDel": "F1KBNa_markerDel",
286
+ "discussionDots": "F1KBNa_discussionDots",
287
+ "diffPath": "F1KBNa_diffPath",
288
+ "treeRow": "F1KBNa_treeRow",
289
+ "settingsPage": "F1KBNa_settingsPage",
290
+ "confirmCard": "F1KBNa_confirmCard",
291
+ "splitRadd": "F1KBNa_splitRadd",
292
+ "headerEntryCount": "F1KBNa_headerEntryCount",
293
+ "states": "F1KBNa_states",
294
+ "noteCentered": "F1KBNa_noteCentered",
295
+ "gotoBox": "F1KBNa_gotoBox",
296
+ "searchToggle": "F1KBNa_searchToggle",
297
+ "discussionCell": "F1KBNa_discussionCell",
279
298
  "pickerClose": "F1KBNa_pickerClose",
280
- "quoteSplitTable": "F1KBNa_quoteSplitTable",
281
- "diffFlashShake": "F1KBNa_diffFlashShake",
282
- "emptyActions": "F1KBNa_emptyActions",
283
- "missing": "F1KBNa_missing",
284
- "diffPreview": "F1KBNa_diffPreview",
285
- "tabCount": "F1KBNa_tabCount",
286
- "panelFailure": "F1KBNa_panelFailure",
287
- "fileListKnob": "F1KBNa_fileListKnob"
299
+ "missing": "F1KBNa_missing"
288
300
  };
289
301
  //#endregion
290
302
  //#region lib/types/client/PathPicker.js
@@ -816,6 +828,7 @@ window.__ModuleLoader__.load({
816
828
  const FILE_LIST_FLOAT_KEY = "diff-approval:file-list-float";
817
829
  const COMMENT_MODE_PREVIEW_KEY = "diff-approval:comment-mode-preview";
818
830
  const WRAP_PREFIX = "diff-approval:wrap:";
831
+ const CODE_FONT_KEY = "diff-approval:code-font";
819
832
  /** The floating panel's default coverage: the header and both sidebars, not the
820
833
  * composer. */
821
834
  const FLOAT_COVER_DEFAULT = {
@@ -1135,6 +1148,26 @@ window.__ModuleLoader__.load({
1135
1148
  if (typeof window !== "undefined") window.dispatchEvent(new CustomEvent(COMMENT_MODE_CHANGED_EVENT));
1136
1149
  }
1137
1150
  /**
1151
+ * Whether the diff's code uses the font this plugin bundles.
1152
+ *
1153
+ * Defaults to **off**: the bundled face is JetBrains Maple Mono subset and
1154
+ * sliced into 138 woff2 files, and a page pulls the slices its characters land
1155
+ * in — tens of kilobytes for a comment, up to ~120 KB for a rare character. That
1156
+ * is real traffic, so it is the reader's decision, not a default they discover.
1157
+ * Only an explicit `'1'` enables it.
1158
+ * @returns whether the bundled code font is enabled.
1159
+ */
1160
+ function codeFontEnabled() {
1161
+ return localStorage.getItem(CODE_FONT_KEY) === "1";
1162
+ }
1163
+ /** Window event: the bundled code font was turned on or off (see {@link setCodeFontEnabled}). */
1164
+ const CODE_FONT_CHANGED_EVENT = "diff-approval:code-font";
1165
+ /** Persist the bundled-code-font preference. */
1166
+ function setCodeFontEnabled(value) {
1167
+ localStorage.setItem(CODE_FONT_KEY, value ? "1" : "0");
1168
+ if (typeof window !== "undefined") window.dispatchEvent(new CustomEvent(CODE_FONT_CHANGED_EVENT));
1169
+ }
1170
+ /**
1138
1171
  * The Markdown-preview content max width, in pixels (single column). Defaults to
1139
1172
  * 800; the double-column view totals 2x this. An out-of-range or non-integer
1140
1173
  * value falls back to the default.
@@ -4892,7 +4925,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
4892
4925
  let seal = Object.seal;
4893
4926
  let create$1 = Object.create;
4894
4927
  let _ref = typeof Reflect !== "undefined" && Reflect;
4895
- let apply$1 = _ref.apply;
4928
+ let apply$2 = _ref.apply;
4896
4929
  let construct = _ref.construct;
4897
4930
  if (!freeze) freeze = function freeze(x) {
4898
4931
  return x;
@@ -4900,7 +4933,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
4900
4933
  if (!seal) seal = function seal(x) {
4901
4934
  return x;
4902
4935
  };
4903
- if (!apply$1) apply$1 = function apply(func, thisArg) {
4936
+ if (!apply$2) apply$2 = function apply(func, thisArg) {
4904
4937
  for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) args[_key - 2] = arguments[_key];
4905
4938
  return func.apply(thisArg, args);
4906
4939
  };
@@ -4938,7 +4971,7 @@ Please report this to https://github.com/markedjs/marked.`, e) {
4938
4971
  return function(thisArg) {
4939
4972
  if (thisArg instanceof RegExp) thisArg.lastIndex = 0;
4940
4973
  for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) args[_key3 - 1] = arguments[_key3];
4941
- return apply$1(func, thisArg, args);
4974
+ return apply$2(func, thisArg, args);
4942
4975
  };
4943
4976
  }
4944
4977
  /**
@@ -19522,6 +19555,29 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
19522
19555
  });
19523
19556
  }
19524
19557
  /**
19558
+ * Drop every thread whose file the list no longer holds.
19559
+ *
19560
+ * A thread is a block of rows in one file's diff, so a file the reader has kept or reverted out of the
19561
+ * list leaves nothing for its comments to hang on: they go with it, and the same path coming back later
19562
+ * in this visit starts clean. A new object is published only when something actually goes, so the panes
19563
+ * that adopt this record (see `COMMENTS_CHANGED_EVENT`) do not re-adopt an equal object on every poll.
19564
+ *
19565
+ * @param sessionId - the session the panel is reviewing; nothing is dropped without one.
19566
+ * @param listed - the pending entry ids the list is holding.
19567
+ */
19568
+ function forgetDiscussionsNotIn(sessionId, listed) {
19569
+ if (sessionId === void 0) return;
19570
+ const before = threads.get(sessionId);
19571
+ if (before === void 0) return;
19572
+ const held = new Set(listed);
19573
+ const kept = {};
19574
+ let dropped = false;
19575
+ for (const [fileId, list] of Object.entries(before)) if (held.has(fileId)) kept[fileId] = list;
19576
+ else dropped = true;
19577
+ if (!dropped) return;
19578
+ rememberDiscussions(sessionId, kept);
19579
+ }
19580
+ /**
19525
19581
  * The files this page has been told to stop asking about, by session.
19526
19582
  *
19527
19583
  * Keeping or reverting a file asks whether the row should leave the list, and a reader working
@@ -20214,6 +20270,17 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
20214
20270
  */
20215
20271
  const THREAD_ROW_PX = 22;
20216
20272
  /**
20273
+ * How close to a row's own height a measured block may sit and still count as that row, in px.
20274
+ *
20275
+ * A block whose content is a whole number of rows lands on either side of the pixel grid from one pass
20276
+ * to the next — the browser snaps the paint, so the same block measures 572.0004 one pass and 571.9996
20277
+ * the next. Rounding up without a band reads that as 27 rows and then 26, and every flip is a state
20278
+ * write from a layout effect: React counts those as nested updates and throws at fifty (minified #185,
20279
+ * which took the whole panel down). One pixel is far below any real change — the measurement is a row
20280
+ * grid — so a figure this close to the row below it IS that row.
20281
+ */
20282
+ const DISCUSSION_ROW_SNAP_PX = 1;
20283
+ /**
20217
20284
  * The share of the thread's prose size an inline-code chip is drawn at (mirrors
20218
20285
  * `.discussionCode`'s `font-size: 0.875em`, which is the chat's own inline code against its own
20219
20286
  * message text). The chip is measured in its own font, not in the prose one — a code face at
@@ -20389,7 +20456,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
20389
20456
  * A thread that has not been sent yet has no turn at all: what the reader has typed so far is its
20390
20457
  * draft, and that is what the item shows, so a comment being written is not listed as a blank line.
20391
20458
  * A thread with neither has nothing to quote — an empty comment box the reader placed and left — and
20392
- * the caller passes in the word for that (see the list).
20459
+ * the caller names it with the box's own placeholder, so the item says what that box is asking for
20460
+ * rather than claiming a title (see the list).
20393
20461
  *
20394
20462
  * @param discussion - the thread to name.
20395
20463
  * @returns the title, or an empty string when there is nothing to say yet.
@@ -21076,6 +21144,22 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
21076
21144
  }
21077
21145
  return block.oldStart <= oldMin && block.oldEnd >= oldMax && block.newStart <= newMin && block.newEnd >= newMax;
21078
21146
  }
21147
+ /**
21148
+ * Which change block to focus once the operated one has left the diff.
21149
+ *
21150
+ * The operated block(s) are gone, so the change that followed them slid into the slot they held: focusing
21151
+ * that same index is what recenters and flashes the NEXT change. An operated range that reached the END of
21152
+ * the diff has no such change — every block still pending is above the reader — so the walk wraps to the
21153
+ * first one, the same wrap the prev/next stepping does. Clamping to the last index instead left the focus
21154
+ * pointing past the shorter diff, and then nothing was focused, flashed or scrolled at all.
21155
+ *
21156
+ * @param operated - the index the operated range started at.
21157
+ * @param count - how many blocks the diff holds NOW, after the action.
21158
+ * @returns the block index to focus.
21159
+ */
21160
+ function blockAfterAction(operated, count) {
21161
+ return operated >= count ? 0 : operated;
21162
+ }
21079
21163
  /** Row indices whose text matches `query` under the options; empty for ''. Counted
21080
21164
  * through the same matcher the highlights use, so the tally can never disagree
21081
21165
  * with what is drawn. */
@@ -21170,7 +21254,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
21170
21254
  });
21171
21255
  }
21172
21256
  /** The two-column (side-by-side) whole-file diff view. */
21173
- const SplitDiff = (0, react.forwardRef)(function SplitDiff({ file, model, runs, langWrap, tabWidthSpaces, busy, t, selection, leadRows, onBlockKeep, onBlockRevert, onWrapToast, onVisibleLines, discussions, renderDiscussion, selectionComment }, ref) {
21257
+ const SplitDiff = (0, react.forwardRef)(function SplitDiff({ file, model, runs, langWrap, tabWidthSpaces, busy, t, selection, leadRows, onBlockKeep, onBlockRevert, onWrapToast, onVisibleLines, discussions, renderDiscussion, selectionComment, rulerRuns, gotoDialog }, ref) {
21174
21258
  const ROW_HEIGHT_PX = diffLineHeight();
21175
21259
  const NAV_ANCHOR_TOLERANCE_PX = ROW_HEIGHT_PX / 4;
21176
21260
  const { pairs, pairOfRow } = (0, react.useMemo)(() => computeSideBySideDiff(model.diff.rows, true), [model]);
@@ -21348,6 +21432,41 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
21348
21432
  ]);
21349
21433
  const totalHeight = pairOffsets === null ? pairCount * ROW_HEIGHT_PX : pairOffsets[pairCount] ?? 0;
21350
21434
  const off = (k) => pairOffsets === null ? k * ROW_HEIGHT_PX : pairOffsets[Math.max(0, Math.min(k, pairCount))] ?? 0;
21435
+ /**
21436
+ * The overview ruler's markers, in the height table's own units: a run's rows are mapped to the PAIRS
21437
+ * they sit in, because pairs are what this view's offsets measure. A change that renders on both sides
21438
+ * — a del pair with the add beside it — lands in the same band and contributes both markers, exactly
21439
+ * like the preview's double column: the ruler says "this stretch changed", and which side changed is
21440
+ * what the two columns themselves show.
21441
+ */
21442
+ const rulerMarkersNow = (0, react.useMemo)(() => {
21443
+ if (totalHeight <= 0 || pairCount === 0) return [];
21444
+ const at = (k) => pairOffsets === null ? k * ROW_HEIGHT_PX : pairOffsets[Math.max(0, Math.min(k, pairCount))] ?? 0;
21445
+ return rulerRuns.flatMap((run) => {
21446
+ let first = -1;
21447
+ let last = -1;
21448
+ for (let row = run.start; row <= run.end; row++) {
21449
+ const pair = pairOfRow.get(row);
21450
+ if (pair === void 0) continue;
21451
+ if (first === -1) first = pair;
21452
+ last = pair;
21453
+ }
21454
+ if (first === -1) return [];
21455
+ const top = pairOffsets === null ? first / pairCount : at(first) / totalHeight;
21456
+ const bottom = pairOffsets === null ? (last + 1) / pairCount : at(last + 1) / totalHeight;
21457
+ return [{
21458
+ top: top * 100,
21459
+ height: Math.max(0, bottom - top) * 100,
21460
+ kind: run.kind
21461
+ }];
21462
+ });
21463
+ }, [
21464
+ rulerRuns,
21465
+ pairOfRow,
21466
+ pairCount,
21467
+ pairOffsets,
21468
+ totalHeight
21469
+ ]);
21351
21470
  const pairHeightAt = (k) => pairHeights === null ? ROW_HEIGHT_PX : pairHeights[k] ?? ROW_HEIGHT_PX;
21352
21471
  const widestSide = (0, react.useMemo)(() => {
21353
21472
  let left = 0;
@@ -21381,13 +21500,49 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
21381
21500
  tabWidthSpaces,
21382
21501
  bodyWidth
21383
21502
  ]);
21503
+ const ctrlHeldRef = (0, react.useRef)(false);
21504
+ (0, react.useEffect)(() => {
21505
+ const track = (event) => {
21506
+ ctrlHeldRef.current = event.ctrlKey || event.metaKey;
21507
+ };
21508
+ const release = () => {
21509
+ ctrlHeldRef.current = false;
21510
+ };
21511
+ window.addEventListener("keydown", track);
21512
+ window.addEventListener("keyup", track);
21513
+ window.addEventListener("blur", release);
21514
+ return () => {
21515
+ window.removeEventListener("keydown", track);
21516
+ window.removeEventListener("keyup", track);
21517
+ window.removeEventListener("blur", release);
21518
+ };
21519
+ }, []);
21520
+ /** A strip offset this view wrote itself, so the follow-up scroll event is not read as a new drag. */
21521
+ const mirroredRef = (0, react.useRef)(void 0);
21384
21522
  const onHScroll = (0, react.useCallback)((side) => {
21385
21523
  const strip = side === "left" ? leftHScrollRef.current : rightHScrollRef.current;
21386
- const col = side === "left" ? leftColRef.current : rightColRef.current;
21387
- if (strip === null || col === null) return;
21388
- col.scrollLeft = strip.scrollLeft;
21389
- const quotes = splitRootRef.current?.querySelectorAll(`[data-diff-quote-text][data-diff-quote-side="${side}"]`);
21390
- for (const text of quotes ?? []) text.scrollLeft = strip.scrollLeft;
21524
+ if (strip === null) return;
21525
+ const mirrored = mirroredRef.current;
21526
+ const follows = mirrored !== void 0 && mirrored.side === side && mirrored.value === strip.scrollLeft;
21527
+ if (follows) mirroredRef.current = void 0;
21528
+ const move = (which, offset) => {
21529
+ const col = which === "left" ? leftColRef.current : rightColRef.current;
21530
+ if (col !== null) col.scrollLeft = offset;
21531
+ const quotes = splitRootRef.current?.querySelectorAll(`[data-diff-quote-text][data-diff-quote-side="${which}"]`);
21532
+ for (const text of quotes ?? []) text.scrollLeft = offset;
21533
+ };
21534
+ move(side, strip.scrollLeft);
21535
+ if (follows || !ctrlHeldRef.current) return;
21536
+ const otherSide = side === "left" ? "right" : "left";
21537
+ const otherStrip = otherSide === "left" ? leftHScrollRef.current : rightHScrollRef.current;
21538
+ move(otherSide, strip.scrollLeft);
21539
+ if (otherStrip !== null && otherStrip.scrollLeft !== strip.scrollLeft) {
21540
+ mirroredRef.current = {
21541
+ side: otherSide,
21542
+ value: strip.scrollLeft
21543
+ };
21544
+ otherStrip.scrollLeft = strip.scrollLeft;
21545
+ }
21391
21546
  }, []);
21392
21547
  const searchMatches = (0, react.useMemo)(() => searchPairs(pairs, searchQuery, search.options), [
21393
21548
  pairs,
@@ -21481,15 +21636,17 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
21481
21636
  if (body.scrollTop !== clamped) body.scrollTop = clamped;
21482
21637
  setScrollTop(clamped);
21483
21638
  };
21639
+ const blockCountRef = (0, react.useRef)(0);
21640
+ blockCountRef.current = model.blocks.length;
21484
21641
  const handleBlockAction = async (action) => {
21485
21642
  const operated = hoveredBlock ?? hoveredBlockRef.current;
21486
21643
  if (operated === void 0) return;
21487
21644
  const range = blockRanges[operated];
21488
21645
  if (range === void 0) return;
21489
21646
  await (action === "keep" ? onBlockKeep(file.sessionId, file.id, range) : onBlockRevert(file.sessionId, file.id, range));
21490
- const count = model.blocks.length;
21647
+ const count = blockCountRef.current;
21491
21648
  if (count === 0) return;
21492
- const next = Math.max(0, Math.min(operated, count - 1));
21649
+ const next = blockAfterAction(operated, count);
21493
21650
  setFocus(next);
21494
21651
  setHoveredBlock(void 0);
21495
21652
  bumpFlash(false);
@@ -21946,6 +22103,21 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
21946
22103
  })
21947
22104
  })]
21948
22105
  }),
22106
+ rulerMarkersNow.length > 0 && (0, react_jsx_runtime.jsx)("div", {
22107
+ className: `${PendingPanel_module_css_default.overviewRuler} ${PendingPanel_module_css_default.overviewRulerSplit}`,
22108
+ "data-diff-approval-ruler": true,
22109
+ "aria-hidden": "true",
22110
+ children: rulerMarkersNow.map((marker, index) => (0, react_jsx_runtime.jsx)("div", {
22111
+ className: `${PendingPanel_module_css_default.overviewMarker} ${marker.kind === "del" ? `${PendingPanel_module_css_default.markerDel} ${PendingPanel_module_css_default.markerSplitDel}` : `${PendingPanel_module_css_default.markerAdd} ${PendingPanel_module_css_default.markerSplitAdd}`}`,
22112
+ "data-diff-ruler-marker": marker.kind,
22113
+ "data-diff-ruler-side": marker.kind === "del" ? "left" : "right",
22114
+ style: {
22115
+ top: `${marker.top}%`,
22116
+ height: `${marker.height}%`
22117
+ }
22118
+ }, index))
22119
+ }),
22120
+ gotoDialog,
21949
22121
  selectionComment !== void 0 && selection !== void 0 && (0, react_jsx_runtime.jsx)("div", {
21950
22122
  className: PendingPanel_module_css_default.blockActions,
21951
22123
  "data-diff-selection-actions": true,
@@ -24061,9 +24233,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24061
24233
  const body = card.children[1];
24062
24234
  const last = body?.lastElementChild;
24063
24235
  if (id === void 0 || body === void 0 || last === null || last === void 0) continue;
24064
- const drawn = last.getBoundingClientRect().bottom + (Number.parseFloat(getComputedStyle(last).marginBottom) || 0) - body.getBoundingClientRect().top;
24236
+ const slack = body.querySelector("[data-diff-discussion-slack]");
24237
+ const drawn = last.getBoundingClientRect().bottom + (Number.parseFloat(getComputedStyle(last).marginBottom) || 0) - body.getBoundingClientRect().top - (slack?.getBoundingClientRect().height ?? 0);
24065
24238
  if (drawn <= 0) continue;
24066
- const want = Math.max(1, Math.ceil(drawn / THREAD_ROW_PX));
24239
+ const want = Math.max(1, Math.ceil((drawn - DISCUSSION_ROW_SNAP_PX) / THREAD_ROW_PX));
24067
24240
  if (next[id] !== want) {
24068
24241
  next[id] = want;
24069
24242
  changed = true;
@@ -24218,6 +24391,96 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24218
24391
  window.removeEventListener("keydown", onKeyDown, true);
24219
24392
  };
24220
24393
  }, []);
24394
+ /**
24395
+ * The popup's one answer. Enter and the 确定 button both run this, so the key and the press are literally
24396
+ * the same action: the number is read, the popup closes, and a number the current side does not have is
24397
+ * answered with a note instead of a jump (see `gotoLine`).
24398
+ */
24399
+ const submitGoto = () => {
24400
+ const line = Number.parseInt(gotoDraft.trim(), 10);
24401
+ setGotoOpen(false);
24402
+ if (Number.isFinite(line) && line > 0) gotoLine(line);
24403
+ };
24404
+ /**
24405
+ * The go-to popup, centred on the code view: the layer fills that view's own box (the single column's
24406
+ * wrapper, or the side-by-side view's root, which is why it is handed to `SplitDiff` there), and the
24407
+ * parts wear the search bar's recipe (see `.gotoBox` / `.gotoInput`). Side by side there are two code
24408
+ * boxes rather than one, and the one being read is the right pane: the layer is cut back to that half
24409
+ * (`splitView`, see `.gotoLayerRight`), which is what `data-diff-goto-pane` records for the tests. A
24410
+ * press anywhere dismisses it — the layer catches the presses inside the code view, the full-window
24411
+ * catcher the rest — while the bar itself stops them. Escape, Cancel and focus leaving the popup leave
24412
+ * everything as it was.
24413
+ */
24414
+ const gotoDialog = !gotoOpen || previewActive ? null : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
24415
+ className: PendingPanel_module_css_default.gotoBackdrop,
24416
+ "data-diff-goto-backdrop": true,
24417
+ "aria-hidden": "true",
24418
+ onClick: () => {
24419
+ setGotoOpen(false);
24420
+ }
24421
+ }), (0, react_jsx_runtime.jsx)("div", {
24422
+ className: `${PendingPanel_module_css_default.gotoLayer}${splitView ? ` ${PendingPanel_module_css_default.gotoLayerRight}` : ""}`,
24423
+ "data-diff-goto-layer": true,
24424
+ "data-diff-goto-pane": splitView ? "right" : "code",
24425
+ onClick: () => {
24426
+ setGotoOpen(false);
24427
+ },
24428
+ children: (0, react_jsx_runtime.jsxs)("div", {
24429
+ role: "dialog",
24430
+ "aria-label": t("action.goto"),
24431
+ "data-diff-goto-dialog": true,
24432
+ className: PendingPanel_module_css_default.gotoBox,
24433
+ onClick: (event) => {
24434
+ event.stopPropagation();
24435
+ },
24436
+ onBlur: (event) => {
24437
+ if (event.relatedTarget instanceof Node && event.currentTarget.contains(event.relatedTarget)) return;
24438
+ setGotoOpen(false);
24439
+ },
24440
+ children: [
24441
+ (0, react_jsx_runtime.jsx)("input", {
24442
+ className: PendingPanel_module_css_default.gotoInput,
24443
+ "data-diff-goto-input": true,
24444
+ value: gotoDraft,
24445
+ autoFocus: true,
24446
+ inputMode: "numeric",
24447
+ spellCheck: false,
24448
+ autoComplete: "off",
24449
+ "aria-label": t("action.goto"),
24450
+ placeholder: t("action.goto"),
24451
+ onChange: (event) => {
24452
+ setGotoDraft(event.target.value);
24453
+ },
24454
+ onKeyDown: (event) => {
24455
+ if (event.key === "Escape") {
24456
+ event.preventDefault();
24457
+ setGotoOpen(false);
24458
+ return;
24459
+ }
24460
+ if (event.key !== "Enter") return;
24461
+ event.preventDefault();
24462
+ submitGoto();
24463
+ }
24464
+ }),
24465
+ (0, react_jsx_runtime.jsx)("button", {
24466
+ type: "button",
24467
+ className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.actionPrimary} ${PendingPanel_module_css_default.gotoAction}`,
24468
+ "data-diff-goto-go": true,
24469
+ onClick: submitGoto,
24470
+ children: t("action.gotoGo")
24471
+ }),
24472
+ (0, react_jsx_runtime.jsx)("button", {
24473
+ type: "button",
24474
+ className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.gotoAction}`,
24475
+ "data-diff-goto-cancel": true,
24476
+ onClick: () => {
24477
+ setGotoOpen(false);
24478
+ },
24479
+ children: t("action.gotoCancel")
24480
+ })
24481
+ ]
24482
+ })
24483
+ })] });
24221
24484
  const stepBlock = (direction) => {
24222
24485
  const count = model.blocks.length;
24223
24486
  if (count === 0) return;
@@ -24227,11 +24490,13 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24227
24490
  setScrollTick((tick) => tick + 1);
24228
24491
  bumpFlash(false);
24229
24492
  };
24493
+ const blockCountRef = (0, react.useRef)(0);
24494
+ blockCountRef.current = model.blocks.length;
24230
24495
  const runBlockAction = async (action, range, operated) => {
24231
24496
  await (action === "keep" ? onBlockKeep(file.sessionId, file.id, range) : onBlockRevert(file.sessionId, file.id, range));
24232
- const count = model.blocks.length;
24497
+ const count = blockCountRef.current;
24233
24498
  if (count === 0) return;
24234
- const next = Math.max(0, Math.min(operated, count - 1));
24499
+ const next = blockAfterAction(operated, count);
24235
24500
  setFocus(next);
24236
24501
  setHoveredBlock(void 0);
24237
24502
  setScrollTick((tick) => tick + 1);
@@ -24785,8 +25050,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24785
25050
  setPathDraft(null);
24786
25051
  return;
24787
25052
  }
24788
- onAddTypedPath(typed).finally(() => {
25053
+ onAddTypedPath(typed).then((result) => {
24789
25054
  setPathDraft(null);
25055
+ if (result?.openPath === void 0) return;
25056
+ window.dispatchEvent(new CustomEvent(OPEN_PANEL_FILE_EVENT, { detail: { fileId: result.openPath } }));
24790
25057
  });
24791
25058
  } else if (event.key === "Escape") {
24792
25059
  event.preventDefault();
@@ -24881,108 +25148,23 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
24881
25148
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconSearchOutline16, { size: 14 })
24882
25149
  })
24883
25150
  }),
24884
- previewActive ? null : (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
24885
- label: withChord(t("action.goto"), "goto"),
24886
- side: "bottom",
24887
- delayMs: 500,
24888
- children: (0, react_jsx_runtime.jsx)("button", {
24889
- type: "button",
24890
- className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.iconAction}`,
24891
- "data-diff-goto": true,
24892
- "aria-label": t("action.goto"),
24893
- onClick: () => {
24894
- setGotoDraft("");
24895
- setGotoOpen(true);
24896
- },
24897
- children: (0, react_jsx_runtime.jsx)(GotoLineIcon, {})
24898
- })
24899
- }),
24900
- gotoOpen && (0, react_jsx_runtime.jsx)("div", {
24901
- role: "dialog",
24902
- "aria-label": t("action.goto"),
24903
- "data-diff-goto-dialog": true,
24904
- style: {
24905
- position: "fixed",
24906
- inset: 0,
24907
- zIndex: 40,
24908
- display: "grid",
24909
- placeItems: "center",
24910
- background: "rgba(0, 0, 0, 0.18)"
24911
- },
24912
- onClick: () => {
24913
- setGotoOpen(false);
24914
- },
24915
- children: (0, react_jsx_runtime.jsxs)("div", {
24916
- className: PendingPanel_module_css_default.gotoBox,
24917
- style: {
24918
- display: "flex",
24919
- gap: 8,
24920
- alignItems: "center",
24921
- padding: 12,
24922
- borderRadius: 12,
24923
- background: "var(--dsw-alias-bg-base)",
24924
- boxShadow: "var(--dsw-shadow-lv2)"
24925
- },
24926
- onClick: (event) => {
24927
- event.stopPropagation();
24928
- },
24929
- children: [
24930
- (0, react_jsx_runtime.jsx)("input", {
24931
- className: PendingPanel_module_css_default.gotoInput,
24932
- "data-diff-goto-input": true,
24933
- value: gotoDraft,
24934
- autoFocus: true,
24935
- inputMode: "numeric",
24936
- spellCheck: false,
24937
- autoComplete: "off",
24938
- "aria-label": t("action.goto"),
24939
- placeholder: t("action.goto"),
24940
- style: {
24941
- width: "8em",
24942
- padding: "4px 8px",
24943
- borderRadius: 8,
24944
- border: "1px solid var(--dsw-alias-border-l2)",
24945
- background: "transparent",
24946
- color: "inherit",
24947
- font: "inherit"
24948
- },
24949
- onChange: (event) => {
24950
- setGotoDraft(event.target.value);
24951
- },
24952
- onKeyDown: (event) => {
24953
- if (event.key === "Escape") {
24954
- event.preventDefault();
24955
- setGotoOpen(false);
24956
- return;
24957
- }
24958
- if (event.key !== "Enter") return;
24959
- event.preventDefault();
24960
- const line = Number.parseInt(gotoDraft.trim(), 10);
24961
- setGotoOpen(false);
24962
- if (Number.isFinite(line) && line > 0) gotoLine(line);
24963
- }
24964
- }),
24965
- (0, react_jsx_runtime.jsx)("button", {
24966
- type: "button",
24967
- className: PendingPanel_module_css_default.action,
24968
- "data-diff-goto-go": true,
24969
- onClick: () => {
24970
- const line = Number.parseInt(gotoDraft.trim(), 10);
24971
- setGotoOpen(false);
24972
- if (Number.isFinite(line) && line > 0) gotoLine(line);
24973
- },
24974
- children: t("action.gotoGo")
24975
- }),
24976
- (0, react_jsx_runtime.jsx)("button", {
24977
- type: "button",
24978
- className: PendingPanel_module_css_default.action,
24979
- "data-diff-goto-cancel": true,
24980
- onClick: () => {
24981
- setGotoOpen(false);
24982
- },
24983
- children: t("action.gotoCancel")
24984
- })
24985
- ]
25151
+ previewActive ? null : (0, react_jsx_runtime.jsx)("span", {
25152
+ className: PendingPanel_module_css_default.gotoHost,
25153
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
25154
+ label: withChord(t("action.goto"), "goto"),
25155
+ side: "bottom",
25156
+ delayMs: 500,
25157
+ children: (0, react_jsx_runtime.jsx)("button", {
25158
+ type: "button",
25159
+ className: `${PendingPanel_module_css_default.action} ${PendingPanel_module_css_default.iconAction}`,
25160
+ "data-diff-goto": true,
25161
+ "aria-label": t("action.goto"),
25162
+ onClick: () => {
25163
+ setGotoDraft("");
25164
+ setGotoOpen(true);
25165
+ },
25166
+ children: (0, react_jsx_runtime.jsx)(GotoLineIcon, {})
25167
+ })
24986
25168
  })
24987
25169
  }),
24988
25170
  (0, react_jsx_runtime.jsx)("span", { className: PendingPanel_module_css_default.divider }),
@@ -25238,6 +25420,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25238
25420
  onVisibleLines: onSplitVisibleLines,
25239
25421
  discussions: laidDiscussions,
25240
25422
  renderDiscussion,
25423
+ rulerRuns: rulerMarkers,
25424
+ gotoDialog,
25241
25425
  selectionComment: splitView && selectionCommentOffered ? (0, react_jsx_runtime.jsxs)("button", {
25242
25426
  type: "button",
25243
25427
  className: PendingPanel_module_css_default.action,
@@ -25441,6 +25625,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25441
25625
  }
25442
25626
  }, flashKey),
25443
25627
  searchBar,
25628
+ gotoDialog,
25444
25629
  rulerMarkers.length > 0 && (0, react_jsx_runtime.jsx)("div", {
25445
25630
  className: PendingPanel_module_css_default.overviewRuler,
25446
25631
  "data-diff-approval-ruler": true,
@@ -25688,6 +25873,29 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
25688
25873
  n: (prev?.n ?? 0) + 1
25689
25874
  }));
25690
25875
  };
25876
+ /**
25877
+ * The host says it cannot write the pending state to disk. Said ONCE per distinct message: that file
25878
+ * is what makes the list survive a restart, so a reader who is never told simply finds the list gone
25879
+ * later with nothing to explain it (issue #6) — but the field rides every poll, and a filesystem that
25880
+ * keeps failing must not toast on each one. The host retracts the field once a write works, and that
25881
+ * retraction is what arms the marker again: the same disk failing twice, with a working spell between,
25882
+ * is news the second time too.
25883
+ */
25884
+ const persistToastRef = (0, react.useRef)(void 0);
25885
+ (0, react.useEffect)(() => {
25886
+ const message = snapshot.persistError;
25887
+ if (message === void 0) {
25888
+ persistToastRef.current = void 0;
25889
+ return;
25890
+ }
25891
+ if (message === persistToastRef.current) return;
25892
+ persistToastRef.current = message;
25893
+ showCopyToast(t("panel.persistFailed"));
25894
+ }, [
25895
+ snapshot.persistError,
25896
+ showCopyToast,
25897
+ t
25898
+ ]);
25691
25899
  const handleOpenFileRef = (0, react.useRef)();
25692
25900
  handleOpenFileRef.current = (path) => {
25693
25901
  const entry = snapshot.files.find((file) => diffPathsMatch(path, file.path, snapshot.workspacePath));
@@ -26348,21 +26556,42 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
26348
26556
  };
26349
26557
  /**
26350
26558
  * Open a path typed into the detail header's field: add it to the list when it is not there
26351
- * yet, then select the file the host says it landed as. Only one exact file counts — a path
26352
- * that is missing, is a directory, or has nothing readable in it leaves the list untouched,
26353
- * and the field falls back to the path it was showing.
26559
+ * yet, then select the file the host says it landed as.
26560
+ *
26561
+ * The host is the one that judges the path, and its refusal is the only thing the reader can
26562
+ * act on — "nothing happened" is what sent them looking for a bug. So every refusal says why:
26563
+ * the same wording the browse dialog uses for the same outcomes, plus the two this field can
26564
+ * hit and that dialog cannot (a directory named as one file, and an add that raises).
26354
26565
  *
26355
26566
  * @param path - the path as typed.
26356
- * @returns whether a file was opened.
26567
+ * @returns what to select: the entry opened (the one already listed, for a duplicate), or
26568
+ * undefined when the host refused the path.
26357
26569
  */
26358
26570
  const addTypedPath = async (path) => {
26359
- if (current === void 0) return false;
26360
- const value = await onAddPath(current, path, true, true).catch(() => void 0);
26361
- if (value === void 0) return false;
26362
- if (value.outcome !== "added" && value.outcome !== "duplicate") return false;
26363
- if (value.id !== void 0) setPendingSelect(value.id);
26364
- onRefresh(current);
26365
- return true;
26571
+ if (current === void 0) {
26572
+ showCopyToast(t("panel.fileNotPending"));
26573
+ return;
26574
+ }
26575
+ const value = await onAddPath(current, path, true, true).catch((error) => {
26576
+ showCopyToast(t("panel.addFailed", { message: error instanceof Error ? error.message : String(error) }));
26577
+ });
26578
+ if (value === void 0) return void 0;
26579
+ if (value.outcome === "added" || value.outcome === "duplicate") {
26580
+ if (value.id !== void 0) {
26581
+ setPendingSelect(value.id);
26582
+ onRefresh(current);
26583
+ return { openPath: value.id };
26584
+ }
26585
+ onRefresh(current);
26586
+ return {};
26587
+ }
26588
+ if (value.outcome === "missing") showCopyToast(t("panel.addMissing"));
26589
+ else if (value.outcome === "outside") showCopyToast(t("panel.addOutside"));
26590
+ else if (value.outcome === "not-a-file") showCopyToast(t("panel.addNotAFile"));
26591
+ else if (value.outcome === "unchanged") showCopyToast(t("panel.addUnchanged"));
26592
+ else if (value.outcome === "empty") showCopyToast(t("panel.addEmpty"));
26593
+ else if (value.outcome === "no-vcs") showCopyToast(t("panel.importNoVcs"));
26594
+ else showCopyToast(t("panel.addFailed", { message: value.message ?? "" }));
26366
26595
  };
26367
26596
  const renderEntry = (entry) => (0, react_jsx_runtime.jsx)(PendingFileRow, {
26368
26597
  file: entry,
@@ -26391,52 +26620,104 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
26391
26620
  id: "remove",
26392
26621
  label: t("row.dismiss")
26393
26622
  }];
26394
- return [{
26395
- id: "keep",
26396
- label: t("action.keep")
26397
- }, {
26398
- id: "revert",
26399
- label: rowMenu.file.kind === "create" ? t("action.delete") : t("action.revert")
26400
- }];
26623
+ const revertLabel = rowMenu.file.kind === "create" ? t("action.delete") : t("action.revert");
26624
+ return [
26625
+ {
26626
+ id: "keep-listed",
26627
+ label: t("row.keepListed")
26628
+ },
26629
+ {
26630
+ id: "keep-remove",
26631
+ label: t("row.keepRemove")
26632
+ },
26633
+ {
26634
+ id: "revert",
26635
+ label: revertLabel
26636
+ },
26637
+ {
26638
+ id: "revert-remove",
26639
+ label: t("row.revertRemove")
26640
+ }
26641
+ ];
26401
26642
  }, [rowMenu, t]);
26402
26643
  /** Run a row-menu choice through the same handlers the open file uses. 移出 is a keep: the
26403
- * host folds the content and drops the entry, so the file itself is left alone. */
26644
+ * host folds the content and drops the entry, so the file itself is left alone. The `并移出`
26645
+ * rows say so explicitly rather than taking the toolbar's confirm-first default. */
26404
26646
  const runRowMenu = (id) => {
26405
26647
  const target = rowMenu;
26406
26648
  setRowMenu(null);
26407
26649
  if (target === null) return;
26408
- if (id === "keep" || id === "remove") onKeep(target.file.sessionId, target.file.id);
26650
+ if (id === "keep-listed") onKeep(target.file.sessionId, target.file.id, true);
26651
+ else if (id === "keep-remove" || id === "remove") onKeep(target.file.sessionId, target.file.id);
26409
26652
  else if (id === "revert") onRevert(target.file.sessionId, target.file.id);
26653
+ else if (id === "revert-remove") onRevert(target.file.sessionId, target.file.id, true);
26410
26654
  };
26411
26655
  const selectedFile = files.find((file) => file.id === selected);
26412
26656
  /**
26413
- * Every comment the files in the list carry, in list order and then in the order their rows run:
26414
- * what the comments tab shows. A comment IS a block of rows in one file, so its label is the same
26415
- * `path:lines` reference the thread's own header wears, its title is the first sentence of what
26416
- * the reader asked (the first turn is the annotation; later ones are follow-ups), and an outdated
26417
- * one says so — the same state the block itself is wearing (see `[data-lost]`).
26657
+ * A file that leaves the list takes its comments with it: the reader who kept or reverted that file
26658
+ * out of the list is done with it, and a thread is a block of rows in a diff the list no longer
26659
+ * holds — so the rows it was written about are gone with the entry (see `forgetDiscussionsNotIn`).
26660
+ *
26661
+ * Only a list that has actually been READ may say a file is gone. An unread panel, a connection
26662
+ * reset (`read` goes back to false, with the files) and a sessionless page all publish an empty
26663
+ * list, and none of those means the reader finished with the files it names.
26664
+ */
26665
+ const listedIds = (0, react.useMemo)(() => files.map((file) => file.id), [files]);
26666
+ (0, react.useEffect)(() => {
26667
+ if (current === void 0 || !snapshot.read) return;
26668
+ forgetDiscussionsNotIn(current, listedIds);
26669
+ }, [
26670
+ current,
26671
+ snapshot.read,
26672
+ listedIds
26673
+ ]);
26674
+ /**
26675
+ * Every comment the session's files carry, grouped by the file it hangs in: what the comments tab
26676
+ * shows. The session is the scope — every file of it that is still in the list, whether or not the
26677
+ * reader has opened it, and however many files that is — and the file is what the comments are
26678
+ * grouped by, under the file's own name.
26679
+ *
26680
+ * A comment IS a block of rows in one file, so its label is the lines it names — the `path:lines`
26681
+ * reference the thread's own header wears, with the path left off (the group above IS that file) and
26682
+ * nothing in front of the numbers, which are the whole label at that point. Its title is the first
26683
+ * sentence of what the reader asked (the first turn is the annotation; later ones are follow-ups), and
26684
+ * an outdated one says so — the same state the block itself is wearing (see `[data-lost]`). Within a
26685
+ * group the comments keep the order their rows run, and the groups keep the list's own order (the file
26686
+ * name).
26418
26687
  *
26419
26688
  * The threads are held by the file detail, which is one mount at a time, so they are read back
26420
- * out of the memory the two share, and re-read whenever they change (`commentsTick`).
26689
+ * out of the memory the two share, and re-read whenever they change (`commentsTick`). A file with
26690
+ * no threads is left out rather than shown with nothing under it.
26421
26691
  */
26422
- const commentEntries = (0, react.useMemo)(() => {
26692
+ const commentGroups = (0, react.useMemo)(() => {
26423
26693
  const threads = rememberedDiscussions(current);
26424
- return files.flatMap((file) => (threads[file.id] ?? []).map((discussion) => ({
26425
- id: discussion.id,
26694
+ return files.map((file) => ({
26426
26695
  fileId: file.id,
26427
- row: discussion.anchor.start,
26428
- end: discussion.anchor.end,
26429
- label: referenceLabelOf(file.path, snapshot.workspacePath, discussion.anchor.startLine, discussion.anchor.endLine),
26430
- title: commentTitle(discussion) || t("panel.commentEmptyTitle"),
26431
- lost: discussion.lost === true
26432
- })));
26696
+ name: basenameOf(file.path),
26697
+ path: file.path,
26698
+ entries: (threads[file.id] ?? []).map((discussion) => {
26699
+ const written = commentTitle(discussion);
26700
+ const empty = written === "";
26701
+ return {
26702
+ id: discussion.id,
26703
+ fileId: file.id,
26704
+ row: discussion.anchor.start,
26705
+ end: discussion.anchor.end,
26706
+ label: `[${lineRangeLabel(discussion.anchor.startLine, discussion.anchor.endLine)}]`,
26707
+ title: empty ? t("discussion.placeholder") : written,
26708
+ empty,
26709
+ lost: discussion.lost === true
26710
+ };
26711
+ })
26712
+ })).filter((group) => group.entries.length > 0);
26433
26713
  }, [
26434
26714
  files,
26435
26715
  current,
26436
- snapshot.workspacePath,
26437
26716
  commentsTick,
26438
26717
  t
26439
26718
  ]);
26719
+ /** The same comments, flat: what the tab counts and what says whether there are any. */
26720
+ const commentEntries = (0, react.useMemo)(() => commentGroups.flatMap((group) => group.entries), [commentGroups]);
26440
26721
  /** Open the file a comment hangs in and land on the comment: the rows it names, or — for an outdated
26441
26722
  * thread, whose code is gone — its own box, which is the only place that says anything. */
26442
26723
  const jumpToComment = (fileId, row, card = false) => {
@@ -26540,52 +26821,72 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
26540
26821
  className: PendingPanel_module_css_default.listEmpty,
26541
26822
  "data-diff-comments-empty": true,
26542
26823
  children: t("panel.commentsEmpty")
26543
- }) : (0, react_jsx_runtime.jsx)("ul", {
26544
- className: PendingPanel_module_css_default.rows,
26824
+ }) : (0, react_jsx_runtime.jsx)("div", {
26545
26825
  "data-diff-comment-list": true,
26546
- children: commentEntries.map((entry) => (0, react_jsx_runtime.jsx)("li", {
26547
- className: PendingPanel_module_css_default.row,
26548
- children: (0, react_jsx_runtime.jsxs)("div", {
26549
- role: "button",
26550
- tabIndex: 0,
26551
- className: PendingPanel_module_css_default.commentRow,
26552
- "data-diff-comment-link": entry.id,
26553
- "data-mobile-nav-copy": "1",
26554
- onClick: () => {
26555
- jumpToComment(entry.fileId, entry.lost ? entry.end : entry.row, entry.lost);
26556
- },
26557
- onContextMenu: (event) => {
26558
- event.preventDefault();
26559
- setCommentMenu({
26560
- id: entry.id,
26561
- fileId: entry.fileId,
26562
- x: event.clientX,
26563
- y: event.clientY
26564
- });
26565
- },
26566
- onKeyDown: (event) => {
26567
- if (event.key !== "Enter" && event.key !== " ") return;
26568
- event.preventDefault();
26569
- jumpToComment(entry.fileId, entry.lost ? entry.end : entry.row, entry.lost);
26570
- },
26571
- children: [(0, react_jsx_runtime.jsxs)("span", {
26572
- className: PendingPanel_module_css_default.commentHead,
26573
- children: [(0, react_jsx_runtime.jsx)("span", {
26574
- className: PendingPanel_module_css_default.commentLabel,
26575
- "data-diff-comment-label": true,
26576
- children: entry.label
26577
- }), entry.lost && (0, react_jsx_runtime.jsx)("span", {
26578
- className: PendingPanel_module_css_default.commentLost,
26579
- "data-diff-comment-lost": true,
26580
- children: t("panel.commentOutdated")
26581
- })]
26582
- }), (0, react_jsx_runtime.jsx)("span", {
26583
- className: PendingPanel_module_css_default.commentTitle,
26584
- "data-diff-comment-title": true,
26585
- children: entry.title
26586
- })]
26587
- })
26588
- }, entry.id))
26826
+ children: commentGroups.map((group) => (0, react_jsx_runtime.jsxs)("div", {
26827
+ className: PendingPanel_module_css_default.commentGroup,
26828
+ "data-diff-comment-group": group.fileId,
26829
+ children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
26830
+ label: group.path,
26831
+ delayMs: 500,
26832
+ maxWidth: 560,
26833
+ children: (0, react_jsx_runtime.jsx)("h4", {
26834
+ className: PendingPanel_module_css_default.commentGroupName,
26835
+ "data-diff-comment-group-name": true,
26836
+ children: group.name
26837
+ })
26838
+ }), (0, react_jsx_runtime.jsx)("ul", {
26839
+ className: PendingPanel_module_css_default.rows,
26840
+ children: group.entries.map((entry) => (0, react_jsx_runtime.jsx)("li", {
26841
+ className: PendingPanel_module_css_default.row,
26842
+ children: (0, react_jsx_runtime.jsx)("div", {
26843
+ role: "button",
26844
+ tabIndex: 0,
26845
+ className: PendingPanel_module_css_default.commentRow,
26846
+ "data-diff-comment-link": entry.id,
26847
+ "data-mobile-nav-copy": "1",
26848
+ onClick: () => {
26849
+ jumpToComment(entry.fileId, entry.lost ? entry.end : entry.row, entry.lost);
26850
+ },
26851
+ onContextMenu: (event) => {
26852
+ event.preventDefault();
26853
+ setCommentMenu({
26854
+ id: entry.id,
26855
+ fileId: entry.fileId,
26856
+ x: event.clientX,
26857
+ y: event.clientY
26858
+ });
26859
+ },
26860
+ onKeyDown: (event) => {
26861
+ if (event.key !== "Enter" && event.key !== " ") return;
26862
+ event.preventDefault();
26863
+ jumpToComment(entry.fileId, entry.lost ? entry.end : entry.row, entry.lost);
26864
+ },
26865
+ children: (0, react_jsx_runtime.jsxs)("span", {
26866
+ className: PendingPanel_module_css_default.commentHead,
26867
+ children: [
26868
+ (0, react_jsx_runtime.jsx)("span", {
26869
+ className: entry.empty ? `${PendingPanel_module_css_default.commentTitle} ${PendingPanel_module_css_default.commentTitleEmpty}` : PendingPanel_module_css_default.commentTitle,
26870
+ "data-diff-comment-title": true,
26871
+ "data-diff-comment-empty": entry.empty ? "" : void 0,
26872
+ children: entry.title
26873
+ }),
26874
+ entry.lost && (0, react_jsx_runtime.jsx)("span", {
26875
+ className: PendingPanel_module_css_default.commentLost,
26876
+ "data-diff-comment-lost": true,
26877
+ children: t("panel.commentOutdated")
26878
+ }),
26879
+ (0, react_jsx_runtime.jsx)("span", {
26880
+ className: PendingPanel_module_css_default.commentLabel,
26881
+ "data-diff-comment-label": true,
26882
+ children: entry.label
26883
+ })
26884
+ ]
26885
+ })
26886
+ })
26887
+ }, entry.id))
26888
+ })]
26889
+ }, group.fileId))
26589
26890
  })
26590
26891
  }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
26591
26892
  className: PendingPanel_module_css_default.listScroll,
@@ -26775,7 +27076,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
26775
27076
  if (event.target instanceof Element && event.target.closest("[data-diff-path-input]") !== null) return;
26776
27077
  if (document.querySelector("[data-diff-approval-cover-popover]") !== null) return;
26777
27078
  const target = event.target;
26778
- if (target instanceof Node && panelRef.current?.contains(target) === true && document.querySelector("[data-diff-searchbar]") !== null) return;
27079
+ const inPanel = target instanceof Node && panelRef.current?.contains(target) === true;
27080
+ if (inPanel && document.querySelector("[data-diff-searchbar]") !== null) return;
27081
+ if (inPanel && document.querySelector("[data-diff-goto-dialog]") !== null) return;
26779
27082
  event.preventDefault();
26780
27083
  closePanel();
26781
27084
  };
@@ -27516,7 +27819,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27516
27819
  });
27517
27820
  }
27518
27821
  /** One Agent-preset-style preference row: title + description, toggle right. */
27519
- function PreferenceRow({ title, description, value, onSelect, dataAttribute, t }) {
27822
+ function PreferenceRow({ title, description, link, value, onSelect, dataAttribute, t }) {
27823
+ const [before, after] = description.split("{link}");
27520
27824
  return (0, react_jsx_runtime.jsxs)("div", {
27521
27825
  className: PendingPanel_module_css_default.settingsRow,
27522
27826
  children: [(0, react_jsx_runtime.jsxs)("div", {
@@ -27524,9 +27828,19 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27524
27828
  children: [(0, react_jsx_runtime.jsx)("div", {
27525
27829
  className: PendingPanel_module_css_default.settingsRowTitle,
27526
27830
  children: title
27527
- }), (0, react_jsx_runtime.jsx)("div", {
27831
+ }), (0, react_jsx_runtime.jsxs)("div", {
27528
27832
  className: PendingPanel_module_css_default.settingsRowDesc,
27529
- children: description
27833
+ children: [
27834
+ before,
27835
+ link !== void 0 && (0, react_jsx_runtime.jsx)("a", {
27836
+ className: PendingPanel_module_css_default.settingsRowLink,
27837
+ href: link.href,
27838
+ target: "_blank",
27839
+ rel: "noreferrer noopener",
27840
+ children: link.label
27841
+ }),
27842
+ after ?? " "
27843
+ ]
27530
27844
  })]
27531
27845
  }), (0, react_jsx_runtime.jsx)(OnOffToggle, {
27532
27846
  value,
@@ -27917,6 +28231,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
27917
28231
  const [lead, setLeadState] = (0, react.useState)(navLeadRows);
27918
28232
  const [fontScale, setFontScaleState] = (0, react.useState)(diffFontScale);
27919
28233
  const [lineHeight, setLineHeightState] = (0, react.useState)(diffLineHeight);
28234
+ const [codeFont, setCodeFontState] = (0, react.useState)(codeFontEnabled);
27920
28235
  const [addColor, setAddColorState] = (0, react.useState)(() => diffAddColor() ?? currentDiffAddColor());
27921
28236
  const [delColor, setDelColorState] = (0, react.useState)(() => diffDelColor() ?? currentDiffDelColor());
27922
28237
  const addDefault = currentDiffAddColor();
@@ -28008,6 +28323,10 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28008
28323
  setLineHeightState(value);
28009
28324
  setDiffLineHeight(value);
28010
28325
  };
28326
+ const setCodeFont = (value) => {
28327
+ setCodeFontState(value);
28328
+ setCodeFontEnabled(value);
28329
+ };
28011
28330
  const setAddColor = (value) => {
28012
28331
  setAddColorState(value);
28013
28332
  setDiffAddColor(value);
@@ -28073,6 +28392,18 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28073
28392
  dataAttribute: "data-diff-line-height",
28074
28393
  t
28075
28394
  }),
28395
+ (0, react_jsx_runtime.jsx)(PreferenceRow, {
28396
+ title: t("panel.codeFont"),
28397
+ description: t("panel.codeFontDesc"),
28398
+ link: {
28399
+ href: "https://github.com/SpaceTimee/Fusion-JetBrainsMapleMono",
28400
+ label: "JetBrains Maple Mono"
28401
+ },
28402
+ value: codeFont,
28403
+ onSelect: setCodeFont,
28404
+ dataAttribute: "data-diff-code-font",
28405
+ t
28406
+ }),
28076
28407
  (0, react_jsx_runtime.jsx)(ColorRow, {
28077
28408
  title: t("panel.diffAddColor"),
28078
28409
  description: t("panel.diffAddColorDesc", { default: addDefault.toUpperCase() }),
@@ -28460,15 +28791,19 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28460
28791
  const redoCleared = value.redoCleared;
28461
28792
  const skill = value.commentSkill;
28462
28793
  const commentSkill = typeof skill === "string" && skill.length > 0 ? skill : void 0;
28794
+ const persisted = value.persistError;
28795
+ const persistError = typeof persisted === "string" && persisted.length > 0 ? persisted : void 0;
28463
28796
  return redoCleared === true ? {
28464
28797
  files,
28465
28798
  workspacePath,
28466
28799
  redoCleared: true,
28467
- commentSkill
28800
+ commentSkill,
28801
+ persistError
28468
28802
  } : {
28469
28803
  files,
28470
28804
  workspacePath,
28471
- commentSkill
28805
+ commentSkill,
28806
+ persistError
28472
28807
  };
28473
28808
  }
28474
28809
  /** Narrow one action endpoint's value; a malformed wire value is an action failure. */
@@ -28724,13 +29059,14 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28724
29059
  return;
28725
29060
  }
28726
29061
  try {
28727
- const { files, workspacePath, redoCleared: cleared, commentSkill } = await port.list(sessionId);
29062
+ const { files, workspacePath, redoCleared: cleared, commentSkill, persistError } = await port.list(sessionId);
28728
29063
  if (cleared) redoCleared = true;
28729
29064
  publish({
28730
29065
  read: true,
28731
29066
  files,
28732
29067
  workspacePath,
28733
29068
  commentSkill,
29069
+ persistError,
28734
29070
  busy: EMPTY_BUSY,
28735
29071
  failed: failedOf(snapshot)
28736
29072
  });
@@ -28740,6 +29076,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
28740
29076
  files: snapshot.files,
28741
29077
  workspacePath: snapshot.workspacePath,
28742
29078
  commentSkill: snapshot.commentSkill,
29079
+ persistError: snapshot.persistError,
28743
29080
  error: error instanceof Error ? error.message : String(error),
28744
29081
  busy: snapshot.busy,
28745
29082
  failed: failedOf(snapshot)
@@ -29089,6 +29426,32 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29089
29426
  }
29090
29427
  return texts;
29091
29428
  }
29429
+ /** Whether two node lists say the same thing (the transcript is rebuilt on every read). */
29430
+ function sameNodes(left, right) {
29431
+ return left.length === right.length && left.every((node, index) => {
29432
+ const other = right[index];
29433
+ return node.kind === other.kind && node.text === other.text && node.interrupted === other.interrupted;
29434
+ });
29435
+ }
29436
+ /** Whether two waiting-prompt lists say the same thing. */
29437
+ function sameQueued(left, right) {
29438
+ return left === right || left !== void 0 && right !== void 0 && left.length === right.length && left.every((text, index) => text === right[index]);
29439
+ }
29440
+ /** Whether a freshly read view says anything the consumer has not already been told. */
29441
+ function sameView(left, right) {
29442
+ return left !== void 0 && left.running === right.running && left.partial === right.partial && left.error === right.error && sameQueued(left.queued, right.queued) && sameNodes(left.nodes, right.nodes);
29443
+ }
29444
+ /**
29445
+ * How often a watched session's turn state is re-read, in ms.
29446
+ *
29447
+ * The transcript arrives by subscription, but `running` and the queue are read from the session
29448
+ * snapshot, which the chat target does not publish: a turn that ends without another transcript change
29449
+ * (the answer already written, nothing more to say) left the consumer holding `running: true` — which is
29450
+ * how a comment sat at "答复中" long after its session was done. The panel cannot ask for a re-read, so
29451
+ * the bridge does. What a tick costs is a snapshot read and the node walk behind it; what it must NOT
29452
+ * cost is a delivery, and `sameView` is what stops one (see `watch`).
29453
+ */
29454
+ const TURN_STATE_REFRESH_MS = 1e3;
29092
29455
  /**
29093
29456
  * Build the bridge over the client context. Every verb takes the session it
29094
29457
  * addresses, so one bridge serves whichever session the panel is showing.
@@ -29109,6 +29472,20 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29109
29472
  return;
29110
29473
  }
29111
29474
  };
29475
+ /**
29476
+ * Subscribe to the session LIST store — the one observable the host documents as carrying a session's
29477
+ * `running` state (`SessionSummary.running`, fed by the controller's running-state change).
29478
+ * @param listener - called on every list-store change.
29479
+ * @returns the unsubscribe, or undefined on a build without the store.
29480
+ */
29481
+ const watchList = (listener) => {
29482
+ try {
29483
+ const stop = ctx.get("sessions")?.list?.subscribe?.(listener);
29484
+ return typeof stop === "function" ? stop : void 0;
29485
+ } catch {
29486
+ return;
29487
+ }
29488
+ };
29112
29489
  const ask = (sessionId, text) => {
29113
29490
  const target = scoped(sessionId);
29114
29491
  if (target === void 0) return false;
@@ -29179,21 +29556,34 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29179
29556
  };
29180
29557
  };
29181
29558
  const watch = (sessionId, listener) => {
29182
- if (scoped(sessionId) === void 0) {
29559
+ const target = scoped(sessionId);
29560
+ if (target === void 0) {
29183
29561
  listener(currentView(sessionId));
29184
29562
  return () => {};
29185
29563
  }
29186
29564
  const unsubscribes = [];
29565
+ let delivered;
29187
29566
  const notify = () => {
29188
- listener(currentView(sessionId));
29567
+ const view = currentView(sessionId);
29568
+ if (sameView(delivered, view)) return;
29569
+ delivered = view;
29570
+ listener(view);
29189
29571
  };
29572
+ try {
29573
+ const stopSession = target.binding?.session?.subscribe?.(notify);
29574
+ if (typeof stopSession === "function") unsubscribes.push(stopSession);
29575
+ } catch {}
29576
+ const stopList = watchList(notify);
29577
+ if (stopList !== void 0) unsubscribes.push(stopList);
29190
29578
  try {
29191
29579
  const stop = ctx.get("uiConversation")?.binding?.(sessionId)?.target?.("chat")?.subscribe?.(notify);
29192
29580
  if (typeof stop === "function") unsubscribes.push(stop);
29193
29581
  } catch {}
29194
29582
  notify();
29583
+ const refresh = unsubscribes.length > 0 ? void 0 : window.setInterval(notify, TURN_STATE_REFRESH_MS);
29195
29584
  return () => {
29196
29585
  for (const stop of unsubscribes) stop();
29586
+ if (refresh !== void 0) window.clearInterval(refresh);
29197
29587
  };
29198
29588
  };
29199
29589
  return {
@@ -29265,6 +29655,192 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29265
29655
  });
29266
29656
  }
29267
29657
  //#endregion
29658
+ //#region lib/types/font-slices.js
29659
+ /**
29660
+ * The bundled code font: what the panel asks for, and where the files live.
29661
+ *
29662
+ * One CJK glyph is exactly twice one Latin glyph in this face, which is what
29663
+ * puts code and Chinese comments on the same character grid. No system stack can
29664
+ * do that: the shell's code font resolves hanzi to a proportional face
29665
+ * (`"PingFang SC"`, `"Microsoft YaHei"`), so comments drift out of column on
29666
+ * Windows and Android.
29667
+ *
29668
+ * Both halves need the same names — the host serves the files under
29669
+ * {@link FONT_ROUTE}, the client asks for {@link FONT_FAMILY} — so they live
29670
+ * here rather than being written twice.
29671
+ *
29672
+ * @module dsh-diff-approval/font-slices
29673
+ */
29674
+ /**
29675
+ * The family the client declares and asks for.
29676
+ *
29677
+ * It names the actual face — this is JetBrains Maple Mono, subset and sliced by
29678
+ * this plugin — and carries the project suffix so it cannot collide with a copy
29679
+ * of the upstream font installed on the reader's machine. That collision would
29680
+ * be silent and one-sided: a locally installed font wins over a webfont of the
29681
+ * same name, so the slices would never be fetched and the bytes on screen would
29682
+ * be someone else's build. The trailing marker also keeps the upstream names out
29683
+ * of a user-visible primary name, which is what the OFL asks of a modified
29684
+ * version (Maple Mono declares `Maple Mono` as a Reserved Font Name).
29685
+ */
29686
+ const FONT_FAMILY = "JetBrains Maple Mono for DSH";
29687
+ /**
29688
+ * The URL prefix the host mounts. The client resolves it against the document's
29689
+ * own origin, so a tunnel or a non-default port needs no configuration.
29690
+ */
29691
+ const FONT_ROUTE = "/dsh-diff-approval/fonts";
29692
+ /** Regular carries the code; the Semibold only backs emphasised text. */
29693
+ const FONT_FACES = [{
29694
+ name: "regular",
29695
+ weight: 400
29696
+ }, {
29697
+ name: "semibold",
29698
+ weight: 600
29699
+ }];
29700
+ /**
29701
+ * The code font stack. The bundled family comes first so its 2:1 grid wins,
29702
+ * and the previous stack stays behind it for anything the slices do not cover —
29703
+ * Korean, CJK Ext-A/B, and the handful of codepoints this face leaves unmapped.
29704
+ */
29705
+ const FONT_STACK = [
29706
+ `"${FONT_FAMILY}"`,
29707
+ "\"SF Mono\"",
29708
+ "\"JetBrains Mono\"",
29709
+ "\"Fira Code\"",
29710
+ "Consolas",
29711
+ "\"Liberation Mono\"",
29712
+ "Menlo",
29713
+ "Courier",
29714
+ "\"PingFang SC\"",
29715
+ "\"Microsoft YaHei\""
29716
+ ].join(", ");
29717
+ //#endregion
29718
+ //#region lib/types/client/code-font.js
29719
+ /**
29720
+ * Load the bundled code font and put the diff's code on its grid.
29721
+ *
29722
+ * The face is dual-width: one CJK glyph is exactly twice one Latin glyph, so
29723
+ * code and Chinese comments share a character grid. The shell's own code font
29724
+ * cannot do that — it resolves hanzi to a proportional face (`"PingFang SC"`,
29725
+ * `"Microsoft YaHei"`), so a comment that starts in column 40 of the code ends
29726
+ * somewhere else entirely on Windows and Android, where the browser has no
29727
+ * monospaced CJK face at all.
29728
+ *
29729
+ * The rule is one selector wide: **the code column only**, `.lines`. Comment
29730
+ * bubbles, the file list and the panel's chrome keep the shell's font stack; the
29731
+ * code is where the grid is the point.
29732
+ *
29733
+ * **Off until asked for.** The slices are tens of kilobytes for ordinary text
29734
+ * and up to ~120 KB for a rare character, which is traffic the reader pays for,
29735
+ * so the Settings switch is the gate and its description says so. Off is not
29736
+ * just "no rule": nothing is fetched at all, so the default panel is byte-for-
29737
+ * byte and pixel-for-pixel what it was before this existed. A browser fetches a
29738
+ * `@font-face` only when a rule uses it, which is what keeps an enabled pure-
29739
+ * ASCII file down to the one Latin slice.
29740
+ *
29741
+ * The face's own `calt` stays on, so `->` and `=>` draw as the arrows JetBrains
29742
+ * Mono already draws everywhere else in this UI. The upstream project also
29743
+ * builds a no-ligature variant (`…-NL-…`) if that ever stops being wanted; it
29744
+ * would mean re-slicing, not a CSS override, because `calt` is what carries the
29745
+ * arrows.
29746
+ *
29747
+ * @module dsh-diff-approval/client/code-font
29748
+ */
29749
+ /** The style element this module owns, marked so it is never injected twice. */
29750
+ const STYLE_MARKER = "data-diff-approval-code-font";
29751
+ /** The manifest path, resolved against the document's own origin. */
29752
+ const MANIFEST_URL = `${FONT_ROUTE}/manifest.json`;
29753
+ /**
29754
+ * The `@font-face` rules for every slice of every weight, followed by the one
29755
+ * rule that uses them: the code column.
29756
+ *
29757
+ * `font-display: swap` rather than `block`: the code is readable in the system
29758
+ * font immediately, and swapping when the slices land only changes the column
29759
+ * width, never the row height that the virtual window and the jump math are
29760
+ * built on.
29761
+ */
29762
+ function codeFontCss(slices) {
29763
+ const rules = [];
29764
+ for (const face of FONT_FACES) for (const slice of slices) {
29765
+ if (slice.weight !== face.weight) continue;
29766
+ if (slice.file.indexOf(`${face.name}-`) !== 0) continue;
29767
+ rules.push(`@font-face{font-family:"${FONT_FAMILY}";src:url("${FONT_ROUTE}/${slice.file}") format("woff2");font-weight:${face.weight};font-style:normal;font-display:swap;unicode-range:${slice.unicodeRange}}`);
29768
+ }
29769
+ rules.push(`.lines{font-family:${FONT_STACK}}`);
29770
+ return rules.join("\n");
29771
+ }
29772
+ /** The manifest, read once per page: the slices it lists never change under us. */
29773
+ let manifestPromise;
29774
+ /** Fetch (or reuse) the slice list. Undefined when the host serves no slices. */
29775
+ function fetchSlices() {
29776
+ manifestPromise ??= (async () => {
29777
+ try {
29778
+ const response = await fetch(MANIFEST_URL, { credentials: "same-origin" });
29779
+ if (!response.ok) return void 0;
29780
+ const slices = (await response.json()).slices ?? [];
29781
+ return slices.length > 0 ? slices : void 0;
29782
+ } catch {
29783
+ return;
29784
+ }
29785
+ })();
29786
+ return manifestPromise;
29787
+ }
29788
+ /** The style element this module owns, once it has been injected. */
29789
+ function styleElement() {
29790
+ return document.head.querySelector(`style[${STYLE_MARKER}]`);
29791
+ }
29792
+ /**
29793
+ * Install the rules, or take them out again, to match the preference.
29794
+ *
29795
+ * Off is the default and costs nothing at all: no manifest request, no
29796
+ * `@font-face`, no rule — the panel renders exactly as it did before the font
29797
+ * existed. On is where the slices are fetched, and only as the code actually
29798
+ * needs them.
29799
+ *
29800
+ * @param live - whether the caller is still attached, consulted again after the
29801
+ * manifest await: a detached client must not install a font nobody owns.
29802
+ */
29803
+ async function apply$1(live) {
29804
+ if (!codeFontEnabled()) {
29805
+ styleElement()?.remove();
29806
+ return;
29807
+ }
29808
+ if (styleElement() !== null) return;
29809
+ const slices = await fetchSlices();
29810
+ if (slices === void 0 || !live() || !codeFontEnabled() || styleElement() !== null) return;
29811
+ const style = document.createElement("style");
29812
+ style.setAttribute(STYLE_MARKER, "");
29813
+ style.textContent = codeFontCss(slices);
29814
+ document.head.appendChild(style);
29815
+ }
29816
+ /**
29817
+ * Follow the preference for as long as the client lives: apply it now, and again
29818
+ * whenever the Settings switch flips. Silent on every failure — a host without
29819
+ * the slices (a source checkout that never ran the font build) simply keeps the
29820
+ * system stack, which is what the panel did before this existed.
29821
+ *
29822
+ * @returns a disposer that stops following and removes the injected rules.
29823
+ */
29824
+ function attachCodeFont() {
29825
+ if (typeof document === "undefined" || typeof fetch !== "function") return () => {};
29826
+ let attached = true;
29827
+ let generation = 0;
29828
+ const run = (mine) => {
29829
+ apply$1(() => attached && generation === mine);
29830
+ };
29831
+ run(generation);
29832
+ const onChange = () => {
29833
+ if (attached) run(generation);
29834
+ };
29835
+ window.addEventListener(CODE_FONT_CHANGED_EVENT, onChange);
29836
+ return () => {
29837
+ attached = false;
29838
+ generation += 1;
29839
+ window.removeEventListener(CODE_FONT_CHANGED_EVENT, onChange);
29840
+ styleElement()?.remove();
29841
+ };
29842
+ }
29843
+ //#endregion
29268
29844
  //#region lib/types/client/locales.js
29269
29845
  /** Pending-edit review UI dictionaries. */
29270
29846
  const NS = "diff-approval";
@@ -29284,7 +29860,6 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29284
29860
  "panel.tab.comments": "评论",
29285
29861
  "panel.commentsEmpty": "当前打开的文件里还没有评论",
29286
29862
  "panel.commentOutdated": "已过期",
29287
- "panel.commentEmptyTitle": "(未填写)",
29288
29863
  "panel.aria": "待处理改动",
29289
29864
  "panel.stats": "+{added} -{removed}",
29290
29865
  "panel.blockPosition": "第 {current}/{total} 块",
@@ -29315,6 +29890,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29315
29890
  "panel.diffLineHeightDesc": "差异代码每行的高度(像素,默认 22),滚动与跳转定位会随之调整。",
29316
29891
  "panel.mdPreview": "Markdown 预览",
29317
29892
  "panel.mdPreviewDesc": "开启后,选中 Markdown 文件时默认以渲染后的预览视图展示(与「源码」切换),关闭则默认显示源码差异。",
29893
+ "panel.codeFont": "等宽 CJK 字体",
29894
+ "panel.codeFontDesc": "代码区改用插件内置的「{link}」,汉字与拉丁同栅格,中文注释才能和代码对齐。开启后按 unicode-range 惰性加载 woff2 切片:普通中文约几十 KB,含生僻字时单片上限约 120 KB,纯英文仅 33 KB。默认关闭。",
29318
29895
  "panel.mdMaxWidth": "Markdown 预览宽度",
29319
29896
  "panel.mdMaxWidthDesc": "Markdown 预览内容的单栏最大宽度(像素,默认 800);双栏为两倍宽度并居中,超过时限制超宽内容。",
29320
29897
  "panel.diffAddColor": "新增颜色",
@@ -29333,6 +29910,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29333
29910
  "action.gotoGo": "确定",
29334
29911
  "action.gotoCancel": "取消",
29335
29912
  "panel.gotoMissing": "第 {line} 行不在当前文件中",
29913
+ "panel.persistFailed": "待处理改动无法写入磁盘,重启宿主后可能丢失。",
29336
29914
  "settings.keybindings": "快捷键",
29337
29915
  "settings.keybindingsDesc": "展开后可配置各项操作的按键组合。",
29338
29916
  "settings.comment": "评论",
@@ -29364,6 +29942,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29364
29942
  "row.create": "新增",
29365
29943
  "row.failed": "失败",
29366
29944
  "row.dismiss": "移出",
29945
+ "row.keepListed": "保留",
29946
+ "row.keepRemove": "保留并移出",
29947
+ "row.revertRemove": "回退并移出",
29367
29948
  "row.added": "+{added}",
29368
29949
  "row.removed": "-{removed}",
29369
29950
  "action.keep": "保留",
@@ -29373,7 +29954,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29373
29954
  "action.discussionCollapse": "收起",
29374
29955
  "discussion.placeholder": "写下你的评论…",
29375
29956
  "discussion.marker": "[评论]",
29376
- "discussion.promptRule": "(回答只针对这几行,不超过 3 行;行与行之间不要留空行;用纯文本,不要 Markdown 装饰;要求详细时不受长度限制。细则见 dsh-diff-approval-comment skill。)",
29957
+ "discussion.promptRule": "(回答只针对这几行;行与行之间不要留空行;只支持 Markdown 的行内代码和加粗,表格、列表、标题这类块级语法画不出来。细则见 dsh-diff-approval-comment skill。)",
29377
29958
  "discussion.promptRuleSkill": "(这是一条代码批注:先加载 {skill} skill,按它的规则回答。)",
29378
29959
  "discussion.thinking": "思考中",
29379
29960
  "discussion.queued": "排队等待中",
@@ -29484,6 +30065,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29484
30065
  "panel.addNoEntries": "此目录为空",
29485
30066
  "panel.addMissing": "路径不存在",
29486
30067
  "panel.addOutside": "路径不在当前工作区内",
30068
+ "panel.addNotAFile": "这是一个目录,请输入文件路径",
29487
30069
  "panel.addFailed": "添加失败:{message}",
29488
30070
  "action.cancel": "取消",
29489
30071
  "action.collapseRow": "收起",
@@ -29505,7 +30087,6 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29505
30087
  "panel.tab.comments": "Comments",
29506
30088
  "panel.commentsEmpty": "No comments in the open files yet",
29507
30089
  "panel.commentOutdated": "Outdated",
29508
- "panel.commentEmptyTitle": "(not written yet)",
29509
30090
  "panel.aria": "Pending changes",
29510
30091
  "panel.stats": "+{added} -{removed}",
29511
30092
  "panel.blockPosition": "{current}/{total}",
@@ -29536,6 +30117,8 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29536
30117
  "panel.diffLineHeightDesc": "The diff code line height, in pixels (default 22); scrolling and jump positioning follow it.",
29537
30118
  "panel.mdPreview": "Markdown preview",
29538
30119
  "panel.mdPreviewDesc": "When on, selecting a Markdown file shows the rendered preview view by default (toggle with \"Source\"); when off, it shows the source diff.",
30120
+ "panel.codeFont": "Monospaced CJK font",
30121
+ "panel.codeFontDesc": "Renders the code column with the bundled \"{link}\", so hanzi share the code's grid and Chinese comments line up with it. When on, the woff2 slices load lazily by unicode-range: tens of KB for ordinary Chinese, at most ~120 KB per slice for a rare character, 33 KB for pure ASCII. Off by default.",
29539
30122
  "panel.mdMaxWidth": "Markdown preview width",
29540
30123
  "panel.mdMaxWidthDesc": "The single-column max width of the Markdown preview content, in pixels (default 800); the double-column view uses twice this and centres it.",
29541
30124
  "panel.diffAddColor": "Added color",
@@ -29554,6 +30137,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29554
30137
  "action.gotoGo": "Go",
29555
30138
  "action.gotoCancel": "Cancel",
29556
30139
  "panel.gotoMissing": "Line {line} is not in the current file",
30140
+ "panel.persistFailed": "Pending changes could not be written to disk, so they may be lost when the host restarts.",
29557
30141
  "settings.keybindings": "Shortcuts",
29558
30142
  "settings.keybindingsDesc": "Expand to configure the key combo for each action.",
29559
30143
  "settings.comment": "Comments",
@@ -29585,6 +30169,9 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29585
30169
  "row.create": "New",
29586
30170
  "row.failed": "Failed",
29587
30171
  "row.dismiss": "Remove",
30172
+ "row.keepListed": "Keep",
30173
+ "row.keepRemove": "Keep and remove",
30174
+ "row.revertRemove": "Revert and remove",
29588
30175
  "row.added": "+{added}",
29589
30176
  "row.removed": "-{removed}",
29590
30177
  "action.keep": "Keep",
@@ -29594,7 +30181,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29594
30181
  "action.discussionCollapse": "Collapse",
29595
30182
  "discussion.placeholder": "Write your comment…",
29596
30183
  "discussion.marker": "[Review]",
29597
- "discussion.promptRule": "(Answer only about these lines, in at most 3 lines, with no blank line between them, as plain text without Markdown decoration; ignore the length limit if my annotation asks for detail. Full rules: the dsh-diff-approval-comment skill.)",
30184
+ "discussion.promptRule": "(Answer only about these lines, with no blank line between them; only Markdown inline code and bold are supported — tables, lists and headings cannot be drawn here. Full rules: the dsh-diff-approval-comment skill.)",
29598
30185
  "discussion.promptRuleSkill": "(This is a comment on a few diff lines: load the {skill} skill first and answer by its rules.)",
29599
30186
  "discussion.thinking": "Thinking",
29600
30187
  "discussion.queued": "Queued",
@@ -29705,6 +30292,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29705
30292
  "panel.addNoEntries": "This directory is empty",
29706
30293
  "panel.addMissing": "No such path",
29707
30294
  "panel.addOutside": "That path is outside the workspace",
30295
+ "panel.addNotAFile": "That is a directory; give a file path",
29708
30296
  "panel.addFailed": "Add failed: {message}",
29709
30297
  "action.cancel": "Cancel",
29710
30298
  "action.collapseRow": "Collapse",
@@ -29816,6 +30404,7 @@ XID_Start XIDS`.split(/\s/).map((p) => [w(p), p]));
29816
30404
  */
29817
30405
  function apply(ctx) {
29818
30406
  injectFooterStackStyle();
30407
+ ctx.effect(() => attachCodeFont(), "diff-approval: code font");
29819
30408
  ctx.effect(() => ctx.locale.register(NS, {
29820
30409
  zh,
29821
30410
  en