dsh-plugin-core 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +6 -8
  2. package/dist/design/index.d.ts +1 -1
  3. package/dist/design/index.d.ts.map +1 -1
  4. package/dist/design/index.js +1 -1
  5. package/dist/design/index.js.map +1 -1
  6. package/dist/design/style-kit.d.ts +4 -9
  7. package/dist/design/style-kit.d.ts.map +1 -1
  8. package/dist/design/style-kit.js +11 -24
  9. package/dist/design/style-kit.js.map +1 -1
  10. package/dist/design/tokens-css.d.ts +1 -1
  11. package/dist/design/tokens-css.d.ts.map +1 -1
  12. package/dist/design/tokens-css.js +130 -132
  13. package/dist/design/tokens-css.js.map +1 -1
  14. package/dist/explorer/ExplorerPanel.js +14 -14
  15. package/dist/explorer/ExplorerPanel.js.map +1 -1
  16. package/dist/explorer/explorer-css.d.ts +1 -1
  17. package/dist/explorer/explorer-css.d.ts.map +1 -1
  18. package/dist/explorer/explorer-css.js +23 -23
  19. package/dist/explorer/explorer-css.js.map +1 -1
  20. package/dist/explorer/preview/index.js +4 -4
  21. package/dist/explorer/preview/index.js.map +1 -1
  22. package/dist/session/index.js +9 -9
  23. package/dist/session/index.js.map +1 -1
  24. package/dist/session/session-css.d.ts +1 -1
  25. package/dist/session/session-css.js +14 -14
  26. package/dist/session/session-css.js.map +1 -1
  27. package/dist/ui/BackToTop.d.ts +1 -1
  28. package/dist/ui/BackToTop.d.ts.map +1 -1
  29. package/dist/ui/BackToTop.js +5 -5
  30. package/dist/ui/BackToTop.js.map +1 -1
  31. package/dist/ui/Button.js +5 -5
  32. package/dist/ui/Button.js.map +1 -1
  33. package/dist/ui/Card.js +8 -8
  34. package/dist/ui/Card.js.map +1 -1
  35. package/dist/ui/Checkbox.d.ts +2 -2
  36. package/dist/ui/Checkbox.d.ts.map +1 -1
  37. package/dist/ui/Checkbox.js +4 -4
  38. package/dist/ui/Checkbox.js.map +1 -1
  39. package/dist/ui/Chip.d.ts +1 -1
  40. package/dist/ui/Chip.d.ts.map +1 -1
  41. package/dist/ui/Chip.js +2 -2
  42. package/dist/ui/Chip.js.map +1 -1
  43. package/dist/ui/EmptyState.js +1 -1
  44. package/dist/ui/EmptyState.js.map +1 -1
  45. package/dist/ui/ErrorBoundary.js +1 -1
  46. package/dist/ui/ErrorBoundary.js.map +1 -1
  47. package/dist/ui/Field.d.ts +1 -1
  48. package/dist/ui/Field.d.ts.map +1 -1
  49. package/dist/ui/Field.js +19 -19
  50. package/dist/ui/Field.js.map +1 -1
  51. package/dist/ui/FieldHint.js +2 -2
  52. package/dist/ui/FieldHint.js.map +1 -1
  53. package/dist/ui/Loading.d.ts +1 -1
  54. package/dist/ui/Loading.d.ts.map +1 -1
  55. package/dist/ui/Loading.js +9 -9
  56. package/dist/ui/Loading.js.map +1 -1
  57. package/dist/ui/MarqueeText.d.ts +3 -3
  58. package/dist/ui/MarqueeText.js +5 -5
  59. package/dist/ui/MarqueeText.js.map +1 -1
  60. package/dist/ui/Modal.js +5 -5
  61. package/dist/ui/Modal.js.map +1 -1
  62. package/dist/ui/ModelPicker.js +1 -1
  63. package/dist/ui/ModelPicker.js.map +1 -1
  64. package/dist/ui/Picker.js +16 -16
  65. package/dist/ui/Picker.js.map +1 -1
  66. package/dist/ui/SectionHead.d.ts +1 -1
  67. package/dist/ui/SectionHead.js +4 -4
  68. package/dist/ui/SectionHead.js.map +1 -1
  69. package/dist/ui/Segmented.js +5 -5
  70. package/dist/ui/Segmented.js.map +1 -1
  71. package/dist/ui/Textarea.d.ts +2 -2
  72. package/dist/ui/Textarea.js +3 -3
  73. package/dist/ui/Textarea.js.map +1 -1
  74. package/dist/ui/Toast.js +3 -3
  75. package/dist/ui/Toast.js.map +1 -1
  76. package/dist/ui/card-css.d.ts +1 -1
  77. package/dist/ui/card-css.d.ts.map +1 -1
  78. package/dist/ui/card-css.js +22 -22
  79. package/dist/ui/card-css.js.map +1 -1
  80. package/dist/ui/chip-css.d.ts +1 -1
  81. package/dist/ui/chip-css.d.ts.map +1 -1
  82. package/dist/ui/chip-css.js +10 -10
  83. package/dist/ui/chip-css.js.map +1 -1
  84. package/dist/ui/controls-css.d.ts +8 -8
  85. package/dist/ui/controls-css.d.ts.map +1 -1
  86. package/dist/ui/controls-css.js +198 -200
  87. package/dist/ui/controls-css.js.map +1 -1
  88. package/dist/ui/css.d.ts +0 -11
  89. package/dist/ui/css.d.ts.map +1 -1
  90. package/dist/ui/css.js +3 -16
  91. package/dist/ui/css.js.map +1 -1
  92. package/dist/ui/feedback-css.d.ts +1 -1
  93. package/dist/ui/feedback-css.d.ts.map +1 -1
  94. package/dist/ui/feedback-css.js +30 -31
  95. package/dist/ui/feedback-css.js.map +1 -1
  96. package/dist/ui/index.d.ts +1 -1
  97. package/dist/ui/index.d.ts.map +1 -1
  98. package/dist/ui/index.js +2 -2
  99. package/dist/ui/index.js.map +1 -1
  100. package/dist/ui/picker-css.d.ts +1 -1
  101. package/dist/ui/picker-css.d.ts.map +1 -1
  102. package/dist/ui/picker-css.js +32 -33
  103. package/dist/ui/picker-css.js.map +1 -1
  104. package/dist/ui/resizer.d.ts +1 -1
  105. package/dist/ui/resizer.d.ts.map +1 -1
  106. package/dist/ui/resizer.js +1 -1
  107. package/dist/ui/resizer.js.map +1 -1
  108. package/docs/design/architecture.md +3 -3
  109. package/docs/design/features/design.md +5 -7
  110. package/docs/design/features/ui.md +4 -4
  111. package/docs/design/features.md +1 -1
  112. package/docs/design/structure.md +1 -1
  113. package/docs/design/style.md +18 -17
  114. package/docs/examples/integration.md +3 -5
  115. package/docs/requirements.md +8 -12
  116. package/package.json +1 -1
@@ -1,6 +1,4 @@
1
- // 自动从 dsh-task-dispatch-table/src/client/ui/{controls-css,loading-css,back-to-top-css}.ts 提取,原文保真。
2
- // 两处前缀在运行时由 buildCss() 替换:类名 dsh-tdt- 、变量 --tdt- 。
3
- // 排除 PROCESS_FILES_CSS(业务件,不进本包,见需求文档 §3)。
1
+ // 控件样式。类名与变量统一使用 dshpc 前缀。
4
2
  export const SEGMENTED_CSS = `
5
3
  /* ── 分段控件(滑动块)P1 ────────────────────────────────────────────────
6
4
  结构一套 + 两个受控轴:size(sm|md|lg) × variant(default|inset)。
@@ -13,104 +11,104 @@ export const SEGMENTED_CSS = `
13
11
  几何 = 段高 = token − 6px(上下各 2px padding + 1px 边框);default 真边框 1px + padding 2px,
