@zerodep-dev/vue-tsx-pro-ui 0.1.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 (470) 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/code-editor/CodeEditor.d.ts +18 -0
  62. package/dist/code-editor/CodeEditor.js +57 -0
  63. package/dist/code-editor/CodeEditor.js.map +1 -0
  64. package/dist/code-editor/editor.d.ts +52 -0
  65. package/dist/code-editor/editor.js +225 -0
  66. package/dist/code-editor/editor.js.map +1 -0
  67. package/dist/code-editor/index.d.ts +9 -0
  68. package/dist/code-editor/index.js +3 -0
  69. package/dist/config/Provider.d.ts +3 -1
  70. package/dist/config/Provider.js +9 -4
  71. package/dist/config/Provider.js.map +1 -1
  72. package/dist/config/context.d.ts +18 -0
  73. package/dist/config/context.js +16 -1
  74. package/dist/config/context.js.map +1 -1
  75. package/dist/config/createUi.d.ts +20 -3
  76. package/dist/config/createUi.js +80 -49
  77. package/dist/config/createUi.js.map +1 -1
  78. package/dist/config/lang/en-US.js +21 -3
  79. package/dist/config/lang/en-US.js.map +1 -1
  80. package/dist/config/lang/format.d.ts +2 -1
  81. package/dist/config/lang/format.js +9 -2
  82. package/dist/config/lang/format.js.map +1 -1
  83. package/dist/config/lang/lang.d.ts +19 -6
  84. package/dist/config/lang/lang.js +11 -2
  85. package/dist/config/lang/lang.js.map +1 -1
  86. package/dist/config/lang/zh-CN.js +21 -3
  87. package/dist/config/lang/zh-CN.js.map +1 -1
  88. package/dist/config/layout/preference.d.ts +43 -0
  89. package/dist/config/layout/preference.js +108 -0
  90. package/dist/config/layout/preference.js.map +1 -0
  91. package/dist/date/Calendar.js +3 -3
  92. package/dist/date/Calendar.js.map +1 -1
  93. package/dist/date/CalendarBoard.js +9 -9
  94. package/dist/date/CalendarBoard.js.map +1 -1
  95. package/dist/date/CalendarView.js +7 -7
  96. package/dist/date/CalendarView.js.map +1 -1
  97. package/dist/date/DateField.js +3 -3
  98. package/dist/date/DateField.js.map +1 -1
  99. package/dist/date/DatePicker.js +5 -5
  100. package/dist/date/DatePicker.js.map +1 -1
  101. package/dist/date/DateRangePicker.js +5 -5
  102. package/dist/date/DateRangePicker.js.map +1 -1
  103. package/dist/date/DateSegmentGroup.js +5 -5
  104. package/dist/date/DateSegmentGroup.js.map +1 -1
  105. package/dist/date/QuarterCalendar.js +6 -6
  106. package/dist/date/QuarterCalendar.js.map +1 -1
  107. package/dist/date/RangeCalendar.js +3 -3
  108. package/dist/date/RangeCalendar.js.map +1 -1
  109. package/dist/date/SegmentedField.js +3 -3
  110. package/dist/date/SegmentedField.js.map +1 -1
  111. package/dist/date/TimeField.js +3 -3
  112. package/dist/date/TimeField.js.map +1 -1
  113. package/dist/date/TimePicker.js +4 -4
  114. package/dist/date/TimePicker.js.map +1 -1
  115. package/dist/date/date-segments.js +1 -1
  116. package/dist/date/date-segments.js.map +1 -1
  117. package/dist/date/picker-popover.js +3 -2
  118. package/dist/date/picker-popover.js.map +1 -1
  119. package/dist/diagram/Diagram.js +12 -12
  120. package/dist/diagram/Diagram.js.map +1 -1
  121. package/dist/diagram/DiagramLanes.js +3 -3
  122. package/dist/diagram/DiagramLanes.js.map +1 -1
  123. package/dist/diagram/DiagramMinimap.js +4 -4
  124. package/dist/diagram/DiagramMinimap.js.map +1 -1
  125. package/dist/diagram/index.d.ts +2 -1
  126. package/dist/diagram/index.js +2 -1
  127. package/dist/diagram/layout.d.ts +57 -0
  128. package/dist/diagram/layout.js +50 -0
  129. package/dist/diagram/layout.js.map +1 -0
  130. package/dist/display/Accordion.js +6 -6
  131. package/dist/display/Accordion.js.map +1 -1
  132. package/dist/display/AnimatedNumber.js +4 -4
  133. package/dist/display/AnimatedNumber.js.map +1 -1
  134. package/dist/display/Avatar.js +4 -4
  135. package/dist/display/Avatar.js.map +1 -1
  136. package/dist/display/Checklist.js +7 -7
  137. package/dist/display/Checklist.js.map +1 -1
  138. package/dist/display/Collapse.js +8 -5
  139. package/dist/display/Collapse.js.map +1 -1
  140. package/dist/display/Collapsible.js +3 -3
  141. package/dist/display/Collapsible.js.map +1 -1
  142. package/dist/display/Descriptions.js +5 -5
  143. package/dist/display/Descriptions.js.map +1 -1
  144. package/dist/display/Ellipsis.js +3 -3
  145. package/dist/display/Ellipsis.js.map +1 -1
  146. package/dist/display/FieldCompare.js +4 -4
  147. package/dist/display/FieldCompare.js.map +1 -1
  148. package/dist/display/Gauge.js +11 -11
  149. package/dist/display/Gauge.js.map +1 -1
  150. package/dist/display/Image.js +4 -4
  151. package/dist/display/Image.js.map +1 -1
  152. package/dist/display/Marquee.js +3 -3
  153. package/dist/display/Marquee.js.map +1 -1
  154. package/dist/display/ProportionBar.js +4 -4
  155. package/dist/display/ProportionBar.js.map +1 -1
  156. package/dist/display/Sortable.js +4 -4
  157. package/dist/display/Sortable.js.map +1 -1
  158. package/dist/display/Sparkline.js +6 -6
  159. package/dist/display/Sparkline.js.map +1 -1
  160. package/dist/display/Stat.js +3 -3
  161. package/dist/display/Stat.js.map +1 -1
  162. package/dist/display/Timeline.js +7 -7
  163. package/dist/display/Timeline.js.map +1 -1
  164. package/dist/display/Tree.js +10 -10
  165. package/dist/display/Tree.js.map +1 -1
  166. package/dist/display/VirtualList.js +7 -7
  167. package/dist/display/VirtualList.js.map +1 -1
  168. package/dist/display/Watermark.js +3 -3
  169. package/dist/display/Watermark.js.map +1 -1
  170. package/dist/docs-kit/CodeGroup.js +5 -5
  171. package/dist/docs-kit/CodeGroup.js.map +1 -1
  172. package/dist/docs-kit/CodePreview.js +6 -6
  173. package/dist/docs-kit/CodePreview.js.map +1 -1
  174. package/dist/docs-kit/PropsTable.js +4 -4
  175. package/dist/docs-kit/PropsTable.js.map +1 -1
  176. package/dist/feedback/Alert.js +5 -5
  177. package/dist/feedback/Alert.js.map +1 -1
  178. package/dist/feedback/Banner.js +5 -5
  179. package/dist/feedback/Banner.js.map +1 -1
  180. package/dist/feedback/Empty.js +4 -4
  181. package/dist/feedback/Empty.js.map +1 -1
  182. package/dist/feedback/LoadingBar.js +20 -13
  183. package/dist/feedback/LoadingBar.js.map +1 -1
  184. package/dist/feedback/LoadingOverlay.js +3 -3
  185. package/dist/feedback/LoadingOverlay.js.map +1 -1
  186. package/dist/feedback/Progress.js +14 -14
  187. package/dist/feedback/Progress.js.map +1 -1
  188. package/dist/feedback/Result.js +4 -4
  189. package/dist/feedback/Result.js.map +1 -1
  190. package/dist/feedback/SkeletonText.js +3 -3
  191. package/dist/feedback/SkeletonText.js.map +1 -1
  192. package/dist/feedback/Toast.js +6 -6
  193. package/dist/feedback/Toast.js.map +1 -1
  194. package/dist/form/Field.d.ts +7 -0
  195. package/dist/form/Field.js +20 -9
  196. package/dist/form/Field.js.map +1 -1
  197. package/dist/form/Form.js +3 -3
  198. package/dist/form/Form.js.map +1 -1
  199. package/dist/form/FormErrorSummary.js +3 -3
  200. package/dist/form/FormErrorSummary.js.map +1 -1
  201. package/dist/form/FormSection.js +6 -6
  202. package/dist/form/FormSection.js.map +1 -1
  203. package/dist/form/useForm.d.ts +4 -1
  204. package/dist/form/useForm.js +35 -13
  205. package/dist/form/useForm.js.map +1 -1
  206. package/dist/index.d.ts +18 -10
  207. package/dist/index.js +17 -9
  208. package/dist/input/Autocomplete.js +3 -3
  209. package/dist/input/Autocomplete.js.map +1 -1
  210. package/dist/input/Cascader.js +7 -7
  211. package/dist/input/Cascader.js.map +1 -1
  212. package/dist/input/CharacterCount.js +3 -3
  213. package/dist/input/CharacterCount.js.map +1 -1
  214. package/dist/input/Checkbox.js +5 -5
  215. package/dist/input/Checkbox.js.map +1 -1
  216. package/dist/input/ColorField.js +4 -4
  217. package/dist/input/ColorField.js.map +1 -1
  218. package/dist/input/Combobox.js +5 -5
  219. package/dist/input/Combobox.js.map +1 -1
  220. package/dist/input/ConditionBuilder.js +15 -14
  221. package/dist/input/ConditionBuilder.js.map +1 -1
  222. package/dist/input/FileDrop.js +3 -3
  223. package/dist/input/FileDrop.js.map +1 -1
  224. package/dist/input/Listbox.js +9 -9
  225. package/dist/input/Listbox.js.map +1 -1
  226. package/dist/input/Mentions.js +4 -4
  227. package/dist/input/Mentions.js.map +1 -1
  228. package/dist/input/NumberField.js +3 -3
  229. package/dist/input/NumberField.js.map +1 -1
  230. package/dist/input/NumberRangeField.js +5 -5
  231. package/dist/input/NumberRangeField.js.map +1 -1
  232. package/dist/input/OtpField.js +5 -5
  233. package/dist/input/OtpField.js.map +1 -1
  234. package/dist/input/PeoplePicker.js +6 -6
  235. package/dist/input/PeoplePicker.js.map +1 -1
  236. package/dist/input/PeoplePickerPanel.js +15 -15
  237. package/dist/input/PeoplePickerPanel.js.map +1 -1
  238. package/dist/input/Radio.js +4 -4
  239. package/dist/input/Radio.js.map +1 -1
  240. package/dist/input/Rating.js +5 -5
  241. package/dist/input/Rating.js.map +1 -1
  242. package/dist/input/Select.js +5 -5
  243. package/dist/input/Select.js.map +1 -1
  244. package/dist/input/SelectedTags.js +4 -4
  245. package/dist/input/SelectedTags.js.map +1 -1
  246. package/dist/input/Slider.js +6 -6
  247. package/dist/input/Slider.js.map +1 -1
  248. package/dist/input/Switch.js +3 -3
  249. package/dist/input/Switch.js.map +1 -1
  250. package/dist/input/TagsInput.js +5 -5
  251. package/dist/input/TagsInput.js.map +1 -1
  252. package/dist/input/TextField.js +5 -5
  253. package/dist/input/TextField.js.map +1 -1
  254. package/dist/input/Textarea.js +4 -4
  255. package/dist/input/Textarea.js.map +1 -1
  256. package/dist/input/ToggleGroup.js +4 -4
  257. package/dist/input/ToggleGroup.js.map +1 -1
  258. package/dist/input/Transfer.js +8 -8
  259. package/dist/input/Transfer.js.map +1 -1
  260. package/dist/input/TreeSelect.js +7 -7
  261. package/dist/input/TreeSelect.js.map +1 -1
  262. package/dist/input/Upload.js +10 -9
  263. package/dist/input/Upload.js.map +1 -1
  264. package/dist/input/condition.d.ts +1 -1
  265. package/dist/input/condition.js +32 -14
  266. package/dist/input/condition.js.map +1 -1
  267. package/dist/input/people.d.ts +15 -14
  268. package/dist/input/people.js +5 -5
  269. package/dist/input/people.js.map +1 -1
  270. package/dist/input/remote-items.d.ts +4 -2
  271. package/dist/input/remote-items.js +7 -2
  272. package/dist/input/remote-items.js.map +1 -1
  273. package/dist/layout/Affix.js +4 -4
  274. package/dist/layout/Affix.js.map +1 -1
  275. package/dist/layout/ResizeHandle.d.ts +6 -2
  276. package/dist/layout/ResizeHandle.js +32 -9
  277. package/dist/layout/ResizeHandle.js.map +1 -1
  278. package/dist/layout/ScrollArea.js +3 -3
  279. package/dist/layout/ScrollArea.js.map +1 -1
  280. package/dist/layout/Separator.js +3 -3
  281. package/dist/layout/Separator.js.map +1 -1
  282. package/dist/layout/Splitter.js +3 -3
  283. package/dist/layout/Splitter.js.map +1 -1
  284. package/dist/layout/ViewportFill.d.ts +2 -2
  285. package/dist/layout/ViewportFill.js +4 -4
  286. package/dist/layout/ViewportFill.js.map +1 -1
  287. package/dist/navigation/Breadcrumbs.js +4 -4
  288. package/dist/navigation/Breadcrumbs.js.map +1 -1
  289. package/dist/navigation/NavBar.js +6 -6
  290. package/dist/navigation/NavBar.js.map +1 -1
  291. package/dist/navigation/NavList.d.ts +1 -0
  292. package/dist/navigation/NavList.js +20 -12
  293. package/dist/navigation/NavList.js.map +1 -1
  294. package/dist/navigation/NavMenu.d.ts +27 -0
  295. package/dist/navigation/NavMenu.js +54 -0
  296. package/dist/navigation/NavMenu.js.map +1 -0
  297. package/dist/navigation/PageJump.js +3 -3
  298. package/dist/navigation/PageJump.js.map +1 -1
  299. package/dist/navigation/PageSizeSelect.js +4 -4
  300. package/dist/navigation/PageSizeSelect.js.map +1 -1
  301. package/dist/navigation/Pagination.js +6 -6
  302. package/dist/navigation/Pagination.js.map +1 -1
  303. package/dist/navigation/PaginationBar.js +5 -5
  304. package/dist/navigation/PaginationBar.js.map +1 -1
  305. package/dist/navigation/Steps.js +4 -4
  306. package/dist/navigation/Steps.js.map +1 -1
  307. package/dist/navigation/TableOfContents.js +5 -5
  308. package/dist/navigation/TableOfContents.js.map +1 -1
  309. package/dist/navigation/Tabs.js +7 -7
  310. package/dist/navigation/Tabs.js.map +1 -1
  311. package/dist/navigation/Toolbar.js +3 -3
  312. package/dist/navigation/Toolbar.js.map +1 -1
  313. package/dist/overlay/AlertDialog.js +4 -4
  314. package/dist/overlay/AlertDialog.js.map +1 -1
  315. package/dist/overlay/CommandPalette.js +4 -4
  316. package/dist/overlay/CommandPalette.js.map +1 -1
  317. package/dist/overlay/ContextMenu.js +3 -3
  318. package/dist/overlay/ContextMenu.js.map +1 -1
  319. package/dist/overlay/Dialog.js +4 -4
  320. package/dist/overlay/Dialog.js.map +1 -1
  321. package/dist/overlay/Drawer.js +5 -5
  322. package/dist/overlay/Drawer.js.map +1 -1
  323. package/dist/overlay/HoverCard.js +5 -3
  324. package/dist/overlay/HoverCard.js.map +1 -1
  325. package/dist/overlay/Lightbox.js +5 -5
  326. package/dist/overlay/Lightbox.js.map +1 -1
  327. package/dist/overlay/Menu.js +7 -7
  328. package/dist/overlay/Menu.js.map +1 -1
  329. package/dist/overlay/ModalCore.js +9 -9
  330. package/dist/overlay/ModalCore.js.map +1 -1
  331. package/dist/overlay/Popconfirm.js +6 -6
  332. package/dist/overlay/Popconfirm.js.map +1 -1
  333. package/dist/overlay/Popover.js +5 -3
  334. package/dist/overlay/Popover.js.map +1 -1
  335. package/dist/overlay/Tooltip.js +5 -3
  336. package/dist/overlay/Tooltip.js.map +1 -1
  337. package/dist/overlay/Tour.js +8 -8
  338. package/dist/overlay/Tour.js.map +1 -1
  339. package/dist/overlay/detached.d.ts +2 -0
  340. package/dist/overlay/detached.js +73 -42
  341. package/dist/overlay/detached.js.map +1 -1
  342. package/dist/patterns/ActionBar.js +3 -3
  343. package/dist/patterns/ActionBar.js.map +1 -1
  344. package/dist/patterns/AppShell.d.ts +28 -1
  345. package/dist/patterns/AppShell.js +158 -52
  346. package/dist/patterns/AppShell.js.map +1 -1
  347. package/dist/patterns/AuthLayout.d.ts +28 -0
  348. package/dist/patterns/AuthLayout.js +77 -0
  349. package/dist/patterns/AuthLayout.js.map +1 -0
  350. package/dist/patterns/CommentThread.js +9 -9
  351. package/dist/patterns/CommentThread.js.map +1 -1
  352. package/dist/patterns/DataImport.js +4 -4
  353. package/dist/patterns/DataImport.js.map +1 -1
  354. package/dist/patterns/DeadlineBadge.js +3 -3
  355. package/dist/patterns/DeadlineBadge.js.map +1 -1
  356. package/dist/patterns/FilterBar.d.ts +11 -1
  357. package/dist/patterns/FilterBar.js +39 -10
  358. package/dist/patterns/FilterBar.js.map +1 -1
  359. package/dist/patterns/FormDialog.d.ts +18 -0
  360. package/dist/patterns/FormDialog.js +46 -0
  361. package/dist/patterns/FormDialog.js.map +1 -0
  362. package/dist/patterns/KanbanBoard.js +8 -8
  363. package/dist/patterns/KanbanBoard.js.map +1 -1
  364. package/dist/patterns/LayoutSwitcher.d.ts +12 -0
  365. package/dist/patterns/LayoutSwitcher.js +79 -0
  366. package/dist/patterns/LayoutSwitcher.js.map +1 -0
  367. package/dist/patterns/NotificationCenter.js +8 -8
  368. package/dist/patterns/NotificationCenter.js.map +1 -1
  369. package/dist/patterns/PageTabs.d.ts +12 -7
  370. package/dist/patterns/PageTabs.js +41 -29
  371. package/dist/patterns/PageTabs.js.map +1 -1
  372. package/dist/patterns/QueryTable.d.ts +10 -1
  373. package/dist/patterns/QueryTable.js +128 -68
  374. package/dist/patterns/QueryTable.js.map +1 -1
  375. package/dist/patterns/SlideCaptcha.d.ts +80 -0
  376. package/dist/patterns/SlideCaptcha.js +354 -0
  377. package/dist/patterns/SlideCaptcha.js.map +1 -0
  378. package/dist/patterns/StepsForm.js +7 -7
  379. package/dist/patterns/StepsForm.js.map +1 -1
  380. package/dist/patterns/ThemeSwitcher.js +3 -3
  381. package/dist/patterns/ThemeSwitcher.js.map +1 -1
  382. package/dist/patterns/index.d.ts +7 -3
  383. package/dist/patterns/index.js +5 -1
  384. package/dist/patterns/messages.d.ts +39 -1
  385. package/dist/patterns/messages.js +40 -2
  386. package/dist/patterns/messages.js.map +1 -1
  387. package/dist/table/ColumnHeaderActions.js +3 -3
  388. package/dist/table/ColumnHeaderActions.js.map +1 -1
  389. package/dist/table/ColumnResizer.js +3 -3
  390. package/dist/table/ColumnResizer.js.map +1 -1
  391. package/dist/table/ColumnSettings.js +5 -5
  392. package/dist/table/ColumnSettings.js.map +1 -1
  393. package/dist/table/ColumnTable.js +8 -8
  394. package/dist/table/ColumnTable.js.map +1 -1
  395. package/dist/table/DataTable.js +8 -8
  396. package/dist/table/DataTable.js.map +1 -1
  397. package/dist/table/DataTableView.js +21 -21
  398. package/dist/table/DataTableView.js.map +1 -1
  399. package/dist/table/PivotTable.js +3 -3
  400. package/dist/table/PivotTable.js.map +1 -1
  401. package/dist/table/SelectionBar.js +4 -4
  402. package/dist/table/SelectionBar.js.map +1 -1
  403. package/dist/table/TreeDataTable.js +5 -5
  404. package/dist/table/TreeDataTable.js.map +1 -1
  405. package/dist/theme-customize/ThemeCustomizer.js +7 -6
  406. package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
  407. package/dist/theme-customize/ThemeThumbnail.js +3 -3
  408. package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
  409. package/dist/three/background/AuroraBackground.js +3 -3
  410. package/dist/three/background/AuroraBackground.js.map +1 -1
  411. package/dist/three/background/MeshGradient.js +3 -3
  412. package/dist/three/background/MeshGradient.js.map +1 -1
  413. package/dist/three/background/ShaderBackground.js +3 -3
  414. package/dist/three/background/ShaderBackground.js.map +1 -1
  415. package/dist/three/core/EffectSurface.js +3 -3
  416. package/dist/three/core/EffectSurface.js.map +1 -1
  417. package/dist/three/core/ThreeCanvas.js +4 -4
  418. package/dist/three/core/ThreeCanvas.js.map +1 -1
  419. package/dist/three/effects/Confetti.js +3 -3
  420. package/dist/three/effects/Confetti.js.map +1 -1
  421. package/dist/three/effects/ParticleField.js +3 -3
  422. package/dist/three/effects/ParticleField.js.map +1 -1
  423. package/dist/three/effects/WaveGrid.js +3 -3
  424. package/dist/three/effects/WaveGrid.js.map +1 -1
  425. package/dist/three/globe/Globe.js +3 -3
  426. package/dist/three/globe/Globe.js.map +1 -1
  427. package/dist/three/model/ModelViewer.js +3 -3
  428. package/dist/three/model/ModelViewer.js.map +1 -1
  429. package/dist/utils/data/clone.d.ts +8 -0
  430. package/dist/utils/data/clone.js +21 -0
  431. package/dist/utils/data/clone.js.map +1 -0
  432. package/dist/utils/data/date.d.ts +10 -0
  433. package/dist/utils/data/date.js +13 -1
  434. package/dist/utils/data/date.js.map +1 -1
  435. package/dist/utils/data/number.d.ts +5 -0
  436. package/dist/utils/data/number.js +8 -1
  437. package/dist/utils/data/number.js.map +1 -1
  438. package/dist/utils/data/numeric.d.ts +7 -0
  439. package/dist/utils/data/numeric.js +46 -1
  440. package/dist/utils/data/numeric.js.map +1 -1
  441. package/dist/utils/dom/download.d.ts +8 -1
  442. package/dist/utils/dom/download.js +19 -2
  443. package/dist/utils/dom/download.js.map +1 -1
  444. package/dist/utils/dom/element.d.ts +3 -1
  445. package/dist/utils/dom/element.js +8 -4
  446. package/dist/utils/dom/element.js.map +1 -1
  447. package/dist/utils/dom/fullscreen.d.ts +1 -1
  448. package/dist/utils/dom/fullscreen.js +12 -8
  449. package/dist/utils/dom/fullscreen.js.map +1 -1
  450. package/dist/utils/dom/mounted.d.ts +7 -0
  451. package/dist/utils/dom/mounted.js +16 -0
  452. package/dist/utils/dom/mounted.js.map +1 -0
  453. package/dist/utils/dom/overflow.js +2 -1
  454. package/dist/utils/dom/overflow.js.map +1 -1
  455. package/dist/utils/dom/pan-zoom.js +2 -1
  456. package/dist/utils/dom/pan-zoom.js.map +1 -1
  457. package/dist/utils/props.js +3 -13
  458. package/dist/utils/props.js.map +1 -1
  459. package/dist/utils/request/error-message.d.ts +17 -0
  460. package/dist/utils/request/error-message.js +50 -0
  461. package/dist/utils/request/error-message.js.map +1 -0
  462. package/dist/utils/request/http.d.ts +80 -4
  463. package/dist/utils/request/http.js +121 -24
  464. package/dist/utils/request/http.js.map +1 -1
  465. package/dist/utils/request/use-autosave.d.ts +35 -0
  466. package/dist/utils/request/use-autosave.js +69 -0
  467. package/dist/utils/request/use-autosave.js.map +1 -0
  468. package/dist/utils/request/use-request.js +4 -2
  469. package/dist/utils/request/use-request.js.map +1 -1
  470. package/package.json +57 -4
