@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,762 +0,0 @@
1
- <!--
2
- Menu — see specs/components/navigation/Menu.spec.md
3
- 基础子集: vertical + inline 模式, 数据驱动 items (含 SubMenu 子项),
4
- selectedKeys 单选, openKeys 展开/收起, navigation 语义 (role=menu/menuitem)。
5
- 受控/非受控 (红线 #1: 不回写 prop, 仅 onChange/onOpenChange)。
6
- 展开状态用本地 Set $state (红线 #2: 不读挂载 registry)。
7
- vertical 模式: SubMenu 改为 hover 弹出浮层 (复用 _floating, 顶层 bottomStart + 嵌套 rightStart, 多级嵌套),
8
- 进入/离开带延迟避免缝隙抖动; inline 模式保持内联展开。
9
- horizontal 模式: 顶部菜单栏 (role=menubar), 顶层项横排 + ←→ roving 键盘切换, SubMenu 向下弹浮层 (复用 MenuPopupNode)。
10
- multiple 多选: 点叶子项 toggle 选中态, selectedKeys 可含多项同时高亮 + 勾选标记 (role=menuitemcheckbox/aria-checked);
11
- 受控不回写 (红线 #1), 父组件据 onSelect(key) 自行 toggle; 非受控内部维护多选 Set。
12
- purpose 语义区分 (红线 #2: role 由 deriveMenuSemantics 纯函数派生):
13
- 'menu' (默认, 命令式菜单): role=menu/menuitem + roving tabindex, 叶子 button + onClick, 行为完全向后兼容;
14
- 'navigation' (站点导航): <nav> landmark 包裹 ul, 含 href 的叶子渲染原生 <a href> 走浏览器链接 + Tab 键序,
15
- 不用 menuitem role (改用原生 list/link 语义)。
16
- -->
17
- <script lang="ts">
18
- import { SvelteSet } from 'svelte/reactivity';
19
- import MenuPopupNode from './MenuPopupNode.svelte';
20
- import { deriveMenuSemantics, isDivider, isGroup } from './types.js';
21
- import type { Snippet } from 'svelte';
22
- import type { MenuItemDef, MenuItemNode, MenuKey, MenuPurpose } from './types.js';
23
-
24
- type Mode = 'vertical' | 'inline' | 'horizontal';
25
- type Size = 'small' | 'default' | 'large';
26
- type Status = 'default' | 'warning' | 'error';
27
- type TriggerSubMenuAction = 'hover' | 'click';
28
-
29
- interface TooltipProps {
30
- content?: string;
31
- position?: string;
32
- theme?: 'dark' | 'light';
33
- mouseEnterDelay?: number;
34
- mouseLeaveDelay?: number;
35
- }
36
-
37
- interface Props {
38
- items?: MenuItemDef[];
39
- mode?: Mode;
40
- selectedKeys?: MenuKey[];
41
- defaultSelectedKeys?: MenuKey[];
42
- openKeys?: MenuKey[];
43
- defaultOpenKeys?: MenuKey[];
44
- size?: Size;
45
- inlineIndent?: number;
46
- /** inline 模式下折叠为图标轨:仅显图标、容器变窄,有子菜单的项 hover 向右弹浮层 */
47
- inlineCollapsed?: boolean;
48
- /** 多选模式:点击叶子项 toggle 其选中态,selectedKeys 可含多项同时高亮(默认单选) */
49
- multiple?: boolean;
50
- /**
51
- * 浮层子菜单触发方式(仅 vertical/horizontal/collapsed 浮层模式生效):
52
- * 'hover'(默认推导)= 鼠标悬停带 open/close 延迟展开/收起;
53
- * 'click' = 点击 title 切换浮层(不随 hover 开合)。
54
- * 缺省时按 mode 推导:horizontal 默认 hover,其余 hover(inline 内联不涉及浮层)。
55
- */
56
- triggerSubMenuAction?: TriggerSubMenuAction;
57
- /** hover 触发时子菜单浮层展开延迟(ms) */
58
- subMenuOpenDelay?: number;
59
- /** hover 触发时子菜单浮层收起延迟(ms) */
60
- subMenuCloseDelay?: number;
61
- /** 浮层子菜单挂载容器,缺省 document.body(透传 floating action getContainer) */
62
- getPopupContainer?: () => HTMLElement | null | undefined;
63
- /**
64
- * 校验态(用于表单内菜单选择,少见):'default' | 'warning' | 'error'。
65
- * 非 default 时给根节点加 cd-menu--{status} 类并以 token 着色选中指示条/边框,
66
- * error 时根节点 aria-invalid=true。默认 'default'。
67
- */
68
- status?: Status;
69
- /**
70
- * 浮层子菜单隐藏时是否卸载其内容 DOM(默认 false:保留 DOM 仅隐藏,重显不重建)。
71
- * 仅作用于 vertical/horizontal/collapsed 浮层模式的 hover/click 子菜单浮层;
72
- * inline 内联展开不涉及浮层,始终随展开态挂载/卸载。
73
- */
74
- destroyOnHide?: boolean;
75
- /** 整体禁用:所有项不可交互(叶子/子菜单 title 均 disabled) */
76
- disabled?: boolean;
77
- /**
78
- * 语义用途(默认 'menu'):
79
- * 'menu' = 命令式菜单(role=menu/menuitem + roving,执行操作);
80
- * 'navigation' = 站点导航(nav landmark + 含 href 叶子渲染 <a>,原生链接语义)。
81
- */
82
- purpose?: MenuPurpose;
83
- onSelect?: (key: MenuKey) => void;
84
- onOpenChange?: (keys: MenuKey[]) => void;
85
- ariaLabel?: string;
86
- /**
87
- * 折叠模式(inlineCollapsed=true)下顶层项的 Tooltip 配置。
88
- * content 默认为项 label;position→placement、theme、mouseEnterDelay、mouseLeaveDelay 透传给 Tooltip。
89
- */
90
- tooltipProps?: TooltipProps;
91
- /**
92
- * 自定义叶子项内容包裹 Snippet,接收 { item, children }。
93
- * children 为默认的 <a> 或 <button>,可在外层包一层自定义容器。
94
- */
95
- renderWrapper?: Snippet<[{ item: MenuItemNode; children: Snippet }]>;
96
- }
97
-
98
- let {
99
- items = [],
100
- mode = 'vertical',
101
- selectedKeys,
102
- defaultSelectedKeys = [],
103
- openKeys,
104
- defaultOpenKeys = [],
105
- size = 'default',
106
- inlineIndent = 24,
107
- inlineCollapsed = false,
108
- multiple = false,
109
- triggerSubMenuAction,
110
- subMenuOpenDelay = 100,
111
- subMenuCloseDelay = 100,
112
- status = 'default',
113
- destroyOnHide = false,
114
- getPopupContainer,
115
- disabled = false,
116
- purpose = 'menu',
117
- onSelect,
118
- onOpenChange,
119
- ariaLabel,
120
- tooltipProps,
121
- renderWrapper,
122
- }: Props = $props();
123
-
124
- // 浮层子菜单触发方式:未显式指定时按 mode 推导(全部默认 hover;inline 走内联不涉及浮层)。
125
- const subTrigger = $derived<TriggerSubMenuAction>(triggerSubMenuAction ?? 'hover');
126
-
127
- // 折叠仅在 inline 模式生效;其它模式忽略以保持向后兼容。
128
- const collapsed = $derived(mode === 'inline' && inlineCollapsed);
129
-
130
- // role/语义由纯函数派生(红线 #2):navigation 用原生 nav/list/link,menu 用 menu/menuitem。
131
- const sem = $derived(deriveMenuSemantics(purpose, mode, multiple));
132
- const navigation = $derived(sem.navigation);
133
-
134
- function getInitialSelected(): SvelteSet<MenuKey> {
135
- return new SvelteSet(defaultSelectedKeys);
136
- }
137
- function getInitialOpen(): SvelteSet<MenuKey> {
138
- return new SvelteSet(defaultOpenKeys);
139
- }
140
-
141
- // --- 受控 selectedKeys (红线 #1): 不回写 prop, 仅 onSelect ---
142
- const isSelectControlled = $derived(selectedKeys !== undefined);
143
- const innerSelected = $state<SvelteSet<MenuKey>>(getInitialSelected());
144
- const currentSelected = $derived<ReadonlySet<MenuKey>>(
145
- isSelectControlled ? new SvelteSet(selectedKeys) : innerSelected,
146
- );
147
-
148
- // --- 受控 openKeys (红线 #1 + #2): 本地 Set 兜底, 仅 onOpenChange ---
149
- const isOpenControlled = $derived(openKeys !== undefined);
150
- const innerOpen = $state<SvelteSet<MenuKey>>(getInitialOpen());
151
- const currentOpen = $derived<ReadonlySet<MenuKey>>(
152
- isOpenControlled ? new SvelteSet(openKeys) : innerOpen,
153
- );
154
-
155
- function isSelected(key: MenuKey): boolean {
156
- return currentSelected.has(key);
157
- }
158
-
159
- function isOpen(key: MenuKey): boolean {
160
- return currentOpen.has(key);
161
- }
162
-
163
- function hasChildren(item: MenuItemNode): boolean {
164
- return !!item.children && item.children.length > 0;
165
- }
166
-
167
- // 整体 disabled 叠加单项 disabled:模板据此渲染 aria-disabled/disabled。
168
- function isItemDisabled(item: MenuItemNode): boolean {
169
- return disabled || !!item.disabled;
170
- }
171
-
172
- function selectLeaf(item: MenuItemNode) {
173
- if (disabled || item.disabled) return;
174
- // 非受控才回写内部 Set:multiple 下 toggle(已选取消/未选加入),单选下替换。
175
- if (!isSelectControlled) {
176
- if (multiple) {
177
- if (innerSelected.has(item.key)) innerSelected.delete(item.key);
178
- else innerSelected.add(item.key);
179
- } else {
180
- innerSelected.clear();
181
- innerSelected.add(item.key);
182
- }
183
- }
184
- // 受控由父组件依据 onSelect(key) 自行维护 selectedKeys(红线 #1:不回写 prop)。
185
- onSelect?.(item.key);
186
- }
187
-
188
- function toggleSub(item: MenuItemNode) {
189
- if (disabled || item.disabled) return;
190
- const willOpen = !currentOpen.has(item.key);
191
- const next = [...currentOpen].filter((k) => k !== item.key);
192
- if (willOpen) next.push(item.key);
193
- if (!isOpenControlled) {
194
- innerOpen.clear();
195
- for (const k of next) innerOpen.add(k);
196
- }
197
- onOpenChange?.(next);
198
- }
199
-
200
- const cls = $derived(
201
- [
202
- 'cd-menu',
203
- `cd-menu--${mode}`,
204
- `cd-menu--${size}`,
205
- status !== 'default' ? `cd-menu--${status}` : '',
206
- collapsed ? 'cd-menu--collapsed' : '',
207
- ]
208
- .filter(Boolean)
209
- .join(' '),
210
- );
211
-
212
- // --- roving tabindex / 键盘导航(a11y §6 / WAI-ARIA APG Menu)---
213
- // rootEl 普通引用(bind:this),命令式 focus()/tabindex 写入用,非 render 期读 DOM。
214
- let rootEl = $state<HTMLUListElement | null>(null);
215
-
216
- // horizontal menubar 顶层项:每个顶层 li 内第一个 menuitem(←→ roving 用)。
217
- function menubarTops(): HTMLElement[] {
218
- if (!rootEl) return [];
219
- return [...rootEl.children]
220
- .map((li) => li.querySelector<HTMLElement>('[role="menuitem"]'))
221
- .filter((el): el is HTMLElement => el !== null);
222
- }
223
-
224
- // vertical/inline:当前可见、可聚焦的 menuitem,按 DOM 顺序漫游
225
- // (inline renderItems 与 vertical MenuPopupNode 均产出 [role="menuitem"] 按钮)。
226
- // 排除 disabled(原生 disabled 已移出焦点序)与隐藏浮层内的项(仅漫游当前可见层)。
227
- function verticalItems(): HTMLElement[] {
228
- if (!rootEl) return [];
229
- return [...rootEl.querySelectorAll<HTMLElement>('[role="menuitem"]')].filter(
230
- (el) =>
231
- !el.hasAttribute('disabled') &&
232
- // 隐藏浮层子菜单(cd-menu__sub--hidden / aria-hidden)内的项不参与漫游
233
- el.closest('[aria-hidden="true"]') === null &&
234
- el.offsetParent !== null,
235
- );
236
- }
237
-
238
- // 把 roving tabindex 收敛到单一停靠点:仅 active 项 tabindex=0,其余 -1
239
- // (命令式写 DOM,非 render 期;红线 #2:不在 render 期写状态)。
240
- function applyRovingTabindex(items: HTMLElement[], active: HTMLElement | null) {
241
- const stop = active ?? items[0] ?? null;
242
- for (const el of items) el.tabIndex = el === stop ? 0 : -1;
243
- }
244
-
245
- // 挂载后 / items 变化后:vertical/inline 模式收敛 roving 停靠点为首项。
246
- $effect(() => {
247
- if (sem.navigation || mode === 'horizontal') return;
248
- void items; // items 变化重算
249
- const list = verticalItems();
250
- if (list.length === 0) return;
251
- const focused = list.find((el) => el === document.activeElement) ?? null;
252
- applyRovingTabindex(list, focused);
253
- });
254
-
255
- // typeahead 缓冲(普通簿记变量,不参与 render 响应式;红线 #2)。
256
- let typeBuffer = '';
257
- let typeTimer: ReturnType<typeof setTimeout> | undefined;
258
- function pushType(ch: string): string {
259
- if (typeTimer !== undefined) clearTimeout(typeTimer);
260
- typeBuffer += ch.toLowerCase();
261
- typeTimer = setTimeout(() => {
262
- typeBuffer = '';
263
- typeTimer = undefined;
264
- }, 500);
265
- return typeBuffer;
266
- }
267
- $effect(() => () => {
268
- if (typeTimer !== undefined) clearTimeout(typeTimer);
269
- });
270
-
271
- function itemText(el: HTMLElement): string {
272
- return (el.querySelector('.cd-menu__label')?.textContent ?? el.textContent ?? '')
273
- .trim()
274
- .toLowerCase();
275
- }
276
-
277
- function onMenuKeydown(e: KeyboardEvent) {
278
- // navigation 用途用原生链接 + Tab 键序,不接管 roving(红线: 不破坏原生导航)。
279
- if (sem.navigation) return;
280
-
281
- if (mode === 'horizontal') {
282
- if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft' && e.key !== 'Home' && e.key !== 'End') return;
283
- const tops = menubarTops();
284
- if (tops.length === 0) return;
285
- const cur = tops.findIndex((el) => el === document.activeElement);
286
- e.preventDefault();
287
- let next = cur;
288
- if (e.key === 'ArrowRight') next = cur < 0 ? 0 : (cur + 1) % tops.length;
289
- else if (e.key === 'ArrowLeft') next = cur < 0 ? tops.length - 1 : (cur - 1 + tops.length) % tops.length;
290
- else if (e.key === 'Home') next = 0;
291
- else if (e.key === 'End') next = tops.length - 1;
292
- tops[next]?.focus();
293
- applyRovingTabindex(tops, tops[next] ?? null);
294
- return;
295
- }
296
-
297
- // vertical / inline:↑↓ 漫游、Home/End 跳首末、typeahead 首字母、Esc 收起/关闭子菜单。
298
- const list = verticalItems();
299
- if (list.length === 0) return;
300
- const cur = list.findIndex((el) => el === document.activeElement);
301
-
302
- if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End') {
303
- e.preventDefault();
304
- let next = cur;
305
- if (e.key === 'ArrowDown') next = cur < 0 ? 0 : (cur + 1) % list.length;
306
- else if (e.key === 'ArrowUp') next = cur < 0 ? list.length - 1 : (cur - 1 + list.length) % list.length;
307
- else if (e.key === 'Home') next = 0;
308
- else if (e.key === 'End') next = list.length - 1;
309
- const target = list[next];
310
- if (target) {
311
- target.focus();
312
- applyRovingTabindex(list, target);
313
- }
314
- return;
315
- }
316
-
317
- if (e.key === 'Escape') {
318
- // 收起当前聚焦项所在的展开子菜单,焦点返回其触发器(APG)。
319
- const active = document.activeElement as HTMLElement | null;
320
- const titleEl = active?.closest<HTMLElement>('.cd-menu__item--submenu')?.querySelector<HTMLElement>('.cd-menu__title[aria-expanded="true"]');
321
- const sub = active?.closest<HTMLElement>('.cd-menu__sub');
322
- const parentTitle = sub?.previousElementSibling as HTMLElement | null;
323
- if (parentTitle?.matches('.cd-menu__title')) {
324
- // 焦点在子列表内:收起父级子菜单并把焦点返回父触发器。
325
- const key = parentTitle.dataset.menuKey;
326
- if (key !== undefined) {
327
- collapseByKey(key);
328
- parentTitle.focus();
329
- e.preventDefault();
330
- }
331
- return;
332
- }
333
- if (titleEl?.dataset.menuKey !== undefined) {
334
- // 焦点在已展开的 SubMenu 触发器上:收起自身。
335
- collapseByKey(titleEl.dataset.menuKey);
336
- e.preventDefault();
337
- }
338
- return;
339
- }
340
-
341
- // typeahead:单字符(可打印、非组合键)→ 跳到首字母匹配项。
342
- if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey && /\S/.test(e.key)) {
343
- const buf = pushType(e.key);
344
- const start = cur < 0 ? 0 : cur;
345
- // 从当前项之后开始环绕查找,单字符重复时跳到下一个同首字母项。
346
- const offset = buf.length === 1 ? 1 : 0;
347
- for (let i = 0; i < list.length; i += 1) {
348
- const idx = (start + offset + i) % list.length;
349
- if (itemText(list[idx]!).startsWith(buf)) {
350
- e.preventDefault();
351
- list[idx]!.focus();
352
- applyRovingTabindex(list, list[idx]!);
353
- return;
354
- }
355
- }
356
- }
357
- }
358
-
359
- // 焦点进入某 menuitem(含鼠标点击)→ 把 roving 停靠点同步到它(单一 Tab 停靠点)。
360
- function onMenuFocusin(e: FocusEvent) {
361
- if (sem.navigation || mode === 'horizontal') return;
362
- const t = e.target as HTMLElement | null;
363
- if (!t || t.getAttribute('role') !== 'menuitem') return;
364
- applyRovingTabindex(verticalItems(), t);
365
- }
366
-
367
- // 按 key 收起内联展开的 SubMenu(data-menu-key 为字符串,需按 String 匹配原 key)。
368
- function collapseByKey(key: string) {
369
- const matched = [...currentOpen].find((k) => String(k) === key);
370
- if (matched === undefined) return;
371
- const next = [...currentOpen].filter((k) => k !== matched);
372
- if (!isOpenControlled) {
373
- innerOpen.clear();
374
- for (const k of next) innerOpen.add(k);
375
- }
376
- onOpenChange?.(next);
377
- }
378
- </script>
379
-
380
- {#snippet renderItems(list: MenuItemDef[], level: number)}
381
- {#each list as item, i (item.key ?? `__cd-menu-${level}-${i}`)}
382
- {@const indent = `calc(var(--cd-menu-item-padding) + ${level} * ${inlineIndent}px)`}
383
- {#if isDivider(item)}
384
- <li class="cd-menu__divider" role={sem.navigation ? undefined : 'separator'}></li>
385
- {:else if isGroup(item)}
386
- <li class="cd-menu__item cd-menu__item--group" role={sem.structuralRole}>
387
- <div
388
- class="cd-menu__group-title"
389
- style="padding-inline-start: {indent}"
390
- id="cd-menu-group-{item.key ?? `${level}-${i}`}"
391
- >
392
- {item.label}
393
- </div>
394
- <ul
395
- class="cd-menu__group-list"
396
- role={sem.groupListRole}
397
- aria-labelledby="cd-menu-group-{item.key ?? `${level}-${i}`}"
398
- >
399
- {@render renderItems(item.children, level)}
400
- </ul>
401
- </li>
402
- {:else if hasChildren(item)}
403
- {@const open = isOpen(item.key)}
404
- <li class="cd-menu__item cd-menu__item--submenu" role={sem.structuralRole}>
405
- <button
406
- type="button"
407
- class="cd-menu__title"
408
- role={sem.submenuTitleRole}
409
- data-menu-key={String(item.key)}
410
- aria-haspopup="true"
411
- aria-expanded={open}
412
- aria-disabled={isItemDisabled(item) || undefined}
413
- disabled={isItemDisabled(item) || undefined}
414
- style="padding-inline-start: {indent}"
415
- onclick={() => toggleSub(item)}
416
- onkeydown={(e) => {
417
- // 内联 SubMenu 触发器:→/Enter/Space 展开,←/Esc 收起(APG disclosure)。
418
- if (e.key === 'ArrowRight' || e.key === 'Enter' || e.key === ' ') {
419
- if (!isItemDisabled(item) && !isOpen(item.key)) {
420
- e.preventDefault();
421
- toggleSub(item);
422
- }
423
- } else if (e.key === 'ArrowLeft') {
424
- if (isOpen(item.key)) {
425
- e.preventDefault();
426
- toggleSub(item);
427
- }
428
- }
429
- }}
430
- >
431
- {#if item.icon}<span class="cd-menu__icon" aria-hidden="true">{@render item.icon()}</span>{/if}
432
- <span class="cd-menu__label">{item.label}</span>
433
- <span
434
- class="cd-menu__arrow"
435
- class:cd-menu__arrow--open={open}
436
- aria-hidden="true"
437
- >
438
- <svg viewBox="0 0 16 16" width="10" height="10" focusable="false">
439
- <path fill="currentColor" d="M6 4l4 4-4 4V4Z" />
440
- </svg>
441
- </span>
442
- </button>
443
- {#if open}
444
- <ul class="cd-menu__sub" role={sem.subListRole}>
445
- {@render renderItems(item.children ?? [], level + 1)}
446
- </ul>
447
- {/if}
448
- </li>
449
- {:else}
450
- {@const selected = isSelected(item.key)}
451
- <li class="cd-menu__item" role={sem.structuralRole}>
452
- {#if sem.navigation && item.href !== undefined}
453
- <!-- navigation 用途:含 href 叶子渲染原生 <a>,走浏览器链接 + Tab 键序 -->
454
- {#snippet inlineLeafLink()}
455
- <a
456
- class="cd-menu__link"
457
- class:cd-menu__link--selected={selected}
458
- href={isItemDisabled(item) ? undefined : item.href}
459
- target={item.target}
460
- rel={item.rel}
461
- aria-current={selected ? 'page' : undefined}
462
- aria-disabled={isItemDisabled(item) || undefined}
463
- style="padding-inline-start: {indent}"
464
- onclick={() => selectLeaf(item)}
465
- >
466
- {#if item.icon}<span class="cd-menu__icon" aria-hidden="true">{@render item.icon()}</span>{/if}
467
- <span class="cd-menu__label">{item.label}</span>
468
- </a>
469
- {/snippet}
470
- {#if renderWrapper}
471
- {@render renderWrapper({ item: item as MenuItemNode, children: inlineLeafLink })}
472
- {:else}
473
- {@render inlineLeafLink()}
474
- {/if}
475
- {:else}
476
- {#snippet inlineLeafButton()}
477
- <button
478
- type="button"
479
- class="cd-menu__link"
480
- class:cd-menu__link--selected={selected}
481
- role={sem.leafRole}
482
- aria-current={!sem.navigation && !multiple && selected ? 'true' : undefined}
483
- aria-checked={multiple ? selected : undefined}
484
- aria-disabled={isItemDisabled(item) || undefined}
485
- disabled={isItemDisabled(item) || undefined}
486
- style="padding-inline-start: {indent}"
487
- onclick={() => selectLeaf(item)}
488
- >
489
- {#if item.icon}<span class="cd-menu__icon" aria-hidden="true">{@render item.icon()}</span>{/if}
490
- <span class="cd-menu__label">{item.label}</span>
491
- {#if multiple}
492
- <span class="cd-menu__check" class:cd-menu__check--on={selected} aria-hidden="true">
493
- <svg viewBox="0 0 16 16" width="12" height="12" focusable="false">
494
- <path fill="none" stroke="currentColor" stroke-width="2" d="M3 8.5l3.5 3.5L13 5" />
495
- </svg>
496
- </span>
497
- {/if}
498
- </button>
499
- {/snippet}
500
- {#if renderWrapper}
501
- {@render renderWrapper({ item: item as MenuItemNode, children: inlineLeafButton })}
502
- {:else}
503
- {@render inlineLeafButton()}
504
- {/if}
505
- {/if}
506
- </li>
507
- {/if}
508
- {/each}
509
- {/snippet}
510
-
511
- {#snippet menuList()}
512
- <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
513
- <ul
514
- class={cls}
515
- role={sem.listRole}
516
- aria-label={sem.navigation ? undefined : ariaLabel}
517
- aria-orientation={!sem.navigation && mode === 'horizontal' ? 'horizontal' : undefined}
518
- aria-invalid={status === 'error' || undefined}
519
- bind:this={rootEl}
520
- onkeydown={onMenuKeydown}
521
- onfocusin={onMenuFocusin}
522
- >
523
- {#if collapsed}
524
- {#each items as item, i (item.key ?? `__cd-menu-top-${i}`)}
525
- <MenuPopupNode
526
- {item}
527
- placement="rightStart"
528
- collapsed
529
- {multiple}
530
- {navigation}
531
- {isSelected}
532
- trigger={subTrigger}
533
- openDelay={subMenuOpenDelay}
534
- closeDelay={subMenuCloseDelay}
535
- {destroyOnHide}
536
- {getPopupContainer}
537
- parentDisabled={disabled}
538
- {tooltipProps}
539
- {renderWrapper}
540
- onSelectLeaf={selectLeaf}
541
- onCloseAll={() => {}}
542
- />
543
- {/each}
544
- {:else if mode === 'vertical' || mode === 'horizontal'}
545
- {#each items as item, i (item.key ?? `__cd-menu-top-${i}`)}
546
- <MenuPopupNode
547
- {item}
548
- placement="bottomStart"
549
- {multiple}
550
- {navigation}
551
- {isSelected}
552
- trigger={subTrigger}
553
- openDelay={subMenuOpenDelay}
554
- closeDelay={subMenuCloseDelay}
555
- {destroyOnHide}
556
- {getPopupContainer}
557
- parentDisabled={disabled}
558
- {renderWrapper}
559
- onSelectLeaf={selectLeaf}
560
- onCloseAll={() => {}}
561
- />
562
- {/each}
563
- {:else}
564
- {@render renderItems(items, 0)}
565
- {/if}
566
- </ul>
567
- {/snippet}
568
-
569
- {#if sem.navigation}
570
- <!-- navigation 用途:nav landmark 包裹原生 list/link,提供站点导航地标语义 -->
571
- <nav class="cd-menu-nav" aria-label={ariaLabel}>
572
- {@render menuList()}
573
- </nav>
574
- {:else}
575
- {@render menuList()}
576
- {/if}
577
-
578
- <style>
579
- /* navigation 用途的 nav landmark 包裹:不引入额外盒模型,仅作语义地标 */
580
- .cd-menu-nav {
581
- display: contents;
582
- }
583
- .cd-menu {
584
- margin: 0;
585
- padding: 0;
586
- list-style: none;
587
- background: var(--cd-menu-bg);
588
- color: var(--cd-menu-item-color);
589
- }
590
- /* navigation 叶子用 <a> 渲染:抹平默认下划线/颜色,复用 link 视觉 */
591
- .cd-menu a.cd-menu__link {
592
- text-decoration: none;
593
- }
594
- .cd-menu a.cd-menu__link[aria-disabled='true'] {
595
- color: var(--cd-menu-item-color-disabled);
596
- cursor: not-allowed;
597
- pointer-events: none;
598
- }
599
- /* horizontal 菜单栏:顶层项横排。顶层 li/控件由 MenuPopupNode 渲染(独立组件),
600
- 故用 :global 穿透 scoped 边界控制其方向与宽度。 */
601
- .cd-menu--horizontal {
602
- display: flex;
603
- align-items: stretch;
604
- border-block-end: 1px solid var(--cd-menu-border-color, var(--cd-color-border));
605
- }
606
- .cd-menu--horizontal > :global(.cd-menu__item) {
607
- display: flex;
608
- }
609
- .cd-menu--horizontal > :global(.cd-menu__item) > :global(.cd-menu__link),
610
- .cd-menu--horizontal > :global(.cd-menu__item) > :global(.cd-menu__title) {
611
- inline-size: auto;
612
- }
613
- /* 折叠图标轨:容器收窄到仅容图标 + padding */
614
- .cd-menu--collapsed {
615
- inline-size: var(--cd-menu-collapsed-width, calc(var(--cd-menu-item-height) + var(--cd-spacing-2)));
616
- }
617
- .cd-menu__item {
618
- margin: 0;
619
- padding: 0;
620
- }
621
- .cd-menu__sub {
622
- margin: 0;
623
- padding: 0;
624
- list-style: none;
625
- }
626
- /* 分隔符:水平细线,不可交互 */
627
- .cd-menu__divider {
628
- block-size: 1px;
629
- margin-block: var(--cd-spacing-1);
630
- background: var(--cd-menu-border-color, var(--cd-color-border));
631
- }
632
- /* 分组:始终展开的分区标题 + 组内项列表 */
633
- .cd-menu__group-list {
634
- margin: 0;
635
- padding: 0;
636
- list-style: none;
637
- }
638
- .cd-menu__group-title {
639
- display: flex;
640
- align-items: center;
641
- block-size: var(--cd-menu-item-height);
642
- padding-inline: var(--cd-menu-item-padding);
643
- color: var(--cd-menu-item-color-disabled);
644
- font-size: var(--cd-font-size-1);
645
- cursor: default;
646
- user-select: none;
647
- }
648
- .cd-menu__link,
649
- .cd-menu__title {
650
- display: flex;
651
- align-items: center;
652
- gap: var(--cd-spacing-2);
653
- inline-size: 100%;
654
- block-size: var(--cd-menu-item-height);
655
- padding-inline: var(--cd-menu-item-padding);
656
- border: none;
657
- background: transparent;
658
- color: var(--cd-menu-item-color);
659
- font: inherit;
660
- text-align: start;
661
- cursor: pointer;
662
- transition: background var(--cd-motion-duration-fast)
663
- var(--cd-motion-ease-standard);
664
- }
665
- .cd-menu--small .cd-menu__link,
666
- .cd-menu--small .cd-menu__title {
667
- font-size: var(--cd-font-size-1);
668
- }
669
- .cd-menu--large .cd-menu__link,
670
- .cd-menu--large .cd-menu__title {
671
- font-size: var(--cd-font-size-3);
672
- }
673
- .cd-menu__link:hover,
674
- .cd-menu__title:hover {
675
- background: var(--cd-menu-item-bg-hover);
676
- }
677
- .cd-menu__link:focus-visible,
678
- .cd-menu__title:focus-visible {
679
- outline: none;
680
- box-shadow: var(--cd-focus-ring);
681
- }
682
- .cd-menu__link--selected {
683
- position: relative;
684
- color: var(--cd-menu-item-color-selected);
685
- background: var(--cd-menu-item-bg-selected);
686
- }
687
- .cd-menu__link--selected::before {
688
- content: '';
689
- position: absolute;
690
- inset-block: 0;
691
- inset-inline-start: 0;
692
- inline-size: 3px;
693
- background: var(--cd-menu-item-indicator);
694
- }
695
- .cd-menu__link[aria-disabled='true'],
696
- .cd-menu__title[aria-disabled='true'] {
697
- color: var(--cd-menu-item-color-disabled);
698
- cursor: not-allowed;
699
- }
700
- /* 校验态:用 token 着色选中指示条与选中文字(表单内菜单少见场景)。
701
- 选中叶子可能由子组件 MenuPopupNode 渲染(vertical/horizontal/collapsed 浮层模式),
702
- 故用 :global 穿透 scoped 边界匹配后代 link。 */
703
- .cd-menu--warning :global(.cd-menu__link--selected) {
704
- color: var(--cd-menu-color-warning, var(--cd-color-warning));
705
- }
706
- .cd-menu--warning :global(.cd-menu__link--selected::before) {
707
- background: var(--cd-menu-color-warning, var(--cd-color-warning));
708
- }
709
- .cd-menu--error :global(.cd-menu__link--selected) {
710
- color: var(--cd-menu-color-danger, var(--cd-color-danger));
711
- }
712
- .cd-menu--error :global(.cd-menu__link--selected::before) {
713
- background: var(--cd-menu-color-danger, var(--cd-color-danger));
714
- }
715
- .cd-menu__label {
716
- flex: 1 1 auto;
717
- overflow: hidden;
718
- white-space: nowrap;
719
- text-overflow: ellipsis;
720
- }
721
- .cd-menu__icon {
722
- display: inline-flex;
723
- align-items: center;
724
- justify-content: center;
725
- flex: 0 0 auto;
726
- inline-size: 1rem;
727
- block-size: 1rem;
728
- color: var(--cd-menu-item-color);
729
- }
730
- .cd-menu__check {
731
- display: inline-flex;
732
- align-items: center;
733
- justify-content: center;
734
- flex: 0 0 auto;
735
- inline-size: 1rem;
736
- block-size: 1rem;
737
- color: var(--cd-menu-item-color-selected);
738
- opacity: 0;
739
- }
740
- .cd-menu__check--on {
741
- opacity: 1;
742
- }
743
- .cd-menu__arrow {
744
- display: inline-flex;
745
- align-items: center;
746
- justify-content: center;
747
- flex: 0 0 auto;
748
- color: var(--cd-menu-submenu-arrow-color);
749
- transition: transform var(--cd-motion-duration-fast)
750
- var(--cd-motion-ease-standard);
751
- }
752
- .cd-menu__arrow--open {
753
- transform: rotate(90deg);
754
- }
755
- @media (prefers-reduced-motion: reduce) {
756
- .cd-menu__link,
757
- .cd-menu__title,
758
- .cd-menu__arrow {
759
- transition: none;
760
- }
761
- }
762
- </style>