14
12
  inset 无边框故 padding 收 3px 把缺的 1px 补回,两种外观总高都 == token(24/28/32),不再多 +2px。
15
13
  以后 Button / Input 的有边 / 无边同此规则。 */
16
- .dsh-tdt-seg{display:inline-flex;align-items:center;gap:2px;padding:2px;border-radius:var(--tdt-radius-md);background:var(--seg-track);}
17
- /* 选中片 = --tdt-solid(亮=白片 / 暗=黑片,2026-10-18 对齐真实插件截图)。
14
+ .dshpc-seg{display:inline-flex;align-items:center;gap:2px;padding:2px;border-radius:var(--dshpc-radius-md);background:var(--seg-track);}
15
+ /* 选中片 = --dshpc-solid(亮=白片 / 暗=黑片,2026-10-18 对齐真实插件截图)。
18
16
  原先取 surface-raised ⇒ 与卡片底(同为 bg-layer-1)同色,选中片在卡上隐形、只剩阴影圈。 */
19
- .dsh-tdt-seg--default{--seg-track:var(--tdt-surface-2);--seg-thumb:var(--tdt-solid);border:1px solid var(--tdt-border);}
20
- .dsh-tdt-seg--inset{--seg-track:var(--tdt-hover);--seg-thumb:var(--tdt-solid);border:0;padding:3px;}
17
+ .dshpc-seg--default{--seg-track:var(--dshpc-surface-2);--seg-thumb:var(--dshpc-solid);border:1px solid var(--dshpc-border);}
18
+ .dshpc-seg--inset{--seg-track:var(--dshpc-hover);--seg-thumb:var(--dshpc-solid);border:0;padding:3px;}
21
19
 
22
- .dsh-tdt-seg__item{appearance:none;display:inline-flex;align-items:center;gap:4px;box-sizing:border-box;
23
- height:calc(var(--tdt-control-h-sm) - 6px);padding:0 12px;border:0;border-radius:var(--tdt-radius-sm);
24
- background:transparent;color:var(--tdt-fg-2);font-family:inherit;font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);
20
+ .dshpc-seg__item{appearance:none;display:inline-flex;align-items:center;gap:4px;box-sizing:border-box;
21
+ height:calc(var(--dshpc-control-h-sm) - 6px);padding:0 12px;border:0;border-radius:var(--dshpc-radius-sm);
22
+ background:transparent;color:var(--dshpc-fg-2);font-family:inherit;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);
25
23
  font-weight:400;white-space:nowrap;cursor:pointer;
26
- 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);}
27
- .dsh-tdt-seg--md .dsh-tdt-seg__item{height:calc(var(--tdt-control-h-md) - 6px);}
28
- .dsh-tdt-seg--lg .dsh-tdt-seg__item{height:calc(var(--tdt-control-h-lg) - 6px);}
29
- .dsh-tdt-seg__item:hover:not([aria-pressed='true']):not(:disabled){color:var(--tdt-fg);}
30
- .dsh-tdt-seg__item[aria-pressed='true']{background:var(--seg-thumb);box-shadow:var(--tdt-shadow-raised);color:var(--tdt-fg);font-weight:600;}
31
- .dsh-tdt-seg__item:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:-2px;}
32
- .dsh-tdt-seg__item:disabled{cursor:default;opacity:.4;}
24
+ transition:color var(--dshpc-dur-fast) var(--dshpc-ease),background-color var(--dshpc-dur-fast) var(--dshpc-ease),box-shadow var(--dshpc-dur-fast) var(--dshpc-ease);}
25
+ .dshpc-seg--md .dshpc-seg__item{height:calc(var(--dshpc-control-h-md) - 6px);}
26
+ .dshpc-seg--lg .dshpc-seg__item{height:calc(var(--dshpc-control-h-lg) - 6px);}
27
+ .dshpc-seg__item:hover:not([aria-pressed='true']):not(:disabled){color:var(--dshpc-fg);}
28
+ .dshpc-seg__item[aria-pressed='true']{background:var(--seg-thumb);box-shadow:var(--dshpc-shadow-raised);color:var(--dshpc-fg);font-weight:600;}
29
+ .dshpc-seg__item:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:-2px;}
30
+ .dshpc-seg__item:disabled{cursor:default;opacity:.4;}
33
31
 
34
32
  /* 段内角标(如「异常」的数量):语义色实面 + 反白字,0 由组件侧不渲染。
35
33
  ⚠️ **必须是正圆**(用户 2026-10-03:「多位数给它撑开了,那不是圆的就没办法了」):
36
34
  固定 16×16 + border-radius:50% + padding:0 + overflow:hidden ⇒ 一位数 / 两位数都是同一个圆,
37
35
  数字缩到 10px 塞得下;不再用 min-width + 左右 padding(那会让宽度随位数增长变椭圆)。 */
38
- .dsh-tdt-seg__badge{display:inline-flex;align-items:center;justify-content:center;flex:none;
36
+ .dshpc-seg__badge{display:inline-flex;align-items:center;justify-content:center;flex:none;
39
37
  width:16px;height:16px;padding:0;overflow:hidden;
40
- border-radius:50%;background:var(--tdt-danger);color:var(--tdt-on-signal);
38
+ border-radius:50%;background:var(--dshpc-danger);color:var(--dshpc-on-signal);
41
39
  font-size:10px;line-height:16px;font-weight:500;font-variant-numeric:tabular-nums;}
42
40
 
43
41
  /* 段内中性计数(如筛选条「全部 11」):**纯文字,无底、无边、无圆角**(对齐 task-ledger 2026-10-18
44
42
  拍板的 .dtl-seg__num:圆圈取了、字再小点);0 由组件侧不渲染。danger 角标仍走 __badge。 */
45
- .dsh-tdt-seg__count{display:inline;flex:none;margin-left:3px;padding:0;border:0;border-radius:0;
46
- background:none;color:var(--tdt-fg-3);font-size:10px;line-height:1;font-weight:400;font-variant-numeric:tabular-nums;}
43
+ .dshpc-seg__count{display:inline;flex:none;margin-left:3px;padding:0;border:0;border-radius:0;
44
+ background:none;color:var(--dshpc-fg-3);font-size:10px;line-height:1;font-weight:400;font-variant-numeric:tabular-nums;}
47
45
 
48
46
  /* block:撑满父宽(表单行用),各段等分 */
49
- .dsh-tdt-seg--block{display:flex;width:100%;}
50
- .dsh-tdt-seg--block .dsh-tdt-seg__item{flex:1 1 auto;justify-content:center;}
47
+ .dshpc-seg--block{display:flex;width:100%;}
48
+ .dshpc-seg--block .dshpc-seg__item{flex:1 1 auto;justify-content:center;}
51
49
 
52
50
  /* weekday:星期多选方块(任务新增 / 编辑页)。基础插件的特殊化定制(用户 2026-10-01 明确要求:
53
51
  原 WeekdayPicker 即「蓝底 + 近似方形」,统一到 Segmented 后由这一修饰类补回两处差异):
54
52
  - 每格做成正方形(宽 = 段高);
55
- - 选中态用品牌蓝(--tdt-business)、反白字,轨道用 hover 灰(与原自绘轨道一致)。
56
- 皮肤集中在此、不内联;调用点只挂 .dsh-tdt-seg--weekday 一个修饰类,符合「皮肤只在 controls-css」的规矩。 */
53
+ - 选中态用品牌蓝(--dshpc-business)、反白字,轨道用 hover 灰(与原自绘轨道一致)。
54
+ 皮肤集中在此、不内联;调用点只挂 .dshpc-seg--weekday 一个修饰类,符合「皮肤只在 controls-css」的规矩。 */
57
55
  /* weekday:星期多选方块(任务新增 / 编辑页)。基础插件的特殊化定制(用户 2026-10-01 明确要求:
58
56
  原 WeekdayPicker 即「蓝底 + 近似方形」,统一到 Segmented 后由这一修饰类补回两处差异):
59
57
  - 每格做成正方形(宽 = 段高);
60
- - 选中态用品牌蓝(--tdt-business)、反白字,轨道用 hover 灰(与原自绘轨道一致)。
58
+ - 选中态用品牌蓝(--dshpc-business)、反白字,轨道用 hover 灰(与原自绘轨道一致)。
61
59
  2026-10-18 用户重申(对齐真实截图):**无外描边**(不管挂哪个 variant,这里一律撤边),
62
60
  且方块之间要有间距(gap 6px,不再 2px 挤成一坨)。 */
63
- .dsh-tdt-seg--weekday{--seg-track:var(--tdt-hover);gap:6px;border:0;padding:3px;}
64
- .dsh-tdt-seg--weekday .dsh-tdt-seg__item{width:calc(var(--tdt-control-h-lg) - 6px);padding:0;justify-content:center;}
65
- .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);}
61
+ .dshpc-seg--weekday{--seg-track:var(--dshpc-hover);gap:6px;border:0;padding:3px;}
62
+ .dshpc-seg--weekday .dshpc-seg__item{width:calc(var(--dshpc-control-h-lg) - 6px);padding:0;justify-content:center;}
63
+ .dshpc-seg--weekday .dshpc-seg__item[aria-pressed='true']{background:var(--dshpc-business);color:var(--dshpc-fg-inverse);box-shadow:var(--dshpc-shadow-raised);}
66
64
 
