@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":"CalendarView.js","names":["_isVNode","_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/date/CalendarView.tsx"],"sourcesContent":["/**\n * 日历的界面(WAI-ARIA 的日期网格):页头(上一页、标题、下一页)、并排的月份网格、月份视图与年份视图、页脚。\n * 状态由调用方的 useCalendarState 给(同 ListboxView 与 useListState 的分工):Calendar、RangeCalendar、各种日期选择器共用。\n *\n * const calendar = useCalendarState({ … });\n * <CalendarView calendar={calendar} showWeekNumbers>{(date, cell) => …}</CalendarView>\n *\n * - 每个月一张 table role=\"grid\",日期格是 td role=\"gridcell\"(aria-selected)里的按钮;焦点日期那一格 tabindex=0,\n * 键盘移动后焦点跟过去(handleCalendarKeydown);读屏念的完整日期(今天、星期)由 Intl 生成;\n * - 标题按钮切到月份视图、再切到年份视图(不比选择的粒度更细);翻页时用 aria-live 播报新的月份;\n * - 并排几个月时只显示本月的日期(补齐的上下月留空,不重复出现);只有一个月时补齐的日期变淡、可以点。\n *\n * 部件:Root、Header、Previous、Next(IconButton)、Heading(标题按钮)、Months(并排的月份)、Grid(table)、\n * Weekday(星期表头)、WeekNumber(周数)、Cell(td)、CellButton(日期 / 月份 / 年份按钮)、Footer。\n */\nimport { ChevronLeft, ChevronRight } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { nextTick, useId, type VNodeChild } from 'vue';\nimport { buttonBaseStyles } from '../base/button-core';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { VisuallyHidden, visuallyHiddenStyles } from '../base/VisuallyHidden';\nimport { useFormat } from '../config/lang/format';\nimport {\n monthGrid,\n monthsOfYear,\n weekdayNames,\n weekOfYear,\n yearsOfDecade,\n} from '../utils/data/date';\nimport { isRtl } from '../utils/dom/direction';\nimport { hasContent, dataAttrs, mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { interactionTransitions } from '../utils/style/transitions';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\nimport {\n handleCalendarKeydown,\n type CalendarCellState,\n type CalendarState,\n} from './calendar-state';\nimport { useDateLocale } from './date-locale';\nimport { useLang } from '../config/context';\nimport type { CalendarDate } from '@internationalized/date';\nimport { t } from '../config/theme/tokens';\n\n/** 角色由组件管理 */\nexport type CalendarViewManaged = 'role';\n\n/** 按项给的部件属性:固定的对象,或按这一格的日期(ISO)与状态返回 */\nexport type CalendarItemProps<P> = P | ((date: string, cell: CalendarCellState) => P);\n\n/** 日历界面的外观与内容选项:Calendar、RangeCalendar、日期选择器原样转交 */\nexport interface CalendarViewOptions {\n /** 字号档位,格子随之缩放;不写时继承上下文字号 */\n size?: TextSize;\n /** 在每行前显示一年里的第几周 */\n showWeekNumbers?: boolean;\n /** 总是 6 行(翻页时高度不跳),默认 true */\n fixedWeeks?: boolean;\n /** 不可用:不能翻页、不能选 */\n disabled?: boolean;\n /**\n * 自定义日期格的内容(价格、标记点):拿到日期(ISO)与这一格的状态;不写时是日期数字。\n * 读屏先念完整日期再念这里的文字:日期数字这类重复的部分可以加 aria-hidden\n */\n children?: (date: string, cell: CalendarCellState) => VNodeChild;\n /** 页脚:今天、清除这类按钮 */\n footer?: VNodeChild;\n /** 页头的部件属性 */\n propsHeader?: PartProps<'div'>;\n /** 上一页按钮的部件属性 */\n propsPrevious?: Omit<Partial<IconButtonProps>, 'disabled' | 'onClick'>;\n /** 下一页按钮的部件属性 */\n propsNext?: Omit<Partial<IconButtonProps>, 'disabled' | 'onClick'>;\n /** 标题按钮的部件属性 */\n propsHeading?: PartProps<'button', 'type' | 'aria-label'>;\n /** 并排月份那一层的部件属性 */\n propsMonths?: PartProps<'div'>;\n /** 每张网格(table)的部件属性 */\n propsGrid?: PartProps<'table', 'role' | 'aria-label' | 'aria-multiselectable'>;\n /** 星期表头的部件属性 */\n propsWeekday?: PartProps<'th', 'scope'>;\n /** 周数的部件属性 */\n propsWeekNumber?: PartProps<'th', 'scope' | 'aria-label'>;\n /** 每格(td)的部件属性 */\n propsCell?: CalendarItemProps<PartProps<'td', 'role' | 'aria-selected' | 'aria-disabled'>>;\n /** 每格里按钮的部件属性 */\n propsCellButton?: CalendarItemProps<\n PartProps<'button', 'type' | 'tabindex' | 'disabled' | 'aria-label' | 'aria-disabled'>\n >;\n /** 页脚的部件属性 */\n propsFooter?: PartProps<'div'>;\n}\n\n/** 未声明的属性落到根元素上(aria-label 等) */\nexport interface CalendarViewProps\n extends PartProps<'div', CalendarViewManaged>, CalendarViewOptions {\n /** 日历状态(useCalendarState) */\n calendar: CalendarState;\n /** 一周的第一天(0 表示周日),与 useCalendarState 的 week 一致;不写时取语言配置 */\n firstDayOfWeek?: number;\n}\n\n/** CalendarView 的样式:root、months、month、header、heading、grid、weekday、cell、button 等 */\nexport const calendarStyles = css.create({\n root: {\n display: 'inline-flex',\n flexDirection: 'column',\n gap: '_sm',\n color: '_text',\n lineHeight: '_normal',\n userSelect: 'none',\n },\n months: { display: 'flex', flexWrap: 'wrap', alignItems: 'flex-start', gap: '_xl' },\n month: { display: 'flex', flexDirection: 'column', gap: '_xs' },\n header: {\n display: 'grid',\n gridTemplateColumns: `max(${t.sizes.control}, ${t.sizes.minTarget}) 1fr max(${t.sizes.control}, ${t.sizes.minTarget})`,\n alignItems: 'center',\n gap: '_xs',\n },\n // 占住按钮的位置:并排几个月时中间的月没有翻页按钮,标题仍居中\n spacer: { width: `max(${t.sizes.control}, ${t.sizes.minTarget})` },\n heading: {\n display: 'inline-flex',\n alignItems: 'center',\n justifySelf: 'center',\n minHeight: `max(${t.sizes.control}, ${t.sizes.minTarget})`,\n paddingInline: '_sm',\n borderRadius: '_md',\n fontWeight: '_semibold',\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n headingStatic: {\n cursor: 'default',\n backgroundColor: { default: 'transparent', ':hover': 'transparent' },\n },\n grid: { borderCollapse: 'collapse', borderSpacing: 0 },\n // 月份、年份视图:一行 3 格,与日期网格同宽\n periodGrid: { width: `calc(7 * max(2.25em, ${t.sizes.minTarget}))` },\n weekday: {\n paddingBlock: '_xs',\n paddingInline: 0,\n color: '_textMuted',\n fontWeight: '_normal',\n textAlign: 'center',\n },\n weekNumber: {\n paddingInlineEnd: '_xs',\n color: '_textMuted',\n fontWeight: '_normal',\n textAlign: 'center',\n },\n cell: { padding: 0, textAlign: 'center' },\n // 区间的底色画在 td 上,相邻的格连成一条;两端与每行的首尾是圆的\n inRange: {\n backgroundColor: '_accentSoft',\n borderStartStartRadius: { default: 0, ':first-of-type': '_md' },\n borderEndStartRadius: { default: 0, ':first-of-type': '_md' },\n borderStartEndRadius: { default: 0, ':last-of-type': '_md' },\n borderEndEndRadius: { default: 0, ':last-of-type': '_md' },\n },\n rangeStart: { borderStartStartRadius: '_md', borderEndStartRadius: '_md' },\n rangeEnd: { borderStartEndRadius: '_md', borderEndEndRadius: '_md' },\n button: {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: `max(2.25em, ${t.sizes.minTarget})`,\n height: `max(2.25em, ${t.sizes.minTarget})`,\n borderRadius: '_md',\n fontVariantNumeric: 'tabular-nums',\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n periodButton: { width: '_full', height: `max(3em, ${t.sizes.minTarget})` },\n outside: { color: '_textMuted' },\n today: {\n fontWeight: '_semibold',\n boxShadow: `inset 0 0 0 ${t.borderWidths.xs} ${t.colors.accentBorder}`,\n },\n selected: {\n backgroundColor: { default: '_accent', ':hover': '_accentHover' },\n color: '_accentContrast',\n boxShadow: 'none',\n },\n // 区间中间的格:按钮透明,底色是 td 的那一条\n middle: {\n backgroundColor: { default: 'transparent', ':hover': '_accentSoftHover' },\n color: '_accentText',\n },\n unavailable: { color: '_textMuted', textDecorationLine: 'line-through' },\n disabled: {\n opacity: '_disabled',\n cursor: 'not-allowed',\n backgroundColor: { default: 'transparent', ':hover': 'transparent' },\n },\n footer: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: '_sm' },\n});\n\n/** 网格行列:月份、年份视图一行 3 格 */\nconst chunk = <T,>(items: readonly T[], size: number) =>\n Array.from({ length: Math.ceil(items.length / size) }, (_, row) =>\n items.slice(row * size, row * size + size),\n );\n\nconst resolve = <P,>(\n props: CalendarItemProps<P> | undefined,\n date: string,\n cell: CalendarCellState,\n) =>\n typeof props === 'function'\n ? (props as (date: string, cell: CalendarCellState) => P)(date, cell)\n : props;\n\n/** 日历的界面:页头、月份网格(或月份、年份视图)、页脚 */\nexport const CalendarView = _component(\n ({\n calendar,\n firstDayOfWeek,\n size,\n showWeekNumbers = false,\n fixedWeeks = true,\n disabled = false,\n children,\n footer,\n propsHeader,\n propsPrevious,\n propsNext,\n propsHeading,\n propsMonths,\n propsGrid,\n propsWeekday,\n propsWeekNumber,\n propsCell,\n propsCellButton,\n propsFooter,\n ...rest\n }: CalendarViewProps) => {\n const format = useFormat();\n const locale = useDateLocale(() => ({ firstDayOfWeek }));\n const lang = useLang();\n const id = useId();\n const hintId = `${id}-hint`;\n let root = _state.raw<HTMLElement | null>(null);\n\n /** 键盘移动后把焦点交给新的焦点格(翻页、换视图后它是新渲染的) */\n function onKeydown(event: KeyboardEvent) {\n if (disabled || !root) return;\n if (!handleCalendarKeydown(calendar, event, isRtl(root))) return;\n event.preventDefault();\n void nextTick(() => root?.querySelector<HTMLElement>('[data-focused]')?.focus());\n }\n\n const title = (date: CalendarDate) => {\n if (calendar.view === 'day') return format.date(date, { year: 'numeric', month: 'long' });\n if (calendar.view === 'month') return format.date(date, { year: 'numeric' });\n const end = date.add({ years: 9 });\n return `${format.date(date, { year: 'numeric' })} – ${format.date(end, { year: 'numeric' })}`;\n };\n\n /**\n * 一格:td + 按钮;label 是读屏念的完整日期,content 是格子里显示的。\n * 读屏名称来自按钮里的文字而不是 aria-label:自定义内容(如房价)跟在完整日期后面一起念,\n * 名称总包含看得见的文字(中文日期里“20”不是单独的词,写成 aria-label 时对不上);\n * 默认内容只是日期数字,不重复念。kind 为 period 时是月份、年份格\n */\n function cell(\n date: CalendarDate,\n month: CalendarDate | undefined,\n label: string,\n content: VNodeChild,\n kind: 'day' | 'custom' | 'period' = 'day',\n ) {\n const period = kind === 'period';\n const state = calendar.cell(date, month);\n const iso = locale.toIso(date);\n const off = disabled || state.disabled;\n const range = calendar.mode === 'range';\n const ends = range && (state.rangeStart || state.rangeEnd);\n const marked = range ? ends : state.selected;\n return (\n <td\n key={iso}\n {...mergeAttrs<'td'>(\n {\n sx: [\n calendarStyles.cell,\n state.inRange && calendarStyles.inRange,\n state.rangeStart && calendarStyles.rangeStart,\n state.rangeEnd && calendarStyles.rangeEnd,\n ],\n },\n resolve(propsCell, iso, state),\n {\n role: 'gridcell',\n 'aria-selected': state.selected,\n 'aria-disabled': off || undefined,\n ...dataAttrs({ 'data-in-range': state.inRange || undefined }),\n },\n )}\n >\n <button\n {...mergeAttrs<'button'>(\n {\n sx: [\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarStyles.button,\n period && calendarStyles.periodButton,\n focusRingStyles.tight,\n state.outside && calendarStyles.outside,\n state.today && calendarStyles.today,\n state.unavailable && calendarStyles.unavailable,\n state.inRange && !ends && calendarStyles.middle,\n marked && calendarStyles.selected,\n off && calendarStyles.disabled,\n ],\n 'aria-describedby': calendar.anchor ? hintId : undefined,\n },\n resolve(propsCellButton, iso, state),\n {\n type: 'button',\n tabindex: state.focused && !state.outside ? 0 : -1,\n 'aria-disabled': off || undefined,\n onClick: () => {\n if (!off) calendar.activate(date);\n },\n // 点击、程序聚焦到别的格子时,键盘从这一格接着走\n onFocus: () => {\n if (!state.focused) calendar.focus(date);\n },\n onPointerenter: () => calendar.hover(date),\n // 写在受管层而不是 JSX 上:元素上只有一处展开,不用再经 Vue 的 mergeProps(每页几百格)\n ...dataAttrs({\n 'data-date': iso,\n 'data-focused': (state.focused && !state.outside) || undefined,\n 'data-selected': state.selected || undefined,\n 'data-today': state.today || undefined,\n 'data-outside': state.outside || undefined,\n 'data-unavailable': state.unavailable || undefined,\n 'data-disabled': off || undefined,\n }),\n },\n )}\n >\n {/* 每格一个:直接用样式,不多建几百个组件实例 */}\n <span {...css.attrs(visuallyHiddenStyles.hidden)}>\n {state.today ? lang.calendarToday(label) : label}\n </span>\n {kind === 'custom' ? content : <span aria-hidden=\"true\">{content}</span>}\n </button>\n </td>\n );\n }\n\n const gridAttrs = (label: string) =>\n mergeAttrs<'table'>(\n {\n sx: [calendarStyles.grid, calendar.view !== 'day' && calendarStyles.periodGrid],\n },\n propsGrid,\n {\n 'aria-label': label,\n role: 'grid',\n 'aria-multiselectable': calendar.mode !== 'single' || undefined,\n onKeydown,\n onPointerleave: () => calendar.hover(null),\n },\n );\n\n function dayGrid(month: CalendarDate, single: boolean) {\n const weeks = monthGrid(month, { ...locale.week, fixedWeeks });\n const names = weekdayNames(locale.locale, {\n firstDayOfWeek: locale.week.firstDayOfWeek,\n format: 'narrow',\n });\n const longNames = weekdayNames(locale.locale, {\n firstDayOfWeek: locale.week.firstDayOfWeek,\n format: 'long',\n });\n return (\n <table {...gridAttrs(title(month))}>\n <thead aria-hidden=\"true\">\n <tr>\n {showWeekNumbers && (\n <th\n {...mergeAttrs<'th'>({ sx: calendarStyles.weekNumber }, propsWeekNumber, {\n scope: 'col',\n })}\n >\n {lang.calendarWeek}\n </th>\n )}\n {names.map((name, index) => (\n <th\n key={index}\n {...mergeAttrs<'th'>(\n { sx: calendarStyles.weekday, title: longNames[index] },\n propsWeekday,\n {\n scope: 'col',\n },\n )}\n >\n {name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week) => (\n <tr key={week[0]!.toString()}>\n {showWeekNumbers && (\n <th\n {...mergeAttrs<'th'>({ sx: calendarStyles.weekNumber }, propsWeekNumber, {\n 'aria-label': lang.calendarWeekNumber(weekOfYear(week[0]!, locale.week)),\n scope: 'row',\n })}\n >\n {weekOfYear(week[0]!, locale.week)}\n </th>\n )}\n {week.map((date) => {\n const outside = date.month !== month.month;\n // 并排几个月时补齐的日期留空:同一天不在两张网格里重复出现\n if (outside && !single)\n return <td key={date.toString()} {...css.attrs(calendarStyles.cell)} />;\n return cell(\n date,\n month,\n format.date(date, { dateStyle: 'full' }),\n children\n ? children(locale.toIso(date), calendar.cell(date, month))\n : locale.dayNumber(date),\n children ? 'custom' : 'day',\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n function periodGrid() {\n const page = calendar.page;\n const month = calendar.view === 'month';\n const items = month ? monthsOfYear(page) : yearsOfDecade(page);\n return (\n <table {...gridAttrs(title(page))}>\n <tbody>\n {chunk(items, 3).map((row) => (\n <tr key={row[0]!.toString()}>\n {row.map((date) =>\n cell(\n date,\n undefined,\n month\n ? format.date(date, { year: 'numeric', month: 'long' })\n : format.date(date, { year: 'numeric' }),\n month\n ? format.date(date, { month: 'short' })\n : format.date(date, { year: 'numeric' }),\n 'period',\n ),\n )}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n return () => {\n const view = calendar.view;\n const months = calendar.months;\n const coarser = view === 'day' ? 'month' : view === 'month' ? 'year' : undefined;\n const [previousLabel, nextLabel] =\n view === 'day'\n ? [lang.calendarPreviousMonth, lang.calendarNextMonth]\n : view === 'month'\n ? [lang.calendarPreviousYear, lang.calendarNextYear]\n : [lang.calendarPreviousDecade, lang.calendarNextDecade];\n const previous = (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n { icon: ChevronLeft, 'aria-label': previousLabel, propsIcon: { flipInRtl: true } },\n propsPrevious,\n {\n disabled: disabled || !calendar.canTurnPage(-1),\n onClick: () => calendar.turnPage(-1),\n },\n )}\n />\n );\n const next = (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n { icon: ChevronRight, 'aria-label': nextLabel, propsIcon: { flipInRtl: true } },\n propsNext,\n { disabled: disabled || !calendar.canTurnPage(1), onClick: () => calendar.turnPage(1) },\n )}\n />\n );\n const spacer = <span {...css.attrs(calendarStyles.spacer)} />;\n return (\n <div\n {...mergeAttrs<'div'>({ sx: [calendarStyles.root, size && fontSizeStyles[size]] }, rest, {\n ref: _toRef(root),\n role: 'group',\n })}\n data-view={view}\n data-disabled={disabled || undefined}\n >\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.months }, propsMonths)}>\n {months.map((month, index) => {\n const label = title(month);\n return (\n <div key={month.toString()} {...css.attrs(calendarStyles.month)}>\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.header }, propsHeader)}>\n {index === 0 ? previous : spacer}\n {coarser && !disabled ? (\n <button\n {...mergeAttrs<'button'>(\n {\n sx: [\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarStyles.heading,\n focusRingStyles.visible,\n ],\n },\n propsHeading,\n {\n 'aria-label':\n coarser === 'month'\n ? lang.calendarChooseMonth(label)\n : lang.calendarChooseYear(label),\n type: 'button',\n onClick: () => calendar.setView(coarser),\n },\n )}\n >\n {label}\n </button>\n ) : (\n // 已经是最粗的视图(或不可用):标题只是文字\n <span {...css.attrs(calendarStyles.heading, calendarStyles.headingStatic)}>\n {label}\n </span>\n )}\n {index === months.length - 1 ? next : spacer}\n </div>\n {view === 'day' ? dayGrid(month, months.length === 1) : periodGrid()}\n </div>\n );\n })}\n </div>\n {/* 翻页、换视图时播报新的标题;不放在标题按钮上,免得聚焦按钮时重复念 */}\n <VisuallyHidden aria-live=\"polite\">{months.map(title).join(',')}</VisuallyHidden>\n {calendar.anchor && <VisuallyHidden id={hintId}>{lang.calendarPickEnd}</VisuallyHidden>}\n {hasContent(footer) && (\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.footer }, propsFooter)}>{footer}</div>\n )}\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"CalendarView.js","names":["_isVNode","_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/date/CalendarView.tsx"],"sourcesContent":["/**\n * 日历的界面(WAI-ARIA 的日期网格):页头(上一页、标题、下一页)、并排的月份网格、月份视图与年份视图、页脚。\n * 状态由调用方的 useCalendarState 给(同 ListboxView 与 useListState 的分工):Calendar、RangeCalendar、各种日期选择器共用。\n *\n * const calendar = useCalendarState({ … });\n * <CalendarView calendar={calendar} showWeekNumbers>{(date, cell) => …}</CalendarView>\n *\n * - 每个月一张 table role=\"grid\",日期格是 td role=\"gridcell\"(aria-selected)里的按钮;焦点日期那一格 tabindex=0,\n * 键盘移动后焦点跟过去(handleCalendarKeydown);读屏念的完整日期(今天、星期)由 Intl 生成;\n * - 标题按钮切到月份视图、再切到年份视图(不比选择的粒度更细);翻页时用 aria-live 播报新的月份;\n * - 并排几个月时只显示本月的日期(补齐的上下月留空,不重复出现);只有一个月时补齐的日期变淡、可以点。\n *\n * 部件:Root、Header、Previous、Next(IconButton)、Heading(标题按钮)、Months(并排的月份)、Grid(table)、\n * Weekday(星期表头)、WeekNumber(周数)、Cell(td)、CellButton(日期 / 月份 / 年份按钮)、Footer。\n */\nimport { ChevronLeft, ChevronRight } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { nextTick, useId, type VNodeChild } from 'vue';\nimport { buttonBaseStyles } from '../base/button-core';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { VisuallyHidden, visuallyHiddenStyles } from '../base/VisuallyHidden';\nimport { useFormat } from '../config/lang/format';\nimport {\n monthGrid,\n monthsOfYear,\n weekdayNames,\n weekOfYear,\n yearsOfDecade,\n} from '../utils/data/date';\nimport { isRtl } from '../utils/dom/direction';\nimport { hasContent, dataAttrs, mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { interactionTransitions } from '../utils/style/transitions';\nimport { fontSizeStyles, type TextSize } from '../utils/style/typography';\nimport {\n handleCalendarKeydown,\n type CalendarCellState,\n type CalendarState,\n} from './calendar-state';\nimport { useDateLocale } from './date-locale';\nimport { useLang } from '../config/context';\nimport type { CalendarDate } from '@internationalized/date';\nimport { t } from '../config/theme/tokens';\n\n/** 角色由组件管理 */\nexport type CalendarViewManaged = 'role';\n\n/** 按项给的部件属性:固定的对象,或按这一格的日期(ISO)与状态返回 */\nexport type CalendarItemProps<P> = P | ((date: string, cell: CalendarCellState) => P);\n\n/** 日历界面的外观与内容选项:Calendar、RangeCalendar、日期选择器原样转交 */\nexport interface CalendarViewOptions {\n /** 字号档位,格子随之缩放;不写时继承上下文字号 */\n size?: TextSize;\n /** 在每行前显示一年里的第几周 */\n showWeekNumbers?: boolean;\n /** 总是 6 行(翻页时高度不跳),默认 true */\n fixedWeeks?: boolean;\n /** 不可用:不能翻页、不能选 */\n disabled?: boolean;\n /**\n * 自定义日期格的内容(价格、标记点):拿到日期(ISO)与这一格的状态;不写时是日期数字。\n * 读屏先念完整日期再念这里的文字:日期数字这类重复的部分可以加 aria-hidden\n */\n children?: (date: string, cell: CalendarCellState) => VNodeChild;\n /** 页脚:今天、清除这类按钮 */\n footer?: VNodeChild;\n /** 页头的部件属性 */\n propsHeader?: PartProps<'div'>;\n /** 上一页按钮的部件属性 */\n propsPrevious?: Omit<Partial<IconButtonProps>, 'disabled' | 'onClick'>;\n /** 下一页按钮的部件属性 */\n propsNext?: Omit<Partial<IconButtonProps>, 'disabled' | 'onClick'>;\n /** 标题按钮的部件属性 */\n propsHeading?: PartProps<'button', 'type' | 'aria-label'>;\n /** 并排月份那一层的部件属性 */\n propsMonths?: PartProps<'div'>;\n /** 每张网格(table)的部件属性 */\n propsGrid?: PartProps<'table', 'role' | 'aria-label' | 'aria-multiselectable'>;\n /** 星期表头的部件属性 */\n propsWeekday?: PartProps<'th', 'scope'>;\n /** 周数的部件属性 */\n propsWeekNumber?: PartProps<'th', 'scope' | 'aria-label'>;\n /** 每格(td)的部件属性 */\n propsCell?: CalendarItemProps<PartProps<'td', 'role' | 'aria-selected' | 'aria-disabled'>>;\n /** 每格里按钮的部件属性 */\n propsCellButton?: CalendarItemProps<\n PartProps<'button', 'type' | 'tabindex' | 'disabled' | 'aria-label' | 'aria-disabled'>\n >;\n /** 页脚的部件属性 */\n propsFooter?: PartProps<'div'>;\n}\n\n/** 未声明的属性落到根元素上(aria-label 等) */\nexport interface CalendarViewProps\n extends PartProps<'div', CalendarViewManaged>, CalendarViewOptions {\n /** 日历状态(useCalendarState) */\n calendar: CalendarState;\n /** 一周的第一天(0 表示周日),与 useCalendarState 的 week 一致;不写时取语言配置 */\n firstDayOfWeek?: number;\n}\n\n/** CalendarView 的样式:root、months、month、header、heading、grid、weekday、cell、button 等 */\nexport const calendarStyles = css.create({\n root: {\n display: 'inline-flex',\n flexDirection: 'column',\n gap: '_sm',\n color: '_text',\n lineHeight: '_normal',\n userSelect: 'none',\n },\n months: { display: 'flex', flexWrap: 'wrap', alignItems: 'flex-start', gap: '_xl' },\n month: { display: 'flex', flexDirection: 'column', gap: '_xs' },\n header: {\n display: 'grid',\n gridTemplateColumns: `max(${t.sizes.control}, ${t.sizes.minTarget}) 1fr max(${t.sizes.control}, ${t.sizes.minTarget})`,\n alignItems: 'center',\n gap: '_xs',\n },\n // 占住按钮的位置:并排几个月时中间的月没有翻页按钮,标题仍居中\n spacer: { width: `max(${t.sizes.control}, ${t.sizes.minTarget})` },\n heading: {\n display: 'inline-flex',\n alignItems: 'center',\n justifySelf: 'center',\n minHeight: `max(${t.sizes.control}, ${t.sizes.minTarget})`,\n paddingInline: '_sm',\n borderRadius: '_md',\n fontWeight: '_semibold',\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n headingStatic: {\n cursor: 'default',\n backgroundColor: { default: 'transparent', ':hover': 'transparent' },\n },\n grid: { borderCollapse: 'collapse', borderSpacing: 0 },\n // 月份、年份视图:一行 3 格,与日期网格同宽\n periodGrid: { width: `calc(7 * max(2.25em, ${t.sizes.minTarget}))` },\n weekday: {\n paddingBlock: '_xs',\n paddingInline: 0,\n color: '_textMuted',\n fontWeight: '_normal',\n textAlign: 'center',\n },\n weekNumber: {\n paddingInlineEnd: '_xs',\n color: '_textMuted',\n fontWeight: '_normal',\n textAlign: 'center',\n },\n cell: { padding: 0, textAlign: 'center' },\n // 区间的底色画在 td 上,相邻的格连成一条;两端与每行的首尾是圆的\n inRange: {\n backgroundColor: '_accentSoft',\n borderStartStartRadius: { default: 0, ':first-of-type': '_md' },\n borderEndStartRadius: { default: 0, ':first-of-type': '_md' },\n borderStartEndRadius: { default: 0, ':last-of-type': '_md' },\n borderEndEndRadius: { default: 0, ':last-of-type': '_md' },\n },\n rangeStart: { borderStartStartRadius: '_md', borderEndStartRadius: '_md' },\n rangeEnd: { borderStartEndRadius: '_md', borderEndEndRadius: '_md' },\n button: {\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n width: `max(2.25em, ${t.sizes.minTarget})`,\n height: `max(2.25em, ${t.sizes.minTarget})`,\n borderRadius: '_md',\n fontVariantNumeric: 'tabular-nums',\n backgroundColor: { default: 'transparent', ':hover': '_fillHover' },\n },\n periodButton: { width: '_full', height: `max(3em, ${t.sizes.minTarget})` },\n outside: { color: '_textMuted' },\n today: {\n fontWeight: '_semibold',\n boxShadow: `inset 0 0 0 ${t.borderWidths.xs} ${t.colors.accentBorder}`,\n },\n selected: {\n backgroundColor: { default: '_accent', ':hover': '_accentHover' },\n color: '_accentContrast',\n boxShadow: 'none',\n },\n // 区间中间的格:按钮透明,底色是 td 的那一条\n middle: {\n backgroundColor: { default: 'transparent', ':hover': '_accentSoftHover' },\n color: '_accentText',\n },\n unavailable: { color: '_textMuted', textDecorationLine: 'line-through' },\n disabled: {\n opacity: '_disabled',\n cursor: 'not-allowed',\n backgroundColor: { default: 'transparent', ':hover': 'transparent' },\n },\n footer: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: '_sm' },\n});\n\n/** 网格行列:月份、年份视图一行 3 格 */\nconst chunk = <T,>(items: readonly T[], size: number) =>\n Array.from({ length: Math.ceil(items.length / size) }, (_, row) =>\n items.slice(row * size, row * size + size),\n );\n\nconst resolve = <P,>(\n props: CalendarItemProps<P> | undefined,\n date: string,\n cell: CalendarCellState,\n) =>\n typeof props === 'function'\n ? (props as (date: string, cell: CalendarCellState) => P)(date, cell)\n : props;\n\n/** 日历的界面:页头、月份网格(或月份、年份视图)、页脚 */\nexport const CalendarView = _component(\n ({\n calendar,\n firstDayOfWeek,\n size,\n showWeekNumbers = false,\n fixedWeeks = true,\n disabled = false,\n children,\n footer,\n propsHeader,\n propsPrevious,\n propsNext,\n propsHeading,\n propsMonths,\n propsGrid,\n propsWeekday,\n propsWeekNumber,\n propsCell,\n propsCellButton,\n propsFooter,\n ...rest\n }: CalendarViewProps) => {\n const format = useFormat();\n const locale = useDateLocale(() => ({ firstDayOfWeek }));\n const lang = useLang();\n const id = useId();\n const hintId = `${id}-hint`;\n let root = _state.raw<HTMLElement | null>(null);\n\n /** 键盘移动后把焦点交给新的焦点格(翻页、换视图后它是新渲染的) */\n function onKeydown(event: KeyboardEvent) {\n if (disabled || !root) return;\n if (!handleCalendarKeydown(calendar, event, isRtl(root))) return;\n event.preventDefault();\n void nextTick(() => root?.querySelector<HTMLElement>('[data-focused]')?.focus());\n }\n\n const title = (date: CalendarDate) => {\n if (calendar.view === 'day') return format.date(date, { year: 'numeric', month: 'long' });\n if (calendar.view === 'month') return format.date(date, { year: 'numeric' });\n const end = date.add({ years: 9 });\n return `${format.date(date, { year: 'numeric' })} – ${format.date(end, { year: 'numeric' })}`;\n };\n\n /**\n * 一格:td + 按钮;label 是读屏念的完整日期,content 是格子里显示的。\n * 读屏名称来自按钮里的文字而不是 aria-label:自定义内容(如房价)跟在完整日期后面一起念,\n * 名称总包含看得见的文字(中文日期里“20”不是单独的词,写成 aria-label 时对不上);\n * 默认内容只是日期数字,不重复念。kind 为 period 时是月份、年份格\n */\n function cell(\n date: CalendarDate,\n month: CalendarDate | undefined,\n label: string,\n content: VNodeChild,\n kind: 'day' | 'custom' | 'period' = 'day',\n ) {\n const period = kind === 'period';\n const state = calendar.cell(date, month);\n const iso = locale.toIso(date);\n const off = disabled || state.disabled;\n const range = calendar.mode === 'range';\n const ends = range && (state.rangeStart || state.rangeEnd);\n const marked = range ? ends : state.selected;\n return (\n <td\n key={iso}\n {...mergeAttrs<'td'>(\n {\n sx: [\n calendarStyles.cell,\n state.inRange && calendarStyles.inRange,\n state.rangeStart && calendarStyles.rangeStart,\n state.rangeEnd && calendarStyles.rangeEnd,\n ],\n },\n resolve(propsCell, iso, state),\n {\n role: 'gridcell',\n 'aria-selected': state.selected,\n 'aria-disabled': off || undefined,\n ...dataAttrs({ 'data-in-range': state.inRange || undefined }),\n },\n )}\n >\n <button\n {...mergeAttrs<'button'>(\n {\n sx: [\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarStyles.button,\n period && calendarStyles.periodButton,\n focusRingStyles.tight,\n state.outside && calendarStyles.outside,\n state.today && calendarStyles.today,\n state.unavailable && calendarStyles.unavailable,\n state.inRange && !ends && calendarStyles.middle,\n marked && calendarStyles.selected,\n off && calendarStyles.disabled,\n ],\n 'aria-describedby': calendar.anchor ? hintId : undefined,\n },\n resolve(propsCellButton, iso, state),\n {\n type: 'button',\n tabindex: state.focused && !state.outside ? 0 : -1,\n 'aria-disabled': off || undefined,\n onClick: () => {\n if (!off) calendar.activate(date);\n },\n // 点击、程序聚焦到别的格子时,键盘从这一格接着走\n onFocus: () => {\n if (!state.focused) calendar.focus(date);\n },\n onPointerenter: () => calendar.hover(date),\n // 写在受管层而不是 JSX 上:元素上只有一处展开,不用再经 Vue 的 mergeProps(每页几百格)\n ...dataAttrs({\n 'data-date': iso,\n 'data-focused': (state.focused && !state.outside) || undefined,\n 'data-selected': state.selected || undefined,\n 'data-today': state.today || undefined,\n 'data-outside': state.outside || undefined,\n 'data-unavailable': state.unavailable || undefined,\n 'data-disabled': off || undefined,\n }),\n },\n )}\n >\n {/* 每格一个:直接用样式,不多建几百个组件实例 */}\n <span {...css.attrs(visuallyHiddenStyles.hidden)}>\n {state.today ? lang.calendarToday(label) : label}\n </span>\n {kind === 'custom' ? content : <span aria-hidden=\"true\">{content}</span>}\n </button>\n </td>\n );\n }\n\n const gridAttrs = (label: string) =>\n mergeAttrs<'table'>(\n {\n sx: [calendarStyles.grid, calendar.view !== 'day' && calendarStyles.periodGrid],\n },\n propsGrid,\n {\n 'aria-label': label,\n role: 'grid',\n 'aria-multiselectable': calendar.mode !== 'single' || undefined,\n onKeydown,\n onPointerleave: () => calendar.hover(null),\n },\n );\n\n function dayGrid(month: CalendarDate, single: boolean) {\n const weeks = monthGrid(month, { ...locale.week, fixedWeeks });\n const names = weekdayNames(locale.locale, {\n firstDayOfWeek: locale.week.firstDayOfWeek,\n format: 'narrow',\n });\n const longNames = weekdayNames(locale.locale, {\n firstDayOfWeek: locale.week.firstDayOfWeek,\n format: 'long',\n });\n return (\n <table {...gridAttrs(title(month))}>\n <thead aria-hidden=\"true\">\n <tr>\n {showWeekNumbers && (\n <th\n {...mergeAttrs<'th'>({ sx: calendarStyles.weekNumber }, propsWeekNumber, {\n scope: 'col',\n })}\n >\n {lang.calendarWeek}\n </th>\n )}\n {names.map((name, index) => (\n <th\n key={index}\n {...mergeAttrs<'th'>(\n { sx: calendarStyles.weekday, title: longNames[index] },\n propsWeekday,\n {\n scope: 'col',\n },\n )}\n >\n {name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {weeks.map((week) => (\n <tr key={week[0]!.toString()}>\n {showWeekNumbers && (\n <th\n {...mergeAttrs<'th'>({ sx: calendarStyles.weekNumber }, propsWeekNumber, {\n 'aria-label': lang.calendarWeekNumber(weekOfYear(week[0]!, locale.week)),\n scope: 'row',\n })}\n >\n {weekOfYear(week[0]!, locale.week)}\n </th>\n )}\n {week.map((date) => {\n const outside = date.month !== month.month;\n // 并排几个月时补齐的日期留空:同一天不在两张网格里重复出现\n if (outside && !single)\n return <td key={date.toString()} {...css.attrs(calendarStyles.cell)} />;\n return cell(\n date,\n month,\n format.date(date, { dateStyle: 'full' }),\n children\n ? children(locale.toIso(date), calendar.cell(date, month))\n : locale.dayNumber(date),\n children ? 'custom' : 'day',\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n function periodGrid() {\n const page = calendar.page;\n const month = calendar.view === 'month';\n const items = month ? monthsOfYear(page) : yearsOfDecade(page);\n return (\n <table {...gridAttrs(title(page))}>\n <tbody>\n {chunk(items, 3).map((row) => (\n <tr key={row[0]!.toString()}>\n {row.map((date) =>\n cell(\n date,\n undefined,\n month\n ? format.date(date, { year: 'numeric', month: 'long' })\n : format.date(date, { year: 'numeric' }),\n month\n ? format.date(date, { month: 'short' })\n : format.date(date, { year: 'numeric' }),\n 'period',\n ),\n )}\n </tr>\n ))}\n </tbody>\n </table>\n );\n }\n\n return () => {\n const view = calendar.view;\n const months = calendar.months;\n const coarser = view === 'day' ? 'month' : view === 'month' ? 'year' : undefined;\n const [previousLabel, nextLabel] =\n view === 'day'\n ? [lang.calendarPreviousMonth, lang.calendarNextMonth]\n : view === 'month'\n ? [lang.calendarPreviousYear, lang.calendarNextYear]\n : [lang.calendarPreviousDecade, lang.calendarNextDecade];\n const previous = (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n { icon: ChevronLeft, 'aria-label': previousLabel, propsIcon: { flipInRtl: true } },\n propsPrevious,\n {\n disabled: disabled || !calendar.canTurnPage(-1),\n onClick: () => calendar.turnPage(-1),\n },\n )}\n />\n );\n const next = (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n { icon: ChevronRight, 'aria-label': nextLabel, propsIcon: { flipInRtl: true } },\n propsNext,\n { disabled: disabled || !calendar.canTurnPage(1), onClick: () => calendar.turnPage(1) },\n )}\n />\n );\n const spacer = <span {...css.attrs(calendarStyles.spacer)} />;\n return (\n <div\n {...mergeAttrs<'div'>({ sx: [calendarStyles.root, size && fontSizeStyles[size]] }, rest, {\n ref: _toRef(root),\n role: 'group',\n })}\n data-view={view}\n data-disabled={disabled || undefined}\n >\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.months }, propsMonths)}>\n {months.map((month, index) => {\n const label = title(month);\n return (\n <div key={month.toString()} {...css.attrs(calendarStyles.month)}>\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.header }, propsHeader)}>\n {index === 0 ? previous : spacer}\n {coarser && !disabled ? (\n <button\n {...mergeAttrs<'button'>(\n {\n sx: [\n buttonBaseStyles.root,\n interactionTransitions.colors,\n calendarStyles.heading,\n focusRingStyles.visible,\n ],\n },\n propsHeading,\n {\n 'aria-label':\n coarser === 'month'\n ? lang.calendarChooseMonth(label)\n : lang.calendarChooseYear(label),\n type: 'button',\n onClick: () => calendar.setView(coarser),\n },\n )}\n >\n {label}\n </button>\n ) : (\n // 已经是最粗的视图(或不可用):标题只是文字\n <span {...css.attrs(calendarStyles.heading, calendarStyles.headingStatic)}>\n {label}\n </span>\n )}\n {index === months.length - 1 ? next : spacer}\n </div>\n {view === 'day' ? dayGrid(month, months.length === 1) : periodGrid()}\n </div>\n );\n })}\n </div>\n {/* 翻页、换视图时播报新的标题;不放在标题按钮上,免得聚焦按钮时重复念 */}\n <VisuallyHidden aria-live=\"polite\">{months.map(title).join(',')}</VisuallyHidden>\n {calendar.anchor && <VisuallyHidden id={hintId}>{lang.calendarPickEnd}</VisuallyHidden>}\n {hasContent(footer) && (\n <div {...mergeAttrs<'div'>({ sx: calendarStyles.footer }, propsFooter)}>{footer}</div>\n )}\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
@@ -2,8 +2,8 @@ import { compareDates, fullIsoDay, lastIsoDay, parseIsoDate, parseIsoDateTime, p
2
2
  import { toDateLimits, useDateLocale } from "./date-locale.js";
3
3
  import { segmentFields } from "./date-segments.js";
4
4
  import { SegmentedField } from "./SegmentedField.js";
5
- import { computed, createVNode, mergeProps } from "vue";
6
- import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
5
+ import { computed, createVNode } from "vue";
6
+ import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
7
7
  import { toCalendar, toCalendarDateTime } from "@internationalized/date";
8
8
  //#region src/date/DateField.tsx
9
9
  /** 未声明的属性落到这组分段上(主元素);外壳用 propsRoot */
@@ -99,7 +99,7 @@ var DateField = /*#__PURE__*/ _component((_props, _ctx) => {
99
99
  lastLike = value.value ?? lastLike;
100
100
  value.value = next == null ? null : isoToValue(next, lastLike, granularity.value, valueType.value);
101
101
  }
102
- return () => createVNode(SegmentedField, mergeProps(rest, {
102
+ return () => createVNode(SegmentedField, mergeJsxProps(rest, {
103
103
  "onUpdate:_value": write,
104
104
  "_value": iso.value,
105
105
  "fields": segmentFields(granularity.value),
@@ -1 +1 @@
1
- {"version":3,"file":"DateField.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/date/DateField.tsx"],"sourcesContent":["/**\n * 日期输入框:分段输入年、月、日(不带弹层),段的顺序按语言(zh-CN 年/月/日,en-US 月/日/年)。\n * 参考 React Aria DateField、原生 input type=\"date\"。要弹出日历用 DatePicker。\n *\n * <Field label=\"生日\"><DateField _value={birthday} max={today} /></Field>\n * <DateField granularity=\"minute\" _value={at} aria-label=\"开始时间\" /> // '2026-10-20T14:30'\n * <DateField granularity=\"month\" _value={month} aria-label=\"账期\" /> // '2026-10'\n *\n * 值是 ISO 字符串,形式随 granularity:year 'YYYY'、month 'YYYY-MM'、day 'YYYY-MM-DD',\n * hour / minute / second 是日期加时间 'YYYY-MM-DDTHH:mm[:ss]'(同原生 datetime-local);\n * 也可以是 DateValue,写回时保持同一种类型(ZonedDateTime 的时区、CalendarDateTime 没显示的时间不丢)。\n * 值在 min–max 之外、是不可选的日期或时刻(isTimeUnavailable)时显示出错(aria-invalid),值照样写回,由表单校验决定能不能提交。\n *\n * 键盘:数字逐段输入(满了自动跳段),↑↓ 加减,Page Up / Down 大步,Home / End 最小 / 最大,\n * Backspace 删一位(删空回到上一段),←→ 与 Tab 换段。部件见 SegmentedField。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport {\n toCalendar,\n toCalendarDateTime,\n type CalendarDate,\n type CalendarDateTime,\n type Time,\n} from '@internationalized/date';\nimport {\n compareDates,\n fullIsoDay,\n lastIsoDay,\n parseIsoDate,\n parseIsoDateTime,\n parseIsoTime,\n toIsoDate,\n toIsoDateTime,\n toIsoQuarter,\n toIsoTime,\n toIsoWeek,\n type DateLimits,\n type DateUnit,\n} from '../utils/data/date';\nimport {\n toDateLimits,\n useDateLocale,\n type DateInput,\n type DateLocale,\n type DateLimitProps,\n type DateValueTypes,\n} from './date-locale';\nimport { segmentFields, type DateFieldGranularity } from './date-segments';\nimport { SegmentedField, type SegmentedFieldOptions } from './SegmentedField';\n\n/** 未声明的属性落到这组分段上(主元素);外壳用 propsRoot */\nexport interface DateFieldProps<V extends DateInput = string>\n extends SegmentedFieldOptions, DateLimitProps {\n /** 值:ISO 字符串(形式随 granularity)或 DateValue,写回时保持同一种类型;父级写 _value={x};没填全时 null */\n _value?: V | null;\n /** 精确到哪一段,默认 day;到 hour / minute / second 时是日期加时间 */\n granularity?: DateFieldGranularity;\n /** 值为空、推不出类型时写回哪一种,默认 iso(字符串);dateValue 写 CalendarDate(带时间时 CalendarDateTime) */\n valueType?: keyof DateValueTypes;\n /**\n * 带时间时不可选的时刻(午休、非营业时间):键入时显示出错。参数是 'HH:mm'、同一时刻的 Time 与那一天的 ISO 日期,\n * 周末与平日可以不一样:`(_, time, date) => time.hour < 9 || time.hour >= (isWeekend(…) ? 12 : 18)`\n */\n isTimeUnavailable?: (time: string, value: Time, date: string) => boolean;\n}\n\n/** 粒度 → 日历的粒度:年、月照搬,到日及以下都按日(选日期、比较范围) */\nexport const dateUnitOf = (granularity: DateFieldGranularity): DateUnit =>\n granularity === 'year' || granularity === 'month' ? granularity : 'day';\n\n/** 精确到时、分、秒:值是日期加时间 */\nexport const isTimeGranularity = (granularity: DateFieldGranularity) =>\n granularity === 'hour' || granularity === 'minute' || granularity === 'second';\n\n/** ISO 日期时间统一到秒('2026-10-20T14:30' → '2026-10-20T14:30:00'),去掉时区后缀:按字符串比较就是按时间先后 */\nconst toSeconds = (iso: string) => (iso.length >= 19 ? iso.slice(0, 19) : `${iso.slice(0, 16)}:00`);\n\n/**\n * 带时间的 min / max → 比较用的 ISO 日期时间;只给了日期(或不带时间的 granularity)时为 null,\n * 那一整天都可选,只按日期比较\n */\nfunction timeBound(limit: DateInput | undefined, granularity: DateFieldGranularity) {\n if (limit == null || !isTimeGranularity(granularity)) return null;\n if (typeof limit === 'string') return limit.includes('T') ? toSeconds(limit) : null;\n return 'hour' in limit ? toSeconds(valueToIso(limit, granularity)) : null;\n}\n\n/**\n * 这一段(年、季度、月、周、日,按值的形式)能不能选:整段都在 min–max 之外,或(按日选时)是不可选的日期。\n * DateField、DatePicker 的快捷选项与“今天”、DateRangePicker 的两端共用\n */\nexport function isPeriodDisabled(\n iso: string,\n granularity: DateFieldGranularity,\n limits: DateLimits,\n locale: DateLocale,\n): boolean {\n const start = locale.fromValue(fullIsoDay(iso));\n const end = locale.fromValue(lastIsoDay(iso));\n if (start == null || end == null) return false;\n if (limits.max != null && compareDates(start, limits.max) > 0) return true;\n if (limits.min != null && compareDates(end, limits.min) < 0) return true;\n const byDay = granularity === 'day' || isTimeGranularity(granularity);\n return byDay && (limits.isUnavailable?.(start) ?? false);\n}\n\n/** 值 → 分段输入用的 ISO 字符串(形式随 granularity) */\nexport function valueToIso(value: DateInput, granularity: DateFieldGranularity): string {\n if (typeof value === 'string') return value;\n if (isTimeGranularity(granularity)) {\n return toIsoDateTime(toCalendarDateTime(value), granularity === 'second');\n }\n if (granularity === 'quarter') return toIsoQuarter(value);\n if (granularity === 'week') return toIsoWeek(value);\n const day = toIsoDate(value);\n return granularity === 'year' ? day.slice(0, 4) : granularity === 'month' ? day.slice(0, 7) : day;\n}\n\n/** 分段输入填好的 ISO 字符串 → 和 like 同一种类型的值 */\nexport function isoToValue(\n iso: string,\n like: DateInput | undefined,\n granularity: DateFieldGranularity,\n valueType: keyof DateValueTypes = 'iso',\n): DateInput {\n if (typeof like === 'string' || (like == null && valueType === 'iso')) return iso;\n const parsed: CalendarDate | CalendarDateTime = isTimeGranularity(granularity)\n ? parseIsoDateTime(iso)!\n : parseIsoDate(fullIsoDay(iso))!;\n if (like == null) return parsed;\n const converted = toCalendar(parsed, like.calendar);\n if (!('hour' in like)) return converted;\n const { era, year, month, day } = converted;\n if (!('hour' in converted)) return like.set({ era, year, month, day });\n const { hour, minute, second } = converted;\n return like.set({ era, year, month, day, hour, minute, second });\n}\n\n/** 日期输入框:分段输入 */\nexport const DateField = _component(\n <V extends DateInput>({\n _value: value = _bindable<V | null>(null),\n granularity = 'day',\n valueType,\n min,\n max,\n isDateUnavailable,\n isTimeUnavailable,\n ...rest\n }: DateFieldProps<V>) => {\n const locale = useDateLocale();\n const limits = _derived(toDateLimits(locale, { min, max, isDateUnavailable }));\n // 先按日期比较(含不可选的日期);min / max 带时间时,同一天里再比时分秒\n const outOfRange = (iso: string) => {\n if (isPeriodDisabled(iso, granularity, limits, locale)) return true;\n const low = timeBound(min, granularity);\n const high = timeBound(max, granularity);\n const at = isTimeGranularity(granularity) ? toSeconds(iso) : '';\n if ((low != null && at < low) || (high != null && at > high)) return true;\n const time = isTimeGranularity(granularity) ? parseIsoTime(iso.slice(11)) : null;\n return (\n time != null && (isTimeUnavailable?.(toIsoTime(time), time, iso.slice(0, 10)) ?? false)\n );\n };\n const iso = _derived(value == null ? null : valueToIso(value, granularity));\n // 值清空后再填:仍按清空前的类型写回\n let lastLike: V | undefined;\n function write(next: string | null) {\n lastLike = value ?? lastLike;\n value = next == null ? null : (isoToValue(next, lastLike, granularity, valueType) as V);\n }\n return () => (\n <SegmentedField\n {...rest}\n onUpdate:_value={write}\n _value={iso}\n fields={segmentFields(granularity)}\n outOfRange={outOfRange}\n />\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"DateField.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps"],"sources":["../../src/date/DateField.tsx"],"sourcesContent":["/**\n * 日期输入框:分段输入年、月、日(不带弹层),段的顺序按语言(zh-CN 年/月/日,en-US 月/日/年)。\n * 参考 React Aria DateField、原生 input type=\"date\"。要弹出日历用 DatePicker。\n *\n * <Field label=\"生日\"><DateField _value={birthday} max={today} /></Field>\n * <DateField granularity=\"minute\" _value={at} aria-label=\"开始时间\" /> // '2026-10-20T14:30'\n * <DateField granularity=\"month\" _value={month} aria-label=\"账期\" /> // '2026-10'\n *\n * 值是 ISO 字符串,形式随 granularity:year 'YYYY'、month 'YYYY-MM'、day 'YYYY-MM-DD',\n * hour / minute / second 是日期加时间 'YYYY-MM-DDTHH:mm[:ss]'(同原生 datetime-local);\n * 也可以是 DateValue,写回时保持同一种类型(ZonedDateTime 的时区、CalendarDateTime 没显示的时间不丢)。\n * 值在 min–max 之外、是不可选的日期或时刻(isTimeUnavailable)时显示出错(aria-invalid),值照样写回,由表单校验决定能不能提交。\n *\n * 键盘:数字逐段输入(满了自动跳段),↑↓ 加减,Page Up / Down 大步,Home / End 最小 / 最大,\n * Backspace 删一位(删空回到上一段),←→ 与 Tab 换段。部件见 SegmentedField。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport {\n toCalendar,\n toCalendarDateTime,\n type CalendarDate,\n type CalendarDateTime,\n type Time,\n} from '@internationalized/date';\nimport {\n compareDates,\n fullIsoDay,\n lastIsoDay,\n parseIsoDate,\n parseIsoDateTime,\n parseIsoTime,\n toIsoDate,\n toIsoDateTime,\n toIsoQuarter,\n toIsoTime,\n toIsoWeek,\n type DateLimits,\n type DateUnit,\n} from '../utils/data/date';\nimport {\n toDateLimits,\n useDateLocale,\n type DateInput,\n type DateLocale,\n type DateLimitProps,\n type DateValueTypes,\n} from './date-locale';\nimport { segmentFields, type DateFieldGranularity } from './date-segments';\nimport { SegmentedField, type SegmentedFieldOptions } from './SegmentedField';\n\n/** 未声明的属性落到这组分段上(主元素);外壳用 propsRoot */\nexport interface DateFieldProps<V extends DateInput = string>\n extends SegmentedFieldOptions, DateLimitProps {\n /** 值:ISO 字符串(形式随 granularity)或 DateValue,写回时保持同一种类型;父级写 _value={x};没填全时 null */\n _value?: V | null;\n /** 精确到哪一段,默认 day;到 hour / minute / second 时是日期加时间 */\n granularity?: DateFieldGranularity;\n /** 值为空、推不出类型时写回哪一种,默认 iso(字符串);dateValue 写 CalendarDate(带时间时 CalendarDateTime) */\n valueType?: keyof DateValueTypes;\n /**\n * 带时间时不可选的时刻(午休、非营业时间):键入时显示出错。参数是 'HH:mm'、同一时刻的 Time 与那一天的 ISO 日期,\n * 周末与平日可以不一样:`(_, time, date) => time.hour < 9 || time.hour >= (isWeekend(…) ? 12 : 18)`\n */\n isTimeUnavailable?: (time: string, value: Time, date: string) => boolean;\n}\n\n/** 粒度 → 日历的粒度:年、月照搬,到日及以下都按日(选日期、比较范围) */\nexport const dateUnitOf = (granularity: DateFieldGranularity): DateUnit =>\n granularity === 'year' || granularity === 'month' ? granularity : 'day';\n\n/** 精确到时、分、秒:值是日期加时间 */\nexport const isTimeGranularity = (granularity: DateFieldGranularity) =>\n granularity === 'hour' || granularity === 'minute' || granularity === 'second';\n\n/** ISO 日期时间统一到秒('2026-10-20T14:30' → '2026-10-20T14:30:00'),去掉时区后缀:按字符串比较就是按时间先后 */\nconst toSeconds = (iso: string) => (iso.length >= 19 ? iso.slice(0, 19) : `${iso.slice(0, 16)}:00`);\n\n/**\n * 带时间的 min / max → 比较用的 ISO 日期时间;只给了日期(或不带时间的 granularity)时为 null,\n * 那一整天都可选,只按日期比较\n */\nfunction timeBound(limit: DateInput | undefined, granularity: DateFieldGranularity) {\n if (limit == null || !isTimeGranularity(granularity)) return null;\n if (typeof limit === 'string') return limit.includes('T') ? toSeconds(limit) : null;\n return 'hour' in limit ? toSeconds(valueToIso(limit, granularity)) : null;\n}\n\n/**\n * 这一段(年、季度、月、周、日,按值的形式)能不能选:整段都在 min–max 之外,或(按日选时)是不可选的日期。\n * DateField、DatePicker 的快捷选项与“今天”、DateRangePicker 的两端共用\n */\nexport function isPeriodDisabled(\n iso: string,\n granularity: DateFieldGranularity,\n limits: DateLimits,\n locale: DateLocale,\n): boolean {\n const start = locale.fromValue(fullIsoDay(iso));\n const end = locale.fromValue(lastIsoDay(iso));\n if (start == null || end == null) return false;\n if (limits.max != null && compareDates(start, limits.max) > 0) return true;\n if (limits.min != null && compareDates(end, limits.min) < 0) return true;\n const byDay = granularity === 'day' || isTimeGranularity(granularity);\n return byDay && (limits.isUnavailable?.(start) ?? false);\n}\n\n/** 值 → 分段输入用的 ISO 字符串(形式随 granularity) */\nexport function valueToIso(value: DateInput, granularity: DateFieldGranularity): string {\n if (typeof value === 'string') return value;\n if (isTimeGranularity(granularity)) {\n return toIsoDateTime(toCalendarDateTime(value), granularity === 'second');\n }\n if (granularity === 'quarter') return toIsoQuarter(value);\n if (granularity === 'week') return toIsoWeek(value);\n const day = toIsoDate(value);\n return granularity === 'year' ? day.slice(0, 4) : granularity === 'month' ? day.slice(0, 7) : day;\n}\n\n/** 分段输入填好的 ISO 字符串 → 和 like 同一种类型的值 */\nexport function isoToValue(\n iso: string,\n like: DateInput | undefined,\n granularity: DateFieldGranularity,\n valueType: keyof DateValueTypes = 'iso',\n): DateInput {\n if (typeof like === 'string' || (like == null && valueType === 'iso')) return iso;\n const parsed: CalendarDate | CalendarDateTime = isTimeGranularity(granularity)\n ? parseIsoDateTime(iso)!\n : parseIsoDate(fullIsoDay(iso))!;\n if (like == null) return parsed;\n const converted = toCalendar(parsed, like.calendar);\n if (!('hour' in like)) return converted;\n const { era, year, month, day } = converted;\n if (!('hour' in converted)) return like.set({ era, year, month, day });\n const { hour, minute, second } = converted;\n return like.set({ era, year, month, day, hour, minute, second });\n}\n\n/** 日期输入框:分段输入 */\nexport const DateField = _component(\n <V extends DateInput>({\n _value: value = _bindable<V | null>(null),\n granularity = 'day',\n valueType,\n min,\n max,\n isDateUnavailable,\n isTimeUnavailable,\n ...rest\n }: DateFieldProps<V>) => {\n const locale = useDateLocale();\n const limits = _derived(toDateLimits(locale, { min, max, isDateUnavailable }));\n // 先按日期比较(含不可选的日期);min / max 带时间时,同一天里再比时分秒\n const outOfRange = (iso: string) => {\n if (isPeriodDisabled(iso, granularity, limits, locale)) return true;\n const low = timeBound(min, granularity);\n const high = timeBound(max, granularity);\n const at = isTimeGranularity(granularity) ? toSeconds(iso) : '';\n if ((low != null && at < low) || (high != null && at > high)) return true;\n const time = isTimeGranularity(granularity) ? parseIsoTime(iso.slice(11)) : null;\n return (\n time != null && (isTimeUnavailable?.(toIsoTime(time), time, iso.slice(0, 10)) ?? false)\n );\n };\n const iso = _derived(value == null ? null : valueToIso(value, granularity));\n // 值清空后再填:仍按清空前的类型写回\n let lastLike: V | undefined;\n function write(next: string | null) {\n lastLike = value ?? lastLike;\n value = next == null ? null : (isoToValue(next, lastLike, granularity, valueType) as V);\n }\n return () => (\n <SegmentedField\n {...rest}\n onUpdate:_value={write}\n _value={iso}\n fields={segmentFields(granularity)}\n outOfRange={outOfRange}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;;AAmEA,IAAa,cAAc,gBACzB,gBAAgB,UAAU,gBAAgB,UAAU,cAAc;;AAGpE,IAAa,qBAAqB,gBAChC,gBAAgB,UAAU,gBAAgB,YAAY,gBAAgB;;AAGxE,IAAM,aAAa,QAAiB,IAAI,UAAU,KAAK,IAAI,MAAM,GAAG,EAAE,IAAI,GAAG,IAAI,MAAM,GAAG,EAAE,EAAC;;;;;AAM7F,SAAS,UAAU,OAA8B,aAAmC;CAClF,IAAI,SAAS,QAAQ,CAAC,kBAAkB,WAAW,GAAG,OAAO;CAC7D,IAAI,OAAO,UAAU,UAAU,OAAO,MAAM,SAAS,GAAG,IAAI,UAAU,KAAK,IAAI;CAC/E,OAAO,UAAU,QAAQ,UAAU,WAAW,OAAO,WAAW,CAAC,IAAI;AACvE;;;;;AAMA,SAAgB,iBACd,KACA,aACA,QACA,QACS;CACT,MAAM,QAAQ,OAAO,UAAU,WAAW,GAAG,CAAC;CAC9C,MAAM,MAAM,OAAO,UAAU,WAAW,GAAG,CAAC;CAC5C,IAAI,SAAS,QAAQ,OAAO,MAAM,OAAO;CACzC,IAAI,OAAO,OAAO,QAAQ,aAAa,OAAO,OAAO,GAAG,IAAI,GAAG,OAAO;CACtE,IAAI,OAAO,OAAO,QAAQ,aAAa,KAAK,OAAO,GAAG,IAAI,GAAG,OAAO;CAEpE,QADc,gBAAgB,SAAS,kBAAkB,WAAW,OACnD,OAAO,gBAAgB,KAAK,KAAK;AACpD;;AAGA,SAAgB,WAAW,OAAkB,aAA2C;CACtF,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,kBAAkB,WAAW,GAC/B,OAAO,cAAc,mBAAmB,KAAK,GAAG,gBAAgB,QAAQ;CAE1E,IAAI,gBAAgB,WAAW,OAAO,aAAa,KAAK;CACxD,IAAI,gBAAgB,QAAQ,OAAO,UAAU,KAAK;CAClD,MAAM,MAAM,UAAU,KAAK;CAC3B,OAAO,gBAAgB,SAAS,IAAI,MAAM,GAAG,CAAC,IAAI,gBAAgB,UAAU,IAAI,MAAM,GAAG,CAAC,IAAI;AAChG;;AAGA,SAAgB,WACd,KACA,MACA,aACA,YAAkC,OACvB;CACX,IAAI,OAAO,SAAS,YAAa,QAAQ,QAAQ,cAAc,OAAQ,OAAO;CAC9E,MAAM,SAA0C,kBAAkB,WAAW,IACzE,iBAAiB,GAAG,IACpB,aAAa,WAAW,GAAG,CAAC;CAChC,IAAI,QAAQ,MAAM,OAAO;CACzB,MAAM,YAAY,WAAW,QAAQ,KAAK,QAAQ;CAClD,IAAI,EAAE,UAAU,OAAO,OAAO;CAC9B,MAAM,EAAE,KAAK,MAAM,OAAO,QAAQ;CAClC,IAAI,EAAE,UAAU,YAAY,OAAO,KAAK,IAAI;EAAE;EAAK;EAAM;EAAO;CAAI,CAAC;CACrE,MAAM,EAAE,MAAM,QAAQ,WAAW;CACjC,OAAO,KAAK,IAAI;EAAE;EAAK;EAAM;EAAO;EAAK;EAAM;EAAQ;CAAO,CAAC;AACjE;;AAGA,IAAa,YAAY,0BACvB,QAAA,SASyB;CAAA,MAAA,QAAAA,SAAA,QAAA,gBARa,MAAI,KAAA,IAAA;CAAA,MAAA,cAAAC,aAAA,QAAA,eAC1B,KAAK;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,MAAAA,aAAA,QAAA,KAAA;CAAA,MAAA,MAAAA,aAAA,QAAA,KAAA;CAAA,MAAA,oBAAAA,aAAA,QAAA,mBAAA;CAAA,MAAA,oBAAAA,aAAA,QAAA,mBAAA;CAAA,MAMhB,OAAIC,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,SAAS,cAAc;CAC7B,MAAM,SAAMC,eAAY,aAAa,QAAQ;EAAE,KAAG,IAAA;EAAE,KAAG,IAAA;EAAE,mBAAiB,kBAAA;CAAC,CAAC,CAAC;CAE7E,MAAM,cAAc,QAAgB;EAClC,IAAI,iBAAiB,KAAG,YAAA,OAAA,OAAA,OAAuB,MAAM,GAAG,OAAO;EAC/D,MAAM,MAAM,UAAS,IAAA,OAAA,YAAA,KAAiB;EACtC,MAAM,OAAO,UAAS,IAAA,OAAA,YAAA,KAAiB;EACvC,MAAM,KAAK,kBAAiB,YAAA,KAAY,IAAI,UAAU,GAAG,IAAI;EAC7D,IAAK,OAAO,QAAQ,KAAK,OAAS,QAAQ,QAAQ,KAAK,MAAO,OAAO;EACrE,MAAM,OAAO,kBAAiB,YAAA,KAAY,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC,IAAI;EAC5E,OACE,QAAQ,SAAS,kBAAA,QAAoB,UAAU,IAAI,GAAG,MAAM,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;CAErF;CACA,MAAM,MAAGA,eAAY,MAAA,SAAS,OAAO,OAAO,WAAU,MAAA,OAAA,YAAA,KAAmB,CAAC;CAE1E,IAAI;CACJ,SAAS,MAAM,MAAqB;EAClC,WAAW,MAAA,SAAS;EACpB,MAAA,QAAQ,QAAQ,OAAO,OAAQ,WAAW,MAAM,UAAQ,YAAA,OAAA,UAAA,KAAwB;CAClF;CACA,aAAOC,YAAA,gBAAAC,cAEC,MAAI;EAAA,mBACS;EAAK,UAAA,IAAA;EAAA,UAEd,cAAa,YAAA,KAAY;EAAC,cACtB;CAAU,CAAA,GAAA,IAAA;AAG5B,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
@@ -9,8 +9,8 @@ import { Calendar } from "./Calendar.js";
9
9
  import { DateField, dateUnitOf, isPeriodDisabled, isTimeGranularity, isoToValue, valueToIso } from "./DateField.js";
10
10
  import { QuarterCalendar } from "./QuarterCalendar.js";
11
11
  import { focusCalendar, renderPickerPresets, usePickerPopover } from "./picker-popover.js";
12
- import { Fragment, computed, createVNode, mergeProps } from "vue";
13
- import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
12
+ import { Fragment, computed, createVNode } from "vue";
13
+ import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
14
14
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
15
15
  import { CalendarDays } from "@lucide/icons";
16
16
  import { toCalendarDateTime } from "@internationalized/date";
@@ -171,7 +171,7 @@ var DatePicker = /*#__PURE__*/ _component((_props, _ctx) => {
171
171
  setOpen(false, "select", event);
172
172
  if (hasTime()) picker.anchor?.querySelector("[data-type=\"hour\"]")?.focus();
173
173
  }
174
- return () => createVNode(Fragment, null, [createVNode(DateField, mergeProps(rest, {
174
+ return () => createVNode(Fragment, null, [createVNode(DateField, mergeJsxProps(rest, {
175
175
  "_value": value.value,
176
176
  "onUpdate:_value": _cache[0] || (_cache[0] = ($event) => value.value = $event),
177
177
  "granularity": granularity.value,
@@ -209,7 +209,7 @@ var DatePicker = /*#__PURE__*/ _component((_props, _ctx) => {
209
209
  "max": max.value,
210
210
  "aria-label": lang.datePickerOpen,
211
211
  "onPick": _cache[2] || (_cache[2] = () => picked())
212
- }, null) : createVNode(Calendar, mergeProps(propsCalendar.value, {
212
+ }, null) : createVNode(Calendar, mergeJsxProps(propsCalendar.value, {
213
213
  "onUpdate:_value": _cache[3] || (_cache[3] = (day) => pickDay(day)),
214
214
  "_value": calendarValue.value,
215
215
  "granularity": dateUnitOf(granularity.value),
@@ -222,7 +222,7 @@ var DatePicker = /*#__PURE__*/ _component((_props, _ctx) => {
222
222
  firstDayOfWeek: 1,
223
223
  showWeekNumbers: true,
224
224
  propsCellButton: weekCellButton
225
- }, { "onPick": _cache[4] || (_cache[4] = () => picked()) }), null), showToday.value && createVNode("div", css.attrs(datePickerStyles.footer), [createVNode(Button, mergeProps(mergePartProps({
225
+ }, { "onPick": _cache[4] || (_cache[4] = () => picked()) }), null), showToday.value && createVNode("div", css.attrs(datePickerStyles.footer), [createVNode(Button, mergeJsxProps(mergePartProps({
226
226
  size: "sm",
227
227
  variant: "ghost"
228
228
  }, propsToday.value, {
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_Fragment","_mergeProps"],"sources":["../../src/date/DatePicker.tsx"],"sourcesContent":["/**\n * 日期选择器:DateField 加一个打开日历的按钮,日历弹在输入框下方;可以直接键入,也可以点选。\n * 参考 React Aria DatePicker(输入框可键入,按钮打开对话框里的 Calendar)、Mantine DatePickerInput。\n *\n * <Field label=\"出发日期\"><DatePicker _value={date} min={today} /></Field>\n * <DatePicker granularity=\"month\" _value={month} aria-label=\"账期\" /> // 选月份:'2026-10'\n * <DatePicker granularity=\"minute\" _value={at} aria-label=\"开始时间\" /> // 日期加时间:'2026-10-20T14:30'\n *\n * <DatePicker granularity=\"quarter\" _value={quarter} aria-label=\"考核季度\" /> // 季度:'2026-Q4';week 是 '2026-W43'\n *\n * granularity 决定值的形式(同 DateField)与弹出的选择:year、month 选年份、月份,quarter 弹出季度面板(QuarterCalendar),\n * week 选周(日历按 ISO 周排、行首是周数,点哪天都是选它那一周),其余选日期。\n * 日历下方有“今天”(按粒度是今年、本季度、本月、本周;超出范围时不可用),旁边可以放快捷选项(presets)。\n * 选好后关闭,焦点回到按钮;带时间时焦点落到“时”那一段接着输入(没有时间时先补 00:00)。\n * Esc、点外部关闭;分段里按 Alt + ↓ 打开(同原生 select)。\n *\n * 部件:同 DateField,另有 Button(打开按钮)、Popover(弹层,role=\"dialog\")、Presets、Calendar、Today(“今天”按钮)。\n */\nimport { CalendarDays } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { toCalendarDateTime } from '@internationalized/date';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { useLang } from '../config/context';\nimport { useFieldControl } from '../form/Field';\nimport {\n fullIsoDay,\n parseIsoDate,\n todayIso,\n toIsoDate,\n toIsoQuarter,\n toIsoWeek,\n} from '../utils/data/date';\nimport { openSetter, type OpenChangeProps } from '../utils/dom/open-change';\nimport { mergePartProps, type PartProps } from '../utils/props';\nimport { Calendar, type CalendarBaseProps } from './Calendar';\nimport {\n DateField,\n dateUnitOf,\n isoToValue,\n isPeriodDisabled,\n isTimeGranularity,\n valueToIso,\n type DateFieldProps,\n} from './DateField';\nimport { toDateLimits, useDateLocale, type DateInput } from './date-locale';\nimport { QuarterCalendar } from './QuarterCalendar';\nimport {\n focusCalendar,\n renderPickerPresets,\n usePickerPopover,\n type PickerPopoverParts,\n} from './picker-popover';\n\n/** 自定义的快捷选项(一周前、上个月末) */\nexport interface DatePreset<V extends DateInput = string> {\n /** 按钮上的文字 */\n label: string;\n /** 值(按 granularity 的形式);函数时每次打开按当时算(跟着今天变) */\n value: V | (() => V);\n}\n\n/** 未声明的属性落到这组分段上(主元素);外壳用 propsRoot */\nexport interface DatePickerProps<V extends DateInput = string>\n extends DateFieldProps<V>, PickerPopoverParts, OpenChangeProps {\n /** 弹层是否打开:父级可写 _open={x} */\n _open?: boolean;\n /** 日历并排显示几个月,默认 1 */\n visibleMonths?: number;\n /** 日历旁边的快捷选项:`[{ label: '一周前', value: () => shiftIsoDate(todayIso(), { weeks: -1 }) }]` */\n presets?: readonly DatePreset<V>[];\n /** 日历下方的“今天”(选月份时“本月”、选年份时“今年”),默认 true */\n showToday?: boolean;\n /** 快捷选项那一列的部件属性 */\n propsPresets?: PartProps<'div', 'role'>;\n /** “今天”按钮的部件属性 */\n propsToday?: Partial<ButtonProps>;\n /** 日历的部件属性(值、范围、粒度由选择器给出) */\n propsCalendar?: Omit<\n Partial<CalendarBaseProps<V>>,\n 'granularity' | 'min' | 'max' | 'isDateUnavailable' | 'valueType' | 'onPick'\n >;\n}\n\n/** DatePicker 的样式:popover、main(日历与“今天”)、footer(快捷选项的样式见 pickerPresetStyles) */\nexport const datePickerStyles = css.create({\n popover: { display: 'flex', alignItems: 'flex-start', gap: '_sm', padding: '_sm' },\n main: { display: 'flex', flexDirection: 'column', gap: '_xs' },\n // 选周时已选那一周的另外六天\n inWeek: {\n backgroundColor: { default: '_accentSoft', ':hover': '_accentSoftHover' },\n color: '_accentText',\n },\n footer: {\n display: 'flex',\n justifyContent: 'center',\n paddingBlockStart: '_xs',\n borderBlockStartWidth: '_xs',\n borderBlockStartStyle: 'solid',\n borderBlockStartColor: '_borderMuted',\n },\n});\n\n/** 日期选择器:分段输入 + 弹出的日历 */\nexport const DatePicker = _component(\n <V extends DateInput>({\n _value: value = _bindable<V | null>(null),\n _open: open = _bindable(false),\n onOpenChange,\n granularity = 'day',\n valueType,\n min,\n max,\n isDateUnavailable,\n placement,\n visibleMonths = 1,\n presets = [],\n showToday = true,\n propsPresets,\n propsToday,\n id,\n disabled,\n readonly,\n invalid,\n required,\n propsRoot,\n propsButton,\n propsPopover,\n propsCalendar,\n onKeydown,\n ...rest\n }: DatePickerProps<V>) => {\n const lang = useLang();\n // 输入由里面的 DateField 接 Field;这里只读状态决定能不能打开面板\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }), {\n delegate: true,\n });\n const setOpen = openSetter(\n () => open,\n (next) => (open = next),\n () => onOpenChange,\n );\n const hasTime = () => isTimeGranularity(granularity);\n const picker = usePickerPopover(\n () => ({\n open,\n placement,\n editable: !control().disabled && !control().readonly,\n label: lang.datePickerOpen,\n size: rest.size,\n }),\n { toggle: setOpen, shown: focusCalendar },\n );\n\n // 字符串值按 granularity 的形式('2026'、'2026-10'、'2026-10-20T14:30'):日历只认完整的日期\n const calendarValue = _derived.by((): DateInput | null => {\n return typeof value === 'string' ? fullIsoDay(value) : value;\n });\n\n const locale = useDateLocale();\n /** 能不能选:它那一天(选月份、年份时是那个月、那一年)在范围内、不是不可选的日期 */\n function selectable(input: DateInput): boolean {\n const limits = toDateLimits(locale, { min, max, isDateUnavailable });\n return !isPeriodDisabled(valueToIso(input, granularity), granularity, limits, locale);\n }\n const resolve = (preset: DatePreset<V>): V =>\n typeof preset.value === 'function' ? (preset.value as () => V)() : preset.value;\n // 字符串与 DateValue 都按 ISO 比(DateValue 的 toString 是 ISO)\n const sameValue = (a: DateInput, b: DateInput | null) => b != null && String(a) === String(b);\n\n /** 一天 → 它所在的那一段(按 granularity:年、月、季度、周;日与带时间的就是这一天) */\n function periodOf(day: string): string {\n if (granularity === 'year') return day.slice(0, 4);\n if (granularity === 'month') return day.slice(0, 7);\n if (granularity === 'quarter') return toIsoQuarter(parseIsoDate(day)!);\n if (granularity === 'week') return toIsoWeek(parseIsoDate(day)!);\n return day;\n }\n\n /** 日历选了一天:换回 granularity 的形式;带时间的保留原来的时间,没有时补 00:00 */\n function pickDay(day: DateInput | null) {\n if (day == null) return;\n if (typeof day !== 'string') {\n // 空值按 dateValue 写回时日历给的是 CalendarDate:带时间的粒度要 CalendarDateTime,\n // 选周时换成那一周的周一\n if (granularity === 'week') pickPeriod(periodOf(toIsoDate(day)));\n else value = (hasTime() && !('hour' in day) ? toCalendarDateTime(day) : day) as V;\n return;\n }\n if (!hasTime()) value = periodOf(day) as V;\n else {\n const time = typeof value === 'string' && value.length > 10 ? value.slice(10) : undefined;\n value = `${day}${time ?? (granularity === 'second' ? 'T00:00:00' : 'T00:00')}` as V;\n }\n }\n\n /** 季度面板、选周的日历给的 'YYYY-Qn' / 'YYYY-Www':和当前值同一种类型写回(DateValue 时是这一段的第一天) */\n function pickPeriod(iso: string | null) {\n if (iso != null) value = isoToValue(iso, value ?? undefined, granularity, valueType) as V;\n }\n\n // 选周:已选那一周的另外六天带浅色底(日历只把周一当作已选的那一格)\n const weekCellButton = (date: string) => {\n const week = typeof value === 'string' ? value : value != null ? toIsoWeek(value) : null;\n const day = parseIsoDate(date);\n const inWeek = week != null && day != null && toIsoWeek(day) === week;\n return inWeek && date !== fullIsoDay(week) ? { sx: datePickerStyles.inWeek } : {};\n };\n\n /** “今天”按钮的文字:按粒度是今年、本季度、本月、本周或今天 */\n function todayLabel(): string {\n const labels: Partial<Record<typeof granularity, string>> = {\n year: lang.dateRangePreset.thisYear,\n quarter: lang.datePickerThisQuarter,\n month: lang.dateRangePreset.thisMonth,\n week: lang.dateRangePreset.thisWeek,\n };\n return labels[granularity] ?? lang.dateRangePreset.today;\n }\n\n function picked(event?: Event) {\n setOpen(false, 'select', event);\n // 带时间时接着输入时间:焦点去“时”那一段(关闭后的归还焦点只在焦点丢失时生效,不会抢回去)\n if (hasTime()) picker.anchor?.querySelector<HTMLElement>('[data-type=\"hour\"]')?.focus();\n }\n\n return () => (\n <>\n <DateField\n {...rest}\n _value={value}\n granularity={granularity}\n valueType={valueType}\n min={min}\n max={max}\n isDateUnavailable={isDateUnavailable}\n id={id}\n disabled={disabled}\n readonly={readonly}\n invalid={invalid}\n required={required}\n onKeydown={(event) => {\n onKeydown?.(event);\n picker.onKeydown(event);\n }}\n propsRoot={mergePartProps<PartProps<'div'>>({}, propsRoot, { ref: picker.anchorRef })}\n suffix={picker.button(CalendarDays, propsButton)}\n />\n {picker.panel(\n datePickerStyles.popover,\n propsPopover,\n open && [\n renderPickerPresets(\n presets.map((preset) => {\n const next = resolve(preset);\n return {\n key: preset.label,\n label: preset.label,\n active: sameValue(next, value),\n disabled: !selectable(next),\n onPick: () => {\n value = next;\n picked();\n },\n };\n }),\n lang.datePickerPresets,\n propsPresets,\n ),\n <div {...css.attrs(datePickerStyles.main)}>\n {granularity === 'quarter' ? (\n <QuarterCalendar\n _value={typeof value === 'string' || value == null ? value : toIsoQuarter(value)}\n onUpdate:_value={pickPeriod}\n min={min}\n max={max}\n aria-label={lang.datePickerOpen}\n onPick={() => picked()}\n />\n ) : (\n <Calendar<V>\n {...propsCalendar}\n // 这里的日历是单选:值是一天或空\n onUpdate:_value={(day) => pickDay(day as DateInput | null)}\n _value={calendarValue as V | null}\n granularity={dateUnitOf(granularity)}\n valueType={valueType}\n min={min}\n max={max}\n isDateUnavailable={isDateUnavailable}\n visibleMonths={visibleMonths}\n // 选周:按 ISO 8601 的周(周一开始)排,行首是第几周,与值 'YYYY-Www' 一致\n {...(granularity === 'week' && {\n firstDayOfWeek: 1,\n showWeekNumbers: true,\n propsCellButton: weekCellButton,\n })}\n onPick={() => picked()}\n />\n )}\n {showToday && (\n <div {...css.attrs(datePickerStyles.footer)}>\n <Button\n {...mergePartProps<ButtonProps>({ size: 'sm', variant: 'ghost' }, propsToday, {\n disabled: !selectable(periodOf(todayIso(locale.timeZone))),\n onClick: (event: MouseEvent) => {\n pickDay(todayIso(locale.timeZone));\n picked(event);\n },\n })}\n >\n {todayLabel()}\n </Button>\n </div>\n )}\n </div>,\n ],\n )}\n </>\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"DatePicker.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_Fragment","_mergeProps"],"sources":["../../src/date/DatePicker.tsx"],"sourcesContent":["/**\n * 日期选择器:DateField 加一个打开日历的按钮,日历弹在输入框下方;可以直接键入,也可以点选。\n * 参考 React Aria DatePicker(输入框可键入,按钮打开对话框里的 Calendar)、Mantine DatePickerInput。\n *\n * <Field label=\"出发日期\"><DatePicker _value={date} min={today} /></Field>\n * <DatePicker granularity=\"month\" _value={month} aria-label=\"账期\" /> // 选月份:'2026-10'\n * <DatePicker granularity=\"minute\" _value={at} aria-label=\"开始时间\" /> // 日期加时间:'2026-10-20T14:30'\n *\n * <DatePicker granularity=\"quarter\" _value={quarter} aria-label=\"考核季度\" /> // 季度:'2026-Q4';week 是 '2026-W43'\n *\n * granularity 决定值的形式(同 DateField)与弹出的选择:year、month 选年份、月份,quarter 弹出季度面板(QuarterCalendar),\n * week 选周(日历按 ISO 周排、行首是周数,点哪天都是选它那一周),其余选日期。\n * 日历下方有“今天”(按粒度是今年、本季度、本月、本周;超出范围时不可用),旁边可以放快捷选项(presets)。\n * 选好后关闭,焦点回到按钮;带时间时焦点落到“时”那一段接着输入(没有时间时先补 00:00)。\n * Esc、点外部关闭;分段里按 Alt + ↓ 打开(同原生 select)。\n *\n * 部件:同 DateField,另有 Button(打开按钮)、Popover(弹层,role=\"dialog\")、Presets、Calendar、Today(“今天”按钮)。\n */\nimport { CalendarDays } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { toCalendarDateTime } from '@internationalized/date';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { Button, type ButtonProps } from '../base/Button';\nimport { useLang } from '../config/context';\nimport { useFieldControl } from '../form/Field';\nimport {\n fullIsoDay,\n parseIsoDate,\n todayIso,\n toIsoDate,\n toIsoQuarter,\n toIsoWeek,\n} from '../utils/data/date';\nimport { openSetter, type OpenChangeProps } from '../utils/dom/open-change';\nimport { mergePartProps, type PartProps } from '../utils/props';\nimport { Calendar, type CalendarBaseProps } from './Calendar';\nimport {\n DateField,\n dateUnitOf,\n isoToValue,\n isPeriodDisabled,\n isTimeGranularity,\n valueToIso,\n type DateFieldProps,\n} from './DateField';\nimport { toDateLimits, useDateLocale, type DateInput } from './date-locale';\nimport { QuarterCalendar } from './QuarterCalendar';\nimport {\n focusCalendar,\n renderPickerPresets,\n usePickerPopover,\n type PickerPopoverParts,\n} from './picker-popover';\n\n/** 自定义的快捷选项(一周前、上个月末) */\nexport interface DatePreset<V extends DateInput = string> {\n /** 按钮上的文字 */\n label: string;\n /** 值(按 granularity 的形式);函数时每次打开按当时算(跟着今天变) */\n value: V | (() => V);\n}\n\n/** 未声明的属性落到这组分段上(主元素);外壳用 propsRoot */\nexport interface DatePickerProps<V extends DateInput = string>\n extends DateFieldProps<V>, PickerPopoverParts, OpenChangeProps {\n /** 弹层是否打开:父级可写 _open={x} */\n _open?: boolean;\n /** 日历并排显示几个月,默认 1 */\n visibleMonths?: number;\n /** 日历旁边的快捷选项:`[{ label: '一周前', value: () => shiftIsoDate(todayIso(), { weeks: -1 }) }]` */\n presets?: readonly DatePreset<V>[];\n /** 日历下方的“今天”(选月份时“本月”、选年份时“今年”),默认 true */\n showToday?: boolean;\n /** 快捷选项那一列的部件属性 */\n propsPresets?: PartProps<'div', 'role'>;\n /** “今天”按钮的部件属性 */\n propsToday?: Partial<ButtonProps>;\n /** 日历的部件属性(值、范围、粒度由选择器给出) */\n propsCalendar?: Omit<\n Partial<CalendarBaseProps<V>>,\n 'granularity' | 'min' | 'max' | 'isDateUnavailable' | 'valueType' | 'onPick'\n >;\n}\n\n/** DatePicker 的样式:popover、main(日历与“今天”)、footer(快捷选项的样式见 pickerPresetStyles) */\nexport const datePickerStyles = css.create({\n popover: { display: 'flex', alignItems: 'flex-start', gap: '_sm', padding: '_sm' },\n main: { display: 'flex', flexDirection: 'column', gap: '_xs' },\n // 选周时已选那一周的另外六天\n inWeek: {\n backgroundColor: { default: '_accentSoft', ':hover': '_accentSoftHover' },\n color: '_accentText',\n },\n footer: {\n display: 'flex',\n justifyContent: 'center',\n paddingBlockStart: '_xs',\n borderBlockStartWidth: '_xs',\n borderBlockStartStyle: 'solid',\n borderBlockStartColor: '_borderMuted',\n },\n});\n\n/** 日期选择器:分段输入 + 弹出的日历 */\nexport const DatePicker = _component(\n <V extends DateInput>({\n _value: value = _bindable<V | null>(null),\n _open: open = _bindable(false),\n onOpenChange,\n granularity = 'day',\n valueType,\n min,\n max,\n isDateUnavailable,\n placement,\n visibleMonths = 1,\n presets = [],\n showToday = true,\n propsPresets,\n propsToday,\n id,\n disabled,\n readonly,\n invalid,\n required,\n propsRoot,\n propsButton,\n propsPopover,\n propsCalendar,\n onKeydown,\n ...rest\n }: DatePickerProps<V>) => {\n const lang = useLang();\n // 输入由里面的 DateField 接 Field;这里只读状态决定能不能打开面板\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }), {\n delegate: true,\n });\n const setOpen = openSetter(\n () => open,\n (next) => (open = next),\n () => onOpenChange,\n );\n const hasTime = () => isTimeGranularity(granularity);\n const picker = usePickerPopover(\n () => ({\n open,\n placement,\n editable: !control().disabled && !control().readonly,\n label: lang.datePickerOpen,\n size: rest.size,\n }),\n { toggle: setOpen, shown: focusCalendar },\n );\n\n // 字符串值按 granularity 的形式('2026'、'2026-10'、'2026-10-20T14:30'):日历只认完整的日期\n const calendarValue = _derived.by((): DateInput | null => {\n return typeof value === 'string' ? fullIsoDay(value) : value;\n });\n\n const locale = useDateLocale();\n /** 能不能选:它那一天(选月份、年份时是那个月、那一年)在范围内、不是不可选的日期 */\n function selectable(input: DateInput): boolean {\n const limits = toDateLimits(locale, { min, max, isDateUnavailable });\n return !isPeriodDisabled(valueToIso(input, granularity), granularity, limits, locale);\n }\n const resolve = (preset: DatePreset<V>): V =>\n typeof preset.value === 'function' ? (preset.value as () => V)() : preset.value;\n // 字符串与 DateValue 都按 ISO 比(DateValue 的 toString 是 ISO)\n const sameValue = (a: DateInput, b: DateInput | null) => b != null && String(a) === String(b);\n\n /** 一天 → 它所在的那一段(按 granularity:年、月、季度、周;日与带时间的就是这一天) */\n function periodOf(day: string): string {\n if (granularity === 'year') return day.slice(0, 4);\n if (granularity === 'month') return day.slice(0, 7);\n if (granularity === 'quarter') return toIsoQuarter(parseIsoDate(day)!);\n if (granularity === 'week') return toIsoWeek(parseIsoDate(day)!);\n return day;\n }\n\n /** 日历选了一天:换回 granularity 的形式;带时间的保留原来的时间,没有时补 00:00 */\n function pickDay(day: DateInput | null) {\n if (day == null) return;\n if (typeof day !== 'string') {\n // 空值按 dateValue 写回时日历给的是 CalendarDate:带时间的粒度要 CalendarDateTime,\n // 选周时换成那一周的周一\n if (granularity === 'week') pickPeriod(periodOf(toIsoDate(day)));\n else value = (hasTime() && !('hour' in day) ? toCalendarDateTime(day) : day) as V;\n return;\n }\n if (!hasTime()) value = periodOf(day) as V;\n else {\n const time = typeof value === 'string' && value.length > 10 ? value.slice(10) : undefined;\n value = `${day}${time ?? (granularity === 'second' ? 'T00:00:00' : 'T00:00')}` as V;\n }\n }\n\n /** 季度面板、选周的日历给的 'YYYY-Qn' / 'YYYY-Www':和当前值同一种类型写回(DateValue 时是这一段的第一天) */\n function pickPeriod(iso: string | null) {\n if (iso != null) value = isoToValue(iso, value ?? undefined, granularity, valueType) as V;\n }\n\n // 选周:已选那一周的另外六天带浅色底(日历只把周一当作已选的那一格)\n const weekCellButton = (date: string) => {\n const week = typeof value === 'string' ? value : value != null ? toIsoWeek(value) : null;\n const day = parseIsoDate(date);\n const inWeek = week != null && day != null && toIsoWeek(day) === week;\n return inWeek && date !== fullIsoDay(week) ? { sx: datePickerStyles.inWeek } : {};\n };\n\n /** “今天”按钮的文字:按粒度是今年、本季度、本月、本周或今天 */\n function todayLabel(): string {\n const labels: Partial<Record<typeof granularity, string>> = {\n year: lang.dateRangePreset.thisYear,\n quarter: lang.datePickerThisQuarter,\n month: lang.dateRangePreset.thisMonth,\n week: lang.dateRangePreset.thisWeek,\n };\n return labels[granularity] ?? lang.dateRangePreset.today;\n }\n\n function picked(event?: Event) {\n setOpen(false, 'select', event);\n // 带时间时接着输入时间:焦点去“时”那一段(关闭后的归还焦点只在焦点丢失时生效,不会抢回去)\n if (hasTime()) picker.anchor?.querySelector<HTMLElement>('[data-type=\"hour\"]')?.focus();\n }\n\n return () => (\n <>\n <DateField\n {...rest}\n _value={value}\n granularity={granularity}\n valueType={valueType}\n min={min}\n max={max}\n isDateUnavailable={isDateUnavailable}\n id={id}\n disabled={disabled}\n readonly={readonly}\n invalid={invalid}\n required={required}\n onKeydown={(event) => {\n onKeydown?.(event);\n picker.onKeydown(event);\n }}\n propsRoot={mergePartProps<PartProps<'div'>>({}, propsRoot, { ref: picker.anchorRef })}\n suffix={picker.button(CalendarDays, propsButton)}\n />\n {picker.panel(\n datePickerStyles.popover,\n propsPopover,\n open && [\n renderPickerPresets(\n presets.map((preset) => {\n const next = resolve(preset);\n return {\n key: preset.label,\n label: preset.label,\n active: sameValue(next, value),\n disabled: !selectable(next),\n onPick: () => {\n value = next;\n picked();\n },\n };\n }),\n lang.datePickerPresets,\n propsPresets,\n ),\n <div {...css.attrs(datePickerStyles.main)}>\n {granularity === 'quarter' ? (\n <QuarterCalendar\n _value={typeof value === 'string' || value == null ? value : toIsoQuarter(value)}\n onUpdate:_value={pickPeriod}\n min={min}\n max={max}\n aria-label={lang.datePickerOpen}\n onPick={() => picked()}\n />\n ) : (\n <Calendar<V>\n {...propsCalendar}\n // 这里的日历是单选:值是一天或空\n onUpdate:_value={(day) => pickDay(day as DateInput | null)}\n _value={calendarValue as V | null}\n granularity={dateUnitOf(granularity)}\n valueType={valueType}\n min={min}\n max={max}\n isDateUnavailable={isDateUnavailable}\n visibleMonths={visibleMonths}\n // 选周:按 ISO 8601 的周(周一开始)排,行首是第几周,与值 'YYYY-Www' 一致\n {...(granularity === 'week' && {\n firstDayOfWeek: 1,\n showWeekNumbers: true,\n propsCellButton: weekCellButton,\n })}\n onPick={() => picked()}\n />\n )}\n {showToday && (\n <div {...css.attrs(datePickerStyles.footer)}>\n <Button\n {...mergePartProps<ButtonProps>({ size: 'sm', variant: 'ghost' }, propsToday, {\n disabled: !selectable(periodOf(todayIso(locale.timeZone))),\n onClick: (event: MouseEvent) => {\n pickDay(todayIso(locale.timeZone));\n picked(event);\n },\n })}\n >\n {todayLabel()}\n </Button>\n </div>\n )}\n </div>,\n ],\n )}\n </>\n );\n },\n);\n"],"mappings":"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"}
@@ -15,8 +15,8 @@ import { dateUnitOf, isPeriodDisabled, isTimeGranularity, isoToValue, valueToIso
15
15
  import { QuarterCalendar } from "./QuarterCalendar.js";
16
16
  import { focusCalendar, renderPickerPresets, usePickerPopover } from "./picker-popover.js";
17
17
  import { RangeCalendar } from "./RangeCalendar.js";
18
- import { Fragment, computed, createTextVNode, createVNode, mergeProps, ref, shallowRef, useId, watch } from "vue";
19
- import { _component, bindable, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
18
+ import { Fragment, computed, createTextVNode, createVNode, ref, shallowRef, useId, watch } from "vue";
19
+ import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
20
20
  import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
21
21
  import { CalendarRange } from "@lucide/icons";
22
22
  //#region src/date/DateRangePicker.tsx
@@ -284,7 +284,7 @@ var DateRangePicker = /*#__PURE__*/ _component((_props, _ctx) => {
284
284
  ...state,
285
285
  invalid: bad
286
286
  });
287
- return createVNode(Fragment, null, [createVNode("div", mergeProps(mergeAttrs({
287
+ return createVNode(Fragment, null, [createVNode("div", mergeJsxProps(mergeAttrs({
288
288
  ...s.root,
289
289
  "aria-labelledby": defaultLabelledBy(rest, state.labelledBy)
290
290
  }, rest, {
@@ -312,7 +312,7 @@ var DateRangePicker = /*#__PURE__*/ _component((_props, _ctx) => {
312
312
  $stable: true
313
313
  }),
314
314
  group("start"),
315
- createVNode("span", mergeProps(mergeAttrs({ sx: dateRangePickerStyles.separator }, propsSeparator.value), { "aria-hidden": "true" }), [createTextVNode("–")]),
315
+ createVNode("span", mergeJsxProps(mergeAttrs({ sx: dateRangePickerStyles.separator }, propsSeparator.value), { "aria-hidden": "true" }), [createTextVNode("–")]),
316
316
  group("end"),
317
317
  clearable.value && filled && editable() && controlClear(s, propsClear.value, clear),
318
318
  picker.button(CalendarRange, propsButton.value),
@@ -348,7 +348,7 @@ var DateRangePicker = /*#__PURE__*/ _component((_props, _ctx) => {
348
348
  "max": max.value,
349
349
  "aria-label": lang.datePickerOpen,
350
350
  "onPick": _cache[0] || (_cache[0] = () => setOpen(false, "select"))
351
- }, null) : createVNode(RangeCalendar, mergeProps(propsCalendar.value, {
351
+ }, null) : createVNode(RangeCalendar, mergeJsxProps(propsCalendar.value, {
352
352
  "onUpdate:_value": pickRange,
353
353
  "_value": calendarRange(),
354
354
  "granularity": dateUnitOf(granularity.value),
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangePicker.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_vue_shallowRef","_vue_ref","_createVNode","_Fragment","_mergeProps","_createTextVNode"],"sources":["../../src/date/DateRangePicker.tsx"],"sourcesContent":["/**\n * 日期区间选择器:一个输入框里两组分段(开始 – 结束),按钮弹出区间日历,旁边可以放快捷区间(最近 7 天、本月……)。\n * 参考 React Aria DateRangePicker(同一个外壳里两组 DateInput)、Ant Design RangePicker 的 presets。\n *\n * <Field label=\"统计区间\"><DateRangePicker _value={range} max={today} presets={['last7Days', 'thisMonth']} /></Field>\n * <DateRangePicker granularity=\"month\" _value={months} aria-label=\"预算期间\" /> // { start: '2026-01', end: '2026-06' }\n * <DateRangePicker granularity=\"minute\" _value={window} aria-label=\"维护窗口\" /> // '2026-10-24T22:00' – '2026-10-25T06:00'\n *\n * 值是 `{ start, end }`(两端都含;ISO 字符串或 DateValue,写回时保持同一种类型),两端都填好才写回,删掉一段写回 null。\n * granularity 同 DateField:month、year 按月、按年(日历选整月、整年),quarter 弹出季度面板选一段季度,\n * week 按 ISO 周(日历周一开始、行首是周数),hour / minute / second 是日期时间区间\n * (日历里选日期,开始补 00:00、结束补 23:59,已经填了的时间不变)。\n * 结束早于开始、超出范围、是不可选的日期时外壳显示出错,值照样写回,由表单校验决定能不能提交。\n * 开始那组刚填全时焦点自动进结束那组;日历里点开始、再点结束后关闭,焦点回到按钮。Esc、点外部关闭,分段里 Alt + ↓ 打开。\n *\n * 部件:Root(外壳,role=\"group\",主元素)、Start / End(两组分段)、Separator、Clear、Button、Popover、Presets、Calendar。\n */\nimport { CalendarRange } 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, watch } from 'vue';\nimport type { PresetIconButtonProps } from '../base/CloseButton';\nimport { VisuallyHidden } from '../base/VisuallyHidden';\nimport { useLang } from '../config/context';\nimport { useFieldControl } from '../form/Field';\nimport { FormValue } from '../form/FormValue';\nimport {\n controlClear,\n controlParts,\n focusOnShell,\n controlIcon,\n useControlAppearance,\n type ControlIconOptions,\n type ControlOptions,\n} from '../input/control';\nimport {\n clampDate,\n fullIsoDay,\n lastIsoDay,\n parseIsoDate,\n presetIsoRange,\n toIsoDate,\n toIsoQuarter,\n toIsoWeek,\n type DateRange,\n type DateRangePreset,\n} from '../utils/data/date';\nimport { toElement } from '../utils/dom/element';\nimport { openSetter, type OpenChangeProps } from '../utils/dom/open-change';\nimport { defaultLabelledBy, mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport {\n toDateLimits,\n useDateLocale,\n type DateInput,\n type DateLimitProps,\n type DateValueTypes,\n} from './date-locale';\nimport { segmentFields, type DateFieldGranularity } from './date-segments';\nimport {\n dateUnitOf,\n isoToValue,\n isPeriodDisabled,\n isTimeGranularity,\n valueToIso,\n} from './DateField';\nimport { DateSegmentGroup, type DateSegmentGroupProps } from './DateSegmentGroup';\nimport {\n focusCalendar,\n renderPickerPresets,\n usePickerPopover,\n type PickerPopoverParts,\n} from './picker-popover';\nimport { QuarterCalendar } from './QuarterCalendar';\nimport { RangeCalendar, type RangeCalendarProps } from './RangeCalendar';\nimport { firstSegmentOf, segmentedFieldStyles, useFieldSegments } from './SegmentedField';\n\n/** 自定义的快捷区间(财年、上个结算周期) */\nexport interface DateRangeCustomPreset<V extends DateInput = string> {\n /** 按钮上的文字 */\n label: string;\n /** 区间;函数时每次打开按当时算(跟着今天变) */\n value: DateRange<V> | (() => DateRange<V>);\n}\n\n/** 未声明的属性落到外壳(role=\"group\")上 */\nexport interface DateRangePickerProps<V extends DateInput = string>\n extends\n PartProps<'div', 'role'>,\n ControlOptions,\n ControlIconOptions,\n DateLimitProps,\n PickerPopoverParts,\n OpenChangeProps {\n /** 区间(两端都含):父级写 _value={x};没填全时 null */\n _value?: DateRange<V> | null;\n /** 弹层是否打开:父级可写 _open={x} */\n _open?: boolean;\n /** 值为空、推不出类型时写回哪一种,默认 iso(字符串) */\n valueType?: keyof DateValueTypes;\n /** 精确到哪一段(同 DateField),默认 day;month、year 按月、按年,hour / minute / second 是日期时间区间 */\n granularity?: DateFieldGranularity;\n /**\n * 快捷区间,显示在日历旁边、夹到 min–max 之内:内置的名字(按今天与语言的一周第一天算),\n * 或自己的 `{ label, value }`(value 可以是函数,每次打开时按当时算)\n */\n presets?: readonly (DateRangePreset | DateRangeCustomPreset<V>)[];\n /** 日历并排显示几个月,默认 2 */\n visibleMonths?: number;\n /** 区间里允许夹着不可选的日期,默认 false */\n allowsUnavailableInRange?: boolean;\n /** 不可用 */\n disabled?: boolean;\n /** 只读 */\n readonly?: boolean;\n /** 必填 */\n required?: boolean;\n /** 校验未通过;不写时结束早于开始、超出范围、是不可选的日期也算 */\n invalid?: boolean;\n /** 有值时显示清空按钮 */\n clearable?: boolean;\n /** 表单提交时开始日期的 name(ISO 字符串) */\n startName?: string;\n /** 表单提交时结束日期的 name */\n endName?: string;\n /** 开始那组分段的部件属性 */\n propsStart?: Partial<DateSegmentGroupProps>;\n /** 结束那组分段的部件属性 */\n propsEnd?: Partial<DateSegmentGroupProps>;\n /** 两组之间的分隔符的部件属性 */\n propsSeparator?: PartProps<'span', 'aria-hidden'>;\n /** 清空按钮的部件属性 */\n propsClear?: Omit<Partial<PresetIconButtonProps>, 'onClick'>;\n /** 快捷区间那一列的部件属性 */\n propsPresets?: PartProps<'div', 'role'>;\n /** 区间日历的部件属性(值、范围由选择器给出) */\n propsCalendar?: Omit<\n Partial<RangeCalendarProps<V>>,\n 'value' | 'min' | 'max' | 'isDateUnavailable' | 'valueType' | 'onPick'\n >;\n}\n\n/** DateRangePicker 的样式:separator、popover(快捷区间的样式见 pickerPresetStyles) */\nexport const dateRangePickerStyles = css.create({\n separator: { flexShrink: 0, paddingInline: '_xs', color: '_textMuted' },\n popover: { display: 'flex', alignItems: 'flex-start', gap: '_sm', padding: '_sm' },\n});\n\n/** 自定义快捷区间的值 → ISO 日期区间(DateValue 取年月日) */\nfunction isoRangeOf<V extends DateInput>(\n value: DateRange<V> | (() => DateRange<V>),\n): DateRange<string> {\n const range = typeof value === 'function' ? value() : value;\n const iso = (input: DateInput) =>\n typeof input === 'string' ? input.slice(0, 10) : toIsoDate(input);\n return { start: iso(range.start), end: iso(range.end) };\n}\n\n/** 日期区间选择器:两组分段 + 弹出的区间日历与快捷区间 */\nexport const DateRangePicker = _component(\n <V extends DateInput>({\n _value: value = _bindable<DateRange<V> | null>(null),\n _open: open = _bindable(false),\n onOpenChange,\n valueType,\n granularity = 'day',\n min,\n max,\n isDateUnavailable,\n presets,\n visibleMonths = 2,\n allowsUnavailableInRange = false,\n variant,\n size,\n radius,\n disabled,\n readonly,\n required,\n invalid,\n clearable = false,\n startName,\n endName,\n placement,\n id,\n propsStart,\n propsEnd,\n propsSeparator,\n propsClear,\n icon,\n propsIcon,\n propsButton,\n propsPopover,\n propsPresets,\n propsCalendar,\n ...rest\n }: DateRangePickerProps<V>) => {\n const lang = useLang();\n const locale = useDateLocale();\n const generatedId = useId();\n const appearance = useControlAppearance(() => ({ variant, size, radius }));\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }));\n const editable = () => !control().disabled && !control().readonly;\n const limits = _derived(toDateLimits(locale, { min, max, isDateUnavailable }));\n let startGroup = _state.raw<HTMLElement | null>(null);\n let endGroup = _state.raw<HTMLElement | null>(null);\n const setOpen = openSetter(\n () => open,\n (next) => (open = next),\n () => onOpenChange,\n );\n\n const picker = usePickerPopover(\n () => ({\n open,\n placement,\n editable: editable(),\n label: lang.datePickerOpen,\n size: appearance().size,\n }),\n { toggle: setOpen, shown: focusCalendar },\n );\n\n // 两端各自的 ISO 字符串(按 granularity 的形式):只填了一端时值仍是 null,这里记着填了的那一端\n const toIso = (date: DateInput) => valueToIso(date, granularity);\n let start = _state<string | null>(null);\n let end = _state<string | null>(null);\n // 自己写回的值不再同步回两端(否则删掉一端时,写回的 null 会把另一端也清掉)\n let written: DateRange<V> | null | undefined;\n // 值清空后再填:仍按清空前的类型写回\n let lastLike: V | undefined;\n watch(\n () => value,\n (next) => {\n if (next === written) return;\n start = next ? toIso(next.start) : null;\n end = next ? toIso(next.end) : null;\n },\n { immediate: true },\n );\n\n function commit() {\n lastLike = value?.start ?? lastLike;\n const like = (iso: string) => isoToValue(iso, lastLike, granularity, valueType) as V;\n written = start && end ? { start: like(start), end: like(end) } : null;\n if (written !== null || value !== null) value = written;\n }\n\n const startSegments = useFieldSegments(\n () => ({ fields: segmentFields(granularity), value: start, readonly: !editable() }),\n (iso) => {\n start = iso;\n commit();\n },\n // 开始那组最后一段输入满了:焦点进结束那组\n (direction) => direction === 1 && firstSegmentOf(endGroup)?.focus(),\n );\n const endSegments = useFieldSegments(\n () => ({ fields: segmentFields(granularity), value: end, readonly: !editable() }),\n (iso) => {\n end = iso;\n commit();\n },\n // 结束那组第一段删空后再删:回到开始那组的最后一段\n (direction) => {\n if (direction !== -1) return;\n const segments = startGroup?.querySelectorAll<HTMLElement>('[role=\"spinbutton\"]');\n segments?.[segments.length - 1]?.focus();\n },\n );\n\n const outOfRange = (iso: string | null) =>\n iso != null && isPeriodDisabled(iso, granularity, limits, locale);\n\n /** 整天的区间 → 按 granularity 的形式:月、年截短;带时间时开始补 00:00、结束补 23:59(已经填了的时间不变) */\n function fromDays(range: DateRange<string>): DateRange<string> {\n if (granularity === 'year')\n return { start: range.start.slice(0, 4), end: range.end.slice(0, 4) };\n if (granularity === 'month')\n return { start: range.start.slice(0, 7), end: range.end.slice(0, 7) };\n if (granularity === 'quarter' || granularity === 'week') {\n const period = granularity === 'quarter' ? toIsoQuarter : toIsoWeek;\n return {\n start: period(parseIsoDate(range.start)!),\n end: period(parseIsoDate(range.end)!),\n };\n }\n if (!isTimeGranularity(granularity)) return range;\n const timeOf = (iso: string | null, fallback: string) =>\n iso != null && iso.length > 10 ? iso.slice(10) : fallback;\n const endTime = { hour: 'T23:00', minute: 'T23:59', second: 'T23:59:59' }[granularity];\n return {\n start: range.start + timeOf(start, granularity === 'second' ? 'T00:00:00' : 'T00:00'),\n end: range.end + timeOf(end, endTime),\n };\n }\n\n // 区间日历用整天的 ISO 日期:按月、按年、按周时是整段(开始那段的第一天到结束那段的最后一天)\n const calendarRange = (): DateRange<string> | null =>\n start == null || end == null ? null : { start: fullIsoDay(start), end: lastIsoDay(end) };\n\n /** 季度面板选好了区间('YYYY-Qn') */\n function pickQuarters(range: DateRange<string> | null) {\n if (range == null) return;\n start = range.start;\n end = range.end;\n commit();\n }\n\n /** 日历选好了区间:换回 granularity 的形式;带时间时焦点去开始的“时”接着输入 */\n function pickRange(range: DateRange<string> | null) {\n if (range == null) return;\n const next = fromDays(range);\n start = next.start;\n end = next.end;\n commit();\n }\n\n function clear() {\n startSegments.clear();\n endSegments.clear();\n start = null;\n end = null;\n commit();\n firstSegmentOf(startGroup)?.focus();\n }\n\n /** 点外壳空白处:开始没填全时去开始那组,否则去结束那组 */\n const firstEmpty = () =>\n start == null ? firstSegmentOf(startGroup) : firstSegmentOf(endGroup);\n\n /** 快捷区间夹到 min–max 之内:今天之后不能选时,“本月”就是本月 1 日到今天 */\n function presetValue(preset: DateRangePreset | DateRangeCustomPreset<V>): DateRange<string> {\n const range =\n typeof preset === 'string'\n ? presetIsoRange(preset, locale.week, locale.timeZone)\n : isoRangeOf(preset.value);\n const clamp = (iso: string) => toIsoDate(clampDate(parseIsoDate(iso)!, limits));\n return { start: clamp(range.start), end: clamp(range.end) };\n }\n\n function pickPreset(preset: DateRangePreset | DateRangeCustomPreset<V>) {\n const range = fromDays(presetValue(preset));\n start = range.start;\n end = range.end;\n commit();\n setOpen(false, 'select');\n }\n\n return () => {\n const state = control();\n const base = state.id ?? generatedId;\n const ids = { start: `${base}-start-label`, end: `${base}-end-label` };\n const reversed = start != null && end != null && end < start;\n const bad = state.invalid || reversed || outOfRange(start) || outOfRange(end);\n const filled = start != null || end != null || startSegments.partial || endSegments.partial;\n // 两组的名称:字段的标签 + “开始日期” / “结束日期”\n const labelledBy = (own: string) => [state.labelledBy, own].filter(Boolean).join(' ');\n const group = (side: 'start' | 'end') => {\n const isStart = side === 'start';\n return (\n <DateSegmentGroup\n {...mergePartProps<DateSegmentGroupProps>(\n {\n // 开始那组按内容宽,结束那组占满剩下的宽度:读起来是“开始 – 结束”,空白在最后\n sx: isStart ? undefined : segmentedFieldStyles.input,\n segments: isStart ? startSegments : endSegments,\n labelledBy: labelledBy(ids[side]),\n describedBy: state.describedBy,\n },\n isStart ? propsStart : propsEnd,\n {\n ref: (element: unknown) => {\n const found = toElement(element);\n if (isStart) startGroup = found;\n else endGroup = found;\n },\n id: isStart ? base : `${base}-end`,\n segments: isStart ? startSegments : endSegments,\n disabled: state.disabled,\n readonly: state.readonly,\n required: state.required,\n invalid: bad,\n onKeydown: picker.onKeydown,\n },\n )}\n />\n );\n };\n const s = controlParts(appearance(), { ...state, invalid: bad });\n return (\n <>\n <div\n {...mergeAttrs<'div'>(\n {\n ...s.root,\n 'aria-labelledby': defaultLabelledBy(rest, state.labelledBy),\n },\n rest,\n {\n ref: picker.anchorRef,\n role: 'group',\n 'aria-disabled': state.disabled || undefined,\n onPointerdown: state.disabled ? undefined : focusOnShell(firstEmpty),\n },\n )}\n data-invalid={bad || undefined}\n data-disabled={state.disabled || undefined}\n >\n {controlIcon(s, icon, propsIcon)}\n <VisuallyHidden id={ids.start}>{lang.dateRangeStart}</VisuallyHidden>\n <VisuallyHidden id={ids.end}>{lang.dateRangeEnd}</VisuallyHidden>\n {group('start')}\n <span\n {...mergeAttrs<'span'>({ sx: dateRangePickerStyles.separator }, propsSeparator)}\n aria-hidden=\"true\"\n >\n –\n </span>\n {group('end')}\n {clearable && filled && editable() && controlClear(s, propsClear, clear)}\n {picker.button(CalendarRange, propsButton)}\n <FormValue name={startName} value={start} disabled={state.disabled} />\n <FormValue name={endName} value={end} disabled={state.disabled} />\n </div>\n {picker.panel(\n dateRangePickerStyles.popover,\n propsPopover,\n open && [\n renderPickerPresets(\n (presets ?? []).map((preset) => {\n const range = presetValue(preset);\n return {\n key: typeof preset === 'string' ? preset : preset.label,\n label: typeof preset === 'string' ? lang.dateRangePreset[preset] : preset.label,\n active: (() => {\n const shown = fromDays(range);\n return shown.start === start && shown.end === end;\n })(),\n onPick: () => pickPreset(preset),\n };\n }),\n lang.dateRangePresets,\n propsPresets,\n ),\n granularity === 'quarter' ? (\n <QuarterCalendar\n mode=\"range\"\n _value={start != null && end != null ? { start, end } : null}\n onUpdate:_value={pickQuarters}\n min={min}\n max={max}\n aria-label={lang.datePickerOpen}\n onPick={() => setOpen(false, 'select')}\n />\n ) : (\n <RangeCalendar\n {...propsCalendar}\n onUpdate:_value={pickRange}\n _value={calendarRange()}\n granularity={dateUnitOf(granularity)}\n min={min}\n max={max}\n isDateUnavailable={isDateUnavailable}\n visibleMonths={visibleMonths}\n allowsUnavailableInRange={allowsUnavailableInRange}\n // 按周:按 ISO 8601 的周排(周一开始),行首是第几周\n {...(granularity === 'week' && { firstDayOfWeek: 1, showWeekNumbers: true })}\n onPick={() => {\n setOpen(false, 'select');\n // 带时间时接着输入时间:焦点去开始那组的“时”\n if (isTimeGranularity(granularity))\n startGroup?.querySelector<HTMLElement>('[data-type=\"hour\"]')?.focus();\n }}\n />\n ),\n ],\n )}\n </>\n );\n };\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"DateRangePicker.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_computed","_vue_shallowRef","_vue_ref","_createVNode","_Fragment","_mergeProps","_createTextVNode"],"sources":["../../src/date/DateRangePicker.tsx"],"sourcesContent":["/**\n * 日期区间选择器:一个输入框里两组分段(开始 – 结束),按钮弹出区间日历,旁边可以放快捷区间(最近 7 天、本月……)。\n * 参考 React Aria DateRangePicker(同一个外壳里两组 DateInput)、Ant Design RangePicker 的 presets。\n *\n * <Field label=\"统计区间\"><DateRangePicker _value={range} max={today} presets={['last7Days', 'thisMonth']} /></Field>\n * <DateRangePicker granularity=\"month\" _value={months} aria-label=\"预算期间\" /> // { start: '2026-01', end: '2026-06' }\n * <DateRangePicker granularity=\"minute\" _value={window} aria-label=\"维护窗口\" /> // '2026-10-24T22:00' – '2026-10-25T06:00'\n *\n * 值是 `{ start, end }`(两端都含;ISO 字符串或 DateValue,写回时保持同一种类型),两端都填好才写回,删掉一段写回 null。\n * granularity 同 DateField:month、year 按月、按年(日历选整月、整年),quarter 弹出季度面板选一段季度,\n * week 按 ISO 周(日历周一开始、行首是周数),hour / minute / second 是日期时间区间\n * (日历里选日期,开始补 00:00、结束补 23:59,已经填了的时间不变)。\n * 结束早于开始、超出范围、是不可选的日期时外壳显示出错,值照样写回,由表单校验决定能不能提交。\n * 开始那组刚填全时焦点自动进结束那组;日历里点开始、再点结束后关闭,焦点回到按钮。Esc、点外部关闭,分段里 Alt + ↓ 打开。\n *\n * 部件:Root(外壳,role=\"group\",主元素)、Start / End(两组分段)、Separator、Clear、Button、Popover、Presets、Calendar。\n */\nimport { CalendarRange } 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, watch } from 'vue';\nimport type { PresetIconButtonProps } from '../base/CloseButton';\nimport { VisuallyHidden } from '../base/VisuallyHidden';\nimport { useLang } from '../config/context';\nimport { useFieldControl } from '../form/Field';\nimport { FormValue } from '../form/FormValue';\nimport {\n controlClear,\n controlParts,\n focusOnShell,\n controlIcon,\n useControlAppearance,\n type ControlIconOptions,\n type ControlOptions,\n} from '../input/control';\nimport {\n clampDate,\n fullIsoDay,\n lastIsoDay,\n parseIsoDate,\n presetIsoRange,\n toIsoDate,\n toIsoQuarter,\n toIsoWeek,\n type DateRange,\n type DateRangePreset,\n} from '../utils/data/date';\nimport { toElement } from '../utils/dom/element';\nimport { openSetter, type OpenChangeProps } from '../utils/dom/open-change';\nimport { defaultLabelledBy, mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport {\n toDateLimits,\n useDateLocale,\n type DateInput,\n type DateLimitProps,\n type DateValueTypes,\n} from './date-locale';\nimport { segmentFields, type DateFieldGranularity } from './date-segments';\nimport {\n dateUnitOf,\n isoToValue,\n isPeriodDisabled,\n isTimeGranularity,\n valueToIso,\n} from './DateField';\nimport { DateSegmentGroup, type DateSegmentGroupProps } from './DateSegmentGroup';\nimport {\n focusCalendar,\n renderPickerPresets,\n usePickerPopover,\n type PickerPopoverParts,\n} from './picker-popover';\nimport { QuarterCalendar } from './QuarterCalendar';\nimport { RangeCalendar, type RangeCalendarProps } from './RangeCalendar';\nimport { firstSegmentOf, segmentedFieldStyles, useFieldSegments } from './SegmentedField';\n\n/** 自定义的快捷区间(财年、上个结算周期) */\nexport interface DateRangeCustomPreset<V extends DateInput = string> {\n /** 按钮上的文字 */\n label: string;\n /** 区间;函数时每次打开按当时算(跟着今天变) */\n value: DateRange<V> | (() => DateRange<V>);\n}\n\n/** 未声明的属性落到外壳(role=\"group\")上 */\nexport interface DateRangePickerProps<V extends DateInput = string>\n extends\n PartProps<'div', 'role'>,\n ControlOptions,\n ControlIconOptions,\n DateLimitProps,\n PickerPopoverParts,\n OpenChangeProps {\n /** 区间(两端都含):父级写 _value={x};没填全时 null */\n _value?: DateRange<V> | null;\n /** 弹层是否打开:父级可写 _open={x} */\n _open?: boolean;\n /** 值为空、推不出类型时写回哪一种,默认 iso(字符串) */\n valueType?: keyof DateValueTypes;\n /** 精确到哪一段(同 DateField),默认 day;month、year 按月、按年,hour / minute / second 是日期时间区间 */\n granularity?: DateFieldGranularity;\n /**\n * 快捷区间,显示在日历旁边、夹到 min–max 之内:内置的名字(按今天与语言的一周第一天算),\n * 或自己的 `{ label, value }`(value 可以是函数,每次打开时按当时算)\n */\n presets?: readonly (DateRangePreset | DateRangeCustomPreset<V>)[];\n /** 日历并排显示几个月,默认 2 */\n visibleMonths?: number;\n /** 区间里允许夹着不可选的日期,默认 false */\n allowsUnavailableInRange?: boolean;\n /** 不可用 */\n disabled?: boolean;\n /** 只读 */\n readonly?: boolean;\n /** 必填 */\n required?: boolean;\n /** 校验未通过;不写时结束早于开始、超出范围、是不可选的日期也算 */\n invalid?: boolean;\n /** 有值时显示清空按钮 */\n clearable?: boolean;\n /** 表单提交时开始日期的 name(ISO 字符串) */\n startName?: string;\n /** 表单提交时结束日期的 name */\n endName?: string;\n /** 开始那组分段的部件属性 */\n propsStart?: Partial<DateSegmentGroupProps>;\n /** 结束那组分段的部件属性 */\n propsEnd?: Partial<DateSegmentGroupProps>;\n /** 两组之间的分隔符的部件属性 */\n propsSeparator?: PartProps<'span', 'aria-hidden'>;\n /** 清空按钮的部件属性 */\n propsClear?: Omit<Partial<PresetIconButtonProps>, 'onClick'>;\n /** 快捷区间那一列的部件属性 */\n propsPresets?: PartProps<'div', 'role'>;\n /** 区间日历的部件属性(值、范围由选择器给出) */\n propsCalendar?: Omit<\n Partial<RangeCalendarProps<V>>,\n 'value' | 'min' | 'max' | 'isDateUnavailable' | 'valueType' | 'onPick'\n >;\n}\n\n/** DateRangePicker 的样式:separator、popover(快捷区间的样式见 pickerPresetStyles) */\nexport const dateRangePickerStyles = css.create({\n separator: { flexShrink: 0, paddingInline: '_xs', color: '_textMuted' },\n popover: { display: 'flex', alignItems: 'flex-start', gap: '_sm', padding: '_sm' },\n});\n\n/** 自定义快捷区间的值 → ISO 日期区间(DateValue 取年月日) */\nfunction isoRangeOf<V extends DateInput>(\n value: DateRange<V> | (() => DateRange<V>),\n): DateRange<string> {\n const range = typeof value === 'function' ? value() : value;\n const iso = (input: DateInput) =>\n typeof input === 'string' ? input.slice(0, 10) : toIsoDate(input);\n return { start: iso(range.start), end: iso(range.end) };\n}\n\n/** 日期区间选择器:两组分段 + 弹出的区间日历与快捷区间 */\nexport const DateRangePicker = _component(\n <V extends DateInput>({\n _value: value = _bindable<DateRange<V> | null>(null),\n _open: open = _bindable(false),\n onOpenChange,\n valueType,\n granularity = 'day',\n min,\n max,\n isDateUnavailable,\n presets,\n visibleMonths = 2,\n allowsUnavailableInRange = false,\n variant,\n size,\n radius,\n disabled,\n readonly,\n required,\n invalid,\n clearable = false,\n startName,\n endName,\n placement,\n id,\n propsStart,\n propsEnd,\n propsSeparator,\n propsClear,\n icon,\n propsIcon,\n propsButton,\n propsPopover,\n propsPresets,\n propsCalendar,\n ...rest\n }: DateRangePickerProps<V>) => {\n const lang = useLang();\n const locale = useDateLocale();\n const generatedId = useId();\n const appearance = useControlAppearance(() => ({ variant, size, radius }));\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }));\n const editable = () => !control().disabled && !control().readonly;\n const limits = _derived(toDateLimits(locale, { min, max, isDateUnavailable }));\n let startGroup = _state.raw<HTMLElement | null>(null);\n let endGroup = _state.raw<HTMLElement | null>(null);\n const setOpen = openSetter(\n () => open,\n (next) => (open = next),\n () => onOpenChange,\n );\n\n const picker = usePickerPopover(\n () => ({\n open,\n placement,\n editable: editable(),\n label: lang.datePickerOpen,\n size: appearance().size,\n }),\n { toggle: setOpen, shown: focusCalendar },\n );\n\n // 两端各自的 ISO 字符串(按 granularity 的形式):只填了一端时值仍是 null,这里记着填了的那一端\n const toIso = (date: DateInput) => valueToIso(date, granularity);\n let start = _state<string | null>(null);\n let end = _state<string | null>(null);\n // 自己写回的值不再同步回两端(否则删掉一端时,写回的 null 会把另一端也清掉)\n let written: DateRange<V> | null | undefined;\n // 值清空后再填:仍按清空前的类型写回\n let lastLike: V | undefined;\n watch(\n () => value,\n (next) => {\n if (next === written) return;\n start = next ? toIso(next.start) : null;\n end = next ? toIso(next.end) : null;\n },\n { immediate: true },\n );\n\n function commit() {\n lastLike = value?.start ?? lastLike;\n const like = (iso: string) => isoToValue(iso, lastLike, granularity, valueType) as V;\n written = start && end ? { start: like(start), end: like(end) } : null;\n if (written !== null || value !== null) value = written;\n }\n\n const startSegments = useFieldSegments(\n () => ({ fields: segmentFields(granularity), value: start, readonly: !editable() }),\n (iso) => {\n start = iso;\n commit();\n },\n // 开始那组最后一段输入满了:焦点进结束那组\n (direction) => direction === 1 && firstSegmentOf(endGroup)?.focus(),\n );\n const endSegments = useFieldSegments(\n () => ({ fields: segmentFields(granularity), value: end, readonly: !editable() }),\n (iso) => {\n end = iso;\n commit();\n },\n // 结束那组第一段删空后再删:回到开始那组的最后一段\n (direction) => {\n if (direction !== -1) return;\n const segments = startGroup?.querySelectorAll<HTMLElement>('[role=\"spinbutton\"]');\n segments?.[segments.length - 1]?.focus();\n },\n );\n\n const outOfRange = (iso: string | null) =>\n iso != null && isPeriodDisabled(iso, granularity, limits, locale);\n\n /** 整天的区间 → 按 granularity 的形式:月、年截短;带时间时开始补 00:00、结束补 23:59(已经填了的时间不变) */\n function fromDays(range: DateRange<string>): DateRange<string> {\n if (granularity === 'year')\n return { start: range.start.slice(0, 4), end: range.end.slice(0, 4) };\n if (granularity === 'month')\n return { start: range.start.slice(0, 7), end: range.end.slice(0, 7) };\n if (granularity === 'quarter' || granularity === 'week') {\n const period = granularity === 'quarter' ? toIsoQuarter : toIsoWeek;\n return {\n start: period(parseIsoDate(range.start)!),\n end: period(parseIsoDate(range.end)!),\n };\n }\n if (!isTimeGranularity(granularity)) return range;\n const timeOf = (iso: string | null, fallback: string) =>\n iso != null && iso.length > 10 ? iso.slice(10) : fallback;\n const endTime = { hour: 'T23:00', minute: 'T23:59', second: 'T23:59:59' }[granularity];\n return {\n start: range.start + timeOf(start, granularity === 'second' ? 'T00:00:00' : 'T00:00'),\n end: range.end + timeOf(end, endTime),\n };\n }\n\n // 区间日历用整天的 ISO 日期:按月、按年、按周时是整段(开始那段的第一天到结束那段的最后一天)\n const calendarRange = (): DateRange<string> | null =>\n start == null || end == null ? null : { start: fullIsoDay(start), end: lastIsoDay(end) };\n\n /** 季度面板选好了区间('YYYY-Qn') */\n function pickQuarters(range: DateRange<string> | null) {\n if (range == null) return;\n start = range.start;\n end = range.end;\n commit();\n }\n\n /** 日历选好了区间:换回 granularity 的形式;带时间时焦点去开始的“时”接着输入 */\n function pickRange(range: DateRange<string> | null) {\n if (range == null) return;\n const next = fromDays(range);\n start = next.start;\n end = next.end;\n commit();\n }\n\n function clear() {\n startSegments.clear();\n endSegments.clear();\n start = null;\n end = null;\n commit();\n firstSegmentOf(startGroup)?.focus();\n }\n\n /** 点外壳空白处:开始没填全时去开始那组,否则去结束那组 */\n const firstEmpty = () =>\n start == null ? firstSegmentOf(startGroup) : firstSegmentOf(endGroup);\n\n /** 快捷区间夹到 min–max 之内:今天之后不能选时,“本月”就是本月 1 日到今天 */\n function presetValue(preset: DateRangePreset | DateRangeCustomPreset<V>): DateRange<string> {\n const range =\n typeof preset === 'string'\n ? presetIsoRange(preset, locale.week, locale.timeZone)\n : isoRangeOf(preset.value);\n const clamp = (iso: string) => toIsoDate(clampDate(parseIsoDate(iso)!, limits));\n return { start: clamp(range.start), end: clamp(range.end) };\n }\n\n function pickPreset(preset: DateRangePreset | DateRangeCustomPreset<V>) {\n const range = fromDays(presetValue(preset));\n start = range.start;\n end = range.end;\n commit();\n setOpen(false, 'select');\n }\n\n return () => {\n const state = control();\n const base = state.id ?? generatedId;\n const ids = { start: `${base}-start-label`, end: `${base}-end-label` };\n const reversed = start != null && end != null && end < start;\n const bad = state.invalid || reversed || outOfRange(start) || outOfRange(end);\n const filled = start != null || end != null || startSegments.partial || endSegments.partial;\n // 两组的名称:字段的标签 + “开始日期” / “结束日期”\n const labelledBy = (own: string) => [state.labelledBy, own].filter(Boolean).join(' ');\n const group = (side: 'start' | 'end') => {\n const isStart = side === 'start';\n return (\n <DateSegmentGroup\n {...mergePartProps<DateSegmentGroupProps>(\n {\n // 开始那组按内容宽,结束那组占满剩下的宽度:读起来是“开始 – 结束”,空白在最后\n sx: isStart ? undefined : segmentedFieldStyles.input,\n segments: isStart ? startSegments : endSegments,\n labelledBy: labelledBy(ids[side]),\n describedBy: state.describedBy,\n },\n isStart ? propsStart : propsEnd,\n {\n ref: (element: unknown) => {\n const found = toElement(element);\n if (isStart) startGroup = found;\n else endGroup = found;\n },\n id: isStart ? base : `${base}-end`,\n segments: isStart ? startSegments : endSegments,\n disabled: state.disabled,\n readonly: state.readonly,\n required: state.required,\n invalid: bad,\n onKeydown: picker.onKeydown,\n },\n )}\n />\n );\n };\n const s = controlParts(appearance(), { ...state, invalid: bad });\n return (\n <>\n <div\n {...mergeAttrs<'div'>(\n {\n ...s.root,\n 'aria-labelledby': defaultLabelledBy(rest, state.labelledBy),\n },\n rest,\n {\n ref: picker.anchorRef,\n role: 'group',\n 'aria-disabled': state.disabled || undefined,\n onPointerdown: state.disabled ? undefined : focusOnShell(firstEmpty),\n },\n )}\n data-invalid={bad || undefined}\n data-disabled={state.disabled || undefined}\n >\n {controlIcon(s, icon, propsIcon)}\n <VisuallyHidden id={ids.start}>{lang.dateRangeStart}</VisuallyHidden>\n <VisuallyHidden id={ids.end}>{lang.dateRangeEnd}</VisuallyHidden>\n {group('start')}\n <span\n {...mergeAttrs<'span'>({ sx: dateRangePickerStyles.separator }, propsSeparator)}\n aria-hidden=\"true\"\n >\n –\n </span>\n {group('end')}\n {clearable && filled && editable() && controlClear(s, propsClear, clear)}\n {picker.button(CalendarRange, propsButton)}\n <FormValue name={startName} value={start} disabled={state.disabled} />\n <FormValue name={endName} value={end} disabled={state.disabled} />\n </div>\n {picker.panel(\n dateRangePickerStyles.popover,\n propsPopover,\n open && [\n renderPickerPresets(\n (presets ?? []).map((preset) => {\n const range = presetValue(preset);\n return {\n key: typeof preset === 'string' ? preset : preset.label,\n label: typeof preset === 'string' ? lang.dateRangePreset[preset] : preset.label,\n active: (() => {\n const shown = fromDays(range);\n return shown.start === start && shown.end === end;\n })(),\n onPick: () => pickPreset(preset),\n };\n }),\n lang.dateRangePresets,\n propsPresets,\n ),\n granularity === 'quarter' ? (\n <QuarterCalendar\n mode=\"range\"\n _value={start != null && end != null ? { start, end } : null}\n onUpdate:_value={pickQuarters}\n min={min}\n max={max}\n aria-label={lang.datePickerOpen}\n onPick={() => setOpen(false, 'select')}\n />\n ) : (\n <RangeCalendar\n {...propsCalendar}\n onUpdate:_value={pickRange}\n _value={calendarRange()}\n granularity={dateUnitOf(granularity)}\n min={min}\n max={max}\n isDateUnavailable={isDateUnavailable}\n visibleMonths={visibleMonths}\n allowsUnavailableInRange={allowsUnavailableInRange}\n // 按周:按 ISO 8601 的周排(周一开始),行首是第几周\n {...(granularity === 'week' && { firstDayOfWeek: 1, showWeekNumbers: true })}\n onPick={() => {\n setOpen(false, 'select');\n // 带时间时接着输入时间:焦点去开始那组的“时”\n if (isTimeGranularity(granularity))\n startGroup?.querySelector<HTMLElement>('[data-type=\"hour\"]')?.focus();\n }}\n />\n ),\n ],\n )}\n </>\n );\n };\n },\n);\n"],"mappings":"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"}