@zerodep-dev/vue-tsx-pro-ui 0.2.0 → 0.3.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 (416) hide show
  1. package/dist/base/Badge.js +3 -3
  2. package/dist/base/Badge.js.map +1 -1
  3. package/dist/base/Can.d.ts +12 -0
  4. package/dist/base/Can.js +20 -0
  5. package/dist/base/Can.js.map +1 -0
  6. package/dist/base/ClientOnly.d.ts +10 -0
  7. package/dist/base/ClientOnly.js +18 -0
  8. package/dist/base/ClientOnly.js.map +1 -0
  9. package/dist/base/CloseButton.js +3 -3
  10. package/dist/base/CloseButton.js.map +1 -1
  11. package/dist/base/CodeBlock.js +5 -5
  12. package/dist/base/CodeBlock.js.map +1 -1
  13. package/dist/base/CopyButton.js +3 -3
  14. package/dist/base/CopyButton.js.map +1 -1
  15. package/dist/base/Icon.js +3 -3
  16. package/dist/base/Icon.js.map +1 -1
  17. package/dist/base/Indicator.js +3 -3
  18. package/dist/base/Indicator.js.map +1 -1
  19. package/dist/base/StatusDot.js +3 -3
  20. package/dist/base/StatusDot.js.map +1 -1
  21. package/dist/base/Tag.js +5 -5
  22. package/dist/base/Tag.js.map +1 -1
  23. package/dist/base/button-core.js +4 -4
  24. package/dist/base/button-core.js.map +1 -1
  25. package/dist/charts/AreaChart.js +3 -3
  26. package/dist/charts/AreaChart.js.map +1 -1
  27. package/dist/charts/BarChart.js +3 -3
  28. package/dist/charts/BarChart.js.map +1 -1
  29. package/dist/charts/ChordChart.js +3 -3
  30. package/dist/charts/ChordChart.js.map +1 -1
  31. package/dist/charts/ComboChart.js +3 -3
  32. package/dist/charts/ComboChart.js.map +1 -1
  33. package/dist/charts/DonutChart.js +3 -3
  34. package/dist/charts/DonutChart.js.map +1 -1
  35. package/dist/charts/FunnelChart.js +5 -5
  36. package/dist/charts/FunnelChart.js.map +1 -1
  37. package/dist/charts/GraphChart.js +3 -3
  38. package/dist/charts/GraphChart.js.map +1 -1
  39. package/dist/charts/LineChart.js +3 -3
  40. package/dist/charts/LineChart.js.map +1 -1
  41. package/dist/charts/MapChart.js +7 -7
  42. package/dist/charts/MapChart.js.map +1 -1
  43. package/dist/charts/RadarChart.js +16 -15
  44. package/dist/charts/RadarChart.js.map +1 -1
  45. package/dist/charts/SankeyChart.js +3 -3
  46. package/dist/charts/SankeyChart.js.map +1 -1
  47. package/dist/charts/ScatterChart.js +3 -3
  48. package/dist/charts/ScatterChart.js.map +1 -1
  49. package/dist/charts/TimelineChart.js +6 -5
  50. package/dist/charts/TimelineChart.js.map +1 -1
  51. package/dist/charts/TreemapChart.js +3 -3
  52. package/dist/charts/TreemapChart.js.map +1 -1
  53. package/dist/charts/WaterfallChart.js +3 -3
  54. package/dist/charts/WaterfallChart.js.map +1 -1
  55. package/dist/charts/XYChart.js +9 -7
  56. package/dist/charts/XYChart.js.map +1 -1
  57. package/dist/charts/frame.js +10 -8
  58. package/dist/charts/frame.js.map +1 -1
  59. package/dist/charts/single.js +4 -3
  60. package/dist/charts/single.js.map +1 -1
  61. package/dist/config/Provider.d.ts +3 -1
  62. package/dist/config/Provider.js +9 -4
  63. package/dist/config/Provider.js.map +1 -1
  64. package/dist/config/context.d.ts +18 -0
  65. package/dist/config/context.js +16 -1
  66. package/dist/config/context.js.map +1 -1
  67. package/dist/config/createUi.d.ts +20 -3
  68. package/dist/config/createUi.js +80 -49
  69. package/dist/config/createUi.js.map +1 -1
  70. package/dist/config/layout/preference.d.ts +43 -0
  71. package/dist/config/layout/preference.js +108 -0
  72. package/dist/config/layout/preference.js.map +1 -0
  73. package/dist/date/Calendar.js +3 -3
  74. package/dist/date/Calendar.js.map +1 -1
  75. package/dist/date/CalendarBoard.js +9 -9
  76. package/dist/date/CalendarBoard.js.map +1 -1
  77. package/dist/date/CalendarView.js +7 -7
  78. package/dist/date/CalendarView.js.map +1 -1
  79. package/dist/date/DateField.js +3 -3
  80. package/dist/date/DateField.js.map +1 -1
  81. package/dist/date/DatePicker.js +5 -5
  82. package/dist/date/DatePicker.js.map +1 -1
  83. package/dist/date/DateRangePicker.js +5 -5
  84. package/dist/date/DateRangePicker.js.map +1 -1
  85. package/dist/date/DateSegmentGroup.js +5 -5
  86. package/dist/date/DateSegmentGroup.js.map +1 -1
  87. package/dist/date/QuarterCalendar.js +6 -6
  88. package/dist/date/QuarterCalendar.js.map +1 -1
  89. package/dist/date/RangeCalendar.js +3 -3
  90. package/dist/date/RangeCalendar.js.map +1 -1
  91. package/dist/date/SegmentedField.js +3 -3
  92. package/dist/date/SegmentedField.js.map +1 -1
  93. package/dist/date/TimeField.js +3 -3
  94. package/dist/date/TimeField.js.map +1 -1
  95. package/dist/date/TimePicker.js +4 -4
  96. package/dist/date/TimePicker.js.map +1 -1
  97. package/dist/date/date-segments.js +1 -1
  98. package/dist/date/date-segments.js.map +1 -1
  99. package/dist/date/picker-popover.js +3 -2
  100. package/dist/date/picker-popover.js.map +1 -1
  101. package/dist/diagram/Diagram.js +12 -12
  102. package/dist/diagram/Diagram.js.map +1 -1
  103. package/dist/diagram/DiagramLanes.js +3 -3
  104. package/dist/diagram/DiagramLanes.js.map +1 -1
  105. package/dist/diagram/DiagramMinimap.js +4 -4
  106. package/dist/diagram/DiagramMinimap.js.map +1 -1
  107. package/dist/display/Accordion.js +6 -6
  108. package/dist/display/Accordion.js.map +1 -1
  109. package/dist/display/AnimatedNumber.js +4 -4
  110. package/dist/display/AnimatedNumber.js.map +1 -1
  111. package/dist/display/Avatar.js +4 -4
  112. package/dist/display/Avatar.js.map +1 -1
  113. package/dist/display/Checklist.js +7 -7
  114. package/dist/display/Checklist.js.map +1 -1
  115. package/dist/display/Collapse.js +8 -5
  116. package/dist/display/Collapse.js.map +1 -1
  117. package/dist/display/Collapsible.js +3 -3
  118. package/dist/display/Collapsible.js.map +1 -1
  119. package/dist/display/Descriptions.js +5 -5
  120. package/dist/display/Descriptions.js.map +1 -1
  121. package/dist/display/Ellipsis.js +3 -3
  122. package/dist/display/Ellipsis.js.map +1 -1
  123. package/dist/display/FieldCompare.js +4 -4
  124. package/dist/display/FieldCompare.js.map +1 -1
  125. package/dist/display/Gauge.js +11 -11
  126. package/dist/display/Gauge.js.map +1 -1
  127. package/dist/display/Image.js +4 -4
  128. package/dist/display/Image.js.map +1 -1
  129. package/dist/display/Marquee.js +3 -3
  130. package/dist/display/Marquee.js.map +1 -1
  131. package/dist/display/ProportionBar.js +4 -4
  132. package/dist/display/ProportionBar.js.map +1 -1
  133. package/dist/display/Sortable.js +4 -4
  134. package/dist/display/Sortable.js.map +1 -1
  135. package/dist/display/Sparkline.js +6 -6
  136. package/dist/display/Sparkline.js.map +1 -1
  137. package/dist/display/Stat.js +3 -3
  138. package/dist/display/Stat.js.map +1 -1
  139. package/dist/display/Timeline.js +7 -7
  140. package/dist/display/Timeline.js.map +1 -1
  141. package/dist/display/Tree.js +10 -10
  142. package/dist/display/Tree.js.map +1 -1
  143. package/dist/display/VirtualList.js +7 -7
  144. package/dist/display/VirtualList.js.map +1 -1
  145. package/dist/display/Watermark.js +3 -3
  146. package/dist/display/Watermark.js.map +1 -1
  147. package/dist/docs-kit/CodeGroup.js +5 -5
  148. package/dist/docs-kit/CodeGroup.js.map +1 -1
  149. package/dist/docs-kit/CodePreview.js +6 -6
  150. package/dist/docs-kit/CodePreview.js.map +1 -1
  151. package/dist/docs-kit/PropsTable.js +4 -4
  152. package/dist/docs-kit/PropsTable.js.map +1 -1
  153. package/dist/feedback/Alert.js +5 -5
  154. package/dist/feedback/Alert.js.map +1 -1
  155. package/dist/feedback/Banner.js +5 -5
  156. package/dist/feedback/Banner.js.map +1 -1
  157. package/dist/feedback/Empty.js +4 -4
  158. package/dist/feedback/Empty.js.map +1 -1
  159. package/dist/feedback/LoadingBar.js +20 -13
  160. package/dist/feedback/LoadingBar.js.map +1 -1
  161. package/dist/feedback/LoadingOverlay.js +3 -3
  162. package/dist/feedback/LoadingOverlay.js.map +1 -1
  163. package/dist/feedback/Progress.js +14 -14
  164. package/dist/feedback/Progress.js.map +1 -1
  165. package/dist/feedback/Result.js +4 -4
  166. package/dist/feedback/Result.js.map +1 -1
  167. package/dist/feedback/SkeletonText.js +3 -3
  168. package/dist/feedback/SkeletonText.js.map +1 -1
  169. package/dist/feedback/Toast.js +6 -6
  170. package/dist/feedback/Toast.js.map +1 -1
  171. package/dist/form/Field.js +7 -7
  172. package/dist/form/Field.js.map +1 -1
  173. package/dist/form/Form.js +3 -3
  174. package/dist/form/Form.js.map +1 -1
  175. package/dist/form/FormErrorSummary.js +3 -3
  176. package/dist/form/FormErrorSummary.js.map +1 -1
  177. package/dist/form/FormSection.js +6 -6
  178. package/dist/form/FormSection.js.map +1 -1
  179. package/dist/index.d.ts +11 -6
  180. package/dist/index.js +10 -5
  181. package/dist/input/Autocomplete.js +3 -3
  182. package/dist/input/Autocomplete.js.map +1 -1
  183. package/dist/input/Cascader.js +7 -7
  184. package/dist/input/Cascader.js.map +1 -1
  185. package/dist/input/CharacterCount.js +3 -3
  186. package/dist/input/CharacterCount.js.map +1 -1
  187. package/dist/input/Checkbox.js +5 -5
  188. package/dist/input/Checkbox.js.map +1 -1
  189. package/dist/input/ColorField.js +4 -4
  190. package/dist/input/ColorField.js.map +1 -1
  191. package/dist/input/Combobox.js +4 -4
  192. package/dist/input/Combobox.js.map +1 -1
  193. package/dist/input/ConditionBuilder.js +15 -14
  194. package/dist/input/ConditionBuilder.js.map +1 -1
  195. package/dist/input/FileDrop.js +3 -3
  196. package/dist/input/FileDrop.js.map +1 -1
  197. package/dist/input/Listbox.js +9 -9
  198. package/dist/input/Listbox.js.map +1 -1
  199. package/dist/input/Mentions.js +3 -3
  200. package/dist/input/Mentions.js.map +1 -1
  201. package/dist/input/NumberField.js +3 -3
  202. package/dist/input/NumberField.js.map +1 -1
  203. package/dist/input/NumberRangeField.js +5 -5
  204. package/dist/input/NumberRangeField.js.map +1 -1
  205. package/dist/input/OtpField.js +5 -5
  206. package/dist/input/OtpField.js.map +1 -1
  207. package/dist/input/PeoplePicker.js +6 -6
  208. package/dist/input/PeoplePicker.js.map +1 -1
  209. package/dist/input/PeoplePickerPanel.js +4 -4
  210. package/dist/input/PeoplePickerPanel.js.map +1 -1
  211. package/dist/input/Radio.js +4 -4
  212. package/dist/input/Radio.js.map +1 -1
  213. package/dist/input/Rating.js +5 -5
  214. package/dist/input/Rating.js.map +1 -1
  215. package/dist/input/Select.js +4 -4
  216. package/dist/input/Select.js.map +1 -1
  217. package/dist/input/SelectedTags.js +4 -4
  218. package/dist/input/SelectedTags.js.map +1 -1
  219. package/dist/input/Slider.js +6 -6
  220. package/dist/input/Slider.js.map +1 -1
  221. package/dist/input/Switch.js +3 -3
  222. package/dist/input/Switch.js.map +1 -1
  223. package/dist/input/TagsInput.js +5 -5
  224. package/dist/input/TagsInput.js.map +1 -1
  225. package/dist/input/TextField.js +5 -5
  226. package/dist/input/TextField.js.map +1 -1
  227. package/dist/input/Textarea.js +4 -4
  228. package/dist/input/Textarea.js.map +1 -1
  229. package/dist/input/ToggleGroup.js +4 -4
  230. package/dist/input/ToggleGroup.js.map +1 -1
  231. package/dist/input/Transfer.js +8 -8
  232. package/dist/input/Transfer.js.map +1 -1
  233. package/dist/input/TreeSelect.js +6 -6
  234. package/dist/input/TreeSelect.js.map +1 -1
  235. package/dist/input/Upload.js +8 -8
  236. package/dist/input/Upload.js.map +1 -1
  237. package/dist/layout/Affix.js +4 -4
  238. package/dist/layout/Affix.js.map +1 -1
  239. package/dist/layout/ResizeHandle.d.ts +6 -2
  240. package/dist/layout/ResizeHandle.js +32 -9
  241. package/dist/layout/ResizeHandle.js.map +1 -1
  242. package/dist/layout/ScrollArea.js +3 -3
  243. package/dist/layout/ScrollArea.js.map +1 -1
  244. package/dist/layout/Separator.js +3 -3
  245. package/dist/layout/Separator.js.map +1 -1
  246. package/dist/layout/Splitter.js +3 -3
  247. package/dist/layout/Splitter.js.map +1 -1
  248. package/dist/layout/ViewportFill.d.ts +2 -2
  249. package/dist/layout/ViewportFill.js +4 -4
  250. package/dist/layout/ViewportFill.js.map +1 -1
  251. package/dist/navigation/Breadcrumbs.js +4 -4
  252. package/dist/navigation/Breadcrumbs.js.map +1 -1
  253. package/dist/navigation/NavBar.js +6 -6
  254. package/dist/navigation/NavBar.js.map +1 -1
  255. package/dist/navigation/NavList.d.ts +1 -0
  256. package/dist/navigation/NavList.js +20 -12
  257. package/dist/navigation/NavList.js.map +1 -1
  258. package/dist/navigation/NavMenu.d.ts +27 -0
  259. package/dist/navigation/NavMenu.js +54 -0
  260. package/dist/navigation/NavMenu.js.map +1 -0
  261. package/dist/navigation/PageJump.js +3 -3
  262. package/dist/navigation/PageJump.js.map +1 -1
  263. package/dist/navigation/PageSizeSelect.js +4 -4
  264. package/dist/navigation/PageSizeSelect.js.map +1 -1
  265. package/dist/navigation/Pagination.js +6 -6
  266. package/dist/navigation/Pagination.js.map +1 -1
  267. package/dist/navigation/PaginationBar.js +5 -5
  268. package/dist/navigation/PaginationBar.js.map +1 -1
  269. package/dist/navigation/Steps.js +4 -4
  270. package/dist/navigation/Steps.js.map +1 -1
  271. package/dist/navigation/TableOfContents.js +5 -5
  272. package/dist/navigation/TableOfContents.js.map +1 -1
  273. package/dist/navigation/Tabs.js +7 -7
  274. package/dist/navigation/Tabs.js.map +1 -1
  275. package/dist/navigation/Toolbar.js +3 -3
  276. package/dist/navigation/Toolbar.js.map +1 -1
  277. package/dist/overlay/AlertDialog.js +4 -4
  278. package/dist/overlay/AlertDialog.js.map +1 -1
  279. package/dist/overlay/CommandPalette.js +4 -4
  280. package/dist/overlay/CommandPalette.js.map +1 -1
  281. package/dist/overlay/ContextMenu.js +3 -3
  282. package/dist/overlay/ContextMenu.js.map +1 -1
  283. package/dist/overlay/Dialog.js +4 -4
  284. package/dist/overlay/Dialog.js.map +1 -1
  285. package/dist/overlay/Drawer.js +5 -5
  286. package/dist/overlay/Drawer.js.map +1 -1
  287. package/dist/overlay/HoverCard.js +5 -3
  288. package/dist/overlay/HoverCard.js.map +1 -1
  289. package/dist/overlay/Lightbox.js +5 -5
  290. package/dist/overlay/Lightbox.js.map +1 -1
  291. package/dist/overlay/Menu.js +7 -7
  292. package/dist/overlay/Menu.js.map +1 -1
  293. package/dist/overlay/ModalCore.js +9 -9
  294. package/dist/overlay/ModalCore.js.map +1 -1
  295. package/dist/overlay/Popconfirm.js +6 -6
  296. package/dist/overlay/Popconfirm.js.map +1 -1
  297. package/dist/overlay/Popover.js +5 -3
  298. package/dist/overlay/Popover.js.map +1 -1
  299. package/dist/overlay/Tooltip.js +5 -3
  300. package/dist/overlay/Tooltip.js.map +1 -1
  301. package/dist/overlay/Tour.js +8 -8
  302. package/dist/overlay/Tour.js.map +1 -1
  303. package/dist/overlay/detached.d.ts +2 -0
  304. package/dist/overlay/detached.js +73 -42
  305. package/dist/overlay/detached.js.map +1 -1
  306. package/dist/patterns/ActionBar.js +3 -3
  307. package/dist/patterns/ActionBar.js.map +1 -1
  308. package/dist/patterns/AppShell.d.ts +28 -1
  309. package/dist/patterns/AppShell.js +158 -52
  310. package/dist/patterns/AppShell.js.map +1 -1
  311. package/dist/patterns/AuthLayout.d.ts +28 -0
  312. package/dist/patterns/AuthLayout.js +77 -0
  313. package/dist/patterns/AuthLayout.js.map +1 -0
  314. package/dist/patterns/CommentThread.js +9 -9
  315. package/dist/patterns/CommentThread.js.map +1 -1
  316. package/dist/patterns/DataImport.js +4 -4
  317. package/dist/patterns/DataImport.js.map +1 -1
  318. package/dist/patterns/DeadlineBadge.js +3 -3
  319. package/dist/patterns/DeadlineBadge.js.map +1 -1
  320. package/dist/patterns/FilterBar.d.ts +11 -1
  321. package/dist/patterns/FilterBar.js +39 -10
  322. package/dist/patterns/FilterBar.js.map +1 -1
  323. package/dist/patterns/FormDialog.d.ts +18 -0
  324. package/dist/patterns/FormDialog.js +46 -0
  325. package/dist/patterns/FormDialog.js.map +1 -0
  326. package/dist/patterns/KanbanBoard.js +8 -8
  327. package/dist/patterns/KanbanBoard.js.map +1 -1
  328. package/dist/patterns/LayoutSwitcher.d.ts +12 -0
  329. package/dist/patterns/LayoutSwitcher.js +79 -0
  330. package/dist/patterns/LayoutSwitcher.js.map +1 -0
  331. package/dist/patterns/NotificationCenter.js +8 -8
  332. package/dist/patterns/NotificationCenter.js.map +1 -1
  333. package/dist/patterns/PageTabs.d.ts +12 -7
  334. package/dist/patterns/PageTabs.js +41 -29
  335. package/dist/patterns/PageTabs.js.map +1 -1
  336. package/dist/patterns/QueryTable.d.ts +7 -1
  337. package/dist/patterns/QueryTable.js +116 -81
  338. package/dist/patterns/QueryTable.js.map +1 -1
  339. package/dist/patterns/SlideCaptcha.d.ts +80 -0
  340. package/dist/patterns/SlideCaptcha.js +354 -0
  341. package/dist/patterns/SlideCaptcha.js.map +1 -0
  342. package/dist/patterns/StepsForm.js +7 -7
  343. package/dist/patterns/StepsForm.js.map +1 -1
  344. package/dist/patterns/ThemeSwitcher.js +3 -3
  345. package/dist/patterns/ThemeSwitcher.js.map +1 -1
  346. package/dist/patterns/index.d.ts +7 -3
  347. package/dist/patterns/index.js +5 -1
  348. package/dist/patterns/messages.d.ts +37 -1
  349. package/dist/patterns/messages.js +38 -2
  350. package/dist/patterns/messages.js.map +1 -1
  351. package/dist/table/ColumnHeaderActions.js +3 -3
  352. package/dist/table/ColumnHeaderActions.js.map +1 -1
  353. package/dist/table/ColumnResizer.js +3 -3
  354. package/dist/table/ColumnResizer.js.map +1 -1
  355. package/dist/table/ColumnSettings.js +5 -5
  356. package/dist/table/ColumnSettings.js.map +1 -1
  357. package/dist/table/ColumnTable.js +8 -8
  358. package/dist/table/ColumnTable.js.map +1 -1
  359. package/dist/table/DataTable.js +8 -8
  360. package/dist/table/DataTable.js.map +1 -1
  361. package/dist/table/DataTableView.js +21 -21
  362. package/dist/table/DataTableView.js.map +1 -1
  363. package/dist/table/PivotTable.js +3 -3
  364. package/dist/table/PivotTable.js.map +1 -1
  365. package/dist/table/SelectionBar.js +4 -4
  366. package/dist/table/SelectionBar.js.map +1 -1
  367. package/dist/table/TreeDataTable.js +5 -5
  368. package/dist/table/TreeDataTable.js.map +1 -1
  369. package/dist/theme-customize/ThemeCustomizer.js +7 -6
  370. package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
  371. package/dist/theme-customize/ThemeThumbnail.js +3 -3
  372. package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
  373. package/dist/three/background/AuroraBackground.js +3 -3
  374. package/dist/three/background/AuroraBackground.js.map +1 -1
  375. package/dist/three/background/MeshGradient.js +3 -3
  376. package/dist/three/background/MeshGradient.js.map +1 -1
  377. package/dist/three/background/ShaderBackground.js +3 -3
  378. package/dist/three/background/ShaderBackground.js.map +1 -1
  379. package/dist/three/core/EffectSurface.js +3 -3
  380. package/dist/three/core/EffectSurface.js.map +1 -1
  381. package/dist/three/core/ThreeCanvas.js +4 -4
  382. package/dist/three/core/ThreeCanvas.js.map +1 -1
  383. package/dist/three/effects/Confetti.js +3 -3
  384. package/dist/three/effects/Confetti.js.map +1 -1
  385. package/dist/three/effects/ParticleField.js +3 -3
  386. package/dist/three/effects/ParticleField.js.map +1 -1
  387. package/dist/three/effects/WaveGrid.js +3 -3
  388. package/dist/three/effects/WaveGrid.js.map +1 -1
  389. package/dist/three/globe/Globe.js +3 -3
  390. package/dist/three/globe/Globe.js.map +1 -1
  391. package/dist/three/model/ModelViewer.js +3 -3
  392. package/dist/three/model/ModelViewer.js.map +1 -1
  393. package/dist/utils/data/number.d.ts +5 -0
  394. package/dist/utils/data/number.js +8 -1
  395. package/dist/utils/data/number.js.map +1 -1
  396. package/dist/utils/dom/element.d.ts +3 -1
  397. package/dist/utils/dom/element.js +8 -4
  398. package/dist/utils/dom/element.js.map +1 -1
  399. package/dist/utils/dom/fullscreen.d.ts +1 -1
  400. package/dist/utils/dom/fullscreen.js +12 -8
  401. package/dist/utils/dom/fullscreen.js.map +1 -1
  402. package/dist/utils/dom/mounted.d.ts +7 -0
  403. package/dist/utils/dom/mounted.js +16 -0
  404. package/dist/utils/dom/mounted.js.map +1 -0
  405. package/dist/utils/dom/overflow.js +2 -1
  406. package/dist/utils/dom/overflow.js.map +1 -1
  407. package/dist/utils/dom/pan-zoom.js +2 -1
  408. package/dist/utils/dom/pan-zoom.js.map +1 -1
  409. package/dist/utils/props.js +3 -13
  410. package/dist/utils/props.js.map +1 -1
  411. package/dist/utils/request/http.d.ts +12 -0
  412. package/dist/utils/request/http.js +6 -2
  413. package/dist/utils/request/http.js.map +1 -1
  414. package/dist/utils/request/use-request.js +4 -2
  415. package/dist/utils/request/use-request.js.map +1 -1
  416. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"NavList.js","names":["_isVNode","_vtp_readonlyProp","_vtp_restProps","_createVNode","_mergeProps","_vtp_forwardChildren","_vtp_childrenProp","_vue_computed","_vtp_bindable","_vue_ref","_vtp_childrenStable","_Fragment"],"sources":["../../src/navigation/NavList.tsx"],"sourcesContent":["/**\n * 侧边导航,复合组件:NavList(nav > ul)> NavItem(链接)/ NavGroup(可展开的一组)/ NavSection(带小标题的一组,\n * 不能收起:文档站这类链接多、按主题分组的侧栏),里面再放 NavItem。\n * 当前页按路由适配的 isActive 判断(也可以用 active 指定),带 aria-current=\"page\" 与高亮;\n * 含当前页的分组自动展开。分组用 Collapsible(触发器带 aria-expanded / aria-controls)。\n *\n * <NavList aria-label=\"后台\">\n * <NavItem href=\"/\" icon={House}>概览</NavItem>\n * <NavGroup label=\"订单\" icon={Package}>\n * <NavItem href=\"/orders\">全部订单</NavItem>\n * <NavItem href=\"/orders/refunds\">退款</NavItem>\n * </NavGroup>\n * </NavList>\n *\n * 用 vue-router 时 vueRouterAdapter(router, { match: 'prefix' }) 能让 /orders 在 /orders/42 页面也高亮。\n *\n * 紧凑(compact):侧栏窄到只放得下图标时,各项只显示图标(文字留给读屏,悬停、聚焦时用 Tooltip 显示),\n * 小节标题换成它的图标(不能点);分组也只剩图标,悬停、聚焦时子项从右边弹出来(HoverCard,完整的文字,\n * Tab 进入),组里有当前页时图标高亮。AppShell 的抽屉式侧栏拖窄时自动进入(NavCompactContext),\n * 也可以直接写 <NavList compact>。\n *\n * NavItem 的 badge 是计数角标(待办、未读):展开时在文字后面,紧凑时是图标右上角的小圆点(读屏照样念出数目)。\n */\nimport { ChevronRight } from '@lucide/icons';\nimport { createContext, _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { onBeforeUnmount, useId, watch, type VNodeChild } from 'vue';\nimport { ButtonBase, type ButtonBaseProps } from '../base/ButtonBase';\nimport { Badge } from '../base/Badge';\nimport { Icon, type IconData, type IconProps } from '../base/Icon';\nimport { Indicator } from '../base/Indicator';\nimport { visuallyHiddenStyles } from '../base/VisuallyHidden';\nimport { Collapsible, type CollapsibleProps } from '../display/Collapsible';\nimport { HoverCard } from '../overlay/HoverCard';\nimport { Tooltip, type TooltipTriggerProps } from '../overlay/Tooltip';\nimport { useLang } from '../config/context';\nimport { useRouterLink } from '../utils/dom/link';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { rippleHostStyles, useRipple } from '../utils/dom/ripple';\nimport { itemStyles } from '../utils/style/item-styles';\nimport { focusRingStyles } from '../utils/style/styles';\nimport type { StatusTone } from '../utils/style/tone-styles';\nimport { FlexList, type FlexProps } from '../layout/Flex';\nimport { t } from '../config/theme/tokens';\n\n/** 分组向里面的项要的信息:哪些项是当前页(有当前页时自动展开) */\nexport interface NavGroupState {\n /** 组内的一项报告自己是不是当前页(item 是这一项的标识) */\n report(item: symbol, active: boolean): void;\n}\n\n/** NavGroup 的上下文:组内的项据此缩进;不在组内时为 null */\nexport const NavGroupContext = createContext<NavGroupState | null>('NavGroup');\n\n/** 导航是不是紧凑(只显示图标):AppShell 按侧栏宽度提供,NavList 的 compact 可以覆盖 */\nexport const NavCompactContext = createContext<() => boolean>('NavCompact');\n\n/** NavList 的样式:nested、row、current、disabled、chevron、section、sectionLabel 等 */\nexport const navListStyles = css.create({\n nested: { paddingInlineStart: '_lg', paddingTop: '_xs' },\n // 链接与分组的触发器共用:列表行(itemStyles)之上,导航项更宽松、字重更重,平时是次要颜色\n row: {\n paddingInline: '_md',\n borderRadius: '_md',\n color: { default: '_textMuted', ':hover': '_text' },\n fontWeight: '_medium',\n },\n // 当前页的颜色来自 itemStyles.current;悬停时也保持品牌色\n current: { color: { default: '_accentText', ':hover': '_accentText' } },\n disabled: { pointerEvents: 'none' },\n chevron: { transition: `transform ${t.durations.md} ${t.easings.standard}` },\n chevronOpen: { transform: 'rotate(90deg)' },\n // 小节之间留出间隔,第一节贴着顶部\n section: { marginBlockStart: { default: '_lg', ':first-child': 0 } },\n sectionLabel: {\n display: 'flex',\n alignItems: 'center',\n gap: '_sm',\n paddingBlock: '_xs',\n paddingInline: '_md',\n color: '_text',\n fontSize: '_sm',\n fontWeight: '_semibold',\n letterSpacing: '_wide',\n },\n // 小节标题的图标只是标记,比链接的图标淡\n sectionIcon: { color: '_textMuted', flexShrink: 0 },\n // 紧凑:图标居中;小节标题只剩图标,上面一条细线与上一节隔开\n compactRow: { justifyContent: 'center', paddingInline: 0 },\n compactSection: {\n justifyContent: 'center',\n paddingInline: 0,\n paddingBlockStart: '_sm',\n borderBlockStartWidth: '_xs',\n borderBlockStartStyle: 'solid',\n borderBlockStartColor: '_borderMuted',\n },\n compactNested: { paddingInlineStart: 0 },\n // 紧凑分组弹出的卡片:比侧栏宽,放得下完整的文字\n flyout: { padding: '_xs', minWidth: '12em' },\n});\n\n// ─────────────── NavList ───────────────\n\n/** 未声明的属性落到 nav 上;aria-label 是导航的名称 */\nexport interface NavListProps extends PartProps<'nav'> {\n /** 紧凑:只显示图标;不写时跟随所在的 AppShell 侧栏(拖窄时紧凑) */\n compact?: boolean;\n /** 列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n children?: VNodeChild;\n}\n\n/** 侧边导航(nav > ul),里面放 NavItem 与 NavGroup */\nexport const NavList = _component(({ compact, propsList, children, ...rest }: NavListProps) => {\n const inherited = NavCompactContext.inject(() => false);\n const isCompact = () => compact ?? inherited();\n NavCompactContext.provide(isCompact);\n return () => (\n <nav {...mergeAttrs<'nav'>({}, rest)} data-compact={isCompact() || undefined}>\n <FlexList {...mergePartProps<FlexProps<'ul'>>({ direction: 'column', gap: 'xs' }, propsList)}>\n {children}\n </FlexList>\n </nav>\n );\n});\n\n// ─────────────── NavItem ───────────────\n\n/** 地址与当前页由组件管理 */\nexport type NavItemManaged = 'href' | 'aria-current';\n\n/** 未声明的属性落到链接(a)上 */\nexport interface NavItemProps extends PartProps<'a', NavItemManaged> {\n /** 链接地址 */\n href: string;\n /** 文字前的图标 */\n icon?: IconData;\n /** 是否是当前页;不写时按路由适配的 isActive 判断 */\n active?: boolean;\n /** 不可用:不能点、不能聚焦 */\n disabled?: boolean;\n /** 文字后面的内容(自定义的标记);只是计数时用 badge */\n end?: VNodeChild;\n /** 计数角标(待办、未读):展开时是文字后面的 Badge,紧凑时是图标右上角的小圆点;0 不显示 */\n badge?: number;\n /** 角标的色调,默认 danger */\n badgeTone?: StatusTone;\n /** 按下时的波纹;不写时沿用全局配置 */\n ripple?: boolean;\n /** 外层 li 的部件属性 */\n propsItem?: PartProps<'li'>;\n /** 图标的部件属性 */\n propsIcon?: Partial<IconProps>;\n /** 文字的部件属性 */\n propsLabel?: PartProps<'span'>;\n children?: VNodeChild;\n}\n\n/** 导航项(li > a):当前页高亮并带 aria-current=\"page\" */\nexport const NavItem = _component(\n ({\n href,\n icon,\n active,\n disabled = false,\n end,\n badge = 0,\n badgeTone = 'danger',\n ripple,\n propsItem,\n propsIcon,\n propsLabel,\n children,\n ...rest\n }: NavItemProps) => {\n const lang = useLang();\n const router = useRouterLink();\n const group = NavGroupContext.inject(null);\n const rippleHandlers = useRipple(() => ripple);\n const current = _derived(active ?? router.isActive(href));\n const compact = NavCompactContext.inject(() => false);\n const id = Symbol('NavItem');\n\n // 告诉所在的分组自己是不是当前页(分组据此自动展开)\n if (group) {\n watch(\n () => current,\n (value) => group.report(id, value),\n { immediate: true },\n );\n onBeforeUnmount(() => group.report(id, false));\n }\n\n const iconOnly = () => compact() && icon != null;\n // tooltip:只剩图标时 Tooltip 给触发器的属性(定位用的 ref、悬停与聚焦的事件)\n const link = (tooltip?: TooltipTriggerProps) => (\n <a\n {...mergeAttrs<'a'>(\n {\n ...tooltip,\n sx: [\n itemStyles.row,\n itemStyles.hoverable,\n navListStyles.row,\n focusRingStyles.visible,\n rippleHostStyles.host,\n iconOnly() && navListStyles.compactRow,\n current && [itemStyles.current, navListStyles.current],\n disabled && [itemStyles.disabled, navListStyles.disabled],\n ],\n },\n rest,\n {\n href: disabled ? undefined : router.href(href),\n 'aria-current': current ? 'page' : undefined,\n 'aria-disabled': disabled || undefined,\n // 使用方的 onClick 先执行,preventDefault 可以拦下路由跳转\n onClick: (event: MouseEvent) => router.onClick(event, href),\n ...rippleHandlers,\n },\n )}\n data-state={current ? 'active' : 'inactive'}\n >\n {icon &&\n (iconOnly() && badge > 0 ? (\n // 紧凑:图标右上角一个小圆点(图标太小,叠不下数字);读屏照样念出数目\n <Indicator dot tone={badgeTone} label={lang.indicatorCount(badge)}>\n <Icon {...mergePartProps<IconProps>({ icon }, propsIcon)} />\n </Indicator>\n ) : (\n <Icon {...mergePartProps<IconProps>({ icon }, propsIcon)} />\n ))}\n <span\n {...mergeAttrs<'span'>(\n { sx: [itemStyles.label, iconOnly() && visuallyHiddenStyles.hidden] },\n propsLabel,\n )}\n >\n {children}\n </span>\n {!iconOnly() && end}\n {!iconOnly() && badge > 0 && (\n <Badge size=\"xs\" variant=\"solid\" tone={badgeTone} radius=\"full\">\n {badge > 99 ? '99+' : badge}\n </Badge>\n )}\n </a>\n );\n\n return () => (\n <li {...mergeAttrs<'li'>({}, propsItem)}>\n {iconOnly() ? (\n // 只剩图标:名称在读屏的文字里,看的人悬停、聚焦时从提示里读\n <Tooltip placement=\"right\" delay={200} trigger={link}>\n {children}\n </Tooltip>\n ) : (\n link()\n )}\n </li>\n );\n },\n);\n\n// ─────────────── NavGroup ───────────────\n\n/** 未声明的属性落到外层 li 上 */\nexport interface NavGroupProps extends PartProps<'li'> {\n /** 分组标题 */\n label: VNodeChild;\n /** 标题前的图标 */\n icon?: IconData;\n /** 是否展开:父级写 _open={x};含当前页时自动展开 */\n _open?: boolean;\n /** 标题按钮的部件属性 */\n propsTrigger?: Omit<Partial<ButtonBaseProps>, 'aria-expanded' | 'aria-controls'>;\n /** 展开区(Collapsible)的部件属性 */\n propsContent?: Partial<CollapsibleProps>;\n /** 里面的列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n /** 标题文字的部件属性 */\n propsLabel?: PartProps<'span'>;\n /** 标题图标的部件属性 */\n propsIcon?: Partial<IconProps>;\n children?: VNodeChild;\n}\n\n/** 可展开的导航分组(li > 按钮 + 子列表) */\nexport const NavGroup = _component(\n ({\n label,\n icon,\n _open: open = _bindable(false),\n propsTrigger,\n propsContent,\n propsList,\n propsLabel,\n propsIcon,\n children,\n ...rest\n }: NavGroupProps) => {\n const compact = NavCompactContext.inject(() => false);\n const iconOnly = () => compact() && icon != null;\n const activeItems = new Set<symbol>();\n // 组里有当前页:紧凑时分组的图标也高亮\n let hasCurrent = _state(false);\n NavGroupContext.provide({\n report(item, active) {\n if (active) activeItems.add(item);\n else activeItems.delete(item);\n hasCurrent = activeItems.size > 0;\n // 进入含当前页的分组时自动展开;离开时不自动收起(用户可能还想看)\n if (activeItems.size > 0) open = true;\n },\n });\n\n /** 紧凑时:只剩图标,悬停、聚焦时子项从右边弹出来(完整的文字,不再紧凑) */\n function renderFlyout() {\n return (\n <li {...mergeAttrs<'li'>({}, rest)}>\n <HoverCard\n placement=\"right-start\"\n delay={150}\n // 子项一直渲染:它们要报告自己是不是当前页,分组的图标才知道要不要高亮\n lazy={false}\n sx={navListStyles.flyout}\n trigger={(props) => (\n <ButtonBase\n {...mergePartProps<ButtonBaseProps>(\n {\n sx: [\n itemStyles.row,\n itemStyles.hoverable,\n navListStyles.row,\n navListStyles.compactRow,\n hasCurrent && [itemStyles.current, navListStyles.current],\n ],\n },\n propsTrigger,\n props as Partial<ButtonBaseProps>,\n )}\n data-state={hasCurrent ? 'active' : 'inactive'}\n >\n <Icon {...mergePartProps<IconProps>({ icon: icon! }, propsIcon)} />\n <span {...mergeAttrs<'span'>({ sx: visuallyHiddenStyles.hidden }, propsLabel)}>\n {label}\n </span>\n </ButtonBase>\n )}\n >\n <NavFlyoutContent label={label} propsList={propsList}>\n {children}\n </NavFlyoutContent>\n </HoverCard>\n </li>\n );\n }\n\n return () =>\n iconOnly() ? (\n renderFlyout()\n ) : (\n <li {...mergeAttrs<'li'>({}, rest)}>\n <Collapsible\n {...mergePartProps<CollapsibleProps>(\n {\n trigger: (props) => (\n <ButtonBase\n {...mergePartProps<ButtonBaseProps>(\n {\n sx: [\n itemStyles.row,\n itemStyles.hoverable,\n navListStyles.row,\n iconOnly() && navListStyles.compactRow,\n ],\n },\n propsTrigger,\n props,\n )}\n >\n {icon && <Icon {...mergePartProps<IconProps>({ icon }, propsIcon)} />}\n <span\n {...mergeAttrs<'span'>(\n { sx: [itemStyles.label, iconOnly() && visuallyHiddenStyles.hidden] },\n propsLabel,\n )}\n >\n {label}\n </span>\n {!iconOnly() && (\n <Icon\n icon={ChevronRight}\n flipInRtl\n sx={[navListStyles.chevron, open && navListStyles.chevronOpen]}\n />\n )}\n </ButtonBase>\n ),\n },\n propsContent,\n )}\n _open={open}\n >\n <FlexList\n {...mergePartProps<FlexProps<'ul'>>(\n {\n direction: 'column',\n gap: 'xs',\n sx: [navListStyles.nested, compact() && navListStyles.compactNested],\n },\n propsList,\n )}\n >\n {children}\n </FlexList>\n </Collapsible>\n </li>\n );\n },\n);\n\n/** 紧凑分组弹出来的内容:标题加完整的导航项(里面不再紧凑) */\nconst NavFlyoutContent = _component(\n ({\n label,\n propsList,\n children,\n }: {\n label: VNodeChild;\n propsList?: Partial<FlexProps<'ul'>>;\n children?: VNodeChild;\n }) => {\n NavCompactContext.provide(() => false);\n return () => (\n <>\n <span {...css.attrs(navListStyles.sectionLabel)}>{label}</span>\n <FlexList\n {...mergePartProps<FlexProps<'ul'>>({ direction: 'column', gap: 'xs' }, propsList)}\n >\n {children}\n </FlexList>\n </>\n );\n },\n);\n\n// ─────────────── NavSection ───────────────\n\n/** 未声明的属性落到外层 li 上 */\nexport interface NavSectionProps extends PartProps<'li'> {\n /** 小节标题,同时是这组链接的无障碍名称 */\n label: VNodeChild;\n /** 标题前的图标:只是标记、不能点;紧凑时标题只剩它 */\n icon?: IconData;\n /** 标题的部件属性 */\n propsLabel?: PartProps<'span'>;\n /** 标题图标的部件属性 */\n propsIcon?: Partial<IconProps>;\n /** 里面的列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n /** 小节里的 NavItem */\n children?: VNodeChild;\n}\n\n/** 带小标题的一组导航链接(li > 标题 + ul):一直展开,不能收起;要收起用 NavGroup */\nexport const NavSection = _component(\n ({ label, icon, propsLabel, propsIcon, propsList, children, ...rest }: NavSectionProps) => {\n const labelId = useId();\n const compact = NavCompactContext.inject(() => false);\n const iconOnly = () => compact() && icon != null;\n return () => (\n <li {...mergeAttrs<'li'>({ sx: navListStyles.section }, rest)}>\n <span\n {...mergeAttrs<'span'>(\n { sx: [navListStyles.sectionLabel, iconOnly() && navListStyles.compactSection] },\n propsLabel,\n )}\n >\n {icon && (\n <Icon\n {...mergePartProps<IconProps>({ icon, sx: navListStyles.sectionIcon }, propsIcon)}\n />\n )}\n <span id={labelId} {...css.attrs(iconOnly() && visuallyHiddenStyles.hidden)}>\n {label}\n </span>\n </span>\n <FlexList\n {...mergePartProps<FlexProps<'ul'>>({ direction: 'column', gap: 'xs' }, propsList, {\n 'aria-labelledby': labelId,\n })}\n >\n {children}\n </FlexList>\n </li>\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"NavList.js","names":["_isVNode","_vtp_readonlyProp","_vtp_restProps","_createVNode","_mergeProps","_vtp_forwardChildren","_vtp_childrenProp","_vue_computed","_vtp_bindable","_vue_ref","_vtp_childrenStable","_Fragment"],"sources":["../../src/navigation/NavList.tsx"],"sourcesContent":["/**\n * 侧边导航,复合组件:NavList(nav > ul)> NavItem(链接)/ NavGroup(可展开的一组)/ NavSection(带小标题的一组,\n * 不能收起:文档站这类链接多、按主题分组的侧栏),里面再放 NavItem。\n * 当前页按路由适配的 isActive 判断(也可以用 active 指定),带 aria-current=\"page\" 与高亮;\n * 含当前页的分组自动展开。分组用 Collapsible(触发器带 aria-expanded / aria-controls)。\n *\n * <NavList aria-label=\"后台\">\n * <NavItem href=\"/\" icon={House}>概览</NavItem>\n * <NavGroup label=\"订单\" icon={Package}>\n * <NavItem href=\"/orders\">全部订单</NavItem>\n * <NavItem href=\"/orders/refunds\">退款</NavItem>\n * </NavGroup>\n * </NavList>\n *\n * 用 vue-router 时 vueRouterAdapter(router, { match: 'prefix' }) 能让 /orders 在 /orders/42 页面也高亮。\n *\n * 紧凑(compact):侧栏窄到只放得下图标时,各项只显示图标(文字留给读屏,悬停、聚焦时用 Tooltip 显示),\n * 小节标题换成它的图标(不能点);分组也只剩图标,悬停、聚焦时子项从右边弹出来(HoverCard,完整的文字,\n * Tab 进入),组里有当前页时图标高亮。AppShell 的抽屉式侧栏拖窄时自动进入(NavCompactContext),\n * 也可以直接写 <NavList compact>。\n *\n * NavItem 的 badge 是计数角标(待办、未读):展开时在文字后面,紧凑时是图标右上角的小圆点(读屏照样念出数目)。\n */\nimport { ChevronRight } from '@lucide/icons';\nimport { createContext, _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { onBeforeUnmount, useId, watch, type VNodeChild } from 'vue';\nimport { ButtonBase, type ButtonBaseProps } from '../base/ButtonBase';\nimport { Badge } from '../base/Badge';\nimport { Icon, type IconData, type IconProps } from '../base/Icon';\nimport { Indicator } from '../base/Indicator';\nimport { visuallyHiddenStyles } from '../base/VisuallyHidden';\nimport { Collapsible, type CollapsibleProps } from '../display/Collapsible';\nimport { HoverCard } from '../overlay/HoverCard';\nimport { Tooltip, type TooltipTriggerProps } from '../overlay/Tooltip';\nimport { useLang } from '../config/context';\nimport { useRouterLink } from '../utils/dom/link';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { rippleHostStyles, useRipple } from '../utils/dom/ripple';\nimport { itemStyles } from '../utils/style/item-styles';\nimport { focusRingStyles } from '../utils/style/styles';\nimport type { StatusTone } from '../utils/style/tone-styles';\nimport { FlexList, type FlexProps } from '../layout/Flex';\nimport { t } from '../config/theme/tokens';\n\n/** 分组向里面的项要的信息:哪些项是当前页(有当前页时自动展开) */\nexport interface NavGroupState {\n /** 组内的一项报告自己是不是当前页(item 是这一项的标识) */\n report(item: symbol, active: boolean): void;\n}\n\n/** NavGroup 的上下文:组内的项据此缩进;不在组内时为 null */\nexport const NavGroupContext = createContext<NavGroupState | null>('NavGroup');\n\n/** 导航是不是紧凑(只显示图标):AppShell 按侧栏宽度提供,NavList 的 compact 可以覆盖 */\nexport const NavCompactContext = createContext<() => boolean>('NavCompact');\n\n/** NavList 的样式:nested、row、current、disabled、chevron、section、sectionLabel 等 */\nexport const navListStyles = css.create({\n nested: { paddingInlineStart: '_lg', paddingTop: '_xs' },\n // 链接与分组的触发器共用:列表行(itemStyles)之上,导航项更宽松、字重更重,平时是次要颜色\n row: {\n paddingInline: '_md',\n borderRadius: '_md',\n color: { default: '_textMuted', ':hover': '_text' },\n fontWeight: '_medium',\n },\n // 当前页的颜色来自 itemStyles.current;悬停时也保持品牌色\n current: { color: { default: '_accentText', ':hover': '_accentText' } },\n disabled: { pointerEvents: 'none' },\n chevron: { transition: `transform ${t.durations.md} ${t.easings.standard}` },\n chevronOpen: { transform: 'rotate(90deg)' },\n // 小节之间留出间隔,第一节贴着顶部\n // 多栏排版(AppShell 的上下抽屉)时一个小节不被拆到两栏\n section: {\n display: 'flex',\n flexDirection: 'column',\n gap: '_xs',\n marginBlockStart: { default: '_lg', ':first-child': 0 },\n breakInside: 'avoid',\n },\n // 标题行的内边距、图标与间距和链接行同一套(随所在字号),图标与文字才和下面的项上下对齐;只有文字小一档、加粗\n sectionLabel: {\n display: 'flex',\n alignItems: 'center',\n gap: '_sm',\n paddingBlock: '_xs',\n paddingInline: '_md',\n color: '_text',\n },\n sectionText: { fontSize: '_sm', fontWeight: '_semibold', letterSpacing: '_wide' },\n // 小节标题的图标只是标记,比链接的图标淡\n sectionIcon: { color: '_textMuted', flexShrink: 0 },\n // 紧凑:图标居中;小节标题只剩图标,上面一条细线与上一节隔开\n compactRow: { justifyContent: 'center', paddingInline: 0 },\n compactSection: {\n justifyContent: 'center',\n paddingInline: 0,\n paddingBlockStart: '_sm',\n borderBlockStartWidth: '_xs',\n borderBlockStartStyle: 'solid',\n borderBlockStartColor: '_borderMuted',\n },\n compactNested: { paddingInlineStart: 0 },\n // 紧凑分组弹出的卡片:比侧栏宽,放得下完整的文字\n flyout: { padding: '_xs', minWidth: '12em' },\n});\n\n// ─────────────── NavList ───────────────\n\n/** 未声明的属性落到 nav 上;aria-label 是导航的名称 */\nexport interface NavListProps extends PartProps<'nav'> {\n /** 紧凑:只显示图标;不写时跟随所在的 AppShell 侧栏(拖窄时紧凑) */\n compact?: boolean;\n /** 列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n children?: VNodeChild;\n}\n\n/** 侧边导航(nav > ul),里面放 NavItem 与 NavGroup */\nexport const NavList = _component(({ compact, propsList, children, ...rest }: NavListProps) => {\n const inherited = NavCompactContext.inject(() => false);\n const isCompact = () => compact ?? inherited();\n NavCompactContext.provide(isCompact);\n return () => (\n <nav {...mergeAttrs<'nav'>({}, rest)} data-compact={isCompact() || undefined}>\n <FlexList {...mergePartProps<FlexProps<'ul'>>({ direction: 'column', gap: 'xs' }, propsList)}>\n {children}\n </FlexList>\n </nav>\n );\n});\n\n// ─────────────── NavItem ───────────────\n\n/** 地址与当前页由组件管理 */\nexport type NavItemManaged = 'href' | 'aria-current';\n\n/** 未声明的属性落到链接(a)上 */\nexport interface NavItemProps extends PartProps<'a', NavItemManaged> {\n /** 链接地址 */\n href: string;\n /** 文字前的图标 */\n icon?: IconData;\n /** 是否是当前页;不写时按路由适配的 isActive 判断 */\n active?: boolean;\n /** 不可用:不能点、不能聚焦 */\n disabled?: boolean;\n /** 文字后面的内容(自定义的标记);只是计数时用 badge */\n end?: VNodeChild;\n /** 计数角标(待办、未读):展开时是文字后面的 Badge,紧凑时是图标右上角的小圆点;0 不显示 */\n badge?: number;\n /** 角标的色调,默认 danger */\n badgeTone?: StatusTone;\n /** 按下时的波纹;不写时沿用全局配置 */\n ripple?: boolean;\n /** 外层 li 的部件属性 */\n propsItem?: PartProps<'li'>;\n /** 图标的部件属性 */\n propsIcon?: Partial<IconProps>;\n /** 文字的部件属性 */\n propsLabel?: PartProps<'span'>;\n children?: VNodeChild;\n}\n\n/** 导航项(li > a):当前页高亮并带 aria-current=\"page\" */\nexport const NavItem = _component(\n ({\n href,\n icon,\n active,\n disabled = false,\n end,\n badge = 0,\n badgeTone = 'danger',\n ripple,\n propsItem,\n propsIcon,\n propsLabel,\n children,\n ...rest\n }: NavItemProps) => {\n const lang = useLang();\n const router = useRouterLink();\n const group = NavGroupContext.inject(null);\n const rippleHandlers = useRipple(() => ripple);\n const current = _derived(active ?? router.isActive(href));\n const compact = NavCompactContext.inject(() => false);\n const id = Symbol('NavItem');\n\n // 告诉所在的分组自己是不是当前页(分组据此自动展开)\n if (group) {\n watch(\n () => current,\n (value) => group.report(id, value),\n { immediate: true },\n );\n onBeforeUnmount(() => group.report(id, false));\n }\n\n const iconOnly = () => compact() && icon != null;\n // tooltip:只剩图标时 Tooltip 给触发器的属性(定位用的 ref、悬停与聚焦的事件)\n const link = (tooltip?: TooltipTriggerProps) => (\n <a\n {...mergeAttrs<'a'>(\n {\n ...tooltip,\n sx: [\n itemStyles.row,\n itemStyles.hoverable,\n navListStyles.row,\n focusRingStyles.visible,\n rippleHostStyles.host,\n iconOnly() && navListStyles.compactRow,\n current && [itemStyles.current, navListStyles.current],\n disabled && [itemStyles.disabled, navListStyles.disabled],\n ],\n },\n rest,\n {\n href: disabled ? undefined : router.href(href),\n 'aria-current': current ? 'page' : undefined,\n 'aria-disabled': disabled || undefined,\n // 使用方的 onClick 先执行,preventDefault 可以拦下路由跳转\n onClick: (event: MouseEvent) => router.onClick(event, href),\n ...rippleHandlers,\n },\n )}\n data-state={current ? 'active' : 'inactive'}\n >\n {icon &&\n (iconOnly() && badge > 0 ? (\n // 紧凑:图标右上角一个小圆点(图标太小,叠不下数字);读屏照样念出数目\n <Indicator dot tone={badgeTone} label={lang.indicatorCount(badge)}>\n <Icon {...mergePartProps<IconProps>({ icon }, propsIcon)} />\n </Indicator>\n ) : (\n <Icon {...mergePartProps<IconProps>({ icon }, propsIcon)} />\n ))}\n <span\n {...mergeAttrs<'span'>(\n { sx: [itemStyles.label, iconOnly() && visuallyHiddenStyles.hidden] },\n propsLabel,\n )}\n >\n {children}\n </span>\n {!iconOnly() && end}\n {!iconOnly() && badge > 0 && (\n <Badge size=\"xs\" variant=\"solid\" tone={badgeTone} radius=\"full\">\n {badge > 99 ? '99+' : badge}\n </Badge>\n )}\n </a>\n );\n\n return () => (\n <li {...mergeAttrs<'li'>({}, propsItem)}>\n {iconOnly() ? (\n // 只剩图标:名称在读屏的文字里,看的人悬停、聚焦时从提示里读\n <Tooltip placement=\"right\" delay={200} trigger={link}>\n {children}\n </Tooltip>\n ) : (\n link()\n )}\n </li>\n );\n },\n);\n\n// ─────────────── NavGroup ───────────────\n\n/** 未声明的属性落到外层 li 上 */\nexport interface NavGroupProps extends PartProps<'li'> {\n /** 分组标题 */\n label: VNodeChild;\n /** 标题前的图标 */\n icon?: IconData;\n /** 是否展开:父级写 _open={x};含当前页时自动展开 */\n _open?: boolean;\n /** 标题按钮的部件属性 */\n propsTrigger?: Omit<Partial<ButtonBaseProps>, 'aria-expanded' | 'aria-controls'>;\n /** 展开区(Collapsible)的部件属性 */\n propsContent?: Partial<CollapsibleProps>;\n /** 里面的列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n /** 标题文字的部件属性 */\n propsLabel?: PartProps<'span'>;\n /** 标题图标的部件属性 */\n propsIcon?: Partial<IconProps>;\n children?: VNodeChild;\n}\n\n/** 可展开的导航分组(li > 按钮 + 子列表) */\nexport const NavGroup = _component(\n ({\n label,\n icon,\n _open: open = _bindable(false),\n propsTrigger,\n propsContent,\n propsList,\n propsLabel,\n propsIcon,\n children,\n ...rest\n }: NavGroupProps) => {\n const compact = NavCompactContext.inject(() => false);\n const iconOnly = () => compact() && icon != null;\n const activeItems = new Set<symbol>();\n // 组里有当前页:紧凑时分组的图标也高亮\n let hasCurrent = _state(false);\n NavGroupContext.provide({\n report(item, active) {\n if (active) activeItems.add(item);\n else activeItems.delete(item);\n hasCurrent = activeItems.size > 0;\n // 进入含当前页的分组时自动展开;离开时不自动收起(用户可能还想看)\n if (activeItems.size > 0) open = true;\n },\n });\n\n /** 紧凑时:只剩图标,悬停、聚焦时子项从右边弹出来(完整的文字,不再紧凑) */\n function renderFlyout() {\n return (\n <li {...mergeAttrs<'li'>({}, rest)}>\n <HoverCard\n placement=\"right-start\"\n delay={150}\n // 子项一直渲染:它们要报告自己是不是当前页,分组的图标才知道要不要高亮\n lazy={false}\n sx={navListStyles.flyout}\n trigger={(props) => (\n <ButtonBase\n {...mergePartProps<ButtonBaseProps>(\n {\n sx: [\n itemStyles.row,\n itemStyles.hoverable,\n navListStyles.row,\n navListStyles.compactRow,\n hasCurrent && [itemStyles.current, navListStyles.current],\n ],\n },\n propsTrigger,\n props as Partial<ButtonBaseProps>,\n )}\n data-state={hasCurrent ? 'active' : 'inactive'}\n >\n <Icon {...mergePartProps<IconProps>({ icon: icon! }, propsIcon)} />\n <span {...mergeAttrs<'span'>({ sx: visuallyHiddenStyles.hidden }, propsLabel)}>\n {label}\n </span>\n </ButtonBase>\n )}\n >\n <NavFlyoutContent label={label} propsList={propsList}>\n {children}\n </NavFlyoutContent>\n </HoverCard>\n </li>\n );\n }\n\n return () =>\n iconOnly() ? (\n renderFlyout()\n ) : (\n <li {...mergeAttrs<'li'>({}, rest)}>\n <Collapsible\n {...mergePartProps<CollapsibleProps>(\n {\n trigger: (props) => (\n <ButtonBase\n {...mergePartProps<ButtonBaseProps>(\n {\n sx: [\n itemStyles.row,\n itemStyles.hoverable,\n navListStyles.row,\n iconOnly() && navListStyles.compactRow,\n ],\n },\n propsTrigger,\n props,\n )}\n >\n {icon && <Icon {...mergePartProps<IconProps>({ icon }, propsIcon)} />}\n <span\n {...mergeAttrs<'span'>(\n { sx: [itemStyles.label, iconOnly() && visuallyHiddenStyles.hidden] },\n propsLabel,\n )}\n >\n {label}\n </span>\n {!iconOnly() && (\n <Icon\n icon={ChevronRight}\n flipInRtl\n sx={[navListStyles.chevron, open && navListStyles.chevronOpen]}\n />\n )}\n </ButtonBase>\n ),\n },\n propsContent,\n )}\n _open={open}\n >\n <FlexList\n {...mergePartProps<FlexProps<'ul'>>(\n {\n direction: 'column',\n gap: 'xs',\n sx: [navListStyles.nested, compact() && navListStyles.compactNested],\n },\n propsList,\n )}\n >\n {children}\n </FlexList>\n </Collapsible>\n </li>\n );\n },\n);\n\n/** 紧凑分组弹出来的内容:标题加完整的导航项(里面不再紧凑) */\nconst NavFlyoutContent = _component(\n ({\n label,\n propsList,\n children,\n }: {\n label: VNodeChild;\n propsList?: Partial<FlexProps<'ul'>>;\n children?: VNodeChild;\n }) => {\n NavCompactContext.provide(() => false);\n return () => (\n <>\n <span {...css.attrs(navListStyles.sectionLabel)}>{label}</span>\n <FlexList\n {...mergePartProps<FlexProps<'ul'>>({ direction: 'column', gap: 'xs' }, propsList)}\n >\n {children}\n </FlexList>\n </>\n );\n },\n);\n\n// ─────────────── NavSection ───────────────\n\n/** 未声明的属性落到外层 li 上 */\nexport interface NavSectionProps extends PartProps<'li'> {\n /** 小节标题,同时是这组链接的无障碍名称 */\n label: VNodeChild;\n /** 标题前的图标:只是标记、不能点;紧凑时标题只剩它 */\n icon?: IconData;\n /** 标题的部件属性 */\n propsLabel?: PartProps<'span'>;\n /** 标题图标的部件属性 */\n propsIcon?: Partial<IconProps>;\n /** 里面的列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n /** 小节里的 NavItem */\n children?: VNodeChild;\n}\n\n/** 带小标题的一组导航链接(li > 标题 + ul):一直展开,不能收起;要收起用 NavGroup */\nexport const NavSection = _component(\n ({ label, icon, propsLabel, propsIcon, propsList, children, ...rest }: NavSectionProps) => {\n const labelId = useId();\n const compact = NavCompactContext.inject(() => false);\n const iconOnly = () => compact() && icon != null;\n return () => (\n <li {...mergeAttrs<'li'>({ sx: navListStyles.section }, rest)}>\n <span\n {...mergeAttrs<'span'>(\n { sx: [navListStyles.sectionLabel, iconOnly() && navListStyles.compactSection] },\n propsLabel,\n )}\n >\n {icon && (\n <Icon\n {...mergePartProps<IconProps>({ icon, sx: navListStyles.sectionIcon }, propsIcon)}\n />\n )}\n <span\n id={labelId}\n {...css.attrs(navListStyles.sectionText, iconOnly() && visuallyHiddenStyles.hidden)}\n >\n {label}\n </span>\n </span>\n <FlexList\n {...mergePartProps<FlexProps<'ul'>>({ direction: 'column', gap: 'xs' }, propsList, {\n 'aria-labelledby': labelId,\n })}\n >\n {children}\n </FlexList>\n </li>\n );\n },\n);\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { NavBarItem } from './NavBar';
2
+ import { type NavListProps } from './NavList';
3
+ /** 菜单树的一项:字段同 NavBarItem(同一份菜单数据可以同时给顶部的 NavBar 和侧栏的 NavMenu),多层嵌套 */
4
+ export interface NavMenuItem extends Omit<NavBarItem, 'children'> {
5
+ /** 同一层里唯一的标识(列表的 key),默认取 href,没有 href 时取 label */
6
+ key?: string;
7
+ /** 是否是当前页;不写时按路由适配判断 */
8
+ active?: boolean;
9
+ /** 子项:有可显示的子项时这一项是一组 */
10
+ children?: readonly NavMenuItem[];
11
+ }
12
+ /** 顶层有子项的项怎么显示:section 带小标题、一直展开;group 可收起 */
13
+ export interface NavMenuTopLevels {
14
+ /** 带小标题的小节,一直展开(默认) */
15
+ section: unknown;
16
+ /** 可收起的分组 */
17
+ group: unknown;
18
+ }
19
+ /** 未声明的属性落到 nav 上;aria-label 是导航的名称 */
20
+ export interface NavMenuProps extends Omit<NavListProps, 'children'> {
21
+ /** 菜单树 */
22
+ items: readonly NavMenuItem[];
23
+ /** 顶层有子项的项怎么显示,默认 section */
24
+ topLevel?: keyof NavMenuTopLevels;
25
+ }
26
+ /** 数据驱动的侧边导航:菜单树 → NavList、NavSection、NavGroup、NavItem */
27
+ export declare const NavMenu: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<NavMenuProps>;
@@ -0,0 +1,54 @@
1
+ import { NavGroup, NavItem, NavList, NavSection } from "./NavList.js";
2
+ import { createVNode, isVNode } from "vue";
3
+ import { _component, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
4
+ //#region src/navigation/NavMenu.tsx
5
+ /** 菜单树的一项:字段同 NavBarItem(同一份菜单数据可以同时给顶部的 NavBar 和侧栏的 NavMenu),多层嵌套 */
6
+ /** 顶层有子项的项怎么显示:section 带小标题、一直展开;group 可收起 */
7
+ /** 未声明的属性落到 nav 上;aria-label 是导航的名称 */
8
+ function _isSlot(s) {
9
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
10
+ }
11
+ /** 这一项(或它的子孙)有没有能显示的页面:没有的目录不画 */
12
+ var visible = (item) => item.children?.length ? item.children.some(visible) : item.href !== void 0;
13
+ var keyOf = (item) => item.key ?? item.href ?? item.label;
14
+ function renderLink(item) {
15
+ return createVNode(NavItem, {
16
+ "key": keyOf(item),
17
+ "href": item.href,
18
+ "icon": item.icon,
19
+ "badge": item.badge,
20
+ "disabled": item.disabled,
21
+ "active": item.active
22
+ }, { default: () => [item.label] });
23
+ }
24
+ function renderNode(item, depth, topLevel) {
25
+ if (!visible(item)) return null;
26
+ if (!item.children?.length) return renderLink(item);
27
+ const children = item.children.map((child) => renderNode(child, depth + 1, topLevel));
28
+ return depth === 0 && topLevel === "section" ? createVNode(NavSection, {
29
+ "key": keyOf(item),
30
+ "label": item.label,
31
+ "icon": item.icon
32
+ }, _isSlot(children) ? children : { default: () => [children] }) : createVNode(NavGroup, {
33
+ "key": keyOf(item),
34
+ "label": item.label,
35
+ "icon": item.icon
36
+ }, _isSlot(children) ? children : { default: () => [children] });
37
+ }
38
+ /** 数据驱动的侧边导航:菜单树 → NavList、NavSection、NavGroup、NavItem */
39
+ var NavMenu = /*#__PURE__*/ _component((_props, _ctx) => {
40
+ const items = readonlyProp(_props, "items");
41
+ const topLevel = readonlyProp(_props, "topLevel", "section");
42
+ const rest = restProps(_props, _ctx, true);
43
+ return () => createVNode(NavList, mergeJsxProps(rest, { "key": "__site0" }), {
44
+ default: () => [items.value.map((item) => renderNode(item, 0, topLevel.value))],
45
+ $stable: true
46
+ });
47
+ }, {
48
+ name: "NavMenu",
49
+ props: ["items", "topLevel"]
50
+ });
51
+ //#endregion
52
+ export { NavMenu };
53
+
54
+ //# sourceMappingURL=NavMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavMenu.js","names":["_isVNode","_createVNode","_vtp_readonlyProp","_vtp_restProps","_mergeProps"],"sources":["../../src/navigation/NavMenu.tsx"],"sourcesContent":["/**\n * 数据驱动的侧边导航:菜单是一棵树(后端按角色返回、或配置文件里写的),直接交给 NavMenu 渲染,不用自己递归拼 NavItem。\n *\n * <NavMenu\n * aria-label=\"主菜单\"\n * items={[\n * { label: '首页', href: '/', icon: House },\n * { label: '降本管理', icon: Boxes, children: [\n * { label: '降本项目', href: '/projects', badge: 3 },\n * { label: '台账', href: '/ledger' },\n * ] },\n * ]}\n * />\n *\n * 有 children 的项是一组:顶层的显示成带小标题、一直展开的小节(topLevel=\"section\",默认)或可收起的分组(topLevel=\"group\"),\n * 更深的层级都是可收起的分组(含当前页的组自动展开);没有 children 的项是链接。没有 href 又没有可显示子项的项不显示\n * (后端返回的目录下没有该用户能看的页面时,目录自然消失)。当前页按路由适配判断(NavItem 的 active),也可以逐项写 active。\n * 紧凑与抽屉里的表现同 NavList,由所在的 AppShell 决定。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport type { VNodeChild } from 'vue';\nimport type { NavBarItem } from './NavBar';\nimport { NavGroup, NavItem, NavList, NavSection, type NavListProps } from './NavList';\n\n/** 菜单树的一项:字段同 NavBarItem(同一份菜单数据可以同时给顶部的 NavBar 和侧栏的 NavMenu),多层嵌套 */\nexport interface NavMenuItem extends Omit<NavBarItem, 'children'> {\n /** 同一层里唯一的标识(列表的 key),默认取 href,没有 href 时取 label */\n key?: string;\n /** 是否是当前页;不写时按路由适配判断 */\n active?: boolean;\n /** 子项:有可显示的子项时这一项是一组 */\n children?: readonly NavMenuItem[];\n}\n\n/** 顶层有子项的项怎么显示:section 带小标题、一直展开;group 可收起 */\nexport interface NavMenuTopLevels {\n /** 带小标题的小节,一直展开(默认) */\n section: unknown;\n /** 可收起的分组 */\n group: unknown;\n}\n\n/** 未声明的属性落到 nav 上;aria-label 是导航的名称 */\nexport interface NavMenuProps extends Omit<NavListProps, 'children'> {\n /** 菜单树 */\n items: readonly NavMenuItem[];\n /** 顶层有子项的项怎么显示,默认 section */\n topLevel?: keyof NavMenuTopLevels;\n}\n\n/** 这一项(或它的子孙)有没有能显示的页面:没有的目录不画 */\nconst visible = (item: NavMenuItem): boolean =>\n item.children?.length ? item.children.some(visible) : item.href !== undefined;\n\nconst keyOf = (item: NavMenuItem) => item.key ?? item.href ?? item.label;\n\nfunction renderLink(item: NavMenuItem): VNodeChild {\n return (\n <NavItem\n key={keyOf(item)}\n href={item.href!}\n icon={item.icon}\n badge={item.badge}\n disabled={item.disabled}\n active={item.active}\n >\n {item.label}\n </NavItem>\n );\n}\n\nfunction renderNode(\n item: NavMenuItem,\n depth: number,\n topLevel: keyof NavMenuTopLevels,\n): VNodeChild {\n if (!visible(item)) return null;\n if (!item.children?.length) return renderLink(item);\n const children = item.children.map((child) => renderNode(child, depth + 1, topLevel));\n return depth === 0 && topLevel === 'section' ? (\n <NavSection key={keyOf(item)} label={item.label} icon={item.icon}>\n {children}\n </NavSection>\n ) : (\n <NavGroup key={keyOf(item)} label={item.label} icon={item.icon}>\n {children}\n </NavGroup>\n );\n}\n\n/** 数据驱动的侧边导航:菜单树 → NavList、NavSection、NavGroup、NavItem */\nexport const NavMenu = _component(\n ({ items, topLevel = 'section', ...rest }: NavMenuProps) =>\n () => <NavList {...rest}>{items.map((item) => renderNode(item, 0, topLevel))}</NavList>,\n);\n"],"mappings":";;;;;;;AA0CA,SAAA,QAAA,GAAA;CAAA,OAAA,OAAA,MAAA,cAAA,OAAA,UAAA,SAAA,KAAA,CAAA,MAAA,qBAAA,CAAAA,QAAA,CAAA;AAAA;;AASA,IAAM,WAAW,SACf,KAAK,UAAU,SAAS,KAAK,SAAS,KAAK,OAAO,IAAI,KAAK,SAAS,KAAA;AAEtE,IAAM,SAAS,SAAsB,KAAK,OAAO,KAAK,QAAQ,KAAK;AAEnE,SAAS,WAAW,MAA+B;CACjD,OAAAC,YAAA,SAAA;EAAA,OAES,MAAM,IAAI;EAAC,QACV,KAAK;EAAI,QACT,KAAK;EAAI,SACR,KAAK;EAAK,YACP,KAAK;EAAQ,UACf,KAAK;CAAM,GAAA,EAAA,eAAA,CAElB,KAAK,KAAK,EAAA,CAAA;AAGjB;AAEA,SAAS,WACP,MACA,OACA,UACY;CACZ,IAAI,CAAC,QAAQ,IAAI,GAAG,OAAO;CAC3B,IAAI,CAAC,KAAK,UAAU,QAAQ,OAAO,WAAW,IAAI;CAClD,MAAM,WAAW,KAAK,SAAS,KAAK,UAAU,WAAW,OAAO,QAAQ,GAAG,QAAQ,CAAC;CACpF,OAAO,UAAU,KAAK,aAAa,YAASA,YAAA,YAAA;EAAA,OACzB,MAAM,IAAI;EAAC,SAAS,KAAK;EAAK,QAAQ,KAAK;CAAI,GAAA,QAC7D,QAAQ,IAAR,WAAQ,EAAA,eAAA,CAAR,QAAQ,EAAA,CAAA,IAAAA,YAAA,UAAA;EAAA,OAGI,MAAM,IAAI;EAAC,SAAS,KAAK;EAAK,QAAQ,KAAK;CAAI,GAAA,QAC3D,QAAQ,IAAR,WAAQ,EAAA,eAAA,CAAR,QAAQ,EAAA,CAAA;AAGf;;AAGA,IAAa,UAAU,0BACrB,QAAA,SAAA;CAAA,MAAA,QAAAC,aAAA,QAAA,OAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,YAAqB,SAAS;CAAA,MAAK,OAAIC,UAAA,QAAA,MAAA,IAAA;CAAA,aACrCF,YAAA,SAAAG,cAAmB,MAAI,EAAA,OAAA,UAAA,CAAA,GAAA;EAAA,eAAA,CAAG,MAAA,MAAM,KAAK,SAAS,WAAW,MAAM,GAAC,SAAA,KAAU,CAAC,CAAC;EAAA,SAAA;CAAA,CAAA;AAAW,GAAA;CAAA,MAAA;CAAA,OAAA,CAAA,SAAA,UAAA;AAAA,CAC3F"}
@@ -3,8 +3,8 @@ import { useLang } from "../config/context.js";
3
3
  import { mergeAttrs, mergePartProps } from "../utils/props.js";
4
4
  import { fontSizeStyles } from "../utils/style/typography.js";
5
5
  import { NumberField } from "../input/NumberField.js";
6
- import { createVNode, mergeProps, ref, watch } from "vue";
7
- import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
6
+ import { createVNode, ref, watch } from "vue";
7
+ import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
8
8
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
9
9
  //#region src/navigation/PageJump.tsx
10
10
  /** 未声明的属性落到外层 div 上 */
@@ -44,7 +44,7 @@ var PageJump = /*#__PURE__*/ _component((_props, _ctx) => {
44
44
  sx: pageJumpStyles.text,
45
45
  "aria-hidden": true
46
46
  }, propsBefore.value), [lang.pageJumpBefore]),
47
- createVNode(NumberField, mergeProps(mergePartProps({
47
+ createVNode(NumberField, mergeJsxProps(mergePartProps({
48
48
  "aria-label": lang.pageJumpLabel,
49
49
  min: 1,
50
50
  max: Math.max(1, pageCount.value),
@@ -1 +1 @@
1
- {"version":3,"file":"PageJump.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_ref","_createVNode","_mergeProps"],"sources":["../../src/navigation/PageJump.tsx"],"sourcesContent":["/**\n * 跳页:分页的配套组件,“跳至 [ ] 页”,回车或失焦后跳过去(夹在 1–pageCount),输入框随后清空。\n *\n * <PageJump _page={page} pageCount={32} />\n *\n * 基于 NumberField:未声明的属性落到外层 div 上;输入框用 propsInput。读屏念输入框的名称(语言包的“跳到第几页”),\n * 前后的“跳至”“页”只是视觉上的提示。部件:Root(div)、Before、Input(NumberField)、After。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { watch } from 'vue';\nimport { useLang } from '../config/context';\nimport { NumberField, type NumberFieldProps } from '../input/NumberField';\nimport { clamp } from '../utils/data/number';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\n\n/** 未声明的属性落到外层 div 上 */\nexport interface PageJumpProps extends PartProps<'div'> {\n /** 当前页:父级写 _page={page},跳页时写回 */\n _page?: number;\n /** 总页数:输入的页码夹在 1–pageCount */\n pageCount: number;\n /** 字号档位,默认 sm(同 Pagination) */\n size?: TextSize;\n /** 输入框前文字的部件属性 */\n propsBefore?: PartProps<'span'>;\n /** 输入框(NumberField)的部件属性 */\n propsInput?: Partial<NumberFieldProps>;\n /** 输入框后文字的部件属性 */\n propsAfter?: PartProps<'span'>;\n}\n\n/** PageJump 的样式:root、input、text */\nexport const pageJumpStyles = css.create({\n root: { display: 'inline-flex', alignItems: 'center', gap: '_sm' },\n input: { width: '4.5em' },\n text: { color: '_textMuted', whiteSpace: 'nowrap' },\n});\n\n/** 跳页:输入页码后跳过去 */\nexport const PageJump = _component(\n ({\n _page: page = _bindable(1),\n pageCount,\n size = 'sm',\n propsBefore,\n propsInput,\n propsAfter,\n ...rest\n }: PageJumpProps) => {\n const lang = useLang();\n // 输入框只在跳之前暂存页码,跳完清空\n let draft = _state<number | null>(null);\n watch(\n () => draft,\n (target) => {\n if (target == null) return;\n const next = clamp(Math.round(target), 1, Math.max(1, pageCount));\n if (next !== page) page = next;\n draft = null;\n },\n );\n\n return () => (\n <div {...mergeAttrs<'div'>({ sx: [pageJumpStyles.root, fontSizeStyles[size]] }, rest)}>\n {lang.pageJumpBefore && (\n <span\n {...mergeAttrs<'span'>({ sx: pageJumpStyles.text, 'aria-hidden': true }, propsBefore)}\n >\n {lang.pageJumpBefore}\n </span>\n )}\n <NumberField\n {...mergePartProps<NumberFieldProps>(\n {\n 'aria-label': lang.pageJumpLabel,\n min: 1,\n max: Math.max(1, pageCount),\n stepper: false,\n propsRoot: { sx: pageJumpStyles.input },\n },\n propsInput,\n )}\n _value={draft}\n />\n {lang.pageJumpAfter && (\n <span\n {...mergeAttrs<'span'>({ sx: pageJumpStyles.text, 'aria-hidden': true }, propsAfter)}\n >\n {lang.pageJumpAfter}\n </span>\n )}\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;AAkCA,IAAa,iBAAiB,IAAI,OAAO;CACvC,MAAM;EAAE,SAAS;EAAe,YAAY;EAAU,KAAK;CAAM;CACjE,OAAO,EAAE,OAAO,QAAQ;CACxB,MAAM;EAAE,OAAO;EAAc,YAAY;CAAS;AACpD,CAAC;;AAGD,IAAa,WAAW,0BACtB,QAAA,SAQqB;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,OAAAA,SAAA,QAAA,eAPK,GAAC,KAAA,IAAA;CAAA,MAAA,YAAAC,aAAA,QAAA,WAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,QAElB,IAAI;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAIR,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,OAAO,QAAQ;CAErB,IAAI,QAAKC,IAAyB,IAAI;CACtC,YACE,MAAA,QACC,WAAW;EACV,IAAI,UAAU,MAAM;EACpB,MAAM,OAAO,MAAM,KAAK,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,GAAC,UAAA,KAAW,CAAC;EAChE,IAAI,SAAI,KAAA,OAAW,KAAA,QAAO;EAC1B,MAAA,QAAQ;CACV,CACF;CAEA,aAAOC,YAAA,OACI,WAAkB,EAAE,IAAI,CAAC,eAAe,MAAM,eAAc,KAAA,MAAM,EAAE,GAAG,IAAI,GAAC;EAClF,KAAK,kBAAcA,YAAA,QAEZ,WAAmB;GAAE,IAAI,eAAe;GAAM,eAAe;EAAK,GAAC,YAAA,KAAa,GAAC,CAEpF,KAAK,cAAc,CAAA;EAEvBA,YAAA,aAAAC,WAEK,eACF;GACE,cAAc,KAAK;GACnB,KAAK;GACL,KAAK,KAAK,IAAI,GAAC,UAAA,KAAW;GAC1B,SAAS;GACT,WAAW,EAAE,IAAI,eAAe,MAAM;EACxC,GAAC,WAAA,KAEH,GAAC;GAAA,UAAA,MAAA;GAAA,mBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,MAAA,QAAA;EAAA,CAAA,GAAA,IAAA;EAGF,KAAK,iBAAaD,YAAA,QAEX,WAAmB;GAAE,IAAI,eAAe;GAAM,eAAe;EAAK,GAAC,WAAA,KAAY,GAAC,CAEnF,KAAK,aAAa,CAAA;CAEtB,CAAA;AAGP,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
1
+ {"version":3,"file":"PageJump.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_ref","_createVNode","_mergeProps"],"sources":["../../src/navigation/PageJump.tsx"],"sourcesContent":["/**\n * 跳页:分页的配套组件,“跳至 [ ] 页”,回车或失焦后跳过去(夹在 1–pageCount),输入框随后清空。\n *\n * <PageJump _page={page} pageCount={32} />\n *\n * 基于 NumberField:未声明的属性落到外层 div 上;输入框用 propsInput。读屏念输入框的名称(语言包的“跳到第几页”),\n * 前后的“跳至”“页”只是视觉上的提示。部件:Root(div)、Before、Input(NumberField)、After。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { watch } from 'vue';\nimport { useLang } from '../config/context';\nimport { NumberField, type NumberFieldProps } from '../input/NumberField';\nimport { clamp } from '../utils/data/number';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\n\n/** 未声明的属性落到外层 div 上 */\nexport interface PageJumpProps extends PartProps<'div'> {\n /** 当前页:父级写 _page={page},跳页时写回 */\n _page?: number;\n /** 总页数:输入的页码夹在 1–pageCount */\n pageCount: number;\n /** 字号档位,默认 sm(同 Pagination) */\n size?: TextSize;\n /** 输入框前文字的部件属性 */\n propsBefore?: PartProps<'span'>;\n /** 输入框(NumberField)的部件属性 */\n propsInput?: Partial<NumberFieldProps>;\n /** 输入框后文字的部件属性 */\n propsAfter?: PartProps<'span'>;\n}\n\n/** PageJump 的样式:root、input、text */\nexport const pageJumpStyles = css.create({\n root: { display: 'inline-flex', alignItems: 'center', gap: '_sm' },\n input: { width: '4.5em' },\n text: { color: '_textMuted', whiteSpace: 'nowrap' },\n});\n\n/** 跳页:输入页码后跳过去 */\nexport const PageJump = _component(\n ({\n _page: page = _bindable(1),\n pageCount,\n size = 'sm',\n propsBefore,\n propsInput,\n propsAfter,\n ...rest\n }: PageJumpProps) => {\n const lang = useLang();\n // 输入框只在跳之前暂存页码,跳完清空\n let draft = _state<number | null>(null);\n watch(\n () => draft,\n (target) => {\n if (target == null) return;\n const next = clamp(Math.round(target), 1, Math.max(1, pageCount));\n if (next !== page) page = next;\n draft = null;\n },\n );\n\n return () => (\n <div {...mergeAttrs<'div'>({ sx: [pageJumpStyles.root, fontSizeStyles[size]] }, rest)}>\n {lang.pageJumpBefore && (\n <span\n {...mergeAttrs<'span'>({ sx: pageJumpStyles.text, 'aria-hidden': true }, propsBefore)}\n >\n {lang.pageJumpBefore}\n </span>\n )}\n <NumberField\n {...mergePartProps<NumberFieldProps>(\n {\n 'aria-label': lang.pageJumpLabel,\n min: 1,\n max: Math.max(1, pageCount),\n stepper: false,\n propsRoot: { sx: pageJumpStyles.input },\n },\n propsInput,\n )}\n _value={draft}\n />\n {lang.pageJumpAfter && (\n <span\n {...mergeAttrs<'span'>({ sx: pageJumpStyles.text, 'aria-hidden': true }, propsAfter)}\n >\n {lang.pageJumpAfter}\n </span>\n )}\n </div>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;AAkCA,IAAa,iBAAiB,IAAI,OAAO;CACvC,MAAM;EAAE,SAAS;EAAe,YAAY;EAAU,KAAK;CAAM;CACjE,OAAO,EAAE,OAAO,QAAQ;CACxB,MAAM;EAAE,OAAO;EAAc,YAAY;CAAS;AACpD,CAAC;;AAGD,IAAa,WAAW,0BACtB,QAAA,SAQqB;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,OAAAA,SAAA,QAAA,eAPK,GAAC,KAAA,IAAA;CAAA,MAAA,YAAAC,aAAA,QAAA,WAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,QAElB,IAAI;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAIR,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,OAAO,QAAQ;CAErB,IAAI,QAAKC,IAAyB,IAAI;CACtC,YACE,MAAA,QACC,WAAW;EACV,IAAI,UAAU,MAAM;EACpB,MAAM,OAAO,MAAM,KAAK,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,GAAC,UAAA,KAAW,CAAC;EAChE,IAAI,SAAI,KAAA,OAAW,KAAA,QAAO;EAC1B,MAAA,QAAQ;CACV,CACF;CAEA,aAAOC,YAAA,OACI,WAAkB,EAAE,IAAI,CAAC,eAAe,MAAM,eAAc,KAAA,MAAM,EAAE,GAAG,IAAI,GAAC;EAClF,KAAK,kBAAcA,YAAA,QAEZ,WAAmB;GAAE,IAAI,eAAe;GAAM,eAAe;EAAK,GAAC,YAAA,KAAa,GAAC,CAEpF,KAAK,cAAc,CAAA;EAEvBA,YAAA,aAAAC,cAEK,eACF;GACE,cAAc,KAAK;GACnB,KAAK;GACL,KAAK,KAAK,IAAI,GAAC,UAAA,KAAW;GAC1B,SAAS;GACT,WAAW,EAAE,IAAI,eAAe,MAAM;EACxC,GAAC,WAAA,KAEH,GAAC;GAAA,UAAA,MAAA;GAAA,mBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,MAAA,QAAA;EAAA,CAAA,GAAA,IAAA;EAGF,KAAK,iBAAaD,YAAA,QAEX,WAAmB;GAAE,IAAI,eAAe;GAAM,eAAe;EAAK,GAAC,WAAA,KAAY,GAAC,CAEnF,KAAK,aAAa,CAAA;CAEtB,CAAA;AAGP,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
@@ -1,8 +1,8 @@
1
1
  import { useLang } from "../config/context.js";
2
2
  import { mergePartProps } from "../utils/props.js";
3
3
  import { Select } from "../input/Select.js";
4
- import { createVNode, mergeProps, ref, watch } from "vue";
5
- import { _component, bindable, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
4
+ import { createVNode, ref, watch } from "vue";
5
+ import { _component, bindable, mergeJsxProps, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
6
6
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
7
7
  //#region src/navigation/PageSizeSelect.tsx
8
8
  /** 单选的 Select 属性 */
@@ -34,7 +34,7 @@ var PageSizeSelect = /*#__PURE__*/ _component((_props, _ctx) => {
34
34
  value.value = size;
35
35
  onSizeChange.value?.(size);
36
36
  });
37
- return () => createVNode(Select, mergeProps(mergePartProps({
37
+ return () => createVNode(Select, mergeJsxProps(mergePartProps({
38
38
  items: options.value.map((size) => ({
39
39
  value: String(size),
40
40
  label: lang.pageSizeOption(size)
@@ -42,7 +42,7 @@ var PageSizeSelect = /*#__PURE__*/ _component((_props, _ctx) => {
42
42
  selectionMode: "single",
43
43
  "aria-label": lang.pageSizeLabel,
44
44
  size: "sm",
45
- renderValue: () => createVNode("span", css.attrs(pageSizeSelectStyles.stack), [options.value.map((size) => createVNode("span", mergeProps({
45
+ renderValue: () => createVNode("span", css.attrs(pageSizeSelectStyles.stack), [options.value.map((size) => createVNode("span", mergeJsxProps({
46
46
  "key": size,
47
47
  "aria-hidden": size !== value.value || void 0
48
48
  }, css.attrs(pageSizeSelectStyles.option, size !== value.value && pageSizeSelectStyles.hidden)), [lang.pageSizeOption(size)]))])
@@ -1 +1 @@
1
- {"version":3,"file":"PageSizeSelect.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_ref","_vtp_untrack","_createVNode","_mergeProps"],"sources":["../../src/navigation/PageSizeSelect.tsx"],"sourcesContent":["/**\n * 每页条数选择:分页的配套组件,与 Pagination 并排放(各自独立,按需组合;三样都要时用 PaginationBar)。选项文字取语言包(“20 条/页”)。\n *\n * <Flex gap=\"md\" align=\"center\">\n * <Pagination _page={page} total={total} pageSize={size} />\n * <PageSizeSelect _value={size} onSizeChange={() => (page = 1)} />\n * </Flex>\n *\n * 基于 Select:未声明的属性落到 Select 上(外壳用 propsRoot 等 Select 的部件),名称默认取语言包(每页条数)。\n * 按钮按最长的选项定宽:换条数时不变宽窄,下拉(与按钮同宽)里的选项也不被截断。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { watch } from 'vue';\nimport { useLang } from '../config/context';\nimport { Select, type SelectProps } from '../input/Select';\nimport { mergePartProps } from '../utils/props';\nimport type { SingleSelectionProps } from '../utils/data/selection';\n\n/** 单选的 Select 属性 */\ntype SingleSelectProps = Extract<SelectProps, SingleSelectionProps>;\n\n/** 未声明的属性落到 Select 上 */\nexport interface PageSizeSelectProps extends Omit<\n Partial<SelectProps>,\n '_value' | 'items' | 'selectionMode'\n> {\n /** 每页条数:父级写 _value={size} */\n _value?: number;\n /** 可选的条数,默认 [10, 20, 50, 100] */\n options?: readonly number[];\n /** 用户换了条数后调用(通常把页码回到第 1 页) */\n onSizeChange?: (size: number) => void;\n}\n\n/** PageSizeSelect 的样式:stack、option、hidden */\nexport const pageSizeSelectStyles = css.create({\n // 所有选项的文字叠在同一格,按最宽的那个撑开,只显示选中的\n stack: { display: 'inline-grid' },\n option: { gridArea: '1 / 1' },\n hidden: { visibility: 'hidden' },\n});\n\n/** 每页条数选择(Select) */\nexport const PageSizeSelect = _component(\n ({\n _value: value = _bindable(10),\n options = [10, 20, 50, 100],\n onSizeChange,\n ...rest\n }: PageSizeSelectProps) => {\n const lang = useLang();\n // Select 的值是字符串:本地一份,与数字的 value 互相同步\n let selected = _state(String(_untrack(value)));\n watch(\n () => value,\n (size) => (selected = String(size)),\n );\n watch(\n () => selected,\n (next) => {\n const size = Number(next);\n if (size === value) return;\n value = size;\n onSizeChange?.(size);\n },\n );\n\n return () => (\n <Select\n {...mergePartProps<SingleSelectProps>(\n {\n items: options.map((size) => ({\n value: String(size),\n label: lang.pageSizeOption(size),\n })),\n selectionMode: 'single',\n 'aria-label': lang.pageSizeLabel,\n size: 'sm',\n renderValue: () => (\n <span {...css.attrs(pageSizeSelectStyles.stack)}>\n {options.map((size) => (\n <span\n key={size}\n aria-hidden={size !== value || undefined}\n {...css.attrs(\n pageSizeSelectStyles.option,\n size !== value && pageSizeSelectStyles.hidden,\n )}\n >\n {lang.pageSizeOption(size)}\n </span>\n ))}\n </span>\n ),\n },\n rest,\n )}\n _value={selected}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;;AAoCA,IAAa,uBAAuB,IAAI,OAAO;CAE7C,OAAO,EAAE,SAAS,cAAc;CAChC,QAAQ,EAAE,UAAU,QAAQ;CAC5B,QAAQ,EAAE,YAAY,SAAS;AACjC,CAAC;;AAGD,IAAa,iBAAiB,0BAC5B,QAAA,SAK2B;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,QAAAA,SAAA,QAAA,gBAJC,IAAE,KAAA,IAAA;CAAA,MAAA,UAAAC,aAAA,QAAA,iBAClB;EAAC;EAAI;EAAI;EAAI;CAAG,CAAC;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAExB,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,OAAO,QAAQ;CAErB,IAAI,WAAQC,IAAU,OAAMC,cAAA,MAAA,KAAA,CAAgB,CAAC;CAC7C,YACE,MAAA,QACC,SAAU,SAAA,QAAW,OAAO,IAAI,CACnC;CACA,YACE,SAAA,QACC,SAAS;EACR,MAAM,OAAO,OAAO,IAAI;EACxB,IAAI,SAAI,MAAA,OAAY;EACpB,MAAA,QAAQ;EACR,aAAA,QAAe,IAAI;CACrB,CACF;CAEA,aAAOC,YAAA,QAAAC,WAEC,eACF;EACE,OAAO,QAAA,MAAQ,KAAK,UAAU;GAC5B,OAAO,OAAO,IAAI;GAClB,OAAO,KAAK,eAAe,IAAI;EACjC,EAAE;EACF,eAAe;EACf,cAAc,KAAK;EACnB,MAAM;EACN,mBAAaD,YAAA,QACD,IAAI,MAAM,qBAAqB,KAAK,GAAC,CAC5C,QAAA,MAAQ,KAAK,SAAIA,YAAA,QAAAC,WAAA;GAAA,OAET;GAAI,eACI,SAAI,MAAA,SAAc,KAAA;EAAS,GACpC,IAAI,MACN,qBAAqB,QACrB,SAAI,MAAA,SAAc,qBAAqB,MACzC,CAAC,GAAA,CAEA,KAAK,eAAe,IAAI,CAAC,CAAA,CAE7B,CAAC,CAAA;CAGR,GACA,IACF,GAAC;EAAA,UAAA,SAAA;EAAA,mBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,SAAA,QAAA;CAAA,CAAA,GAAA,IAAA;AAIP,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
1
+ {"version":3,"file":"PageSizeSelect.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_ref","_vtp_untrack","_createVNode","_mergeProps"],"sources":["../../src/navigation/PageSizeSelect.tsx"],"sourcesContent":["/**\n * 每页条数选择:分页的配套组件,与 Pagination 并排放(各自独立,按需组合;三样都要时用 PaginationBar)。选项文字取语言包(“20 条/页”)。\n *\n * <Flex gap=\"md\" align=\"center\">\n * <Pagination _page={page} total={total} pageSize={size} />\n * <PageSizeSelect _value={size} onSizeChange={() => (page = 1)} />\n * </Flex>\n *\n * 基于 Select:未声明的属性落到 Select 上(外壳用 propsRoot 等 Select 的部件),名称默认取语言包(每页条数)。\n * 按钮按最长的选项定宽:换条数时不变宽窄,下拉(与按钮同宽)里的选项也不被截断。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { watch } from 'vue';\nimport { useLang } from '../config/context';\nimport { Select, type SelectProps } from '../input/Select';\nimport { mergePartProps } from '../utils/props';\nimport type { SingleSelectionProps } from '../utils/data/selection';\n\n/** 单选的 Select 属性 */\ntype SingleSelectProps = Extract<SelectProps, SingleSelectionProps>;\n\n/** 未声明的属性落到 Select 上 */\nexport interface PageSizeSelectProps extends Omit<\n Partial<SelectProps>,\n '_value' | 'items' | 'selectionMode'\n> {\n /** 每页条数:父级写 _value={size} */\n _value?: number;\n /** 可选的条数,默认 [10, 20, 50, 100] */\n options?: readonly number[];\n /** 用户换了条数后调用(通常把页码回到第 1 页) */\n onSizeChange?: (size: number) => void;\n}\n\n/** PageSizeSelect 的样式:stack、option、hidden */\nexport const pageSizeSelectStyles = css.create({\n // 所有选项的文字叠在同一格,按最宽的那个撑开,只显示选中的\n stack: { display: 'inline-grid' },\n option: { gridArea: '1 / 1' },\n hidden: { visibility: 'hidden' },\n});\n\n/** 每页条数选择(Select) */\nexport const PageSizeSelect = _component(\n ({\n _value: value = _bindable(10),\n options = [10, 20, 50, 100],\n onSizeChange,\n ...rest\n }: PageSizeSelectProps) => {\n const lang = useLang();\n // Select 的值是字符串:本地一份,与数字的 value 互相同步\n let selected = _state(String(_untrack(value)));\n watch(\n () => value,\n (size) => (selected = String(size)),\n );\n watch(\n () => selected,\n (next) => {\n const size = Number(next);\n if (size === value) return;\n value = size;\n onSizeChange?.(size);\n },\n );\n\n return () => (\n <Select\n {...mergePartProps<SingleSelectProps>(\n {\n items: options.map((size) => ({\n value: String(size),\n label: lang.pageSizeOption(size),\n })),\n selectionMode: 'single',\n 'aria-label': lang.pageSizeLabel,\n size: 'sm',\n renderValue: () => (\n <span {...css.attrs(pageSizeSelectStyles.stack)}>\n {options.map((size) => (\n <span\n key={size}\n aria-hidden={size !== value || undefined}\n {...css.attrs(\n pageSizeSelectStyles.option,\n size !== value && pageSizeSelectStyles.hidden,\n )}\n >\n {lang.pageSizeOption(size)}\n </span>\n ))}\n </span>\n ),\n },\n rest,\n )}\n _value={selected}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;;AAoCA,IAAa,uBAAuB,IAAI,OAAO;CAE7C,OAAO,EAAE,SAAS,cAAc;CAChC,QAAQ,EAAE,UAAU,QAAQ;CAC5B,QAAQ,EAAE,YAAY,SAAS;AACjC,CAAC;;AAGD,IAAa,iBAAiB,0BAC5B,QAAA,SAK2B;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,QAAAA,SAAA,QAAA,gBAJC,IAAE,KAAA,IAAA;CAAA,MAAA,UAAAC,aAAA,QAAA,iBAClB;EAAC;EAAI;EAAI;EAAI;CAAG,CAAC;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAExB,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,OAAO,QAAQ;CAErB,IAAI,WAAQC,IAAU,OAAMC,cAAA,MAAA,KAAA,CAAgB,CAAC;CAC7C,YACE,MAAA,QACC,SAAU,SAAA,QAAW,OAAO,IAAI,CACnC;CACA,YACE,SAAA,QACC,SAAS;EACR,MAAM,OAAO,OAAO,IAAI;EACxB,IAAI,SAAI,MAAA,OAAY;EACpB,MAAA,QAAQ;EACR,aAAA,QAAe,IAAI;CACrB,CACF;CAEA,aAAOC,YAAA,QAAAC,cAEC,eACF;EACE,OAAO,QAAA,MAAQ,KAAK,UAAU;GAC5B,OAAO,OAAO,IAAI;GAClB,OAAO,KAAK,eAAe,IAAI;EACjC,EAAE;EACF,eAAe;EACf,cAAc,KAAK;EACnB,MAAM;EACN,mBAAaD,YAAA,QACD,IAAI,MAAM,qBAAqB,KAAK,GAAC,CAC5C,QAAA,MAAQ,KAAK,SAAIA,YAAA,QAAAC,cAAA;GAAA,OAET;GAAI,eACI,SAAI,MAAA,SAAc,KAAA;EAAS,GACpC,IAAI,MACN,qBAAqB,QACrB,SAAI,MAAA,SAAc,qBAAqB,MACzC,CAAC,GAAA,CAEA,KAAK,eAAe,IAAI,CAAC,CAAA,CAE7B,CAAC,CAAA;CAGR,GACA,IACF,GAAC;EAAA,UAAA,SAAA;EAAA,mBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,SAAA,QAAA;CAAA,CAAA,GAAA,IAAA;AAIP,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
@@ -1,7 +1,7 @@
1
1
  import { clamp } from "../utils/data/number.js";
2
2
  import { t } from "../config/theme/tokens.js";
3
3
  import { useLang } from "../config/context.js";
4
- import { mergeAttrs, mergePartProps, mergeProps as mergeProps$1 } from "../utils/props.js";
4
+ import { mergeAttrs, mergePartProps, mergeProps } from "../utils/props.js";
5
5
  import { Icon } from "../base/Icon.js";
6
6
  import { Button } from "../base/Button.js";
7
7
  import { IconButton } from "../base/IconButton.js";
@@ -9,8 +9,8 @@ import { IconLinkButton } from "../base/IconLinkButton.js";
9
9
  import { LinkButton } from "../base/LinkButton.js";
10
10
  import { FlexList } from "../layout/Flex.js";
11
11
  import { paginationItems } from "../utils/data/pagination.js";
12
- import { computed, createVNode, isVNode, mergeProps } from "vue";
13
- import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
12
+ import { computed, createVNode, isVNode } from "vue";
13
+ import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
14
14
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
15
15
  import { ChevronLeft, ChevronRight, Ellipsis } from "@lucide/icons";
16
16
  //#region src/navigation/Pagination.tsx
@@ -75,7 +75,7 @@ var Pagination = /*#__PURE__*/ _component((_props, _ctx) => {
75
75
  function pageButton(target) {
76
76
  const isCurrent = target === current.value;
77
77
  const own = typeof propsPage.value === "function" ? propsPage.value(target) : propsPage.value;
78
- const shared = mergeProps$1({
78
+ const shared = mergeProps({
79
79
  sx: [paginationStyles.page, paginationStyles.tabular],
80
80
  size: size.value,
81
81
  variant: isCurrent ? "soft" : "ghost",
@@ -114,7 +114,7 @@ var Pagination = /*#__PURE__*/ _component((_props, _ctx) => {
114
114
  return () => createVNode("nav", mergeAttrs({
115
115
  sx: paginationStyles.root,
116
116
  "aria-label": lang.pagination
117
- }, rest), [createVNode(FlexList, mergeProps(mergePartProps({
117
+ }, rest), [createVNode(FlexList, mergeJsxProps(mergePartProps({
118
118
  align: "center",
119
119
  gap: "xs"
120
120
  }, propsList.value), { "key": "__site0" }), {
@@ -125,7 +125,7 @@ var Pagination = /*#__PURE__*/ _component((_props, _ctx) => {
125
125
  pageCount: count.value,
126
126
  siblings: siblings.value,
127
127
  boundaries: boundaries.value
128
- }).map((item) => createVNode("li", mergeProps({ "key": item }, mergeAttrs({}, propsItem.value)), [typeof item === "number" ? pageButton(item) : createVNode("span", mergeAttrs({ sx: paginationStyles.ellipsis }, propsEllipsis.value, { "aria-hidden": true }), [createVNode(Icon, { "icon": Ellipsis }, null)])])),
128
+ }).map((item) => createVNode("li", mergeJsxProps({ "key": item }, mergeAttrs({}, propsItem.value)), [typeof item === "number" ? pageButton(item) : createVNode("span", mergeAttrs({ sx: paginationStyles.ellipsis }, propsEllipsis.value, { "aria-hidden": true }), [createVNode(Icon, { "icon": Ellipsis }, null)])])),
129
129
  createVNode("li", mergeAttrs({}, propsItem.value), [stepButton(1)])
130
130
  ],
131
131
  $stable: true
@@ -1 +1 @@
1
- {"version":3,"file":"Pagination.js","names":["_isVNode","_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","mergeProps","_createVNode","_mergeProps"],"sources":["../../src/navigation/Pagination.tsx"],"sourcesContent":["/**\n * 分页(nav > ul):上一页、页码、省略号、下一页,当前页带 aria-current=\"page\"。\n * 页码序列用 utils/data/pagination.ts(项数固定,翻页时按钮不跳动);按钮用 Button / IconButton,文案取语言包。\n *\n * <Pagination _page={page} total={320} pageSize={20} />\n * <Pagination page={page} pageCount={12} href={(n) => `/articles?page=${n}`} /> 渲染为链接(可分享、可被收录)\n */\nimport { ChevronLeft, ChevronRight, Ellipsis } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { Icon } from '../base/Icon';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { IconLinkButton, type IconLinkButtonProps } from '../base/IconLinkButton';\nimport { LinkButton, type LinkButtonProps } from '../base/LinkButton';\nimport { useLang } from '../config/context';\nimport { paginationItems } from '../utils/data/pagination';\nimport { mergeAttrs, mergePartProps, mergeProps, type PartProps } from '../utils/props';\nimport type { TextSize } from '../utils/style/typography';\nimport { clamp } from '../utils/data/number';\nimport { FlexList, type FlexProps } from '../layout/Flex';\nimport { t } from '../config/theme/tokens';\n\n/** 未声明的属性落到 nav 上;aria-label 默认取语言包(分页) */\nexport interface PaginationProps extends PartProps<'nav'> {\n /** 当前页,从 1 开始:父级写 _page={x} */\n _page?: number;\n /** 总页数;不写时按 total 与 pageSize 算 */\n pageCount?: number;\n /** 总条数:给了就能算页数,showTotal 时显示“共 n 条” */\n total?: number;\n /** 每页条数,默认 10 */\n pageSize?: number;\n /** 当前页左右各显示几页,默认 1 */\n siblings?: number;\n /** 首尾各固定显示几页,默认 1 */\n boundaries?: number;\n /** 显示总条数(需要 total) */\n showTotal?: boolean;\n /** 给了就渲染为链接:每页的地址 */\n href?: (page: number) => string;\n /** 字号档位,按钮随之缩放,默认 sm */\n size?: TextSize;\n /** 列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n /** 每一项(li,包着按钮或省略号)的部件属性 */\n propsItem?: PartProps<'li'>;\n /** 页码按钮的部件属性(按钮或链接按钮),可以按页计算 */\n propsPage?:\n | Partial<ButtonProps & LinkButtonProps>\n | ((page: number) => Partial<ButtonProps & LinkButtonProps>);\n /** 上一页、下一页按钮的部件属性(有 href 时是图标链接按钮) */\n propsStep?: Partial<IconButtonProps & IconLinkButtonProps>;\n /** 省略号的部件属性 */\n propsEllipsis?: PartProps<'span'>;\n /** 总条数文字的部件属性 */\n propsTotal?: PartProps<'span'>;\n}\n\n/** Pagination 的样式:root、list、page、ellipsis、total、tabular */\nexport const paginationStyles = css.create({\n root: { display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '_md' },\n // 页码按钮等宽,翻页时位置不晃\n page: { minWidth: `max(${t.sizes.control}, ${t.sizes.minTarget})`, paddingInline: '_xs' },\n ellipsis: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: `max(${t.sizes.control}, ${t.sizes.minTarget})`,\n color: '_textMuted',\n },\n total: { color: '_textMuted' },\n tabular: { fontVariantNumeric: 'tabular-nums' },\n});\n\n/** 分页:上一页、页码、省略号、下一页 */\nexport const Pagination = _component(\n ({\n _page: page = _bindable(1),\n pageCount,\n total,\n pageSize = 10,\n siblings = 1,\n boundaries = 1,\n showTotal = false,\n href,\n size = 'sm',\n propsList,\n propsItem,\n propsPage,\n propsStep,\n propsEllipsis,\n propsTotal,\n ...rest\n }: PaginationProps) => {\n const lang = useLang();\n const count = _derived(Math.max(1, pageCount ?? Math.ceil((total ?? 0) / pageSize)));\n // 显示用的当前页:总数变少(筛选后)时父级的 page 可能超出范围,夹回去,不显示不存在的页\n const current = _derived(clamp(page, 1, count));\n\n function go(target: number) {\n page = clamp(target, 1, count);\n }\n\n /** 一个页码:当前页是实底,其余是 ghost;有 href 时是链接 */\n function pageButton(target: number) {\n const isCurrent = target === current;\n const own = typeof propsPage === 'function' ? propsPage(target) : propsPage;\n const shared = mergeProps<ButtonProps & LinkButtonProps>(\n {\n sx: [paginationStyles.page, paginationStyles.tabular],\n size,\n variant: isCurrent ? 'soft' : 'ghost',\n tone: isCurrent ? 'accent' : 'neutral',\n 'aria-label': lang.pageLabel(target),\n },\n own,\n { 'aria-current': isCurrent ? 'page' : undefined },\n );\n return href ? (\n <LinkButton\n {...mergePartProps<LinkButtonProps>(shared as LinkButtonProps, {\n href: href(target),\n onClick: () => go(target),\n })}\n >\n {target}\n </LinkButton>\n ) : (\n <Button\n {...mergePartProps<ButtonProps>(shared as ButtonProps, { onClick: () => go(target) })}\n >\n {target}\n </Button>\n );\n }\n\n /** 上一页、下一页:到头时不可用;有 href 时也是链接(rel=\"prev\" / \"next\"),与页码一样可分享 */\n function stepButton(direction: -1 | 1) {\n const target = current + direction;\n const disabled = target < 1 || target > count;\n const shared = {\n size,\n variant: 'ghost',\n tone: 'neutral',\n icon: direction < 0 ? ChevronLeft : ChevronRight,\n propsIcon: { flipInRtl: true },\n 'aria-label': direction < 0 ? lang.previousPage : lang.nextPage,\n } as const;\n return href ? (\n <IconLinkButton\n {...mergePartProps<IconLinkButtonProps>(\n { ...shared, href: href(disabled ? current : target) },\n propsStep,\n { disabled, rel: direction < 0 ? 'prev' : 'next', onClick: () => go(target) },\n )}\n />\n ) : (\n <IconButton\n {...mergePartProps<IconButtonProps>(shared, propsStep, {\n disabled,\n onClick: () => go(target),\n })}\n />\n );\n }\n\n return () => (\n <nav\n {...mergeAttrs<'nav'>({ sx: paginationStyles.root, 'aria-label': lang.pagination }, rest)}\n >\n <FlexList {...mergePartProps<FlexProps<'ul'>>({ align: 'center', gap: 'xs' }, propsList)}>\n <li {...mergeAttrs<'li'>({}, propsItem)}>{stepButton(-1)}</li>\n {paginationItems({ page: current, pageCount: count, siblings, boundaries }).map(\n (item) => (\n <li key={item} {...mergeAttrs<'li'>({}, propsItem)}>\n {typeof item === 'number' ? (\n pageButton(item)\n ) : (\n <span\n {...mergeAttrs<'span'>({ sx: paginationStyles.ellipsis }, propsEllipsis, {\n 'aria-hidden': true,\n })}\n >\n <Icon icon={Ellipsis} />\n </span>\n )}\n </li>\n ),\n )}\n <li {...mergeAttrs<'li'>({}, propsItem)}>{stepButton(1)}</li>\n </FlexList>\n {showTotal && total != null && (\n <span\n {...mergeAttrs<'span'>(\n { sx: [paginationStyles.total, paginationStyles.tabular] },\n propsTotal,\n )}\n >\n {lang.paginationTotal(total)}\n </span>\n )}\n </nav>\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"Pagination.js","names":["_isVNode","_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/navigation/Pagination.tsx"],"sourcesContent":["/**\n * 分页(nav > ul):上一页、页码、省略号、下一页,当前页带 aria-current=\"page\"。\n * 页码序列用 utils/data/pagination.ts(项数固定,翻页时按钮不跳动);按钮用 Button / IconButton,文案取语言包。\n *\n * <Pagination _page={page} total={320} pageSize={20} />\n * <Pagination page={page} pageCount={12} href={(n) => `/articles?page=${n}`} /> 渲染为链接(可分享、可被收录)\n */\nimport { ChevronLeft, ChevronRight, Ellipsis } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { Icon } from '../base/Icon';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { IconLinkButton, type IconLinkButtonProps } from '../base/IconLinkButton';\nimport { LinkButton, type LinkButtonProps } from '../base/LinkButton';\nimport { useLang } from '../config/context';\nimport { paginationItems } from '../utils/data/pagination';\nimport { mergeAttrs, mergePartProps, mergeProps, type PartProps } from '../utils/props';\nimport type { TextSize } from '../utils/style/typography';\nimport { clamp } from '../utils/data/number';\nimport { FlexList, type FlexProps } from '../layout/Flex';\nimport { t } from '../config/theme/tokens';\n\n/** 未声明的属性落到 nav 上;aria-label 默认取语言包(分页) */\nexport interface PaginationProps extends PartProps<'nav'> {\n /** 当前页,从 1 开始:父级写 _page={x} */\n _page?: number;\n /** 总页数;不写时按 total 与 pageSize 算 */\n pageCount?: number;\n /** 总条数:给了就能算页数,showTotal 时显示“共 n 条” */\n total?: number;\n /** 每页条数,默认 10 */\n pageSize?: number;\n /** 当前页左右各显示几页,默认 1 */\n siblings?: number;\n /** 首尾各固定显示几页,默认 1 */\n boundaries?: number;\n /** 显示总条数(需要 total) */\n showTotal?: boolean;\n /** 给了就渲染为链接:每页的地址 */\n href?: (page: number) => string;\n /** 字号档位,按钮随之缩放,默认 sm */\n size?: TextSize;\n /** 列表(ul)的部件属性 */\n propsList?: Partial<FlexProps<'ul'>>;\n /** 每一项(li,包着按钮或省略号)的部件属性 */\n propsItem?: PartProps<'li'>;\n /** 页码按钮的部件属性(按钮或链接按钮),可以按页计算 */\n propsPage?:\n | Partial<ButtonProps & LinkButtonProps>\n | ((page: number) => Partial<ButtonProps & LinkButtonProps>);\n /** 上一页、下一页按钮的部件属性(有 href 时是图标链接按钮) */\n propsStep?: Partial<IconButtonProps & IconLinkButtonProps>;\n /** 省略号的部件属性 */\n propsEllipsis?: PartProps<'span'>;\n /** 总条数文字的部件属性 */\n propsTotal?: PartProps<'span'>;\n}\n\n/** Pagination 的样式:root、list、page、ellipsis、total、tabular */\nexport const paginationStyles = css.create({\n root: { display: 'flex', alignItems: 'center', flexWrap: 'wrap', gap: '_md' },\n // 页码按钮等宽,翻页时位置不晃\n page: { minWidth: `max(${t.sizes.control}, ${t.sizes.minTarget})`, paddingInline: '_xs' },\n ellipsis: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: `max(${t.sizes.control}, ${t.sizes.minTarget})`,\n color: '_textMuted',\n },\n total: { color: '_textMuted' },\n tabular: { fontVariantNumeric: 'tabular-nums' },\n});\n\n/** 分页:上一页、页码、省略号、下一页 */\nexport const Pagination = _component(\n ({\n _page: page = _bindable(1),\n pageCount,\n total,\n pageSize = 10,\n siblings = 1,\n boundaries = 1,\n showTotal = false,\n href,\n size = 'sm',\n propsList,\n propsItem,\n propsPage,\n propsStep,\n propsEllipsis,\n propsTotal,\n ...rest\n }: PaginationProps) => {\n const lang = useLang();\n const count = _derived(Math.max(1, pageCount ?? Math.ceil((total ?? 0) / pageSize)));\n // 显示用的当前页:总数变少(筛选后)时父级的 page 可能超出范围,夹回去,不显示不存在的页\n const current = _derived(clamp(page, 1, count));\n\n function go(target: number) {\n page = clamp(target, 1, count);\n }\n\n /** 一个页码:当前页是实底,其余是 ghost;有 href 时是链接 */\n function pageButton(target: number) {\n const isCurrent = target === current;\n const own = typeof propsPage === 'function' ? propsPage(target) : propsPage;\n const shared = mergeProps<ButtonProps & LinkButtonProps>(\n {\n sx: [paginationStyles.page, paginationStyles.tabular],\n size,\n variant: isCurrent ? 'soft' : 'ghost',\n tone: isCurrent ? 'accent' : 'neutral',\n 'aria-label': lang.pageLabel(target),\n },\n own,\n { 'aria-current': isCurrent ? 'page' : undefined },\n );\n return href ? (\n <LinkButton\n {...mergePartProps<LinkButtonProps>(shared as LinkButtonProps, {\n href: href(target),\n onClick: () => go(target),\n })}\n >\n {target}\n </LinkButton>\n ) : (\n <Button\n {...mergePartProps<ButtonProps>(shared as ButtonProps, { onClick: () => go(target) })}\n >\n {target}\n </Button>\n );\n }\n\n /** 上一页、下一页:到头时不可用;有 href 时也是链接(rel=\"prev\" / \"next\"),与页码一样可分享 */\n function stepButton(direction: -1 | 1) {\n const target = current + direction;\n const disabled = target < 1 || target > count;\n const shared = {\n size,\n variant: 'ghost',\n tone: 'neutral',\n icon: direction < 0 ? ChevronLeft : ChevronRight,\n propsIcon: { flipInRtl: true },\n 'aria-label': direction < 0 ? lang.previousPage : lang.nextPage,\n } as const;\n return href ? (\n <IconLinkButton\n {...mergePartProps<IconLinkButtonProps>(\n { ...shared, href: href(disabled ? current : target) },\n propsStep,\n { disabled, rel: direction < 0 ? 'prev' : 'next', onClick: () => go(target) },\n )}\n />\n ) : (\n <IconButton\n {...mergePartProps<IconButtonProps>(shared, propsStep, {\n disabled,\n onClick: () => go(target),\n })}\n />\n );\n }\n\n return () => (\n <nav\n {...mergeAttrs<'nav'>({ sx: paginationStyles.root, 'aria-label': lang.pagination }, rest)}\n >\n <FlexList {...mergePartProps<FlexProps<'ul'>>({ align: 'center', gap: 'xs' }, propsList)}>\n <li {...mergeAttrs<'li'>({}, propsItem)}>{stepButton(-1)}</li>\n {paginationItems({ page: current, pageCount: count, siblings, boundaries }).map(\n (item) => (\n <li key={item} {...mergeAttrs<'li'>({}, propsItem)}>\n {typeof item === 'number' ? (\n pageButton(item)\n ) : (\n <span\n {...mergeAttrs<'span'>({ sx: paginationStyles.ellipsis }, propsEllipsis, {\n 'aria-hidden': true,\n })}\n >\n <Icon icon={Ellipsis} />\n </span>\n )}\n </li>\n ),\n )}\n <li {...mergeAttrs<'li'>({}, propsItem)}>{stepButton(1)}</li>\n </FlexList>\n {showTotal && total != null && (\n <span\n {...mergeAttrs<'span'>(\n { sx: [paginationStyles.total, paginationStyles.tabular] },\n propsTotal,\n )}\n >\n {lang.paginationTotal(total)}\n </span>\n )}\n </nav>\n );\n },\n);\n"],"mappings":"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"}
@@ -5,8 +5,8 @@ import { fontSizeStyles } from "../utils/style/typography.js";
5
5
  import { PageJump } from "./PageJump.js";
6
6
  import { PageSizeSelect } from "./PageSizeSelect.js";
7
7
  import { Pagination } from "./Pagination.js";
8
- import { computed, createVNode, mergeProps } from "vue";
9
- import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
8
+ import { computed, createVNode } from "vue";
9
+ import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
10
10
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
11
11
  //#region src/navigation/PaginationBar.tsx
12
12
  /** 当前页显示的是哪几条 */
@@ -80,17 +80,17 @@ var PaginationBar = /*#__PURE__*/ _component((_props, _ctx) => {
80
80
  return createVNode("span", mergeAttrs({ sx: paginationBarStyles.total }, propsTotal.value), [content]);
81
81
  }
82
82
  return () => createVNode("div", mergeAttrs({ sx: [paginationBarStyles.root, fontSizeStyles[size.value]] }, rest), [renderTotal(), createVNode("div", mergeAttrs({ sx: paginationBarStyles.controls }, propsControls.value), [
83
- createVNode(Pagination, mergeProps(mergePartProps({ size: size.value }, propsPagination.value), {
83
+ createVNode(Pagination, mergeJsxProps(mergePartProps({ size: size.value }, propsPagination.value), {
84
84
  "_page": page.value,
85
85
  "onUpdate:_page": _cache[0] || (_cache[0] = ($event) => page.value = $event),
86
86
  "total": total.value,
87
87
  "pageSize": pageSize.value
88
88
  }), null),
89
- showSizeSelect.value && createVNode(PageSizeSelect, mergeProps(mergePartProps({ options: pageSizeOptions.value }, propsSizeSelect.value, { onSizeChange: () => page.value = 1 }), {
89
+ showSizeSelect.value && createVNode(PageSizeSelect, mergeJsxProps(mergePartProps({ options: pageSizeOptions.value }, propsSizeSelect.value, { onSizeChange: () => page.value = 1 }), {
90
90
  "_value": pageSize.value,
91
91
  "onUpdate:_value": _cache[1] || (_cache[1] = ($event) => pageSize.value = $event)
92
92
  }), null),
93
- showJump.value && pageCount.value > 1 && createVNode(PageJump, mergeProps(mergePartProps({
93
+ showJump.value && pageCount.value > 1 && createVNode(PageJump, mergeJsxProps(mergePartProps({
94
94
  pageCount: pageCount.value,
95
95
  size: size.value,
96
96
  sx: paginationBarStyles.jump
@@ -1 +1 @@
1
- {"version":3,"file":"PaginationBar.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/navigation/PaginationBar.tsx"],"sourcesContent":["/**\n * 分页栏:表格、列表下方的一整行,起始边是“第 1–20 条,共 320 条”,结束边是页码、每页条数、跳页。\n * 拼的是 Pagination、PageSizeSelect、PageJump,换每页条数时回到第 1 页。\n *\n * <PaginationBar _page={page} _pageSize={size} total={320} />\n * <PaginationBar _page={tasks.page} _pageSize={tasks.pageSize} total={tasks.total} /> 接 useTableQuery\n *\n * 占满所在的行;窄于 36em 时不显示跳页,窄于 24em 时总数单独一行。只要其中几样时用 showTotal / showSizeSelect / showJump 关掉,\n * 或者直接并排三个组件。\n *\n * 部件:Root(div)、Total(span)、Controls(div)、Pagination、SizeSelect(PageSizeSelect)、Jump(PageJump)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { clamp } from '../utils/data/number';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\nimport { PageJump, type PageJumpProps } from './PageJump';\nimport { PageSizeSelect, type PageSizeSelectProps } from './PageSizeSelect';\nimport { Pagination, type PaginationProps } from './Pagination';\n\n/** 当前页显示的是哪几条 */\nexport interface PageRange {\n /** 第一条的序号,从 1 开始;没有数据时是 0 */\n from: number;\n /** 最后一条的序号 */\n to: number;\n /** 总条数 */\n total: number;\n}\n\n/** 未声明的属性落到外层 div 上;分页导航的名称用 propsPagination 的 aria-label */\nexport interface PaginationBarProps extends PartProps<'div'> {\n /** 当前页,从 1 开始:父级写 _page={x} */\n _page?: number;\n /** 每页条数:父级写 _pageSize={x},默认 10 */\n _pageSize?: number;\n /** 总条数 */\n total: number;\n /** 每页条数的选项,默认 [10, 20, 50, 100] */\n pageSizeOptions?: readonly number[];\n /** 起始边的总数:默认 true(“第 1–20 条,共 320 条”),也可以给函数自己写 */\n showTotal?: boolean | ((range: PageRange) => VNodeChild);\n /** 每页条数选择,默认 true */\n showSizeSelect?: boolean;\n /** 跳页,默认 true(窄于 36em 时不显示) */\n showJump?: boolean;\n /** 字号档位,各部分随之缩放,默认 sm */\n size?: TextSize;\n /** 总数文字的部件属性 */\n propsTotal?: PartProps<'span'>;\n /** 结束边那一组(页码、条数、跳页)的部件属性 */\n propsControls?: PartProps<'div'>;\n /** 页码(Pagination)的部件属性 */\n propsPagination?: Partial<PaginationProps>;\n /** 每页条数(PageSizeSelect)的部件属性 */\n propsSizeSelect?: Partial<PageSizeSelectProps>;\n /** 跳页(PageJump)的部件属性 */\n propsJump?: Partial<PageJumpProps>;\n}\n\n/** PaginationBar 的样式:root、total、controls、jump */\nexport const paginationBarStyles = css.create({\n // 按自己的宽度决定显示什么:放在侧栏、卡片里时也合适\n root: {\n containerType: 'inline-size',\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'space-between',\n rowGap: '_sm',\n columnGap: '_md',\n },\n total: {\n flexBasis: { default: 'auto', '@container (max-width: 24em)': '100%' },\n color: '_textMuted',\n fontVariantNumeric: 'tabular-nums',\n },\n controls: {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n rowGap: '_sm',\n columnGap: '_md',\n marginInlineStart: 'auto',\n },\n jump: { display: { default: 'inline-flex', '@container (max-width: 36em)': 'none' } },\n});\n\n/** 分页栏:总数、页码、每页条数、跳页 */\nexport const PaginationBar = _component(\n ({\n _page: page = _bindable(1),\n _pageSize: pageSize = _bindable(10),\n total,\n pageSizeOptions,\n showTotal = true,\n showSizeSelect = true,\n showJump = true,\n size = 'sm',\n propsTotal,\n propsControls,\n propsPagination,\n propsSizeSelect,\n propsJump,\n ...rest\n }: PaginationBarProps) => {\n const lang = useLang();\n const pageCount = _derived(Math.max(1, Math.ceil(total / pageSize)));\n // 总数变少(筛选后)时父级的 page 可能超出范围:显示时夹回去,同 Pagination\n const range = _derived.by((): PageRange => {\n const current = clamp(page, 1, pageCount);\n return total === 0\n ? { from: 0, to: 0, total }\n : {\n from: (current - 1) * pageSize + 1,\n to: Math.min(current * pageSize, total),\n total,\n };\n });\n\n function renderTotal() {\n if (!showTotal) return null;\n const content =\n typeof showTotal === 'function'\n ? showTotal(range)\n : range.total === 0\n ? lang.paginationTotal(0)\n : lang.paginationRange(range.from, range.to, range.total);\n return (\n <span {...mergeAttrs<'span'>({ sx: paginationBarStyles.total }, propsTotal)}>\n {content}\n </span>\n );\n }\n\n return () => (\n <div {...mergeAttrs<'div'>({ sx: [paginationBarStyles.root, fontSizeStyles[size]] }, rest)}>\n {renderTotal()}\n <div {...mergeAttrs<'div'>({ sx: paginationBarStyles.controls }, propsControls)}>\n <Pagination\n {...mergePartProps<PaginationProps>({ size }, propsPagination)}\n _page={page}\n total={total}\n pageSize={pageSize}\n />\n {showSizeSelect && (\n <PageSizeSelect\n {...mergePartProps<PageSizeSelectProps>(\n { options: pageSizeOptions },\n propsSizeSelect,\n { onSizeChange: () => (page = 1) },\n )}\n _value={pageSize}\n />\n )}\n {showJump && pageCount > 1 && (\n <PageJump\n {...mergePartProps<PageJumpProps>(\n { pageCount, size, sx: paginationBarStyles.jump },\n propsJump,\n )}\n _page={page}\n />\n )}\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"PaginationBar.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/navigation/PaginationBar.tsx"],"sourcesContent":["/**\n * 分页栏:表格、列表下方的一整行,起始边是“第 1–20 条,共 320 条”,结束边是页码、每页条数、跳页。\n * 拼的是 Pagination、PageSizeSelect、PageJump,换每页条数时回到第 1 页。\n *\n * <PaginationBar _page={page} _pageSize={size} total={320} />\n * <PaginationBar _page={tasks.page} _pageSize={tasks.pageSize} total={tasks.total} /> 接 useTableQuery\n *\n * 占满所在的行;窄于 36em 时不显示跳页,窄于 24em 时总数单独一行。只要其中几样时用 showTotal / showSizeSelect / showJump 关掉,\n * 或者直接并排三个组件。\n *\n * 部件:Root(div)、Total(span)、Controls(div)、Pagination、SizeSelect(PageSizeSelect)、Jump(PageJump)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { clamp } from '../utils/data/number';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\nimport { PageJump, type PageJumpProps } from './PageJump';\nimport { PageSizeSelect, type PageSizeSelectProps } from './PageSizeSelect';\nimport { Pagination, type PaginationProps } from './Pagination';\n\n/** 当前页显示的是哪几条 */\nexport interface PageRange {\n /** 第一条的序号,从 1 开始;没有数据时是 0 */\n from: number;\n /** 最后一条的序号 */\n to: number;\n /** 总条数 */\n total: number;\n}\n\n/** 未声明的属性落到外层 div 上;分页导航的名称用 propsPagination 的 aria-label */\nexport interface PaginationBarProps extends PartProps<'div'> {\n /** 当前页,从 1 开始:父级写 _page={x} */\n _page?: number;\n /** 每页条数:父级写 _pageSize={x},默认 10 */\n _pageSize?: number;\n /** 总条数 */\n total: number;\n /** 每页条数的选项,默认 [10, 20, 50, 100] */\n pageSizeOptions?: readonly number[];\n /** 起始边的总数:默认 true(“第 1–20 条,共 320 条”),也可以给函数自己写 */\n showTotal?: boolean | ((range: PageRange) => VNodeChild);\n /** 每页条数选择,默认 true */\n showSizeSelect?: boolean;\n /** 跳页,默认 true(窄于 36em 时不显示) */\n showJump?: boolean;\n /** 字号档位,各部分随之缩放,默认 sm */\n size?: TextSize;\n /** 总数文字的部件属性 */\n propsTotal?: PartProps<'span'>;\n /** 结束边那一组(页码、条数、跳页)的部件属性 */\n propsControls?: PartProps<'div'>;\n /** 页码(Pagination)的部件属性 */\n propsPagination?: Partial<PaginationProps>;\n /** 每页条数(PageSizeSelect)的部件属性 */\n propsSizeSelect?: Partial<PageSizeSelectProps>;\n /** 跳页(PageJump)的部件属性 */\n propsJump?: Partial<PageJumpProps>;\n}\n\n/** PaginationBar 的样式:root、total、controls、jump */\nexport const paginationBarStyles = css.create({\n // 按自己的宽度决定显示什么:放在侧栏、卡片里时也合适\n root: {\n containerType: 'inline-size',\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n justifyContent: 'space-between',\n rowGap: '_sm',\n columnGap: '_md',\n },\n total: {\n flexBasis: { default: 'auto', '@container (max-width: 24em)': '100%' },\n color: '_textMuted',\n fontVariantNumeric: 'tabular-nums',\n },\n controls: {\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n rowGap: '_sm',\n columnGap: '_md',\n marginInlineStart: 'auto',\n },\n jump: { display: { default: 'inline-flex', '@container (max-width: 36em)': 'none' } },\n});\n\n/** 分页栏:总数、页码、每页条数、跳页 */\nexport const PaginationBar = _component(\n ({\n _page: page = _bindable(1),\n _pageSize: pageSize = _bindable(10),\n total,\n pageSizeOptions,\n showTotal = true,\n showSizeSelect = true,\n showJump = true,\n size = 'sm',\n propsTotal,\n propsControls,\n propsPagination,\n propsSizeSelect,\n propsJump,\n ...rest\n }: PaginationBarProps) => {\n const lang = useLang();\n const pageCount = _derived(Math.max(1, Math.ceil(total / pageSize)));\n // 总数变少(筛选后)时父级的 page 可能超出范围:显示时夹回去,同 Pagination\n const range = _derived.by((): PageRange => {\n const current = clamp(page, 1, pageCount);\n return total === 0\n ? { from: 0, to: 0, total }\n : {\n from: (current - 1) * pageSize + 1,\n to: Math.min(current * pageSize, total),\n total,\n };\n });\n\n function renderTotal() {\n if (!showTotal) return null;\n const content =\n typeof showTotal === 'function'\n ? showTotal(range)\n : range.total === 0\n ? lang.paginationTotal(0)\n : lang.paginationRange(range.from, range.to, range.total);\n return (\n <span {...mergeAttrs<'span'>({ sx: paginationBarStyles.total }, propsTotal)}>\n {content}\n </span>\n );\n }\n\n return () => (\n <div {...mergeAttrs<'div'>({ sx: [paginationBarStyles.root, fontSizeStyles[size]] }, rest)}>\n {renderTotal()}\n <div {...mergeAttrs<'div'>({ sx: paginationBarStyles.controls }, propsControls)}>\n <Pagination\n {...mergePartProps<PaginationProps>({ size }, propsPagination)}\n _page={page}\n total={total}\n pageSize={pageSize}\n />\n {showSizeSelect && (\n <PageSizeSelect\n {...mergePartProps<PageSizeSelectProps>(\n { options: pageSizeOptions },\n propsSizeSelect,\n { onSizeChange: () => (page = 1) },\n )}\n _value={pageSize}\n />\n )}\n {showJump && pageCount > 1 && (\n <PageJump\n {...mergePartProps<PageJumpProps>(\n { pageCount, size, sx: paginationBarStyles.jump },\n propsJump,\n )}\n _page={page}\n />\n )}\n </div>\n </div>\n );\n },\n);\n"],"mappings":"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"}
@@ -9,8 +9,8 @@ import { ButtonBase } from "../base/ButtonBase.js";
9
9
  import { useRouterLink } from "../utils/dom/link.js";
10
10
  import { statusIcons } from "../utils/style/tone-styles.js";
11
11
  import { FlexOrderedList } from "../layout/Flex.js";
12
- import { createVNode, isVNode, mergeProps } from "vue";
13
- import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
12
+ import { createVNode, isVNode } from "vue";
13
+ import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
14
14
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
15
15
  import { Check } from "@lucide/icons";
16
16
  //#region src/navigation/Steps.tsx
@@ -146,7 +146,7 @@ var Steps = /*#__PURE__*/ _component((_props, _ctx) => {
146
146
  return () => {
147
147
  let _slot2;
148
148
  const vertical = orientation.value === "vertical";
149
- return createVNode(FlexOrderedList, mergeProps(mergePartProps({
149
+ return createVNode(FlexOrderedList, mergeJsxProps(mergePartProps({
150
150
  direction: vertical ? "column" : "row",
151
151
  gap: vertical ? "lg" : "sm",
152
152
  sx: size.value && fontSizeStyles[size.value]
@@ -161,7 +161,7 @@ var Steps = /*#__PURE__*/ _component((_props, _ctx) => {
161
161
  const reachable = state === "complete" && !item.disabled;
162
162
  const link = reachable && item.href != null;
163
163
  const button = reachable && !link && navigable.value;
164
- return createVNode("li", mergeProps({ "key": item.key ?? index }, mergeAttrs({ sx: [stepsStyles.item, vertical && stepsStyles.itemVertical] }, own, { "aria-current": state === "current" ? "step" : void 0 }), { "data-state": state }), [link ? createVNode("a", mergeAttrs({ sx: [
164
+ return createVNode("li", mergeJsxProps({ "key": item.key ?? index }, mergeAttrs({ sx: [stepsStyles.item, vertical && stepsStyles.itemVertical] }, own, { "aria-current": state === "current" ? "step" : void 0 }), { "data-state": state }), [link ? createVNode("a", mergeAttrs({ sx: [
165
165
  stepsStyles.trigger,
166
166
  stepsStyles.link,
167
167
  focusRingStyles.visible