67
- @media (prefers-reduced-motion: reduce){.dsh-tdt-seg__item{transition:none;}}
65
+ @media (prefers-reduced-motion: reduce){.dshpc-seg__item{transition:none;}}
68
66
  `;
69
67
  export const BUTTON_CSS = `
70
68
  /* ── 按钮 / 图标钮 P2 ───────────────────────────────────────────────────
71
- 与 Segmented 同一条高度纪律:--tdt-control-h-sm(24) / -md(28) / -lg(32),
69
+ 与 Segmented 同一条高度纪律:--dshpc-control-h-sm(24) / -md(28) / -lg(32),
72
70
  有边框的 variant 用 1px 真边框 + 内部 padding 补回,**有边 / 无边同高**。
73
71
  variant 只换颜色,结构 / 尺寸 / 交互只此一份。 */
74
- .dsh-tdt-btn{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:var(--tdt-space-1);
75
- box-sizing:border-box;border:1px solid transparent;border-radius:var(--tdt-radius-md);
76
- background:transparent;color:var(--tdt-fg);font-family:inherit;font-weight:500;white-space:nowrap;cursor:pointer;
77
- 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);}
78
- .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);}
79
- .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);}
80
- .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);}
81
- .dsh-tdt-btn__icon{display:inline-flex;align-items:center;flex:none;}
72
+ .dshpc-btn{appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:var(--dshpc-space-1);
73
+ box-sizing:border-box;border:1px solid transparent;border-radius:var(--dshpc-radius-md);
74
+ background:transparent;color:var(--dshpc-fg);font-family:inherit;font-weight:500;white-space:nowrap;cursor:pointer;
75
+ transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),border-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease),opacity var(--dshpc-dur-fast) var(--dshpc-ease);}
76
+ .dshpc-btn--sm{height:var(--dshpc-control-h-sm);padding:0 10px;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);}
77
+ .dshpc-btn--md{height:var(--dshpc-control-h-md);padding:0 12px;font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}
78
+ .dshpc-btn--lg{height:var(--dshpc-control-h-lg);padding:0 14px;font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}
79
+ .dshpc-btn__icon{display:inline-flex;align-items:center;flex:none;}
82
80
 
83
- .dsh-tdt-btn--primary{background:var(--tdt-accent);color:var(--tdt-fg-inverse);}
84
- .dsh-tdt-btn--primary:hover:not(:disabled){opacity:.9;}
85
- .dsh-tdt-btn--outline{background:var(--tdt-surface-1);border-color:var(--tdt-border-strong);color:var(--tdt-fg);}
86
- .dsh-tdt-btn--outline:hover:not(:disabled){background:var(--tdt-hover);}
87
- .dsh-tdt-btn--ghost{color:var(--tdt-fg-2);}
88
- .dsh-tdt-btn--ghost:hover:not(:disabled){background:var(--tdt-hover);color:var(--tdt-fg);}
89
- .dsh-tdt-btn--danger{background:var(--tdt-danger);color:var(--tdt-on-signal);}
90
- .dsh-tdt-btn--danger:hover:not(:disabled){opacity:.9;}
81
+ .dshpc-btn--primary{background:var(--dshpc-accent);color:var(--dshpc-fg-inverse);}
82
+ .dshpc-btn--primary:hover:not(:disabled){opacity:.9;}
83
+ .dshpc-btn--outline{background:var(--dshpc-surface-1);border-color:var(--dshpc-border-strong);color:var(--dshpc-fg);}
84
+ .dshpc-btn--outline:hover:not(:disabled){background:var(--dshpc-hover);}
85
+ .dshpc-btn--ghost{color:var(--dshpc-fg-2);}
86
+ .dshpc-btn--ghost:hover:not(:disabled){background:var(--dshpc-hover);color:var(--dshpc-fg);}
87
+ .dshpc-btn--danger{background:var(--dshpc-danger);color:var(--dshpc-on-signal);}
88
+ .dshpc-btn--danger:hover:not(:disabled){opacity:.9;}
91
89
  /* danger-ink:红字描边(破坏性次要操作,如卡片上的「删除」),挂与 outline 组合的修饰类 */
92
- .dsh-tdt-btn--danger-ink{border-color:var(--tdt-danger);color:var(--tdt-danger);}
93
- .dsh-tdt-btn--danger-ink:hover:not(:disabled){background:color-mix(in srgb,var(--tdt-danger) 10%,transparent);color:var(--tdt-danger);}
90
+ .dshpc-btn--danger-ink{border-color:var(--dshpc-danger);color:var(--dshpc-danger);}
91
+ .dshpc-btn--danger-ink:hover:not(:disabled){background:color-mix(in srgb,var(--dshpc-danger) 10%,transparent);color:var(--dshpc-danger);}
94
92
  /* link:行内文字链接型(会话 / 产出文件名),无底无边、品牌蓝、hover 下划线 */
95
- .dsh-tdt-btn--link{height:auto;padding:0;border:0;background:none;color:var(--tdt-link);font-weight:400;text-align:left;}
96
- .dsh-tdt-btn--link:hover:not(:disabled){background:none;color:var(--tdt-link);text-decoration:underline;}
97
- .dsh-tdt-btn:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:2px;}
98
- .dsh-tdt-btn:disabled{cursor:default;opacity:.5;}
93
+ .dshpc-btn--link{height:auto;padding:0;border:0;background:none;color:var(--dshpc-link);font-weight:400;text-align:left;}
94
+ .dshpc-btn--link:hover:not(:disabled){background:none;color:var(--dshpc-link);text-decoration:underline;}
95
+ .dshpc-btn:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:2px;}
96
+ .dshpc-btn:disabled{cursor:default;opacity:.5;}
99
97
 
