dsh-plugin-core 0.1.0 → 0.1.3

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 (62) hide show
  1. package/README.md +28 -23
  2. package/dist/design/tokens-css.d.ts +1 -1
  3. package/dist/design/tokens-css.d.ts.map +1 -1
  4. package/dist/design/tokens-css.js +2 -0
  5. package/dist/design/tokens-css.js.map +1 -1
  6. package/dist/explorer/ExplorerPanel.d.ts.map +1 -1
  7. package/dist/explorer/ExplorerPanel.js +1 -1
  8. package/dist/explorer/ExplorerPanel.js.map +1 -1
  9. package/dist/explorer/index.d.ts +1 -1
  10. package/dist/explorer/index.d.ts.map +1 -1
  11. package/dist/explorer/index.js +1 -1
  12. package/dist/explorer/index.js.map +1 -1
  13. package/dist/explorer/preview/index.d.ts.map +1 -1
  14. package/dist/explorer/preview/index.js +2 -1
  15. package/dist/explorer/preview/index.js.map +1 -1
  16. package/dist/explorer/types.d.ts +0 -8
  17. package/dist/explorer/types.d.ts.map +1 -1
  18. package/dist/explorer/types.js +1 -32
  19. package/dist/explorer/types.js.map +1 -1
  20. package/dist/ui/Modal.js +1 -1
  21. package/dist/ui/Modal.js.map +1 -1
  22. package/dist/ui/Toast.d.ts.map +1 -1
  23. package/dist/ui/Toast.js +1 -3
  24. package/dist/ui/Toast.js.map +1 -1
  25. package/dist/ui/card-css.d.ts +0 -1
  26. package/dist/ui/card-css.d.ts.map +1 -1
  27. package/dist/ui/card-css.js +2 -12
  28. package/dist/ui/card-css.js.map +1 -1
  29. package/dist/ui/chip-css.d.ts +2 -0
  30. package/dist/ui/chip-css.d.ts.map +1 -0
  31. package/dist/ui/chip-css.js +28 -0
  32. package/dist/ui/chip-css.js.map +1 -0
  33. package/dist/ui/controls-css.d.ts +1 -1
  34. package/dist/ui/controls-css.d.ts.map +1 -1
  35. package/dist/ui/controls-css.js +1 -21
  36. package/dist/ui/controls-css.js.map +1 -1
  37. package/dist/ui/css.d.ts.map +1 -1
  38. package/dist/ui/css.js +2 -1
  39. package/dist/ui/css.js.map +1 -1
  40. package/dist/ui/feedback-css.d.ts +1 -1
  41. package/dist/ui/feedback-css.d.ts.map +1 -1
  42. package/dist/ui/feedback-css.js +9 -0
  43. package/dist/ui/feedback-css.js.map +1 -1
  44. package/dist/ui/official.d.ts +31 -0
  45. package/dist/ui/official.d.ts.map +1 -0
  46. package/dist/ui/official.js +42 -0
  47. package/dist/ui/official.js.map +1 -0
  48. package/dist/utils/index.d.ts +1 -0
  49. package/dist/utils/index.d.ts.map +1 -1
  50. package/dist/utils/index.js +1 -0
  51. package/dist/utils/index.js.map +1 -1
  52. package/dist/utils/path.d.ts +17 -0
  53. package/dist/utils/path.d.ts.map +1 -0
  54. package/dist/utils/path.js +41 -0
  55. package/dist/utils/path.js.map +1 -0
  56. package/docs/README.md +1 -0
  57. package/docs/design/architecture.md +10 -8
  58. package/docs/design/features/explorer.md +6 -3
  59. package/docs/design/features/ui.md +4 -0
  60. package/docs/design/structure.md +152 -0
  61. package/docs/requirements.md +13 -12
  62. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  export declare const SEGMENTED_CSS = "\n/* \u2500\u2500 \u5206\u6BB5\u63A7\u4EF6\uFF08\u6ED1\u52A8\u5757\uFF09P1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \u7ED3\u6784\u4E00\u5957 + \u4E24\u4E2A\u53D7\u63A7\u8F74\uFF1Asize(sm|md|lg) \u00D7 variant(default|inset)\u3002\n \u53D8\u4F53**\u53EA\u8986\u76D6\u4E24\u4E2A\u989C\u8272\u53D8\u91CF**\uFF08--seg-track \u8F68\u9053\u5E95 / --seg-thumb \u9009\u4E2D\u5757\uFF09\uFF0C\n \u8FD9\u6B63\u662F\u300C\u540C\u4E00\u4EFD\u6837\u5F0F\u3001\u53EA\u91CD\u8F7D\u989C\u8272\u300D\u7684\u843D\u5730\u5F62\u6001\u3002 */\n/* \u4E24\u5957\u57FA\u7840\u6837\u5F0F\uFF082026-10-01 \u7528\u6237\u62CD\u677F\uFF1A\u4FDD\u7559\u300C\u7EAF\u9ED1\u9762\u300D\u4E0E\u300C\u7070\u5E95\u9762\u300D\u4E24\u5957\uFF0C\u4E0D\u53EF\u5408\u5E76\uFF09\uFF1A\n - default = \u7EAF\u9ED1\u9762\uFF1A\u8F68\u9053=\u7B2C\u4E8C\u5C42\u9762 + \u5916\u63CF\u8FB9\uFF0C\u9009\u4E2D=\u4EAE\u7247\u5E95\uFF1B\n - inset = \u7070\u5E95\u9762\uFF1A\u6284\u300C\u7248\u672C\u300D\u5F00\u5173\u89C2\u611F\uFF08\u8F68\u9053=\u4EA4\u4E92\u7070 hover \u5E95\u3001\u65E0\u5916\u63CF\u8FB9\u3001\u9009\u4E2D=\u4EAE\u7247\u5E95\uFF09\uFF0C\u7528\u6237\u89C9\u5F97\u6BD4\u539F\u7070\u5E95\u90A3\u5957\u597D\u770B\u3002\n \u26A0\uFE0F \u9AD8\u5EA6\u5BF9\u9F50\u89C4\u5219\uFF082026-10-01 \u7528\u6237\u62CD\u677F\uFF0C\u540C\u65E5\u4FEE\u6B63 +2\uFF09\uFF1A\u6709\u8FB9 / \u65E0\u8FB9\u603B\u9AD8\u5FC5\u987B == \u63A7\u4EF6 token\uFF0C\u8FB9\u6846\u5728\u5185\u90E8\u8865\u56DE\uFF0C\u4E0D\u8BB8\u989D\u5916\u6491\u9AD8\u3002\n \u51E0\u4F55 = \u6BB5\u9AD8 = token \u2212 6px\uFF08\u4E0A\u4E0B\u5404 2px padding + 1px \u8FB9\u6846\uFF09\uFF1Bdefault \u771F\u8FB9\u6846 1px + padding 2px\uFF0C\n inset \u65E0\u8FB9\u6846\u6545 padding \u6536 3px \u628A\u7F3A\u7684 1px \u8865\u56DE\uFF0C\u4E24\u79CD\u5916\u89C2\u603B\u9AD8\u90FD == token\uFF0824/28/32\uFF09\uFF0C\u4E0D\u518D\u591A +2px\u3002\n \u4EE5\u540E Button / Input \u7684\u6709\u8FB9 / \u65E0\u8FB9\u540C\u6B64\u89C4\u5219\u3002 */\n.dsh-tdt-seg{display:inline-flex;align-items:center;gap:2px;padding:2px;border-radius:var(--tdt-radius-md);background:var(--seg-track);}\n/* \u9009\u4E2D\u7247 = --tdt-solid\uFF08\u4EAE=\u767D\u7247 / \u6697=\u9ED1\u7247\uFF0C2026-10-18 \u5BF9\u9F50\u771F\u5B9E\u63D2\u4EF6\u622A\u56FE\uFF09\u3002\n \u539F\u5148\u53D6 surface-raised \u21D2 \u4E0E\u5361\u7247\u5E95\uFF08\u540C\u4E3A bg-layer-1\uFF09\u540C\u8272\uFF0C\u9009\u4E2D\u7247\u5728\u5361\u4E0A\u9690\u5F62\u3001\u53EA\u5269\u9634\u5F71\u5708\u3002 */\n.dsh-tdt-seg--default{--seg-track:var(--tdt-surface-2);--seg-thumb:var(--tdt-solid);border:1px solid var(--tdt-border);}\n.dsh-tdt-seg--inset{--seg-track:var(--tdt-hover);--seg-thumb:var(--tdt-solid);border:0;padding:3px;}\n\n.dsh-tdt-seg__item{appearance:none;display:inline-flex;align-items:center;gap:4px;box-sizing:border-box;\n height:calc(var(--tdt-control-h-sm) - 6px);padding:0 12px;border:0;border-radius:var(--tdt-radius-sm);\n background:transparent;color:var(--tdt-fg-2);font-family:inherit;font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);\n font-weight:400;white-space:nowrap;cursor:pointer;\n transition:color var(--tdt-dur-fast) var(--tdt-ease),background-color var(--tdt-dur-fast) var(--tdt-ease),box-shadow var(--tdt-dur-fast) var(--tdt-ease);}\n.dsh-tdt-seg--md .dsh-tdt-seg__item{height:calc(var(--tdt-control-h-md) - 6px);}\n.dsh-tdt-seg--lg .dsh-tdt-seg__item{height:calc(var(--tdt-control-h-lg) - 6px);}\n.dsh-tdt-seg__item:hover:not([aria-pressed='true']):not(:disabled){color:var(--tdt-fg);}\n.dsh-tdt-seg__item[aria-pressed='true']{background:var(--seg-thumb);box-shadow:var(--tdt-shadow-raised);color:var(--tdt-fg);font-weight:600;}\n.dsh-tdt-seg__item:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:-2px;}\n.dsh-tdt-seg__item:disabled{cursor:default;opacity:.4;}\n\n/* \u6BB5\u5185\u89D2\u6807\uFF08\u5982\u300C\u5F02\u5E38\u300D\u7684\u6570\u91CF\uFF09\uFF1A\u8BED\u4E49\u8272\u5B9E\u9762 + \u53CD\u767D\u5B57\uFF0C0 \u7531\u7EC4\u4EF6\u4FA7\u4E0D\u6E32\u67D3\u3002\n \u26A0\uFE0F **\u5FC5\u987B\u662F\u6B63\u5706**\uFF08\u7528\u6237 2026-10-03\uFF1A\u300C\u591A\u4F4D\u6570\u7ED9\u5B83\u6491\u5F00\u4E86\uFF0C\u90A3\u4E0D\u662F\u5706\u7684\u5C31\u6CA1\u529E\u6CD5\u4E86\u300D\uFF09\uFF1A\n \u56FA\u5B9A 16\u00D716 + border-radius:50% + padding:0 + overflow:hidden \u21D2 \u4E00\u4F4D\u6570 / \u4E24\u4F4D\u6570\u90FD\u662F\u540C\u4E00\u4E2A\u5706\uFF0C\n \u6570\u5B57\u7F29\u5230 10px \u585E\u5F97\u4E0B\uFF1B\u4E0D\u518D\u7528 min-width + \u5DE6\u53F3 padding\uFF08\u90A3\u4F1A\u8BA9\u5BBD\u5EA6\u968F\u4F4D\u6570\u589E\u957F\u53D8\u692D\u5706\uFF09\u3002 */\n.dsh-tdt-seg__badge{display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:16px;height:16px;padding:0;overflow:hidden;\n border-radius:50%;background:var(--tdt-danger);color:var(--tdt-on-signal);\n font-size:10px;line-height:16px;font-weight:500;font-variant-numeric:tabular-nums;}\n\n/* \u6BB5\u5185\u4E2D\u6027\u8BA1\u6570\uFF08\u5982\u7B5B\u9009\u6761\u300C\u5168\u90E8 11\u300D\uFF09\uFF1A**\u7EAF\u6587\u5B57\uFF0C\u65E0\u5E95\u3001\u65E0\u8FB9\u3001\u65E0\u5706\u89D2**\uFF08\u5BF9\u9F50 task-ledger 2026-10-18\n \u62CD\u677F\u7684 .dtl-seg__num\uFF1A\u5706\u5708\u53D6\u4E86\u3001\u5B57\u518D\u5C0F\u70B9\uFF09\uFF1B0 \u7531\u7EC4\u4EF6\u4FA7\u4E0D\u6E32\u67D3\u3002danger \u89D2\u6807\u4ECD\u8D70 __badge\u3002 */\n.dsh-tdt-seg__count{display:inline;flex:none;margin-left:3px;padding:0;border:0;border-radius:0;\n background:none;color:var(--tdt-fg-3);font-size:10px;line-height:1;font-weight:400;font-variant-numeric:tabular-nums;}\n\n/* block\uFF1A\u6491\u6EE1\u7236\u5BBD\uFF08\u8868\u5355\u884C\u7528\uFF09\uFF0C\u5404\u6BB5\u7B49\u5206 */\n.dsh-tdt-seg--block{display:flex;width:100%;}\n.dsh-tdt-seg--block .dsh-tdt-seg__item{flex:1 1 auto;justify-content:center;}\n\n/* weekday\uFF1A\u661F\u671F\u591A\u9009\u65B9\u5757\uFF08\u4EFB\u52A1\u65B0\u589E / \u7F16\u8F91\u9875\uFF09\u3002\u57FA\u7840\u63D2\u4EF6\u7684\u7279\u6B8A\u5316\u5B9A\u5236\uFF08\u7528\u6237 2026-10-01 \u660E\u786E\u8981\u6C42\uFF1A\n \u539F WeekdayPicker \u5373\u300C\u84DD\u5E95 + \u8FD1\u4F3C\u65B9\u5F62\u300D\uFF0C\u7EDF\u4E00\u5230 Segmented \u540E\u7531\u8FD9\u4E00\u4FEE\u9970\u7C7B\u8865\u56DE\u4E24\u5904\u5DEE\u5F02\uFF09\uFF1A\n - \u6BCF\u683C\u505A\u6210\u6B63\u65B9\u5F62\uFF08\u5BBD = \u6BB5\u9AD8\uFF09\uFF1B\n - \u9009\u4E2D\u6001\u7528\u54C1\u724C\u84DD\uFF08--tdt-business\uFF09\u3001\u53CD\u767D\u5B57\uFF0C\u8F68\u9053\u7528 hover \u7070\uFF08\u4E0E\u539F\u81EA\u7ED8\u8F68\u9053\u4E00\u81F4\uFF09\u3002\n \u76AE\u80A4\u96C6\u4E2D\u5728\u6B64\u3001\u4E0D\u5185\u8054\uFF1B\u8C03\u7528\u70B9\u53EA\u6302 .dsh-tdt-seg--weekday \u4E00\u4E2A\u4FEE\u9970\u7C7B\uFF0C\u7B26\u5408\u300C\u76AE\u80A4\u53EA\u5728 controls-css\u300D\u7684\u89C4\u77E9\u3002 */\n/* weekday\uFF1A\u661F\u671F\u591A\u9009\u65B9\u5757\uFF08\u4EFB\u52A1\u65B0\u589E / \u7F16\u8F91\u9875\uFF09\u3002\u57FA\u7840\u63D2\u4EF6\u7684\u7279\u6B8A\u5316\u5B9A\u5236\uFF08\u7528\u6237 2026-10-01 \u660E\u786E\u8981\u6C42\uFF1A\n \u539F WeekdayPicker \u5373\u300C\u84DD\u5E95 + \u8FD1\u4F3C\u65B9\u5F62\u300D\uFF0C\u7EDF\u4E00\u5230 Segmented \u540E\u7531\u8FD9\u4E00\u4FEE\u9970\u7C7B\u8865\u56DE\u4E24\u5904\u5DEE\u5F02\uFF09\uFF1A\n - \u6BCF\u683C\u505A\u6210\u6B63\u65B9\u5F62\uFF08\u5BBD = \u6BB5\u9AD8\uFF09\uFF1B\n - \u9009\u4E2D\u6001\u7528\u54C1\u724C\u84DD\uFF08--tdt-business\uFF09\u3001\u53CD\u767D\u5B57\uFF0C\u8F68\u9053\u7528 hover \u7070\uFF08\u4E0E\u539F\u81EA\u7ED8\u8F68\u9053\u4E00\u81F4\uFF09\u3002\n 2026-10-18 \u7528\u6237\u91CD\u7533\uFF08\u5BF9\u9F50\u771F\u5B9E\u622A\u56FE\uFF09\uFF1A**\u65E0\u5916\u63CF\u8FB9**\uFF08\u4E0D\u7BA1\u6302\u54EA\u4E2A variant\uFF0C\u8FD9\u91CC\u4E00\u5F8B\u64A4\u8FB9\uFF09\uFF0C\n \u4E14\u65B9\u5757\u4E4B\u95F4\u8981\u6709\u95F4\u8DDD\uFF08gap 6px\uFF0C\u4E0D\u518D 2px \u6324\u6210\u4E00\u5768\uFF09\u3002 */\n.dsh-tdt-seg--weekday{--seg-track:var(--tdt-hover);gap:6px;border:0;padding:3px;}\n.dsh-tdt-seg--weekday .dsh-tdt-seg__item{width:calc(var(--tdt-control-h-lg) - 6px);padding:0;justify-content:center;}\n.dsh-tdt-seg--weekday .dsh-tdt-seg__item[aria-pressed='true']{background:var(--tdt-business);color:var(--tdt-fg-inverse);box-shadow:var(--tdt-shadow-raised);}\n\n@media (prefers-reduced-motion: reduce){.dsh-tdt-seg__item{transition:none;}}\n";
