@chenzy-design/core 0.2.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
@@ -1,175 +1,134 @@
1
1
  /**
2
- * createScrollList helpers — framework-agnostic single-column picker math.
3
- * Pure functions only: scroll offset ↔ selected index mapping, disabled-item
4
- * skipping, and keyboard target resolution. No DOM, no framework deps, no
5
- * internal mutable state the render layer (svelte) owns scroll state and the
6
- * actual CSS scroll-snap. See specs/components/show/ScrollList.spec.md §3
7
- * (single-column subset; momentum/cyclic/multi-column deferred).
2
+ * ScrollList / ScrollItem helpers — framework-agnostic picker math.
3
+ *
4
+ * 严格对齐 Semi Design(semi-foundation/scrollList)。Semi itemFoundation 是有
5
+ * 状态、直接操作真实 DOM 的类;本层遵循 chenzy-design headless 哲学,只抽出**纯函数**
6
+ * 几何 / 文案 / 缓动数学,DOM 读写(节点搬移、getBoundingClientRect)由 svelte 渲染层
7
+ * 用这些函数实现,无 DOM、无框架依赖、无内部可变状态。
8
+ *
9
+ * 对齐来源:
10
+ * - scrollItem.tsx `scrollToNode` / `scrollToCenter` → {@link centerOffset}
11
+ * - itemFoundation `getNearestNodeInfo`(选区中线找最近非禁用节点) → {@link nearestIndex}
12
+ * - scrollTo.ts(semi-animation 驱动 scrollTop) → {@link scrollFrame}
13
+ * (已核 semi-animation 源码:scrollTo 传 `{duration}` 不传 easing → wrapValue 走 bezier 分支 →
14
+ * getEasing(undefined)='linear'=cubic-bezier(.25,.25,.75,.75),数学上即线性。故本层用**线性**缓动,
15
+ * 非弹簧、非 ease-out。)
16
+ * - renderItemList `transform`(选中项文案变换) → {@link resolveItemText}
17
+ * - constants.ts `DEFAULT_ITEM_HEIGHT=36` / `DEFAULT_SCROLL_DURATION=120`
8
18
  */
9
- /** Map a scrollTop offset to the centered item index (clamped to range). */
10
- export function offsetToIndex(scrollTop, itemHeight, count) {
11
- if (itemHeight <= 0 || count <= 0)
12
- return 0;
13
- const raw = Math.round(scrollTop / itemHeight);
14
- return Math.max(0, Math.min(count - 1, raw));
15
- }
16
- /** The scrollTop that centers a given index. */
17
- export function indexToOffset(index, itemHeight) {
18
- return index * itemHeight;
19
- }
20
- /** Index of an item by value, or -1. */
21
- export function indexOfValue(items, value) {
22
- if (value === undefined)
23
- return -1;
24
- return items.findIndex((it) => it.value === value);
25
- }
19
+ /** Semi scrollList numbers 常量。 */
20
+ export const SCROLL_LIST_DEFAULT_ITEM_HEIGHT = 36;
21
+ export const SCROLL_LIST_DEFAULT_SCROLL_DURATION = 120;
26
22
  /**
27
- * Resolve the nearest enabled index at or after `from` in `dir` (+1/-1).
28
- * If none exists in that direction, returns the original `from` unchanged.
23
+ * 解析一项应展示的文案(对齐 Semi renderItemList)。
24
+ * selected 时优先用 transform(item.transform > 公共 transform)变换,否则 text ?? String(value)。
29
25
  */
