@chenzy-design/svelte 0.1.0 → 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 (476) hide show
  1. package/dist/components.json +1 -1
  2. package/package.json +7 -8
  3. package/src/_floating/use-floating.ts +0 -208
  4. package/src/anchor/Anchor.a11y.test.ts +0 -49
  5. package/src/anchor/Anchor.kbd.test.ts +0 -70
  6. package/src/anchor/Anchor.svelte +0 -359
  7. package/src/anchor/AnchorKbdFixture.svelte +0 -24
  8. package/src/anchor/index.ts +0 -3
  9. package/src/anchor/meta.ts +0 -70
  10. package/src/anchor/types.ts +0 -8
  11. package/src/autocomplete/AutoComplete.a11y.test.ts +0 -49
  12. package/src/autocomplete/AutoComplete.kbd.test.ts +0 -69
  13. package/src/autocomplete/AutoComplete.svelte +0 -706
  14. package/src/autocomplete/AutoCompleteKbdFixture.svelte +0 -24
  15. package/src/autocomplete/index.ts +0 -2
  16. package/src/autocomplete/meta.ts +0 -41
  17. package/src/avatar/Avatar.a11y.test.ts +0 -37
  18. package/src/avatar/Avatar.svelte +0 -315
  19. package/src/avatar/AvatarGroup.svelte +0 -142
  20. package/src/avatar/context.ts +0 -21
  21. package/src/avatar/index.ts +0 -10
  22. package/src/avatar/meta.ts +0 -73
  23. package/src/back-top/BackTop.a11y.test.ts +0 -40
  24. package/src/back-top/BackTop.svelte +0 -314
  25. package/src/back-top/index.ts +0 -2
  26. package/src/back-top/meta.ts +0 -108
  27. package/src/badge/Badge.a11y.test.ts +0 -35
  28. package/src/badge/Badge.svelte +0 -328
  29. package/src/badge/BadgeA11yFixture.svelte +0 -18
  30. package/src/badge/index.ts +0 -2
  31. package/src/badge/meta.ts +0 -62
  32. package/src/banner/Banner.a11y.test.ts +0 -48
  33. package/src/banner/Banner.svelte +0 -368
  34. package/src/banner/index.ts +0 -3
  35. package/src/banner/meta.ts +0 -121
  36. package/src/breadcrumb/Breadcrumb.a11y.test.ts +0 -35
  37. package/src/breadcrumb/Breadcrumb.kbd.test.ts +0 -45
  38. package/src/breadcrumb/Breadcrumb.svelte +0 -414
  39. package/src/breadcrumb/BreadcrumbKbdFixture.svelte +0 -23
  40. package/src/breadcrumb/Item.svelte +0 -77
  41. package/src/breadcrumb/context.ts +0 -27
  42. package/src/breadcrumb/index.ts +0 -21
  43. package/src/breadcrumb/meta.ts +0 -128
  44. package/src/breadcrumb/types.ts +0 -4
  45. package/src/button/Button.a11y.test.ts +0 -54
  46. package/src/button/Button.svelte +0 -176
  47. package/src/button/index.ts +0 -2
  48. package/src/button/meta.ts +0 -28
  49. package/src/calendar/Calendar.a11y.test.ts +0 -51
  50. package/src/calendar/Calendar.kbd.test.ts +0 -59
  51. package/src/calendar/Calendar.svelte +0 -1344
  52. package/src/calendar/CalendarKbdFixture.svelte +0 -23
  53. package/src/calendar/index.ts +0 -3
  54. package/src/calendar/meta.ts +0 -117
  55. package/src/card/Card.a11y.test.ts +0 -38
  56. package/src/card/Card.svelte +0 -341
  57. package/src/card/CardMeta.svelte +0 -60
  58. package/src/card/index.ts +0 -8
  59. package/src/card/meta.ts +0 -83
  60. package/src/carousel/Carousel.a11y.test.ts +0 -53
  61. package/src/carousel/Carousel.kbd.test.ts +0 -67
  62. package/src/carousel/Carousel.svelte +0 -806
  63. package/src/carousel/CarouselA11yFixture.svelte +0 -25
  64. package/src/carousel/CarouselKbdFixture.svelte +0 -24
  65. package/src/carousel/index.ts +0 -2
  66. package/src/carousel/meta.ts +0 -74
  67. package/src/cascader/Cascader.a11y.test.ts +0 -59
  68. package/src/cascader/Cascader.kbd.test.ts +0 -56
  69. package/src/cascader/Cascader.svelte +0 -1570
  70. package/src/cascader/CascaderKbdFixture.svelte +0 -31
  71. package/src/cascader/index.ts +0 -3
  72. package/src/cascader/meta.ts +0 -57
  73. package/src/cascader/types.ts +0 -9
  74. package/src/checkbox/Checkbox.svelte +0 -281
  75. package/src/checkbox/CheckboxGroup.a11y.test.ts +0 -43
  76. package/src/checkbox/CheckboxGroup.kbd.test.ts +0 -40
  77. package/src/checkbox/CheckboxGroup.svelte +0 -122
  78. package/src/checkbox/CheckboxGroupKbdFixture.svelte +0 -20
  79. package/src/checkbox/context.ts +0 -31
  80. package/src/checkbox/index.ts +0 -4
  81. package/src/checkbox/meta.ts +0 -67
  82. package/src/collapse/Collapse.a11y.test.ts +0 -53
  83. package/src/collapse/Collapse.kbd.test.ts +0 -89
  84. package/src/collapse/Collapse.svelte +0 -406
  85. package/src/collapse/CollapseA11yFixture.svelte +0 -27
  86. package/src/collapse/CollapseKbdFixture.svelte +0 -25
  87. package/src/collapse/CollapsePanel.svelte +0 -102
  88. package/src/collapse/context.ts +0 -54
  89. package/src/collapse/index.ts +0 -17
  90. package/src/collapse/meta.ts +0 -79
  91. package/src/collapse/types.ts +0 -5
  92. package/src/color-picker/ColorPicker.a11y.test.ts +0 -60
  93. package/src/color-picker/ColorPicker.kbd.test.ts +0 -73
  94. package/src/color-picker/ColorPicker.svelte +0 -985
  95. package/src/color-picker/ColorPickerKbdFixture.svelte +0 -25
  96. package/src/color-picker/index.ts +0 -2
  97. package/src/color-picker/meta.ts +0 -47
  98. package/src/config-provider/ConfigProvider.svelte +0 -227
  99. package/src/config-provider/context.ts +0 -29
  100. package/src/config-provider/index.ts +0 -48
  101. package/src/config-provider/meta.ts +0 -128
  102. package/src/date-picker/DatePicker.a11y.test.ts +0 -45
  103. package/src/date-picker/DatePicker.kbd.test.ts +0 -71
  104. package/src/date-picker/DatePicker.svelte +0 -1798
  105. package/src/date-picker/DatePickerKbdFixture.svelte +0 -26
  106. package/src/date-picker/RangePicker.kbd.test.ts +0 -69
  107. package/src/date-picker/RangePicker.svelte +0 -775
  108. package/src/date-picker/RangePickerKbdFixture.svelte +0 -30
  109. package/src/date-picker/index.ts +0 -4
  110. package/src/date-picker/meta.ts +0 -67
  111. package/src/date-picker/range-meta.ts +0 -44
  112. package/src/descriptions/Descriptions.a11y.test.ts +0 -33
  113. package/src/descriptions/Descriptions.svelte +0 -287
  114. package/src/descriptions/DescriptionsItem.svelte +0 -43
  115. package/src/descriptions/context.ts +0 -21
  116. package/src/descriptions/index.ts +0 -16
  117. package/src/descriptions/meta.ts +0 -45
  118. package/src/descriptions/types.ts +0 -6
  119. package/src/divider/Divider.a11y.test.ts +0 -23
  120. package/src/divider/Divider.svelte +0 -154
  121. package/src/divider/index.ts +0 -2
  122. package/src/divider/meta.ts +0 -23
  123. package/src/drawer/Drawer.a11y.test.ts +0 -41
  124. package/src/drawer/Drawer.kbd.test.ts +0 -67
  125. package/src/drawer/Drawer.svelte +0 -554
  126. package/src/drawer/DrawerKbdFixture.svelte +0 -28
  127. package/src/drawer/index.ts +0 -2
  128. package/src/drawer/meta.ts +0 -127
  129. package/src/dropdown/Dropdown.a11y.test.ts +0 -46
  130. package/src/dropdown/Dropdown.kbd.test.ts +0 -56
  131. package/src/dropdown/Dropdown.svelte +0 -573
  132. package/src/dropdown/DropdownA11yFixture.svelte +0 -24
  133. package/src/dropdown/DropdownDivider.svelte +0 -17
  134. package/src/dropdown/DropdownItem.svelte +0 -127
  135. package/src/dropdown/DropdownItemNode.svelte +0 -355
  136. package/src/dropdown/DropdownKbdFixture.svelte +0 -26
  137. package/src/dropdown/DropdownMenu.svelte +0 -24
  138. package/src/dropdown/DropdownSubMenu.svelte +0 -212
  139. package/src/dropdown/DropdownTitle.svelte +0 -34
  140. package/src/dropdown/context.ts +0 -13
  141. package/src/dropdown/index.ts +0 -36
  142. package/src/dropdown/meta.ts +0 -97
  143. package/src/dropdown/types.test.ts +0 -50
  144. package/src/dropdown/types.ts +0 -67
  145. package/src/empty/Empty.a11y.test.ts +0 -24
  146. package/src/empty/Empty.svelte +0 -304
  147. package/src/empty/index.ts +0 -2
  148. package/src/empty/meta.ts +0 -41
  149. package/src/form/Field.svelte +0 -492
  150. package/src/form/FieldArray.svelte +0 -75
  151. package/src/form/Form.a11y.test.ts +0 -39
  152. package/src/form/Form.svelte +0 -243
  153. package/src/form/FormA11yFixture.svelte +0 -31
  154. package/src/form/FormCascader.svelte +0 -82
  155. package/src/form/FormCheckbox.svelte +0 -83
  156. package/src/form/FormDatePicker.svelte +0 -80
  157. package/src/form/FormErrorMessage.svelte +0 -44
  158. package/src/form/FormInput.svelte +0 -95
  159. package/src/form/FormLabel.svelte +0 -46
  160. package/src/form/FormRadio.svelte +0 -83
  161. package/src/form/FormRating.svelte +0 -85
  162. package/src/form/FormSection.svelte +0 -45
  163. package/src/form/FormSelect.svelte +0 -96
  164. package/src/form/FormSlider.svelte +0 -95
  165. package/src/form/FormSlot.svelte +0 -51
  166. package/src/form/FormSwitch.svelte +0 -82
  167. package/src/form/FormTagInput.svelte +0 -79
  168. package/src/form/FormTreeSelect.svelte +0 -85
  169. package/src/form/FormUpload.svelte +0 -92
  170. package/src/form/context.ts +0 -47
  171. package/src/form/index.ts +0 -22
  172. package/src/form/meta.ts +0 -85
  173. package/src/grid/Col.svelte +0 -142
  174. package/src/grid/Grid.a11y.test.ts +0 -14
  175. package/src/grid/GridA11yFixture.svelte +0 -12
  176. package/src/grid/Row.svelte +0 -116
  177. package/src/grid/index.ts +0 -3
  178. package/src/grid/meta.ts +0 -72
  179. package/src/grid/use-breakpoint.svelte.ts +0 -48
  180. package/src/highlight/Highlight.a11y.test.ts +0 -25
  181. package/src/highlight/Highlight.svelte +0 -99
  182. package/src/highlight/index.ts +0 -2
  183. package/src/highlight/meta.ts +0 -80
  184. package/src/icon/Icon.svelte +0 -156
  185. package/src/icon/index.ts +0 -2
  186. package/src/icon/meta.ts +0 -41
  187. package/src/image/Image.a11y.test.ts +0 -30
  188. package/src/image/Image.svelte +0 -387
  189. package/src/image/ImagePreview.kbd.test.ts +0 -52
  190. package/src/image/ImagePreview.svelte +0 -309
  191. package/src/image/ImagePreviewGroup.svelte +0 -93
  192. package/src/image/ImagePreviewKbdFixture.svelte +0 -32
  193. package/src/image/context.ts +0 -26
  194. package/src/image/index.ts +0 -15
  195. package/src/image/meta.ts +0 -131
  196. package/src/index.ts +0 -208
  197. package/src/input/Input.a11y.test.ts +0 -58
  198. package/src/input/Input.svelte +0 -505
  199. package/src/input/index.ts +0 -2
  200. package/src/input/meta.ts +0 -40
  201. package/src/input-number/InputNumber.a11y.test.ts +0 -43
  202. package/src/input-number/InputNumber.kbd.test.ts +0 -41
  203. package/src/input-number/InputNumber.svelte +0 -674
  204. package/src/input-number/InputNumberKbdFixture.svelte +0 -15
  205. package/src/input-number/index.ts +0 -2
  206. package/src/input-number/meta.ts +0 -65
  207. package/src/layout/Content.svelte +0 -37
  208. package/src/layout/Footer.svelte +0 -49
  209. package/src/layout/Header.svelte +0 -46
  210. package/src/layout/Layout.a11y.test.ts +0 -34
  211. package/src/layout/Layout.svelte +0 -60
  212. package/src/layout/LayoutA11yFixture.svelte +0 -21
  213. package/src/layout/Sider.svelte +0 -207
  214. package/src/layout/index.ts +0 -26
  215. package/src/layout/meta.ts +0 -116
  216. package/src/list/List.a11y.test.ts +0 -69
  217. package/src/list/List.bench.ts +0 -26
  218. package/src/list/List.kbd.test.ts +0 -71
  219. package/src/list/List.svelte +0 -920
  220. package/src/list/ListA11yFixture.svelte +0 -38
  221. package/src/list/ListBenchFixture.svelte +0 -22
  222. package/src/list/ListItem.svelte +0 -175
  223. package/src/list/ListKbdFixture.svelte +0 -31
  224. package/src/list/ListMeta.svelte +0 -73
  225. package/src/list/context.ts +0 -39
  226. package/src/list/index.ts +0 -21
  227. package/src/list/meta.ts +0 -99
  228. package/src/locale-provider/LocaleProvider.svelte +0 -110
  229. package/src/locale-provider/context.ts +0 -22
  230. package/src/locale-provider/index.ts +0 -21
  231. package/src/locale-provider/meta.ts +0 -93
  232. package/src/locale-provider/use-locale.ts +0 -25
  233. package/src/lottie-icon/LottieIcon.svelte +0 -330
  234. package/src/lottie-icon/index.ts +0 -9
  235. package/src/lottie-icon/meta.ts +0 -162
  236. package/src/menu/Menu.a11y.test.ts +0 -54
  237. package/src/menu/Menu.kbd.test.ts +0 -69
  238. package/src/menu/Menu.svelte +0 -762
  239. package/src/menu/MenuKbdFixture.svelte +0 -22
  240. package/src/menu/MenuPopupNode.svelte +0 -525
  241. package/src/menu/index.ts +0 -4
  242. package/src/menu/meta.ts +0 -137
  243. package/src/menu/types.ts +0 -120
  244. package/src/meta.test.ts +0 -173
  245. package/src/modal/ConfirmModal.svelte +0 -173
  246. package/src/modal/Modal.a11y.test.ts +0 -46
  247. package/src/modal/Modal.kbd.test.ts +0 -65
  248. package/src/modal/Modal.svelte +0 -511
  249. package/src/modal/ModalKbdFixture.svelte +0 -24
  250. package/src/modal/command.svelte.ts +0 -103
  251. package/src/modal/index.ts +0 -30
  252. package/src/modal/meta.ts +0 -165
  253. package/src/modal/z-stack.ts +0 -26
  254. package/src/notification/NotificationContainer.svelte +0 -192
  255. package/src/notification/NotificationItem.a11y.test.ts +0 -73
  256. package/src/notification/NotificationItem.svelte +0 -368
  257. package/src/notification/index.ts +0 -9
  258. package/src/notification/meta.ts +0 -120
  259. package/src/notification/store.ts +0 -191
  260. package/src/overflow-list/OverflowList.a11y.test.ts +0 -46
  261. package/src/overflow-list/OverflowList.kbd.test.ts +0 -34
  262. package/src/overflow-list/OverflowList.svelte +0 -539
  263. package/src/overflow-list/OverflowListA11yFixture.svelte +0 -22
  264. package/src/overflow-list/OverflowListKbdFixture.svelte +0 -21
  265. package/src/overflow-list/index.ts +0 -2
  266. package/src/overflow-list/meta.ts +0 -138
  267. package/src/pagination/Pagination.a11y.test.ts +0 -62
  268. package/src/pagination/Pagination.kbd.test.ts +0 -66
  269. package/src/pagination/Pagination.svelte +0 -428
  270. package/src/pagination/PaginationKbdFixture.svelte +0 -15
  271. package/src/pagination/index.ts +0 -2
  272. package/src/pagination/meta.ts +0 -73
  273. package/src/popconfirm/Popconfirm.a11y.test.ts +0 -46
  274. package/src/popconfirm/Popconfirm.kbd.test.ts +0 -42
  275. package/src/popconfirm/Popconfirm.svelte +0 -724
  276. package/src/popconfirm/PopconfirmA11yFixture.svelte +0 -34
  277. package/src/popconfirm/PopconfirmKbdFixture.svelte +0 -17
  278. package/src/popconfirm/index.ts +0 -2
  279. package/src/popconfirm/meta.ts +0 -200
  280. package/src/popover/Popover.a11y.test.ts +0 -58
  281. package/src/popover/Popover.kbd.test.ts +0 -42
  282. package/src/popover/Popover.svelte +0 -643
  283. package/src/popover/PopoverA11yFixture.svelte +0 -35
  284. package/src/popover/PopoverKbdFixture.svelte +0 -18
  285. package/src/popover/index.ts +0 -2
  286. package/src/popover/meta.ts +0 -103
  287. package/src/progress/Progress.a11y.test.ts +0 -37
  288. package/src/progress/Progress.svelte +0 -423
  289. package/src/progress/index.ts +0 -3
  290. package/src/progress/meta.ts +0 -132
  291. package/src/radio/Radio.svelte +0 -330
  292. package/src/radio/RadioGroup.a11y.test.ts +0 -43
  293. package/src/radio/RadioGroup.kbd.test.ts +0 -75
  294. package/src/radio/RadioGroup.svelte +0 -199
  295. package/src/radio/RadioGroupKbdFixture.svelte +0 -21
  296. package/src/radio/context.ts +0 -42
  297. package/src/radio/index.ts +0 -4
  298. package/src/radio/meta.ts +0 -68
  299. package/src/rating/Rating.a11y.test.ts +0 -41
  300. package/src/rating/Rating.kbd.test.ts +0 -48
  301. package/src/rating/Rating.svelte +0 -407
  302. package/src/rating/RatingKbdFixture.svelte +0 -15
  303. package/src/rating/index.ts +0 -2
  304. package/src/rating/meta.ts +0 -40
  305. package/src/resize-observer/ResizeObserver.svelte +0 -169
  306. package/src/resize-observer/action.ts +0 -80
  307. package/src/resize-observer/index.ts +0 -9
  308. package/src/resize-observer/meta.ts +0 -102
  309. package/src/scroll-list/ScrollColumn.svelte +0 -592
  310. package/src/scroll-list/ScrollList.svelte +0 -257
  311. package/src/scroll-list/index.ts +0 -4
  312. package/src/scroll-list/meta.ts +0 -93
  313. package/src/scroll-list/types.ts +0 -18
  314. package/src/select/Select.a11y.test.ts +0 -59
  315. package/src/select/Select.kbd.test.ts +0 -59
  316. package/src/select/Select.svelte +0 -1155
  317. package/src/select/SelectKbdFixture.svelte +0 -29
  318. package/src/select/index.ts +0 -3
  319. package/src/select/meta.ts +0 -78
  320. package/src/select/types.ts +0 -2
  321. package/src/side-sheet/SideSheet.a11y.test.ts +0 -53
  322. package/src/side-sheet/SideSheet.kbd.test.ts +0 -63
  323. package/src/side-sheet/SideSheet.svelte +0 -659
  324. package/src/side-sheet/SideSheetKbdFixture.svelte +0 -30
  325. package/src/side-sheet/index.ts +0 -2
  326. package/src/side-sheet/meta.ts +0 -116
  327. package/src/skeleton/Skeleton.a11y.test.ts +0 -35
  328. package/src/skeleton/Skeleton.svelte +0 -131
  329. package/src/skeleton/SkeletonAvatar.svelte +0 -82
  330. package/src/skeleton/SkeletonButton.svelte +0 -90
  331. package/src/skeleton/SkeletonImage.svelte +0 -100
  332. package/src/skeleton/SkeletonParagraph.svelte +0 -103
  333. package/src/skeleton/SkeletonTitle.svelte +0 -74
  334. package/src/skeleton/context.ts +0 -11
  335. package/src/skeleton/index.ts +0 -8
  336. package/src/skeleton/meta.ts +0 -65
  337. package/src/slider/Slider.a11y.test.ts +0 -44
  338. package/src/slider/Slider.kbd.test.ts +0 -74
  339. package/src/slider/Slider.svelte +0 -716
  340. package/src/slider/SliderKbdFixture.svelte +0 -21
  341. package/src/slider/index.ts +0 -2
  342. package/src/slider/meta.ts +0 -55
  343. package/src/space/Space.a11y.test.ts +0 -22
  344. package/src/space/Space.svelte +0 -109
  345. package/src/space/SpaceA11yFixture.svelte +0 -17
  346. package/src/space/index.ts +0 -2
  347. package/src/space/meta.ts +0 -27
  348. package/src/spin/Spin.a11y.test.ts +0 -29
  349. package/src/spin/Spin.svelte +0 -293
  350. package/src/spin/SpinA11yFixture.svelte +0 -18
  351. package/src/spin/index.ts +0 -2
  352. package/src/spin/meta.ts +0 -72
  353. package/src/steps/Steps.a11y.test.ts +0 -39
  354. package/src/steps/Steps.kbd.test.ts +0 -73
  355. package/src/steps/Steps.svelte +0 -392
  356. package/src/steps/StepsKbdFixture.svelte +0 -21
  357. package/src/steps/index.ts +0 -3
  358. package/src/steps/meta.ts +0 -59
  359. package/src/steps/types.ts +0 -8
  360. package/src/switch/Switch.a11y.test.ts +0 -46
  361. package/src/switch/Switch.kbd.test.ts +0 -40
  362. package/src/switch/Switch.svelte +0 -310
  363. package/src/switch/SwitchKbdFixture.svelte +0 -22
  364. package/src/switch/index.ts +0 -2
  365. package/src/switch/meta.ts +0 -44
  366. package/src/table/Table.a11y.test.ts +0 -70
  367. package/src/table/Table.bench.ts +0 -51
  368. package/src/table/Table.kbd.test.ts +0 -94
  369. package/src/table/Table.svelte +0 -2327
  370. package/src/table/TableKbdFixture.svelte +0 -35
  371. package/src/table/grid-nav.test.ts +0 -173
  372. package/src/table/grid-nav.ts +0 -146
  373. package/src/table/index.ts +0 -13
  374. package/src/table/meta.ts +0 -121
  375. package/src/table/types.ts +0 -133
  376. package/src/tabs/TabPane.svelte +0 -92
  377. package/src/tabs/Tabs.a11y.test.ts +0 -47
  378. package/src/tabs/Tabs.kbd.test.ts +0 -74
  379. package/src/tabs/Tabs.svelte +0 -1128
  380. package/src/tabs/TabsA11yFixture.svelte +0 -20
  381. package/src/tabs/TabsKbdFixture.svelte +0 -25
  382. package/src/tabs/context.ts +0 -43
  383. package/src/tabs/index.ts +0 -14
  384. package/src/tabs/meta.ts +0 -152
  385. package/src/tabs/types.ts +0 -6
  386. package/src/tag/Tag.a11y.test.ts +0 -33
  387. package/src/tag/Tag.svelte +0 -366
  388. package/src/tag/TagA11yFixture.svelte +0 -18
  389. package/src/tag/index.ts +0 -2
  390. package/src/tag/meta.ts +0 -92
  391. package/src/tag-input/TagInput.a11y.test.ts +0 -41
  392. package/src/tag-input/TagInput.svelte +0 -544
  393. package/src/tag-input/index.ts +0 -2
  394. package/src/tag-input/meta.ts +0 -43
  395. package/src/tag-input/reorder.test.ts +0 -59
  396. package/src/tag-input/reorder.ts +0 -41
  397. package/src/test-utils/LocaleHarness.svelte +0 -29
  398. package/src/test-utils/a11y.ts +0 -108
  399. package/src/test-utils/kbd.ts +0 -52
  400. package/src/textarea/TextArea.a11y.test.ts +0 -44
  401. package/src/textarea/TextArea.svelte +0 -420
  402. package/src/textarea/index.ts +0 -2
  403. package/src/textarea/meta.ts +0 -104
  404. package/src/time-picker/TimePicker.a11y.test.ts +0 -45
  405. package/src/time-picker/TimePicker.kbd.test.ts +0 -70
  406. package/src/time-picker/TimePicker.svelte +0 -1023
  407. package/src/time-picker/TimePickerKbdFixture.svelte +0 -23
  408. package/src/time-picker/index.ts +0 -2
  409. package/src/time-picker/meta.ts +0 -64
  410. package/src/timeline/Timeline.a11y.test.ts +0 -54
  411. package/src/timeline/Timeline.svelte +0 -599
  412. package/src/timeline/TimelineItem.svelte +0 -164
  413. package/src/timeline/context.ts +0 -28
  414. package/src/timeline/index.ts +0 -16
  415. package/src/timeline/meta.ts +0 -129
  416. package/src/timeline/types.ts +0 -9
  417. package/src/toast/Toast.a11y.test.ts +0 -67
  418. package/src/toast/ToastContainer.svelte +0 -184
  419. package/src/toast/ToastItem.svelte +0 -247
  420. package/src/toast/index.ts +0 -9
  421. package/src/toast/live-region.ts +0 -78
  422. package/src/toast/meta.ts +0 -95
  423. package/src/toast/store.ts +0 -187
  424. package/src/tooltip/Tooltip.a11y.test.ts +0 -41
  425. package/src/tooltip/Tooltip.kbd.test.ts +0 -37
  426. package/src/tooltip/Tooltip.svelte +0 -416
  427. package/src/tooltip/TooltipA11yFixture.svelte +0 -31
  428. package/src/tooltip/TooltipKbdFixture.svelte +0 -16
  429. package/src/tooltip/index.ts +0 -2
  430. package/src/tooltip/meta.ts +0 -59
  431. package/src/tooltip/placement.ts +0 -6
  432. package/src/transfer/Transfer.a11y.test.ts +0 -63
  433. package/src/transfer/Transfer.kbd.test.ts +0 -75
  434. package/src/transfer/Transfer.svelte +0 -1451
  435. package/src/transfer/TransferKbdFixture.svelte +0 -23
  436. package/src/transfer/group.test.ts +0 -55
  437. package/src/transfer/group.ts +0 -61
  438. package/src/transfer/index.ts +0 -3
  439. package/src/transfer/meta.ts +0 -55
  440. package/src/transfer/reorder.test.ts +0 -52
  441. package/src/transfer/reorder.ts +0 -42
  442. package/src/transfer/tree.test.ts +0 -44
  443. package/src/transfer/tree.ts +0 -52
  444. package/src/transfer/types.ts +0 -32
  445. package/src/tree/Tree.a11y.test.ts +0 -63
  446. package/src/tree/Tree.kbd.test.ts +0 -91
  447. package/src/tree/Tree.svelte +0 -1500
  448. package/src/tree/TreeKbdFixture.svelte +0 -30
  449. package/src/tree/index.ts +0 -3
  450. package/src/tree/meta.ts +0 -152
  451. package/src/tree-select/TreeSelect.a11y.test.ts +0 -52
  452. package/src/tree-select/TreeSelect.kbd.test.ts +0 -53
  453. package/src/tree-select/TreeSelect.svelte +0 -1611
  454. package/src/tree-select/TreeSelectKbdFixture.svelte +0 -20
  455. package/src/tree-select/index.ts +0 -3
  456. package/src/tree-select/meta.ts +0 -73
  457. package/src/tree-select/types.ts +0 -11
  458. package/src/tree-select/virtual.test.ts +0 -104
  459. package/src/typography/Link.svelte +0 -120
  460. package/src/typography/Paragraph.svelte +0 -92
  461. package/src/typography/Text.svelte +0 -93
  462. package/src/typography/Title.svelte +0 -91
  463. package/src/typography/Typography.a11y.test.ts +0 -34
  464. package/src/typography/TypographyA11yFixture.svelte +0 -27
  465. package/src/typography/TypographyBase.svelte +0 -807
  466. package/src/typography/index.ts +0 -16
  467. package/src/typography/meta.ts +0 -158
  468. package/src/upload/Upload.a11y.test.ts +0 -58
  469. package/src/upload/Upload.svelte +0 -1094
  470. package/src/upload/UploadA11yFixture.svelte +0 -23
  471. package/src/upload/index.ts +0 -3
  472. package/src/upload/meta.ts +0 -64
  473. package/src/upload/types.ts +0 -16
  474. package/src/virtual-list/VirtualList.svelte +0 -401
  475. package/src/virtual-list/index.ts +0 -2
  476. package/src/virtual-list/meta.ts +0 -106