2
- export declare const BUTTON_CSS = "\n/* \u2500\u2500 \u6309\u94AE / \u56FE\u6807\u94AE P2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \u4E0E Segmented \u540C\u4E00\u6761\u9AD8\u5EA6\u7EAA\u5F8B\uFF1A--tdt-control-h-sm(24) / -md(28) / -lg(32)\uFF0C\n \u6709\u8FB9\u6846\u7684 variant \u7528 1px \u771F\u8FB9\u6846 + \u5185\u90E8 padding \u8865\u56DE\uFF0C**\u6709\u8FB9 / \u65E0\u8FB9\u540C\u9AD8**\u3002\n variant \u53EA\u6362\u989C\u8272\uFF0C\u7ED3\u6784 / \u5C3A\u5BF8 / \u4EA4\u4E92\u53EA\u6B64\u4E00\u4EFD\u3002 */\n.dsh-tdt-btn{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:var(--tdt-space-1);\n box-sizing:border-box;border:1px solid transparent;border-radius:var(--tdt-radius-md);\n background:transparent;color:var(--tdt-fg);font-family:inherit;font-weight:500;white-space:nowrap;cursor:pointer;\n transition:background-color var(--tdt-dur-fast) var(--tdt-ease),border-color var(--tdt-dur-fast) var(--tdt-ease),color var(--tdt-dur-fast) var(--tdt-ease),opacity var(--tdt-dur-fast) var(--tdt-ease);}\n.dsh-tdt-btn--sm{height:var(--tdt-control-h-sm);padding:0 10px;font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);}\n.dsh-tdt-btn--md{height:var(--tdt-control-h-md);padding:0 12px;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-btn--lg{height:var(--tdt-control-h-lg);padding:0 14px;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-btn__icon{display:inline-flex;align-items:center;flex:none;}\n\n.dsh-tdt-btn--primary{background:var(--tdt-accent);color:var(--tdt-fg-inverse);}\n.dsh-tdt-btn--primary:hover:not(:disabled){opacity:.9;}\n.dsh-tdt-btn--outline{background:var(--tdt-surface-1);border-color:var(--tdt-border-strong);color:var(--tdt-fg);}\n.dsh-tdt-btn--outline:hover:not(:disabled){background:var(--tdt-hover);}\n.dsh-tdt-btn--ghost{color:var(--tdt-fg-2);}\n.dsh-tdt-btn--ghost:hover:not(:disabled){background:var(--tdt-hover);color:var(--tdt-fg);}\n.dsh-tdt-btn--danger{background:var(--tdt-danger);color:var(--tdt-on-signal);}\n.dsh-tdt-btn--danger:hover:not(:disabled){opacity:.9;}\n/* danger-ink\uFF1A\u7EA2\u5B57\u63CF\u8FB9\uFF08\u7834\u574F\u6027\u6B21\u8981\u64CD\u4F5C\uFF0C\u5982\u5361\u7247\u4E0A\u7684\u300C\u5220\u9664\u300D\uFF09\uFF0C\u6302\u4E0E outline \u7EC4\u5408\u7684\u4FEE\u9970\u7C7B */\n.dsh-tdt-btn--danger-ink{border-color:var(--tdt-danger);color:var(--tdt-danger);}\n.dsh-tdt-btn--danger-ink:hover:not(:disabled){background:color-mix(in srgb,var(--tdt-danger) 10%,transparent);color:var(--tdt-danger);}\n/* link\uFF1A\u884C\u5185\u6587\u5B57\u94FE\u63A5\u578B\uFF08\u4F1A\u8BDD / \u4EA7\u51FA\u6587\u4EF6\u540D\uFF09\uFF0C\u65E0\u5E95\u65E0\u8FB9\u3001\u54C1\u724C\u84DD\u3001hover \u4E0B\u5212\u7EBF */\n.dsh-tdt-btn--link{height:auto;padding:0;border:0;background:none;color:var(--tdt-link);font-weight:400;text-align:left;}\n.dsh-tdt-btn--link:hover:not(:disabled){background:none;color:var(--tdt-link);text-decoration:underline;}\n.dsh-tdt-btn:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:2px;}\n.dsh-tdt-btn:disabled{cursor:default;opacity:.5;}\n\n.dsh-tdt-iconbtn{appearance:none;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;\n border:1px solid transparent;border-radius:var(--tdt-radius-sm);background:transparent;color:var(--tdt-fg-2);\n font-family:inherit;cursor:pointer;flex:none;\n transition:background-color var(--tdt-dur-fast) var(--tdt-ease),border-color var(--tdt-dur-fast) var(--tdt-ease),color var(--tdt-dur-fast) var(--tdt-ease),opacity var(--tdt-dur-fast) var(--tdt-ease);}\n.dsh-tdt-iconbtn--sm{width:var(--tdt-control-h-sm);height:var(--tdt-control-h-sm);font-size:var(--tdt-font-sm);}\n.dsh-tdt-iconbtn--md{width:var(--tdt-control-h-md);height:var(--tdt-control-h-md);font-size:var(--tdt-font-md);}\n.dsh-tdt-iconbtn--lg{width:var(--tdt-control-h-lg);height:var(--tdt-control-h-lg);font-size:var(--tdt-font-md);}\n.dsh-tdt-iconbtn--plain{color:var(--tdt-fg-2);}\n.dsh-tdt-iconbtn--outline{background:var(--tdt-surface-1);border-color:var(--tdt-border);color:var(--tdt-fg-2);}\n.dsh-tdt-iconbtn--danger{color:var(--tdt-danger);}\n.dsh-tdt-iconbtn:hover:not(:disabled){background:var(--tdt-hover);color:var(--tdt-fg);}\n.dsh-tdt-iconbtn--danger:hover:not(:disabled){background:var(--tdt-hover);color:var(--tdt-danger);}\n.dsh-tdt-iconbtn:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:2px;}\n.dsh-tdt-iconbtn:disabled{cursor:default;opacity:.4;}\n\n/* \u2500\u2500 \u4EA7\u51FA\u7269\u300C\u56FE\u6807 chip\u300DP2\uFF1A28\u00D728 \u65B9\u89D2\u5C0F\u5E95\u677F + \u5B98\u65B9\u6587\u4EF6\u7C7B\u578B\u56FE\u6807 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \u7528\u9014\uFF1A\u4EA7\u51FA\u7269\u5217\u8868\u91CC**\u53EA\u7ED9\u56FE\u6807**\u7684\u5C0F\u6309\u94AE\uFF08\u5361\u7247\u300C\u6267\u884C\u8BB0\u5F55\u300D\u9762\u677F\u3001\u6267\u884C\u8BB0\u5F55\u603B\u67E5\u8BE2\u9875\u3001\u5C55\u5F00\u533A\u90FD\u6302\u5B83\uFF09\u3002\n \u26A0\uFE0F \u5E95\u677F**\u5FC5\u987B\u8D70 class**\u2014\u2014inline background \u4F1A\u76D6\u6389 :hover\uFF08\u7528\u6237 2026-10-03 \u8E29\u8FC7\uFF09\u3002\n hover \u7528 \u300C--tdt-chip-bg-hover\u300D\uFF1A\u6D45\u8272\u66F4\u6DF1\u3001\u6697\u8272\u66F4\u4EAE\uFF08\u4E24\u7AEF\u90FD\u662F\u300C\u66F4\u660E\u663E\u300D\uFF09\uFF1B\u4E0D\u8BB8\u62FF\n \u300C--tdt-plate-hover\u300D \u9876\u2014\u2014\u6697\u8272\u4E0B\u53CD\u800C\u66F4\u6DE1\uFF0C\u9F20\u6807\u79FB\u4E0A\u53BB\u5E95\u677F\u5C31\u6D88\u5931\u4E86\u3002\n \u2705 **\u5168\u7AD9\u552F\u4E00\u5B9E\u73B0**\uFF082026-10-04 \u6536\u7F16\uFF09\uFF1A\u6B64\u524D\u5361\u7247\u9762\u677F\u4E0E\u6267\u884C\u8BB0\u5F55\u9875\u5404\u5199\u4E00\u4EFD**\u540C\u540D\u4E0D\u540C\u76AE**\u7684\n \u300C.dsh-tdt-rec-out\u300D\uFF0C\u4E24\u4EFD CSS \u90FD\u6CE8\u5165\u540C\u4E00\u9875\u9762 \u21D2 \u8C01\u540E\u6CE8\u518C\u8C01\u751F\u6548\u3001\u4E92\u76F8\u6C61\u67D3\uFF1B\u73B0\u5DF2\u6536\u6210\u8FD9\u4E00\u4EFD\u3002 */\n.dsh-tdt-chip{appearance:none;-webkit-appearance:none;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;\n width:var(--tdt-control-h-md);height:var(--tdt-control-h-md);padding:0;border:none;border-radius:var(--tdt-radius-sm);\n background:transparent;color:var(--tdt-fg-2);font-family:inherit;line-height:0;cursor:pointer;\n transition:background-color var(--tdt-dur) var(--tdt-ease),color var(--tdt-dur) var(--tdt-ease);}\n/* \u5E95\u677F**\u5E73\u65F6\u900F\u660E\u3001\u9F20\u6807\u79FB\u4E0A\u53BB\u624D\u6D6E\u51FA\u6765**\uFF08\u7528\u6237 2026-10-04\uFF1A\u300C\u90A3\u4E2A\u5E26\u5E95\u8272\u7684\u6846\uFF0C\u9F20\u6807\u79FB\u4E0A\u53BB\u624D\u6709\u300D\uFF09\u3002\n \u53EA\u7ED9\u56FE\u6807\u3001\u6CA1\u6709\u6587\u5B57\u53EF\u8BFB \u21D2 hover \u7528\u66F4\u660E\u663E\u7684\u90A3\u6863\uFF08\u6D45\u8272\u66F4\u6DF1\u3001\u6697\u8272\u66F4\u4EAE\uFF0C\u4E24\u7AEF\u90FD\u662F\u300C\u66F4\u660E\u663E\u300D\uFF09\u3002 */\n.dsh-tdt-chip:hover:not(:disabled){background:var(--tdt-chip-bg-hover);}\n.dsh-tdt-chip:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:1px;}\n/* \u4E0D\u53EF\u70B9\uFF08\u6CA1\u6709\u4F1A\u8BDD / \u9884\u89C8\u9762\u672A\u5C31\u4F4D\uFF09\uFF1A\u6CA1\u6709\u5E95\u677F\u3001\u6CA1\u6709\u624B\u6307\uFF0C\u522B\u7ED9\u5047\u5165\u53E3 */\n.dsh-tdt-chip:disabled{cursor:default;background:transparent;color:var(--tdt-fg-3);}\n/* \u6587\u5B57\u578B chip\uFF08\u300C\u2026\u300D / \u300C+N\u300D\uFF09\uFF1A\u4E0D\u56FA\u5B9A\u65B9\u5BBD\uFF0C\u6309\u5185\u5BB9\u6491\u5F00 */\n.dsh-tdt-chip--label{width:auto;padding:0 6px;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n\n/* \u2500\u2500 \u884C\u5F0F\u6587\u4EF6\u6309\u94AE\uFF08\u56FE\u6807 + \u6587\u4EF6\u540D\uFF09P2\uFF1A**\u5168\u7AD9\u552F\u4E00\u5B9E\u73B0**\uFF082026-10-04 \u6536\u7F16\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \u7528\u9014\uFF1A\u300C\u4EA7\u51FA\u7269 / \u9644\u4EF6\u300D\u90A3\u79CD**\u4E00\u884C\u4E00\u4E2A\u6587\u4EF6**\u7684\u6E05\u5355\u9879\uFF08\u57FA\u7840\u4FE1\u606F\u53F3\u680F\u4EA7\u51FA\u7269\u6E05\u5355\u3001\u9644\u4EF6\u533A\u3001\n \u6267\u884C\u8BB0\u5F55\u9875\u7684\u5C55\u5F00\u533A\uFF09\u3002\u5E73\u65F6\u900F\u660E\u3001**\u9F20\u6807\u79FB\u4E0A\u53BB\u624D\u51FA\u6D45\u5E95**\uFF08\u6CBF\u7528\u7528\u6237 2026-10-03 \u5B9A\u7684\u89C2\u611F\uFF09\u3002\n \u4E24\u4E2A\u5F62\u6001\u4FEE\u9970\u7C7B\uFF1A\n --block \u6491\u6EE1\u7236\u5BBD\uFF08\u6E05\u5355\u91CC\u4E00\u9879\u4E00\u884C\uFF09\n --inline \u5185\u5BB9\u5BBD\uFF08\u8DDF\u5728\u6587\u5B57\u540E\u5934\uFF0C\u5982\u9644\u4EF6\u884C\uFF09\n \u6536\u7F16\u539F\u56E0\uFF1A\u8FD9\u4EFD\u76AE\u80A4\u6B64\u524D\u53EA\u5199\u5728 task-list.tsx \u7684 TASK_LIST_CSS \u91CC\uFF08\u65E7\u540D .dsh-tdt-info-out\uFF09\uFF0C\n \u6267\u884C\u8BB0\u5F55\u9875\u5C55\u5F00\u533A\u8981\u7528\u540C\u4E00\u79CD\u89C2\u611F \u21D2 \u4E0A\u63D0\u57FA\u7840\u5C42\uFF0C\u907F\u514D\u518D\u51FA\u73B0\u300C\u5404\u5199\u4E00\u4EFD\u5916\u89C2\u300D\uFF08\u540C\u540D\u4E0D\u540C\u76AE\u7684\u5751\u521A\u8E29\u8FC7\uFF09\u3002 */\n.dsh-tdt-filechip{appearance:none;-webkit-appearance:none;border:0;border-radius:var(--tdt-radius-xs);\n background:transparent;color:var(--tdt-fg);font:inherit;text-align:left;cursor:pointer;min-width:0;\n transition:background-color var(--tdt-dur) var(--tdt-ease);}\n.dsh-tdt-filechip:hover:not(:disabled){background:var(--tdt-chip-bg);}\n.dsh-tdt-filechip:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:1px;}\n.dsh-tdt-filechip:disabled{cursor:default;background:transparent;color:var(--tdt-fg-3);}\n.dsh-tdt-filechip--block{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;\n padding:4px 6px;font-size:var(--tdt-font-xs);}\n.dsh-tdt-filechip--inline{display:inline-flex;align-items:center;gap:4px;padding:2px 6px;font-size:var(--tdt-font-sm);}\n\n@media (prefers-reduced-motion: reduce){.dsh-tdt-btn,.dsh-tdt-iconbtn,.dsh-tdt-chip,.dsh-tdt-filechip{transition:none;}}\n";
2
+ export declare const BUTTON_CSS = "\n/* \u2500\u2500 \u6309\u94AE / \u56FE\u6807\u94AE P2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \u4E0E Segmented \u540C\u4E00\u6761\u9AD8\u5EA6\u7EAA\u5F8B\uFF1A--tdt-control-h-sm(24) / -md(28) / -lg(32)\uFF0C\n \u6709\u8FB9\u6846\u7684 variant \u7528 1px \u771F\u8FB9\u6846 + \u5185\u90E8 padding \u8865\u56DE\uFF0C**\u6709\u8FB9 / \u65E0\u8FB9\u540C\u9AD8**\u3002\n variant \u53EA\u6362\u989C\u8272\uFF0C\u7ED3\u6784 / \u5C3A\u5BF8 / \u4EA4\u4E92\u53EA\u6B64\u4E00\u4EFD\u3002 */\n.dsh-tdt-btn{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:var(--tdt-space-1);\n box-sizing:border-box;border:1px solid transparent;border-radius:var(--tdt-radius-md);\n background:transparent;color:var(--tdt-fg);font-family:inherit;font-weight:500;white-space:nowrap;cursor:pointer;\n transition:background-color var(--tdt-dur-fast) var(--tdt-ease),border-color var(--tdt-dur-fast) var(--tdt-ease),color var(--tdt-dur-fast) var(--tdt-ease),opacity var(--tdt-dur-fast) var(--tdt-ease);}\n.dsh-tdt-btn--sm{height:var(--tdt-control-h-sm);padding:0 10px;font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);}\n.dsh-tdt-btn--md{height:var(--tdt-control-h-md);padding:0 12px;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-btn--lg{height:var(--tdt-control-h-lg);padding:0 14px;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-btn__icon{display:inline-flex;align-items:center;flex:none;}\n\n.dsh-tdt-btn--primary{background:var(--tdt-accent);color:var(--tdt-fg-inverse);}\n.dsh-tdt-btn--primary:hover:not(:disabled){opacity:.9;}\n.dsh-tdt-btn--outline{background:var(--tdt-surface-1);border-color:var(--tdt-border-strong);color:var(--tdt-fg);}\n.dsh-tdt-btn--outline:hover:not(:disabled){background:var(--tdt-hover);}\n.dsh-tdt-btn--ghost{color:var(--tdt-fg-2);}\n.dsh-tdt-btn--ghost:hover:not(:disabled){background:var(--tdt-hover);color:var(--tdt-fg);}\n.dsh-tdt-btn--danger{background:var(--tdt-danger);color:var(--tdt-on-signal);}\n.dsh-tdt-btn--danger:hover:not(:disabled){opacity:.9;}\n/* danger-ink\uFF1A\u7EA2\u5B57\u63CF\u8FB9\uFF08\u7834\u574F\u6027\u6B21\u8981\u64CD\u4F5C\uFF0C\u5982\u5361\u7247\u4E0A\u7684\u300C\u5220\u9664\u300D\uFF09\uFF0C\u6302\u4E0E outline \u7EC4\u5408\u7684\u4FEE\u9970\u7C7B */\n.dsh-tdt-btn--danger-ink{border-color:var(--tdt-danger);color:var(--tdt-danger);}\n.dsh-tdt-btn--danger-ink:hover:not(:disabled){background:color-mix(in srgb,var(--tdt-danger) 10%,transparent);color:var(--tdt-danger);}\n/* link\uFF1A\u884C\u5185\u6587\u5B57\u94FE\u63A5\u578B\uFF08\u4F1A\u8BDD / \u4EA7\u51FA\u6587\u4EF6\u540D\uFF09\uFF0C\u65E0\u5E95\u65E0\u8FB9\u3001\u54C1\u724C\u84DD\u3001hover \u4E0B\u5212\u7EBF */\n.dsh-tdt-btn--link{height:auto;padding:0;border:0;background:none;color:var(--tdt-link);font-weight:400;text-align:left;}\n.dsh-tdt-btn--link:hover:not(:disabled){background:none;color:var(--tdt-link);text-decoration:underline;}\n.dsh-tdt-btn:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:2px;}\n.dsh-tdt-btn:disabled{cursor:default;opacity:.5;}\n\n.dsh-tdt-iconbtn{appearance:none;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;\n border:1px solid transparent;border-radius:var(--tdt-radius-sm);background:transparent;color:var(--tdt-fg-2);\n font-family:inherit;cursor:pointer;flex:none;\n transition:background-color var(--tdt-dur-fast) var(--tdt-ease),border-color var(--tdt-dur-fast) var(--tdt-ease),color var(--tdt-dur-fast) var(--tdt-ease),opacity var(--tdt-dur-fast) var(--tdt-ease);}\n.dsh-tdt-iconbtn--sm{width:var(--tdt-control-h-sm);height:var(--tdt-control-h-sm);font-size:var(--tdt-font-sm);}\n.dsh-tdt-iconbtn--md{width:var(--tdt-control-h-md);height:var(--tdt-control-h-md);font-size:var(--tdt-font-md);}\n.dsh-tdt-iconbtn--lg{width:var(--tdt-control-h-lg);height:var(--tdt-control-h-lg);font-size:var(--tdt-font-md);}\n.dsh-tdt-iconbtn--plain{color:var(--tdt-fg-2);}\n.dsh-tdt-iconbtn--outline{background:var(--tdt-surface-1);border-color:var(--tdt-border);color:var(--tdt-fg-2);}\n.dsh-tdt-iconbtn--danger{color:var(--tdt-danger);}\n.dsh-tdt-iconbtn:hover:not(:disabled){background:var(--tdt-hover);color:var(--tdt-fg);}\n.dsh-tdt-iconbtn--danger:hover:not(:disabled){background:var(--tdt-hover);color:var(--tdt-danger);}\n.dsh-tdt-iconbtn:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:2px;}\n.dsh-tdt-iconbtn:disabled{cursor:default;opacity:.4;}\n\n/* \u2500\u2500 \u884C\u5F0F\u6587\u4EF6\u6309\u94AE\uFF08\u56FE\u6807 + \u6587\u4EF6\u540D\uFF09P2\uFF1A**\u5168\u7AD9\u552F\u4E00\u5B9E\u73B0**\uFF082026-10-04 \u6536\u7F16\uFF09\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n \u7528\u9014\uFF1A\u300C\u4EA7\u51FA\u7269 / \u9644\u4EF6\u300D\u90A3\u79CD**\u4E00\u884C\u4E00\u4E2A\u6587\u4EF6**\u7684\u6E05\u5355\u9879\uFF08\u57FA\u7840\u4FE1\u606F\u53F3\u680F\u4EA7\u51FA\u7269\u6E05\u5355\u3001\u9644\u4EF6\u533A\u3001\n \u6267\u884C\u8BB0\u5F55\u9875\u7684\u5C55\u5F00\u533A\uFF09\u3002\u5E73\u65F6\u900F\u660E\u3001**\u9F20\u6807\u79FB\u4E0A\u53BB\u624D\u51FA\u6D45\u5E95**\uFF08\u6CBF\u7528\u7528\u6237 2026-10-03 \u5B9A\u7684\u89C2\u611F\uFF09\u3002\n \u4E24\u4E2A\u5F62\u6001\u4FEE\u9970\u7C7B\uFF1A\n --block \u6491\u6EE1\u7236\u5BBD\uFF08\u6E05\u5355\u91CC\u4E00\u9879\u4E00\u884C\uFF09\n --inline \u5185\u5BB9\u5BBD\uFF08\u8DDF\u5728\u6587\u5B57\u540E\u5934\uFF0C\u5982\u9644\u4EF6\u884C\uFF09\n \u6536\u7F16\u539F\u56E0\uFF1A\u8FD9\u4EFD\u76AE\u80A4\u6B64\u524D\u53EA\u5199\u5728 task-list.tsx \u7684 TASK_LIST_CSS \u91CC\uFF08\u65E7\u540D .dsh-tdt-info-out\uFF09\uFF0C\n \u6267\u884C\u8BB0\u5F55\u9875\u5C55\u5F00\u533A\u8981\u7528\u540C\u4E00\u79CD\u89C2\u611F \u21D2 \u4E0A\u63D0\u57FA\u7840\u5C42\uFF0C\u907F\u514D\u518D\u51FA\u73B0\u300C\u5404\u5199\u4E00\u4EFD\u5916\u89C2\u300D\uFF08\u540C\u540D\u4E0D\u540C\u76AE\u7684\u5751\u521A\u8E29\u8FC7\uFF09\u3002 */\n.dsh-tdt-filechip{appearance:none;-webkit-appearance:none;border:0;border-radius:var(--tdt-radius-xs);\n background:transparent;color:var(--tdt-fg);font:inherit;text-align:left;cursor:pointer;min-width:0;\n transition:background-color var(--tdt-dur) var(--tdt-ease);}\n.dsh-tdt-filechip:hover:not(:disabled){background:var(--tdt-chip-bg);}\n.dsh-tdt-filechip:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:1px;}\n.dsh-tdt-filechip:disabled{cursor:default;background:transparent;color:var(--tdt-fg-3);}\n.dsh-tdt-filechip--block{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;\n padding:4px 6px;font-size:var(--tdt-font-xs);}\n.dsh-tdt-filechip--inline{display:inline-flex;align-items:center;gap:4px;padding:2px 6px;font-size:var(--tdt-font-sm);}\n\n@media (prefers-reduced-motion: reduce){.dsh-tdt-btn,.dsh-tdt-iconbtn,.dsh-tdt-filechip{transition:none;}}\n";
3
3
  export declare const FIELD_CSS = "\n/* \u2500\u2500 \u8F93\u5165\u7C7B P3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.dsh-tdt-input{box-sizing:border-box;border:1px solid var(--tdt-border);border-radius:var(--tdt-radius-md);\n background:var(--tdt-surface-1);color:var(--tdt-fg);font-family:inherit;outline:none;\n transition:border-color var(--tdt-dur-fast) var(--tdt-ease),box-shadow var(--tdt-dur-fast) var(--tdt-ease);}\n.dsh-tdt-input--sm{height:var(--tdt-control-h-sm);padding:0 8px;font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);}\n.dsh-tdt-input--md{height:var(--tdt-control-h-md);padding:0 10px;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-input--lg{height:var(--tdt-control-h-lg);padding:0 12px;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-input::placeholder{color:var(--tdt-fg-dim);}\n.dsh-tdt-input:focus{border-color:var(--tdt-focus);box-shadow:0 0 0 1px var(--tdt-focus);}\n.dsh-tdt-input--error{border-color:var(--tdt-danger);}\n.dsh-tdt-input:disabled{cursor:default;opacity:.5;}\n\n.dsh-tdt-pfx{display:inline-flex;align-items:center;box-sizing:border-box;overflow:hidden;\n border:1px solid var(--tdt-border);border-radius:var(--tdt-radius-md);background:var(--tdt-surface-1);color:var(--tdt-fg);}\n.dsh-tdt-pfx--sm{height:var(--tdt-control-h-sm);}\n.dsh-tdt-pfx--md{height:var(--tdt-control-h-md);}\n.dsh-tdt-pfx--lg{height:var(--tdt-control-h-lg);}\n/* md / lg \u6863\u5B57\u53F7\u8DDF\u6863\u8D70\uFF08\u4E0E\u540C\u6863\u4E0B\u62C9\u540C\u5B57\u53F7\uFF09\uFF1A\u6B64\u524D\u5199\u6B7B sm(12px)\uFF0C\u540C\u6392\u4E0B\u62C9\u662F 13px \u21D2 \u663E\u5F97\u300Cinput \u5B57\u5C0F\u300D\u3002 */\n.dsh-tdt-pfx--md .dsh-tdt-pfx__label,.dsh-tdt-pfx--lg .dsh-tdt-pfx__label{font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-pfx--md .dsh-tdt-pfx__input,.dsh-tdt-pfx--lg .dsh-tdt-pfx__input{font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-pfx--error{border-color:var(--tdt-danger);}\n.dsh-tdt-pfx:focus-within{border-color:var(--tdt-focus);box-shadow:0 0 0 1px var(--tdt-focus);}\n.dsh-tdt-pfx__label{padding:0 8px;color:var(--tdt-fg-2);font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);white-space:nowrap;border-right:1px solid var(--tdt-border);}\n.dsh-tdt-pfx__input{flex:1 1 auto;min-width:0;height:100%;padding:0 8px;border:0;background:transparent;color:var(--tdt-fg);\n font-family:inherit;font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);outline:none;}\n.dsh-tdt-pfx__input::placeholder{color:var(--tdt-fg-dim);}\n\n.dsh-tdt-num{display:inline-flex;align-items:center;justify-content:space-between;box-sizing:border-box;overflow:hidden;\n border:1px solid var(--tdt-border);border-radius:var(--tdt-radius-md);background:var(--tdt-surface-1);color:var(--tdt-fg);}\n/* \u4E2D\u6BB5\uFF1A\u6570\u5B57 + \u540E\u7F00\u6210\u7EC4\u5C45\u4E2D\uFF1B\u5BB9\u5668\u88AB\u6D88\u8D39\u7AEF\u62C9\u5BBD\u65F6\u5403\u6389\u5168\u90E8\u4F59\u91CF\uFF0C\u4E24\u7AEF \u2212 / + \u56E0\u6B64\u9489\u6B7B\u5728\u5DE6\u53F3\u8FB9\u7F18\u3002 */\n.dsh-tdt-num__mid{display:flex;align-items:center;justify-content:center;flex:1 1 auto;min-width:0;}\n.dsh-tdt-num--sm{height:var(--tdt-control-h-sm);}\n.dsh-tdt-num--md{height:var(--tdt-control-h-md);}\n.dsh-tdt-num--lg{height:var(--tdt-control-h-lg);}\n.dsh-tdt-num--md .dsh-tdt-num__input,.dsh-tdt-num--lg .dsh-tdt-num__input{font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-num--md .dsh-tdt-num__suffix,.dsh-tdt-num--lg .dsh-tdt-num__suffix{font-size:var(--tdt-font-md);}\n.dsh-tdt-num--disabled{opacity:.5;}\n.dsh-tdt-num__input{width:36px;height:100%;padding:0 2px;border:0;background:transparent;color:var(--tdt-fg);\n font-family:inherit;font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);text-align:center;outline:none;}\n.dsh-tdt-num__suffix{padding:0 6px;color:var(--tdt-fg-2);font-size:var(--tdt-font-sm);white-space:nowrap;}\n.dsh-tdt-num .dsh-tdt-iconbtn{border-radius:0;color:var(--tdt-fg-2);flex:none;}\n\n/* \u5B98\u65B9 Switch \u5305\u88C5\u7EDF\u4E00\uFF1A\u9009\u4E2D = success \u7EFF\u3002\n \uFF08\u5408\u5E76\u539F\u5148 task-editor-css / task-list \u4E24\u5904\u5C31\u5730\u8986\u76D6\uFF1B\u9009\u62E9\u5668\u5E26\u5305\u88C5\u7C7B + role\uFF0C\u7279\u5F02\u6027\u9AD8\u4E8E\u5B98\u65B9\u3002\uFF09 */\n.dsh-tdt-switch button[role='switch'][aria-checked='true']{background:var(--tdt-success);}\n\n/* \u591A\u884C\u6587\u672C\u8F93\u5165\uFF08\u63D0\u793A\u8BCD\u7B49\uFF0CP3\uFF09\uFF1A\u5361\u5185\u65E0\u8FB9\u6846\uFF08\u89C6\u89C9\u91CD\u5FC3\u5728\u6574\u5F20\u5361\u4E0A\uFF09\uFF0C\u5360\u4F4D\u8272\u8D70 dimmed\uFF1B\u6821\u9A8C\u4E0D\u901A\u8FC7\u63CF\u7EA2\u76D2\u3002\n \uFF08\u4ECE task-editor-css \u7684 .dsh-tdt-ed-prompt \u4E0A\u63D0\u800C\u6765\uFF1B\u4E1A\u52A1\u6587\u4EF6\u4E0D\u518D\u81EA\u5199 textarea \u76AE\u80A4\u3002\uFF09 */\n.dsh-tdt-textarea{display:block;width:100%;box-sizing:border-box;min-height:132px;padding:2px;border:none;outline:none;background:0 0;color:var(--tdt-fg);font:inherit;font-size:var(--tdt-font-lg);line-height:1.6;resize:vertical;}\n.dsh-tdt-textarea::placeholder{color:var(--tdt-fg-dim);}\n.dsh-tdt-textarea--error{box-shadow:0 0 0 1px var(--tdt-danger);}\n\n/* \u62D6\u62FD\u5206\u9694\u6761\uFF08\u7F16\u8F91\u5206\u680F / \u9884\u89C8 dock \u5171\u7528\uFF0CU20 #3\uFF09\uFF1A6px \u547D\u4E2D\u533A\uFF0Ccol-resize\uFF0C\u4E0D\u753B\u7EBF\uFF0Chover/\u6309\u4E0B\u6D6E\u51FA\u6D45\u5E26\u3002\n \u5177\u4F53 z-index \u7531 .dsh-tdt-ed-resizer / .dsh-tdt-sv-resizer \u5404\u81EA\u8865\u3002 */\n.dsh-tdt-resizer{position:absolute;top:0;bottom:0;left:0;width:6px;cursor:col-resize;background:0 0;touch-action:none;user-select:none;}\n.dsh-tdt-resizer:hover,.dsh-tdt-resizer:active{background:var(--tdt-hover,rgba(38,49,72,.06));}\n\n@media (prefers-reduced-motion: reduce){.dsh-tdt-input,.dsh-tdt-pfx{transition:none;}}\n";