30
- export function nextEnabledIndex(items, from, dir) {
31
- let i = from + dir;
32
- while (i >= 0 && i < items.length) {
33
- if (!items[i]?.disabled)
34
- return i;
35
- i += dir;
36
- }
37
- return from;
26
+ export function resolveItemText(item, selected, commonTransform) {
27
+ const base = item.text == null ? String(item.value) : item.text;
28
+ if (!selected)
29
+ return base;
30
+ const transform = typeof item.transform === 'function' ? item.transform : commonTransform;
31
+ if (typeof transform === 'function')
32
+ return transform(item.value, base);
33
+ return base;
38
34
  }
39
- /** First enabled index (for Home / value resolution), or -1 if all disabled. */
40
- export function firstEnabledIndex(items) {
41
- for (let i = 0; i < items.length; i += 1) {
42
- if (!items[i]?.disabled)
43
- return i;
44
- }
45
- return -1;
46
- }
47
- /** Last enabled index (for End), or -1 if all disabled. */
48
- export function lastEnabledIndex(items) {
49
- for (let i = items.length - 1; i >= 0; i -= 1) {
50
- if (!items[i]?.disabled)
51
- return i;
52
- }
53
- return -1;
35
+ /**
36
+ * 把某 index 的项**居中**到视窗中线所需的 scrollTop(对齐 Semi scrollToNode):
37
+ * targetTop = node.offsetTop - (wrapperHeight - itemHeight) / 2。
38
+ * offsetTop = index * itemHeight(含 ul 顶部 `:before` 空白,见样式)。
39
+ */
40
+ export function centerOffset(index, itemHeight, wrapperHeight, topPadding = 0) {
41
+ const nodeTop = topPadding + index * itemHeight;
42
+ return nodeTop - (wrapperHeight - itemHeight) / 2;
54
43
  }
55
44
  /**
56
- * Resolve the target index for a keyboard action from the current index.
57
- * Returns the current index when the action can't move (boundary / all
58
- * neighbors disabled). `page` is how many rows PageUp/PageDown move.
45
+ * 给定当前 scrollTop 与视窗高度,求中线最近的**非禁用**项索引(对齐 getNearestNodeInfo)。
46
+ * 中线在视窗几何正中;每项中心 = topPadding + (i + 0.5) * itemHeight - scrollTop。
47
+ * 返回 -1 表示无可选项(全禁用 / 空)。
59
48
  */
60
- export function keyboardTarget(items, current, key, page = 3) {
61
- switch (key) {
62
- case 'ArrowUp':
63
- return nextEnabledIndex(items, current, -1);
64
- case 'ArrowDown':
65
- return nextEnabledIndex(items, current, 1);
66
- case 'Home': {
67
- const f = firstEnabledIndex(items);
68
- return f === -1 ? current : f;
69
- }
70
- case 'End': {
71
- const l = lastEnabledIndex(items);
72
- return l === -1 ? current : l;
73
- }
74
- case 'PageUp': {
75
- let target = current;
76
- for (let n = 0; n < page; n += 1) {
77
- const nxt = nextEnabledIndex(items, target, -1);
78
- if (nxt === target)
79
- break;
80
- target = nxt;
81
- }
82
- return target;
83
- }
84
- case 'PageDown': {
85
- let target = current;
86
- for (let n = 0; n < page; n += 1) {
87
- const nxt = nextEnabledIndex(items, target, 1);
88
- if (nxt === target)
89
- break;
90
- target = nxt;
91
- }
92
- return target;
49
+ export function nearestIndex(scrollTop, itemHeight, wrapperHeight, count, isDisabled, topPadding = 0) {
50
+ if (itemHeight <= 0 || count <= 0)
51
+ return -1;
52
+ const selectorCenter = wrapperHeight / 2;
53
+ let best = -1;
54
+ let bestDist = Infinity;
55
+ for (let i = 0; i < count; i += 1) {
56
+ if (isDisabled(i))
57
+ continue;
58
+ const itemCenter = topPadding + (i + 0.5) * itemHeight - scrollTop;
59
+ const dist = Math.abs(itemCenter - selectorCenter);
60
+ if (dist < bestDist) {
61
+ bestDist = dist;
62
+ best = i;
93
63
  }
94
- default:
95
- return current;
96
64
  }
65
+ return best;
97
66
  }
98
- // ---------------------------------------------------------------------------
99
- // cyclic(循环列)—— 无限轮:用「重复 N 份」+ 中段定位实现。
100
- // 渲染层把 data 重复 `repeat` 份铺成一个长列表(virtual count = count*repeat),
101
- // 滚到靠近首/尾时命令式跳回中段(无动画),视觉无缝。下面是纯索引数学。
102
- // ---------------------------------------------------------------------------
103
- /** 正取模(结果恒非负),把任意整数索引折回 [0, count)。 */
67
+ /** 正取模:把任意整数索引折回 [0, count)(cycled 用)。对齐 Semi `index % list.length` 语义(负值也回正)。 */
104
68
  export function wrapIndex(index, count) {
105
69
  if (count <= 0)
106
70
  return 0;
107
71
  return ((index % count) + count) % count;
108
72
  }
109
73
  /**
110
- * cyclic 列的「虚拟总行数」。把真实 count 重复 repeat 份,
111
- * repeat 必须为奇数且 >= 3,使「中段」居中。count<=0 返回 0。
74
+ * cubic ease-out(先快后缓)。t [0,1]。通用缓动工具。
75
+ * 注意:ScrollList 落定**不**用它——Semi scrollTo 用的是线性(见 {@link scrollFrame})。
112
76
  */
113
- export function cyclicVirtualCount(count, repeat) {
114
- if (count <= 0)
115
- return 0;
116
- return count * Math.max(3, repeat | 1);
77
+ export function easeOut(t) {
78
+ const clamped = t < 0 ? 0 : t > 1 ? 1 : t;
79
+ return 1 - Math.pow(1 - clamped, 3);
117
80
  }
118
81
  /**
119
- * cyclic 列的「中段基准虚拟索引」:把真实索引 logical 映射到位于正中那一份的虚拟索引。
120
- * 例如 count=24、repeat=5 中段从 2*24=48 起,logical=957。
82
+ * 缓动滚动的单帧 scrollTop(照搬 Semi scrollTo.ts:from→to over duration,**线性**)。
83
+ * Semi scrollTo 只传 duration 不传 easing semi-animation 落到 'linear' bezier
84
+ * (cubic-bezier(.25,.25,.75,.75),即匀速 y=x)。故此处用线性插值 `elapsed/duration`。
85
+ * elapsed>=duration 或 duration<=0 时返回 to(落定)。渲染层用 rAF 逐帧调用并写 el.scrollTop。
121
86
  */
122
- export function cyclicCenterIndex(logical, count, repeat) {
123
- if (count <= 0)
124
- return 0;
125
- const r = Math.max(3, repeat | 1);
126
- const mid = Math.floor(r / 2);
127
- return mid * count + wrapIndex(logical, count);
87
+ export function scrollFrame(from, to, elapsed, duration) {
88
+ if (duration <= 0 || elapsed >= duration)
89
+ return to;
90
+ const p = elapsed / duration; // 线性,对齐 Semi
91
+ return from + (to - from) * p;
128
92
  }
129
93
  /**
130
- * cyclic 滚动落定后,判断是否需要把虚拟索引「重定位」回中段(避免滚出重复区边界)。
131
- * 返回新的虚拟索引(与传入逻辑值同余、但落在中段),渲染层据此命令式无动画跳转。
132
- * virtualIndex 已在安全中段(距首尾各至少 count 行)时返回原值(无需跳)。
94
+ * cycled 头部要补多少「份」完整数据,才能让首节点越过上缓冲区顶(对齐 Semi shouldPrepend)。
95
+ * 照搬 Semi while 循环:`while (baseTop + itemHeight >= wrapperTop - wrapperHeight*ratio) { count++; baseTop -= listHeight }`,
96
+ * 参数化为相对坐标 `firstTop = firstNodeTop - wrapperTop`(首 li 顶相对视窗顶的偏移,可负),不读 DOM。
97
+ * ratio=缓冲区为视窗高度的倍数(init 时 2,滚动调整时 1,对齐 Semi)。
133
98
  */
134
- export function cyclicRecenter(virtualIndex, count, repeat) {
135
- if (count <= 0)
99
+ export function shouldPrepend(firstTop, count, itemHeight, wrapperHeight, ratio = 2) {
100
+ if (count <= 0 || itemHeight <= 0)
136
101
  return 0;
137
- const r = Math.max(3, repeat | 1);
138
- const total = count * r;
139
- // 安全区:[count, total-count)。在区内不动。
140
- if (virtualIndex >= count && virtualIndex < total - count)
141
- return virtualIndex;
142
- const logical = wrapIndex(virtualIndex, count);
143
- return cyclicCenterIndex(logical, count, repeat);
144
- }
145
- /**
146
- * 推进一帧惯性:指数衰减 v' = v * decay^(dt/16.67),位移取平均速度积分。
147
- * @param velocity 当前速度(px/ms,正=向下/scrollTop 增大)
148
- * @param dt 帧间隔(ms)
149
- * @param decay 每 ~16.67ms(60fps 一帧)的衰减系数,默认 0.95
150
- * @param minV 停止阈值(px/ms),默认 0.02
151
- */
152
- export function momentumStep(velocity, dt, decay = 0.95, minV = 0.02) {
153
- const frames = dt / (1000 / 60);
154
- const next = velocity * Math.pow(decay, frames);
155
- // 平均速度积分(梯形)得位移,避免高速时单帧跨度过大。
156
- const delta = ((velocity + next) / 2) * dt;
157
- return { velocity: next, delta, done: Math.abs(next) < minV };
102
+ const listHeight = count * itemHeight;
103
+ if (listHeight <= 0)
104
+ return 0;
105
+ const threshold = -wrapperHeight * ratio; // wrapperTop - wrapperHeight*ratio,相对坐标下 wrapperTop=0
106
+ let baseTop = firstTop;
107
+ let n = 0;
108
+ while (baseTop + itemHeight >= threshold) {
109
+ n += 1;
110
+ baseTop -= listHeight;
111
+ }
112
+ return n;
158
113
  }
159
114
  /**
160
- * 根据当前 scrollTop 与剩余速度预测「最终吸附目标行」(含一点惯性前瞻),clamp 到 [0,count)。
161
- * 用于释放瞬间直接算出目标行,再 smooth 吸附(比逐帧更稳,避免抖动)。
162
- * @param scrollTop 当前偏移
163
- * @param velocity 当前速度(px/ms)
164
- * @param itemHeight 行高
165
- * @param count 行数
166
- * @param projection 速度前瞻系数(默认 80:v*80 px 的滑行预估)
115
+ * cycled 尾部要补多少「份」完整数据,才能让尾节点越过下缓冲区底(对齐 Semi shouldAppend)。
116
+ * 照搬 Semi while 循环:`while (baseTop <= wrapperTop + wrapperHeight*ratio) { count++; baseTop += listHeight }`,
117
+ * 参数化为相对坐标 `lastTop = lastNodeTop - wrapperTop`(尾 li 顶相对视窗顶的偏移),不读 DOM。
167
118
  */
168
- export function projectSettleIndex(scrollTop, velocity, itemHeight, count, projection = 80) {
169
- if (itemHeight <= 0 || count <= 0)
119
+ export function shouldAppend(lastTop, count, itemHeight, wrapperHeight, ratio = 2) {
120
+ if (count <= 0 || itemHeight <= 0)
121
+ return 0;
122
+ const listHeight = count * itemHeight;
123
+ if (listHeight <= 0)
170
124
  return 0;
171
- const projected = scrollTop + velocity * projection;
172
- const raw = Math.round(projected / itemHeight);
173
- return Math.max(0, Math.min(count - 1, raw));
125
+ const threshold = wrapperHeight * ratio; // wrapperTop + wrapperHeight*ratio,相对坐标下 wrapperTop=0
126
+ let baseTop = lastTop;
127
+ let n = 0;
128
+ while (baseTop <= threshold) {
129
+ n += 1;
130
+ baseTop += listHeight;
131
+ }
132
+ return n;
174
133
  }
175
134
  //# sourceMappingURL=scroll-list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-list.js","sourceRoot":"","sources":["../src/scroll-list.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scroll-list.js","sourceRoot":"","sources":["../src/scroll-list.ts"],"names":[],"mappings":"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"}
@@ -1,135 +1,125 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { offsetToIndex, indexToOffset, indexOfValue, nextEnabledIndex, firstEnabledIndex, lastEnabledIndex, keyboardTarget, wrapIndex, cyclicVirtualCount, cyclicCenterIndex, cyclicRecenter, momentumStep, projectSettleIndex, } from './scroll-list.js';
2
+ import { resolveItemText, centerOffset, nearestIndex, wrapIndex, easeOut, scrollFrame, shouldPrepend, shouldAppend, SCROLL_LIST_DEFAULT_ITEM_HEIGHT, SCROLL_LIST_DEFAULT_SCROLL_DURATION, } from './scroll-list.js';
3
3
  const items = [
4
- { value: 0, label: '0' },
5
- { value: 1, label: '1', disabled: true },
6
- { value: 2, label: '2' },
7
- { value: 3, label: '3' },
8
- { value: 4, label: '4', disabled: true },
9
- { value: 5, label: '5' },
4
+ { value: 0 },
5
+ { value: 1, disabled: true },
6
+ { value: 2, text: '' },
7
+ { value: 3 },
8
+ { value: 4, disabled: true },
9
+ { value: 5 },
10
10
  ];
11
- describe('offset index', () => {
12
- it('rounds offset to nearest index and clamps', () => {
13
- expect(offsetToIndex(0, 36, 6)).toBe(0);
14
- expect(offsetToIndex(40, 36, 6)).toBe(1); // 40/36 ≈ 1.1 → 1
15
- expect(offsetToIndex(90, 36, 6)).toBe(3); // 90/36 = 2.5 → 3 (round half up)
16
- expect(offsetToIndex(9999, 36, 6)).toBe(5); // clamp to last
17
- expect(offsetToIndex(-50, 36, 6)).toBe(0); // clamp to first
18
- });
19
- it('indexToOffset centers an index', () => {
20
- expect(indexToOffset(0, 36)).toBe(0);
21
- expect(indexToOffset(3, 36)).toBe(108);
22
- });
23
- it('handles degenerate inputs', () => {
24
- expect(offsetToIndex(10, 0, 6)).toBe(0);
25
- expect(offsetToIndex(10, 36, 0)).toBe(0);
11
+ describe('constants 对齐 Semi', () => {
12
+ it('DEFAULT_ITEM_HEIGHT=36, DEFAULT_SCROLL_DURATION=120', () => {
13
+ expect(SCROLL_LIST_DEFAULT_ITEM_HEIGHT).toBe(36);
14
+ expect(SCROLL_LIST_DEFAULT_SCROLL_DURATION).toBe(120);
26
15
  });
27
16
  });
28
- describe('indexOfValue', () => {
29
- it('finds the index of a value', () => {
30
- expect(indexOfValue(items, 3)).toBe(3);
31
- expect(indexOfValue(items, 99)).toBe(-1);
32
- expect(indexOfValue(items, undefined)).toBe(-1);
17
+ describe('resolveItemText(对齐 Semi renderItemList transform)', () => {
18
+ it('未选中用 text ?? value', () => {
19
+ expect(resolveItemText({ value: 3 }, false)).toBe('3');
20
+ expect(resolveItemText({ value: 2, text: '两' }, false)).toBe('两');
33
21
  });
34
- });
35
- describe('enabled-index navigation (skips disabled)', () => {
36
- it('nextEnabledIndex skips disabled in both directions', () => {
37
- expect(nextEnabledIndex(items, 0, 1)).toBe(2); // skip disabled 1
38
- expect(nextEnabledIndex(items, 3, 1)).toBe(5); // skip disabled 4
39
- expect(nextEnabledIndex(items, 2, -1)).toBe(0); // skip disabled 1
22
+ it('选中且有 item.transform 优先用之', () => {
23
+ const item = { value: 8, transform: (v) => `${v}时` };
24
+ expect(resolveItemText(item, true)).toBe('8时');
25
+ // 未选中不变换
26
+ expect(resolveItemText(item, false)).toBe('8');
40
27
  });
41
- it('returns the same index at a boundary', () => {
42
- expect(nextEnabledIndex(items, 5, 1)).toBe(5); // no enabled after
43
- expect(nextEnabledIndex(items, 0, -1)).toBe(0); // no enabled before
28
+ it('选中用公共 transform(无 item.transform 时)', () => {
29
+ expect(resolveItemText({ value: 8 }, true, (v) => `第${v}`)).toBe('第8');
44
30
  });
45
- it('first/last enabled', () => {
46
- expect(firstEnabledIndex(items)).toBe(0);
47
- expect(lastEnabledIndex(items)).toBe(5);
48
- expect(firstEnabledIndex([{ value: 'x', label: 'x', disabled: true }])).toBe(-1);
31
+ it('item.transform 优先于公共 transform', () => {
32
+ const item = { value: 8, transform: (v) => `A${v}` };
33
+ expect(resolveItemText(item, true, (v) => `B${v}`)).toBe('A8');
49
34
  });
50
35
  });
51
- describe('keyboardTarget', () => {
52
- it('ArrowUp/Down skip disabled', () => {
53
- expect(keyboardTarget(items, 0, 'ArrowDown')).toBe(2);
54
- expect(keyboardTarget(items, 2, 'ArrowUp')).toBe(0);
55
- });
56
- it('Home/End jump to first/last enabled', () => {
57
- expect(keyboardTarget(items, 3, 'Home')).toBe(0);
58
- expect(keyboardTarget(items, 0, 'End')).toBe(5);
36
+ describe('centerOffset(对齐 Semi scrollToNode)', () => {
37
+ it(' index 居中所需 scrollTop = index*ih - (wrapperH - ih)/2', () => {
38
+ // ih=36, wrapperH=300, index=0 → 0 - (300-36)/2 = -132
39
+ expect(centerOffset(0, 36, 300)).toBe(-132);
40
+ // index=5 → 180 - 132 = 48
41
+ expect(centerOffset(5, 36, 300)).toBe(48);
59
42
  });
60
- it('PageDown moves up to `page` enabled rows, stopping at boundary', () => {
61
- // from 0, page 3, enabled order: 0→2→3→5 ; 3 steps → 5
62
- expect(keyboardTarget(items, 0, 'PageDown', 3)).toBe(5);
63
- // from 0, page 2 → 0→2→3 → index 3
64
- expect(keyboardTarget(items, 0, 'PageDown', 2)).toBe(3);
43
+ it(' topPadding 偏移', () => {
44
+ expect(centerOffset(0, 36, 300, 132)).toBe(0); // padding 抵消
65
45
  });
66
- it('PageUp stops at the first enabled', () => {
67
- expect(keyboardTarget(items, 5, 'PageUp', 10)).toBe(0);
46
+ });
47
+ describe('nearestIndex(对齐 getNearestNodeInfo,跳过禁用)', () => {
48
+ it('中线对准第 i 项时返回 i(非禁用)', () => {
49
+ const ih = 36;
50
+ const wrapperH = 300;
51
+ const isDisabled = (i) => Boolean(items[i]?.disabled);
52
+ // scrollTop 使 index 3 居中:centerOffset(3) = 108 - 132 = -24
53
+ const st = centerOffset(3, ih, wrapperH);
54
+ expect(nearestIndex(st, ih, wrapperH, items.length, isDisabled)).toBe(3);
55
+ });
56
+ it('中线落在禁用项时选最近的非禁用', () => {
57
+ const ih = 36;
58
+ const wrapperH = 300;
59
+ const isDisabled = (i) => Boolean(items[i]?.disabled);
60
+ // 对准 index 1(禁用)→ 应回退到相邻非禁用(0 或 2,距离相等取先命中的 0)
61
+ const st = centerOffset(1, ih, wrapperH);
62
+ const idx = nearestIndex(st, ih, wrapperH, items.length, isDisabled);
63
+ expect(idx === 0 || idx === 2).toBe(true);
64
+ });
65
+ it('全禁用或空返回 -1', () => {
66
+ expect(nearestIndex(0, 36, 300, 0, () => false)).toBe(-1);
67
+ expect(nearestIndex(0, 36, 300, 3, () => true)).toBe(-1);
68
+ expect(nearestIndex(0, 0, 300, 3, () => false)).toBe(-1);
68
69
  });
69
70
  });
70
- describe('cyclic 循环索引', () => {
71
- it('wrapIndex 正取模折回 [0,count)', () => {
71
+ describe('wrapIndex(cycled 取模,对齐 index % list.length)', () => {
72
+ it('折回 [0,count)(含负值回正)', () => {
72
73
  expect(wrapIndex(0, 24)).toBe(0);
73
74
  expect(wrapIndex(24, 24)).toBe(0);
74
75
  expect(wrapIndex(25, 24)).toBe(1);
75
76
  expect(wrapIndex(-1, 24)).toBe(23);
76
- expect(wrapIndex(-25, 24)).toBe(23);
77
77
  expect(wrapIndex(5, 0)).toBe(0);
78
78
  });
79
- it('cyclicVirtualCount 重复奇数份', () => {
80
- expect(cyclicVirtualCount(24, 5)).toBe(120);
81
- expect(cyclicVirtualCount(24, 4)).toBe(120); // 4 |1 = 5
82
- expect(cyclicVirtualCount(24, 1)).toBe(72); // min 3
83
- expect(cyclicVirtualCount(0, 5)).toBe(0);
84
- });
85
- it('cyclicCenterIndex 映射到中段', () => {
86
- // count=24, repeat=5 mid=2 → 中段从 48 起
87
- expect(cyclicCenterIndex(9, 24, 5)).toBe(57);
88
- expect(cyclicCenterIndex(0, 24, 5)).toBe(48);
89
- expect(cyclicCenterIndex(24 + 9, 24, 5)).toBe(57); // 同余
90
- });
91
- it('cyclicRecenter 仅在边界外重定位', () => {
92
- // total=120, 安全区 [24,96)
93
- expect(cyclicRecenter(57, 24, 5)).toBe(57); // 区内不动
94
- expect(cyclicRecenter(10, 24, 5)).toBe(cyclicCenterIndex(10, 24, 5)); // 越下界
95
- expect(cyclicRecenter(100, 24, 5)).toBe(cyclicCenterIndex(wrapIndex(100, 24), 24, 5));
96
- // 重定位后必同余
97
- expect(wrapIndex(cyclicRecenter(5, 24, 5), 24)).toBe(5);
79
+ });
80
+ describe('缓动 easeOut / scrollFrame(对齐 Semi scrollTo.ts)', () => {
81
+ it('easeOut 单调、端点 0/1、越界 clamp', () => {
82
+ expect(easeOut(0)).toBe(0);
83
+ expect(easeOut(1)).toBe(1);
84
+ expect(easeOut(-1)).toBe(0);
85
+ expect(easeOut(2)).toBe(1);
86
+ expect(easeOut(0.5)).toBeGreaterThan(0.5); // ease-out 前段更快
87
+ });
88
+ it('scrollFrame 起点=from、终点=to、duration<=0 直接落定', () => {
89
+ expect(scrollFrame(0, 100, 0, 120)).toBe(0);
90
+ expect(scrollFrame(0, 100, 120, 120)).toBe(100);
91
+ expect(scrollFrame(0, 100, 200, 120)).toBe(100); // 超时 clamp
92
+ expect(scrollFrame(0, 100, 50, 0)).toBe(100); // 无动画直接落定
93
+ const mid = scrollFrame(0, 100, 60, 120);
94
+ expect(mid).toBeGreaterThan(0);
95
+ expect(mid).toBeLessThan(100);
98
96
  });
99
97
  });
100
- describe('惯性物理 momentum', () => {
101
- it('momentumStep 按帧指数衰减且方向不变', () => {
102
- const s = momentumStep(1, 16.67, 0.95, 0.02);
103
- expect(s.velocity).toBeLessThan(1);
104
- expect(s.velocity).toBeGreaterThan(0);
105
- expect(s.delta).toBeGreaterThan(0);
106
- expect(s.done).toBe(false);
107
- });
108
- it('momentumStep 低于阈值标记 done', () => {
109
- const s = momentumStep(0.01, 16.67, 0.95, 0.02);
110
- expect(s.done).toBe(true);
111
- });
112
- it('momentumStep 负速度(向上)位移为负', () => {
113
- const s = momentumStep(-1, 16.67);
114
- expect(s.delta).toBeLessThan(0);
115
- expect(s.velocity).toBeGreaterThan(-1);
116
- });
117
- it('momentumStep 连续推进速度单调收敛到 0', () => {
118
- let v = 2;
119
- for (let i = 0; i < 200; i += 1)
120
- v = momentumStep(v, 16.67).velocity;
121
- expect(Math.abs(v)).toBeLessThan(0.02);
122
- });
123
- it('projectSettleIndex 含速度前瞻并 clamp', () => {
124
- // scrollTop 0,速度 0 → 行 0
125
- expect(projectSettleIndex(0, 0, 36, 24)).toBe(0);
126
- // scrollTop=360(行10),向下速度前瞻 80px:(360+80)/36≈12.2 → round 12
127
- expect(projectSettleIndex(360, 1, 36, 24, 80)).toBe(12);
128
- // clamp 到末行
129
- expect(projectSettleIndex(99999, 5, 36, 24)).toBe(23);
130
- // clamp 到首行
131
- expect(projectSettleIndex(0, -5, 36, 24)).toBe(0);
132
- expect(projectSettleIndex(0, 0, 0, 24)).toBe(0);
98
+ describe('shouldPrepend / shouldAppend(cycled 补份数,逐份 while 循环对齐 Semi)', () => {
99
+ // 校准自 Semi 官方 demo 实测:hours(12项)→4 份(48 li)、minutes(60项)→2 份(120 li)。
100
+ // init 基准份 selected(idx=1) 居中 baseFirstTop=(300-36)/2 - 1*36=96。
101
+ it('hours(count=12)init(ratio=2) 头 2 份 + 尾 1 份,合基准共 4 份(对齐 Semi 48 li)', () => {
102
+ const firstTop = (300 - 36) / 2 - 1 * 36; // 96
103
+ const lastTop = firstTop + (12 - 1) * 36; // 492
104
+ expect(shouldPrepend(firstTop, 12, 36, 300, 2)).toBe(2);
105
+ expect(shouldAppend(lastTop, 12, 36, 300, 2)).toBe(1);
106
+ // 总份 = prepend + 1 基准 + append
107
+ expect(2 + 1 + 1).toBe(4);
108
+ });
109
+ it('minutes(count=60)init(ratio=2) 头 1 份 + 尾 0 份,合基准共 2 份(对齐 Semi 120 li)', () => {
110
+ const firstTop = (300 - 36) / 2 - 1 * 36; // 96
111
+ const lastTop = firstTop + (60 - 1) * 36; // 2220
112
+ expect(shouldPrepend(firstTop, 60, 36, 300, 2)).toBe(1);
113
+ expect(shouldAppend(lastTop, 60, 36, 300, 2)).toBe(0);
114
+ expect(1 + 1 + 0).toBe(2);
115
+ });
116
+ it('滚动调整用 ratio=1(缓冲收窄为 1× 视窗)', () => {
117
+ // 首项恰在视窗顶(firstTop=0):ratio=1 时上方需 1 份缓冲
118
+ expect(shouldPrepend(0, 12, 36, 300, 1)).toBe(1);
119
+ });
120
+ it('退化输入返回 0', () => {
121
+ expect(shouldPrepend(0, 0, 36, 300)).toBe(0);
122
+ expect(shouldAppend(0, 12, 0, 300)).toBe(0);
133
123
  });
134
124
  });
135
125
  //# sourceMappingURL=scroll-list.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-list.test.js","sourceRoot":"","sources":["../src/scroll-list.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scroll-list.test.js","sourceRoot":"","sources":["../src/scroll-list.test.ts"],"names":[],"mappings":"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"}