@chenzy-design/core 0.3.1 → 0.4.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 (283) hide show
  1. package/dist/ai-chat-dialogue.d.ts +300 -0
  2. package/dist/ai-chat-dialogue.d.ts.map +1 -0
  3. package/dist/ai-chat-dialogue.js +699 -0
  4. package/dist/ai-chat-dialogue.js.map +1 -0
  5. package/dist/ai-chat-dialogue.test.d.ts +2 -0
  6. package/dist/ai-chat-dialogue.test.d.ts.map +1 -0
  7. package/dist/ai-chat-dialogue.test.js +338 -0
  8. package/dist/ai-chat-dialogue.test.js.map +1 -0
  9. package/dist/ai-chat-input.d.ts +191 -0
  10. package/dist/ai-chat-input.d.ts.map +1 -0
  11. package/dist/ai-chat-input.js +274 -0
  12. package/dist/ai-chat-input.js.map +1 -0
  13. package/dist/ai-chat-input.test.d.ts +2 -0
  14. package/dist/ai-chat-input.test.d.ts.map +1 -0
  15. package/dist/ai-chat-input.test.js +339 -0
  16. package/dist/ai-chat-input.test.js.map +1 -0
  17. package/dist/audio-player.d.ts +154 -0
  18. package/dist/audio-player.d.ts.map +1 -0
  19. package/dist/audio-player.js +254 -0
  20. package/dist/audio-player.js.map +1 -0
  21. package/dist/audio-player.test.d.ts +2 -0
  22. package/dist/audio-player.test.d.ts.map +1 -0
  23. package/dist/audio-player.test.js +275 -0
  24. package/dist/audio-player.test.js.map +1 -0
  25. package/dist/back-top.d.ts +4 -1
  26. package/dist/back-top.d.ts.map +1 -1
  27. package/dist/back-top.js +5 -2
  28. package/dist/back-top.js.map +1 -1
  29. package/dist/back-top.test.js +3 -2
  30. package/dist/back-top.test.js.map +1 -1
  31. package/dist/calendar.d.ts +132 -44
  32. package/dist/calendar.d.ts.map +1 -1
  33. package/dist/calendar.js +413 -70
  34. package/dist/calendar.js.map +1 -1
  35. package/dist/calendar.test.js +160 -76
  36. package/dist/calendar.test.js.map +1 -1
  37. package/dist/chat.d.ts +172 -0
  38. package/dist/chat.d.ts.map +1 -0
  39. package/dist/chat.js +210 -0
  40. package/dist/chat.js.map +1 -0
  41. package/dist/chat.test.d.ts +2 -0
  42. package/dist/chat.test.d.ts.map +1 -0
  43. package/dist/chat.test.js +181 -0
  44. package/dist/chat.test.js.map +1 -0
  45. package/dist/code-highlight.d.ts +30 -0
  46. package/dist/code-highlight.d.ts.map +1 -0
  47. package/dist/code-highlight.js +37 -0
  48. package/dist/code-highlight.js.map +1 -0
  49. package/dist/code-highlight.test.d.ts +2 -0
  50. package/dist/code-highlight.test.d.ts.map +1 -0
  51. package/dist/code-highlight.test.js +36 -0
  52. package/dist/code-highlight.test.js.map +1 -0
  53. package/dist/collapsible.d.ts +41 -0
  54. package/dist/collapsible.d.ts.map +1 -0
  55. package/dist/collapsible.js +33 -0
  56. package/dist/collapsible.js.map +1 -0
  57. package/dist/collapsible.test.d.ts +2 -0
  58. package/dist/collapsible.test.d.ts.map +1 -0
  59. package/dist/collapsible.test.js +57 -0
  60. package/dist/collapsible.test.js.map +1 -0
  61. package/dist/color-value.d.ts +60 -0
  62. package/dist/color-value.d.ts.map +1 -0
  63. package/dist/color-value.js +165 -0
  64. package/dist/color-value.js.map +1 -0
  65. package/dist/color-value.test.d.ts +2 -0
  66. package/dist/color-value.test.d.ts.map +1 -0
  67. package/dist/color-value.test.js +104 -0
  68. package/dist/color-value.test.js.map +1 -0
  69. package/dist/config-provider.d.ts +76 -37
  70. package/dist/config-provider.d.ts.map +1 -1
  71. package/dist/config-provider.js +107 -32
  72. package/dist/config-provider.js.map +1 -1
  73. package/dist/config-provider.test.js +123 -60
  74. package/dist/config-provider.test.js.map +1 -1
  75. package/dist/cropper.d.ts +164 -0
  76. package/dist/cropper.d.ts.map +1 -0
  77. package/dist/cropper.js +841 -0
  78. package/dist/cropper.js.map +1 -0
  79. package/dist/cropper.test.d.ts +2 -0
  80. package/dist/cropper.test.d.ts.map +1 -0
  81. package/dist/cropper.test.js +259 -0
  82. package/dist/cropper.test.js.map +1 -0
  83. package/dist/drag-move.d.ts +119 -0
  84. package/dist/drag-move.d.ts.map +1 -0
  85. package/dist/drag-move.js +237 -0
  86. package/dist/drag-move.js.map +1 -0
  87. package/dist/drag-move.test.d.ts +2 -0
  88. package/dist/drag-move.test.d.ts.map +1 -0
  89. package/dist/drag-move.test.js +304 -0
  90. package/dist/drag-move.test.js.map +1 -0
  91. package/dist/editable.d.ts +24 -4
  92. package/dist/editable.d.ts.map +1 -1
  93. package/dist/editable.js +18 -0
  94. package/dist/editable.js.map +1 -1
  95. package/dist/editable.test.js +55 -2
  96. package/dist/editable.test.js.map +1 -1
  97. package/dist/ellipsis.d.ts +13 -0
  98. package/dist/ellipsis.d.ts.map +1 -1
  99. package/dist/ellipsis.js +36 -0
  100. package/dist/ellipsis.js.map +1 -1
  101. package/dist/ellipsis.test.js +37 -1
  102. package/dist/ellipsis.test.js.map +1 -1
  103. package/dist/form-path.d.ts +19 -0
  104. package/dist/form-path.d.ts.map +1 -0
  105. package/dist/form-path.js +97 -0
  106. package/dist/form-path.js.map +1 -0
  107. package/dist/form-path.test.d.ts +2 -0
  108. package/dist/form-path.test.d.ts.map +1 -0
  109. package/dist/form-path.test.js +57 -0
  110. package/dist/form-path.test.js.map +1 -0
  111. package/dist/form-validate.d.ts +13 -0
  112. package/dist/form-validate.d.ts.map +1 -0
  113. package/dist/form-validate.js +204 -0
  114. package/dist/form-validate.js.map +1 -0
  115. package/dist/form.d.ts +91 -18
  116. package/dist/form.d.ts.map +1 -1
  117. package/dist/form.js +170 -115
  118. package/dist/form.js.map +1 -1
  119. package/dist/form.test.js +349 -76
  120. package/dist/form.test.js.map +1 -1
  121. package/dist/highlight.d.ts +42 -32
  122. package/dist/highlight.d.ts.map +1 -1
  123. package/dist/highlight.js +67 -41
  124. package/dist/highlight.js.map +1 -1
  125. package/dist/highlight.test.js +73 -32
  126. package/dist/highlight.test.js.map +1 -1
  127. package/dist/hotkeys.d.ts +151 -0
  128. package/dist/hotkeys.d.ts.map +1 -0
  129. package/dist/hotkeys.js +188 -0
  130. package/dist/hotkeys.js.map +1 -0
  131. package/dist/hotkeys.test.d.ts +2 -0
  132. package/dist/hotkeys.test.d.ts.map +1 -0
  133. package/dist/hotkeys.test.js +170 -0
  134. package/dist/hotkeys.test.js.map +1 -0
  135. package/dist/index.d.ts +33 -17
  136. package/dist/index.d.ts.map +1 -1
  137. package/dist/index.js +32 -13
  138. package/dist/index.js.map +1 -1
  139. package/dist/input.d.ts +34 -0
  140. package/dist/input.d.ts.map +1 -0
  141. package/dist/input.js +54 -0
  142. package/dist/input.js.map +1 -0
  143. package/dist/input.test.d.ts +2 -0
  144. package/dist/input.test.d.ts.map +1 -0
  145. package/dist/input.test.js +56 -0
  146. package/dist/input.test.js.map +1 -0
  147. package/dist/markdown-render.d.ts +49 -0
  148. package/dist/markdown-render.d.ts.map +1 -0
  149. package/dist/markdown-render.js +61 -0
  150. package/dist/markdown-render.js.map +1 -0
  151. package/dist/markdown-render.test.d.ts +2 -0
  152. package/dist/markdown-render.test.d.ts.map +1 -0
  153. package/dist/markdown-render.test.js +106 -0
  154. package/dist/markdown-render.test.js.map +1 -0
  155. package/dist/notification.d.ts +40 -31
  156. package/dist/notification.d.ts.map +1 -1
  157. package/dist/notification.js +86 -70
  158. package/dist/notification.js.map +1 -1
  159. package/dist/notification.test.js +62 -39
  160. package/dist/notification.test.js.map +1 -1
  161. package/dist/numeral.d.ts +32 -0
  162. package/dist/numeral.d.ts.map +1 -0
  163. package/dist/numeral.js +67 -0
  164. package/dist/numeral.js.map +1 -0
  165. package/dist/numeral.test.d.ts +2 -0
  166. package/dist/numeral.test.d.ts.map +1 -0
  167. package/dist/numeral.test.js +59 -0
  168. package/dist/numeral.test.js.map +1 -0
  169. package/dist/overflow-list.d.ts +9 -40
  170. package/dist/overflow-list.d.ts.map +1 -1
  171. package/dist/overflow-list.js +9 -70
  172. package/dist/overflow-list.js.map +1 -1
  173. package/dist/overflow-list.test.js +1 -122
  174. package/dist/overflow-list.test.js.map +1 -1
  175. package/dist/pagination.d.ts +17 -0
  176. package/dist/pagination.d.ts.map +1 -1
  177. package/dist/pagination.js +48 -0
  178. package/dist/pagination.js.map +1 -1
  179. package/dist/pagination.test.js +40 -1
  180. package/dist/pagination.test.js.map +1 -1
  181. package/dist/pincode.d.ts +79 -0
  182. package/dist/pincode.d.ts.map +1 -0
  183. package/dist/pincode.js +119 -0
  184. package/dist/pincode.js.map +1 -0
  185. package/dist/pincode.test.d.ts +2 -0
  186. package/dist/pincode.test.d.ts.map +1 -0
  187. package/dist/pincode.test.js +151 -0
  188. package/dist/pincode.test.js.map +1 -0
  189. package/dist/progress.d.ts +32 -30
  190. package/dist/progress.d.ts.map +1 -1
  191. package/dist/progress.js +257 -64
  192. package/dist/progress.js.map +1 -1
  193. package/dist/progress.test.js +50 -47
  194. package/dist/progress.test.js.map +1 -1
  195. package/dist/resizable.d.ts +200 -0
  196. package/dist/resizable.d.ts.map +1 -0
  197. package/dist/resizable.js +329 -0
  198. package/dist/resizable.js.map +1 -0
  199. package/dist/resizable.test.d.ts +2 -0
  200. package/dist/resizable.test.d.ts.map +1 -0
  201. package/dist/resizable.test.js +302 -0
  202. package/dist/resizable.test.js.map +1 -0
  203. package/dist/scroll-list.d.ts +69 -62
  204. package/dist/scroll-list.d.ts.map +1 -1
  205. package/dist/scroll-list.js +103 -144
  206. package/dist/scroll-list.js.map +1 -1
  207. package/dist/scroll-list.test.js +100 -110
  208. package/dist/scroll-list.test.js.map +1 -1
  209. package/dist/sidebar.d.ts +46 -0
  210. package/dist/sidebar.d.ts.map +1 -0
  211. package/dist/sidebar.js +65 -0
  212. package/dist/sidebar.js.map +1 -0
  213. package/dist/sidebar.test.d.ts +2 -0
  214. package/dist/sidebar.test.d.ts.map +1 -0
  215. package/dist/sidebar.test.js +88 -0
  216. package/dist/sidebar.test.js.map +1 -0
  217. package/dist/spin.d.ts +5 -5
  218. package/dist/spin.d.ts.map +1 -1
  219. package/dist/spin.js +13 -39
  220. package/dist/spin.js.map +1 -1
  221. package/dist/spin.test.js +2 -26
  222. package/dist/spin.test.js.map +1 -1
  223. package/dist/toast.d.ts +33 -30
  224. package/dist/toast.d.ts.map +1 -1
  225. package/dist/toast.js +77 -72
  226. package/dist/toast.js.map +1 -1
  227. package/dist/toast.test.js +63 -37
  228. package/dist/toast.test.js.map +1 -1
  229. package/dist/tree.d.ts +22 -5
  230. package/dist/tree.d.ts.map +1 -1
  231. package/dist/tree.js +61 -9
  232. package/dist/tree.js.map +1 -1
  233. package/dist/tree.test.js +72 -1
  234. package/dist/tree.test.js.map +1 -1
  235. package/dist/user-guide.d.ts +73 -0
  236. package/dist/user-guide.d.ts.map +1 -0
  237. package/dist/user-guide.js +95 -0
  238. package/dist/user-guide.js.map +1 -0
  239. package/dist/user-guide.test.d.ts +2 -0
  240. package/dist/user-guide.test.d.ts.map +1 -0
  241. package/dist/user-guide.test.js +109 -0
  242. package/dist/user-guide.test.js.map +1 -0
  243. package/dist/video-player.d.ts +196 -0
  244. package/dist/video-player.d.ts.map +1 -0
  245. package/dist/video-player.js +461 -0
  246. package/dist/video-player.js.map +1 -0
  247. package/dist/video-player.test.d.ts +2 -0
  248. package/dist/video-player.test.d.ts.map +1 -0
  249. package/dist/video-player.test.js +435 -0
  250. package/dist/video-player.test.js.map +1 -0
  251. package/package.json +17 -1
  252. package/dist/banner.d.ts +0 -19
  253. package/dist/banner.d.ts.map +0 -1
  254. package/dist/banner.js +0 -20
  255. package/dist/banner.js.map +0 -1
  256. package/dist/banner.test.d.ts +0 -2
  257. package/dist/banner.test.d.ts.map +0 -1
  258. package/dist/banner.test.js +0 -29
  259. package/dist/banner.test.js.map +0 -1
  260. package/dist/breakpoints.d.ts +0 -30
  261. package/dist/breakpoints.d.ts.map +0 -1
  262. package/dist/breakpoints.js +0 -45
  263. package/dist/breakpoints.js.map +0 -1
  264. package/dist/breakpoints.test.d.ts +0 -2
  265. package/dist/breakpoints.test.d.ts.map +0 -1
  266. package/dist/breakpoints.test.js +0 -46
  267. package/dist/breakpoints.test.js.map +0 -1
  268. package/dist/lottie-icon.d.ts +0 -88
  269. package/dist/lottie-icon.d.ts.map +0 -1
  270. package/dist/lottie-icon.js +0 -84
  271. package/dist/lottie-icon.js.map +0 -1
  272. package/dist/lottie-icon.test.d.ts +0 -2
  273. package/dist/lottie-icon.test.d.ts.map +0 -1
  274. package/dist/lottie-icon.test.js +0 -88
  275. package/dist/lottie-icon.test.js.map +0 -1
  276. package/dist/sider.d.ts +0 -26
  277. package/dist/sider.d.ts.map +0 -1
  278. package/dist/sider.js +0 -55
  279. package/dist/sider.js.map +0 -1
  280. package/dist/sider.test.d.ts +0 -2
  281. package/dist/sider.test.d.ts.map +0 -1
  282. package/dist/sider.test.js +0 -29
  283. package/dist/sider.test.js.map +0 -1