100
- .dsh-tdt-iconbtn{appearance:none;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;
101
- border:1px solid transparent;border-radius:var(--tdt-radius-sm);background:transparent;color:var(--tdt-fg-2);
98
+ .dshpc-iconbtn{appearance:none;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;
99
+ border:1px solid transparent;border-radius:var(--dshpc-radius-sm);background:transparent;color:var(--dshpc-fg-2);
102
100
  font-family:inherit;cursor:pointer;flex:none;
103
- 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);}
104
- .dsh-tdt-iconbtn--sm{width:var(--tdt-control-h-sm);height:var(--tdt-control-h-sm);font-size:var(--tdt-font-sm);}
105
- .dsh-tdt-iconbtn--md{width:var(--tdt-control-h-md);height:var(--tdt-control-h-md);font-size:var(--tdt-font-md);}
106
- .dsh-tdt-iconbtn--lg{width:var(--tdt-control-h-lg);height:var(--tdt-control-h-lg);font-size:var(--tdt-font-md);}
107
- .dsh-tdt-iconbtn--plain{color:var(--tdt-fg-2);}
108
- .dsh-tdt-iconbtn--outline{background:var(--tdt-surface-1);border-color:var(--tdt-border);color:var(--tdt-fg-2);}
109
- .dsh-tdt-iconbtn--danger{color:var(--tdt-danger);}
110
- .dsh-tdt-iconbtn:hover:not(:disabled){background:var(--tdt-hover);color:var(--tdt-fg);}
111
- .dsh-tdt-iconbtn--danger:hover:not(:disabled){background:var(--tdt-hover);color:var(--tdt-danger);}
112
- .dsh-tdt-iconbtn:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:2px;}
113
- .dsh-tdt-iconbtn:disabled{cursor:default;opacity:.4;}
101
+ transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),border-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease),opacity var(--dshpc-dur-fast) var(--dshpc-ease);}
102
+ .dshpc-iconbtn--sm{width:var(--dshpc-control-h-sm);height:var(--dshpc-control-h-sm);font-size:var(--dshpc-font-sm);}
103
+ .dshpc-iconbtn--md{width:var(--dshpc-control-h-md);height:var(--dshpc-control-h-md);font-size:var(--dshpc-font-md);}
104
+ .dshpc-iconbtn--lg{width:var(--dshpc-control-h-lg);height:var(--dshpc-control-h-lg);font-size:var(--dshpc-font-md);}
105
+ .dshpc-iconbtn--plain{color:var(--dshpc-fg-2);}
106
+ .dshpc-iconbtn--outline{background:var(--dshpc-surface-1);border-color:var(--dshpc-border);color:var(--dshpc-fg-2);}
107
+ .dshpc-iconbtn--danger{color:var(--dshpc-danger);}
108
+ .dshpc-iconbtn:hover:not(:disabled){background:var(--dshpc-hover);color:var(--dshpc-fg);}
109
+ .dshpc-iconbtn--danger:hover:not(:disabled){background:var(--dshpc-hover);color:var(--dshpc-danger);}
110
+ .dshpc-iconbtn:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:2px;}
111
+ .dshpc-iconbtn:disabled{cursor:default;opacity:.4;}
114
112
 
115
113
  /* ── 行式文件按钮(图标 + 文件名)P2:**全站唯一实现**(2026-10-04 收编)──────────
116
114
  用途:「产出物 / 附件」那种**一行一个文件**的清单项(基础信息右栏产出物清单、附件区、
@@ -118,204 +116,204 @@ export const BUTTON_CSS = `
118
116
  两个形态修饰类:
119
117
  --block 撑满父宽(清单里一项一行)
120
118
  --inline 内容宽(跟在文字后头,如附件行)
121
- 收编原因:这份皮肤此前只写在 task-list.tsx 的 TASK_LIST_CSS 里(旧名 .dsh-tdt-info-out),
119
+ 收编原因:这份皮肤此前只写在 task-list.tsx 的 TASK_LIST_CSS 里(旧名 .dshpc-info-out),
122
120
  执行记录页展开区要用同一种观感 ⇒ 上提基础层,避免再出现「各写一份外观」(同名不同皮的坑刚踩过)。 */
123
- .dsh-tdt-filechip{appearance:none;-webkit-appearance:none;border:0;border-radius:var(--tdt-radius-xs);
124
- background:transparent;color:var(--tdt-fg);font:inherit;text-align:left;cursor:pointer;min-width:0;
125
- transition:background-color var(--tdt-dur) var(--tdt-ease);}
126
- .dsh-tdt-filechip:hover:not(:disabled){background:var(--tdt-chip-bg);}
127
- .dsh-tdt-filechip:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:1px;}
128
- .dsh-tdt-filechip:disabled{cursor:default;background:transparent;color:var(--tdt-fg-3);}
129
- .dsh-tdt-filechip--block{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;
130
- padding:4px 6px;font-size:var(--tdt-font-xs);}
131
- .dsh-tdt-filechip--inline{display:inline-flex;align-items:center;gap:4px;padding:2px 6px;font-size:var(--tdt-font-sm);}
121
+ .dshpc-filechip{appearance:none;-webkit-appearance:none;border:0;border-radius:var(--dshpc-radius-xs);
122
+ background:transparent;color:var(--dshpc-fg);font:inherit;text-align:left;cursor:pointer;min-width:0;
123
+ transition:background-color var(--dshpc-dur) var(--dshpc-ease);}
124
+ .dshpc-filechip:hover:not(:disabled){background:var(--dshpc-chip-bg);}
125
+ .dshpc-filechip:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px;}
126
+ .dshpc-filechip:disabled{cursor:default;background:transparent;color:var(--dshpc-fg-3);}
127
+ .dshpc-filechip--block{display:flex;align-items:center;gap:6px;width:100%;box-sizing:border-box;
128
+ padding:4px 6px;font-size:var(--dshpc-font-xs);}
129
+ .dshpc-filechip--inline{display:inline-flex;align-items:center;gap:4px;padding:2px 6px;font-size:var(--dshpc-font-sm);}
132
130
 
133
- @media (prefers-reduced-motion: reduce){.dsh-tdt-btn,.dsh-tdt-iconbtn,.dsh-tdt-filechip{transition:none;}}
131
+ @media (prefers-reduced-motion: reduce){.dshpc-btn,.dshpc-iconbtn,.dshpc-filechip{transition:none;}}
134
132
  `;
135
133
  export const FIELD_CSS = `
136
134
  /* ── 输入类 P3 ────────────────────────────────────────────────────────── */
137
- .dsh-tdt-input{box-sizing:border-box;border:1px solid var(--tdt-border);border-radius:var(--tdt-radius-md);
138
- background:var(--tdt-surface-1);color:var(--tdt-fg);font-family:inherit;outline:none;
139
- transition:border-color var(--tdt-dur-fast) var(--tdt-ease),box-shadow var(--tdt-dur-fast) var(--tdt-ease);}
140
- .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);}
141
- .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);}
142
- .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);}
143
- .dsh-tdt-input::placeholder{color:var(--tdt-fg-dim);}
144
- .dsh-tdt-input:focus{border-color:var(--tdt-focus);box-shadow:0 0 0 1px var(--tdt-focus);}
145
- .dsh-tdt-input--error{border-color:var(--tdt-danger);}
146
- .dsh-tdt-input:disabled{cursor:default;opacity:.5;}
135
+ .dshpc-input{box-sizing:border-box;border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);
136
+ background:var(--dshpc-surface-1);color:var(--dshpc-fg);font-family:inherit;outline:none;
137
+ transition:border-color var(--dshpc-dur-fast) var(--dshpc-ease),box-shadow var(--dshpc-dur-fast) var(--dshpc-ease);}
138
+ .dshpc-input--sm{height:var(--dshpc-control-h-sm);padding:0 8px;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);}
139
+ .dshpc-input--md{height:var(--dshpc-control-h-md);padding:0 10px;font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}
140
+ .dshpc-input--lg{height:var(--dshpc-control-h-lg);padding:0 12px;font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}
141
+ .dshpc-input::placeholder{color:var(--dshpc-fg-dim);}
142
+ .dshpc-input:focus{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}
143
+ .dshpc-input--error{border-color:var(--dshpc-danger);}
144
+ .dshpc-input:disabled{cursor:default;opacity:.5;}
147
145
 
