dsh-plugin-core 0.20.3 → 0.20.6

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 (159) hide show
  1. package/dist/design/tokens-css.generated.d.ts +1 -1
  2. package/dist/design/tokens-css.generated.d.ts.map +1 -1
  3. package/dist/design/tokens-css.generated.js +1 -1
  4. package/dist/design/tokens-css.generated.js.map +1 -1
  5. package/dist/explorer/FileBrowser.d.ts +13 -6
  6. package/dist/explorer/FileBrowser.d.ts.map +1 -1
  7. package/dist/explorer/FileBrowser.js +190 -305
  8. package/dist/explorer/FileBrowser.js.map +1 -1
  9. package/dist/explorer/crumb-nav.d.ts +45 -0
  10. package/dist/explorer/crumb-nav.d.ts.map +1 -0
  11. package/dist/explorer/crumb-nav.js +75 -0
  12. package/dist/explorer/crumb-nav.js.map +1 -0
  13. package/dist/explorer/crumbs-menu.d.ts +37 -0
  14. package/dist/explorer/crumbs-menu.d.ts.map +1 -0
  15. package/dist/explorer/crumbs-menu.js +102 -0
  16. package/dist/explorer/crumbs-menu.js.map +1 -0
  17. package/dist/explorer/explorer-css.generated.d.ts +1 -1
  18. package/dist/explorer/explorer-css.generated.d.ts.map +1 -1
  19. package/dist/explorer/explorer-css.generated.js +1 -1
  20. package/dist/explorer/explorer-css.generated.js.map +1 -1
  21. package/dist/explorer/fs-face.d.ts +36 -0
  22. package/dist/explorer/fs-face.d.ts.map +1 -0
  23. package/dist/explorer/fs-face.js +74 -0
  24. package/dist/explorer/fs-face.js.map +1 -0
  25. package/dist/explorer/index.d.ts +2 -1
  26. package/dist/explorer/index.d.ts.map +1 -1
  27. package/dist/explorer/index.js +2 -1
  28. package/dist/explorer/index.js.map +1 -1
  29. package/dist/explorer/landing.d.ts +26 -0
  30. package/dist/explorer/landing.d.ts.map +1 -0
  31. package/dist/explorer/landing.js +43 -0
  32. package/dist/explorer/landing.js.map +1 -0
  33. package/dist/explorer/open.d.ts +35 -38
  34. package/dist/explorer/open.d.ts.map +1 -1
  35. package/dist/explorer/open.js +124 -156
  36. package/dist/explorer/open.js.map +1 -1
  37. package/dist/explorer/preview/BytesPreview.d.ts +2 -3
  38. package/dist/explorer/preview/BytesPreview.d.ts.map +1 -1
  39. package/dist/explorer/preview/BytesPreview.js +3 -3
  40. package/dist/explorer/preview/BytesPreview.js.map +1 -1
  41. package/dist/explorer/preview/HtmlPreview.d.ts +2 -3
  42. package/dist/explorer/preview/HtmlPreview.d.ts.map +1 -1
  43. package/dist/explorer/preview/HtmlPreview.js +4 -5
  44. package/dist/explorer/preview/HtmlPreview.js.map +1 -1
  45. package/dist/explorer/preview/OfficePreview.d.ts +2 -1
  46. package/dist/explorer/preview/OfficePreview.d.ts.map +1 -1
  47. package/dist/explorer/preview/OfficePreview.js +9 -2
  48. package/dist/explorer/preview/OfficePreview.js.map +1 -1
  49. package/dist/explorer/preview/TextPreview.d.ts +2 -3
  50. package/dist/explorer/preview/TextPreview.d.ts.map +1 -1
  51. package/dist/explorer/preview/TextPreview.js +3 -3
  52. package/dist/explorer/preview/TextPreview.js.map +1 -1
  53. package/dist/explorer/preview/index.d.ts +6 -3
  54. package/dist/explorer/preview/index.d.ts.map +1 -1
  55. package/dist/explorer/preview/index.js +3 -6
  56. package/dist/explorer/preview/index.js.map +1 -1
  57. package/dist/explorer/preview-title-bar.d.ts +26 -0
  58. package/dist/explorer/preview-title-bar.d.ts.map +1 -0
  59. package/dist/explorer/preview-title-bar.js +48 -0
  60. package/dist/explorer/preview-title-bar.js.map +1 -0
  61. package/dist/explorer/types.d.ts +25 -23
  62. package/dist/explorer/types.d.ts.map +1 -1
  63. package/dist/explorer/types.js +61 -120
  64. package/dist/explorer/types.js.map +1 -1
  65. package/dist/host/fs-route.d.ts +25 -0
  66. package/dist/host/fs-route.d.ts.map +1 -0
  67. package/dist/host/fs-route.js +243 -0
  68. package/dist/host/fs-route.js.map +1 -0
  69. package/dist/host/index.d.ts +2 -0
  70. package/dist/host/index.d.ts.map +1 -1
  71. package/dist/host/index.js +1 -0
  72. package/dist/host/index.js.map +1 -1
  73. package/dist/session/session-css.generated.d.ts +1 -1
  74. package/dist/session/session-css.generated.d.ts.map +1 -1
  75. package/dist/session/session-css.generated.js +1 -1
  76. package/dist/session/session-css.generated.js.map +1 -1
  77. package/dist/ui/DateTimePicker.d.ts.map +1 -1
  78. package/dist/ui/DateTimePicker.js +5 -1
  79. package/dist/ui/DateTimePicker.js.map +1 -1
  80. package/dist/ui/Modal.d.ts.map +1 -1
  81. package/dist/ui/Modal.js +7 -2
  82. package/dist/ui/Modal.js.map +1 -1
  83. package/dist/ui/PanelDock.d.ts.map +1 -1
  84. package/dist/ui/PanelDock.js +4 -8
  85. package/dist/ui/PanelDock.js.map +1 -1
  86. package/dist/ui/Picker.d.ts.map +1 -1
  87. package/dist/ui/Picker.js +6 -3
  88. package/dist/ui/Picker.js.map +1 -1
  89. package/dist/ui/code-viewer-css.generated.d.ts +1 -1
  90. package/dist/ui/code-viewer-css.generated.d.ts.map +1 -1
  91. package/dist/ui/code-viewer-css.generated.js +1 -1
  92. package/dist/ui/code-viewer-css.generated.js.map +1 -1
  93. package/dist/ui/controls/datetime-css.generated.d.ts +1 -1
  94. package/dist/ui/controls/datetime-css.generated.d.ts.map +1 -1
  95. package/dist/ui/controls/datetime-css.generated.js +1 -1
  96. package/dist/ui/controls/datetime-css.generated.js.map +1 -1
  97. package/dist/ui/controls/field-css.generated.d.ts +1 -1
  98. package/dist/ui/controls/field-css.generated.d.ts.map +1 -1
  99. package/dist/ui/controls/field-css.generated.js +1 -1
  100. package/dist/ui/controls/field-css.generated.js.map +1 -1
  101. package/dist/ui/controls/loading-css.generated.d.ts +1 -1
  102. package/dist/ui/controls/loading-css.generated.d.ts.map +1 -1
  103. package/dist/ui/controls/loading-css.generated.js +1 -1
  104. package/dist/ui/controls/loading-css.generated.js.map +1 -1
  105. package/dist/ui/feedback-css.generated.d.ts +1 -1
  106. package/dist/ui/feedback-css.generated.d.ts.map +1 -1
  107. package/dist/ui/feedback-css.generated.js +1 -1
  108. package/dist/ui/feedback-css.generated.js.map +1 -1
  109. package/dist/ui/marquee-css.generated.d.ts +1 -1
  110. package/dist/ui/marquee-css.generated.d.ts.map +1 -1
  111. package/dist/ui/marquee-css.generated.js +1 -1
  112. package/dist/ui/marquee-css.generated.js.map +1 -1
  113. package/dist/ui/overlay-css.generated.d.ts +1 -1
  114. package/dist/ui/overlay-css.generated.d.ts.map +1 -1
  115. package/dist/ui/overlay-css.generated.js +1 -1
  116. package/dist/ui/overlay-css.generated.js.map +1 -1
  117. package/dist/ui/overlay.d.ts +8 -2
  118. package/dist/ui/overlay.d.ts.map +1 -1
  119. package/dist/ui/overlay.js +7 -6
  120. package/dist/ui/overlay.js.map +1 -1
  121. package/dist/ui/panel-css.d.ts +2 -0
  122. package/dist/ui/panel-css.d.ts.map +1 -0
  123. package/dist/ui/panel-css.generated.d.ts +2 -0
  124. package/dist/ui/panel-css.generated.d.ts.map +1 -0
  125. package/dist/ui/panel-css.generated.js +4 -0
  126. package/dist/ui/panel-css.generated.js.map +1 -0
  127. package/dist/ui/panel-css.js +2 -0
  128. package/dist/ui/panel-css.js.map +1 -0
  129. package/dist/ui/panel-dock-css.generated.d.ts +1 -1
  130. package/dist/ui/panel-dock-css.generated.d.ts.map +1 -1
  131. package/dist/ui/panel-dock-css.generated.js +1 -1
  132. package/dist/ui/panel-dock-css.generated.js.map +1 -1
  133. package/dist/ui/panel.d.ts +41 -0
  134. package/dist/ui/panel.d.ts.map +1 -0
  135. package/dist/ui/panel.js +37 -0
  136. package/dist/ui/panel.js.map +1 -0
  137. package/dist/ui/picker-css.generated.d.ts +1 -1
  138. package/dist/ui/picker-css.generated.d.ts.map +1 -1
  139. package/dist/ui/picker-css.generated.js +1 -1
  140. package/dist/ui/picker-css.generated.js.map +1 -1
  141. package/dist/ui/side-panel-css.generated.d.ts +1 -1
  142. package/dist/ui/side-panel-css.generated.d.ts.map +1 -1
  143. package/dist/ui/side-panel-css.generated.js +1 -1
  144. package/dist/ui/side-panel-css.generated.js.map +1 -1
  145. package/dist/utils/i18n.d.ts +1 -1
  146. package/dist/utils/i18n.d.ts.map +1 -1
  147. package/dist/utils/i18n.js +6 -0
  148. package/dist/utils/i18n.js.map +1 -1
  149. package/docs/design/architecture.md +9 -4
  150. package/docs/design/external/dsh-host.md +60 -0
  151. package/docs/design/style.md +54 -0
  152. package/docs/help/explorer.doc.ts +35 -30
  153. package/docs/help/explorer.md +23 -19
  154. package/docs/help/integration.doc.ts +15 -10
  155. package/docs/help/integration.md +15 -10
  156. package/docs/help/ui.doc.ts +2 -2
  157. package/docs/help/ui.md +2 -2
  158. package/docs/requirements.md +2 -1
  159. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
1
  // ⚠️ 生成物,勿手改。真源 = src/ui/controls/loading.css
2
2
  // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
- export const LOADING_CSS = "\n/* 运行中 / loading 的活动指示:三个小方块依次脉动。 */\n@keyframes dshpc-run-block { 0%, 80%, 100% { opacity: 0.25; transform: scale(0.8) } 40% { opacity: 1; transform: scale(1) } }\n.dshpc-run-blocks { display: inline-flex; align-items: center; gap: 3px; }\n.dshpc-run-blocks > i { width: 5px; height: 5px; border-radius: 1px; background: currentColor; animation: dshpc-run-block 1.2s ease-in-out infinite; }\n.dshpc-run-blocks > i:nth-child(2) { animation-delay: 0.15s; }\n.dshpc-run-blocks > i:nth-child(3) { animation-delay: 0.3s; }\n@media (prefers-reduced-motion: reduce) { .dshpc-run-blocks > i { animation: none; opacity: 1; } }\n\n/* ── 加载提示(LoadingToast / LoadingBlock / showLoading)───────────────────\n 两种样式共用一个灰色面(与 notify 的 info 卡同色),暗色走 body[data-ds-dark-theme]。\n 卡里的转圈图标不自绘:复用 Loader(size sm / md),环的画法与动画只有 controls/loader.css 一份。 */\n\n/* 样式一:横排 toast 卡(图标在左、文字在右),与 notify 的 info 卡同尺寸同色。 */\n.dshpc-loading-toast {\n display: inline-flex; align-items: center; gap: 10px;\n /* 不学 notify 固定 320 宽:这张卡也常被塞进表格 / 窄栏里,宽度随内容走。\n shortcut: 下限 250px,要更宽 / 更窄就改这一处。 */\n min-width: 250px; min-height: 48px; padding: 12px 16px; box-sizing: border-box;\n border-radius: 10px; box-shadow: 0 6px 16px rgba(0, 0, 0, .18);\n background: #f4f4f5; color: #18181b;\n font-size: var(--dshpc-font-lg); line-height: var(--dshpc-line-lg);\n}\n\n/* 样式二:方块卡(转圈在上、文字在下),内距更大。 */\n.dshpc-loading-block {\n display: inline-flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px;\n min-width: 132px; min-height: 132px; padding: 24px; box-sizing: border-box;\n border-radius: var(--dshpc-radius-md); box-shadow: 0 6px 16px rgba(0, 0, 0, .18);\n background: #f4f4f5; color: #18181b;\n font-size: var(--dshpc-font-md); line-height: var(--dshpc-line-md);\n}\nbody[data-ds-dark-theme] .dshpc-loading-toast,\nbody[data-ds-dark-theme] .dshpc-loading-block { background: #3f3f46; color: #fafafa; }\n\n/* 全局浮层:居中、不挡点击(遮罩层单独一个 div 才挡)。\n 与 Modal 遮罩同一套让位口径:右边界读 --dshpc-page-inset-right。 */\n.dshpc-loading-overlay {\n position: fixed; inset: 0 var(--dshpc-page-inset-right, 0px) 0 0; z-index: var(--dshpc-z-modal);\n display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;\n padding: 24px; box-sizing: border-box; pointer-events: none;\n}\n/* 七向定位(与 Toast 的六向同名 + 正中):默认 bottom-center,与 Sonner 提示同屏位。 */\n.dshpc-loading-overlay--top-left { align-items: flex-start; justify-content: flex-start; }\n.dshpc-loading-overlay--top-center { justify-content: flex-start; }\n.dshpc-loading-overlay--top-right { align-items: flex-end; justify-content: flex-start; }\n.dshpc-loading-overlay--bottom-left { align-items: flex-start; justify-content: flex-end; }\n.dshpc-loading-overlay--bottom-center { justify-content: flex-end; }\n.dshpc-loading-overlay--bottom-right { align-items: flex-end; justify-content: flex-end; }\n.dshpc-loading-overlay__mask { position: absolute; inset: 0; pointer-events: auto; }\n";
3
+ export const LOADING_CSS = "\n/* 运行中 / loading 的活动指示:三个小方块依次脉动。 */\n@keyframes dshpc-run-block { 0%, 80%, 100% { opacity: 0.25; transform: scale(0.8) } 40% { opacity: 1; transform: scale(1) } }\n.dshpc-run-blocks { display: inline-flex; align-items: center; gap: 3px; }\n.dshpc-run-blocks > i { width: 5px; height: 5px; border-radius: 1px; background: currentColor; animation: dshpc-run-block 1.2s ease-in-out infinite; }\n.dshpc-run-blocks > i:nth-child(2) { animation-delay: 0.15s; }\n.dshpc-run-blocks > i:nth-child(3) { animation-delay: 0.3s; }\n@media (prefers-reduced-motion: reduce) { .dshpc-run-blocks > i { animation: none; opacity: 1; } }\n\n/* ── 加载提示(LoadingToast / LoadingBlock / showLoading)───────────────────\n 两种样式的表面统一走 token(2026-11-03:原来写死 #f4f4f5/#18181b 再补一段暗色覆盖,\n 等于自己造第二套主题;现在底色/字色/阴影全从 var(--dshpc-*) 来,暗色自动跟随)。\n 卡里的转圈图标不自绘:复用 Loader(size sm / md),环的画法与动画只有 controls/loader.css 一份。 */\n\n/* 样式一:横排 toast 卡(图标在左、文字在右),与 notify 的 info 卡同尺寸同色。 */\n.dshpc-loading-toast {\n display: inline-flex; align-items: center; gap: 10px;\n /* 不学 notify 固定 320 宽:这张卡也常被塞进表格 / 窄栏里,宽度随内容走。\n shortcut: 下限 250px,要更宽 / 更窄就改这一处。 */\n min-width: 250px; min-height: 48px; padding: 12px 16px; box-sizing: border-box;\n border-radius: var(--dshpc-radius-lg); box-shadow: var(--dshpc-shadow-2);\n background: var(--dshpc-surface-1); color: var(--dshpc-fg);\n font-size: var(--dshpc-font-lg); line-height: var(--dshpc-line-lg);\n}\n\n/* 样式二:方块卡(转圈在上、文字在下),内距更大。 */\n.dshpc-loading-block {\n display: inline-flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px;\n min-width: 132px; min-height: 132px; padding: 24px; box-sizing: border-box;\n border-radius: var(--dshpc-radius-md); box-shadow: var(--dshpc-shadow-2);\n background: var(--dshpc-surface-1); color: var(--dshpc-fg);\n font-size: var(--dshpc-font-md); line-height: var(--dshpc-line-md);\n}\n\n/* 全局浮层:居中、不挡点击(遮罩层单独一个 div 才挡)。\n 与 Modal 遮罩同一套让位口径:右边界读 --dshpc-page-inset-right。 */\n.dshpc-loading-overlay {\n position: fixed; inset: 0 var(--dshpc-page-inset-right, 0px) 0 0; z-index: var(--dshpc-z-modal);\n display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;\n padding: 24px; box-sizing: border-box; pointer-events: none;\n}\n/* 七向定位(与 Toast 的六向同名 + 正中):默认 bottom-center,与 Sonner 提示同屏位。 */\n.dshpc-loading-overlay--top-left { align-items: flex-start; justify-content: flex-start; }\n.dshpc-loading-overlay--top-center { justify-content: flex-start; }\n.dshpc-loading-overlay--top-right { align-items: flex-end; justify-content: flex-start; }\n.dshpc-loading-overlay--bottom-left { align-items: flex-start; justify-content: flex-end; }\n.dshpc-loading-overlay--bottom-center { justify-content: flex-end; }\n.dshpc-loading-overlay--bottom-right { align-items: flex-end; justify-content: flex-end; }\n.dshpc-loading-overlay__mask { position: absolute; inset: 0; pointer-events: auto; }\n";
4
4
  //# sourceMappingURL=loading-css.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"loading-css.generated.js","sourceRoot":"","sources":["../../../src/ui/controls/loading-css.generated.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,+4FAA+4F,CAAA"}