@@ -0,0 +1,46 @@
1
+ /**
2
+ * sidebar — framework-agnostic helpers for the SideBar Container (P0).
3
+ *
4
+ * The Container's drag geometry is fully delegated to `createResizeDrag`
5
+ * (resizable.ts, axis:'x' single-axis + clamp) — this module only carries the
6
+ * small pure helpers the Svelte shell needs: parse a CSS size to px and clamp a
7
+ * candidate width into [minWidth, maxWidth]. Kept pure (no DOM, no framework)
8
+ * so it is unit-testable in isolation. See
9
+ * specs/components/show/SideBar.spec.md §3.
10
+ */
11
+ /** Parse a CSS size (`number` = px, or `"NNNpx"` / bare numeric string) to px. */
12
+ export declare function parseSideBarWidth(size: string | number | undefined): number | undefined;
13
+ /** Clamp a candidate width into `[min, max]` (either bound may be undefined). */
14
+ export declare function clampSideBarWidth(width: number, min: number | undefined, max: number | undefined): number;
15
+ /**
16
+ * MCP tool option shape consumed by the pure helpers below (P3 MCPConfigure).
17
+ * Framework-agnostic: only the fields the headless logic reads. The Svelte
18
+ * `MCPReactOption` extends this with `icon`/`desc` render slots.
19
+ * See specs/components/show/SideBar.spec.md §3/§4.
20
+ */
21
+ export interface McpOptionCore {
22
+ /** Unique identity + filter/label fallback. */
23
+ value: string;
24
+ /** Human-readable label (primary filter target). */
25
+ label?: string;
26
+ /** Whether the tool is enabled. */
27
+ active?: boolean;
28
+ /** Whether the enable switch is locked (preset tools). */
29
+ disabled?: boolean;
30
+ }
31
+ /**
32
+ * Default case-insensitive filter: match the trimmed input against `label`
33
+ * (falling back to `value`). Empty input matches everything. A custom
34
+ * `filter(input, option)` predicate takes precedence when provided.
35
+ */
36
+ export declare function filterMcpOptions<T extends McpOptionCore>(input: string, options: readonly T[], filter?: (input: string, option: T) => boolean): T[];
37
+ /**
38
+ * Toggle the `active` flag of the option identified by `value`, returning a new
39
+ * array (pure, no mutation). Disabled options are never toggled. Used by the
40
+ * Svelte shell to derive the next `options`/`customOptions` passed to
41
+ * `onStatusChange` without holding its own mutable copy.
42
+ */
43
+ export declare function toggleMcpOptionActive<T extends McpOptionCore>(options: readonly T[], value: string, active: boolean): T[];
44
+ /** Count enabled (`active`) options across the given lists. */
45
+ export declare function countActiveMcpOptions(...lists: readonly (readonly McpOptionCore[])[]): number;
46
+ //# sourceMappingURL=sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../src/sidebar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAChC,MAAM,GAAG,SAAS,CAUpB;AAED,iFAAiF;AACjF,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,MAAM,CAKR;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,aAAa,EACtD,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,GAC7C,CAAC,EAAE,CAKL;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,aAAa,EAC3D,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,GACd,CAAC,EAAE,CAIL;AAED,+DAA+D;AAC/D,wBAAgB,qBAAqB,CACnC,GAAG,KAAK,EAAE,SAAS,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,GAC9C,MAAM,CAIR"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * sidebar — framework-agnostic helpers for the SideBar Container (P0).
3
+ *
4
+ * The Container's drag geometry is fully delegated to `createResizeDrag`
5
+ * (resizable.ts, axis:'x' single-axis + clamp) — this module only carries the
6
+ * small pure helpers the Svelte shell needs: parse a CSS size to px and clamp a
7
+ * candidate width into [minWidth, maxWidth]. Kept pure (no DOM, no framework)
8
+ * so it is unit-testable in isolation. See
9
+ * specs/components/show/SideBar.spec.md §3.
10
+ */
11
+ /** Parse a CSS size (`number` = px, or `"NNNpx"` / bare numeric string) to px. */
12
+ export function parseSideBarWidth(size) {
13
+ if (size == null)
14
+ return undefined;
15
+ if (typeof size === 'number')
16
+ return Number.isFinite(size) ? size : undefined;
17
+ const trimmed = size.trim();
18
+ if (trimmed.endsWith('px')) {
19
+ const n = Number(trimmed.slice(0, -2));
20
+ return Number.isFinite(n) ? n : undefined;
21
+ }
22
+ const n = Number(trimmed);
23
+ return Number.isFinite(n) ? n : undefined;
24
+ }
25
+ /** Clamp a candidate width into `[min, max]` (either bound may be undefined). */
26
+ export function clampSideBarWidth(width, min, max) {
27
+ let w = width;
28
+ if (min != null)
29
+ w = Math.max(w, min);
30
+ if (max != null)
31
+ w = Math.min(w, max);
32
+ return w;
33
+ }
34
+ /**
35
+ * Default case-insensitive filter: match the trimmed input against `label`
36
+ * (falling back to `value`). Empty input matches everything. A custom
37
+ * `filter(input, option)` predicate takes precedence when provided.
38
+ */
39
+ export function filterMcpOptions(input, options, filter) {
40
+ const q = input.trim().toLowerCase();
41
+ if (filter)
42
+ return options.filter((o) => filter(input, o));
43
+ if (!q)
44
+ return [...options];
45
+ return options.filter((o) => (o.label ?? o.value).toLowerCase().includes(q));
46
+ }
47
+ /**
48
+ * Toggle the `active` flag of the option identified by `value`, returning a new
49
+ * array (pure, no mutation). Disabled options are never toggled. Used by the
50
+ * Svelte shell to derive the next `options`/`customOptions` passed to
51
+ * `onStatusChange` without holding its own mutable copy.
52
+ */
53
+ export function toggleMcpOptionActive(options, value, active) {
54
+ return options.map((o) => o.value === value && !o.disabled ? { ...o, active } : o);
55
+ }
56
+ /** Count enabled (`active`) options across the given lists. */
57
+ export function countActiveMcpOptions(...lists) {
58
+ let n = 0;
59
+ for (const list of lists)
60
+ for (const o of list)
61
+ if (o.active)
62
+ n += 1;
63
+ return n;
64
+ }
65
+ //# sourceMappingURL=sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../src/sidebar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAC/B,IAAiC;IAEjC,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5C,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5C,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAC/B,KAAa,EACb,GAAuB,EACvB,GAAuB;IAEvB,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,IAAI,GAAG,IAAI,IAAI;QAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtC,IAAI,GAAG,IAAI,IAAI;QAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtC,OAAO,CAAC,CAAC;AACX,CAAC;AAmBD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,OAAqB,EACrB,MAA8C;IAE9C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,MAAM;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,CAAC;QAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;IAC5B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAqB,EACrB,KAAa,EACb,MAAe;IAEf,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvB,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CACxD,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,qBAAqB,CACnC,GAAG,KAA4C;IAE/C,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,CAAC,MAAM;gBAAE,CAAC,IAAI,CAAC,CAAC;IACrE,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sidebar.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.test.d.ts","sourceRoot":"","sources":["../src/sidebar.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,88 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseSideBarWidth, clampSideBarWidth, filterMcpOptions, toggleMcpOptionActive, countActiveMcpOptions, } from './sidebar.js';
3
+ describe('parseSideBarWidth', () => {
4
+ it('returns numbers as-is', () => {
5
+ expect(parseSideBarWidth(400)).toBe(400);
6
+ expect(parseSideBarWidth(0)).toBe(0);
7
+ });
8
+ it('parses px strings', () => {
9
+ expect(parseSideBarWidth('320px')).toBe(320);
10
+ });
11
+ it('parses bare numeric strings', () => {
12
+ expect(parseSideBarWidth('250')).toBe(250);
13
+ });
14
+ it('returns undefined for nullish / non-finite', () => {
15
+ expect(parseSideBarWidth(undefined)).toBeUndefined();
16
+ expect(parseSideBarWidth('auto')).toBeUndefined();
17
+ expect(parseSideBarWidth(Number.NaN)).toBeUndefined();
18
+ });
19
+ });
20
+ describe('clampSideBarWidth', () => {
21
+ it('clamps to min', () => {
22
+ expect(clampSideBarWidth(100, 150, undefined)).toBe(150);
23
+ });
24
+ it('clamps to max', () => {
25
+ expect(clampSideBarWidth(900, undefined, 600)).toBe(600);
26
+ });
27
+ it('passes through when in range', () => {
28
+ expect(clampSideBarWidth(300, 150, 600)).toBe(300);
29
+ });
30
+ it('handles both bounds undefined', () => {
31
+ expect(clampSideBarWidth(300, undefined, undefined)).toBe(300);
32
+ });
33
+ });
34
+ const OPTS = [
35
+ { value: 'fs', label: 'File System', active: true },
36
+ { value: 'git', label: 'Git', active: false },
37
+ { value: 'preset', label: 'Preset Search', active: true, disabled: true },
38
+ ];
39
+ describe('filterMcpOptions', () => {
40
+ it('returns all on empty input', () => {
41
+ expect(filterMcpOptions('', OPTS)).toHaveLength(3);
42
+ expect(filterMcpOptions(' ', OPTS)).toHaveLength(3);
43
+ });
44
+ it('matches label case-insensitively', () => {
45
+ expect(filterMcpOptions('git', OPTS).map((o) => o.value)).toEqual(['git']);
46
+ expect(filterMcpOptions('SEARCH', OPTS).map((o) => o.value)).toEqual(['preset']);
47
+ });
48
+ it('falls back to value when label missing', () => {
49
+ const list = [{ value: 'onlyvalue' }];
50
+ expect(filterMcpOptions('only', list)).toHaveLength(1);
51
+ });
52
+ it('honors a custom filter predicate over default', () => {
53
+ const only = filterMcpOptions('x', OPTS, (_i, o) => o.value === 'fs');
54
+ expect(only.map((o) => o.value)).toEqual(['fs']);
55
+ });
56
+ it('does not mutate the source array', () => {
57
+ const copy = [...OPTS];
58
+ filterMcpOptions('git', OPTS);
59
+ expect(OPTS).toEqual(copy);
60
+ });
61
+ });
62
+ describe('toggleMcpOptionActive', () => {
63
+ it('flips active of the matching option, returns new array', () => {
64
+ const next = toggleMcpOptionActive(OPTS, 'git', true);
65
+ expect(next).not.toBe(OPTS);
66
+ expect(next.find((o) => o.value === 'git')?.active).toBe(true);
67
+ expect(next.find((o) => o.value === 'fs')?.active).toBe(true);
68
+ });
69
+ it('never toggles a disabled option', () => {
70
+ const next = toggleMcpOptionActive(OPTS, 'preset', false);
71
+ expect(next.find((o) => o.value === 'preset')?.active).toBe(true);
72
+ });
73
+ it('is a no-op for unknown value (identity-equal contents)', () => {
74
+ const next = toggleMcpOptionActive(OPTS, 'nope', false);
75
+ expect(next.map((o) => o.active)).toEqual(OPTS.map((o) => o.active));
76
+ });
77
+ });
78
+ describe('countActiveMcpOptions', () => {
79
+ it('counts active across multiple lists', () => {
80
+ expect(countActiveMcpOptions(OPTS)).toBe(2);
81
+ expect(countActiveMcpOptions(OPTS, [{ value: 'x', active: true }])).toBe(3);
82
+ });
83
+ it('returns 0 for empty', () => {
84
+ expect(countActiveMcpOptions([])).toBe(0);
85
+ expect(countActiveMcpOptions()).toBe(0);
86
+ });
87
+ });
88
+ //# sourceMappingURL=sidebar.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.test.js","sourceRoot":"","sources":["../src/sidebar.test.ts"],"names":[],"mappings":"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"}
package/dist/spin.d.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * createSpinController — framework-agnostic loading-state debouncer for Spin.
3
- * Handles `delay` (wait before showing, to avoid flicker on fast requests) and
4
- * `minShowTime` (keep showing at least this long once shown). Uses timers only;
5
- * SSR-safe because the consumer starts it in a client effect. No DOM, no
6
- * framework deps. See specs/components/feedback/Spin.spec.md §3.
3
+ * Mirrors Semi's delay semantics (semi-foundation/spin/foundation.ts): when a
4
+ * `delay` is set, showing is postponed by `delay` ms; turning spinning off hides
5
+ * immediately (and cancels any pending delayed show). No minShowTime Semi has
6
+ * none. Uses timers only; SSR-safe because the consumer starts it in a client
7
+ * effect. No DOM, no framework deps.
7
8
  */