148
- .dsh-tdt-pfx{display:inline-flex;align-items:center;box-sizing:border-box;overflow:hidden;
149
- border:1px solid var(--tdt-border);border-radius:var(--tdt-radius-md);background:var(--tdt-surface-1);color:var(--tdt-fg);}
150
- .dsh-tdt-pfx--sm{height:var(--tdt-control-h-sm);}
151
- .dsh-tdt-pfx--md{height:var(--tdt-control-h-md);}
152
- .dsh-tdt-pfx--lg{height:var(--tdt-control-h-lg);}
146
+ .dshpc-pfx{display:inline-flex;align-items:center;box-sizing:border-box;overflow:hidden;
147
+ border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);background:var(--dshpc-surface-1);color:var(--dshpc-fg);}
148
+ .dshpc-pfx--sm{height:var(--dshpc-control-h-sm);}
149
+ .dshpc-pfx--md{height:var(--dshpc-control-h-md);}
150
+ .dshpc-pfx--lg{height:var(--dshpc-control-h-lg);}
153
151
  /* md / lg 档字号跟档走(与同档下拉同字号):此前写死 sm(12px),同排下拉是 13px ⇒ 显得「input 字小」。 */
154
- .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);}
155
- .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);}
156
- .dsh-tdt-pfx--error{border-color:var(--tdt-danger);}
157
- .dsh-tdt-pfx:focus-within{border-color:var(--tdt-focus);box-shadow:0 0 0 1px var(--tdt-focus);}
158
- .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);}
159
- .dsh-tdt-pfx__input{flex:1 1 auto;min-width:0;height:100%;padding:0 8px;border:0;background:transparent;color:var(--tdt-fg);
160
- font-family:inherit;font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);outline:none;}
161
- .dsh-tdt-pfx__input::placeholder{color:var(--tdt-fg-dim);}
152
+ .dshpc-pfx--md .dshpc-pfx__label,.dshpc-pfx--lg .dshpc-pfx__label{font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}
153
+ .dshpc-pfx--md .dshpc-pfx__input,.dshpc-pfx--lg .dshpc-pfx__input{font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}
154
+ .dshpc-pfx--error{border-color:var(--dshpc-danger);}
155
+ .dshpc-pfx:focus-within{border-color:var(--dshpc-focus);box-shadow:0 0 0 1px var(--dshpc-focus);}
156
+ .dshpc-pfx__label{padding:0 8px;color:var(--dshpc-fg-2);font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);white-space:nowrap;border-right:1px solid var(--dshpc-border);}
157
+ .dshpc-pfx__input{flex:1 1 auto;min-width:0;height:100%;padding:0 8px;border:0;background:transparent;color:var(--dshpc-fg);
158
+ font-family:inherit;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);outline:none;}
159
+ .dshpc-pfx__input::placeholder{color:var(--dshpc-fg-dim);}
162
160
 
163
- .dsh-tdt-num{display:inline-flex;align-items:center;justify-content:space-between;box-sizing:border-box;overflow:hidden;
164
- border:1px solid var(--tdt-border);border-radius:var(--tdt-radius-md);background:var(--tdt-surface-1);color:var(--tdt-fg);}
161
+ .dshpc-num{display:inline-flex;align-items:center;justify-content:space-between;box-sizing:border-box;overflow:hidden;
162
+ border:1px solid var(--dshpc-border);border-radius:var(--dshpc-radius-md);background:var(--dshpc-surface-1);color:var(--dshpc-fg);}
165
163
  /* 中段:数字 + 后缀成组居中;容器被消费端拉宽时吃掉全部余量,两端 − / + 因此钉死在左右边缘。 */
166
- .dsh-tdt-num__mid{display:flex;align-items:center;justify-content:center;flex:1 1 auto;min-width:0;}
167
- .dsh-tdt-num--sm{height:var(--tdt-control-h-sm);}
168
- .dsh-tdt-num--md{height:var(--tdt-control-h-md);}
169
- .dsh-tdt-num--lg{height:var(--tdt-control-h-lg);}
170
- .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);}
171
- .dsh-tdt-num--md .dsh-tdt-num__suffix,.dsh-tdt-num--lg .dsh-tdt-num__suffix{font-size:var(--tdt-font-md);}
172
- .dsh-tdt-num--disabled{opacity:.5;}
173
- .dsh-tdt-num__input{width:36px;height:100%;padding:0 2px;border:0;background:transparent;color:var(--tdt-fg);
174
- font-family:inherit;font-size:var(--tdt-font-sm);line-height:var(--tdt-line-sm);text-align:center;outline:none;}
175
- .dsh-tdt-num__suffix{padding:0 6px;color:var(--tdt-fg-2);font-size:var(--tdt-font-sm);white-space:nowrap;}
176
- .dsh-tdt-num .dsh-tdt-iconbtn{border-radius:0;color:var(--tdt-fg-2);flex:none;}
164
+ .dshpc-num__mid{display:flex;align-items:center;justify-content:center;flex:1 1 auto;min-width:0;}
165
+ .dshpc-num--sm{height:var(--dshpc-control-h-sm);}
166
+ .dshpc-num--md{height:var(--dshpc-control-h-md);}
167
+ .dshpc-num--lg{height:var(--dshpc-control-h-lg);}
168
+ .dshpc-num--md .dshpc-num__input,.dshpc-num--lg .dshpc-num__input{font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}
169
+ .dshpc-num--md .dshpc-num__suffix,.dshpc-num--lg .dshpc-num__suffix{font-size:var(--dshpc-font-md);}
170
+ .dshpc-num--disabled{opacity:.5;}
171
+ .dshpc-num__input{width:36px;height:100%;padding:0 2px;border:0;background:transparent;color:var(--dshpc-fg);
172
+ font-family:inherit;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);text-align:center;outline:none;}
173
+ .dshpc-num__suffix{padding:0 6px;color:var(--dshpc-fg-2);font-size:var(--dshpc-font-sm);white-space:nowrap;}
174
+ .dshpc-num .dshpc-iconbtn{border-radius:0;color:var(--dshpc-fg-2);flex:none;}
177
175
 
178
176
  /* 官方 Switch 包装统一:选中 = success 绿。
179
177
  (合并原先 task-editor-css / task-list 两处就地覆盖;选择器带包装类 + role,特异性高于官方。) */
180
- .dsh-tdt-switch button[role='switch'][aria-checked='true']{background:var(--tdt-success);}
178
+ .dshpc-switch button[role='switch'][aria-checked='true']{background:var(--dshpc-success);}
181
179
 
182
180
  /* 多行文本输入(提示词等,P3):卡内无边框(视觉重心在整张卡上),占位色走 dimmed;校验不通过描红盒。
183
- (从 task-editor-css 的 .dsh-tdt-ed-prompt 上提而来;业务文件不再自写 textarea 皮肤。) */
184
- .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;}
185
- .dsh-tdt-textarea::placeholder{color:var(--tdt-fg-dim);}
186
- .dsh-tdt-textarea--error{box-shadow:0 0 0 1px var(--tdt-danger);}
181
+ (从 task-editor-css 的 .dshpc-ed-prompt 上提而来;业务文件不再自写 textarea 皮肤。) */
182
+ .dshpc-textarea{display:block;width:100%;box-sizing:border-box;min-height:132px;padding:2px;border:none;outline:none;background:0 0;color:var(--dshpc-fg);font:inherit;font-size:var(--dshpc-font-lg);line-height:1.6;resize:vertical;}
183
+ .dshpc-textarea::placeholder{color:var(--dshpc-fg-dim);}
184
+ .dshpc-textarea--error{box-shadow:0 0 0 1px var(--dshpc-danger);}
187
185
 