1
+ {"version":3,"file":"loading-css.generated.js","sourceRoot":"","sources":["../../../src/ui/controls/loading-css.generated.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,y2FAAy2F,CAAA"}
@@ -1,2 +1,2 @@
1
- export declare const FEEDBACK_CSS = "/* \u906E\u7F69\u4E0E\u5934\u90E8\u5DF2\u62BD\u5230 overlay.css\uFF08Modal / SideSheet \u5171\u7528\uFF09\uFF0C\u8FD9\u91CC\u53EA\u5269\u9762\u677F\u672C\u4F53\u4E0E\u5BB6\u65CF\u5C3A\u5BF8\u3002 */\n/* \u5927\u5F39\u7A97\u5BB6\u65CF\uFF08md/lg\uFF09\uFF1A\u6284\u5144\u5F1F\u9879\u76EE archive-session-css \u7684 .dsh-tdt-sv-panel\uFF08surface-base + border-l2 + radius 12 + shadow-2\uFF09\u3002 */\n.dshpc-modal{\n display:flex;flex-direction:column;box-sizing:border-box;\n /* \u9762\u677F\u5E95\u8272 = \u5BBF\u4E3B\u6D6E\u5C42\u6863 bg-layer-1\uFF08\u4E0E\u5B98\u65B9\u5F39\u7A97\u540C\u5C42\uFF09\uFF0C\u4E0D\u662F\u9875\u9762\u5E95 bg-base\uFF1A\n base \u5728\u6697\u8272\u4E0B\u662F\u7EAF\u9ED1\u3001\u4EAE\u8272\u4E0B\u662F\u6700\u767D\uFF0C\u5F39\u7A97\u7528\u5B83\u624D\u4F1A\u300C\u6BD4\u539F\u751F\u66F4\u9ED1 / \u66F4\u767D\u300D\uFF08\u7528\u6237 2026-11-02\uFF09\u3002 */\n background:var(--dshpc-surface-1);color:var(--dshpc-fg);\n border:3px solid var(--dshpc-border);border-radius:var(--dshpc-radius-xl);\n box-shadow:var(--dshpc-shadow-2);overflow:hidden;\n}\n/* body = \u552F\u4E00\u6EDA\u52A8\u5BB9\u5668\uFF1A\u5185\u8DDD\u4E0E\u6EDA\u52A8\u90FD\u5F52\u5B83\uFF08\u6EDA\u52A8\u6761\u8D34\u9762\u677F\u53F3\u7F18\uFF0C\u4E0D\u88AB\u5185\u8DDD\u6324\u8FDB\u6765\uFF09\uFF1B\n \u5185\u5BB9\u6309\u6D41\u6392\uFF0C\u4E0D\u8BBE height:100%\u3001\u4E0D\u81EA\u5DF1\u5F00\u6EDA\u52A8\u6761\u3002 */\n.dshpc-modal__body{flex:1 1 auto;min-height:0;overflow:auto;padding:17px 18px}\n/* \u5E95\u680F\u4E0E\u5934\u90E8\u540C\u4E00\u53E3\u5F84\uFF082026-11-02 \u7528\u6237\uFF09\uFF1A\u4E0A\u4E0B\u5185\u8DDD\u76F8\u7B49\u3001\u5185\u5BB9\u5782\u76F4\u5C45\u4E2D\u3001\u9ED8\u8BA4\u5E26\u4E00\u6761\u5206\u9694\u7EBF\u3002\n \u7EBF\u53EF\u7531\u6D88\u8D39\u65B9\u5173\u6389\uFF08Modal \u7684 footerDivider=false\uFF09\u2014\u2014 \u786E\u8BA4\u6846\u5BB6\u65CF\u672C\u6765\u5C31\u6CA1\u6709\u7EBF\uFF08\u4E0E\u5934\u90E8\u4E00\u81F4\uFF09\u3002 */\n.dshpc-modal .dshpc-modal__foot{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:18px;border-top:1px solid var(--dshpc-border)}\n.dshpc-modal .dshpc-modal__foot--bare{border-top:none}\n.dshpc-toast-host{\n position:fixed;z-index:1090;left:50%;bottom:32px;transform:translateX(-50%);\n display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;\n}\n.dshpc-toast{\n padding:8px 14px;border-radius:8px;font-size:13px;color:var(--dshpc-fg);\n background:var(--dshpc-surface-menu);border:1px solid var(--dshpc-border);\n box-shadow:0 8px 24px rgba(15,23,42,.16);\n}\n.dshpc-toast--success{color:var(--dshpc-success);border-color:color-mix(in srgb,var(--dshpc-success) 40%,transparent)}\n.dshpc-toast--error{color:var(--dshpc-danger);border-color:color-mix(in srgb,var(--dshpc-danger) 40%,transparent)}\n.dshpc-error__retry{\n margin-top:8px;color:var(--dshpc-link);cursor:pointer;background:none;border:none;padding:0;\n}\n/* \u539F\u751F\u5F39\u7A97\u6F14\u793A\uFF1A\u7ECF\u5BBF\u4E3B Modal \u7684 contentClassName \u6CE8\u5165\uFF0C\u8BC1\u660E\u5BBF\u4E3B\u5185\u5BB9\u533A\u5C3A\u5BF8\u53EF\u7ECF\u7C7B\u540D\u81EA\u5B9A\u4E49\u3002 */\n.dshpc-native-demo-content{max-width:520px}\n/* \u5934\u90E8\u4FE1\u53F7\u56FE\u6807\uFF08AlertModal \u6309 severity \u6CE8\u5165\uFF09\uFF1A\u81EA\u542B\u914D\u8272\uFF0C\u4E0D\u4F9D\u8D56\u5BBF\u4E3B token\u3002 */\n.dshpc-alert-sev{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:12px;color:#fff;flex:none}\n.dshpc-alert-sev--info{background:#2563eb}\n.dshpc-alert-sev--success{background:#16a34a}\n.dshpc-alert-sev--warning{background:#d97706}\n.dshpc-alert-sev--error{background:#dc2626}\n/* \u5C0F\u786E\u8BA4\u6846\u5BB6\u65CF\uFF08sm\uFF09\uFF1A\u4E25\u683C\u6284\u5144\u5F1F\u9879\u76EE renderConfirm \u7684 dialogStyle\uFF08task-list.tsx:456\uFF09\u2014\u2014\n 360px \u5BBD / 18px \u5185\u8DDD / \u5934\u90E8\u65E0\u5206\u9694\u7EBF / \u8BF4\u660E\u6587\u5B57 fg-2 / \u5E95\u90E8\u6309\u94AE\u53F3\u5BF9\u9F50\u3002 */\n.dshpc-modal--sm{padding:18px}\n.dshpc-modal--sm .dshpc-overlay-head{padding:0 0 8px;border-bottom:none}\n.dshpc-modal--sm .dshpc-modal__body{padding:0 0 14px;overflow:visible;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);line-height:var(--dshpc-line-sm)}\n.dshpc-modal--sm .dshpc-modal__foot{padding:0;border-top:none}\n";
1
+ export declare const FEEDBACK_CSS = "/* \u906E\u7F69\u4E0E\u5934\u90E8\u5728 overlay.css\uFF0C\u8868\u9762\uFF08\u5E95\u8272/\u63CF\u8FB9/\u5706\u89D2/\u9634\u5F71\uFF09\u5728 panel.css \u7684 --modal \u6863\uFF0C\n \u8FD9\u91CC\u53EA\u5269**\u5BB6\u65CF\u5E03\u5C40\u4E0E\u5C3A\u5BF8**\u3002\u4E09\u8005\u5404\u7BA1\u4E00\u6BB5\uFF0C\u522B\u518D\u628A\u76AE\u80A4\u6284\u56DE\u6765\u3002 */\n.dshpc-modal{\n display:flex;flex-direction:column;box-sizing:border-box;\n}\n/* body = \u552F\u4E00\u6EDA\u52A8\u5BB9\u5668\uFF1A\u5185\u8DDD\u4E0E\u6EDA\u52A8\u90FD\u5F52\u5B83\uFF08\u6EDA\u52A8\u6761\u8D34\u9762\u677F\u53F3\u7F18\uFF0C\u4E0D\u88AB\u5185\u8DDD\u6324\u8FDB\u6765\uFF09\uFF1B\n \u5185\u5BB9\u6309\u6D41\u6392\uFF0C\u4E0D\u8BBE height:100%\u3001\u4E0D\u81EA\u5DF1\u5F00\u6EDA\u52A8\u6761\u3002\n \u900F\u660E\u53F3\u8FB9\u6846 = \u8BA9\u6EDA\u52A8\u6761\u4E0E\u9762\u677F\u53F3\u7F18\u9694 1px\uFF08\u53E3\u5F84\u89C1 style.md \u00A7\u6EDA\u52A8\u6761\u8BA9\u4F4D\uFF09\u3002 */\n.dshpc-modal__body{flex:1 1 auto;min-height:0;overflow:auto;padding:17px 18px;border-right:1px solid transparent}\n/* \u5E95\u680F\u4E0E\u5934\u90E8\u540C\u4E00\u53E3\u5F84\uFF082026-11-02 \u7528\u6237\uFF09\uFF1A\u4E0A\u4E0B\u5185\u8DDD\u76F8\u7B49\u3001\u5185\u5BB9\u5782\u76F4\u5C45\u4E2D\u3001\u9ED8\u8BA4\u5E26\u4E00\u6761\u5206\u9694\u7EBF\u3002\n \u7EBF\u53EF\u7531\u6D88\u8D39\u65B9\u5173\u6389\uFF08Modal \u7684 footerDivider=false\uFF09\u2014\u2014 \u786E\u8BA4\u6846\u5BB6\u65CF\u672C\u6765\u5C31\u6CA1\u6709\u7EBF\uFF08\u4E0E\u5934\u90E8\u4E00\u81F4\uFF09\u3002 */\n.dshpc-modal .dshpc-modal__foot{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:18px;border-top:1px solid var(--dshpc-border)}\n.dshpc-modal .dshpc-modal__foot--bare{border-top:none}\n/* \u81EA\u7ED8 toast \u7684\u6837\u5F0F\u5728 2026-11-03 \u5220\u9664\uFF1AToast \u65E9\u5DF2\u6539\u8D70\u5BBF\u4E3B toast()\uFF08Toast.ts \u7684 showNative\uFF09\uFF0C\n .dshpc-toast* \u8FD9\u51E0\u4E2A\u7C7B\u6CA1\u6709\u4EFB\u4F55\u6D88\u8D39\u8005\uFF0C\u7559\u7740\u53EA\u662F\u6B7B\u6837\u5F0F\uFF08\u8FD8\u5E26\u7740\u88F8 z-index \u4E0E\u88F8\u9634\u5F71\uFF09\u3002 */\n.dshpc-error__retry{\n margin-top:8px;color:var(--dshpc-link);cursor:pointer;background:none;border:none;padding:0;\n}\n/* \u539F\u751F\u5F39\u7A97\u6F14\u793A\uFF1A\u7ECF\u5BBF\u4E3B Modal \u7684 contentClassName \u6CE8\u5165\uFF0C\u8BC1\u660E\u5BBF\u4E3B\u5185\u5BB9\u533A\u5C3A\u5BF8\u53EF\u7ECF\u7C7B\u540D\u81EA\u5B9A\u4E49\u3002 */\n.dshpc-native-demo-content{max-width:520px}\n/* \u5934\u90E8\u4FE1\u53F7\u56FE\u6807\uFF08AlertModal \u6309 severity \u6CE8\u5165\uFF09\uFF1A\u81EA\u542B\u914D\u8272\uFF0C\u8272\u503C\u5728 tokens.css \u7684 --dshpc-sev-*\u3002 */\n.dshpc-alert-sev{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:12px;color:var(--dshpc-on-signal);flex:none}\n.dshpc-alert-sev--info{background:var(--dshpc-sev-info)}\n.dshpc-alert-sev--success{background:var(--dshpc-sev-success)}\n.dshpc-alert-sev--warning{background:var(--dshpc-sev-warning)}\n.dshpc-alert-sev--error{background:var(--dshpc-sev-error)}\n/* \u5C0F\u786E\u8BA4\u6846\u5BB6\u65CF\uFF08sm\uFF09\uFF1A\u4E25\u683C\u6284\u5144\u5F1F\u9879\u76EE renderConfirm \u7684 dialogStyle\uFF08task-list.tsx:456\uFF09\u2014\u2014\n 360px \u5BBD / 18px \u5185\u8DDD / \u5934\u90E8\u65E0\u5206\u9694\u7EBF / \u8BF4\u660E\u6587\u5B57 fg-2 / \u5E95\u90E8\u6309\u94AE\u53F3\u5BF9\u9F50\u3002 */\n.dshpc-modal--sm{padding:18px}\n.dshpc-modal--sm .dshpc-overlay-head{padding:0 0 8px;border-bottom:none}\n.dshpc-modal--sm .dshpc-modal__body{padding:0 0 14px;overflow:visible;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);line-height:var(--dshpc-line-sm)}\n.dshpc-modal--sm .dshpc-modal__foot{padding:0;border-top:none}\n";
2
2
  //# sourceMappingURL=feedback-css.generated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feedback-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/feedback-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,4yIAA4uF,CAAA"}
1
+ {"version":3,"file":"feedback-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/feedback-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,utHAAyiE,CAAA"}
@@ -1,4 +1,4 @@
1
1
  // ⚠️ 生成物,勿手改。真源 = src/ui/feedback.css
2
2
  // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
- export const FEEDBACK_CSS = "/* 遮罩与头部已抽到 overlay.css(Modal / SideSheet 共用),这里只剩面板本体与家族尺寸。 */\n/* 大弹窗家族(md/lg):抄兄弟项目 archive-session-css 的 .dsh-tdt-sv-panel(surface-base + border-l2 + radius 12 + shadow-2)。 */\n.dshpc-modal{\n display:flex;flex-direction:column;box-sizing:border-box;\n /* 面板底色 = 宿主浮层档 bg-layer-1(与官方弹窗同层),不是页面底 bg-base:\n base 在暗色下是纯黑、亮色下是最白,弹窗用它才会「比原生更黑 / 更白」(用户 2026-11-02)。 */\n background:var(--dshpc-surface-1);color:var(--dshpc-fg);\n border:3px solid var(--dshpc-border);border-radius:var(--dshpc-radius-xl);\n box-shadow:var(--dshpc-shadow-2);overflow:hidden;\n}\n/* body = 唯一滚动容器:内距与滚动都归它(滚动条贴面板右缘,不被内距挤进来);\n 内容按流排,不设 height:100%、不自己开滚动条。 */\n.dshpc-modal__body{flex:1 1 auto;min-height:0;overflow:auto;padding:17px 18px}\n/* 底栏与头部同一口径(2026-11-02 用户):上下内距相等、内容垂直居中、默认带一条分隔线。\n 线可由消费方关掉(Modal 的 footerDivider=false)—— 确认框家族本来就没有线(与头部一致)。 */\n.dshpc-modal .dshpc-modal__foot{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:18px;border-top:1px solid var(--dshpc-border)}\n.dshpc-modal .dshpc-modal__foot--bare{border-top:none}\n.dshpc-toast-host{\n position:fixed;z-index:1090;left:50%;bottom:32px;transform:translateX(-50%);\n display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;\n}\n.dshpc-toast{\n padding:8px 14px;border-radius:8px;font-size:13px;color:var(--dshpc-fg);\n background:var(--dshpc-surface-menu);border:1px solid var(--dshpc-border);\n box-shadow:0 8px 24px rgba(15,23,42,.16);\n}\n.dshpc-toast--success{color:var(--dshpc-success);border-color:color-mix(in srgb,var(--dshpc-success) 40%,transparent)}\n.dshpc-toast--error{color:var(--dshpc-danger);border-color:color-mix(in srgb,var(--dshpc-danger) 40%,transparent)}\n.dshpc-error__retry{\n margin-top:8px;color:var(--dshpc-link);cursor:pointer;background:none;border:none;padding:0;\n}\n/* 原生弹窗演示:经宿主 Modal 的 contentClassName 注入,证明宿主内容区尺寸可经类名自定义。 */\n.dshpc-native-demo-content{max-width:520px}\n/* 头部信号图标(AlertModal 按 severity 注入):自含配色,不依赖宿主 token。 */\n.dshpc-alert-sev{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:12px;color:#fff;flex:none}\n.dshpc-alert-sev--info{background:#2563eb}\n.dshpc-alert-sev--success{background:#16a34a}\n.dshpc-alert-sev--warning{background:#d97706}\n.dshpc-alert-sev--error{background:#dc2626}\n/* 小确认框家族(sm):严格抄兄弟项目 renderConfirm 的 dialogStyle(task-list.tsx:456)——\n 360px 宽 / 18px 内距 / 头部无分隔线 / 说明文字 fg-2 / 底部按钮右对齐。 */\n.dshpc-modal--sm{padding:18px}\n.dshpc-modal--sm .dshpc-overlay-head{padding:0 0 8px;border-bottom:none}\n.dshpc-modal--sm .dshpc-modal__body{padding:0 0 14px;overflow:visible;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);line-height:var(--dshpc-line-sm)}\n.dshpc-modal--sm .dshpc-modal__foot{padding:0;border-top:none}\n";
3
+ export const FEEDBACK_CSS = "/* 遮罩与头部在 overlay.css,表面(底色/描边/圆角/阴影)在 panel.css 的 --modal 档,\n 这里只剩**家族布局与尺寸**。三者各管一段,别再把皮肤抄回来。 */\n.dshpc-modal{\n display:flex;flex-direction:column;box-sizing:border-box;\n}\n/* body = 唯一滚动容器:内距与滚动都归它(滚动条贴面板右缘,不被内距挤进来);\n 内容按流排,不设 height:100%、不自己开滚动条。\n 透明右边框 = 让滚动条与面板右缘隔 1px(口径见 style.md §滚动条让位)。 */\n.dshpc-modal__body{flex:1 1 auto;min-height:0;overflow:auto;padding:17px 18px;border-right:1px solid transparent}\n/* 底栏与头部同一口径(2026-11-02 用户):上下内距相等、内容垂直居中、默认带一条分隔线。\n 线可由消费方关掉(Modal 的 footerDivider=false)—— 确认框家族本来就没有线(与头部一致)。 */\n.dshpc-modal .dshpc-modal__foot{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:18px;border-top:1px solid var(--dshpc-border)}\n.dshpc-modal .dshpc-modal__foot--bare{border-top:none}\n/* 自绘 toast 的样式在 2026-11-03 删除:Toast 早已改走宿主 toast()(Toast.ts 的 showNative),\n .dshpc-toast* 这几个类没有任何消费者,留着只是死样式(还带着裸 z-index 与裸阴影)。 */\n.dshpc-error__retry{\n margin-top:8px;color:var(--dshpc-link);cursor:pointer;background:none;border:none;padding:0;\n}\n/* 原生弹窗演示:经宿主 Modal 的 contentClassName 注入,证明宿主内容区尺寸可经类名自定义。 */\n.dshpc-native-demo-content{max-width:520px}\n/* 头部信号图标(AlertModal 按 severity 注入):自含配色,色值在 tokens.css 的 --dshpc-sev-*。 */\n.dshpc-alert-sev{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;font-size:12px;color:var(--dshpc-on-signal);flex:none}\n.dshpc-alert-sev--info{background:var(--dshpc-sev-info)}\n.dshpc-alert-sev--success{background:var(--dshpc-sev-success)}\n.dshpc-alert-sev--warning{background:var(--dshpc-sev-warning)}\n.dshpc-alert-sev--error{background:var(--dshpc-sev-error)}\n/* 小确认框家族(sm):严格抄兄弟项目 renderConfirm 的 dialogStyle(task-list.tsx:456)——\n 360px 宽 / 18px 内距 / 头部无分隔线 / 说明文字 fg-2 / 底部按钮右对齐。 */\n.dshpc-modal--sm{padding:18px}\n.dshpc-modal--sm .dshpc-overlay-head{padding:0 0 8px;border-bottom:none}\n.dshpc-modal--sm .dshpc-modal__body{padding:0 0 14px;overflow:visible;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-2);line-height:var(--dshpc-line-sm)}\n.dshpc-modal--sm .dshpc-modal__foot{padding:0;border-top:none}\n";
4
4
  //# sourceMappingURL=feedback-css.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"feedback-css.generated.js","sourceRoot":"","sources":["../../src/ui/feedback-css.generated.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,qEAAqE;AACrE,MAAM,CAAC,MAAM,YAAY,GAAG,yuFAAyuF,CAAA"}
1
+ {"version":3,"file":"feedback-css.generated.js","sourceRoot":"","sources":["../../src/ui/feedback-css.generated.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,qEAAqE;AACrE,MAAM,CAAC,MAAM,YAAY,GAAG,siEAAsiE,CAAA"}
@@ -1,2 +1,2 @@
1
- export declare const MARQUEE_CSS = "/* \u8DD1\u9A6C\u706F\uFF08MarqueeText\uFF09\uFF1A\u53CC\u5C42\u2014\u2014\u5916\u5C42\u53EA\u88C1\u526A\uFF0C\u5185\u5C42\u624D transform \u6EDA\u52A8\uFF1B\u975E hover \u5185\u5C42\u81EA\u5E26\u7701\u7565\u53F7\u3002\n 2026-10-20\uFF1A\u672C\u6587\u4EF6\u539F\u662F\u6742\u70E9\u300Cselect.css\u300D\uFF08\u4E0B\u62C9 / \u65E5\u5386 / \u65F6\u5206\u7684\u76AE\u80A4\u90FD\u88C5\u8FC7\uFF09\uFF0C\u968F\u7740\u90A3\u4E9B\u63A7\u4EF6\n \u4E00\u4E2A\u4E2A\u5220\u5B8C\uFF0C\u6700\u540E\u53EA\u5269\u8DD1\u9A6C\u706F\uFF0C\u6545\u6309\u672C\u5305\u300C\u4E00\u4E2A css \u670D\u52A1\u4E00\u4E2A\u5BF9\u8C61\u300D\u7684\u683C\u5C40\u6539\u540D\u5F52\u6863\u3002\n \u540C\u6279\u6E05\u6389\u7684\u8FD8\u6709\u96F6\u5F15\u7528\u7684\u7701\u7565\u53F7\u7C7B .dshpc-ellipsis \u2014\u2014 \u672C\u5305\u4E09\u4E2A\u7528\u5230\u622A\u65AD\u7684\u5730\u65B9\u90FD\u6CA1\u91C7\u7EB3\u5B83\u3002 */\n.dshpc-mq{display:block;overflow:hidden;white-space:nowrap;}\n.dshpc-mq .dshpc-mq-in{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:top;}\n/* \u26A0\uFE0F \u8DD1\u6CD5\uFF08\u7528\u6237 2026-10-03 \u62CD\u677F\uFF09\uFF1A**\u8DD1\u4E00\u904D\u3001\u505C\u5728\u5C3E\u5B57**\uFF08\u64AD\u653E 1 \u6B21 + forwards\uFF09\uFF0C\u4E0D\u6765\u56DE\u5F39\u3001\u4E0D\u65E0\u9650\u8DD1\u3002\n \u6EDA\u8DDD = \u7CBE\u786E\u6EA2\u51FA\u91CF \u21D2 \u505C\u4E0B\u65F6\u6700\u540E\u4E00\u4E2A\u5B57\u6B63\u597D\u8D34\u53F3\u7F18\uFF0C**\u4E0D\u4F1A\u8DD1\u8FDB\u9ED1\u5757**\uFF08\u9ED1\u5757\u662F\u65E7\u624B\u5199\u7248\u628A\n \u5185\u5C42\u76D2\u5B50\u88C1\u4E86\u3001\u6309\u300C\u534A\u622A\u6587\u672C\u300D\u5E73\u79FB\u5BFC\u81F4\u7684\uFF09\u3002\u9F20\u6807\u79FB\u5F00 \u21D2 :hover \u5931\u6548 \u21D2 \u81EA\u52A8\u590D\u4F4D\u56DE\u7701\u7565\u53F7\u6001\u3002 */\n.dshpc-mq-run:hover .dshpc-mq-in{max-width:none;overflow:visible;animation:dshpc-mq-scroll var(--dshpc-mq-dur,6s) linear .4s 1 forwards;}\n@keyframes dshpc-mq-scroll{from{transform:translateX(0)}to{transform:translateX(var(--dshpc-mq-dist,-40px))}}\n/* \u6EA2\u51FA\u6E10\u5F71\uFF08\u7528\u6237 2026-10-24 \u62CD\u677F\u300C\u5DE6\u53F3\u7A0D\u5FAE\u6709\u70B9\u6E10\u5F71\u300D\uFF1B\u5B98\u65B9\u53E3\u5F84 = dsh-client-ui-primitives@0.2.1-rc.2\n PathLabel.module.css:13-15\uFF1Amask-image \u7EBF\u6027\u6E10\u9690 + 28px \u968F\u5B98\u65B9\uFF09\u3002\u26A0\uFE0F \u53EA\u5728 **hover \u6EDA\u52A8\u6001** \u52A0\uFF1A\n \u9759\u6001\u6001\uFF08\u4E09\u4E2A\u70B9\uFF09\u4E0D\u8981\u6E10\u5F71\uFF08\u7528\u6237 2026-10-24 \u4E8C\u6B21\u62CD\u677F\uFF09\uFF0Chover \u6EDA\u52A8\u65F6\u4E24\u7AEF\u6E10\u5F71\u2014\u2014\u5DE6\u7F18\u67D4\u5316\u88AB\u88C1\u7684\u6587\u5B57\u5934\u3002 */\n.dshpc-mq-run:hover{mask-image:linear-gradient(to right, transparent, #000 28px, #000 calc(100% - 28px), transparent);}\n";
1
+ export declare const MARQUEE_CSS = "/* \u8DD1\u9A6C\u706F\uFF08MarqueeText\uFF09\uFF1A\u53CC\u5C42\u2014\u2014\u5916\u5C42\u53EA\u88C1\u526A\uFF0C\u5185\u5C42\u624D transform \u6EDA\u52A8\uFF1B\u975E hover \u5185\u5C42\u81EA\u5E26\u7701\u7565\u53F7\u3002\n 2026-10-20\uFF1A\u672C\u6587\u4EF6\u539F\u662F\u6742\u70E9\u300Cselect.css\u300D\uFF08\u4E0B\u62C9 / \u65E5\u5386 / \u65F6\u5206\u7684\u76AE\u80A4\u90FD\u88C5\u8FC7\uFF09\uFF0C\u968F\u7740\u90A3\u4E9B\u63A7\u4EF6\n \u4E00\u4E2A\u4E2A\u5220\u5B8C\uFF0C\u6700\u540E\u53EA\u5269\u8DD1\u9A6C\u706F\uFF0C\u6545\u6309\u672C\u5305\u300C\u4E00\u4E2A css \u670D\u52A1\u4E00\u4E2A\u5BF9\u8C61\u300D\u7684\u683C\u5C40\u6539\u540D\u5F52\u6863\u3002\n \u540C\u6279\u6E05\u6389\u7684\u8FD8\u6709\u96F6\u5F15\u7528\u7684\u7701\u7565\u53F7\u7C7B .dshpc-ellipsis \u2014\u2014 \u672C\u5305\u4E09\u4E2A\u7528\u5230\u622A\u65AD\u7684\u5730\u65B9\u90FD\u6CA1\u91C7\u7EB3\u5B83\u3002 */\n.dshpc-mq{display:block;overflow:hidden;white-space:nowrap;}\n.dshpc-mq .dshpc-mq-in{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:top;}\n/* \u26A0\uFE0F \u8DD1\u6CD5\uFF08\u7528\u6237 2026-10-03 \u62CD\u677F\uFF09\uFF1A**\u8DD1\u4E00\u904D\u3001\u505C\u5728\u5C3E\u5B57**\uFF08\u64AD\u653E 1 \u6B21 + forwards\uFF09\uFF0C\u4E0D\u6765\u56DE\u5F39\u3001\u4E0D\u65E0\u9650\u8DD1\u3002\n \u6EDA\u8DDD = \u7CBE\u786E\u6EA2\u51FA\u91CF \u21D2 \u505C\u4E0B\u65F6\u6700\u540E\u4E00\u4E2A\u5B57\u6B63\u597D\u8D34\u53F3\u7F18\uFF0C**\u4E0D\u4F1A\u8DD1\u8FDB\u9ED1\u5757**\uFF08\u9ED1\u5757\u662F\u65E7\u624B\u5199\u7248\u628A\n \u5185\u5C42\u76D2\u5B50\u88C1\u4E86\u3001\u6309\u300C\u534A\u622A\u6587\u672C\u300D\u5E73\u79FB\u5BFC\u81F4\u7684\uFF09\u3002\u9F20\u6807\u79FB\u5F00 \u21D2 :hover \u5931\u6548 \u21D2 \u81EA\u52A8\u590D\u4F4D\u56DE\u7701\u7565\u53F7\u6001\u3002 */\n.dshpc-mq-run:hover .dshpc-mq-in{max-width:none;overflow:visible;animation:dshpc-mq-scroll var(--dshpc-mq-dur,6s) linear .4s 1 forwards;}\n@keyframes dshpc-mq-scroll{from{transform:translateX(0)}to{transform:translateX(var(--dshpc-mq-dist,-40px))}}\n/* \u6EA2\u51FA\u6E10\u5F71\uFF08\u7528\u6237 2026-10-24 \u62CD\u677F\u300C\u5DE6\u53F3\u7A0D\u5FAE\u6709\u70B9\u6E10\u5F71\u300D\uFF1B\u5B98\u65B9\u53E3\u5F84 = dsh-client-ui-primitives@0.2.1-rc.2\n PathLabel.module.css:13-15\uFF1Amask-image \u7EBF\u6027\u6E10\u9690 + 28px \u968F\u5B98\u65B9\uFF09\u3002\u26A0\uFE0F \u53EA\u5728 **hover \u6EDA\u52A8\u6001** \u52A0\uFF1A\n \u9759\u6001\u6001\uFF08\u4E09\u4E2A\u70B9\uFF09\u4E0D\u8981\u6E10\u5F71\uFF08\u7528\u6237 2026-10-24 \u4E8C\u6B21\u62CD\u677F\uFF09\uFF0Chover \u6EDA\u52A8\u65F6\u4E24\u7AEF\u6E10\u5F71\u2014\u2014\u5DE6\u7F18\u67D4\u5316\u88AB\u88C1\u7684\u6587\u5B57\u5934\u3002 */\n/* token-ok\uFF1A\u906E\u7F69\u6A21\u677F\u8272\uFF08\u7EAF\u9ED1 = \u5B8C\u5168\u4E0D\u900F\u660E\uFF09\uFF0C\u4E0D\u662F\u4E3B\u9898\u8272\uFF1B\u6362\u4E3B\u9898\u4E5F\u4E0D\u8BE5\u53D8\u3002 */\n.dshpc-mq-run:hover{mask-image:linear-gradient(to right, transparent, #000 28px, #000 calc(100% - 28px), transparent);}\n";
2
2
  //# sourceMappingURL=marquee-css.generated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"marquee-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/marquee-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,qyFAAksC,CAAA"}
1
+ {"version":3,"file":"marquee-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/marquee-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,4+FAAmvC,CAAA"}
@@ -1,4 +1,4 @@
1
1
  // ⚠️ 生成物,勿手改。真源 = src/ui/marquee.css
2
2
  // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
- export const MARQUEE_CSS = "/* 跑马灯(MarqueeText):双层——外层只裁剪,内层才 transform 滚动;非 hover 内层自带省略号。\n 2026-10-20:本文件原是杂烩「select.css」(下拉 / 日历 / 时分的皮肤都装过),随着那些控件\n 一个个删完,最后只剩跑马灯,故按本包「一个 css 服务一个对象」的格局改名归档。\n 同批清掉的还有零引用的省略号类 .dshpc-ellipsis —— 本包三个用到截断的地方都没采纳它。 */\n.dshpc-mq{display:block;overflow:hidden;white-space:nowrap;}\n.dshpc-mq .dshpc-mq-in{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:top;}\n/* ⚠️ 跑法(用户 2026-10-03 拍板):**跑一遍、停在尾字**(播放 1 次 + forwards),不来回弹、不无限跑。\n 滚距 = 精确溢出量 ⇒ 停下时最后一个字正好贴右缘,**不会跑进黑块**(黑块是旧手写版把\n 内层盒子裁了、按「半截文本」平移导致的)。鼠标移开 ⇒ :hover 失效 ⇒ 自动复位回省略号态。 */\n.dshpc-mq-run:hover .dshpc-mq-in{max-width:none;overflow:visible;animation:dshpc-mq-scroll var(--dshpc-mq-dur,6s) linear .4s 1 forwards;}\n@keyframes dshpc-mq-scroll{from{transform:translateX(0)}to{transform:translateX(var(--dshpc-mq-dist,-40px))}}\n/* 溢出渐影(用户 2026-10-24 拍板「左右稍微有点渐影」;官方口径 = dsh-client-ui-primitives@0.2.1-rc.2\n PathLabel.module.css:13-15:mask-image 线性渐隐 + 28px 随官方)。⚠️ 只在 **hover 滚动态** 加:\n 静态态(三个点)不要渐影(用户 2026-10-24 二次拍板),hover 滚动时两端渐影——左缘柔化被裁的文字头。 */\n.dshpc-mq-run:hover{mask-image:linear-gradient(to right, transparent, #000 28px, #000 calc(100% - 28px), transparent);}\n";
3
+ export const MARQUEE_CSS = "/* 跑马灯(MarqueeText):双层——外层只裁剪,内层才 transform 滚动;非 hover 内层自带省略号。\n 2026-10-20:本文件原是杂烩「select.css」(下拉 / 日历 / 时分的皮肤都装过),随着那些控件\n 一个个删完,最后只剩跑马灯,故按本包「一个 css 服务一个对象」的格局改名归档。\n 同批清掉的还有零引用的省略号类 .dshpc-ellipsis —— 本包三个用到截断的地方都没采纳它。 */\n.dshpc-mq{display:block;overflow:hidden;white-space:nowrap;}\n.dshpc-mq .dshpc-mq-in{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:top;}\n/* ⚠️ 跑法(用户 2026-10-03 拍板):**跑一遍、停在尾字**(播放 1 次 + forwards),不来回弹、不无限跑。\n 滚距 = 精确溢出量 ⇒ 停下时最后一个字正好贴右缘,**不会跑进黑块**(黑块是旧手写版把\n 内层盒子裁了、按「半截文本」平移导致的)。鼠标移开 ⇒ :hover 失效 ⇒ 自动复位回省略号态。 */\n.dshpc-mq-run:hover .dshpc-mq-in{max-width:none;overflow:visible;animation:dshpc-mq-scroll var(--dshpc-mq-dur,6s) linear .4s 1 forwards;}\n@keyframes dshpc-mq-scroll{from{transform:translateX(0)}to{transform:translateX(var(--dshpc-mq-dist,-40px))}}\n/* 溢出渐影(用户 2026-10-24 拍板「左右稍微有点渐影」;官方口径 = dsh-client-ui-primitives@0.2.1-rc.2\n PathLabel.module.css:13-15:mask-image 线性渐隐 + 28px 随官方)。⚠️ 只在 **hover 滚动态** 加:\n 静态态(三个点)不要渐影(用户 2026-10-24 二次拍板),hover 滚动时两端渐影——左缘柔化被裁的文字头。 */\n/* token-ok:遮罩模板色(纯黑 = 完全不透明),不是主题色;换主题也不该变。 */\n.dshpc-mq-run:hover{mask-image:linear-gradient(to right, transparent, #000 28px, #000 calc(100% - 28px), transparent);}\n";
4
4
  //# sourceMappingURL=marquee-css.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"marquee-css.generated.js","sourceRoot":"","sources":["../../src/ui/marquee-css.generated.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,+rCAA+rC,CAAA"}
1
+ {"version":3,"file":"marquee-css.generated.js","sourceRoot":"","sources":["../../src/ui/marquee-css.generated.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,gvCAAgvC,CAAA"}
@@ -1,2 +1,2 @@
1
- export declare const OVERLAY_CSS = "/* \u6D6E\u5C42\u516C\u5171\u9AA8\u67B6\uFF1A\u906E\u7F69 + \u5934\u90E8\u3002Modal\uFF08\u5C45\u4E2D\uFF09/ SideSheet\uFF08\u4FA7\u8FB9\uFF09\u5171\u7528\u8FD9\u4E00\u4EFD\uFF0C\n \u4E24\u8FB9\u5404\u81EA registerStyle \u540C\u4E00\u4EFD\uFF08\u5E42\u7B49\uFF09\uFF0C\u8C01\u4E5F\u4E0D\u8BB8\u518D\u6284\u4E00\u4EFD\u906E\u7F69\u3002 */\n\n/* \u906E\u7F69 = \u5BBF\u4E3B\u906E\u7F69\u53D8\u91CF --dsw-alias-bg-mask-1\uFF08\u4E0E\u5B98\u65B9 Modal / \u5144\u5F1F\u9879\u76EE --tdt-mask \u540C\u4E00\u6761\u771F\u503C\uFF0C\u7528\u6237 2026-10-20\uFF09\u3002 */\n/* \u53F3\u8FB9\u754C\u8BA9\u4F4D\u9875\u9762\u7EA7\u5206\u680F\uFF08PanelDock \u53D1\u5E03\u7684 --dshpc-page-inset-right\uFF0C\u7528\u6237 2026-10-22\uFF09\uFF1A\n \u5206\u680F\u4E0D\u88AB\u538B\u6697\u3001\u7167\u5E38\u53EF\u70B9\uFF1B\u6D6E\u5C42\u5728\u8FD9\u5757**\u5269\u4E0B**\u7684\u533A\u57DF\u91CC\u6392\u7248\uFF0C\u5C31\u50CF\u6574\u9875\u88AB\u63A8\u51FA\u53BB\u4E00\u6837\u3002 */\n.dshpc-overlay{\n position:fixed;inset:0 var(--dshpc-page-inset-right,0px) 0 0;\n background:var(--dshpc-mask);\n}\n/* \u5C45\u4E2D\u6863\uFF08Modal\uFF09\uFF1Az \u8D70 modal \u6863\u3002 */\n.dshpc-overlay--center{\n display:flex;align-items:center;justify-content:center;\n z-index:var(--dshpc-z-modal);\n}\n/* \u4FA7\u8FB9\u6863\uFF08SideSheet\uFF09\uFF1A\u9762\u677F absolute \u8D34\u8FB9\uFF0C\u4E0D\u9700\u8981 flex \u5C45\u4E2D\uFF1Bz \u8D70 drawer \u6863\uFF08\u4F4E\u4E8E modal\uFF09\u3002 */\n.dshpc-overlay--side{z-index:var(--dshpc-z-drawer)}\n\n/* \u5934\u90E8\u56DB\u69FD\uFF1A\u5DE6\u56FE\u6807 / \u6807\u9898\u7EC4 / \u5F39\u6027\u95F4\u9694 / \u53F3\u4FA7\u52A8\u4F5C\u533A + \u5173\u95ED\u94AE\u3002\n \u4E0A\u4E0B\u5185\u8DDD\u5FC5\u987B\u76F8\u7B49\uFF0818/12 \u4F1A\u8BA9\u6807\u9898\u79BB\u9762\u677F\u9876\u8FDC\u3001\u79BB\u5206\u9694\u7EBF\u8FD1\uFF0C\u7528\u6237 2026-11-02\uFF09\u3002 */\n.dshpc-overlay-head{\n display:flex;align-items:center;gap:8px;padding:18px;\n border-bottom:1px solid var(--dshpc-border);flex-wrap:wrap;\n}\n.dshpc-overlay-head__heading{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__lead{flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n/* \u6807\u9898\u7EC4\uFF1A\u7B2C\u4E00\u884C = \u6807\u9898 + \u53F3\u4FA7\u5C0F\u5757\uFF08\u5FBD\u6807\u7D27\u8DDF\u6807\u9898\uFF09\uFF0C\u7B2C\u4E8C\u884C = \u526F\u6807\u9898\u3002 */\n.dshpc-overlay-head__titlegroup{display:flex;flex-direction:column;gap:2px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-overlay-head__title{font-size:var(--dshpc-font-lg);font-weight:600;line-height:1.4;min-width:0}\n/* \u6807\u9898\u4E0B\u526F\u6807\u9898\u884C\uFF08\u5144\u5F1F\u9879\u76EE .dsh-tdt-sv-sid\uFF1A\u7B49\u5BBD\u5B57\u4F53\u3001caption \u8272\u3001\u53EF\u6362\u884C\uFF09\u3002 */\n.dshpc-overlay-head__sid{font-family:var(--ds-font-family-code,monospace);font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);word-break:break-all}\n.dshpc-overlay-head__extra{flex:none;display:inline-flex;align-items:center}\n.dshpc-overlay-head__spacer{flex:1 1 auto;min-width:8px}\n.dshpc-overlay-head__actions{flex:none;display:flex;align-items:center;gap:8px}\n/* \u5173\u95ED\u6309\u94AE\uFF1A20\u00D720 \u65B9\u89D2\u56FE\u6807\u4F4D\uFF0C\u4E0D\u501F\u7528 Picker \u7684\u89E6\u53D1\u5668\u76AE\u80A4\uFF08\u90A3\u4EFD\u5E26 min-width:120px\uFF09\u3002 */\n.dshpc-overlay-head__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-overlay-head__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-overlay-head__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n";
1
+ export declare const OVERLAY_CSS = "/* \u6D6E\u5C42\u516C\u5171\u9AA8\u67B6\uFF1A\u906E\u7F69 + \u5934\u90E8\u3002Modal\uFF08\u5C45\u4E2D\uFF09/ SideSheet\uFF08\u4FA7\u8FB9\uFF09/ \u9009\u6587\u4EF6\u5F39\u7A97\uFF08\u951A\u5B9A\uFF09\u5171\u7528\u8FD9\u4E00\u4EFD\uFF0C\n \u5404\u5BB6\u5404\u81EA registerStyle \u540C\u4E00\u4EFD\uFF08\u5E42\u7B49\uFF09\uFF0C\u8C01\u4E5F\u4E0D\u8BB8\u518D\u6284\u4E00\u4EFD\u906E\u7F69\u3002\n \u5173\u95ED\u94AE\u7684\u76AE\u80A4\u5728 panel.css\uFF08.dshpc-panel__close\uFF0C\u65E7\u7C7B\u540D\u4F5C\u522B\u540D\uFF09\uFF0C\u4E0D\u5728\u8FD9\u91CC\u518D\u5199\u4E00\u4EFD\u3002 */\n\n/* \u906E\u7F69 = \u5BBF\u4E3B\u906E\u7F69\u53D8\u91CF --dsw-alias-bg-mask-1\uFF08\u4E0E\u5B98\u65B9 Modal / \u5144\u5F1F\u9879\u76EE --tdt-mask \u540C\u4E00\u6761\u771F\u503C\uFF0C\u7528\u6237 2026-10-20\uFF09\u3002 */\n/* \u53F3\u8FB9\u754C\u8BA9\u4F4D\u9875\u9762\u7EA7\u5206\u680F\uFF08PanelDock \u53D1\u5E03\u7684 --dshpc-page-inset-right\uFF0C\u7528\u6237 2026-10-22\uFF09\uFF1A\n \u5206\u680F\u4E0D\u88AB\u538B\u6697\u3001\u7167\u5E38\u53EF\u70B9\uFF1B\u6D6E\u5C42\u5728\u8FD9\u5757**\u5269\u4E0B**\u7684\u533A\u57DF\u91CC\u6392\u7248\uFF0C\u5C31\u50CF\u6574\u9875\u88AB\u63A8\u51FA\u53BB\u4E00\u6837\u3002 */\n.dshpc-overlay{\n position:fixed;inset:0 var(--dshpc-page-inset-right,0px) 0 0;\n background:var(--dshpc-mask);\n}\n/* \u5C45\u4E2D\u6863\uFF08Modal\uFF09\uFF1Az \u8D70 modal \u6863\u3002 */\n.dshpc-overlay--center{\n display:flex;align-items:center;justify-content:center;\n z-index:var(--dshpc-z-modal);\n}\n/* \u4FA7\u8FB9\u6863\uFF08SideSheet\uFF09\uFF1A\u9762\u677F absolute \u8D34\u8FB9\uFF0C\u4E0D\u9700\u8981 flex \u5C45\u4E2D\uFF1Bz \u8D70 drawer \u6863\uFF08\u4F4E\u4E8E modal\uFF09\u3002 */\n.dshpc-overlay--side{z-index:var(--dshpc-z-drawer)}\n/* \u951A\u5B9A\u6863\uFF08\u9009\u6587\u4EF6\u5F39\u7A97\uFF09\uFF1A\u906E\u7F69\u7167\u65E7\u538B\u6697 + \u70B9\u5916\u90E8\u5173\u95ED\uFF0C\u9762\u677F\u81EA\u5DF1 fixed \u8D34\u951A\u70B9\uFF0C\u8FD9\u91CC\u4E0D\u505A\u5E03\u5C40\u3002 */\n.dshpc-overlay--plain{z-index:var(--dshpc-z-panel)}\n\n/* \u5934\u90E8\u56DB\u69FD\uFF1A\u5DE6\u56FE\u6807 / \u6807\u9898\u7EC4 / \u5F39\u6027\u95F4\u9694 / \u53F3\u4FA7\u52A8\u4F5C\u533A + \u5173\u95ED\u94AE\u3002\n \u4E0A\u4E0B\u5185\u8DDD\u5FC5\u987B\u76F8\u7B49\uFF0818/12 \u4F1A\u8BA9\u6807\u9898\u79BB\u9762\u677F\u9876\u8FDC\u3001\u79BB\u5206\u9694\u7EBF\u8FD1\uFF0C\u7528\u6237 2026-11-02\uFF09\u3002 */\n.dshpc-overlay-head{\n display:flex;align-items:center;gap:8px;padding:18px;\n border-bottom:1px solid var(--dshpc-border);flex-wrap:wrap;\n}\n.dshpc-overlay-head__heading{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__lead{flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n/* \u6807\u9898\u7EC4\uFF1A\u7B2C\u4E00\u884C = \u6807\u9898 + \u53F3\u4FA7\u5C0F\u5757\uFF08\u5FBD\u6807\u7D27\u8DDF\u6807\u9898\uFF09\uFF0C\u7B2C\u4E8C\u884C = \u526F\u6807\u9898\u3002 */\n.dshpc-overlay-head__titlegroup{display:flex;flex-direction:column;gap:2px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-overlay-head__title{font-size:var(--dshpc-font-lg);font-weight:600;line-height:1.4;min-width:0}\n/* \u6807\u9898\u4E0B\u526F\u6807\u9898\u884C\uFF08\u5144\u5F1F\u9879\u76EE .dsh-tdt-sv-sid\uFF1A\u7B49\u5BBD\u5B57\u4F53\u3001caption \u8272\u3001\u53EF\u6362\u884C\uFF09\u3002 */\n.dshpc-overlay-head__sid{font-family:var(--ds-font-family-code,monospace);font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);word-break:break-all}\n.dshpc-overlay-head__extra{flex:none;display:inline-flex;align-items:center}\n.dshpc-overlay-head__spacer{flex:1 1 auto;min-width:8px}\n.dshpc-overlay-head__actions{flex:none;display:flex;align-items:center;gap:8px}\n";
2
2
  //# sourceMappingURL=overlay-css.generated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/overlay-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,0gIAAwjF,CAAA"}
1
+ {"version":3,"file":"overlay-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/overlay-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,+vHAAukE,CAAA"}
@@ -1,4 +1,4 @@
1
1
  // ⚠️ 生成物,勿手改。真源 = src/ui/overlay.css
2
2
  // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
- export const OVERLAY_CSS = "/* 浮层公共骨架:遮罩 + 头部。Modal(居中)/ SideSheet(侧边)共用这一份,\n 两边各自 registerStyle 同一份(幂等),谁也不许再抄一份遮罩。 */\n\n/* 遮罩 = 宿主遮罩变量 --dsw-alias-bg-mask-1(与官方 Modal / 兄弟项目 --tdt-mask 同一条真值,用户 2026-10-20)。 */\n/* 右边界让位页面级分栏(PanelDock 发布的 --dshpc-page-inset-right,用户 2026-10-22):\n 分栏不被压暗、照常可点;浮层在这块**剩下**的区域里排版,就像整页被推出去一样。 */\n.dshpc-overlay{\n position:fixed;inset:0 var(--dshpc-page-inset-right,0px) 0 0;\n background:var(--dshpc-mask);\n}\n/* 居中档(Modal):z 走 modal 档。 */\n.dshpc-overlay--center{\n display:flex;align-items:center;justify-content:center;\n z-index:var(--dshpc-z-modal);\n}\n/* 侧边档(SideSheet):面板 absolute 贴边,不需要 flex 居中;z 走 drawer 档(低于 modal)。 */\n.dshpc-overlay--side{z-index:var(--dshpc-z-drawer)}\n\n/* 头部四槽:左图标 / 标题组 / 弹性间隔 / 右侧动作区 + 关闭钮。\n 上下内距必须相等(18/12 会让标题离面板顶远、离分隔线近,用户 2026-11-02)。 */\n.dshpc-overlay-head{\n display:flex;align-items:center;gap:8px;padding:18px;\n border-bottom:1px solid var(--dshpc-border);flex-wrap:wrap;\n}\n.dshpc-overlay-head__heading{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__lead{flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n/* 标题组:第一行 = 标题 + 右侧小块(徽标紧跟标题),第二行 = 副标题。 */\n.dshpc-overlay-head__titlegroup{display:flex;flex-direction:column;gap:2px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-overlay-head__title{font-size:var(--dshpc-font-lg);font-weight:600;line-height:1.4;min-width:0}\n/* 标题下副标题行(兄弟项目 .dsh-tdt-sv-sid:等宽字体、caption 色、可换行)。 */\n.dshpc-overlay-head__sid{font-family:var(--ds-font-family-code,monospace);font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);word-break:break-all}\n.dshpc-overlay-head__extra{flex:none;display:inline-flex;align-items:center}\n.dshpc-overlay-head__spacer{flex:1 1 auto;min-width:8px}\n.dshpc-overlay-head__actions{flex:none;display:flex;align-items:center;gap:8px}\n/* 关闭按钮:20×20 方角图标位,不借用 Picker 的触发器皮肤(那份带 min-width:120px)。 */\n.dshpc-overlay-head__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-overlay-head__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-overlay-head__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n";
3
+ export const OVERLAY_CSS = "/* 浮层公共骨架:遮罩 + 头部。Modal(居中)/ SideSheet(侧边)/ 选文件弹窗(锚定)共用这一份,\n 各家各自 registerStyle 同一份(幂等),谁也不许再抄一份遮罩。\n 关闭钮的皮肤在 panel.css(.dshpc-panel__close,旧类名作别名),不在这里再写一份。 */\n\n/* 遮罩 = 宿主遮罩变量 --dsw-alias-bg-mask-1(与官方 Modal / 兄弟项目 --tdt-mask 同一条真值,用户 2026-10-20)。 */\n/* 右边界让位页面级分栏(PanelDock 发布的 --dshpc-page-inset-right,用户 2026-10-22):\n 分栏不被压暗、照常可点;浮层在这块**剩下**的区域里排版,就像整页被推出去一样。 */\n.dshpc-overlay{\n position:fixed;inset:0 var(--dshpc-page-inset-right,0px) 0 0;\n background:var(--dshpc-mask);\n}\n/* 居中档(Modal):z 走 modal 档。 */\n.dshpc-overlay--center{\n display:flex;align-items:center;justify-content:center;\n z-index:var(--dshpc-z-modal);\n}\n/* 侧边档(SideSheet):面板 absolute 贴边,不需要 flex 居中;z 走 drawer 档(低于 modal)。 */\n.dshpc-overlay--side{z-index:var(--dshpc-z-drawer)}\n/* 锚定档(选文件弹窗):遮罩照旧压暗 + 点外部关闭,面板自己 fixed 贴锚点,这里不做布局。 */\n.dshpc-overlay--plain{z-index:var(--dshpc-z-panel)}\n\n/* 头部四槽:左图标 / 标题组 / 弹性间隔 / 右侧动作区 + 关闭钮。\n 上下内距必须相等(18/12 会让标题离面板顶远、离分隔线近,用户 2026-11-02)。 */\n.dshpc-overlay-head{\n display:flex;align-items:center;gap:8px;padding:18px;\n border-bottom:1px solid var(--dshpc-border);flex-wrap:wrap;\n}\n.dshpc-overlay-head__heading{display:flex;align-items:center;gap:8px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__lead{flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:16px;line-height:1}\n/* 标题组:第一行 = 标题 + 右侧小块(徽标紧跟标题),第二行 = 副标题。 */\n.dshpc-overlay-head__titlegroup{display:flex;flex-direction:column;gap:2px;min-width:0;flex:0 1 auto}\n.dshpc-overlay-head__titlerow{display:flex;align-items:center;gap:8px;min-width:0}\n.dshpc-overlay-head__title{font-size:var(--dshpc-font-lg);font-weight:600;line-height:1.4;min-width:0}\n/* 标题下副标题行(兄弟项目 .dsh-tdt-sv-sid:等宽字体、caption 色、可换行)。 */\n.dshpc-overlay-head__sid{font-family:var(--ds-font-family-code,monospace);font-size:var(--dshpc-font-xs);color:var(--dshpc-fg-3);word-break:break-all}\n.dshpc-overlay-head__extra{flex:none;display:inline-flex;align-items:center}\n.dshpc-overlay-head__spacer{flex:1 1 auto;min-width:8px}\n.dshpc-overlay-head__actions{flex:none;display:flex;align-items:center;gap:8px}\n";
4
4
  //# sourceMappingURL=overlay-css.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay-css.generated.js","sourceRoot":"","sources":["../../src/ui/overlay-css.generated.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,qjFAAqjF,CAAA"}
1
+ {"version":3,"file":"overlay-css.generated.js","sourceRoot":"","sources":["../../src/ui/overlay-css.generated.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAG,okEAAokE,CAAA"}
@@ -10,13 +10,19 @@ import { type ReactNode } from 'react';
10
10
  * (无回调还挂监听,等于让 Esc 被白白吃掉)。
11
11
  */
12
12
  export declare function useEscapeClose(enabled: boolean, onClose: (() => void) | undefined): void;
13
- /** 浮层档:center = 居中弹窗;side = 贴边抽屉(z 更低,见 overlay.css)。 */
14
- export type OverlayKind = 'center' | 'side';
13
+ /**
14
+ * 浮层档:center = 居中弹窗;side = 贴边抽屉;plain = 不居中的锚定面板(选文件弹窗用,
15
+ * 面板自己 `position:fixed` 贴锚点,遮罩只负责压暗与「点外部关闭」)。
16
+ * 三档的遮罩视觉同一套,只差布局与 z(见 overlay.css)。
17
+ */
18
+ export type OverlayKind = 'center' | 'side' | 'plain';
15
19
  export interface OverlayMaskProps {
16
20
  kind: OverlayKind;
17
21
  /** 点遮罩是否关闭。 */
18
22
  closeOnMask: boolean;
19
23
  onClose?: () => void;
24
+ /** 原样铺到遮罩节点上的属性(`data-*` 这类既有钩子)。 */
25
+ attrs?: Record<string, string | undefined>;
20
26
  children?: ReactNode;
21
27
  }
22
28
  /** 遮罩 + 承载盒。右边界让位分栏的规则只有这一份。 */
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/ui/overlay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIrE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CASxF;AAED,yDAAyD;AACzD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAA;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAA;IACjB,eAAe;IACf,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,gCAAgC;AAChC,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAY9D;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,sBAAsB;IACtB,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAoC9D"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/ui/overlay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAMrE;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI,CASxF;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAErD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAA;IACjB,eAAe;IACf,WAAW,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAC1C,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,gCAAgC;AAChC,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAa9D;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,sBAAsB;IACtB,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,CA8B9D"}
@@ -7,6 +7,8 @@
7
7
  import { createElement as h, useEffect } from 'react';
8
8
  import { ensureComponentStyles } from './css.js';
9
9
  import { OVERLAY_CSS } from './overlay-css.js';
10
+ import { PANEL_CSS } from './panel-css.js';
11
+ import { PanelClose } from './panel.js';
10
12
  /**
11
13
  * Esc 关闭。不传 `onClose` 或 `enabled=false` 时完全不挂监听
12
14
  * (无回调还挂监听,等于让 Esc 被白白吃掉)。
@@ -27,6 +29,7 @@ export function useEscapeClose(enabled, onClose) {
27
29
  export function OverlayMask(props) {
28
30
  ensureComponentStyles('overlay', OVERLAY_CSS);
29
31
  return h('div', {
32
+ ...props.attrs,
30
33
  className: `dshpc-overlay dshpc-overlay--${props.kind}`,
31
34
  onClick: () => {
32
35
  if (props.closeOnMask)
@@ -37,13 +40,11 @@ export function OverlayMask(props) {
37
40
  /** 头部四槽:icon + 标题组 + 右侧动作 + 关闭钮。 */
38
41
  export function OverlayHead(props) {
39
42
  ensureComponentStyles('overlay', OVERLAY_CSS);
43
+ // 关闭钮的皮肤在 panel.css(浮层唯一那枚);旧类名 `dshpc-overlay-head__close` 仍挂着做别名。
44
+ ensureComponentStyles('panel', PANEL_CSS);
40
45
  return h('div', { className: 'dshpc-overlay-head' }, h('div', { className: 'dshpc-overlay-head__heading' }, props.icon === undefined ? null : h('span', { className: 'dshpc-overlay-head__lead' }, props.icon), h('div', { className: 'dshpc-overlay-head__titlegroup' }, h('div', { className: 'dshpc-overlay-head__titlerow' }, h('div', { className: 'dshpc-overlay-head__title' }, props.title ?? ''), props.extra === undefined ? null : h('div', { className: 'dshpc-overlay-head__extra' }, props.extra)), props.subtitle === undefined ? null : h('div', { className: 'dshpc-overlay-head__sid' }, props.subtitle))), h('div', { className: 'dshpc-overlay-head__spacer' }), props.actions === undefined ? null : h('div', { className: 'dshpc-overlay-head__actions' }, props.actions), props.onClose === undefined
41
46
  ? null
42
- : h('button', {
43
- type: 'button',
44
- className: 'dshpc-overlay-head__close',
45
- 'aria-label': props.closeLabel,
46
- onClick: () => props.onClose?.(),
47
- }, '✕'));
47
+ // 关闭钮只此一枚(`PanelClose`);旧类名挂着做别名,消费方写在上面的覆盖仍生效。
48
+ : h(PanelClose, { label: props.closeLabel, onClick: props.onClose, className: 'dshpc-overlay-head__close' }));
48
49
  }
49
50
  //# sourceMappingURL=overlay.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/ui/overlay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAA;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,OAAiC;IAChF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,SAAS;YAAE,OAAM;QAC7C,MAAM,KAAK,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAC3C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAA;QACvC,CAAC,CAAA;QACD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAC3C,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC7D,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;AACxB,CAAC;AAaD,gCAAgC;AAChC,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC7C,OAAO,CAAC,CACN,KAAK,EACL;QACE,SAAS,EAAE,gCAAgC,KAAK,CAAC,IAAI,EAAE;QACvD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,KAAK,CAAC,WAAW;gBAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAA;QAC1C,CAAC;KACF,EACD,KAAK,CAAC,QAAQ,IAAI,IAAI,CACvB,CAAA;AACH,CAAC;AAiBD,oCAAoC;AACpC,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC7C,OAAO,CAAC,CACN,KAAK,EACL,EAAE,SAAS,EAAE,oBAAoB,EAAE,EACnC,CAAC,CACC,KAAK,EACL,EAAE,SAAS,EAAE,6BAA6B,EAAE,EAC5C,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,0BAA0B,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAClG,CAAC,CACC,KAAK,EACL,EAAE,SAAS,EAAE,gCAAgC,EAAE,EAC/C,CAAC,CACC,KAAK,EACL,EAAE,SAAS,EAAE,8BAA8B,EAAE,EAC7C,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EACvE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CACrG,EACD,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,yBAAyB,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CACzG,CACF,EACD,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC,EACrD,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAC1G,KAAK,CAAC,OAAO,KAAK,SAAS;QACzB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,CAAC,CACC,QAAQ,EACR;YACE,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,2BAA2B;YACtC,YAAY,EAAE,KAAK,CAAC,UAAU;YAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;SACjC,EACD,GAAG,CACJ,CACN,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/ui/overlay.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,IAAI,CAAC,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAA;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,OAAiC;IAChF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,SAAS;YAAE,OAAM;QAC7C,MAAM,KAAK,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAC3C,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAA;QACvC,CAAC,CAAA;QACD,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAC3C,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC7D,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;AACxB,CAAC;AAmBD,gCAAgC;AAChC,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC7C,OAAO,CAAC,CACN,KAAK,EACL;QACE,GAAG,KAAK,CAAC,KAAK;QACd,SAAS,EAAE,gCAAgC,KAAK,CAAC,IAAI,EAAE;QACvD,OAAO,EAAE,GAAG,EAAE;YACZ,IAAI,KAAK,CAAC,WAAW;gBAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAA;QAC1C,CAAC;KACF,EACD,KAAK,CAAC,QAAQ,IAAI,IAAI,CACvB,CAAA;AACH,CAAC;AAiBD,oCAAoC;AACpC,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC7C,oEAAoE;IACpE,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACzC,OAAO,CAAC,CACN,KAAK,EACL,EAAE,SAAS,EAAE,oBAAoB,EAAE,EACnC,CAAC,CACC,KAAK,EACL,EAAE,SAAS,EAAE,6BAA6B,EAAE,EAC5C,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,0BAA0B,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAClG,CAAC,CACC,KAAK,EACL,EAAE,SAAS,EAAE,gCAAgC,EAAE,EAC/C,CAAC,CACC,KAAK,EACL,EAAE,SAAS,EAAE,8BAA8B,EAAE,EAC7C,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EACvE,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC,CACrG,EACD,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,yBAAyB,EAAE,EAAE,KAAK,CAAC,QAAQ,CAAC,CACzG,CACF,EACD,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,4BAA4B,EAAE,CAAC,EACrD,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,6BAA6B,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAC1G,KAAK,CAAC,OAAO,KAAK,SAAS;QACzB,CAAC,CAAC,IAAI;QACN,gDAAgD;QAChD,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,2BAA2B,EAAE,CAAC,CAC/G,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { PANEL_CSS } from './panel-css.generated.js';
2
+ //# sourceMappingURL=panel-css.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-css.d.ts","sourceRoot":"","sources":["../../src/ui/panel-css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export declare const PANEL_CSS = "/* \u6D6E\u5C42\u9762\u677F\u76AE\u80A4\uFF082026-11-03 \u7528\u6237\u5B9A\uFF1A\u76AE\u80A4\u7EDF\u4E00\uFF0C\u53EA\u6539\u6837\u5F0F\u4E0D\u52A8\u4EA4\u4E92\uFF09\u3002\n *\n * \u8FD9\u4EFD\u6587\u4EF6\u662F**\u6240\u6709\u300C\u6D6E\u8D77\u6765\u7684\u6846\u300D\u7684\u76AE\u80A4\u771F\u6E90**\u3002\u5B9A\u4F4D\uFF08fixed / absolute\u3001\u8D34\u8C01\u3001\u600E\u4E48\u7FFB\u8F6C\u3001\u591A\u5927\u7684\n * \u5C42\u5E8F\uFF09\u7559\u5728\u5404\u81EA\u63A7\u4EF6\u91CC\uFF0C\u8FD9\u91CC\u53EA\u7BA1\u8868\u9762\u56DB\u4EF6\uFF1A\u5E95\u8272 / \u63CF\u8FB9\u5BBD / \u5706\u89D2 / \u9634\u5F71\u3002\n * \u26A0\uFE0F \u7EC4\u4EF6 CSS \u91CC\u4E0D\u8BB8\u518D\u5199\u8FD9\u56DB\u4E2A\u5B57\u9762\u503C \u2014\u2014 \u60F3\u6539\u5916\u89C2\u5C31\u6539\u8FD9\u91CC\uFF0C\u522B\u5728\u6D88\u8D39\u65B9\u53E6\u8D77\u4E00\u5957\u3002\n *\n * \u4E09\u6863\uFF08\u5DEE\u5F02\u53EA\u5728\u8FD9\u4E09\u6BB5\u5B9A\u4E49\uFF0C\u522B\u5904\u5206\u53C9\uFF09\uFF1A\n * --modal \u5C45\u4E2D\u6A21\u6001\uFF08Modal / ConfirmModal / AlertModal \u5BB6\u65CF\uFF09\n * --popover \u8D34\u951A\u70B9\u7684\u6D6E\u5C42\u9762\u677F\uFF08pickWorkspaceFile \u7684\u9009\u6587\u4EF6\u5F39\u7A97\uFF09\n * --menu \u4E0B\u62C9\u83DC\u5355\uFF08\u6587\u4EF6\u6D4F\u89C8\u5668 \u25BE \u9009\u5C42\u3001Picker \u4E0B\u62C9\uFF09\n *\n * \u4E0D\u5E76\u5165\u4E09\u6863\u7684\uFF1APanelDock \u4E0E SideSheet \u662F**\u8D34\u8FB9\u5BB6\u65CF**\uFF08side-panel.css \u7684\n * .dshpc-side-surface\uFF0Csurface-base\u3001\u65E0\u5916\u63CF\u8FB9\uFF09\u2014\u2014 2026-11-02 \u62CD\u677F\u300C\u4E24\u8005\u76AE\u80A4\u4E00\u6A21\u4E00\u6837\u300D\uFF0C\n * \u4E00\u4E2A\u662F\u5E03\u5C40\u6210\u5458\u3001\u4E00\u4E2A\u662F\u8D34\u8FB9\u62BD\u5C49\uFF0C\u90FD\u4E0D\u662F\u6D6E\u5C42\u3002\n */\n.dshpc-panel{\n background:var(--dshpc-panel-bg);color:var(--dshpc-fg);\n border:var(--dshpc-panel-bw) solid var(--dshpc-border);\n border-radius:var(--dshpc-panel-radius);box-shadow:var(--dshpc-panel-shadow);\n}\n.dshpc-panel--modal{\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:3px;\n --dshpc-panel-radius:var(--dshpc-radius-xl);\n --dshpc-panel-shadow:var(--dshpc-shadow-2);\n overflow:hidden;\n}\n.dshpc-panel--popover{\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:1px;\n --dshpc-panel-radius:var(--dshpc-radius-lg);\n --dshpc-panel-shadow:var(--dshpc-shadow-2);\n overflow:hidden;\n}\n.dshpc-panel--menu{\n /* \u83DC\u5355\u5E95\u4E0E\u6A21\u6001\u540C\u4E00\u5C42\uFF08\u7528\u6237 2026-11-03\uFF1A\u522B\u7528\u9875\u9762\u5E95\u8272\uFF0C\u6697\u8272\u4E0B\u770B\u7740\u5168\u9ED1\uFF09\u3002 */\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:1px;\n --dshpc-panel-radius:var(--dshpc-radius-sm);\n --dshpc-panel-shadow:var(--dshpc-shadow-1);\n}\n\n/* \u6D6E\u5C42\u552F\u4E00\u7684\u5173\u95ED\u94AE\uFF0820\u00D720 \u65B9\u89D2\u56FE\u6807\u4F4D\uFF09\u3002\n \u65E7\u7C7B\u540D .dshpc-overlay-head__close \u4FDD\u7559\u4E3A\u522B\u540D\uFF1A\u6D88\u8D39\u65B9\u5199\u5728\u65E7\u7C7B\u540D\u4E0A\u7684\u8986\u76D6\u4ECD\u751F\u6548\u3002 */\n.dshpc-panel__close,.dshpc-overlay-head__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-panel__close:hover,.dshpc-overlay-head__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-panel__close:focus-visible,.dshpc-overlay-head__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n";
2
+ //# sourceMappingURL=panel-css.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/panel-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,qtHAAoqE,CAAA"}
@@ -0,0 +1,4 @@
1
+ // ⚠️ 生成物,勿手改。真源 = src/ui/panel.css
2
+ // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
+ export const PANEL_CSS = "/* 浮层面板皮肤(2026-11-03 用户定:皮肤统一,只改样式不动交互)。\n *\n * 这份文件是**所有「浮起来的框」的皮肤真源**。定位(fixed / absolute、贴谁、怎么翻转、多大的\n * 层序)留在各自控件里,这里只管表面四件:底色 / 描边宽 / 圆角 / 阴影。\n * ⚠️ 组件 CSS 里不许再写这四个字面值 —— 想改外观就改这里,别在消费方另起一套。\n *\n * 三档(差异只在这三段定义,别处分叉):\n * --modal 居中模态(Modal / ConfirmModal / AlertModal 家族)\n * --popover 贴锚点的浮层面板(pickWorkspaceFile 的选文件弹窗)\n * --menu 下拉菜单(文件浏览器 ▾ 选层、Picker 下拉)\n *\n * 不并入三档的:PanelDock 与 SideSheet 是**贴边家族**(side-panel.css 的\n * .dshpc-side-surface,surface-base、无外描边)—— 2026-11-02 拍板「两者皮肤一模一样」,\n * 一个是布局成员、一个是贴边抽屉,都不是浮层。\n */\n.dshpc-panel{\n background:var(--dshpc-panel-bg);color:var(--dshpc-fg);\n border:var(--dshpc-panel-bw) solid var(--dshpc-border);\n border-radius:var(--dshpc-panel-radius);box-shadow:var(--dshpc-panel-shadow);\n}\n.dshpc-panel--modal{\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:3px;\n --dshpc-panel-radius:var(--dshpc-radius-xl);\n --dshpc-panel-shadow:var(--dshpc-shadow-2);\n overflow:hidden;\n}\n.dshpc-panel--popover{\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:1px;\n --dshpc-panel-radius:var(--dshpc-radius-lg);\n --dshpc-panel-shadow:var(--dshpc-shadow-2);\n overflow:hidden;\n}\n.dshpc-panel--menu{\n /* 菜单底与模态同一层(用户 2026-11-03:别用页面底色,暗色下看着全黑)。 */\n --dshpc-panel-bg:var(--dshpc-surface-1);\n --dshpc-panel-bw:1px;\n --dshpc-panel-radius:var(--dshpc-radius-sm);\n --dshpc-panel-shadow:var(--dshpc-shadow-1);\n}\n\n/* 浮层唯一的关闭钮(20×20 方角图标位)。\n 旧类名 .dshpc-overlay-head__close 保留为别名:消费方写在旧类名上的覆盖仍生效。 */\n.dshpc-panel__close,.dshpc-overlay-head__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:20px;height:20px;padding:0;border:none;border-radius:var(--dshpc-radius-sm);\n background:transparent;color:var(--dshpc-fg-3);font-family:inherit;font-size:13px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-panel__close:hover,.dshpc-overlay-head__close:hover{background:var(--dshpc-hover);color:var(--dshpc-fg)}\n.dshpc-panel__close:focus-visible,.dshpc-overlay-head__close:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n";
4
+ //# sourceMappingURL=panel-css.generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-css.generated.js","sourceRoot":"","sources":["../../src/ui/panel-css.generated.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,qEAAqE;AACrE,MAAM,CAAC,MAAM,SAAS,GAAG,iqEAAiqE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { PANEL_CSS } from './panel-css.generated.js';
2
+ //# sourceMappingURL=panel-css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-css.js","sourceRoot":"","sources":["../../src/ui/panel-css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA"}
@@ -1,2 +1,2 @@
1
- export declare const PANEL_DOCK_CSS = "/* \u505C\u9760\u680F = **\u5E03\u5C40\u6210\u5458**\uFF0C\u4E0D\u662F\u6D6E\u5C42\uFF1A\u5B83\u5360\u5BBD\u5EA6\u3001\u628A\u4E3B\u533A\u771F\u6B63\u6324\u7A84\uFF08\u5144\u5F1F\u9879\u76EE 2026-09-28\uFF1A\n \u300C\u5206\u680F\u538B\u8FC7\u6765\uFF0C\u4E0D\u662F\u76D6\u4E0A\u53BB\u300D\uFF09\u3002\u6240\u4EE5\u8C03\u7528\u65B9\u5FC5\u987B\u628A\u5B83\u653E\u8FDB\u81EA\u5DF1\u7684 flex \u6839\u91CC\u3002\n \u76AE\u80A4\uFF08\u5934\u90E8 / \u62D6\u62FD\u6761 / \u5173\u95ED\u94AE / \u80CC\u666F\u9634\u5F71\uFF09\u5728 side-panel.css\uFF0C\u4E0E SideSheet \u5171\u7528\u3002 */\n.dshpc-dock{display:flex;flex:0 0 auto;align-self:stretch;min-width:0}\n/* \u5F00\u7740\u65F6\u7ED9\u4E3B\u533A\u6EDA\u52A8\u6761\u8BA9\u51FA\u4E00\u6761\u7F1D\uFF1A\u6EDA\u52A8\u6761\u8D34\u6B7B\u5206\u9694\u7EBF\u5F88\u96BE\u770B\uFF08\u7528\u6237 2026-10-28\uFF0C\u5BF9\u9F50\n dsh-better-sidebar \u7684\u7559\u767D\uFF09\u3002\u5168\u5173\u65F6\u6574\u6761 dock \u9000\u51FA\uFF0C\u7F1D\u9699\u4E00\u8D77\u6D88\u5931\u3001\u4E0D\u7559\u767D\u8FB9\u3002\n \u7F1D\u5BBD\u53EF\u7531\u8C03\u7528\u65B9\u76D6 --dshpc-dock-gap\uFF1BTS \u4FA7\u7684\u8BA9\u4F4D\u91CF\uFF08DOCK_GAP\uFF09\u8981\u4E0E\u5B83\u4E00\u81F4\u3002 */\n.dshpc-dock--open{margin-left:var(--dshpc-dock-gap,1px)}\n\n/* \u81EA\u52A8\u52A0\u7684\u5BBF\u4E3B\u884C\uFF08openFilePreview \u52A0 / \u5173\u95ED\u5373\u6458\uFF09\uFF1A\u6D88\u8D39\u65B9\u90A3\u884C\u4E0D\u5FC5\u81EA\u5DF1\u5199 flex\u3002\n \u53EA\u8BA9\u300C\u7B2C\u4E00\u4E2A\u975E\u9884\u89C8\u5B50\u9879\u300D\u5F53\u4E3B\u533A\u4F38\u5C55\uFF0C\u5176\u4F59\u76F4\u63A5\u5B50\u9879\u4E0D\u52A8\uFF08\u9875\u811A\u6761\u3001\u5DE5\u5177\u6761\u4E0D\u8BEF\u4F24\uFF09\uFF1B\n display \u4E0D\u5728\u8FD9\u91CC\u5199\u6B7B \u2014\u2014 \u672C\u6765\u5C31\u662F grid \u7B49\u5E03\u5C40\u7684\u5143\u7D20\u4FDD\u6301\u539F\u6837\uFF0C\u7531 TS \u4FA7\u6309\u8BA1\u7B97\u503C\u8865 flex\u3002 */\n.dshpc-dock-host{min-width:0;min-height:0}\n.dshpc-dock-host>:not([data-dshpc-file-preview]){min-width:0}\n.dshpc-dock-host>:first-child:not([data-dshpc-file-preview]){flex:1 1 auto}\n\n/* \u5355\u680F**\u5360\u4F4D**\uFF1Asticky + \u89C6\u53E3\u9AD8\u8BA9\u5B83\u5728\u9875\u9762\u6EDA\u52A8\u65F6\u4FDD\u6301\u53EF\u89C1\uFF0C\u540C\u65F6\u4ECD\u7136\u5360\u5BBD\u5EA6\u3002\n \u26A0\uFE0F **\u672C\u6761\u523B\u610F\u4E0D\u8BBE z-index**\uFF1A\u5E03\u5C40\u6210\u5458\u4E00\u65E6\u5E26\u6B63 z-index\uFF0C\u5C31\u4F1A\u65E0\u6761\u4EF6\u538B\u8FC7\u5BBF\u4E3B portal \u5230 body \u7684\n \u5F39\u7A97\uFF08\u5144\u5F1F\u9879\u76EE 2026-10-05 \u771F\u673A\u4E8B\u6545\u300C\u4FA7\u8FB9\u680F\u76D6\u4F4F\u5BBF\u4E3B\u8BBE\u7F6E\u5F39\u7A97\u300D\uFF09\u3002\u5C42\u5E8F\u4EA4\u7ED9 DOM \u987A\u5E8F\u88C1\u51B3\u3002\n \u5916\u89C2\u6765\u81EA .dshpc-side-surface\uFF08side-panel.css\uFF09\uFF0C\u8FD9\u91CC\u53EA\u7BA1\u600E\u4E48\u5360\u4F4D\u4E0E\u671D\u54EA\u8FB9\u63CF\u8FB9\u3002 */\n.dshpc-dock__panel{\n position:sticky;top:0;align-self:stretch;\n /* \u9AD8\u5EA6\u9ED8\u8BA4\u89C6\u53E3\u9AD8\uFF08\u6574\u9875\u573A\u666F\uFF09\uFF1B\u5D4C\u5728\u5B9A\u9AD8\u5BB9\u5668\u91CC\u65F6\u7531\u8C03\u7528\u65B9\u7ED9 --dshpc-dock-h\uFF08\u5982 420px / 100%\uFF09\u3002 */\n height:var(--dshpc-dock-h,100vh);max-height:var(--dshpc-dock-h,100vh);\n border-left:1px solid var(--dshpc-border);\n}\n/* \u6536\u8D77\u7684\u51FA\u573A\uFF1A\u5BBD\u5EA6\u6536\u5230 0\u3001\u900F\u660E\u6DE1\u51FA\uFF1B\u843D\u5B9A\u540E\u7EC4\u4EF6\u624D\u771F\u6B63\u6458\u6389\u8FD9\u4E00\u680F\uFF08JS \u5EF6\u65F6 220ms \u914D\u5408\uFF09\u3002 */\n.dshpc-dock__panel--closing{\n width:0!important;min-width:0!important;opacity:0;border-left-width:0;\n transition:width .2s var(--dshpc-ease),opacity .2s var(--dshpc-ease),border-left-width .2s var(--dshpc-ease);\n}\n\n/* \u62D6\u52A8\u671F\uFF1A\u2460 <iframe>\uFF08PDF / HTML \u9884\u89C8\uFF09\u662F\u72EC\u7ACB\u6587\u6863\uFF0C\u4F1A\u541E\u6389\u7236\u6587\u6863\u7684 pointermove\uFF0C\n \u5411\u53F3\u62D6\u8FDB iframe \u5C31\u5361\u6B7B \u2014\u2014 \u6574\u7247\u8BA9\u51FA\u6307\u9488\u4E8B\u4EF6\uFF1B\u2461 contain \u628A\u91CD\u6392\u9694\u79BB\u5728\u680F\u5185\uFF0C\n \u5426\u5219\u6BCF\u5E27\u6539\u5BBD\u5EA6\u90FD\u4F1A\u7275\u52A8\u6574\u9875\u91CD\u6392\uFF08\u5144\u5F1F\u9879\u76EE 2026-10-04 \u771F\u673A\u300C\u632A\u5F88\u4E45\u624D\u52A8\u4E00\u4E0B\u300D\uFF09\u3002 */\n.dshpc-dock.dshpc-dock--resizing iframe{pointer-events:none}\n.dshpc-dock.dshpc-dock--resizing .dshpc-dock__panel{contain:layout paint;will-change:width}\n\n/* \u6536\u8D77\u94AE\uFF1A**\u5F85\u5728\u9762\u677F\u81EA\u5DF1\u7684\u6846\u91CC**\uFF08\u7528\u6237 2026-10-28 \u4E09\u8F6E\uFF1A\u5360\u9762\u677F\u5185\u90E8\u7A7A\u95F4\uFF0C\u4E0D\u4F38\u5230\u5916\u9762\u53BB\uFF09\u3002\n left:0 \u4ECE\u5185\u4FA7\u8D34\u7740\u5206\u9694\u7EBF \u2014\u2014 \u8D34\u7EBF\u7684\u4E00\u8FB9\u4E0D\u63CF\u8FB9\uFF08\u7EBF\u662F\u9762\u677F\u81EA\u5DF1\u7684 border-left\uFF09\uFF0C\u9875\u7B7E\u4E0E\u7EBF\u4E0D\u91CD\u5408\u3002\n 20\u00D744\uFF08\u7528\u6237 2026-10-28 \u56DB\u8F6E\u5B9A\u5C3A\u5BF8\uFF09\uFF1B\u5B9E\u8272\u5E95\uFF08--dshpc-plate\uFF0C\u660E\u6697\u5404\u6709\u5B9E\u503C\uFF09\uFF0Chover \u4EAE\u4E00\u6863\u3002\n padding-right:2px \u662F**\u89C6\u89C9\u5C45\u4E2D**\uFF1A\u53F3\u4FA7\u662F\u5706\u89D2\uFF0C\u7BAD\u5934\u5F80\u76F4\u7EBF\u90A3\u8FB9\u632A 1px\uFF08\u7528\u6237 2026-10-28 \u56DB\u8F6E\uFF09\u3002 */\n.dshpc-dock__collapse{\n position:absolute;left:0;top:50%;transform:translateY(-50%);\n z-index:8;display:inline-flex;align-items:center;justify-content:center;\n width:20px;height:44px;padding:0 2px 0 0;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-right:1px solid var(--dshpc-border);\n border-left:none;\n border-radius:0 var(--dshpc-radius-sm) var(--dshpc-radius-sm) 0;\n background:var(--dshpc-plate);color:var(--dshpc-fg-3);\n font-family:inherit;font-size:16px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-dock__collapse:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__collapse:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n\n/* \u6536\u8D77\u540E\u7684\u6D6E\u52A8\u8033\u6735\uFF1A**fixed \u8D34\u53F3\u7F18\u3001\u5782\u76F4\u5C45\u4E2D\u3001\u72EC\u7ACB\u4E8E\u5206\u680F**\uFF08\u7528\u6237 2026-10-28 \u5B9A\u7A3F\uFF1A\n \u5C0F\u9875\u7B7E\u6302\u4E2D\u95F4\u3001\u91CC\u9762\u653E\u9762\u677F\u56FE\u6807\u3001\u4E0D\u663E\u793A\u6587\u5B57\uFF0C\u7BAD\u5934\u4E0E\u6536\u8D77\u94AE\u53CD\u5411\uFF09\u3002\u591A\u4E2A\u6309\u6536\u8D77\u987A\u5E8F\u7EB5\u5411\u5806\u53E0\u3002\n z \u8D70 dock \u6863\uFF08\u4F4E\u4E8E\u5BBF\u4E3B\u5F39\u7A97\uFF09\uFF0C\u907F\u514D\u76D6\u4F4F\u5BBF\u4E3B portal \u5C42\u3002 */\n.dshpc-dock__ears{\n position:fixed;top:50%;right:0;transform:translateY(-50%);\n z-index:var(--dshpc-z-dock,1030);\n display:flex;flex-direction:column;gap:8px;align-items:flex-end;\n pointer-events:none;\n}\n.dshpc-dock__ear{\n pointer-events:auto;display:inline-flex;align-items:center;justify-content:center;\n /* \u4E0E\u6536\u8D77\u94AE**\u540C\u5C3A\u5BF8**\uFF0820\u00D744\uFF0C\u7528\u6237 2026-10-28 \u56DB\u8F6E\uFF09\uFF1A\u4E0A/\u4E0B/\u5DE6\u63CF\u8FB9\uFF0C\u8D34\u53F3\u7F18\u7684\u4E00\u4FA7\u4E0D\u63CF\u3002\n \u5B9E\u8272\u5E95\uFF08--dshpc-plate\uFF09\uFF0C\u4E0D\u7528\u900F\u660E\u8272 \u2014\u2014 \u900F\u660E\u5E95\u4E0B\u900F\u51FA\u4E1C\u897F\u5F88\u96BE\u770B\u3002\n padding-left:2px \u662F**\u89C6\u89C9\u5C45\u4E2D**\uFF1A\u5DE6\u4FA7\u662F\u5706\u89D2\uFF0C\u7BAD\u5934\u5F80\u76F4\u7EBF\uFF08\u53F3\u7F18\uFF09\u90A3\u8FB9\u632A 1px\u3002 */\n width:20px;height:44px;box-sizing:border-box;padding:0 0 0 2px;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-left:1px solid var(--dshpc-border);\n border-right:none;\n border-radius:var(--dshpc-radius-sm) 0 0 var(--dshpc-radius-sm);\n background:var(--dshpc-plate);color:var(--dshpc-fg-2);\n cursor:pointer;font-family:inherit;line-height:1;\n animation:dshpc-ear-in .2s var(--dshpc-ease);\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n/* \u5165\u573A\uFF1A\u4ECE\u53F3\u7F18\u5916\u6ED1\u8FDB\u6765\uFF0C\u522B\u300C\u7A81\u7136\u51FA\u73B0\u300D\uFF08\u7528\u6237 2026-10-28\uFF09\u3002 */\n@keyframes dshpc-ear-in{from{opacity:0;transform:translateX(14px)}}\n.dshpc-dock__ear:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__ear:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* \u4E0E\u6536\u8D77\u94AE\u7684\u7BAD\u5934\u540C\u4E00\u5B57\u53F7\uFF0816px\uFF09\uFF1A\u6536\u8FDB\u53BB\u524D\u540E\u7BAD\u5934\u4E00\u6A21\u4E00\u6837\u5927\uFF08\u7528\u6237 2026-10-28\uFF09\u3002 */\n.dshpc-dock__ear-arrow{font-size:16px;color:var(--dshpc-fg-3)}\n.dshpc-dock__ear:hover .dshpc-dock__ear-arrow{color:var(--dshpc-fg)}\n/* \u52A8\u6548\u793C\u8C8C\uFF1A\u7CFB\u7EDF\u58F0\u660E\u51CF\u5C11\u52A8\u6548\u65F6\u5168\u90E8\u5173\u6389\uFF0C\u6536\u8D77\u9000\u5316\u4E3A\u77AC\u65F6\u3001\u529F\u80FD\u4E0D\u53D7\u5F71\u54CD\u3002 */\n@media (prefers-reduced-motion:reduce){\n .dshpc-dock__panel{animation:none}\n .dshpc-dock__panel--closing{transition:none}\n .dshpc-dock__ear{animation:none}\n}\n";
1
+ export declare const PANEL_DOCK_CSS = "/* \u505C\u9760\u680F = **\u5E03\u5C40\u6210\u5458**\uFF0C\u4E0D\u662F\u6D6E\u5C42\uFF1A\u5B83\u5360\u5BBD\u5EA6\u3001\u628A\u4E3B\u533A\u771F\u6B63\u6324\u7A84\uFF08\u5144\u5F1F\u9879\u76EE 2026-09-28\uFF1A\n \u300C\u5206\u680F\u538B\u8FC7\u6765\uFF0C\u4E0D\u662F\u76D6\u4E0A\u53BB\u300D\uFF09\u3002\u6240\u4EE5\u8C03\u7528\u65B9\u5FC5\u987B\u628A\u5B83\u653E\u8FDB\u81EA\u5DF1\u7684 flex \u6839\u91CC\u3002\n \u76AE\u80A4\uFF08\u5934\u90E8 / \u62D6\u62FD\u6761 / \u5173\u95ED\u94AE / \u80CC\u666F\u9634\u5F71\uFF09\u5728 side-panel.css\uFF0C\u4E0E SideSheet \u5171\u7528\u3002 */\n.dshpc-dock{display:flex;flex:0 0 auto;align-self:stretch;min-width:0}\n/* dock \u4E0D\u518D\u66FF\u4E3B\u533A\u8BA9\u7F1D\uFF08\u539F --dshpc-dock-gap \u7684 1px margin \u5DF2\u5220\uFF0C\u7528\u6237 2026-11-02\uFF09\uFF1A\n \u6EDA\u52A8\u6761\u4E0E\u5BB9\u5668\u8FB9\u7F18\u7684 1px \u7EDF\u4E00\u7531\u6EDA\u52A8\u5BB9\u5668\u81EA\u5DF1\u7684\u900F\u660E\u8FB9\u6846\u63D0\u4F9B\uFF08\u89C1 style.md \u00A7\u6EDA\u52A8\u6761\u8BA9\u4F4D\uFF09\uFF0C\n \u4E3B\u533A\u5BB9\u5668\u5E26\u4E86\u8BA9\u4F4D\uFF0C\u6EDA\u52A8\u6761\u4E0E\u8FD9\u6761\u5206\u9694\u7EBF\u4E4B\u95F4\u81EA\u7136\u8FD8\u662F 1px\u3002\u522B\u518D\u5F80\u8FD9\u91CC\u52A0 margin\u3002 */\n\n/* \u81EA\u52A8\u52A0\u7684\u5BBF\u4E3B\u884C\uFF08openFilePreview \u52A0 / \u5173\u95ED\u5373\u6458\uFF09\uFF1A\u6D88\u8D39\u65B9\u90A3\u884C\u4E0D\u5FC5\u81EA\u5DF1\u5199 flex\u3002\n \u53EA\u8BA9\u300C\u7B2C\u4E00\u4E2A\u975E\u9884\u89C8\u5B50\u9879\u300D\u5F53\u4E3B\u533A\u4F38\u5C55\uFF0C\u5176\u4F59\u76F4\u63A5\u5B50\u9879\u4E0D\u52A8\uFF08\u9875\u811A\u6761\u3001\u5DE5\u5177\u6761\u4E0D\u8BEF\u4F24\uFF09\uFF1B\n display \u4E0D\u5728\u8FD9\u91CC\u5199\u6B7B \u2014\u2014 \u672C\u6765\u5C31\u662F grid \u7B49\u5E03\u5C40\u7684\u5143\u7D20\u4FDD\u6301\u539F\u6837\uFF0C\u7531 TS \u4FA7\u6309\u8BA1\u7B97\u503C\u8865 flex\u3002 */\n.dshpc-dock-host{min-width:0;min-height:0}\n.dshpc-dock-host>:not([data-dshpc-file-preview]){min-width:0}\n.dshpc-dock-host>:first-child:not([data-dshpc-file-preview]){flex:1 1 auto}\n\n/* \u5355\u680F**\u5360\u4F4D**\uFF1Asticky + \u89C6\u53E3\u9AD8\u8BA9\u5B83\u5728\u9875\u9762\u6EDA\u52A8\u65F6\u4FDD\u6301\u53EF\u89C1\uFF0C\u540C\u65F6\u4ECD\u7136\u5360\u5BBD\u5EA6\u3002\n \u26A0\uFE0F **\u672C\u6761\u523B\u610F\u4E0D\u8BBE z-index**\uFF1A\u5E03\u5C40\u6210\u5458\u4E00\u65E6\u5E26\u6B63 z-index\uFF0C\u5C31\u4F1A\u65E0\u6761\u4EF6\u538B\u8FC7\u5BBF\u4E3B portal \u5230 body \u7684\n \u5F39\u7A97\uFF08\u5144\u5F1F\u9879\u76EE 2026-10-05 \u771F\u673A\u4E8B\u6545\u300C\u4FA7\u8FB9\u680F\u76D6\u4F4F\u5BBF\u4E3B\u8BBE\u7F6E\u5F39\u7A97\u300D\uFF09\u3002\u5C42\u5E8F\u4EA4\u7ED9 DOM \u987A\u5E8F\u88C1\u51B3\u3002\n \u5916\u89C2\u6765\u81EA .dshpc-side-surface\uFF08side-panel.css\uFF09\uFF0C\u8FD9\u91CC\u53EA\u7BA1\u600E\u4E48\u5360\u4F4D\u4E0E\u671D\u54EA\u8FB9\u63CF\u8FB9\u3002 */\n.dshpc-dock__panel{\n position:sticky;top:0;align-self:stretch;\n /* \u9AD8\u5EA6\u9ED8\u8BA4\u89C6\u53E3\u9AD8\uFF08\u6574\u9875\u573A\u666F\uFF09\uFF1B\u5D4C\u5728\u5B9A\u9AD8\u5BB9\u5668\u91CC\u65F6\u7531\u8C03\u7528\u65B9\u7ED9 --dshpc-dock-h\uFF08\u5982 420px / 100%\uFF09\u3002 */\n height:var(--dshpc-dock-h,100vh);max-height:var(--dshpc-dock-h,100vh);\n border-left:1px solid var(--dshpc-border);\n}\n/* \u6536\u8D77\u7684\u51FA\u573A\uFF1A\u5BBD\u5EA6\u6536\u5230 0\u3001\u900F\u660E\u6DE1\u51FA\uFF1B\u843D\u5B9A\u540E\u7EC4\u4EF6\u624D\u771F\u6B63\u6458\u6389\u8FD9\u4E00\u680F\uFF08JS \u5EF6\u65F6 220ms \u914D\u5408\uFF09\u3002 */\n.dshpc-dock__panel--closing{\n width:0!important;min-width:0!important;opacity:0;border-left-width:0;\n transition:width .2s var(--dshpc-ease),opacity .2s var(--dshpc-ease),border-left-width .2s var(--dshpc-ease);\n}\n\n/* \u62D6\u52A8\u671F\uFF1A\u2460 <iframe>\uFF08PDF / HTML \u9884\u89C8\uFF09\u662F\u72EC\u7ACB\u6587\u6863\uFF0C\u4F1A\u541E\u6389\u7236\u6587\u6863\u7684 pointermove\uFF0C\n \u5411\u53F3\u62D6\u8FDB iframe \u5C31\u5361\u6B7B \u2014\u2014 \u6574\u7247\u8BA9\u51FA\u6307\u9488\u4E8B\u4EF6\uFF1B\u2461 contain \u628A\u91CD\u6392\u9694\u79BB\u5728\u680F\u5185\uFF0C\n \u5426\u5219\u6BCF\u5E27\u6539\u5BBD\u5EA6\u90FD\u4F1A\u7275\u52A8\u6574\u9875\u91CD\u6392\uFF08\u5144\u5F1F\u9879\u76EE 2026-10-04 \u771F\u673A\u300C\u632A\u5F88\u4E45\u624D\u52A8\u4E00\u4E0B\u300D\uFF09\u3002 */\n.dshpc-dock.dshpc-dock--resizing iframe{pointer-events:none}\n.dshpc-dock.dshpc-dock--resizing .dshpc-dock__panel{contain:layout paint;will-change:width}\n\n/* \u6536\u8D77\u94AE\uFF1A**\u5F85\u5728\u9762\u677F\u81EA\u5DF1\u7684\u6846\u91CC**\uFF08\u7528\u6237 2026-10-28 \u4E09\u8F6E\uFF1A\u5360\u9762\u677F\u5185\u90E8\u7A7A\u95F4\uFF0C\u4E0D\u4F38\u5230\u5916\u9762\u53BB\uFF09\u3002\n left:0 \u4ECE\u5185\u4FA7\u8D34\u7740\u5206\u9694\u7EBF \u2014\u2014 \u8D34\u7EBF\u7684\u4E00\u8FB9\u4E0D\u63CF\u8FB9\uFF08\u7EBF\u662F\u9762\u677F\u81EA\u5DF1\u7684 border-left\uFF09\uFF0C\u9875\u7B7E\u4E0E\u7EBF\u4E0D\u91CD\u5408\u3002\n 20\u00D744\uFF08\u7528\u6237 2026-10-28 \u56DB\u8F6E\u5B9A\u5C3A\u5BF8\uFF09\uFF1B\u5B9E\u8272\u5E95\uFF08--dshpc-plate\uFF0C\u660E\u6697\u5404\u6709\u5B9E\u503C\uFF09\uFF0Chover \u4EAE\u4E00\u6863\u3002\n padding-right:2px \u662F**\u89C6\u89C9\u5C45\u4E2D**\uFF1A\u53F3\u4FA7\u662F\u5706\u89D2\uFF0C\u7BAD\u5934\u5F80\u76F4\u7EBF\u90A3\u8FB9\u632A 1px\uFF08\u7528\u6237 2026-10-28 \u56DB\u8F6E\uFF09\u3002 */\n.dshpc-dock__collapse{\n position:absolute;left:0;top:50%;transform:translateY(-50%);\n z-index:8;display:inline-flex;align-items:center;justify-content:center;\n width:20px;height:44px;padding:0 2px 0 0;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-right:1px solid var(--dshpc-border);\n border-left:none;\n border-radius:0 var(--dshpc-radius-sm) var(--dshpc-radius-sm) 0;\n background:var(--dshpc-plate);color:var(--dshpc-fg-3);\n font-family:inherit;font-size:16px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-dock__collapse:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__collapse:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n\n/* \u6536\u8D77\u540E\u7684\u6D6E\u52A8\u8033\u6735\uFF1A**fixed \u8D34\u53F3\u7F18\u3001\u5782\u76F4\u5C45\u4E2D\u3001\u72EC\u7ACB\u4E8E\u5206\u680F**\uFF08\u7528\u6237 2026-10-28 \u5B9A\u7A3F\uFF1A\n \u5C0F\u9875\u7B7E\u6302\u4E2D\u95F4\u3001\u91CC\u9762\u653E\u9762\u677F\u56FE\u6807\u3001\u4E0D\u663E\u793A\u6587\u5B57\uFF0C\u7BAD\u5934\u4E0E\u6536\u8D77\u94AE\u53CD\u5411\uFF09\u3002\u591A\u4E2A\u6309\u6536\u8D77\u987A\u5E8F\u7EB5\u5411\u5806\u53E0\u3002\n z \u8D70 dock \u6863\uFF08\u4F4E\u4E8E\u5BBF\u4E3B\u5F39\u7A97\uFF09\uFF0C\u907F\u514D\u76D6\u4F4F\u5BBF\u4E3B portal \u5C42\u3002 */\n.dshpc-dock__ears{\n position:fixed;top:50%;right:0;transform:translateY(-50%);\n z-index:var(--dshpc-z-dock,1030);\n display:flex;flex-direction:column;gap:8px;align-items:flex-end;\n pointer-events:none;\n}\n.dshpc-dock__ear{\n pointer-events:auto;display:inline-flex;align-items:center;justify-content:center;\n /* \u4E0E\u6536\u8D77\u94AE**\u540C\u5C3A\u5BF8**\uFF0820\u00D744\uFF0C\u7528\u6237 2026-10-28 \u56DB\u8F6E\uFF09\uFF1A\u4E0A/\u4E0B/\u5DE6\u63CF\u8FB9\uFF0C\u8D34\u53F3\u7F18\u7684\u4E00\u4FA7\u4E0D\u63CF\u3002\n \u5B9E\u8272\u5E95\uFF08--dshpc-plate\uFF09\uFF0C\u4E0D\u7528\u900F\u660E\u8272 \u2014\u2014 \u900F\u660E\u5E95\u4E0B\u900F\u51FA\u4E1C\u897F\u5F88\u96BE\u770B\u3002\n padding-left:2px \u662F**\u89C6\u89C9\u5C45\u4E2D**\uFF1A\u5DE6\u4FA7\u662F\u5706\u89D2\uFF0C\u7BAD\u5934\u5F80\u76F4\u7EBF\uFF08\u53F3\u7F18\uFF09\u90A3\u8FB9\u632A 1px\u3002 */\n width:20px;height:44px;box-sizing:border-box;padding:0 0 0 2px;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-left:1px solid var(--dshpc-border);\n border-right:none;\n border-radius:var(--dshpc-radius-sm) 0 0 var(--dshpc-radius-sm);\n background:var(--dshpc-plate);color:var(--dshpc-fg-2);\n cursor:pointer;font-family:inherit;line-height:1;\n animation:dshpc-ear-in .2s var(--dshpc-ease);\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n/* \u5165\u573A\uFF1A\u4ECE\u53F3\u7F18\u5916\u6ED1\u8FDB\u6765\uFF0C\u522B\u300C\u7A81\u7136\u51FA\u73B0\u300D\uFF08\u7528\u6237 2026-10-28\uFF09\u3002 */\n@keyframes dshpc-ear-in{from{opacity:0;transform:translateX(14px)}}\n.dshpc-dock__ear:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__ear:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* \u4E0E\u6536\u8D77\u94AE\u7684\u7BAD\u5934\u540C\u4E00\u5B57\u53F7\uFF0816px\uFF09\uFF1A\u6536\u8FDB\u53BB\u524D\u540E\u7BAD\u5934\u4E00\u6A21\u4E00\u6837\u5927\uFF08\u7528\u6237 2026-10-28\uFF09\u3002 */\n.dshpc-dock__ear-arrow{font-size:16px;color:var(--dshpc-fg-3)}\n.dshpc-dock__ear:hover .dshpc-dock__ear-arrow{color:var(--dshpc-fg)}\n/* \u52A8\u6548\u793C\u8C8C\uFF1A\u7CFB\u7EDF\u58F0\u660E\u51CF\u5C11\u52A8\u6548\u65F6\u5168\u90E8\u5173\u6389\uFF0C\u6536\u8D77\u9000\u5316\u4E3A\u77AC\u65F6\u3001\u529F\u80FD\u4E0D\u53D7\u5F71\u54CD\u3002 */\n@media (prefers-reduced-motion:reduce){\n .dshpc-dock__panel{animation:none}\n .dshpc-dock__panel--closing{transition:none}\n .dshpc-dock__ear{animation:none}\n}\n";
2
2
  //# sourceMappingURL=panel-dock-css.generated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"panel-dock-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/panel-dock-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,ywSAAyzJ,CAAA"}
1
+ {"version":3,"file":"panel-dock-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/panel-dock-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,qvSAA4wJ,CAAA"}
@@ -1,4 +1,4 @@
1
1
  // ⚠️ 生成物,勿手改。真源 = src/ui/panel-dock.css
2
2
  // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
- export const PANEL_DOCK_CSS = "/* 停靠栏 = **布局成员**,不是浮层:它占宽度、把主区真正挤窄(兄弟项目 2026-09-28:\n 「分栏压过来,不是盖上去」)。所以调用方必须把它放进自己的 flex 根里。\n 皮肤(头部 / 拖拽条 / 关闭钮 / 背景阴影)在 side-panel.css,与 SideSheet 共用。 */\n.dshpc-dock{display:flex;flex:0 0 auto;align-self:stretch;min-width:0}\n/* 开着时给主区滚动条让出一条缝:滚动条贴死分隔线很难看(用户 2026-10-28,对齐\n dsh-better-sidebar 的留白)。全关时整条 dock 退出,缝隙一起消失、不留白边。\n 缝宽可由调用方盖 --dshpc-dock-gap;TS 侧的让位量(DOCK_GAP)要与它一致。 */\n.dshpc-dock--open{margin-left:var(--dshpc-dock-gap,1px)}\n\n/* 自动加的宿主行(openFilePreview 加 / 关闭即摘):消费方那行不必自己写 flex。\n 只让「第一个非预览子项」当主区伸展,其余直接子项不动(页脚条、工具条不误伤);\n display 不在这里写死 —— 本来就是 grid 等布局的元素保持原样,由 TS 侧按计算值补 flex。 */\n.dshpc-dock-host{min-width:0;min-height:0}\n.dshpc-dock-host>:not([data-dshpc-file-preview]){min-width:0}\n.dshpc-dock-host>:first-child:not([data-dshpc-file-preview]){flex:1 1 auto}\n\n/* 单栏**占位**:sticky + 视口高让它在页面滚动时保持可见,同时仍然占宽度。\n ⚠️ **本条刻意不设 z-index**:布局成员一旦带正 z-index,就会无条件压过宿主 portal 到 body 的\n 弹窗(兄弟项目 2026-10-05 真机事故「侧边栏盖住宿主设置弹窗」)。层序交给 DOM 顺序裁决。\n 外观来自 .dshpc-side-surface(side-panel.css),这里只管怎么占位与朝哪边描边。 */\n.dshpc-dock__panel{\n position:sticky;top:0;align-self:stretch;\n /* 高度默认视口高(整页场景);嵌在定高容器里时由调用方给 --dshpc-dock-h(如 420px / 100%)。 */\n height:var(--dshpc-dock-h,100vh);max-height:var(--dshpc-dock-h,100vh);\n border-left:1px solid var(--dshpc-border);\n}\n/* 收起的出场:宽度收到 0、透明淡出;落定后组件才真正摘掉这一栏(JS 延时 220ms 配合)。 */\n.dshpc-dock__panel--closing{\n width:0!important;min-width:0!important;opacity:0;border-left-width:0;\n transition:width .2s var(--dshpc-ease),opacity .2s var(--dshpc-ease),border-left-width .2s var(--dshpc-ease);\n}\n\n/* 拖动期:① <iframe>(PDF / HTML 预览)是独立文档,会吞掉父文档的 pointermove,\n 向右拖进 iframe 就卡死 —— 整片让出指针事件;② contain 把重排隔离在栏内,\n 否则每帧改宽度都会牵动整页重排(兄弟项目 2026-10-04 真机「挪很久才动一下」)。 */\n.dshpc-dock.dshpc-dock--resizing iframe{pointer-events:none}\n.dshpc-dock.dshpc-dock--resizing .dshpc-dock__panel{contain:layout paint;will-change:width}\n\n/* 收起钮:**待在面板自己的框里**(用户 2026-10-28 三轮:占面板内部空间,不伸到外面去)。\n left:0 从内侧贴着分隔线 —— 贴线的一边不描边(线是面板自己的 border-left),页签与线不重合。\n 20×44(用户 2026-10-28 四轮定尺寸);实色底(--dshpc-plate,明暗各有实值),hover 亮一档。\n padding-right:2px 是**视觉居中**:右侧是圆角,箭头往直线那边挪 1px(用户 2026-10-28 四轮)。 */\n.dshpc-dock__collapse{\n position:absolute;left:0;top:50%;transform:translateY(-50%);\n z-index:8;display:inline-flex;align-items:center;justify-content:center;\n width:20px;height:44px;padding:0 2px 0 0;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-right:1px solid var(--dshpc-border);\n border-left:none;\n border-radius:0 var(--dshpc-radius-sm) var(--dshpc-radius-sm) 0;\n background:var(--dshpc-plate);color:var(--dshpc-fg-3);\n font-family:inherit;font-size:16px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-dock__collapse:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__collapse:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n\n/* 收起后的浮动耳朵:**fixed 贴右缘、垂直居中、独立于分栏**(用户 2026-10-28 定稿:\n 小页签挂中间、里面放面板图标、不显示文字,箭头与收起钮反向)。多个按收起顺序纵向堆叠。\n z 走 dock 档(低于宿主弹窗),避免盖住宿主 portal 层。 */\n.dshpc-dock__ears{\n position:fixed;top:50%;right:0;transform:translateY(-50%);\n z-index:var(--dshpc-z-dock,1030);\n display:flex;flex-direction:column;gap:8px;align-items:flex-end;\n pointer-events:none;\n}\n.dshpc-dock__ear{\n pointer-events:auto;display:inline-flex;align-items:center;justify-content:center;\n /* 与收起钮**同尺寸**(20×44,用户 2026-10-28 四轮):上/下/左描边,贴右缘的一侧不描。\n 实色底(--dshpc-plate),不用透明色 —— 透明底下透出东西很难看。\n padding-left:2px 是**视觉居中**:左侧是圆角,箭头往直线(右缘)那边挪 1px。 */\n width:20px;height:44px;box-sizing:border-box;padding:0 0 0 2px;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-left:1px solid var(--dshpc-border);\n border-right:none;\n border-radius:var(--dshpc-radius-sm) 0 0 var(--dshpc-radius-sm);\n background:var(--dshpc-plate);color:var(--dshpc-fg-2);\n cursor:pointer;font-family:inherit;line-height:1;\n animation:dshpc-ear-in .2s var(--dshpc-ease);\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n/* 入场:从右缘外滑进来,别「突然出现」(用户 2026-10-28)。 */\n@keyframes dshpc-ear-in{from{opacity:0;transform:translateX(14px)}}\n.dshpc-dock__ear:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__ear:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* 与收起钮的箭头同一字号(16px):收进去前后箭头一模一样大(用户 2026-10-28)。 */\n.dshpc-dock__ear-arrow{font-size:16px;color:var(--dshpc-fg-3)}\n.dshpc-dock__ear:hover .dshpc-dock__ear-arrow{color:var(--dshpc-fg)}\n/* 动效礼貌:系统声明减少动效时全部关掉,收起退化为瞬时、功能不受影响。 */\n@media (prefers-reduced-motion:reduce){\n .dshpc-dock__panel{animation:none}\n .dshpc-dock__panel--closing{transition:none}\n .dshpc-dock__ear{animation:none}\n}\n";
3
+ export const PANEL_DOCK_CSS = "/* 停靠栏 = **布局成员**,不是浮层:它占宽度、把主区真正挤窄(兄弟项目 2026-09-28:\n 「分栏压过来,不是盖上去」)。所以调用方必须把它放进自己的 flex 根里。\n 皮肤(头部 / 拖拽条 / 关闭钮 / 背景阴影)在 side-panel.css,与 SideSheet 共用。 */\n.dshpc-dock{display:flex;flex:0 0 auto;align-self:stretch;min-width:0}\n/* dock 不再替主区让缝(原 --dshpc-dock-gap 的 1px margin 已删,用户 2026-11-02):\n 滚动条与容器边缘的 1px 统一由滚动容器自己的透明边框提供(见 style.md §滚动条让位),\n 主区容器带了让位,滚动条与这条分隔线之间自然还是 1px。别再往这里加 margin。 */\n\n/* 自动加的宿主行(openFilePreview 加 / 关闭即摘):消费方那行不必自己写 flex。\n 只让「第一个非预览子项」当主区伸展,其余直接子项不动(页脚条、工具条不误伤);\n display 不在这里写死 —— 本来就是 grid 等布局的元素保持原样,由 TS 侧按计算值补 flex。 */\n.dshpc-dock-host{min-width:0;min-height:0}\n.dshpc-dock-host>:not([data-dshpc-file-preview]){min-width:0}\n.dshpc-dock-host>:first-child:not([data-dshpc-file-preview]){flex:1 1 auto}\n\n/* 单栏**占位**:sticky + 视口高让它在页面滚动时保持可见,同时仍然占宽度。\n ⚠️ **本条刻意不设 z-index**:布局成员一旦带正 z-index,就会无条件压过宿主 portal 到 body 的\n 弹窗(兄弟项目 2026-10-05 真机事故「侧边栏盖住宿主设置弹窗」)。层序交给 DOM 顺序裁决。\n 外观来自 .dshpc-side-surface(side-panel.css),这里只管怎么占位与朝哪边描边。 */\n.dshpc-dock__panel{\n position:sticky;top:0;align-self:stretch;\n /* 高度默认视口高(整页场景);嵌在定高容器里时由调用方给 --dshpc-dock-h(如 420px / 100%)。 */\n height:var(--dshpc-dock-h,100vh);max-height:var(--dshpc-dock-h,100vh);\n border-left:1px solid var(--dshpc-border);\n}\n/* 收起的出场:宽度收到 0、透明淡出;落定后组件才真正摘掉这一栏(JS 延时 220ms 配合)。 */\n.dshpc-dock__panel--closing{\n width:0!important;min-width:0!important;opacity:0;border-left-width:0;\n transition:width .2s var(--dshpc-ease),opacity .2s var(--dshpc-ease),border-left-width .2s var(--dshpc-ease);\n}\n\n/* 拖动期:① <iframe>(PDF / HTML 预览)是独立文档,会吞掉父文档的 pointermove,\n 向右拖进 iframe 就卡死 —— 整片让出指针事件;② contain 把重排隔离在栏内,\n 否则每帧改宽度都会牵动整页重排(兄弟项目 2026-10-04 真机「挪很久才动一下」)。 */\n.dshpc-dock.dshpc-dock--resizing iframe{pointer-events:none}\n.dshpc-dock.dshpc-dock--resizing .dshpc-dock__panel{contain:layout paint;will-change:width}\n\n/* 收起钮:**待在面板自己的框里**(用户 2026-10-28 三轮:占面板内部空间,不伸到外面去)。\n left:0 从内侧贴着分隔线 —— 贴线的一边不描边(线是面板自己的 border-left),页签与线不重合。\n 20×44(用户 2026-10-28 四轮定尺寸);实色底(--dshpc-plate,明暗各有实值),hover 亮一档。\n padding-right:2px 是**视觉居中**:右侧是圆角,箭头往直线那边挪 1px(用户 2026-10-28 四轮)。 */\n.dshpc-dock__collapse{\n position:absolute;left:0;top:50%;transform:translateY(-50%);\n z-index:8;display:inline-flex;align-items:center;justify-content:center;\n width:20px;height:44px;padding:0 2px 0 0;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-right:1px solid var(--dshpc-border);\n border-left:none;\n border-radius:0 var(--dshpc-radius-sm) var(--dshpc-radius-sm) 0;\n background:var(--dshpc-plate);color:var(--dshpc-fg-3);\n font-family:inherit;font-size:16px;line-height:1;cursor:pointer;\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n.dshpc-dock__collapse:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__collapse:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n\n/* 收起后的浮动耳朵:**fixed 贴右缘、垂直居中、独立于分栏**(用户 2026-10-28 定稿:\n 小页签挂中间、里面放面板图标、不显示文字,箭头与收起钮反向)。多个按收起顺序纵向堆叠。\n z 走 dock 档(低于宿主弹窗),避免盖住宿主 portal 层。 */\n.dshpc-dock__ears{\n position:fixed;top:50%;right:0;transform:translateY(-50%);\n z-index:var(--dshpc-z-dock,1030);\n display:flex;flex-direction:column;gap:8px;align-items:flex-end;\n pointer-events:none;\n}\n.dshpc-dock__ear{\n pointer-events:auto;display:inline-flex;align-items:center;justify-content:center;\n /* 与收起钮**同尺寸**(20×44,用户 2026-10-28 四轮):上/下/左描边,贴右缘的一侧不描。\n 实色底(--dshpc-plate),不用透明色 —— 透明底下透出东西很难看。\n padding-left:2px 是**视觉居中**:左侧是圆角,箭头往直线(右缘)那边挪 1px。 */\n width:20px;height:44px;box-sizing:border-box;padding:0 0 0 2px;\n border-top:1px solid var(--dshpc-border);\n border-bottom:1px solid var(--dshpc-border);\n border-left:1px solid var(--dshpc-border);\n border-right:none;\n border-radius:var(--dshpc-radius-sm) 0 0 var(--dshpc-radius-sm);\n background:var(--dshpc-plate);color:var(--dshpc-fg-2);\n cursor:pointer;font-family:inherit;line-height:1;\n animation:dshpc-ear-in .2s var(--dshpc-ease);\n transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);\n}\n/* 入场:从右缘外滑进来,别「突然出现」(用户 2026-10-28)。 */\n@keyframes dshpc-ear-in{from{opacity:0;transform:translateX(14px)}}\n.dshpc-dock__ear:hover{background:var(--dshpc-plate-hover);color:var(--dshpc-fg)}\n.dshpc-dock__ear:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* 与收起钮的箭头同一字号(16px):收进去前后箭头一模一样大(用户 2026-10-28)。 */\n.dshpc-dock__ear-arrow{font-size:16px;color:var(--dshpc-fg-3)}\n.dshpc-dock__ear:hover .dshpc-dock__ear-arrow{color:var(--dshpc-fg)}\n/* 动效礼貌:系统声明减少动效时全部关掉,收起退化为瞬时、功能不受影响。 */\n@media (prefers-reduced-motion:reduce){\n .dshpc-dock__panel{animation:none}\n .dshpc-dock__panel--closing{transition:none}\n .dshpc-dock__ear{animation:none}\n}\n";
4
4
  //# sourceMappingURL=panel-dock-css.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"panel-dock-css.generated.js","sourceRoot":"","sources":["../../src/ui/panel-dock-css.generated.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,qEAAqE;AACrE,MAAM,CAAC,MAAM,cAAc,GAAG,szJAAszJ,CAAA"}
1
+ {"version":3,"file":"panel-dock-css.generated.js","sourceRoot":"","sources":["../../src/ui/panel-dock-css.generated.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,qEAAqE;AACrE,MAAM,CAAC,MAAM,cAAc,GAAG,ywJAAywJ,CAAA"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 浮层面板公共件(2026-11-03):`PanelSurface` = 皮肤载体,`PanelClose` = 唯一那枚关闭钮。
3
+ *
4
+ * 分工(用户 2026-11-03 定,目的就是「样式统一但各家用各家自己的逻辑」):
5
+ * - **定位**留在各自控件:Modal 居中、选文件弹窗贴锚点并翻转、菜单挂在触发器下方;
6
+ * - **表面**全部来自 `panel.css` 的三档(modal / popover / menu),组件里不许再写
7
+ * 底色 / 描边 / 圆角 / 阴影。
8
+ *
9
+ * 为什么不做成「一个万能 Panel 组件」:那会把定位也吞进来,等于要求所有浮层同一套交互。
10
+ * 这里只统一皮肤,不统一行为。
11
+ */
12
+ import { type CSSProperties, type ReactNode } from 'react';
13
+ /** 面板档位:居中模态 / 贴锚点面板 / 下拉菜单。 */
14
+ export type PanelTier = 'modal' | 'popover' | 'menu';
15
+ export interface PanelSurfaceProps {
16
+ tier: PanelTier;
17
+ /** 容器角色(`dialog` / `menu` 这类;不传则不写 role)。 */
18
+ role?: string;
19
+ /** 追加类名:**只允许补布局 / 定位**,皮肤归档位管。 */
20
+ className?: string;
21
+ /** 内联样式:同样只放定位与尺寸。 */
22
+ style?: CSSProperties;
23
+ /** 原样铺到节点上的属性(`aria-*` / `data-*` 这类钩子)。 */
24
+ attrs?: Record<string, string | number | undefined>;
25
+ /** 面板上的点击不再冒到遮罩(否则点正文等于点了外部,会把自己关掉)。 */
26
+ stopPropagation?: boolean;
27
+ children?: ReactNode;
28
+ }
29
+ /** 皮肤载体:`dshpc-panel` + 档位类,别的地方不要手拼这两个类。 */
30
+ export declare function PanelSurface(props: PanelSurfaceProps): ReactNode;
31
+ export interface PanelCloseProps {
32
+ /** 无障碍名(走调用方的内置字典)。 */
33
+ label: string;
34
+ onClick: () => void;
35
+ /** 自定义图标(默认 ✕)。 */
36
+ icon?: ReactNode;
37
+ className?: string;
38
+ }
39
+ /** 浮层唯一那枚关闭钮(20×20 方角);位置由各自的头部决定,这个件不管定位。 */
40
+ export declare function PanelClose(props: PanelCloseProps): ReactNode;
41
+ //# sourceMappingURL=panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/ui/panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAsB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAI9E,gCAAgC;AAChC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAEpD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,SAAS,CAAA;IACf,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,sBAAsB;IACtB,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAA;IACnD,wCAAwC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,6CAA6C;AAC7C,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAchE;AAED,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,mBAAmB;IACnB,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,8CAA8C;AAC9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,CAY5D"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * 浮层面板公共件(2026-11-03):`PanelSurface` = 皮肤载体,`PanelClose` = 唯一那枚关闭钮。
3
+ *
4
+ * 分工(用户 2026-11-03 定,目的就是「样式统一但各家用各家自己的逻辑」):
5
+ * - **定位**留在各自控件:Modal 居中、选文件弹窗贴锚点并翻转、菜单挂在触发器下方;
6
+ * - **表面**全部来自 `panel.css` 的三档(modal / popover / menu),组件里不许再写
7
+ * 底色 / 描边 / 圆角 / 阴影。
8
+ *
9
+ * 为什么不做成「一个万能 Panel 组件」:那会把定位也吞进来,等于要求所有浮层同一套交互。
10
+ * 这里只统一皮肤,不统一行为。
11
+ */
12
+ import { createElement as h } from 'react';
13
+ import { ensureComponentStyles } from './css.js';
14
+ import { PANEL_CSS } from './panel-css.js';
15
+ /** 皮肤载体:`dshpc-panel` + 档位类,别的地方不要手拼这两个类。 */
16
+ export function PanelSurface(props) {
17
+ ensureComponentStyles('panel', PANEL_CSS);
18
+ const className = `dshpc-panel dshpc-panel--${props.tier}${props.className === undefined || props.className === '' ? '' : ` ${props.className}`}`;
19
+ return h('div', {
20
+ ...props.attrs,
21
+ className,
22
+ style: props.style,
23
+ role: props.role,
24
+ onClick: props.stopPropagation === true ? (event) => event.stopPropagation() : undefined,
25
+ }, props.children ?? null);
26
+ }
27
+ /** 浮层唯一那枚关闭钮(20×20 方角);位置由各自的头部决定,这个件不管定位。 */
28
+ export function PanelClose(props) {
29
+ ensureComponentStyles('panel', PANEL_CSS);
30
+ return h('button', {
31
+ type: 'button',
32
+ className: `dshpc-panel__close${props.className === undefined ? '' : ` ${props.className}`}`,
33
+ 'aria-label': props.label,
34
+ onClick: () => props.onClick(),
35
+ }, props.icon ?? '✕');
36
+ }
37
+ //# sourceMappingURL=panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/ui/panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,aAAa,IAAI,CAAC,EAAsC,MAAM,OAAO,CAAA;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAoB1C,6CAA6C;AAC7C,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACzC,MAAM,SAAS,GAAG,4BAA4B,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,CAAA;IACjJ,OAAO,CAAC,CACN,KAAK,EACL;QACE,GAAG,KAAK,CAAC,KAAK;QACd,SAAS;QACT,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAsC,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,SAAS;KAC1H,EACD,KAAK,CAAC,QAAQ,IAAI,IAAI,CACvB,CAAA;AACH,CAAC;AAWD,8CAA8C;AAC9C,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,qBAAqB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACzC,OAAO,CAAC,CACN,QAAQ,EACR;QACE,IAAI,EAAE,QAAQ;QACd,SAAS,EAAE,qBAAqB,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE;QAC5F,YAAY,EAAE,KAAK,CAAC,KAAK;QACzB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;KAC/B,EACD,KAAK,CAAC,IAAI,IAAI,GAAG,CAClB,CAAA;AACH,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const PICKER_CSS = "\n.dshpc-picker{position:relative;display:inline-block;max-width:100%;font-size:13px;line-height:20px}\n.dshpc-picker__trigger{\n display:inline-flex;align-items:center;justify-content:space-between;gap:6px;\n min-width:120px;max-width:100%;height:28px;padding:0 8px;\n color:var(--dshpc-fg);background:var(--dshpc-surface-1);\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);cursor:pointer;\n}\n.dshpc-picker__trigger:disabled{color:var(--dshpc-fg-dim);cursor:not-allowed;opacity:.7}\n/* \u805A\u7126\uFF08\u952E\u76D8\u6216\u70B9\u51FB\u9009\u4E2D\uFF09\u65F6\u4E0E\u5168\u7AD9\u4E00\u81F4\u7684\u84DD\u8272\u63CF\u8FB9\uFF1B\u83DC\u5355\u6253\u5F00\u540E\u7126\u70B9\u4F1A\u8FDB\u53BB\uFF0C\u89E6\u53D1\u5668\u81EA\u7136\u5931\u53BB\u7126\u70B9\u3002 */\n.dshpc-picker__trigger:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* \u6587\u5B57\u9ED8\u8BA4\u9760\u5DE6\uFF08\u5403\u6389\u5269\u4F59\u5BBD\u5EA6\uFF09\uFF0C\u4E0D\u7ED9 space-between \u628A\u77ED\u6587\u6848\u63A8\u5230\u4E2D\u95F4\u7684\u673A\u4F1A\uFF1B\n \u786E\u5B9E\u8981\u5C45\u4E2D\u5C31\u663E\u5F0F\u4F20 align=\"center\"\u3002 */\n.dshpc-picker__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}\n.dshpc-picker__trigger--center .dshpc-picker__label{text-align:center}\n.dshpc-picker__caret{flex:none;color:var(--dshpc-fg-3)}\n.dshpc-picker__icon{display:inline-flex;flex:none;color:var(--dshpc-fg-2)}\n.dshpc-picker__option-icon{display:inline-flex;flex:none;color:var(--dshpc-fg-2)}\n.dshpc-picker__menu{\n z-index:60;max-height:280px;overflow:auto;padding:4px;\n /* \u83DC\u5355\u7ECF FloatingPortal \u6302\u5230 body\uFF0C\u8131\u79BB .dshpc-picker\uFF0C\u987B\u663E\u5F0F\u5B57\u53F7\uFF0C\u5426\u5219\u7EE7\u627F body \u7684\u5927\u5B57\u53F7 */\n font-size:13px;line-height:20px;\n background:var(--dshpc-surface-menu);border:1px solid var(--dshpc-border);\n border-radius:var(--dshpc-radius-md);box-shadow:0 8px 24px rgba(15,23,42,.12);\n}\n/* \u5C3A\u5BF8\u6863\uFF08\u4E0E Field \u7684 sm/md/lg \u5BF9\u5E94\uFF09\u3002 */\n.dshpc-picker__trigger--sm{height:24px;font-size:12px}\n.dshpc-picker__trigger--lg{height:32px}\n/* \u952E\u76D8\u6E38\u6807\u6240\u5728\u9879\uFF08\u65E0 hover \u4E5F\u8981\u770B\u5F97\u89C1\uFF09\u3002 */\n.dshpc-picker__option[data-active='true']{background:var(--dshpc-surface-sunken);outline:1px solid var(--dshpc-border)}\n.dshpc-picker__option--clear{color:var(--dshpc-fg-3)}\n.dshpc-picker__search{\n width:100%;height:28px;margin-bottom:4px;padding:0 8px;box-sizing:border-box;\n color:var(--dshpc-fg);background:var(--dshpc-surface-sunken);\n border:1px solid var(--dshpc-border-faint);border-radius:var(--dshpc-radius-md);outline:none;\n}\n.dshpc-picker__group-label{\n padding:6px 8px 2px;color:var(--dshpc-fg-3);font-size:11px;\n}\n.dshpc-picker__option{\n display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:var(--dshpc-radius-sm);cursor:pointer;\n color:var(--dshpc-fg);white-space:nowrap;\n}\n.dshpc-picker__option:hover{background:var(--dshpc-surface-sunken)}\n.dshpc-picker__option--active{background:var(--dshpc-open-bg);color:var(--dshpc-business)}\n.dshpc-picker__option--disabled{color:var(--dshpc-fg-dim);cursor:not-allowed}\n/* \u9009\u9879\u6587\u5B57\u5403\u6389\u5269\u4F59\u5BBD\u5EA6\uFF1A\u8D85\u957F\u7701\u7565\u53F7\uFF08\u914D\u5408 MarqueeText hover \u8DD1\u9A6C\u706F\uFF09\uFF0C\u4E0D\u6491\u5BBD\u83DC\u5355\u3002 */\n.dshpc-picker__option-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshpc-picker__tick{width:12px;color:var(--dshpc-business)}\n.dshpc-picker__empty{padding:8px;color:var(--dshpc-fg-3);text-align:center}\n.dshpc-picker__degraded{\n padding:6px 8px;margin-bottom:4px;border-radius:var(--dshpc-radius-sm);\n color:var(--dshpc-warning-label);background:color-mix(in srgb,var(--dshpc-warning) 12%,transparent);\n font-size:11px;\n}\n.dshpc-picker__row{display:flex;align-items:center;gap:8px}\n";
1
+ export declare const PICKER_CSS = "\n.dshpc-picker{position:relative;display:inline-block;max-width:100%;font-size:13px;line-height:20px}\n.dshpc-picker__trigger{\n display:inline-flex;align-items:center;justify-content:space-between;gap:6px;\n min-width:120px;max-width:100%;height:28px;padding:0 8px;\n color:var(--dshpc-fg);background:var(--dshpc-surface-1);\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);cursor:pointer;\n}\n.dshpc-picker__trigger:disabled{color:var(--dshpc-fg-dim);cursor:not-allowed;opacity:.7}\n/* \u805A\u7126\uFF08\u952E\u76D8\u6216\u70B9\u51FB\u9009\u4E2D\uFF09\u65F6\u4E0E\u5168\u7AD9\u4E00\u81F4\u7684\u84DD\u8272\u63CF\u8FB9\uFF1B\u83DC\u5355\u6253\u5F00\u540E\u7126\u70B9\u4F1A\u8FDB\u53BB\uFF0C\u89E6\u53D1\u5668\u81EA\u7136\u5931\u53BB\u7126\u70B9\u3002 */\n.dshpc-picker__trigger:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* \u6587\u5B57\u9ED8\u8BA4\u9760\u5DE6\uFF08\u5403\u6389\u5269\u4F59\u5BBD\u5EA6\uFF09\uFF0C\u4E0D\u7ED9 space-between \u628A\u77ED\u6587\u6848\u63A8\u5230\u4E2D\u95F4\u7684\u673A\u4F1A\uFF1B\n \u786E\u5B9E\u8981\u5C45\u4E2D\u5C31\u663E\u5F0F\u4F20 align=\"center\"\u3002 */\n.dshpc-picker__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}\n.dshpc-picker__trigger--center .dshpc-picker__label{text-align:center}\n.dshpc-picker__caret{flex:none;color:var(--dshpc-fg-3)}\n.dshpc-picker__icon{display:inline-flex;flex:none;color:var(--dshpc-fg-2)}\n.dshpc-picker__option-icon{display:inline-flex;flex:none;color:var(--dshpc-fg-2)}\n/* \u4E0B\u62C9\u9762\u677F\u53EA\u7559\u5B9A\u4F4D / \u6EDA\u52A8 / \u5B57\u53F7\uFF1A\u5E95\u8272\u00B7\u63CF\u8FB9\u00B7\u5706\u89D2\u00B7\u9634\u5F71\u6765\u81EA panel.css \u7684 menu \u6863\u3002 */\n.dshpc-picker__menu{\n z-index:var(--dshpc-z-popmenu);max-height:280px;overflow:auto;padding:4px;\n /* \u83DC\u5355\u7ECF FloatingPortal \u6302\u5230 body\uFF0C\u8131\u79BB .dshpc-picker\uFF0C\u987B\u663E\u5F0F\u5B57\u53F7\uFF0C\u5426\u5219\u7EE7\u627F body \u7684\u5927\u5B57\u53F7 */\n font-size:13px;line-height:20px;\n}\n/* \u5C3A\u5BF8\u6863\uFF08\u4E0E Field \u7684 sm/md/lg \u5BF9\u5E94\uFF09\u3002 */\n.dshpc-picker__trigger--sm{height:24px;font-size:12px}\n.dshpc-picker__trigger--lg{height:32px}\n/* \u952E\u76D8\u6E38\u6807\u6240\u5728\u9879\uFF08\u65E0 hover \u4E5F\u8981\u770B\u5F97\u89C1\uFF09\u3002 */\n.dshpc-picker__option[data-active='true']{background:var(--dshpc-surface-sunken);outline:1px solid var(--dshpc-border)}\n.dshpc-picker__option--clear{color:var(--dshpc-fg-3)}\n.dshpc-picker__search{\n width:100%;height:28px;margin-bottom:4px;padding:0 8px;box-sizing:border-box;\n color:var(--dshpc-fg);background:var(--dshpc-surface-sunken);\n border:1px solid var(--dshpc-border-faint);border-radius:var(--dshpc-radius-md);outline:none;\n}\n.dshpc-picker__group-label{\n padding:6px 8px 2px;color:var(--dshpc-fg-3);font-size:11px;\n}\n.dshpc-picker__option{\n display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:var(--dshpc-radius-sm);cursor:pointer;\n color:var(--dshpc-fg);white-space:nowrap;\n}\n.dshpc-picker__option:hover{background:var(--dshpc-surface-sunken)}\n.dshpc-picker__option--active{background:var(--dshpc-open-bg);color:var(--dshpc-business)}\n.dshpc-picker__option--disabled{color:var(--dshpc-fg-dim);cursor:not-allowed}\n/* \u9009\u9879\u6587\u5B57\u5403\u6389\u5269\u4F59\u5BBD\u5EA6\uFF1A\u8D85\u957F\u7701\u7565\u53F7\uFF08\u914D\u5408 MarqueeText hover \u8DD1\u9A6C\u706F\uFF09\uFF0C\u4E0D\u6491\u5BBD\u83DC\u5355\u3002 */\n.dshpc-picker__option-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshpc-picker__tick{width:12px;color:var(--dshpc-business)}\n.dshpc-picker__empty{padding:8px;color:var(--dshpc-fg-3);text-align:center}\n.dshpc-picker__degraded{\n padding:6px 8px;margin-bottom:4px;border-radius:var(--dshpc-radius-sm);\n color:var(--dshpc-warning-label);background:color-mix(in srgb,var(--dshpc-warning) 12%,transparent);\n font-size:11px;\n}\n.dshpc-picker__row{display:flex;align-items:center;gap:8px}\n";
2
2
  //# sourceMappingURL=picker-css.generated.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"picker-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/picker-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,o9HAA0qG,CAAA"}
1
+ {"version":3,"file":"picker-css.generated.d.ts","sourceRoot":"","sources":["../../src/ui/picker-css.generated.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,qhIAA0lG,CAAA"}
@@ -1,4 +1,4 @@
1
1
  // ⚠️ 生成物,勿手改。真源 = src/ui/picker.css
2
2
  // 由 scripts/gen-css.mjs 生成(`pnpm run gen:css`):改样式请改那个 .css 文件后重新生成。
3
- export const PICKER_CSS = "\n.dshpc-picker{position:relative;display:inline-block;max-width:100%;font-size:13px;line-height:20px}\n.dshpc-picker__trigger{\n display:inline-flex;align-items:center;justify-content:space-between;gap:6px;\n min-width:120px;max-width:100%;height:28px;padding:0 8px;\n color:var(--dshpc-fg);background:var(--dshpc-surface-1);\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);cursor:pointer;\n}\n.dshpc-picker__trigger:disabled{color:var(--dshpc-fg-dim);cursor:not-allowed;opacity:.7}\n/* 聚焦(键盘或点击选中)时与全站一致的蓝色描边;菜单打开后焦点会进去,触发器自然失去焦点。 */\n.dshpc-picker__trigger:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* 文字默认靠左(吃掉剩余宽度),不给 space-between 把短文案推到中间的机会;\n 确实要居中就显式传 align=\"center\"。 */\n.dshpc-picker__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}\n.dshpc-picker__trigger--center .dshpc-picker__label{text-align:center}\n.dshpc-picker__caret{flex:none;color:var(--dshpc-fg-3)}\n.dshpc-picker__icon{display:inline-flex;flex:none;color:var(--dshpc-fg-2)}\n.dshpc-picker__option-icon{display:inline-flex;flex:none;color:var(--dshpc-fg-2)}\n.dshpc-picker__menu{\n z-index:60;max-height:280px;overflow:auto;padding:4px;\n /* 菜单经 FloatingPortal 挂到 body,脱离 .dshpc-picker,须显式字号,否则继承 body 的大字号 */\n font-size:13px;line-height:20px;\n background:var(--dshpc-surface-menu);border:1px solid var(--dshpc-border);\n border-radius:var(--dshpc-radius-md);box-shadow:0 8px 24px rgba(15,23,42,.12);\n}\n/* 尺寸档(与 Field 的 sm/md/lg 对应)。 */\n.dshpc-picker__trigger--sm{height:24px;font-size:12px}\n.dshpc-picker__trigger--lg{height:32px}\n/* 键盘游标所在项(无 hover 也要看得见)。 */\n.dshpc-picker__option[data-active='true']{background:var(--dshpc-surface-sunken);outline:1px solid var(--dshpc-border)}\n.dshpc-picker__option--clear{color:var(--dshpc-fg-3)}\n.dshpc-picker__search{\n width:100%;height:28px;margin-bottom:4px;padding:0 8px;box-sizing:border-box;\n color:var(--dshpc-fg);background:var(--dshpc-surface-sunken);\n border:1px solid var(--dshpc-border-faint);border-radius:var(--dshpc-radius-md);outline:none;\n}\n.dshpc-picker__group-label{\n padding:6px 8px 2px;color:var(--dshpc-fg-3);font-size:11px;\n}\n.dshpc-picker__option{\n display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:var(--dshpc-radius-sm);cursor:pointer;\n color:var(--dshpc-fg);white-space:nowrap;\n}\n.dshpc-picker__option:hover{background:var(--dshpc-surface-sunken)}\n.dshpc-picker__option--active{background:var(--dshpc-open-bg);color:var(--dshpc-business)}\n.dshpc-picker__option--disabled{color:var(--dshpc-fg-dim);cursor:not-allowed}\n/* 选项文字吃掉剩余宽度:超长省略号(配合 MarqueeText hover 跑马灯),不撑宽菜单。 */\n.dshpc-picker__option-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshpc-picker__tick{width:12px;color:var(--dshpc-business)}\n.dshpc-picker__empty{padding:8px;color:var(--dshpc-fg-3);text-align:center}\n.dshpc-picker__degraded{\n padding:6px 8px;margin-bottom:4px;border-radius:var(--dshpc-radius-sm);\n color:var(--dshpc-warning-label);background:color-mix(in srgb,var(--dshpc-warning) 12%,transparent);\n font-size:11px;\n}\n.dshpc-picker__row{display:flex;align-items:center;gap:8px}\n";
3
+ export const PICKER_CSS = "\n.dshpc-picker{position:relative;display:inline-block;max-width:100%;font-size:13px;line-height:20px}\n.dshpc-picker__trigger{\n display:inline-flex;align-items:center;justify-content:space-between;gap:6px;\n min-width:120px;max-width:100%;height:28px;padding:0 8px;\n color:var(--dshpc-fg);background:var(--dshpc-surface-1);\n border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);cursor:pointer;\n}\n.dshpc-picker__trigger:disabled{color:var(--dshpc-fg-dim);cursor:not-allowed;opacity:.7}\n/* 聚焦(键盘或点击选中)时与全站一致的蓝色描边;菜单打开后焦点会进去,触发器自然失去焦点。 */\n.dshpc-picker__trigger:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px}\n/* 文字默认靠左(吃掉剩余宽度),不给 space-between 把短文案推到中间的机会;\n 确实要居中就显式传 align=\"center\"。 */\n.dshpc-picker__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}\n.dshpc-picker__trigger--center .dshpc-picker__label{text-align:center}\n.dshpc-picker__caret{flex:none;color:var(--dshpc-fg-3)}\n.dshpc-picker__icon{display:inline-flex;flex:none;color:var(--dshpc-fg-2)}\n.dshpc-picker__option-icon{display:inline-flex;flex:none;color:var(--dshpc-fg-2)}\n/* 下拉面板只留定位 / 滚动 / 字号:底色·描边·圆角·阴影来自 panel.css 的 menu 档。 */\n.dshpc-picker__menu{\n z-index:var(--dshpc-z-popmenu);max-height:280px;overflow:auto;padding:4px;\n /* 菜单经 FloatingPortal 挂到 body,脱离 .dshpc-picker,须显式字号,否则继承 body 的大字号 */\n font-size:13px;line-height:20px;\n}\n/* 尺寸档(与 Field 的 sm/md/lg 对应)。 */\n.dshpc-picker__trigger--sm{height:24px;font-size:12px}\n.dshpc-picker__trigger--lg{height:32px}\n/* 键盘游标所在项(无 hover 也要看得见)。 */\n.dshpc-picker__option[data-active='true']{background:var(--dshpc-surface-sunken);outline:1px solid var(--dshpc-border)}\n.dshpc-picker__option--clear{color:var(--dshpc-fg-3)}\n.dshpc-picker__search{\n width:100%;height:28px;margin-bottom:4px;padding:0 8px;box-sizing:border-box;\n color:var(--dshpc-fg);background:var(--dshpc-surface-sunken);\n border:1px solid var(--dshpc-border-faint);border-radius:var(--dshpc-radius-md);outline:none;\n}\n.dshpc-picker__group-label{\n padding:6px 8px 2px;color:var(--dshpc-fg-3);font-size:11px;\n}\n.dshpc-picker__option{\n display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:var(--dshpc-radius-sm);cursor:pointer;\n color:var(--dshpc-fg);white-space:nowrap;\n}\n.dshpc-picker__option:hover{background:var(--dshpc-surface-sunken)}\n.dshpc-picker__option--active{background:var(--dshpc-open-bg);color:var(--dshpc-business)}\n.dshpc-picker__option--disabled{color:var(--dshpc-fg-dim);cursor:not-allowed}\n/* 选项文字吃掉剩余宽度:超长省略号(配合 MarqueeText hover 跑马灯),不撑宽菜单。 */\n.dshpc-picker__option-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.dshpc-picker__tick{width:12px;color:var(--dshpc-business)}\n.dshpc-picker__empty{padding:8px;color:var(--dshpc-fg-3);text-align:center}\n.dshpc-picker__degraded{\n padding:6px 8px;margin-bottom:4px;border-radius:var(--dshpc-radius-sm);\n color:var(--dshpc-warning-label);background:color-mix(in srgb,var(--dshpc-warning) 12%,transparent);\n font-size:11px;\n}\n.dshpc-picker__row{display:flex;align-items:center;gap:8px}\n";
4
4
  //# sourceMappingURL=picker-css.generated.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"picker-css.generated.js","sourceRoot":"","sources":["../../src/ui/picker-css.generated.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,qEAAqE;AACrE,MAAM,CAAC,MAAM,UAAU,GAAG,uqGAAuqG,CAAA"}
1
+ {"version":3,"file":"picker-css.generated.js","sourceRoot":"","sources":["../../src/ui/picker-css.generated.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,qEAAqE;AACrE,MAAM,CAAC,MAAM,UAAU,GAAG,ulGAAulG,CAAA"}