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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/dist/base/Badge.js +3 -3
  2. package/dist/base/Badge.js.map +1 -1
  3. package/dist/base/Can.d.ts +12 -0
  4. package/dist/base/Can.js +20 -0
  5. package/dist/base/Can.js.map +1 -0
  6. package/dist/base/ClientOnly.d.ts +10 -0
  7. package/dist/base/ClientOnly.js +18 -0
  8. package/dist/base/ClientOnly.js.map +1 -0
  9. package/dist/base/CloseButton.js +3 -3
  10. package/dist/base/CloseButton.js.map +1 -1
  11. package/dist/base/CodeBlock.js +5 -5
  12. package/dist/base/CodeBlock.js.map +1 -1
  13. package/dist/base/CopyButton.js +3 -3
  14. package/dist/base/CopyButton.js.map +1 -1
  15. package/dist/base/Icon.js +3 -3
  16. package/dist/base/Icon.js.map +1 -1
  17. package/dist/base/Indicator.js +3 -3
  18. package/dist/base/Indicator.js.map +1 -1
  19. package/dist/base/StatusDot.js +3 -3
  20. package/dist/base/StatusDot.js.map +1 -1
  21. package/dist/base/Tag.js +5 -5
  22. package/dist/base/Tag.js.map +1 -1
  23. package/dist/base/button-core.js +4 -4
  24. package/dist/base/button-core.js.map +1 -1
  25. package/dist/charts/AreaChart.js +3 -3
  26. package/dist/charts/AreaChart.js.map +1 -1
  27. package/dist/charts/BarChart.js +3 -3
  28. package/dist/charts/BarChart.js.map +1 -1
  29. package/dist/charts/ChordChart.js +3 -3
  30. package/dist/charts/ChordChart.js.map +1 -1
  31. package/dist/charts/ComboChart.js +3 -3
  32. package/dist/charts/ComboChart.js.map +1 -1
  33. package/dist/charts/DonutChart.js +3 -3
  34. package/dist/charts/DonutChart.js.map +1 -1
  35. package/dist/charts/FunnelChart.js +5 -5
  36. package/dist/charts/FunnelChart.js.map +1 -1
  37. package/dist/charts/GraphChart.js +3 -3
  38. package/dist/charts/GraphChart.js.map +1 -1
  39. package/dist/charts/LineChart.js +3 -3
  40. package/dist/charts/LineChart.js.map +1 -1
  41. package/dist/charts/MapChart.js +7 -7
  42. package/dist/charts/MapChart.js.map +1 -1
  43. package/dist/charts/RadarChart.js +16 -15
  44. package/dist/charts/RadarChart.js.map +1 -1
  45. package/dist/charts/SankeyChart.js +3 -3
  46. package/dist/charts/SankeyChart.js.map +1 -1
  47. package/dist/charts/ScatterChart.js +3 -3
  48. package/dist/charts/ScatterChart.js.map +1 -1
  49. package/dist/charts/TimelineChart.js +6 -5
  50. package/dist/charts/TimelineChart.js.map +1 -1
  51. package/dist/charts/TreemapChart.js +3 -3
  52. package/dist/charts/TreemapChart.js.map +1 -1
  53. package/dist/charts/WaterfallChart.js +3 -3
  54. package/dist/charts/WaterfallChart.js.map +1 -1
  55. package/dist/charts/XYChart.js +9 -7
  56. package/dist/charts/XYChart.js.map +1 -1
  57. package/dist/charts/frame.js +10 -8
  58. package/dist/charts/frame.js.map +1 -1
  59. package/dist/charts/single.js +4 -3
  60. package/dist/charts/single.js.map +1 -1
  61. package/dist/code-editor/CodeEditor.d.ts +18 -0
  62. package/dist/code-editor/CodeEditor.js +57 -0
  63. package/dist/code-editor/CodeEditor.js.map +1 -0
  64. package/dist/code-editor/editor.d.ts +52 -0
  65. package/dist/code-editor/editor.js +225 -0
  66. package/dist/code-editor/editor.js.map +1 -0
  67. package/dist/code-editor/index.d.ts +9 -0
  68. package/dist/code-editor/index.js +3 -0
  69. package/dist/config/Provider.d.ts +3 -1
  70. package/dist/config/Provider.js +9 -4
  71. package/dist/config/Provider.js.map +1 -1
  72. package/dist/config/context.d.ts +18 -0
  73. package/dist/config/context.js +16 -1
  74. package/dist/config/context.js.map +1 -1
  75. package/dist/config/createUi.d.ts +20 -3
  76. package/dist/config/createUi.js +80 -49
  77. package/dist/config/createUi.js.map +1 -1
  78. package/dist/config/lang/en-US.js +21 -3
  79. package/dist/config/lang/en-US.js.map +1 -1
  80. package/dist/config/lang/format.d.ts +2 -1
  81. package/dist/config/lang/format.js +9 -2
  82. package/dist/config/lang/format.js.map +1 -1
  83. package/dist/config/lang/lang.d.ts +19 -6
  84. package/dist/config/lang/lang.js +11 -2
  85. package/dist/config/lang/lang.js.map +1 -1
  86. package/dist/config/lang/zh-CN.js +21 -3
  87. package/dist/config/lang/zh-CN.js.map +1 -1
  88. package/dist/config/layout/preference.d.ts +43 -0
  89. package/dist/config/layout/preference.js +108 -0
  90. package/dist/config/layout/preference.js.map +1 -0
  91. package/dist/date/Calendar.js +3 -3
  92. package/dist/date/Calendar.js.map +1 -1
  93. package/dist/date/CalendarBoard.js +9 -9
  94. package/dist/date/CalendarBoard.js.map +1 -1
  95. package/dist/date/CalendarView.js +7 -7
  96. package/dist/date/CalendarView.js.map +1 -1
  97. package/dist/date/DateField.js +3 -3
  98. package/dist/date/DateField.js.map +1 -1
  99. package/dist/date/DatePicker.js +5 -5
  100. package/dist/date/DatePicker.js.map +1 -1
  101. package/dist/date/DateRangePicker.js +5 -5
  102. package/dist/date/DateRangePicker.js.map +1 -1
  103. package/dist/date/DateSegmentGroup.js +5 -5
  104. package/dist/date/DateSegmentGroup.js.map +1 -1
  105. package/dist/date/QuarterCalendar.js +6 -6
  106. package/dist/date/QuarterCalendar.js.map +1 -1
  107. package/dist/date/RangeCalendar.js +3 -3
  108. package/dist/date/RangeCalendar.js.map +1 -1
  109. package/dist/date/SegmentedField.js +3 -3
  110. package/dist/date/SegmentedField.js.map +1 -1
  111. package/dist/date/TimeField.js +3 -3
  112. package/dist/date/TimeField.js.map +1 -1
  113. package/dist/date/TimePicker.js +4 -4
  114. package/dist/date/TimePicker.js.map +1 -1
  115. package/dist/date/date-segments.js +1 -1
  116. package/dist/date/date-segments.js.map +1 -1
  117. package/dist/date/picker-popover.js +3 -2
  118. package/dist/date/picker-popover.js.map +1 -1
  119. package/dist/diagram/Diagram.js +12 -12
  120. package/dist/diagram/Diagram.js.map +1 -1
  121. package/dist/diagram/DiagramLanes.js +3 -3
  122. package/dist/diagram/DiagramLanes.js.map +1 -1
  123. package/dist/diagram/DiagramMinimap.js +4 -4
  124. package/dist/diagram/DiagramMinimap.js.map +1 -1
  125. package/dist/diagram/index.d.ts +2 -1
  126. package/dist/diagram/index.js +2 -1
  127. package/dist/diagram/layout.d.ts +57 -0
  128. package/dist/diagram/layout.js +50 -0
  129. package/dist/diagram/layout.js.map +1 -0
  130. package/dist/display/Accordion.js +6 -6
  131. package/dist/display/Accordion.js.map +1 -1
  132. package/dist/display/AnimatedNumber.js +4 -4
  133. package/dist/display/AnimatedNumber.js.map +1 -1
  134. package/dist/display/Avatar.js +4 -4
  135. package/dist/display/Avatar.js.map +1 -1
  136. package/dist/display/Checklist.js +7 -7
  137. package/dist/display/Checklist.js.map +1 -1
  138. package/dist/display/Collapse.js +8 -5
  139. package/dist/display/Collapse.js.map +1 -1
  140. package/dist/display/Collapsible.js +3 -3
  141. package/dist/display/Collapsible.js.map +1 -1
  142. package/dist/display/Descriptions.js +5 -5
  143. package/dist/display/Descriptions.js.map +1 -1
  144. package/dist/display/Ellipsis.js +3 -3
  145. package/dist/display/Ellipsis.js.map +1 -1
  146. package/dist/display/FieldCompare.js +4 -4
  147. package/dist/display/FieldCompare.js.map +1 -1
  148. package/dist/display/Gauge.js +11 -11
  149. package/dist/display/Gauge.js.map +1 -1
  150. package/dist/display/Image.js +4 -4
  151. package/dist/display/Image.js.map +1 -1
  152. package/dist/display/Marquee.js +3 -3
  153. package/dist/display/Marquee.js.map +1 -1
  154. package/dist/display/ProportionBar.js +4 -4
  155. package/dist/display/ProportionBar.js.map +1 -1
  156. package/dist/display/Sortable.js +4 -4
  157. package/dist/display/Sortable.js.map +1 -1
  158. package/dist/display/Sparkline.js +6 -6
  159. package/dist/display/Sparkline.js.map +1 -1
  160. package/dist/display/Stat.js +3 -3
  161. package/dist/display/Stat.js.map +1 -1
  162. package/dist/display/Timeline.js +7 -7
  163. package/dist/display/Timeline.js.map +1 -1
  164. package/dist/display/Tree.js +10 -10
  165. package/dist/display/Tree.js.map +1 -1
  166. package/dist/display/VirtualList.js +7 -7
  167. package/dist/display/VirtualList.js.map +1 -1
  168. package/dist/display/Watermark.js +3 -3
  169. package/dist/display/Watermark.js.map +1 -1
  170. package/dist/docs-kit/CodeGroup.js +5 -5
  171. package/dist/docs-kit/CodeGroup.js.map +1 -1
  172. package/dist/docs-kit/CodePreview.js +6 -6
  173. package/dist/docs-kit/CodePreview.js.map +1 -1
  174. package/dist/docs-kit/PropsTable.js +4 -4
  175. package/dist/docs-kit/PropsTable.js.map +1 -1
  176. package/dist/feedback/Alert.js +5 -5
  177. package/dist/feedback/Alert.js.map +1 -1
  178. package/dist/feedback/Banner.js +5 -5
  179. package/dist/feedback/Banner.js.map +1 -1
  180. package/dist/feedback/Empty.js +4 -4
  181. package/dist/feedback/Empty.js.map +1 -1
  182. package/dist/feedback/LoadingBar.js +20 -13
  183. package/dist/feedback/LoadingBar.js.map +1 -1
  184. package/dist/feedback/LoadingOverlay.js +3 -3
  185. package/dist/feedback/LoadingOverlay.js.map +1 -1
  186. package/dist/feedback/Progress.js +14 -14
  187. package/dist/feedback/Progress.js.map +1 -1
  188. package/dist/feedback/Result.js +4 -4
  189. package/dist/feedback/Result.js.map +1 -1
  190. package/dist/feedback/SkeletonText.js +3 -3
  191. package/dist/feedback/SkeletonText.js.map +1 -1
  192. package/dist/feedback/Toast.js +6 -6
  193. package/dist/feedback/Toast.js.map +1 -1
  194. package/dist/form/Field.d.ts +7 -0
  195. package/dist/form/Field.js +20 -9
  196. package/dist/form/Field.js.map +1 -1
  197. package/dist/form/Form.js +3 -3
  198. package/dist/form/Form.js.map +1 -1
  199. package/dist/form/FormErrorSummary.js +3 -3
  200. package/dist/form/FormErrorSummary.js.map +1 -1
  201. package/dist/form/FormSection.js +6 -6
  202. package/dist/form/FormSection.js.map +1 -1
  203. package/dist/form/useForm.d.ts +4 -1
  204. package/dist/form/useForm.js +35 -13
  205. package/dist/form/useForm.js.map +1 -1
  206. package/dist/index.d.ts +18 -10
  207. package/dist/index.js +17 -9
  208. package/dist/input/Autocomplete.js +3 -3
  209. package/dist/input/Autocomplete.js.map +1 -1
  210. package/dist/input/Cascader.js +7 -7
  211. package/dist/input/Cascader.js.map +1 -1
  212. package/dist/input/CharacterCount.js +3 -3
  213. package/dist/input/CharacterCount.js.map +1 -1
  214. package/dist/input/Checkbox.js +5 -5
  215. package/dist/input/Checkbox.js.map +1 -1
  216. package/dist/input/ColorField.js +4 -4
  217. package/dist/input/ColorField.js.map +1 -1
  218. package/dist/input/Combobox.js +5 -5
  219. package/dist/input/Combobox.js.map +1 -1
  220. package/dist/input/ConditionBuilder.js +15 -14
  221. package/dist/input/ConditionBuilder.js.map +1 -1
  222. package/dist/input/FileDrop.js +3 -3
  223. package/dist/input/FileDrop.js.map +1 -1
  224. package/dist/input/Listbox.js +9 -9
  225. package/dist/input/Listbox.js.map +1 -1
  226. package/dist/input/Mentions.js +4 -4
  227. package/dist/input/Mentions.js.map +1 -1
  228. package/dist/input/NumberField.js +3 -3
  229. package/dist/input/NumberField.js.map +1 -1
  230. package/dist/input/NumberRangeField.js +5 -5
  231. package/dist/input/NumberRangeField.js.map +1 -1
  232. package/dist/input/OtpField.js +5 -5
  233. package/dist/input/OtpField.js.map +1 -1
  234. package/dist/input/PeoplePicker.js +6 -6
  235. package/dist/input/PeoplePicker.js.map +1 -1
  236. package/dist/input/PeoplePickerPanel.js +15 -15
  237. package/dist/input/PeoplePickerPanel.js.map +1 -1
  238. package/dist/input/Radio.js +4 -4
  239. package/dist/input/Radio.js.map +1 -1
  240. package/dist/input/Rating.js +5 -5
  241. package/dist/input/Rating.js.map +1 -1
  242. package/dist/input/Select.js +5 -5
  243. package/dist/input/Select.js.map +1 -1
  244. package/dist/input/SelectedTags.js +4 -4
  245. package/dist/input/SelectedTags.js.map +1 -1
  246. package/dist/input/Slider.js +6 -6
  247. package/dist/input/Slider.js.map +1 -1
  248. package/dist/input/Switch.js +3 -3
  249. package/dist/input/Switch.js.map +1 -1
  250. package/dist/input/TagsInput.js +5 -5
  251. package/dist/input/TagsInput.js.map +1 -1
  252. package/dist/input/TextField.js +5 -5
  253. package/dist/input/TextField.js.map +1 -1
  254. package/dist/input/Textarea.js +4 -4
  255. package/dist/input/Textarea.js.map +1 -1
  256. package/dist/input/ToggleGroup.js +4 -4
  257. package/dist/input/ToggleGroup.js.map +1 -1
  258. package/dist/input/Transfer.js +8 -8
  259. package/dist/input/Transfer.js.map +1 -1
  260. package/dist/input/TreeSelect.js +7 -7
  261. package/dist/input/TreeSelect.js.map +1 -1
  262. package/dist/input/Upload.js +10 -9
  263. package/dist/input/Upload.js.map +1 -1
  264. package/dist/input/condition.d.ts +1 -1
  265. package/dist/input/condition.js +32 -14
  266. package/dist/input/condition.js.map +1 -1
  267. package/dist/input/people.d.ts +15 -14
  268. package/dist/input/people.js +5 -5
  269. package/dist/input/people.js.map +1 -1
  270. package/dist/input/remote-items.d.ts +4 -2
  271. package/dist/input/remote-items.js +7 -2
  272. package/dist/input/remote-items.js.map +1 -1
  273. package/dist/layout/Affix.js +4 -4
  274. package/dist/layout/Affix.js.map +1 -1
  275. package/dist/layout/ResizeHandle.d.ts +6 -2
  276. package/dist/layout/ResizeHandle.js +32 -9
  277. package/dist/layout/ResizeHandle.js.map +1 -1
  278. package/dist/layout/ScrollArea.js +3 -3
  279. package/dist/layout/ScrollArea.js.map +1 -1
  280. package/dist/layout/Separator.js +3 -3
  281. package/dist/layout/Separator.js.map +1 -1
  282. package/dist/layout/Splitter.js +3 -3
  283. package/dist/layout/Splitter.js.map +1 -1
  284. package/dist/layout/ViewportFill.d.ts +2 -2
  285. package/dist/layout/ViewportFill.js +4 -4
  286. package/dist/layout/ViewportFill.js.map +1 -1
  287. package/dist/navigation/Breadcrumbs.js +4 -4
  288. package/dist/navigation/Breadcrumbs.js.map +1 -1
  289. package/dist/navigation/NavBar.js +6 -6
  290. package/dist/navigation/NavBar.js.map +1 -1
  291. package/dist/navigation/NavList.d.ts +1 -0
  292. package/dist/navigation/NavList.js +20 -12
  293. package/dist/navigation/NavList.js.map +1 -1
  294. package/dist/navigation/NavMenu.d.ts +27 -0
  295. package/dist/navigation/NavMenu.js +54 -0
  296. package/dist/navigation/NavMenu.js.map +1 -0
  297. package/dist/navigation/PageJump.js +3 -3
  298. package/dist/navigation/PageJump.js.map +1 -1
  299. package/dist/navigation/PageSizeSelect.js +4 -4
  300. package/dist/navigation/PageSizeSelect.js.map +1 -1
  301. package/dist/navigation/Pagination.js +6 -6
  302. package/dist/navigation/Pagination.js.map +1 -1
  303. package/dist/navigation/PaginationBar.js +5 -5
  304. package/dist/navigation/PaginationBar.js.map +1 -1
  305. package/dist/navigation/Steps.js +4 -4
  306. package/dist/navigation/Steps.js.map +1 -1
  307. package/dist/navigation/TableOfContents.js +5 -5
  308. package/dist/navigation/TableOfContents.js.map +1 -1
  309. package/dist/navigation/Tabs.js +7 -7
  310. package/dist/navigation/Tabs.js.map +1 -1
  311. package/dist/navigation/Toolbar.js +3 -3
  312. package/dist/navigation/Toolbar.js.map +1 -1
  313. package/dist/overlay/AlertDialog.js +4 -4
  314. package/dist/overlay/AlertDialog.js.map +1 -1
  315. package/dist/overlay/CommandPalette.js +4 -4
  316. package/dist/overlay/CommandPalette.js.map +1 -1
  317. package/dist/overlay/ContextMenu.js +3 -3
  318. package/dist/overlay/ContextMenu.js.map +1 -1
  319. package/dist/overlay/Dialog.js +4 -4
  320. package/dist/overlay/Dialog.js.map +1 -1
  321. package/dist/overlay/Drawer.js +5 -5
  322. package/dist/overlay/Drawer.js.map +1 -1
  323. package/dist/overlay/HoverCard.js +5 -3
  324. package/dist/overlay/HoverCard.js.map +1 -1
  325. package/dist/overlay/Lightbox.js +5 -5
  326. package/dist/overlay/Lightbox.js.map +1 -1
  327. package/dist/overlay/Menu.js +7 -7
  328. package/dist/overlay/Menu.js.map +1 -1
  329. package/dist/overlay/ModalCore.js +9 -9
  330. package/dist/overlay/ModalCore.js.map +1 -1
  331. package/dist/overlay/Popconfirm.js +6 -6
  332. package/dist/overlay/Popconfirm.js.map +1 -1
  333. package/dist/overlay/Popover.js +5 -3
  334. package/dist/overlay/Popover.js.map +1 -1
  335. package/dist/overlay/Tooltip.js +5 -3
  336. package/dist/overlay/Tooltip.js.map +1 -1
  337. package/dist/overlay/Tour.js +8 -8
  338. package/dist/overlay/Tour.js.map +1 -1
  339. package/dist/overlay/detached.d.ts +2 -0
  340. package/dist/overlay/detached.js +73 -42
  341. package/dist/overlay/detached.js.map +1 -1
  342. package/dist/patterns/ActionBar.js +3 -3
  343. package/dist/patterns/ActionBar.js.map +1 -1
  344. package/dist/patterns/AppShell.d.ts +28 -1
  345. package/dist/patterns/AppShell.js +158 -52
  346. package/dist/patterns/AppShell.js.map +1 -1
  347. package/dist/patterns/AuthLayout.d.ts +28 -0
  348. package/dist/patterns/AuthLayout.js +77 -0
  349. package/dist/patterns/AuthLayout.js.map +1 -0
  350. package/dist/patterns/CommentThread.js +9 -9
  351. package/dist/patterns/CommentThread.js.map +1 -1
  352. package/dist/patterns/DataImport.js +4 -4
  353. package/dist/patterns/DataImport.js.map +1 -1
  354. package/dist/patterns/DeadlineBadge.js +3 -3
  355. package/dist/patterns/DeadlineBadge.js.map +1 -1
  356. package/dist/patterns/FilterBar.d.ts +11 -1
  357. package/dist/patterns/FilterBar.js +39 -10
  358. package/dist/patterns/FilterBar.js.map +1 -1
  359. package/dist/patterns/FormDialog.d.ts +18 -0
  360. package/dist/patterns/FormDialog.js +46 -0
  361. package/dist/patterns/FormDialog.js.map +1 -0
  362. package/dist/patterns/KanbanBoard.js +8 -8
  363. package/dist/patterns/KanbanBoard.js.map +1 -1
  364. package/dist/patterns/LayoutSwitcher.d.ts +12 -0
  365. package/dist/patterns/LayoutSwitcher.js +79 -0
  366. package/dist/patterns/LayoutSwitcher.js.map +1 -0
  367. package/dist/patterns/NotificationCenter.js +8 -8
  368. package/dist/patterns/NotificationCenter.js.map +1 -1
  369. package/dist/patterns/PageTabs.d.ts +12 -7
  370. package/dist/patterns/PageTabs.js +41 -29
  371. package/dist/patterns/PageTabs.js.map +1 -1
  372. package/dist/patterns/QueryTable.d.ts +10 -1
  373. package/dist/patterns/QueryTable.js +128 -68
  374. package/dist/patterns/QueryTable.js.map +1 -1
  375. package/dist/patterns/SlideCaptcha.d.ts +80 -0
  376. package/dist/patterns/SlideCaptcha.js +354 -0
  377. package/dist/patterns/SlideCaptcha.js.map +1 -0
  378. package/dist/patterns/StepsForm.js +7 -7
  379. package/dist/patterns/StepsForm.js.map +1 -1
  380. package/dist/patterns/ThemeSwitcher.js +3 -3
  381. package/dist/patterns/ThemeSwitcher.js.map +1 -1
  382. package/dist/patterns/index.d.ts +7 -3
  383. package/dist/patterns/index.js +5 -1
  384. package/dist/patterns/messages.d.ts +39 -1
  385. package/dist/patterns/messages.js +40 -2
  386. package/dist/patterns/messages.js.map +1 -1
  387. package/dist/table/ColumnHeaderActions.js +3 -3
  388. package/dist/table/ColumnHeaderActions.js.map +1 -1
  389. package/dist/table/ColumnResizer.js +3 -3
  390. package/dist/table/ColumnResizer.js.map +1 -1
  391. package/dist/table/ColumnSettings.js +5 -5
  392. package/dist/table/ColumnSettings.js.map +1 -1
  393. package/dist/table/ColumnTable.js +8 -8
  394. package/dist/table/ColumnTable.js.map +1 -1
  395. package/dist/table/DataTable.js +8 -8
  396. package/dist/table/DataTable.js.map +1 -1
  397. package/dist/table/DataTableView.js +21 -21
  398. package/dist/table/DataTableView.js.map +1 -1
  399. package/dist/table/PivotTable.js +3 -3
  400. package/dist/table/PivotTable.js.map +1 -1
  401. package/dist/table/SelectionBar.js +4 -4
  402. package/dist/table/SelectionBar.js.map +1 -1
  403. package/dist/table/TreeDataTable.js +5 -5
  404. package/dist/table/TreeDataTable.js.map +1 -1
  405. package/dist/theme-customize/ThemeCustomizer.js +7 -6
  406. package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
  407. package/dist/theme-customize/ThemeThumbnail.js +3 -3
  408. package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
  409. package/dist/three/background/AuroraBackground.js +3 -3
  410. package/dist/three/background/AuroraBackground.js.map +1 -1
  411. package/dist/three/background/MeshGradient.js +3 -3
  412. package/dist/three/background/MeshGradient.js.map +1 -1
  413. package/dist/three/background/ShaderBackground.js +3 -3
  414. package/dist/three/background/ShaderBackground.js.map +1 -1
  415. package/dist/three/core/EffectSurface.js +3 -3
  416. package/dist/three/core/EffectSurface.js.map +1 -1
  417. package/dist/three/core/ThreeCanvas.js +4 -4
  418. package/dist/three/core/ThreeCanvas.js.map +1 -1
  419. package/dist/three/effects/Confetti.js +3 -3
  420. package/dist/three/effects/Confetti.js.map +1 -1
  421. package/dist/three/effects/ParticleField.js +3 -3
  422. package/dist/three/effects/ParticleField.js.map +1 -1
  423. package/dist/three/effects/WaveGrid.js +3 -3
  424. package/dist/three/effects/WaveGrid.js.map +1 -1
  425. package/dist/three/globe/Globe.js +3 -3
  426. package/dist/three/globe/Globe.js.map +1 -1
  427. package/dist/three/model/ModelViewer.js +3 -3
  428. package/dist/three/model/ModelViewer.js.map +1 -1
  429. package/dist/utils/data/clone.d.ts +8 -0
  430. package/dist/utils/data/clone.js +21 -0
  431. package/dist/utils/data/clone.js.map +1 -0
  432. package/dist/utils/data/date.d.ts +10 -0
  433. package/dist/utils/data/date.js +13 -1
  434. package/dist/utils/data/date.js.map +1 -1
  435. package/dist/utils/data/number.d.ts +5 -0
  436. package/dist/utils/data/number.js +8 -1
  437. package/dist/utils/data/number.js.map +1 -1
  438. package/dist/utils/data/numeric.d.ts +7 -0
  439. package/dist/utils/data/numeric.js +46 -1
  440. package/dist/utils/data/numeric.js.map +1 -1
  441. package/dist/utils/dom/download.d.ts +8 -1
  442. package/dist/utils/dom/download.js +19 -2
  443. package/dist/utils/dom/download.js.map +1 -1
  444. package/dist/utils/dom/element.d.ts +3 -1
  445. package/dist/utils/dom/element.js +8 -4
  446. package/dist/utils/dom/element.js.map +1 -1
  447. package/dist/utils/dom/fullscreen.d.ts +1 -1
  448. package/dist/utils/dom/fullscreen.js +12 -8
  449. package/dist/utils/dom/fullscreen.js.map +1 -1
  450. package/dist/utils/dom/mounted.d.ts +7 -0
  451. package/dist/utils/dom/mounted.js +16 -0
  452. package/dist/utils/dom/mounted.js.map +1 -0
  453. package/dist/utils/dom/overflow.js +2 -1
  454. package/dist/utils/dom/overflow.js.map +1 -1
  455. package/dist/utils/dom/pan-zoom.js +2 -1
  456. package/dist/utils/dom/pan-zoom.js.map +1 -1
  457. package/dist/utils/props.js +3 -13
  458. package/dist/utils/props.js.map +1 -1
  459. package/dist/utils/request/error-message.d.ts +17 -0
  460. package/dist/utils/request/error-message.js +50 -0
  461. package/dist/utils/request/error-message.js.map +1 -0
  462. package/dist/utils/request/http.d.ts +80 -4
  463. package/dist/utils/request/http.js +121 -24
  464. package/dist/utils/request/http.js.map +1 -1
  465. package/dist/utils/request/use-autosave.d.ts +35 -0
  466. package/dist/utils/request/use-autosave.js +69 -0
  467. package/dist/utils/request/use-autosave.js.map +1 -0
  468. package/dist/utils/request/use-request.js +4 -2
  469. package/dist/utils/request/use-request.js.map +1 -1
  470. package/package.json +57 -4
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":[],"sources":["../../src/config/context.ts"],"sourcesContent":["/**\n * 组件库配置(主题与语言)的上下文:应用级由 createUi 提供,局部由 <Provider> 覆盖;\n * 都没有时使用默认值(亮色主题 + 简体中文),组件单独使用也能工作。\n */\nimport { createContext } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { createMatcher } from '../utils/data/collation';\nimport type { WorkCalendar } from '../utils/data/workdays';\nimport type { HttpClient } from '../utils/request/http';\nimport type { ComponentDefaults } from './defaults';\nimport type { StyleLayers } from './styles';\nimport type { Lang } from './lang/lang';\nimport { zhCN } from './lang/zh-CN';\nimport { lightTheme } from './theme/light';\nimport type { Theme } from './theme/theme';\n\n/**\n * 代码高亮器:代码 + 语言 → 高亮后的行内 HTML(只含 span 与换行的 br,不含 pre、code),交给 CodeBlock。\n * 组件库不依赖具体实现;Shiki 的实现见子路径 `@zerodep-dev/vue-tsx-pro-ui/shiki` 的 createShikiHighlighter。\n * 返回的 HTML 直接写进页面,实现方负责转义代码里的文字。\n */\nexport type Highlighter = (code: string, lang: string) => Promise<string>;\n\n/**\n * 额外的文字匹配:选项过滤、命令面板、树的搜索在内置匹配(忽略大小写与重音的包含)之外再试它,任一命中就算。\n * 拼音匹配见子路径 `@zerodep-dev/vue-tsx-pro-ui/pinyin` 的 createPinyinMatcher\n */\nexport type TextMatcher = (text: string, query: string) => boolean;\n\n/**\n * 路由适配(参考 React Aria 的 RouterProvider 与 useHref):组件库不依赖具体的路由库。\n * Link、LinkButton、导航组件渲染的仍是 <a href>;普通左键点击站内链接时改由 navigate 跳转(不刷新页面),\n * 新窗口打开、按着修饰键、外部链接、下载照常交给浏览器。\n *\n * createUi({ router: { navigate: (href) => router.push(href), isActive: (href) => route.path === href } })\n */\nexport interface UiRouter {\n /** 站内跳转;收到的是组件上写的原文(/orders),不是 resolve 之后的地址 */\n navigate: (href: string) => void;\n /**\n * 站内链接渲染到 <a href> 上的真实地址:补上路由的 base(/admin/orders)、hash 模式的 #(#/orders),\n * 新标签页打开、复制链接才对。不写时原样渲染\n */\n resolve?: (href: string) => string;\n /** href 是不是当前页:导航组件据此加 aria-current=\"page\"。在渲染时调用,读路由的响应式状态就能跟随变化 */\n isActive?: (href: string) => boolean;\n /**\n * 站内跳转之前问一下(useLeaveConfirmation 用):guard 返回 false(或 resolve 成 false)时不跳转;返回注销函数。\n * 只在路径变了时问,同一页里换 query、锚点不问\n */\n beforeLeave?: (guard: () => boolean | Promise<boolean>) => () => void;\n /** 当前地址的查询参数(useQueryState 用);读路由的响应式状态,在 watch、渲染里读能跟随变化 */\n query?: () => QueryValues;\n /**\n * 改当前地址的查询参数(replace,不加历史记录):patch 里的键覆盖,值为 undefined 的删掉,其余不动。\n * 同一轮里调用几次要合并成一次跳转(各状态分别写入时互不覆盖)\n */\n replaceQuery?: (patch: QueryPatch) => void;\n}\n\n/** 地址里的查询参数:同名多个时是数组;只写了键(?flag)时是空字符串 */\nexport type QueryValues = Readonly<Record<string, string | readonly string[]>>;\n\n/** 要改的查询参数:undefined 是删掉 */\nexport type QueryPatch = Readonly<Record<string, string | readonly string[] | undefined>>;\n\n/** 提供方用 getter 暴露当前值,读取方在渲染或 computed 里读取即可跟随变化 */\nexport interface UiConfig {\n /** 当前主题(明暗已按系统设置选定) */\n readonly theme: Theme;\n /** 当前语言:地区格式与界面文案 */\n readonly lang: Lang;\n /** 代码高亮器;没有时 CodeBlock 显示纯文本 */\n readonly highlighter?: Highlighter;\n /** 额外的文字匹配(拼音);没有时只按字面匹配 */\n readonly textMatcher?: TextMatcher;\n /** 组件默认值(见 defaults.ts) */\n readonly defaults: ComponentDefaults;\n /** 组件的主题定制,外层在前(见 styles.ts) */\n readonly styles: StyleLayers;\n /** 路由适配;没有时链接就是普通的页面跳转 */\n readonly router?: UiRouter;\n /** 请求客户端(远程选项、上传、列表查询用);没有时 useHttp 给一个默认的 createHttpClient() */\n readonly http?: HttpClient;\n /** 工作日历(时限、剩余工作日用);没有时只按周末算 */\n readonly workCalendar?: WorkCalendar;\n /** 可点击组件按下时的波纹效果,默认开启;组件的 ripple prop 可以单独覆盖 */\n readonly ripple: boolean;\n}\n\n/** 配置的注入键:createUi 在应用级提供,Provider 在局部覆盖 */\nexport const ConfigContext = createContext<UiConfig>('Provider');\n\n/** 默认配置:亮色主题 + 简体中文 */\nexport const defaultConfig: UiConfig = {\n theme: lightTheme,\n lang: zhCN,\n defaults: {},\n styles: {},\n ripple: true,\n};\n\n/** 当前的主题与语言配置;没有 createUi 与 Provider 时为默认配置 */\nexport function useConfig(): UiConfig {\n return ConfigContext.inject(defaultConfig);\n}\n\n/**\n * 当前语言:`const lang = useLang()`,之后 `lang.confirm`、`lang.timeZone`。\n * 返回的对象总是转发到最新配置,在渲染函数里读取即可随 Provider 切换语言。\n */\nexport function useLang(): Lang {\n const config = useConfig();\n // 所有读取都转发到当前语言,展开与 Object.keys 也能拿到完整字段\n return new Proxy({} as Lang, {\n get: (_, key) => Reflect.get(config.lang, key),\n has: (_, key) => Reflect.has(config.lang, key),\n ownKeys: () => Reflect.ownKeys(config.lang),\n getOwnPropertyDescriptor: (_, key) => {\n const descriptor = Reflect.getOwnPropertyDescriptor(config.lang, key);\n return descriptor && { ...descriptor, configurable: true };\n },\n });\n}\n\n/**\n * 当前配置下的文字匹配:内置匹配(按当前语言忽略大小写与重音)或 textMatcher(拼音)任一命中。\n * 在 setup 里调用,返回的函数在渲染、计算里调用(读到最新的语言与配置)\n */\nexport function useTextMatcher(): () => TextMatcher {\n const config = useConfig();\n return () => {\n const builtin = createMatcher(config.lang.code);\n const extra = config.textMatcher;\n return extra ? (text, query) => builtin(text, query) || extra(text, query) : builtin;\n };\n}\n"],"mappings":";;;;;;;;;;AA0FA,IAAa,gBAAgB,cAAwB,UAAU;;AAG/D,IAAa,gBAA0B;CACrC,OAAO;CACP,MAAM;CACN,UAAU,CAAC;CACX,QAAQ,CAAC;CACT,QAAQ;AACV;;AAGA,SAAgB,YAAsB;CACpC,OAAO,cAAc,OAAO,aAAa;AAC3C;;;;;AAMA,SAAgB,UAAgB;CAC9B,MAAM,SAAS,UAAU;CAEzB,OAAO,IAAI,MAAM,CAAC,GAAW;EAC3B,MAAM,GAAG,QAAQ,QAAQ,IAAI,OAAO,MAAM,GAAG;EAC7C,MAAM,GAAG,QAAQ,QAAQ,IAAI,OAAO,MAAM,GAAG;EAC7C,eAAe,QAAQ,QAAQ,OAAO,IAAI;EAC1C,2BAA2B,GAAG,QAAQ;GACpC,MAAM,aAAa,QAAQ,yBAAyB,OAAO,MAAM,GAAG;GACpE,OAAO,cAAc;IAAE,GAAG;IAAY,cAAc;GAAK;EAC3D;CACF,CAAC;AACH;;;;;AAMA,SAAgB,iBAAoC;CAClD,MAAM,SAAS,UAAU;CACzB,aAAa;EACX,MAAM,UAAU,cAAc,OAAO,KAAK,IAAI;EAC9C,MAAM,QAAQ,OAAO;EACrB,OAAO,SAAS,MAAM,UAAU,QAAQ,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,IAAI;CAC/E;AACF"}
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../src/config/context.ts"],"sourcesContent":["/**\n * 组件库配置(主题与语言)的上下文:应用级由 createUi 提供,局部由 <Provider> 覆盖;\n * 都没有时使用默认值(亮色主题 + 简体中文),组件单独使用也能工作。\n */\nimport { createContext } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { createMatcher } from '../utils/data/collation';\nimport type { WorkCalendar } from '../utils/data/workdays';\nimport type { HttpClient } from '../utils/request/http';\nimport type { ComponentDefaults } from './defaults';\nimport type { StyleLayers } from './styles';\nimport type { Lang } from './lang/lang';\nimport { zhCN } from './lang/zh-CN';\nimport { lightTheme } from './theme/light';\nimport type { Theme } from './theme/theme';\n\n/**\n * 代码高亮器:代码 + 语言 → 高亮后的行内 HTML(只含 span 与换行的 br,不含 pre、code),交给 CodeBlock。\n * 组件库不依赖具体实现;Shiki 的实现见子路径 `@zerodep-dev/vue-tsx-pro-ui/shiki` 的 createShikiHighlighter。\n * 返回的 HTML 直接写进页面,实现方负责转义代码里的文字。\n */\nexport type Highlighter = (code: string, lang: string) => Promise<string>;\n\n/**\n * 额外的文字匹配:选项过滤、命令面板、树的搜索在内置匹配(忽略大小写与重音的包含)之外再试它,任一命中就算。\n * 拼音匹配见子路径 `@zerodep-dev/vue-tsx-pro-ui/pinyin` 的 createPinyinMatcher\n */\nexport type TextMatcher = (text: string, query: string) => boolean;\n\n/**\n * 路由适配(参考 React Aria 的 RouterProvider 与 useHref):组件库不依赖具体的路由库。\n * Link、LinkButton、导航组件渲染的仍是 <a href>;普通左键点击站内链接时改由 navigate 跳转(不刷新页面),\n * 新窗口打开、按着修饰键、外部链接、下载照常交给浏览器。\n *\n * createUi({ router: { navigate: (href) => router.push(href), isActive: (href) => route.path === href } })\n */\nexport interface UiRouter {\n /** 站内跳转;收到的是组件上写的原文(/orders),不是 resolve 之后的地址 */\n navigate: (href: string) => void;\n /**\n * 站内链接渲染到 <a href> 上的真实地址:补上路由的 base(/admin/orders)、hash 模式的 #(#/orders),\n * 新标签页打开、复制链接才对。不写时原样渲染\n */\n resolve?: (href: string) => string;\n /** href 是不是当前页:导航组件据此加 aria-current=\"page\"。在渲染时调用,读路由的响应式状态就能跟随变化 */\n isActive?: (href: string) => boolean;\n /**\n * 站内跳转之前问一下(useLeaveConfirmation 用):guard 返回 false(或 resolve 成 false)时不跳转;返回注销函数。\n * 只在路径变了时问,同一页里换 query、锚点不问\n */\n beforeLeave?: (guard: () => boolean | Promise<boolean>) => () => void;\n /** 当前地址的查询参数(useQueryState 用);读路由的响应式状态,在 watch、渲染里读能跟随变化 */\n query?: () => QueryValues;\n /**\n * 改当前地址的查询参数(replace,不加历史记录):patch 里的键覆盖,值为 undefined 的删掉,其余不动。\n * 同一轮里调用几次要合并成一次跳转(各状态分别写入时互不覆盖)\n */\n replaceQuery?: (patch: QueryPatch) => void;\n}\n\n/**\n * 权限判断:用户有没有这个权限点。组件库不知道权限从哪来(后端返回的权限点、角色…),由应用接入:\n *\n * createUi({ permissions: (permission) => access.can(permission) })\n *\n * 在渲染时调用,读响应式状态就能跟随变化(登录、退出、换角色后界面随之更新)。用 Can、useCan 控制界面。\n */\nexport type UiPermissions = (permission: string) => boolean;\n\n/** 地址里的查询参数:同名多个时是数组;只写了键(?flag)时是空字符串 */\nexport type QueryValues = Readonly<Record<string, string | readonly string[]>>;\n\n/** 要改的查询参数:undefined 是删掉 */\nexport type QueryPatch = Readonly<Record<string, string | readonly string[] | undefined>>;\n\n/** 提供方用 getter 暴露当前值,读取方在渲染或 computed 里读取即可跟随变化 */\nexport interface UiConfig {\n /** 当前主题(明暗已按系统设置选定) */\n readonly theme: Theme;\n /** 当前语言:地区格式与界面文案 */\n readonly lang: Lang;\n /** 代码高亮器;没有时 CodeBlock 显示纯文本 */\n readonly highlighter?: Highlighter;\n /** 额外的文字匹配(拼音);没有时只按字面匹配 */\n readonly textMatcher?: TextMatcher;\n /** 组件默认值(见 defaults.ts) */\n readonly defaults: ComponentDefaults;\n /** 组件的主题定制,外层在前(见 styles.ts) */\n readonly styles: StyleLayers;\n /** 路由适配;没有时链接就是普通的页面跳转 */\n readonly router?: UiRouter;\n /** 权限判断;没有时 useCan、Can 一律放行 */\n readonly permissions?: UiPermissions;\n /** 请求客户端(远程选项、上传、列表查询用);没有时 useHttp 给一个默认的 createHttpClient() */\n readonly http?: HttpClient;\n /** 工作日历(时限、剩余工作日用);没有时只按周末算 */\n readonly workCalendar?: WorkCalendar;\n /** 可点击组件按下时的波纹效果,默认开启;组件的 ripple prop 可以单独覆盖 */\n readonly ripple: boolean;\n}\n\n/** 配置的注入键:createUi 在应用级提供,Provider 在局部覆盖 */\nexport const ConfigContext = createContext<UiConfig>('Provider');\n\n/** 默认配置:亮色主题 + 简体中文 */\nexport const defaultConfig: UiConfig = {\n theme: lightTheme,\n lang: zhCN,\n defaults: {},\n styles: {},\n ripple: true,\n};\n\n/** 当前的主题与语言配置;没有 createUi 与 Provider 时为默认配置 */\nexport function useConfig(): UiConfig {\n return ConfigContext.inject(defaultConfig);\n}\n\n/**\n * 当前语言:`const lang = useLang()`,之后 `lang.confirm`、`lang.timeZone`。\n * 返回的对象总是转发到最新配置,在渲染函数里读取即可随 Provider 切换语言。\n */\nexport function useLang(): Lang {\n const config = useConfig();\n // 所有读取都转发到当前语言,展开与 Object.keys 也能拿到完整字段\n return new Proxy({} as Lang, {\n get: (_, key) => Reflect.get(config.lang, key),\n has: (_, key) => Reflect.has(config.lang, key),\n ownKeys: () => Reflect.ownKeys(config.lang),\n getOwnPropertyDescriptor: (_, key) => {\n const descriptor = Reflect.getOwnPropertyDescriptor(config.lang, key);\n return descriptor && { ...descriptor, configurable: true };\n },\n });\n}\n\n/**\n * 当前配置下的文字匹配:内置匹配(按当前语言忽略大小写与重音)或 textMatcher(拼音)任一命中。\n * 在 setup 里调用,返回的函数在渲染、计算里调用(读到最新的语言与配置)\n */\nexport function useTextMatcher(): () => TextMatcher {\n const config = useConfig();\n return () => {\n const builtin = createMatcher(config.lang.code);\n const extra = config.textMatcher;\n return extra ? (text, query) => builtin(text, query) || extra(text, query) : builtin;\n };\n}\n\n/**\n * 当前配置下的权限判断(在 setup 里调用):返回 can(权限点),给数组时有其中任意一个就算有。\n * createUi / Provider 没给 permissions 时一律放行(没有权限体系的应用不受影响)。返回的函数在渲染、计算里调用才跟随变化。\n *\n * const can = useCan();\n * <Button disabled={!can('cost:project:add')}>新建</Button>\n */\nexport function useCan(): (permission: string | readonly string[]) => boolean {\n const config = useConfig();\n return (permission) => {\n const has = config.permissions;\n if (!has) return true;\n return typeof permission === 'string' ? has(permission) : permission.some((item) => has(item));\n };\n}\n"],"mappings":";;;;;;;;;;AAqGA,IAAa,gBAAgB,cAAwB,UAAU;;AAG/D,IAAa,gBAA0B;CACrC,OAAO;CACP,MAAM;CACN,UAAU,CAAC;CACX,QAAQ,CAAC;CACT,QAAQ;AACV;;AAGA,SAAgB,YAAsB;CACpC,OAAO,cAAc,OAAO,aAAa;AAC3C;;;;;AAMA,SAAgB,UAAgB;CAC9B,MAAM,SAAS,UAAU;CAEzB,OAAO,IAAI,MAAM,CAAC,GAAW;EAC3B,MAAM,GAAG,QAAQ,QAAQ,IAAI,OAAO,MAAM,GAAG;EAC7C,MAAM,GAAG,QAAQ,QAAQ,IAAI,OAAO,MAAM,GAAG;EAC7C,eAAe,QAAQ,QAAQ,OAAO,IAAI;EAC1C,2BAA2B,GAAG,QAAQ;GACpC,MAAM,aAAa,QAAQ,yBAAyB,OAAO,MAAM,GAAG;GACpE,OAAO,cAAc;IAAE,GAAG;IAAY,cAAc;GAAK;EAC3D;CACF,CAAC;AACH;;;;;AAMA,SAAgB,iBAAoC;CAClD,MAAM,SAAS,UAAU;CACzB,aAAa;EACX,MAAM,UAAU,cAAc,OAAO,KAAK,IAAI;EAC9C,MAAM,QAAQ,OAAO;EACrB,OAAO,SAAS,MAAM,UAAU,QAAQ,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,IAAI;CAC/E;AACF;;;;;;;;AASA,SAAgB,SAA8D;CAC5E,MAAM,SAAS,UAAU;CACzB,QAAQ,eAAe;EACrB,MAAM,MAAM,OAAO;EACnB,IAAI,CAAC,KAAK,OAAO;EACjB,OAAO,OAAO,eAAe,WAAW,IAAI,UAAU,IAAI,WAAW,MAAM,SAAS,IAAI,IAAI,CAAC;CAC/F;AACF"}
@@ -2,9 +2,9 @@
2
2
  * 应用级配置:在宿主入口里 `app.use(createUi({ theme, lang }))`,所有 TSX 页面共享,不必逐页包裹 Provider。
3
3
  * 传入 ref 或 getter 即可在运行时切换主题与语言。
4
4
  */
5
- import { type MaybeRefOrGetter, type Plugin } from 'vue';
5
+ import { type MaybeRefOrGetter, type ObjectPlugin } from 'vue';
6
6
  import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
7
- import { type Highlighter, type TextMatcher, type UiRouter } from './context';
7
+ import { type Highlighter, type TextMatcher, type UiPermissions, type UiRouter } from './context';
8
8
  import type { ComponentDefaults } from './defaults';
9
9
  import { type ComponentStyles } from './styles';
10
10
  import { type Lang } from './lang/lang';
@@ -27,6 +27,8 @@ export interface UiOptions {
27
27
  styles?: ComponentStyles;
28
28
  /** 路由适配:站内链接不刷新页面地跳转、导航组件判断当前页(见 UiRouter) */
29
29
  router?: UiRouter;
30
+ /** 权限判断:`(权限点) => 用户有没有`,Can、useCan 据此控制按钮等界面;不写时一律放行(见 UiPermissions) */
31
+ permissions?: UiPermissions;
30
32
  /** 请求客户端:createHttpClient({ baseURL, onRequest, onResponse }),或包一层 axios、ky(见 HttpClient) */
31
33
  http?: HttpClient;
32
34
  /** 工作日历:createWorkCalendar({ holidays, workdays }) 带上法定节假日与调休;不写时只按周末算 */
@@ -45,8 +47,23 @@ export declare const documentStyles: Readonly<{
45
47
  body: css.CompiledStyles;
46
48
  page: css.CompiledStyles;
47
49
  }>;
50
+ /** 服务端渲染时 `<html>` 与 `<body>` 要带的属性(createUi 在浏览器里写到页面根元素上的那些) */
51
+ export interface DocumentAttrs {
52
+ /** `<html>` 的属性:主题的类、变量(style)、data-theme,传了 lang 时还有 lang、dir */
53
+ html: Record<string, string>;
54
+ /** `<body>` 的属性:paintDocument 时去掉外边距的类 */
55
+ body: Record<string, string>;
56
+ }
57
+ /** createUi 的结果:Vue 插件,另外能给出服务端渲染时页面根元素的属性 */
58
+ export interface UiPlugin extends ObjectPlugin {
59
+ /**
60
+ * 服务端渲染:`<html>`、`<body>` 要带的属性,首屏就是这套主题与语言,不等客户端接管后再变。
61
+ * 服务端不知道系统的明暗,跟随系统的主题按亮色给;`themeBootScript` 在页面加载前按用户的选择改过来
62
+ */
63
+ documentAttrs(): DocumentAttrs;
64
+ }
48
65
  /**
49
66
  * 应用级配置的 Vue 插件:`app.use(createUi({ theme: { light: lightTheme, dark: darkTheme } }))`。
50
67
  * 主题的 CSS 变量写在页面根元素上,所有 TSX 页面共享;应用卸载时撤销。
51
68
  */
52
- export declare function createUi(options?: UiOptions): Plugin;
69
+ export declare function createUi(options?: UiOptions): UiPlugin;
@@ -27,60 +27,91 @@ var documentStyles = css.create({
27
27
  * 主题的 CSS 变量写在页面根元素上,所有 TSX 页面共享;应用卸载时撤销。
28
28
  */
29
29
  function createUi(options = {}) {
30
- return { install(app) {
31
- const scope = effectScope();
32
- app.onUnmount(() => scope.stop());
33
- scope.run(() => {
34
- const prefersDark = usePrefersDark();
35
- const theme = computed(() => resolveTheme(toValue(options.theme) ?? defaultConfig.theme, prefersDark.value));
36
- const lang = computed(() => defineLang(defaultConfig.lang, toValue(options.lang) ?? {}));
37
- app.provide(ConfigContext.key, {
38
- get theme() {
39
- return theme.value;
40
- },
41
- get lang() {
42
- return lang.value;
43
- },
44
- highlighter: options.highlighter,
45
- textMatcher: options.textMatcher,
46
- defaults: options.defaults ?? {},
47
- styles: mergeStyles({}, options.styles),
48
- router: options.router,
49
- http: options.http,
50
- workCalendar: options.workCalendar,
51
- ripple: options.ripple ?? true
52
- });
53
- if (options.lang && typeof document !== "undefined") {
54
- const root = document.documentElement;
55
- const previous = {
56
- lang: root.lang,
57
- dir: root.dir
58
- };
59
- watchEffect(() => {
60
- root.lang = lang.value.code;
61
- root.dir = lang.value.direction;
62
- });
63
- app.onUnmount(() => Object.assign(root, previous));
30
+ return {
31
+ documentAttrs() {
32
+ const html = {};
33
+ const body = {};
34
+ if (options.lang) {
35
+ const lang = defineLang(defaultConfig.lang, toValue(options.lang));
36
+ html.lang = lang.code;
37
+ html.dir = lang.direction;
64
38
  }
65
- if ((options.theme || options.paintDocument) && typeof document !== "undefined") {
66
- const root = document.documentElement;
67
- if (options.paintDocument) root.style.removeProperty("background-color");
68
- if (options.paintDocument) root.style.removeProperty("color");
69
- watchEffect((onCleanup) => onCleanup(applyTheme(root, theme.value, options.paintDocument ?? false)));
70
- if (options.paintDocument && document.body) {
71
- const body = document.body;
72
- const classes = css.attrs(documentStyles.body).class?.split(" ") ?? [];
73
- body.classList.add(...classes);
74
- app.onUnmount(() => body.classList.remove(...classes));
75
- }
39
+ if (options.theme || options.paintDocument) {
40
+ const theme = resolveTheme(toValue(options.theme) ?? defaultConfig.theme, false);
41
+ const { classes, variables } = rootThemeAttrs(theme, options.paintDocument ?? false);
42
+ if (classes.length) html.class = classes.join(" ");
43
+ const style = Object.entries(variables).map(([name, value]) => `${name}:${value}`).join(";");
44
+ if (style) html.style = style;
45
+ html["data-theme"] = theme.name;
46
+ if (options.paintDocument) body.class = css.attrs(documentStyles.body).class ?? "";
76
47
  }
77
- });
78
- } };
48
+ return {
49
+ html,
50
+ body
51
+ };
52
+ },
53
+ install(app) {
54
+ const scope = effectScope();
55
+ app.onUnmount(() => scope.stop());
56
+ scope.run(() => {
57
+ const prefersDark = usePrefersDark();
58
+ const theme = computed(() => resolveTheme(toValue(options.theme) ?? defaultConfig.theme, prefersDark.value));
59
+ const lang = computed(() => defineLang(defaultConfig.lang, toValue(options.lang) ?? {}));
60
+ app.provide(ConfigContext.key, {
61
+ get theme() {
62
+ return theme.value;
63
+ },
64
+ get lang() {
65
+ return lang.value;
66
+ },
67
+ highlighter: options.highlighter,
68
+ textMatcher: options.textMatcher,
69
+ defaults: options.defaults ?? {},
70
+ styles: mergeStyles({}, options.styles),
71
+ router: options.router,
72
+ permissions: options.permissions,
73
+ http: options.http,
74
+ workCalendar: options.workCalendar,
75
+ ripple: options.ripple ?? true
76
+ });
77
+ if (options.lang && typeof document !== "undefined") {
78
+ const root = document.documentElement;
79
+ const previous = {
80
+ lang: root.lang,
81
+ dir: root.dir
82
+ };
83
+ watchEffect(() => {
84
+ root.lang = lang.value.code;
85
+ root.dir = lang.value.direction;
86
+ });
87
+ app.onUnmount(() => Object.assign(root, previous));
88
+ }
89
+ if ((options.theme || options.paintDocument) && typeof document !== "undefined") {
90
+ const root = document.documentElement;
91
+ if (options.paintDocument) root.style.removeProperty("background-color");
92
+ if (options.paintDocument) root.style.removeProperty("color");
93
+ watchEffect((onCleanup) => onCleanup(applyTheme(root, theme.value, options.paintDocument ?? false)));
94
+ if (options.paintDocument && document.body) {
95
+ const body = document.body;
96
+ const classes = css.attrs(documentStyles.body).class?.split(" ") ?? [];
97
+ body.classList.add(...classes);
98
+ app.onUnmount(() => body.classList.remove(...classes));
99
+ }
100
+ }
101
+ });
102
+ }
103
+ };
104
+ }
105
+ /** 主题挂到页面根元素上的类与 CSS 变量;paint 时加上整页的底色与字体(浏览器里写到元素上,服务端写进 HTML) */
106
+ function rootThemeAttrs(theme, paint) {
107
+ return {
108
+ classes: css.attrs(...theme.styles, paint && documentStyles.page).class?.split(" ").filter(Boolean) ?? [],
109
+ variables: themeVariables(theme)
110
+ };
79
111
  }
80
112
  /** 把主题的 class、CSS 变量与 data-theme 写到元素上,返回撤销函数 */
81
113
  function applyTheme(element, theme, paint) {
82
- const classes = css.attrs(...theme.styles, paint && documentStyles.page).class?.split(" ").filter(Boolean) ?? [];
83
- const variables = themeVariables(theme);
114
+ const { classes, variables } = rootThemeAttrs(theme, paint);
84
115
  element.classList.add(...classes);
85
116
  for (const [name, value] of Object.entries(variables)) element.style.setProperty(name, value);
86
117
  element.dataset.theme = theme.name;
@@ -1 +1 @@
1
- {"version":3,"file":"createUi.js","names":[],"sources":["../../src/config/createUi.ts"],"sourcesContent":["/**\n * 应用级配置:在宿主入口里 `app.use(createUi({ theme, lang }))`,所有 TSX 页面共享,不必逐页包裹 Provider。\n * 传入 ref 或 getter 即可在运行时切换主题与语言。\n */\nimport {\n computed,\n effectScope,\n toValue,\n watchEffect,\n type MaybeRefOrGetter,\n type Plugin,\n} from 'vue';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport {\n ConfigContext,\n defaultConfig,\n type Highlighter,\n type TextMatcher,\n type UiRouter,\n} from './context';\nimport type { ComponentDefaults } from './defaults';\nimport { mergeStyles, type ComponentStyles } from './styles';\nimport { defineLang, type Lang } from './lang/lang';\nimport { usePrefersDark } from '../utils/dom/media-query';\nimport type { WorkCalendar } from '../utils/data/workdays';\nimport type { HttpClient } from '../utils/request/http';\nimport { resolveTheme, themeVariables, type Theme, type ThemeInput } from './theme/theme';\n\n/** 应用级配置;theme 与 lang 可以传 ref 或 getter,运行时切换,其余在安装时确定 */\nexport interface UiOptions {\n /** 主题;不写时用亮色主题,也不改动页面根元素 */\n theme?: MaybeRefOrGetter<ThemeInput>;\n /** 只写要改的字段,其余用简体中文的默认值 */\n lang?: MaybeRefOrGetter<Partial<Lang>>;\n /** 代码高亮器(CodeBlock 用),如 `@zerodep-dev/vue-tsx-pro-ui/shiki` 的 createShikiHighlighter();不写时显示纯文本 */\n highlighter?: Highlighter;\n /** 额外的文字匹配,如 `@zerodep-dev/vue-tsx-pro-ui/pinyin` 的 createPinyinMatcher():选项过滤、命令面板认拼音;不写时只按字面匹配 */\n textMatcher?: TextMatcher;\n /** 组件默认值,如 `{ Button: { variant: 'outline' } }`(见 defaults.ts) */\n defaults?: ComponentDefaults;\n /** 组件的主题定制:追加样式、新增档位,如 `{ Button: { base: { root: { letterSpacing: '0.02em' } } } }`(见 styles.ts) */\n styles?: ComponentStyles;\n /** 路由适配:站内链接不刷新页面地跳转、导航组件判断当前页(见 UiRouter) */\n router?: UiRouter;\n /** 请求客户端:createHttpClient({ baseURL, onRequest, onResponse }),或包一层 axios、ky(见 HttpClient) */\n http?: HttpClient;\n /** 工作日历:createWorkCalendar({ holidays, workdays }) 带上法定节假日与调休;不写时只按周末算 */\n workCalendar?: WorkCalendar;\n /** 按下时的波纹效果,默认 true;关掉后组件的 ripple prop 仍可单独打开 */\n ripple?: boolean;\n /**\n * 页面根元素也用主题的背景色、文字色与字体,并去掉 body 的默认外边距,默认 false。\n * 整页都由组件库主题管理的站点(如文档站)打开:页面边缘、回弹滚动露出的地方不再是浏览器的默认色,\n * AppShell 贴满窗口、四周不留 8px 的白边;配合 themeBootScript 时接手它写的行内颜色\n */\n paintDocument?: boolean;\n}\n\n/** paintDocument 时页面根元素的样式 */\nexport const documentStyles = css.create({\n // 字号不设:根元素的字号是 rem 的基准,留给浏览器(用户的字号设置)\n page: {\n backgroundColor: '_background',\n color: '_text',\n fontFamily: '_sans',\n lineHeight: '_normal',\n // macOS 上用灰度抗锯齿,深色底上的浅色文字不发虚;其他系统忽略\n WebkitFontSmoothing: 'antialiased',\n MozOsxFontSmoothing: 'grayscale',\n },\n // 浏览器给 body 的 8px 外边距:整页的外壳(AppShell)要贴满窗口\n body: { margin: 0 },\n});\n\n/**\n * 应用级配置的 Vue 插件:`app.use(createUi({ theme: { light: lightTheme, dark: darkTheme } }))`。\n * 主题的 CSS 变量写在页面根元素上,所有 TSX 页面共享;应用卸载时撤销。\n */\nexport function createUi(options: UiOptions = {}): Plugin {\n return {\n install(app) {\n const scope = effectScope();\n app.onUnmount(() => scope.stop());\n scope.run(() => {\n const prefersDark = usePrefersDark();\n const theme = computed(() =>\n resolveTheme(toValue(options.theme) ?? defaultConfig.theme, prefersDark.value),\n );\n const lang = computed(() => defineLang(defaultConfig.lang, toValue(options.lang) ?? {}));\n app.provide(ConfigContext.key, {\n get theme() {\n return theme.value;\n },\n get lang() {\n return lang.value;\n },\n highlighter: options.highlighter,\n textMatcher: options.textMatcher,\n defaults: options.defaults ?? {},\n styles: mergeStyles({}, options.styles),\n router: options.router,\n http: options.http,\n workCalendar: options.workCalendar,\n ripple: options.ripple ?? true,\n });\n // 应用级的语言也写在页面根元素上(Provider 写在自己的元素上):读屏按 lang 选发音,\n // 从右到左的语言靠 dir 镜像排版与滚动条;没传 lang 时不动,宿主自己管\n if (options.lang && typeof document !== 'undefined') {\n const root = document.documentElement;\n const previous = { lang: root.lang, dir: root.dir };\n watchEffect(() => {\n root.lang = lang.value.code;\n root.dir = lang.value.direction;\n });\n app.onUnmount(() => Object.assign(root, previous));\n }\n // 应用级没有容器元素,主题变量挂在页面根元素上;变量名带 vtp- 前缀,不会与宿主冲突。\n // 只开 paintDocument、不传主题时用默认主题(整页也要有底色、字体,body 去掉外边距)\n if ((options.theme || options.paintDocument) && typeof document !== 'undefined') {\n const root = document.documentElement;\n // themeBootScript 在应用加载前写的行内颜色:交给主题的 class\n if (options.paintDocument) root.style.removeProperty('background-color');\n if (options.paintDocument) root.style.removeProperty('color');\n watchEffect((onCleanup) =>\n onCleanup(applyTheme(root, theme.value, options.paintDocument ?? false)),\n );\n if (options.paintDocument && document.body) {\n const body = document.body;\n const classes = css.attrs(documentStyles.body).class?.split(' ') ?? [];\n body.classList.add(...classes);\n app.onUnmount(() => body.classList.remove(...classes));\n }\n }\n });\n },\n };\n}\n\n/** 把主题的 class、CSS 变量与 data-theme 写到元素上,返回撤销函数 */\nfunction applyTheme(element: HTMLElement, theme: Theme, paint: boolean) {\n const classes =\n css\n .attrs(...theme.styles, paint && documentStyles.page)\n .class?.split(' ')\n .filter(Boolean) ?? [];\n const variables = themeVariables(theme);\n element.classList.add(...classes);\n for (const [name, value] of Object.entries(variables)) element.style.setProperty(name, value);\n element.dataset.theme = theme.name;\n return () => {\n element.classList.remove(...classes);\n for (const name of Object.keys(variables)) element.style.removeProperty(name);\n delete element.dataset.theme;\n };\n}\n"],"mappings":";;;;;;;;;;;;;AA2DA,IAAa,iBAAiB,IAAI,OAAO;CAEvC,MAAM;EACJ,iBAAiB;EACjB,OAAO;EACP,YAAY;EACZ,YAAY;EAEZ,qBAAqB;EACrB,qBAAqB;CACvB;CAEA,MAAM,EAAE,QAAQ,EAAE;AACpB,CAAC;;;;;AAMD,SAAgB,SAAS,UAAqB,CAAC,GAAW;CACxD,OAAO,EACL,QAAQ,KAAK;EACX,MAAM,QAAQ,YAAY;EAC1B,IAAI,gBAAgB,MAAM,KAAK,CAAC;EAChC,MAAM,UAAU;GACd,MAAM,cAAc,eAAe;GACnC,MAAM,QAAQ,eACZ,aAAa,QAAQ,QAAQ,KAAK,KAAK,cAAc,OAAO,YAAY,KAAK,CAC/E;GACA,MAAM,OAAO,eAAe,WAAW,cAAc,MAAM,QAAQ,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC;GACvF,IAAI,QAAQ,cAAc,KAAK;IAC7B,IAAI,QAAQ;KACV,OAAO,MAAM;IACf;IACA,IAAI,OAAO;KACT,OAAO,KAAK;IACd;IACA,aAAa,QAAQ;IACrB,aAAa,QAAQ;IACrB,UAAU,QAAQ,YAAY,CAAC;IAC/B,QAAQ,YAAY,CAAC,GAAG,QAAQ,MAAM;IACtC,QAAQ,QAAQ;IAChB,MAAM,QAAQ;IACd,cAAc,QAAQ;IACtB,QAAQ,QAAQ,UAAU;GAC5B,CAAC;GAGD,IAAI,QAAQ,QAAQ,OAAO,aAAa,aAAa;IACnD,MAAM,OAAO,SAAS;IACtB,MAAM,WAAW;KAAE,MAAM,KAAK;KAAM,KAAK,KAAK;IAAI;IAClD,kBAAkB;KAChB,KAAK,OAAO,KAAK,MAAM;KACvB,KAAK,MAAM,KAAK,MAAM;IACxB,CAAC;IACD,IAAI,gBAAgB,OAAO,OAAO,MAAM,QAAQ,CAAC;GACnD;GAGA,KAAK,QAAQ,SAAS,QAAQ,kBAAkB,OAAO,aAAa,aAAa;IAC/E,MAAM,OAAO,SAAS;IAEtB,IAAI,QAAQ,eAAe,KAAK,MAAM,eAAe,kBAAkB;IACvE,IAAI,QAAQ,eAAe,KAAK,MAAM,eAAe,OAAO;IAC5D,aAAa,cACX,UAAU,WAAW,MAAM,MAAM,OAAO,QAAQ,iBAAiB,KAAK,CAAC,CACzE;IACA,IAAI,QAAQ,iBAAiB,SAAS,MAAM;KAC1C,MAAM,OAAO,SAAS;KACtB,MAAM,UAAU,IAAI,MAAM,eAAe,IAAI,CAAC,CAAC,OAAO,MAAM,GAAG,KAAK,CAAA;KACpE,KAAK,UAAU,IAAI,GAAG,OAAO;KAC7B,IAAI,gBAAgB,KAAK,UAAU,OAAO,GAAG,OAAO,CAAC;IACvD;GACF;EACF,CAAC;CACH,EACF;AACF;;AAGA,SAAS,WAAW,SAAsB,OAAc,OAAgB;CACtE,MAAM,UACJ,IACG,MAAM,GAAG,MAAM,QAAQ,SAAS,eAAe,IAAI,CAAC,CACpD,OAAO,MAAM,GAAG,CAAC,CACjB,OAAO,OAAO,KAAK,CAAA;CACxB,MAAM,YAAY,eAAe,KAAK;CACtC,QAAQ,UAAU,IAAI,GAAG,OAAO;CAChC,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,GAAG,QAAQ,MAAM,YAAY,MAAM,KAAK;CAC5F,QAAQ,QAAQ,QAAQ,MAAM;CAC9B,aAAa;EACX,QAAQ,UAAU,OAAO,GAAG,OAAO;EACnC,KAAK,MAAM,QAAQ,OAAO,KAAK,SAAS,GAAG,QAAQ,MAAM,eAAe,IAAI;EAC5E,OAAO,QAAQ,QAAQ;CACzB;AACF"}
1
+ {"version":3,"file":"createUi.js","names":[],"sources":["../../src/config/createUi.ts"],"sourcesContent":["/**\n * 应用级配置:在宿主入口里 `app.use(createUi({ theme, lang }))`,所有 TSX 页面共享,不必逐页包裹 Provider。\n * 传入 ref 或 getter 即可在运行时切换主题与语言。\n */\nimport {\n computed,\n effectScope,\n toValue,\n watchEffect,\n type MaybeRefOrGetter,\n type ObjectPlugin,\n} from 'vue';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport {\n ConfigContext,\n defaultConfig,\n type Highlighter,\n type TextMatcher,\n type UiPermissions,\n type UiRouter,\n} from './context';\nimport type { ComponentDefaults } from './defaults';\nimport { mergeStyles, type ComponentStyles } from './styles';\nimport { defineLang, type Lang } from './lang/lang';\nimport { usePrefersDark } from '../utils/dom/media-query';\nimport type { WorkCalendar } from '../utils/data/workdays';\nimport type { HttpClient } from '../utils/request/http';\nimport { resolveTheme, themeVariables, type Theme, type ThemeInput } from './theme/theme';\n\n/** 应用级配置;theme 与 lang 可以传 ref 或 getter,运行时切换,其余在安装时确定 */\nexport interface UiOptions {\n /** 主题;不写时用亮色主题,也不改动页面根元素 */\n theme?: MaybeRefOrGetter<ThemeInput>;\n /** 只写要改的字段,其余用简体中文的默认值 */\n lang?: MaybeRefOrGetter<Partial<Lang>>;\n /** 代码高亮器(CodeBlock 用),如 `@zerodep-dev/vue-tsx-pro-ui/shiki` 的 createShikiHighlighter();不写时显示纯文本 */\n highlighter?: Highlighter;\n /** 额外的文字匹配,如 `@zerodep-dev/vue-tsx-pro-ui/pinyin` 的 createPinyinMatcher():选项过滤、命令面板认拼音;不写时只按字面匹配 */\n textMatcher?: TextMatcher;\n /** 组件默认值,如 `{ Button: { variant: 'outline' } }`(见 defaults.ts) */\n defaults?: ComponentDefaults;\n /** 组件的主题定制:追加样式、新增档位,如 `{ Button: { base: { root: { letterSpacing: '0.02em' } } } }`(见 styles.ts) */\n styles?: ComponentStyles;\n /** 路由适配:站内链接不刷新页面地跳转、导航组件判断当前页(见 UiRouter) */\n router?: UiRouter;\n /** 权限判断:`(权限点) => 用户有没有`,Can、useCan 据此控制按钮等界面;不写时一律放行(见 UiPermissions) */\n permissions?: UiPermissions;\n /** 请求客户端:createHttpClient({ baseURL, onRequest, onResponse }),或包一层 axios、ky(见 HttpClient) */\n http?: HttpClient;\n /** 工作日历:createWorkCalendar({ holidays, workdays }) 带上法定节假日与调休;不写时只按周末算 */\n workCalendar?: WorkCalendar;\n /** 按下时的波纹效果,默认 true;关掉后组件的 ripple prop 仍可单独打开 */\n ripple?: boolean;\n /**\n * 页面根元素也用主题的背景色、文字色与字体,并去掉 body 的默认外边距,默认 false。\n * 整页都由组件库主题管理的站点(如文档站)打开:页面边缘、回弹滚动露出的地方不再是浏览器的默认色,\n * AppShell 贴满窗口、四周不留 8px 的白边;配合 themeBootScript 时接手它写的行内颜色\n */\n paintDocument?: boolean;\n}\n\n/** paintDocument 时页面根元素的样式 */\nexport const documentStyles = css.create({\n // 字号不设:根元素的字号是 rem 的基准,留给浏览器(用户的字号设置)\n page: {\n backgroundColor: '_background',\n color: '_text',\n fontFamily: '_sans',\n lineHeight: '_normal',\n // macOS 上用灰度抗锯齿,深色底上的浅色文字不发虚;其他系统忽略\n WebkitFontSmoothing: 'antialiased',\n MozOsxFontSmoothing: 'grayscale',\n },\n // 浏览器给 body 的 8px 外边距:整页的外壳(AppShell)要贴满窗口\n body: { margin: 0 },\n});\n\n/** 服务端渲染时 `<html>` 与 `<body>` 要带的属性(createUi 在浏览器里写到页面根元素上的那些) */\nexport interface DocumentAttrs {\n /** `<html>` 的属性:主题的类、变量(style)、data-theme,传了 lang 时还有 lang、dir */\n html: Record<string, string>;\n /** `<body>` 的属性:paintDocument 时去掉外边距的类 */\n body: Record<string, string>;\n}\n\n/** createUi 的结果:Vue 插件,另外能给出服务端渲染时页面根元素的属性 */\nexport interface UiPlugin extends ObjectPlugin {\n /**\n * 服务端渲染:`<html>`、`<body>` 要带的属性,首屏就是这套主题与语言,不等客户端接管后再变。\n * 服务端不知道系统的明暗,跟随系统的主题按亮色给;`themeBootScript` 在页面加载前按用户的选择改过来\n */\n documentAttrs(): DocumentAttrs;\n}\n\n/**\n * 应用级配置的 Vue 插件:`app.use(createUi({ theme: { light: lightTheme, dark: darkTheme } }))`。\n * 主题的 CSS 变量写在页面根元素上,所有 TSX 页面共享;应用卸载时撤销。\n */\nexport function createUi(options: UiOptions = {}): UiPlugin {\n return {\n documentAttrs() {\n const html: Record<string, string> = {};\n const body: Record<string, string> = {};\n if (options.lang) {\n const lang = defineLang(defaultConfig.lang, toValue(options.lang));\n html.lang = lang.code;\n html.dir = lang.direction;\n }\n if (options.theme || options.paintDocument) {\n const theme = resolveTheme(toValue(options.theme) ?? defaultConfig.theme, false);\n const { classes, variables } = rootThemeAttrs(theme, options.paintDocument ?? false);\n if (classes.length) html.class = classes.join(' ');\n const style = Object.entries(variables)\n .map(([name, value]) => `${name}:${value}`)\n .join(';');\n if (style) html.style = style;\n html['data-theme'] = theme.name;\n if (options.paintDocument) body.class = css.attrs(documentStyles.body).class ?? '';\n }\n return { html, body };\n },\n install(app) {\n const scope = effectScope();\n app.onUnmount(() => scope.stop());\n scope.run(() => {\n const prefersDark = usePrefersDark();\n const theme = computed(() =>\n resolveTheme(toValue(options.theme) ?? defaultConfig.theme, prefersDark.value),\n );\n const lang = computed(() => defineLang(defaultConfig.lang, toValue(options.lang) ?? {}));\n app.provide(ConfigContext.key, {\n get theme() {\n return theme.value;\n },\n get lang() {\n return lang.value;\n },\n highlighter: options.highlighter,\n textMatcher: options.textMatcher,\n defaults: options.defaults ?? {},\n styles: mergeStyles({}, options.styles),\n router: options.router,\n permissions: options.permissions,\n http: options.http,\n workCalendar: options.workCalendar,\n ripple: options.ripple ?? true,\n });\n // 应用级的语言也写在页面根元素上(Provider 写在自己的元素上):读屏按 lang 选发音,\n // 从右到左的语言靠 dir 镜像排版与滚动条;没传 lang 时不动,宿主自己管\n if (options.lang && typeof document !== 'undefined') {\n const root = document.documentElement;\n const previous = { lang: root.lang, dir: root.dir };\n watchEffect(() => {\n root.lang = lang.value.code;\n root.dir = lang.value.direction;\n });\n app.onUnmount(() => Object.assign(root, previous));\n }\n // 应用级没有容器元素,主题变量挂在页面根元素上;变量名带 vtp- 前缀,不会与宿主冲突。\n // 只开 paintDocument、不传主题时用默认主题(整页也要有底色、字体,body 去掉外边距)\n if ((options.theme || options.paintDocument) && typeof document !== 'undefined') {\n const root = document.documentElement;\n // themeBootScript 在应用加载前写的行内颜色:交给主题的 class\n if (options.paintDocument) root.style.removeProperty('background-color');\n if (options.paintDocument) root.style.removeProperty('color');\n watchEffect((onCleanup) =>\n onCleanup(applyTheme(root, theme.value, options.paintDocument ?? false)),\n );\n if (options.paintDocument && document.body) {\n const body = document.body;\n const classes = css.attrs(documentStyles.body).class?.split(' ') ?? [];\n body.classList.add(...classes);\n app.onUnmount(() => body.classList.remove(...classes));\n }\n }\n });\n },\n };\n}\n\n/** 主题挂到页面根元素上的类与 CSS 变量;paint 时加上整页的底色与字体(浏览器里写到元素上,服务端写进 HTML) */\nfunction rootThemeAttrs(theme: Theme, paint: boolean) {\n const classes =\n css\n .attrs(...theme.styles, paint && documentStyles.page)\n .class?.split(' ')\n .filter(Boolean) ?? [];\n return { classes, variables: themeVariables(theme) };\n}\n\n/** 把主题的 class、CSS 变量与 data-theme 写到元素上,返回撤销函数 */\nfunction applyTheme(element: HTMLElement, theme: Theme, paint: boolean) {\n const { classes, variables } = rootThemeAttrs(theme, paint);\n element.classList.add(...classes);\n for (const [name, value] of Object.entries(variables)) element.style.setProperty(name, value);\n element.dataset.theme = theme.name;\n return () => {\n element.classList.remove(...classes);\n for (const name of Object.keys(variables)) element.style.removeProperty(name);\n delete element.dataset.theme;\n };\n}\n"],"mappings":";;;;;;;;;;;;;AA8DA,IAAa,iBAAiB,IAAI,OAAO;CAEvC,MAAM;EACJ,iBAAiB;EACjB,OAAO;EACP,YAAY;EACZ,YAAY;EAEZ,qBAAqB;EACrB,qBAAqB;CACvB;CAEA,MAAM,EAAE,QAAQ,EAAE;AACpB,CAAC;;;;;AAuBD,SAAgB,SAAS,UAAqB,CAAC,GAAa;CAC1D,OAAO;EACL,gBAAgB;GACd,MAAM,OAA+B,CAAC;GACtC,MAAM,OAA+B,CAAC;GACtC,IAAI,QAAQ,MAAM;IAChB,MAAM,OAAO,WAAW,cAAc,MAAM,QAAQ,QAAQ,IAAI,CAAC;IACjE,KAAK,OAAO,KAAK;IACjB,KAAK,MAAM,KAAK;GAClB;GACA,IAAI,QAAQ,SAAS,QAAQ,eAAe;IAC1C,MAAM,QAAQ,aAAa,QAAQ,QAAQ,KAAK,KAAK,cAAc,OAAO,KAAK;IAC/E,MAAM,EAAE,SAAS,cAAc,eAAe,OAAO,QAAQ,iBAAiB,KAAK;IACnF,IAAI,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,KAAK,GAAG;IACjD,MAAM,QAAQ,OAAO,QAAQ,SAAS,CAAC,CACpC,KAAK,CAAC,MAAM,WAAW,GAAG,KAAI,GAAI,OAAO,CAAC,CAC1C,KAAK,GAAG;IACX,IAAI,OAAO,KAAK,QAAQ;IACxB,KAAK,gBAAgB,MAAM;IAC3B,IAAI,QAAQ,eAAe,KAAK,QAAQ,IAAI,MAAM,eAAe,IAAI,CAAC,CAAC,SAAS;GAClF;GACA,OAAO;IAAE;IAAM;GAAK;EACtB;EACA,QAAQ,KAAK;GACX,MAAM,QAAQ,YAAY;GAC1B,IAAI,gBAAgB,MAAM,KAAK,CAAC;GAChC,MAAM,UAAU;IACd,MAAM,cAAc,eAAe;IACnC,MAAM,QAAQ,eACZ,aAAa,QAAQ,QAAQ,KAAK,KAAK,cAAc,OAAO,YAAY,KAAK,CAC/E;IACA,MAAM,OAAO,eAAe,WAAW,cAAc,MAAM,QAAQ,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC;IACvF,IAAI,QAAQ,cAAc,KAAK;KAC7B,IAAI,QAAQ;MACV,OAAO,MAAM;KACf;KACA,IAAI,OAAO;MACT,OAAO,KAAK;KACd;KACA,aAAa,QAAQ;KACrB,aAAa,QAAQ;KACrB,UAAU,QAAQ,YAAY,CAAC;KAC/B,QAAQ,YAAY,CAAC,GAAG,QAAQ,MAAM;KACtC,QAAQ,QAAQ;KAChB,aAAa,QAAQ;KACrB,MAAM,QAAQ;KACd,cAAc,QAAQ;KACtB,QAAQ,QAAQ,UAAU;IAC5B,CAAC;IAGD,IAAI,QAAQ,QAAQ,OAAO,aAAa,aAAa;KACnD,MAAM,OAAO,SAAS;KACtB,MAAM,WAAW;MAAE,MAAM,KAAK;MAAM,KAAK,KAAK;KAAI;KAClD,kBAAkB;MAChB,KAAK,OAAO,KAAK,MAAM;MACvB,KAAK,MAAM,KAAK,MAAM;KACxB,CAAC;KACD,IAAI,gBAAgB,OAAO,OAAO,MAAM,QAAQ,CAAC;IACnD;IAGA,KAAK,QAAQ,SAAS,QAAQ,kBAAkB,OAAO,aAAa,aAAa;KAC/E,MAAM,OAAO,SAAS;KAEtB,IAAI,QAAQ,eAAe,KAAK,MAAM,eAAe,kBAAkB;KACvE,IAAI,QAAQ,eAAe,KAAK,MAAM,eAAe,OAAO;KAC5D,aAAa,cACX,UAAU,WAAW,MAAM,MAAM,OAAO,QAAQ,iBAAiB,KAAK,CAAC,CACzE;KACA,IAAI,QAAQ,iBAAiB,SAAS,MAAM;MAC1C,MAAM,OAAO,SAAS;MACtB,MAAM,UAAU,IAAI,MAAM,eAAe,IAAI,CAAC,CAAC,OAAO,MAAM,GAAG,KAAK,CAAA;MACpE,KAAK,UAAU,IAAI,GAAG,OAAO;MAC7B,IAAI,gBAAgB,KAAK,UAAU,OAAO,GAAG,OAAO,CAAC;KACvD;IACF;GACF,CAAC;EACH;CACF;AACF;;AAGA,SAAS,eAAe,OAAc,OAAgB;CAMpD,OAAO;EAAE,SAJP,IACG,MAAM,GAAG,MAAM,QAAQ,SAAS,eAAe,IAAI,CAAC,CACpD,OAAO,MAAM,GAAG,CAAC,CACjB,OAAO,OAAO,KAAK,CAAA;EACN,WAAW,eAAe,KAAK;CAAE;AACrD;;AAGA,SAAS,WAAW,SAAsB,OAAc,OAAgB;CACtE,MAAM,EAAE,SAAS,cAAc,eAAe,OAAO,KAAK;CAC1D,QAAQ,UAAU,IAAI,GAAG,OAAO;CAChC,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,GAAG,QAAQ,MAAM,YAAY,MAAM,KAAK;CAC5F,QAAQ,QAAQ,QAAQ,MAAM;CAC9B,aAAa;EACX,QAAQ,UAAU,OAAO,GAAG,OAAO;EACnC,KAAK,MAAM,QAAQ,OAAO,KAAK,SAAS,GAAG,QAAQ,MAAM,eAAe,IAAI;EAC5E,OAAO,QAAQ,QAAQ;CACzB;AACF"}
@@ -11,6 +11,24 @@ var enUS = {
11
11
  close: "Close",
12
12
  imagePreview: (alt) => `View larger: ${alt}`,
13
13
  imageError: "Image failed to load",
14
+ requestFailed: "Request failed. Try again later.",
15
+ errorCodes: {
16
+ "http.network": "Network connection failed. Check your network and try again.",
17
+ "http.timeout": ({ seconds }) => typeof seconds === "number" ? `The request timed out after ${seconds} s. Try again later.` : "The request timed out. Try again later.",
18
+ "http.aborted": "The request was canceled.",
19
+ "http.status": ({ status }) => typeof status === "number" ? `The service is unavailable (${status}). Try again later.` : "The service is unavailable. Try again later.",
20
+ "http.parse": "The service returned a response that could not be read. Try again later.",
21
+ "query.request-invalid": "The query is not valid. Check it and try again.",
22
+ "query.empty-result": "The record does not exist or was deleted.",
23
+ "query.too-many-rows": "More than one record matched, so none was chosen.",
24
+ "query.unexpected-row-count": "Someone else changed or deleted this record. Refresh and try again.",
25
+ "query.statement-timeout": "The query timed out. Narrow it down and try again.",
26
+ "query.execution-failed": "The data operation failed. Try again later.",
27
+ "query.invalid-row": "The record is incomplete and cannot be saved.",
28
+ "query.batch-write-failed": "Some records could not be saved, so none were.",
29
+ "query.transaction-closed": "Saving was interrupted. Try again.",
30
+ "query.quota-exceeded": "Browser storage is full. Free up space and try again."
31
+ },
14
32
  lightboxLabel: "Image viewer",
15
33
  lightboxZoomIn: "Zoom in",
16
34
  lightboxZoomOut: "Zoom out",
@@ -276,12 +294,12 @@ var enUS = {
276
294
  peopleTypes: {
277
295
  user: "Person",
278
296
  department: "Department",
279
- position: "Position"
297
+ role: "Role"
280
298
  },
281
- peopleSearch: "Search people, departments, positions",
299
+ peopleSearch: "Search people, departments, roles",
282
300
  peoplePages: "Browse by",
283
301
  peopleOrg: "Organization",
284
- peoplePositions: "Positions",
302
+ peopleRoles: "Roles",
285
303
  peopleRecent: "Recent",
286
304
  peopleRoot: "All",
287
305
  peopleChildren: "Open",
@@ -1 +1 @@
1
- {"version":3,"file":"en-US.js","names":[],"sources":["../../../src/config/lang/en-US.ts"],"sourcesContent":["import zodMessages from 'zod/v4/locales/en.js';\nimport type { Lang } from './lang';\n\n/** English (United States) */\nexport const enUS: Lang = {\n code: 'en-US',\n direction: 'ltr',\n calendar: 'gregory',\n currency: 'USD',\n\n confirm: 'OK',\n cancel: 'Cancel',\n close: 'Close',\n imagePreview: (alt) => `View larger: ${alt}`,\n imageError: 'Image failed to load',\n lightboxLabel: 'Image viewer',\n lightboxZoomIn: 'Zoom in',\n lightboxZoomOut: 'Zoom out',\n lightboxRotateLeft: 'Rotate left',\n lightboxRotateRight: 'Rotate right',\n lightboxReset: 'Reset',\n lightboxDownload: 'Download',\n lightboxPrevious: 'Previous image',\n lightboxNext: 'Next image',\n lightboxCounter: (index, total) => `${index} of ${total}`,\n descriptionsCopy: (label) => `Copy ${label}`,\n fieldCompareHeaders: ['Field', 'Before', 'After', 'Change'],\n fieldCompareTo: 'changed to',\n fieldCompareNone: 'No changes',\n timelineShowMore: (count) => `Show ${count} more`,\n timelineShowLess: 'Show less',\n timelineDetails: 'Details',\n mentionsList: 'People to mention',\n mentionsEmpty: 'No matching people',\n checklistStatus: {\n done: 'done',\n todo: 'to do',\n overdue: 'overdue',\n blocked: 'blocked',\n skipped: 'not applicable',\n },\n checklistItemState: (label, state) => `${label}: ${state}`,\n checklistIconsLabel: (parts) => parts.join('; '),\n checklistSummary: (done, total) => `${done} of ${total} done`,\n chartExport: 'Export',\n chartExportImage: 'Export image (PNG)',\n chartExportData: 'Export data (CSV)',\n chartExportName: 'chart',\n chartZoom: 'Visible range',\n chartZoomReset: 'Show all',\n chartZoomIn: 'Zoom in',\n chartZoomOut: 'Zoom out',\n chartZoomFit: 'Fit to view',\n chartZoomWheelHint: 'Hold Ctrl and scroll to zoom the map',\n chartSeries: 'Series',\n chartStart: 'Start',\n chartEnd: 'End',\n chartDuration: 'Duration',\n chartToday: 'Today',\n chartDays: (days) => (days === 1 ? '1 day' : `${days} days`),\n sparklineSummary: (count, first, last, min, max) =>\n `${count} values, from ${first} to ${last}, low ${min}, high ${max}`,\n clear: 'Clear',\n loading: 'Loading',\n remove: 'Remove',\n copy: 'Copy',\n copied: 'Copied',\n emptyValue: '—',\n formRequired: 'Required',\n formErrorSummary: (count) => (count === 1 ? 'There is 1 problem' : `There are ${count} problems`),\n formErrorItem: (label, message) => `${label}: ${message}`,\n formIssues: zodMessages().localeError,\n leaveTitle: 'Leave this page?',\n leaveDescription: 'You have unsaved changes that will be lost.',\n leaveConfirm: 'Leave',\n\n toasterLabel: 'Notifications',\n\n linkNewWindow: ' (opens in a new window)',\n passwordShow: 'Show password',\n characterCount: (count, max) =>\n max == null ? `${count} characters` : `${count} of ${max} characters`,\n sliderMin: 'Minimum',\n sliderMax: 'Maximum',\n indicatorCount: (count) => `${count} new`,\n indicatorDot: 'New',\n avatarMore: (count) => `${count} more`,\n numberDecrement: 'Decrease',\n numberIncrement: 'Increase',\n comboboxToggle: 'Show options',\n tableSelectAll: 'Select all',\n tableSelectColumn: 'Select',\n tableSelectRow: (row) => `Select row ${row}`,\n tableResizeColumn: (column) => `Resize column “${column}”`,\n tableEmpty: 'No data',\n tableSummary: 'Total',\n tableSelectedCount: (count) => `${count} selected`,\n listResultCount: (count) => (count === 1 ? '1 option' : `${count} options`),\n listLoadFailed: 'Failed to load. Try again.',\n tableClearSelection: 'Clear selection',\n tableDetails: 'Details',\n tableRowDetails: (row) => `Details of ${row}`,\n tableFilterColumn: (column, active) => `Filter “${column}”${active ? ' (filtered)' : ''}`,\n tableFilterSearch: 'Search',\n tableFilterClear: 'Clear filter',\n tableColumnMenu: (column) => `Actions for column “${column}”`,\n tableSortAscending: 'Sort ascending',\n tableSortDescending: 'Sort descending',\n tableSortClear: 'Clear sort',\n tableSortPriority: (priority, direction) => `sort ${priority}, ${direction}`,\n tablePinStart: 'Pin to start',\n tablePinEnd: 'Pin to end',\n tableUnpin: 'Unpin',\n tableMoveBackward: 'Move earlier',\n tableMoveForward: 'Move later',\n tableHideColumn: 'Hide column',\n tableColumnSettings: 'Columns',\n tableColumnSettingsReset: 'Reset',\n chartEmpty: 'No data',\n chartCategory: 'Category',\n chartValue: 'Value',\n chartShare: 'Share',\n chartTotal: 'Total',\n chartFlow: 'Flow',\n chartFlowLabel: (source, target) => `${source} → ${target}`,\n chartIncrease: 'Increase',\n chartDecrease: 'Decrease',\n chartChange: 'Change',\n chartCumulative: 'Cumulative',\n chartStepRate: 'Step conversion',\n chartOverallRate: 'Overall conversion',\n chartStage: 'Stage',\n chartLink: 'Link',\n chartDegree: (count) => `${count} ${count === 1 ? 'link' : 'links'}`,\n treeToggle: (row) => `Children of ${row}`,\n splitterResize: 'Resize panes',\n splitterCollapse: 'Collapse',\n splitterExpand: 'Expand',\n fileDrop: 'Click or drop files here',\n fileTooLarge: (max) => `File must be at most ${max}`,\n fileTypeRejected: 'This file type is not supported',\n uploadFailed: 'Upload failed',\n uploadDone: 'Uploaded',\n uploadRetry: (file) => `Retry uploading ${file}`,\n uploadRemove: (file) => `Remove ${file}`,\n uploadAddImage: 'Add image',\n uploadPasteHint: 'You can also paste images',\n progressTarget: (value) => `target ${value}`,\n backToTop: 'Back to top',\n ellipsisExpand: 'More',\n ellipsisCollapse: 'Less',\n ratingStar: (value) => (value === 1 ? '1 star' : `${value} stars`),\n ratingSummary: (value, count) => (value == null ? 'Not rated' : `${value} out of ${count} stars`),\n resultStatus: {\n 403: {\n title: 'Access denied',\n description: 'You need more permissions to see this page. Ask an administrator for access.',\n },\n 404: {\n title: 'Page not found',\n description: 'The address may be wrong, or the page has moved.',\n },\n 500: {\n title: 'Something went wrong',\n description:\n 'The server could not handle the request. Try again later, and contact an administrator if it keeps happening.',\n },\n },\n sortableHandle: (item) => `Move ${item}`,\n sortableInstructions:\n 'Press Space to pick up, use the arrow keys to move, Space again to drop, Escape to cancel',\n sortableGrabbed: (item, position, total) => `Picked up ${item}, position ${position} of ${total}`,\n sortableMoved: (item, position, total) => `${item} moved to position ${position} of ${total}`,\n sortableDropped: (item, position, total) => `Dropped ${item}, position ${position} of ${total}`,\n sortableCancelled: (item, position) => `Cancelled, ${item} returned to position ${position}`,\n sortableGroupInstructions:\n 'Press space to pick up, use the up and down arrow keys to move within a group and the left and right arrow keys to change group, press space again to drop, Escape to cancel',\n sortableGroupGrabbed: (item, group, position) =>\n `Picked up ${item}, position ${position} in ${group}`,\n sortableOver: (item, group, position, reason) =>\n reason\n ? `${group}: cannot drop, ${reason}`\n : `${item} over ${group}, position ${position}, press space to drop`,\n sortableGroupDropped: (item, group, position) =>\n `Dropped ${item} in ${group}, position ${position}`,\n sortableGroupCancelled: (item, group, position) =>\n `Cancelled, ${item} returned to ${group}, position ${position}`,\n sortableRejected: (item, reason) => `Cannot move: ${reason}. ${item} returned`,\n tourPrevious: 'Back',\n tourNext: 'Next',\n tourFinish: 'Done',\n tourSkip: 'Skip',\n tourProgress: (current, total) => `${current} of ${total}`,\n selectEmpty: 'No options',\n selectPlaceholder: 'Select…',\n selectSearch: 'Search',\n selectNoMatch: 'No matching options',\n selectCreate: (text) => `Create “${text}”`,\n selectSummary: (labels) => labels.join(', '),\n selectMoreTags: (count) => `+${count}`,\n paginationTotal: (total) => `${total.toLocaleString('en-US')} items`,\n paginationRange: (from, to, total) =>\n `${from.toLocaleString('en-US')}–${to.toLocaleString('en-US')} of ${total.toLocaleString('en-US')} items`,\n pagination: 'Pagination',\n pageSizeOption: (size) => `${size} / page`,\n pageSizeLabel: 'Items per page',\n pageJumpBefore: 'Go to',\n pageJumpAfter: '',\n pageJumpLabel: 'Go to page',\n contextMenuLabel: 'More actions',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n pageLabel: (page) => `Page ${page}`,\n treeEmpty: 'No data',\n tabClose: (label) => `Close ${label}`,\n tabAdd: 'New tab',\n navBarMore: 'More',\n tabList: 'All tabs',\n tabScrollPrevious: 'Scroll back',\n tabScrollNext: 'Scroll forward',\n tabMoved: (label, position, total) => `Moved ${label} to position ${position} of ${total}`,\n treeNoMatch: 'No matching items',\n treeMoved: (item, parent, position) =>\n parent\n ? `Moved ${item} into ${parent} at position ${position}`\n : `Moved ${item} to the top level at position ${position}`,\n transferSource: 'Available',\n transferTarget: 'Selected',\n transferMoveTo: (title) => `Move to ${title}`,\n transferSelectAll: (title) => `Select all in ${title}`,\n transferCount: (checked, total) => `${checked} / ${total}`,\n transferMoved: (count, title) => `Moved ${count} ${count === 1 ? 'item' : 'items'} to ${title}`,\n conditionModes: { all: 'All of', any: 'Any of', none: 'None of', notAll: 'Not all of' },\n conditionMode: 'Match',\n conditionAnd: 'and',\n conditionOr: 'or',\n conditionOperators: {\n eq: 'equals',\n ne: 'does not equal',\n gt: 'greater than',\n gte: 'at least',\n lt: 'less than',\n lte: 'at most',\n between: 'between',\n in: 'is any of',\n notIn: 'is none of',\n contains: 'contains',\n notContains: 'does not contain',\n startsWith: 'starts with',\n exists: 'is not empty',\n empty: 'is empty',\n },\n conditionTypeOperators: {\n date: {\n eq: 'is',\n gt: 'is after',\n gte: 'is on or after',\n lt: 'is before',\n lte: 'is on or before',\n },\n select: { eq: 'is', ne: 'is not' },\n boolean: { eq: 'is' },\n },\n conditionTrue: 'Yes',\n conditionFalse: 'No',\n conditionTo: 'to',\n conditionRange: (low, high) =>\n low && high ? `${low} to ${high}` : low ? `${low} or more` : `${high} or less`,\n conditionValueSeparator: ', ',\n conditionAndJoiner: ', and ',\n conditionOrJoiner: ', or ',\n conditionNotPrefix: 'not: ',\n conditionField: 'Field',\n conditionOperator: 'Operator',\n conditionValue: (field) => `Value of ${field}`,\n conditionAddRule: 'Add condition',\n conditionAddGroup: 'Add group',\n conditionRemoveRule: 'Remove condition',\n conditionRemoveGroup: 'Remove group',\n conditionEmpty: 'No conditions yet',\n conditionGroup: 'Condition group',\n conditionRule: (index) => `Condition ${index}`,\n peopleTypes: { user: 'Person', department: 'Department', position: 'Position' },\n peopleSearch: 'Search people, departments, positions',\n peoplePages: 'Browse by',\n peopleOrg: 'Organization',\n peoplePositions: 'Positions',\n peopleRecent: 'Recent',\n peopleRoot: 'All',\n peopleChildren: 'Open',\n peopleOpen: (name) => `Open ${name}`,\n peopleCount: (count, max) => (max ? `${count} / ${max} selected` : `${count} selected`),\n peopleSelected: 'Selected',\n peopleRemove: (name) => `Remove ${name}`,\n peopleSelectAll: 'Select all',\n peopleEmpty: 'Nothing to choose here',\n peopleNoResult: 'No matches',\n peopleNothingSelected: 'Nothing selected yet',\n peoplePlaceholder: 'Choose people',\n breadcrumbs: 'Breadcrumb',\n breadcrumbsExpand: 'Show hidden levels',\n stepState: (state) =>\n ` (${{ complete: 'completed', upcoming: 'not started', error: 'error' }[state]})`,\n calendarPreviousMonth: 'Previous month',\n calendarNextMonth: 'Next month',\n calendarPreviousYear: 'Previous year',\n calendarNextYear: 'Next year',\n calendarYear: (year) => String(year),\n calendarQuarter: (quarter) => `Q${quarter}`,\n calendarBoardCount: (count) => `${count} ${count === 1 ? 'event' : 'events'}`,\n calendarBoardMore: (count) => `${count} more`,\n calendarPreviousDecade: 'Previous decade',\n calendarNextDecade: 'Next decade',\n calendarChooseMonth: (current) => `Choose month: ${current}`,\n calendarChooseYear: (current) => `Choose year: ${current}`,\n calendarWeek: 'Wk',\n calendarWeekNumber: (week) => `Week ${week}`,\n calendarToday: (date) => `Today, ${date}`,\n calendarPickEnd: 'Select an end date',\n datePickerOpen: 'Choose date',\n timePickerOpen: 'Choose time',\n dateRangeStart: 'Start date',\n dateRangeEnd: 'End date',\n dateRangePresets: 'Presets',\n datePickerPresets: 'Presets',\n datePickerThisQuarter: 'This quarter',\n dateRangePreset: {\n today: 'Today',\n yesterday: 'Yesterday',\n last7Days: 'Last 7 days',\n last30Days: 'Last 30 days',\n thisWeek: 'This week',\n thisMonth: 'This month',\n lastMonth: 'Last month',\n thisYear: 'This year',\n },\n timePickerNow: 'Now',\n dateFieldEmpty: 'Empty',\n dateFieldPlaceholders: {\n year: 'yyyy',\n month: 'mm',\n day: 'dd',\n quarter: 'q',\n week: 'ww',\n hour: '––',\n minute: '––',\n second: '––',\n dayPeriod: 'AM',\n },\n dateFieldPeriodPatterns: { quarter: 'Q{quarter} {year}', week: 'Week {week}, {year}' },\n\n modelViewerLoading: 'Loading model',\n modelViewerError: 'Couldn’t load the model',\n\n codeExpand: 'Show all',\n codeCollapse: 'Show less',\n headingAnchor: 'Link to this section',\n skipToContent: 'Skip to content',\n tableOfContents: 'On this page',\n drawerResize: 'Resize drawer',\n searchLabel: 'Search',\n searchPlaceholder: 'Search docs',\n searchEmpty: 'No results',\n themeLight: 'Light',\n themeSystem: 'System',\n themeDark: 'Dark',\n themePaper: 'Paper',\n themeMidnight: 'Midnight',\n themeHighContrast: 'High contrast',\n themeOcean: 'Ocean',\n themeForest: 'Forest',\n themeLemon: 'Lemon',\n themeSakura: 'Sakura',\n themeFestive: 'Festive',\n themeCyberpunk: 'Cyberpunk',\n themeCoffee: 'Coffee',\n colorPick: 'Pick a color',\n pagerLabel: 'Pagination',\n pagerPrevious: 'Previous',\n pagerNext: 'Next',\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"en-US.js","names":[],"sources":["../../../src/config/lang/en-US.ts"],"sourcesContent":["import zodMessages from 'zod/v4/locales/en.js';\nimport type { Lang } from './lang';\n\n/** English (United States) */\nexport const enUS: Lang = {\n code: 'en-US',\n direction: 'ltr',\n calendar: 'gregory',\n currency: 'USD',\n\n confirm: 'OK',\n cancel: 'Cancel',\n close: 'Close',\n imagePreview: (alt) => `View larger: ${alt}`,\n imageError: 'Image failed to load',\n requestFailed: 'Request failed. Try again later.',\n errorCodes: {\n 'http.network': 'Network connection failed. Check your network and try again.',\n 'http.timeout': ({ seconds }) =>\n typeof seconds === 'number'\n ? `The request timed out after ${seconds} s. Try again later.`\n : 'The request timed out. Try again later.',\n 'http.aborted': 'The request was canceled.',\n 'http.status': ({ status }) =>\n typeof status === 'number'\n ? `The service is unavailable (${status}). Try again later.`\n : 'The service is unavailable. Try again later.',\n 'http.parse': 'The service returned a response that could not be read. Try again later.',\n 'query.request-invalid': 'The query is not valid. Check it and try again.',\n 'query.empty-result': 'The record does not exist or was deleted.',\n 'query.too-many-rows': 'More than one record matched, so none was chosen.',\n 'query.unexpected-row-count':\n 'Someone else changed or deleted this record. Refresh and try again.',\n 'query.statement-timeout': 'The query timed out. Narrow it down and try again.',\n 'query.execution-failed': 'The data operation failed. Try again later.',\n 'query.invalid-row': 'The record is incomplete and cannot be saved.',\n 'query.batch-write-failed': 'Some records could not be saved, so none were.',\n 'query.transaction-closed': 'Saving was interrupted. Try again.',\n 'query.quota-exceeded': 'Browser storage is full. Free up space and try again.',\n },\n lightboxLabel: 'Image viewer',\n lightboxZoomIn: 'Zoom in',\n lightboxZoomOut: 'Zoom out',\n lightboxRotateLeft: 'Rotate left',\n lightboxRotateRight: 'Rotate right',\n lightboxReset: 'Reset',\n lightboxDownload: 'Download',\n lightboxPrevious: 'Previous image',\n lightboxNext: 'Next image',\n lightboxCounter: (index, total) => `${index} of ${total}`,\n descriptionsCopy: (label) => `Copy ${label}`,\n fieldCompareHeaders: ['Field', 'Before', 'After', 'Change'],\n fieldCompareTo: 'changed to',\n fieldCompareNone: 'No changes',\n timelineShowMore: (count) => `Show ${count} more`,\n timelineShowLess: 'Show less',\n timelineDetails: 'Details',\n mentionsList: 'People to mention',\n mentionsEmpty: 'No matching people',\n checklistStatus: {\n done: 'done',\n todo: 'to do',\n overdue: 'overdue',\n blocked: 'blocked',\n skipped: 'not applicable',\n },\n checklistItemState: (label, state) => `${label}: ${state}`,\n checklistIconsLabel: (parts) => parts.join('; '),\n checklistSummary: (done, total) => `${done} of ${total} done`,\n chartExport: 'Export',\n chartExportImage: 'Export image (PNG)',\n chartExportData: 'Export data (CSV)',\n chartExportName: 'chart',\n chartZoom: 'Visible range',\n chartZoomReset: 'Show all',\n chartZoomIn: 'Zoom in',\n chartZoomOut: 'Zoom out',\n chartZoomFit: 'Fit to view',\n chartZoomWheelHint: 'Hold Ctrl and scroll to zoom the map',\n chartSeries: 'Series',\n chartStart: 'Start',\n chartEnd: 'End',\n chartDuration: 'Duration',\n chartToday: 'Today',\n chartDays: (days) => (days === 1 ? '1 day' : `${days} days`),\n sparklineSummary: (count, first, last, min, max) =>\n `${count} values, from ${first} to ${last}, low ${min}, high ${max}`,\n clear: 'Clear',\n loading: 'Loading',\n remove: 'Remove',\n copy: 'Copy',\n copied: 'Copied',\n emptyValue: '—',\n formRequired: 'Required',\n formErrorSummary: (count) => (count === 1 ? 'There is 1 problem' : `There are ${count} problems`),\n formErrorItem: (label, message) => `${label}: ${message}`,\n formIssues: zodMessages().localeError,\n leaveTitle: 'Leave this page?',\n leaveDescription: 'You have unsaved changes that will be lost.',\n leaveConfirm: 'Leave',\n\n toasterLabel: 'Notifications',\n\n linkNewWindow: ' (opens in a new window)',\n passwordShow: 'Show password',\n characterCount: (count, max) =>\n max == null ? `${count} characters` : `${count} of ${max} characters`,\n sliderMin: 'Minimum',\n sliderMax: 'Maximum',\n indicatorCount: (count) => `${count} new`,\n indicatorDot: 'New',\n avatarMore: (count) => `${count} more`,\n numberDecrement: 'Decrease',\n numberIncrement: 'Increase',\n comboboxToggle: 'Show options',\n tableSelectAll: 'Select all',\n tableSelectColumn: 'Select',\n tableSelectRow: (row) => `Select row ${row}`,\n tableResizeColumn: (column) => `Resize column “${column}”`,\n tableEmpty: 'No data',\n tableSummary: 'Total',\n tableSelectedCount: (count) => `${count} selected`,\n listResultCount: (count) => (count === 1 ? '1 option' : `${count} options`),\n listLoadFailed: 'Failed to load. Try again.',\n tableClearSelection: 'Clear selection',\n tableDetails: 'Details',\n tableRowDetails: (row) => `Details of ${row}`,\n tableFilterColumn: (column, active) => `Filter “${column}”${active ? ' (filtered)' : ''}`,\n tableFilterSearch: 'Search',\n tableFilterClear: 'Clear filter',\n tableColumnMenu: (column) => `Actions for column “${column}”`,\n tableSortAscending: 'Sort ascending',\n tableSortDescending: 'Sort descending',\n tableSortClear: 'Clear sort',\n tableSortPriority: (priority, direction) => `sort ${priority}, ${direction}`,\n tablePinStart: 'Pin to start',\n tablePinEnd: 'Pin to end',\n tableUnpin: 'Unpin',\n tableMoveBackward: 'Move earlier',\n tableMoveForward: 'Move later',\n tableHideColumn: 'Hide column',\n tableColumnSettings: 'Columns',\n tableColumnSettingsReset: 'Reset',\n chartEmpty: 'No data',\n chartCategory: 'Category',\n chartValue: 'Value',\n chartShare: 'Share',\n chartTotal: 'Total',\n chartFlow: 'Flow',\n chartFlowLabel: (source, target) => `${source} → ${target}`,\n chartIncrease: 'Increase',\n chartDecrease: 'Decrease',\n chartChange: 'Change',\n chartCumulative: 'Cumulative',\n chartStepRate: 'Step conversion',\n chartOverallRate: 'Overall conversion',\n chartStage: 'Stage',\n chartLink: 'Link',\n chartDegree: (count) => `${count} ${count === 1 ? 'link' : 'links'}`,\n treeToggle: (row) => `Children of ${row}`,\n splitterResize: 'Resize panes',\n splitterCollapse: 'Collapse',\n splitterExpand: 'Expand',\n fileDrop: 'Click or drop files here',\n fileTooLarge: (max) => `File must be at most ${max}`,\n fileTypeRejected: 'This file type is not supported',\n uploadFailed: 'Upload failed',\n uploadDone: 'Uploaded',\n uploadRetry: (file) => `Retry uploading ${file}`,\n uploadRemove: (file) => `Remove ${file}`,\n uploadAddImage: 'Add image',\n uploadPasteHint: 'You can also paste images',\n progressTarget: (value) => `target ${value}`,\n backToTop: 'Back to top',\n ellipsisExpand: 'More',\n ellipsisCollapse: 'Less',\n ratingStar: (value) => (value === 1 ? '1 star' : `${value} stars`),\n ratingSummary: (value, count) => (value == null ? 'Not rated' : `${value} out of ${count} stars`),\n resultStatus: {\n 403: {\n title: 'Access denied',\n description: 'You need more permissions to see this page. Ask an administrator for access.',\n },\n 404: {\n title: 'Page not found',\n description: 'The address may be wrong, or the page has moved.',\n },\n 500: {\n title: 'Something went wrong',\n description:\n 'The server could not handle the request. Try again later, and contact an administrator if it keeps happening.',\n },\n },\n sortableHandle: (item) => `Move ${item}`,\n sortableInstructions:\n 'Press Space to pick up, use the arrow keys to move, Space again to drop, Escape to cancel',\n sortableGrabbed: (item, position, total) => `Picked up ${item}, position ${position} of ${total}`,\n sortableMoved: (item, position, total) => `${item} moved to position ${position} of ${total}`,\n sortableDropped: (item, position, total) => `Dropped ${item}, position ${position} of ${total}`,\n sortableCancelled: (item, position) => `Cancelled, ${item} returned to position ${position}`,\n sortableGroupInstructions:\n 'Press space to pick up, use the up and down arrow keys to move within a group and the left and right arrow keys to change group, press space again to drop, Escape to cancel',\n sortableGroupGrabbed: (item, group, position) =>\n `Picked up ${item}, position ${position} in ${group}`,\n sortableOver: (item, group, position, reason) =>\n reason\n ? `${group}: cannot drop, ${reason}`\n : `${item} over ${group}, position ${position}, press space to drop`,\n sortableGroupDropped: (item, group, position) =>\n `Dropped ${item} in ${group}, position ${position}`,\n sortableGroupCancelled: (item, group, position) =>\n `Cancelled, ${item} returned to ${group}, position ${position}`,\n sortableRejected: (item, reason) => `Cannot move: ${reason}. ${item} returned`,\n tourPrevious: 'Back',\n tourNext: 'Next',\n tourFinish: 'Done',\n tourSkip: 'Skip',\n tourProgress: (current, total) => `${current} of ${total}`,\n selectEmpty: 'No options',\n selectPlaceholder: 'Select…',\n selectSearch: 'Search',\n selectNoMatch: 'No matching options',\n selectCreate: (text) => `Create “${text}”`,\n selectSummary: (labels) => labels.join(', '),\n selectMoreTags: (count) => `+${count}`,\n paginationTotal: (total) => `${total.toLocaleString('en-US')} items`,\n paginationRange: (from, to, total) =>\n `${from.toLocaleString('en-US')}–${to.toLocaleString('en-US')} of ${total.toLocaleString('en-US')} items`,\n pagination: 'Pagination',\n pageSizeOption: (size) => `${size} / page`,\n pageSizeLabel: 'Items per page',\n pageJumpBefore: 'Go to',\n pageJumpAfter: '',\n pageJumpLabel: 'Go to page',\n contextMenuLabel: 'More actions',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n pageLabel: (page) => `Page ${page}`,\n treeEmpty: 'No data',\n tabClose: (label) => `Close ${label}`,\n tabAdd: 'New tab',\n navBarMore: 'More',\n tabList: 'All tabs',\n tabScrollPrevious: 'Scroll back',\n tabScrollNext: 'Scroll forward',\n tabMoved: (label, position, total) => `Moved ${label} to position ${position} of ${total}`,\n treeNoMatch: 'No matching items',\n treeMoved: (item, parent, position) =>\n parent\n ? `Moved ${item} into ${parent} at position ${position}`\n : `Moved ${item} to the top level at position ${position}`,\n transferSource: 'Available',\n transferTarget: 'Selected',\n transferMoveTo: (title) => `Move to ${title}`,\n transferSelectAll: (title) => `Select all in ${title}`,\n transferCount: (checked, total) => `${checked} / ${total}`,\n transferMoved: (count, title) => `Moved ${count} ${count === 1 ? 'item' : 'items'} to ${title}`,\n conditionModes: { all: 'All of', any: 'Any of', none: 'None of', notAll: 'Not all of' },\n conditionMode: 'Match',\n conditionAnd: 'and',\n conditionOr: 'or',\n conditionOperators: {\n eq: 'equals',\n ne: 'does not equal',\n gt: 'greater than',\n gte: 'at least',\n lt: 'less than',\n lte: 'at most',\n between: 'between',\n in: 'is any of',\n notIn: 'is none of',\n contains: 'contains',\n notContains: 'does not contain',\n startsWith: 'starts with',\n exists: 'is not empty',\n empty: 'is empty',\n },\n conditionTypeOperators: {\n date: {\n eq: 'is',\n gt: 'is after',\n gte: 'is on or after',\n lt: 'is before',\n lte: 'is on or before',\n },\n select: { eq: 'is', ne: 'is not' },\n boolean: { eq: 'is' },\n },\n conditionTrue: 'Yes',\n conditionFalse: 'No',\n conditionTo: 'to',\n conditionRange: (low, high) =>\n low && high ? `${low} to ${high}` : low ? `${low} or more` : `${high} or less`,\n conditionValueSeparator: ', ',\n conditionAndJoiner: ', and ',\n conditionOrJoiner: ', or ',\n conditionNotPrefix: 'not: ',\n conditionField: 'Field',\n conditionOperator: 'Operator',\n conditionValue: (field) => `Value of ${field}`,\n conditionAddRule: 'Add condition',\n conditionAddGroup: 'Add group',\n conditionRemoveRule: 'Remove condition',\n conditionRemoveGroup: 'Remove group',\n conditionEmpty: 'No conditions yet',\n conditionGroup: 'Condition group',\n conditionRule: (index) => `Condition ${index}`,\n peopleTypes: { user: 'Person', department: 'Department', role: 'Role' },\n peopleSearch: 'Search people, departments, roles',\n peoplePages: 'Browse by',\n peopleOrg: 'Organization',\n peopleRoles: 'Roles',\n peopleRecent: 'Recent',\n peopleRoot: 'All',\n peopleChildren: 'Open',\n peopleOpen: (name) => `Open ${name}`,\n peopleCount: (count, max) => (max ? `${count} / ${max} selected` : `${count} selected`),\n peopleSelected: 'Selected',\n peopleRemove: (name) => `Remove ${name}`,\n peopleSelectAll: 'Select all',\n peopleEmpty: 'Nothing to choose here',\n peopleNoResult: 'No matches',\n peopleNothingSelected: 'Nothing selected yet',\n peoplePlaceholder: 'Choose people',\n breadcrumbs: 'Breadcrumb',\n breadcrumbsExpand: 'Show hidden levels',\n stepState: (state) =>\n ` (${{ complete: 'completed', upcoming: 'not started', error: 'error' }[state]})`,\n calendarPreviousMonth: 'Previous month',\n calendarNextMonth: 'Next month',\n calendarPreviousYear: 'Previous year',\n calendarNextYear: 'Next year',\n calendarYear: (year) => String(year),\n calendarQuarter: (quarter) => `Q${quarter}`,\n calendarBoardCount: (count) => `${count} ${count === 1 ? 'event' : 'events'}`,\n calendarBoardMore: (count) => `${count} more`,\n calendarPreviousDecade: 'Previous decade',\n calendarNextDecade: 'Next decade',\n calendarChooseMonth: (current) => `Choose month: ${current}`,\n calendarChooseYear: (current) => `Choose year: ${current}`,\n calendarWeek: 'Wk',\n calendarWeekNumber: (week) => `Week ${week}`,\n calendarToday: (date) => `Today, ${date}`,\n calendarPickEnd: 'Select an end date',\n datePickerOpen: 'Choose date',\n timePickerOpen: 'Choose time',\n dateRangeStart: 'Start date',\n dateRangeEnd: 'End date',\n dateRangePresets: 'Presets',\n datePickerPresets: 'Presets',\n datePickerThisQuarter: 'This quarter',\n dateRangePreset: {\n today: 'Today',\n yesterday: 'Yesterday',\n last7Days: 'Last 7 days',\n last30Days: 'Last 30 days',\n thisWeek: 'This week',\n thisMonth: 'This month',\n lastMonth: 'Last month',\n thisYear: 'This year',\n },\n timePickerNow: 'Now',\n dateFieldEmpty: 'Empty',\n dateFieldPlaceholders: {\n year: 'yyyy',\n month: 'mm',\n day: 'dd',\n quarter: 'q',\n week: 'ww',\n hour: '––',\n minute: '––',\n second: '––',\n dayPeriod: 'AM',\n },\n dateFieldPeriodPatterns: { quarter: 'Q{quarter} {year}', week: 'Week {week}, {year}' },\n\n modelViewerLoading: 'Loading model',\n modelViewerError: 'Couldn’t load the model',\n\n codeExpand: 'Show all',\n codeCollapse: 'Show less',\n headingAnchor: 'Link to this section',\n skipToContent: 'Skip to content',\n tableOfContents: 'On this page',\n drawerResize: 'Resize drawer',\n searchLabel: 'Search',\n searchPlaceholder: 'Search docs',\n searchEmpty: 'No results',\n themeLight: 'Light',\n themeSystem: 'System',\n themeDark: 'Dark',\n themePaper: 'Paper',\n themeMidnight: 'Midnight',\n themeHighContrast: 'High contrast',\n themeOcean: 'Ocean',\n themeForest: 'Forest',\n themeLemon: 'Lemon',\n themeSakura: 'Sakura',\n themeFestive: 'Festive',\n themeCyberpunk: 'Cyberpunk',\n themeCoffee: 'Coffee',\n colorPick: 'Pick a color',\n pagerLabel: 'Pagination',\n pagerPrevious: 'Previous',\n pagerNext: 'Next',\n};\n"],"mappings":"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"}
@@ -33,7 +33,8 @@ export declare function useFormat(): {
33
33
  fileSize: (bytes: number) => string;
34
34
  /**
35
35
  * 日期时间,带上语言的时区、日历与小时制;DateValue 按语言时区换算。
36
- * 也接受日期组件的 ISO 值:'2026-10-20'、'2026-10-20T14:30'、'14:30'(只有时间时配 timeStyle),格式不对时原样返回
36
+ * 也接受日期组件的 ISO 值:'2026-10-20'、'2026-10-20T14:30'、'14:30'(只有时间时配 timeStyle),
37
+ * 以及后端给的时刻(带 Z 或时差:'2026-10-20T06:30:00.19Z',按语言的时区显示);格式不对时原样返回
37
38
  */
38
39
  date: (value: Date | DateValue | string, options?: Intl.DateTimeFormatOptions) => string;
39
40
  /**
@@ -37,7 +37,8 @@ function useFormat() {
37
37
  },
38
38
  /**
39
39
  * 日期时间,带上语言的时区、日历与小时制;DateValue 按语言时区换算。
40
- * 也接受日期组件的 ISO 值:'2026-10-20'、'2026-10-20T14:30'、'14:30'(只有时间时配 timeStyle),格式不对时原样返回
40
+ * 也接受日期组件的 ISO 值:'2026-10-20'、'2026-10-20T14:30'、'14:30'(只有时间时配 timeStyle),
41
+ * 以及后端给的时刻(带 Z 或时差:'2026-10-20T06:30:00.19Z',按语言的时区显示);格式不对时原样返回
41
42
  */
42
43
  date: (value, options = { dateStyle: "medium" }) => {
43
44
  const parsed = typeof value === "string" ? parseIsoValue(value) : value;
@@ -101,8 +102,14 @@ function toIntl(value) {
101
102
  if (typeof value === "object") return value.toString();
102
103
  return typeof value === "string" ? value : value;
103
104
  }
104
- /** 日期组件的 ISO 值 → DateValue:日期、日期时间,或只有时间(放在任意一天上) */
105
+ /** 带 Z 或时差的 ISO 时刻(后端给的 timestamptz) */
106
+ var ABSOLUTE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})$/;
107
+ /** 日期组件的 ISO 值 → DateValue:日期、日期时间,或只有时间(放在任意一天上);带时差的时刻 → Date */
105
108
  function parseIsoValue(value) {
109
+ if (ABSOLUTE.test(value)) {
110
+ const instant = new Date(value);
111
+ return Number.isNaN(instant.getTime()) ? null : instant;
112
+ }
106
113
  const time = parseIsoTime(value);
107
114
  if (time) return new CalendarDateTime(2e3, 1, 1, time.hour, time.minute, time.second);
108
115
  return parseIsoDateTime(value) ?? parseIsoDate(value);
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","names":[],"sources":["../../../src/config/lang/format.ts"],"sourcesContent":["/**\n * 按当前语言格式化数字、金额与日期:`const format = useFormat()`,之后 `format.currency(19.9)`。\n * 格式化器按“语言 + 选项”缓存,重复调用不再新建。\n *\n * 数字的格式是 NumericFormat:Intl.NumberFormat 的选项,加上缩放与单位文字,\n * `format.number(155353.2, { scale: 10_000, maximumFractionDigits: 2, suffix: '万元' })` → `15.54 万元`。\n * 组件的数字格式属性(AnimatedNumber、Stat、图表、表格列)都是它。\n */\nimport {\n CalendarDateTime,\n DateFormatter,\n getLocalTimeZone,\n type DateValue,\n} from '@internationalized/date';\nimport type Decimal from 'decimal.js';\nimport {\n parseIsoDate,\n parseIsoDateTime,\n parseIsoTime,\n relativeUnit,\n toInstant,\n} from '../../utils/data/date';\nimport { cachedIntl } from '../../utils/data/intl-cache';\nimport { numericText, shiftDecimal } from '../../utils/data/numeric';\nimport { useLang } from '../context';\nimport type { Lang } from './lang';\n\n/** 字符串与 Decimal 按十进制原样格式化,不经过浮点数,金额不丢精度 */\ntype NumberInput = number | bigint | string | Decimal;\n\n/** 数字的显示格式:Intl.NumberFormat 的选项,加上缩放与单位文字 */\nexport interface NumericFormat extends Intl.NumberFormatOptions {\n /**\n * 先除以它再显示:`10_000` 表示以“万”为单位(155353.2 → 15.53532,再按小数位取舍)。\n * 10 的整数次幂按十进制移动小数点,Decimal 与大整数不丢精度;其他值按浮点数相除\n */\n scale?: number;\n /** 跟在数字后面的单位文字,如“万元”“元/件”;与数字之间是不换行的空格 */\n suffix?: string;\n}\n\n/** 按当前语言格式化数字、金额、百分比与日期;在渲染函数里调用方法即可随语言切换 */\nexport function useFormat() {\n const lang = useLang();\n return {\n /**\n * 数字:`format.number(1234.5)` → `1,234.5`;`{ style: 'currency' }` 不写币种时用语言的币种,\n * 缩放与单位见 NumericFormat\n */\n number: (value: NumberInput, options: NumericFormat = {}) =>\n formatNumeric(lang, value, options),\n /** 金额,默认使用语言的币种:`format.currency(new Decimal('19.9'))` → `¥19.90` */\n currency: (value: NumberInput, currency = lang.currency) =>\n formatNumeric(lang, value, { style: 'currency', currency }),\n /** 文件大小,按 1000 进位取合适的单位:`format.fileSize(1_234_567)` → `1.2 MB` */\n fileSize: (bytes: number) => {\n const exponent = Math.min(\n Math.max(Math.floor(Math.log10(Math.max(bytes, 1)) / 3), 0),\n FILE_SIZE_UNITS.length - 1,\n );\n return numberFormatter(lang, {\n style: 'unit',\n unit: FILE_SIZE_UNITS[exponent],\n maximumFractionDigits: exponent === 0 ? 0 : 1,\n }).format(bytes / 1000 ** exponent);\n },\n /**\n * 日期时间,带上语言的时区、日历与小时制;DateValue 按语言时区换算。\n * 也接受日期组件的 ISO 值:'2026-10-20'、'2026-10-20T14:30'、'14:30'(只有时间时配 timeStyle),格式不对时原样返回\n */\n date: (\n value: Date | DateValue | string,\n options: Intl.DateTimeFormatOptions = { dateStyle: 'medium' },\n ) => {\n const parsed = typeof value === 'string' ? parseIsoValue(value) : value;\n if (parsed == null) return value as string;\n const date =\n parsed instanceof Date ? parsed : parsed.toDate(lang.timeZone ?? getLocalTimeZone());\n return dateFormatter(lang, options).format(date);\n },\n /**\n * 相对现在的时间,自动取合适的单位:`format.relative(date)` → “3 分钟前”“明天”“2 年后”。\n * 值同 date;不带时区的 ISO 值按语言的时区算。now 默认此刻(组件里随时钟更新的传进来)\n */\n relative: (\n value: Date | DateValue | string,\n { now = Date.now(), ...options }: RelativeFormatOptions = {},\n ) => {\n const instant = toInstant(value, lang.timeZone ?? getLocalTimeZone());\n if (Number.isNaN(instant)) return typeof value === 'string' ? value : '';\n const { value: amount, unit } = relativeUnit(instant - now);\n const key = `relative|${lang.code}|${JSON.stringify(options)}`;\n const formatter = cachedIntl(\n key,\n () => new Intl.RelativeTimeFormat(lang.code, { numeric: 'auto', ...options }),\n );\n return formatter.format(amount, unit);\n },\n };\n}\n\n/** format.relative 的选项 */\nexport interface RelativeFormatOptions extends Intl.RelativeTimeFormatOptions {\n /** 以哪个时刻为“现在”(毫秒时间戳),默认此刻 */\n now?: number;\n}\n\n// ───────── 内部实现 ─────────\n\n/** Intl 支持的文件大小单位(SI,1000 进位) */\nconst FILE_SIZE_UNITS = ['byte', 'kilobyte', 'megabyte', 'gigabyte', 'terabyte'] as const;\n\nfunction numberFormatter(lang: Lang, options: Intl.NumberFormatOptions) {\n const key = `number|${lang.code}|${JSON.stringify(options)}`;\n return cachedIntl(key, () => new Intl.NumberFormat(lang.code, options));\n}\n\nfunction formatNumeric(\n lang: Lang,\n value: NumberInput,\n { scale, suffix, ...options }: NumericFormat,\n) {\n if (options.style === 'currency' && !options.currency) options.currency = lang.currency;\n const text = numberFormatter(lang, options).format(scaled(value, scale));\n return suffix ? `${text} ${suffix}` : text;\n}\n\n/** 除以 scale:10 的整数次幂按十进制移位(精确),其他值按浮点数相除 */\nfunction scaled(value: NumberInput, scale: number | undefined) {\n if (scale == null || scale === 1) return toIntl(value);\n const places = Math.log10(scale);\n if (!Number.isInteger(places)) return Number(toIntl(value)) / scale;\n const text = typeof value === 'string' ? value.trim() : numericText(value);\n return shiftDecimal(text, places) as Intl.StringNumericLiteral;\n}\n\nfunction dateFormatter(lang: Lang, options: Intl.DateTimeFormatOptions) {\n const resolved: Intl.DateTimeFormatOptions = {\n timeZone: lang.timeZone,\n calendar: lang.calendar,\n hourCycle: lang.hourCycle,\n ...options,\n };\n const key = `date|${lang.code}|${JSON.stringify(resolved)}`;\n return cachedIntl(key, () => new DateFormatter(lang.code, resolved));\n}\n\n/** Intl 接受数字字符串(StringNumericLiteral);Decimal 先转成字符串 */\nfunction toIntl(value: NumberInput): number | bigint | Intl.StringNumericLiteral {\n if (typeof value === 'object') return value.toString() as Intl.StringNumericLiteral;\n return typeof value === 'string' ? (value as Intl.StringNumericLiteral) : value;\n}\n\n/** 日期组件的 ISO 值 → DateValue:日期、日期时间,或只有时间(放在任意一天上) */\nfunction parseIsoValue(value: string): DateValue | null {\n const time = parseIsoTime(value);\n if (time) return new CalendarDateTime(2000, 1, 1, time.hour, time.minute, time.second);\n return parseIsoDateTime(value) ?? parseIsoDate(value);\n}\n"],"mappings":";;;;;;;;;;;;;;;AA0CA,SAAgB,YAAY;CAC1B,MAAM,OAAO,QAAQ;CACrB,OAAO;;;;;EAKL,SAAS,OAAoB,UAAyB,CAAC,MACrD,cAAc,MAAM,OAAO,OAAO;;EAEpC,WAAW,OAAoB,WAAW,KAAK,aAC7C,cAAc,MAAM,OAAO;GAAE,OAAO;GAAY;EAAS,CAAC;;EAE5D,WAAW,UAAkB;GAC3B,MAAM,WAAW,KAAK,IACpB,KAAK,IAAI,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAC1D,gBAAgB,SAAS,CAC3B;GACA,OAAO,gBAAgB,MAAM;IAC3B,OAAO;IACP,MAAM,gBAAgB;IACtB,uBAAuB,aAAa,IAAI,IAAI;GAC9C,CAAC,CAAC,CAAC,OAAO,QAAQ,OAAQ,QAAQ;EACpC;;;;;EAKA,OACE,OACA,UAAsC,EAAE,WAAW,SAAS,MACzD;GACH,MAAM,SAAS,OAAO,UAAU,WAAW,cAAc,KAAK,IAAI;GAClE,IAAI,UAAU,MAAM,OAAO;GAC3B,MAAM,OACJ,kBAAkB,OAAO,SAAS,OAAO,OAAO,KAAK,YAAY,iBAAiB,CAAC;GACrF,OAAO,cAAc,MAAM,OAAO,CAAC,CAAC,OAAO,IAAI;EACjD;;;;;EAKA,WACE,OACA,EAAE,MAAM,KAAK,IAAI,GAAG,GAAG,YAAmC,CAAC,MACxD;GACH,MAAM,UAAU,UAAU,OAAO,KAAK,YAAY,iBAAiB,CAAC;GACpE,IAAI,OAAO,MAAM,OAAO,GAAG,OAAO,OAAO,UAAU,WAAW,QAAQ;GACtE,MAAM,EAAE,OAAO,QAAQ,SAAS,aAAa,UAAU,GAAG;GAC1D,MAAM,MAAM,YAAY,KAAK,KAAK,GAAG,KAAK,UAAU,OAAO;GAK3D,OAJkB,WAChB,WACM,IAAI,KAAK,mBAAmB,KAAK,MAAM;IAAE,SAAS;IAAQ,GAAG;GAAQ,CAAC,CAEvE,CAAA,CAAU,OAAO,QAAQ,IAAI;EACtC;CACF;AACF;;AAWA,IAAM,kBAAkB;CAAC;CAAQ;CAAY;CAAY;CAAY;AAAU;AAE/E,SAAS,gBAAgB,MAAY,SAAmC;CACtE,MAAM,MAAM,UAAU,KAAK,KAAK,GAAG,KAAK,UAAU,OAAO;CACzD,OAAO,WAAW,WAAW,IAAI,KAAK,aAAa,KAAK,MAAM,OAAO,CAAC;AACxE;AAEA,SAAS,cACP,MACA,OACA,EAAE,OAAO,QAAQ,GAAG,WACpB;CACA,IAAI,QAAQ,UAAU,cAAc,CAAC,QAAQ,UAAU,QAAQ,WAAW,KAAK;CAC/E,MAAM,OAAO,gBAAgB,MAAM,OAAO,CAAC,CAAC,OAAO,OAAO,OAAO,KAAK,CAAC;CACvE,OAAO,SAAS,GAAG,KAAK,GAAG,WAAW;AACxC;;AAGA,SAAS,OAAO,OAAoB,OAA2B;CAC7D,IAAI,SAAS,QAAQ,UAAU,GAAG,OAAO,OAAO,KAAK;CACrD,MAAM,SAAS,KAAK,MAAM,KAAK;CAC/B,IAAI,CAAC,OAAO,UAAU,MAAM,GAAG,OAAO,OAAO,OAAO,KAAK,CAAC,IAAI;CAC9D,MAAM,OAAO,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI,YAAY,KAAK;CACzE,OAAO,aAAa,MAAM,MAAM;AAClC;AAEA,SAAS,cAAc,MAAY,SAAqC;CACtE,MAAM,WAAuC;EAC3C,UAAU,KAAK;EACf,UAAU,KAAK;EACf,WAAW,KAAK;EAChB,GAAG;CACL;CACA,MAAM,MAAM,QAAQ,KAAK,KAAK,GAAG,KAAK,UAAU,QAAQ;CACxD,OAAO,WAAW,WAAW,IAAI,cAAc,KAAK,MAAM,QAAQ,CAAC;AACrE;;AAGA,SAAS,OAAO,OAAiE;CAC/E,IAAI,OAAO,UAAU,UAAU,OAAO,MAAM,SAAS;CACrD,OAAO,OAAO,UAAU,WAAY,QAAsC;AAC5E;;AAGA,SAAS,cAAc,OAAiC;CACtD,MAAM,OAAO,aAAa,KAAK;CAC/B,IAAI,MAAM,OAAO,IAAI,iBAAiB,KAAM,GAAG,GAAG,KAAK,MAAM,KAAK,QAAQ,KAAK,MAAM;CACrF,OAAO,iBAAiB,KAAK,KAAK,aAAa,KAAK;AACtD"}
1
+ {"version":3,"file":"format.js","names":[],"sources":["../../../src/config/lang/format.ts"],"sourcesContent":["/**\n * 按当前语言格式化数字、金额与日期:`const format = useFormat()`,之后 `format.currency(19.9)`。\n * 格式化器按“语言 + 选项”缓存,重复调用不再新建。\n *\n * 数字的格式是 NumericFormat:Intl.NumberFormat 的选项,加上缩放与单位文字,\n * `format.number(155353.2, { scale: 10_000, maximumFractionDigits: 2, suffix: '万元' })` → `15.54 万元`。\n * 组件的数字格式属性(AnimatedNumber、Stat、图表、表格列)都是它。\n */\nimport {\n CalendarDateTime,\n DateFormatter,\n getLocalTimeZone,\n type DateValue,\n} from '@internationalized/date';\nimport type Decimal from 'decimal.js';\nimport {\n parseIsoDate,\n parseIsoDateTime,\n parseIsoTime,\n relativeUnit,\n toInstant,\n} from '../../utils/data/date';\nimport { cachedIntl } from '../../utils/data/intl-cache';\nimport { numericText, shiftDecimal } from '../../utils/data/numeric';\nimport { useLang } from '../context';\nimport type { Lang } from './lang';\n\n/** 字符串与 Decimal 按十进制原样格式化,不经过浮点数,金额不丢精度 */\ntype NumberInput = number | bigint | string | Decimal;\n\n/** 数字的显示格式:Intl.NumberFormat 的选项,加上缩放与单位文字 */\nexport interface NumericFormat extends Intl.NumberFormatOptions {\n /**\n * 先除以它再显示:`10_000` 表示以“万”为单位(155353.2 → 15.53532,再按小数位取舍)。\n * 10 的整数次幂按十进制移动小数点,Decimal 与大整数不丢精度;其他值按浮点数相除\n */\n scale?: number;\n /** 跟在数字后面的单位文字,如“万元”“元/件”;与数字之间是不换行的空格 */\n suffix?: string;\n}\n\n/** 按当前语言格式化数字、金额、百分比与日期;在渲染函数里调用方法即可随语言切换 */\nexport function useFormat() {\n const lang = useLang();\n return {\n /**\n * 数字:`format.number(1234.5)` → `1,234.5`;`{ style: 'currency' }` 不写币种时用语言的币种,\n * 缩放与单位见 NumericFormat\n */\n number: (value: NumberInput, options: NumericFormat = {}) =>\n formatNumeric(lang, value, options),\n /** 金额,默认使用语言的币种:`format.currency(new Decimal('19.9'))` → `¥19.90` */\n currency: (value: NumberInput, currency = lang.currency) =>\n formatNumeric(lang, value, { style: 'currency', currency }),\n /** 文件大小,按 1000 进位取合适的单位:`format.fileSize(1_234_567)` → `1.2 MB` */\n fileSize: (bytes: number) => {\n const exponent = Math.min(\n Math.max(Math.floor(Math.log10(Math.max(bytes, 1)) / 3), 0),\n FILE_SIZE_UNITS.length - 1,\n );\n return numberFormatter(lang, {\n style: 'unit',\n unit: FILE_SIZE_UNITS[exponent],\n maximumFractionDigits: exponent === 0 ? 0 : 1,\n }).format(bytes / 1000 ** exponent);\n },\n /**\n * 日期时间,带上语言的时区、日历与小时制;DateValue 按语言时区换算。\n * 也接受日期组件的 ISO 值:'2026-10-20'、'2026-10-20T14:30'、'14:30'(只有时间时配 timeStyle),\n * 以及后端给的时刻(带 Z 或时差:'2026-10-20T06:30:00.19Z',按语言的时区显示);格式不对时原样返回\n */\n date: (\n value: Date | DateValue | string,\n options: Intl.DateTimeFormatOptions = { dateStyle: 'medium' },\n ) => {\n const parsed = typeof value === 'string' ? parseIsoValue(value) : value;\n if (parsed == null) return value as string;\n const date =\n parsed instanceof Date ? parsed : parsed.toDate(lang.timeZone ?? getLocalTimeZone());\n return dateFormatter(lang, options).format(date);\n },\n /**\n * 相对现在的时间,自动取合适的单位:`format.relative(date)` → “3 分钟前”“明天”“2 年后”。\n * 值同 date;不带时区的 ISO 值按语言的时区算。now 默认此刻(组件里随时钟更新的传进来)\n */\n relative: (\n value: Date | DateValue | string,\n { now = Date.now(), ...options }: RelativeFormatOptions = {},\n ) => {\n const instant = toInstant(value, lang.timeZone ?? getLocalTimeZone());\n if (Number.isNaN(instant)) return typeof value === 'string' ? value : '';\n const { value: amount, unit } = relativeUnit(instant - now);\n const key = `relative|${lang.code}|${JSON.stringify(options)}`;\n const formatter = cachedIntl(\n key,\n () => new Intl.RelativeTimeFormat(lang.code, { numeric: 'auto', ...options }),\n );\n return formatter.format(amount, unit);\n },\n };\n}\n\n/** format.relative 的选项 */\nexport interface RelativeFormatOptions extends Intl.RelativeTimeFormatOptions {\n /** 以哪个时刻为“现在”(毫秒时间戳),默认此刻 */\n now?: number;\n}\n\n// ───────── 内部实现 ─────────\n\n/** Intl 支持的文件大小单位(SI,1000 进位) */\nconst FILE_SIZE_UNITS = ['byte', 'kilobyte', 'megabyte', 'gigabyte', 'terabyte'] as const;\n\nfunction numberFormatter(lang: Lang, options: Intl.NumberFormatOptions) {\n const key = `number|${lang.code}|${JSON.stringify(options)}`;\n return cachedIntl(key, () => new Intl.NumberFormat(lang.code, options));\n}\n\nfunction formatNumeric(\n lang: Lang,\n value: NumberInput,\n { scale, suffix, ...options }: NumericFormat,\n) {\n if (options.style === 'currency' && !options.currency) options.currency = lang.currency;\n const text = numberFormatter(lang, options).format(scaled(value, scale));\n return suffix ? `${text} ${suffix}` : text;\n}\n\n/** 除以 scale:10 的整数次幂按十进制移位(精确),其他值按浮点数相除 */\nfunction scaled(value: NumberInput, scale: number | undefined) {\n if (scale == null || scale === 1) return toIntl(value);\n const places = Math.log10(scale);\n if (!Number.isInteger(places)) return Number(toIntl(value)) / scale;\n const text = typeof value === 'string' ? value.trim() : numericText(value);\n return shiftDecimal(text, places) as Intl.StringNumericLiteral;\n}\n\nfunction dateFormatter(lang: Lang, options: Intl.DateTimeFormatOptions) {\n const resolved: Intl.DateTimeFormatOptions = {\n timeZone: lang.timeZone,\n calendar: lang.calendar,\n hourCycle: lang.hourCycle,\n ...options,\n };\n const key = `date|${lang.code}|${JSON.stringify(resolved)}`;\n return cachedIntl(key, () => new DateFormatter(lang.code, resolved));\n}\n\n/** Intl 接受数字字符串(StringNumericLiteral);Decimal 先转成字符串 */\nfunction toIntl(value: NumberInput): number | bigint | Intl.StringNumericLiteral {\n if (typeof value === 'object') return value.toString() as Intl.StringNumericLiteral;\n return typeof value === 'string' ? (value as Intl.StringNumericLiteral) : value;\n}\n\n/** 带 Z 或时差的 ISO 时刻(后端给的 timestamptz) */\nconst ABSOLUTE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:?\\d{2})$/;\n\n/** 日期组件的 ISO 值 → DateValue:日期、日期时间,或只有时间(放在任意一天上);带时差的时刻 → Date */\nfunction parseIsoValue(value: string): DateValue | Date | null {\n if (ABSOLUTE.test(value)) {\n const instant = new Date(value);\n return Number.isNaN(instant.getTime()) ? null : instant;\n }\n const time = parseIsoTime(value);\n if (time) return new CalendarDateTime(2000, 1, 1, time.hour, time.minute, time.second);\n return parseIsoDateTime(value) ?? parseIsoDate(value);\n}\n"],"mappings":"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"}
@@ -33,6 +33,8 @@ export interface HourCycles {
33
33
  /** 24 小时制,0–23 */
34
34
  h23: unknown;
35
35
  }
36
+ /** 一个错误码的文案:固定的文字,或按错误带的参数(params)写出 */
37
+ export type ErrorCodeText = string | ((params: Readonly<Record<string, unknown>>) => string);
36
38
  /** 一种语言的全部配置:地区格式与界面文案平铺在一个对象里(COMPONENTS.md §6.3) */
37
39
  export interface Lang {
38
40
  /** BCP 47 语言标签,决定数字、日期等 Intl 格式化规则,如 `'zh-CN'` */
@@ -62,6 +64,14 @@ export interface Lang {
62
64
  readonly imagePreview: (alt: string) => string;
63
65
  /** 图片加载失败时的文字,默认“图片加载失败” */
64
66
  readonly imageError: string;
67
+ /** 请求失败、又没有可用的错误文案时的文字,默认“请求失败,请稍后重试” */
68
+ readonly requestFailed: string;
69
+ /**
70
+ * 业务错误码的文案(见 utils/request/error-message.ts):码 → 文字,要填参数的写成函数。自带请求层(`http.`)与
71
+ * query(`query.`)的;flow-ui、应用按自己的命名空间补,defineLang 与自带的合并:
72
+ * `defineLang(zhCN, { errorCodes: { 'app.quota-exceeded': '额度不足' } })`
73
+ */
74
+ readonly errorCodes: Readonly<Record<string, ErrorCodeText>>;
65
75
  /** 图片预览(Lightbox)的名称,默认“图片预览” */
66
76
  readonly lightboxLabel: string;
67
77
  /** 图片预览:放大,默认“放大” */
@@ -475,16 +485,16 @@ export interface Lang {
475
485
  readonly conditionGroup: string;
476
486
  /** 一条比较的名称(读屏):`(2)` → “条件 2” */
477
487
  readonly conditionRule: (index: number) => string;
478
- /** 人员选择器的三种类型:人员、部门、岗位 */
488
+ /** 人员选择器的类型:人员、部门、角色,加上接入方扩展的(PeopleTypes) */
479
489
  readonly peopleTypes: Readonly<Record<PeopleType, string>>;
480
- /** 选择器的搜索框占位与名称,默认“搜索人员、部门、岗位” */
490
+ /** 选择器的搜索框占位与名称,默认“搜索人员、部门、角色” */
481
491
  readonly peopleSearch: string;
482
- /** 切换组织架构、岗位、最近几页的那组按钮的名称,默认“浏览方式” */
492
+ /** 切换组织架构、角色、最近几页的那组按钮的名称,默认“浏览方式” */
483
493
  readonly peoplePages: string;
484
494
  /** “组织架构”页 */
485
495
  readonly peopleOrg: string;
486
- /** “岗位”页 */
487
- readonly peoplePositions: string;
496
+ /** “角色”页 */
497
+ readonly peopleRoles: string;
488
498
  /** “最近”页:最近选过的 */
489
499
  readonly peopleRecent: string;
490
500
  /** 组织架构最上层在面包屑里的名字,默认“全部” */
@@ -649,5 +659,8 @@ export interface LangMessages {
649
659
  /** 页面组合(@zerodep-dev/vue-tsx-pro-ui/patterns):AppShell、FilterBar、NotificationCenter、KanbanBoard… */
650
660
  readonly patterns: PatternsMessages;
651
661
  }
652
- /** 基于已有语言局部修改:`defineLang(zhCN, { selectEmpty: '暂无数据', timeZone: 'Asia/Tokyo' })` */
662
+ /**
663
+ * 基于已有语言局部修改:`defineLang(zhCN, { selectEmpty: '暂无数据', timeZone: 'Asia/Tokyo' })`。
664
+ * errorCodes 与 messages 合并而不是整个替换:只写要加、要改的码和字段
665
+ */
653
666
  export declare function defineLang(base: Lang, overrides: Partial<Lang>): Lang;
@@ -1,9 +1,17 @@
1
1
  //#region src/config/lang/lang.ts
2
- /** 基于已有语言局部修改:`defineLang(zhCN, { selectEmpty: '暂无数据', timeZone: 'Asia/Tokyo' })` */
2
+ /**
3
+ * 基于已有语言局部修改:`defineLang(zhCN, { selectEmpty: '暂无数据', timeZone: 'Asia/Tokyo' })`。
4
+ * errorCodes 与 messages 合并而不是整个替换:只写要加、要改的码和字段
5
+ */
3
6
  function defineLang(base, overrides) {
7
+ const errorCodes = {
8
+ ...base.errorCodes,
9
+ ...overrides.errorCodes
10
+ };
4
11
  if (!base.messages || !overrides.messages) return {
5
12
  ...base,
6
- ...overrides
13
+ ...overrides,
14
+ errorCodes
7
15
  };
8
16
  const messages = { ...base.messages };
9
17
  for (const [name, fields] of Object.entries(overrides.messages)) messages[name] = {
@@ -13,6 +21,7 @@ function defineLang(base, overrides) {
13
21
  return {
14
22
  ...base,
15
23
  ...overrides,
24
+ errorCodes,
16
25
  messages
17
26
  };
18
27
  }