188
186
  /* 拖拽分隔条(编辑分栏 / 预览 dock 共用,U20 #3):6px 命中区,col-resize,不画线,hover/按下浮出浅带。
189
- 具体 z-index 由 .dsh-tdt-ed-resizer / .dsh-tdt-sv-resizer 各自补。 */
190
- .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;}
191
- .dsh-tdt-resizer:hover,.dsh-tdt-resizer:active{background:var(--tdt-hover,rgba(38,49,72,.06));}
187
+ 具体 z-index 由 .dshpc-ed-resizer / .dshpc-sv-resizer 各自补。 */
188
+ .dshpc-resizer{position:absolute;top:0;bottom:0;left:0;width:6px;cursor:col-resize;background:0 0;touch-action:none;user-select:none;}
189
+ .dshpc-resizer:hover,.dshpc-resizer:active{background:var(--dshpc-hover,rgba(38,49,72,.06));}
192
190
 
193
- @media (prefers-reduced-motion: reduce){.dsh-tdt-input,.dsh-tdt-pfx{transition:none;}}
191
+ @media (prefers-reduced-motion: reduce){.dshpc-input,.dshpc-pfx{transition:none;}}
194
192
  `;
195
193
  export const DATETIME_CSS = `
196
194
  /* ── 日期 / 时间 P4 ───────────────────────────────────────────────────── */
197
- .dsh-tdt-dtf-wrap{display:inline-flex;position:relative;min-width:0;}
198
- /* ⚠️ 边框粗细 / 圆角必须与下拉锚点(dsh-tdt-ed-field 的 fieldButtonStyle)完全一致
195
+ .dshpc-dtf-wrap{display:inline-flex;position:relative;min-width:0;}
196
+ /* ⚠️ 边框粗细 / 圆角必须与下拉锚点(dshpc-ed-field 的 fieldButtonStyle)完全一致
199
197
  (用户 2026-10-02 点名:同排的日期框与下拉框看着不是一套)⇒ 这里也是 0.5px + radius-md。 */
200
- .dsh-tdt-dtf{display:inline-flex;align-items:center;gap:6px;box-sizing:border-box;height:var(--tdt-control-h-lg);
201
- min-width:0;max-width:100%;padding:0 8px;border:0.5px solid var(--tdt-border-heavy);border-radius:var(--tdt-radius-md);
202
- background:var(--tdt-surface-1);color:var(--tdt-fg);font:inherit;font-size:var(--tdt-font-md);line-height:var(--tdt-line-md);
203
- cursor:pointer;transition:background-color var(--tdt-dur-fast) var(--tdt-ease),border-color var(--tdt-dur-fast) var(--tdt-ease);}
198
+ .dshpc-dtf{display:inline-flex;align-items:center;gap:6px;box-sizing:border-box;height:var(--dshpc-control-h-lg);
199
+ min-width:0;max-width:100%;padding:0 8px;border:0.5px solid var(--dshpc-border-heavy);border-radius:var(--dshpc-radius-md);
200
+ background:var(--dshpc-surface-1);color:var(--dshpc-fg);font:inherit;font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);
201
+ cursor:pointer;transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),border-color var(--dshpc-dur-fast) var(--dshpc-ease);}
204
202
  /* 日期 / 时间锚点:三档高度(默认 lg=32)。base 已含 lg 高度作兜底,下面三档按 size 覆盖。 */
205
- .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);}
206
- .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);}
207
- .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);}
208
- .dsh-tdt-dtf:hover:not(:disabled){background:var(--tdt-hover);}
209
- .dsh-tdt-dtf:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:2px;}
210
- .dsh-tdt-dtf:disabled{cursor:not-allowed;opacity:.6;}
211
- .dsh-tdt-dtf__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;}
212
- .dsh-tdt-dtf__label--ph{color:var(--tdt-fg-dim);}
213
- .dsh-tdt-dtf__icon{display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;flex:none;color:var(--tdt-fg-3);}
203
+ .dshpc-dtf--sm{height:var(--dshpc-control-h-sm);padding:0 6px;font-size:var(--dshpc-font-sm);line-height:var(--dshpc-line-sm);}
204
+ .dshpc-dtf--md{height:var(--dshpc-control-h-md);padding:0 8px;font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}
205
+ .dshpc-dtf--lg{height:var(--dshpc-control-h-lg);padding:0 8px;font-size:var(--dshpc-font-md);line-height:var(--dshpc-line-md);}
206
+ .dshpc-dtf:hover:not(:disabled){background:var(--dshpc-hover);}
207
+ .dshpc-dtf:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:2px;}
208
+ .dshpc-dtf:disabled{cursor:not-allowed;opacity:.6;}
209
+ .dshpc-dtf__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;}
210
+ .dshpc-dtf__label--ph{color:var(--dshpc-fg-dim);}
211
+ .dshpc-dtf__icon{display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;flex:none;color:var(--dshpc-fg-3);}
214
212
 
215
- .dsh-tdt-layer{position:fixed;z-index:var(--tdt-z-menu);box-sizing:border-box;padding:8px;background:var(--tdt-surface-1);
216
- box-shadow:var(--tdt-shadow-2);border-radius:var(--tdt-radius-md);color:var(--tdt-fg);font-size:var(--tdt-font-md);}
213
+ .dshpc-layer{position:fixed;z-index:var(--dshpc-z-menu);box-sizing:border-box;padding:8px;background:var(--dshpc-surface-1);
214
+ box-shadow:var(--dshpc-shadow-2);border-radius:var(--dshpc-radius-md);color:var(--dshpc-fg);font-size:var(--dshpc-font-md);}
217
215
 
218
- .dsh-tdt-cal__head{display:flex;align-items:center;justify-content:space-between;gap:4px;margin-bottom:4px;}
219
- .dsh-tdt-cal__title{flex:1 1 auto;text-align:center;font-size:var(--tdt-font-md);font-weight:600;color:var(--tdt-fg);}
220
- .dsh-tdt-cal__grid{display:grid;grid-template-columns:repeat(7,32px);gap:2px;}
221
- .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);}
222
- .dsh-tdt-cal__cell{width:32px;height:32px;padding:0;display:flex;align-items:center;justify-content:center;
223
- border:1px solid transparent;border-radius:var(--tdt-radius-md);background:transparent;color:var(--tdt-fg);
224
- font:inherit;font-size:var(--tdt-font-md);cursor:pointer;
225
- transition:background-color var(--tdt-dur-fast) var(--tdt-ease),color var(--tdt-dur-fast) var(--tdt-ease);}
226
- .dsh-tdt-cal__cell--hover{background:var(--tdt-hover);}
227
- .dsh-tdt-cal__cell--out{color:var(--tdt-fg-dim);}
228
- .dsh-tdt-cal__cell--today{border-color:var(--tdt-business);}
229
- .dsh-tdt-cal__cell[aria-pressed='true']{background:var(--tdt-accent);color:var(--tdt-fg-inverse);}
230
- .dsh-tdt-cal__foot{margin-top:6px;padding-top:6px;border-top:1px solid var(--tdt-border);}
216
+ .dshpc-cal__head{display:flex;align-items:center;justify-content:space-between;gap:4px;margin-bottom:4px;}
217
+ .dshpc-cal__title{flex:1 1 auto;text-align:center;font-size:var(--dshpc-font-md);font-weight:600;color:var(--dshpc-fg);}
218
+ .dshpc-cal__grid{display:grid;grid-template-columns:repeat(7,32px);gap:2px;}
219
+ .dshpc-cal__weekday{height:24px;display:flex;align-items:center;justify-content:center;font-size:var(--dshpc-font-sm);color:var(--dshpc-fg-3);}
220
+ .dshpc-cal__cell{width:32px;height:32px;padding:0;display:flex;align-items:center;justify-content:center;
221
+ border:1px solid transparent;border-radius:var(--dshpc-radius-md);background:transparent;color:var(--dshpc-fg);
222
+ font:inherit;font-size:var(--dshpc-font-md);cursor:pointer;
223
+ transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);}
224
+ .dshpc-cal__cell--hover{background:var(--dshpc-hover);}
225
+ .dshpc-cal__cell--out{color:var(--dshpc-fg-dim);}
226
+ .dshpc-cal__cell--today{border-color:var(--dshpc-business);}
227
+ .dshpc-cal__cell[aria-pressed='true']{background:var(--dshpc-accent);color:var(--dshpc-fg-inverse);}
228
+ .dshpc-cal__foot{margin-top:6px;padding-top:6px;border-top:1px solid var(--dshpc-border);}
231
229
 
