@zerodep-dev/vue-tsx-pro-ui 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/dist/base/Badge.js +3 -3
  2. package/dist/base/Badge.js.map +1 -1
  3. package/dist/base/Can.d.ts +12 -0
  4. package/dist/base/Can.js +20 -0
  5. package/dist/base/Can.js.map +1 -0
  6. package/dist/base/ClientOnly.d.ts +10 -0
  7. package/dist/base/ClientOnly.js +18 -0
  8. package/dist/base/ClientOnly.js.map +1 -0
  9. package/dist/base/CloseButton.js +3 -3
  10. package/dist/base/CloseButton.js.map +1 -1
  11. package/dist/base/CodeBlock.js +5 -5
  12. package/dist/base/CodeBlock.js.map +1 -1
  13. package/dist/base/CopyButton.js +3 -3
  14. package/dist/base/CopyButton.js.map +1 -1
  15. package/dist/base/Icon.js +3 -3
  16. package/dist/base/Icon.js.map +1 -1
  17. package/dist/base/Indicator.js +3 -3
  18. package/dist/base/Indicator.js.map +1 -1
  19. package/dist/base/StatusDot.js +3 -3
  20. package/dist/base/StatusDot.js.map +1 -1
  21. package/dist/base/Tag.js +5 -5
  22. package/dist/base/Tag.js.map +1 -1
  23. package/dist/base/button-core.js +4 -4
  24. package/dist/base/button-core.js.map +1 -1
  25. package/dist/charts/AreaChart.js +3 -3
  26. package/dist/charts/AreaChart.js.map +1 -1
  27. package/dist/charts/BarChart.js +3 -3
  28. package/dist/charts/BarChart.js.map +1 -1
  29. package/dist/charts/ChordChart.js +3 -3
  30. package/dist/charts/ChordChart.js.map +1 -1
  31. package/dist/charts/ComboChart.js +3 -3
  32. package/dist/charts/ComboChart.js.map +1 -1
  33. package/dist/charts/DonutChart.js +3 -3
  34. package/dist/charts/DonutChart.js.map +1 -1
  35. package/dist/charts/FunnelChart.js +5 -5
  36. package/dist/charts/FunnelChart.js.map +1 -1
  37. package/dist/charts/GraphChart.js +3 -3
  38. package/dist/charts/GraphChart.js.map +1 -1
  39. package/dist/charts/LineChart.js +3 -3
  40. package/dist/charts/LineChart.js.map +1 -1
  41. package/dist/charts/MapChart.js +7 -7
  42. package/dist/charts/MapChart.js.map +1 -1
  43. package/dist/charts/RadarChart.js +16 -15
  44. package/dist/charts/RadarChart.js.map +1 -1
  45. package/dist/charts/SankeyChart.js +3 -3
  46. package/dist/charts/SankeyChart.js.map +1 -1
  47. package/dist/charts/ScatterChart.js +3 -3
  48. package/dist/charts/ScatterChart.js.map +1 -1
  49. package/dist/charts/TimelineChart.js +6 -5
  50. package/dist/charts/TimelineChart.js.map +1 -1
  51. package/dist/charts/TreemapChart.js +3 -3
  52. package/dist/charts/TreemapChart.js.map +1 -1
  53. package/dist/charts/WaterfallChart.js +3 -3
  54. package/dist/charts/WaterfallChart.js.map +1 -1
  55. package/dist/charts/XYChart.js +9 -7
  56. package/dist/charts/XYChart.js.map +1 -1
  57. package/dist/charts/frame.js +10 -8
  58. package/dist/charts/frame.js.map +1 -1
  59. package/dist/charts/single.js +4 -3
  60. package/dist/charts/single.js.map +1 -1
  61. package/dist/config/Provider.d.ts +3 -1
  62. package/dist/config/Provider.js +9 -4
  63. package/dist/config/Provider.js.map +1 -1
  64. package/dist/config/context.d.ts +18 -0
  65. package/dist/config/context.js +16 -1
  66. package/dist/config/context.js.map +1 -1
  67. package/dist/config/createUi.d.ts +20 -3
  68. package/dist/config/createUi.js +80 -49
  69. package/dist/config/createUi.js.map +1 -1
  70. package/dist/config/layout/preference.d.ts +43 -0
  71. package/dist/config/layout/preference.js +108 -0
  72. package/dist/config/layout/preference.js.map +1 -0
  73. package/dist/date/Calendar.js +3 -3
  74. package/dist/date/Calendar.js.map +1 -1
  75. package/dist/date/CalendarBoard.js +9 -9
  76. package/dist/date/CalendarBoard.js.map +1 -1
  77. package/dist/date/CalendarView.js +7 -7
  78. package/dist/date/CalendarView.js.map +1 -1
  79. package/dist/date/DateField.js +3 -3
  80. package/dist/date/DateField.js.map +1 -1
  81. package/dist/date/DatePicker.js +5 -5
  82. package/dist/date/DatePicker.js.map +1 -1
  83. package/dist/date/DateRangePicker.js +5 -5
  84. package/dist/date/DateRangePicker.js.map +1 -1
  85. package/dist/date/DateSegmentGroup.js +5 -5
  86. package/dist/date/DateSegmentGroup.js.map +1 -1
  87. package/dist/date/QuarterCalendar.js +6 -6
  88. package/dist/date/QuarterCalendar.js.map +1 -1
  89. package/dist/date/RangeCalendar.js +3 -3
  90. package/dist/date/RangeCalendar.js.map +1 -1
  91. package/dist/date/SegmentedField.js +3 -3
  92. package/dist/date/SegmentedField.js.map +1 -1
  93. package/dist/date/TimeField.js +3 -3
  94. package/dist/date/TimeField.js.map +1 -1
  95. package/dist/date/TimePicker.js +4 -4
  96. package/dist/date/TimePicker.js.map +1 -1
  97. package/dist/date/date-segments.js +1 -1
  98. package/dist/date/date-segments.js.map +1 -1
  99. package/dist/date/picker-popover.js +3 -2
  100. package/dist/date/picker-popover.js.map +1 -1
  101. package/dist/diagram/Diagram.js +12 -12
  102. package/dist/diagram/Diagram.js.map +1 -1
  103. package/dist/diagram/DiagramLanes.js +3 -3
  104. package/dist/diagram/DiagramLanes.js.map +1 -1
  105. package/dist/diagram/DiagramMinimap.js +4 -4
  106. package/dist/diagram/DiagramMinimap.js.map +1 -1
  107. package/dist/display/Accordion.js +6 -6
  108. package/dist/display/Accordion.js.map +1 -1
  109. package/dist/display/AnimatedNumber.js +4 -4
  110. package/dist/display/AnimatedNumber.js.map +1 -1
  111. package/dist/display/Avatar.js +4 -4
  112. package/dist/display/Avatar.js.map +1 -1
  113. package/dist/display/Checklist.js +7 -7
  114. package/dist/display/Checklist.js.map +1 -1
  115. package/dist/display/Collapse.js +8 -5
  116. package/dist/display/Collapse.js.map +1 -1
  117. package/dist/display/Collapsible.js +3 -3
  118. package/dist/display/Collapsible.js.map +1 -1
  119. package/dist/display/Descriptions.js +5 -5
  120. package/dist/display/Descriptions.js.map +1 -1
  121. package/dist/display/Ellipsis.js +3 -3
  122. package/dist/display/Ellipsis.js.map +1 -1
  123. package/dist/display/FieldCompare.js +4 -4
  124. package/dist/display/FieldCompare.js.map +1 -1
  125. package/dist/display/Gauge.js +11 -11
  126. package/dist/display/Gauge.js.map +1 -1
  127. package/dist/display/Image.js +4 -4
  128. package/dist/display/Image.js.map +1 -1
  129. package/dist/display/Marquee.js +3 -3
  130. package/dist/display/Marquee.js.map +1 -1
  131. package/dist/display/ProportionBar.js +4 -4
  132. package/dist/display/ProportionBar.js.map +1 -1
  133. package/dist/display/Sortable.js +4 -4
  134. package/dist/display/Sortable.js.map +1 -1
  135. package/dist/display/Sparkline.js +6 -6
  136. package/dist/display/Sparkline.js.map +1 -1
  137. package/dist/display/Stat.js +3 -3
  138. package/dist/display/Stat.js.map +1 -1
  139. package/dist/display/Timeline.js +7 -7
  140. package/dist/display/Timeline.js.map +1 -1
  141. package/dist/display/Tree.js +10 -10
  142. package/dist/display/Tree.js.map +1 -1
  143. package/dist/display/VirtualList.js +7 -7
  144. package/dist/display/VirtualList.js.map +1 -1
  145. package/dist/display/Watermark.js +3 -3
  146. package/dist/display/Watermark.js.map +1 -1
  147. package/dist/docs-kit/CodeGroup.js +5 -5
  148. package/dist/docs-kit/CodeGroup.js.map +1 -1
  149. package/dist/docs-kit/CodePreview.js +6 -6
  150. package/dist/docs-kit/CodePreview.js.map +1 -1
  151. package/dist/docs-kit/PropsTable.js +4 -4
  152. package/dist/docs-kit/PropsTable.js.map +1 -1
  153. package/dist/feedback/Alert.js +5 -5
  154. package/dist/feedback/Alert.js.map +1 -1
  155. package/dist/feedback/Banner.js +5 -5
  156. package/dist/feedback/Banner.js.map +1 -1
  157. package/dist/feedback/Empty.js +4 -4
  158. package/dist/feedback/Empty.js.map +1 -1
  159. package/dist/feedback/LoadingBar.js +20 -13
  160. package/dist/feedback/LoadingBar.js.map +1 -1
  161. package/dist/feedback/LoadingOverlay.js +3 -3
  162. package/dist/feedback/LoadingOverlay.js.map +1 -1
  163. package/dist/feedback/Progress.js +14 -14
  164. package/dist/feedback/Progress.js.map +1 -1
  165. package/dist/feedback/Result.js +4 -4
  166. package/dist/feedback/Result.js.map +1 -1
  167. package/dist/feedback/SkeletonText.js +3 -3
  168. package/dist/feedback/SkeletonText.js.map +1 -1
  169. package/dist/feedback/Toast.js +6 -6
  170. package/dist/feedback/Toast.js.map +1 -1
  171. package/dist/form/Field.js +7 -7
  172. package/dist/form/Field.js.map +1 -1
  173. package/dist/form/Form.js +3 -3
  174. package/dist/form/Form.js.map +1 -1
  175. package/dist/form/FormErrorSummary.js +3 -3
  176. package/dist/form/FormErrorSummary.js.map +1 -1
  177. package/dist/form/FormSection.js +6 -6
  178. package/dist/form/FormSection.js.map +1 -1
  179. package/dist/index.d.ts +11 -6
  180. package/dist/index.js +10 -5
  181. package/dist/input/Autocomplete.js +3 -3
  182. package/dist/input/Autocomplete.js.map +1 -1
  183. package/dist/input/Cascader.js +7 -7
  184. package/dist/input/Cascader.js.map +1 -1
  185. package/dist/input/CharacterCount.js +3 -3
  186. package/dist/input/CharacterCount.js.map +1 -1
  187. package/dist/input/Checkbox.js +5 -5
  188. package/dist/input/Checkbox.js.map +1 -1
  189. package/dist/input/ColorField.js +4 -4
  190. package/dist/input/ColorField.js.map +1 -1
  191. package/dist/input/Combobox.js +4 -4
  192. package/dist/input/Combobox.js.map +1 -1
  193. package/dist/input/ConditionBuilder.js +15 -14
  194. package/dist/input/ConditionBuilder.js.map +1 -1
  195. package/dist/input/FileDrop.js +3 -3
  196. package/dist/input/FileDrop.js.map +1 -1
  197. package/dist/input/Listbox.js +9 -9
  198. package/dist/input/Listbox.js.map +1 -1
  199. package/dist/input/Mentions.js +3 -3
  200. package/dist/input/Mentions.js.map +1 -1
  201. package/dist/input/NumberField.js +3 -3
  202. package/dist/input/NumberField.js.map +1 -1
  203. package/dist/input/NumberRangeField.js +5 -5
  204. package/dist/input/NumberRangeField.js.map +1 -1
  205. package/dist/input/OtpField.js +5 -5
  206. package/dist/input/OtpField.js.map +1 -1
  207. package/dist/input/PeoplePicker.js +6 -6
  208. package/dist/input/PeoplePicker.js.map +1 -1
  209. package/dist/input/PeoplePickerPanel.js +4 -4
  210. package/dist/input/PeoplePickerPanel.js.map +1 -1
  211. package/dist/input/Radio.js +4 -4
  212. package/dist/input/Radio.js.map +1 -1
  213. package/dist/input/Rating.js +5 -5
  214. package/dist/input/Rating.js.map +1 -1
  215. package/dist/input/Select.js +4 -4
  216. package/dist/input/Select.js.map +1 -1
  217. package/dist/input/SelectedTags.js +4 -4
  218. package/dist/input/SelectedTags.js.map +1 -1
  219. package/dist/input/Slider.js +6 -6
  220. package/dist/input/Slider.js.map +1 -1
  221. package/dist/input/Switch.js +3 -3
  222. package/dist/input/Switch.js.map +1 -1
  223. package/dist/input/TagsInput.js +5 -5
  224. package/dist/input/TagsInput.js.map +1 -1
  225. package/dist/input/TextField.js +5 -5
  226. package/dist/input/TextField.js.map +1 -1
  227. package/dist/input/Textarea.js +4 -4
  228. package/dist/input/Textarea.js.map +1 -1
  229. package/dist/input/ToggleGroup.js +4 -4
  230. package/dist/input/ToggleGroup.js.map +1 -1
  231. package/dist/input/Transfer.js +8 -8
  232. package/dist/input/Transfer.js.map +1 -1
  233. package/dist/input/TreeSelect.js +6 -6
  234. package/dist/input/TreeSelect.js.map +1 -1
  235. package/dist/input/Upload.js +8 -8
  236. package/dist/input/Upload.js.map +1 -1
  237. package/dist/layout/Affix.js +4 -4
  238. package/dist/layout/Affix.js.map +1 -1
  239. package/dist/layout/ResizeHandle.d.ts +6 -2
  240. package/dist/layout/ResizeHandle.js +32 -9
  241. package/dist/layout/ResizeHandle.js.map +1 -1
  242. package/dist/layout/ScrollArea.js +3 -3
  243. package/dist/layout/ScrollArea.js.map +1 -1
  244. package/dist/layout/Separator.js +3 -3
  245. package/dist/layout/Separator.js.map +1 -1
  246. package/dist/layout/Splitter.js +3 -3
  247. package/dist/layout/Splitter.js.map +1 -1
  248. package/dist/layout/ViewportFill.d.ts +2 -2
  249. package/dist/layout/ViewportFill.js +4 -4
  250. package/dist/layout/ViewportFill.js.map +1 -1
  251. package/dist/navigation/Breadcrumbs.js +4 -4
  252. package/dist/navigation/Breadcrumbs.js.map +1 -1
  253. package/dist/navigation/NavBar.js +6 -6
  254. package/dist/navigation/NavBar.js.map +1 -1
  255. package/dist/navigation/NavList.d.ts +1 -0
  256. package/dist/navigation/NavList.js +20 -12
  257. package/dist/navigation/NavList.js.map +1 -1
  258. package/dist/navigation/NavMenu.d.ts +27 -0
  259. package/dist/navigation/NavMenu.js +54 -0
  260. package/dist/navigation/NavMenu.js.map +1 -0
  261. package/dist/navigation/PageJump.js +3 -3
  262. package/dist/navigation/PageJump.js.map +1 -1
  263. package/dist/navigation/PageSizeSelect.js +4 -4
  264. package/dist/navigation/PageSizeSelect.js.map +1 -1
  265. package/dist/navigation/Pagination.js +6 -6
  266. package/dist/navigation/Pagination.js.map +1 -1
  267. package/dist/navigation/PaginationBar.js +5 -5
  268. package/dist/navigation/PaginationBar.js.map +1 -1
  269. package/dist/navigation/Steps.js +4 -4
  270. package/dist/navigation/Steps.js.map +1 -1
  271. package/dist/navigation/TableOfContents.js +5 -5
  272. package/dist/navigation/TableOfContents.js.map +1 -1
  273. package/dist/navigation/Tabs.js +7 -7
  274. package/dist/navigation/Tabs.js.map +1 -1
  275. package/dist/navigation/Toolbar.js +3 -3
  276. package/dist/navigation/Toolbar.js.map +1 -1
  277. package/dist/overlay/AlertDialog.js +4 -4
  278. package/dist/overlay/AlertDialog.js.map +1 -1
  279. package/dist/overlay/CommandPalette.js +4 -4
  280. package/dist/overlay/CommandPalette.js.map +1 -1
  281. package/dist/overlay/ContextMenu.js +3 -3
  282. package/dist/overlay/ContextMenu.js.map +1 -1
  283. package/dist/overlay/Dialog.js +4 -4
  284. package/dist/overlay/Dialog.js.map +1 -1
  285. package/dist/overlay/Drawer.js +5 -5
  286. package/dist/overlay/Drawer.js.map +1 -1
  287. package/dist/overlay/HoverCard.js +5 -3
  288. package/dist/overlay/HoverCard.js.map +1 -1
  289. package/dist/overlay/Lightbox.js +5 -5
  290. package/dist/overlay/Lightbox.js.map +1 -1
  291. package/dist/overlay/Menu.js +7 -7
  292. package/dist/overlay/Menu.js.map +1 -1
  293. package/dist/overlay/ModalCore.js +9 -9
  294. package/dist/overlay/ModalCore.js.map +1 -1
  295. package/dist/overlay/Popconfirm.js +6 -6
  296. package/dist/overlay/Popconfirm.js.map +1 -1
  297. package/dist/overlay/Popover.js +5 -3
  298. package/dist/overlay/Popover.js.map +1 -1
  299. package/dist/overlay/Tooltip.js +5 -3
  300. package/dist/overlay/Tooltip.js.map +1 -1
  301. package/dist/overlay/Tour.js +8 -8
  302. package/dist/overlay/Tour.js.map +1 -1
  303. package/dist/overlay/detached.d.ts +2 -0
  304. package/dist/overlay/detached.js +73 -42
  305. package/dist/overlay/detached.js.map +1 -1
  306. package/dist/patterns/ActionBar.js +3 -3
  307. package/dist/patterns/ActionBar.js.map +1 -1
  308. package/dist/patterns/AppShell.d.ts +28 -1
  309. package/dist/patterns/AppShell.js +158 -52
  310. package/dist/patterns/AppShell.js.map +1 -1
  311. package/dist/patterns/AuthLayout.d.ts +28 -0
  312. package/dist/patterns/AuthLayout.js +77 -0
  313. package/dist/patterns/AuthLayout.js.map +1 -0
  314. package/dist/patterns/CommentThread.js +9 -9
  315. package/dist/patterns/CommentThread.js.map +1 -1
  316. package/dist/patterns/DataImport.js +4 -4
  317. package/dist/patterns/DataImport.js.map +1 -1
  318. package/dist/patterns/DeadlineBadge.js +3 -3
  319. package/dist/patterns/DeadlineBadge.js.map +1 -1
  320. package/dist/patterns/FilterBar.d.ts +11 -1
  321. package/dist/patterns/FilterBar.js +39 -10
  322. package/dist/patterns/FilterBar.js.map +1 -1
  323. package/dist/patterns/FormDialog.d.ts +18 -0
  324. package/dist/patterns/FormDialog.js +46 -0
  325. package/dist/patterns/FormDialog.js.map +1 -0
  326. package/dist/patterns/KanbanBoard.js +8 -8
  327. package/dist/patterns/KanbanBoard.js.map +1 -1
  328. package/dist/patterns/LayoutSwitcher.d.ts +12 -0
  329. package/dist/patterns/LayoutSwitcher.js +79 -0
  330. package/dist/patterns/LayoutSwitcher.js.map +1 -0
  331. package/dist/patterns/NotificationCenter.js +8 -8
  332. package/dist/patterns/NotificationCenter.js.map +1 -1
  333. package/dist/patterns/PageTabs.d.ts +12 -7
  334. package/dist/patterns/PageTabs.js +41 -29
  335. package/dist/patterns/PageTabs.js.map +1 -1
  336. package/dist/patterns/QueryTable.d.ts +7 -1
  337. package/dist/patterns/QueryTable.js +116 -81
  338. package/dist/patterns/QueryTable.js.map +1 -1
  339. package/dist/patterns/SlideCaptcha.d.ts +80 -0
  340. package/dist/patterns/SlideCaptcha.js +354 -0
  341. package/dist/patterns/SlideCaptcha.js.map +1 -0
  342. package/dist/patterns/StepsForm.js +7 -7
  343. package/dist/patterns/StepsForm.js.map +1 -1
  344. package/dist/patterns/ThemeSwitcher.js +3 -3
  345. package/dist/patterns/ThemeSwitcher.js.map +1 -1
  346. package/dist/patterns/index.d.ts +7 -3
  347. package/dist/patterns/index.js +5 -1
  348. package/dist/patterns/messages.d.ts +37 -1
  349. package/dist/patterns/messages.js +38 -2
  350. package/dist/patterns/messages.js.map +1 -1
  351. package/dist/table/ColumnHeaderActions.js +3 -3
  352. package/dist/table/ColumnHeaderActions.js.map +1 -1
  353. package/dist/table/ColumnResizer.js +3 -3
  354. package/dist/table/ColumnResizer.js.map +1 -1
  355. package/dist/table/ColumnSettings.js +5 -5
  356. package/dist/table/ColumnSettings.js.map +1 -1
  357. package/dist/table/ColumnTable.js +8 -8
  358. package/dist/table/ColumnTable.js.map +1 -1
  359. package/dist/table/DataTable.js +8 -8
  360. package/dist/table/DataTable.js.map +1 -1
  361. package/dist/table/DataTableView.js +21 -21
  362. package/dist/table/DataTableView.js.map +1 -1
  363. package/dist/table/PivotTable.js +3 -3
  364. package/dist/table/PivotTable.js.map +1 -1
  365. package/dist/table/SelectionBar.js +4 -4
  366. package/dist/table/SelectionBar.js.map +1 -1
  367. package/dist/table/TreeDataTable.js +5 -5
  368. package/dist/table/TreeDataTable.js.map +1 -1
  369. package/dist/theme-customize/ThemeCustomizer.js +7 -6
  370. package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
  371. package/dist/theme-customize/ThemeThumbnail.js +3 -3
  372. package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
  373. package/dist/three/background/AuroraBackground.js +3 -3
  374. package/dist/three/background/AuroraBackground.js.map +1 -1
  375. package/dist/three/background/MeshGradient.js +3 -3
  376. package/dist/three/background/MeshGradient.js.map +1 -1
  377. package/dist/three/background/ShaderBackground.js +3 -3
  378. package/dist/three/background/ShaderBackground.js.map +1 -1
  379. package/dist/three/core/EffectSurface.js +3 -3
  380. package/dist/three/core/EffectSurface.js.map +1 -1
  381. package/dist/three/core/ThreeCanvas.js +4 -4
  382. package/dist/three/core/ThreeCanvas.js.map +1 -1
  383. package/dist/three/effects/Confetti.js +3 -3
  384. package/dist/three/effects/Confetti.js.map +1 -1
  385. package/dist/three/effects/ParticleField.js +3 -3
  386. package/dist/three/effects/ParticleField.js.map +1 -1
  387. package/dist/three/effects/WaveGrid.js +3 -3
  388. package/dist/three/effects/WaveGrid.js.map +1 -1
  389. package/dist/three/globe/Globe.js +3 -3
  390. package/dist/three/globe/Globe.js.map +1 -1
  391. package/dist/three/model/ModelViewer.js +3 -3
  392. package/dist/three/model/ModelViewer.js.map +1 -1
  393. package/dist/utils/data/number.d.ts +5 -0
  394. package/dist/utils/data/number.js +8 -1
  395. package/dist/utils/data/number.js.map +1 -1
  396. package/dist/utils/dom/element.d.ts +3 -1
  397. package/dist/utils/dom/element.js +8 -4
  398. package/dist/utils/dom/element.js.map +1 -1
  399. package/dist/utils/dom/fullscreen.d.ts +1 -1
  400. package/dist/utils/dom/fullscreen.js +12 -8
  401. package/dist/utils/dom/fullscreen.js.map +1 -1
  402. package/dist/utils/dom/mounted.d.ts +7 -0
  403. package/dist/utils/dom/mounted.js +16 -0
  404. package/dist/utils/dom/mounted.js.map +1 -0
  405. package/dist/utils/dom/overflow.js +2 -1
  406. package/dist/utils/dom/overflow.js.map +1 -1
  407. package/dist/utils/dom/pan-zoom.js +2 -1
  408. package/dist/utils/dom/pan-zoom.js.map +1 -1
  409. package/dist/utils/props.js +3 -13
  410. package/dist/utils/props.js.map +1 -1
  411. package/dist/utils/request/http.d.ts +12 -0
  412. package/dist/utils/request/http.js +6 -2
  413. package/dist/utils/request/http.js.map +1 -1
  414. package/dist/utils/request/use-request.js +4 -2
  415. package/dist/utils/request/use-request.js.map +1 -1
  416. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"date-segments.js","names":[],"sources":["../../src/date/date-segments.ts"],"sourcesContent":["/**\n * 分段输入的状态(年、月、日、时、分、秒、上午 / 下午):DateField、TimeField 共用。参考 React Aria 的 useDateFieldState。\n * 不碰 DOM:组件把每段渲染成 role=\"spinbutton\" 的可聚焦元素,按键、输入交给这里,焦点该去哪一段由 focusedSegment 告诉组件。\n *\n * - 段的顺序、分隔符取自 Intl(zh-CN 年/月/日,en-US 月/日/年,de-DE 日.月.年),12 / 24 小时制按语言或配置;\n * - 逐段输入:打一个数字后,再打一个就超出范围时直接跳到下一段(月份打 3 → 03 跳走,打 1 → 等第二位);\n * - ↑↓ 加减(到头时回绕),Page Up / Down 大步,Home / End 到最小 / 最大,Backspace 删一位、删空后回到上一段;\n * - 所有段都填了才写回值;填好的值删掉一段时写回 null。认全角数字与阿拉伯-印度数字。\n *\n * const segments = useDateSegments({ fields: () => ['year', 'month', 'day'], value: () => fields, onChange, … });\n */\nimport { computed, ref, shallowRef, watch } from 'vue';\nimport type { HourCycles } from '../config/lang/lang';\nimport { isoWeeksInYear } from '../utils/data/date';\n\n/** 可以输入的段 */\nexport interface DateSegmentTypes {\n /** 年 */\n year: unknown;\n /** 月 */\n month: unknown;\n /** 日 */\n day: unknown;\n /** 季度(1–4) */\n quarter: unknown;\n /** 一年里的第几周(ISO 8601:周一开始,含 1 月 4 日的那周是第 1 周) */\n week: unknown;\n /** 时(内部总是 0–23,12 小时制时显示 1–12) */\n hour: unknown;\n /** 分 */\n minute: unknown;\n /** 秒 */\n second: unknown;\n /** 上午 / 下午(12 小时制时自动加上) */\n dayPeriod: unknown;\n}\n\n/** 一段的类型 */\nexport type DateSegmentType = keyof DateSegmentTypes;\n\n/** 值的各个字段:时是 0–23 */\nexport type DateFieldValues = Partial<Record<Exclude<DateSegmentType, 'dayPeriod'>, number>>;\n\n/** 渲染用的一段 */\nexport interface DateSegment {\n /** 段的类型;literal 是分隔符(/、:、年) */\n type: DateSegmentType | 'literal';\n /** 显示的文字:值、正在输入的数字,或占位文字 */\n text: string;\n /** 还没填:显示的是占位文字 */\n placeholder: boolean;\n /** 当前值(dayPeriod 是 0 上午 / 1 下午);没填时 null */\n value: number | null;\n /** 最小值(aria-valuemin) */\n min: number;\n /** 最大值(aria-valuemax) */\n max: number;\n /** 段的名称(取自 Intl.DisplayNames:年、月、日 / year、month、day),给 aria-label */\n label: string;\n}\n\n/** useDateSegments 的选项 */\nexport interface DateSegmentsOptions {\n /** 有哪些段(不含 dayPeriod,12 小时制时自动加) */\n fields: () => readonly Exclude<DateSegmentType, 'dayPeriod'>[];\n /** 语言:段的顺序、分隔符、数字的写法 */\n locale: () => string;\n /** 12 / 24 小时制;不写时按语言 */\n hourCycle?: () => keyof HourCycles | undefined;\n /** 完整的值(外部传入);没有时 null */\n value: () => DateFieldValues | null;\n /** 所有段都填了时写回完整的值,填好的值删掉一段时写回 null */\n onChange: (value: DateFieldValues | null) => void;\n /** ↑↓ 从空段开始加减时的起点(一般是现在) */\n placeholderValue: () => DateFieldValues;\n /** 各段的占位文字(年、月、日 / yyyy、mm、dd) */\n placeholders: () => Partial<Record<DateSegmentType, string>>;\n /** 季度、周这两种段的排法(Intl 不排它们),如 `'{year}年第{quarter}季度'`;不写时是 `'{year}-{quarter}'` */\n periodPatterns?: () => Partial<Record<'quarter' | 'week', string>>;\n /** 只读或不可用:不响应输入 */\n readonly?: () => boolean;\n /** 焦点要越过这组的两端时(最后一段输入满了;第一段删空后再删):DateRangePicker 把焦点交给另一组 */\n onExit?: (direction: 1 | -1) => void;\n}\n\n/** 分段输入的状态与操作 */\nexport interface DateSegmentsState {\n /** 各段,含分隔符,按语言的顺序 */\n readonly segments: readonly DateSegment[];\n /** 可以输入的段(不含分隔符),Tab 与 ←→ 的顺序 */\n readonly editable: readonly DateSegment[];\n /** 焦点应该在的段:输入满了跳到下一段、Backspace 删空回到上一段时变化 */\n readonly focusedSegment: DateSegmentType | null;\n /** 有段填了、但还没填全 */\n readonly partial: boolean;\n /** 焦点进了某一段(组件的 focusin) */\n setFocused(type: DateSegmentType | null): void;\n /** 在焦点段输入文字(数字、a / p):逐个字符处理 */\n type(text: string): void;\n /** 焦点段加减 */\n increment(amount: number): void;\n /** 焦点段设成最小 / 最大值 */\n toEdge(edge: 'min' | 'max'): void;\n /** 删掉焦点段的最后一位;已经空了时焦点回到上一段 */\n backspace(): void;\n /** 清空所有段 */\n clear(): void;\n /** 丢掉还没写回的输入(打了一半的段),回到当前的值:表单重置时 */\n reset(): void;\n /** 写回还没写回的年份(没打满四位时先不写回):离开这一段、按 Enter 提交时 */\n commit(): void;\n /** 焦点移到相邻的段 */\n moveFocus(direction: 1 | -1): void;\n}\n\n/** Page Up / Down 的步长(同 React Aria) */\nconst BIG_STEPS: Record<DateSegmentType, number> = {\n year: 5,\n month: 2,\n day: 7,\n quarter: 2,\n week: 4,\n hour: 2,\n minute: 15,\n second: 15,\n dayPeriod: 1,\n};\n\n/** 全角数字、阿拉伯-印度数字 → 半角 */\nfunction normalizeDigits(text: string): string {\n return text\n .replace(/[0-9]/g, (char) => String.fromCharCode(char.charCodeAt(0) - 0xfee0))\n .replace(/[\\u0660-\\u0669]/g, (char) => String(char.charCodeAt(0) - 0x0660))\n .replace(/[\\u06f0-\\u06f9]/g, (char) => String(char.charCodeAt(0) - 0x06f0));\n}\n\nconst daysInMonth = (year: number | undefined, month: number | undefined) =>\n month == null ? 31 : new Date(Date.UTC(year ?? 2000, month, 0)).getUTCDate();\n\n/** 分段输入的状态(组件 setup 里调用) */\nexport function useDateSegments(config: DateSegmentsOptions): DateSegmentsState {\n // 正在编辑的各字段:可以只填了一部分\n const draft = ref<DateFieldValues>({ ...config.value() });\n // 当前段已经打了的数字(还可能接着打第二位)\n const buffer = ref('');\n // 年份没打满四位:草稿里有了,先不写回(逐位打 2、0、2、6 时不写出 0002、0020、0202)\n let pendingYear = false;\n const focusedSegment = shallowRef<DateSegmentType | null>(null);\n\n // 外部的值变了(父级改了、清空了)时以它为准;自己写回的值也会回到这里,结果相同\n watch(\n () => config.value(),\n (value) => {\n if (sameFields(value, complete.value ? draft.value : null)) return;\n draft.value = { ...value };\n buffer.value = '';\n },\n );\n\n const hour12 = computed(() => {\n const cycle = config.hourCycle?.() ?? resolvedHourCycle(config.locale());\n return cycle === 'h12';\n });\n\n const fields = computed(() => {\n const list: DateSegmentType[] = [...config.fields()];\n if (hour12.value && list.includes('hour')) list.push('dayPeriod');\n return list;\n });\n\n const complete = computed(() => config.fields().every((field) => draft.value[field] != null));\n\n /** 按语言的顺序排好的段(含分隔符):只取格式化结果的结构,值另外填 */\n const layout = computed(() => {\n // 季度、周:Intl 不排这两种段,按语言包的排法\n const period = config.fields().find((field) => field === 'quarter' || field === 'week');\n if (period) {\n const pattern = config.periodPatterns?.()[period] ?? `{year}-{${period}}`;\n return pattern\n .split(/(\\{(?:year|quarter|week)\\})/)\n .filter(Boolean)\n .map((part) => {\n const field = /^\\{(year|quarter|week)\\}$/.exec(part)?.[1];\n return field\n ? { type: field as DateSegment['type'], literal: '' }\n : { type: 'literal' as const, literal: part };\n });\n }\n const options: Intl.DateTimeFormatOptions = {\n hourCycle: hour12.value ? 'h12' : 'h23',\n timeZone: 'UTC',\n };\n // 到这里的只有 Intl 认识的段(季度、周在上面已经返回了)\n for (const field of config.fields() as readonly Exclude<ValueField, 'quarter' | 'week'>[]) {\n options[field] = field === 'year' ? 'numeric' : '2-digit';\n }\n const parts = new Intl.DateTimeFormat(config.locale(), options).formatToParts(SAMPLE);\n const wanted = new Set(fields.value);\n return (\n parts\n .filter((part) => part.type === 'literal' || wanted.has(part.type as DateSegmentType))\n .map((part) => ({ type: part.type as DateSegment['type'], literal: part.value }))\n // 首尾只有空白的分隔符没有意义;“2026年10月”结尾的“月”要留着\n .filter(\n (part, index, all) =>\n part.type !== 'literal' ||\n part.literal.trim() !== '' ||\n (index > 0 && index < all.length - 1),\n )\n );\n });\n\n const labels = computed(() => {\n const names = new Intl.DisplayNames(config.locale(), { type: 'dateTimeField' });\n return Object.fromEntries(\n // Intl 的字段名里周叫 weekOfYear\n fields.value.map((field) => [\n field,\n names.of(field === 'week' ? 'weekOfYear' : field) ?? field,\n ]),\n ) as Record<DateSegmentType, string>;\n });\n\n const digits = computed(() => {\n const locale = config.locale();\n const format = (width: number) =>\n new Intl.NumberFormat(locale, { useGrouping: false, minimumIntegerDigits: width });\n return { 1: format(1), 2: format(2), 4: format(4) } as Record<1 | 2 | 4, Intl.NumberFormat>;\n });\n\n const periods = computed(() => {\n const formatter = new Intl.DateTimeFormat(config.locale(), {\n hour: 'numeric',\n hourCycle: 'h12',\n timeZone: 'UTC',\n });\n const period = (hour: number) =>\n formatter.formatToParts(Date.UTC(2000, 0, 1, hour)).find((part) => part.type === 'dayPeriod')\n ?.value ?? (hour < 12 ? 'AM' : 'PM');\n return [period(0), period(12)] as const;\n });\n\n function range(type: DateSegmentType): [number, number] {\n switch (type) {\n case 'year':\n return [1, 9999];\n case 'month':\n return [1, 12];\n case 'day':\n return [1, daysInMonth(draft.value.year, draft.value.month)];\n case 'quarter':\n return [1, 4];\n case 'week':\n return [1, draft.value.year == null ? 53 : isoWeeksInYear(draft.value.year)];\n case 'hour':\n return hour12.value ? [1, 12] : [0, 23];\n case 'minute':\n case 'second':\n return [0, 59];\n case 'dayPeriod':\n return [0, 1];\n }\n }\n\n /** 段上显示的值:12 小时制的时显示 1–12,上午 / 下午是 0 / 1 */\n function shown(type: DateSegmentType): number | null {\n const hour = draft.value.hour;\n if (type === 'dayPeriod') return hour == null ? null : hour >= 12 ? 1 : 0;\n if (type === 'hour' && hour12.value && hour != null) return hour % 12 || 12;\n return draft.value[type] ?? null;\n }\n\n function text(type: DateSegmentType, value: number | null): string {\n if (type === 'dayPeriod') return value == null ? '' : periods.value[value as 0 | 1];\n if (buffer.value && focusedSegment.value === type)\n return digits.value[1].format(Number(buffer.value));\n if (value == null) return '';\n const width =\n type === 'year' ? 4 : type === 'quarter' || (type === 'hour' && hour12.value) ? 1 : 2;\n return digits.value[width].format(value);\n }\n\n /**\n * 空段的占位:语言包里的单位字(年、月、日);后面紧跟的文字已经是这个单位时(中文的“2026年”)改用横线,\n * 显示成“––年”,否则会是“年年”\n */\n function placeholderOf(type: DateSegmentType, next: string | undefined): string {\n const unit = config.placeholders()[type];\n return !unit || next?.trimStart().startsWith(unit) ? '––' : unit;\n }\n\n const segments = computed((): DateSegment[] =>\n layout.value.map(({ type, literal }, index) => {\n if (type === 'literal')\n return { type, text: literal, placeholder: false, value: null, min: 0, max: 0, label: '' };\n const value = shown(type);\n const [min, max] = range(type);\n const filled = text(type, value);\n const following = layout.value[index + 1];\n return {\n type,\n text: filled || placeholderOf(type, following?.literal),\n placeholder: !filled,\n value,\n min,\n max,\n label: labels.value[type],\n };\n }),\n );\n const editable = computed(() => segments.value.filter((segment) => segment.type !== 'literal'));\n\n /** 写一段的值(显示值:12 小时制的时是 1–12);写完检查是否填全,emit 为 false 时只改草稿 */\n function write(type: DateSegmentType, value: number | null, emit = true) {\n const next = { ...draft.value };\n if (type === 'dayPeriod') {\n if (next.hour == null || value == null) return;\n next.hour = (next.hour % 12) + value * 12;\n } else if (type === 'hour' && hour12.value && value != null) {\n const afternoon = (draft.value.hour ?? config.placeholderValue().hour ?? 0) >= 12;\n next.hour = (value % 12) + (afternoon ? 12 : 0);\n } else if (value == null) delete next[type];\n else next[type] = value;\n const wasComplete = complete.value;\n draft.value = next;\n pendingYear = !emit;\n if (!emit) return;\n if (complete.value) config.onChange(constrained(next));\n else if (wasComplete) config.onChange(null);\n }\n\n function commit() {\n if (!pendingYear) return;\n pendingYear = false;\n if (complete.value) config.onChange(constrained(draft.value));\n }\n\n // 日超过了这个月的天数(先填了 31 再把月改成 2 月):写回时取这个月的最后一天;周同理(这一年只有 52 周时)\n function constrained(values: DateFieldValues): DateFieldValues {\n if (values.week != null && values.year != null)\n return { ...values, week: Math.min(values.week, isoWeeksInYear(values.year)) };\n if (values.day == null) return values;\n return { ...values, day: Math.min(values.day, daysInMonth(values.year, values.month)) };\n }\n\n const current = () => focusedSegment.value;\n\n const state: DateSegmentsState = {\n get segments() {\n return segments.value;\n },\n get editable() {\n return editable.value;\n },\n get focusedSegment() {\n return focusedSegment.value;\n },\n get partial() {\n return !complete.value && config.fields().some((field) => draft.value[field] != null);\n },\n setFocused(type) {\n if (type !== focusedSegment.value) {\n commit();\n buffer.value = '';\n }\n focusedSegment.value = type;\n },\n type(input) {\n if (!current() || config.readonly?.()) return;\n for (const char of normalizeDigits(input)) {\n const segment = current();\n if (!segment) return;\n if (segment === 'dayPeriod') {\n const lower = char.toLocaleLowerCase();\n const [am, pm] = periods.value.map((label) => label.toLocaleLowerCase());\n if (lower === 'a' || am!.startsWith(lower)) write('dayPeriod', 0);\n else if (lower === 'p' || pm!.startsWith(lower)) write('dayPeriod', 1);\n else continue;\n state.moveFocus(1);\n continue;\n }\n if (!/\\d/.test(char)) continue;\n const [min, max] = range(segment);\n let next = buffer.value + char;\n // 打了这一位就超出范围:从这一位重新开始\n if (Number(next) > max) next = char;\n buffer.value = next;\n const number = Number(next);\n // 0 还不是合法值(月、日、12 小时制的时):先记着,等下一位;年份打满四位才写回\n if (number >= min) write(segment, number, segment !== 'year' || next.length >= 4);\n const maxDigits = String(max).length;\n if (next.length >= maxDigits || number * 10 > max) {\n buffer.value = '';\n if (number < min) write(segment, min);\n state.moveFocus(1);\n }\n }\n },\n increment(amount) {\n const type = current();\n if (!type || config.readonly?.()) return;\n buffer.value = '';\n const [min, max] = range(type);\n const value = shown(type);\n if (value == null) {\n const start = config.placeholderValue();\n if (type === 'dayPeriod') {\n if (draft.value.hour == null)\n write('hour', hour12.value ? (start.hour ?? 0) % 12 || 12 : (start.hour ?? 0));\n write('dayPeriod', (start.hour ?? 0) >= 12 ? 1 : 0);\n return;\n }\n const initial =\n type === 'hour' && hour12.value ? (start.hour ?? 0) % 12 || 12 : (start[type] ?? min);\n write(type, initial);\n return;\n }\n const size = max - min + 1;\n write(type, ((((value - min + amount) % size) + size) % size) + min);\n },\n toEdge(edge) {\n const type = current();\n if (!type || config.readonly?.()) return;\n buffer.value = '';\n const [min, max] = range(type);\n write(type, edge === 'min' ? min : max);\n },\n backspace() {\n const type = current();\n if (!type || config.readonly?.()) return;\n const value = shown(type);\n if (value == null && !buffer.value) {\n state.moveFocus(-1);\n return;\n }\n const digitsLeft = type === 'dayPeriod' ? '' : (buffer.value || String(value)).slice(0, -1);\n buffer.value = digitsLeft;\n const [min] = range(type);\n if (type === 'dayPeriod' || !digitsLeft) {\n if (type === 'dayPeriod' || type === 'hour') {\n // 删掉上午 / 下午或时:时没有了,两段一起清空\n const next = { ...draft.value };\n delete next.hour;\n const wasComplete = complete.value;\n draft.value = next;\n if (wasComplete) config.onChange(null);\n return;\n }\n write(type, null);\n return;\n }\n if (Number(digitsLeft) >= min) write(type, Number(digitsLeft));\n },\n clear() {\n buffer.value = '';\n pendingYear = false;\n const wasComplete = complete.value;\n draft.value = {};\n if (wasComplete) config.onChange(null);\n },\n reset() {\n buffer.value = '';\n pendingYear = false;\n draft.value = { ...config.value() };\n },\n commit,\n moveFocus(direction) {\n const list = editable.value;\n const index = list.findIndex((segment) => segment.type === current());\n const next = list[index + direction];\n if (next) state.setFocused(next.type as DateSegmentType);\n else config.onExit?.(direction);\n },\n };\n return state;\n}\n\n/**\n * 分段输入的键盘操作:↑↓ 加减、Page Up / Down 大步、Home / End 最小 / 最大、Backspace / Delete 删除、\n * ←→ 换段(从右到左排版时反过来)。数字与字母走 beforeinput(软键盘、输入法也能输入),这里不处理。\n * 返回是否处理了这个按键(处理了就该 preventDefault)\n */\nexport function handleSegmentKeydown(\n state: DateSegmentsState,\n event: KeyboardEvent,\n rtl = false,\n): boolean {\n if (event.altKey || event.ctrlKey || event.metaKey) return false;\n const type = state.focusedSegment;\n if (!type) return false;\n const forward = rtl ? -1 : 1;\n const actions: Record<string, () => void> = {\n ArrowUp: () => state.increment(1),\n ArrowDown: () => state.increment(-1),\n PageUp: () => state.increment(BIG_STEPS[type]),\n PageDown: () => state.increment(-BIG_STEPS[type]),\n Home: () => state.toEdge('min'),\n End: () => state.toEdge('max'),\n Backspace: () => state.backspace(),\n Delete: () => state.backspace(),\n ArrowRight: () => state.moveFocus(forward as 1 | -1),\n ArrowLeft: () => state.moveFocus(-forward as 1 | -1),\n };\n const action = actions[event.key];\n if (!action) return false;\n action();\n return true;\n}\n\n// ───────── 内部实现 ─────────\n\n/** 取段的顺序用的任意时刻(各段都是两位数,排版不受值影响) */\nconst SAMPLE = Date.UTC(2000, 10, 22, 13, 44, 55);\n\n/** 语言默认的小时制 */\nfunction resolvedHourCycle(locale: string): keyof HourCycles {\n const cycle = new Intl.DateTimeFormat(locale, { hour: 'numeric' }).resolvedOptions().hourCycle;\n return cycle === 'h11' || cycle === 'h12' ? 'h12' : 'h23';\n}\n\nfunction sameFields(a: DateFieldValues | null, b: DateFieldValues | null): boolean {\n if (a == null || b == null) return a === b;\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]) as Set<keyof DateFieldValues>;\n return [...keys].every((key) => a[key] === b[key]);\n}\n\n// ───────── 值与 ISO 字符串 ─────────\n\n/** 日期类分段的粒度:DateField 精确到哪一段(到时、分、秒时是日期加时间) */\nexport interface DateFieldGranularities {\n /** 只有年:'2026' */\n year: unknown;\n /** 年月:'2026-10'(同原生 input type=\"month\") */\n month: unknown;\n /** 年月日(默认):'2026-10-20' */\n day: unknown;\n /** 年与季度:'2026-Q4' */\n quarter: unknown;\n /** 年与周(ISO 8601,周一开始):'2026-W43'(同原生 input type=\"week\") */\n week: unknown;\n /** 日期加时:'2026-10-20T14:00' */\n hour: unknown;\n /** 日期加时分:'2026-10-20T14:30'(同原生 input type=\"datetime-local\") */\n minute: unknown;\n /** 日期加时分秒:'2026-10-20T14:30:15' */\n second: unknown;\n}\n\n/** 分段输入精确到哪一段 */\nexport type DateFieldGranularity = keyof DateFieldGranularities;\n\ntype ValueField = Exclude<DateSegmentType, 'dayPeriod'>;\n\nconst ALL_FIELDS: readonly ValueField[] = ['year', 'month', 'day', 'hour', 'minute', 'second'];\n\n/** 日期分段:从年到 granularity;time 时只取时间的部分(TimeField) */\nexport function segmentFields(granularity: DateFieldGranularity, time = false): ValueField[] {\n if (granularity === 'quarter' || granularity === 'week') return time ? [] : ['year', granularity];\n const fields = ALL_FIELDS.slice(0, ALL_FIELDS.indexOf(granularity) + 1);\n return time\n ? fields.filter((field) => field === 'hour' || field === 'minute' || field === 'second')\n : fields;\n}\n\nconst pad = (value: number, width = 2) => String(value).padStart(width, '0');\n\n/** 各段的值 → ISO 字符串(按有哪些段:'2026'、'2026-10'、'2026-10-20'、'2026-10-20T14:30'、'14:30') */\nexport function fieldsToIso(values: DateFieldValues, fields: readonly ValueField[]): string {\n if (fields.includes('quarter')) return `${pad(values.year ?? 0, 4)}-Q${values.quarter ?? 1}`;\n if (fields.includes('week')) return `${pad(values.year ?? 0, 4)}-W${pad(values.week ?? 1)}`;\n const date = [\n values.year != null && pad(values.year, 4),\n fields.includes('month') && pad(values.month ?? 1),\n fields.includes('day') && pad(values.day ?? 1),\n ]\n .filter((part) => part !== false)\n .join('-');\n if (!fields.includes('hour')) return date;\n const time = [\n pad(values.hour ?? 0),\n pad(values.minute ?? 0),\n fields.includes('second') && pad(values.second ?? 0),\n ]\n .filter((part) => part !== false)\n .join(':');\n return fields.includes('year') ? `${date}T${time}` : time;\n}\n\n/** ISO 字符串 → 各段的值;格式不对时 null。只取 fields 里有的段('2026-10-20T14:30' 给 DateField 时只要日期) */\nexport function isoToFields(\n value: string | null | undefined,\n fields: readonly ValueField[],\n): DateFieldValues | null {\n if (!value) return null;\n const period = /^(\\d{4})-(?:Q([1-4])|W(\\d{2}))$/.exec(value);\n if (period) {\n const parsed: DateFieldValues = { year: Number(period[1]) };\n if (period[2] != null) parsed.quarter = Number(period[2]);\n if (period[3] != null) parsed.week = Number(period[3]);\n return fields.every((field) => parsed[field] != null) ? parsed : null;\n }\n const match = /^(?:(\\d{4})(?:-(\\d{2})(?:-(\\d{2}))?)?)?(?:T?(\\d{2}):(\\d{2})(?::(\\d{2}))?)?$/.exec(\n value,\n );\n if (!match) return null;\n const parsed: DateFieldValues = {};\n ALL_FIELDS.forEach((field, index) => {\n const text = match[index + 1];\n if (fields.includes(field) && text != null) parsed[field] = Number(text);\n });\n return fields.every((field) => parsed[field] != null) ? parsed : null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"date-segments.js","names":[],"sources":["../../src/date/date-segments.ts"],"sourcesContent":["/**\n * 分段输入的状态(年、月、日、时、分、秒、上午 / 下午):DateField、TimeField 共用。参考 React Aria 的 useDateFieldState。\n * 不碰 DOM:组件把每段渲染成 role=\"spinbutton\" 的可聚焦元素,按键、输入交给这里,焦点该去哪一段由 focusedSegment 告诉组件。\n *\n * - 段的顺序、分隔符取自 Intl(zh-CN 年/月/日,en-US 月/日/年,de-DE 日.月.年),12 / 24 小时制按语言或配置;\n * - 逐段输入:打一个数字后,再打一个就超出范围时直接跳到下一段(月份打 3 → 03 跳走,打 1 → 等第二位);\n * - ↑↓ 加减(到头时回绕),Page Up / Down 大步,Home / End 到最小 / 最大,Backspace 删一位、删空后回到上一段;\n * - 所有段都填了才写回值;填好的值删掉一段时写回 null。认全角数字与阿拉伯-印度数字。\n *\n * const segments = useDateSegments({ fields: () => ['year', 'month', 'day'], value: () => fields, onChange, … });\n */\nimport { computed, ref, shallowRef, watch } from 'vue';\nimport type { HourCycles } from '../config/lang/lang';\nimport { isoWeeksInYear } from '../utils/data/date';\n\n/** 可以输入的段 */\nexport interface DateSegmentTypes {\n /** 年 */\n year: unknown;\n /** 月 */\n month: unknown;\n /** 日 */\n day: unknown;\n /** 季度(1–4) */\n quarter: unknown;\n /** 一年里的第几周(ISO 8601:周一开始,含 1 月 4 日的那周是第 1 周) */\n week: unknown;\n /** 时(内部总是 0–23,12 小时制时显示 1–12) */\n hour: unknown;\n /** 分 */\n minute: unknown;\n /** 秒 */\n second: unknown;\n /** 上午 / 下午(12 小时制时自动加上) */\n dayPeriod: unknown;\n}\n\n/** 一段的类型 */\nexport type DateSegmentType = keyof DateSegmentTypes;\n\n/** 值的各个字段:时是 0–23 */\nexport type DateFieldValues = Partial<Record<Exclude<DateSegmentType, 'dayPeriod'>, number>>;\n\n/** 渲染用的一段 */\nexport interface DateSegment {\n /** 段的类型;literal 是分隔符(/、:、年) */\n type: DateSegmentType | 'literal';\n /** 显示的文字:值、正在输入的数字,或占位文字 */\n text: string;\n /** 还没填:显示的是占位文字 */\n placeholder: boolean;\n /** 当前值(dayPeriod 是 0 上午 / 1 下午);没填时 null */\n value: number | null;\n /** 最小值(aria-valuemin) */\n min: number;\n /** 最大值(aria-valuemax) */\n max: number;\n /** 段的名称(取自 Intl.DisplayNames:年、月、日 / year、month、day),给 aria-label */\n label: string;\n}\n\n/** useDateSegments 的选项 */\nexport interface DateSegmentsOptions {\n /** 有哪些段(不含 dayPeriod,12 小时制时自动加) */\n fields: () => readonly Exclude<DateSegmentType, 'dayPeriod'>[];\n /** 语言:段的顺序、分隔符、数字的写法 */\n locale: () => string;\n /** 12 / 24 小时制;不写时按语言 */\n hourCycle?: () => keyof HourCycles | undefined;\n /** 完整的值(外部传入);没有时 null */\n value: () => DateFieldValues | null;\n /** 所有段都填了时写回完整的值,填好的值删掉一段时写回 null */\n onChange: (value: DateFieldValues | null) => void;\n /** ↑↓ 从空段开始加减时的起点(一般是现在) */\n placeholderValue: () => DateFieldValues;\n /** 各段的占位文字(年、月、日 / yyyy、mm、dd) */\n placeholders: () => Partial<Record<DateSegmentType, string>>;\n /** 季度、周这两种段的排法(Intl 不排它们),如 `'{year}年第{quarter}季度'`;不写时是 `'{year}-{quarter}'` */\n periodPatterns?: () => Partial<Record<'quarter' | 'week', string>>;\n /** 只读或不可用:不响应输入 */\n readonly?: () => boolean;\n /** 焦点要越过这组的两端时(最后一段输入满了;第一段删空后再删):DateRangePicker 把焦点交给另一组 */\n onExit?: (direction: 1 | -1) => void;\n}\n\n/** 分段输入的状态与操作 */\nexport interface DateSegmentsState {\n /** 各段,含分隔符,按语言的顺序 */\n readonly segments: readonly DateSegment[];\n /** 可以输入的段(不含分隔符),Tab 与 ←→ 的顺序 */\n readonly editable: readonly DateSegment[];\n /** 焦点应该在的段:输入满了跳到下一段、Backspace 删空回到上一段时变化 */\n readonly focusedSegment: DateSegmentType | null;\n /** 有段填了、但还没填全 */\n readonly partial: boolean;\n /** 焦点进了某一段(组件的 focusin) */\n setFocused(type: DateSegmentType | null): void;\n /** 在焦点段输入文字(数字、a / p):逐个字符处理 */\n type(text: string): void;\n /** 焦点段加减 */\n increment(amount: number): void;\n /** 焦点段设成最小 / 最大值 */\n toEdge(edge: 'min' | 'max'): void;\n /** 删掉焦点段的最后一位;已经空了时焦点回到上一段 */\n backspace(): void;\n /** 清空所有段 */\n clear(): void;\n /** 丢掉还没写回的输入(打了一半的段),回到当前的值:表单重置时 */\n reset(): void;\n /** 写回还没写回的年份(没打满四位时先不写回):离开这一段、按 Enter 提交时 */\n commit(): void;\n /** 焦点移到相邻的段 */\n moveFocus(direction: 1 | -1): void;\n}\n\n/** Page Up / Down 的步长(同 React Aria) */\nconst BIG_STEPS: Record<DateSegmentType, number> = {\n year: 5,\n month: 2,\n day: 7,\n quarter: 2,\n week: 4,\n hour: 2,\n minute: 15,\n second: 15,\n dayPeriod: 1,\n};\n\n/** 全角数字、阿拉伯-印度数字 → 半角 */\nfunction normalizeDigits(text: string): string {\n return text\n .replace(/[0-9]/g, (char) => String.fromCharCode(char.charCodeAt(0) - 0xfee0))\n .replace(/[\\u0660-\\u0669]/g, (char) => String(char.charCodeAt(0) - 0x0660))\n .replace(/[\\u06f0-\\u06f9]/g, (char) => String(char.charCodeAt(0) - 0x06f0));\n}\n\nconst daysInMonth = (year: number | undefined, month: number | undefined) =>\n month == null ? 31 : new Date(Date.UTC(year ?? 2000, month, 0)).getUTCDate();\n\n/** 分段输入的状态(组件 setup 里调用) */\nexport function useDateSegments(config: DateSegmentsOptions): DateSegmentsState {\n // 正在编辑的各字段:可以只填了一部分\n const draft = ref<DateFieldValues>({ ...config.value() });\n // 当前段已经打了的数字(还可能接着打第二位)\n const buffer = ref('');\n // 年份没打满四位:草稿里有了,先不写回(逐位打 2、0、2、6 时不写出 0002、0020、0202)\n let pendingYear = false;\n const focusedSegment = shallowRef<DateSegmentType | null>(null);\n\n // 外部的值变了(父级改了、清空了)时以它为准;自己写回的值也会回到这里,结果相同\n watch(\n () => config.value(),\n (value) => {\n if (sameFields(value, complete.value ? draft.value : null)) return;\n draft.value = { ...value };\n buffer.value = '';\n },\n );\n\n const hour12 = computed(() => {\n const cycle = config.hourCycle?.() ?? resolvedHourCycle(config.locale());\n return cycle === 'h12';\n });\n\n const fields = computed(() => {\n const list: DateSegmentType[] = [...config.fields()];\n if (hour12.value && list.includes('hour')) list.push('dayPeriod');\n return list;\n });\n\n const complete = computed(() => config.fields().every((field) => draft.value[field] != null));\n\n /** 按语言的顺序排好的段(含分隔符):只取格式化结果的结构,值另外填 */\n const layout = computed(() => {\n // 季度、周:Intl 不排这两种段,按语言包的排法\n const period = config.fields().find((field) => field === 'quarter' || field === 'week');\n if (period) {\n const pattern = config.periodPatterns?.()[period] ?? `{year}-{${period}}`;\n return pattern\n .split(/(\\{(?:year|quarter|week)\\})/)\n .filter(Boolean)\n .map((part) => {\n const field = /^\\{(year|quarter|week)\\}$/.exec(part)?.[1];\n return field\n ? { type: field as DateSegment['type'], literal: '' }\n : { type: 'literal' as const, literal: part };\n });\n }\n const options: Intl.DateTimeFormatOptions = {\n hourCycle: hour12.value ? 'h12' : 'h23',\n timeZone: 'UTC',\n };\n // 到这里的只有 Intl 认识的段(季度、周在上面已经返回了)\n for (const field of config.fields() as readonly Exclude<ValueField, 'quarter' | 'week'>[]) {\n options[field] = field === 'year' ? 'numeric' : '2-digit';\n }\n const parts = new Intl.DateTimeFormat(config.locale(), options).formatToParts(SAMPLE);\n const wanted = new Set(fields.value);\n return (\n parts\n .filter((part) => part.type === 'literal' || wanted.has(part.type as DateSegmentType))\n // 分隔符里的各种空白(不换行空格、窄不换行空格)统一成普通空格:各平台的 Intl 给的不一样,\n // 服务端渲染与浏览器的文字对不上;显示上没有区别\n .map((part) => ({\n type: part.type as DateSegment['type'],\n literal: part.type === 'literal' ? part.value.replace(/[   ]/g, ' ') : part.value,\n }))\n // 首尾只有空白的分隔符没有意义;“2026年10月”结尾的“月”要留着\n .filter(\n (part, index, all) =>\n part.type !== 'literal' ||\n part.literal.trim() !== '' ||\n (index > 0 && index < all.length - 1),\n )\n );\n });\n\n const labels = computed(() => {\n const names = new Intl.DisplayNames(config.locale(), { type: 'dateTimeField' });\n return Object.fromEntries(\n // Intl 的字段名里周叫 weekOfYear\n fields.value.map((field) => [\n field,\n names.of(field === 'week' ? 'weekOfYear' : field) ?? field,\n ]),\n ) as Record<DateSegmentType, string>;\n });\n\n const digits = computed(() => {\n const locale = config.locale();\n const format = (width: number) =>\n new Intl.NumberFormat(locale, { useGrouping: false, minimumIntegerDigits: width });\n return { 1: format(1), 2: format(2), 4: format(4) } as Record<1 | 2 | 4, Intl.NumberFormat>;\n });\n\n const periods = computed(() => {\n const formatter = new Intl.DateTimeFormat(config.locale(), {\n hour: 'numeric',\n hourCycle: 'h12',\n timeZone: 'UTC',\n });\n const period = (hour: number) =>\n formatter.formatToParts(Date.UTC(2000, 0, 1, hour)).find((part) => part.type === 'dayPeriod')\n ?.value ?? (hour < 12 ? 'AM' : 'PM');\n return [period(0), period(12)] as const;\n });\n\n function range(type: DateSegmentType): [number, number] {\n switch (type) {\n case 'year':\n return [1, 9999];\n case 'month':\n return [1, 12];\n case 'day':\n return [1, daysInMonth(draft.value.year, draft.value.month)];\n case 'quarter':\n return [1, 4];\n case 'week':\n return [1, draft.value.year == null ? 53 : isoWeeksInYear(draft.value.year)];\n case 'hour':\n return hour12.value ? [1, 12] : [0, 23];\n case 'minute':\n case 'second':\n return [0, 59];\n case 'dayPeriod':\n return [0, 1];\n }\n }\n\n /** 段上显示的值:12 小时制的时显示 1–12,上午 / 下午是 0 / 1 */\n function shown(type: DateSegmentType): number | null {\n const hour = draft.value.hour;\n if (type === 'dayPeriod') return hour == null ? null : hour >= 12 ? 1 : 0;\n if (type === 'hour' && hour12.value && hour != null) return hour % 12 || 12;\n return draft.value[type] ?? null;\n }\n\n function text(type: DateSegmentType, value: number | null): string {\n if (type === 'dayPeriod') return value == null ? '' : periods.value[value as 0 | 1];\n if (buffer.value && focusedSegment.value === type)\n return digits.value[1].format(Number(buffer.value));\n if (value == null) return '';\n const width =\n type === 'year' ? 4 : type === 'quarter' || (type === 'hour' && hour12.value) ? 1 : 2;\n return digits.value[width].format(value);\n }\n\n /**\n * 空段的占位:语言包里的单位字(年、月、日);后面紧跟的文字已经是这个单位时(中文的“2026年”)改用横线,\n * 显示成“––年”,否则会是“年年”\n */\n function placeholderOf(type: DateSegmentType, next: string | undefined): string {\n const unit = config.placeholders()[type];\n return !unit || next?.trimStart().startsWith(unit) ? '––' : unit;\n }\n\n const segments = computed((): DateSegment[] =>\n layout.value.map(({ type, literal }, index) => {\n if (type === 'literal')\n return { type, text: literal, placeholder: false, value: null, min: 0, max: 0, label: '' };\n const value = shown(type);\n const [min, max] = range(type);\n const filled = text(type, value);\n const following = layout.value[index + 1];\n return {\n type,\n text: filled || placeholderOf(type, following?.literal),\n placeholder: !filled,\n value,\n min,\n max,\n label: labels.value[type],\n };\n }),\n );\n const editable = computed(() => segments.value.filter((segment) => segment.type !== 'literal'));\n\n /** 写一段的值(显示值:12 小时制的时是 1–12);写完检查是否填全,emit 为 false 时只改草稿 */\n function write(type: DateSegmentType, value: number | null, emit = true) {\n const next = { ...draft.value };\n if (type === 'dayPeriod') {\n if (next.hour == null || value == null) return;\n next.hour = (next.hour % 12) + value * 12;\n } else if (type === 'hour' && hour12.value && value != null) {\n const afternoon = (draft.value.hour ?? config.placeholderValue().hour ?? 0) >= 12;\n next.hour = (value % 12) + (afternoon ? 12 : 0);\n } else if (value == null) delete next[type];\n else next[type] = value;\n const wasComplete = complete.value;\n draft.value = next;\n pendingYear = !emit;\n if (!emit) return;\n if (complete.value) config.onChange(constrained(next));\n else if (wasComplete) config.onChange(null);\n }\n\n function commit() {\n if (!pendingYear) return;\n pendingYear = false;\n if (complete.value) config.onChange(constrained(draft.value));\n }\n\n // 日超过了这个月的天数(先填了 31 再把月改成 2 月):写回时取这个月的最后一天;周同理(这一年只有 52 周时)\n function constrained(values: DateFieldValues): DateFieldValues {\n if (values.week != null && values.year != null)\n return { ...values, week: Math.min(values.week, isoWeeksInYear(values.year)) };\n if (values.day == null) return values;\n return { ...values, day: Math.min(values.day, daysInMonth(values.year, values.month)) };\n }\n\n const current = () => focusedSegment.value;\n\n const state: DateSegmentsState = {\n get segments() {\n return segments.value;\n },\n get editable() {\n return editable.value;\n },\n get focusedSegment() {\n return focusedSegment.value;\n },\n get partial() {\n return !complete.value && config.fields().some((field) => draft.value[field] != null);\n },\n setFocused(type) {\n if (type !== focusedSegment.value) {\n commit();\n buffer.value = '';\n }\n focusedSegment.value = type;\n },\n type(input) {\n if (!current() || config.readonly?.()) return;\n for (const char of normalizeDigits(input)) {\n const segment = current();\n if (!segment) return;\n if (segment === 'dayPeriod') {\n const lower = char.toLocaleLowerCase();\n const [am, pm] = periods.value.map((label) => label.toLocaleLowerCase());\n if (lower === 'a' || am!.startsWith(lower)) write('dayPeriod', 0);\n else if (lower === 'p' || pm!.startsWith(lower)) write('dayPeriod', 1);\n else continue;\n state.moveFocus(1);\n continue;\n }\n if (!/\\d/.test(char)) continue;\n const [min, max] = range(segment);\n let next = buffer.value + char;\n // 打了这一位就超出范围:从这一位重新开始\n if (Number(next) > max) next = char;\n buffer.value = next;\n const number = Number(next);\n // 0 还不是合法值(月、日、12 小时制的时):先记着,等下一位;年份打满四位才写回\n if (number >= min) write(segment, number, segment !== 'year' || next.length >= 4);\n const maxDigits = String(max).length;\n if (next.length >= maxDigits || number * 10 > max) {\n buffer.value = '';\n if (number < min) write(segment, min);\n state.moveFocus(1);\n }\n }\n },\n increment(amount) {\n const type = current();\n if (!type || config.readonly?.()) return;\n buffer.value = '';\n const [min, max] = range(type);\n const value = shown(type);\n if (value == null) {\n const start = config.placeholderValue();\n if (type === 'dayPeriod') {\n if (draft.value.hour == null)\n write('hour', hour12.value ? (start.hour ?? 0) % 12 || 12 : (start.hour ?? 0));\n write('dayPeriod', (start.hour ?? 0) >= 12 ? 1 : 0);\n return;\n }\n const initial =\n type === 'hour' && hour12.value ? (start.hour ?? 0) % 12 || 12 : (start[type] ?? min);\n write(type, initial);\n return;\n }\n const size = max - min + 1;\n write(type, ((((value - min + amount) % size) + size) % size) + min);\n },\n toEdge(edge) {\n const type = current();\n if (!type || config.readonly?.()) return;\n buffer.value = '';\n const [min, max] = range(type);\n write(type, edge === 'min' ? min : max);\n },\n backspace() {\n const type = current();\n if (!type || config.readonly?.()) return;\n const value = shown(type);\n if (value == null && !buffer.value) {\n state.moveFocus(-1);\n return;\n }\n const digitsLeft = type === 'dayPeriod' ? '' : (buffer.value || String(value)).slice(0, -1);\n buffer.value = digitsLeft;\n const [min] = range(type);\n if (type === 'dayPeriod' || !digitsLeft) {\n if (type === 'dayPeriod' || type === 'hour') {\n // 删掉上午 / 下午或时:时没有了,两段一起清空\n const next = { ...draft.value };\n delete next.hour;\n const wasComplete = complete.value;\n draft.value = next;\n if (wasComplete) config.onChange(null);\n return;\n }\n write(type, null);\n return;\n }\n if (Number(digitsLeft) >= min) write(type, Number(digitsLeft));\n },\n clear() {\n buffer.value = '';\n pendingYear = false;\n const wasComplete = complete.value;\n draft.value = {};\n if (wasComplete) config.onChange(null);\n },\n reset() {\n buffer.value = '';\n pendingYear = false;\n draft.value = { ...config.value() };\n },\n commit,\n moveFocus(direction) {\n const list = editable.value;\n const index = list.findIndex((segment) => segment.type === current());\n const next = list[index + direction];\n if (next) state.setFocused(next.type as DateSegmentType);\n else config.onExit?.(direction);\n },\n };\n return state;\n}\n\n/**\n * 分段输入的键盘操作:↑↓ 加减、Page Up / Down 大步、Home / End 最小 / 最大、Backspace / Delete 删除、\n * ←→ 换段(从右到左排版时反过来)。数字与字母走 beforeinput(软键盘、输入法也能输入),这里不处理。\n * 返回是否处理了这个按键(处理了就该 preventDefault)\n */\nexport function handleSegmentKeydown(\n state: DateSegmentsState,\n event: KeyboardEvent,\n rtl = false,\n): boolean {\n if (event.altKey || event.ctrlKey || event.metaKey) return false;\n const type = state.focusedSegment;\n if (!type) return false;\n const forward = rtl ? -1 : 1;\n const actions: Record<string, () => void> = {\n ArrowUp: () => state.increment(1),\n ArrowDown: () => state.increment(-1),\n PageUp: () => state.increment(BIG_STEPS[type]),\n PageDown: () => state.increment(-BIG_STEPS[type]),\n Home: () => state.toEdge('min'),\n End: () => state.toEdge('max'),\n Backspace: () => state.backspace(),\n Delete: () => state.backspace(),\n ArrowRight: () => state.moveFocus(forward as 1 | -1),\n ArrowLeft: () => state.moveFocus(-forward as 1 | -1),\n };\n const action = actions[event.key];\n if (!action) return false;\n action();\n return true;\n}\n\n// ───────── 内部实现 ─────────\n\n/** 取段的顺序用的任意时刻(各段都是两位数,排版不受值影响) */\nconst SAMPLE = Date.UTC(2000, 10, 22, 13, 44, 55);\n\n/** 语言默认的小时制 */\nfunction resolvedHourCycle(locale: string): keyof HourCycles {\n const cycle = new Intl.DateTimeFormat(locale, { hour: 'numeric' }).resolvedOptions().hourCycle;\n return cycle === 'h11' || cycle === 'h12' ? 'h12' : 'h23';\n}\n\nfunction sameFields(a: DateFieldValues | null, b: DateFieldValues | null): boolean {\n if (a == null || b == null) return a === b;\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]) as Set<keyof DateFieldValues>;\n return [...keys].every((key) => a[key] === b[key]);\n}\n\n// ───────── 值与 ISO 字符串 ─────────\n\n/** 日期类分段的粒度:DateField 精确到哪一段(到时、分、秒时是日期加时间) */\nexport interface DateFieldGranularities {\n /** 只有年:'2026' */\n year: unknown;\n /** 年月:'2026-10'(同原生 input type=\"month\") */\n month: unknown;\n /** 年月日(默认):'2026-10-20' */\n day: unknown;\n /** 年与季度:'2026-Q4' */\n quarter: unknown;\n /** 年与周(ISO 8601,周一开始):'2026-W43'(同原生 input type=\"week\") */\n week: unknown;\n /** 日期加时:'2026-10-20T14:00' */\n hour: unknown;\n /** 日期加时分:'2026-10-20T14:30'(同原生 input type=\"datetime-local\") */\n minute: unknown;\n /** 日期加时分秒:'2026-10-20T14:30:15' */\n second: unknown;\n}\n\n/** 分段输入精确到哪一段 */\nexport type DateFieldGranularity = keyof DateFieldGranularities;\n\ntype ValueField = Exclude<DateSegmentType, 'dayPeriod'>;\n\nconst ALL_FIELDS: readonly ValueField[] = ['year', 'month', 'day', 'hour', 'minute', 'second'];\n\n/** 日期分段:从年到 granularity;time 时只取时间的部分(TimeField) */\nexport function segmentFields(granularity: DateFieldGranularity, time = false): ValueField[] {\n if (granularity === 'quarter' || granularity === 'week') return time ? [] : ['year', granularity];\n const fields = ALL_FIELDS.slice(0, ALL_FIELDS.indexOf(granularity) + 1);\n return time\n ? fields.filter((field) => field === 'hour' || field === 'minute' || field === 'second')\n : fields;\n}\n\nconst pad = (value: number, width = 2) => String(value).padStart(width, '0');\n\n/** 各段的值 → ISO 字符串(按有哪些段:'2026'、'2026-10'、'2026-10-20'、'2026-10-20T14:30'、'14:30') */\nexport function fieldsToIso(values: DateFieldValues, fields: readonly ValueField[]): string {\n if (fields.includes('quarter')) return `${pad(values.year ?? 0, 4)}-Q${values.quarter ?? 1}`;\n if (fields.includes('week')) return `${pad(values.year ?? 0, 4)}-W${pad(values.week ?? 1)}`;\n const date = [\n values.year != null && pad(values.year, 4),\n fields.includes('month') && pad(values.month ?? 1),\n fields.includes('day') && pad(values.day ?? 1),\n ]\n .filter((part) => part !== false)\n .join('-');\n if (!fields.includes('hour')) return date;\n const time = [\n pad(values.hour ?? 0),\n pad(values.minute ?? 0),\n fields.includes('second') && pad(values.second ?? 0),\n ]\n .filter((part) => part !== false)\n .join(':');\n return fields.includes('year') ? `${date}T${time}` : time;\n}\n\n/** ISO 字符串 → 各段的值;格式不对时 null。只取 fields 里有的段('2026-10-20T14:30' 给 DateField 时只要日期) */\nexport function isoToFields(\n value: string | null | undefined,\n fields: readonly ValueField[],\n): DateFieldValues | null {\n if (!value) return null;\n const period = /^(\\d{4})-(?:Q([1-4])|W(\\d{2}))$/.exec(value);\n if (period) {\n const parsed: DateFieldValues = { year: Number(period[1]) };\n if (period[2] != null) parsed.quarter = Number(period[2]);\n if (period[3] != null) parsed.week = Number(period[3]);\n return fields.every((field) => parsed[field] != null) ? parsed : null;\n }\n const match = /^(?:(\\d{4})(?:-(\\d{2})(?:-(\\d{2}))?)?)?(?:T?(\\d{2}):(\\d{2})(?::(\\d{2}))?)?$/.exec(\n value,\n );\n if (!match) return null;\n const parsed: DateFieldValues = {};\n ALL_FIELDS.forEach((field, index) => {\n const text = match[index + 1];\n if (fields.includes(field) && text != null) parsed[field] = Number(text);\n });\n return fields.every((field) => parsed[field] != null) ? parsed : null;\n}\n"],"mappings":"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"}
@@ -6,7 +6,8 @@ import { focusFirst } from "../utils/dom/focus.js";
6
6
  import { toElement } from "../utils/dom/element.js";
7
7
  import { anchoredPanelSx, useAnchoredPopover } from "../utils/dom/floating.js";
8
8
  import { inputRecipe } from "../input/control.js";
9
- import { createVNode, mergeProps, shallowRef, useId } from "vue";
9
+ import { createVNode, shallowRef, useId } from "vue";
10
+ import { mergeJsxProps } from "@zerodep-dev/vue-tsx-pro-tsx";
10
11
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
11
12
  //#region src/date/picker-popover.tsx
12
13
  /** 选择器上的打开按钮与弹层的部件属性 */
@@ -70,7 +71,7 @@ function usePickerPopover(read, events) {
70
71
  /** 弹层:内容只在打开时渲染(由调用方按 open 给) */
71
72
  panel(sx, user, children) {
72
73
  const { open, label, size } = read();
73
- return createVNode("div", mergeProps(mergeAttrs({
74
+ return createVNode("div", mergeJsxProps(mergeAttrs({
74
75
  sx: [anchoredPanelSx(size), sx],
75
76
  "aria-label": label
76
77
  }, user, {
@@ -1 +1 @@
1
- {"version":3,"file":"picker-popover.js","names":["_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/date/picker-popover.tsx"],"sourcesContent":["/**\n * 日期、时间选择器共用的打开按钮与弹层(DatePicker、DateRangePicker、TimePicker),以及日历旁边的快捷选项:\n * 输入框外壳是定位的锚点,后缀里的按钮打开,弹层是 role=\"dialog\" 的原生 popover(Esc、点外部关闭);\n * 关闭时焦点还给按钮(外壳不可聚焦);分段里按 Alt + ↓ 打开(同原生 select)。在组件 setup 里调用。\n *\n * const picker = usePickerPopover(() => ({ open, editable, label: lang.datePickerOpen }), {\n * toggle: setOpen,\n * shown: (panel) => panel.querySelector('…')?.focus(),\n * });\n * <DateField propsRoot={{ ref: picker.anchorRef }} onKeydown={picker.onKeydown} suffix={picker.button(CalendarDays, propsButton)} />\n * {picker.panel(sx, propsPopover, open && <Calendar … />)}\n */\nimport { useId, type VNodeChild } from 'vue';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Button } from '../base/Button';\nimport type { IconData } from '../base/Icon';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { useRecipe } from '../config/styles';\nimport { inputRecipe } from '../input/control';\nimport { anchoredPanelSx, useAnchoredPopover, type FloatingPlacement } from '../utils/dom/floating';\nimport { focusFirst } from '../utils/dom/focus';\nimport type { SetOpen } from '../utils/dom/open-change';\nimport { toElement } from '../utils/dom/element';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport type { TextSize } from '../utils/style/typography';\n\n/** 选择器上的打开按钮与弹层的部件属性 */\nexport interface PickerPopoverParts {\n /** 弹出位置,默认 bottom-start;空间不够时自动翻转 */\n placement?: FloatingPlacement;\n /** 打开按钮的部件属性 */\n propsButton?: Omit<Partial<IconButtonProps>, 'onClick' | 'aria-expanded' | 'aria-controls'>;\n /** 弹层的部件属性 */\n propsPopover?: PartProps<'div', 'id' | 'popover' | 'role'>;\n}\n\n/** usePickerPopover 每次渲染读取的状态 */\nexport interface PickerPopoverState {\n /** 是否打开 */\n open: boolean;\n /** 能不能打开:不可用、只读时按钮也不可用 */\n editable: boolean;\n /** 按钮与弹层的名称(“选择日期”) */\n label: string;\n /** 弹出位置 */\n placement?: FloatingPlacement;\n /** 弹层与输入框同宽(时间列表) */\n matchWidth?: boolean;\n /** 控件的字号档位:弹层渲染在顶层、不继承输入框的字号,按它设置 */\n size?: TextSize;\n}\n\n/** usePickerPopover 的回调 */\nexport interface PickerPopoverEvents {\n /** 打开或关闭(按钮、Alt + ↓、Esc、点外部):写回组件的 open 并通知 onOpenChange,一般是组件的 openSetter */\n toggle: SetOpen;\n /** 打开后、第一次定位完成时:把焦点交给弹层里合适的元素 */\n shown: (panel: HTMLElement) => void;\n}\n\n/** 选择器的打开按钮与弹层 */\nexport function usePickerPopover(read: () => PickerPopoverState, events: PickerPopoverEvents) {\n const id = useId();\n let anchor = _state.raw<HTMLElement | null>(null);\n let panel = _state.raw<HTMLElement | null>(null);\n let trigger = _state.raw<HTMLElement | null>(null);\n // 打开按钮放在输入框外壳里:用外壳配方的 button 部件(带 styles.Input 的定制)\n const shell = useRecipe(inputRecipe);\n\n const { onToggle } = useAnchoredPopover(\n () => {\n const { open, placement = 'bottom-start', matchWidth } = read();\n return { open, anchor, panel, floating: { placement, matchWidth }, restoreFocus: trigger };\n },\n { close: (reason, event) => events.toggle(false, reason, event), shown: events.shown },\n );\n\n return {\n /** 弹层的 id(按钮的 aria-controls);弹层里的元素可以据此派生自己的 id */\n id,\n /** 输入框外壳(锚点):放进 propsRoot 的 ref */\n anchorRef: (element: unknown) => (anchor = toElement(element)),\n /** 输入框外壳:选完日期后把焦点交给其中的某一段 */\n get anchor() {\n return anchor;\n },\n /** 分段上的 keydown:Alt + ↓ 打开 */\n onKeydown: (event: KeyboardEvent) => {\n if (!event.altKey || event.key !== 'ArrowDown' || !read().editable) return;\n event.preventDefault();\n events.toggle(true, 'trigger', event);\n },\n /** 输入框后缀里的打开按钮 */\n button(icon: IconData, user?: PickerPopoverParts['propsButton']) {\n const { open, editable, label } = read();\n return (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n { ...shell().button, radius: 'full', icon, 'aria-label': label },\n user,\n {\n ref: (element: unknown) => (trigger = toElement(element)),\n disabled: !editable,\n 'aria-haspopup': 'dialog',\n 'aria-expanded': open,\n 'aria-controls': id,\n onClick: (event: MouseEvent) => events.toggle(!open, 'trigger', event),\n },\n )}\n />\n );\n },\n /** 弹层:内容只在打开时渲染(由调用方按 open 给) */\n panel(sx: css.SxStyles, user: PickerPopoverParts['propsPopover'], children: VNodeChild) {\n const { open, label, size } = read();\n return (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [anchoredPanelSx(size), sx],\n 'aria-label': label,\n },\n user,\n { ref: _toRef(panel), id, popover: 'auto', role: 'dialog', onToggle },\n )}\n data-state={open ? 'open' : 'closed'}\n >\n {children}\n </div>\n );\n },\n };\n}\n\n/** 弹层里是日历时:焦点进日历当前的那一格(已选或今天),不是“上个月”按钮 */\nexport function focusCalendar(panel: HTMLElement): void {\n const cell = panel.querySelector<HTMLElement>('[role=\"grid\"] [tabindex=\"0\"]');\n if (cell) cell.focus();\n else focusFirst(panel);\n}\n\n/** 弹层里的一个快捷选项(“今天”“最近 7 天”) */\nexport interface PickerPreset {\n /** 列表里的 key */\n key: string;\n /** 按钮上的文字 */\n label: string;\n /** 当前值就是它:按钮按下(aria-pressed) */\n active: boolean;\n /** 超出可选范围:不可用 */\n disabled?: boolean;\n /** 点了 */\n onPick: () => void;\n}\n\n/** 快捷选项的样式:presets(一列,靠日历那边有分隔线)、preset(按钮文字靠左) */\nexport const pickerPresetStyles = css.create({\n presets: {\n display: 'flex',\n flexDirection: 'column',\n gap: '_xs',\n paddingInlineEnd: '_sm',\n borderInlineEndWidth: '_xs',\n borderInlineEndStyle: 'solid',\n borderInlineEndColor: '_borderMuted',\n },\n preset: { justifyContent: 'flex-start' },\n});\n\n/** 日历旁边的一列快捷选项(DatePicker、DateRangePicker 共用):一组按钮,当前值对应的那一项按下 */\nexport function renderPickerPresets(\n presets: readonly PickerPreset[],\n label: string,\n user?: PartProps<'div', 'role'>,\n): VNodeChild {\n if (presets.length === 0) return null;\n return (\n <div\n {...mergeAttrs<'div'>({ sx: pickerPresetStyles.presets }, user, {\n role: 'group',\n 'aria-label': label,\n })}\n >\n {presets.map((preset) => (\n <Button\n key={preset.key}\n sx={pickerPresetStyles.preset}\n size=\"sm\"\n variant={preset.active ? 'soft' : 'ghost'}\n tone=\"neutral\"\n aria-pressed={preset.active}\n disabled={preset.disabled}\n onClick={preset.onPick}\n >\n {preset.label}\n </Button>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AA6DA,SAAgB,iBAAiB,MAAgC,QAA6B;CAC5F,MAAM,KAAK,MAAM;CACjB,IAAI,SAAMA,WAAkC,IAAI;CAChD,IAAI,QAAKA,WAAkC,IAAI;CAC/C,IAAI,UAAOA,WAAkC,IAAI;CAEjD,MAAM,QAAQ,UAAU,WAAW;CAEnC,MAAM,EAAE,aAAa,yBACb;EACJ,MAAM,EAAE,MAAM,YAAY,gBAAgB,eAAe,KAAK;EAC9D,OAAO;GAAE;GAAM,QAAM,OAAA;GAAE,OAAK,MAAA;GAAE,UAAU;IAAE;IAAW;GAAW;GAAG,cAAY,QAAA;EAAU;CAC3F,GACA;EAAE,QAAQ,QAAQ,UAAU,OAAO,OAAO,OAAO,QAAQ,KAAK;EAAG,OAAO,OAAO;CAAM,CACvF;CAEA,OAAO;;EAEL;;EAEA,YAAY,YAAsB,OAAA,QAAS,UAAU,OAAO;;EAE5D,IAAI,SAAS;GACX,OAAA,OAAA;EACF;;EAEA,YAAY,UAAyB;GACnC,IAAI,CAAC,MAAM,UAAU,MAAM,QAAQ,eAAe,CAAC,KAAK,CAAC,CAAC,UAAU;GACpE,MAAM,eAAe;GACrB,OAAO,OAAO,MAAM,WAAW,KAAK;EACtC;;EAEA,OAAO,MAAgB,MAA0C;GAC/D,MAAM,EAAE,MAAM,UAAU,UAAU,KAAK;GACvC,OAAAC,YAAA,YAEQ,eACF;IAAE,GAAG,MAAM,CAAC,CAAC;IAAQ,QAAQ;IAAQ;IAAM,cAAc;GAAM,GAC/D,MACA;IACE,MAAM,YAAsB,QAAA,QAAU,UAAU,OAAO;IACvD,UAAU,CAAC;IACX,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,UAAU,UAAsB,OAAO,OAAO,CAAC,MAAM,WAAW,KAAK;GACvE,CACF,GAAC,IAAA;EAGP;;EAEA,MAAM,IAAkB,MAA0C,UAAsB;GACtF,MAAM,EAAE,MAAM,OAAO,SAAS,KAAK;GACnC,OAAAA,YAAA,OAAAC,WAEQ,WACF;IACE,IAAI,CAAC,gBAAgB,IAAI,GAAG,EAAE;IAC9B,cAAc;GAChB,GACA,MACA;IAAE,KAAG;IAAiB;IAAI,SAAS;IAAQ,MAAM;IAAU;GAAS,CACtE,GAAC,EAAA,cACW,OAAO,SAAS,SAAQ,CAAA,GAAA,CAEnC,QAAQ,CAAA;EAGf;CACF;AACF;;AAGA,SAAgB,cAAc,OAA0B;CACtD,MAAM,OAAO,MAAM,cAA2B,kCAA8B;CAC5E,IAAI,MAAM,KAAK,MAAM;MAChB,WAAW,KAAK;AACvB;;;AAiBA,IAAa,qBAAqB,IAAI,OAAO;CAC3C,SAAS;EACP,SAAS;EACT,eAAe;EACf,KAAK;EACL,kBAAkB;EAClB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;CACxB;CACA,QAAQ,EAAE,gBAAgB,aAAa;AACzC,CAAC;;AAGD,SAAgB,oBACd,SACA,OACA,MACY;CACZ,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,OAAAD,YAAA,OAEQ,WAAkB,EAAE,IAAI,mBAAmB,QAAQ,GAAG,MAAM;EAC9D,MAAM;EACN,cAAc;CAChB,CAAC,GAAC,CAED,QAAQ,KAAK,WAAMA,YAAA,QAAA;EAAA,OAEX,OAAO;EAAG,MACX,mBAAmB;EAAM,QAAA;EAAA,WAEpB,OAAO,SAAS,SAAS;EAAO,QAAA;EAAA,gBAE3B,OAAO;EAAM,YACjB,OAAO;EAAQ,WAChB,OAAO;CAAM,GAAA,EAAA,eAAA,CAErB,OAAO,KAAK,EAAA,CAAA,CAEhB,CAAC,CAAA;AAGR"}
1
+ {"version":3,"file":"picker-popover.js","names":["_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/date/picker-popover.tsx"],"sourcesContent":["/**\n * 日期、时间选择器共用的打开按钮与弹层(DatePicker、DateRangePicker、TimePicker),以及日历旁边的快捷选项:\n * 输入框外壳是定位的锚点,后缀里的按钮打开,弹层是 role=\"dialog\" 的原生 popover(Esc、点外部关闭);\n * 关闭时焦点还给按钮(外壳不可聚焦);分段里按 Alt + ↓ 打开(同原生 select)。在组件 setup 里调用。\n *\n * const picker = usePickerPopover(() => ({ open, editable, label: lang.datePickerOpen }), {\n * toggle: setOpen,\n * shown: (panel) => panel.querySelector('…')?.focus(),\n * });\n * <DateField propsRoot={{ ref: picker.anchorRef }} onKeydown={picker.onKeydown} suffix={picker.button(CalendarDays, propsButton)} />\n * {picker.panel(sx, propsPopover, open && <Calendar … />)}\n */\nimport { useId, type VNodeChild } from 'vue';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Button } from '../base/Button';\nimport type { IconData } from '../base/Icon';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { useRecipe } from '../config/styles';\nimport { inputRecipe } from '../input/control';\nimport { anchoredPanelSx, useAnchoredPopover, type FloatingPlacement } from '../utils/dom/floating';\nimport { focusFirst } from '../utils/dom/focus';\nimport type { SetOpen } from '../utils/dom/open-change';\nimport { toElement } from '../utils/dom/element';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport type { TextSize } from '../utils/style/typography';\n\n/** 选择器上的打开按钮与弹层的部件属性 */\nexport interface PickerPopoverParts {\n /** 弹出位置,默认 bottom-start;空间不够时自动翻转 */\n placement?: FloatingPlacement;\n /** 打开按钮的部件属性 */\n propsButton?: Omit<Partial<IconButtonProps>, 'onClick' | 'aria-expanded' | 'aria-controls'>;\n /** 弹层的部件属性 */\n propsPopover?: PartProps<'div', 'id' | 'popover' | 'role'>;\n}\n\n/** usePickerPopover 每次渲染读取的状态 */\nexport interface PickerPopoverState {\n /** 是否打开 */\n open: boolean;\n /** 能不能打开:不可用、只读时按钮也不可用 */\n editable: boolean;\n /** 按钮与弹层的名称(“选择日期”) */\n label: string;\n /** 弹出位置 */\n placement?: FloatingPlacement;\n /** 弹层与输入框同宽(时间列表) */\n matchWidth?: boolean;\n /** 控件的字号档位:弹层渲染在顶层、不继承输入框的字号,按它设置 */\n size?: TextSize;\n}\n\n/** usePickerPopover 的回调 */\nexport interface PickerPopoverEvents {\n /** 打开或关闭(按钮、Alt + ↓、Esc、点外部):写回组件的 open 并通知 onOpenChange,一般是组件的 openSetter */\n toggle: SetOpen;\n /** 打开后、第一次定位完成时:把焦点交给弹层里合适的元素 */\n shown: (panel: HTMLElement) => void;\n}\n\n/** 选择器的打开按钮与弹层 */\nexport function usePickerPopover(read: () => PickerPopoverState, events: PickerPopoverEvents) {\n const id = useId();\n let anchor = _state.raw<HTMLElement | null>(null);\n let panel = _state.raw<HTMLElement | null>(null);\n let trigger = _state.raw<HTMLElement | null>(null);\n // 打开按钮放在输入框外壳里:用外壳配方的 button 部件(带 styles.Input 的定制)\n const shell = useRecipe(inputRecipe);\n\n const { onToggle } = useAnchoredPopover(\n () => {\n const { open, placement = 'bottom-start', matchWidth } = read();\n return { open, anchor, panel, floating: { placement, matchWidth }, restoreFocus: trigger };\n },\n { close: (reason, event) => events.toggle(false, reason, event), shown: events.shown },\n );\n\n return {\n /** 弹层的 id(按钮的 aria-controls);弹层里的元素可以据此派生自己的 id */\n id,\n /** 输入框外壳(锚点):放进 propsRoot 的 ref */\n anchorRef: (element: unknown) => (anchor = toElement(element)),\n /** 输入框外壳:选完日期后把焦点交给其中的某一段 */\n get anchor() {\n return anchor;\n },\n /** 分段上的 keydown:Alt + ↓ 打开 */\n onKeydown: (event: KeyboardEvent) => {\n if (!event.altKey || event.key !== 'ArrowDown' || !read().editable) return;\n event.preventDefault();\n events.toggle(true, 'trigger', event);\n },\n /** 输入框后缀里的打开按钮 */\n button(icon: IconData, user?: PickerPopoverParts['propsButton']) {\n const { open, editable, label } = read();\n return (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n { ...shell().button, radius: 'full', icon, 'aria-label': label },\n user,\n {\n ref: (element: unknown) => (trigger = toElement(element)),\n disabled: !editable,\n 'aria-haspopup': 'dialog',\n 'aria-expanded': open,\n 'aria-controls': id,\n onClick: (event: MouseEvent) => events.toggle(!open, 'trigger', event),\n },\n )}\n />\n );\n },\n /** 弹层:内容只在打开时渲染(由调用方按 open 给) */\n panel(sx: css.SxStyles, user: PickerPopoverParts['propsPopover'], children: VNodeChild) {\n const { open, label, size } = read();\n return (\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [anchoredPanelSx(size), sx],\n 'aria-label': label,\n },\n user,\n { ref: _toRef(panel), id, popover: 'auto', role: 'dialog', onToggle },\n )}\n data-state={open ? 'open' : 'closed'}\n >\n {children}\n </div>\n );\n },\n };\n}\n\n/** 弹层里是日历时:焦点进日历当前的那一格(已选或今天),不是“上个月”按钮 */\nexport function focusCalendar(panel: HTMLElement): void {\n const cell = panel.querySelector<HTMLElement>('[role=\"grid\"] [tabindex=\"0\"]');\n if (cell) cell.focus();\n else focusFirst(panel);\n}\n\n/** 弹层里的一个快捷选项(“今天”“最近 7 天”) */\nexport interface PickerPreset {\n /** 列表里的 key */\n key: string;\n /** 按钮上的文字 */\n label: string;\n /** 当前值就是它:按钮按下(aria-pressed) */\n active: boolean;\n /** 超出可选范围:不可用 */\n disabled?: boolean;\n /** 点了 */\n onPick: () => void;\n}\n\n/** 快捷选项的样式:presets(一列,靠日历那边有分隔线)、preset(按钮文字靠左) */\nexport const pickerPresetStyles = css.create({\n presets: {\n display: 'flex',\n flexDirection: 'column',\n gap: '_xs',\n paddingInlineEnd: '_sm',\n borderInlineEndWidth: '_xs',\n borderInlineEndStyle: 'solid',\n borderInlineEndColor: '_borderMuted',\n },\n preset: { justifyContent: 'flex-start' },\n});\n\n/** 日历旁边的一列快捷选项(DatePicker、DateRangePicker 共用):一组按钮,当前值对应的那一项按下 */\nexport function renderPickerPresets(\n presets: readonly PickerPreset[],\n label: string,\n user?: PartProps<'div', 'role'>,\n): VNodeChild {\n if (presets.length === 0) return null;\n return (\n <div\n {...mergeAttrs<'div'>({ sx: pickerPresetStyles.presets }, user, {\n role: 'group',\n 'aria-label': label,\n })}\n >\n {presets.map((preset) => (\n <Button\n key={preset.key}\n sx={pickerPresetStyles.preset}\n size=\"sm\"\n variant={preset.active ? 'soft' : 'ghost'}\n tone=\"neutral\"\n aria-pressed={preset.active}\n disabled={preset.disabled}\n onClick={preset.onPick}\n >\n {preset.label}\n </Button>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA6DA,SAAgB,iBAAiB,MAAgC,QAA6B;CAC5F,MAAM,KAAK,MAAM;CACjB,IAAI,SAAMA,WAAkC,IAAI;CAChD,IAAI,QAAKA,WAAkC,IAAI;CAC/C,IAAI,UAAOA,WAAkC,IAAI;CAEjD,MAAM,QAAQ,UAAU,WAAW;CAEnC,MAAM,EAAE,aAAa,yBACb;EACJ,MAAM,EAAE,MAAM,YAAY,gBAAgB,eAAe,KAAK;EAC9D,OAAO;GAAE;GAAM,QAAM,OAAA;GAAE,OAAK,MAAA;GAAE,UAAU;IAAE;IAAW;GAAW;GAAG,cAAY,QAAA;EAAU;CAC3F,GACA;EAAE,QAAQ,QAAQ,UAAU,OAAO,OAAO,OAAO,QAAQ,KAAK;EAAG,OAAO,OAAO;CAAM,CACvF;CAEA,OAAO;;EAEL;;EAEA,YAAY,YAAsB,OAAA,QAAS,UAAU,OAAO;;EAE5D,IAAI,SAAS;GACX,OAAA,OAAA;EACF;;EAEA,YAAY,UAAyB;GACnC,IAAI,CAAC,MAAM,UAAU,MAAM,QAAQ,eAAe,CAAC,KAAK,CAAC,CAAC,UAAU;GACpE,MAAM,eAAe;GACrB,OAAO,OAAO,MAAM,WAAW,KAAK;EACtC;;EAEA,OAAO,MAAgB,MAA0C;GAC/D,MAAM,EAAE,MAAM,UAAU,UAAU,KAAK;GACvC,OAAAC,YAAA,YAEQ,eACF;IAAE,GAAG,MAAM,CAAC,CAAC;IAAQ,QAAQ;IAAQ;IAAM,cAAc;GAAM,GAC/D,MACA;IACE,MAAM,YAAsB,QAAA,QAAU,UAAU,OAAO;IACvD,UAAU,CAAC;IACX,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,UAAU,UAAsB,OAAO,OAAO,CAAC,MAAM,WAAW,KAAK;GACvE,CACF,GAAC,IAAA;EAGP;;EAEA,MAAM,IAAkB,MAA0C,UAAsB;GACtF,MAAM,EAAE,MAAM,OAAO,SAAS,KAAK;GACnC,OAAAA,YAAA,OAAAC,cAEQ,WACF;IACE,IAAI,CAAC,gBAAgB,IAAI,GAAG,EAAE;IAC9B,cAAc;GAChB,GACA,MACA;IAAE,KAAG;IAAiB;IAAI,SAAS;IAAQ,MAAM;IAAU;GAAS,CACtE,GAAC,EAAA,cACW,OAAO,SAAS,SAAQ,CAAA,GAAA,CAEnC,QAAQ,CAAA;EAGf;CACF;AACF;;AAGA,SAAgB,cAAc,OAA0B;CACtD,MAAM,OAAO,MAAM,cAA2B,kCAA8B;CAC5E,IAAI,MAAM,KAAK,MAAM;MAChB,WAAW,KAAK;AACvB;;;AAiBA,IAAa,qBAAqB,IAAI,OAAO;CAC3C,SAAS;EACP,SAAS;EACT,eAAe;EACf,KAAK;EACL,kBAAkB;EAClB,sBAAsB;EACtB,sBAAsB;EACtB,sBAAsB;CACxB;CACA,QAAQ,EAAE,gBAAgB,aAAa;AACzC,CAAC;;AAGD,SAAgB,oBACd,SACA,OACA,MACY;CACZ,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,OAAAD,YAAA,OAEQ,WAAkB,EAAE,IAAI,mBAAmB,QAAQ,GAAG,MAAM;EAC9D,MAAM;EACN,cAAc;CAChB,CAAC,GAAC,CAED,QAAQ,KAAK,WAAMA,YAAA,QAAA;EAAA,OAEX,OAAO;EAAG,MACX,mBAAmB;EAAM,QAAA;EAAA,WAEpB,OAAO,SAAS,SAAS;EAAO,QAAA;EAAA,gBAE3B,OAAO;EAAM,YACjB,OAAO;EAAQ,WAChB,OAAO;CAAM,GAAA,EAAA,eAAA,CAErB,OAAO,KAAK,EAAA,CAAA,CAEhB,CAAC,CAAA;AAGR"}
@@ -9,8 +9,8 @@ import { DiagramNode } from "./DiagramNode.js";
9
9
  import { alignToGuides, arrowHead, boundsOf, polylineMidpoint, polylinePath, rectAt, rectContains, rectFromCorners, rectsIntersect, trimEnd } from "./geometry.js";
10
10
  import { diagramMessages } from "./messages.js";
11
11
  import { nearestSide, routeEdges, sidePoint, straightRoute } from "./route.js";
12
- import { computed, createVNode, mergeProps, shallowRef } from "vue";
13
- import { _component, bindable, childrenProp, createContext, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
12
+ import { computed, createVNode, shallowRef } from "vue";
13
+ import { _component, bindable, childrenProp, createContext, mergeJsxProps, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
14
14
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
15
15
  //#region src/diagram/Diagram.tsx
16
16
  /** 画布上的一个节点:位置与大小(画布坐标),其余字段使用方自己用 */
@@ -382,7 +382,7 @@ var NodeView = /*#__PURE__*/ _component((_props, _ctx) => {
382
382
  height: item.value.height
383
383
  }, event)
384
384
  } : { role: "img" }
385
- }), [render.value(item.value, state), ports.value && SIDES.map((side) => createVNode("span", mergeProps({ "key": side }, mergeAttrs({ sx: [diagramStyles.port, portStyles[side]] }, portPart.value, {
385
+ }), [render.value(item.value, state), ports.value && SIDES.map((side) => createVNode("span", mergeJsxProps({ "key": side }, mergeAttrs({ sx: [diagramStyles.port, portStyles[side]] }, portPart.value, {
386
386
  ...dataAttrs({ "data-diagram-port": side }),
387
387
  "aria-hidden": "true",
388
388
  onPointerdown: (event) => actions.value.portDown(id, side, event)
@@ -445,9 +445,9 @@ var EdgeView = /*#__PURE__*/ _component((_props2, _ctx2) => {
445
445
  onFocus: (event) => actions.value.focus(boundsOf([], points.value), event)
446
446
  } : {}
447
447
  }), [
448
- selectable.value && createVNode("path", mergeProps({ "d": path }, css.attrs(diagramStyles.edgeHit)), null),
449
- createVNode("path", mergeProps({ "d": path }, css.attrs(diagramStyles.edgeLine)), null),
450
- createVNode("polygon", mergeProps({ "points": arrowHead(points.value, ARROW) }, css.attrs(diagramStyles.edgeArrow)), null)
448
+ selectable.value && createVNode("path", mergeJsxProps({ "d": path }, css.attrs(diagramStyles.edgeHit)), null),
449
+ createVNode("path", mergeJsxProps({ "d": path }, css.attrs(diagramStyles.edgeLine)), null),
450
+ createVNode("polygon", mergeJsxProps({ "points": arrowHead(points.value, ARROW) }, css.attrs(diagramStyles.edgeArrow)), null)
451
451
  ]);
452
452
  };
453
453
  }, {
@@ -996,7 +996,7 @@ var Diagram = /*#__PURE__*/ _component((_props4, _ctx4) => {
996
996
  "actions": actions
997
997
  }, null);
998
998
  }),
999
- createVNode("svg", mergeProps(css.attrs(diagramStyles.edges), {
999
+ createVNode("svg", mergeJsxProps(css.attrs(diagramStyles.edges), {
1000
1000
  "width": "1",
1001
1001
  "height": "1",
1002
1002
  "aria-hidden": selectable.value ? void 0 : "true"
@@ -1029,13 +1029,13 @@ var Diagram = /*#__PURE__*/ _component((_props4, _ctx4) => {
1029
1029
  "part": propsEdgeText.value
1030
1030
  }, null);
1031
1031
  }),
1032
- (!!drag.value?.guides.length || !!link.value || ends.length > 0) && createVNode("svg", mergeProps(css.attrs(diagramStyles.edges, diagramStyles.above), {
1032
+ (!!drag.value?.guides.length || !!link.value || ends.length > 0) && createVNode("svg", mergeJsxProps(css.attrs(diagramStyles.edges, diagramStyles.above), {
1033
1033
  "width": "1",
1034
1034
  "height": "1",
1035
1035
  "aria-hidden": "true",
1036
1036
  "data-diagram-transient": ""
1037
1037
  }), [
1038
- drag.value?.guides.map((guide, index) => createVNode("line", mergeProps({ "key": index }, mergeAttrs({ sx: diagramStyles.guide }, propsGuide.value, {
1038
+ drag.value?.guides.map((guide, index) => createVNode("line", mergeJsxProps({ "key": index }, mergeAttrs({ sx: diagramStyles.guide }, propsGuide.value, {
1039
1039
  x1: guide.from.x,
1040
1040
  y1: guide.from.y,
1041
1041
  x2: guide.to.x,
@@ -1043,7 +1043,7 @@ var Diagram = /*#__PURE__*/ _component((_props4, _ctx4) => {
1043
1043
  })), null)),
1044
1044
  ends.flatMap(({ edge, points }) => ["from", "to"].map((end) => {
1045
1045
  const at = end === "from" ? points[0] : points[points.length - 1];
1046
- return createVNode("circle", mergeProps({
1046
+ return createVNode("circle", mergeJsxProps({
1047
1047
  "key": `${edge.id}:${end}`,
1048
1048
  "cx": at.x,
1049
1049
  "cy": at.y,
@@ -1053,7 +1053,7 @@ var Diagram = /*#__PURE__*/ _component((_props4, _ctx4) => {
1053
1053
  "onPointerdown": (event) => actions.endDown(edge.id, end, event)
1054
1054
  }), null);
1055
1055
  })),
1056
- link.value && createVNode("g", css.attrs(diagramStyles.preview), [createVNode("path", mergeProps({ "d": polylinePath(trimEnd([link.value.from, link.value.to], ARROW * .7)) }, css.attrs(diagramStyles.edgeLine)), null), createVNode("polygon", mergeProps({ "points": arrowHead([link.value.from, link.value.to], ARROW) }, css.attrs(diagramStyles.edgeArrow)), null)])
1056
+ link.value && createVNode("g", css.attrs(diagramStyles.preview), [createVNode("path", mergeJsxProps({ "d": polylinePath(trimEnd([link.value.from, link.value.to], ARROW * .7)) }, css.attrs(diagramStyles.edgeLine)), null), createVNode("polygon", mergeJsxProps({ "points": arrowHead([link.value.from, link.value.to], ARROW) }, css.attrs(diagramStyles.edgeArrow)), null)])
1057
1057
  ])
1058
1058
  ]),
1059
1059
  marquee.value && createVNode("div", mergeAttrs({ sx: [diagramStyles.marquee, css.bind(diagramDynamicStyles.box, () => [
@@ -1062,7 +1062,7 @@ var Diagram = /*#__PURE__*/ _component((_props4, _ctx4) => {
1062
1062
  marquee.value.width,
1063
1063
  marquee.value.height
1064
1064
  ], true)] }, propsMarquee.value), null),
1065
- overlay.value != null && createVNode("div", mergeProps(css.attrs(diagramStyles.overlay), { "data-diagram-overlay": "" }), [overlay.value])
1065
+ overlay.value != null && createVNode("div", mergeJsxProps(css.attrs(diagramStyles.overlay), { "data-diagram-overlay": "" }), [overlay.value])
1066
1066
  ]);
1067
1067
  };
1068
1068
  }, {