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

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 (616) hide show
  1. package/dist/base/Blockquote.d.ts +1 -1
  2. package/dist/base/Blockquote.js +1 -1
  3. package/dist/base/Blockquote.js.map +1 -1
  4. package/dist/base/ButtonGroup.d.ts +1 -1
  5. package/dist/base/ButtonGroup.js +1 -1
  6. package/dist/base/ButtonGroup.js.map +1 -1
  7. package/dist/base/Code.d.ts +1 -1
  8. package/dist/base/Code.js +1 -1
  9. package/dist/base/Code.js.map +1 -1
  10. package/dist/base/CodeBlock.d.ts +1 -1
  11. package/dist/base/CodeBlock.js +1 -1
  12. package/dist/base/CodeBlock.js.map +1 -1
  13. package/dist/base/CopyButton.d.ts +1 -1
  14. package/dist/base/CopyButton.js +1 -1
  15. package/dist/base/CopyButton.js.map +1 -1
  16. package/dist/base/Heading.d.ts +1 -1
  17. package/dist/base/Heading.js +1 -1
  18. package/dist/base/Heading.js.map +1 -1
  19. package/dist/base/Icon.d.ts +1 -1
  20. package/dist/base/Icon.js +1 -1
  21. package/dist/base/Icon.js.map +1 -1
  22. package/dist/base/Indicator.d.ts +1 -1
  23. package/dist/base/Indicator.js +1 -1
  24. package/dist/base/Indicator.js.map +1 -1
  25. package/dist/base/Kbd.d.ts +1 -1
  26. package/dist/base/Kbd.js +1 -1
  27. package/dist/base/Kbd.js.map +1 -1
  28. package/dist/base/Link.d.ts +1 -1
  29. package/dist/base/Link.js +1 -1
  30. package/dist/base/Link.js.map +1 -1
  31. package/dist/base/List.d.ts +1 -1
  32. package/dist/base/List.js +1 -1
  33. package/dist/base/List.js.map +1 -1
  34. package/dist/base/Mark.d.ts +1 -1
  35. package/dist/base/Mark.js +1 -1
  36. package/dist/base/Mark.js.map +1 -1
  37. package/dist/base/Spinner.d.ts +1 -1
  38. package/dist/base/Spinner.js +1 -1
  39. package/dist/base/Spinner.js.map +1 -1
  40. package/dist/base/StatusDot.d.ts +1 -1
  41. package/dist/base/StatusDot.js +1 -1
  42. package/dist/base/StatusDot.js.map +1 -1
  43. package/dist/base/Tag.d.ts +1 -1
  44. package/dist/base/Tag.js +1 -1
  45. package/dist/base/Tag.js.map +1 -1
  46. package/dist/base/Text.d.ts +1 -1
  47. package/dist/base/Text.js +1 -1
  48. package/dist/base/Text.js.map +1 -1
  49. package/dist/base/VisuallyHidden.d.ts +1 -1
  50. package/dist/base/VisuallyHidden.js +1 -1
  51. package/dist/base/VisuallyHidden.js.map +1 -1
  52. package/dist/base/badge-styles.d.ts +1 -1
  53. package/dist/base/badge-styles.js +1 -1
  54. package/dist/base/badge-styles.js.map +1 -1
  55. package/dist/base/button-core.d.ts +1 -1
  56. package/dist/base/button-core.js +1 -1
  57. package/dist/base/button-core.js.map +1 -1
  58. package/dist/charts/ChordChart.d.ts +1 -1
  59. package/dist/charts/ChordChart.js +1 -1
  60. package/dist/charts/ChordChart.js.map +1 -1
  61. package/dist/charts/DonutChart.d.ts +1 -1
  62. package/dist/charts/DonutChart.js +1 -1
  63. package/dist/charts/DonutChart.js.map +1 -1
  64. package/dist/charts/FunnelChart.d.ts +1 -1
  65. package/dist/charts/FunnelChart.js +1 -1
  66. package/dist/charts/FunnelChart.js.map +1 -1
  67. package/dist/charts/GraphChart.d.ts +1 -1
  68. package/dist/charts/GraphChart.js +1 -1
  69. package/dist/charts/GraphChart.js.map +1 -1
  70. package/dist/charts/MapChart.d.ts +1 -1
  71. package/dist/charts/MapChart.js +1 -1
  72. package/dist/charts/MapChart.js.map +1 -1
  73. package/dist/charts/RadarChart.d.ts +1 -1
  74. package/dist/charts/RadarChart.js +1 -1
  75. package/dist/charts/RadarChart.js.map +1 -1
  76. package/dist/charts/SankeyChart.d.ts +1 -1
  77. package/dist/charts/SankeyChart.js +1 -1
  78. package/dist/charts/SankeyChart.js.map +1 -1
  79. package/dist/charts/TreemapChart.d.ts +1 -1
  80. package/dist/charts/TreemapChart.js +1 -1
  81. package/dist/charts/TreemapChart.js.map +1 -1
  82. package/dist/charts/XYChart.d.ts +1 -1
  83. package/dist/charts/XYChart.js +1 -1
  84. package/dist/charts/XYChart.js.map +1 -1
  85. package/dist/charts/frame.d.ts +1 -1
  86. package/dist/charts/frame.js +1 -1
  87. package/dist/charts/frame.js.map +1 -1
  88. package/dist/code-editor/CodeEditor.js +1 -1
  89. package/dist/code-editor/CodeEditor.js.map +1 -1
  90. package/dist/config/Provider.d.ts +1 -1
  91. package/dist/config/Provider.js +1 -1
  92. package/dist/config/Provider.js.map +1 -1
  93. package/dist/config/createUi.d.ts +1 -1
  94. package/dist/config/createUi.js +1 -1
  95. package/dist/config/createUi.js.map +1 -1
  96. package/dist/config/theme/coffee.d.ts +1 -1
  97. package/dist/config/theme/coffee.js +1 -1
  98. package/dist/config/theme/coffee.js.map +1 -1
  99. package/dist/config/theme/cyberpunk.d.ts +1 -1
  100. package/dist/config/theme/cyberpunk.js +1 -1
  101. package/dist/config/theme/cyberpunk.js.map +1 -1
  102. package/dist/config/theme/dark.d.ts +1 -1
  103. package/dist/config/theme/dark.js +1 -1
  104. package/dist/config/theme/dark.js.map +1 -1
  105. package/dist/config/theme/festive.d.ts +1 -1
  106. package/dist/config/theme/festive.js +1 -1
  107. package/dist/config/theme/festive.js.map +1 -1
  108. package/dist/config/theme/forest.d.ts +1 -1
  109. package/dist/config/theme/forest.js +1 -1
  110. package/dist/config/theme/forest.js.map +1 -1
  111. package/dist/config/theme/high-contrast.d.ts +1 -1
  112. package/dist/config/theme/high-contrast.js +1 -1
  113. package/dist/config/theme/high-contrast.js.map +1 -1
  114. package/dist/config/theme/lemon.d.ts +1 -1
  115. package/dist/config/theme/lemon.js +1 -1
  116. package/dist/config/theme/lemon.js.map +1 -1
  117. package/dist/config/theme/light.d.ts +1 -1
  118. package/dist/config/theme/light.js +1 -1
  119. package/dist/config/theme/light.js.map +1 -1
  120. package/dist/config/theme/midnight.d.ts +1 -1
  121. package/dist/config/theme/midnight.js +1 -1
  122. package/dist/config/theme/midnight.js.map +1 -1
  123. package/dist/config/theme/ocean.d.ts +1 -1
  124. package/dist/config/theme/ocean.js +1 -1
  125. package/dist/config/theme/ocean.js.map +1 -1
  126. package/dist/config/theme/paper.d.ts +1 -1
  127. package/dist/config/theme/paper.js +1 -1
  128. package/dist/config/theme/paper.js.map +1 -1
  129. package/dist/config/theme/sakura.d.ts +1 -1
  130. package/dist/config/theme/sakura.js +1 -1
  131. package/dist/config/theme/sakura.js.map +1 -1
  132. package/dist/config/theme/theme.js +1 -1
  133. package/dist/config/theme/theme.js.map +1 -1
  134. package/dist/config/theme/tokens.d.ts +1 -1
  135. package/dist/config/theme/tokens.js +1 -1
  136. package/dist/config/theme/tokens.js.map +1 -1
  137. package/dist/date/CalendarBoard.d.ts +1 -1
  138. package/dist/date/CalendarBoard.js +1 -1
  139. package/dist/date/CalendarBoard.js.map +1 -1
  140. package/dist/date/CalendarView.d.ts +1 -1
  141. package/dist/date/CalendarView.js +1 -1
  142. package/dist/date/CalendarView.js.map +1 -1
  143. package/dist/date/Countdown.d.ts +1 -1
  144. package/dist/date/Countdown.js +1 -1
  145. package/dist/date/Countdown.js.map +1 -1
  146. package/dist/date/DatePicker.d.ts +1 -1
  147. package/dist/date/DatePicker.js +1 -1
  148. package/dist/date/DatePicker.js.map +1 -1
  149. package/dist/date/DateRangePicker.d.ts +1 -1
  150. package/dist/date/DateRangePicker.js +1 -1
  151. package/dist/date/DateRangePicker.js.map +1 -1
  152. package/dist/date/DateSegmentGroup.d.ts +1 -1
  153. package/dist/date/DateSegmentGroup.js +1 -1
  154. package/dist/date/DateSegmentGroup.js.map +1 -1
  155. package/dist/date/QuarterCalendar.js +1 -1
  156. package/dist/date/QuarterCalendar.js.map +1 -1
  157. package/dist/date/SegmentedField.d.ts +1 -1
  158. package/dist/date/SegmentedField.js +1 -1
  159. package/dist/date/SegmentedField.js.map +1 -1
  160. package/dist/date/TimePicker.d.ts +1 -1
  161. package/dist/date/TimePicker.js +1 -1
  162. package/dist/date/TimePicker.js.map +1 -1
  163. package/dist/date/picker-popover.d.ts +1 -1
  164. package/dist/date/picker-popover.js +1 -1
  165. package/dist/date/picker-popover.js.map +1 -1
  166. package/dist/diagram/Diagram.d.ts +1 -1
  167. package/dist/diagram/Diagram.js +1 -1
  168. package/dist/diagram/Diagram.js.map +1 -1
  169. package/dist/diagram/DiagramControls.d.ts +1 -1
  170. package/dist/diagram/DiagramControls.js +1 -1
  171. package/dist/diagram/DiagramControls.js.map +1 -1
  172. package/dist/diagram/DiagramLanes.d.ts +1 -1
  173. package/dist/diagram/DiagramLanes.js +1 -1
  174. package/dist/diagram/DiagramLanes.js.map +1 -1
  175. package/dist/diagram/DiagramMinimap.d.ts +1 -1
  176. package/dist/diagram/DiagramMinimap.js +1 -1
  177. package/dist/diagram/DiagramMinimap.js.map +1 -1
  178. package/dist/diagram/DiagramNode.d.ts +1 -1
  179. package/dist/diagram/DiagramNode.js +1 -1
  180. package/dist/diagram/DiagramNode.js.map +1 -1
  181. package/dist/display/Accordion.d.ts +1 -1
  182. package/dist/display/Accordion.js +1 -1
  183. package/dist/display/Accordion.js.map +1 -1
  184. package/dist/display/AnimatedNumber.d.ts +1 -1
  185. package/dist/display/AnimatedNumber.js +1 -1
  186. package/dist/display/AnimatedNumber.js.map +1 -1
  187. package/dist/display/Avatar.d.ts +1 -1
  188. package/dist/display/Avatar.js +1 -1
  189. package/dist/display/Avatar.js.map +1 -1
  190. package/dist/display/AvatarGroup.d.ts +1 -1
  191. package/dist/display/AvatarGroup.js +1 -1
  192. package/dist/display/AvatarGroup.js.map +1 -1
  193. package/dist/display/Card.d.ts +1 -1
  194. package/dist/display/Card.js +1 -1
  195. package/dist/display/Card.js.map +1 -1
  196. package/dist/display/Checklist.d.ts +1 -1
  197. package/dist/display/Checklist.js +1 -1
  198. package/dist/display/Checklist.js.map +1 -1
  199. package/dist/display/Collapse.d.ts +1 -1
  200. package/dist/display/Collapse.js +1 -1
  201. package/dist/display/Collapse.js.map +1 -1
  202. package/dist/display/Descriptions.d.ts +1 -1
  203. package/dist/display/Descriptions.js +1 -1
  204. package/dist/display/Descriptions.js.map +1 -1
  205. package/dist/display/Ellipsis.d.ts +1 -1
  206. package/dist/display/Ellipsis.js +1 -1
  207. package/dist/display/Ellipsis.js.map +1 -1
  208. package/dist/display/FieldCompare.d.ts +1 -1
  209. package/dist/display/FieldCompare.js +1 -1
  210. package/dist/display/FieldCompare.js.map +1 -1
  211. package/dist/display/Gauge.d.ts +1 -1
  212. package/dist/display/Gauge.js +1 -1
  213. package/dist/display/Gauge.js.map +1 -1
  214. package/dist/display/Image.d.ts +1 -1
  215. package/dist/display/Image.js +1 -1
  216. package/dist/display/Image.js.map +1 -1
  217. package/dist/display/ItemList.d.ts +1 -1
  218. package/dist/display/ItemList.js +1 -1
  219. package/dist/display/ItemList.js.map +1 -1
  220. package/dist/display/Marquee.d.ts +1 -1
  221. package/dist/display/Marquee.js +1 -1
  222. package/dist/display/Marquee.js.map +1 -1
  223. package/dist/display/ProportionBar.d.ts +1 -1
  224. package/dist/display/ProportionBar.js +1 -1
  225. package/dist/display/ProportionBar.js.map +1 -1
  226. package/dist/display/Sortable.d.ts +1 -1
  227. package/dist/display/Sortable.js +1 -1
  228. package/dist/display/Sortable.js.map +1 -1
  229. package/dist/display/Sparkline.d.ts +1 -1
  230. package/dist/display/Sparkline.js +1 -1
  231. package/dist/display/Sparkline.js.map +1 -1
  232. package/dist/display/Stat.d.ts +1 -1
  233. package/dist/display/Stat.js +1 -1
  234. package/dist/display/Stat.js.map +1 -1
  235. package/dist/display/Timeline.d.ts +1 -1
  236. package/dist/display/Timeline.js +1 -1
  237. package/dist/display/Timeline.js.map +1 -1
  238. package/dist/display/Tree.d.ts +1 -1
  239. package/dist/display/Tree.js +1 -1
  240. package/dist/display/Tree.js.map +1 -1
  241. package/dist/display/VirtualList.d.ts +1 -1
  242. package/dist/display/VirtualList.js +1 -1
  243. package/dist/display/VirtualList.js.map +1 -1
  244. package/dist/display/Watermark.d.ts +1 -1
  245. package/dist/display/Watermark.js +1 -1
  246. package/dist/display/Watermark.js.map +1 -1
  247. package/dist/docs-kit/CodeGroup.d.ts +1 -1
  248. package/dist/docs-kit/CodeGroup.js +1 -1
  249. package/dist/docs-kit/CodeGroup.js.map +1 -1
  250. package/dist/docs-kit/CodePreview.d.ts +1 -1
  251. package/dist/docs-kit/CodePreview.js +1 -1
  252. package/dist/docs-kit/CodePreview.js.map +1 -1
  253. package/dist/docs-kit/ColorSwatch.d.ts +1 -1
  254. package/dist/docs-kit/ColorSwatch.js +1 -1
  255. package/dist/docs-kit/ColorSwatch.js.map +1 -1
  256. package/dist/docs-kit/PropsTable.d.ts +1 -1
  257. package/dist/docs-kit/PropsTable.js +1 -1
  258. package/dist/docs-kit/PropsTable.js.map +1 -1
  259. package/dist/feedback/Alert.d.ts +1 -1
  260. package/dist/feedback/Alert.js +1 -1
  261. package/dist/feedback/Alert.js.map +1 -1
  262. package/dist/feedback/Banner.d.ts +1 -1
  263. package/dist/feedback/Banner.js +1 -1
  264. package/dist/feedback/Banner.js.map +1 -1
  265. package/dist/feedback/Empty.d.ts +1 -1
  266. package/dist/feedback/Empty.js +1 -1
  267. package/dist/feedback/Empty.js.map +1 -1
  268. package/dist/feedback/LoadingBar.d.ts +1 -1
  269. package/dist/feedback/LoadingBar.js +1 -1
  270. package/dist/feedback/LoadingBar.js.map +1 -1
  271. package/dist/feedback/LoadingOverlay.d.ts +1 -1
  272. package/dist/feedback/LoadingOverlay.js +1 -1
  273. package/dist/feedback/LoadingOverlay.js.map +1 -1
  274. package/dist/feedback/Progress.d.ts +1 -1
  275. package/dist/feedback/Progress.js +1 -1
  276. package/dist/feedback/Progress.js.map +1 -1
  277. package/dist/feedback/Result.d.ts +1 -1
  278. package/dist/feedback/Result.js +1 -1
  279. package/dist/feedback/Result.js.map +1 -1
  280. package/dist/feedback/Skeleton.d.ts +1 -1
  281. package/dist/feedback/Skeleton.js +1 -1
  282. package/dist/feedback/Skeleton.js.map +1 -1
  283. package/dist/feedback/SkeletonText.d.ts +1 -1
  284. package/dist/feedback/SkeletonText.js +1 -1
  285. package/dist/feedback/SkeletonText.js.map +1 -1
  286. package/dist/feedback/Toast.d.ts +1 -1
  287. package/dist/feedback/Toast.js +1 -1
  288. package/dist/feedback/Toast.js.map +1 -1
  289. package/dist/form/Field.d.ts +1 -1
  290. package/dist/form/Field.js +1 -1
  291. package/dist/form/Field.js.map +1 -1
  292. package/dist/form/FormErrorSummary.d.ts +1 -1
  293. package/dist/form/FormErrorSummary.js +1 -1
  294. package/dist/form/FormErrorSummary.js.map +1 -1
  295. package/dist/form/FormSection.d.ts +1 -1
  296. package/dist/form/FormSection.js +1 -1
  297. package/dist/form/FormSection.js.map +1 -1
  298. package/dist/form/schemas.d.ts +1 -1
  299. package/dist/form/schemas.js +1 -1
  300. package/dist/form/schemas.js.map +1 -1
  301. package/dist/input/Cascader.d.ts +1 -1
  302. package/dist/input/Cascader.js +1 -1
  303. package/dist/input/Cascader.js.map +1 -1
  304. package/dist/input/CharacterCount.d.ts +1 -1
  305. package/dist/input/CharacterCount.js +1 -1
  306. package/dist/input/CharacterCount.js.map +1 -1
  307. package/dist/input/Checkbox.d.ts +1 -1
  308. package/dist/input/Checkbox.js +1 -1
  309. package/dist/input/Checkbox.js.map +1 -1
  310. package/dist/input/ColorField.d.ts +1 -1
  311. package/dist/input/ColorField.js +1 -1
  312. package/dist/input/ColorField.js.map +1 -1
  313. package/dist/input/Combobox.d.ts +1 -1
  314. package/dist/input/Combobox.js +1 -1
  315. package/dist/input/Combobox.js.map +1 -1
  316. package/dist/input/ConditionBuilder.d.ts +1 -1
  317. package/dist/input/ConditionBuilder.js +1 -1
  318. package/dist/input/ConditionBuilder.js.map +1 -1
  319. package/dist/input/ControlGroup.d.ts +1 -1
  320. package/dist/input/ControlGroup.js +1 -1
  321. package/dist/input/ControlGroup.js.map +1 -1
  322. package/dist/input/FileDrop.d.ts +1 -1
  323. package/dist/input/FileDrop.js +1 -1
  324. package/dist/input/FileDrop.js.map +1 -1
  325. package/dist/input/ListPopover.d.ts +1 -1
  326. package/dist/input/ListPopover.js +1 -1
  327. package/dist/input/ListPopover.js.map +1 -1
  328. package/dist/input/Listbox.d.ts +1 -1
  329. package/dist/input/Listbox.js +1 -1
  330. package/dist/input/Listbox.js.map +1 -1
  331. package/dist/input/Mentions.d.ts +1 -1
  332. package/dist/input/Mentions.js +1 -1
  333. package/dist/input/Mentions.js.map +1 -1
  334. package/dist/input/NumberRangeField.d.ts +1 -1
  335. package/dist/input/NumberRangeField.js +1 -1
  336. package/dist/input/NumberRangeField.js.map +1 -1
  337. package/dist/input/OtpField.d.ts +1 -1
  338. package/dist/input/OtpField.js +1 -1
  339. package/dist/input/OtpField.js.map +1 -1
  340. package/dist/input/PeoplePicker.js +1 -1
  341. package/dist/input/PeoplePicker.js.map +1 -1
  342. package/dist/input/PeoplePickerPanel.d.ts +1 -1
  343. package/dist/input/PeoplePickerPanel.js +1 -1
  344. package/dist/input/PeoplePickerPanel.js.map +1 -1
  345. package/dist/input/Radio.d.ts +1 -1
  346. package/dist/input/Radio.js +1 -1
  347. package/dist/input/Radio.js.map +1 -1
  348. package/dist/input/Rating.d.ts +1 -1
  349. package/dist/input/Rating.js +1 -1
  350. package/dist/input/Rating.js.map +1 -1
  351. package/dist/input/Select.d.ts +1 -1
  352. package/dist/input/Select.js +1 -1
  353. package/dist/input/Select.js.map +1 -1
  354. package/dist/input/SelectedTags.d.ts +1 -1
  355. package/dist/input/SelectedTags.js +1 -1
  356. package/dist/input/SelectedTags.js.map +1 -1
  357. package/dist/input/Slider.d.ts +1 -1
  358. package/dist/input/Slider.js +1 -1
  359. package/dist/input/Slider.js.map +1 -1
  360. package/dist/input/Switch.d.ts +1 -1
  361. package/dist/input/Switch.js +1 -1
  362. package/dist/input/Switch.js.map +1 -1
  363. package/dist/input/TagsInput.d.ts +1 -1
  364. package/dist/input/TagsInput.js +1 -1
  365. package/dist/input/TagsInput.js.map +1 -1
  366. package/dist/input/Textarea.d.ts +1 -1
  367. package/dist/input/Textarea.js +1 -1
  368. package/dist/input/Textarea.js.map +1 -1
  369. package/dist/input/ToggleGroup.d.ts +1 -1
  370. package/dist/input/ToggleGroup.js +1 -1
  371. package/dist/input/ToggleGroup.js.map +1 -1
  372. package/dist/input/Transfer.d.ts +1 -1
  373. package/dist/input/Transfer.js +1 -1
  374. package/dist/input/Transfer.js.map +1 -1
  375. package/dist/input/TreeSelect.d.ts +1 -1
  376. package/dist/input/TreeSelect.js +1 -1
  377. package/dist/input/TreeSelect.js.map +1 -1
  378. package/dist/input/Upload.d.ts +1 -1
  379. package/dist/input/Upload.js +1 -1
  380. package/dist/input/Upload.js.map +1 -1
  381. package/dist/input/choice-styles.d.ts +1 -1
  382. package/dist/input/choice-styles.js +1 -1
  383. package/dist/input/choice-styles.js.map +1 -1
  384. package/dist/input/control.d.ts +1 -1
  385. package/dist/input/control.js +1 -1
  386. package/dist/input/control.js.map +1 -1
  387. package/dist/layout/Affix.d.ts +1 -1
  388. package/dist/layout/Affix.js +1 -1
  389. package/dist/layout/Affix.js.map +1 -1
  390. package/dist/layout/AsideLayout.d.ts +1 -1
  391. package/dist/layout/AsideLayout.js +1 -1
  392. package/dist/layout/AsideLayout.js.map +1 -1
  393. package/dist/layout/BackTop.d.ts +1 -1
  394. package/dist/layout/BackTop.js +1 -1
  395. package/dist/layout/BackTop.js.map +1 -1
  396. package/dist/layout/Container.d.ts +1 -1
  397. package/dist/layout/Container.js +1 -1
  398. package/dist/layout/Container.js.map +1 -1
  399. package/dist/layout/Flex.d.ts +1 -1
  400. package/dist/layout/Flex.js +1 -1
  401. package/dist/layout/Flex.js.map +1 -1
  402. package/dist/layout/Grid.d.ts +1 -1
  403. package/dist/layout/Grid.js +1 -1
  404. package/dist/layout/Grid.js.map +1 -1
  405. package/dist/layout/PageScrollbar.d.ts +1 -1
  406. package/dist/layout/PageScrollbar.js +1 -1
  407. package/dist/layout/PageScrollbar.js.map +1 -1
  408. package/dist/layout/Prose.d.ts +1 -1
  409. package/dist/layout/Prose.js +1 -1
  410. package/dist/layout/Prose.js.map +1 -1
  411. package/dist/layout/ResizeHandle.d.ts +1 -1
  412. package/dist/layout/ResizeHandle.js +1 -1
  413. package/dist/layout/ResizeHandle.js.map +1 -1
  414. package/dist/layout/ScrollArea.d.ts +1 -1
  415. package/dist/layout/ScrollArea.js +1 -1
  416. package/dist/layout/ScrollArea.js.map +1 -1
  417. package/dist/layout/Separator.d.ts +1 -1
  418. package/dist/layout/Separator.js +1 -1
  419. package/dist/layout/Separator.js.map +1 -1
  420. package/dist/layout/Splitter.d.ts +1 -1
  421. package/dist/layout/Splitter.js +1 -1
  422. package/dist/layout/Splitter.js.map +1 -1
  423. package/dist/layout/ViewportFill.d.ts +1 -1
  424. package/dist/layout/ViewportFill.js +1 -1
  425. package/dist/layout/ViewportFill.js.map +1 -1
  426. package/dist/navigation/Breadcrumbs.d.ts +1 -1
  427. package/dist/navigation/Breadcrumbs.js +1 -1
  428. package/dist/navigation/Breadcrumbs.js.map +1 -1
  429. package/dist/navigation/NavBar.d.ts +1 -1
  430. package/dist/navigation/NavBar.js +1 -1
  431. package/dist/navigation/NavBar.js.map +1 -1
  432. package/dist/navigation/NavList.d.ts +1 -1
  433. package/dist/navigation/NavList.js +1 -1
  434. package/dist/navigation/NavList.js.map +1 -1
  435. package/dist/navigation/PageJump.d.ts +1 -1
  436. package/dist/navigation/PageJump.js +1 -1
  437. package/dist/navigation/PageJump.js.map +1 -1
  438. package/dist/navigation/PageSizeSelect.d.ts +1 -1
  439. package/dist/navigation/PageSizeSelect.js +1 -1
  440. package/dist/navigation/PageSizeSelect.js.map +1 -1
  441. package/dist/navigation/Pager.d.ts +1 -1
  442. package/dist/navigation/Pager.js +1 -1
  443. package/dist/navigation/Pager.js.map +1 -1
  444. package/dist/navigation/Pagination.d.ts +1 -1
  445. package/dist/navigation/Pagination.js +1 -1
  446. package/dist/navigation/Pagination.js.map +1 -1
  447. package/dist/navigation/PaginationBar.d.ts +1 -1
  448. package/dist/navigation/PaginationBar.js +1 -1
  449. package/dist/navigation/PaginationBar.js.map +1 -1
  450. package/dist/navigation/SkipLink.d.ts +1 -1
  451. package/dist/navigation/SkipLink.js +1 -1
  452. package/dist/navigation/SkipLink.js.map +1 -1
  453. package/dist/navigation/Steps.d.ts +1 -1
  454. package/dist/navigation/Steps.js +1 -1
  455. package/dist/navigation/Steps.js.map +1 -1
  456. package/dist/navigation/TableOfContents.d.ts +1 -1
  457. package/dist/navigation/TableOfContents.js +1 -1
  458. package/dist/navigation/TableOfContents.js.map +1 -1
  459. package/dist/navigation/Tabs.d.ts +1 -1
  460. package/dist/navigation/Tabs.js +1 -1
  461. package/dist/navigation/Tabs.js.map +1 -1
  462. package/dist/navigation/Toolbar.d.ts +1 -1
  463. package/dist/navigation/Toolbar.js +1 -1
  464. package/dist/navigation/Toolbar.js.map +1 -1
  465. package/dist/overlay/CommandPalette.d.ts +1 -1
  466. package/dist/overlay/CommandPalette.js +1 -1
  467. package/dist/overlay/CommandPalette.js.map +1 -1
  468. package/dist/overlay/Dialog.d.ts +1 -1
  469. package/dist/overlay/Dialog.js +1 -1
  470. package/dist/overlay/Dialog.js.map +1 -1
  471. package/dist/overlay/Drawer.d.ts +1 -1
  472. package/dist/overlay/Drawer.js +1 -1
  473. package/dist/overlay/Drawer.js.map +1 -1
  474. package/dist/overlay/HoverCard.d.ts +1 -1
  475. package/dist/overlay/HoverCard.js +1 -1
  476. package/dist/overlay/HoverCard.js.map +1 -1
  477. package/dist/overlay/Lightbox.d.ts +1 -1
  478. package/dist/overlay/Lightbox.js +1 -1
  479. package/dist/overlay/Lightbox.js.map +1 -1
  480. package/dist/overlay/Menu.d.ts +1 -1
  481. package/dist/overlay/Menu.js +1 -1
  482. package/dist/overlay/Menu.js.map +1 -1
  483. package/dist/overlay/Popconfirm.d.ts +1 -1
  484. package/dist/overlay/Popconfirm.js +1 -1
  485. package/dist/overlay/Popconfirm.js.map +1 -1
  486. package/dist/overlay/Popover.d.ts +1 -1
  487. package/dist/overlay/Popover.js +1 -1
  488. package/dist/overlay/Popover.js.map +1 -1
  489. package/dist/overlay/Tooltip.d.ts +1 -1
  490. package/dist/overlay/Tooltip.js +1 -1
  491. package/dist/overlay/Tooltip.js.map +1 -1
  492. package/dist/overlay/Tour.d.ts +1 -1
  493. package/dist/overlay/Tour.js +1 -1
  494. package/dist/overlay/Tour.js.map +1 -1
  495. package/dist/patterns/ActionBar.d.ts +1 -1
  496. package/dist/patterns/ActionBar.js +1 -1
  497. package/dist/patterns/ActionBar.js.map +1 -1
  498. package/dist/patterns/AppShell.d.ts +1 -1
  499. package/dist/patterns/AppShell.js +1 -1
  500. package/dist/patterns/AppShell.js.map +1 -1
  501. package/dist/patterns/AuthLayout.d.ts +2 -2
  502. package/dist/patterns/AuthLayout.js +2 -2
  503. package/dist/patterns/AuthLayout.js.map +1 -1
  504. package/dist/patterns/CommentThread.d.ts +1 -1
  505. package/dist/patterns/CommentThread.js +1 -1
  506. package/dist/patterns/CommentThread.js.map +1 -1
  507. package/dist/patterns/DataImport.d.ts +1 -1
  508. package/dist/patterns/DataImport.js +1 -1
  509. package/dist/patterns/DataImport.js.map +1 -1
  510. package/dist/patterns/FilterBar.d.ts +1 -1
  511. package/dist/patterns/FilterBar.js +1 -1
  512. package/dist/patterns/FilterBar.js.map +1 -1
  513. package/dist/patterns/KanbanBoard.d.ts +1 -1
  514. package/dist/patterns/KanbanBoard.js +1 -1
  515. package/dist/patterns/KanbanBoard.js.map +1 -1
  516. package/dist/patterns/NotificationCenter.d.ts +1 -1
  517. package/dist/patterns/NotificationCenter.js +1 -1
  518. package/dist/patterns/NotificationCenter.js.map +1 -1
  519. package/dist/patterns/QueryTable.d.ts +1 -1
  520. package/dist/patterns/QueryTable.js +1 -1
  521. package/dist/patterns/QueryTable.js.map +1 -1
  522. package/dist/patterns/SlideCaptcha.d.ts +1 -1
  523. package/dist/patterns/SlideCaptcha.js +1 -1
  524. package/dist/patterns/SlideCaptcha.js.map +1 -1
  525. package/dist/patterns/StepsForm.d.ts +1 -1
  526. package/dist/patterns/StepsForm.js +1 -1
  527. package/dist/patterns/StepsForm.js.map +1 -1
  528. package/dist/table/ColumnHeaderActions.d.ts +1 -1
  529. package/dist/table/ColumnHeaderActions.js +1 -1
  530. package/dist/table/ColumnHeaderActions.js.map +1 -1
  531. package/dist/table/ColumnSettings.d.ts +1 -1
  532. package/dist/table/ColumnSettings.js +1 -1
  533. package/dist/table/ColumnSettings.js.map +1 -1
  534. package/dist/table/ColumnTable.d.ts +1 -1
  535. package/dist/table/ColumnTable.js +1 -1
  536. package/dist/table/ColumnTable.js.map +1 -1
  537. package/dist/table/DataTableView.d.ts +1 -1
  538. package/dist/table/DataTableView.js +1 -1
  539. package/dist/table/DataTableView.js.map +1 -1
  540. package/dist/table/PivotTable.d.ts +1 -1
  541. package/dist/table/PivotTable.js +1 -1
  542. package/dist/table/PivotTable.js.map +1 -1
  543. package/dist/table/SelectionBar.d.ts +1 -1
  544. package/dist/table/SelectionBar.js +1 -1
  545. package/dist/table/SelectionBar.js.map +1 -1
  546. package/dist/table/Table.d.ts +1 -1
  547. package/dist/table/Table.js +1 -1
  548. package/dist/table/Table.js.map +1 -1
  549. package/dist/table/TreeDataTable.d.ts +1 -1
  550. package/dist/table/TreeDataTable.js +1 -1
  551. package/dist/table/TreeDataTable.js.map +1 -1
  552. package/dist/table/table-styles.d.ts +1 -1
  553. package/dist/table/table-styles.js +1 -1
  554. package/dist/table/table-styles.js.map +1 -1
  555. package/dist/theme-customize/ThemeCustomizer.d.ts +1 -1
  556. package/dist/theme-customize/ThemeCustomizer.js +1 -1
  557. package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
  558. package/dist/theme-customize/ThemeThumbnail.d.ts +1 -1
  559. package/dist/theme-customize/ThemeThumbnail.js +1 -1
  560. package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
  561. package/dist/theme-customize/design-tokens.js +1 -1
  562. package/dist/theme-customize/design-tokens.js.map +1 -1
  563. package/dist/three/core/EffectSurface.d.ts +1 -1
  564. package/dist/three/core/EffectSurface.js +1 -1
  565. package/dist/three/core/EffectSurface.js.map +1 -1
  566. package/dist/three/core/ThreeCanvas.d.ts +1 -1
  567. package/dist/three/core/ThreeCanvas.js +1 -1
  568. package/dist/three/core/ThreeCanvas.js.map +1 -1
  569. package/dist/three/effects/Confetti.d.ts +1 -1
  570. package/dist/three/effects/Confetti.js +1 -1
  571. package/dist/three/effects/Confetti.js.map +1 -1
  572. package/dist/three/globe/Globe.d.ts +1 -1
  573. package/dist/three/globe/Globe.js +1 -1
  574. package/dist/three/globe/Globe.js.map +1 -1
  575. package/dist/three/model/ModelViewer.d.ts +1 -1
  576. package/dist/three/model/ModelViewer.js +1 -1
  577. package/dist/three/model/ModelViewer.js.map +1 -1
  578. package/dist/utils/dom/floating.d.ts +1 -1
  579. package/dist/utils/dom/floating.js +1 -1
  580. package/dist/utils/dom/floating.js.map +1 -1
  581. package/dist/utils/dom/ripple.d.ts +1 -1
  582. package/dist/utils/dom/ripple.js +1 -1
  583. package/dist/utils/dom/ripple.js.map +1 -1
  584. package/dist/utils/props.js +1 -1
  585. package/dist/utils/props.js.map +1 -1
  586. package/dist/utils/style/attached.d.ts +1 -1
  587. package/dist/utils/style/attached.js +1 -1
  588. package/dist/utils/style/attached.js.map +1 -1
  589. package/dist/utils/style/item-styles.d.ts +1 -1
  590. package/dist/utils/style/item-styles.js +1 -1
  591. package/dist/utils/style/item-styles.js.map +1 -1
  592. package/dist/utils/style/markers.d.ts +1 -1
  593. package/dist/utils/style/markers.js +1 -1
  594. package/dist/utils/style/markers.js.map +1 -1
  595. package/dist/utils/style/shimmer.d.ts +1 -1
  596. package/dist/utils/style/shimmer.js +1 -1
  597. package/dist/utils/style/shimmer.js.map +1 -1
  598. package/dist/utils/style/styles.d.ts +1 -1
  599. package/dist/utils/style/styles.js +1 -1
  600. package/dist/utils/style/styles.js.map +1 -1
  601. package/dist/utils/style/swatch-styles.d.ts +1 -1
  602. package/dist/utils/style/swatch-styles.js +1 -1
  603. package/dist/utils/style/swatch-styles.js.map +1 -1
  604. package/dist/utils/style/tone-styles.d.ts +1 -1
  605. package/dist/utils/style/tone-styles.js +1 -1
  606. package/dist/utils/style/tone-styles.js.map +1 -1
  607. package/dist/utils/style/transitions.d.ts +1 -1
  608. package/dist/utils/style/transitions.js +1 -1
  609. package/dist/utils/style/transitions.js.map +1 -1
  610. package/dist/utils/style/typography.d.ts +1 -1
  611. package/dist/utils/style/typography.js +1 -1
  612. package/dist/utils/style/typography.js.map +1 -1
  613. package/dist/utils/style/vars.d.ts +1 -1
  614. package/dist/utils/style/vars.js +1 -1
  615. package/dist/utils/style/vars.js.map +1 -1
  616. package/package.json +2 -2