8
9
  export interface SpinOptions {
9
10
  delay?: number;
10
- minShowTime?: number;
11
11
  /** initial spinning request */
12
12
  spinning?: boolean;
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"spin.d.ts","sourceRoot":"","sources":["../src/spin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,YAAY,IAAI,OAAO,CAAC;IACxB,qEAAqE;IACrE,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC9D,2DAA2D;IAC3D,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,qCAAqC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAID,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,WAAgB,GAAG,cAAc,CAqF9E"}
1
+ {"version":3,"file":"spin.d.ts","sourceRoot":"","sources":["../src/spin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,YAAY,IAAI,OAAO,CAAC;IACxB,qEAAqE;IACrE,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC9D,2DAA2D;IAC3D,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,qCAAqC;IACrC,OAAO,IAAI,IAAI,CAAC;CACjB;AAID,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,WAAgB,GAAG,cAAc,CA4D9E"}
package/dist/spin.js CHANGED
@@ -1,17 +1,18 @@
1
1
  /**
2
2
  * createSpinController — framework-agnostic loading-state debouncer for Spin.
3
- * Handles `delay` (wait before showing, to avoid flicker on fast requests) and
4
- * `minShowTime` (keep showing at least this long once shown). Uses timers only;
5
- * SSR-safe because the consumer starts it in a client effect. No DOM, no
6
- * framework deps. See specs/components/feedback/Spin.spec.md §3.
3
+ * Mirrors Semi's delay semantics (semi-foundation/spin/foundation.ts): when a
4
+ * `delay` is set, showing is postponed by `delay` ms; turning spinning off hides
5
+ * immediately (and cancels any pending delayed show). No minShowTime Semi has
6
+ * none. Uses timers only; SSR-safe because the consumer starts it in a client
7
+ * effect. No DOM, no framework deps.
7
8
  */
8
9
  export function createSpinController(options = {}) {
9
- const { delay = 0, minShowTime = 0 } = options;
10
+ const { delay = 0 } = options;
10
11
  let requested = options.spinning ?? false;
11
- let effective = false;
12
- let shownAt = 0;
12
+ // Semi seeds loading=true, then getDerivedStateFromProps resolves it against
13
+ // spinning/delay. With no delay, effective tracks `requested` immediately.
14
+ let effective = delay > 0 ? false : requested;
13
15
  let delayTimer = null;
14
- let minTimer = null;
15
16
  const listeners = new Set();
16
17
  function clearDelay() {
17
18
  if (delayTimer !== null) {
@@ -19,18 +20,10 @@ export function createSpinController(options = {}) {
19
20
  delayTimer = null;
20
21
  }
21
22
  }
22
- function clearMin() {
23
- if (minTimer !== null) {
24
- clearTimeout(minTimer);
25
- minTimer = null;
26
- }
27
- }
28
23
  function setEffective(value) {
29
24
  if (effective === value)
30
25
  return;
31
26
  effective = value;
32
- if (value)
33
- shownAt = Date.now();
34
27
  for (const l of listeners)
35
28
  l(effective);
36
29
  }
@@ -47,25 +40,10 @@ export function createSpinController(options = {}) {
47
40
  }
48
41
  }
49
42
  function hide() {
50
- clearDelay(); // cancel a pending show — never displayed, never announced
51
- if (!effective)
52
- return;
53
- if (minShowTime > 0) {
54
- const elapsed = Date.now() - shownAt;
55
- const remaining = minShowTime - elapsed;
56
- if (remaining > 0) {
57
- clearMin();
58
- minTimer = setTimeout(() => {
59
- minTimer = null;
60
- if (!requested)
61
- setEffective(false);
62
- }, remaining);
63
- return;
64
- }
65
- }
43
+ clearDelay(); // cancel a pending show — never displayed
66
44
  setEffective(false);
67
45
  }
68
- // apply the initial request synchronously-ish (delay still honored)
46
+ // apply the initial request (delay still honored)
69
47
  if (requested)
70
48
  show();
71
49
  return {
@@ -78,17 +56,13 @@ export function createSpinController(options = {}) {
78
56
  if (value === requested)
79
57
  return;
80
58
  requested = value;
81
- if (value) {
82
- clearMin();
59
+ if (value)
83
60
  show();
84
- }
85
- else {
61
+ else
86
62
  hide();
87
- }
88
63
  },
89
64
  destroy() {
90
65
  clearDelay();
91
- clearMin();
92
66
  listeners.clear();
93
67
  },
94
68
  };
package/dist/spin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"spin.js","sourceRoot":"","sources":["../src/spin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spin.js","sourceRoot":"","sources":["../src/spin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAqBH,MAAM,UAAU,oBAAoB,CAAC,UAAuB,EAAE;IAC5D,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAE9B,IAAI,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;IAC1C,6EAA6E;IAC7E,2EAA2E;IAC3E,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9C,IAAI,UAAU,GAAmB,IAAI,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgC,CAAC;IAE1D,SAAS,UAAU;QACjB,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,YAAY,CAAC,UAAU,CAAC,CAAC;YACzB,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,SAAS,YAAY,CAAC,KAAc;QAClC,IAAI,SAAS,KAAK,KAAK;YAAE,OAAO;QAChC,SAAS,GAAG,KAAK,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,SAAS,IAAI;QACX,UAAU,EAAE,CAAC;QACb,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5B,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC3B,UAAU,GAAG,IAAI,CAAC;gBAClB,YAAY,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC,EAAE,KAAK,CAAC,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,SAAS,IAAI;QACX,UAAU,EAAE,CAAC,CAAC,0CAA0C;QACxD,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,kDAAkD;IAClD,IAAI,SAAS;QAAE,IAAI,EAAE,CAAC;IAEtB,OAAO;QACL,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;QAC7B,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,WAAW,CAAC,KAAK;YACf,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO;YAChC,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,KAAK;gBAAE,IAAI,EAAE,CAAC;;gBACb,IAAI,EAAE,CAAC;QACd,CAAC;QACD,OAAO;YACL,UAAU,EAAE,CAAC;YACb,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/spin.test.js CHANGED
@@ -35,21 +35,9 @@ describe('createSpinController', () => {
35
35
  expect(seen).toEqual([]); // never flipped to true → no announcement noise
36
36
  c.destroy();
37
37
  });
38
- it('keeps showing for at least minShowTime', () => {
39
- const c = createSpinController({ minShowTime: 500, spinning: true });
40
- expect(c.getEffective()).toBe(true);
41
- vi.advanceTimersByTime(100);
42
- c.setSpinning(false); // wants to hide after only 100ms
43
- expect(c.getEffective()).toBe(true); // still held
44
- vi.advanceTimersByTime(399);
38
+ it('hides immediately when spinning turns off (no minShowTime — Semi has none)', () => {
39
+ const c = createSpinController({ spinning: true });
45
40
  expect(c.getEffective()).toBe(true);
46
- vi.advanceTimersByTime(1);
47
- expect(c.getEffective()).toBe(false); // 500ms reached
48
- c.destroy();
49
- });
50
- it('hides immediately when minShowTime already elapsed', () => {
51
- const c = createSpinController({ minShowTime: 200, spinning: true });
52
- vi.advanceTimersByTime(300);
53
41
  c.setSpinning(false);
54
42
  expect(c.getEffective()).toBe(false);
55
43
  c.destroy();
@@ -64,17 +52,5 @@ describe('createSpinController', () => {
64
52
  expect(seen).toEqual([true, false]);
65
53
  c.destroy();
66
54
  });
67
- it('re-show during minShowTime hold keeps it visible (no flto false)', () => {
68
- const seen = [];
69
- const c = createSpinController({ minShowTime: 500, spinning: true });
70
- c.subscribe((e) => seen.push(e));
71
- vi.advanceTimersByTime(100);
72
- c.setSpinning(false);
73
- c.setSpinning(true); // requested again before the min timer fires
74
- vi.advanceTimersByTime(1000);
75
- expect(c.getEffective()).toBe(true);
76
- expect(seen).toEqual([]); // stayed visible throughout
77
- c.destroy();
78
- });
79
55
  });
80
56
  //# sourceMappingURL=spin.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spin.test.js","sourceRoot":"","sources":["../src/spin.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spin.test.js","sourceRoot":"","sources":["../src/spin.test.ts"],"names":[],"mappings":"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"}
package/dist/toast.d.ts CHANGED
@@ -1,58 +1,61 @@
1
- export type ToastType = 'info' | 'success' | 'warning' | 'error' | 'loading';
2
- /**
3
- * 6 方位(对齐 Notification placement)。向后兼容:旧的 'top'/'bottom' 仍是合法值且默认 'top'。
4
- */
5
- export type ToastPosition = 'topLeft' | 'top' | 'topRight' | 'bottomLeft' | 'bottom' | 'bottomRight';
6
- export type ToastCloseReason = 'timeout' | 'manual' | 'replace' | 'destroyAll';
7
- export type ToastTheme = 'light' | 'dark';
1
+ /** 对齐 Semi strings.types(warning/success/info/error/default)。 */
2
+ export type ToastType = 'info' | 'success' | 'warning' | 'error' | 'default';
3
+ /** 对齐 Semi strings.themes(normal/light)。 */
4
+ export type ToastTheme = 'normal' | 'light';
5
+ export type ToastDirection = 'ltr' | 'rtl';
8
6
  export interface ToastOptions {
9
7
  id?: string;
10
- content: string;
8
+ content: unknown;
11
9
  type?: ToastType;
12
- /** auto-dismiss seconds; 0 = persist (loading defaults to 0) */
10
+ /** 自动关闭秒数;0 = 不自动关闭(对齐 Semi duration)。 */
13
11
  duration?: number;
14
- position?: ToastPosition;
15
- closable?: boolean;
16
- pauseOnHover?: boolean;
17
- /** visual theme of the card */
18
- theme?: ToastTheme;
19
- onClose?: (id: string, reason: ToastCloseReason) => void;
20
- /** 自定义图标(Snippet 或 false 隐藏图标),框架层消费。 */
21
- icon?: any;
22
- /** 是否显示关闭按钮(与 closable 等价,框架层别名)。 */
12
+ /** 是否显示关闭按钮(对齐 Semi showClose)。 */
23
13
  showClose?: boolean;
24
- /** 内容区最大宽度(px 数字或 CSS 字符串),默认 450。 */
14
+ /** 内容区最大宽度(px 数字或 CSS 字符串),对齐 Semi textMaxWidth,默认 450。 */
25
15
  textMaxWidth?: number | string;
26
- /** 堆叠显示模式(所有 toast 叠成一个卡片样式)。 */
16
+ /** 卡片主题(对齐 Semi theme,normal/light)。 */
17
+ theme?: ToastTheme;
18
+ /** 是否堆叠 Toast(对齐 Semi stack,多条叠一摞、hover 展开)。 */
27
19
  stack?: boolean;
20
+ /** 书写方向(对齐 Semi direction)。 */
21
+ direction?: ToastDirection;
22
+ /** 关闭回调(对齐 Semi onClose,无参数)。 */
23
+ onClose?: () => void;
24
+ /** 自定义图标(Snippet 或 ReactNode 对齐;框架层消费)。 */
25
+ icon?: unknown;
28
26
  }
29
27
  export interface ToastItem {
30
28
  id: string;
31
- content: string;
29
+ content: unknown;
32
30
  type: ToastType;
33
31
  duration: number;
34
- position: ToastPosition;
35
- closable: boolean;
36
- pauseOnHover: boolean;
37
- theme: ToastTheme;
38
- onClose: ((id: string, reason: ToastCloseReason) => void) | undefined;
39
- icon: any;
40
32
  showClose: boolean;
41
33
  textMaxWidth: number | string;
34
+ theme: ToastTheme;
42
35
  stack: boolean;
36
+ direction: ToastDirection;
37
+ onClose: (() => void) | undefined;
38
+ icon: unknown;
43
39
  }
44
40
  export interface ToastStoreOptions {
45
- maxCount?: number;
46
41
  defaultDuration?: number;
42
+ defaultTheme?: ToastTheme;
43
+ defaultDirection?: ToastDirection;
47
44
  }
48
45
  export interface ToastStore {
49
46
  getToasts(): ToastItem[];
50
47
  subscribe(listener: (toasts: ToastItem[]) => void): () => void;
51
- /** add or (if id exists) update a toast; returns its id */
48
+ /** 是否已存在该 id(对齐 Semi has)。 */
49
+ has(id: string): boolean;
50
+ /** 新增一条 toast,返回其 id(对齐 Semi addToast)。 */
52
51
  add(options: ToastOptions): string;
53
- remove(id: string, reason?: ToastCloseReason): void;
52
+ /** 按 id 原地更新一条 toast 并重启定时器(对齐 Semi updateToast + restartCloseTimer)。 */
53
+ update(id: string, options: ToastOptions): void;
54
+ remove(id: string): void;
54
55
  removeAll(): void;
56
+ /** 悬停暂停定时器(对齐 Semi clearCloseTimer_)。 */
55
57
  pause(id: string): void;
58
+ /** 离开恢复定时器,从头完整计时(对齐 Semi startCloseTimer_ / restartCloseTimer)。 */
56
59
  resume(id: string): void;
57
60
  destroy(): void;
58
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAC7E;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,KAAK,GACL,UAAU,GACV,YAAY,GACZ,QAAQ,GACR,aAAa,CAAC;AAClB,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,CAAC;AAC/E,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACzD,yCAAyC;IAEzC,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,iCAAiC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAEtE,IAAI,EAAE,GAAG,CAAC;IACV,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,IAAI,SAAS,EAAE,CAAC;IACzB,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC/D,2DAA2D;IAC3D,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC;IACnC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpD,SAAS,IAAI,IAAI,CAAC;IAClB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAUD,wBAAgB,gBAAgB,CAAC,YAAY,GAAE,iBAAsB,GAAG,UAAU,CAiIjF"}
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../src/toast.ts"],"names":[],"mappings":"AAaA,iEAAiE;AACjE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAC7E,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC5C,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,wCAAwC;IACxC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,gDAAgD;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,cAAc,CAAC;IAC1B,OAAO,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAClC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,gBAAgB,CAAC,EAAE,cAAc,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,IAAI,SAAS,EAAE,CAAC;IACzB,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC/D,8BAA8B;IAC9B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,2CAA2C;IAC3C,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC;IACnC,yEAAyE;IACzE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAChD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,IAAI,IAAI,CAAC;IAClB,yCAAyC;IACzC,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,oEAAoE;IACpE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAID,wBAAgB,gBAAgB,CAAC,YAAY,GAAE,iBAAsB,GAAG,UAAU,CAyIjF"}