232
- .dsh-tdt-time__cols{display:flex;gap:4px;}
233
- .dsh-tdt-time__list{width:56px;max-height:196px;overflow-y:auto;display:flex;flex-direction:column;gap:2px;}
234
- .dsh-tdt-time__opt{padding:5px 0;border:0;border-radius:var(--tdt-radius-sm);background:transparent;color:var(--tdt-fg-2);
235
- 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);}
236
- .dsh-tdt-time__opt[aria-selected='true']{background:var(--tdt-hover);color:var(--tdt-fg);font-weight:600;}
237
- .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);}
230
+ .dshpc-time__cols{display:flex;gap:4px;}
231
+ .dshpc-time__list{width:56px;max-height:196px;overflow-y:auto;display:flex;flex-direction:column;gap:2px;}
232
+ .dshpc-time__opt{padding:5px 0;border:0;border-radius:var(--dshpc-radius-sm);background:transparent;color:var(--dshpc-fg-2);
233
+ font:inherit;font-size:var(--dshpc-font-md);cursor:pointer;transition:background-color var(--dshpc-dur-fast) var(--dshpc-ease),color var(--dshpc-dur-fast) var(--dshpc-ease);}
234
+ .dshpc-time__opt[aria-selected='true']{background:var(--dshpc-hover);color:var(--dshpc-fg);font-weight:600;}
235
+ .dshpc-time__foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:6px;padding-top:6px;border-top:1px solid var(--dshpc-border);}
238
236
 
239
- @media (prefers-reduced-motion: reduce){.dsh-tdt-dtf,.dsh-tdt-cal__cell,.dsh-tdt-time__opt{transition:none;}}
237
+ @media (prefers-reduced-motion: reduce){.dshpc-dtf,.dshpc-cal__cell,.dshpc-time__opt{transition:none;}}
240
238
  `;
241
239
  export const SELECT_CSS = `
242
240
  /* 下拉 / 日历 / 时分锚点:键盘可达性描边 + 校验描红(类名从业务层沿用,皮肤归位基础层) */
243
- .dsh-tdt-ed-field:focus-visible{outline:2px solid var(--tdt-business);outline-offset:1px;}
244
- .dsh-tdt-ed-field--error{border-color:var(--tdt-danger)!important;box-shadow:0 0 0 1px var(--tdt-danger);}
241
+ .dshpc-ed-field:focus-visible{outline:2px solid var(--dshpc-business);outline-offset:1px;}
242
+ .dshpc-ed-field--error{border-color:var(--dshpc-danger)!important;box-shadow:0 0 0 1px var(--dshpc-danger);}
245
243
  /* 整行下拉:官方 Menu 的包装 span 是 inline-flex(shrink-to-fit),要连它一起撑满 */
246
- .dsh-tdt-ed-selectwrap{width:100%;}
244
+ .dshpc-ed-selectwrap{width:100%;}
247
245
 
248
246
  /* 省略号三件套(ui-style-guide §三「待抽象 #1」的收敛点):**新代码一律挂这个类**,不再各写一遍。
249
247
  ⚠️ 已有 19 处旧写法待逐步收编(2026-10-04 起新增的调用点不许再手写这三条属性)。 */
250
- .dsh-tdt-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
248
+ .dshpc-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
251
249
 
252
250
  /* 跑马灯文本(MarqueeText):双层——外层只裁剪,内层才 transform 滚动;非 hover 内层自带省略号 */
253
- .dsh-tdt-mq{display:block;overflow:hidden;white-space:nowrap;}
254
- .dsh-tdt-mq .dsh-tdt-mq-in{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:top;}
251
+ .dshpc-mq{display:block;overflow:hidden;white-space:nowrap;}
252
+ .dshpc-mq .dshpc-mq-in{display:inline-block;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:top;}
255
253
  /* ⚠️ 跑法(用户 2026-10-03 拍板):**跑一遍、停在尾字**(播放 1 次 + forwards),不来回弹、不无限跑。
256
254
  滚距 = 精确溢出量 ⇒ 停下时最后一个字正好贴右缘,**不会跑进黑块**(黑块是旧手写版把
257
255
  内层盒子裁了、按「半截文本」平移导致的)。鼠标移开 ⇒ :hover 失效 ⇒ 自动复位回省略号态。 */
258
- .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;}
259
- @keyframes dsh-tdt-mq-scroll{from{transform:translateX(0)}to{transform:translateX(var(--dsh-tdt-mq-dist,-40px))}}
256
+ .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;}
257
+ @keyframes dshpc-mq-scroll{from{transform:translateX(0)}to{transform:translateX(var(--dshpc-mq-dist,-40px))}}
260
258
  `;
261
259
  export const LOADING_CSS = `
262
260
  /* 运行中 / loading 的活动指示:三个小方块依次脉动。 */
263
- @keyframes dsh-tdt-run-block { 0%, 80%, 100% { opacity: 0.25; transform: scale(0.8) } 40% { opacity: 1; transform: scale(1) } }
264
- .dsh-tdt-run-blocks { display: inline-flex; align-items: center; gap: 3px; }
265
- .dsh-tdt-run-blocks > i { width: 5px; height: 5px; border-radius: 1px; background: currentColor; animation: dsh-tdt-run-block 1.2s ease-in-out infinite; }
266
- .dsh-tdt-run-blocks > i:nth-child(2) { animation-delay: 0.15s; }
267
- .dsh-tdt-run-blocks > i:nth-child(3) { animation-delay: 0.3s; }
268
- @media (prefers-reduced-motion: reduce) { .dsh-tdt-run-blocks > i { animation: none; opacity: 1; } }
261
+ @keyframes dshpc-run-block { 0%, 80%, 100% { opacity: 0.25; transform: scale(0.8) } 40% { opacity: 1; transform: scale(1) } }
262
+ .dshpc-run-blocks { display: inline-flex; align-items: center; gap: 3px; }
263
+ .dshpc-run-blocks > i { width: 5px; height: 5px; border-radius: 1px; background: currentColor; animation: dshpc-run-block 1.2s ease-in-out infinite; }
264
+ .dshpc-run-blocks > i:nth-child(2) { animation-delay: 0.15s; }
265
+ .dshpc-run-blocks > i:nth-child(3) { animation-delay: 0.3s; }
266
+ @media (prefers-reduced-motion: reduce) { .dshpc-run-blocks > i { animation: none; opacity: 1; } }
269
267
  `;
270
268
  export const BACK_TO_TOP_CSS = `
271
269
  /* 回到顶部悬浮钮:圆钮、实面、投影;默认隐身,滚过阈值加 .is-visible 才显形。
272
270
  横向 left 由组件按主内容列右缘实时算出(贴在其右侧外侧),不写死。 */