4
4
  export declare const DATETIME_CSS = "\n/* \u2500\u2500 \u65E5\u671F / \u65F6\u95F4 P4 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.dsh-tdt-dtf-wrap{display:inline-flex;position:relative;min-width:0;}\n/* \u26A0\uFE0F \u8FB9\u6846\u7C97\u7EC6 / \u5706\u89D2\u5FC5\u987B\u4E0E\u4E0B\u62C9\u951A\u70B9\uFF08dsh-tdt-ed-field \u7684 fieldButtonStyle\uFF09\u5B8C\u5168\u4E00\u81F4\n \uFF08\u7528\u6237 2026-10-02 \u70B9\u540D\uFF1A\u540C\u6392\u7684\u65E5\u671F\u6846\u4E0E\u4E0B\u62C9\u6846\u770B\u7740\u4E0D\u662F\u4E00\u5957\uFF09\u21D2 \u8FD9\u91CC\u4E5F\u662F 0.5px + radius-md\u3002 */\n.dsh-tdt-dtf{display:inline-flex;align-items:center;gap:6px;box-sizing:border-box;height:var(--tdt-control-h-lg);\n min-width:0;max-width:100%;padding:0 8px;border:0.5px solid var(--tdt-border-heavy);border-radius:var(--tdt-radius-md);\n background:var(--tdt-surface-1);color:var(--tdt-fg);font:inherit;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);\n cursor:pointer;transition:background-color var(--tdt-dur-fast) var(--tdt-ease),border-color var(--tdt-dur-fast) var(--tdt-ease);}\n/* \u65E5\u671F / \u65F6\u95F4\u951A\u70B9\uFF1A\u4E09\u6863\u9AD8\u5EA6\uFF08\u9ED8\u8BA4 lg=32\uFF09\u3002base \u5DF2\u542B lg \u9AD8\u5EA6\u4F5C\u515C\u5E95\uFF0C\u4E0B\u9762\u4E09\u6863\u6309 size \u8986\u76D6\u3002 */\n.dsh-tdt-dtf--sm{height:var(--tdt-control-h-sm);padding:0 6px;font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);}\n.dsh-tdt-dtf--md{height:var(--tdt-control-h-md);padding:0 8px;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-dtf--lg{height:var(--tdt-control-h-lg);padding:0 8px;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}\n.dsh-tdt-dtf:hover:not(:disabled){background:var(--tdt-hover);}\n.dsh-tdt-dtf:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:2px;}\n.dsh-tdt-dtf:disabled{cursor:not-allowed;opacity:.6;}\n.dsh-tdt-dtf__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;}\n.dsh-tdt-dtf__label--ph{color:var(--tdt-fg-dim);}\n.dsh-tdt-dtf__icon{display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;flex:none;color:var(--tdt-fg-3);}\n\n.dsh-tdt-layer{position:fixed;z-index:var(--tdt-z-menu);box-sizing:border-box;padding:8px;background:var(--tdt-surface-1);\n box-shadow:var(--tdt-shadow-2);border-radius:var(--tdt-radius-md);color:var(--tdt-fg);font-size:var(--tdt-font-md);}\n\n.dsh-tdt-cal__head{display:flex;align-items:center;justify-content:space-between;gap:4px;margin-bottom:4px;}\n.dsh-tdt-cal__title{flex:1 1 auto;text-align:center;font-size:var(--tdt-font-md);font-weight:600;color:var(--tdt-fg);}\n.dsh-tdt-cal__grid{display:grid;grid-template-columns:repeat(7,32px);gap:2px;}\n.dsh-tdt-cal__weekday{height:24px;display:flex;align-items:center;justify-content:center;font-size:var(--tdt-font-sm);color:var(--tdt-fg-3);}\n.dsh-tdt-cal__cell{width:32px;height:32px;padding:0;display:flex;align-items:center;justify-content:center;\n border:1px solid transparent;border-radius:var(--tdt-radius-md);background:transparent;color:var(--tdt-fg);\n font:inherit;font-size:var(--tdt-font-md);cursor:pointer;\n transition:background-color var(--tdt-dur-fast) var(--tdt-ease),color var(--tdt-dur-fast) var(--tdt-ease);}\n.dsh-tdt-cal__cell--hover{background:var(--tdt-hover);}\n.dsh-tdt-cal__cell--out{color:var(--tdt-fg-dim);}\n.dsh-tdt-cal__cell--today{border-color:var(--tdt-business);}\n.dsh-tdt-cal__cell[aria-pressed='true']{background:var(--tdt-accent);color:var(--tdt-fg-inverse);}\n.dsh-tdt-cal__foot{margin-top:6px;padding-top:6px;border-top:1px solid var(--tdt-border);}\n\n.dsh-tdt-time__cols{display:flex;gap:4px;}\n.dsh-tdt-time__list{width:56px;max-height:196px;overflow-y:auto;display:flex;flex-direction:column;gap:2px;}\n.dsh-tdt-time__opt{padding:5px 0;border:0;border-radius:var(--tdt-radius-sm);background:transparent;color:var(--tdt-fg-2);\n font:inherit;font-size:var(--tdt-font-md);cursor:pointer;transition:background-color var(--tdt-dur-fast) var(--tdt-ease),color var(--tdt-dur-fast) var(--tdt-ease);}\n.dsh-tdt-time__opt[aria-selected='true']{background:var(--tdt-hover);color:var(--tdt-fg);font-weight:600;}\n.dsh-tdt-time__foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:6px;padding-top:6px;border-top:1px solid var(--tdt-border);}\n\n@media (prefers-reduced-motion: reduce){.dsh-tdt-dtf,.dsh-tdt-cal__cell,.dsh-tdt-time__opt{transition:none;}}\n";