@@ -1,4 +1,4 @@
1
- import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
2
  import { type VNodeChild } from 'vue';
3
3
  import type { PresetIconButtonProps } from '../base/CloseButton';
4
4
  import { type IconProps } from '../base/Icon';
@@ -18,7 +18,7 @@ import { TextField } from "./TextField.js";
18
18
  import { selectStyles } from "./Select.js";
19
19
  import { Fragment, computed, createVNode, nextTick, ref, shallowRef, useId } from "vue";
20
20
  import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
21
- import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
21
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
22
22
  import { Check, ChevronDown, ChevronRight, Search } from "@lucide/icons";
23
23
  //#region src/input/Cascader.tsx
24
24
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Cascader.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vue_ref","_vue_shallowRef","_vue_computed","_createVNode","_mergeProps","_Fragment"],"sources":["../../src/input/Cascader.tsx"],"sourcesContent":["/**\n * 级联选择:一列一列往下选(省 / 市 / 区、产品大类 / 小类 / 型号、物料分类),触发框里显示整条路径“浙江 / 杭州 / 西湖区”。\n *\n * <Cascader items={regions} getKey={(r) => r.code} getLabel={(r) => r.name} getChildren={(r) => r.children} _value={path} />\n * <Cascader … changeOnSelect /> 每一级都能选(选到市也行)\n * <Cascader … hasChildren={(r) => !r.leaf} loadChildren={loadNext} /> 展开时远程取下一级\n * <Cascader … searchable /> 按整条路径搜索(在已加载的节点里)\n *\n * - value 是从第一级到选中节点的 key 路径(同 Ant Design、Element Plus),key 只要在同级里唯一;没有选择时 null。\n * - 默认只能选到叶子:点有下一级的项只是展开;changeOnSelect 时点任何一级都选中它(并展开下一级)。\n * - 弹出层里每一级是一列 listbox,焦点在列上、高亮项经 aria-activedescendant:↑↓ 移动(有下一级的跟着显示下一列),\n * → 进入下一级(懒加载的先取回来),← 回到上一级,Enter 选中(叶子选中后关闭),Esc 关闭并把焦点还给触发按钮。\n * 从右到左排版时左右键对调。\n * - searchable:搜索框里输入后换成一列匹配的完整路径,只列能选的(默认是叶子),↑↓、Enter 在搜索框里操作。\n * - 懒加载:hasChildren 声明有下一级,进入时 loadChildren 取回来放进数据里(数据要是响应式的),期间显示转圈;\n * 打开时沿着已选的路径逐级取回来,已选的那一列看得见。\n *\n * 部件:Root(外壳)、Trigger(button,主元素)、Value、Clear、Chevron、Popover、Search(TextField)、Column(每一列)、Option。\n */\nimport { Check, ChevronDown, ChevronRight, Search } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { nextTick, useId, type VNodeChild } from 'vue';\nimport type { PresetIconButtonProps } from '../base/CloseButton';\nimport { buttonBaseStyles } from '../base/button-core';\nimport { Icon, type IconProps } from '../base/Icon';\nimport { Spinner } from '../base/Spinner';\nimport { useLang, useTextMatcher } from '../config/context';\nimport { useFieldControl } from '../form/Field';\nimport { FormValue } from '../form/FormValue';\nimport { isExpandable } from '../utils/data/tree';\nimport { inlineArrows, isRtl } from '../utils/dom/direction';\nimport {\n anchoredPanelSx,\n floatingStyles,\n useAnchoredPopover,\n type FloatingPlacement,\n} from '../utils/dom/floating';\nimport { openSetter, type OpenChangeProps } from '../utils/dom/open-change';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { itemStyles } from '../utils/style/item-styles';\nimport { t } from '../config/theme/tokens';\nimport { disclosureStyles } from '../utils/style/transitions';\nimport {\n clickOnShell,\n controlClear,\n controlIcon,\n controlParts,\n focusOnShell,\n useControlAppearance,\n type ControlIconOptions,\n type ControlOptions,\n} from './control';\nimport { listPopoverStyles } from './ListPopover';\nimport { selectStyles, type SelectManaged } from './Select';\nimport { TextField, type TextFieldProps } from './TextField';\n\n/** 未声明的属性落到触发按钮(主元素)上,外壳用 propsRoot */\nexport interface CascaderProps<T>\n extends PartProps<'button', SelectManaged>, ControlOptions, ControlIconOptions, OpenChangeProps {\n /** 第一级的节点 */\n items?: readonly T[];\n /** 节点的 key,同级里唯一;index 是它在同级里的位置 */\n getKey: (node: T, index: number) => string;\n /** 节点的文字 */\n getLabel: (node: T) => string;\n /** 下一级;叶子或还没加载时 undefined */\n getChildren: (node: T) => readonly T[] | undefined;\n /** 有没有下一级(懒加载时还没取回来也算有);不写时看 getChildren 是否非空 */\n hasChildren?: (node: T) => boolean;\n /** 进入一个还没有下一级的节点时取回来,放进数据里;返回 Promise 时显示加载中 */\n loadChildren?: (node: T) => Promise<unknown> | void;\n /** 不能选、不能进入的节点 */\n isDisabled?: (node: T) => boolean;\n /** 选中的路径(第一级到选中节点的 key),没有时 null:父级写 _value={x} */\n _value?: readonly string[] | null;\n /** 每一级都能选;默认只能选到叶子 */\n changeOnSelect?: boolean;\n /** 触发框里显示整条路径(默认),false 时只显示最后一级 */\n showAllLevels?: boolean;\n /** 路径各级之间的分隔,默认“ / ” */\n separator?: string;\n /** 自定义触发框里的内容:参数是路径上各级的文字与节点(还没加载的节点文字是 key、节点是 undefined) */\n renderValue?: (labels: readonly string[], nodes: readonly (T | undefined)[]) => VNodeChild;\n /** 弹出层顶部带搜索框,按整条路径的文字搜索已加载的节点 */\n searchable?: boolean;\n /** 搜索时怎样算匹配:参数是路径上的节点与输入;默认路径文字包含输入(忽略大小写与重音,或用 createUi 的 textMatcher) */\n filter?: (nodes: readonly T[], query: string) => boolean;\n /** 没有选择时显示的文字,默认取语言包(请选择) */\n placeholder?: string;\n /** 是否打开:父级可以写 _open={x} */\n _open?: boolean;\n /** 弹出位置,默认 bottom-start */\n placement?: FloatingPlacement;\n /** 有选择时显示清空按钮 */\n clearable?: boolean;\n /** 表单提交时的 name(用隐藏的 input,路径上每一级一个) */\n name?: string;\n /** 不可用 */\n disabled?: boolean;\n /** 只读:能聚焦、能看到已选的内容,不能打开、不能清空 */\n readonly?: boolean;\n /** 必填 */\n required?: boolean;\n /** 校验未通过 */\n invalid?: boolean;\n /** 外壳的部件属性 */\n propsRoot?: PartProps<'div'>;\n /** 已选内容那一层的部件属性 */\n propsValue?: PartProps<'span'>;\n /** 清空按钮的部件属性 */\n propsClear?: Partial<PresetIconButtonProps>;\n /** 下拉箭头的部件属性 */\n propsChevron?: Partial<IconProps>;\n /** 弹出层的部件属性 */\n propsPopover?: PartProps<'div', 'id' | 'popover'>;\n /** 搜索框的部件属性(searchable 时) */\n propsSearch?: Partial<TextFieldProps>;\n /** 每一列的部件属性 */\n propsColumn?: PartProps<'div', 'role' | 'id' | 'tabindex'>;\n}\n\n/** Cascader 的样式:columns、column、option、onPath、focused、chevron、results */\nexport const cascaderStyles = css.create({\n // 各列横排;列多了在弹出层里横向滚动\n columns: { display: 'flex', minHeight: 0, flexGrow: 1, overflowX: 'auto' },\n column: {\n boxSizing: 'border-box',\n flexShrink: 0,\n minWidth: '10em',\n maxWidth: '16em',\n overflowY: 'auto',\n padding: '_xs',\n outlineStyle: 'none',\n borderInlineEndWidth: { default: '_xs', ':last-child': 0 },\n borderInlineEndStyle: 'solid',\n borderInlineEndColor: '_borderMuted',\n },\n // 搜索结果是一整列,占满宽度\n results: { flexGrow: 1, maxWidth: 'none' },\n // 已展开的那一项(各列里在当前路径上的)\n onPath: { backgroundColor: '_fillHover' },\n // 列有焦点时它的高亮项画焦点环(列本身不画)\n focused: {\n outlineStyle: 'solid',\n outlineWidth: '_sm',\n outlineColor: '_focusRing',\n outlineOffset: `calc(-1 * ${t.borderWidths.sm})`,\n },\n chevron: { flexShrink: 0, color: '_textMuted', scale: { default: null, ':dir(rtl)': '-1 1' } },\n check: { flexShrink: 0 },\n empty: { paddingBlock: '_sm', paddingInline: '_sm', color: '_textMuted' },\n});\n\n/** 搜索结果的一项:整条路径 */\ninterface PathHit<T> {\n readonly keys: readonly string[];\n readonly nodes: readonly T[];\n readonly label: string;\n readonly disabled: boolean;\n}\n\n/** 级联选择:触发框 + 一列一列的选项,选到叶子(或任意一级) */\nexport const Cascader = _component(\n <T,>({\n items = [],\n getKey,\n getLabel,\n getChildren,\n hasChildren,\n loadChildren,\n isDisabled,\n _value: value = _bindable<readonly string[] | null>(null),\n changeOnSelect = false,\n showAllLevels = true,\n separator = ' / ',\n renderValue,\n searchable = false,\n filter,\n placeholder,\n _open: open = _bindable(false),\n onOpenChange,\n placement = 'bottom-start',\n clearable = false,\n name,\n variant,\n size,\n radius,\n disabled,\n readonly,\n required,\n invalid,\n id,\n icon,\n propsRoot,\n propsIcon,\n propsValue,\n propsClear,\n propsChevron,\n propsPopover,\n propsSearch,\n propsColumn,\n ...rest\n }: CascaderProps<T>) => {\n const lang = useLang();\n const textMatcher = useTextMatcher();\n const baseId = useId();\n const appearance = useControlAppearance(() => ({ variant, size, radius }));\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }));\n // 有没有下一级(懒加载时还没取回来也算有);每次调用时读属性,数据换了跟着变\n const expandable = (node: T) => isExpandable(node, { getKey, getChildren, hasChildren });\n // 当前展开的路径(各列的高亮项);有焦点的列\n let path = _state<string[]>([]);\n let focusedColumn = _state<number | null>(null);\n let search = _state('');\n let hit = _state(0);\n let loading = _state.raw<ReadonlySet<T>>(new Set());\n let shell = _state.raw<HTMLElement | null>(null);\n let trigger = _state.raw<HTMLElement | null>(null);\n let panel = _state.raw<HTMLElement | null>(null);\n const setOpen = openSetter(\n () => open,\n (next) => (open = next),\n () => onOpenChange,\n );\n\n const columnId = (level: number) => `${baseId}-column-${level}`;\n const optionId = (level: number, index: number) => `${baseId}-${level}-${index}`;\n const disabledNode = (node: T) => isDisabled?.(node) ?? false;\n const loaded = (node: T) => (getChildren(node)?.length ?? 0) > 0;\n\n /** 沿着 keys 找到各级的节点(找不到的地方停下:还没加载,或数据变了) */\n function nodesAlong(keys: readonly string[]): T[] {\n const found: T[] = [];\n let level = items;\n for (const key of keys) {\n const node = level.find((item, index) => getKey(item, index) === key);\n if (!node) break;\n found.push(node);\n level = getChildren(node) ?? [];\n }\n return found;\n }\n\n /** 要显示的各列:第一级,以及路径上每个已加载(或正在加载)下一级的节点的下一级 */\n const columns = _derived.by(() => {\n const list: { parent: T | undefined; items: readonly T[] }[] = [{ parent: undefined, items }];\n for (const node of nodesAlong(path)) {\n if (!expandable(node) || !(loaded(node) || loading.has(node))) break;\n list.push({ parent: node, items: getChildren(node) ?? [] });\n }\n return list;\n });\n\n /** 取回节点的下一级;有了(或取回来了)返回 true */\n async function ensureChildren(node: T): Promise<boolean> {\n if (loaded(node)) return true;\n if (!loadChildren || loading.has(node)) return false;\n const pending = loadChildren(node);\n if (!(pending instanceof Promise)) return loaded(node);\n loading = new Set([...loading, node]);\n try {\n await pending;\n } catch (error) {\n console.error('级联选择的下一级加载失败', error);\n return false;\n } finally {\n const next = new Set(loading);\n next.delete(node);\n loading = next;\n }\n return loaded(node);\n }\n\n function focusColumn(level: number) {\n void nextTick(() =>\n panel?.querySelector<HTMLElement>(`#${CSS.escape(columnId(level))}`)?.focus(),\n );\n }\n\n /** 高亮第 level 列的一项:它后面的路径换成它(有已加载的下一级时显示出来) */\n function activate(level: number, key: string) {\n path = [...path.slice(0, level), key];\n }\n\n /** 进入一项的下一级:先取回来,再高亮下一列的第一项并把焦点移过去 */\n async function enter(level: number, node: T, key: string) {\n activate(level, key);\n if (!expandable(node) || !(await ensureChildren(node))) return;\n // 等待期间换了高亮项:不再进入\n if (path[level] !== key) return;\n const children = getChildren(node) ?? [];\n const first = children.findIndex((child) => !disabledNode(child));\n if (first < 0) return;\n activate(level + 1, getKey(children[first]!, first));\n focusColumn(level + 1);\n }\n\n /** 选中一条路径;选到叶子(或从搜索结果里选)时关闭 */\n function pick(keys: readonly string[], node: T, close: boolean, event?: Event) {\n value = [...keys];\n if (close || !expandable(node)) setOpen(false, 'select', event);\n }\n\n /** 点一项:有下一级的展开(changeOnSelect 时同时选中),叶子选中 */\n function onOptionClick(level: number, node: T, key: string, event: MouseEvent) {\n if (disabledNode(node)) return;\n focusedColumn = level;\n if (!expandable(node)) return pick([...path.slice(0, level), key], node, true, event);\n if (changeOnSelect) pick([...path.slice(0, level), key], node, false, event);\n activate(level, key);\n void ensureChildren(node);\n }\n\n function onColumnKeydown(level: number, event: KeyboardEvent) {\n if (event.altKey || event.ctrlKey || event.metaKey) return;\n if (event.key === 'Tab') {\n setOpen(false, 'focus', event);\n return;\n }\n const list = columns[level]?.items ?? [];\n const current = list.findIndex((item, index) => getKey(item, index) === path[level]);\n const enabled = list.flatMap((item, index) => (disabledNode(item) ? [] : [index]));\n const go = (index: number | undefined) => {\n if (index !== undefined) activate(level, getKey(list[index]!, index));\n };\n const { forward, backward } = inlineArrows(!!panel && isRtl(panel));\n const node = current >= 0 ? list[current] : undefined;\n switch (event.key) {\n case 'ArrowDown':\n go(enabled.find((index) => index > current) ?? enabled[0]);\n break;\n case 'ArrowUp':\n go(enabled.findLast((index) => index < current) ?? enabled.at(-1));\n break;\n case 'Home':\n go(enabled[0]);\n break;\n case 'End':\n go(enabled.at(-1));\n break;\n case forward:\n if (node) void enter(level, node, path[level]!);\n break;\n case backward:\n if (level > 0) focusColumn(level - 1);\n break;\n case 'Enter':\n if (!node || disabledNode(node)) break;\n if (!expandable(node)) pick(path.slice(0, level + 1), node, true, event);\n else {\n if (changeOnSelect) pick(path.slice(0, level + 1), node, false, event);\n void enter(level, node, path[level]!);\n }\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n\n function onColumnFocus(level: number) {\n focusedColumn = level;\n // 第一次进入这一列:高亮第一个能选的\n if (path[level] !== undefined) return;\n const list = columns[level]?.items ?? [];\n const first = list.findIndex((item) => !disabledNode(item));\n if (first >= 0) activate(level, getKey(list[first]!, first));\n }\n\n // 搜索:匹配的完整路径,只列能选的(默认是叶子)\n const hits = _derived.by((): PathHit<T>[] | null => {\n const text = search.trim();\n if (!searchable || !text) return null;\n const match = textMatcher();\n const found: PathHit<T>[] = [];\n const visit = (\n level: readonly T[],\n keys: readonly string[],\n nodes: readonly T[],\n off: boolean,\n ) => {\n level.forEach((node, index) => {\n const nextKeys = [...keys, getKey(node, index)];\n const nextNodes = [...nodes, node];\n const nextOff = off || disabledNode(node);\n const label = nextNodes.map(getLabel).join(separator);\n const selectable = changeOnSelect || !expandable(node);\n if (selectable && (filter ? filter(nextNodes, text) : match(label, text))) {\n found.push({ keys: nextKeys, nodes: nextNodes, label, disabled: nextOff });\n }\n visit(getChildren(node) ?? [], nextKeys, nextNodes, nextOff);\n });\n };\n visit(items, [], [], false);\n return found;\n });\n\n function onSearchKeydown(event: KeyboardEvent) {\n const list = hits;\n if (event.key === 'Tab') {\n setOpen(false, 'focus', event);\n return;\n }\n // 没有搜索词:↓ 进入第一列\n if (!list) {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n focusColumn(Math.max(path.length - 1, 0));\n }\n return;\n }\n const enabled = list.flatMap((item, index) => (item.disabled ? [] : [index]));\n if (event.key === 'ArrowDown') hit = enabled.find((index) => index > hit) ?? enabled[0] ?? 0;\n else if (event.key === 'ArrowUp')\n hit = enabled.findLast((index) => index < hit) ?? enabled.at(-1) ?? 0;\n else if (event.key === 'Enter') {\n const chosen = list[hit];\n if (chosen && !chosen.disabled) pick(chosen.keys, chosen.nodes.at(-1)!, true, event);\n } else return;\n event.preventDefault();\n }\n\n async function show(event?: Event) {\n search = '';\n hit = 0;\n path = [...(value ?? [])];\n setOpen(true, 'trigger', event);\n // 沿着已选的路径逐级取回来(懒加载),已选的那一列看得见\n for (const node of nodesAlong(path).slice(0, -1)) {\n if (!(await ensureChildren(node))) break;\n }\n }\n\n function clear() {\n value = null;\n trigger?.focus();\n }\n\n const { onToggle } = useAnchoredPopover(\n () => ({\n open,\n anchor: shell,\n panel,\n floating: { placement, matchWidth: true, fitHeight: true },\n restoreFocus: false,\n }),\n { close: (reason, event) => setOpen(false, reason, event) },\n );\n\n // 打开后焦点进搜索框或已选的那一列;关闭时焦点还在弹层里(Esc、选中、点外面)就还给触发按钮\n function onPanelToggle(event: ToggleEvent) {\n onToggle(event);\n if (event.newState === 'open') {\n if (searchable) panel?.querySelector<HTMLElement>('input[type=\"search\"]')?.focus();\n else focusColumn(Math.max(path.length - 1, 0));\n return;\n }\n focusedColumn = null;\n const active = document.activeElement;\n if (!active || active === document.body || panel?.contains(active)) trigger?.focus();\n }\n\n function onTriggerKeydown(event: KeyboardEvent) {\n const state = control();\n if (state.disabled || state.readonly) return;\n if (!open && (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n void show(event);\n }\n }\n\n function toggle(event?: Event) {\n if (open) setOpen(false, 'trigger', event);\n else void show(event);\n }\n\n /** 一列选项 */\n function renderColumn(\n level: number,\n parent: T | undefined,\n list: readonly T[],\n label: () => {\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n },\n ) {\n const activeIndex = list.findIndex((item, index) => getKey(item, index) === path[level]);\n const focused = focusedColumn === level;\n const chosen = value ?? [];\n // 这一列在已选路径上:前面各级都与已选的一致\n const onChosenPath = path.slice(0, level).every((key, index) => chosen[index] === key);\n return (\n <div\n key={level}\n {...mergeAttrs<'div'>({ sx: cascaderStyles.column }, propsColumn, {\n id: columnId(level),\n role: 'listbox',\n tabindex: -1,\n ...label(),\n 'aria-activedescendant': activeIndex >= 0 ? optionId(level, activeIndex) : undefined,\n 'aria-busy': parent && loading.has(parent) ? true : undefined,\n onKeydown: (event: KeyboardEvent) => onColumnKeydown(level, event),\n onFocus: () => onColumnFocus(level),\n onBlur: () => (focusedColumn = focusedColumn === level ? null : focusedColumn),\n })}\n >\n {parent && loading.has(parent) && list.length === 0 && (\n <div {...css.attrs(cascaderStyles.empty)}>\n <Spinner label={lang.loading} />\n </div>\n )}\n {list.map((node, index) => {\n const key = getKey(node, index);\n const off = disabledNode(node);\n const branch = expandable(node);\n const active = index === activeIndex;\n const selected = onChosenPath && chosen[level] === key;\n return (\n <div\n key={key}\n id={optionId(level, index)}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={off || undefined}\n aria-haspopup={branch ? 'listbox' : undefined}\n aria-expanded={branch ? active && columns.length > level + 1 : undefined}\n {...css.attrs(\n itemStyles.row,\n itemStyles.hoverable,\n active && cascaderStyles.onPath,\n active && focused && cascaderStyles.focused,\n selected && itemStyles.selected,\n off && itemStyles.disabled,\n )}\n // 焦点留在列上\n onPointerdown={(event: PointerEvent) => event.preventDefault()}\n onClick={(event: MouseEvent) => {\n panel?.querySelector<HTMLElement>(`#${CSS.escape(columnId(level))}`)?.focus();\n onOptionClick(level, node, key, event);\n }}\n data-state={selected ? 'checked' : 'unchecked'}\n data-active={active || undefined}\n data-disabled={off || undefined}\n >\n <span {...css.attrs(itemStyles.label)}>{getLabel(node)}</span>\n {branch ? (\n loading.has(node) ? (\n <Spinner size=\"sm\" />\n ) : (\n <Icon icon={ChevronRight} sx={cascaderStyles.chevron} />\n )\n ) : (\n selected && <Icon icon={Check} sx={cascaderStyles.check} />\n )}\n </div>\n );\n })}\n </div>\n );\n }\n\n /** 搜索结果:一列完整路径 */\n function renderHits(list: readonly PathHit<T>[]) {\n const chosen = (value ?? []).join('\\u0000');\n return (\n <div\n {...mergeAttrs<'div'>(\n { sx: [cascaderStyles.column, cascaderStyles.results] },\n propsColumn,\n {\n id: columnId(0),\n role: 'listbox',\n tabindex: -1,\n 'aria-label': lang.selectSearch,\n },\n )}\n >\n {list.length === 0 && (\n <div {...css.attrs(cascaderStyles.empty)}>{lang.selectNoMatch}</div>\n )}\n {list.map((item, index) => {\n const selected = item.keys.join('\\u0000') === chosen;\n return (\n <div\n key={item.keys.join('\\u0000')}\n id={optionId(0, index)}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={item.disabled || undefined}\n {...css.attrs(\n itemStyles.row,\n itemStyles.hoverable,\n index === hit && itemStyles.highlighted,\n selected && itemStyles.selected,\n item.disabled && itemStyles.disabled,\n )}\n onPointerdown={(event: PointerEvent) => event.preventDefault()}\n onPointermove={() => !item.disabled && (hit = index)}\n onClick={(event: MouseEvent) =>\n !item.disabled && pick(item.keys, item.nodes.at(-1)!, true, event)\n }\n >\n <span {...css.attrs(itemStyles.label)}>{item.label}</span>\n {selected && <Icon icon={Check} sx={cascaderStyles.check} />}\n </div>\n );\n })}\n </div>\n );\n }\n\n return () => {\n const state = control();\n const s = controlParts(appearance(), state);\n const off = state.disabled;\n const locked = off || state.readonly;\n const keys = value ?? [];\n const nodes = nodesAlong(keys);\n // 还没加载的那几级按 key 显示\n const labels = keys.map((key, index) => (nodes[index] ? getLabel(nodes[index]) : key));\n const shown =\n keys.length === 0 ? (\n <span {...css.attrs(selectStyles.placeholder)}>\n {placeholder ?? lang.selectPlaceholder}\n </span>\n ) : (\n (renderValue?.(\n labels,\n keys.map((_, index) => nodes[index]),\n ) ?? (showAllLevels ? labels.join(separator) : labels.at(-1)))\n );\n const firstLabel = () =>\n state.labelledBy\n ? { 'aria-labelledby': state.labelledBy }\n : { 'aria-label': rest['aria-label'] };\n const list = hits;\n return (\n <>\n <div\n {...mergeAttrs<'div'>({ ...s.root, sx: [s.root.sx, selectStyles.root] }, propsRoot, {\n ref: _toRef(shell),\n onPointerdown: off ? undefined : focusOnShell(() => trigger),\n onClick: locked\n ? undefined\n : clickOnShell(\n () => trigger,\n (event) => toggle(event),\n ),\n })}\n data-state={open ? 'open' : 'closed'}\n data-invalid={state.invalid || undefined}\n data-disabled={off || undefined}\n >\n {controlIcon(s, icon, propsIcon)}\n <button\n {...mergeAttrs<'button'>(\n { sx: [buttonBaseStyles.root, selectStyles.trigger] },\n rest,\n {\n ref: _toRef(trigger),\n id: state.id,\n type: 'button',\n role: 'combobox',\n disabled: off,\n 'aria-haspopup': 'listbox',\n 'aria-expanded': open,\n 'aria-controls': columnId(0),\n 'aria-invalid': state.invalid || undefined,\n 'aria-required': state.required || undefined,\n 'aria-readonly': state.readonly || undefined,\n 'aria-describedby': state.describedBy,\n onClick: (event: MouseEvent) => {\n trigger?.focus();\n if (!locked) toggle(event);\n },\n onKeydown: onTriggerKeydown,\n },\n )}\n >\n <span {...mergeAttrs<'span'>({ sx: selectStyles.value }, propsValue)}>{shown}</span>\n </button>\n {clearable && keys.length > 0 && !locked && controlClear(s, propsClear, clear)}\n <Icon\n {...mergePartProps<IconProps>(\n {\n ...s.icon,\n icon: ChevronDown,\n sx: [s.icon.sx, disclosureStyles.icon, open && selectStyles.chevronOpen],\n },\n propsChevron,\n )}\n />\n <FormValue name={name} value={keys} disabled={state.disabled} />\n </div>\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n anchoredPanelSx(appearance().size),\n floatingStyles.scrollPanel,\n listPopoverStyles.panel,\n ],\n },\n propsPopover,\n { ref: _toRef(panel), popover: 'auto', onToggle: onPanelToggle },\n )}\n >\n {searchable && (\n <div {...css.attrs(listPopoverStyles.header)}>\n <TextField\n {...mergePartProps<TextFieldProps>(\n {\n icon: Search,\n variant: 'soft',\n placeholder: lang.selectSearch,\n 'aria-label': lang.selectSearch,\n propsRoot: { sx: selectStyles.search },\n },\n propsSearch,\n )}\n type=\"search\"\n _value={search}\n onUpdate:_value={(next: string) => {\n search = next;\n hit = 0;\n }}\n aria-controls={columnId(0)}\n aria-activedescendant={list?.length ? optionId(0, hit) : undefined}\n onKeydown={onSearchKeydown}\n />\n </div>\n )}\n {open && (\n <div {...css.attrs(cascaderStyles.columns)}>\n {list\n ? renderHits(list)\n : columns.map((column, level) =>\n renderColumn(level, column.parent, column.items, () =>\n column.parent ? { 'aria-label': getLabel(column.parent) } : firstLabel(),\n ),\n )}\n </div>\n )}\n </div>\n </>\n );\n };\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"Cascader.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vue_ref","_vue_shallowRef","_vue_computed","_createVNode","_mergeProps","_Fragment"],"sources":["../../src/input/Cascader.tsx"],"sourcesContent":["/**\n * 级联选择:一列一列往下选(省 / 市 / 区、产品大类 / 小类 / 型号、物料分类),触发框里显示整条路径“浙江 / 杭州 / 西湖区”。\n *\n * <Cascader items={regions} getKey={(r) => r.code} getLabel={(r) => r.name} getChildren={(r) => r.children} _value={path} />\n * <Cascader … changeOnSelect /> 每一级都能选(选到市也行)\n * <Cascader … hasChildren={(r) => !r.leaf} loadChildren={loadNext} /> 展开时远程取下一级\n * <Cascader … searchable /> 按整条路径搜索(在已加载的节点里)\n *\n * - value 是从第一级到选中节点的 key 路径(同 Ant Design、Element Plus),key 只要在同级里唯一;没有选择时 null。\n * - 默认只能选到叶子:点有下一级的项只是展开;changeOnSelect 时点任何一级都选中它(并展开下一级)。\n * - 弹出层里每一级是一列 listbox,焦点在列上、高亮项经 aria-activedescendant:↑↓ 移动(有下一级的跟着显示下一列),\n * → 进入下一级(懒加载的先取回来),← 回到上一级,Enter 选中(叶子选中后关闭),Esc 关闭并把焦点还给触发按钮。\n * 从右到左排版时左右键对调。\n * - searchable:搜索框里输入后换成一列匹配的完整路径,只列能选的(默认是叶子),↑↓、Enter 在搜索框里操作。\n * - 懒加载:hasChildren 声明有下一级,进入时 loadChildren 取回来放进数据里(数据要是响应式的),期间显示转圈;\n * 打开时沿着已选的路径逐级取回来,已选的那一列看得见。\n *\n * 部件:Root(外壳)、Trigger(button,主元素)、Value、Clear、Chevron、Popover、Search(TextField)、Column(每一列)、Option。\n */\nimport { Check, ChevronDown, ChevronRight, Search } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { nextTick, useId, type VNodeChild } from 'vue';\nimport type { PresetIconButtonProps } from '../base/CloseButton';\nimport { buttonBaseStyles } from '../base/button-core';\nimport { Icon, type IconProps } from '../base/Icon';\nimport { Spinner } from '../base/Spinner';\nimport { useLang, useTextMatcher } from '../config/context';\nimport { useFieldControl } from '../form/Field';\nimport { FormValue } from '../form/FormValue';\nimport { isExpandable } from '../utils/data/tree';\nimport { inlineArrows, isRtl } from '../utils/dom/direction';\nimport {\n anchoredPanelSx,\n floatingStyles,\n useAnchoredPopover,\n type FloatingPlacement,\n} from '../utils/dom/floating';\nimport { openSetter, type OpenChangeProps } from '../utils/dom/open-change';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport { itemStyles } from '../utils/style/item-styles';\nimport { t } from '../config/theme/tokens';\nimport { disclosureStyles } from '../utils/style/transitions';\nimport {\n clickOnShell,\n controlClear,\n controlIcon,\n controlParts,\n focusOnShell,\n useControlAppearance,\n type ControlIconOptions,\n type ControlOptions,\n} from './control';\nimport { listPopoverStyles } from './ListPopover';\nimport { selectStyles, type SelectManaged } from './Select';\nimport { TextField, type TextFieldProps } from './TextField';\n\n/** 未声明的属性落到触发按钮(主元素)上,外壳用 propsRoot */\nexport interface CascaderProps<T>\n extends PartProps<'button', SelectManaged>, ControlOptions, ControlIconOptions, OpenChangeProps {\n /** 第一级的节点 */\n items?: readonly T[];\n /** 节点的 key,同级里唯一;index 是它在同级里的位置 */\n getKey: (node: T, index: number) => string;\n /** 节点的文字 */\n getLabel: (node: T) => string;\n /** 下一级;叶子或还没加载时 undefined */\n getChildren: (node: T) => readonly T[] | undefined;\n /** 有没有下一级(懒加载时还没取回来也算有);不写时看 getChildren 是否非空 */\n hasChildren?: (node: T) => boolean;\n /** 进入一个还没有下一级的节点时取回来,放进数据里;返回 Promise 时显示加载中 */\n loadChildren?: (node: T) => Promise<unknown> | void;\n /** 不能选、不能进入的节点 */\n isDisabled?: (node: T) => boolean;\n /** 选中的路径(第一级到选中节点的 key),没有时 null:父级写 _value={x} */\n _value?: readonly string[] | null;\n /** 每一级都能选;默认只能选到叶子 */\n changeOnSelect?: boolean;\n /** 触发框里显示整条路径(默认),false 时只显示最后一级 */\n showAllLevels?: boolean;\n /** 路径各级之间的分隔,默认“ / ” */\n separator?: string;\n /** 自定义触发框里的内容:参数是路径上各级的文字与节点(还没加载的节点文字是 key、节点是 undefined) */\n renderValue?: (labels: readonly string[], nodes: readonly (T | undefined)[]) => VNodeChild;\n /** 弹出层顶部带搜索框,按整条路径的文字搜索已加载的节点 */\n searchable?: boolean;\n /** 搜索时怎样算匹配:参数是路径上的节点与输入;默认路径文字包含输入(忽略大小写与重音,或用 createUi 的 textMatcher) */\n filter?: (nodes: readonly T[], query: string) => boolean;\n /** 没有选择时显示的文字,默认取语言包(请选择) */\n placeholder?: string;\n /** 是否打开:父级可以写 _open={x} */\n _open?: boolean;\n /** 弹出位置,默认 bottom-start */\n placement?: FloatingPlacement;\n /** 有选择时显示清空按钮 */\n clearable?: boolean;\n /** 表单提交时的 name(用隐藏的 input,路径上每一级一个) */\n name?: string;\n /** 不可用 */\n disabled?: boolean;\n /** 只读:能聚焦、能看到已选的内容,不能打开、不能清空 */\n readonly?: boolean;\n /** 必填 */\n required?: boolean;\n /** 校验未通过 */\n invalid?: boolean;\n /** 外壳的部件属性 */\n propsRoot?: PartProps<'div'>;\n /** 已选内容那一层的部件属性 */\n propsValue?: PartProps<'span'>;\n /** 清空按钮的部件属性 */\n propsClear?: Partial<PresetIconButtonProps>;\n /** 下拉箭头的部件属性 */\n propsChevron?: Partial<IconProps>;\n /** 弹出层的部件属性 */\n propsPopover?: PartProps<'div', 'id' | 'popover'>;\n /** 搜索框的部件属性(searchable 时) */\n propsSearch?: Partial<TextFieldProps>;\n /** 每一列的部件属性 */\n propsColumn?: PartProps<'div', 'role' | 'id' | 'tabindex'>;\n}\n\n/** Cascader 的样式:columns、column、option、onPath、focused、chevron、results */\nexport const cascaderStyles = css.create({\n // 各列横排;列多了在弹出层里横向滚动\n columns: { display: 'flex', minHeight: 0, flexGrow: 1, overflowX: 'auto' },\n column: {\n boxSizing: 'border-box',\n flexShrink: 0,\n minWidth: '10em',\n maxWidth: '16em',\n overflowY: 'auto',\n padding: '_xs',\n outlineStyle: 'none',\n borderInlineEndWidth: { default: '_xs', ':last-child': 0 },\n borderInlineEndStyle: 'solid',\n borderInlineEndColor: '_borderMuted',\n },\n // 搜索结果是一整列,占满宽度\n results: { flexGrow: 1, maxWidth: 'none' },\n // 已展开的那一项(各列里在当前路径上的)\n onPath: { backgroundColor: '_fillHover' },\n // 列有焦点时它的高亮项画焦点环(列本身不画)\n focused: {\n outlineStyle: 'solid',\n outlineWidth: '_sm',\n outlineColor: '_focusRing',\n outlineOffset: `calc(-1 * ${t.borderWidths.sm})`,\n },\n chevron: { flexShrink: 0, color: '_textMuted', scale: { default: null, ':dir(rtl)': '-1 1' } },\n check: { flexShrink: 0 },\n empty: { paddingBlock: '_sm', paddingInline: '_sm', color: '_textMuted' },\n});\n\n/** 搜索结果的一项:整条路径 */\ninterface PathHit<T> {\n readonly keys: readonly string[];\n readonly nodes: readonly T[];\n readonly label: string;\n readonly disabled: boolean;\n}\n\n/** 级联选择:触发框 + 一列一列的选项,选到叶子(或任意一级) */\nexport const Cascader = _component(\n <T,>({\n items = [],\n getKey,\n getLabel,\n getChildren,\n hasChildren,\n loadChildren,\n isDisabled,\n _value: value = _bindable<readonly string[] | null>(null),\n changeOnSelect = false,\n showAllLevels = true,\n separator = ' / ',\n renderValue,\n searchable = false,\n filter,\n placeholder,\n _open: open = _bindable(false),\n onOpenChange,\n placement = 'bottom-start',\n clearable = false,\n name,\n variant,\n size,\n radius,\n disabled,\n readonly,\n required,\n invalid,\n id,\n icon,\n propsRoot,\n propsIcon,\n propsValue,\n propsClear,\n propsChevron,\n propsPopover,\n propsSearch,\n propsColumn,\n ...rest\n }: CascaderProps<T>) => {\n const lang = useLang();\n const textMatcher = useTextMatcher();\n const baseId = useId();\n const appearance = useControlAppearance(() => ({ variant, size, radius }));\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }));\n // 有没有下一级(懒加载时还没取回来也算有);每次调用时读属性,数据换了跟着变\n const expandable = (node: T) => isExpandable(node, { getKey, getChildren, hasChildren });\n // 当前展开的路径(各列的高亮项);有焦点的列\n let path = _state<string[]>([]);\n let focusedColumn = _state<number | null>(null);\n let search = _state('');\n let hit = _state(0);\n let loading = _state.raw<ReadonlySet<T>>(new Set());\n let shell = _state.raw<HTMLElement | null>(null);\n let trigger = _state.raw<HTMLElement | null>(null);\n let panel = _state.raw<HTMLElement | null>(null);\n const setOpen = openSetter(\n () => open,\n (next) => (open = next),\n () => onOpenChange,\n );\n\n const columnId = (level: number) => `${baseId}-column-${level}`;\n const optionId = (level: number, index: number) => `${baseId}-${level}-${index}`;\n const disabledNode = (node: T) => isDisabled?.(node) ?? false;\n const loaded = (node: T) => (getChildren(node)?.length ?? 0) > 0;\n\n /** 沿着 keys 找到各级的节点(找不到的地方停下:还没加载,或数据变了) */\n function nodesAlong(keys: readonly string[]): T[] {\n const found: T[] = [];\n let level = items;\n for (const key of keys) {\n const node = level.find((item, index) => getKey(item, index) === key);\n if (!node) break;\n found.push(node);\n level = getChildren(node) ?? [];\n }\n return found;\n }\n\n /** 要显示的各列:第一级,以及路径上每个已加载(或正在加载)下一级的节点的下一级 */\n const columns = _derived.by(() => {\n const list: { parent: T | undefined; items: readonly T[] }[] = [{ parent: undefined, items }];\n for (const node of nodesAlong(path)) {\n if (!expandable(node) || !(loaded(node) || loading.has(node))) break;\n list.push({ parent: node, items: getChildren(node) ?? [] });\n }\n return list;\n });\n\n /** 取回节点的下一级;有了(或取回来了)返回 true */\n async function ensureChildren(node: T): Promise<boolean> {\n if (loaded(node)) return true;\n if (!loadChildren || loading.has(node)) return false;\n const pending = loadChildren(node);\n if (!(pending instanceof Promise)) return loaded(node);\n loading = new Set([...loading, node]);\n try {\n await pending;\n } catch (error) {\n console.error('级联选择的下一级加载失败', error);\n return false;\n } finally {\n const next = new Set(loading);\n next.delete(node);\n loading = next;\n }\n return loaded(node);\n }\n\n function focusColumn(level: number) {\n void nextTick(() =>\n panel?.querySelector<HTMLElement>(`#${CSS.escape(columnId(level))}`)?.focus(),\n );\n }\n\n /** 高亮第 level 列的一项:它后面的路径换成它(有已加载的下一级时显示出来) */\n function activate(level: number, key: string) {\n path = [...path.slice(0, level), key];\n }\n\n /** 进入一项的下一级:先取回来,再高亮下一列的第一项并把焦点移过去 */\n async function enter(level: number, node: T, key: string) {\n activate(level, key);\n if (!expandable(node) || !(await ensureChildren(node))) return;\n // 等待期间换了高亮项:不再进入\n if (path[level] !== key) return;\n const children = getChildren(node) ?? [];\n const first = children.findIndex((child) => !disabledNode(child));\n if (first < 0) return;\n activate(level + 1, getKey(children[first]!, first));\n focusColumn(level + 1);\n }\n\n /** 选中一条路径;选到叶子(或从搜索结果里选)时关闭 */\n function pick(keys: readonly string[], node: T, close: boolean, event?: Event) {\n value = [...keys];\n if (close || !expandable(node)) setOpen(false, 'select', event);\n }\n\n /** 点一项:有下一级的展开(changeOnSelect 时同时选中),叶子选中 */\n function onOptionClick(level: number, node: T, key: string, event: MouseEvent) {\n if (disabledNode(node)) return;\n focusedColumn = level;\n if (!expandable(node)) return pick([...path.slice(0, level), key], node, true, event);\n if (changeOnSelect) pick([...path.slice(0, level), key], node, false, event);\n activate(level, key);\n void ensureChildren(node);\n }\n\n function onColumnKeydown(level: number, event: KeyboardEvent) {\n if (event.altKey || event.ctrlKey || event.metaKey) return;\n if (event.key === 'Tab') {\n setOpen(false, 'focus', event);\n return;\n }\n const list = columns[level]?.items ?? [];\n const current = list.findIndex((item, index) => getKey(item, index) === path[level]);\n const enabled = list.flatMap((item, index) => (disabledNode(item) ? [] : [index]));\n const go = (index: number | undefined) => {\n if (index !== undefined) activate(level, getKey(list[index]!, index));\n };\n const { forward, backward } = inlineArrows(!!panel && isRtl(panel));\n const node = current >= 0 ? list[current] : undefined;\n switch (event.key) {\n case 'ArrowDown':\n go(enabled.find((index) => index > current) ?? enabled[0]);\n break;\n case 'ArrowUp':\n go(enabled.findLast((index) => index < current) ?? enabled.at(-1));\n break;\n case 'Home':\n go(enabled[0]);\n break;\n case 'End':\n go(enabled.at(-1));\n break;\n case forward:\n if (node) void enter(level, node, path[level]!);\n break;\n case backward:\n if (level > 0) focusColumn(level - 1);\n break;\n case 'Enter':\n if (!node || disabledNode(node)) break;\n if (!expandable(node)) pick(path.slice(0, level + 1), node, true, event);\n else {\n if (changeOnSelect) pick(path.slice(0, level + 1), node, false, event);\n void enter(level, node, path[level]!);\n }\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n\n function onColumnFocus(level: number) {\n focusedColumn = level;\n // 第一次进入这一列:高亮第一个能选的\n if (path[level] !== undefined) return;\n const list = columns[level]?.items ?? [];\n const first = list.findIndex((item) => !disabledNode(item));\n if (first >= 0) activate(level, getKey(list[first]!, first));\n }\n\n // 搜索:匹配的完整路径,只列能选的(默认是叶子)\n const hits = _derived.by((): PathHit<T>[] | null => {\n const text = search.trim();\n if (!searchable || !text) return null;\n const match = textMatcher();\n const found: PathHit<T>[] = [];\n const visit = (\n level: readonly T[],\n keys: readonly string[],\n nodes: readonly T[],\n off: boolean,\n ) => {\n level.forEach((node, index) => {\n const nextKeys = [...keys, getKey(node, index)];\n const nextNodes = [...nodes, node];\n const nextOff = off || disabledNode(node);\n const label = nextNodes.map(getLabel).join(separator);\n const selectable = changeOnSelect || !expandable(node);\n if (selectable && (filter ? filter(nextNodes, text) : match(label, text))) {\n found.push({ keys: nextKeys, nodes: nextNodes, label, disabled: nextOff });\n }\n visit(getChildren(node) ?? [], nextKeys, nextNodes, nextOff);\n });\n };\n visit(items, [], [], false);\n return found;\n });\n\n function onSearchKeydown(event: KeyboardEvent) {\n const list = hits;\n if (event.key === 'Tab') {\n setOpen(false, 'focus', event);\n return;\n }\n // 没有搜索词:↓ 进入第一列\n if (!list) {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n focusColumn(Math.max(path.length - 1, 0));\n }\n return;\n }\n const enabled = list.flatMap((item, index) => (item.disabled ? [] : [index]));\n if (event.key === 'ArrowDown') hit = enabled.find((index) => index > hit) ?? enabled[0] ?? 0;\n else if (event.key === 'ArrowUp')\n hit = enabled.findLast((index) => index < hit) ?? enabled.at(-1) ?? 0;\n else if (event.key === 'Enter') {\n const chosen = list[hit];\n if (chosen && !chosen.disabled) pick(chosen.keys, chosen.nodes.at(-1)!, true, event);\n } else return;\n event.preventDefault();\n }\n\n async function show(event?: Event) {\n search = '';\n hit = 0;\n path = [...(value ?? [])];\n setOpen(true, 'trigger', event);\n // 沿着已选的路径逐级取回来(懒加载),已选的那一列看得见\n for (const node of nodesAlong(path).slice(0, -1)) {\n if (!(await ensureChildren(node))) break;\n }\n }\n\n function clear() {\n value = null;\n trigger?.focus();\n }\n\n const { onToggle } = useAnchoredPopover(\n () => ({\n open,\n anchor: shell,\n panel,\n floating: { placement, matchWidth: true, fitHeight: true },\n restoreFocus: false,\n }),\n { close: (reason, event) => setOpen(false, reason, event) },\n );\n\n // 打开后焦点进搜索框或已选的那一列;关闭时焦点还在弹层里(Esc、选中、点外面)就还给触发按钮\n function onPanelToggle(event: ToggleEvent) {\n onToggle(event);\n if (event.newState === 'open') {\n if (searchable) panel?.querySelector<HTMLElement>('input[type=\"search\"]')?.focus();\n else focusColumn(Math.max(path.length - 1, 0));\n return;\n }\n focusedColumn = null;\n const active = document.activeElement;\n if (!active || active === document.body || panel?.contains(active)) trigger?.focus();\n }\n\n function onTriggerKeydown(event: KeyboardEvent) {\n const state = control();\n if (state.disabled || state.readonly) return;\n if (!open && (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n void show(event);\n }\n }\n\n function toggle(event?: Event) {\n if (open) setOpen(false, 'trigger', event);\n else void show(event);\n }\n\n /** 一列选项 */\n function renderColumn(\n level: number,\n parent: T | undefined,\n list: readonly T[],\n label: () => {\n 'aria-label'?: string;\n 'aria-labelledby'?: string;\n },\n ) {\n const activeIndex = list.findIndex((item, index) => getKey(item, index) === path[level]);\n const focused = focusedColumn === level;\n const chosen = value ?? [];\n // 这一列在已选路径上:前面各级都与已选的一致\n const onChosenPath = path.slice(0, level).every((key, index) => chosen[index] === key);\n return (\n <div\n key={level}\n {...mergeAttrs<'div'>({ sx: cascaderStyles.column }, propsColumn, {\n id: columnId(level),\n role: 'listbox',\n tabindex: -1,\n ...label(),\n 'aria-activedescendant': activeIndex >= 0 ? optionId(level, activeIndex) : undefined,\n 'aria-busy': parent && loading.has(parent) ? true : undefined,\n onKeydown: (event: KeyboardEvent) => onColumnKeydown(level, event),\n onFocus: () => onColumnFocus(level),\n onBlur: () => (focusedColumn = focusedColumn === level ? null : focusedColumn),\n })}\n >\n {parent && loading.has(parent) && list.length === 0 && (\n <div {...css.attrs(cascaderStyles.empty)}>\n <Spinner label={lang.loading} />\n </div>\n )}\n {list.map((node, index) => {\n const key = getKey(node, index);\n const off = disabledNode(node);\n const branch = expandable(node);\n const active = index === activeIndex;\n const selected = onChosenPath && chosen[level] === key;\n return (\n <div\n key={key}\n id={optionId(level, index)}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={off || undefined}\n aria-haspopup={branch ? 'listbox' : undefined}\n aria-expanded={branch ? active && columns.length > level + 1 : undefined}\n {...css.attrs(\n itemStyles.row,\n itemStyles.hoverable,\n active && cascaderStyles.onPath,\n active && focused && cascaderStyles.focused,\n selected && itemStyles.selected,\n off && itemStyles.disabled,\n )}\n // 焦点留在列上\n onPointerdown={(event: PointerEvent) => event.preventDefault()}\n onClick={(event: MouseEvent) => {\n panel?.querySelector<HTMLElement>(`#${CSS.escape(columnId(level))}`)?.focus();\n onOptionClick(level, node, key, event);\n }}\n data-state={selected ? 'checked' : 'unchecked'}\n data-active={active || undefined}\n data-disabled={off || undefined}\n >\n <span {...css.attrs(itemStyles.label)}>{getLabel(node)}</span>\n {branch ? (\n loading.has(node) ? (\n <Spinner size=\"sm\" />\n ) : (\n <Icon icon={ChevronRight} sx={cascaderStyles.chevron} />\n )\n ) : (\n selected && <Icon icon={Check} sx={cascaderStyles.check} />\n )}\n </div>\n );\n })}\n </div>\n );\n }\n\n /** 搜索结果:一列完整路径 */\n function renderHits(list: readonly PathHit<T>[]) {\n const chosen = (value ?? []).join('\\u0000');\n return (\n <div\n {...mergeAttrs<'div'>(\n { sx: [cascaderStyles.column, cascaderStyles.results] },\n propsColumn,\n {\n id: columnId(0),\n role: 'listbox',\n tabindex: -1,\n 'aria-label': lang.selectSearch,\n },\n )}\n >\n {list.length === 0 && (\n <div {...css.attrs(cascaderStyles.empty)}>{lang.selectNoMatch}</div>\n )}\n {list.map((item, index) => {\n const selected = item.keys.join('\\u0000') === chosen;\n return (\n <div\n key={item.keys.join('\\u0000')}\n id={optionId(0, index)}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={item.disabled || undefined}\n {...css.attrs(\n itemStyles.row,\n itemStyles.hoverable,\n index === hit && itemStyles.highlighted,\n selected && itemStyles.selected,\n item.disabled && itemStyles.disabled,\n )}\n onPointerdown={(event: PointerEvent) => event.preventDefault()}\n onPointermove={() => !item.disabled && (hit = index)}\n onClick={(event: MouseEvent) =>\n !item.disabled && pick(item.keys, item.nodes.at(-1)!, true, event)\n }\n >\n <span {...css.attrs(itemStyles.label)}>{item.label}</span>\n {selected && <Icon icon={Check} sx={cascaderStyles.check} />}\n </div>\n );\n })}\n </div>\n );\n }\n\n return () => {\n const state = control();\n const s = controlParts(appearance(), state);\n const off = state.disabled;\n const locked = off || state.readonly;\n const keys = value ?? [];\n const nodes = nodesAlong(keys);\n // 还没加载的那几级按 key 显示\n const labels = keys.map((key, index) => (nodes[index] ? getLabel(nodes[index]) : key));\n const shown =\n keys.length === 0 ? (\n <span {...css.attrs(selectStyles.placeholder)}>\n {placeholder ?? lang.selectPlaceholder}\n </span>\n ) : (\n (renderValue?.(\n labels,\n keys.map((_, index) => nodes[index]),\n ) ?? (showAllLevels ? labels.join(separator) : labels.at(-1)))\n );\n const firstLabel = () =>\n state.labelledBy\n ? { 'aria-labelledby': state.labelledBy }\n : { 'aria-label': rest['aria-label'] };\n const list = hits;\n return (\n <>\n <div\n {...mergeAttrs<'div'>({ ...s.root, sx: [s.root.sx, selectStyles.root] }, propsRoot, {\n ref: _toRef(shell),\n onPointerdown: off ? undefined : focusOnShell(() => trigger),\n onClick: locked\n ? undefined\n : clickOnShell(\n () => trigger,\n (event) => toggle(event),\n ),\n })}\n data-state={open ? 'open' : 'closed'}\n data-invalid={state.invalid || undefined}\n data-disabled={off || undefined}\n >\n {controlIcon(s, icon, propsIcon)}\n <button\n {...mergeAttrs<'button'>(\n { sx: [buttonBaseStyles.root, selectStyles.trigger] },\n rest,\n {\n ref: _toRef(trigger),\n id: state.id,\n type: 'button',\n role: 'combobox',\n disabled: off,\n 'aria-haspopup': 'listbox',\n 'aria-expanded': open,\n 'aria-controls': columnId(0),\n 'aria-invalid': state.invalid || undefined,\n 'aria-required': state.required || undefined,\n 'aria-readonly': state.readonly || undefined,\n 'aria-describedby': state.describedBy,\n onClick: (event: MouseEvent) => {\n trigger?.focus();\n if (!locked) toggle(event);\n },\n onKeydown: onTriggerKeydown,\n },\n )}\n >\n <span {...mergeAttrs<'span'>({ sx: selectStyles.value }, propsValue)}>{shown}</span>\n </button>\n {clearable && keys.length > 0 && !locked && controlClear(s, propsClear, clear)}\n <Icon\n {...mergePartProps<IconProps>(\n {\n ...s.icon,\n icon: ChevronDown,\n sx: [s.icon.sx, disclosureStyles.icon, open && selectStyles.chevronOpen],\n },\n propsChevron,\n )}\n />\n <FormValue name={name} value={keys} disabled={state.disabled} />\n </div>\n <div\n {...mergeAttrs<'div'>(\n {\n sx: [\n anchoredPanelSx(appearance().size),\n floatingStyles.scrollPanel,\n listPopoverStyles.panel,\n ],\n },\n propsPopover,\n { ref: _toRef(panel), popover: 'auto', onToggle: onPanelToggle },\n )}\n >\n {searchable && (\n <div {...css.attrs(listPopoverStyles.header)}>\n <TextField\n {...mergePartProps<TextFieldProps>(\n {\n icon: Search,\n variant: 'soft',\n placeholder: lang.selectSearch,\n 'aria-label': lang.selectSearch,\n propsRoot: { sx: selectStyles.search },\n },\n propsSearch,\n )}\n type=\"search\"\n _value={search}\n onUpdate:_value={(next: string) => {\n search = next;\n hit = 0;\n }}\n aria-controls={columnId(0)}\n aria-activedescendant={list?.length ? optionId(0, hit) : undefined}\n onKeydown={onSearchKeydown}\n />\n </div>\n )}\n {open && (\n <div {...css.attrs(cascaderStyles.columns)}>\n {list\n ? renderHits(list)\n : columns.map((column, level) =>\n renderColumn(level, column.parent, column.items, () =>\n column.parent ? { 'aria-label': getLabel(column.parent) } : firstLabel(),\n ),\n )}\n </div>\n )}\n </div>\n </>\n );\n };\n },\n);\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
2
  import { type VisuallyHiddenProps } from '../base/VisuallyHidden';
3
3
  import { type PartProps } from '../utils/props';
4
4
  /** 未声明的属性落到 span 上;id 给输入框的 aria-describedby 关联 */
@@ -3,7 +3,7 @@ import { mergeAttrs, mergePartProps } from "../utils/props.js";
3
3
  import { VisuallyHidden } from "../base/VisuallyHidden.js";
4
4
  import { createVNode } from "vue";
5
5
  import { _component, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
6
- import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
6
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
7
7
  //#region src/input/CharacterCount.tsx
8
8
  /** 未声明的属性落到 span 上;id 给输入框的 aria-describedby 关联 */
9
9
  /** CharacterCount 的样式:root、over */
@@ -1 +1 @@
1
- {"version":3,"file":"CharacterCount.js","names":["_vtp_readonlyProp","_vtp_restProps","_createVNode","_mergeProps"],"sources":["../../src/input/CharacterCount.tsx"],"sourcesContent":["/**\n * 字数计数(span):TextField、Textarea 的 showCount 用它,也可以单独放在 Field 里。\n * 显示“12 / 100”,超出上限时用危险色;读屏念完整的句子(语言包的 characterCount),由输入框经 aria-describedby 关联。\n *\n * <CharacterCount id={countId} count={bio.length} max={200} />\n *\n * 部件:Root(span)、Value(看得见的字数,对读屏隐藏)、Label(给读屏的句子)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { VisuallyHidden, type VisuallyHiddenProps } from '../base/VisuallyHidden';\nimport { useLang } from '../config/context';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\n\n/** 未声明的属性落到 span 上;id 给输入框的 aria-describedby 关联 */\nexport interface CharacterCountProps extends PartProps<'span'> {\n /** 已输入的字符数 */\n count: number;\n /** 上限;不给时只显示字数 */\n max?: number;\n /** 看得见的字数(“12 / 100”,对读屏隐藏)的部件属性 */\n propsValue?: PartProps<'span', 'aria-hidden'>;\n /** 给读屏的完整句子的部件属性 */\n propsLabel?: Partial<VisuallyHiddenProps>;\n}\n\n/** CharacterCount 的样式:root、over */\nexport const characterCountStyles = css.create({\n root: {\n flexShrink: 0,\n fontSize: '_sm',\n color: '_textMuted',\n fontVariantNumeric: 'tabular-nums',\n whiteSpace: 'nowrap',\n },\n over: { color: '_dangerText' },\n});\n\n/** 字数计数:超出上限时用危险色 */\nexport const CharacterCount = _component(\n ({ count, max, propsValue, propsLabel, ...rest }: CharacterCountProps) => {\n const lang = useLang();\n return () => {\n const over = max != null && count > max;\n return (\n <span\n {...mergeAttrs<'span'>(\n { sx: [characterCountStyles.root, over && characterCountStyles.over] },\n rest,\n )}\n data-over={over || undefined}\n >\n <span {...mergeAttrs<'span'>({}, propsValue, { 'aria-hidden': true })}>\n {max == null ? count : `${count} / ${max}`}\n </span>\n <VisuallyHidden {...mergePartProps<VisuallyHiddenProps>({}, propsLabel)}>\n {lang.characterCount(count, max)}\n </VisuallyHidden>\n </span>\n );\n };\n },\n);\n"],"mappings":";;;;;;;;;AA2BA,IAAa,uBAAuB,IAAI,OAAO;CAC7C,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,OAAO;EACP,oBAAoB;EACpB,YAAY;CACd;CACA,MAAM,EAAE,OAAO,cAAc;AAC/B,CAAC;;AAGD,IAAa,iBAAiB,0BAC5B,QAAA,SAA0E;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,MAAAA,aAAA,QAAA,KAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAhC,OAAIC,UAAA,QAAA,MAAA,IAAA;CAC5C,MAAM,OAAO,QAAQ;CACrB,aAAa;EACX,MAAM,OAAO,IAAA,SAAO,QAAQ,MAAA,QAAA,IAAA;EAC5B,OAAAC,YAAA,QAAAC,cAEQ,WACF,EAAE,IAAI,CAAC,qBAAqB,MAAM,QAAQ,qBAAqB,IAAI,EAAE,GACrE,IACF,GAAC,EAAA,aACU,QAAQ,KAAA,EAAS,CAAA,GAAA,CAAAD,YAAA,QAElB,WAAmB,CAAC,GAAC,WAAA,OAAc,EAAE,eAAe,KAAK,CAAC,GAAC,CAClE,IAAA,SAAO,OAAI,MAAA,QAAW,GAAA,MAAA,MAAA,KAAA,IAAA,OAAmB,CAAA,GAAAA,YAAA,gBAAAC,cAExB,eAAoC,CAAC,GAAC,WAAA,KAAY,GAAC,EAAA,OAAA,UAAA,CAAA,GAAA;GAAA,eAAA,CACpE,KAAK,eAAc,MAAA,OAAA,IAAA,KAAW,CAAC;GAAA,SAAA;EAAA,CAAA,CAAA,CAAA;CAIxC;AACF,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
1
+ {"version":3,"file":"CharacterCount.js","names":["_vtp_readonlyProp","_vtp_restProps","_createVNode","_mergeProps"],"sources":["../../src/input/CharacterCount.tsx"],"sourcesContent":["/**\n * 字数计数(span):TextField、Textarea 的 showCount 用它,也可以单独放在 Field 里。\n * 显示“12 / 100”,超出上限时用危险色;读屏念完整的句子(语言包的 characterCount),由输入框经 aria-describedby 关联。\n *\n * <CharacterCount id={countId} count={bio.length} max={200} />\n *\n * 部件:Root(span)、Value(看得见的字数,对读屏隐藏)、Label(给读屏的句子)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { VisuallyHidden, type VisuallyHiddenProps } from '../base/VisuallyHidden';\nimport { useLang } from '../config/context';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\n\n/** 未声明的属性落到 span 上;id 给输入框的 aria-describedby 关联 */\nexport interface CharacterCountProps extends PartProps<'span'> {\n /** 已输入的字符数 */\n count: number;\n /** 上限;不给时只显示字数 */\n max?: number;\n /** 看得见的字数(“12 / 100”,对读屏隐藏)的部件属性 */\n propsValue?: PartProps<'span', 'aria-hidden'>;\n /** 给读屏的完整句子的部件属性 */\n propsLabel?: Partial<VisuallyHiddenProps>;\n}\n\n/** CharacterCount 的样式:root、over */\nexport const characterCountStyles = css.create({\n root: {\n flexShrink: 0,\n fontSize: '_sm',\n color: '_textMuted',\n fontVariantNumeric: 'tabular-nums',\n whiteSpace: 'nowrap',\n },\n over: { color: '_dangerText' },\n});\n\n/** 字数计数:超出上限时用危险色 */\nexport const CharacterCount = _component(\n ({ count, max, propsValue, propsLabel, ...rest }: CharacterCountProps) => {\n const lang = useLang();\n return () => {\n const over = max != null && count > max;\n return (\n <span\n {...mergeAttrs<'span'>(\n { sx: [characterCountStyles.root, over && characterCountStyles.over] },\n rest,\n )}\n data-over={over || undefined}\n >\n <span {...mergeAttrs<'span'>({}, propsValue, { 'aria-hidden': true })}>\n {max == null ? count : `${count} / ${max}`}\n </span>\n <VisuallyHidden {...mergePartProps<VisuallyHiddenProps>({}, propsLabel)}>\n {lang.characterCount(count, max)}\n </VisuallyHidden>\n </span>\n );\n };\n },\n);\n"],"mappings":";;;;;;;;;AA2BA,IAAa,uBAAuB,IAAI,OAAO;CAC7C,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,OAAO;EACP,oBAAoB;EACpB,YAAY;CACd;CACA,MAAM,EAAE,OAAO,cAAc;AAC/B,CAAC;;AAGD,IAAa,iBAAiB,0BAC5B,QAAA,SAA0E;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,MAAAA,aAAA,QAAA,KAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAhC,OAAIC,UAAA,QAAA,MAAA,IAAA;CAC5C,MAAM,OAAO,QAAQ;CACrB,aAAa;EACX,MAAM,OAAO,IAAA,SAAO,QAAQ,MAAA,QAAA,IAAA;EAC5B,OAAAC,YAAA,QAAAC,cAEQ,WACF,EAAE,IAAI,CAAC,qBAAqB,MAAM,QAAQ,qBAAqB,IAAI,EAAE,GACrE,IACF,GAAC,EAAA,aACU,QAAQ,KAAA,EAAS,CAAA,GAAA,CAAAD,YAAA,QAElB,WAAmB,CAAC,GAAC,WAAA,OAAc,EAAE,eAAe,KAAK,CAAC,GAAC,CAClE,IAAA,SAAO,OAAI,MAAA,QAAW,GAAA,MAAA,MAAA,KAAA,IAAA,OAAmB,CAAA,GAAAA,YAAA,gBAAAC,cAExB,eAAoC,CAAC,GAAC,WAAA,KAAY,GAAC,EAAA,OAAA,UAAA,CAAA,GAAA;GAAA,eAAA,CACpE,KAAK,eAAc,MAAA,OAAA,IAAA,KAAW,CAAC;GAAA,SAAA;EAAA,CAAA,CAAA,CAAA;CAIxC;AACF,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
@@ -1,4 +1,4 @@
1
- import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
2
  import { type VNodeChild } from 'vue';
3
3
  import { type IconProps } from '../base/Icon';
4
4
  import { type ListboxOption, type OptionMapping } from './list-state';
@@ -8,7 +8,7 @@ import { toListboxOption } from "./list-state.js";
8
8
  import { choiceInputStyles, choiceParts, choiceRecipe, readonlyChoiceHandlers, syncChecked, useChoiceAppearance } from "./choice-styles.js";
9
9
  import { createVNode, ref, shallowRef, useId } from "vue";
10
10
  import { _component, bindable, childrenProp, createContext, effect, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
11
- import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
11
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
12
12
  import { Check, Minus } from "@lucide/icons";
13
13
  //#region src/input/Checkbox.tsx
14
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Checkbox.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_vue_shallowRef","_vue_ref","_createVNode","_mergeProps"],"sources":["../../src/input/Checkbox.tsx"],"sourcesContent":["/**\n * 复选框(原生 input type=\"checkbox\")与复选组。结构与样式见 choice-styles.ts。\n *\n * <Checkbox _checked={agreed}>我已阅读并同意</Checkbox>\n * <Checkbox _checked={allChecked} indeterminate={someChecked} onChange={toggleAll}>全选</Checkbox>\n * <Field label=\"通知方式\">\n * <CheckboxGroup _value={channels} name=\"channels\">\n * <Checkbox value=\"email\">邮件</Checkbox>\n * <Checkbox value=\"sms\">短信</Checkbox>\n * </CheckboxGroup>\n * </Field>\n * <CheckboxGroup _value={channels} items={[{ value: 'email', label: '邮件', description: '每天汇总一封' }, …]} />\n *\n * 部分勾选(indeterminate)是原生 input 的属性,读屏念“部分选中”。在 Field 里时关联说明与错误、沿用其状态;\n * 复选组用 role=\"group\",以 Field 的标签为名称(aria-labelledby)。\n *\n * 部件:Root(label)、Control(叠放层)、Indicator(对勾 / 横线图标)、Label(文字);未声明的属性落到 input 上。\n */\nimport { Check, Minus } from '@lucide/icons';\nimport { createContext, _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, type VNodeChild } from 'vue';\nimport { Icon, type IconProps } from '../base/Icon';\nimport { useFieldControl } from '../form/Field';\nimport { toListboxOption, type ListboxOption, type OptionMapping } from './list-state';\nimport {\n hasContent,\n defaultLabelledBy,\n mergeAttrs,\n mergePartProps,\n type PartProps,\n} from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { toggleSelection } from '../utils/data/selection';\nimport type { StatusTone } from '../utils/style/tone-styles';\nimport type { TextSize } from '../utils/style/typography';\nimport { useRecipe } from '../config/styles';\nimport {\n choiceInputStyles,\n choiceParts,\n choiceRecipe,\n useChoiceAppearance,\n type ChoiceOrientations,\n readonlyChoiceHandlers,\n syncChecked,\n} from './choice-styles';\n\n/** CheckboxGroup 交给组内 Checkbox 的状态 */\nexport interface CheckboxGroupState {\n /** 已勾选的值 */\n readonly value: readonly string[];\n /** 表单提交时的 name,组内每个 Checkbox 共用 */\n readonly name: string | undefined;\n /** 整组不可用 */\n readonly disabled: boolean;\n /** 整组只读 */\n readonly readonly: boolean;\n /** 整组校验未通过 */\n readonly invalid: boolean;\n /** 勾选或取消一个值 */\n toggle(value: string): void;\n}\n\n/** CheckboxGroup 的上下文:自定义的勾选项可以 inject 它接入组 */\nexport const CheckboxGroupContext = createContext<CheckboxGroupState>('CheckboxGroup');\n\n/** 勾选状态与可用性由组件管理;原生的 size 属性让给字号档位 */\nexport type CheckboxManaged =\n 'type' | 'checked' | 'disabled' | 'required' | 'size' | 'aria-invalid' | 'aria-describedby';\n\n/** 未声明的属性落到 input 上;外层 label 用 propsRoot */\nexport interface CheckboxProps extends PartProps<'input', CheckboxManaged> {\n /** 是否勾选:父级写 _checked={x};在复选组里时由组决定 */\n _checked?: boolean;\n /** 部分勾选(“全选”下面只选了一部分):显示横线,读屏念“部分选中” */\n indeterminate?: boolean;\n /** 在复选组里的值;单独使用时是表单提交的值(默认 on) */\n value?: string;\n /** 不可用 */\n disabled?: boolean;\n /** 只读:能聚焦、读屏念“只读”,勾选状态不能改(查看详情、审批时);外观照常 */\n readonly?: boolean;\n /** 必填(如“同意条款”) */\n required?: boolean;\n /** 校验未通过 */\n invalid?: boolean;\n /** 字号档位;不写时继承上下文字号 */\n size?: TextSize;\n /** 选中时的色调(与 Button、Badge 等同一套),默认 accent;可以用 defaults.Choice 统一改 */\n tone?: StatusTone;\n /** 外层 label 的部件属性 */\n propsRoot?: PartProps<'label'>;\n /** 叠放层的部件属性 */\n propsControl?: PartProps<'span'>;\n /** 对勾 / 横线图标的部件属性 */\n propsIndicator?: Partial<IconProps>;\n /** 文字的部件属性 */\n propsLabel?: PartProps<'span'>;\n /** 文字下方的说明(aria-describedby) */\n description?: VNodeChild;\n /** 说明的部件属性 */\n propsDescription?: PartProps<'span'>;\n /** 文字 */\n children?: VNodeChild;\n}\n\n/** Checkbox 的样式:box、indicator、hidden */\nexport const checkboxStyles = css.create({\n box: { width: '1.125em', height: '1.125em', borderRadius: '_sm' },\n indicator: { width: '0.875em', height: '0.875em', color: 'var(--tone-on-fill)' },\n hidden: { visibility: 'hidden' },\n});\n\n/** 复选框:原生 checkbox 加自绘的方框与对勾 */\nexport const Checkbox = _component(\n ({\n _checked: checked = _bindable(false),\n indeterminate = false,\n value,\n disabled,\n readonly,\n required,\n invalid,\n size,\n tone,\n id,\n propsRoot,\n propsControl,\n propsIndicator,\n propsLabel,\n description,\n propsDescription,\n children,\n ...rest\n }: CheckboxProps) => {\n const group = CheckboxGroupContext.inject(null);\n const descriptionId = `${useId()}-description`;\n const appearance = useChoiceAppearance(() => ({ size, tone }));\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }));\n let input = _state.raw<HTMLInputElement | null>(null);\n // 用户点击勾上时对勾描线;初次渲染、外部改值不播\n let drawCheck = _state(false);\n\n // indeterminate 只能经 DOM 属性设置\n _effect(() => {\n if (input) input.indeterminate = indeterminate;\n });\n\n function onChange(event: Event) {\n const target = event.target as HTMLInputElement;\n const next = target.checked;\n drawCheck = next;\n if (group && value != null) group.toggle(value);\n else checked = next;\n syncChecked([target], () => (group && value != null ? group.value.includes(value) : checked));\n }\n\n return () => {\n // 在复选组里时,id 与说明归组所有,不再给每一项\n const field = group ? undefined : control();\n const isChecked = group && value != null ? group.value.includes(value) : checked;\n const off = disabled ?? group?.disabled ?? field?.disabled ?? false;\n const locked = readonly ?? group?.readonly ?? field?.readonly ?? false;\n const bad = invalid ?? group?.invalid ?? field?.invalid ?? false;\n const marked = isChecked || indeterminate;\n const s = choiceParts(appearance(), { disabled: off, readonly: locked });\n return (\n <label\n {...mergeAttrs<'label'>(s.root, propsRoot)}\n data-state={indeterminate ? 'indeterminate' : isChecked ? 'checked' : 'unchecked'}\n data-disabled={off || undefined}\n data-readonly={locked || undefined}\n >\n <span {...mergeAttrs<'span'>(s.control, propsControl)}>\n <input\n {...mergeAttrs<'input'>(\n {\n ...s.input,\n sx: [\n s.input.sx,\n focusRingStyles.tight,\n checkboxStyles.box,\n marked && choiceInputStyles.checked,\n bad && choiceInputStyles.invalid,\n ],\n },\n rest,\n {\n ref: _toRef(input),\n type: 'checkbox',\n id: field?.id ?? id,\n name: rest.name ?? group?.name,\n value,\n checked: isChecked,\n disabled: off,\n required: required ?? field?.required,\n 'aria-invalid': bad || undefined,\n 'aria-readonly': locked || undefined,\n 'aria-describedby':\n [field?.describedBy, hasContent(description) && descriptionId]\n .filter(Boolean)\n .join(' ') || undefined,\n onChange,\n ...(locked && readonlyChoiceHandlers),\n },\n )}\n />\n <Icon\n {...mergePartProps<IconProps>(\n {\n ...s.indicator,\n icon: indeterminate ? Minus : Check,\n draw: drawCheck && isChecked && !indeterminate,\n strokeWidth: 3,\n sx: [s.indicator.sx, checkboxStyles.indicator, !marked && checkboxStyles.hidden],\n },\n propsIndicator,\n )}\n />\n </span>\n {(hasContent(children) || hasContent(description)) && (\n <span {...mergeAttrs<'span'>(s.label, propsLabel)}>\n {children}\n {hasContent(description) && (\n <span\n {...mergeAttrs<'span'>(s.description, propsDescription, {\n id: descriptionId,\n })}\n >\n {description}\n </span>\n )}\n </span>\n )}\n </label>\n );\n };\n },\n);\n\n/** 未声明的属性落到 div(role=\"group\")上 */\nexport interface CheckboxGroupBaseProps<T> extends PartProps<'div', 'role'> {\n /** 勾选的值:父级写 _value={list} */\n _value?: string[];\n /** 表单提交时各项共用的 name */\n name?: string;\n /** 整组不可用 */\n disabled?: boolean;\n /** 整组只读 */\n readonly?: boolean;\n /** 校验未通过(如“至少选一项”) */\n invalid?: boolean;\n /** 排列方向,默认 vertical */\n orientation?: keyof ChoiceOrientations;\n /** 各项:ListboxOption(值、文字、说明、不可用)、字符串,或任意数据加 toOption;写了 children 时不用 */\n items?: readonly T[];\n /** Checkbox;不写时按 items 生成 */\n children?: VNodeChild;\n}\n\n/** CheckboxGroup 的属性:items 是 ListboxOption、字符串时不用 toOption */\nexport type CheckboxGroupProps<T = ListboxOption> = CheckboxGroupBaseProps<T> & OptionMapping<T>;\n\n/** 一组复选框:value 是勾选项的值的数组 */\nexport const CheckboxGroup = _component(\n <T = ListboxOption,>({\n _value: value = _bindable<string[]>([]),\n name,\n disabled,\n readonly,\n invalid,\n orientation = 'vertical',\n id,\n items,\n toOption,\n children,\n ...rest\n }: CheckboxGroupProps<T>) => {\n const control = useFieldControl(() => ({ id, disabled, readonly, invalid }));\n const recipe = useRecipe(choiceRecipe);\n CheckboxGroupContext.provide({\n get value() {\n return value;\n },\n get name() {\n return name;\n },\n get disabled() {\n return control().disabled;\n },\n get readonly() {\n return control().readonly;\n },\n get invalid() {\n return control().invalid;\n },\n toggle(item) {\n value = [...toggleSelection(value, item, { mode: 'multiple' })];\n },\n });\n\n return () => {\n const state = control();\n return (\n <div\n {...mergeAttrs<'div'>(recipe({ orientation }).group, rest, {\n id: state.id,\n role: 'group',\n 'aria-labelledby': defaultLabelledBy(rest, state.labelledBy),\n 'aria-describedby': state.describedBy,\n })}\n data-orientation={orientation}\n data-disabled={state.disabled || undefined}\n data-readonly={state.readonly || undefined}\n >\n {children ??\n items?.map((item) => {\n const option = toListboxOption(item, toOption);\n return (\n <Checkbox\n key={option.value}\n value={option.value}\n disabled={option.disabled || undefined}\n description={option.description}\n >\n {option.label}\n </Checkbox>\n );\n })}\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"Checkbox.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_childrenProp","_vtp_restProps","_vue_shallowRef","_vue_ref","_createVNode","_mergeProps"],"sources":["../../src/input/Checkbox.tsx"],"sourcesContent":["/**\n * 复选框(原生 input type=\"checkbox\")与复选组。结构与样式见 choice-styles.ts。\n *\n * <Checkbox _checked={agreed}>我已阅读并同意</Checkbox>\n * <Checkbox _checked={allChecked} indeterminate={someChecked} onChange={toggleAll}>全选</Checkbox>\n * <Field label=\"通知方式\">\n * <CheckboxGroup _value={channels} name=\"channels\">\n * <Checkbox value=\"email\">邮件</Checkbox>\n * <Checkbox value=\"sms\">短信</Checkbox>\n * </CheckboxGroup>\n * </Field>\n * <CheckboxGroup _value={channels} items={[{ value: 'email', label: '邮件', description: '每天汇总一封' }, …]} />\n *\n * 部分勾选(indeterminate)是原生 input 的属性,读屏念“部分选中”。在 Field 里时关联说明与错误、沿用其状态;\n * 复选组用 role=\"group\",以 Field 的标签为名称(aria-labelledby)。\n *\n * 部件:Root(label)、Control(叠放层)、Indicator(对勾 / 横线图标)、Label(文字);未声明的属性落到 input 上。\n */\nimport { Check, Minus } from '@lucide/icons';\nimport { createContext, _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, type VNodeChild } from 'vue';\nimport { Icon, type IconProps } from '../base/Icon';\nimport { useFieldControl } from '../form/Field';\nimport { toListboxOption, type ListboxOption, type OptionMapping } from './list-state';\nimport {\n hasContent,\n defaultLabelledBy,\n mergeAttrs,\n mergePartProps,\n type PartProps,\n} from '../utils/props';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { toggleSelection } from '../utils/data/selection';\nimport type { StatusTone } from '../utils/style/tone-styles';\nimport type { TextSize } from '../utils/style/typography';\nimport { useRecipe } from '../config/styles';\nimport {\n choiceInputStyles,\n choiceParts,\n choiceRecipe,\n useChoiceAppearance,\n type ChoiceOrientations,\n readonlyChoiceHandlers,\n syncChecked,\n} from './choice-styles';\n\n/** CheckboxGroup 交给组内 Checkbox 的状态 */\nexport interface CheckboxGroupState {\n /** 已勾选的值 */\n readonly value: readonly string[];\n /** 表单提交时的 name,组内每个 Checkbox 共用 */\n readonly name: string | undefined;\n /** 整组不可用 */\n readonly disabled: boolean;\n /** 整组只读 */\n readonly readonly: boolean;\n /** 整组校验未通过 */\n readonly invalid: boolean;\n /** 勾选或取消一个值 */\n toggle(value: string): void;\n}\n\n/** CheckboxGroup 的上下文:自定义的勾选项可以 inject 它接入组 */\nexport const CheckboxGroupContext = createContext<CheckboxGroupState>('CheckboxGroup');\n\n/** 勾选状态与可用性由组件管理;原生的 size 属性让给字号档位 */\nexport type CheckboxManaged =\n 'type' | 'checked' | 'disabled' | 'required' | 'size' | 'aria-invalid' | 'aria-describedby';\n\n/** 未声明的属性落到 input 上;外层 label 用 propsRoot */\nexport interface CheckboxProps extends PartProps<'input', CheckboxManaged> {\n /** 是否勾选:父级写 _checked={x};在复选组里时由组决定 */\n _checked?: boolean;\n /** 部分勾选(“全选”下面只选了一部分):显示横线,读屏念“部分选中” */\n indeterminate?: boolean;\n /** 在复选组里的值;单独使用时是表单提交的值(默认 on) */\n value?: string;\n /** 不可用 */\n disabled?: boolean;\n /** 只读:能聚焦、读屏念“只读”,勾选状态不能改(查看详情、审批时);外观照常 */\n readonly?: boolean;\n /** 必填(如“同意条款”) */\n required?: boolean;\n /** 校验未通过 */\n invalid?: boolean;\n /** 字号档位;不写时继承上下文字号 */\n size?: TextSize;\n /** 选中时的色调(与 Button、Badge 等同一套),默认 accent;可以用 defaults.Choice 统一改 */\n tone?: StatusTone;\n /** 外层 label 的部件属性 */\n propsRoot?: PartProps<'label'>;\n /** 叠放层的部件属性 */\n propsControl?: PartProps<'span'>;\n /** 对勾 / 横线图标的部件属性 */\n propsIndicator?: Partial<IconProps>;\n /** 文字的部件属性 */\n propsLabel?: PartProps<'span'>;\n /** 文字下方的说明(aria-describedby) */\n description?: VNodeChild;\n /** 说明的部件属性 */\n propsDescription?: PartProps<'span'>;\n /** 文字 */\n children?: VNodeChild;\n}\n\n/** Checkbox 的样式:box、indicator、hidden */\nexport const checkboxStyles = css.create({\n box: { width: '1.125em', height: '1.125em', borderRadius: '_sm' },\n indicator: { width: '0.875em', height: '0.875em', color: 'var(--tone-on-fill)' },\n hidden: { visibility: 'hidden' },\n});\n\n/** 复选框:原生 checkbox 加自绘的方框与对勾 */\nexport const Checkbox = _component(\n ({\n _checked: checked = _bindable(false),\n indeterminate = false,\n value,\n disabled,\n readonly,\n required,\n invalid,\n size,\n tone,\n id,\n propsRoot,\n propsControl,\n propsIndicator,\n propsLabel,\n description,\n propsDescription,\n children,\n ...rest\n }: CheckboxProps) => {\n const group = CheckboxGroupContext.inject(null);\n const descriptionId = `${useId()}-description`;\n const appearance = useChoiceAppearance(() => ({ size, tone }));\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }));\n let input = _state.raw<HTMLInputElement | null>(null);\n // 用户点击勾上时对勾描线;初次渲染、外部改值不播\n let drawCheck = _state(false);\n\n // indeterminate 只能经 DOM 属性设置\n _effect(() => {\n if (input) input.indeterminate = indeterminate;\n });\n\n function onChange(event: Event) {\n const target = event.target as HTMLInputElement;\n const next = target.checked;\n drawCheck = next;\n if (group && value != null) group.toggle(value);\n else checked = next;\n syncChecked([target], () => (group && value != null ? group.value.includes(value) : checked));\n }\n\n return () => {\n // 在复选组里时,id 与说明归组所有,不再给每一项\n const field = group ? undefined : control();\n const isChecked = group && value != null ? group.value.includes(value) : checked;\n const off = disabled ?? group?.disabled ?? field?.disabled ?? false;\n const locked = readonly ?? group?.readonly ?? field?.readonly ?? false;\n const bad = invalid ?? group?.invalid ?? field?.invalid ?? false;\n const marked = isChecked || indeterminate;\n const s = choiceParts(appearance(), { disabled: off, readonly: locked });\n return (\n <label\n {...mergeAttrs<'label'>(s.root, propsRoot)}\n data-state={indeterminate ? 'indeterminate' : isChecked ? 'checked' : 'unchecked'}\n data-disabled={off || undefined}\n data-readonly={locked || undefined}\n >\n <span {...mergeAttrs<'span'>(s.control, propsControl)}>\n <input\n {...mergeAttrs<'input'>(\n {\n ...s.input,\n sx: [\n s.input.sx,\n focusRingStyles.tight,\n checkboxStyles.box,\n marked && choiceInputStyles.checked,\n bad && choiceInputStyles.invalid,\n ],\n },\n rest,\n {\n ref: _toRef(input),\n type: 'checkbox',\n id: field?.id ?? id,\n name: rest.name ?? group?.name,\n value,\n checked: isChecked,\n disabled: off,\n required: required ?? field?.required,\n 'aria-invalid': bad || undefined,\n 'aria-readonly': locked || undefined,\n 'aria-describedby':\n [field?.describedBy, hasContent(description) && descriptionId]\n .filter(Boolean)\n .join(' ') || undefined,\n onChange,\n ...(locked && readonlyChoiceHandlers),\n },\n )}\n />\n <Icon\n {...mergePartProps<IconProps>(\n {\n ...s.indicator,\n icon: indeterminate ? Minus : Check,\n draw: drawCheck && isChecked && !indeterminate,\n strokeWidth: 3,\n sx: [s.indicator.sx, checkboxStyles.indicator, !marked && checkboxStyles.hidden],\n },\n propsIndicator,\n )}\n />\n </span>\n {(hasContent(children) || hasContent(description)) && (\n <span {...mergeAttrs<'span'>(s.label, propsLabel)}>\n {children}\n {hasContent(description) && (\n <span\n {...mergeAttrs<'span'>(s.description, propsDescription, {\n id: descriptionId,\n })}\n >\n {description}\n </span>\n )}\n </span>\n )}\n </label>\n );\n };\n },\n);\n\n/** 未声明的属性落到 div(role=\"group\")上 */\nexport interface CheckboxGroupBaseProps<T> extends PartProps<'div', 'role'> {\n /** 勾选的值:父级写 _value={list} */\n _value?: string[];\n /** 表单提交时各项共用的 name */\n name?: string;\n /** 整组不可用 */\n disabled?: boolean;\n /** 整组只读 */\n readonly?: boolean;\n /** 校验未通过(如“至少选一项”) */\n invalid?: boolean;\n /** 排列方向,默认 vertical */\n orientation?: keyof ChoiceOrientations;\n /** 各项:ListboxOption(值、文字、说明、不可用)、字符串,或任意数据加 toOption;写了 children 时不用 */\n items?: readonly T[];\n /** Checkbox;不写时按 items 生成 */\n children?: VNodeChild;\n}\n\n/** CheckboxGroup 的属性:items 是 ListboxOption、字符串时不用 toOption */\nexport type CheckboxGroupProps<T = ListboxOption> = CheckboxGroupBaseProps<T> & OptionMapping<T>;\n\n/** 一组复选框:value 是勾选项的值的数组 */\nexport const CheckboxGroup = _component(\n <T = ListboxOption,>({\n _value: value = _bindable<string[]>([]),\n name,\n disabled,\n readonly,\n invalid,\n orientation = 'vertical',\n id,\n items,\n toOption,\n children,\n ...rest\n }: CheckboxGroupProps<T>) => {\n const control = useFieldControl(() => ({ id, disabled, readonly, invalid }));\n const recipe = useRecipe(choiceRecipe);\n CheckboxGroupContext.provide({\n get value() {\n return value;\n },\n get name() {\n return name;\n },\n get disabled() {\n return control().disabled;\n },\n get readonly() {\n return control().readonly;\n },\n get invalid() {\n return control().invalid;\n },\n toggle(item) {\n value = [...toggleSelection(value, item, { mode: 'multiple' })];\n },\n });\n\n return () => {\n const state = control();\n return (\n <div\n {...mergeAttrs<'div'>(recipe({ orientation }).group, rest, {\n id: state.id,\n role: 'group',\n 'aria-labelledby': defaultLabelledBy(rest, state.labelledBy),\n 'aria-describedby': state.describedBy,\n })}\n data-orientation={orientation}\n data-disabled={state.disabled || undefined}\n data-readonly={state.readonly || undefined}\n >\n {children ??\n items?.map((item) => {\n const option = toListboxOption(item, toOption);\n return (\n <Checkbox\n key={option.value}\n value={option.value}\n disabled={option.disabled || undefined}\n description={option.description}\n >\n {option.label}\n </Checkbox>\n );\n })}\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
2
  import { type PartProps } from '../utils/props';
3
3
  import { type ControlOptions } from './control';
4
4
  /** 值、状态与无障碍关联由组件管理 */
@@ -7,7 +7,7 @@ import { parseColor, toHex } from "../utils/data/color.js";
7
7
  import { swatchStyles } from "../utils/style/swatch-styles.js";
8
8
  import { createVNode, ref, shallowRef, vModelText, watch, withDirectives } from "vue";
9
9
  import { _component, bindable, mergeJsxProps, readonlyProp, restProps, untrack } from "@zerodep-dev/vue-tsx-pro-tsx";
10
- import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
10
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
11
11
  //#region src/input/ColorField.tsx
12
12
  /** 值、状态与无障碍关联由组件管理 */
13
13
  /** 未声明的属性落到文字输入框(input)上 */
@@ -1 +1 @@
1
- {"version":3,"file":"ColorField.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_vue_ref","_vtp_untrack","_createVNode","_mergeProps","_withDirectives","_vModelText"],"sources":["../../src/input/ColorField.tsx"],"sourcesContent":["/**\n * 颜色输入:前面是色块(点开浏览器原生的取色器),后面可以直接输入颜色值。主题编辑器、品牌色设置这类地方用。\n *\n * <ColorField _value={brand} aria-label=\"品牌色\" />\n *\n * - 值是 #rrggbb(有透明度时 #rrggbbaa):输入 rgb()、颜色名也行,失焦或回车时规范成 #hex 写回;\n * 写不成颜色时外壳标为无效(aria-invalid),值不变,失焦后恢复成原来的值。\n * - 原生取色器不带透明度:用它选色时透明度去掉。\n * - 接入 Field(标签、说明、错误、必填、不可用),外观同 TextField(control.tsx)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { watch } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFieldControl } from '../form/Field';\nimport { parseColor, toHex } from '../utils/data/color';\nimport { mergeAttrs, type PartProps } from '../utils/props';\nimport { swatchStyles } from '../utils/style/swatch-styles';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { controlParts, focusOnShell, useControlAppearance, type ControlOptions } from './control';\n\n/** 值、状态与无障碍关联由组件管理 */\nexport type ColorFieldManaged =\n | 'value'\n | 'type'\n | 'disabled'\n | 'readonly'\n | 'required'\n | 'size'\n | 'aria-invalid'\n | 'aria-describedby';\n\n/** 未声明的属性落到文字输入框(input)上 */\nexport interface ColorFieldProps extends PartProps<'input', ColorFieldManaged>, ControlOptions {\n /** 颜色值(#rrggbb 或 #rrggbbaa):父级写 _value={x} 双向绑定 */\n _value?: string;\n /** 不可用 */\n disabled?: boolean;\n /** 只读:能看到颜色、复制取值,不能修改 */\n readonly?: boolean;\n /** 必填 */\n required?: boolean;\n /** 校验未通过 */\n invalid?: boolean;\n /** 外壳(边框、焦点环)的部件属性 */\n propsRoot?: PartProps<'div'>;\n /** 色块(包着原生取色器的 label)的部件属性 */\n propsSwatch?: PartProps<'label'>;\n /** 原生取色器(透明地盖在色块上)的部件属性;类型、取值、可用性与无障碍名称由组件管理 */\n propsPicker?: PartProps<'input', 'type' | 'value' | 'disabled' | 'aria-label' | 'onInput'>;\n}\n\n/** ColorField 的样式:swatch、fill、picker、input */\nexport const colorFieldStyles = css.create({\n // 色块:棋盘格垫底(swatchStyles),颜色铺在上面一层\n swatch: {\n position: 'relative',\n flexShrink: 0,\n width: '1.25em',\n height: '1.25em',\n borderRadius: '_sm',\n overflow: 'hidden',\n cursor: 'pointer',\n },\n fill: { position: 'absolute', inset: 0 },\n // 原生取色器盖满色块、完全透明:点色块就是点它,键盘也能聚焦它\n picker: {\n position: 'absolute',\n inset: 0,\n width: '_full',\n height: '_full',\n margin: 0,\n padding: 0,\n borderWidth: 0,\n opacity: 0,\n cursor: 'inherit',\n },\n // 等宽字体:#hex 各位对齐,改一位时不跳动\n input: { fontFamily: '_mono', fontVariantLigatures: 'none' },\n});\n\n// 颜色是任意值,用动态样式;单独一个 create,见 COMPONENTS.md §4\n/** ColorField 的动态样式:色块里的颜色 */\nexport const colorFieldDynamicStyles = css.create({\n fill: (color: string) => ({ backgroundColor: color }),\n});\n\n/** 颜色输入(色块 + 文字输入):值是 #hex */\nexport const ColorField = _component(\n ({\n _value: value = _bindable('#000000'),\n variant,\n size,\n radius,\n disabled,\n readonly,\n required,\n invalid,\n id,\n propsRoot,\n propsSwatch,\n propsPicker,\n ...rest\n }: ColorFieldProps) => {\n const lang = useLang();\n const appearance = useControlAppearance(() => ({ variant, size, radius }));\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }));\n let input = _state.raw<HTMLInputElement | null>(null);\n // 正在输入的文字:写成颜色之前不写回 value\n let draft = _state(_untrack(value));\n watch(\n () => value,\n (next) => (draft = next),\n );\n const parsed = () => parseColor(draft) !== undefined;\n\n function commit() {\n const hex = toHex(draft);\n if (hex) value = hex;\n draft = value;\n }\n\n return () => {\n const state = control();\n const editable = !state.disabled && !state.readonly;\n const showInvalid = state.invalid || !parsed();\n const s = controlParts(appearance(), { ...state, invalid: showInvalid });\n // 原生取色器只认 #rrggbb\n const opaque = toHex(value)?.slice(0, 7) ?? '#000000';\n return (\n <div\n {...mergeAttrs<'div'>(s.root, propsRoot, { onPointerdown: focusOnShell(() => input) })}\n data-invalid={showInvalid || undefined}\n data-disabled={state.disabled || undefined}\n >\n <label\n {...mergeAttrs<'label'>(\n { sx: [swatchStyles.checkerboard, colorFieldStyles.swatch] },\n propsSwatch,\n )}\n >\n <span\n {...css.attrs(\n colorFieldStyles.fill,\n swatchStyles.ring,\n colorFieldDynamicStyles.fill(value),\n )}\n />\n <input\n {...mergeAttrs<'input'>(\n { sx: [colorFieldStyles.picker, focusRingStyles.visible] },\n propsPicker,\n {\n type: 'color',\n value: opaque,\n disabled: !editable,\n 'aria-label': lang.colorPick,\n onInput: (event: Event) => (value = (event.target as HTMLInputElement).value),\n },\n )}\n />\n </label>\n <input\n {...mergeAttrs<'input'>(\n { ...s.input, sx: [s.input.sx, colorFieldStyles.input] },\n rest,\n {\n ref: _toRef(input),\n id: state.id,\n type: 'text',\n spellcheck: false,\n autocomplete: 'off',\n disabled: state.disabled,\n readonly: state.readonly,\n required: state.required,\n 'aria-invalid': showInvalid || undefined,\n 'aria-describedby': state.describedBy,\n onBlur: commit,\n onKeydown: (event: KeyboardEvent) => {\n if (event.key === 'Enter') commit();\n },\n },\n )}\n _value={draft}\n />\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"ColorField.js","names":["_vtp_bindable","_vtp_readonlyProp","_vtp_restProps","_vue_shallowRef","_vue_ref","_vtp_untrack","_createVNode","_mergeProps","_withDirectives","_vModelText"],"sources":["../../src/input/ColorField.tsx"],"sourcesContent":["/**\n * 颜色输入:前面是色块(点开浏览器原生的取色器),后面可以直接输入颜色值。主题编辑器、品牌色设置这类地方用。\n *\n * <ColorField _value={brand} aria-label=\"品牌色\" />\n *\n * - 值是 #rrggbb(有透明度时 #rrggbbaa):输入 rgb()、颜色名也行,失焦或回车时规范成 #hex 写回;\n * 写不成颜色时外壳标为无效(aria-invalid),值不变,失焦后恢复成原来的值。\n * - 原生取色器不带透明度:用它选色时透明度去掉。\n * - 接入 Field(标签、说明、错误、必填、不可用),外观同 TextField(control.tsx)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { watch } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFieldControl } from '../form/Field';\nimport { parseColor, toHex } from '../utils/data/color';\nimport { mergeAttrs, type PartProps } from '../utils/props';\nimport { swatchStyles } from '../utils/style/swatch-styles';\nimport { focusRingStyles } from '../utils/style/styles';\nimport { controlParts, focusOnShell, useControlAppearance, type ControlOptions } from './control';\n\n/** 值、状态与无障碍关联由组件管理 */\nexport type ColorFieldManaged =\n | 'value'\n | 'type'\n | 'disabled'\n | 'readonly'\n | 'required'\n | 'size'\n | 'aria-invalid'\n | 'aria-describedby';\n\n/** 未声明的属性落到文字输入框(input)上 */\nexport interface ColorFieldProps extends PartProps<'input', ColorFieldManaged>, ControlOptions {\n /** 颜色值(#rrggbb 或 #rrggbbaa):父级写 _value={x} 双向绑定 */\n _value?: string;\n /** 不可用 */\n disabled?: boolean;\n /** 只读:能看到颜色、复制取值,不能修改 */\n readonly?: boolean;\n /** 必填 */\n required?: boolean;\n /** 校验未通过 */\n invalid?: boolean;\n /** 外壳(边框、焦点环)的部件属性 */\n propsRoot?: PartProps<'div'>;\n /** 色块(包着原生取色器的 label)的部件属性 */\n propsSwatch?: PartProps<'label'>;\n /** 原生取色器(透明地盖在色块上)的部件属性;类型、取值、可用性与无障碍名称由组件管理 */\n propsPicker?: PartProps<'input', 'type' | 'value' | 'disabled' | 'aria-label' | 'onInput'>;\n}\n\n/** ColorField 的样式:swatch、fill、picker、input */\nexport const colorFieldStyles = css.create({\n // 色块:棋盘格垫底(swatchStyles),颜色铺在上面一层\n swatch: {\n position: 'relative',\n flexShrink: 0,\n width: '1.25em',\n height: '1.25em',\n borderRadius: '_sm',\n overflow: 'hidden',\n cursor: 'pointer',\n },\n fill: { position: 'absolute', inset: 0 },\n // 原生取色器盖满色块、完全透明:点色块就是点它,键盘也能聚焦它\n picker: {\n position: 'absolute',\n inset: 0,\n width: '_full',\n height: '_full',\n margin: 0,\n padding: 0,\n borderWidth: 0,\n opacity: 0,\n cursor: 'inherit',\n },\n // 等宽字体:#hex 各位对齐,改一位时不跳动\n input: { fontFamily: '_mono', fontVariantLigatures: 'none' },\n});\n\n// 颜色是任意值,用动态样式;单独一个 create,见 COMPONENTS.md §4\n/** ColorField 的动态样式:色块里的颜色 */\nexport const colorFieldDynamicStyles = css.create({\n fill: (color: string) => ({ backgroundColor: color }),\n});\n\n/** 颜色输入(色块 + 文字输入):值是 #hex */\nexport const ColorField = _component(\n ({\n _value: value = _bindable('#000000'),\n variant,\n size,\n radius,\n disabled,\n readonly,\n required,\n invalid,\n id,\n propsRoot,\n propsSwatch,\n propsPicker,\n ...rest\n }: ColorFieldProps) => {\n const lang = useLang();\n const appearance = useControlAppearance(() => ({ variant, size, radius }));\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }));\n let input = _state.raw<HTMLInputElement | null>(null);\n // 正在输入的文字:写成颜色之前不写回 value\n let draft = _state(_untrack(value));\n watch(\n () => value,\n (next) => (draft = next),\n );\n const parsed = () => parseColor(draft) !== undefined;\n\n function commit() {\n const hex = toHex(draft);\n if (hex) value = hex;\n draft = value;\n }\n\n return () => {\n const state = control();\n const editable = !state.disabled && !state.readonly;\n const showInvalid = state.invalid || !parsed();\n const s = controlParts(appearance(), { ...state, invalid: showInvalid });\n // 原生取色器只认 #rrggbb\n const opaque = toHex(value)?.slice(0, 7) ?? '#000000';\n return (\n <div\n {...mergeAttrs<'div'>(s.root, propsRoot, { onPointerdown: focusOnShell(() => input) })}\n data-invalid={showInvalid || undefined}\n data-disabled={state.disabled || undefined}\n >\n <label\n {...mergeAttrs<'label'>(\n { sx: [swatchStyles.checkerboard, colorFieldStyles.swatch] },\n propsSwatch,\n )}\n >\n <span\n {...css.attrs(\n colorFieldStyles.fill,\n swatchStyles.ring,\n colorFieldDynamicStyles.fill(value),\n )}\n />\n <input\n {...mergeAttrs<'input'>(\n { sx: [colorFieldStyles.picker, focusRingStyles.visible] },\n propsPicker,\n {\n type: 'color',\n value: opaque,\n disabled: !editable,\n 'aria-label': lang.colorPick,\n onInput: (event: Event) => (value = (event.target as HTMLInputElement).value),\n },\n )}\n />\n </label>\n <input\n {...mergeAttrs<'input'>(\n { ...s.input, sx: [s.input.sx, colorFieldStyles.input] },\n rest,\n {\n ref: _toRef(input),\n id: state.id,\n type: 'text',\n spellcheck: false,\n autocomplete: 'off',\n disabled: state.disabled,\n readonly: state.readonly,\n required: state.required,\n 'aria-invalid': showInvalid || undefined,\n 'aria-describedby': state.describedBy,\n onBlur: commit,\n onKeydown: (event: KeyboardEvent) => {\n if (event.key === 'Enter') commit();\n },\n },\n )}\n _value={draft}\n />\n </div>\n );\n };\n },\n);\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
2
  import { type VNodeChild } from 'vue';
3
3
  import type { PresetIconButtonProps } from '../base/CloseButton';
4
4
  import { type IconButtonProps } from '../base/IconButton';
@@ -14,7 +14,7 @@ import { ListPopover } from "./ListPopover.js";
14
14
  import { useRemoteItems } from "./remote-items.js";
15
15
  import { Fragment, createVNode, ref, shallowRef, useId, vModelText, watch, withDirectives } from "vue";
16
16
  import { _component, bindable, childrenProp, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
17
- import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
17
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
18
18
  import { ChevronDown } from "@lucide/icons";
19
19
  //#region src/input/Combobox.tsx
20
20
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_childrenProp","_vtp_restProps","_vue_ref","_vue_shallowRef","_createVNode","_Fragment","_mergeProps","_withDirectives","_vModelText"],"sources":["../../src/input/Combobox.tsx"],"sourcesContent":["/**\n * 组合框(WAI-ARIA Combobox,aria-autocomplete=\"list\"):边输入边从列表里选,或者只当带建议的输入框用。\n *\n * <Field label=\"城市\"><Combobox items={cities} _value={city} /></Field>\n * <Combobox items={results} filter={false} loading={searching} _inputValue={keyword} aria-label=\"搜索用户\" />\n *\n * 组合已有的部件:外壳同 TextField(controlParts),弹出层用 useAnchoredPopover(与外壳同宽),列表是 ListboxView。\n * 焦点一直在输入框里,高亮项经 aria-activedescendant 告诉读屏。\n *\n * - 过滤:默认本地按显示文字包含输入(Intl.Collator,忽略大小写与重音);filter={false} 时不过滤,\n * 由调用方按 inputValue 换 items(异步搜索,配合 loading)。给 load 时组件自己请求:打开时与输入停下 300 ms 后\n * 按输入请求,只采用最后一次(remote-items.ts,同 Select)。\n * - 中文输入法:输入经 v-model 写回,组合输入期间 inputValue 不变,所以不会拿拼音去过滤。\n * - 选中后输入框显示选项文字;失焦时如果文字不是某个选项(且没开 allowCustomValue),恢复成已选项的文字,清空则取消选择。\n * - 键盘:↓ 打开、↑↓ / Page Up / Down 移动,Enter 选中,Esc 关闭(关闭时再按 Esc 清空);Home / End 照常移动光标。\n *\n * 部件:Root(外壳)、Input(主元素)、Clear、Chevron(切换按钮)、Popover、Listbox。\n */\nimport { ChevronDown } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, watch, type VNodeChild } from 'vue';\nimport type { PresetIconButtonProps } from '../base/CloseButton';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { useLang, useTextMatcher } from '../config/context';\nimport { isComposingKey } from '../utils/dom/hotkeys';\nimport { useAnchoredPopover, type FloatingPlacement } from '../utils/dom/floating';\nimport { openSetter, type OpenChangeProps } from '../utils/dom/open-change';\nimport { ListPopover } from './ListPopover';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport {\n controlClear,\n controlParts,\n focusOnShell,\n controlIcon,\n useControlAppearance,\n type ControlIconOptions,\n type ControlOptions,\n} from './control';\nimport { useFieldControl } from '../form/Field';\nimport { FormValue } from '../form/FormValue';\nimport { disclosureStyles } from '../utils/style/transitions';\nimport { activeOptionId, type ListboxViewProps, type OptionRenderState } from './Listbox';\nimport {\n handleListKeydown,\n useListState,\n useResultAnnouncement,\n useSelectedOptions,\n type ListboxOption,\n type OptionMapping,\n toListboxOption,\n} from './list-state';\nimport { useRemoteItems, type OptionsLoader } from './remote-items';\n\n/** 角色、展开状态、值与可用性由组件管理 */\nexport type ComboboxManaged =\n | 'value'\n | 'role'\n | 'size'\n | 'disabled'\n | 'readonly'\n | 'required'\n | 'autocomplete'\n | 'aria-autocomplete'\n | 'aria-expanded'\n | 'aria-controls'\n | 'aria-activedescendant'\n | 'aria-invalid'\n | 'aria-describedby';\n\n/** Combobox 除 toOption 外的属性;未声明的属性落到 input(主元素)上,外壳用 propsRoot */\nexport interface ComboboxBaseProps<T>\n extends PartProps<'input', ComboboxManaged>, ControlOptions, ControlIconOptions, OpenChangeProps {\n /** 数据:ListboxOption、字符串,或任意数据加 toOption;有 load 时是第一次加载之前的选项(编辑页放上已选的那一项) */\n items?: readonly T[];\n /** 选中项的值:父级写 _value={x};没有选中时是 null */\n _value?: string | null;\n /** 输入框里的文字:父级可以写 _inputValue={x}(异步搜索时据此取数据) */\n _inputValue?: string;\n /** 是否打开:父级可以写 _open={x} */\n _open?: boolean;\n /** 过滤:默认按显示文字包含输入(忽略大小写与重音);函数自定义;false 不过滤(异步搜索) */\n filter?: false | ((item: T, query: string) => boolean);\n /** 远程选项:打开时与输入停下 300 ms 后按输入调用,结果代替 items;只采用最后一次,被顶掉的请求 signal 中止 */\n load?: OptionsLoader<T>;\n /** 允许输入不在选项里的文字:失焦时保留,value 为 null */\n allowCustomValue?: boolean;\n /**\n * 显示右侧的展开按钮;只当带建议的输入框用时(Autocomplete)关掉,列表随输入出现\n * @default true\n */\n showToggle?: boolean;\n /** 没有可选的项时不弹出列表(不显示“没有匹配的选项”):只当带建议的输入框用时(Autocomplete) */\n hideEmpty?: boolean;\n /** 正在取选项(异步搜索):没有选项时列表里是骨架行,已有选项时顶部显示进度条 */\n loading?: boolean;\n /** 弹出位置,默认 bottom-start */\n placement?: FloatingPlacement;\n /** 有内容时显示清空按钮 */\n clearable?: boolean;\n /** 表单提交时的 name(用隐藏的 input 提交 value) */\n name?: string;\n /** 不可用 */\n disabled?: boolean;\n /** 只读 */\n readonly?: boolean;\n /** 必填 */\n required?: boolean;\n /** 校验未通过 */\n invalid?: boolean;\n /** 自定义选项内容:`{(item, { selected, active }) => …}`,拿到 items 里的原始数据 */\n children?: (item: T, state: OptionRenderState) => VNodeChild;\n /** 没有匹配的选项时列表里显示的内容 */\n empty?: VNodeChild;\n /** 外壳的部件属性 */\n propsRoot?: PartProps<'div'>;\n /** 清空按钮的部件属性 */\n propsClear?: Partial<PresetIconButtonProps>;\n /** 切换按钮(下拉箭头)的部件属性 */\n propsChevron?: Partial<IconButtonProps>;\n /** 弹出层的部件属性 */\n propsPopover?: PartProps<'div', 'id' | 'popover'>;\n /** 列表的部件属性 */\n propsListbox?: Partial<ListboxViewProps<T>>;\n}\n\n/** 组合框的属性;items 不是 ListboxOption 或字符串时要给 toOption */\nexport type ComboboxProps<T = ListboxOption> = ComboboxBaseProps<T> & OptionMapping<T>;\n\n/** Combobox 的样式:chevronOpen */\nexport const comboboxStyles = css.create({\n chevronOpen: { rotate: '180deg' },\n});\n\n/** 组合框:输入框 + 过滤后的选项列表 */\nexport const Combobox = _component(\n <T,>({\n items = [],\n toOption,\n _value: value = _bindable<string | null>(null),\n _inputValue: inputValue = _bindable(''),\n _open: open = _bindable(false),\n onOpenChange,\n filter,\n load,\n allowCustomValue = false,\n showToggle = true,\n hideEmpty = false,\n loading = false,\n placement = 'bottom-start',\n clearable = false,\n name,\n variant,\n size,\n radius,\n disabled,\n readonly,\n required,\n invalid,\n id,\n children,\n empty,\n propsRoot,\n icon,\n propsIcon,\n propsClear,\n propsChevron,\n propsPopover,\n propsListbox,\n ...rest\n }: ComboboxProps<T>) => {\n const lang = useLang();\n const textMatcher = useTextMatcher();\n const listId = useId();\n const appearance = useControlAppearance(() => ({ variant, size, radius }));\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }));\n // 用户输入的过滤词:选中、用箭头打开时清空(显示全部选项)\n let query = _state('');\n // 组件自己改 inputValue(选中后写入选项文字)时,不当作用户输入\n let writing = false;\n let shell = _state.raw<HTMLElement | null>(null);\n let input = _state.raw<HTMLInputElement | null>(null);\n let panel = _state.raw<HTMLElement | null>(null);\n const setOpen = openSetter(\n () => open,\n (next) => (open = next),\n () => onOpenChange,\n );\n\n const optionOf = (item: T) => toListboxOption(item, toOption);\n\n function matches(item: T, text: string) {\n if (!text) return true;\n return filter ? filter(item, text) : textMatcher()(optionOf(item).label, text);\n }\n\n const remote = useRemoteItems({\n load: () => load,\n query: () => query,\n open: () => open,\n items: () => items,\n });\n const list = useListState({\n // 有 load 或 filter={false} 时由服务端按输入过滤\n items: () =>\n load || filter === false\n ? remote.items()\n : remote.items().filter((item) => matches(item, query)),\n toOption: optionOf,\n selected: () => (value != null ? [value] : []),\n mode: () => 'single',\n // 再选已选的项不取消\n required: () => true,\n onChange: (next) => (value = next[0] ?? null),\n });\n\n // 已选项的文字:远程搜索换了 items 之后,仍按之前见过的文字显示\n const selectedOf = useSelectedOptions({ items: remote.items, toOption: optionOf });\n const selectedLabel = () => (value == null ? '' : selectedOf([value])[0]!.label);\n\n function setText(text: string) {\n if (inputValue === text) return;\n writing = true;\n inputValue = text;\n }\n\n useResultAnnouncement(() => ({ query, count: list.options.length }));\n\n // 用户输入(含输入法组合结束):打开并按输入过滤,高亮第一项\n watch(\n () => inputValue,\n (text) => {\n if (writing) {\n writing = false;\n return;\n }\n query = text;\n // 只在输入框聚焦时打开:父级把 inputValue 改掉(重置成空)不该弹出列表\n if (!control().readonly && document.activeElement === input) setOpen(true, 'trigger');\n list.move('first');\n },\n );\n\n // 父级改了 value,或选项后到(编辑页先拿到值、再拿到选项):输入框跟着显示它的文字;用户正在输入时不打断\n watch(\n () => [value, selectedLabel()],\n () => {\n if (query) return;\n if (!allowCustomValue || value != null) setText(selectedLabel());\n },\n { immediate: true },\n );\n\n function pick(choice: string, event?: Event) {\n value = choice;\n setText(selectedLabel());\n query = '';\n setOpen(false, 'select', event);\n }\n\n function show(event?: Event) {\n query = '';\n list.activateDefault();\n setOpen(true, 'trigger', event);\n }\n\n // 失焦:文字不是选项时恢复(或清空选择)\n function commit(event: FocusEvent) {\n setOpen(false, 'focus', event);\n if (allowCustomValue) {\n if (inputValue !== selectedLabel()) value = null;\n return;\n }\n if (!inputValue) value = null;\n else setText(selectedLabel());\n query = '';\n }\n\n function onKeydown(event: KeyboardEvent) {\n const state = control();\n if (state.disabled || state.readonly || isComposingKey(event)) return;\n if (event.key === 'Escape') {\n // 打开时交给原生 popover 关闭;关闭时清空\n if (!open && inputValue) {\n event.preventDefault();\n setText('');\n value = null;\n }\n return;\n }\n if (!open) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n show(event);\n }\n return;\n }\n if (handleListKeydown(list, event, { homeEnd: false }, (choice) => pick(choice, event)))\n event.preventDefault();\n }\n\n // 列表是否真的弹出:hideEmpty 时没有可选的项(也不在加载)就不弹\n const shown = () =>\n open && (!hideEmpty || list.options.length > 0 || loading || remote.loading());\n\n // 弹层贴着外壳、与它同宽;焦点一直在输入框上,关闭时不用归还\n const { onToggle } = useAnchoredPopover(\n () => ({\n open: shown(),\n anchor: shell,\n panel,\n floating: { placement, matchWidth: true, fitHeight: true },\n restoreFocus: false,\n }),\n { close: (reason, event) => setOpen(false, reason, event) },\n );\n\n return () => {\n const state = control();\n const s = controlParts(appearance(), state);\n const editable = !state.disabled && !state.readonly;\n return (\n <>\n <div\n {...mergeAttrs<'div'>(s.root, propsRoot, {\n ref: _toRef(shell),\n onPointerdown: focusOnShell(() => input),\n })}\n data-state={open ? 'open' : 'closed'}\n data-invalid={state.invalid || undefined}\n data-disabled={state.disabled || undefined}\n >\n {controlIcon(s, icon, propsIcon)}\n {/* _bind 编译为 v-model:输入法组合期间不写回 */}\n <input\n {...mergeAttrs<'input'>(s.input, rest, {\n ref: _toRef(input),\n id: state.id,\n role: 'combobox',\n autocomplete: 'off',\n disabled: state.disabled,\n readonly: state.readonly,\n required: state.required,\n 'aria-autocomplete': 'list',\n 'aria-expanded': shown(),\n 'aria-controls': listId,\n 'aria-activedescendant': open ? activeOptionId(list, listId) : undefined,\n 'aria-invalid': state.invalid || undefined,\n 'aria-describedby': state.describedBy,\n onKeydown,\n onBlur: commit,\n })}\n _value={inputValue}\n />\n {clearable &&\n inputValue &&\n editable &&\n controlClear(s, propsClear, () => {\n setText('');\n value = null;\n input?.focus();\n })}\n {showToggle && (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n ...s.button,\n sx: [s.button.sx, disclosureStyles.icon, open && comboboxStyles.chevronOpen],\n radius: 'full',\n icon: ChevronDown,\n 'aria-label': lang.comboboxToggle,\n },\n propsChevron,\n {\n tabindex: -1,\n disabled: !editable,\n 'aria-expanded': shown(),\n 'aria-controls': listId,\n // 不让输入框失焦(失焦会提交并关闭)\n onPointerdown: (event: PointerEvent) => event.preventDefault(),\n onClick: (event: MouseEvent) => {\n if (open) setOpen(false, 'trigger', event);\n else show(event);\n input?.focus();\n },\n },\n )}\n />\n )}\n <FormValue name={name} value={value} disabled={state.disabled} />\n </div>\n <ListPopover\n panelRef={_toRef(panel)}\n onToggle={onToggle}\n size={appearance().size}\n labelledBy={state.labelledBy}\n label={rest['aria-label']}\n loading={loading || remote.loading()}\n onPick={(choice) => pick(choice)}\n listbox={{\n list,\n id: listId,\n renderOption: children,\n empty: remote.failure() ?? empty,\n }}\n propsListbox={propsListbox}\n propsPopover={propsPopover}\n />\n </>\n );\n };\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkIA,IAAa,iBAAiB,IAAI,OAAO,EACvC,aAAa,EAAE,QAAQ,SAAS,EAClC,CAAC;;AAGD,IAAa,WAAW,0BACtB,QAAA,SAkCwB;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,QAAAA,aAAA,QAAA,eAjCd,CAAA,CAAE;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,QAAAC,SAAA,QAAA,gBAE+B,MAAI,KAAA,IAAA;CAAA,MAAA,aAAAA,SAAA,QAAA,qBACT,IAAE,KAAA,IAAA;CAAA,MAAA,OAAAA,SAAA,QAAA,eACd,OAAK,KAAA,IAAA;CAAA,MAAA,eAAAD,aAAA,QAAA,cAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,MAAA;CAAA,MAAA,mBAAAA,aAAA,QAAA,oBAIV,KAAK;CAAA,MAAA,aAAAA,aAAA,QAAA,cACX,IAAI;CAAA,MAAA,YAAAA,aAAA,QAAA,aACL,KAAK;CAAA,MAAA,UAAAA,aAAA,QAAA,WACP,KAAK;CAAA,MAAA,YAAAA,aAAA,QAAA,aACH,cAAc;CAAA,MAAA,YAAAA,aAAA,QAAA,aACd,KAAK;CAAA,MAAA,OAAAA,aAAA,QAAA,MAAA;CAAA,MAAA,UAAAA,aAAA,QAAA,SAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,MAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,WAAAA,aAAA,QAAA,UAAA;CAAA,MAAA,UAAAA,aAAA,QAAA,SAAA;CAAA,MAAA,KAAAA,aAAA,QAAA,IAAA;CAAA,MAAA,WAAAE,aAAA,MAAA;CAAA,MAAA,QAAAF,aAAA,QAAA,OAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,MAAA;CAAA,MAAA,YAAAA,aAAA,QAAA,WAAA;CAAA,MAAA,aAAAA,aAAA,QAAA,YAAA;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAAA,eAAAA,aAAA,QAAA,cAAA;CAAA,MAmBd,OAAIG,UAAA,QAAA,MAAA,KAAA;CAEP,MAAM,OAAO,QAAQ;CACrB,MAAM,cAAc,eAAe;CACnC,MAAM,SAAS,MAAM;CACrB,MAAM,aAAa,4BAA4B;EAAE,SAAO,QAAA;EAAE,MAAI,KAAA;EAAE,QAAM,OAAA;CAAC,EAAE;CACzE,MAAM,UAAU,uBAAuB;EAAE,IAAE,GAAA;EAAE,SAAO,QAAA;EAAE,UAAQ,SAAA;EAAE,UAAQ,SAAA;EAAE,UAAQ,SAAA;CAAC,EAAE;CAErF,IAAI,QAAKC,IAAU,EAAE;CAErB,IAAI,UAAU;CACd,IAAI,QAAKC,WAAkC,IAAI;CAC/C,IAAI,QAAKA,WAAuC,IAAI;CACpD,IAAI,QAAKA,WAAkC,IAAI;CAC/C,MAAM,UAAU,iBACd,KAAA,QACC,SAAU,KAAA,QAAO,YAClB,aAAA,KACF;CAEA,MAAM,YAAY,SAAY,gBAAgB,MAAI,SAAA,KAAU;CAE5D,SAAS,QAAQ,MAAS,MAAc;EACtC,IAAI,CAAC,MAAM,OAAO;EAClB,OAAO,OAAA,QAAS,OAAA,MAAO,MAAM,IAAI,IAAI,YAAY,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,IAAI;CAC/E;CAEA,MAAM,SAAS,eAAe;EAC5B,YAAM,KAAA;EACN,aAAO,MAAA;EACP,YAAM,KAAA;EACN,aAAO,MAAA;CACT,CAAC;CACD,MAAM,OAAO,aAAa;EAExB,aACE,KAAA,SAAQ,OAAA,UAAW,QACf,OAAO,MAAM,IACb,OAAO,MAAM,CAAC,CAAC,QAAQ,SAAS,QAAQ,MAAI,MAAA,KAAO,CAAC;EAC1D,UAAU;EACV,gBAAiB,MAAA,SAAS,OAAO,CAAA,MAAA,KAAA,IAAU,CAAA;EAC3C,YAAY;EAEZ,gBAAgB;EAChB,WAAW,SAAU,MAAA,QAAQ,KAAK,MAAM;CAC1C,CAAC;CAGD,MAAM,aAAa,mBAAmB;EAAE,OAAO,OAAO;EAAO,UAAU;CAAS,CAAC;CACjF,MAAM,sBAAuB,MAAA,SAAS,OAAO,KAAK,WAAW,CAAA,MAAA,KAAA,CAAO,CAAC,CAAC,EAAE,CAAE;CAE1E,SAAS,QAAQ,MAAc;EAC7B,IAAI,WAAA,UAAe,MAAM;EACzB,UAAU;EACV,WAAA,QAAa;CACf;CAEA,6BAA6B;EAAE,OAAK,MAAA;EAAE,OAAO,KAAK,QAAQ;CAAO,EAAE;CAGnE,YACE,WAAA,QACC,SAAS;EACR,IAAI,SAAS;GACX,UAAU;GACV;EACF;EACA,MAAA,QAAQ;EAER,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,SAAS,kBAAa,MAAA,OAAY,QAAQ,MAAM,SAAS;EACpF,KAAK,KAAK,OAAO;CACnB,CACF;CAGA,YACQ,CAAA,MAAA,OAAQ,cAAc,CAAC,SACvB;EACJ,IAAA,MAAA,OAAW;EACX,IAAI,CAAA,iBAAA,SAAqB,MAAA,SAAS,MAAM,QAAQ,cAAc,CAAC;CACjE,GACA,EAAE,WAAW,KAAK,CACpB;CAEA,SAAS,KAAK,QAAgB,OAAe;EAC3C,MAAA,QAAQ;EACR,QAAQ,cAAc,CAAC;EACvB,MAAA,QAAQ;EACR,QAAQ,OAAO,UAAU,KAAK;CAChC;CAEA,SAAS,KAAK,OAAe;EAC3B,MAAA,QAAQ;EACR,KAAK,gBAAgB;EACrB,QAAQ,MAAM,WAAW,KAAK;CAChC;CAGA,SAAS,OAAO,OAAmB;EACjC,QAAQ,OAAO,SAAS,KAAK;EAC7B,IAAA,iBAAA,OAAsB;GACpB,IAAI,WAAA,UAAe,cAAc,GAAG,MAAA,QAAQ;GAC5C;EACF;EACA,IAAI,CAAA,WAAA,OAAa,MAAA,QAAQ;OACpB,QAAQ,cAAc,CAAC;EAC5B,MAAA,QAAQ;CACV;CAEA,SAAS,UAAU,OAAsB;EACvC,MAAM,QAAQ,QAAQ;EACtB,IAAI,MAAM,YAAY,MAAM,YAAY,eAAe,KAAK,GAAG;EAC/D,IAAI,MAAM,QAAQ,UAAU;GAE1B,IAAI,CAAA,KAAA,SAAK,WAAA,OAAgB;IACvB,MAAM,eAAe;IACrB,QAAQ,EAAE;IACV,MAAA,QAAQ;GACV;GACA;EACF;EACA,IAAI,CAAA,KAAA,OAAO;GACT,IAAI,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;IACxD,MAAM,eAAe;IACrB,KAAK,KAAK;GACZ;GACA;EACF;EACA,IAAI,kBAAkB,MAAM,OAAO,EAAE,SAAS,MAAM,IAAI,WAAW,KAAK,QAAQ,KAAK,CAAC,GACpF,MAAM,eAAe;CACzB;CAGA,MAAM,cACJ,KAAA,UAAS,CAAA,UAAA,SAAc,KAAK,QAAQ,SAAS,KAAC,QAAA,SAAe,OAAO,QAAQ;CAG9E,MAAM,EAAE,aAAa,0BACZ;EACL,MAAM,MAAM;EACZ,QAAM,MAAA;EACN,OAAK,MAAA;EACL,UAAU;GAAE,WAAS,UAAA;GAAE,YAAY;GAAM,WAAW;EAAK;EACzD,cAAc;CAChB,IACA,EAAE,QAAQ,QAAQ,UAAU,QAAQ,OAAO,QAAQ,KAAK,EAAE,CAC5D;CAEA,aAAa;EACX,MAAM,QAAQ,QAAQ;EACtB,MAAM,IAAI,aAAa,WAAW,GAAG,KAAK;EAC1C,MAAM,WAAW,CAAC,MAAM,YAAY,CAAC,MAAM;EAC3C,OAAAC,YAAAC,UAAA,MAAA,CAAAD,YAAA,OAAAE,cAGU,WAAkB,EAAE,MAAI,UAAA,OAAa;GACvC,KAAG;GACH,eAAe,mBAAa,MAAA,KAAW;EACzC,CAAC,GAAC;GAAA,cACU,KAAA,QAAO,SAAS;GAAQ,gBACtB,MAAM,WAAW,KAAA;GAAS,iBACzB,MAAM,YAAY,KAAA;EAAS,CAAA,GAAA;GAEzC,YAAY,GAAC,KAAA,OAAA,UAAA,KAAiB;GAACC,eAAAH,YAAA,SAAAE,cAG1B,WAAoB,EAAE,OAAO,MAAM;IACrC,KAAG;IACH,IAAI,MAAM;IACV,MAAM;IACN,cAAc;IACd,UAAU,MAAM;IAChB,UAAU,MAAM;IAChB,UAAU,MAAM;IAChB,qBAAqB;IACrB,iBAAiB,MAAM;IACvB,iBAAiB;IACjB,yBAAyB,KAAA,QAAO,eAAe,MAAM,MAAM,IAAI,KAAA;IAC/D,gBAAgB,MAAM,WAAW,KAAA;IACjC,oBAAoB,MAAM;IAC1B;IACA,QAAQ;GACV,CAAC,GAAC,EAAA,wBAAA,WAAA,WAAA,QAAA,OAAA,CAAA,GAAA,IAAA,GAAA,CAAA,CAAAE,YAAA,WAAA,KAAA,CAAA,CAAA;GAGH,UAAA,SAAA,WAAA,SAEC,YACA,aAAa,GAAC,WAAA,aAAoB;IAChC,QAAQ,EAAE;IACV,MAAA,QAAQ;IACR,MAAA,OAAO,MAAM;GACf,CAAC;GACF,WAAA,SAAAJ,YAAA,YAEO,eACF;IACE,GAAG,EAAE;IACL,IAAI;KAAC,EAAE,OAAO;KAAI,iBAAiB;KAAM,KAAA,SAAQ,eAAe;IAAW;IAC3E,QAAQ;IACR,MAAM;IACN,cAAc,KAAK;GACrB,GAAC,aAAA,OAED;IACE,UAAU;IACV,UAAU,CAAC;IACX,iBAAiB,MAAM;IACvB,iBAAiB;IAEjB,gBAAgB,UAAwB,MAAM,eAAe;IAC7D,UAAU,UAAsB;KAC9B,IAAA,KAAA,OAAU,QAAQ,OAAO,WAAW,KAAK;UACpC,KAAK,KAAK;KACf,MAAA,OAAO,MAAM;IACf;GACF,CACF,GAAC,IAAA;GAEJA,YAAA,WAAA;IAAA,QAAA,KAAA;IAAA,SAAA,MAAA;IAAA,YAC8C,MAAM;GAAQ,GAAA,IAAA;EAAA,CAAA,GAAAA,YAAA,aAAA;GAAA,YAAA;GAAA,YAInD;GAAQ,QACZ,WAAW,CAAC,CAAC;GAAI,cACX,MAAM;GAAU,SACrB,KAAK;GAAa,WAChB,QAAA,SAAW,OAAO,QAAQ;GAAC,UAAA,OAAA,OAAA,OAAA,MAC3B,WAAW,KAAK,MAAM;GAAC,WACvB;IACP;IACA,IAAI;IACJ,cAAY,SAAA;IACZ,OAAO,OAAO,QAAQ,KAAC,MAAA;GACzB;GAAC,gBAAA,aAAA;GAAA,gBAAA,aAAA;EAAA,GAAA,IAAA,CAAA,CAAA;CAMT;AACF,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
1
+ {"version":3,"file":"Combobox.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_childrenProp","_vtp_restProps","_vue_ref","_vue_shallowRef","_createVNode","_Fragment","_mergeProps","_withDirectives","_vModelText"],"sources":["../../src/input/Combobox.tsx"],"sourcesContent":["/**\n * 组合框(WAI-ARIA Combobox,aria-autocomplete=\"list\"):边输入边从列表里选,或者只当带建议的输入框用。\n *\n * <Field label=\"城市\"><Combobox items={cities} _value={city} /></Field>\n * <Combobox items={results} filter={false} loading={searching} _inputValue={keyword} aria-label=\"搜索用户\" />\n *\n * 组合已有的部件:外壳同 TextField(controlParts),弹出层用 useAnchoredPopover(与外壳同宽),列表是 ListboxView。\n * 焦点一直在输入框里,高亮项经 aria-activedescendant 告诉读屏。\n *\n * - 过滤:默认本地按显示文字包含输入(Intl.Collator,忽略大小写与重音);filter={false} 时不过滤,\n * 由调用方按 inputValue 换 items(异步搜索,配合 loading)。给 load 时组件自己请求:打开时与输入停下 300 ms 后\n * 按输入请求,只采用最后一次(remote-items.ts,同 Select)。\n * - 中文输入法:输入经 v-model 写回,组合输入期间 inputValue 不变,所以不会拿拼音去过滤。\n * - 选中后输入框显示选项文字;失焦时如果文字不是某个选项(且没开 allowCustomValue),恢复成已选项的文字,清空则取消选择。\n * - 键盘:↓ 打开、↑↓ / Page Up / Down 移动,Enter 选中,Esc 关闭(关闭时再按 Esc 清空);Home / End 照常移动光标。\n *\n * 部件:Root(外壳)、Input(主元素)、Clear、Chevron(切换按钮)、Popover、Listbox。\n */\nimport { ChevronDown } from '@lucide/icons';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport { useId, watch, type VNodeChild } from 'vue';\nimport type { PresetIconButtonProps } from '../base/CloseButton';\nimport { IconButton, type IconButtonProps } from '../base/IconButton';\nimport { useLang, useTextMatcher } from '../config/context';\nimport { isComposingKey } from '../utils/dom/hotkeys';\nimport { useAnchoredPopover, type FloatingPlacement } from '../utils/dom/floating';\nimport { openSetter, type OpenChangeProps } from '../utils/dom/open-change';\nimport { ListPopover } from './ListPopover';\nimport { mergeAttrs, mergePartProps, type PartProps } from '../utils/props';\nimport {\n controlClear,\n controlParts,\n focusOnShell,\n controlIcon,\n useControlAppearance,\n type ControlIconOptions,\n type ControlOptions,\n} from './control';\nimport { useFieldControl } from '../form/Field';\nimport { FormValue } from '../form/FormValue';\nimport { disclosureStyles } from '../utils/style/transitions';\nimport { activeOptionId, type ListboxViewProps, type OptionRenderState } from './Listbox';\nimport {\n handleListKeydown,\n useListState,\n useResultAnnouncement,\n useSelectedOptions,\n type ListboxOption,\n type OptionMapping,\n toListboxOption,\n} from './list-state';\nimport { useRemoteItems, type OptionsLoader } from './remote-items';\n\n/** 角色、展开状态、值与可用性由组件管理 */\nexport type ComboboxManaged =\n | 'value'\n | 'role'\n | 'size'\n | 'disabled'\n | 'readonly'\n | 'required'\n | 'autocomplete'\n | 'aria-autocomplete'\n | 'aria-expanded'\n | 'aria-controls'\n | 'aria-activedescendant'\n | 'aria-invalid'\n | 'aria-describedby';\n\n/** Combobox 除 toOption 外的属性;未声明的属性落到 input(主元素)上,外壳用 propsRoot */\nexport interface ComboboxBaseProps<T>\n extends PartProps<'input', ComboboxManaged>, ControlOptions, ControlIconOptions, OpenChangeProps {\n /** 数据:ListboxOption、字符串,或任意数据加 toOption;有 load 时是第一次加载之前的选项(编辑页放上已选的那一项) */\n items?: readonly T[];\n /** 选中项的值:父级写 _value={x};没有选中时是 null */\n _value?: string | null;\n /** 输入框里的文字:父级可以写 _inputValue={x}(异步搜索时据此取数据) */\n _inputValue?: string;\n /** 是否打开:父级可以写 _open={x} */\n _open?: boolean;\n /** 过滤:默认按显示文字包含输入(忽略大小写与重音);函数自定义;false 不过滤(异步搜索) */\n filter?: false | ((item: T, query: string) => boolean);\n /** 远程选项:打开时与输入停下 300 ms 后按输入调用,结果代替 items;只采用最后一次,被顶掉的请求 signal 中止 */\n load?: OptionsLoader<T>;\n /** 允许输入不在选项里的文字:失焦时保留,value 为 null */\n allowCustomValue?: boolean;\n /**\n * 显示右侧的展开按钮;只当带建议的输入框用时(Autocomplete)关掉,列表随输入出现\n * @default true\n */\n showToggle?: boolean;\n /** 没有可选的项时不弹出列表(不显示“没有匹配的选项”):只当带建议的输入框用时(Autocomplete) */\n hideEmpty?: boolean;\n /** 正在取选项(异步搜索):没有选项时列表里是骨架行,已有选项时顶部显示进度条 */\n loading?: boolean;\n /** 弹出位置,默认 bottom-start */\n placement?: FloatingPlacement;\n /** 有内容时显示清空按钮 */\n clearable?: boolean;\n /** 表单提交时的 name(用隐藏的 input 提交 value) */\n name?: string;\n /** 不可用 */\n disabled?: boolean;\n /** 只读 */\n readonly?: boolean;\n /** 必填 */\n required?: boolean;\n /** 校验未通过 */\n invalid?: boolean;\n /** 自定义选项内容:`{(item, { selected, active }) => …}`,拿到 items 里的原始数据 */\n children?: (item: T, state: OptionRenderState) => VNodeChild;\n /** 没有匹配的选项时列表里显示的内容 */\n empty?: VNodeChild;\n /** 外壳的部件属性 */\n propsRoot?: PartProps<'div'>;\n /** 清空按钮的部件属性 */\n propsClear?: Partial<PresetIconButtonProps>;\n /** 切换按钮(下拉箭头)的部件属性 */\n propsChevron?: Partial<IconButtonProps>;\n /** 弹出层的部件属性 */\n propsPopover?: PartProps<'div', 'id' | 'popover'>;\n /** 列表的部件属性 */\n propsListbox?: Partial<ListboxViewProps<T>>;\n}\n\n/** 组合框的属性;items 不是 ListboxOption 或字符串时要给 toOption */\nexport type ComboboxProps<T = ListboxOption> = ComboboxBaseProps<T> & OptionMapping<T>;\n\n/** Combobox 的样式:chevronOpen */\nexport const comboboxStyles = css.create({\n chevronOpen: { rotate: '180deg' },\n});\n\n/** 组合框:输入框 + 过滤后的选项列表 */\nexport const Combobox = _component(\n <T,>({\n items = [],\n toOption,\n _value: value = _bindable<string | null>(null),\n _inputValue: inputValue = _bindable(''),\n _open: open = _bindable(false),\n onOpenChange,\n filter,\n load,\n allowCustomValue = false,\n showToggle = true,\n hideEmpty = false,\n loading = false,\n placement = 'bottom-start',\n clearable = false,\n name,\n variant,\n size,\n radius,\n disabled,\n readonly,\n required,\n invalid,\n id,\n children,\n empty,\n propsRoot,\n icon,\n propsIcon,\n propsClear,\n propsChevron,\n propsPopover,\n propsListbox,\n ...rest\n }: ComboboxProps<T>) => {\n const lang = useLang();\n const textMatcher = useTextMatcher();\n const listId = useId();\n const appearance = useControlAppearance(() => ({ variant, size, radius }));\n const control = useFieldControl(() => ({ id, invalid, required, disabled, readonly }));\n // 用户输入的过滤词:选中、用箭头打开时清空(显示全部选项)\n let query = _state('');\n // 组件自己改 inputValue(选中后写入选项文字)时,不当作用户输入\n let writing = false;\n let shell = _state.raw<HTMLElement | null>(null);\n let input = _state.raw<HTMLInputElement | null>(null);\n let panel = _state.raw<HTMLElement | null>(null);\n const setOpen = openSetter(\n () => open,\n (next) => (open = next),\n () => onOpenChange,\n );\n\n const optionOf = (item: T) => toListboxOption(item, toOption);\n\n function matches(item: T, text: string) {\n if (!text) return true;\n return filter ? filter(item, text) : textMatcher()(optionOf(item).label, text);\n }\n\n const remote = useRemoteItems({\n load: () => load,\n query: () => query,\n open: () => open,\n items: () => items,\n });\n const list = useListState({\n // 有 load 或 filter={false} 时由服务端按输入过滤\n items: () =>\n load || filter === false\n ? remote.items()\n : remote.items().filter((item) => matches(item, query)),\n toOption: optionOf,\n selected: () => (value != null ? [value] : []),\n mode: () => 'single',\n // 再选已选的项不取消\n required: () => true,\n onChange: (next) => (value = next[0] ?? null),\n });\n\n // 已选项的文字:远程搜索换了 items 之后,仍按之前见过的文字显示\n const selectedOf = useSelectedOptions({ items: remote.items, toOption: optionOf });\n const selectedLabel = () => (value == null ? '' : selectedOf([value])[0]!.label);\n\n function setText(text: string) {\n if (inputValue === text) return;\n writing = true;\n inputValue = text;\n }\n\n useResultAnnouncement(() => ({ query, count: list.options.length }));\n\n // 用户输入(含输入法组合结束):打开并按输入过滤,高亮第一项\n watch(\n () => inputValue,\n (text) => {\n if (writing) {\n writing = false;\n return;\n }\n query = text;\n // 只在输入框聚焦时打开:父级把 inputValue 改掉(重置成空)不该弹出列表\n if (!control().readonly && document.activeElement === input) setOpen(true, 'trigger');\n list.move('first');\n },\n );\n\n // 父级改了 value,或选项后到(编辑页先拿到值、再拿到选项):输入框跟着显示它的文字;用户正在输入时不打断\n watch(\n () => [value, selectedLabel()],\n () => {\n if (query) return;\n if (!allowCustomValue || value != null) setText(selectedLabel());\n },\n { immediate: true },\n );\n\n function pick(choice: string, event?: Event) {\n value = choice;\n setText(selectedLabel());\n query = '';\n setOpen(false, 'select', event);\n }\n\n function show(event?: Event) {\n query = '';\n list.activateDefault();\n setOpen(true, 'trigger', event);\n }\n\n // 失焦:文字不是选项时恢复(或清空选择)\n function commit(event: FocusEvent) {\n setOpen(false, 'focus', event);\n if (allowCustomValue) {\n if (inputValue !== selectedLabel()) value = null;\n return;\n }\n if (!inputValue) value = null;\n else setText(selectedLabel());\n query = '';\n }\n\n function onKeydown(event: KeyboardEvent) {\n const state = control();\n if (state.disabled || state.readonly || isComposingKey(event)) return;\n if (event.key === 'Escape') {\n // 打开时交给原生 popover 关闭;关闭时清空\n if (!open && inputValue) {\n event.preventDefault();\n setText('');\n value = null;\n }\n return;\n }\n if (!open) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n show(event);\n }\n return;\n }\n if (handleListKeydown(list, event, { homeEnd: false }, (choice) => pick(choice, event)))\n event.preventDefault();\n }\n\n // 列表是否真的弹出:hideEmpty 时没有可选的项(也不在加载)就不弹\n const shown = () =>\n open && (!hideEmpty || list.options.length > 0 || loading || remote.loading());\n\n // 弹层贴着外壳、与它同宽;焦点一直在输入框上,关闭时不用归还\n const { onToggle } = useAnchoredPopover(\n () => ({\n open: shown(),\n anchor: shell,\n panel,\n floating: { placement, matchWidth: true, fitHeight: true },\n restoreFocus: false,\n }),\n { close: (reason, event) => setOpen(false, reason, event) },\n );\n\n return () => {\n const state = control();\n const s = controlParts(appearance(), state);\n const editable = !state.disabled && !state.readonly;\n return (\n <>\n <div\n {...mergeAttrs<'div'>(s.root, propsRoot, {\n ref: _toRef(shell),\n onPointerdown: focusOnShell(() => input),\n })}\n data-state={open ? 'open' : 'closed'}\n data-invalid={state.invalid || undefined}\n data-disabled={state.disabled || undefined}\n >\n {controlIcon(s, icon, propsIcon)}\n {/* _bind 编译为 v-model:输入法组合期间不写回 */}\n <input\n {...mergeAttrs<'input'>(s.input, rest, {\n ref: _toRef(input),\n id: state.id,\n role: 'combobox',\n autocomplete: 'off',\n disabled: state.disabled,\n readonly: state.readonly,\n required: state.required,\n 'aria-autocomplete': 'list',\n 'aria-expanded': shown(),\n 'aria-controls': listId,\n 'aria-activedescendant': open ? activeOptionId(list, listId) : undefined,\n 'aria-invalid': state.invalid || undefined,\n 'aria-describedby': state.describedBy,\n onKeydown,\n onBlur: commit,\n })}\n _value={inputValue}\n />\n {clearable &&\n inputValue &&\n editable &&\n controlClear(s, propsClear, () => {\n setText('');\n value = null;\n input?.focus();\n })}\n {showToggle && (\n <IconButton\n {...mergePartProps<IconButtonProps>(\n {\n ...s.button,\n sx: [s.button.sx, disclosureStyles.icon, open && comboboxStyles.chevronOpen],\n radius: 'full',\n icon: ChevronDown,\n 'aria-label': lang.comboboxToggle,\n },\n propsChevron,\n {\n tabindex: -1,\n disabled: !editable,\n 'aria-expanded': shown(),\n 'aria-controls': listId,\n // 不让输入框失焦(失焦会提交并关闭)\n onPointerdown: (event: PointerEvent) => event.preventDefault(),\n onClick: (event: MouseEvent) => {\n if (open) setOpen(false, 'trigger', event);\n else show(event);\n input?.focus();\n },\n },\n )}\n />\n )}\n <FormValue name={name} value={value} disabled={state.disabled} />\n </div>\n <ListPopover\n panelRef={_toRef(panel)}\n onToggle={onToggle}\n size={appearance().size}\n labelledBy={state.labelledBy}\n label={rest['aria-label']}\n loading={loading || remote.loading()}\n onPick={(choice) => pick(choice)}\n listbox={{\n list,\n id: listId,\n renderOption: children,\n empty: remote.failure() ?? empty,\n }}\n propsListbox={propsListbox}\n propsPopover={propsPopover}\n />\n </>\n );\n };\n },\n);\n"],"mappings":"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"}