@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,407 +0,0 @@
1
- <!--
2
- Rating — see specs/components/input/Rating.spec.md
3
- Star rating with half-star, hover preview, keyboard. APG slider pattern.
4
- Controlled / uncontrolled; variation only via onChange. hoverValue is local-only.
5
- -->
6
- <script lang="ts">
7
- import type { Snippet } from 'svelte';
8
- import { useId } from '@chenzy-design/core';
9
- import { useLocale } from '../locale-provider/index.js';
10
-
11
- type Size = 'small' | 'default' | 'large' | number;
12
- type Status = 'default' | 'warning' | 'error';
13
- type ItemState = 'empty' | 'half' | 'full';
14
- type CharCtx = { index: number; state: ItemState; value: number };
15
- // 自定义字符:字符串(统一字符)或 Snippet(按 {index,state,value} 渲染不同节点,
16
- // 取代 spec 中的 (index,state)=>node 函数形式——Svelte 5 用带参 Snippet 表达)。
17
- type Character = string | Snippet<[CharCtx]>;
18
-
19
- interface Props {
20
- value?: number;
21
- defaultValue?: number;
22
- count?: number;
23
- allowHalf?: boolean;
24
- allowClear?: boolean;
25
- /** 自定义字符/图标:字符串 或 带 {index,state,value} 的 Snippet。不传则默认星形。 */
26
- character?: Character;
27
- size?: Size;
28
- disabled?: boolean;
29
- readonly?: boolean;
30
- status?: Status;
31
- /** 逐项提示文案(native title),长度应等于 count。 */
32
- tooltips?: string[];
33
- /** 挂载时聚焦。 */
34
- autoFocus?: boolean;
35
- name?: string;
36
- /** 根元素 id,关联 aria;不传自动生成。 */
37
- id?: string;
38
- ariaLabel?: string;
39
- onChange?: (v: number) => void;
40
- onHoverChange?: (v: number) => void;
41
- }
42
-
43
- let {
44
- value = $bindable(),
45
- defaultValue = 0,
46
- count = 5,
47
- allowHalf = false,
48
- allowClear = true,
49
- character,
50
- size = 'default',
51
- disabled = false,
52
- readonly = false,
53
- status = 'default',
54
- tooltips,
55
- autoFocus = false,
56
- name,
57
- id,
58
- ariaLabel,
59
- onChange,
60
- onHoverChange,
61
- }: Props = $props();
62
-
63
- const loc = useLocale();
64
- const autoId = useId('cd-rating');
65
- const rootId = $derived(id ?? autoId);
66
-
67
- const isSnippet = (c: unknown): c is Snippet<[CharCtx]> => typeof c === 'function';
68
-
69
- const isControlled = $derived(value !== undefined);
70
- let inner = $state(getInitialValue());
71
- const current = $derived(isControlled ? (value ?? 0) : inner);
72
-
73
- function getInitialValue(): number {
74
- return defaultValue;
75
- }
76
-
77
- // hoverValue is purely local preview state; null means "no hover".
78
- let hoverValue = $state<number | null>(null);
79
- const displayValue = $derived(hoverValue ?? current);
80
-
81
- const interactive = $derived(!disabled && !readonly);
82
- const minStep = $derived(allowHalf ? 0.5 : 1);
83
-
84
- const sizePx = $derived(typeof size === 'number' ? `${size}px` : undefined);
85
- const sizeClass = $derived(typeof size === 'number' ? 'cd-rating--custom' : `cd-rating--${size}`);
86
-
87
- // Per-star fill: 0 = empty, 0.5 = half, 1 = full.
88
- function fillFor(index: number): number {
89
- const starValue = index + 1;
90
- if (displayValue >= starValue) return 1;
91
- if (displayValue >= starValue - 0.5) return 0.5;
92
- return 0;
93
- }
94
-
95
- // 三态语义(供 character Snippet 上下文):纯派生函数(红线 #2)。
96
- function stateFor(index: number): ItemState {
97
- const fill = fillFor(index);
98
- return fill === 1 ? 'full' : fill === 0.5 ? 'half' : 'empty';
99
- }
100
-
101
- function commit(next: number) {
102
- // Controlled: never write the prop; propagate via onChange only.
103
- if (!isControlled) inner = next;
104
- onChange?.(next);
105
- announce(next);
106
- }
107
-
108
- // 值变更播报 live region(命令式写入,render 期只读 $state)。
109
- let announceText = $state('');
110
- function announce(next: number) {
111
- announceText = '';
112
- queueMicrotask(() => {
113
- announceText = next === 0 ? loc().t('Rating.cleared') : textFor(next);
114
- });
115
- }
116
-
117
- function valueAt(index: number, isHalf: boolean): number {
118
- return allowHalf && isHalf ? index + 0.5 : index + 1;
119
- }
120
-
121
- function isLeftHalf(e: { currentTarget: HTMLElement; clientX: number }): boolean {
122
- if (!allowHalf) return false;
123
- const rect = e.currentTarget.getBoundingClientRect();
124
- const rtl = getComputedStyle(e.currentTarget).direction === 'rtl';
125
- const offset = e.clientX - rect.left;
126
- const leftHalf = offset < rect.width / 2;
127
- return rtl ? !leftHalf : leftHalf;
128
- }
129
-
130
- function handleMove(index: number, e: MouseEvent & { currentTarget: HTMLElement }) {
131
- if (!interactive) return;
132
- const next = valueAt(index, isLeftHalf(e));
133
- if (next !== hoverValue) {
134
- hoverValue = next;
135
- onHoverChange?.(next);
136
- }
137
- }
138
-
139
- function handleLeave() {
140
- if (hoverValue !== null) {
141
- hoverValue = null;
142
- // 移出复位至当前 value(spec:hoverChange 移出时为当前 value)。
143
- onHoverChange?.(current);
144
- }
145
- }
146
-
147
- function handleClick(index: number, e: MouseEvent & { currentTarget: HTMLElement }) {
148
- if (!interactive) return;
149
- const next = valueAt(index, isLeftHalf(e));
150
- if (allowClear && next === current) {
151
- commit(0);
152
- } else {
153
- commit(next);
154
- }
155
- hoverValue = null;
156
- }
157
-
158
- function handleKeydown(e: KeyboardEvent) {
159
- if (!interactive) return;
160
- let next = current;
161
- switch (e.key) {
162
- case 'ArrowRight':
163
- case 'ArrowUp':
164
- next = Math.min(count, current + minStep);
165
- break;
166
- case 'ArrowLeft':
167
- case 'ArrowDown':
168
- next = Math.max(0, current - minStep);
169
- break;
170
- case 'Home':
171
- next = 0;
172
- break;
173
- case 'End':
174
- next = count;
175
- break;
176
- case 'Delete':
177
- case 'Backspace':
178
- if (allowClear) next = 0;
179
- break;
180
- default: {
181
- // 数字键 1–9:直接定位到对应整数分值(钳到 [1, count])。
182
- if (e.key >= '1' && e.key <= '9') {
183
- const n = Number(e.key);
184
- if (n <= count) next = n;
185
- else return;
186
- } else {
187
- return;
188
- }
189
- }
190
- }
191
- e.preventDefault();
192
- if (next !== current) commit(next);
193
- }
194
-
195
- const cls = $derived(
196
- [
197
- 'cd-rating',
198
- sizeClass,
199
- `cd-rating--${status}`,
200
- disabled && 'cd-rating--disabled',
201
- readonly && 'cd-rating--readonly',
202
- ]
203
- .filter(Boolean)
204
- .join(' '),
205
- );
206
-
207
- // aria-valuetext / 播报文案:i18n + Intl 数字格式(红线 #2 纯派生)。
208
- function textFor(v: number): string {
209
- if (v === 0) return loc().t('Rating.unrated');
210
- return loc().t('Rating.valueText', {
211
- value: loc().formatNumber(v),
212
- count: loc().formatNumber(count),
213
- });
214
- }
215
- const valueText = $derived(textFor(current));
216
- const resolvedAriaLabel = $derived(ariaLabel ?? loc().t('Rating.ariaLabel'));
217
-
218
- // 单项 title:tooltips[index](长度可不足,缺省为 undefined)。
219
- function titleFor(index: number): string | undefined {
220
- return tooltips?.[index];
221
- }
222
-
223
- let rootEl: HTMLDivElement | undefined;
224
- // autoFocus:命令式聚焦一次(红线 #3,SSR 安全)。
225
- $effect(() => {
226
- if (autoFocus && rootEl && interactive) rootEl.focus();
227
- });
228
- </script>
229
-
230
- <div
231
- bind:this={rootEl}
232
- id={rootId}
233
- class={cls}
234
- role="slider"
235
- aria-label={resolvedAriaLabel}
236
- aria-valuenow={current}
237
- aria-valuemin={0}
238
- aria-valuemax={count}
239
- aria-valuetext={valueText}
240
- aria-disabled={disabled || undefined}
241
- aria-readonly={readonly || undefined}
242
- aria-invalid={status === 'error' || undefined}
243
- tabindex={interactive ? 0 : -1}
244
- style={sizePx ? `--cd-rating-size-active: ${sizePx}` : undefined}
245
- onkeydown={handleKeydown}
246
- onmouseleave={handleLeave}
247
- >
248
- {#if name}<input type="hidden" {name} value={current} />{/if}
249
-
250
- {#each Array(count) as _, i (i)}
251
- {@const fill = fillFor(i)}
252
- <span
253
- class="cd-rating__star"
254
- class:cd-rating__star--full={fill === 1}
255
- class:cd-rating__star--half={fill === 0.5}
256
- class:cd-rating__star--char={character !== undefined}
257
- role="presentation"
258
- title={titleFor(i)}
259
- onmousemove={(e) => handleMove(i, e)}
260
- onclick={(e) => handleClick(i, e)}
261
- >
262
- {#if typeof character === 'string'}
263
- <!-- 自定义字符(字符串):双层裁剪,与星形同结构。 -->
264
- <span class="cd-rating__icon cd-rating__icon--bg cd-rating__text">{character}</span>
265
- <span class="cd-rating__fg" style={`inline-size: ${fill * 100}%`}>
266
- <span class="cd-rating__icon cd-rating__icon--fg cd-rating__text">{character}</span>
267
- </span>
268
- {:else if isSnippet(character)}
269
- <!-- 自定义 Snippet:调用方按 {index,state,value} 自渲染(含半态)。 -->
270
- {@render character({ index: i, state: stateFor(i), value: displayValue })}
271
- {:else}
272
- <svg class="cd-rating__icon cd-rating__icon--bg" viewBox="0 0 24 24" aria-hidden="true">
273
- <path
274
- fill="currentColor"
275
- d="M12 2.5 14.9 8.4 21.4 9.3 16.7 13.9 17.8 20.4 12 17.3 6.2 20.4 7.3 13.9 2.6 9.3 9.1 8.4 12 2.5Z"
276
- />
277
- </svg>
278
- <span class="cd-rating__fg" style={`inline-size: ${fill * 100}%`}>
279
- <svg class="cd-rating__icon cd-rating__icon--fg" viewBox="0 0 24 24" aria-hidden="true">
280
- <path
281
- fill="currentColor"
282
- d="M12 2.5 14.9 8.4 21.4 9.3 16.7 13.9 17.8 20.4 12 17.3 6.2 20.4 7.3 13.9 2.6 9.3 9.1 8.4 12 2.5Z"
283
- />
284
- </svg>
285
- </span>
286
- {/if}
287
- </span>
288
- {/each}
289
- </div>
290
-
291
- <!-- 值变更播报 live region:视觉隐藏,仅供辅助技术读取(render 期只读 $state)。 -->
292
- <div class="cd-rating__sr-live" role="status" aria-live="polite" aria-atomic="true">
293
- {announceText}
294
- </div>
295
-
296
- <style>
297
- .cd-rating {
298
- display: inline-flex;
299
- align-items: center;
300
- gap: var(--cd-rating-gap);
301
- color: var(--cd-rating-color-inactive);
302
- cursor: pointer;
303
- outline: none;
304
- }
305
- .cd-rating:focus-visible {
306
- box-shadow: var(--cd-focus-ring);
307
- border-radius: var(--cd-radius-1);
308
- }
309
- .cd-rating--disabled {
310
- opacity: 0.5;
311
- cursor: not-allowed;
312
- }
313
- .cd-rating--readonly {
314
- cursor: default;
315
- }
316
- .cd-rating__star {
317
- position: relative;
318
- display: inline-flex;
319
- inline-size: var(--cd-rating-size-default);
320
- block-size: var(--cd-rating-size-default);
321
- color: var(--cd-rating-color-inactive);
322
- }
323
- .cd-rating--small .cd-rating__star {
324
- inline-size: var(--cd-rating-size-small);
325
- block-size: var(--cd-rating-size-small);
326
- }
327
- .cd-rating--large .cd-rating__star {
328
- inline-size: var(--cd-rating-size-large);
329
- block-size: var(--cd-rating-size-large);
330
- }
331
- .cd-rating--custom .cd-rating__star {
332
- inline-size: var(--cd-rating-size-active);
333
- block-size: var(--cd-rating-size-active);
334
- }
335
- .cd-rating__icon {
336
- inline-size: 100%;
337
- block-size: 100%;
338
- display: block;
339
- }
340
- .cd-rating__fg {
341
- position: absolute;
342
- inset-block: 0;
343
- inset-inline-start: 0;
344
- block-size: 100%;
345
- inline-size: 0;
346
- overflow: hidden;
347
- color: var(--cd-rating-color-active);
348
- transition: color var(--cd-motion-duration-fast) var(--cd-motion-ease-standard);
349
- }
350
- .cd-rating__icon--fg {
351
- inline-size: var(--cd-rating-size-default);
352
- block-size: 100%;
353
- }
354
- .cd-rating--small .cd-rating__icon--fg {
355
- inline-size: var(--cd-rating-size-small);
356
- }
357
- .cd-rating--large .cd-rating__icon--fg {
358
- inline-size: var(--cd-rating-size-large);
359
- }
360
- .cd-rating--custom .cd-rating__icon--fg {
361
- inline-size: var(--cd-rating-size-active);
362
- }
363
- .cd-rating--warning .cd-rating__fg {
364
- color: var(--cd-color-warning);
365
- }
366
- .cd-rating--error .cd-rating__fg {
367
- color: var(--cd-color-danger);
368
- }
369
- /* 自定义字符(字符串):以文本承载,撑满星位,垂直水平居中。 */
370
- .cd-rating__text {
371
- display: inline-flex;
372
- align-items: center;
373
- justify-content: center;
374
- inline-size: 100%;
375
- block-size: 100%;
376
- font-size: var(--cd-rating-size-default);
377
- line-height: 1;
378
- white-space: nowrap;
379
- }
380
- .cd-rating--small .cd-rating__text {
381
- font-size: var(--cd-rating-size-small);
382
- }
383
- .cd-rating--large .cd-rating__text {
384
- font-size: var(--cd-rating-size-large);
385
- }
386
- .cd-rating--custom .cd-rating__text {
387
- font-size: var(--cd-rating-size-active);
388
- }
389
- /* 视觉隐藏但对辅助技术可见(不可用 display:none / visibility:hidden)。 */
390
- .cd-rating__sr-live {
391
- position: absolute;
392
- inline-size: 1px;
393
- block-size: 1px;
394
- margin: -1px;
395
- padding: 0;
396
- overflow: hidden;
397
- clip: rect(0 0 0 0);
398
- clip-path: inset(50%);
399
- white-space: nowrap;
400
- border: 0;
401
- }
402
- @media (prefers-reduced-motion: reduce) {
403
- .cd-rating__fg {
404
- transition: none;
405
- }
406
- }
407
- </style>
@@ -1,15 +0,0 @@
1
- <!--
2
- 仅供 Rating.kbd.test.ts(browser project)使用的键盘 e2e 夹具。
3
- Rating 根元素是 role=slider(tabindex=0),焦点落在根上:
4
- 方向键调评分、数字键 1–9 定位、Home/End 到 0/count,aria-valuenow 真实变化。
5
- before 按钮验证 Tab 真实聚焦到 slider 根。
6
- -->
7
- <script lang="ts">
8
- import { LocaleProvider } from '../locale-provider/index.js';
9
- import Rating from './Rating.svelte';
10
- </script>
11
-
12
- <LocaleProvider locale="en_US">
13
- <button type="button" data-testid="before">before</button>
14
- <Rating defaultValue={3} count={5} ariaLabel="Score" />
15
- </LocaleProvider>
@@ -1,2 +0,0 @@
1
- export { default as Rating } from './Rating.svelte';
2
- export { meta as ratingMeta } from './meta.js';
@@ -1,40 +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: 'Rating',
7
- category: 'input',
8
- description: '评分组件,支持半星、hover 预览、点击清零与键盘操作,遵循 APG Slider 模式。',
9
- props: [
10
- { name: 'value', type: 'number', default: 'undefined', desc: '受控值;提供则为受控' },
11
- { name: 'defaultValue', type: 'number', default: '0', desc: '非受控初始值' },
12
- { name: 'count', type: 'number', default: '5', desc: '图标总数' },
13
- { name: 'allowHalf', type: 'boolean', default: 'false', desc: '允许半星(步进 0.5)' },
14
- { name: 'allowClear', type: 'boolean', default: 'true', desc: '点击当前值清零' },
15
- { name: 'character', type: 'string | Snippet<[{index,state,value}]>', default: 'undefined', desc: '自定义字符/图标;不传则默认星形' },
16
- { name: 'size', type: "'small'|'default'|'large'|number", default: 'default' },
17
- { name: 'disabled', type: 'boolean', default: 'false' },
18
- { name: 'readonly', type: 'boolean', default: 'false' },
19
- { name: 'status', type: "'default'|'warning'|'error'", default: 'default' },
20
- { name: 'tooltips', type: 'string[]', default: 'undefined', desc: '逐项提示文案(native title),长度应等于 count' },
21
- { name: 'autoFocus', type: 'boolean', default: 'false', desc: '挂载时聚焦' },
22
- { name: 'name', type: 'string', default: 'undefined' },
23
- { name: 'id', type: 'string', default: '自动生成', desc: '根元素 id,关联 aria' },
24
- { name: 'ariaLabel', type: 'string', default: 'i18n 默认', desc: '无可视标签时的辅助名' },
25
- { name: 'onChange', type: '(v: number) => void', default: 'undefined' },
26
- { name: 'onHoverChange', type: '(v: number) => void', default: 'undefined', desc: '悬停预览值变化;移出时为当前 value' },
27
- ],
28
- i18nKeys: ['Rating.ariaLabel', 'Rating.valueText', 'Rating.cleared', 'Rating.unrated'],
29
- a11y: {
30
- role: 'slider',
31
- keyboard: ['ArrowRight/Up', 'ArrowLeft/Down', 'Home', 'End', 'Delete', 'Backspace'],
32
- notes: [
33
- 'role=slider + aria-valuenow/valuemin/valuemax/valuetext',
34
- 'hover 预览为纯本地状态,不影响受控值',
35
- 'allowHalf 时按指针落在星左/右半决定 .5',
36
- 'disabled→aria-disabled,readonly→aria-readonly,error→aria-invalid',
37
- ],
38
- },
39
- tokens: ['--cd-rating-*', '--cd-color-warning', '--cd-color-danger', '--cd-focus-ring', '--cd-motion-*'],
40
- } as const;
@@ -1,169 +0,0 @@
1
- <!--
2
- ResizeObserver — see specs/components/other/ResizeObserver.spec.md
3
- Renderless 工具组件:渲染一个无样式包裹元素作为观测容器,
4
- 通过 @chenzy-design/core 的 createResizeObserver 监听其尺寸,
5
- slot 暴露归一化的 width/height/entry。
6
-
7
- 盒模型:content-box / border-box / device-pixel-content-box,
8
- 单目标 + 多目标(multiple)+ throttle/debounce 节流去抖,包裹元素标签可经 tag 自定义。
9
- fallbackToWindow 降级(原生不可用或显式开启时监听 window.resize 近似重测),
10
- onResizeStart/onResizeEnd 边界事件(连续变化首帧 / 静默结束,core 纯状态机驱动)。
11
-
12
- ⚠️ 死循环红线:
13
- - 红线 #1:无受控回写,尺寸只向 slot / 回调单向分发。
14
- - 红线 #3:observer 在 $effect 内命令式创建 + observe,
15
- cleanup 时 disconnect;不使用响应式 attachment 读 DOM 几何。
16
- - 包裹元素必须有真实盒子(默认 display:block),
17
- 绝不用 display:contents —— 该元素不生成盒子,ResizeObserver 无法观测其尺寸。
18
- -->
19
- <script lang="ts">
20
- import type { Snippet } from 'svelte';
21
- import {
22
- createResizeObserver,
23
- type CDResizeEntry,
24
- type ResizeBox,
25
- } from '@chenzy-design/core';
26
-
27
- interface Props {
28
- /** 观测盒模型,默认 'content-box'(另支持 border-box / device-pixel-content-box) */
29
- box?: ResizeBox;
30
- /** 暂停尺寸分发,默认 false(observer 仍在监听,仅不向外通知) */
31
- disabled?: boolean;
32
- /**
33
- * 节流间隔(ms),leading+trailing,默认 0 即原生即时回调。
34
- * 与 debounce 互斥(同时 >0 时 debounce 优先)。
35
- */
36
- throttle?: number;
37
- /** 防抖等待(ms),trailing-only,默认 0 关闭。与 throttle 互斥(优先)。 */
38
- debounce?: number;
39
- /**
40
- * 多目标:true 时观测包裹元素内所有直接子元素(而非包裹元素本身),
41
- * onResize 逐个抛出,用 entry.target 区分。默认 false(观测包裹元素)。
42
- * 注意:多目标模式下 slot 的 width/height 反映最后一次变化的目标。
43
- */
44
- multiple?: boolean;
45
- /** 挂载后立即测量一次,默认 true(ResizeObserver 原生在 observe 时触发首次回调,天然满足) */
46
- observeOnMount?: boolean;
47
- /** 包裹元素标签,默认 'div'。须为可生成盒子的元素(勿用 display:contents 类标签)。 */
48
- tag?: string;
49
- /**
50
- * 原生 ResizeObserver 不可用(SSR/老环境)或显式开启时,降级监听 window.resize,
51
- * 用 getBoundingClientRect 近似重测(精度较低)。默认 false:不支持环境静默降级。
52
- */
53
- fallbackToWindow?: boolean;
54
- /** 尺寸变化回调(归一化 entry) */
55
- onResize?: (entry: CDResizeEntry) => void;
56
- /** 首次测量回调 */
57
- onFirstMeasure?: (entry: CDResizeEntry) => void;
58
- /** 一段连续尺寸变化的首帧触发("调整中"态) */
59
- onResizeStart?: (entry: CDResizeEntry) => void;
60
- /** 连续变化结束后(静默一段时间)触发,payload 为最后一帧("调整完成") */
61
- onResizeEnd?: (entry: CDResizeEntry) => void;
62
- /** slot 作用域参数:{ width, height, entry } */
63
- children?: Snippet<
64
- [{ width: number; height: number; entry: CDResizeEntry | null }]
65
- >;
66
- class?: string;
67
- }
68
-
69
- let {
70
- box = 'content-box',
71
- disabled = false,
72
- throttle = 0,
73
- debounce = 0,
74
- multiple = false,
75
- observeOnMount = true,
76
- tag = 'div',
77
- fallbackToWindow = false,
78
- onResize,
79
- onFirstMeasure,
80
- onResizeStart,
81
- onResizeEnd,
82
- children,
83
- class: className,
84
- }: Props = $props();
85
-
86
- // 包裹元素普通引用(bind:this),即被观测对象。
87
- let el = $state<HTMLElement | null>(null);
88
-
89
- // 本地响应式状态:仅由 observer 回调(非 render 期)写入,render 期只读以驱动 slot。
90
- let width = $state(0);
91
- let height = $state(0);
92
- let entry = $state<CDResizeEntry | null>(null);
93
-
94
- // 普通(非响应式)变量:标记是否已触发首次测量。
95
- let firstFired = false;
96
-
97
- // observer 命令式创建 + observe + cleanup disconnect(红线 #3)。
98
- // 依赖 el + box + throttle + debounce + multiple:变更时重建 observer。
99
- // disabled 不进依赖(避免暂停/恢复时丢失监听重建)——在回调内读最新 prop 值。
100
- $effect(() => {
101
- if (!el) return;
102
-
103
- const node = el;
104
- const ro = createResizeObserver({
105
- box,
106
- throttle,
107
- debounce,
108
- fallbackToWindow,
109
- // 仅在使用方监听时挂 start/end,避免无谓的静默计时器(向后兼容)。
110
- onResizeStart: onResizeStart
111
- ? (e) => {
112
- if (disabled) return;
113
- onResizeStart?.(e);
114
- }
115
- : undefined,
116
- onResizeEnd: onResizeEnd
117
- ? (e) => {
118
- if (disabled) return;
119
- onResizeEnd?.(e);
120
- }
121
- : undefined,
122
- onResize: (e) => {
123
- // disabled 在回调内读 prop 最新值(Svelte 5 解构 prop 在闭包内访问是响应式最新值)。
124
- if (disabled) return;
125
- width = e.width;
126
- height = e.height;
127
- entry = e;
128
- if (!firstFired) {
129
- firstFired = true;
130
- onFirstMeasure?.(e);
131
- }
132
- onResize?.(e);
133
- },
134
- });
135
-
136
- // SSR / 无原生 RO 且未开启 window 降级:静默不监听。
137
- // 降级模式 supported 仍为 false,但内部已挂 window.resize,故需放行。
138
- if (!ro.supported && !fallbackToWindow) return;
139
-
140
- if (multiple) {
141
- // 多目标:观测包裹元素的所有直接子元素(同一 observer 实例复用)。
142
- const targets = Array.from(node.children);
143
- for (const child of targets) ro.observe(child);
144
- } else {
145
- ro.observe(node);
146
- }
147
-
148
- return () => ro.disconnect();
149
- });
150
-
151
- const cls = $derived(
152
- ['cd-resize-observer', className].filter(Boolean).join(' '),
153
- );
154
- </script>
155
-
156
- <svelte:element this={tag} class={cls} bind:this={el}>
157
- {#if children}{@render children({ width, height, entry })}{/if}
158
- </svelte:element>
159
-
160
- <style>
161
- /*
162
- 必须有真实盒子供 ResizeObserver 观测 —— 不可用 display:contents。
163
- 无任何视觉样式(无 padding/border/background),仅作透明观测容器;
164
- 使用方可通过 class/style 控制其尺寸。
165
- */
166
- .cd-resize-observer {
167
- display: block;
168
- }
169
- </style>