5
5
  export declare const SELECT_CSS = "\n/* \u4E0B\u62C9 / \u65E5\u5386 / \u65F6\u5206\u951A\u70B9\uFF1A\u952E\u76D8\u53EF\u8FBE\u6027\u63CF\u8FB9 + \u6821\u9A8C\u63CF\u7EA2\uFF08\u7C7B\u540D\u4ECE\u4E1A\u52A1\u5C42\u6CBF\u7528\uFF0C\u76AE\u80A4\u5F52\u4F4D\u57FA\u7840\u5C42\uFF09 */\n.dsh-tdt-ed-field:focus-visible{outline:2px solid var(--tdt-business);outline-offset:1px;}\n.dsh-tdt-ed-field--error{border-color:var(--tdt-danger)!important;box-shadow:0 0 0 1px var(--tdt-danger);}\n/* \u6574\u884C\u4E0B\u62C9\uFF1A\u5B98\u65B9 Menu \u7684\u5305\u88C5 span \u662F inline-flex\uFF08shrink-to-fit\uFF09\uFF0C\u8981\u8FDE\u5B83\u4E00\u8D77\u6491\u6EE1 */\n.dsh-tdt-ed-selectwrap{width:100%;}\n\n/* \u7701\u7565\u53F7\u4E09\u4EF6\u5957\uFF08ui-style-guide \u00A7\u4E09\u300C\u5F85\u62BD\u8C61 #1\u300D\u7684\u6536\u655B\u70B9\uFF09\uFF1A**\u65B0\u4EE3\u7801\u4E00\u5F8B\u6302\u8FD9\u4E2A\u7C7B**\uFF0C\u4E0D\u518D\u5404\u5199\u4E00\u904D\u3002\n \u26A0\uFE0F \u5DF2\u6709 19 \u5904\u65E7\u5199\u6CD5\u5F85\u9010\u6B65\u6536\u7F16\uFF082026-10-04 \u8D77\u65B0\u589E\u7684\u8C03\u7528\u70B9\u4E0D\u8BB8\u518D\u624B\u5199\u8FD9\u4E09\u6761\u5C5E\u6027\uFF09\u3002 */\n.dsh-tdt-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}\n\n/* \u8DD1\u9A6C\u706F\u6587\u672C\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 */\n.dsh-tdt-mq{display:block;overflow:hidden;white-space:nowrap;}\n.dsh-tdt-mq .dsh-tdt-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.dsh-tdt-mq-run:hover .dsh-tdt-mq-in{max-width:none;overflow:visible;animation:dsh-tdt-mq-scroll var(--dsh-tdt-mq-dur,6s) linear .4s 1 forwards;}\n@keyframes dsh-tdt-mq-scroll{from{transform:translateX(0)}to{transform:translateX(var(--dsh-tdt-mq-dist,-40px))}}\n";