@@ -1,23 +0,0 @@
1
- <!--
2
- Upload a11y 测试夹具:在 LocaleProvider 内渲染 Upload,不传 children。
3
- 说明:LocaleHarness 总会注入一个 children 插槽,会命中 Upload 的 {#if children}
4
- 分支,使触发按钮/拖拽区跳过内置 locale 文案(渲染空插槽),故这里直接包
5
- LocaleProvider 渲染、不经 harness。仅供 Upload.a11y.test.ts 使用,不对外导出。
6
- -->
7
- <script lang="ts">
8
- import { LocaleProvider } from '../locale-provider/index.js';
9
- import Upload from './Upload.svelte';
10
- import type { UploadFileItem } from './types.js';
11
-
12
- interface Props {
13
- drag?: boolean;
14
- value?: UploadFileItem[];
15
- locale?: string;
16
- }
17
-
18
- let { drag = false, value, locale = 'en_US' }: Props = $props();
19
- </script>
20
-
21
- <LocaleProvider {locale}>
22
- <Upload {drag} {...(value !== undefined ? { value } : {})} />
23
- </LocaleProvider>
@@ -1,3 +0,0 @@
1
- export { default as Upload } from './Upload.svelte';
2
- export { meta as uploadMeta } from './meta.js';
3
- export type { UploadFileItem, UploadStatus } from './types.js';
@@ -1,64 +0,0 @@
1
- /**
2
- * Machine-readable component metadata for AI/docs consumption.
3
- * See specs/00-foundation/ai-friendly.spec.md.
4
- */
5
- export const meta = {
6
- name: 'Upload',
7
- category: 'input',
8
- description: '文件上传,支持点击与拖拽选择、文件列表(名称/大小/状态/移除)。本轮不做真实网络上传。',
9
- props: [
10
- { name: 'value', type: 'UploadFileItem[]', default: 'undefined', desc: '受控文件列表;提供则为受控' },
11
- { name: 'defaultValue', type: 'UploadFileItem[]', default: '[]', desc: '非受控初始文件列表' },
12
- { name: 'accept', type: 'string', default: 'undefined', desc: '接受的文件类型(input accept)' },
13
- { name: 'multiple', type: 'boolean', default: 'false' },
14
- { name: 'directory', type: 'boolean', default: 'false', desc: '上传整个目录(webkitdirectory),递归选择目录下所有文件,保留 relativePath' },
15
- { name: 'limit', type: 'number', default: 'undefined', desc: '最大文件数;超出触发 onExceed' },
16
- { name: 'maxSize', type: 'number', default: 'undefined', desc: '单文件最大体积(KB);超限标记 error' },
17
- { name: 'minSize', type: 'number', default: 'undefined', desc: '单文件最小体积(KB);过小标记 error' },
18
- { name: 'disabled', type: 'boolean', default: 'false' },
19
- { name: 'size', type: "'small'|'default'|'large'", default: "'default'", desc: '组件级尺寸(触发按钮/拖拽区/列表项),区别于文件项的 file.size 体积' },
20
- { name: 'status', type: "'default'|'warning'|'error'", default: "'default'", desc: '组件级校验态(表单联动,影响上传区/边框色),区别于文件项的 file.status 上传进度态' },
21
- { name: 'listType', type: "'text'|'image'|'picture-card'|'none'", default: 'text', desc: 'image/picture-card 显示缩略图网格' },
22
- { name: 'drag', type: 'boolean', default: 'false', desc: 'true 渲染拖拽区,false 渲染按钮' },
23
- { name: 'action', type: 'string', default: 'undefined', desc: '上传地址;有则选文件后自动 XHR 上传' },
24
- { name: 'uploadName', type: 'string', default: "'file'", desc: '表单字段名' },
25
- { name: 'headers', type: 'Record<string,string>', default: 'undefined', desc: '额外请求头' },
26
- { name: 'uploadData', type: 'Record<string,string>', default: 'undefined', desc: '额外表单字段' },
27
- { name: 'concurrency', type: 'number', default: '0', desc: '同时进行的上传数上限;0/不传=不限,超出排队、完成补位' },
28
- { name: 'beforeUpload', type: '(file: File, fileList: File[]) => boolean | File | Promise<boolean | File>', default: 'undefined', desc: '上传前异步校验/转换:false/reject 跳过该文件,返回 File 替换,true 正常上传' },
29
- { name: 'customRequest', type: '(item: UploadFileItem) => void | Promise<void>', default: 'undefined', desc: '提供则由外部接管上传(优先于 action);返回 Promise 时受 concurrency 调度' },
30
- { name: 'onChange', type: '(list: UploadFileItem[]) => void', default: 'undefined' },
31
- { name: 'onExceed', type: '(files: File[]) => void', default: 'undefined' },
32
- { name: 'onSuccess', type: '(response: string, item: UploadFileItem) => void', default: 'undefined' },
33
- { name: 'onError', type: '(item: UploadFileItem) => void', default: 'undefined' },
34
- { name: 'children', type: 'Snippet', default: 'undefined', desc: '自定义触发器内容' },
35
- { name: 'showRetry', type: 'boolean', default: 'true', desc: '上传失败是否显示重试按钮' },
36
- { name: 'showReplace', type: 'boolean', default: 'false', desc: '是否允许替换已有文件(单文件模式下显示"替换"而不是"添加")' },
37
- { name: 'showClear', type: 'boolean', default: 'false', desc: '是否显示批量清除按钮' },
38
- { name: 'onClear', type: '() => void', default: 'undefined', desc: '清除按钮点击回调' },
39
- { name: 'fileListTitle', type: 'string | false', default: 'undefined', desc: '文件列表标题文字;false 则不渲染' },
40
- { name: 'showTooltip', type: 'boolean', default: 'true', desc: '文件名超长是否展示 Tooltip(title 属性)' },
41
- { name: 'prompt', type: 'string | Snippet', default: 'undefined', desc: '上传区提示内容(文字或 Snippet)' },
42
- { name: 'promptPosition', type: "'left'|'right'|'bottom'", default: "'bottom'", desc: '提示位置:left/right 水平排列,bottom 下方' },
43
- { name: 'onDrop', type: '(e: DragEvent, files: File[], rejectFiles: File[]) => void', default: 'undefined', desc: '拖拽放下回调' },
44
- { name: 'onOpenFileDialog', type: '() => void', default: 'undefined', desc: '打开文件选择弹窗时回调' },
45
- { name: 'onPreviewClick', type: '(fileItem: UploadFileItem) => void', default: 'undefined', desc: '预览图点击回调(image/picture-card listType)' },
46
- { name: 'onAcceptInvalid', type: '(files: File[]) => void', default: 'undefined', desc: 'accept 校验失败(文件类型不符)的回调' },
47
- { name: 'onRetry', type: '(file: UploadFileItem) => void', default: 'undefined', desc: '重试回调' },
48
- { name: 'onSizeError', type: "(file: UploadFileItem, validResult: 'max' | 'min') => void", default: 'undefined', desc: '大小校验失败回调' },
49
- { name: 'validateMessage', type: 'string', default: 'undefined', desc: '校验失败统一文案(覆盖 i18n 默认文案)' },
50
- { name: 'withCredentials', type: 'boolean', default: 'false', desc: 'XHR withCredentials(跨域凭证)' },
51
- { name: 'transformFile', type: '(file: File) => Promise<File>', default: 'undefined', desc: '上传前文件转换(async,返回转换后的 File)' },
52
- { name: 'dragIcon', type: 'Snippet', default: 'undefined', desc: '拖拽区自定义图标 Snippet' },
53
- { name: 'dragMainText', type: 'string | Snippet', default: 'undefined', desc: '拖拽区主文案' },
54
- { name: 'dragSubText', type: 'string | Snippet', default: 'undefined', desc: '拖拽区副文案' },
55
- { name: 'addOnPasting', type: 'boolean', default: 'false', desc: '粘贴添加文件(监听 document paste)' },
56
- { name: 'hotSpotLocation', type: "'start'|'end'|'none'", default: "'start'", desc: "触发热点位置:'start'=前置,'end'=后置,'none'=隐藏触发器" },
57
- ],
58
- a11y: {
59
- role: 'button',
60
- keyboard: ['Enter', 'Space'],
61
- notes: ['隐藏的 file input(visually-hidden)', '触发器为 button', '移除按钮 aria-label「移除」', 'dragger role=button + tabindex + 键盘 Enter/Space'],
62
- },
63
- tokens: ['--cd-upload-*', '--cd-upload-border-warning', '--cd-upload-border-error', '--cd-button-height-*', '--cd-focus-ring', '--cd-color-warning', '--cd-color-danger', '--cd-spacing-*'],
64
- } as const;
@@ -1,16 +0,0 @@
1
- export type UploadStatus = 'ready' | 'uploading' | 'success' | 'error';
2
-
3
- export interface UploadFileItem {
4
- uid: string;
5
- name: string;
6
- size: number;
7
- status: UploadStatus;
8
- percent?: number;
9
- file?: File;
10
- /** 远程预览地址(image/picture-card 列表优先用它,否则由 file 生成 objectURL) */
11
- url?: string;
12
- /** 校验失败时的本地化提示(如大小超限/过小);status==='error' 时展示 */
13
- error?: string;
14
- /** 目录上传时文件相对路径(webkitRelativePath,若可用) */
15
- relativePath?: string;
16
- }
@@ -1,401 +0,0 @@
1
- <!--
2
- VirtualList — see specs/components/show/VirtualList.spec.md
3
- 子集:vertical + overscan + 内部容器滚动(scrollTarget='self')。
4
- - fixed 定高:itemSize 为 number(默认)。区间 O(1)。
5
- - dynamic 不定高:itemSize='auto'(或不传 itemSize 时用 estimatedItemSize 估算)。
6
- 用 estimatedItemSize 估算初始高度/总高,渲染后 ResizeObserver 实测每项真实高度,
7
- 缓存到 heights 表,据此(前缀和 offsets)修正各项偏移与可视区间;
8
- 实测与估算不同导致当前可视项偏移变化时做偏移补偿,滚动不跳动。
9
- horizontal: 横向虚拟化沿 x 轴——itemSize 作列宽、横向排列、读/写 scrollLeft、
10
- 可视区间按宽度算;方向无关的 core 区间纯函数(fixedRange/buildOffsets/…)直接复用,
11
- 仅把 height→width、scrollTop→scrollLeft 抽象。horizontal 仅支持 fixed 定宽
12
- (dynamic+horizontal 暂不支持:dynamic 用 itemSize='auto',与 horizontal 组合时
13
- 退化为 fixed,按 estimatedItemSize 列宽渲染——见下方 dynamic 判定)。
14
- scrollToIndex(index, opts?): 命令式 API——根据该 index 的 offset(fixed 用
15
- index*itemSize;dynamic 用 offsets 前缀和)+ align 计算目标滚动位置,直接写
16
- 滚动容器 scrollTop(horizontal 则 scrollLeft)。放导出函数(非 render),属命令式 DOM 写。
17
- scrollTarget='self'(默认)| 'window':
18
- - 'self':内部容器自身 overflow 滚动(默认,向后兼容,行为不变)。
19
- - 'window':容器不再自身滚动,撑开总高靠窗口(document)滚动,适合整页长列表。
20
- 虚拟化基于窗口几何:容器顶相对文档位置(getBoundingClientRect().top + scrollY)
21
- + window.scrollY + window.innerHeight,经 core 纯函数 windowScrollTop 折算为本地
22
- scrollTop 再喂给 fixedRange/dynamicRange(区间数学完全复用)。监听 window 的
23
- scroll/resize(命令式 addEventListener + rAF 节流,cleanup removeEventListener)。
24
- window 模式为纵向窗口滚动场景,horizontal 在 window 模式下退化为 self(横向窗口
25
- 滚动罕见且语义不清);fixed/dynamic 行高路径均复用。
26
-
27
- ⚠️ 死循环红线:
28
- - 滚动监听用 $effect 内命令式 addEventListener('scroll', ..., {passive:true})
29
- + rAF 节流,cleanup 时 removeEventListener + cancelAnimationFrame。
30
- - 几何测量(视口高度 + dynamic 行高)一律 ResizeObserver / getBoundingClientRect,
31
- 在 $effect 内创建 observer + 绑定,cleanup 里 disconnect。绝不用响应式 attachment。
32
- - 测量结果写入本地 $state(measuredH / heights),render 期只读派生;
33
- render 不触发新测量、不读 effect 写的状态形成新一轮测量循环。
34
- - 受控 prop(itemSize/estimatedItemSize/data…)不回写。
35
- -->
36
- <script lang="ts" generics="T">
37
- // 泛型组件 props 用内联匿名类型而非具名 interface Props:在 declaration:true 下,
38
- // 引用泛型参数 T 的具名 interface 会被当作私有名泄漏进生成的 .d.ts 公共签名而报错。
39
- import type { Snippet } from 'svelte';
40
- import {
41
- fixedRange,
42
- buildOffsets,
43
- totalFromOffsets,
44
- dynamicRange,
45
- scrollOffsetForIndex,
46
- windowScrollTop,
47
- type ScrollAlign,
48
- } from '@chenzy-design/core';
49
-
50
- let {
51
- data = [],
52
- getKey = (_item: T, index: number) => index,
53
- itemSize = 40,
54
- estimatedItemSize = 40,
55
- overscan = 3,
56
- height = 400,
57
- horizontal = false,
58
- scrollTarget = 'self',
59
- renderItem,
60
- class: className = '',
61
- }: {
62
- data?: T[];
63
- getKey?: (item: T, index: number) => string | number;
64
- /** 固定行高/列宽(px);传 'auto' 启用 dynamic 不定高测量(horizontal 暂不支持 dynamic)。 */
65
- itemSize?: number | 'auto';
66
- /** dynamic 模式初始估算行高(px),用于首屏占位与总高估算。 */
67
- estimatedItemSize?: number;
68
- overscan?: number;
69
- /** 视口主轴尺寸(vertical 为高度、horizontal 为宽度);数字按 px,字符串用 ResizeObserver 测量。 */
70
- height?: number | string;
71
- /** 横向虚拟化:沿 x 轴排列、读/写 scrollLeft。默认 false(vertical)。 */
72
- horizontal?: boolean;
73
- /**
74
- * 滚动源:'self'(默认)内部容器自身滚动;'window' 用窗口(document)滚动、
75
- * 容器撑开总高,适合整页长列表(纵向)。horizontal 在 window 下退化为 self。
76
- */
77
- scrollTarget?: 'self' | 'window';
78
- renderItem: Snippet<[item: T, index: number]>;
79
- class?: string;
80
- } = $props();
81
-
82
- // window 模式判定:scrollTarget='window' 且非 horizontal(横向窗口滚动罕见,退化为 self)。
83
- const windowMode = $derived(scrollTarget === 'window' && !horizontal);
84
- // dynamic 模式判定:itemSize='auto'。horizontal 暂不支持 dynamic,强制走 fixed。
85
- const dynamic = $derived(itemSize === 'auto' && !horizontal);
86
- // fixed 路径行高(dynamic 时该值不参与几何)。
87
- const fixedSize = $derived(typeof itemSize === 'number' ? itemSize : estimatedItemSize);
88
-
89
- // viewport 元素普通引用(bind:this),不参与响应式几何读取。
90
- let viewportEl = $state<HTMLDivElement | null>(null);
91
-
92
- // 本地响应式状态:仅由命令式回调 / ResizeObserver 写入,render 期只读。
93
- // 主轴滚动偏移:vertical 为 scrollTop、horizontal 为 scrollLeft(方向无关命名沿用 scrollTop)。
94
- let scrollTop = $state(0);
95
- // 测量得到的视口主轴尺寸:self 模式仅 height 为字符串时由 ResizeObserver 回填;
96
- // window 模式由 scroll/resize 回调写入 window.innerHeight(命令式,非 render 期)。
97
- let measuredH = $state(0);
98
- // 有效视口主轴尺寸:window 模式用测量的窗口视口高;self 模式 height 为数字直接用
99
- // prop,否则用测量值(纯 $derived)。
100
- const viewportH = $derived(
101
- windowMode ? measuredH : typeof height === 'number' ? height : measuredH,
102
- );
103
-
104
- // dynamic:实测行高缓存表。索引 → 真实高度(px);未测得为 undefined(用估算)。
105
- // 普通对象 $state,由 ResizeObserver 命令式写入;render 期只读。
106
- let heights = $state<Record<number, number>>({});
107
-
108
- // 普通(非响应式)变量:rAF 节流句柄。
109
- let rafId = 0;
110
-
111
- const heightStyle = $derived(typeof height === 'number' ? `${height}px` : height);
112
-
113
- // dynamic:合并实测/估算的每项高度数组 → 前缀和 offsets(render-safe,仅依赖 $state)。
114
- const offsets = $derived.by(() => {
115
- if (!dynamic) return [] as number[];
116
- const arr = new Array<number>(data.length);
117
- for (let i = 0; i < data.length; i += 1) {
118
- arr[i] = heights[i] ?? estimatedItemSize;
119
- }
120
- return buildOffsets(arr);
121
- });
122
-
123
- // 总撑高占位。fixed 为 O(1);dynamic 取 offsets 末项(估算+实测混合)。
124
- const totalHeight = $derived(
125
- dynamic ? totalFromOffsets(offsets) : data.length * fixedSize,
126
- );
127
-
128
- // 可视区间:纯 $derived,仅依赖本地 $state,render-safe(不读 DOM)。
129
- const range = $derived(
130
- dynamic
131
- ? dynamicRange(offsets, scrollTop, viewportH, overscan)
132
- : fixedRange(scrollTop, viewportH, fixedSize, data.length, overscan),
133
- );
134
- const startIndex = $derived(range.startIndex);
135
- const endIndex = $derived(range.endIndex);
136
- const visible = $derived(data.slice(startIndex, endIndex));
137
-
138
- // 某项的主轴偏移:fixed 为 index*size;dynamic 查 offsets 前缀和。
139
- function itemOffset(index: number): number {
140
- if (dynamic) return offsets[index] ?? index * estimatedItemSize;
141
- return index * fixedSize;
142
- }
143
-
144
- // 某项的主轴尺寸:dynamic 查实测/估算高度;fixed 为定尺寸。
145
- function itemMainSize(index: number): number {
146
- if (dynamic) return heights[index] ?? estimatedItemSize;
147
- return fixedSize;
148
- }
149
-
150
- /**
151
- * 命令式滚动到指定索引项(红线 #3:直接写 DOM scrollTop/scrollLeft 的命令式操作,
152
- * 不在 render 期执行,由父组件 bind 后主动调用)。
153
- * @param index 目标索引(自动 clamp 到 [0, data.length - 1])
154
- * @param opts.align 'start'(默认)| 'center' | 'end':目标项在视口内的对齐方式
155
- */
156
- export function scrollToIndex(
157
- index: number,
158
- opts?: { align?: ScrollAlign },
159
- ): void {
160
- const el = viewportEl;
161
- if (!el || data.length === 0) return;
162
- const i = Math.max(0, Math.min(data.length - 1, Math.floor(index)));
163
- // 总主轴尺寸:dynamic 取 offsets 末项;fixed 为 count*size。
164
- const totalMain = dynamic ? totalFromOffsets(offsets) : data.length * fixedSize;
165
- // 目标本地偏移(相对内容顶)。window 模式视口高用 innerHeight。
166
- const target = scrollOffsetForIndex(
167
- itemOffset(i),
168
- itemMainSize(i),
169
- windowMode
170
- ? window.innerHeight
171
- : horizontal
172
- ? el.clientWidth
173
- : el.clientHeight,
174
- totalMain,
175
- opts?.align ?? 'start',
176
- );
177
- if (windowMode) {
178
- // 窗口滚动:本地偏移 + 容器相对文档顶位置(命令式读几何,非 render 期)。
179
- const containerStart = el.getBoundingClientRect().top + window.scrollY;
180
- window.scrollTo({ top: containerStart + target });
181
- scrollTop = target;
182
- return;
183
- }
184
- if (horizontal) el.scrollLeft = target;
185
- else el.scrollTop = target;
186
- // 同步本地 state(DOM 滚动事件随后也会触发,这里立即更新避免一帧延迟)。
187
- scrollTop = target;
188
- }
189
-
190
- // self 模式滚动监听(命令式 + rAF 节流 + cleanup)。
191
- $effect(() => {
192
- const el = viewportEl;
193
- if (!el || windowMode) return;
194
-
195
- function onScroll() {
196
- if (rafId) return;
197
- rafId = requestAnimationFrame(() => {
198
- rafId = 0;
199
- // 主轴滚动读取发生在回调中(非 render 期);horizontal 读 scrollLeft。
200
- if (el) scrollTop = horizontal ? el.scrollLeft : el.scrollTop;
201
- });
202
- }
203
-
204
- el.addEventListener('scroll', onScroll, { passive: true });
205
- return () => {
206
- el.removeEventListener('scroll', onScroll);
207
- if (rafId) {
208
- cancelAnimationFrame(rafId);
209
- rafId = 0;
210
- }
211
- };
212
- });
213
-
214
- // window 模式:监听 window 的 scroll/resize(命令式 + rAF 节流 + cleanup)。
215
- // 用容器相对文档顶位置 + window.scrollY + innerHeight,经 core windowScrollTop
216
- // 折算为本地 scrollTop 喂给区间数学;measuredH 回填 innerHeight 作视口高。
217
- $effect(() => {
218
- const el = viewportEl;
219
- if (!el || !windowMode) return;
220
-
221
- // 总主轴尺寸(读 $derived,非 DOM 几何);用于 clamp 本地偏移。
222
- function totalMain(): number {
223
- return dynamic ? totalFromOffsets(offsets) : data.length * fixedSize;
224
- }
225
-
226
- function recompute() {
227
- if (!el) return;
228
- // 命令式读几何(非 render 期):容器顶相对文档位置 + 窗口滚动 + 视口高。
229
- const containerStart = el.getBoundingClientRect().top + window.scrollY;
230
- measuredH = window.innerHeight;
231
- scrollTop = windowScrollTop(containerStart, window.scrollY, totalMain());
232
- }
233
-
234
- function onScroll() {
235
- if (rafId) return;
236
- rafId = requestAnimationFrame(() => {
237
- rafId = 0;
238
- recompute();
239
- });
240
- }
241
-
242
- // 立即算一次(首屏定位)。
243
- recompute();
244
- window.addEventListener('scroll', onScroll, { passive: true });
245
- window.addEventListener('resize', onScroll, { passive: true });
246
- return () => {
247
- window.removeEventListener('scroll', onScroll);
248
- window.removeEventListener('resize', onScroll);
249
- if (rafId) {
250
- cancelAnimationFrame(rafId);
251
- rafId = 0;
252
- }
253
- };
254
- });
255
-
256
- // self 模式视口高度测量:仅当 height 非数字(字符串/百分比)时启用 ResizeObserver。
257
- $effect(() => {
258
- const el = viewportEl;
259
- if (!el || windowMode || typeof height === 'number') return;
260
-
261
- // 立即测一次主轴尺寸(命令式,非 render 期);horizontal 测 clientWidth。
262
- measuredH = horizontal ? el.clientWidth : el.clientHeight;
263
-
264
- const ro = new ResizeObserver((entries) => {
265
- for (const entry of entries) {
266
- measuredH = horizontal ? entry.contentRect.width : entry.contentRect.height;
267
- }
268
- });
269
- ro.observe(el);
270
- return () => ro.disconnect();
271
- });
272
-
273
- // dynamic 行高实测 + 偏移补偿(命令式 ResizeObserver,cleanup disconnect)。
274
- // 每个已渲染行元素带 data-vindex,observer 实测真实高度回写 heights;
275
- // 若变更的行位于当前滚动位置之上,则总高/偏移随之变化——补偿 scrollTop 保持视图稳定。
276
- $effect(() => {
277
- const el = viewportEl;
278
- if (!el || !dynamic) return;
279
- // 依赖 visible:渲染行集合变化(滚动/数据更新)后重建 observer,observe 新行。
280
- // 读取仅作依赖追踪,不在此读 DOM 几何。
281
- void visible;
282
-
283
- function measure(node: Element) {
284
- const idx = Number((node as HTMLElement).dataset.vindex);
285
- if (Number.isNaN(idx)) return;
286
- const h = (node as HTMLElement).getBoundingClientRect().height;
287
- if (h <= 0) return;
288
- const prev = heights[idx];
289
- if (prev !== undefined && Math.abs(prev - h) < 0.5) return;
290
-
291
- // 估算→实测差值;该行若在当前 scrollTop 之上,需补偿避免视图跳动。
292
- const before = prev ?? estimatedItemSize;
293
- const delta = h - before;
294
- heights[idx] = h;
295
-
296
- if (delta !== 0 && el && itemOffset(idx) < scrollTop) {
297
- // 命令式补偿,避免视图跳动(非 render 期)。
298
- if (windowMode) {
299
- // 窗口模式:滚动文档而非内部容器;下一帧 onScroll 同步本地 state。
300
- window.scrollBy(0, delta);
301
- scrollTop += delta;
302
- } else {
303
- el.scrollTop += delta;
304
- scrollTop = el.scrollTop;
305
- }
306
- }
307
- }
308
-
309
- const ro = new ResizeObserver((entries) => {
310
- for (const entry of entries) measure(entry.target);
311
- });
312
-
313
- // 命令式遍历当前已渲染行并 observe(render 期不读几何,这里在 effect 内)。
314
- const rows = el.querySelectorAll<HTMLElement>('[data-vindex]');
315
- rows.forEach((node) => {
316
- measure(node);
317
- ro.observe(node);
318
- });
319
-
320
- return () => ro.disconnect();
321
- });
322
-
323
- const cls = $derived(
324
- ['cd-virtual-list', horizontal && 'cd-virtual-list--horizontal', className]
325
- .filter(Boolean)
326
- .join(' '),
327
- );
328
-
329
- // 视口主轴尺寸样式:window 模式容器不自身滚动(无 overflow/无固定高,撑开总高靠窗口
330
- // 滚动);self 模式 vertical 用高度、horizontal 用宽度并 overflow:auto。
331
- const viewportStyle = $derived(
332
- windowMode
333
- ? ''
334
- : horizontal
335
- ? `inline-size:${heightStyle}; overflow:auto`
336
- : `block-size:${heightStyle}; overflow:auto`,
337
- );
338
- // 撑高/撑宽占位主轴尺寸样式。
339
- const spacerStyle = $derived(
340
- horizontal ? `inline-size:${totalHeight}px` : `block-size:${totalHeight}px`,
341
- );
342
-
343
- // 每项主轴定位/尺寸样式(render 期只读派生,不触发测量)。
344
- function itemStyle(idx: number): string {
345
- const off = itemOffset(idx);
346
- if (horizontal) {
347
- // 横向:translateX 定位 + 列宽(fixed),高度撑满视口。
348
- return `transform:translateX(${off}px); inline-size:${fixedSize}px`;
349
- }
350
- if (dynamic) return `transform:translateY(${off}px)`;
351
- return `transform:translateY(${off}px); block-size:${fixedSize}px`;
352
- }
353
- </script>
354
-
355
- <div class={cls} bind:this={viewportEl} role="list" style={viewportStyle}>
356
- <div class="cd-virtual-list__spacer" style={spacerStyle}>
357
- {#each visible as item, i (getKey(item, startIndex + i))}
358
- <div
359
- class="cd-virtual-list__item"
360
- role="listitem"
361
- data-vindex={startIndex + i}
362
- aria-setsize={data.length}
363
- aria-posinset={startIndex + i + 1}
364
- style={itemStyle(startIndex + i)}
365
- >
366
- {@render renderItem(item, startIndex + i)}
367
- </div>
368
- {/each}
369
- </div>
370
- </div>
371
-
372
- <style>
373
- .cd-virtual-list {
374
- position: relative;
375
- inline-size: 100%;
376
- background: var(--cd-virtual-list-bg);
377
- scrollbar-color: var(--cd-virtual-list-scrollbar) transparent;
378
- }
379
- .cd-virtual-list__spacer {
380
- position: relative;
381
- inline-size: 100%;
382
- }
383
- .cd-virtual-list__item {
384
- position: absolute;
385
- inset-block-start: 0;
386
- inset-inline: 0;
387
- }
388
- /* horizontal:视口主轴为宽度(block-size 撑满父容器高度);项沿 x 轴绝对定位、纵向撑满。 */
389
- .cd-virtual-list--horizontal {
390
- block-size: 100%;
391
- }
392
- .cd-virtual-list--horizontal .cd-virtual-list__spacer {
393
- block-size: 100%;
394
- inline-size: auto;
395
- }
396
- .cd-virtual-list--horizontal .cd-virtual-list__item {
397
- inset-block: 0;
398
- inset-inline-start: 0;
399
- inset-inline-end: auto;
400
- }
401
- </style>
@@ -1,2 +0,0 @@
1
- export { default as VirtualList } from './VirtualList.svelte';
2
- export { meta as virtualListMeta } from './meta.js';
@@ -1,106 +0,0 @@
1
- /**
2
- * Machine-readable component metadata for AI/docs consumption.
3
- * VirtualList — see specs/components/show/VirtualList.spec.md
4
- */
5
- export const meta = {
6
- name: 'VirtualList',
7
- category: 'show',
8
- description:
9
- "虚拟滚动列表底座(泛型):仅渲染可视区 + overscan 缓冲区高性能渲染超长列表。fixed 定高 O(1) 区间;dynamic 不定高(itemSize='auto')用 estimatedItemSize 估算 + ResizeObserver 实测回填高度表,前缀和修正偏移/区间并做滚动偏移补偿。支持 vertical/horizontal(horizontal 仅 fixed 定宽,dynamic 退化为按 estimatedItemSize 的定宽)。scrollTarget='self'(默认)内部容器滚动;'window' 用窗口(document)滚动、容器撑高,适合整页长列表(纵向;horizontal 下退化为 self,fixed/dynamic 均复用窗口几何 windowScrollTop)。提供 scrollToIndex 命令式跳转 API。自身无视觉,行渲染由 renderItem 提供。",
10
- exports: ['VirtualList'],
11
- props: [
12
- { name: 'data', type: 'T[]', default: '[]', desc: '列表数据数组' },
13
- {
14
- name: 'getKey',
15
- type: '(item: T, index: number) => string | number',
16
- default: '(_, i) => i',
17
- desc: '行唯一标识,用于 each key',
18
- },
19
- {
20
- name: 'itemSize',
21
- type: "number | 'auto'",
22
- default: '40',
23
- desc: "固定行高(px,fixed 定高);传 'auto' 启用 dynamic 不定高测量",
24
- },
25
- {
26
- name: 'estimatedItemSize',
27
- type: 'number',
28
- default: '40',
29
- desc: 'dynamic 模式初始估算行高(px),用于首屏占位与总高估算',
30
- },
31
- { name: 'overscan', type: 'number', default: '3', desc: '可视区上下缓冲行数,消除白屏' },
32
- {
33
- name: 'height',
34
- type: 'number | string',
35
- default: '400',
36
- desc: '视口主轴尺寸(vertical 为高度、horizontal 为宽度);数字按 px,字符串/百分比时用 ResizeObserver 测量',
37
- },
38
- {
39
- name: 'horizontal',
40
- type: 'boolean',
41
- default: 'false',
42
- desc: '横向虚拟化:沿 x 轴排列、itemSize 作列宽、读/写 scrollLeft(仅支持 fixed 定宽)',
43
- },
44
- {
45
- name: 'scrollTarget',
46
- type: "'self' | 'window'",
47
- default: "'self'",
48
- desc: "滚动源:'self' 内部容器自身滚动(默认,向后兼容);'window' 用窗口(document)滚动、容器撑开总高,适合整页长列表(纵向)。horizontal 在 window 下退化为 self。",
49
- },
50
- {
51
- name: 'renderItem',
52
- type: 'Snippet<[item: T, index: number]>',
53
- default: 'required',
54
- desc: '行渲染 Snippet(必填)',
55
- },
56
- { name: 'class', type: 'string', default: "''", desc: '根类名透传' },
57
- ],
58
- events: [],
59
- methods: [
60
- {
61
- name: 'scrollToIndex',
62
- type: "(index: number, opts?: { align?: 'start' | 'center' | 'end' }) => void",
63
- desc: '命令式滚动到指定索引项(bind:this 后调用)。align 默认 start;horizontal 时写 scrollLeft。index 自动 clamp。',
64
- },
65
- ],
66
- slots: [{ name: 'renderItem', desc: '行渲染(item, index)' }],
67
- a11y: {
68
- role: 'list',
69
- focusable: false,
70
- notes: [
71
- '视口 role=list,可见行 role=listitem',
72
- '行带 aria-setsize(总数)与 aria-posinset(1 基序号)',
73
- '滚动监听命令式 + rAF 节流,不读 render 期 DOM 几何',
74
- 'dynamic 行高用 ResizeObserver 命令式实测,cleanup 时 disconnect',
75
- 'scrollToIndex 为命令式 DOM 写(scrollTop/scrollLeft),放导出函数,不在 render 期',
76
- ],
77
- },
78
- tokens: ['--cd-virtual-list-bg', '--cd-virtual-list-scrollbar'],
79
- examples: [
80
- {
81
- title: '基础',
82
- code:
83
- '{#snippet row(item, i)}<div>{i}: {item.label}</div>{/snippet}\n<VirtualList data={rows} itemSize={48} height={400} renderItem={row} />',
84
- },
85
- {
86
- title: 'dynamic 不定高',
87
- code:
88
- "{#snippet row(item, i)}<div>{item.text}</div>{/snippet}\n<VirtualList data={rows} itemSize=\"auto\" estimatedItemSize={48} height={300} renderItem={row} />",
89
- },
90
- {
91
- title: 'horizontal 横向',
92
- code:
93
- '{#snippet col(item, i)}<div style="width:100%">{i}</div>{/snippet}\n<VirtualList data={rows} horizontal itemSize={120} height={400} renderItem={col} />',
94
- },
95
- {
96
- title: 'scrollToIndex 命令式跳转',
97
- code:
98
- "let vl;\n<button onclick={() => vl.scrollToIndex(500, { align: 'center' })}>跳到第 500 项</button>\n<VirtualList bind:this={vl} data={rows} itemSize={36} renderItem={row} />",
99
- },
100
- {
101
- title: 'window 窗口滚动(整页长列表)',
102
- code:
103
- '{#snippet row(item, i)}<div>{i}: {item.label}</div>{/snippet}\n<VirtualList data={rows} scrollTarget="window" itemSize={48} renderItem={row} />',
104
- },
105
- ],
106
- } as const;