@@ -1,8 +1,8 @@
1
1
  import { t } from "../config/theme/tokens.js";
2
2
  import { mergeAttrs } from "../utils/props.js";
3
3
  import { useIntersectionObserver } from "../utils/dom/intersection.js";
4
- import { Fragment, createVNode, mergeProps, ref, shallowRef } from "vue";
5
- import { _component, childrenProp, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
4
+ import { Fragment, createVNode, ref, shallowRef } from "vue";
5
+ import { _component, childrenProp, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
6
6
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
7
7
  //#region src/layout/Affix.tsx
8
8
  /** onChange 换成报告是否贴住 */
@@ -51,13 +51,13 @@ var Affix = /*#__PURE__*/ _component((_props, _ctx) => {
51
51
  }));
52
52
  return () => {
53
53
  const bottom = atBottom();
54
- const marker = createVNode("div", mergeProps({
54
+ const marker = createVNode("div", mergeJsxProps({
55
55
  "aria-hidden": "true",
56
56
  "ref": _cache[0] || (_cache[0] = (element) => sentinel.value = element instanceof HTMLElement ? element : null)
57
57
  }, css.attrs(affixStyles.sentinel)), null);
58
58
  return createVNode(Fragment, null, [
59
59
  !bottom && marker,
60
- createVNode("div", mergeProps(mergeAttrs({ sx: [
60
+ createVNode("div", mergeJsxProps(mergeAttrs({ sx: [
61
61
  affixStyles.root,
62
62
  bottom ? css.bind(affixPositionStyles.bottom, () => [offsetBottom.value ?? 0], true) : css.bind(affixPositionStyles.top, () => [offsetTop.value ?? 0], true),
63
63
  shadow.value && stuck.value && affixStyles.stuck
@@ -1 +1 @@
1
- {"version":3,"file":"Affix.js","names":["_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_vue_shallowRef","_vue_ref","_createVNode","_mergeProps","_Fragment"],"sources":["../../src/layout/Affix.tsx"],"sourcesContent":["/**\n * 固钉:滚动到某个位置后贴住视口(或滚动容器)的顶部、底部不走,如表单的提交栏、长表格上方的筛选条、文章的目录。\n *\n * <Affix offsetTop={64}>\n * <FilterBar … />\n * </Affix>\n * <Affix offsetBottom={0} onChange={(stuck) => …}><ActionBar … /></Affix>\n *\n * 用 CSS position: sticky:在所在的滚动容器里贴住,不脱离文档流(不用占位、不用量宽度),容器滚出去时跟着走。\n * 是否已经贴住由 IntersectionObserver 看一个零高度的哨兵(useIntersectionObserver):贴住时加阴影(浮在内容上)、\n * 写 data-stuck,并报告 onChange。sticky 只在父元素的范围里生效:Affix 要放在跟着滚动的那一层里;\n * 祖先里有 overflow 不是 visible 的元素时,sticky 相对的是它(不是视口):这时把它作为 target 传进来。\n * 部件:Root(div,sticky 的那层)。\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 { useIntersectionObserver } from '../utils/dom/intersection';\nimport { mergeAttrs, type PartProps } from '../utils/props';\nimport { t } from '../config/theme/tokens';\n\n/** onChange 换成报告是否贴住 */\nexport type AffixManaged = 'onChange';\n\n/** 未声明的属性落到 sticky 的 div 上 */\nexport interface AffixProps extends PartProps<'div', AffixManaged> {\n /** 贴住时离顶部多远(px),默认 0;与 offsetBottom 二选一 */\n offsetTop?: number;\n /** 贴住时离底部多远(px):贴在底部 */\n offsetBottom?: number;\n /** 滚动的容器(sticky 相对的那个祖先);不写时是视口 */\n target?: () => HTMLElement | null | undefined;\n /** 贴住时加阴影,默认 true */\n shadow?: boolean;\n /** 贴住、离开时调用 */\n onChange?: (stuck: boolean) => void;\n children?: VNodeChild;\n}\n\n/** Affix 的样式:root、stuck、sentinel */\nexport const affixStyles = css.create({\n root: {\n position: 'sticky',\n zIndex: 5,\n transition: `box-shadow ${t.durations.sm} ${t.easings.standard}`,\n },\n stuck: { boxShadow: '_md' },\n // 哨兵:贴住的位置上一个零高度的元素,滚过它就是贴住了\n sentinel: { height: 0, pointerEvents: 'none', visibility: 'hidden' },\n});\n\n/** 贴住的位置 */\nexport const affixPositionStyles = css.create({\n top: (offset: number) => ({ top: offset }),\n bottom: (offset: number) => ({ bottom: offset }),\n});\n\n/** 固钉:sticky + 是否贴住的检测 */\nexport const Affix = _component(\n ({ offsetTop, offsetBottom, target, shadow = true, onChange, children, ...rest }: AffixProps) => {\n let sentinel = _state.raw<HTMLElement | null>(null);\n let stuck = _state(false);\n const atBottom = () => offsetBottom != null && offsetTop == null;\n\n // 贴顶:哨兵在上方,滚到它离顶部不到 offsetTop 就是贴住了;贴底:哨兵在下方,同理看底部\n useIntersectionObserver(\n () => sentinel,\n ([entry]) => {\n const next =\n !entry!.isIntersecting &&\n (atBottom()\n ? entry!.boundingClientRect.top > (entry!.rootBounds?.bottom ?? 0)\n : entry!.boundingClientRect.bottom < (entry!.rootBounds?.top ?? 0));\n if (next === stuck) return;\n stuck = next;\n onChange?.(next);\n },\n () => ({\n root: target?.() ?? null,\n rootMargin: atBottom()\n ? `0px 0px ${-(offsetBottom ?? 0)}px 0px`\n : `${-(offsetTop ?? 0)}px 0px 0px 0px`,\n threshold: [0, 1],\n }),\n );\n\n return () => {\n const bottom = atBottom();\n const marker = (\n <div\n aria-hidden=\"true\"\n ref={(element: unknown) => (sentinel = element instanceof HTMLElement ? element : null)}\n {...css.attrs(affixStyles.sentinel)}\n />\n );\n return (\n <>\n {!bottom && marker}\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n affixStyles.root,\n bottom\n ? affixPositionStyles.bottom(offsetBottom ?? 0)\n : affixPositionStyles.top(offsetTop ?? 0),\n shadow && stuck && affixStyles.stuck,\n ],\n },\n rest,\n )}\n data-stuck={stuck || undefined}\n >\n {children}\n </div>\n {bottom && marker}\n </>\n );\n };\n },\n);\n"],"mappings":";;;;;;;;;;AAwCA,IAAa,cAAc,IAAI,OAAO;CACpC,MAAM;EACJ,UAAU;EACV,QAAQ;EACR,YAAY,cAAc,EAAE,UAAU,GAAE,GAAI,EAAE,QAAQ;CACxD;CACA,OAAO,EAAE,WAAW,MAAM;CAE1B,UAAU;EAAE,QAAQ;EAAG,eAAe;EAAQ,YAAY;CAAS;AACrE,CAAC;;AAGD,IAAa,sBAAsB,IAAI,OAAO;CAC5C,MAAM,YAAoB,EAAE,KAAK,OAAO;CACxC,SAAS,YAAoB,EAAE,QAAQ,OAAO;AAChD,CAAC;;AAGD,IAAa,QAAQ,0BACnB,QAAA,SAAiG;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,UAApD,IAAI;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,WAAAC,aAAA,MAAA;CAAA,MAAyB,OAAIC,UAAA,QAAA,MAAA,KAAA;CAC5E,IAAI,WAAQC,WAAkC,IAAI;CAClD,IAAI,QAAKC,IAAU,KAAK;CACxB,MAAM,iBAAiB,aAAA,SAAgB,QAAQ,UAAA,SAAa;CAG5D,8BACE,SAAA,QACC,CAAC,WAAW;EACX,MAAM,OACJ,CAAC,MAAO,mBACP,SAAS,IACN,MAAO,mBAAmB,OAAO,MAAO,YAAY,UAAU,KAC9D,MAAO,mBAAmB,UAAU,MAAO,YAAY,OAAO;EACpE,IAAI,SAAI,MAAA,OAAY;EACpB,MAAA,QAAQ;EACR,SAAA,QAAW,IAAI;CACjB,UACO;EACL,MAAM,OAAA,QAAS,KAAK;EACpB,YAAY,SAAS,IACjB,WAAW,EAAE,aAAA,SAAgB,GAAE,UAC/B,GAAG,EAAE,UAAA,SAAa,GAAE;EACxB,WAAW,CAAC,GAAG,CAAC;CAClB,EACF;CAEA,aAAa;EACX,MAAM,SAAS,SAAS;EACxB,MAAM,SAAMC,YAAA,OAAAC,WAAA;GAAA,eAAA;GAAA,OAAA,OAAA,OAAA,OAAA,MAGF,YAAsB,SAAA,QAAW,mBAAmB,cAAc,UAAU;EAAK,GACnF,IAAI,MAAM,YAAY,QAAQ,CAAC,GAAA,IAAA;EAGvC,OAAAD,YAAAE,UAAA,MAAA;GAEK,CAAC,UAAU;GAAMF,YAAA,OAAAC,WAEZ,WACF,EACE,IAAI;IACF,YAAY;IACZ,SAAM,IAAA,KACF,oBAAoB,cAAM,CAAC,aAAA,SAAgB,CAAC,GAAA,IAAA,IAAA,IAAA,KAC5C,oBAAoB,WAAG,CAAC,UAAA,SAAa,CAAC,GAAA,IAAA;IAC1C,OAAA,SAAA,MAAA,SAAmB,YAAY;GAAK,EAExC,GACA,IACF,GAAC,EAAA,cACW,MAAA,SAAS,KAAA,EAAS,CAAA,GAAA,CAAA,SAAA,KAAA,CAAA;GAI/B,UAAU;EAAM,CAAA;CAGvB;AACF,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
1
+ {"version":3,"file":"Affix.js","names":["_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_vue_shallowRef","_vue_ref","_createVNode","_mergeProps","_Fragment"],"sources":["../../src/layout/Affix.tsx"],"sourcesContent":["/**\n * 固钉:滚动到某个位置后贴住视口(或滚动容器)的顶部、底部不走,如表单的提交栏、长表格上方的筛选条、文章的目录。\n *\n * <Affix offsetTop={64}>\n * <FilterBar … />\n * </Affix>\n * <Affix offsetBottom={0} onChange={(stuck) => …}><ActionBar … /></Affix>\n *\n * 用 CSS position: sticky:在所在的滚动容器里贴住,不脱离文档流(不用占位、不用量宽度),容器滚出去时跟着走。\n * 是否已经贴住由 IntersectionObserver 看一个零高度的哨兵(useIntersectionObserver):贴住时加阴影(浮在内容上)、\n * 写 data-stuck,并报告 onChange。sticky 只在父元素的范围里生效:Affix 要放在跟着滚动的那一层里;\n * 祖先里有 overflow 不是 visible 的元素时,sticky 相对的是它(不是视口):这时把它作为 target 传进来。\n * 部件:Root(div,sticky 的那层)。\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 { useIntersectionObserver } from '../utils/dom/intersection';\nimport { mergeAttrs, type PartProps } from '../utils/props';\nimport { t } from '../config/theme/tokens';\n\n/** onChange 换成报告是否贴住 */\nexport type AffixManaged = 'onChange';\n\n/** 未声明的属性落到 sticky 的 div 上 */\nexport interface AffixProps extends PartProps<'div', AffixManaged> {\n /** 贴住时离顶部多远(px),默认 0;与 offsetBottom 二选一 */\n offsetTop?: number;\n /** 贴住时离底部多远(px):贴在底部 */\n offsetBottom?: number;\n /** 滚动的容器(sticky 相对的那个祖先);不写时是视口 */\n target?: () => HTMLElement | null | undefined;\n /** 贴住时加阴影,默认 true */\n shadow?: boolean;\n /** 贴住、离开时调用 */\n onChange?: (stuck: boolean) => void;\n children?: VNodeChild;\n}\n\n/** Affix 的样式:root、stuck、sentinel */\nexport const affixStyles = css.create({\n root: {\n position: 'sticky',\n zIndex: 5,\n transition: `box-shadow ${t.durations.sm} ${t.easings.standard}`,\n },\n stuck: { boxShadow: '_md' },\n // 哨兵:贴住的位置上一个零高度的元素,滚过它就是贴住了\n sentinel: { height: 0, pointerEvents: 'none', visibility: 'hidden' },\n});\n\n/** 贴住的位置 */\nexport const affixPositionStyles = css.create({\n top: (offset: number) => ({ top: offset }),\n bottom: (offset: number) => ({ bottom: offset }),\n});\n\n/** 固钉:sticky + 是否贴住的检测 */\nexport const Affix = _component(\n ({ offsetTop, offsetBottom, target, shadow = true, onChange, children, ...rest }: AffixProps) => {\n let sentinel = _state.raw<HTMLElement | null>(null);\n let stuck = _state(false);\n const atBottom = () => offsetBottom != null && offsetTop == null;\n\n // 贴顶:哨兵在上方,滚到它离顶部不到 offsetTop 就是贴住了;贴底:哨兵在下方,同理看底部\n useIntersectionObserver(\n () => sentinel,\n ([entry]) => {\n const next =\n !entry!.isIntersecting &&\n (atBottom()\n ? entry!.boundingClientRect.top > (entry!.rootBounds?.bottom ?? 0)\n : entry!.boundingClientRect.bottom < (entry!.rootBounds?.top ?? 0));\n if (next === stuck) return;\n stuck = next;\n onChange?.(next);\n },\n () => ({\n root: target?.() ?? null,\n rootMargin: atBottom()\n ? `0px 0px ${-(offsetBottom ?? 0)}px 0px`\n : `${-(offsetTop ?? 0)}px 0px 0px 0px`,\n threshold: [0, 1],\n }),\n );\n\n return () => {\n const bottom = atBottom();\n const marker = (\n <div\n aria-hidden=\"true\"\n ref={(element: unknown) => (sentinel = element instanceof HTMLElement ? element : null)}\n {...css.attrs(affixStyles.sentinel)}\n />\n );\n return (\n <>\n {!bottom && marker}\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n affixStyles.root,\n bottom\n ? affixPositionStyles.bottom(offsetBottom ?? 0)\n : affixPositionStyles.top(offsetTop ?? 0),\n shadow && stuck && affixStyles.stuck,\n ],\n },\n rest,\n )}\n data-stuck={stuck || undefined}\n >\n {children}\n </div>\n {bottom && marker}\n </>\n );\n };\n },\n);\n"],"mappings":";;;;;;;;;;AAwCA,IAAa,cAAc,IAAI,OAAO;CACpC,MAAM;EACJ,UAAU;EACV,QAAQ;EACR,YAAY,cAAc,EAAE,UAAU,GAAE,GAAI,EAAE,QAAQ;CACxD;CACA,OAAO,EAAE,WAAW,MAAM;CAE1B,UAAU;EAAE,QAAQ;EAAG,eAAe;EAAQ,YAAY;CAAS;AACrE,CAAC;;AAGD,IAAa,sBAAsB,IAAI,OAAO;CAC5C,MAAM,YAAoB,EAAE,KAAK,OAAO;CACxC,SAAS,YAAoB,EAAE,QAAQ,OAAO;AAChD,CAAC;;AAGD,IAAa,QAAQ,0BACnB,QAAA,SAAiG;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,UAApD,IAAI;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,WAAAC,aAAA,MAAA;CAAA,MAAyB,OAAIC,UAAA,QAAA,MAAA,KAAA;CAC5E,IAAI,WAAQC,WAAkC,IAAI;CAClD,IAAI,QAAKC,IAAU,KAAK;CACxB,MAAM,iBAAiB,aAAA,SAAgB,QAAQ,UAAA,SAAa;CAG5D,8BACE,SAAA,QACC,CAAC,WAAW;EACX,MAAM,OACJ,CAAC,MAAO,mBACP,SAAS,IACN,MAAO,mBAAmB,OAAO,MAAO,YAAY,UAAU,KAC9D,MAAO,mBAAmB,UAAU,MAAO,YAAY,OAAO;EACpE,IAAI,SAAI,MAAA,OAAY;EACpB,MAAA,QAAQ;EACR,SAAA,QAAW,IAAI;CACjB,UACO;EACL,MAAM,OAAA,QAAS,KAAK;EACpB,YAAY,SAAS,IACjB,WAAW,EAAE,aAAA,SAAgB,GAAE,UAC/B,GAAG,EAAE,UAAA,SAAa,GAAE;EACxB,WAAW,CAAC,GAAG,CAAC;CAClB,EACF;CAEA,aAAa;EACX,MAAM,SAAS,SAAS;EACxB,MAAM,SAAMC,YAAA,OAAAC,cAAA;GAAA,eAAA;GAAA,OAAA,OAAA,OAAA,OAAA,MAGF,YAAsB,SAAA,QAAW,mBAAmB,cAAc,UAAU;EAAK,GACnF,IAAI,MAAM,YAAY,QAAQ,CAAC,GAAA,IAAA;EAGvC,OAAAD,YAAAE,UAAA,MAAA;GAEK,CAAC,UAAU;GAAMF,YAAA,OAAAC,cAEZ,WACF,EACE,IAAI;IACF,YAAY;IACZ,SAAM,IAAA,KACF,oBAAoB,cAAM,CAAC,aAAA,SAAgB,CAAC,GAAA,IAAA,IAAA,IAAA,KAC5C,oBAAoB,WAAG,CAAC,UAAA,SAAa,CAAC,GAAA,IAAA;IAC1C,OAAA,SAAA,MAAA,SAAmB,YAAY;GAAK,EAExC,GACA,IACF,GAAC,EAAA,cACW,MAAA,SAAS,KAAA,EAAS,CAAA,GAAA,CAAA,SAAA,KAAA,CAAA;GAI/B,UAAU;EAAM,CAAA;CAGvB;AACF,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
@@ -14,15 +14,19 @@ export interface ResizeHandleProps extends PartProps<'span', ResizeHandleManaged
14
14
  defaultWidth?: number;
15
15
  /** 键盘每按一次调整多少(px),默认 16 */
16
16
  step?: number;
17
- /** 手柄在父元素的哪一边,默认 end;start 时往起始方向拖是变宽(从结束边滑入的抽屉) */
17
+ /** 手柄在父元素的哪一边,默认 end;start 时往起始方向拖是变宽(从结束边滑入的抽屉);horizontal 时 start 是上边、end 是下边 */
18
18
  edge?: 'start' | 'end';
19
+ /** vertical(默认):竖线,调整宽度;horizontal:横线,调整高度(见文件开头) */
20
+ orientation?: 'vertical' | 'horizontal';
19
21
  /** 拖动或用键盘调整了宽度(已经夹在最小、最大宽度之间) */
20
22
  onWidthChange: (width: number) => void;
21
23
  }
22
24
  /** ResizeHandle 的样式:贴着父元素结束边的细线 */
23
25
  export declare const resizeHandleStyles: Readonly<{
24
26
  handle: css.CompiledStyles;
27
+ horizontal: css.CompiledStyles;
28
+ horizontalStart: css.CompiledStyles;
25
29
  start: css.CompiledStyles;
26
30
  }>;
27
- /** 宽度调整手柄:拖动或用 ← / → 调整父元素的宽度 */
31
+ /** 宽度调整手柄:拖动或用 ← / → 调整父元素的宽度;orientation="horizontal" 时调整高度(↑ / ↓) */
28
32
  export declare const ResizeHandle: import("@zerodep-dev/vue-tsx-pro-tsx").TsxComponent<ResizeHandleProps>;
@@ -29,9 +29,22 @@ var resizeHandleStyles = css.create({
29
29
  start: {
30
30
  insetInlineEnd: "auto",
31
31
  insetInlineStart: 0
32
+ },
33
+ horizontal: {
34
+ top: "auto",
35
+ bottom: 0,
36
+ insetInlineStart: 0,
37
+ insetInlineEnd: 0,
38
+ width: "auto",
39
+ height: "_space.sm",
40
+ cursor: "row-resize"
41
+ },
42
+ horizontalStart: {
43
+ top: 0,
44
+ bottom: "auto"
32
45
  }
33
46
  });
34
- /** 宽度调整手柄:拖动或用 ← / → 调整父元素的宽度 */
47
+ /** 宽度调整手柄:拖动或用 ← / → 调整父元素的宽度;orientation="horizontal" 时调整高度(↑ / ↓) */
35
48
  var ResizeHandle = /*#__PURE__*/ _component((_props, _ctx) => {
36
49
  const width = readonlyProp(_props, "width");
37
50
  const minWidth = readonlyProp(_props, "minWidth", 64);
@@ -39,36 +52,45 @@ var ResizeHandle = /*#__PURE__*/ _component((_props, _ctx) => {
39
52
  const defaultWidth = readonlyProp(_props, "defaultWidth");
40
53
  const step = readonlyProp(_props, "step", 16);
41
54
  const edge = readonlyProp(_props, "edge", "end");
55
+ const orientation = readonlyProp(_props, "orientation", "vertical");
42
56
  const onWidthChange = readonlyProp(_props, "onWidthChange");
43
57
  const rest = restProps(_props, _ctx, true);
58
+ const horizontal = () => orientation.value === "horizontal";
44
59
  const parentOf = (event) => event.currentTarget.parentElement;
60
+ const sizeOf = (element) => {
61
+ const rect = element.getBoundingClientRect();
62
+ return horizontal() ? rect.height : rect.width;
63
+ };
45
64
  const fit = (px) => Math.round(clamp(px, minWidth.value, maxWidth.value));
46
65
  let handle = shallowRef(null);
47
66
  let measured = ref(void 0);
48
67
  useResizeObserver(() => width.value == null ? handle.value?.parentElement : null, () => {
49
68
  const parent = handle.value?.parentElement;
50
- if (parent) measured.value = Math.round(parent.getBoundingClientRect().width);
69
+ if (parent) measured.value = Math.round(sizeOf(parent));
51
70
  });
52
71
  function onPointerdown(event) {
53
72
  const parent = parentOf(event);
54
- const from = parent.getBoundingClientRect().width;
55
- const sign = (isRtl(parent) ? -1 : 1) * (edge.value === "start" ? -1 : 1);
73
+ const from = sizeOf(parent);
74
+ const sign = (horizontal() ? 1 : isRtl(parent) ? -1 : 1) * (edge.value === "start" ? -1 : 1);
56
75
  event.preventDefault();
57
- startMove(event, { onMove: ({ deltaX }) => onWidthChange.value(fit(from + sign * deltaX)) });
76
+ startMove(event, { onMove: ({ deltaX, deltaY }) => onWidthChange.value(fit(from + sign * (horizontal() ? deltaY : deltaX))) });
58
77
  }
59
78
  function onKeydown(event) {
60
79
  const parent = parentOf(event);
61
- const { forward, backward } = inlineArrows(isRtl(parent));
80
+ const { forward, backward } = horizontal() ? {
81
+ forward: "ArrowDown",
82
+ backward: "ArrowUp"
83
+ } : inlineArrows(isRtl(parent));
62
84
  const delta = (event.key === forward ? step.value : event.key === backward ? -step.value : 0) * (edge.value === "start" ? -1 : 1);
63
85
  if (!delta) return;
64
86
  event.preventDefault();
65
- onWidthChange.value(fit((width.value ?? parent.getBoundingClientRect().width) + delta));
87
+ onWidthChange.value(fit((width.value ?? sizeOf(parent)) + delta));
66
88
  }
67
- return () => createVNode("span", mergeAttrs({ sx: [resizeHandleStyles.handle, edge.value === "start" && resizeHandleStyles.start] }, rest, {
89
+ return () => createVNode("span", mergeAttrs({ sx: [resizeHandleStyles.handle, horizontal() ? [resizeHandleStyles.horizontal, edge.value === "start" && resizeHandleStyles.horizontalStart] : edge.value === "start" && resizeHandleStyles.start] }, rest, {
68
90
  ref: (element) => handle.value = element instanceof HTMLElement ? element : null,
69
91
  role: "separator",
70
92
  tabindex: 0,
71
- "aria-orientation": "vertical",
93
+ "aria-orientation": orientation.value,
72
94
  "aria-valuenow": width.value ?? measured.value ?? minWidth.value,
73
95
  "aria-valuemin": minWidth.value,
74
96
  "aria-valuemax": Number.isFinite(maxWidth.value) ? maxWidth.value : void 0,
@@ -85,6 +107,7 @@ var ResizeHandle = /*#__PURE__*/ _component((_props, _ctx) => {
85
107
  "defaultWidth",
86
108
  "step",
87
109
  "edge",
110
+ "orientation",
88
111
  "onWidthChange"
89
112
  ]
90
113
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ResizeHandle.js","names":["_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_vue_ref","_createVNode"],"sources":["../../src/layout/ResizeHandle.tsx"],"sourcesContent":["/**\n * 宽度调整手柄:所在元素结束边(edge=\"start\" 时是起始边,如从右侧滑入的抽屉)的一条细线(role=\"separator\"),悬停、聚焦时显示。\n * 拖动(startMove)或聚焦后用 ← / →(WCAG 2.5.7 拖动的替代操作)调整,从右到左排版下方向自动镜像;\n * 双击回到 defaultWidth。宽度从父元素量起,所以要放在要调整的那个元素里(它需要 position: relative 或 fixed)。\n * AppShell 的抽屉式侧栏、DataTable 的列宽(ColumnResizer)都用它。\n *\n * <aside style=\"position: relative; width: …\">…<ResizeHandle aria-label=\"调整侧栏宽度\" width={width} onWidthChange={(px) => (width = px)} /></aside>\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { clamp } from '../utils/data/number';\nimport { inlineArrows, isRtl } from '../utils/dom/direction';\nimport { startMove } from '../utils/dom/move';\nimport { useResizeObserver } from '../utils/dom/resize';\nimport { mergeAttrs, type PartProps } from '../utils/props';\n\n/** 分隔条的角色、可聚焦与取值由组件管理 */\nexport type ResizeHandleManaged =\n 'role' | 'tabindex' | 'aria-orientation' | 'aria-valuenow' | 'aria-valuemin' | 'aria-valuemax';\n\n/** 未声明的属性落到手柄(span)上;无障碍名称写 aria-label */\nexport interface ResizeHandleProps extends PartProps<'span', ResizeHandleManaged> {\n /** 当前宽度(px);没有时从父元素的实际宽度起算 */\n width?: number;\n /** 最小宽度(px),默认 64 */\n minWidth?: number;\n /** 最大宽度(px),默认不限 */\n maxWidth?: number;\n /** 双击回到的宽度(px);不写时双击不做什么 */\n defaultWidth?: number;\n /** 键盘每按一次调整多少(px),默认 16 */\n step?: number;\n /** 手柄在父元素的哪一边,默认 end;start 时往起始方向拖是变宽(从结束边滑入的抽屉) */\n edge?: 'start' | 'end';\n /** 拖动或用键盘调整了宽度(已经夹在最小、最大宽度之间) */\n onWidthChange: (width: number) => void;\n}\n\n/** ResizeHandle 的样式:贴着父元素结束边的细线 */\nexport const resizeHandleStyles = css.create({\n handle: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n insetInlineEnd: 0,\n width: '_space.sm',\n cursor: 'col-resize',\n touchAction: 'none',\n backgroundColor: {\n default: 'transparent',\n ':hover': '_borderStrong',\n ':focus-visible': '_accent',\n },\n outlineStyle: 'none',\n },\n start: { insetInlineEnd: 'auto', insetInlineStart: 0 },\n});\n\n/** 宽度调整手柄:拖动或用 ← / → 调整父元素的宽度 */\nexport const ResizeHandle = _component(\n ({\n width,\n minWidth = 64,\n maxWidth = Number.POSITIVE_INFINITY,\n defaultWidth,\n step = 16,\n edge = 'end',\n onWidthChange,\n ...rest\n }: ResizeHandleProps) => {\n const parentOf = (event: Event) => (event.currentTarget as HTMLElement).parentElement!;\n const fit = (px: number) => Math.round(clamp(px, minWidth, maxWidth));\n // 没给 width 时量父元素的实际宽度:可聚焦的分隔条必须有当前值(aria-valuenow)\n let handle = _state.raw<HTMLElement | null>(null);\n let measured = _state<number | undefined>(undefined);\n useResizeObserver(\n () => (width == null ? handle?.parentElement : null),\n () => {\n const parent = handle?.parentElement;\n if (parent) measured = Math.round(parent.getBoundingClientRect().width);\n },\n );\n\n function onPointerdown(event: PointerEvent) {\n const parent = parentOf(event);\n const from = parent.getBoundingClientRect().width;\n // 起始边的手柄往起始方向拖是变宽:方向与结束边相反\n const sign = (isRtl(parent) ? -1 : 1) * (edge === 'start' ? -1 : 1);\n event.preventDefault();\n startMove(event, {\n onMove: ({ deltaX }) => onWidthChange(fit(from + sign * deltaX)),\n });\n }\n\n function onKeydown(event: KeyboardEvent) {\n const parent = parentOf(event);\n const { forward, backward } = inlineArrows(isRtl(parent));\n const delta =\n (event.key === forward ? step : event.key === backward ? -step : 0) *\n (edge === 'start' ? -1 : 1);\n if (!delta) return;\n event.preventDefault();\n onWidthChange(fit((width ?? parent.getBoundingClientRect().width) + delta));\n }\n\n return () => (\n <span\n {...mergeAttrs<'span'>(\n { sx: [resizeHandleStyles.handle, edge === 'start' && resizeHandleStyles.start] },\n rest,\n {\n ref: (element: unknown) => (handle = element instanceof HTMLElement ? element : null),\n role: 'separator',\n tabindex: 0,\n 'aria-orientation': 'vertical',\n 'aria-valuenow': width ?? measured ?? minWidth,\n 'aria-valuemin': minWidth,\n 'aria-valuemax': Number.isFinite(maxWidth) ? maxWidth : undefined,\n onPointerdown,\n onKeydown,\n onDblclick: defaultWidth == null ? undefined : () => onWidthChange(fit(defaultWidth)),\n },\n )}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;AAuCA,IAAa,qBAAqB,IAAI,OAAO;CAC3C,QAAQ;EACN,UAAU;EACV,KAAK;EACL,QAAQ;EACR,gBAAgB;EAChB,OAAO;EACP,QAAQ;EACR,aAAa;EACb,iBAAiB;GACf,SAAS;GACT,UAAU;GACV,kBAAkB;EACpB;EACA,cAAc;CAChB;CACA,OAAO;EAAE,gBAAgB;EAAQ,kBAAkB;CAAE;AACvD,CAAC;;AAGD,IAAa,eAAe,0BAC1B,QAAA,SASyB;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,YAPZ,EAAE;CAAA,MAAA,WAAAA,aAAA,QAAA,kBACF,OAAO,iBAAiB;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,QAE5B,EAAE;CAAA,MAAA,OAAAA,aAAA,QAAA,QACF,KAAK;CAAA,MAAA,gBAAAA,aAAA,QAAA,eAAA;CAAA,MAET,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,YAAY,UAAkB,MAAM,cAA8B;CACxE,MAAM,OAAO,OAAe,KAAK,MAAM,MAAM,IAAE,SAAA,OAAA,SAAA,KAAoB,CAAC;CAEpE,IAAI,SAAMC,WAAkC,IAAI;CAChD,IAAI,WAAQC,IAA8B,KAAA,CAAS;CACnD,wBACS,MAAA,SAAS,OAAO,OAAA,OAAQ,gBAAgB,YACzC;EACJ,MAAM,SAAS,OAAA,OAAQ;EACvB,IAAI,QAAQ,SAAA,QAAW,KAAK,MAAM,OAAO,sBAAsB,CAAC,CAAC,KAAK;CACxE,CACF;CAEA,SAAS,cAAc,OAAqB;EAC1C,MAAM,SAAS,SAAS,KAAK;EAC7B,MAAM,OAAO,OAAO,sBAAsB,CAAC,CAAC;EAE5C,MAAM,QAAQ,MAAM,MAAM,IAAI,KAAK,MAAM,KAAA,UAAS,UAAU,KAAK;EACjE,MAAM,eAAe;EACrB,UAAU,OAAO,EACf,SAAS,EAAE,aAAa,cAAA,MAAc,IAAI,OAAO,OAAO,MAAM,CAAC,EACjE,CAAC;CACH;CAEA,SAAS,UAAU,OAAsB;EACvC,MAAM,SAAS,SAAS,KAAK;EAC7B,MAAM,EAAE,SAAS,aAAa,aAAa,MAAM,MAAM,CAAC;EACxD,MAAM,SACH,MAAM,QAAQ,UAAO,KAAA,QAAU,MAAM,QAAQ,WAAW,CAAA,KAAA,QAAQ,MAChE,KAAA,UAAS,UAAU,KAAK;EAC3B,IAAI,CAAC,OAAO;EACZ,MAAM,eAAe;EACrB,cAAA,MAAc,KAAK,MAAA,SAAS,OAAO,sBAAsB,CAAC,CAAC,SAAS,KAAK,CAAC;CAC5E;CAEA,aAAOC,YAAA,QAEC,WACF,EAAE,IAAI,CAAC,mBAAmB,QAAQ,KAAA,UAAS,WAAW,mBAAmB,KAAK,EAAE,GAChF,MACA;EACE,MAAM,YAAsB,OAAA,QAAS,mBAAmB,cAAc,UAAU;EAChF,MAAM;EACN,UAAU;EACV,oBAAoB;EACpB,iBAAiB,MAAA,SAAA,SAAA,SAAiB,SAAA;EAClC,iBAAe,SAAA;EACf,iBAAiB,OAAO,SAAQ,SAAA,KAAS,IAAC,SAAA,QAAc,KAAA;EACxD;EACA;EACA,YAAY,aAAA,SAAgB,OAAO,KAAA,UAAkB,cAAA,MAAc,IAAG,aAAA,KAAa,CAAC;CACtF,CACF,GAAC,IAAA;AAGP,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
1
+ {"version":3,"file":"ResizeHandle.js","names":["_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_vue_ref","_createVNode"],"sources":["../../src/layout/ResizeHandle.tsx"],"sourcesContent":["/**\n * 宽度调整手柄:所在元素结束边(edge=\"start\" 时是起始边,如从右侧滑入的抽屉)的一条细线(role=\"separator\"),悬停、聚焦时显示。\n * 拖动(startMove)或聚焦后用 ← / →(WCAG 2.5.7 拖动的替代操作)调整,从右到左排版下方向自动镜像;\n * 双击回到 defaultWidth。宽度从父元素量起,所以要放在要调整的那个元素里(它需要 position: relative 或 fixed)。\n * orientation=\"horizontal\" 时是一条横线,贴着父元素的下边(edge=\"start\" 时是上边,如从底部升起的抽屉),\n * 拖动或用 ↑ / ↓ 调整的是**高度**:width、minWidth、maxWidth、defaultWidth、onWidthChange 这时都指高度。\n * AppShell 的抽屉式侧栏、DataTable 的列宽(ColumnResizer)都用它。\n *\n * <aside style=\"position: relative; width: …\">…<ResizeHandle aria-label=\"调整侧栏宽度\" width={width} onWidthChange={(px) => (width = px)} /></aside>\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { clamp } from '../utils/data/number';\nimport { inlineArrows, isRtl } from '../utils/dom/direction';\nimport { startMove } from '../utils/dom/move';\nimport { useResizeObserver } from '../utils/dom/resize';\nimport { mergeAttrs, type PartProps } from '../utils/props';\n\n/** 分隔条的角色、可聚焦与取值由组件管理 */\nexport type ResizeHandleManaged =\n 'role' | 'tabindex' | 'aria-orientation' | 'aria-valuenow' | 'aria-valuemin' | 'aria-valuemax';\n\n/** 未声明的属性落到手柄(span)上;无障碍名称写 aria-label */\nexport interface ResizeHandleProps extends PartProps<'span', ResizeHandleManaged> {\n /** 当前宽度(px);没有时从父元素的实际宽度起算 */\n width?: number;\n /** 最小宽度(px),默认 64 */\n minWidth?: number;\n /** 最大宽度(px),默认不限 */\n maxWidth?: number;\n /** 双击回到的宽度(px);不写时双击不做什么 */\n defaultWidth?: number;\n /** 键盘每按一次调整多少(px),默认 16 */\n step?: number;\n /** 手柄在父元素的哪一边,默认 end;start 时往起始方向拖是变宽(从结束边滑入的抽屉);horizontal 时 start 是上边、end 是下边 */\n edge?: 'start' | 'end';\n /** vertical(默认):竖线,调整宽度;horizontal:横线,调整高度(见文件开头) */\n orientation?: 'vertical' | 'horizontal';\n /** 拖动或用键盘调整了宽度(已经夹在最小、最大宽度之间) */\n onWidthChange: (width: number) => void;\n}\n\n/** ResizeHandle 的样式:贴着父元素结束边的细线 */\nexport const resizeHandleStyles = css.create({\n handle: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n insetInlineEnd: 0,\n width: '_space.sm',\n cursor: 'col-resize',\n touchAction: 'none',\n backgroundColor: {\n default: 'transparent',\n ':hover': '_borderStrong',\n ':focus-visible': '_accent',\n },\n outlineStyle: 'none',\n },\n start: { insetInlineEnd: 'auto', insetInlineStart: 0 },\n // 横线:贴着父元素的下边(start 时是上边),调整高度\n horizontal: {\n top: 'auto',\n bottom: 0,\n insetInlineStart: 0,\n insetInlineEnd: 0,\n width: 'auto',\n height: '_space.sm',\n cursor: 'row-resize',\n },\n horizontalStart: { top: 0, bottom: 'auto' },\n});\n\n/** 宽度调整手柄:拖动或用 ← / → 调整父元素的宽度;orientation=\"horizontal\" 时调整高度(↑ / ↓) */\nexport const ResizeHandle = _component(\n ({\n width,\n minWidth = 64,\n maxWidth = Number.POSITIVE_INFINITY,\n defaultWidth,\n step = 16,\n edge = 'end',\n orientation = 'vertical',\n onWidthChange,\n ...rest\n }: ResizeHandleProps) => {\n const horizontal = () => orientation === 'horizontal';\n const parentOf = (event: Event) => (event.currentTarget as HTMLElement).parentElement!;\n const sizeOf = (element: Element) => {\n const rect = element.getBoundingClientRect();\n return horizontal() ? rect.height : rect.width;\n };\n const fit = (px: number) => Math.round(clamp(px, minWidth, maxWidth));\n // 没给 width 时量父元素的实际宽度:可聚焦的分隔条必须有当前值(aria-valuenow)\n let handle = _state.raw<HTMLElement | null>(null);\n let measured = _state<number | undefined>(undefined);\n useResizeObserver(\n () => (width == null ? handle?.parentElement : null),\n () => {\n const parent = handle?.parentElement;\n if (parent) measured = Math.round(sizeOf(parent));\n },\n );\n\n function onPointerdown(event: PointerEvent) {\n const parent = parentOf(event);\n const from = sizeOf(parent);\n // 起始边的手柄往起始方向拖是变宽:方向与结束边相反;横线不受从右到左排版的影响\n const sign = (horizontal() ? 1 : isRtl(parent) ? -1 : 1) * (edge === 'start' ? -1 : 1);\n event.preventDefault();\n startMove(event, {\n onMove: ({ deltaX, deltaY }) =>\n onWidthChange(fit(from + sign * (horizontal() ? deltaY : deltaX))),\n });\n }\n\n function onKeydown(event: KeyboardEvent) {\n const parent = parentOf(event);\n const { forward, backward } = horizontal()\n ? { forward: 'ArrowDown', backward: 'ArrowUp' }\n : inlineArrows(isRtl(parent));\n const delta =\n (event.key === forward ? step : event.key === backward ? -step : 0) *\n (edge === 'start' ? -1 : 1);\n if (!delta) return;\n event.preventDefault();\n onWidthChange(fit((width ?? sizeOf(parent)) + delta));\n }\n\n return () => (\n <span\n {...mergeAttrs<'span'>(\n {\n sx: [\n resizeHandleStyles.handle,\n horizontal()\n ? [\n resizeHandleStyles.horizontal,\n edge === 'start' && resizeHandleStyles.horizontalStart,\n ]\n : edge === 'start' && resizeHandleStyles.start,\n ],\n },\n rest,\n {\n ref: (element: unknown) => (handle = element instanceof HTMLElement ? element : null),\n role: 'separator',\n tabindex: 0,\n 'aria-orientation': orientation,\n 'aria-valuenow': width ?? measured ?? minWidth,\n 'aria-valuemin': minWidth,\n 'aria-valuemax': Number.isFinite(maxWidth) ? maxWidth : undefined,\n onPointerdown,\n onKeydown,\n onDblclick: defaultWidth == null ? undefined : () => onWidthChange(fit(defaultWidth)),\n },\n )}\n />\n );\n },\n);\n"],"mappings":"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"}
@@ -5,8 +5,8 @@ import { startMove } from "../utils/dom/move.js";
5
5
  import { isRtl } from "../utils/dom/direction.js";
6
6
  import { batchLayout } from "../utils/dom/layout-batch.js";
7
7
  import { useResizeObserver } from "../utils/dom/resize.js";
8
- import { createVNode, mergeProps, ref, shallowRef } from "vue";
9
- import { _component, childrenProp, effect, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
8
+ import { createVNode, ref, shallowRef } from "vue";
9
+ import { _component, childrenProp, effect, 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/layout/ScrollArea.tsx
12
12
  /** 哪个方向可以滚动 */
@@ -241,7 +241,7 @@ var OverlayScrollbar = /*#__PURE__*/ _component((_props, _ctx) => {
241
241
  }
242
242
  return () => {
243
243
  const visible = overflowing.value && (type.value === "always" || active.value);
244
- return createVNode("div", mergeProps(mergeAttrs({ sx: [
244
+ return createVNode("div", mergeJsxProps(mergeAttrs({ sx: [
245
245
  scrollAreaBarStyles.track,
246
246
  scrollAreaBarStyles[axis.value],
247
247
  fixed.value && scrollAreaBarStyles.fixed,
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollArea.js","names":["_vtp_readonlyProp","_vue_shallowRef","_vue_ref","_createVNode","_mergeProps","_vtp_childrenProp","_vtp_restProps"],"sources":["../../src/layout/ScrollArea.tsx"],"sourcesContent":["/**\n * 滚动区域:浮层滚动条。滚动仍是浏览器原生的(触控板惯性、键盘、页内搜索、无障碍都不变),\n * 只把原生滚动条隐藏,换成半透明、绝对定位浮在内容上方的滚动条:出现、消失都不占位,不改变布局尺寸。\n * 参考 Radix ScrollArea。\n *\n * <ScrollArea sx={styles.panel}>…</ScrollArea> 高度(或最大高度)由使用方给\n * <ScrollArea axis=\"both\" type=\"always\">…</ScrollArea>\n *\n * 滚动条对读屏隐藏(滚动由视口本身承担);内容超出时视口可聚焦,键盘照常滚动。\n * 滚动条本身是 OverlayScrollbar:整页的浮层滚动条(PageScrollbar)也用它。\n *\n * 要在外面拿到真正滚动的元素(虚拟滚动、自己控制滚动)时用 propsViewport 的 ref:\n * <ScrollArea propsViewport={{ ref: (element) => (scroller = toElement(element)) }}>…</ScrollArea>\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 { startMove } from '../utils/dom/move';\nimport { mergeAttrs, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { isRtl } from '../utils/dom/direction';\nimport { batchLayout } from '../utils/dom/layout-batch';\nimport { useResizeObserver } from '../utils/dom/resize';\nimport { t } from '../config/theme/tokens';\n\n/** 哪个方向可以滚动 */\nexport interface ScrollAreaAxes {\n /** 纵向(默认),横向超出的部分裁掉 */\n y: unknown;\n /** 横向,纵向超出的部分裁掉 */\n x: unknown;\n /** 两个方向 */\n both: unknown;\n}\n\n/** 滚动条什么时候显示 */\nexport interface ScrollbarTypes {\n /** 指针在区域上方或正在滚动时显示(默认) */\n hover: unknown;\n /** 只在滚动时显示,停下后淡出 */\n scroll: unknown;\n /** 内容超出时一直显示 */\n always: unknown;\n}\n\n/** 未声明的属性落到外层(决定尺寸的那一层);视口的属性(aria-label 等)用 propsViewport */\nexport interface ScrollAreaProps extends PartProps<'div'> {\n /** 可以滚动的方向,默认 y */\n axis?: keyof ScrollAreaAxes;\n /** 滚动条什么时候显示,默认 hover */\n type?: keyof ScrollbarTypes;\n /** 停止滚动、指针离开后多久淡出(毫秒),默认 600 */\n hideDelay?: number;\n /**\n * 内容超出时视口可以用 Tab 聚焦(键盘滚动),默认 true。视口本身另有角色并自己管焦点(列表框、菜单),\n * 或焦点在别处、由那里控制滚动(命令面板的输入框)时关掉,tabindex 由使用方经 propsViewport 给\n */\n focusable?: boolean;\n /** 视口(真正滚动的元素)的部件属性;ref 拿到它可以自己控制滚动 */\n propsViewport?: PartProps<'div'>;\n /** 内容层(视口里包着 children 的 div)的部件属性 */\n propsContent?: PartProps<'div'>;\n /** 滚动条轨道的部件属性,两个方向都用它(data-axis 区分 x、y) */\n propsScrollbar?: PartProps<'div', 'aria-hidden'>;\n /** 滑块的部件属性;大小与位置由组件写在行内样式上 */\n propsThumb?: PartProps<'div'>;\n children?: VNodeChild;\n}\n\n/** 滑块的最小长度(px):内容再长也能抓得住 */\nconst MIN_THUMB = 20;\n\n/** ScrollArea 的样式:root、viewport、y、x、both、wideContent */\nexport const scrollAreaStyles = css.create({\n // flex 纵向:使用方只给 max-height 时视口也能被限制住(视口 min-height: 0 可以收缩)\n root: { position: 'relative', display: 'flex', flexDirection: 'column', overflow: 'hidden' },\n viewport: {\n flexGrow: 1,\n minHeight: 0,\n // 隐藏原生滚动条:Firefox、新版 Chromium 与 Safari 用标准属性,旧版 WebKit 用伪元素\n scrollbarWidth: 'none',\n '::-webkit-scrollbar': { display: 'none' },\n // 焦点环画在里面:外层 overflow: hidden 会裁掉画在外面的\n outlineOffset: `calc(-1 * ${t.borderWidths.sm})`,\n },\n y: { overflowX: 'hidden', overflowY: 'auto' },\n x: { overflowX: 'auto', overflowY: 'hidden' },\n both: { overflow: 'auto' },\n // 横向滚动时内容按自己的宽度撑开,宽度变化也能被 ResizeObserver 观察到\n wideContent: { display: 'table', minWidth: '_full' },\n});\n\n/** OverlayScrollbar 的样式:track、hidden、y、x、yCorner、xCorner、thumb 等 */\nexport const scrollAreaBarStyles = css.create({\n track: {\n position: 'absolute',\n zIndex: 1,\n boxSizing: 'border-box',\n touchAction: 'none',\n userSelect: 'none',\n transition: `opacity ${t.durations.md} ${t.easings.standard}`,\n },\n hidden: { opacity: 0, pointerEvents: 'none' },\n // 整页的滚动条:隐藏时仍接收指针,指针移到窗口边缘就显示出来\n hiddenReveal: { opacity: 0 },\n // 整页的滚动条固定在视口一侧,盖在粘性顶栏之上\n fixed: { position: 'fixed', zIndex: 20 },\n // 粗细:0.5em 的滑块加两侧各 2px 的留白\n y: {\n insetBlock: 0,\n insetInlineEnd: 0,\n width: `calc(${t.space.sm} + 2 * ${t.borderWidths.sm})`,\n },\n x: {\n insetInline: 0,\n bottom: 0,\n height: `calc(${t.space.sm} + 2 * ${t.borderWidths.sm})`,\n },\n // 两个方向都有时让出右下角,两条滚动条不重叠\n yCorner: { bottom: `calc(${t.space.sm} + 2 * ${t.borderWidths.sm})` },\n xCorner: { insetInlineEnd: `calc(${t.space.sm} + 2 * ${t.borderWidths.sm})` },\n thumb: {\n position: 'absolute',\n borderRadius: '_full',\n // 半透明:浮在内容上也不完全遮住下面的文字\n backgroundColor: {\n default: `color-mix(in srgb, ${t.colors.textMuted} 50%, transparent)`,\n ':hover': `color-mix(in srgb, ${t.colors.textMuted} 75%, transparent)`,\n },\n transition: `background-color ${t.durations.sm} ${t.easings.standard}`,\n },\n thumbY: { top: 0, insetInline: '_borderWidths.sm' },\n thumbX: { insetInlineStart: 0, insetBlock: '_borderWidths.sm' },\n});\n\n/** OverlayScrollbar 的属性 */\nexport interface OverlayScrollbarProps {\n /** 方向 */\n axis: 'x' | 'y';\n /** 真正滚动的元素;整页滚动时是 document.scrollingElement(滚动事件在 window 上) */\n viewport: HTMLElement | null;\n /** 内容:它的尺寸变化时重新计算滑块 */\n content: HTMLElement | null;\n /** 指针进入它时显示滚动条(type 为 hover 时);不给时只看指针是否在滚动条上 */\n hoverTarget?: HTMLElement | null;\n /** 什么时候显示,默认 hover */\n type?: keyof ScrollbarTypes;\n /** 停止滚动、指针离开后多久淡出(毫秒),默认 600 */\n hideDelay?: number;\n /** 两个方向都有滚动条:让出右下角 */\n corner?: boolean;\n /** 固定在视口一侧(整页的滚动条):隐藏时仍接收指针,移到窗口边缘就显示 */\n fixed?: boolean;\n /** 轨道的部件属性 */\n propsScrollbar?: PartProps<'div', 'aria-hidden'>;\n /** 滑块的部件属性 */\n propsThumb?: PartProps<'div'>;\n /** 内容是否超出视口(这个方向能不能滚动)变化时调用 */\n onOverflowChange?: (overflowing: boolean) => void;\n}\n\n/**\n * 一个方向的浮层滚动条:轨道与滑块,滚动、悬停时出现,停下后淡出;拖动滑块、点击轨道翻页、滚轮转交给视口。\n * ScrollArea 与 PageScrollbar 都用它。单独一个组件,滚动、悬停只让它自己重新渲染,不牵动内容\n */\nexport const OverlayScrollbar = _component(\n ({\n axis,\n viewport,\n content,\n hoverTarget,\n type = 'hover',\n hideDelay = 600,\n corner = false,\n fixed = false,\n propsScrollbar,\n propsThumb,\n onOverflowChange,\n }: OverlayScrollbarProps) => {\n let track = _state.raw<HTMLElement | null>(null);\n let thumb = _state.raw<HTMLElement | null>(null);\n let overflowing = _state(false);\n let active = _state(false);\n let hovering = false;\n let dragging = false;\n let hideTimer: ReturnType<typeof setTimeout> | undefined;\n\n /** 视口的尺寸与滚动位置;横向时滚动位置取绝对值(从右到左排版时 scrollLeft 为负) */\n const measure = (element: HTMLElement) =>\n axis === 'y'\n ? { view: element.clientHeight, size: element.scrollHeight, position: element.scrollTop }\n : {\n view: element.clientWidth,\n size: element.scrollWidth,\n position: Math.abs(element.scrollLeft),\n };\n /** 从右到左排版时横向的方向要反过来 */\n const sign = () => (axis === 'x' && viewport && isRtl(viewport) ? -1 : 1);\n const thumbSize = (view: number, size: number, trackSize: number) =>\n Math.max(MIN_THUMB, (view / size) * trackSize);\n\n // 滑块的大小与位置随滚动频繁变化,直接写到元素上,不经过渲染。read 量、返回的函数写\n function read() {\n if (!viewport || !track || !thumb) return;\n // 看不见的(收起的 Collapse 是 hidden=\"until-found\",即 content-visibility: hidden)不量:\n // 在这种子树里读尺寸,浏览器每次都要为它单独排一遍版。显示出来时 ResizeObserver 会再通知\n if (viewport.checkVisibility?.() === false) return;\n const element = thumb;\n const { view, size, position } = measure(viewport);\n const trackSize = axis === 'y' ? track.clientHeight : track.clientWidth;\n const length = thumbSize(view, size, trackSize);\n const offset = size > view ? (position / (size - view)) * (trackSize - length) : 0;\n const direction = sign();\n return () => {\n const next = size > view + 1;\n if (next !== overflowing) {\n overflowing = next;\n onOverflowChange?.(next);\n }\n if (axis === 'y') {\n element.style.height = `${length}px`;\n element.style.transform = `translateY(${offset}px)`;\n } else {\n element.style.width = `${length}px`;\n element.style.transform = `translateX(${direction * offset}px)`;\n }\n };\n }\n // 滚动时立即对齐;挂载、尺寸变化时合并到这一轮的先读后写里(一页十几个滚动区域只排一次版)\n const sync = () => read()?.();\n const syncLater = () => batchLayout(read);\n\n // 整页的滚动条(fixed)不论 type,指针移到它上面都显示\n const revealsOnHover = () => type === 'hover' || fixed;\n\n function show() {\n active = true;\n scheduleHide();\n }\n function scheduleHide() {\n clearTimeout(hideTimer);\n hideTimer = setTimeout(() => {\n if (!dragging && !(revealsOnHover() && hovering)) active = false;\n }, hideDelay);\n }\n\n _effect(() => {\n if (!viewport || !content) return;\n const element = viewport;\n // 整页滚动时滚动事件发在 window 上;窗口高度变了(不改变内容尺寸)也要重算\n const scroller = element === document.scrollingElement ? window : element;\n const hover = hoverTarget ?? track;\n syncLater();\n const onScroll = () => {\n sync();\n show();\n };\n const onEnter = () => {\n hovering = true;\n if (!revealsOnHover()) return;\n // 绝对定位的后代(图表的提示框)撑出、收回溢出时内容尺寸不变,ResizeObserver 察觉不到,显示前重新量\n sync();\n show();\n };\n const onLeave = () => {\n hovering = false;\n scheduleHide();\n };\n scroller.addEventListener('scroll', onScroll, { passive: true });\n if (scroller === window) window.addEventListener('resize', sync);\n hover?.addEventListener('pointerenter', onEnter);\n hover?.addEventListener('pointerleave', onLeave);\n return () => {\n scroller.removeEventListener('scroll', onScroll);\n window.removeEventListener('resize', sync);\n hover?.removeEventListener('pointerenter', onEnter);\n hover?.removeEventListener('pointerleave', onLeave);\n clearTimeout(hideTimer);\n };\n });\n useResizeObserver(() => [viewport, content], syncLater);\n\n /** 拖动滑块:位移按“可滚动距离 / 滑块可移动距离”换算成滚动距离 */\n function dragThumb(event: PointerEvent) {\n if (!viewport || !track || !thumb) return;\n event.stopPropagation();\n const element = viewport;\n const { view, size, position } = measure(element);\n const trackSize = axis === 'y' ? track.clientHeight : track.clientWidth;\n const ratio = (size - view) / (trackSize - thumbSize(view, size, trackSize));\n const direction = sign();\n dragging = true;\n startMove(event, {\n onMove: ({ deltaX, deltaY }) => {\n const target = position + (axis === 'y' ? deltaY : direction * deltaX) * ratio;\n if (axis === 'y') element.scrollTop = target;\n else element.scrollLeft = direction * target;\n },\n onEnd: () => {\n dragging = false;\n scheduleHide();\n },\n });\n }\n\n /** 点击轨道的空白处:朝那一侧翻一页 */\n function pageTo(event: PointerEvent) {\n if (!viewport || !thumb || event.button !== 0) return;\n const rect = thumb.getBoundingClientRect();\n const { view } = measure(viewport);\n // 点在滑块之前(上方;横向时为起始一侧)就往回翻\n const rtl = sign() === -1;\n const before =\n axis === 'y'\n ? event.clientY < rect.top\n : rtl\n ? event.clientX > rect.right\n : event.clientX < rect.left;\n const page = (before ? -1 : 1) * view * 0.9;\n viewport.scrollBy(axis === 'y' ? { top: page } : { left: sign() * page });\n }\n\n /** 滚动条盖在视口上面,滚轮落在它上面时转交给视口 */\n function forwardWheel(event: WheelEvent) {\n if (!viewport) return;\n event.preventDefault();\n viewport.scrollBy({ left: event.deltaX, top: event.deltaY });\n }\n\n return () => {\n const visible = overflowing && (type === 'always' || active);\n return (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n scrollAreaBarStyles.track,\n scrollAreaBarStyles[axis],\n fixed && scrollAreaBarStyles.fixed,\n corner &&\n (axis === 'y' ? scrollAreaBarStyles.yCorner : scrollAreaBarStyles.xCorner),\n ],\n },\n propsScrollbar,\n {\n sx:\n !visible && (fixed ? scrollAreaBarStyles.hiddenReveal : scrollAreaBarStyles.hidden),\n ref: _toRef(track),\n 'aria-hidden': true,\n onPointerdown: pageTo,\n onWheel: forwardWheel,\n },\n )}\n data-axis={axis}\n data-state={visible ? 'visible' : 'hidden'}\n >\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n scrollAreaBarStyles.thumb,\n axis === 'y' ? scrollAreaBarStyles.thumbY : scrollAreaBarStyles.thumbX,\n ],\n },\n propsThumb,\n { ref: _toRef(thumb), onPointerdown: dragThumb },\n )}\n />\n </div>\n );\n };\n },\n { name: 'OverlayScrollbar' },\n);\n\n/** 滚动区域:原生滚动 + 半透明的浮层滚动条,出现与消失都不占位 */\nexport const ScrollArea = _component(\n ({\n axis = 'y',\n type = 'hover',\n hideDelay = 600,\n focusable = true,\n propsViewport,\n propsContent,\n propsScrollbar,\n propsThumb,\n children,\n ...rest\n }: ScrollAreaProps) => {\n let root = _state.raw<HTMLElement | null>(null);\n let viewport = _state.raw<HTMLElement | null>(null);\n let content = _state.raw<HTMLElement | null>(null);\n // 哪个方向的内容超出了视口:能滚动时视口才进 Tab 顺序,没超出的侧栏、代码块不多一个空的 Tab 位\n let overflowing = _state({ x: false, y: false });\n\n return () => {\n const both = axis === 'both';\n const bar = (barAxis: 'x' | 'y') => (\n <OverlayScrollbar\n axis={barAxis}\n hoverTarget={root}\n viewport={viewport}\n content={content}\n type={type}\n hideDelay={hideDelay}\n corner={both}\n propsScrollbar={propsScrollbar}\n propsThumb={propsThumb}\n onOverflowChange={(value) => (overflowing = { ...overflowing, [barAxis]: value })}\n />\n );\n return (\n <div {...mergeAttrs<'div'>({ sx: scrollAreaStyles.root }, rest, { ref: _toRef(root) })}>\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [focusRingStyles.visible, scrollAreaStyles.viewport, scrollAreaStyles[axis]],\n },\n propsViewport,\n {\n ref: _toRef(viewport),\n ...(focusable && (overflowing.x || overflowing.y) && { tabindex: 0 }),\n },\n )}\n >\n <div\n {...mergeAttrs<'div'>(\n { sx: axis !== 'y' && scrollAreaStyles.wideContent },\n propsContent,\n {\n ref: _toRef(content),\n },\n )}\n >\n {children}\n </div>\n </div>\n {axis !== 'x' && bar('y')}\n {axis !== 'y' && bar('x')}\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"ScrollArea.js","names":["_vtp_readonlyProp","_vue_shallowRef","_vue_ref","_createVNode","_mergeProps","_vtp_childrenProp","_vtp_restProps"],"sources":["../../src/layout/ScrollArea.tsx"],"sourcesContent":["/**\n * 滚动区域:浮层滚动条。滚动仍是浏览器原生的(触控板惯性、键盘、页内搜索、无障碍都不变),\n * 只把原生滚动条隐藏,换成半透明、绝对定位浮在内容上方的滚动条:出现、消失都不占位,不改变布局尺寸。\n * 参考 Radix ScrollArea。\n *\n * <ScrollArea sx={styles.panel}>…</ScrollArea> 高度(或最大高度)由使用方给\n * <ScrollArea axis=\"both\" type=\"always\">…</ScrollArea>\n *\n * 滚动条对读屏隐藏(滚动由视口本身承担);内容超出时视口可聚焦,键盘照常滚动。\n * 滚动条本身是 OverlayScrollbar:整页的浮层滚动条(PageScrollbar)也用它。\n *\n * 要在外面拿到真正滚动的元素(虚拟滚动、自己控制滚动)时用 propsViewport 的 ref:\n * <ScrollArea propsViewport={{ ref: (element) => (scroller = toElement(element)) }}>…</ScrollArea>\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 { startMove } from '../utils/dom/move';\nimport { mergeAttrs, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { isRtl } from '../utils/dom/direction';\nimport { batchLayout } from '../utils/dom/layout-batch';\nimport { useResizeObserver } from '../utils/dom/resize';\nimport { t } from '../config/theme/tokens';\n\n/** 哪个方向可以滚动 */\nexport interface ScrollAreaAxes {\n /** 纵向(默认),横向超出的部分裁掉 */\n y: unknown;\n /** 横向,纵向超出的部分裁掉 */\n x: unknown;\n /** 两个方向 */\n both: unknown;\n}\n\n/** 滚动条什么时候显示 */\nexport interface ScrollbarTypes {\n /** 指针在区域上方或正在滚动时显示(默认) */\n hover: unknown;\n /** 只在滚动时显示,停下后淡出 */\n scroll: unknown;\n /** 内容超出时一直显示 */\n always: unknown;\n}\n\n/** 未声明的属性落到外层(决定尺寸的那一层);视口的属性(aria-label 等)用 propsViewport */\nexport interface ScrollAreaProps extends PartProps<'div'> {\n /** 可以滚动的方向,默认 y */\n axis?: keyof ScrollAreaAxes;\n /** 滚动条什么时候显示,默认 hover */\n type?: keyof ScrollbarTypes;\n /** 停止滚动、指针离开后多久淡出(毫秒),默认 600 */\n hideDelay?: number;\n /**\n * 内容超出时视口可以用 Tab 聚焦(键盘滚动),默认 true。视口本身另有角色并自己管焦点(列表框、菜单),\n * 或焦点在别处、由那里控制滚动(命令面板的输入框)时关掉,tabindex 由使用方经 propsViewport 给\n */\n focusable?: boolean;\n /** 视口(真正滚动的元素)的部件属性;ref 拿到它可以自己控制滚动 */\n propsViewport?: PartProps<'div'>;\n /** 内容层(视口里包着 children 的 div)的部件属性 */\n propsContent?: PartProps<'div'>;\n /** 滚动条轨道的部件属性,两个方向都用它(data-axis 区分 x、y) */\n propsScrollbar?: PartProps<'div', 'aria-hidden'>;\n /** 滑块的部件属性;大小与位置由组件写在行内样式上 */\n propsThumb?: PartProps<'div'>;\n children?: VNodeChild;\n}\n\n/** 滑块的最小长度(px):内容再长也能抓得住 */\nconst MIN_THUMB = 20;\n\n/** ScrollArea 的样式:root、viewport、y、x、both、wideContent */\nexport const scrollAreaStyles = css.create({\n // flex 纵向:使用方只给 max-height 时视口也能被限制住(视口 min-height: 0 可以收缩)\n root: { position: 'relative', display: 'flex', flexDirection: 'column', overflow: 'hidden' },\n viewport: {\n flexGrow: 1,\n minHeight: 0,\n // 隐藏原生滚动条:Firefox、新版 Chromium 与 Safari 用标准属性,旧版 WebKit 用伪元素\n scrollbarWidth: 'none',\n '::-webkit-scrollbar': { display: 'none' },\n // 焦点环画在里面:外层 overflow: hidden 会裁掉画在外面的\n outlineOffset: `calc(-1 * ${t.borderWidths.sm})`,\n },\n y: { overflowX: 'hidden', overflowY: 'auto' },\n x: { overflowX: 'auto', overflowY: 'hidden' },\n both: { overflow: 'auto' },\n // 横向滚动时内容按自己的宽度撑开,宽度变化也能被 ResizeObserver 观察到\n wideContent: { display: 'table', minWidth: '_full' },\n});\n\n/** OverlayScrollbar 的样式:track、hidden、y、x、yCorner、xCorner、thumb 等 */\nexport const scrollAreaBarStyles = css.create({\n track: {\n position: 'absolute',\n zIndex: 1,\n boxSizing: 'border-box',\n touchAction: 'none',\n userSelect: 'none',\n transition: `opacity ${t.durations.md} ${t.easings.standard}`,\n },\n hidden: { opacity: 0, pointerEvents: 'none' },\n // 整页的滚动条:隐藏时仍接收指针,指针移到窗口边缘就显示出来\n hiddenReveal: { opacity: 0 },\n // 整页的滚动条固定在视口一侧,盖在粘性顶栏之上\n fixed: { position: 'fixed', zIndex: 20 },\n // 粗细:0.5em 的滑块加两侧各 2px 的留白\n y: {\n insetBlock: 0,\n insetInlineEnd: 0,\n width: `calc(${t.space.sm} + 2 * ${t.borderWidths.sm})`,\n },\n x: {\n insetInline: 0,\n bottom: 0,\n height: `calc(${t.space.sm} + 2 * ${t.borderWidths.sm})`,\n },\n // 两个方向都有时让出右下角,两条滚动条不重叠\n yCorner: { bottom: `calc(${t.space.sm} + 2 * ${t.borderWidths.sm})` },\n xCorner: { insetInlineEnd: `calc(${t.space.sm} + 2 * ${t.borderWidths.sm})` },\n thumb: {\n position: 'absolute',\n borderRadius: '_full',\n // 半透明:浮在内容上也不完全遮住下面的文字\n backgroundColor: {\n default: `color-mix(in srgb, ${t.colors.textMuted} 50%, transparent)`,\n ':hover': `color-mix(in srgb, ${t.colors.textMuted} 75%, transparent)`,\n },\n transition: `background-color ${t.durations.sm} ${t.easings.standard}`,\n },\n thumbY: { top: 0, insetInline: '_borderWidths.sm' },\n thumbX: { insetInlineStart: 0, insetBlock: '_borderWidths.sm' },\n});\n\n/** OverlayScrollbar 的属性 */\nexport interface OverlayScrollbarProps {\n /** 方向 */\n axis: 'x' | 'y';\n /** 真正滚动的元素;整页滚动时是 document.scrollingElement(滚动事件在 window 上) */\n viewport: HTMLElement | null;\n /** 内容:它的尺寸变化时重新计算滑块 */\n content: HTMLElement | null;\n /** 指针进入它时显示滚动条(type 为 hover 时);不给时只看指针是否在滚动条上 */\n hoverTarget?: HTMLElement | null;\n /** 什么时候显示,默认 hover */\n type?: keyof ScrollbarTypes;\n /** 停止滚动、指针离开后多久淡出(毫秒),默认 600 */\n hideDelay?: number;\n /** 两个方向都有滚动条:让出右下角 */\n corner?: boolean;\n /** 固定在视口一侧(整页的滚动条):隐藏时仍接收指针,移到窗口边缘就显示 */\n fixed?: boolean;\n /** 轨道的部件属性 */\n propsScrollbar?: PartProps<'div', 'aria-hidden'>;\n /** 滑块的部件属性 */\n propsThumb?: PartProps<'div'>;\n /** 内容是否超出视口(这个方向能不能滚动)变化时调用 */\n onOverflowChange?: (overflowing: boolean) => void;\n}\n\n/**\n * 一个方向的浮层滚动条:轨道与滑块,滚动、悬停时出现,停下后淡出;拖动滑块、点击轨道翻页、滚轮转交给视口。\n * ScrollArea 与 PageScrollbar 都用它。单独一个组件,滚动、悬停只让它自己重新渲染,不牵动内容\n */\nexport const OverlayScrollbar = _component(\n ({\n axis,\n viewport,\n content,\n hoverTarget,\n type = 'hover',\n hideDelay = 600,\n corner = false,\n fixed = false,\n propsScrollbar,\n propsThumb,\n onOverflowChange,\n }: OverlayScrollbarProps) => {\n let track = _state.raw<HTMLElement | null>(null);\n let thumb = _state.raw<HTMLElement | null>(null);\n let overflowing = _state(false);\n let active = _state(false);\n let hovering = false;\n let dragging = false;\n let hideTimer: ReturnType<typeof setTimeout> | undefined;\n\n /** 视口的尺寸与滚动位置;横向时滚动位置取绝对值(从右到左排版时 scrollLeft 为负) */\n const measure = (element: HTMLElement) =>\n axis === 'y'\n ? { view: element.clientHeight, size: element.scrollHeight, position: element.scrollTop }\n : {\n view: element.clientWidth,\n size: element.scrollWidth,\n position: Math.abs(element.scrollLeft),\n };\n /** 从右到左排版时横向的方向要反过来 */\n const sign = () => (axis === 'x' && viewport && isRtl(viewport) ? -1 : 1);\n const thumbSize = (view: number, size: number, trackSize: number) =>\n Math.max(MIN_THUMB, (view / size) * trackSize);\n\n // 滑块的大小与位置随滚动频繁变化,直接写到元素上,不经过渲染。read 量、返回的函数写\n function read() {\n if (!viewport || !track || !thumb) return;\n // 看不见的(收起的 Collapse 是 hidden=\"until-found\",即 content-visibility: hidden)不量:\n // 在这种子树里读尺寸,浏览器每次都要为它单独排一遍版。显示出来时 ResizeObserver 会再通知\n if (viewport.checkVisibility?.() === false) return;\n const element = thumb;\n const { view, size, position } = measure(viewport);\n const trackSize = axis === 'y' ? track.clientHeight : track.clientWidth;\n const length = thumbSize(view, size, trackSize);\n const offset = size > view ? (position / (size - view)) * (trackSize - length) : 0;\n const direction = sign();\n return () => {\n const next = size > view + 1;\n if (next !== overflowing) {\n overflowing = next;\n onOverflowChange?.(next);\n }\n if (axis === 'y') {\n element.style.height = `${length}px`;\n element.style.transform = `translateY(${offset}px)`;\n } else {\n element.style.width = `${length}px`;\n element.style.transform = `translateX(${direction * offset}px)`;\n }\n };\n }\n // 滚动时立即对齐;挂载、尺寸变化时合并到这一轮的先读后写里(一页十几个滚动区域只排一次版)\n const sync = () => read()?.();\n const syncLater = () => batchLayout(read);\n\n // 整页的滚动条(fixed)不论 type,指针移到它上面都显示\n const revealsOnHover = () => type === 'hover' || fixed;\n\n function show() {\n active = true;\n scheduleHide();\n }\n function scheduleHide() {\n clearTimeout(hideTimer);\n hideTimer = setTimeout(() => {\n if (!dragging && !(revealsOnHover() && hovering)) active = false;\n }, hideDelay);\n }\n\n _effect(() => {\n if (!viewport || !content) return;\n const element = viewport;\n // 整页滚动时滚动事件发在 window 上;窗口高度变了(不改变内容尺寸)也要重算\n const scroller = element === document.scrollingElement ? window : element;\n const hover = hoverTarget ?? track;\n syncLater();\n const onScroll = () => {\n sync();\n show();\n };\n const onEnter = () => {\n hovering = true;\n if (!revealsOnHover()) return;\n // 绝对定位的后代(图表的提示框)撑出、收回溢出时内容尺寸不变,ResizeObserver 察觉不到,显示前重新量\n sync();\n show();\n };\n const onLeave = () => {\n hovering = false;\n scheduleHide();\n };\n scroller.addEventListener('scroll', onScroll, { passive: true });\n if (scroller === window) window.addEventListener('resize', sync);\n hover?.addEventListener('pointerenter', onEnter);\n hover?.addEventListener('pointerleave', onLeave);\n return () => {\n scroller.removeEventListener('scroll', onScroll);\n window.removeEventListener('resize', sync);\n hover?.removeEventListener('pointerenter', onEnter);\n hover?.removeEventListener('pointerleave', onLeave);\n clearTimeout(hideTimer);\n };\n });\n useResizeObserver(() => [viewport, content], syncLater);\n\n /** 拖动滑块:位移按“可滚动距离 / 滑块可移动距离”换算成滚动距离 */\n function dragThumb(event: PointerEvent) {\n if (!viewport || !track || !thumb) return;\n event.stopPropagation();\n const element = viewport;\n const { view, size, position } = measure(element);\n const trackSize = axis === 'y' ? track.clientHeight : track.clientWidth;\n const ratio = (size - view) / (trackSize - thumbSize(view, size, trackSize));\n const direction = sign();\n dragging = true;\n startMove(event, {\n onMove: ({ deltaX, deltaY }) => {\n const target = position + (axis === 'y' ? deltaY : direction * deltaX) * ratio;\n if (axis === 'y') element.scrollTop = target;\n else element.scrollLeft = direction * target;\n },\n onEnd: () => {\n dragging = false;\n scheduleHide();\n },\n });\n }\n\n /** 点击轨道的空白处:朝那一侧翻一页 */\n function pageTo(event: PointerEvent) {\n if (!viewport || !thumb || event.button !== 0) return;\n const rect = thumb.getBoundingClientRect();\n const { view } = measure(viewport);\n // 点在滑块之前(上方;横向时为起始一侧)就往回翻\n const rtl = sign() === -1;\n const before =\n axis === 'y'\n ? event.clientY < rect.top\n : rtl\n ? event.clientX > rect.right\n : event.clientX < rect.left;\n const page = (before ? -1 : 1) * view * 0.9;\n viewport.scrollBy(axis === 'y' ? { top: page } : { left: sign() * page });\n }\n\n /** 滚动条盖在视口上面,滚轮落在它上面时转交给视口 */\n function forwardWheel(event: WheelEvent) {\n if (!viewport) return;\n event.preventDefault();\n viewport.scrollBy({ left: event.deltaX, top: event.deltaY });\n }\n\n return () => {\n const visible = overflowing && (type === 'always' || active);\n return (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n scrollAreaBarStyles.track,\n scrollAreaBarStyles[axis],\n fixed && scrollAreaBarStyles.fixed,\n corner &&\n (axis === 'y' ? scrollAreaBarStyles.yCorner : scrollAreaBarStyles.xCorner),\n ],\n },\n propsScrollbar,\n {\n sx:\n !visible && (fixed ? scrollAreaBarStyles.hiddenReveal : scrollAreaBarStyles.hidden),\n ref: _toRef(track),\n 'aria-hidden': true,\n onPointerdown: pageTo,\n onWheel: forwardWheel,\n },\n )}\n data-axis={axis}\n data-state={visible ? 'visible' : 'hidden'}\n >\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n scrollAreaBarStyles.thumb,\n axis === 'y' ? scrollAreaBarStyles.thumbY : scrollAreaBarStyles.thumbX,\n ],\n },\n propsThumb,\n { ref: _toRef(thumb), onPointerdown: dragThumb },\n )}\n />\n </div>\n );\n };\n },\n { name: 'OverlayScrollbar' },\n);\n\n/** 滚动区域:原生滚动 + 半透明的浮层滚动条,出现与消失都不占位 */\nexport const ScrollArea = _component(\n ({\n axis = 'y',\n type = 'hover',\n hideDelay = 600,\n focusable = true,\n propsViewport,\n propsContent,\n propsScrollbar,\n propsThumb,\n children,\n ...rest\n }: ScrollAreaProps) => {\n let root = _state.raw<HTMLElement | null>(null);\n let viewport = _state.raw<HTMLElement | null>(null);\n let content = _state.raw<HTMLElement | null>(null);\n // 哪个方向的内容超出了视口:能滚动时视口才进 Tab 顺序,没超出的侧栏、代码块不多一个空的 Tab 位\n let overflowing = _state({ x: false, y: false });\n\n return () => {\n const both = axis === 'both';\n const bar = (barAxis: 'x' | 'y') => (\n <OverlayScrollbar\n axis={barAxis}\n hoverTarget={root}\n viewport={viewport}\n content={content}\n type={type}\n hideDelay={hideDelay}\n corner={both}\n propsScrollbar={propsScrollbar}\n propsThumb={propsThumb}\n onOverflowChange={(value) => (overflowing = { ...overflowing, [barAxis]: value })}\n />\n );\n return (\n <div {...mergeAttrs<'div'>({ sx: scrollAreaStyles.root }, rest, { ref: _toRef(root) })}>\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [focusRingStyles.visible, scrollAreaStyles.viewport, scrollAreaStyles[axis]],\n },\n propsViewport,\n {\n ref: _toRef(viewport),\n ...(focusable && (overflowing.x || overflowing.y) && { tabindex: 0 }),\n },\n )}\n >\n <div\n {...mergeAttrs<'div'>(\n { sx: axis !== 'y' && scrollAreaStyles.wideContent },\n propsContent,\n {\n ref: _toRef(content),\n },\n )}\n >\n {children}\n </div>\n </div>\n {axis !== 'x' && bar('y')}\n {axis !== 'y' && bar('x')}\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { mergeAttrs } from "../utils/props.js";
2
- import { createVNode, mergeProps, useId } from "vue";
3
- import { _component, childrenProp, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
2
+ import { createVNode, useId } from "vue";
3
+ import { _component, childrenProp, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
4
4
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
5
5
  //#region src/layout/Separator.tsx
6
6
  /** 角色与朝向由组件管理 */
@@ -71,7 +71,7 @@ var Separator = /*#__PURE__*/ _component((_props, _ctx) => {
71
71
  "aria-hidden": decorative.value ? "true" : void 0
72
72
  }), null);
73
73
  const line = () => createVNode("span", mergeAttrs({ sx: separatorStyles.line }, propsLine.value, { "aria-hidden": true }), null);
74
- return createVNode("div", mergeProps(mergeAttrs({ sx: separatorStyles.labelled }, rest, {
74
+ return createVNode("div", mergeJsxProps(mergeAttrs({ sx: separatorStyles.labelled }, rest, {
75
75
  role: decorative.value ? "none" : "separator",
76
76
  "aria-labelledby": decorative.value ? void 0 : labelId
77
77
  }), { "data-label-align": labelAlign.value }), [
@@ -1 +1 @@
1
- {"version":3,"file":"Separator.js","names":["_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_createVNode","_mergeProps"],"sources":["../../src/layout/Separator.tsx"],"sourcesContent":["/**\n * 分隔线。默认是装饰性的(对读屏隐藏);分隔的是两组不同的内容、需要读屏感知时设 decorative={false},\n * 渲染为 role=\"separator\"(竖向时带 aria-orientation)。\n *\n * <Separator />\n * <Flex align=\"center\" gap=\"sm\">A<Separator orientation=\"vertical\" />B</Flex>\n * <Separator>或者</Separator> 横线中间带文字\n * <Separator labelAlign=\"start\">更改后</Separator> 文字靠起始边,线在后面\n *\n * 带文字(只用于横线)时:文字照常给读屏,两段线对读屏隐藏;decorative={false} 时整条是 role=\"separator\"、以文字为名称。\n *\n * 部件:Root(div);带文字时还有 Label(span)与 Line(两段线,span)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, type VNodeChild } from 'vue';\nimport { mergeAttrs, type PartProps } from '../utils/props';\n\n/** 角色与朝向由组件管理 */\nexport type SeparatorManaged = 'role' | 'aria-orientation' | 'aria-hidden';\n\n/** 分隔线方向 */\nexport interface SeparatorOrientations {\n /** 横线:上下两部分之间,占满容器宽度(默认) */\n horizontal: unknown;\n /** 竖线:左右两部分之间,在 flex 容器里随行高拉伸 */\n vertical: unknown;\n}\n\n/** 文字在横线上的位置 */\nexport interface SeparatorLabelAligns {\n /** 起始边:文字在前、线在后,像一节的小标题 */\n start: unknown;\n /** 居中(默认):两边各一段线,如“或者” */\n center: unknown;\n /** 结束边 */\n end: unknown;\n}\n\n/** 未声明的属性落到 div 上 */\nexport interface SeparatorProps extends PartProps<'div', SeparatorManaged> {\n /** 方向,默认 horizontal */\n orientation?: keyof SeparatorOrientations;\n /** 是否只是视觉装饰,默认 true:对读屏隐藏(带文字时文字仍给读屏) */\n decorative?: boolean;\n /** 带文字时文字的位置,默认 center */\n labelAlign?: keyof SeparatorLabelAligns;\n /** 文字的部件属性 */\n propsLabel?: PartProps<'span'>;\n /** 两段线的部件属性 */\n propsLine?: PartProps<'span', 'aria-hidden'>;\n /** 线上的文字(只用于横线) */\n children?: VNodeChild;\n}\n\n/** Separator 的样式:root、horizontal、vertical、labelled、label、line */\nexport const separatorStyles = css.create({\n // Windows 高对比(forced-colors)下系统会把背景色改掉,线就看不见了:改用系统的文字色并保留它\n root: {\n flexShrink: 0,\n backgroundColor: { default: '_borderMuted', _forcedColors: 'CanvasText' },\n forcedColorAdjust: { default: null, _forcedColors: 'none' },\n },\n horizontal: { height: '_borderWidths.xs', width: '_full' },\n // 在 flex 容器里随行高拉伸\n vertical: { width: '_borderWidths.xs', alignSelf: 'stretch' },\n // 带文字:外层不画线,两段线各自伸展\n labelled: {\n display: 'flex',\n alignItems: 'center',\n gap: '_md',\n width: '_full',\n color: '_textMuted',\n // 比所在文字小一档(0.93em ≈ 默认字号下的 sm)\n fontSize: '0.93em',\n lineHeight: '_tight',\n },\n label: { flexShrink: 0, whiteSpace: 'nowrap' },\n line: {\n flexGrow: 1,\n height: '_borderWidths.xs',\n backgroundColor: { default: '_borderMuted', _forcedColors: 'CanvasText' },\n forcedColorAdjust: { default: null, _forcedColors: 'none' },\n },\n});\n\n/** 分隔线(div):默认装饰性、对读屏隐藏;decorative={false} 时为 role=\"separator\";可以带文字 */\nexport const Separator = _component(\n ({\n orientation = 'horizontal',\n decorative = true,\n labelAlign = 'center',\n propsLabel,\n propsLine,\n children,\n ...rest\n }: SeparatorProps) => {\n const labelId = useId();\n return () => {\n if (children == null || orientation === 'vertical') {\n return (\n <div\n {...mergeAttrs<'div'>(\n { sx: [separatorStyles.root, separatorStyles[orientation]] },\n rest,\n {\n role: decorative ? 'none' : 'separator',\n 'aria-orientation':\n !decorative && orientation === 'vertical' ? 'vertical' : undefined,\n 'aria-hidden': decorative ? 'true' : undefined,\n },\n )}\n />\n );\n }\n const line = () => (\n <span\n {...mergeAttrs<'span'>({ sx: separatorStyles.line }, propsLine, { 'aria-hidden': true })}\n />\n );\n return (\n <div\n {...mergeAttrs<'div'>({ sx: separatorStyles.labelled }, rest, {\n role: decorative ? 'none' : 'separator',\n 'aria-labelledby': decorative ? undefined : labelId,\n })}\n data-label-align={labelAlign}\n >\n {labelAlign !== 'start' && line()}\n <span {...mergeAttrs<'span'>({ sx: separatorStyles.label }, propsLabel, { id: labelId })}>\n {children}\n </span>\n {labelAlign !== 'end' && line()}\n </div>\n );\n };\n },\n);\n"],"mappings":";;;;;;;;;;AAwDA,IAAa,kBAAkB,IAAI,OAAO;CAExC,MAAM;EACJ,YAAY;EACZ,iBAAiB;GAAE,SAAS;GAAgB,eAAe;EAAa;EACxE,mBAAmB;GAAE,SAAS;GAAM,eAAe;EAAO;CAC5D;CACA,YAAY;EAAE,QAAQ;EAAoB,OAAO;CAAQ;CAEzD,UAAU;EAAE,OAAO;EAAoB,WAAW;CAAU;CAE5D,UAAU;EACR,SAAS;EACT,YAAY;EACZ,KAAK;EACL,OAAO;EACP,OAAO;EAEP,UAAU;EACV,YAAY;CACd;CACA,OAAO;EAAE,YAAY;EAAG,YAAY;CAAS;CAC7C,MAAM;EACJ,UAAU;EACV,QAAQ;EACR,iBAAiB;GAAE,SAAS;GAAgB,eAAe;EAAa;EACxE,mBAAmB;GAAE,SAAS;GAAM,eAAe;EAAO;CAC5D;AACF,CAAC;;AAGD,IAAa,YAAY,0BACvB,QAAA,SAQsB;CAAA,MAAA,cAAAA,aAAA,QAAA,eAPN,YAAY;CAAA,MAAA,aAAAA,aAAA,QAAA,cACb,IAAI;CAAA,MAAA,aAAAA,aAAA,QAAA,cACJ,QAAQ;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,WAAAC,aAAA,MAAA;CAAA,MAIlB,OAAIC,UAAA,QAAA,MAAA,KAAA;CAEP,MAAM,UAAU,MAAM;CACtB,aAAa;EACX,IAAI,SAAA,SAAY,QAAQ,YAAA,UAAgB,YACtC,OAAAC,YAAA,OAEQ,WACF,EAAE,IAAI,CAAC,gBAAgB,MAAM,gBAAe,YAAA,MAAa,EAAE,GAC3D,MACA;GACE,MAAM,WAAA,QAAa,SAAS;GAC5B,oBACE,CAAA,WAAA,SAAe,YAAA,UAAgB,aAAa,aAAa,KAAA;GAC3D,eAAe,WAAA,QAAa,SAAS,KAAA;EACvC,CACF,GAAC,IAAA;EAIP,MAAM,aAAOA,YAAA,QAEL,WAAmB,EAAE,IAAI,gBAAgB,KAAK,GAAC,UAAA,OAAa,EAAE,eAAe,KAAK,CAAC,GAAC,IAAA;EAG5F,OAAAA,YAAA,OAAAC,WAEQ,WAAkB,EAAE,IAAI,gBAAgB,SAAS,GAAG,MAAM;GAC5D,MAAM,WAAA,QAAa,SAAS;GAC5B,mBAAmB,WAAA,QAAa,KAAA,IAAY;EAC9C,CAAC,GAAC,EAAA,oBAAA,WAAA,MAAA,CAAA,GAAA;GAGD,WAAA,UAAe,WAAW,KAAK;GAACD,YAAA,QACvB,WAAmB,EAAE,IAAI,gBAAgB,MAAM,GAAC,WAAA,OAAc,EAAE,IAAI,QAAQ,CAAC,GAAC,CAAA,SAAA,KAAA,CAAA;GAGvF,WAAA,UAAe,SAAS,KAAK;EAAC,CAAA;CAGrC;AACF,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
1
+ {"version":3,"file":"Separator.js","names":["_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_createVNode","_mergeProps"],"sources":["../../src/layout/Separator.tsx"],"sourcesContent":["/**\n * 分隔线。默认是装饰性的(对读屏隐藏);分隔的是两组不同的内容、需要读屏感知时设 decorative={false},\n * 渲染为 role=\"separator\"(竖向时带 aria-orientation)。\n *\n * <Separator />\n * <Flex align=\"center\" gap=\"sm\">A<Separator orientation=\"vertical\" />B</Flex>\n * <Separator>或者</Separator> 横线中间带文字\n * <Separator labelAlign=\"start\">更改后</Separator> 文字靠起始边,线在后面\n *\n * 带文字(只用于横线)时:文字照常给读屏,两段线对读屏隐藏;decorative={false} 时整条是 role=\"separator\"、以文字为名称。\n *\n * 部件:Root(div);带文字时还有 Label(span)与 Line(两段线,span)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, type VNodeChild } from 'vue';\nimport { mergeAttrs, type PartProps } from '../utils/props';\n\n/** 角色与朝向由组件管理 */\nexport type SeparatorManaged = 'role' | 'aria-orientation' | 'aria-hidden';\n\n/** 分隔线方向 */\nexport interface SeparatorOrientations {\n /** 横线:上下两部分之间,占满容器宽度(默认) */\n horizontal: unknown;\n /** 竖线:左右两部分之间,在 flex 容器里随行高拉伸 */\n vertical: unknown;\n}\n\n/** 文字在横线上的位置 */\nexport interface SeparatorLabelAligns {\n /** 起始边:文字在前、线在后,像一节的小标题 */\n start: unknown;\n /** 居中(默认):两边各一段线,如“或者” */\n center: unknown;\n /** 结束边 */\n end: unknown;\n}\n\n/** 未声明的属性落到 div 上 */\nexport interface SeparatorProps extends PartProps<'div', SeparatorManaged> {\n /** 方向,默认 horizontal */\n orientation?: keyof SeparatorOrientations;\n /** 是否只是视觉装饰,默认 true:对读屏隐藏(带文字时文字仍给读屏) */\n decorative?: boolean;\n /** 带文字时文字的位置,默认 center */\n labelAlign?: keyof SeparatorLabelAligns;\n /** 文字的部件属性 */\n propsLabel?: PartProps<'span'>;\n /** 两段线的部件属性 */\n propsLine?: PartProps<'span', 'aria-hidden'>;\n /** 线上的文字(只用于横线) */\n children?: VNodeChild;\n}\n\n/** Separator 的样式:root、horizontal、vertical、labelled、label、line */\nexport const separatorStyles = css.create({\n // Windows 高对比(forced-colors)下系统会把背景色改掉,线就看不见了:改用系统的文字色并保留它\n root: {\n flexShrink: 0,\n backgroundColor: { default: '_borderMuted', _forcedColors: 'CanvasText' },\n forcedColorAdjust: { default: null, _forcedColors: 'none' },\n },\n horizontal: { height: '_borderWidths.xs', width: '_full' },\n // 在 flex 容器里随行高拉伸\n vertical: { width: '_borderWidths.xs', alignSelf: 'stretch' },\n // 带文字:外层不画线,两段线各自伸展\n labelled: {\n display: 'flex',\n alignItems: 'center',\n gap: '_md',\n width: '_full',\n color: '_textMuted',\n // 比所在文字小一档(0.93em ≈ 默认字号下的 sm)\n fontSize: '0.93em',\n lineHeight: '_tight',\n },\n label: { flexShrink: 0, whiteSpace: 'nowrap' },\n line: {\n flexGrow: 1,\n height: '_borderWidths.xs',\n backgroundColor: { default: '_borderMuted', _forcedColors: 'CanvasText' },\n forcedColorAdjust: { default: null, _forcedColors: 'none' },\n },\n});\n\n/** 分隔线(div):默认装饰性、对读屏隐藏;decorative={false} 时为 role=\"separator\";可以带文字 */\nexport const Separator = _component(\n ({\n orientation = 'horizontal',\n decorative = true,\n labelAlign = 'center',\n propsLabel,\n propsLine,\n children,\n ...rest\n }: SeparatorProps) => {\n const labelId = useId();\n return () => {\n if (children == null || orientation === 'vertical') {\n return (\n <div\n {...mergeAttrs<'div'>(\n { sx: [separatorStyles.root, separatorStyles[orientation]] },\n rest,\n {\n role: decorative ? 'none' : 'separator',\n 'aria-orientation':\n !decorative && orientation === 'vertical' ? 'vertical' : undefined,\n 'aria-hidden': decorative ? 'true' : undefined,\n },\n )}\n />\n );\n }\n const line = () => (\n <span\n {...mergeAttrs<'span'>({ sx: separatorStyles.line }, propsLine, { 'aria-hidden': true })}\n />\n );\n return (\n <div\n {...mergeAttrs<'div'>({ sx: separatorStyles.labelled }, rest, {\n role: decorative ? 'none' : 'separator',\n 'aria-labelledby': decorative ? undefined : labelId,\n })}\n data-label-align={labelAlign}\n >\n {labelAlign !== 'start' && line()}\n <span {...mergeAttrs<'span'>({ sx: separatorStyles.label }, propsLabel, { id: labelId })}>\n {children}\n </span>\n {labelAlign !== 'end' && line()}\n </div>\n );\n };\n },\n);\n"],"mappings":";;;;;;;;;;AAwDA,IAAa,kBAAkB,IAAI,OAAO;CAExC,MAAM;EACJ,YAAY;EACZ,iBAAiB;GAAE,SAAS;GAAgB,eAAe;EAAa;EACxE,mBAAmB;GAAE,SAAS;GAAM,eAAe;EAAO;CAC5D;CACA,YAAY;EAAE,QAAQ;EAAoB,OAAO;CAAQ;CAEzD,UAAU;EAAE,OAAO;EAAoB,WAAW;CAAU;CAE5D,UAAU;EACR,SAAS;EACT,YAAY;EACZ,KAAK;EACL,OAAO;EACP,OAAO;EAEP,UAAU;EACV,YAAY;CACd;CACA,OAAO;EAAE,YAAY;EAAG,YAAY;CAAS;CAC7C,MAAM;EACJ,UAAU;EACV,QAAQ;EACR,iBAAiB;GAAE,SAAS;GAAgB,eAAe;EAAa;EACxE,mBAAmB;GAAE,SAAS;GAAM,eAAe;EAAO;CAC5D;AACF,CAAC;;AAGD,IAAa,YAAY,0BACvB,QAAA,SAQsB;CAAA,MAAA,cAAAA,aAAA,QAAA,eAPN,YAAY;CAAA,MAAA,aAAAA,aAAA,QAAA,cACb,IAAI;CAAA,MAAA,aAAAA,aAAA,QAAA,cACJ,QAAQ;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,WAAAC,aAAA,MAAA;CAAA,MAIlB,OAAIC,UAAA,QAAA,MAAA,KAAA;CAEP,MAAM,UAAU,MAAM;CACtB,aAAa;EACX,IAAI,SAAA,SAAY,QAAQ,YAAA,UAAgB,YACtC,OAAAC,YAAA,OAEQ,WACF,EAAE,IAAI,CAAC,gBAAgB,MAAM,gBAAe,YAAA,MAAa,EAAE,GAC3D,MACA;GACE,MAAM,WAAA,QAAa,SAAS;GAC5B,oBACE,CAAA,WAAA,SAAe,YAAA,UAAgB,aAAa,aAAa,KAAA;GAC3D,eAAe,WAAA,QAAa,SAAS,KAAA;EACvC,CACF,GAAC,IAAA;EAIP,MAAM,aAAOA,YAAA,QAEL,WAAmB,EAAE,IAAI,gBAAgB,KAAK,GAAC,UAAA,OAAa,EAAE,eAAe,KAAK,CAAC,GAAC,IAAA;EAG5F,OAAAA,YAAA,OAAAC,cAEQ,WAAkB,EAAE,IAAI,gBAAgB,SAAS,GAAG,MAAM;GAC5D,MAAM,WAAA,QAAa,SAAS;GAC5B,mBAAmB,WAAA,QAAa,KAAA,IAAY;EAC9C,CAAC,GAAC,EAAA,oBAAA,WAAA,MAAA,CAAA,GAAA;GAGD,WAAA,UAAe,WAAW,KAAK;GAACD,YAAA,QACvB,WAAmB,EAAE,IAAI,gBAAgB,MAAM,GAAC,WAAA,OAAc,EAAE,IAAI,QAAQ,CAAC,GAAC,CAAA,SAAA,KAAA,CAAA;GAGvF,WAAA,UAAe,SAAS,KAAK;EAAC,CAAA;CAGrC;AACF,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
@@ -5,8 +5,8 @@ import { focusRingStyles } from "../utils/style/styles.js";
5
5
  import { IconButton } from "../base/IconButton.js";
6
6
  import { startMove } from "../utils/dom/move.js";
7
7
  import { inlineArrows, isRtl } from "../utils/dom/direction.js";
8
- import { createVNode, mergeProps, shallowRef, useId } from "vue";
9
- import { _component, bindable, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
8
+ import { createVNode, shallowRef, useId } from "vue";
9
+ import { _component, bindable, mergeJsxProps, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
10
10
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
11
11
  import { ChevronDown, ChevronLeft, ChevronRight, ChevronUp } from "@lucide/icons";
12
12
  //#region src/layout/Splitter.tsx
@@ -162,7 +162,7 @@ var Splitter = /*#__PURE__*/ _component((_props, _ctx) => {
162
162
  const hideStart = collapsed.value && collapsible.value === "start";
163
163
  const hideEnd = collapsed.value && collapsible.value === "end";
164
164
  const template = hideStart ? "0 auto minmax(0, 1fr)" : hideEnd ? "minmax(0, 1fr) auto 0" : `minmax(0, ${size.value}fr) auto minmax(0, ${100 - size.value}fr)`;
165
- return createVNode("div", mergeProps(mergeAttrs({ sx: [
165
+ return createVNode("div", mergeJsxProps(mergeAttrs({ sx: [
166
166
  splitterStyles.root,
167
167
  bordered.value && splitterStyles.bordered,
168
168
  horizontal() ? css.bind(splitterDynamicStyles.columns, () => [template]) : css.bind(splitterDynamicStyles.rows, () => [template])
@@ -1 +1 @@
1
- {"version":3,"file":"Splitter.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vtp_untrack","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/layout/Splitter.tsx"],"sourcesContent":["/**\n * 分栏:两栏并排(或上下),中间的分隔条可以拖动调整比例,一侧可以收起。收件箱(左列表、右预览)、\n * 主从视图、编辑器与预览这类“两块都要看、比例因人而异”的布局。\n *\n * <Splitter _size={listSize} collapsible=\"end\" _collapsed={previewHidden}\n * start={<List />} end={<Preview />} />\n *\n * size 是起始一栏占的百分比(父级写 _bind 记住),拖动时夹在 minSize–maxSize 之间;双击分隔条回到初始比例。\n * 分隔条按 WAI-ARIA 的 Window Splitter 模式:role=\"separator\"、可聚焦,←/→(上下排列时 ↑/↓)每次调 5%,\n * Home / End 到最小 / 最大,Enter 收起或展开可收起的那一侧;从右到左排版下左右键自动镜像。\n * 写了 collapsible 时分隔条中间有收起、展开的小按钮;收起的一栏不显示(hidden),另一栏占满。\n * 两栏各自滚动:内容放在里面自己的滚动容器里(或直接用 ScrollArea)。\n */\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, type VNodeChild } from 'vue';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { useLang } from '../config/context';\nimport { clamp } from '../utils/data/number';\nimport { inlineArrows, isRtl } from '../utils/dom/direction';\nimport { startMove } from '../utils/dom/move';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\n\n/** 两栏的排法 */\nexport interface SplitterOrientations {\n /** 左右并排(默认) */\n horizontal: unknown;\n /** 上下排列 */\n vertical: unknown;\n}\n\n/** 未声明的属性落到外层 div 上 */\nexport interface SplitterProps extends PartProps<'div'> {\n /** 起始一栏(左或上)的内容 */\n start: VNodeChild;\n /** 结束一栏(右或下)的内容 */\n end: VNodeChild;\n /**\n * 两栏的排法\n * @default 'horizontal'\n */\n orientation?: keyof SplitterOrientations;\n /**\n * 起始一栏占的百分比:父级写 _size={x} 记住拖动后的比例\n * @default 50\n */\n _size?: number;\n /**\n * 起始一栏最少占多少(百分比)\n * @default 20\n */\n minSize?: number;\n /**\n * 起始一栏最多占多少(百分比)\n * @default 80\n */\n maxSize?: number;\n /** 哪一侧可以收起;不写时不能收起 */\n collapsible?: 'start' | 'end';\n /** 可收起的那一侧收着:父级写 _collapsed={x} */\n _collapsed?: boolean;\n /** 分隔条的名称(读屏),默认取语言包(调整分栏) */\n label?: string;\n /** 外面一圈边框、圆角与表面色:独立成块(收件箱的列表与预览) */\n bordered?: boolean;\n /** 起始一栏(div)的部件属性 */\n propsStart?: PartProps<'div'>;\n /** 结束一栏(div)的部件属性 */\n propsEnd?: PartProps<'div'>;\n /** 分隔条(div,role=\"separator\")的部件属性 */\n propsHandle?: PartProps<'div'>;\n /** 收起、展开按钮的部件属性 */\n propsToggle?: Partial<IconButtonProps>;\n}\n\n/** 键盘每按一次调多少(百分比) */\nconst STEP = 5;\n\n/** Splitter 的样式:root、pane、handle、line、toggle… */\nexport const splitterStyles = css.create({\n root: { display: 'grid', minWidth: 0, minHeight: 0, height: '100%' },\n bordered: {\n borderWidth: '_xs',\n borderStyle: 'solid',\n borderColor: '_border',\n borderRadius: '_lg',\n backgroundColor: '_surface',\n overflow: 'hidden',\n },\n pane: { minWidth: 0, minHeight: 0, overflow: 'auto' },\n // 分隔条:看得见的是中间一条细线,能拖的范围更宽;悬停、拖动时变成强调色\n // 分隔条所在的格:分隔条铺满它,收起按钮叠在中间(不放进可聚焦的分隔条里:交互元素不能嵌套)\n track: { position: 'relative', display: 'flex', alignItems: 'center', justifyContent: 'center' },\n handle: {\n position: 'absolute',\n inset: 0,\n touchAction: 'none',\n outlineStyle: 'none',\n color: { default: '_borderMuted', ':hover': '_borderStrong', ':focus-visible': '_accent' },\n },\n handleHorizontal: { width: '_space.md', cursor: 'col-resize' },\n handleVertical: { height: '_space.md', cursor: 'row-resize' },\n line: { position: 'absolute', backgroundColor: 'currentColor', pointerEvents: 'none' },\n lineHorizontal: { insetBlock: 0, insetInlineStart: 'calc(50% - 0.5px)', width: '1px' },\n lineVertical: { insetInline: 0, top: 'calc(50% - 0.5px)', height: '1px' },\n // 收起、展开的小按钮压在线上:背景盖住线\n toggle: { position: 'relative', zIndex: 1, backgroundColor: '_surface', cursor: 'pointer' },\n});\n\n/** Splitter 的动态样式:两栏与分隔条的轨道 */\nexport const splitterDynamicStyles = css.create({\n columns: (template: string) => ({ gridTemplateColumns: template }),\n rows: (template: string) => ({ gridTemplateRows: template }),\n});\n\n/** 分栏 */\nexport const Splitter = _component(\n ({\n start,\n end,\n orientation = 'horizontal',\n _size: size = _bindable(50),\n minSize = 20,\n maxSize = 80,\n collapsible,\n _collapsed: collapsed = _bindable(false),\n label,\n bordered = false,\n propsStart,\n propsEnd,\n propsHandle,\n propsToggle,\n ...rest\n }: SplitterProps) => {\n const lang = useLang();\n const id = useId();\n const initialSize = _untrack(size);\n let root = _state.raw<HTMLElement | null>(null);\n const horizontal = () => orientation === 'horizontal';\n const fit = (value: number) => Math.round(clamp(value, minSize, maxSize) * 10) / 10;\n\n function onPointerdown(event: PointerEvent) {\n if (!root || (event.target as Element).closest('button')) return;\n const rect = root.getBoundingClientRect();\n const total = horizontal() ? rect.width : rect.height;\n const from = size;\n const sign = horizontal() && isRtl(root) ? -1 : 1;\n event.preventDefault();\n startMove(event, {\n onMove: ({ deltaX, deltaY }) => {\n const delta = (horizontal() ? deltaX * sign : deltaY) / total;\n size = fit(from + delta * 100);\n // 拖动即展开:收着的一侧被拖出来\n if (collapsed) collapsed = false;\n },\n });\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && collapsible) {\n event.preventDefault();\n collapsed = !collapsed;\n return;\n }\n const { forward, backward } = horizontal()\n ? inlineArrows(root ? isRtl(root) : false)\n : { forward: 'ArrowDown', backward: 'ArrowUp' };\n const next =\n event.key === forward\n ? size + STEP\n : event.key === backward\n ? size - STEP\n : event.key === 'Home'\n ? minSize\n : event.key === 'End'\n ? maxSize\n : null;\n if (next == null) return;\n event.preventDefault();\n size = fit(next);\n if (collapsed) collapsed = false;\n }\n\n /** 收起、展开按钮的箭头:指向收起的方向 */\n const toggleIcon = () => {\n const towardStart = (collapsible === 'start') !== collapsed;\n if (horizontal()) return towardStart ? ChevronLeft : ChevronRight;\n return towardStart ? ChevronUp : ChevronDown;\n };\n\n return () => {\n const hideStart = collapsed && collapsible === 'start';\n const hideEnd = collapsed && collapsible === 'end';\n const template = hideStart\n ? '0 auto minmax(0, 1fr)'\n : hideEnd\n ? 'minmax(0, 1fr) auto 0'\n : `minmax(0, ${size}fr) auto minmax(0, ${100 - size}fr)`;\n return (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n splitterStyles.root,\n bordered && splitterStyles.bordered,\n horizontal()\n ? splitterDynamicStyles.columns(template)\n : splitterDynamicStyles.rows(template),\n ],\n },\n rest,\n { ref: (element: unknown) => (root = element as HTMLElement | null) },\n )}\n data-orientation={orientation}\n data-collapsed={collapsed ? collapsible : undefined}\n >\n <div\n {...mergeAttrs<'div'>({ sx: splitterStyles.pane }, propsStart, {\n id: `${id}-start`,\n hidden: hideStart || undefined,\n })}\n >\n {start}\n </div>\n <div\n {...css.attrs(\n splitterStyles.track,\n horizontal() ? splitterStyles.handleHorizontal : splitterStyles.handleVertical,\n )}\n >\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n splitterStyles.handle,\n horizontal() ? splitterStyles.handleHorizontal : splitterStyles.handleVertical,\n focusRingStyles.visible,\n ],\n },\n propsHandle,\n {\n role: 'separator',\n tabindex: 0,\n 'aria-label': label ?? lang.splitterResize,\n 'aria-orientation': horizontal() ? 'vertical' : 'horizontal',\n 'aria-controls': `${id}-start`,\n 'aria-valuenow': hideStart ? 0 : hideEnd ? 100 : size,\n 'aria-valuemin': minSize,\n 'aria-valuemax': maxSize,\n onPointerdown,\n onKeydown,\n onDblclick: () => (size = fit(initialSize)),\n },\n )}\n >\n <span\n {...css.attrs(\n splitterStyles.line,\n horizontal() ? splitterStyles.lineHorizontal : splitterStyles.lineVertical,\n )}\n />\n </div>\n {collapsible && (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n icon: toggleIcon(),\n size: 'xs',\n variant: 'outline',\n tone: 'neutral',\n sx: splitterStyles.toggle,\n 'aria-label': collapsed ? lang.splitterExpand : lang.splitterCollapse,\n },\n propsToggle,\n {\n 'aria-expanded': !collapsed,\n 'aria-controls': collapsible === 'start' ? `${id}-start` : `${id}-end`,\n // 键盘用户在分隔条上按 Enter:按钮不进 Tab 顺序,免得多停一次\n tabindex: -1,\n onClick: () => (collapsed = !collapsed),\n },\n )}\n />\n )}\n </div>\n <div\n {...mergeAttrs<'div'>({ sx: splitterStyles.pane }, propsEnd, {\n id: `${id}-end`,\n hidden: hideEnd || undefined,\n })}\n >\n {end}\n </div>\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"Splitter.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vtp_untrack","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/layout/Splitter.tsx"],"sourcesContent":["/**\n * 分栏:两栏并排(或上下),中间的分隔条可以拖动调整比例,一侧可以收起。收件箱(左列表、右预览)、\n * 主从视图、编辑器与预览这类“两块都要看、比例因人而异”的布局。\n *\n * <Splitter _size={listSize} collapsible=\"end\" _collapsed={previewHidden}\n * start={<List />} end={<Preview />} />\n *\n * size 是起始一栏占的百分比(父级写 _bind 记住),拖动时夹在 minSize–maxSize 之间;双击分隔条回到初始比例。\n * 分隔条按 WAI-ARIA 的 Window Splitter 模式:role=\"separator\"、可聚焦,←/→(上下排列时 ↑/↓)每次调 5%,\n * Home / End 到最小 / 最大,Enter 收起或展开可收起的那一侧;从右到左排版下左右键自动镜像。\n * 写了 collapsible 时分隔条中间有收起、展开的小按钮;收起的一栏不显示(hidden),另一栏占满。\n * 两栏各自滚动:内容放在里面自己的滚动容器里(或直接用 ScrollArea)。\n */\nimport { ChevronDown, ChevronLeft, ChevronRight, ChevronUp } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, type VNodeChild } from 'vue';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { useLang } from '../config/context';\nimport { clamp } from '../utils/data/number';\nimport { inlineArrows, isRtl } from '../utils/dom/direction';\nimport { startMove } from '../utils/dom/move';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\n\n/** 两栏的排法 */\nexport interface SplitterOrientations {\n /** 左右并排(默认) */\n horizontal: unknown;\n /** 上下排列 */\n vertical: unknown;\n}\n\n/** 未声明的属性落到外层 div 上 */\nexport interface SplitterProps extends PartProps<'div'> {\n /** 起始一栏(左或上)的内容 */\n start: VNodeChild;\n /** 结束一栏(右或下)的内容 */\n end: VNodeChild;\n /**\n * 两栏的排法\n * @default 'horizontal'\n */\n orientation?: keyof SplitterOrientations;\n /**\n * 起始一栏占的百分比:父级写 _size={x} 记住拖动后的比例\n * @default 50\n */\n _size?: number;\n /**\n * 起始一栏最少占多少(百分比)\n * @default 20\n */\n minSize?: number;\n /**\n * 起始一栏最多占多少(百分比)\n * @default 80\n */\n maxSize?: number;\n /** 哪一侧可以收起;不写时不能收起 */\n collapsible?: 'start' | 'end';\n /** 可收起的那一侧收着:父级写 _collapsed={x} */\n _collapsed?: boolean;\n /** 分隔条的名称(读屏),默认取语言包(调整分栏) */\n label?: string;\n /** 外面一圈边框、圆角与表面色:独立成块(收件箱的列表与预览) */\n bordered?: boolean;\n /** 起始一栏(div)的部件属性 */\n propsStart?: PartProps<'div'>;\n /** 结束一栏(div)的部件属性 */\n propsEnd?: PartProps<'div'>;\n /** 分隔条(div,role=\"separator\")的部件属性 */\n propsHandle?: PartProps<'div'>;\n /** 收起、展开按钮的部件属性 */\n propsToggle?: Partial<IconButtonProps>;\n}\n\n/** 键盘每按一次调多少(百分比) */\nconst STEP = 5;\n\n/** Splitter 的样式:root、pane、handle、line、toggle… */\nexport const splitterStyles = css.create({\n root: { display: 'grid', minWidth: 0, minHeight: 0, height: '100%' },\n bordered: {\n borderWidth: '_xs',\n borderStyle: 'solid',\n borderColor: '_border',\n borderRadius: '_lg',\n backgroundColor: '_surface',\n overflow: 'hidden',\n },\n pane: { minWidth: 0, minHeight: 0, overflow: 'auto' },\n // 分隔条:看得见的是中间一条细线,能拖的范围更宽;悬停、拖动时变成强调色\n // 分隔条所在的格:分隔条铺满它,收起按钮叠在中间(不放进可聚焦的分隔条里:交互元素不能嵌套)\n track: { position: 'relative', display: 'flex', alignItems: 'center', justifyContent: 'center' },\n handle: {\n position: 'absolute',\n inset: 0,\n touchAction: 'none',\n outlineStyle: 'none',\n color: { default: '_borderMuted', ':hover': '_borderStrong', ':focus-visible': '_accent' },\n },\n handleHorizontal: { width: '_space.md', cursor: 'col-resize' },\n handleVertical: { height: '_space.md', cursor: 'row-resize' },\n line: { position: 'absolute', backgroundColor: 'currentColor', pointerEvents: 'none' },\n lineHorizontal: { insetBlock: 0, insetInlineStart: 'calc(50% - 0.5px)', width: '1px' },\n lineVertical: { insetInline: 0, top: 'calc(50% - 0.5px)', height: '1px' },\n // 收起、展开的小按钮压在线上:背景盖住线\n toggle: { position: 'relative', zIndex: 1, backgroundColor: '_surface', cursor: 'pointer' },\n});\n\n/** Splitter 的动态样式:两栏与分隔条的轨道 */\nexport const splitterDynamicStyles = css.create({\n columns: (template: string) => ({ gridTemplateColumns: template }),\n rows: (template: string) => ({ gridTemplateRows: template }),\n});\n\n/** 分栏 */\nexport const Splitter = _component(\n ({\n start,\n end,\n orientation = 'horizontal',\n _size: size = _bindable(50),\n minSize = 20,\n maxSize = 80,\n collapsible,\n _collapsed: collapsed = _bindable(false),\n label,\n bordered = false,\n propsStart,\n propsEnd,\n propsHandle,\n propsToggle,\n ...rest\n }: SplitterProps) => {\n const lang = useLang();\n const id = useId();\n const initialSize = _untrack(size);\n let root = _state.raw<HTMLElement | null>(null);\n const horizontal = () => orientation === 'horizontal';\n const fit = (value: number) => Math.round(clamp(value, minSize, maxSize) * 10) / 10;\n\n function onPointerdown(event: PointerEvent) {\n if (!root || (event.target as Element).closest('button')) return;\n const rect = root.getBoundingClientRect();\n const total = horizontal() ? rect.width : rect.height;\n const from = size;\n const sign = horizontal() && isRtl(root) ? -1 : 1;\n event.preventDefault();\n startMove(event, {\n onMove: ({ deltaX, deltaY }) => {\n const delta = (horizontal() ? deltaX * sign : deltaY) / total;\n size = fit(from + delta * 100);\n // 拖动即展开:收着的一侧被拖出来\n if (collapsed) collapsed = false;\n },\n });\n }\n\n function onKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && collapsible) {\n event.preventDefault();\n collapsed = !collapsed;\n return;\n }\n const { forward, backward } = horizontal()\n ? inlineArrows(root ? isRtl(root) : false)\n : { forward: 'ArrowDown', backward: 'ArrowUp' };\n const next =\n event.key === forward\n ? size + STEP\n : event.key === backward\n ? size - STEP\n : event.key === 'Home'\n ? minSize\n : event.key === 'End'\n ? maxSize\n : null;\n if (next == null) return;\n event.preventDefault();\n size = fit(next);\n if (collapsed) collapsed = false;\n }\n\n /** 收起、展开按钮的箭头:指向收起的方向 */\n const toggleIcon = () => {\n const towardStart = (collapsible === 'start') !== collapsed;\n if (horizontal()) return towardStart ? ChevronLeft : ChevronRight;\n return towardStart ? ChevronUp : ChevronDown;\n };\n\n return () => {\n const hideStart = collapsed && collapsible === 'start';\n const hideEnd = collapsed && collapsible === 'end';\n const template = hideStart\n ? '0 auto minmax(0, 1fr)'\n : hideEnd\n ? 'minmax(0, 1fr) auto 0'\n : `minmax(0, ${size}fr) auto minmax(0, ${100 - size}fr)`;\n return (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n splitterStyles.root,\n bordered && splitterStyles.bordered,\n horizontal()\n ? splitterDynamicStyles.columns(template)\n : splitterDynamicStyles.rows(template),\n ],\n },\n rest,\n { ref: (element: unknown) => (root = element as HTMLElement | null) },\n )}\n data-orientation={orientation}\n data-collapsed={collapsed ? collapsible : undefined}\n >\n <div\n {...mergeAttrs<'div'>({ sx: splitterStyles.pane }, propsStart, {\n id: `${id}-start`,\n hidden: hideStart || undefined,\n })}\n >\n {start}\n </div>\n <div\n {...css.attrs(\n splitterStyles.track,\n horizontal() ? splitterStyles.handleHorizontal : splitterStyles.handleVertical,\n )}\n >\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n splitterStyles.handle,\n horizontal() ? splitterStyles.handleHorizontal : splitterStyles.handleVertical,\n focusRingStyles.visible,\n ],\n },\n propsHandle,\n {\n role: 'separator',\n tabindex: 0,\n 'aria-label': label ?? lang.splitterResize,\n 'aria-orientation': horizontal() ? 'vertical' : 'horizontal',\n 'aria-controls': `${id}-start`,\n 'aria-valuenow': hideStart ? 0 : hideEnd ? 100 : size,\n 'aria-valuemin': minSize,\n 'aria-valuemax': maxSize,\n onPointerdown,\n onKeydown,\n onDblclick: () => (size = fit(initialSize)),\n },\n )}\n >\n <span\n {...css.attrs(\n splitterStyles.line,\n horizontal() ? splitterStyles.lineHorizontal : splitterStyles.lineVertical,\n )}\n />\n </div>\n {collapsible && (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n icon: toggleIcon(),\n size: 'xs',\n variant: 'outline',\n tone: 'neutral',\n sx: splitterStyles.toggle,\n 'aria-label': collapsed ? lang.splitterExpand : lang.splitterCollapse,\n },\n propsToggle,\n {\n 'aria-expanded': !collapsed,\n 'aria-controls': collapsible === 'start' ? `${id}-start` : `${id}-end`,\n // 键盘用户在分隔条上按 Enter:按钮不进 Tab 顺序,免得多停一次\n tabindex: -1,\n onClick: () => (collapsed = !collapsed),\n },\n )}\n />\n )}\n </div>\n <div\n {...mergeAttrs<'div'>({ sx: splitterStyles.pane }, propsEnd, {\n id: `${id}-end`,\n hidden: hideEnd || undefined,\n })}\n >\n {end}\n </div>\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
@@ -4,8 +4,8 @@ import type { Space } from '../utils/style/styles';
4
4
  /** 未声明的属性落到 Flex(div)上 */
5
5
  export interface ViewportFillProps extends Omit<FlexProps, 'direction'> {
6
6
  /**
7
- * 离视口底边留多少(与外壳正文的内边距一致,分页不贴死在窗口边上)
8
- * @default 'md'
7
+ * 离视口底边留多少(与外壳正文 AppShell main 的内边距一致:留得比它少,整页会多出一截滚动)
8
+ * @default 'xl'
9
9
  */
10
10
  bottom?: Space;
11
11
  /**
@@ -3,8 +3,8 @@ import { useResizeObserver } from "../utils/dom/resize.js";
3
3
  import { toElement } from "../utils/dom/element.js";
4
4
  import { useEventListener } from "../utils/dom/event-listener.js";
5
5
  import { Flex } from "./Flex.js";
6
- import { createVNode, mergeProps, onMounted, ref, shallowRef } from "vue";
7
- import { _component, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
6
+ import { createVNode, onMounted, ref, shallowRef } from "vue";
7
+ import { _component, 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/layout/ViewportFill.tsx
10
10
  /** 未声明的属性落到 Flex(div)上 */
@@ -18,7 +18,7 @@ var viewportFillDynamicStyles = css.create({ size: (top, bottom, min) => ({
18
18
  /** 占满到窗口底边 */
19
19
  var ViewportFill = /*#__PURE__*/ _component((_props, _ctx) => {
20
20
  const _cache = [];
21
- const bottom = readonlyProp(_props, "bottom", "md");
21
+ const bottom = readonlyProp(_props, "bottom", "xl");
22
22
  const minHeight = readonlyProp(_props, "minHeight", "24rem");
23
23
  const sx = readonlyProp(_props, "sx");
24
24
  const rest = restProps(_props, _ctx, true);
@@ -32,7 +32,7 @@ var ViewportFill = /*#__PURE__*/ _component((_props, _ctx) => {
32
32
  onMounted(measure);
33
33
  useEventListener(() => window, "resize", measure);
34
34
  useResizeObserver(() => element.value ? document.body : null, measure);
35
- return () => createVNode(Flex, mergeProps(rest, {
35
+ return () => createVNode(Flex, mergeJsxProps(rest, {
36
36
  "direction": "column",
37
37
  "ref": _cache[0] || (_cache[0] = (value) => element.value = toElement(value)),
38
38
  "sx": [
@@ -1 +1 @@
1
- {"version":3,"file":"ViewportFill.js","names":["_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_vue_ref","_createVNode","_mergeProps"],"sources":["../../src/layout/ViewportFill.tsx"],"sourcesContent":["/**\n * 占满到窗口底边:从自己的顶边一直到视口底边(留出 bottom 的间距),里面竖排。列表页让表格正好占满一屏、\n * 在表格里滚动,分页贴着窗口底边;收件箱的左右分栏占满剩下的高度。\n *\n * <ViewportFill gap=\"md\">\n * <Toolbar />\n * <DataTable propsRoot={{ sx: fillStyles.grow }} /> 表格 flexGrow 撑满剩下的\n * <Pagination />\n * </ViewportFill>\n *\n * 顶边的位置量出来(上面的页头、页签、查询栏换行变高都跟着变),不用手算“视口高度减顶栏减内边距”。\n * 窗口太矮时不小于 minHeight,整页滚动。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { onMounted } from 'vue';\nimport { space } from '../config/theme/tokens';\nimport { useResizeObserver } from '../utils/dom/resize';\nimport { toElement } from '../utils/dom/element';\nimport { useEventListener } from '../utils/dom/event-listener';\nimport { Flex, type FlexProps } from './Flex';\nimport type { Space } from '../utils/style/styles';\n\n/** 未声明的属性落到 Flex(div)上 */\nexport interface ViewportFillProps extends Omit<FlexProps, 'direction'> {\n /**\n * 离视口底边留多少(与外壳正文的内边距一致,分页不贴死在窗口边上)\n * @default 'md'\n */\n bottom?: Space;\n /**\n * 最小高度:窗口太矮时整页滚动\n * @default '24rem'\n */\n minHeight?: string;\n}\n\n/** ViewportFill 的样式:root */\nexport const viewportFillStyles = css.create({\n root: { minWidth: 0 },\n});\n\n/** ViewportFill 的动态样式:高度 */\nexport const viewportFillDynamicStyles = css.create({\n size: (top: number, bottom: string, min: string) => ({\n height: `calc(100dvh - ${top}px - ${bottom})`,\n minHeight: min,\n }),\n});\n\n/** 占满到窗口底边 */\nexport const ViewportFill = _component(\n ({ bottom = 'md', minHeight = '24rem', sx, ...rest }: ViewportFillProps) => {\n let element = _state.raw<HTMLElement | null>(null);\n // 顶边在文档里的位置(不随滚动变)\n let top = _state(0);\n const measure = () => {\n if (!element) return;\n const next = Math.round(element.getBoundingClientRect().top + window.scrollY);\n if (next !== top) top = next;\n };\n onMounted(measure);\n useEventListener(() => window, 'resize', measure);\n // 上面的内容变高(查询栏换行、提示出现)时文档的尺寸跟着变\n useResizeObserver(() => (element ? document.body : null), measure);\n return () => (\n <Flex\n {...rest}\n direction=\"column\"\n ref={(value: unknown) => (element = toElement(value))}\n sx={[\n viewportFillStyles.root,\n viewportFillDynamicStyles.size(top, space[bottom], minHeight),\n sx,\n ]}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;;;AAsCA,IAAa,qBAAqB,IAAI,OAAO,EAC3C,MAAM,EAAE,UAAU,EAAE,EACtB,CAAC;;AAGD,IAAa,4BAA4B,IAAI,OAAO,EAClD,OAAO,KAAa,QAAgB,SAAiB;CACnD,QAAQ,iBAAiB,IAAG,OAAQ,OAAM;CAC1C,WAAW;AACb,GACF,CAAC;;AAGD,IAAa,eAAe,0BAC1B,QAAA,SAA4E;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,UAAhE,IAAI;CAAA,MAAA,YAAAA,aAAA,QAAA,aAAc,OAAO;CAAA,MAAA,KAAAA,aAAA,QAAA,IAAA;CAAA,MAAS,OAAIC,UAAA,QAAA,MAAA,IAAA;CAChD,IAAI,UAAOC,WAAkC,IAAI;CAEjD,IAAI,MAAGC,IAAU,CAAC;CAClB,MAAM,gBAAgB;EACpB,IAAI,CAAA,QAAA,OAAU;EACd,MAAM,OAAO,KAAK,MAAM,QAAA,MAAQ,sBAAsB,CAAC,CAAC,MAAM,OAAO,OAAO;EAC5E,IAAI,SAAI,IAAA,OAAU,IAAA,QAAM;CAC1B;CACA,UAAU,OAAO;CACjB,uBAAuB,QAAQ,UAAU,OAAO;CAEhD,wBAAyB,QAAA,QAAU,SAAS,OAAO,MAAO,OAAO;CACjE,aAAOC,YAAA,MAAAC,WAEC,MAAI;EAAA,aAAA;EAAA,OAAA,OAAA,OAAA,OAAA,MAEF,UAAoB,QAAA,QAAU,UAAU,KAAK;EAAE,MACjD;GACF,mBAAmB;GAAI,IAAA,KACvB,0BAA0B,YAAI;IAAA,IAAA;IAAM,MAAK,OAAA;IAAQ,UAAA;GAAA,GAAA,IAAA;GAAA,GAAA;EAAA;CAElD,CAAA,GAAA,IAAA;AAGP,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
1
+ {"version":3,"file":"ViewportFill.js","names":["_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_vue_ref","_createVNode","_mergeProps"],"sources":["../../src/layout/ViewportFill.tsx"],"sourcesContent":["/**\n * 占满到窗口底边:从自己的顶边一直到视口底边(留出 bottom 的间距),里面竖排。列表页让表格正好占满一屏、\n * 在表格里滚动,分页贴着窗口底边;收件箱的左右分栏占满剩下的高度。\n *\n * <ViewportFill gap=\"md\">\n * <Toolbar />\n * <DataTable propsRoot={{ sx: fillStyles.grow }} /> 表格 flexGrow 撑满剩下的\n * <Pagination />\n * </ViewportFill>\n *\n * 顶边的位置量出来(上面的页头、页签、查询栏换行变高都跟着变),不用手算“视口高度减顶栏减内边距”。\n * 窗口太矮时不小于 minHeight,整页滚动。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { onMounted } from 'vue';\nimport { space } from '../config/theme/tokens';\nimport { useResizeObserver } from '../utils/dom/resize';\nimport { toElement } from '../utils/dom/element';\nimport { useEventListener } from '../utils/dom/event-listener';\nimport { Flex, type FlexProps } from './Flex';\nimport type { Space } from '../utils/style/styles';\n\n/** 未声明的属性落到 Flex(div)上 */\nexport interface ViewportFillProps extends Omit<FlexProps, 'direction'> {\n /**\n * 离视口底边留多少(与外壳正文 AppShell main 的内边距一致:留得比它少,整页会多出一截滚动)\n * @default 'xl'\n */\n bottom?: Space;\n /**\n * 最小高度:窗口太矮时整页滚动\n * @default '24rem'\n */\n minHeight?: string;\n}\n\n/** ViewportFill 的样式:root */\nexport const viewportFillStyles = css.create({\n root: { minWidth: 0 },\n});\n\n/** ViewportFill 的动态样式:高度 */\nexport const viewportFillDynamicStyles = css.create({\n size: (top: number, bottom: string, min: string) => ({\n height: `calc(100dvh - ${top}px - ${bottom})`,\n minHeight: min,\n }),\n});\n\n/** 占满到窗口底边 */\nexport const ViewportFill = _component(\n ({ bottom = 'xl', minHeight = '24rem', sx, ...rest }: ViewportFillProps) => {\n let element = _state.raw<HTMLElement | null>(null);\n // 顶边在文档里的位置(不随滚动变)\n let top = _state(0);\n const measure = () => {\n if (!element) return;\n const next = Math.round(element.getBoundingClientRect().top + window.scrollY);\n if (next !== top) top = next;\n };\n onMounted(measure);\n useEventListener(() => window, 'resize', measure);\n // 上面的内容变高(查询栏换行、提示出现)时文档的尺寸跟着变\n useResizeObserver(() => (element ? document.body : null), measure);\n return () => (\n <Flex\n {...rest}\n direction=\"column\"\n ref={(value: unknown) => (element = toElement(value))}\n sx={[\n viewportFillStyles.root,\n viewportFillDynamicStyles.size(top, space[bottom], minHeight),\n sx,\n ]}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;;;AAsCA,IAAa,qBAAqB,IAAI,OAAO,EAC3C,MAAM,EAAE,UAAU,EAAE,EACtB,CAAC;;AAGD,IAAa,4BAA4B,IAAI,OAAO,EAClD,OAAO,KAAa,QAAgB,SAAiB;CACnD,QAAQ,iBAAiB,IAAG,OAAQ,OAAM;CAC1C,WAAW;AACb,GACF,CAAC;;AAGD,IAAa,eAAe,0BAC1B,QAAA,SAA4E;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,UAAhE,IAAI;CAAA,MAAA,YAAAA,aAAA,QAAA,aAAc,OAAO;CAAA,MAAA,KAAAA,aAAA,QAAA,IAAA;CAAA,MAAS,OAAIC,UAAA,QAAA,MAAA,IAAA;CAChD,IAAI,UAAOC,WAAkC,IAAI;CAEjD,IAAI,MAAGC,IAAU,CAAC;CAClB,MAAM,gBAAgB;EACpB,IAAI,CAAA,QAAA,OAAU;EACd,MAAM,OAAO,KAAK,MAAM,QAAA,MAAQ,sBAAsB,CAAC,CAAC,MAAM,OAAO,OAAO;EAC5E,IAAI,SAAI,IAAA,OAAU,IAAA,QAAM;CAC1B;CACA,UAAU,OAAO;CACjB,uBAAuB,QAAQ,UAAU,OAAO;CAEhD,wBAAyB,QAAA,QAAU,SAAS,OAAO,MAAO,OAAO;CACjE,aAAOC,YAAA,MAAAC,cAEC,MAAI;EAAA,aAAA;EAAA,OAAA,OAAA,OAAA,OAAA,MAEF,UAAoB,QAAA,QAAU,UAAU,KAAK;EAAE,MACjD;GACF,mBAAmB;GAAI,IAAA,KACvB,0BAA0B,YAAI;IAAA,IAAA;IAAM,MAAK,OAAA;IAAQ,UAAA;GAAA,GAAA,IAAA;GAAA,GAAA;EAAA;CAElD,CAAA,GAAA,IAAA;AAGP,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}