@@ -1 +1 @@
1
- {"version":3,"file":"controls-css.d.ts","sourceRoot":"","sources":["../../src/ui/controls-css.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa,o5QAgEzB,CAAA;AAED,eAAO,MAAM,UAAU,ylUAqFtB,CAAA;AAED,eAAO,MAAM,SAAS,kkMA2DrB,CAAA;AAED,eAAO,MAAM,YAAY,moJA6CxB,CAAA;AAED,eAAO,MAAM,UAAU,ulFAmBtB,CAAA;AAED,eAAO,MAAM,WAAW,guBAQvB,CAAA;AAED,eAAO,MAAM,eAAe,0+CA+B3B,CAAA;AAED,eAAO,MAAM,QAAQ,kzDAkBpB,CAAA"}
1
+ {"version":3,"file":"controls-css.d.ts","sourceRoot":"","sources":["../../src/ui/controls-css.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa,o5QAgEzB,CAAA;AAED,eAAO,MAAM,UAAU,y7NAiEtB,CAAA;AAED,eAAO,MAAM,SAAS,kkMA2DrB,CAAA;AAED,eAAO,MAAM,YAAY,moJA6CxB,CAAA;AAED,eAAO,MAAM,UAAU,ulFAmBtB,CAAA;AAED,eAAO,MAAM,WAAW,guBAQvB,CAAA;AAED,eAAO,MAAM,eAAe,0+CA+B3B,CAAA;AAED,eAAO,MAAM,QAAQ,kzDAkBpB,CAAA"}
@@ -112,26 +112,6 @@ export const BUTTON_CSS = `
112
112
  .dsh-tdt-iconbtn:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:2px;}
113
113
  .dsh-tdt-iconbtn:disabled{cursor:default;opacity:.4;}
114
114
 
115
- /* ── 产出物「图标 chip」P2:28×28 方角小底板 + 官方文件类型图标 ──────────────
116
- 用途:产出物列表里**只给图标**的小按钮(卡片「执行记录」面板、执行记录总查询页、展开区都挂它)。
117
- ⚠️ 底板**必须走 class**——inline background 会盖掉 :hover(用户 2026-10-03 踩过)。
118
- hover 用 「--tdt-chip-bg-hover」:浅色更深、暗色更亮(两端都是「更明显」);不许拿
119
- 「--tdt-plate-hover」 顶——暗色下反而更淡,鼠标移上去底板就消失了。
120
- ✅ **全站唯一实现**(2026-10-04 收编):此前卡片面板与执行记录页各写一份**同名不同皮**的
121
- 「.dsh-tdt-rec-out」,两份 CSS 都注入同一页面 ⇒ 谁后注册谁生效、互相污染;现已收成这一份。 */
122
- .dsh-tdt-chip{appearance:none;-webkit-appearance:none;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;
123
- width:var(--tdt-control-h-md);height:var(--tdt-control-h-md);padding:0;border:none;border-radius:var(--tdt-radius-sm);
124
- background:transparent;color:var(--tdt-fg-2);font-family:inherit;line-height:0;cursor:pointer;
125
- transition:background-color var(--tdt-dur) var(--tdt-ease),color var(--tdt-dur) var(--tdt-ease);}
126
- /* 底板**平时透明、鼠标移上去才浮出来**(用户 2026-10-04:「那个带底色的框,鼠标移上去才有」)。
127
- 只给图标、没有文字可读 ⇒ hover 用更明显的那档(浅色更深、暗色更亮,两端都是「更明显」)。 */
128
- .dsh-tdt-chip:hover:not(:disabled){background:var(--tdt-chip-bg-hover);}
129
- .dsh-tdt-chip:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:1px;}
130
- /* 不可点(没有会话 / 预览面未就位):没有底板、没有手指,别给假入口 */
131
- .dsh-tdt-chip:disabled{cursor:default;background:transparent;color:var(--tdt-fg-3);}
132
- /* 文字型 chip(「…」 / 「+N」):不固定方宽,按内容撑开 */
133
- .dsh-tdt-chip--label{width:auto;padding:0 6px;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);}
134
-
135
115
  /* ── 行式文件按钮(图标 + 文件名)P2:**全站唯一实现**(2026-10-04 收编)──────────
136
116
  用途:「产出物 / 附件」那种**一行一个文件**的清单项(基础信息右栏产出物清单、附件区、
137
117
  执行记录页的展开区)。平时透明、**鼠标移上去才出浅底**(沿用用户 2026-10-03 定的观感)。
@@ -150,7 +130,7 @@ export const BUTTON_CSS = `
150
130
  padding:4px 6px;font-size:var(--tdt-font-xs);}
151
131
  .dsh-tdt-filechip--inline{display:inline-flex;align-items:center;gap:4px;padding:2px 6px;font-size:var(--tdt-font-sm);}
152
132
 
153
- @media (prefers-reduced-motion: reduce){.dsh-tdt-btn,.dsh-tdt-iconbtn,.dsh-tdt-chip,.dsh-tdt-filechip{transition:none;}}
133
+ @media (prefers-reduced-motion: reduce){.dsh-tdt-btn,.dsh-tdt-iconbtn,.dsh-tdt-filechip{transition:none;}}
154
134
  `;
155
135
  export const FIELD_CSS = `
156
136
  /* ── 输入类 P3 ────────────────────────────────────────────────────────── */
@@ -1 +1 @@
1
- {"version":3,"file":"controls-css.js","sourceRoot":"","sources":["../../src/ui/controls-css.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,mDAAmD;AACnD,2CAA2C;AAE3C,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgE5B,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFzB,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DxB,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6C3B,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;CAmBzB,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;CAQ1B,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B9B,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;CAkBvB,CAAA"}
1
+ {"version":3,"file":"controls-css.js","sourceRoot":"","sources":["../../src/ui/controls-css.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,mDAAmD;AACnD,2CAA2C;AAE3C,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgE5B,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEzB,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DxB,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6C3B,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;CAmBzB,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;CAQ1B,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B9B,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;CAkBvB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../src/ui/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAiBlE,eAAO,MAAM,eAAe,aAAa,CAAA;AAEzC;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjE;AA4BD,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,gCAAgC;AAChC,wBAAgB,cAAc,CAAC,GAAG,GAAE,QAAkB,GAAG,IAAI,CAG5D"}
1
+ {"version":3,"file":"css.d.ts","sourceRoot":"","sources":["../../src/ui/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAkBlE,eAAO,MAAM,eAAe,aAAa,CAAA;AAEzC;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjE;AA4BD,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,gCAAgC;AAChC,wBAAgB,cAAc,CAAC,GAAG,GAAE,QAAkB,GAAG,IAAI,CAG5D"}
package/dist/ui/css.js CHANGED
@@ -2,7 +2,8 @@ import { createStyleKit } from '../design/index.js';
2
2
  import { BACK_TO_TOP_CSS, BUTTON_CSS, DATETIME_CSS, FIELD_CSS, HINT_CSS, LOADING_CSS, SEGMENTED_CSS, SELECT_CSS, } from './controls-css.js';
3
3
  import { PICKER_CSS } from './picker-css.js';
4
4
  import { FEEDBACK_CSS } from './feedback-css.js';
5
- import { CARD_CSS, CHIP_CSS } from './card-css.js';
5
+ import { CARD_CSS } from './card-css.js';
6
+ import { CHIP_CSS } from './chip-css.js';
6
7
  import { EXPLORER_CSS } from '../explorer/explorer-css.js';
7
8
  import { SESSION_CSS } from '../session/session-css.js';
8
9
  export const CONTROLS_DOMAIN = 'controls';
@@ -1 +1 @@
1
- {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/ui/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,oBAAoB,CAAA;AAClE,OAAO,EACL,eAAe,EACf,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,WAAW,EACX,aAAa,EACb,UAAU,GACX,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAA;AAEzC;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,MAAc;IACvD,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,GAAG,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,YAAY,GAAG;IACnB,aAAa;IACb,UAAU;IACV,SAAS;IACT,YAAY;IACZ,UAAU;IACV,WAAW;IACX,eAAe;IACf,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,QAAQ;CACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ;;;;;;GAMG;AACH,IAAI,OAAO,GAAa,cAAc,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;AAEnF,MAAM,UAAU,WAAW,CAAC,GAAa;IACvC,OAAO,GAAG,GAAG,CAAA;AACf,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,cAAc,CAAC,MAAgB,OAAO;IACpD,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAC1C,GAAG,CAAC,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;AACrE,CAAC"}
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/ui/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiB,MAAM,oBAAoB,CAAA;AAClE,OAAO,EACL,eAAe,EACf,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,WAAW,EACX,aAAa,EACb,UAAU,GACX,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAA;AAEzC;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,MAAc;IACvD,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,GAAG,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,YAAY,GAAG;IACnB,aAAa;IACb,UAAU;IACV,SAAS;IACT,YAAY;IACZ,UAAU;IACV,WAAW;IACX,eAAe;IACf,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,QAAQ;IACR,QAAQ;CACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ;;;;;;GAMG;AACH,IAAI,OAAO,GAAa,cAAc,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;AAEnF,MAAM,UAAU,WAAW,CAAC,GAAa;IACvC,OAAO,GAAG,GAAG,CAAA;AACf,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,cAAc,CAAC,MAAgB,OAAO;IACpD,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAC1C,GAAG,CAAC,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;AACrE,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const FEEDBACK_CSS = "\n.dsh-tdt-modal-mask{\n position:fixed;inset:0;z-index:1070;display:flex;align-items:center;justify-content:center;\n background:rgba(15,23,42,.45);\n}\n.dsh-tdt-modal{\n display:flex;flex-direction:column;max-width:min(960px,92vw);max-height:86vh;\n background:var(--tdt-surface-base);border:1px solid var(--tdt-border);\n border-radius:10px;box-shadow:0 16px 48px rgba(15,23,42,.24);overflow:hidden;\n}\n.dsh-tdt-modal__head{\n display:flex;align-items:center;gap:8px;padding:12px 14px;\n border-bottom:1px solid var(--tdt-border-faint);color:var(--tdt-fg);font-size:14px;\n}\n.dsh-tdt-modal__title{flex:1;min-width:0}\n.dsh-tdt-modal__body{flex:1;min-height:0;overflow:auto;padding:12px 14px}\n.dsh-tdt-modal__foot{\n display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;\n border-top:1px solid var(--tdt-border-faint);\n}\n.dsh-tdt-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.dsh-tdt-toast{\n padding:8px 14px;border-radius:8px;font-size:13px;color:var(--tdt-fg);\n background:var(--tdt-surface-menu);border:1px solid var(--tdt-border);\n box-shadow:0 8px 24px rgba(15,23,42,.16);\n}\n.dsh-tdt-toast--success{color:var(--tdt-success);border-color:color-mix(in srgb,var(--tdt-success) 40%,transparent)}\n.dsh-tdt-toast--error{color:var(--tdt-danger);border-color:color-mix(in srgb,var(--tdt-danger) 40%,transparent)}\n.dsh-tdt-empty{\n display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;\n padding:24px;color:var(--tdt-fg-3);font-size:13px;text-align:center;\n}\n.dsh-tdt-error{\n padding:12px 14px;border-radius:8px;font-size:13px;\n color:var(--tdt-danger);background:color-mix(in srgb,var(--tdt-danger) 10%,transparent);\n border:1px solid color-mix(in srgb,var(--tdt-danger) 30%,transparent);\n}\n.dsh-tdt-error__retry{\n margin-top:8px;color:var(--tdt-link);cursor:pointer;background:none;border:none;padding:0;\n}\n";
1
+ export declare const FEEDBACK_CSS = "\n.dsh-tdt-modal-mask{\n position:fixed;inset:0;z-index:1070;display:flex;align-items:center;justify-content:center;\n background:rgba(15,23,42,.45);\n}\n.dsh-tdt-modal{\n display:flex;flex-direction:column;max-width:min(960px,92vw);max-height:86vh;\n background:var(--tdt-surface-base);border:1px solid var(--tdt-border);\n border-radius:10px;box-shadow:0 16px 48px rgba(15,23,42,.24);overflow:hidden;\n}\n.dsh-tdt-modal__head{\n display:flex;align-items:center;gap:8px;padding:12px 14px;\n border-bottom:1px solid var(--tdt-border-faint);color:var(--tdt-fg);font-size:14px;\n}\n.dsh-tdt-modal__title{flex:1;min-width:0}\n/* \u5173\u95ED\u6309\u94AE\uFF1A24\u00D724 \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.dsh-tdt-modal__close{\n display:inline-flex;align-items:center;justify-content:center;flex:none;\n width:24px;height:24px;padding:0;border:none;border-radius:var(--tdt-radius-sm);\n background:transparent;color:var(--tdt-fg-3);font-family:inherit;font-size:12px;line-height:1;cursor:pointer;\n transition:background-color var(--tdt-dur-fast) var(--tdt-ease),color var(--tdt-dur-fast) var(--tdt-ease);\n}\n.dsh-tdt-modal__close:hover{background:var(--tdt-hover);color:var(--tdt-fg)}\n.dsh-tdt-modal__close:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:1px}\n.dsh-tdt-modal__body{flex:1;min-height:0;overflow:auto;padding:12px 14px}\n.dsh-tdt-modal__foot{\n display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;\n border-top:1px solid var(--tdt-border-faint);\n}\n.dsh-tdt-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.dsh-tdt-toast{\n padding:8px 14px;border-radius:8px;font-size:13px;color:var(--tdt-fg);\n background:var(--tdt-surface-menu);border:1px solid var(--tdt-border);\n box-shadow:0 8px 24px rgba(15,23,42,.16);\n}\n.dsh-tdt-toast--success{color:var(--tdt-success);border-color:color-mix(in srgb,var(--tdt-success) 40%,transparent)}\n.dsh-tdt-toast--error{color:var(--tdt-danger);border-color:color-mix(in srgb,var(--tdt-danger) 40%,transparent)}\n.dsh-tdt-empty{\n display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;\n padding:24px;color:var(--tdt-fg-3);font-size:13px;text-align:center;\n}\n.dsh-tdt-error{\n padding:12px 14px;border-radius:8px;font-size:13px;\n color:var(--tdt-danger);background:color-mix(in srgb,var(--tdt-danger) 10%,transparent);\n border:1px solid color-mix(in srgb,var(--tdt-danger) 30%,transparent);\n}\n.dsh-tdt-error__retry{\n margin-top:8px;color:var(--tdt-link);cursor:pointer;background:none;border:none;padding:0;\n}\n";
2
2
  //# sourceMappingURL=feedback-css.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feedback-css.d.ts","sourceRoot":"","sources":["../../src/ui/feedback-css.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,g/DA2CxB,CAAA"}
1
+ {"version":3,"file":"feedback-css.d.ts","sourceRoot":"","sources":["../../src/ui/feedback-css.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,2vFAoDxB,CAAA"}
@@ -16,6 +16,15 @@ export const FEEDBACK_CSS = `
16
16
  border-bottom:1px solid var(--tdt-border-faint);color:var(--tdt-fg);font-size:14px;
17
17
  }
18
18
  .dsh-tdt-modal__title{flex:1;min-width:0}
19
+ /* 关闭按钮:24×24 方角图标位,不借用 Picker 的触发器皮肤(那份带 min-width:120px)。 */
20
+ .dsh-tdt-modal__close{
21
+ display:inline-flex;align-items:center;justify-content:center;flex:none;
22
+ width:24px;height:24px;padding:0;border:none;border-radius:var(--tdt-radius-sm);
23
+ background:transparent;color:var(--tdt-fg-3);font-family:inherit;font-size:12px;line-height:1;cursor:pointer;
24
+ transition:background-color var(--tdt-dur-fast) var(--tdt-ease),color var(--tdt-dur-fast) var(--tdt-ease);
25
+ }
26
+ .dsh-tdt-modal__close:hover{background:var(--tdt-hover);color:var(--tdt-fg)}
27
+ .dsh-tdt-modal__close:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:1px}
19
28
  .dsh-tdt-modal__body{flex:1;min-height:0;overflow:auto;padding:12px 14px}
20
29
  .dsh-tdt-modal__foot{
21
30
  display:flex;justify-content:flex-end;gap:8px;padding:10px 14px;
@@ -1 +1 @@
1
- {"version":3,"file":"feedback-css.js","sourceRoot":"","sources":["../../src/ui/feedback-css.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,gEAAgE;AAChE,sCAAsC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C3B,CAAA"}
1
+ {"version":3,"file":"feedback-css.js","sourceRoot":"","sources":["../../src/ui/feedback-css.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,gEAAgE;AAChE,sCAAsC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoD3B,CAAA"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * L1 adapter —— 全仓**唯一** import 官方 primitives 平台模块的文件。
3
+ *
4
+ * 事实(对齐兄弟项目 dsh-task-dispatch-table):
5
+ * - `@deepseek-ai/dsh-client-ui-primitives` 是 dsh 宿主内核提供的**平台模块**
6
+ * (见兄弟仓 tsdown.client.config.ts 的 PLATFORM_MODULES),运行时由宿主模块表 require() 解析,
7
+ * 既不在本包 dependencies、也**不写进** dsh.client.inject。
8
+ * - 故本文件在库 `tsc` 下靠 `src/types/primitives.d.ts`(版本钉死的 ambient 声明)编译;
9
+ * 在宿主里由 `__ModuleLoader__` 解析;下游打包(esbuild / tsdown / vite)必须把 `@deepseek-ai/*` 标 **external**。
10
+ *
11
+ * 收敛目的(本次重构硬要求:能抽象的一律往上抽):
12
+ * 全仓官方面只此一个 import 点 —— grep 即审计、stub / 替换只改一处、类型版本注释只一份、漂移告警统一。
13
+ * **任何控件都不许在别处 import 平台模块**,只从本文件消费。
14
+ *
15
+ * ⚠️ 非宿主消费面(Node 单测、根预览站)需另配 stub:本文件静态 import 平台模块,
16
+ * 在 Node 里直接 import 会 `ERR_MODULE_NOT_FOUND` —— 这正是旧坑(SelectField 曾因依赖官方 Menu 被删)。
17
+ * 该 stub loader 属 P0 待办,见 docs/requirements.md。
18
+ */
19
+ import * as Official from '@deepseek-ai/dsh-client-ui-primitives';
20
+ export * from '@deepseek-ai/dsh-client-ui-primitives';
21
+ /** 官方命名空间:给运行时兜底 / 审计用;业务代码优先用上面的具名导出。 */
22
+ export { Official };
23
+ /**
24
+ * 运行时取一个官方导出;缺失(宿主升级改名 / 老宿主没有)时**一次性**告警并回落到 `fallback`,
25
+ * 不静默白屏。仅用于「官方可能漂移」的边角件;稳定常用件直接用具名导出即可。
26
+ *
27
+ * @param name - 官方导出名。
28
+ * @param fallback - 缺失时的兜底(通常是保留的自绘实现)。
29
+ */
30
+ export declare function pickOfficial<K extends keyof typeof Official>(name: K, fallback: (typeof Official)[K]): (typeof Official)[K];
31
+ //# sourceMappingURL=official.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"official.d.ts","sourceRoot":"","sources":["../../src/ui/official.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,QAAQ,MAAM,uCAAuC,CAAA;AAEjE,cAAc,uCAAuC,CAAA;AAErD,0CAA0C;AAC1C,OAAO,EAAE,QAAQ,EAAE,CAAA;AAInB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,OAAO,QAAQ,EAC1D,IAAI,EAAE,CAAC,EACP,QAAQ,EAAE,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAC7B,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAUtB"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * L1 adapter —— 全仓**唯一** import 官方 primitives 平台模块的文件。
3
+ *
4
+ * 事实(对齐兄弟项目 dsh-task-dispatch-table):
5
+ * - `@deepseek-ai/dsh-client-ui-primitives` 是 dsh 宿主内核提供的**平台模块**
6
+ * (见兄弟仓 tsdown.client.config.ts 的 PLATFORM_MODULES),运行时由宿主模块表 require() 解析,
7
+ * 既不在本包 dependencies、也**不写进** dsh.client.inject。
8
+ * - 故本文件在库 `tsc` 下靠 `src/types/primitives.d.ts`(版本钉死的 ambient 声明)编译;
9
+ * 在宿主里由 `__ModuleLoader__` 解析;下游打包(esbuild / tsdown / vite)必须把 `@deepseek-ai/*` 标 **external**。
10
+ *
11
+ * 收敛目的(本次重构硬要求:能抽象的一律往上抽):
12
+ * 全仓官方面只此一个 import 点 —— grep 即审计、stub / 替换只改一处、类型版本注释只一份、漂移告警统一。
13
+ * **任何控件都不许在别处 import 平台模块**,只从本文件消费。
14
+ *
15
+ * ⚠️ 非宿主消费面(Node 单测、根预览站)需另配 stub:本文件静态 import 平台模块,
16
+ * 在 Node 里直接 import 会 `ERR_MODULE_NOT_FOUND` —— 这正是旧坑(SelectField 曾因依赖官方 Menu 被删)。
17
+ * 该 stub loader 属 P0 待办,见 docs/requirements.md。
18
+ */
19
+ import * as Official from '@deepseek-ai/dsh-client-ui-primitives';
20
+ export * from '@deepseek-ai/dsh-client-ui-primitives';
21
+ /** 官方命名空间:给运行时兜底 / 审计用;业务代码优先用上面的具名导出。 */
22
+ export { Official };
23
+ const warned = new Set();
24
+ /**
25
+ * 运行时取一个官方导出;缺失(宿主升级改名 / 老宿主没有)时**一次性**告警并回落到 `fallback`,
26
+ * 不静默白屏。仅用于「官方可能漂移」的边角件;稳定常用件直接用具名导出即可。
27
+ *
28
+ * @param name - 官方导出名。
29
+ * @param fallback - 缺失时的兜底(通常是保留的自绘实现)。
30
+ */
31
+ export function pickOfficial(name, fallback) {
32
+ const value = Official[name];
33
+ if (value === undefined) {
34
+ if (!warned.has(name)) {
35
+ warned.add(name);
36
+ console.warn(`[dsh-plugin-core:official] 官方 primitive "${String(name)}" 缺失,回落到本地兜底`);
37
+ }
38
+ return fallback;
39
+ }
40
+ return value;
41
+ }
42
+ //# sourceMappingURL=official.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"official.js","sourceRoot":"","sources":["../../src/ui/official.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,QAAQ,MAAM,uCAAuC,CAAA;AAEjE,cAAc,uCAAuC,CAAA;AAErD,0CAA0C;AAC1C,OAAO,EAAE,QAAQ,EAAE,CAAA;AAEnB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAA;AAEhC;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAO,EACP,QAA8B;IAE9B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAc,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,IAAc,CAAC,CAAA;YAC1B,OAAO,CAAC,IAAI,CAAC,4CAA4C,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QACtF,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -3,4 +3,5 @@ export { formatClock, formatDateTime, formatDurationHms, formatRange, formatYmd,
3
3
  export { baseNameOf, safeTrim, truncateBytes } from './string.js';
4
4
  export { formatBytes, formatCount } from './number.js';
5
5
  export { HttpError, request, requestJson, type RequestOptions } from './http.js';
6
+ export { crumbsOf, extOf, joinPath, mimeOf, parentOf } from './path.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA;AACrG,OAAO,EACL,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA;AACrG,OAAO,EACL,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA"}
@@ -3,4 +3,5 @@ export { formatClock, formatDateTime, formatDurationHms, formatRange, formatYmd,
3
3
  export { baseNameOf, safeTrim, truncateBytes } from './string.js';
4
4
  export { formatBytes, formatCount } from './number.js';
5
5
  export { HttpError, request, requestJson } from './http.js';
6
+ export { crumbsOf, extOf, joinPath, mimeOf, parentOf } from './path.js';
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAoD,MAAM,WAAW,CAAA;AACrG,OAAO,EACL,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAuB,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAoD,MAAM,WAAW,CAAA;AACrG,OAAO,EACL,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAuB,MAAM,WAAW,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 纯路径方法 —— 只做字符串切分 / 拼接,不碰宿主、不依赖 React / DOM。
3
+ *
4
+ * 约定(与工作区文件 API 一致):POSIX `/` 分隔;空串 `''` 表示根。
5
+ * 与宿主无关:这里不调任何宿主 API,路径字符串由调用方传入。
6
+ */
7
+ /** 扩展名 → 图片 MIME;不是已知图片扩展名返回 `undefined`。 */
8
+ export declare function mimeOf(path: string): string | undefined;
9
+ /** 取扩展名(小写、不含点);无扩展名返回 `''`。 */
10
+ export declare function extOf(path: string): string;
11
+ /** 路径分段(面包屑用):`a/b/c` ⇒ `['a','b','c']`;空串 = 根。 */
12
+ export declare function crumbsOf(path: string): string[];
13
+ /** 父目录(无父 = 空串,表示根)。 */
14
+ export declare function parentOf(path: string): string;
15
+ /** 拼接子路径,避免多余斜杠。 */
16
+ export declare function joinPath(dir: string, name: string): string;
17
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,6CAA6C;AAC7C,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGvD;AAED,gCAAgC;AAChC,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1C;AAED,mDAAmD;AACnD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/C;AAED,wBAAwB;AACxB,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,oBAAoB;AACpB,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 纯路径方法 —— 只做字符串切分 / 拼接,不碰宿主、不依赖 React / DOM。
3
+ *
4
+ * 约定(与工作区文件 API 一致):POSIX `/` 分隔;空串 `''` 表示根。
5
+ * 与宿主无关:这里不调任何宿主 API,路径字符串由调用方传入。
6
+ */
7
+ const IMAGE_EXT = {
8
+ png: 'image/png',
9
+ jpg: 'image/jpeg',
10
+ jpeg: 'image/jpeg',
11
+ gif: 'image/gif',
12
+ webp: 'image/webp',
13
+ bmp: 'image/bmp',
14
+ svg: 'image/svg+xml',
15
+ ico: 'image/x-icon',
16
+ };
17
+ /** 扩展名 → 图片 MIME;不是已知图片扩展名返回 `undefined`。 */
18
+ export function mimeOf(path) {
19
+ const ext = extOf(path);
20
+ return ext === '' ? undefined : IMAGE_EXT[ext];
21
+ }
22
+ /** 取扩展名(小写、不含点);无扩展名返回 `''`。 */
23
+ export function extOf(path) {
24
+ const name = path.slice(path.lastIndexOf('/') + 1);
25
+ const dot = name.lastIndexOf('.');
26
+ return dot <= 0 ? '' : name.slice(dot + 1).toLowerCase();
27
+ }
28
+ /** 路径分段(面包屑用):`a/b/c` ⇒ `['a','b','c']`;空串 = 根。 */
29
+ export function crumbsOf(path) {
30
+ return path.split('/').filter((s) => s !== '');
31
+ }
32
+ /** 父目录(无父 = 空串,表示根)。 */
33
+ export function parentOf(path) {
34
+ const cut = path.lastIndexOf('/');
35
+ return cut < 0 ? '' : path.slice(0, cut);
36
+ }
37
+ /** 拼接子路径,避免多余斜杠。 */
38
+ export function joinPath(dir, name) {
39
+ return dir === '' ? name : `${dir}/${name}`;
40
+ }
41
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,SAAS,GAA2B;IACxC,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,cAAc;CACpB,CAAA;AAED,6CAA6C;AAC7C,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;IACvB,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;AAChD,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACjC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;AAC1D,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;AAChD,CAAC;AAED,wBAAwB;AACxB,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACjC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;AAC1C,CAAC;AAED,oBAAoB;AACpB,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAY;IAChD,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;AAC7C,CAAC"}
package/docs/README.md CHANGED
@@ -19,6 +19,7 @@
19
19
  | 文档规范 | `docs/README.md`(本文件,路径固定) | 槽位表 + 阅读顺序 |
20
20
  | 任务进度(在办 / 已结案 / 过程叙事) | **不入 `docs/`** —— 由 `task-ledger` skill 管理(`ledger/`) | 不得在 docs 内另建进度文档 |
21
21
  | 运行逻辑 | `docs/design/architecture.md`(路径固定) | 五子包分层、依赖方向、样式注入机制、不变量 |
22
+ | 结构规范(运行逻辑拆分) | `docs/design/structure.md` | 代码分层树(目标态)+ demo 展示分区 + 做/暂缓标注 |
22
23
  | 功能总索引 | `docs/design/features.md`(路径固定) | 每个包提供什么、对应哪个导出 |
23
24
  | 各功能 | `docs/design/features/<包名>.md` | `design` / `ui` / `utils` / `explorer` / `session` 各一份 |
24
25
  | 外部事实 | `docs/design/external/dsh-host.md` | 宿主 API 契约、官方 primitives、CSS 类名发现、暗色判据来源 |
@@ -8,18 +8,20 @@
8
8
 
9
9
  ```
10
10
  dsh-plugin-core/
11
- ├── design/ token + createStyleKit 注入器工厂 + 主题判据 (零 React)
12
- ├── ui/ 控件(Button / Input / Picker / Modal / toast …) (依赖 design)
13
- ├── utils/ 纯方法:日期 / 字符串 / 字节 / 时间区间 / HTTP (零 React / DOM)
14
- ├── explorer/ 工作区浏览面板 + 文件预览 + 选工作区/选文件 (依赖 ui + design)
15
- └── session/ 会话预览 (依赖 ui)
11
+ ├── design/ token + createStyleKit 注入器工厂 + 主题判据 (零 React)
12
+ ├── ui/ 基础控件(Button / Input / Picker / Modal / toast …) (依赖 design)
13
+ ├── utils/ 纯方法:日期 / 字符串 / 字节 / 时间区间 / HTTP / 路径 (零 React / DOM)
14
+ ├── adv.explorer/ 文件浏览成品(目录树 + 面包屑 + 预览) (依赖 ui + utils)
15
+ └── adv.session/ 会话记录预览成品 (依赖 ui + utils)
16
16
  ```
17
17
 
18
+ > 目录名目标态(`adv.` 前缀)。选工作区/选文件在 `ui`,路径方法归 `utils`——结构细节见
19
+ > `docs/design/structure.md`。
20
+
18
21
  ## 依赖方向(单向,不许反向)
19
22
 
20
23
  ```
21
- design ──▶ ui ──▶ explorer
22
- │ └────▶ session
24
+ design ──▶ ui ──▶ adv.explorer / adv.session
23
25
  utils(谁都不依赖,谁都可以用)
24
26
  ```
25
27
 
@@ -27,7 +29,7 @@ utils(谁都不依赖,谁都可以用)
27
29
 
28
30
  - `utils` 不得 import `ui` / `design` / React / DOM / 任何宿主 API —— 它将来要能被整体剥出去复用。
29
31
  - `design` 不得依赖 `ui`(否则「只想用 token 的插件」被迫拖进 React)。
30
- - `ui` 不得依赖 `explorer` / `session`(反向依赖会造成环)。
32
+ - `ui` 不得依赖 `adv.*`(反向依赖会造成环)。
31
33
 
32
34
  ## 立包判据
33
35
 
@@ -1,6 +1,7 @@
1
1
  # explorer —— 工作区浏览
2
2
 
3
- 依赖 `ui` + `design`。装的是「工作区 / 文件」这个领域:浏览面板、预览、选工作区、选文件。
3
+ 依赖 `ui` + `design`。装的是「文件浏览」这个成品:目录树 + 面包屑 + 文件预览。
4
+ 选工作区 / 选文件在 `ui`(`WorkspacePicker` / `FilePicker`),不在这里。
4
5
 
5
6
  ## 宿主契约:`WorkspaceFilesFace`
6
7
 
@@ -14,8 +15,10 @@
14
15
  | `list` | `(sessionId, path, signal?)` ⇒ `{ path, entries: [{ name, type, size? }], truncated }`;list 一个文件会报 not-directory |
15
16
  | `stat?` | 可选;宿主过旧没有此方法时降级。只认普通文件,目录会抛 |
16
17
 
17
- 类型与工具(`types.ts`):`WorkspaceFilesFace` / `DirEntry` / `Listing` / `PreviewKind`,
18
- 以及 `crumbsOf` / `parentOf` / `joinPath` / `extOf` / `mimeOf` / `previewKindOf`。
18
+ 类型与工具(`types.ts`):`WorkspaceFilesFace` / `DirEntry` / `Listing` / `PreviewKind`。
19
+
20
+ 路径方法 `crumbsOf` / `parentOf` / `joinPath` / `extOf` / `mimeOf` 是纯方法(无 UI),
21
+ 建议迁入 `utils/`(`path` 域,待定);`previewKindOf`(决定用哪种预览器)是文件浏览的业务判断,留在内部。
19
22
 
20
23
  ## `ExplorerPanel`
21
24
 
@@ -155,6 +155,10 @@ h(StripCard, {
155
155
 
156
156
  `Chip`:小标签,token 用现成的 `--tdt-chip-bg`;传 `onClick` 才是可点的。
157
157
 
158
+ **语义边界**:`Chip` 只管「胶囊标签」这一件事。**只给图标的小按钮请用 `IconButton`**(`.dsh-tdt-iconbtn`),
159
+ 不要拿 `Chip` 当图标底板——同一个类名两套皮肤(28px 定宽 vs 胶囊形)会互相覆盖、把文字挤成一列。
160
+ 现在一套皮肤只允许出现一次,由 `test/css-contract.test.mjs` 盯着。
161
+
158
162
  ### Modal
159
163
 
160
164
  | 参数 | 类型 | 默认 | 说明 |