273
- .dsh-tdt-backtotop{
271
+ .dshpc-backtotop{
274
272
  position:fixed;
275
- bottom:var(--tdt-space-4);
276
- z-index:var(--tdt-z-dock);
273
+ bottom:var(--dshpc-space-4);
274
+ z-index:var(--dshpc-z-dock);
277
275
  width:44px;height:44px;
278
276
  display:inline-flex;align-items:center;justify-content:center;
279
277
  padding:0;margin:0;
280
278
  box-sizing:border-box;
281
- border:1px solid var(--tdt-border);
279
+ border:1px solid var(--dshpc-border);
282
280
  border-radius:50%;
283
- background:var(--tdt-solid);
284
- color:var(--tdt-on-solid);
285
- box-shadow:var(--tdt-shadow-2);
281
+ background:var(--dshpc-solid);
282
+ color:var(--dshpc-on-solid);
283
+ box-shadow:var(--dshpc-shadow-2);
286
284
  cursor:pointer;
287
285
  opacity:0;
288
286
  transform:translateY(8px) scale(.92);
289
- transition:opacity var(--tdt-dur) var(--tdt-ease),
290
- transform var(--tdt-dur) var(--tdt-ease),
291
- background-color var(--tdt-dur-fast) var(--tdt-ease);
287
+ transition:opacity var(--dshpc-dur) var(--dshpc-ease),
288
+ transform var(--dshpc-dur) var(--dshpc-ease),
289
+ background-color var(--dshpc-dur-fast) var(--dshpc-ease);
292
290
  pointer-events:none;
293
291
  }
294
- .dsh-tdt-backtotop.is-visible{opacity:1;transform:translateY(0) scale(1);pointer-events:auto;}
295
- .dsh-tdt-backtotop:hover{background:var(--tdt-hover);}
296
- .dsh-tdt-backtotop:active{background:var(--tdt-active);}
297
- .dsh-tdt-backtotop:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:2px;}
292
+ .dshpc-backtotop.is-visible{opacity:1;transform:translateY(0) scale(1);pointer-events:auto;}
293
+ .dshpc-backtotop:hover{background:var(--dshpc-hover);}
294
+ .dshpc-backtotop:active{background:var(--dshpc-active);}
295
+ .dshpc-backtotop:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:2px;}
298
296
  @media (prefers-reduced-motion: reduce){
299
- .dsh-tdt-backtotop{transition:opacity var(--tdt-dur-fast) linear;transform:none;}
297
+ .dshpc-backtotop{transition:opacity var(--dshpc-dur-fast) linear;transform:none;}
300
298
  }
301
299
  `;
302
300
  export const HINT_CSS = `
303
301
  /* ── 问号提示 P4(用户 2026-10-18:对齐真实插件 HelpButton——**带圈的问号图标**)──
304
- 本体 16px 细圈 + 圈内 ?,颜色 fg-3、hover 只提亮不加底(与 dsh-tdt-ed-help 同规矩)。
302
+ 本体 16px 细圈 + 圈内 ?,颜色 fg-3、hover 只提亮不加底(与 dshpc-ed-help 同规矩)。
305
303
  纯 CSS tooltip:hover / 键盘聚焦浮出气泡,零 JS。独立组件,标题后、行尾随处可挂。 */
306
- .dsh-tdt-hint{position:relative;display:inline-flex;align-items:center;justify-content:center;flex:none;
304
+ .dshpc-hint{position:relative;display:inline-flex;align-items:center;justify-content:center;flex:none;
307
305
  box-sizing:border-box;width:14px;height:14px;padding:0;border:1px solid currentColor;border-radius:50%;background:transparent;
308
- color:var(--tdt-fg-3);font-family:inherit;font-size:8px;font-weight:600;line-height:12px;cursor:help;vertical-align:middle;
309
- transition:color var(--tdt-dur-fast) var(--tdt-ease);}
310
- .dsh-tdt-hint:hover,.dsh-tdt-hint:focus-visible{color:var(--tdt-fg);background:0 0;}
311
- .dsh-tdt-hint:focus-visible{outline:2px solid var(--tdt-focus);outline-offset:1px;}
312
- .dsh-tdt-hint__bubble{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);
306
+ color:var(--dshpc-fg-3);font-family:inherit;font-size:8px;font-weight:600;line-height:12px;cursor:help;vertical-align:middle;
307
+ transition:color var(--dshpc-dur-fast) var(--dshpc-ease);}
308
+ .dshpc-hint:hover,.dshpc-hint:focus-visible{color:var(--dshpc-fg);background:0 0;}
309
+ .dshpc-hint:focus-visible{outline:2px solid var(--dshpc-focus);outline-offset:1px;}
310
+ .dshpc-hint__bubble{position:absolute;bottom:calc(100% + 8px);left:50%;transform:translateX(-50%);
313
311
  box-sizing:border-box;width:max-content;max-width:280px;padding:8px 10px;
314
- border-radius:var(--tdt-radius-sm);background:var(--tdt-solid);color:var(--tdt-on-solid);
315
- font-size:var(--tdt-font-xs);line-height:1.7;text-align:left;white-space:normal;
316
- box-shadow:var(--tdt-shadow-2);z-index:var(--tdt-z-menu);
312
+ border-radius:var(--dshpc-radius-sm);background:var(--dshpc-solid);color:var(--dshpc-on-solid);
313
+ font-size:var(--dshpc-font-xs);line-height:1.7;text-align:left;white-space:normal;
314
+ box-shadow:var(--dshpc-shadow-2);z-index:var(--dshpc-z-menu);
317
315
  opacity:0;visibility:hidden;pointer-events:none;
318
- transition:opacity var(--tdt-dur-fast) var(--tdt-ease);}
319
- .dsh-tdt-hint:hover .dsh-tdt-hint__bubble,.dsh-tdt-hint:focus-visible .dsh-tdt-hint__bubble{opacity:1;visibility:visible;}
316
+ transition:opacity var(--dshpc-dur-fast) var(--dshpc-ease);}
317
+ .dshpc-hint:hover .dshpc-hint__bubble,.dshpc-hint:focus-visible .dshpc-hint__bubble{opacity:1;visibility:visible;}
320
318
  `;
321
319
  //# sourceMappingURL=controls-css.js.map
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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
+ {"version":3,"file":"controls-css.js","sourceRoot":"","sources":["../../src/ui/controls-css.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,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"}
package/dist/ui/css.d.ts CHANGED
@@ -1,16 +1,5 @@
1
1
  import { type StyleKit } from '../design/index.js';
2
2
  export declare const CONTROLS_DOMAIN = "controls";
3
- /**
4
- * 把 CSS 模板里的 **变量前缀** `--tdt-` 换成当前插件的。
5
- *
6
- * ⚠️ 类名 `dsh-tdt-` **故意不换**:搬来的控件里 className 是硬编码的 `dsh-tdt-btn` 这类字面量
7
- * (模板字符串里也拼接了),只换 CSS 侧会让选择器与 className 对不上、样式整片失效。
8
- * 要连类名一起隔离,必须同步改造每个控件的 className —— 那是另一个任务。
9
- *
10
- * 已知限制:两个插件若引的 core 版本不同,`.dsh-tdt-*` 规则会互相覆盖(内容相同时无害)。
11
- * 主防线是 style 标签 id(`createStyleKit({ id })`)与变量前缀隔离。
12
- */
13
- export declare function buildCss(template: string, prefix: string): string;
14
3
  export declare function setStyleKit(kit: StyleKit): void;
15
4
  export declare function getStyleKit(): StyleKit;
16
5
  /** 登记 token + 控件样式并确保挂载(幂等)。 */
@@ -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;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"}
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;AA4BzC,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"}