huibo-ui 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (668) hide show
  1. package/dist/cjs/{date-helpers-904747ff.js → date-helpers-1ffddc59.js} +7 -3
  2. package/dist/cjs/date-helpers-1ffddc59.js.map +1 -0
  3. package/dist/cjs/hb-affix.cjs.entry.js +1 -1
  4. package/dist/cjs/hb-aside.cjs.entry.js +1 -1
  5. package/dist/cjs/hb-avatar.cjs.entry.js +1 -1
  6. package/dist/cjs/hb-backtop.cjs.entry.js +2 -2
  7. package/dist/cjs/hb-badge.cjs.entry.js +1 -1
  8. package/dist/cjs/hb-breadcrumb-item.cjs.entry.js +1 -1
  9. package/dist/cjs/hb-breadcrumb.cjs.entry.js +1 -1
  10. package/dist/cjs/hb-button.cjs.entry.js +2 -2
  11. package/dist/cjs/hb-calendar.cjs.entry.js +78 -10
  12. package/dist/cjs/hb-calendar.cjs.entry.js.map +1 -1
  13. package/dist/cjs/hb-card.cjs.entry.js +1 -1
  14. package/dist/cjs/hb-cascader.cjs.entry.js +270 -146
  15. package/dist/cjs/hb-cascader.cjs.entry.js.map +1 -1
  16. package/dist/cjs/hb-checkbox-group.cjs.entry.js +2 -2
  17. package/dist/cjs/hb-checkbox.cjs.entry.js +3 -3
  18. package/dist/cjs/hb-collapse-item.cjs.entry.js +1 -1
  19. package/dist/cjs/hb-collapse.cjs.entry.js +1 -1
  20. package/dist/cjs/hb-color-picker-panel.cjs.entry.js +2 -2
  21. package/dist/cjs/hb-color-picker.cjs.entry.js +91 -14
  22. package/dist/cjs/hb-color-picker.cjs.entry.js.map +1 -1
  23. package/dist/cjs/hb-config-provider.cjs.entry.js +1 -1
  24. package/dist/cjs/hb-container.cjs.entry.js +2 -2
  25. package/dist/cjs/hb-date-picker-pane.cjs.entry.js +2 -2
  26. package/dist/cjs/hb-date-picker.cjs.entry.js +85 -7
  27. package/dist/cjs/hb-date-picker.cjs.entry.js.map +1 -1
  28. package/dist/cjs/hb-date-range-picker.cjs.entry.js +3 -3
  29. package/dist/cjs/hb-date-time-picker.cjs.entry.js +3 -3
  30. package/dist/cjs/hb-descriptions.cjs.entry.js +2 -2
  31. package/dist/cjs/hb-descriptions.cjs.entry.js.map +1 -1
  32. package/dist/cjs/hb-divider.cjs.entry.js +2 -2
  33. package/dist/cjs/hb-drawer.cjs.entry.js +1 -1
  34. package/dist/cjs/hb-dropdown.cjs.entry.js +74 -6
  35. package/dist/cjs/hb-dropdown.cjs.entry.js.map +1 -1
  36. package/dist/cjs/hb-empty.cjs.entry.js +1 -1
  37. package/dist/cjs/hb-float-button.cjs.entry.js +2 -2
  38. package/dist/cjs/hb-footer.cjs.entry.js +1 -1
  39. package/dist/cjs/hb-form-item.cjs.entry.js +59 -8
  40. package/dist/cjs/hb-form-item.cjs.entry.js.map +1 -1
  41. package/dist/cjs/hb-form.cjs.entry.js +3 -3
  42. package/dist/cjs/hb-form.cjs.entry.js.map +1 -1
  43. package/dist/cjs/hb-header.cjs.entry.js +1 -1
  44. package/dist/cjs/hb-image-preview.cjs.entry.js +12 -8
  45. package/dist/cjs/hb-image-preview.cjs.entry.js.map +1 -1
  46. package/dist/cjs/hb-image.cjs.entry.js +1 -1
  47. package/dist/cjs/hb-input-number.cjs.entry.js +5 -5
  48. package/dist/cjs/hb-input-tag.cjs.entry.js +2 -2
  49. package/dist/cjs/hb-input.cjs.entry.js +39 -3
  50. package/dist/cjs/hb-input.cjs.entry.js.map +1 -1
  51. package/dist/cjs/hb-layout.cjs.entry.js +36 -14
  52. package/dist/cjs/hb-layout.cjs.entry.js.map +1 -1
  53. package/dist/cjs/hb-link.cjs.entry.js +2 -2
  54. package/dist/cjs/hb-loading.cjs.entry.js +2 -2
  55. package/dist/cjs/hb-main.cjs.entry.js +1 -1
  56. package/dist/cjs/hb-menu-item.cjs.entry.js +2 -2
  57. package/dist/cjs/hb-menu.cjs.entry.js +3 -3
  58. package/dist/cjs/hb-menu.cjs.entry.js.map +1 -1
  59. package/dist/cjs/hb-message.cjs.entry.js +2 -2
  60. package/dist/cjs/hb-notification.cjs.entry.js +2 -2
  61. package/dist/cjs/hb-page-header.cjs.entry.js +1 -1
  62. package/dist/cjs/hb-pagination.cjs.entry.js +21 -8
  63. package/dist/cjs/hb-pagination.cjs.entry.js.map +1 -1
  64. package/dist/cjs/hb-popconfirm.cjs.entry.js +37 -7
  65. package/dist/cjs/hb-popconfirm.cjs.entry.js.map +1 -1
  66. package/dist/cjs/hb-popover.cjs.entry.js +22 -2
  67. package/dist/cjs/hb-popover.cjs.entry.js.map +1 -1
  68. package/dist/cjs/hb-progress.cjs.entry.js +1 -1
  69. package/dist/cjs/hb-radio.cjs.entry.js +2 -2
  70. package/dist/cjs/hb-rate.cjs.entry.js +45 -3
  71. package/dist/cjs/hb-rate.cjs.entry.js.map +1 -1
  72. package/dist/cjs/hb-result.cjs.entry.js +1 -1
  73. package/dist/cjs/hb-row.cjs.entry.js +2 -2
  74. package/dist/cjs/hb-segmented.cjs.entry.js +39 -5
  75. package/dist/cjs/hb-segmented.cjs.entry.js.map +1 -1
  76. package/dist/cjs/hb-select.cjs.entry.js +47 -8
  77. package/dist/cjs/hb-select.cjs.entry.js.map +1 -1
  78. package/dist/cjs/hb-slider.cjs.entry.js +189 -20
  79. package/dist/cjs/hb-slider.cjs.entry.js.map +1 -1
  80. package/dist/cjs/hb-space.cjs.entry.js +2 -2
  81. package/dist/cjs/hb-statistic.cjs.entry.js +1 -1
  82. package/dist/cjs/hb-step.cjs.entry.js +1 -1
  83. package/dist/cjs/hb-steps.cjs.entry.js +30 -9
  84. package/dist/cjs/hb-steps.cjs.entry.js.map +1 -1
  85. package/dist/cjs/hb-sub-menu.cjs.entry.js +4 -4
  86. package/dist/cjs/hb-switch.cjs.entry.js +9 -4
  87. package/dist/cjs/hb-switch.cjs.entry.js.map +1 -1
  88. package/dist/cjs/hb-tab-pane.cjs.entry.js +1 -1
  89. package/dist/cjs/hb-table.cjs.entry.js +1 -1
  90. package/dist/cjs/hb-table.cjs.entry.js.map +1 -1
  91. package/dist/cjs/hb-tabs.cjs.entry.js +2 -2
  92. package/dist/cjs/hb-tag.cjs.entry.js +2 -2
  93. package/dist/cjs/hb-text.cjs.entry.js +2 -2
  94. package/dist/cjs/hb-time-picker.cjs.entry.js +4 -4
  95. package/dist/cjs/hb-time-select.cjs.entry.js +2 -2
  96. package/dist/cjs/hb-timeline.cjs.entry.js +1 -1
  97. package/dist/cjs/hb-tooltip.cjs.entry.js +18 -1
  98. package/dist/cjs/hb-tooltip.cjs.entry.js.map +1 -1
  99. package/dist/cjs/hb-transfer.cjs.entry.js +2 -2
  100. package/dist/cjs/hb-tree-select.cjs.entry.js +95 -18
  101. package/dist/cjs/hb-tree-select.cjs.entry.js.map +1 -1
  102. package/dist/cjs/hb-tree.cjs.entry.js +1 -1
  103. package/dist/cjs/hb-upload.cjs.entry.js +3 -3
  104. package/dist/cjs/hb-watermark.cjs.entry.js +1 -1
  105. package/dist/cjs/huibo-ui.cjs.js +1 -1
  106. package/dist/cjs/loader.cjs.js +1 -1
  107. package/dist/collection/collection-manifest.json +3 -3
  108. package/dist/collection/components/Affix/Affix.js +1 -1
  109. package/dist/collection/components/Avatar/Avatar.js +1 -1
  110. package/dist/collection/components/Backtop/Backtop.js +2 -2
  111. package/dist/collection/components/Badge/Badge.js +1 -1
  112. package/dist/collection/components/Breadcrumb/Breadcrumb.js +1 -1
  113. package/dist/collection/components/Breadcrumb/BreadcrumbItem.js +1 -1
  114. package/dist/collection/components/Button/Button.js +2 -2
  115. package/dist/collection/components/Calendar/Calendar.js +84 -10
  116. package/dist/collection/components/Calendar/Calendar.js.map +1 -1
  117. package/dist/collection/components/Calendar/calendar.css +16 -0
  118. package/dist/collection/components/Card/Card.js +1 -1
  119. package/dist/collection/components/Cascader/Cascader.js +374 -194
  120. package/dist/collection/components/Cascader/Cascader.js.map +1 -1
  121. package/dist/collection/components/Cascader/cascader.css +170 -16
  122. package/dist/collection/components/Checkbox/Checkbox.js +3 -3
  123. package/dist/collection/components/Checkbox/CheckboxGroup.js +2 -2
  124. package/dist/collection/components/Collapse/Collapse.js +1 -1
  125. package/dist/collection/components/Collapse/CollapseItem.js +1 -1
  126. package/dist/collection/components/ColorPicker/ColorPicker.js +92 -14
  127. package/dist/collection/components/ColorPicker/ColorPicker.js.map +1 -1
  128. package/dist/collection/components/ColorPicker/color-picker.css +13 -0
  129. package/dist/collection/components/ColorPickerPanel/ColorPickerPanel.js +2 -2
  130. package/dist/collection/components/ConfigProvider/ConfigProvider.js +1 -1
  131. package/dist/collection/components/Container/Aside.js +1 -1
  132. package/dist/collection/components/Container/Container.js +2 -2
  133. package/dist/collection/components/Container/Footer.js +1 -1
  134. package/dist/collection/components/Container/Header.js +1 -1
  135. package/dist/collection/components/Container/Main.js +1 -1
  136. package/dist/collection/components/DatePicker/DatePicker.js +89 -10
  137. package/dist/collection/components/DatePicker/DatePicker.js.map +1 -1
  138. package/dist/collection/components/DatePicker/date-picker.css +62 -2
  139. package/dist/collection/components/DatePickerPane/DatePickerPane.js +1 -1
  140. package/dist/collection/components/DateRangePicker/DateRangePicker.js +2 -2
  141. package/dist/collection/components/DateTimePicker/DateTimePicker.js +2 -2
  142. package/dist/collection/components/Descriptions/Descriptions.js +1 -1
  143. package/dist/collection/components/Descriptions/descriptions.css +22 -0
  144. package/dist/collection/components/Divider/Divider.js +2 -2
  145. package/dist/collection/components/Drawer/Drawer.js +1 -1
  146. package/dist/collection/components/Dropdown/Dropdown.js +83 -7
  147. package/dist/collection/components/Dropdown/Dropdown.js.map +1 -1
  148. package/dist/collection/components/Dropdown/dropdown.css +2 -1
  149. package/dist/collection/components/Empty/Empty.js +1 -1
  150. package/dist/collection/components/FloatButton/FloatButton.js +2 -2
  151. package/dist/collection/components/Form/Form.js +2 -2
  152. package/dist/collection/components/Form/FormItem.js +60 -9
  153. package/dist/collection/components/Form/FormItem.js.map +1 -1
  154. package/dist/collection/components/Form/form-item.css +49 -4
  155. package/dist/collection/components/Form/form.css +1 -0
  156. package/dist/collection/components/Image/Image.js +1 -1
  157. package/dist/collection/components/ImagePreview/ImagePreview.js +12 -8
  158. package/dist/collection/components/ImagePreview/ImagePreview.js.map +1 -1
  159. package/dist/collection/components/Input/Input.js +38 -2
  160. package/dist/collection/components/Input/Input.js.map +1 -1
  161. package/dist/collection/components/Input/input.css +21 -2
  162. package/dist/collection/components/InputNumber/InputNumber.js +5 -5
  163. package/dist/collection/components/InputTag/InputTag.js +2 -2
  164. package/dist/collection/components/Layout/Layout.js +87 -34
  165. package/dist/collection/components/Layout/Layout.js.map +1 -1
  166. package/dist/collection/components/Layout/Row.js +2 -2
  167. package/dist/collection/components/Layout/layout.css +524 -0
  168. package/dist/collection/components/Link/Link.js +2 -2
  169. package/dist/collection/components/Loading/Loading.js +2 -2
  170. package/dist/collection/components/Menu/Menu.js +2 -2
  171. package/dist/collection/components/Menu/MenuItem.js +2 -2
  172. package/dist/collection/components/Menu/SubMenu.js +4 -4
  173. package/dist/collection/components/Menu/menu.css +25 -0
  174. package/dist/collection/components/Message/Message.js +2 -2
  175. package/dist/collection/components/Notification/Notification.js +2 -2
  176. package/dist/collection/components/PageHeader/PageHeader.js +1 -1
  177. package/dist/collection/components/Pagination/Pagination.js +23 -7
  178. package/dist/collection/components/Pagination/Pagination.js.map +1 -1
  179. package/dist/collection/components/Pagination/pagination.css +23 -0
  180. package/dist/collection/components/Popconfirm/Popconfirm.js +44 -7
  181. package/dist/collection/components/Popconfirm/Popconfirm.js.map +1 -1
  182. package/dist/collection/components/Popover/Popover.js +29 -2
  183. package/dist/collection/components/Popover/Popover.js.map +1 -1
  184. package/dist/collection/components/Progress/Progress.js +1 -1
  185. package/dist/collection/components/Radio/Radio.js +2 -2
  186. package/dist/collection/components/Rate/Rate.js +45 -3
  187. package/dist/collection/components/Rate/Rate.js.map +1 -1
  188. package/dist/collection/components/Result/Result.js +1 -1
  189. package/dist/collection/components/Segmented/Segmented.js +51 -6
  190. package/dist/collection/components/Segmented/Segmented.js.map +1 -1
  191. package/dist/collection/components/Select/Select.js +46 -7
  192. package/dist/collection/components/Select/Select.js.map +1 -1
  193. package/dist/collection/components/Select/select.css +50 -4
  194. package/dist/collection/components/Slider/Slider.js +221 -21
  195. package/dist/collection/components/Slider/Slider.js.map +1 -1
  196. package/dist/collection/components/Slider/slider.css +58 -7
  197. package/dist/collection/components/Space/Space.js +2 -2
  198. package/dist/collection/components/Statistic/Statistic.js +1 -1
  199. package/dist/collection/components/Steps/Step.js +1 -1
  200. package/dist/collection/components/Steps/Steps.js +35 -8
  201. package/dist/collection/components/Steps/Steps.js.map +1 -1
  202. package/dist/collection/components/Switch/Switch.js +8 -3
  203. package/dist/collection/components/Switch/Switch.js.map +1 -1
  204. package/dist/collection/components/Switch/switch.css +45 -0
  205. package/dist/collection/components/Table/table.css +20 -0
  206. package/dist/collection/components/Tabs/TabPane.js +1 -1
  207. package/dist/collection/components/Tabs/Tabs.js +2 -2
  208. package/dist/collection/components/Tag/Tag.js +2 -2
  209. package/dist/collection/components/Text/Text.js +2 -2
  210. package/dist/collection/components/TimePicker/TimePicker.js +4 -4
  211. package/dist/collection/components/TimeSelect/TimeSelect.js +2 -2
  212. package/dist/collection/components/Timeline/Timeline.js +1 -1
  213. package/dist/collection/components/Tooltip/Tooltip.js +25 -2
  214. package/dist/collection/components/Tooltip/Tooltip.js.map +1 -1
  215. package/dist/collection/components/Transfer/Transfer.js +2 -2
  216. package/dist/collection/components/Tree/Tree.js +1 -1
  217. package/dist/collection/components/TreeSelect/TreeSelect.js +94 -17
  218. package/dist/collection/components/TreeSelect/TreeSelect.js.map +1 -1
  219. package/dist/collection/components/TreeSelect/tree-select.css +41 -7
  220. package/dist/collection/components/Upload/Upload.js +3 -3
  221. package/dist/collection/components/Watermark/Watermark.js +1 -1
  222. package/dist/collection/utils/date-helpers.js +6 -2
  223. package/dist/collection/utils/date-helpers.js.map +1 -1
  224. package/dist/components/hb-affix.js +1 -1
  225. package/dist/components/hb-aside.js +1 -1
  226. package/dist/components/hb-avatar.js +1 -1
  227. package/dist/components/hb-backtop.js +2 -2
  228. package/dist/components/hb-badge.js +1 -1
  229. package/dist/components/hb-breadcrumb-item.js +1 -1
  230. package/dist/components/hb-breadcrumb.js +1 -1
  231. package/dist/components/hb-button.js +2 -2
  232. package/dist/components/hb-calendar.js +80 -11
  233. package/dist/components/hb-calendar.js.map +1 -1
  234. package/dist/components/hb-card.js +1 -1
  235. package/dist/components/hb-cascader.js +273 -146
  236. package/dist/components/hb-cascader.js.map +1 -1
  237. package/dist/components/hb-checkbox-group.js +2 -2
  238. package/dist/components/hb-checkbox.js +3 -3
  239. package/dist/components/hb-collapse-item.js +1 -1
  240. package/dist/components/hb-collapse.js +1 -1
  241. package/dist/components/hb-color-picker-panel.js +2 -2
  242. package/dist/components/hb-color-picker.js +93 -15
  243. package/dist/components/hb-color-picker.js.map +1 -1
  244. package/dist/components/hb-config-provider.js +1 -1
  245. package/dist/components/hb-container.js +2 -2
  246. package/dist/components/hb-date-picker-pane.js +2 -2
  247. package/dist/components/hb-date-picker.js +87 -8
  248. package/dist/components/hb-date-picker.js.map +1 -1
  249. package/dist/components/hb-date-range-picker.js +3 -3
  250. package/dist/components/hb-date-time-picker.js +3 -3
  251. package/dist/components/hb-descriptions.js +2 -2
  252. package/dist/components/hb-descriptions.js.map +1 -1
  253. package/dist/components/hb-divider.js +2 -2
  254. package/dist/components/hb-drawer.js +1 -1
  255. package/dist/components/hb-dropdown.js +76 -7
  256. package/dist/components/hb-dropdown.js.map +1 -1
  257. package/dist/components/hb-empty.js +1 -1
  258. package/dist/components/hb-float-button.js +2 -2
  259. package/dist/components/hb-footer.js +1 -1
  260. package/dist/components/hb-form-item.js +59 -8
  261. package/dist/components/hb-form-item.js.map +1 -1
  262. package/dist/components/hb-form.js +3 -3
  263. package/dist/components/hb-form.js.map +1 -1
  264. package/dist/components/hb-header.js +1 -1
  265. package/dist/components/hb-icon.js +1 -89
  266. package/dist/components/hb-icon.js.map +1 -1
  267. package/dist/components/hb-image-preview.js +12 -8
  268. package/dist/components/hb-image-preview.js.map +1 -1
  269. package/dist/components/hb-image.js +1 -1
  270. package/dist/components/hb-input-number.js +5 -5
  271. package/dist/components/hb-input-tag.js +2 -2
  272. package/dist/components/hb-input.js +39 -3
  273. package/dist/components/hb-input.js.map +1 -1
  274. package/dist/components/hb-layout.js +36 -14
  275. package/dist/components/hb-layout.js.map +1 -1
  276. package/dist/components/hb-link.js +2 -2
  277. package/dist/components/hb-loading.js +2 -2
  278. package/dist/components/hb-main.js +1 -1
  279. package/dist/components/hb-menu-item.js +2 -2
  280. package/dist/components/hb-menu.js +3 -3
  281. package/dist/components/hb-menu.js.map +1 -1
  282. package/dist/components/hb-message.js +2 -2
  283. package/dist/components/hb-notification.js +2 -2
  284. package/dist/components/hb-page-header.js +1 -1
  285. package/dist/components/hb-pagination.js +25 -10
  286. package/dist/components/hb-pagination.js.map +1 -1
  287. package/dist/components/hb-popconfirm.js +37 -7
  288. package/dist/components/hb-popconfirm.js.map +1 -1
  289. package/dist/components/hb-popover.js +22 -2
  290. package/dist/components/hb-popover.js.map +1 -1
  291. package/dist/components/hb-progress.js +1 -1
  292. package/dist/components/hb-radio.js +2 -2
  293. package/dist/components/hb-rate.js +45 -3
  294. package/dist/components/hb-rate.js.map +1 -1
  295. package/dist/components/hb-result.js +1 -1
  296. package/dist/components/hb-row.js +2 -2
  297. package/dist/components/hb-segmented.js +41 -6
  298. package/dist/components/hb-segmented.js.map +1 -1
  299. package/dist/components/hb-select.js +47 -8
  300. package/dist/components/hb-select.js.map +1 -1
  301. package/dist/components/hb-slider.js +194 -21
  302. package/dist/components/hb-slider.js.map +1 -1
  303. package/dist/components/hb-space.js +2 -2
  304. package/dist/components/hb-statistic.js +1 -1
  305. package/dist/components/hb-step.js +1 -1
  306. package/dist/components/hb-steps.js +35 -8
  307. package/dist/components/hb-steps.js.map +1 -1
  308. package/dist/components/hb-sub-menu.js +4 -4
  309. package/dist/components/hb-switch.js +9 -4
  310. package/dist/components/hb-switch.js.map +1 -1
  311. package/dist/components/hb-tab-pane.js +1 -1
  312. package/dist/components/hb-table.js +1 -1
  313. package/dist/components/hb-table.js.map +1 -1
  314. package/dist/components/hb-tabs.js +2 -2
  315. package/dist/components/hb-tag.js +2 -2
  316. package/dist/components/hb-text.js +2 -2
  317. package/dist/components/hb-time-picker.js +4 -4
  318. package/dist/components/hb-time-select.js +2 -2
  319. package/dist/components/hb-timeline.js +1 -1
  320. package/dist/components/hb-tooltip.js +18 -1
  321. package/dist/components/hb-tooltip.js.map +1 -1
  322. package/dist/components/hb-transfer.js +2 -2
  323. package/dist/components/hb-tree-select.js +95 -18
  324. package/dist/components/hb-tree-select.js.map +1 -1
  325. package/dist/components/hb-tree.js +1 -1
  326. package/dist/components/hb-upload.js +3 -3
  327. package/dist/components/hb-watermark.js +1 -1
  328. package/dist/components/{p-cf94cbf6.js → p-08b4005c.js} +7 -3
  329. package/dist/components/p-08b4005c.js.map +1 -0
  330. package/dist/components/p-86d92faf.js +93 -0
  331. package/dist/components/p-86d92faf.js.map +1 -0
  332. package/dist/esm/{date-helpers-e4d85a67.js → date-helpers-44507189.js} +7 -3
  333. package/dist/esm/date-helpers-44507189.js.map +1 -0
  334. package/dist/esm/hb-affix.entry.js +1 -1
  335. package/dist/esm/hb-aside.entry.js +1 -1
  336. package/dist/esm/hb-avatar.entry.js +1 -1
  337. package/dist/esm/hb-backtop.entry.js +2 -2
  338. package/dist/esm/hb-badge.entry.js +1 -1
  339. package/dist/esm/hb-breadcrumb-item.entry.js +1 -1
  340. package/dist/esm/hb-breadcrumb.entry.js +1 -1
  341. package/dist/esm/hb-button.entry.js +2 -2
  342. package/dist/esm/hb-calendar.entry.js +78 -10
  343. package/dist/esm/hb-calendar.entry.js.map +1 -1
  344. package/dist/esm/hb-card.entry.js +1 -1
  345. package/dist/esm/hb-cascader.entry.js +270 -146
  346. package/dist/esm/hb-cascader.entry.js.map +1 -1
  347. package/dist/esm/hb-checkbox-group.entry.js +2 -2
  348. package/dist/esm/hb-checkbox.entry.js +3 -3
  349. package/dist/esm/hb-collapse-item.entry.js +1 -1
  350. package/dist/esm/hb-collapse.entry.js +1 -1
  351. package/dist/esm/hb-color-picker-panel.entry.js +2 -2
  352. package/dist/esm/hb-color-picker.entry.js +91 -14
  353. package/dist/esm/hb-color-picker.entry.js.map +1 -1
  354. package/dist/esm/hb-config-provider.entry.js +1 -1
  355. package/dist/esm/hb-container.entry.js +2 -2
  356. package/dist/esm/hb-date-picker-pane.entry.js +2 -2
  357. package/dist/esm/hb-date-picker.entry.js +85 -7
  358. package/dist/esm/hb-date-picker.entry.js.map +1 -1
  359. package/dist/esm/hb-date-range-picker.entry.js +3 -3
  360. package/dist/esm/hb-date-time-picker.entry.js +3 -3
  361. package/dist/esm/hb-descriptions.entry.js +2 -2
  362. package/dist/esm/hb-descriptions.entry.js.map +1 -1
  363. package/dist/esm/hb-divider.entry.js +2 -2
  364. package/dist/esm/hb-drawer.entry.js +1 -1
  365. package/dist/esm/hb-dropdown.entry.js +74 -6
  366. package/dist/esm/hb-dropdown.entry.js.map +1 -1
  367. package/dist/esm/hb-empty.entry.js +1 -1
  368. package/dist/esm/hb-float-button.entry.js +2 -2
  369. package/dist/esm/hb-footer.entry.js +1 -1
  370. package/dist/esm/hb-form-item.entry.js +59 -8
  371. package/dist/esm/hb-form-item.entry.js.map +1 -1
  372. package/dist/esm/hb-form.entry.js +3 -3
  373. package/dist/esm/hb-form.entry.js.map +1 -1
  374. package/dist/esm/hb-header.entry.js +1 -1
  375. package/dist/esm/hb-image-preview.entry.js +12 -8
  376. package/dist/esm/hb-image-preview.entry.js.map +1 -1
  377. package/dist/esm/hb-image.entry.js +1 -1
  378. package/dist/esm/hb-input-number.entry.js +5 -5
  379. package/dist/esm/hb-input-tag.entry.js +2 -2
  380. package/dist/esm/hb-input.entry.js +39 -3
  381. package/dist/esm/hb-input.entry.js.map +1 -1
  382. package/dist/esm/hb-layout.entry.js +36 -14
  383. package/dist/esm/hb-layout.entry.js.map +1 -1
  384. package/dist/esm/hb-link.entry.js +2 -2
  385. package/dist/esm/hb-loading.entry.js +2 -2
  386. package/dist/esm/hb-main.entry.js +1 -1
  387. package/dist/esm/hb-menu-item.entry.js +2 -2
  388. package/dist/esm/hb-menu.entry.js +3 -3
  389. package/dist/esm/hb-menu.entry.js.map +1 -1
  390. package/dist/esm/hb-message.entry.js +2 -2
  391. package/dist/esm/hb-notification.entry.js +2 -2
  392. package/dist/esm/hb-page-header.entry.js +1 -1
  393. package/dist/esm/hb-pagination.entry.js +21 -8
  394. package/dist/esm/hb-pagination.entry.js.map +1 -1
  395. package/dist/esm/hb-popconfirm.entry.js +37 -7
  396. package/dist/esm/hb-popconfirm.entry.js.map +1 -1
  397. package/dist/esm/hb-popover.entry.js +22 -2
  398. package/dist/esm/hb-popover.entry.js.map +1 -1
  399. package/dist/esm/hb-progress.entry.js +1 -1
  400. package/dist/esm/hb-radio.entry.js +2 -2
  401. package/dist/esm/hb-rate.entry.js +45 -3
  402. package/dist/esm/hb-rate.entry.js.map +1 -1
  403. package/dist/esm/hb-result.entry.js +1 -1
  404. package/dist/esm/hb-row.entry.js +2 -2
  405. package/dist/esm/hb-segmented.entry.js +40 -6
  406. package/dist/esm/hb-segmented.entry.js.map +1 -1
  407. package/dist/esm/hb-select.entry.js +47 -8
  408. package/dist/esm/hb-select.entry.js.map +1 -1
  409. package/dist/esm/hb-slider.entry.js +189 -20
  410. package/dist/esm/hb-slider.entry.js.map +1 -1
  411. package/dist/esm/hb-space.entry.js +2 -2
  412. package/dist/esm/hb-statistic.entry.js +1 -1
  413. package/dist/esm/hb-step.entry.js +1 -1
  414. package/dist/esm/hb-steps.entry.js +28 -7
  415. package/dist/esm/hb-steps.entry.js.map +1 -1
  416. package/dist/esm/hb-sub-menu.entry.js +4 -4
  417. package/dist/esm/hb-switch.entry.js +9 -4
  418. package/dist/esm/hb-switch.entry.js.map +1 -1
  419. package/dist/esm/hb-tab-pane.entry.js +1 -1
  420. package/dist/esm/hb-table.entry.js +1 -1
  421. package/dist/esm/hb-table.entry.js.map +1 -1
  422. package/dist/esm/hb-tabs.entry.js +2 -2
  423. package/dist/esm/hb-tag.entry.js +2 -2
  424. package/dist/esm/hb-text.entry.js +2 -2
  425. package/dist/esm/hb-time-picker.entry.js +4 -4
  426. package/dist/esm/hb-time-select.entry.js +2 -2
  427. package/dist/esm/hb-timeline.entry.js +1 -1
  428. package/dist/esm/hb-tooltip.entry.js +18 -1
  429. package/dist/esm/hb-tooltip.entry.js.map +1 -1
  430. package/dist/esm/hb-transfer.entry.js +2 -2
  431. package/dist/esm/hb-tree-select.entry.js +95 -18
  432. package/dist/esm/hb-tree-select.entry.js.map +1 -1
  433. package/dist/esm/hb-tree.entry.js +1 -1
  434. package/dist/esm/hb-upload.entry.js +3 -3
  435. package/dist/esm/hb-watermark.entry.js +1 -1
  436. package/dist/esm/huibo-ui.js +1 -1
  437. package/dist/esm/loader.js +1 -1
  438. package/dist/huibo-ui/huibo-ui.css +1 -1
  439. package/dist/huibo-ui/huibo-ui.esm.js +1 -1
  440. package/dist/huibo-ui/huibo-ui.esm.js.map +1 -1
  441. package/dist/huibo-ui/p-02f15843.entry.js +2 -0
  442. package/dist/huibo-ui/p-08b4005c.js +2 -0
  443. package/dist/huibo-ui/p-08b4005c.js.map +1 -0
  444. package/dist/huibo-ui/{p-fd19813c.entry.js → p-0d4b2997.entry.js} +2 -2
  445. package/dist/huibo-ui/{p-672076c3.entry.js → p-10f6c184.entry.js} +2 -2
  446. package/dist/huibo-ui/p-10f6c184.entry.js.map +1 -0
  447. package/dist/huibo-ui/{p-d7815b4f.entry.js → p-13010da2.entry.js} +2 -2
  448. package/dist/huibo-ui/{p-8c80a765.entry.js → p-15db24e9.entry.js} +2 -2
  449. package/dist/huibo-ui/{p-8d925e3d.entry.js → p-1b0fbe69.entry.js} +2 -2
  450. package/dist/huibo-ui/p-1f8db37a.entry.js +2 -0
  451. package/dist/huibo-ui/p-1f8db37a.entry.js.map +1 -0
  452. package/dist/huibo-ui/{p-f374d5a3.entry.js → p-20632186.entry.js} +2 -2
  453. package/dist/huibo-ui/{p-e6f2d71d.entry.js → p-20fc554b.entry.js} +2 -2
  454. package/dist/huibo-ui/{p-315feadf.entry.js → p-213b9de7.entry.js} +2 -2
  455. package/dist/huibo-ui/p-25fd7d5c.entry.js +2 -0
  456. package/dist/huibo-ui/p-25fd7d5c.entry.js.map +1 -0
  457. package/dist/huibo-ui/p-2811e603.entry.js +2 -0
  458. package/dist/huibo-ui/p-2811e603.entry.js.map +1 -0
  459. package/dist/huibo-ui/{p-64ca0980.entry.js → p-2943f5d0.entry.js} +2 -2
  460. package/dist/huibo-ui/p-2943f5d0.entry.js.map +1 -0
  461. package/dist/huibo-ui/{p-710f38de.entry.js → p-2b4556ff.entry.js} +2 -2
  462. package/dist/huibo-ui/{p-e0ab9010.entry.js → p-33de6878.entry.js} +2 -2
  463. package/dist/huibo-ui/{p-ebd04656.entry.js → p-3807da71.entry.js} +2 -2
  464. package/dist/huibo-ui/{p-6a1ec3ff.entry.js → p-3deff48c.entry.js} +2 -2
  465. package/dist/huibo-ui/{p-e2a8a396.entry.js → p-41d9c846.entry.js} +2 -2
  466. package/dist/huibo-ui/{p-0a033738.entry.js → p-47ef7a86.entry.js} +2 -2
  467. package/dist/huibo-ui/p-4d34e43e.entry.js +2 -0
  468. package/dist/huibo-ui/p-4d34e43e.entry.js.map +1 -0
  469. package/dist/huibo-ui/p-54aa2fd8.entry.js +2 -0
  470. package/dist/huibo-ui/p-54aa2fd8.entry.js.map +1 -0
  471. package/dist/huibo-ui/{p-88127de1.entry.js → p-55cd13eb.entry.js} +2 -2
  472. package/dist/huibo-ui/{p-58ebb9b3.entry.js → p-5c839288.entry.js} +2 -2
  473. package/dist/huibo-ui/{p-c1b4eacb.entry.js → p-60532a1f.entry.js} +2 -2
  474. package/dist/huibo-ui/{p-59b2e61c.entry.js → p-626b48f1.entry.js} +2 -2
  475. package/dist/huibo-ui/p-626b48f1.entry.js.map +1 -0
  476. package/dist/huibo-ui/p-639f167d.entry.js +2 -0
  477. package/dist/huibo-ui/p-639f167d.entry.js.map +1 -0
  478. package/dist/huibo-ui/{p-f1c084c5.entry.js → p-678b4212.entry.js} +2 -2
  479. package/dist/huibo-ui/p-6beb5b81.entry.js +2 -0
  480. package/dist/huibo-ui/p-6beb5b81.entry.js.map +1 -0
  481. package/dist/huibo-ui/{p-a0015341.entry.js → p-6bfeab80.entry.js} +2 -2
  482. package/dist/huibo-ui/p-6c8cf248.entry.js +2 -0
  483. package/dist/huibo-ui/p-6c8cf248.entry.js.map +1 -0
  484. package/dist/huibo-ui/{p-85f68526.entry.js → p-735bceef.entry.js} +2 -2
  485. package/dist/huibo-ui/{p-8b1ae77e.entry.js → p-746a11a3.entry.js} +2 -2
  486. package/dist/huibo-ui/p-76519752.entry.js +2 -0
  487. package/dist/huibo-ui/{p-d3939d44.entry.js → p-79af2efa.entry.js} +2 -2
  488. package/dist/huibo-ui/{p-e0768565.entry.js → p-7da14d7c.entry.js} +2 -2
  489. package/dist/huibo-ui/{p-8c987d57.entry.js → p-7f65dc36.entry.js} +2 -2
  490. package/dist/huibo-ui/{p-0e65e1bd.entry.js → p-86bdc48a.entry.js} +2 -2
  491. package/dist/huibo-ui/p-86bdc48a.entry.js.map +1 -0
  492. package/dist/huibo-ui/{p-d87fc21a.entry.js → p-88a6c905.entry.js} +2 -2
  493. package/dist/huibo-ui/{p-d64b91ef.entry.js → p-89ea1141.entry.js} +2 -2
  494. package/dist/huibo-ui/p-89ea1141.entry.js.map +1 -0
  495. package/dist/huibo-ui/p-8a202bc5.entry.js +2 -0
  496. package/dist/huibo-ui/p-8a202bc5.entry.js.map +1 -0
  497. package/dist/huibo-ui/p-8a8443b8.entry.js +2 -0
  498. package/dist/huibo-ui/p-8a8443b8.entry.js.map +1 -0
  499. package/dist/huibo-ui/p-8fd788c9.entry.js +2 -0
  500. package/dist/huibo-ui/p-8fd788c9.entry.js.map +1 -0
  501. package/dist/huibo-ui/{p-9319c650.entry.js → p-8fdbd17c.entry.js} +2 -2
  502. package/dist/huibo-ui/p-92521c31.entry.js +2 -0
  503. package/dist/huibo-ui/p-92521c31.entry.js.map +1 -0
  504. package/dist/huibo-ui/{p-c3e665f6.entry.js → p-9a5406f0.entry.js} +2 -2
  505. package/dist/huibo-ui/p-9a5406f0.entry.js.map +1 -0
  506. package/dist/huibo-ui/{p-c321c4aa.entry.js → p-a084b8e5.entry.js} +2 -2
  507. package/dist/huibo-ui/{p-5df47135.entry.js → p-a190ca89.entry.js} +2 -2
  508. package/dist/huibo-ui/{p-463de26d.entry.js → p-a8996d22.entry.js} +2 -2
  509. package/dist/huibo-ui/p-aa5e5e02.entry.js +2 -0
  510. package/dist/huibo-ui/p-aa5e5e02.entry.js.map +1 -0
  511. package/dist/huibo-ui/{p-6b381d0e.entry.js → p-ab9cf0e4.entry.js} +2 -2
  512. package/dist/huibo-ui/{p-477d8568.entry.js → p-aeae83af.entry.js} +2 -2
  513. package/dist/huibo-ui/{p-77017274.entry.js → p-af74667d.entry.js} +2 -2
  514. package/dist/huibo-ui/{p-b489a526.entry.js → p-b06c8020.entry.js} +2 -2
  515. package/dist/huibo-ui/{p-2e6584ea.entry.js → p-b468858e.entry.js} +2 -2
  516. package/dist/huibo-ui/{p-2b286698.entry.js → p-b7885d4a.entry.js} +2 -2
  517. package/dist/huibo-ui/{p-231a7335.entry.js → p-b8d87f7e.entry.js} +2 -2
  518. package/dist/huibo-ui/{p-8b027491.entry.js → p-c50ad398.entry.js} +2 -2
  519. package/dist/huibo-ui/p-c6c91664.entry.js +2 -0
  520. package/dist/huibo-ui/{p-c3e8893d.entry.js → p-c80f8ace.entry.js} +2 -2
  521. package/dist/huibo-ui/p-c80f8ace.entry.js.map +1 -0
  522. package/dist/huibo-ui/{p-476527c1.entry.js → p-c8e917db.entry.js} +2 -2
  523. package/dist/huibo-ui/p-c8e917db.entry.js.map +1 -0
  524. package/dist/huibo-ui/{p-c922d672.entry.js → p-cad57c2d.entry.js} +2 -2
  525. package/dist/huibo-ui/{p-a042e3d0.entry.js → p-ccd09d5a.entry.js} +2 -2
  526. package/dist/huibo-ui/p-d79a15b1.entry.js +2 -0
  527. package/dist/huibo-ui/p-d79a15b1.entry.js.map +1 -0
  528. package/dist/huibo-ui/{p-10c088f3.entry.js → p-d9c7c378.entry.js} +2 -2
  529. package/dist/huibo-ui/{p-80aca641.entry.js → p-dfccc7aa.entry.js} +2 -2
  530. package/dist/huibo-ui/{p-21682e92.entry.js → p-dfd144d8.entry.js} +2 -2
  531. package/dist/huibo-ui/{p-be48d2aa.entry.js → p-e039155d.entry.js} +2 -2
  532. package/dist/huibo-ui/{p-dfaf7e37.entry.js → p-e10fcfbe.entry.js} +2 -2
  533. package/dist/huibo-ui/{p-079a4130.entry.js → p-e3155cd7.entry.js} +2 -2
  534. package/dist/huibo-ui/{p-4001c08d.entry.js → p-e5cbfa9e.entry.js} +2 -2
  535. package/dist/huibo-ui/p-e5cbfa9e.entry.js.map +1 -0
  536. package/dist/huibo-ui/p-edbda423.entry.js +2 -0
  537. package/dist/huibo-ui/p-edbda423.entry.js.map +1 -0
  538. package/dist/huibo-ui/{p-465dcb4c.entry.js → p-f2c78699.entry.js} +2 -2
  539. package/dist/huibo-ui/{p-6ac242fe.entry.js → p-f4336be9.entry.js} +2 -2
  540. package/dist/huibo-ui/{p-332c8877.entry.js → p-f5969181.entry.js} +2 -2
  541. package/dist/huibo-ui/{p-f81ec512.entry.js → p-f6889710.entry.js} +2 -2
  542. package/dist/huibo-ui/{p-24ad7eec.entry.js → p-f9bb5217.entry.js} +2 -2
  543. package/dist/huibo-ui/{p-4d8b1404.entry.js → p-fd8301c6.entry.js} +2 -2
  544. package/dist/huibo-ui/{p-dd05cb2c.entry.js → p-fea20295.entry.js} +2 -2
  545. package/dist/types/components/Calendar/Calendar.d.ts +13 -1
  546. package/dist/types/components/Cascader/Cascader.d.ts +68 -90
  547. package/dist/types/components/ColorPicker/ColorPicker.d.ts +11 -0
  548. package/dist/types/components/DatePicker/DatePicker.d.ts +14 -3
  549. package/dist/types/components/Dropdown/Dropdown.d.ts +14 -1
  550. package/dist/types/components/Form/FormItem.d.ts +10 -0
  551. package/dist/types/components/ImagePreview/ImagePreview.d.ts +5 -1
  552. package/dist/types/components/Input/Input.d.ts +9 -0
  553. package/dist/types/components/Layout/Layout.d.ts +20 -10
  554. package/dist/types/components/Pagination/Pagination.d.ts +3 -0
  555. package/dist/types/components/Popconfirm/Popconfirm.d.ts +12 -0
  556. package/dist/types/components/Popover/Popover.d.ts +9 -0
  557. package/dist/types/components/Rate/Rate.d.ts +7 -0
  558. package/dist/types/components/Segmented/Segmented.d.ts +12 -1
  559. package/dist/types/components/Select/Select.d.ts +6 -0
  560. package/dist/types/components/Slider/Slider.d.ts +27 -1
  561. package/dist/types/components/Steps/Steps.d.ts +14 -6
  562. package/dist/types/components/Tooltip/Tooltip.d.ts +9 -1
  563. package/dist/types/components/TreeSelect/TreeSelect.d.ts +9 -0
  564. package/dist/types/components.d.ts +250 -94
  565. package/dist/types/utils/date-helpers.d.ts +1 -1
  566. package/package.json +8 -2
  567. package/readme.md +88 -73
  568. package/dist/cjs/date-helpers-904747ff.js.map +0 -1
  569. package/dist/components/p-cf94cbf6.js.map +0 -1
  570. package/dist/esm/date-helpers-e4d85a67.js.map +0 -1
  571. package/dist/huibo-ui/p-003cee87.entry.js +0 -2
  572. package/dist/huibo-ui/p-003cee87.entry.js.map +0 -1
  573. package/dist/huibo-ui/p-0bef78ac.entry.js +0 -2
  574. package/dist/huibo-ui/p-0bef78ac.entry.js.map +0 -1
  575. package/dist/huibo-ui/p-0e65e1bd.entry.js.map +0 -1
  576. package/dist/huibo-ui/p-0f189251.entry.js +0 -2
  577. package/dist/huibo-ui/p-0f189251.entry.js.map +0 -1
  578. package/dist/huibo-ui/p-1b5acd6d.entry.js +0 -2
  579. package/dist/huibo-ui/p-1b5acd6d.entry.js.map +0 -1
  580. package/dist/huibo-ui/p-3c7f73c8.entry.js +0 -2
  581. package/dist/huibo-ui/p-3c7f73c8.entry.js.map +0 -1
  582. package/dist/huibo-ui/p-4001c08d.entry.js.map +0 -1
  583. package/dist/huibo-ui/p-44c48246.entry.js +0 -2
  584. package/dist/huibo-ui/p-44c48246.entry.js.map +0 -1
  585. package/dist/huibo-ui/p-476527c1.entry.js.map +0 -1
  586. package/dist/huibo-ui/p-4d0dff15.entry.js +0 -2
  587. package/dist/huibo-ui/p-58d20809.entry.js +0 -2
  588. package/dist/huibo-ui/p-58d20809.entry.js.map +0 -1
  589. package/dist/huibo-ui/p-59b2e61c.entry.js.map +0 -1
  590. package/dist/huibo-ui/p-64ca0980.entry.js.map +0 -1
  591. package/dist/huibo-ui/p-672076c3.entry.js.map +0 -1
  592. package/dist/huibo-ui/p-756acbdb.entry.js +0 -2
  593. package/dist/huibo-ui/p-756acbdb.entry.js.map +0 -1
  594. package/dist/huibo-ui/p-75a93de3.entry.js +0 -2
  595. package/dist/huibo-ui/p-75a93de3.entry.js.map +0 -1
  596. package/dist/huibo-ui/p-769960f4.entry.js +0 -2
  597. package/dist/huibo-ui/p-8d615521.entry.js +0 -2
  598. package/dist/huibo-ui/p-8d615521.entry.js.map +0 -1
  599. package/dist/huibo-ui/p-953b9514.entry.js +0 -2
  600. package/dist/huibo-ui/p-ad6b0c6e.entry.js +0 -2
  601. package/dist/huibo-ui/p-ad6b0c6e.entry.js.map +0 -1
  602. package/dist/huibo-ui/p-c1a059d9.entry.js +0 -2
  603. package/dist/huibo-ui/p-c1a059d9.entry.js.map +0 -1
  604. package/dist/huibo-ui/p-c3e665f6.entry.js.map +0 -1
  605. package/dist/huibo-ui/p-c3e8893d.entry.js.map +0 -1
  606. package/dist/huibo-ui/p-cf94cbf6.js +0 -2
  607. package/dist/huibo-ui/p-cf94cbf6.js.map +0 -1
  608. package/dist/huibo-ui/p-d64b91ef.entry.js.map +0 -1
  609. package/dist/huibo-ui/p-e9490259.entry.js +0 -2
  610. package/dist/huibo-ui/p-e9490259.entry.js.map +0 -1
  611. package/dist/huibo-ui/p-ed0ff857.entry.js +0 -2
  612. package/dist/huibo-ui/p-ed0ff857.entry.js.map +0 -1
  613. package/dist/huibo-ui/p-f0ac7db5.entry.js +0 -2
  614. package/dist/huibo-ui/p-f0ac7db5.entry.js.map +0 -1
  615. /package/dist/huibo-ui/{p-4d0dff15.entry.js.map → p-02f15843.entry.js.map} +0 -0
  616. /package/dist/huibo-ui/{p-fd19813c.entry.js.map → p-0d4b2997.entry.js.map} +0 -0
  617. /package/dist/huibo-ui/{p-d7815b4f.entry.js.map → p-13010da2.entry.js.map} +0 -0
  618. /package/dist/huibo-ui/{p-8c80a765.entry.js.map → p-15db24e9.entry.js.map} +0 -0
  619. /package/dist/huibo-ui/{p-8d925e3d.entry.js.map → p-1b0fbe69.entry.js.map} +0 -0
  620. /package/dist/huibo-ui/{p-f374d5a3.entry.js.map → p-20632186.entry.js.map} +0 -0
  621. /package/dist/huibo-ui/{p-e6f2d71d.entry.js.map → p-20fc554b.entry.js.map} +0 -0
  622. /package/dist/huibo-ui/{p-315feadf.entry.js.map → p-213b9de7.entry.js.map} +0 -0
  623. /package/dist/huibo-ui/{p-710f38de.entry.js.map → p-2b4556ff.entry.js.map} +0 -0
  624. /package/dist/huibo-ui/{p-e0ab9010.entry.js.map → p-33de6878.entry.js.map} +0 -0
  625. /package/dist/huibo-ui/{p-ebd04656.entry.js.map → p-3807da71.entry.js.map} +0 -0
  626. /package/dist/huibo-ui/{p-6a1ec3ff.entry.js.map → p-3deff48c.entry.js.map} +0 -0
  627. /package/dist/huibo-ui/{p-e2a8a396.entry.js.map → p-41d9c846.entry.js.map} +0 -0
  628. /package/dist/huibo-ui/{p-0a033738.entry.js.map → p-47ef7a86.entry.js.map} +0 -0
  629. /package/dist/huibo-ui/{p-88127de1.entry.js.map → p-55cd13eb.entry.js.map} +0 -0
  630. /package/dist/huibo-ui/{p-58ebb9b3.entry.js.map → p-5c839288.entry.js.map} +0 -0
  631. /package/dist/huibo-ui/{p-c1b4eacb.entry.js.map → p-60532a1f.entry.js.map} +0 -0
  632. /package/dist/huibo-ui/{p-f1c084c5.entry.js.map → p-678b4212.entry.js.map} +0 -0
  633. /package/dist/huibo-ui/{p-a0015341.entry.js.map → p-6bfeab80.entry.js.map} +0 -0
  634. /package/dist/huibo-ui/{p-85f68526.entry.js.map → p-735bceef.entry.js.map} +0 -0
  635. /package/dist/huibo-ui/{p-8b1ae77e.entry.js.map → p-746a11a3.entry.js.map} +0 -0
  636. /package/dist/huibo-ui/{p-953b9514.entry.js.map → p-76519752.entry.js.map} +0 -0
  637. /package/dist/huibo-ui/{p-d3939d44.entry.js.map → p-79af2efa.entry.js.map} +0 -0
  638. /package/dist/huibo-ui/{p-e0768565.entry.js.map → p-7da14d7c.entry.js.map} +0 -0
  639. /package/dist/huibo-ui/{p-8c987d57.entry.js.map → p-7f65dc36.entry.js.map} +0 -0
  640. /package/dist/huibo-ui/{p-d87fc21a.entry.js.map → p-88a6c905.entry.js.map} +0 -0
  641. /package/dist/huibo-ui/{p-9319c650.entry.js.map → p-8fdbd17c.entry.js.map} +0 -0
  642. /package/dist/huibo-ui/{p-c321c4aa.entry.js.map → p-a084b8e5.entry.js.map} +0 -0
  643. /package/dist/huibo-ui/{p-5df47135.entry.js.map → p-a190ca89.entry.js.map} +0 -0
  644. /package/dist/huibo-ui/{p-463de26d.entry.js.map → p-a8996d22.entry.js.map} +0 -0
  645. /package/dist/huibo-ui/{p-6b381d0e.entry.js.map → p-ab9cf0e4.entry.js.map} +0 -0
  646. /package/dist/huibo-ui/{p-477d8568.entry.js.map → p-aeae83af.entry.js.map} +0 -0
  647. /package/dist/huibo-ui/{p-77017274.entry.js.map → p-af74667d.entry.js.map} +0 -0
  648. /package/dist/huibo-ui/{p-b489a526.entry.js.map → p-b06c8020.entry.js.map} +0 -0
  649. /package/dist/huibo-ui/{p-2e6584ea.entry.js.map → p-b468858e.entry.js.map} +0 -0
  650. /package/dist/huibo-ui/{p-2b286698.entry.js.map → p-b7885d4a.entry.js.map} +0 -0
  651. /package/dist/huibo-ui/{p-231a7335.entry.js.map → p-b8d87f7e.entry.js.map} +0 -0
  652. /package/dist/huibo-ui/{p-8b027491.entry.js.map → p-c50ad398.entry.js.map} +0 -0
  653. /package/dist/huibo-ui/{p-769960f4.entry.js.map → p-c6c91664.entry.js.map} +0 -0
  654. /package/dist/huibo-ui/{p-c922d672.entry.js.map → p-cad57c2d.entry.js.map} +0 -0
  655. /package/dist/huibo-ui/{p-a042e3d0.entry.js.map → p-ccd09d5a.entry.js.map} +0 -0
  656. /package/dist/huibo-ui/{p-10c088f3.entry.js.map → p-d9c7c378.entry.js.map} +0 -0
  657. /package/dist/huibo-ui/{p-80aca641.entry.js.map → p-dfccc7aa.entry.js.map} +0 -0
  658. /package/dist/huibo-ui/{p-21682e92.entry.js.map → p-dfd144d8.entry.js.map} +0 -0
  659. /package/dist/huibo-ui/{p-be48d2aa.entry.js.map → p-e039155d.entry.js.map} +0 -0
  660. /package/dist/huibo-ui/{p-dfaf7e37.entry.js.map → p-e10fcfbe.entry.js.map} +0 -0
  661. /package/dist/huibo-ui/{p-079a4130.entry.js.map → p-e3155cd7.entry.js.map} +0 -0
  662. /package/dist/huibo-ui/{p-465dcb4c.entry.js.map → p-f2c78699.entry.js.map} +0 -0
  663. /package/dist/huibo-ui/{p-6ac242fe.entry.js.map → p-f4336be9.entry.js.map} +0 -0
  664. /package/dist/huibo-ui/{p-332c8877.entry.js.map → p-f5969181.entry.js.map} +0 -0
  665. /package/dist/huibo-ui/{p-f81ec512.entry.js.map → p-f6889710.entry.js.map} +0 -0
  666. /package/dist/huibo-ui/{p-24ad7eec.entry.js.map → p-f9bb5217.entry.js.map} +0 -0
  667. /package/dist/huibo-ui/{p-4d8b1404.entry.js.map → p-fd8301c6.entry.js.map} +0 -0
  668. /package/dist/huibo-ui/{p-dd05cb2c.entry.js.map → p-fea20295.entry.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"names":["COMPONENT_SIZES","buildSizeClass","base","size","normalized","includes","isClearVisible","options","Boolean","clearable","disabled","readonly","hasValue","hasInputValue","value","undefined","length","Number","isNaN","Array","isArray","sizeClassMap","inputCss","HbInputStyle0","Input","modelValue","type","placeholder","showPassword","showWordLimit","maxlength","minlength","name","inputId","autocomplete","autofocus","prefixIcon","suffixIcon","rows","autosize","resize","isFocused","showClear","passwordVisible","inputValue","inputRef","hbChange","hbInput","hbFocus","hbBlur","hbClear","handleValueChange","this","updateClearVisible","componentDidLoad","handleInput","e","target","emit","handleChange","handleFocus","handleBlur","handleClear","stopPropagation","focus","togglePasswordVisible","getInputType","render","isTextarea","InputTag","h","key","class","ref","el","id","style","onInput","onChange","onFocus","onBlur","onClick"],"sources":["src/utils/form-input-base.ts","src/components/Input/input.css?tag=hb-input&encapsulation=shadow","src/components/Input/Input.tsx"],"sourcesContent":["/**\n * 表单输入组件共享基础\n * 统一 size / disabled / clearable / modelValue 这一组在 Input / Select / Cascader /\n * DatePicker / InputNumber / TimePicker 等组件中重复出现的包装模式。\n *\n * 设计原则:纯函数 + 类型导出,不引入基类继承,避免 Stencil 装饰器在继承链上的隐式行为。\n * 组件按需 import 对应工具,渲染时调用即可。\n */\n\n/** 组件尺寸(与 Ant Design 对齐,便于迁移) */\nexport type ComponentSize = 'large' | 'default' | 'small';\n\n/** 全部合法尺寸,用于运行期校验 */\nexport const COMPONENT_SIZES: readonly ComponentSize[] = ['large', 'default', 'small'] as const;\n\n/**\n * 表单输入组件共享的 prop 契约。\n * 跨框架消费方(React / Vue / 原生)可据此推断任一表单输入组件的通用能力,\n * 各组件在此基础上扩展自身特有 prop。\n */\nexport interface FormInputProps {\n /** 绑定值(双向,配合 hbChange 事件) */\n modelValue: unknown;\n /** 尺寸 */\n size?: ComponentSize;\n /** 是否禁用 */\n disabled?: boolean;\n /** 是否只读 */\n readonly?: boolean;\n /** 是否可清空 */\n clearable?: boolean;\n /** 占位文本 */\n placeholder?: string;\n}\n\n/**\n * 生成尺寸 class 名:buildSizeClass('hb-input', 'large') -> 'hb-input--large'\n * 用于替代各组件 render 中重复的 `[`hb-input--${this.size}`]: true` 模板字面量。\n */\nexport function buildSizeClass(base: string, size: ComponentSize | undefined): string {\n const normalized = size && COMPONENT_SIZES.includes(size) ? size : 'default';\n return `${base}--${normalized}`;\n}\n\n/** 清空按钮可见性判定参数 */\nexport interface ClearVisibleOptions {\n /** 是否声明了 clearable */\n clearable: boolean;\n /** 是否禁用(禁用时不显示) */\n disabled?: boolean;\n /** 是否只读(只读时不显示) */\n readonly?: boolean;\n /** 当前是否有值(无值时不显示) */\n hasValue: boolean;\n}\n\n/**\n * 判定清空按钮是否应显示。\n * 抽取自 Input/Select/Cascader 中重复的 `clearable && !disabled && !readonly && hasValue`。\n */\nexport function isClearVisible(options: ClearVisibleOptions): boolean {\n return Boolean(options.clearable && !options.disabled && !options.readonly && options.hasValue);\n}\n\n/**\n * 判定一个值是否「非空」(用于清空按钮显隐)。\n * 兼容字符串、数字、数组(多选)。\n */\nexport function hasInputValue(value: unknown): boolean {\n if (value === null || value === undefined) return false;\n if (typeof value === 'string') return value.length > 0;\n if (typeof value === 'number') return !Number.isNaN(value);\n if (Array.isArray(value)) return value.length > 0;\n return true;\n}\n\n/**\n * 尺寸 class 集合生成器:返回包含 base 与 size class 的对象,可直接展开进 JSX class 绑定。\n * 例:sizeClassMap('hb-input', 'large', this.size) -> { 'hb-input': true, 'hb-input--large': true }\n */\nexport function sizeClassMap(base: string, size: ComponentSize | undefined): Record<string, boolean> {\n return { [base]: true, [buildSizeClass(base, size)]: true };\n}\n",":host {\n display: inline-block;\n position: relative;\n --hb-input-font-size: 14px;\n --hb-input-font-size-large: 16px;\n --hb-input-font-size-small: 12px;\n --hb-input-height: 32px;\n --hb-input-height-large: 40px;\n --hb-input-height-small: 24px;\n --hb-input-border-color: var(--hb-border-color, #dcdfe6);\n --hb-input-border-color-hover: var(--hb-color-primary);\n --hb-input-bg-color: var(--hb-color-white, #ffffff);\n --hb-input-text-color: var(--hb-color-text-regular, #606266);\n --hb-input-placeholder-color: var(--hb-color-text-placeholder, #c0c4cc);\n --hb-input-disabled-color: var(--hb-color-text-disabled, #c0c4cc);\n --hb-input-disabled-bg-color: var(--hb-fill-color-light, #f5f7fa);\n}\n\n.hb-input {\n position: relative;\n font-size: var(--hb-input-font-size);\n display: inline-block;\n width: 100%;\n}\n\n.hb-input__inner {\n -webkit-appearance: none;\n background-color: var(--hb-input-bg-color);\n background-image: none;\n border-radius: 4px;\n border: 1px solid var(--hb-input-border-color);\n box-sizing: border-box;\n color: var(--hb-input-text-color);\n display: inline-block;\n font-size: inherit;\n height: var(--hb-input-height);\n line-height: var(--hb-input-height);\n outline: none;\n padding: 0 15px;\n transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);\n width: 100%;\n}\n\n.hb-input__inner::placeholder {\n color: var(--hb-input-placeholder-color);\n}\n\n.hb-input__inner:hover:not(:disabled) {\n border-color: var(--hb-input-border-color-hover);\n}\n\n.hb-input__inner:focus {\n border-color: var(--hb-input-border-color-hover);\n}\n\n.hb-input__inner:disabled {\n background-color: var(--hb-input-disabled-bg-color);\n border-color: var(--hb-input-border-color);\n color: var(--hb-input-disabled-color);\n cursor: not-allowed;\n}\n\n.hb-input__inner[readonly] {\n background-color: var(--hb-input-disabled-bg-color);\n cursor: default;\n}\n\n.hb-input--small .hb-input__inner {\n height: var(--hb-input-height-small);\n line-height: var(--hb-input-height-small);\n font-size: var(--hb-input-font-size-small);\n padding: 0 12px;\n}\n\n.hb-input--large .hb-input__inner {\n height: var(--hb-input-height-large);\n line-height: var(--hb-input-height-large);\n font-size: var(--hb-input-font-size-large);\n padding: 0 18px;\n}\n\n.hb-input__prefix,\n.hb-input__suffix {\n position: absolute;\n top: 0;\n height: 100%;\n text-align: center;\n color: var(--hb-input-placeholder-color);\n transition: all 0.3s;\n display: flex;\n align-items: center;\n}\n\n.hb-input__prefix {\n left: 5px;\n}\n\n.hb-input__suffix {\n right: 5px;\n}\n\n.hb-input__suffix-inner {\n display: flex;\n align-items: center;\n cursor: pointer;\n user-select: none;\n}\n\n.hb-input__clear {\n font-size: 16px;\n color: var(--hb-input-placeholder-color);\n transition: color 0.2s;\n}\n\n.hb-input__clear:hover {\n color: var(--hb-input-text-color);\n}\n\n.hb-input__password {\n font-size: 16px;\n cursor: pointer;\n}\n\n.hb-input__inner[type=\"textarea\"] {\n min-height: 60px;\n padding: 5px 15px;\n line-height: 1.5;\n vertical-align: bottom;\n resize: vertical;\n}\n\n.hb-input__count {\n position: absolute;\n bottom: 5px;\n right: 10px;\n font-size: 12px;\n color: var(--hb-input-placeholder-color);\n}\n\n.hb-input__count-inner {\n background-color: var(--hb-input-bg-color);\n padding: 0 4px;\n}\n\n","import { Component, h, Prop, Event, EventEmitter, State, Watch, Element } from '@stencil/core';\nimport { ComponentSize, hasInputValue, isClearVisible, sizeClassMap } from '../../utils/form-input-base';\n\n/**\n * Input 输入框组件\n * 通过鼠标或键盘输入字符\n */\n@Component({\n tag: 'hb-input',\n styleUrl: 'input.css',\n shadow: true,\n})\nexport class Input {\n @Element() el: HTMLElement;\n\n /**\n * 绑定值\n */\n @Prop({ mutable: true }) modelValue: string = '';\n\n /**\n * 输入框类型\n */\n @Prop() type: string = 'text';\n\n /**\n * 输入框尺寸\n */\n @Prop() size: ComponentSize = 'default';\n\n /**\n * 是否禁用\n * @default false\n */\n @Prop() disabled: boolean = false;\n\n /**\n * 是否只读\n * @default false\n */\n @Prop() readonly: boolean = false;\n\n /**\n * 输入框占位文本\n */\n @Prop() placeholder?: string;\n\n /**\n * 是否可清空\n * @default false\n */\n @Prop() clearable: boolean = false;\n\n /**\n * 是否显示密码可见性切换\n * @default false\n */\n @Prop() showPassword: boolean = false;\n\n /**\n * 是否显示字数统计\n * @default false\n */\n @Prop() showWordLimit: boolean = false;\n\n /**\n * 最大输入长度\n */\n @Prop() maxlength?: number;\n\n /**\n * 最小输入长度\n */\n @Prop() minlength?: number;\n\n /**\n * 原生 name 属性\n */\n @Prop() name?: string;\n\n /**\n * 原生 id 属性\n */\n @Prop() inputId?: string;\n\n /**\n * 原生 autocomplete 属性\n */\n @Prop() autocomplete?: string;\n\n /**\n * 原生 autofocus 属性\n */\n @Prop() autofocus: boolean = false;\n\n /**\n * 输入框头部图标\n */\n @Prop() prefixIcon?: string;\n\n /**\n * 输入框尾部图标\n */\n @Prop() suffixIcon?: string;\n\n /**\n * 输入框行数,仅 type 为 'textarea' 时有效\n */\n @Prop() rows: number = 2;\n\n /**\n * 是否自适应内容高度,仅 type 为 'textarea' 时有效\n */\n @Prop() autosize: boolean | { minRows?: number; maxRows?: number } = false;\n\n /**\n * 是否调整 textarea 大小\n */\n @Prop() resize?: 'none' | 'both' | 'horizontal' | 'vertical';\n\n @State() isFocused: boolean = false;\n @State() showClear: boolean = false;\n @State() passwordVisible: boolean = false;\n @State() inputValue: string = '';\n\n private inputRef?: HTMLInputElement | HTMLTextAreaElement;\n\n /**\n * 值改变事件\n */\n @Event() hbChange: EventEmitter<string>;\n\n /**\n * 输入事件\n */\n @Event() hbInput: EventEmitter<string>;\n\n /**\n * 聚焦事件\n */\n @Event() hbFocus: EventEmitter<FocusEvent>;\n\n /**\n * 失焦事件\n */\n @Event() hbBlur: EventEmitter<FocusEvent>;\n\n /**\n * 清空事件\n */\n @Event() hbClear: EventEmitter<void>;\n\n @Watch('modelValue')\n handleValueChange() {\n this.inputValue = this.modelValue;\n this.updateClearVisible();\n }\n\n componentDidLoad() {\n this.inputValue = this.modelValue;\n this.updateClearVisible();\n }\n\n private updateClearVisible() {\n this.showClear = isClearVisible({\n clearable: this.clearable,\n disabled: this.disabled,\n readonly: this.readonly,\n hasValue: hasInputValue(this.inputValue),\n });\n }\n\n private handleInput = (e: Event) => {\n const target = e.target as HTMLInputElement | HTMLTextAreaElement;\n this.inputValue = target.value;\n this.modelValue = target.value;\n this.updateClearVisible();\n this.hbInput.emit(target.value);\n };\n\n private handleChange = (e: Event) => {\n const target = e.target as HTMLInputElement | HTMLTextAreaElement;\n this.hbChange.emit(target.value);\n };\n\n private handleFocus = (e: FocusEvent) => {\n this.isFocused = true;\n this.updateClearVisible();\n this.hbFocus.emit(e);\n };\n\n private handleBlur = (e: FocusEvent) => {\n this.isFocused = false;\n this.updateClearVisible();\n this.hbBlur.emit(e);\n };\n\n private handleClear = (e: Event) => {\n e.stopPropagation();\n this.inputValue = '';\n this.modelValue = '';\n this.updateClearVisible();\n this.hbClear.emit();\n this.hbChange.emit('');\n if (this.inputRef) {\n this.inputRef.focus();\n }\n };\n\n private togglePasswordVisible = () => {\n this.passwordVisible = !this.passwordVisible;\n };\n\n private getInputType(): string {\n if (this.type === 'password' && this.showPassword) {\n return this.passwordVisible ? 'text' : 'password';\n }\n return this.type;\n }\n\n render() {\n const isTextarea = this.type === 'textarea';\n const InputTag = isTextarea ? 'textarea' : 'input';\n\n return (\n <div\n class={{\n ...sizeClassMap('hb-input', this.size),\n 'hb-input--disabled': this.disabled,\n 'hb-input--focused': this.isFocused,\n }}\n >\n {this.prefixIcon && (\n <span class=\"hb-input__prefix\">\n <i class={this.prefixIcon}></i>\n </span>\n )}\n <InputTag\n ref={(el) => (this.inputRef = el)}\n type={isTextarea ? undefined : this.getInputType()}\n id={this.inputId}\n name={this.name}\n class=\"hb-input__inner\"\n placeholder={this.placeholder}\n value={this.inputValue}\n disabled={this.disabled}\n readonly={this.readonly}\n autocomplete={this.autocomplete}\n autofocus={this.autofocus}\n maxlength={this.maxlength}\n minlength={this.minlength}\n rows={isTextarea ? this.rows : undefined}\n style={isTextarea && this.resize ? { resize: this.resize } : undefined}\n onInput={this.handleInput}\n onChange={this.handleChange}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n />\n {(this.showClear || this.suffixIcon || (this.type === 'password' && this.showPassword)) && (\n <span class=\"hb-input__suffix\">\n {this.showClear && (\n <span class=\"hb-input__suffix-inner hb-input__clear\" onClick={this.handleClear}>\n ×\n </span>\n )}\n {this.type === 'password' && this.showPassword && (\n <span class=\"hb-input__suffix-inner hb-input__password\" onClick={this.togglePasswordVisible}>\n {this.passwordVisible ? '👁️' : '👁️‍🗨️'}\n </span>\n )}\n {this.suffixIcon && (\n <span class=\"hb-input__suffix-inner\">\n <i class={this.suffixIcon}></i>\n </span>\n )}\n </span>\n )}\n {this.showWordLimit && this.maxlength && (\n <span class=\"hb-input__count\">\n <span class=\"hb-input__count-inner\">\n {this.inputValue.length} / {this.maxlength}\n </span>\n </span>\n )}\n </div>\n );\n }\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{r as e,g as t,h as i}from"./p-e42dfa95.js";import{c as o,g as a}from"./p-ecce2b5e.js";const r='/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}::file-selector-button{appearance:button;background-color:#0000;border:0 solid;border-radius:0;box-sizing:border-box;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;margin:0;margin-inline-end:4px;opacity:1;padding:0}:host,html{-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);line-height:1.5;tab-size:4;-webkit-tap-highlight-color:transparent}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}button,input,optgroup,select,textarea{background-color:#0000;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex;padding-block:0}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}} /*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */@layer properties{}@layer base{}@layer components;.hb-popover__trigger,:host{display:inline-block}.hb-popover__popup{animation:hb-popover-fade .15s ease-out;background:var(--hb-color-bg-elevated);border-radius:var(--hb-border-radius-base);box-shadow:var(--hb-box-shadow);padding:var(--hb-spacing-sm)0;pointer-events:auto;position:fixed}.hb-popover__title{border-bottom:1px solid var(--hb-color-border-secondary);font-size:var(--hb-font-size-sm);font-weight:600;padding:var(--hb-spacing-xs)var(--hb-spacing-md)}.hb-popover__body{color:var(--hb-color-text);font-size:var(--hb-font-size-sm);padding:var(--hb-spacing-sm)var(--hb-spacing-md)}@keyframes hb-popover-fade{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}';const n=r;const s=class{constructor(t){e(this,t)}get el(){return t(this)}title="";width="240px";placement="bottom";trigger="hover";disabled=false;visible=false;popupStyle={};triggerRef;popupRef;show=()=>{if(!this.disabled){this.visible=true;requestAnimationFrame((()=>this.updatePosition()))}};hide=()=>{this.visible=false};toggle=()=>{if(this.visible){this.hide()}else{this.show()}};updatePosition(){if(!this.triggerRef||!this.popupRef)return;const e=this.triggerRef.getBoundingClientRect();const{width:t,height:i}=this.popupRef.getBoundingClientRect();const r=o(e,t,i,this.placement,8);this.popupStyle={top:`${r.top}px`,left:`${r.left}px`,zIndex:String(a())}}render(){const e=this.trigger==="hover"?{onMouseEnter:this.show,onMouseLeave:this.hide}:{onClick:this.toggle};return i("div",{key:"b094fdab875b54a1334489467d87cab19d5d495c",class:"hb-popover",...e},i("div",{key:"0d87497b9f31c97aab530a5298722b594388a036",ref:e=>{this.triggerRef=e},class:"hb-popover__trigger"},i("slot",{key:"93740d59a42e448997f44fe9a636e2858d15121a"})),this.visible&&i("div",{key:"54f77abc1aa942b45e69bf4c63ec6b8f4fd49bad",ref:e=>{this.popupRef=e},class:"hb-popover__popup",style:{...this.popupStyle,width:this.width},onMouseEnter:()=>this.trigger==="hover"&&this.show(),onMouseLeave:()=>this.trigger==="hover"&&this.hide()},this.title&&i("div",{key:"44f71196d287712f9895546d03d1849ba2092241",class:"hb-popover__title"},this.title),i("div",{key:"7f558d395de6937bb453f9a3453509654fb14514",class:"hb-popover__body"},i("slot",{key:"19677384409687a3936393b2aaf6722c071de5eb",name:"content"}))))}};s.style=n;export{s as hb_popover};
2
- //# sourceMappingURL=p-1b5acd6d.entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["popoverCss","HbPopoverStyle0","Popover","title","width","placement","trigger","disabled","visible","popupStyle","triggerRef","popupRef","show","this","requestAnimationFrame","updatePosition","hide","toggle","rect","getBoundingClientRect","pw","height","ph","pos","computePosition","top","left","zIndex","String","getNextZIndex","render","events","onMouseEnter","onMouseLeave","onClick","h","key","class","ref","el","style","name"],"sources":["src/components/Popover/popover.css?tag=hb-popover&encapsulation=shadow","src/components/Popover/Popover.tsx"],"sourcesContent":[":host { display: inline-block; }\n.hb-popover__trigger { display: inline-block; }\n.hb-popover__popup {\n position: fixed; background: var(--hb-color-bg-elevated);\n border-radius: var(--hb-border-radius-base); box-shadow: var(--hb-box-shadow);\n padding: var(--hb-spacing-sm) 0; animation: hb-popover-fade 0.15s ease-out; pointer-events: auto;\n}\n.hb-popover__title { padding: var(--hb-spacing-xs) var(--hb-spacing-md); font-weight: 600; font-size: var(--hb-font-size-sm); border-bottom: 1px solid var(--hb-color-border-secondary); }\n.hb-popover__body { padding: var(--hb-spacing-sm) var(--hb-spacing-md); font-size: var(--hb-font-size-sm); color: var(--hb-color-text); }\n@keyframes hb-popover-fade { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } }\n","import { Component, h, Prop, State, Element } from '@stencil/core';\nimport { computePosition, getNextZIndex, Placement } from '../../utils/popup-manager';\n\n@Component({ tag: 'hb-popover', styleUrl: 'popover.css', shadow: true })\nexport class Popover {\n @Element() el: HTMLElement;\n // 注意:使用默认值使其成为 required string,避免与 HTMLElement.title(string)\n // 的可选类型冲突;同时保留 Ant Design 兼容的 `title` API。\n @Prop() title: string = '';\n @Prop() width: string = '240px';\n @Prop() placement: Placement = 'bottom';\n @Prop() trigger: 'hover' | 'click' = 'hover';\n @Prop() disabled: boolean = false;\n @State() visible: boolean = false;\n @State() popupStyle: Record<string, string> = {};\n\n private triggerRef?: HTMLElement;\n private popupRef?: HTMLDivElement;\n\n private show = () => { if (!this.disabled) { this.visible = true; requestAnimationFrame(() => this.updatePosition()); } };\n private hide = () => { this.visible = false; };\n private toggle = () => {\n if (this.visible) {\n this.hide();\n } else {\n this.show();\n }\n };\n\n private updatePosition() {\n if (!this.triggerRef || !this.popupRef) return;\n const rect = this.triggerRef.getBoundingClientRect();\n const { width: pw, height: ph } = this.popupRef.getBoundingClientRect();\n const pos = computePosition(rect, pw, ph, this.placement, 8);\n this.popupStyle = { top: `${pos.top}px`, left: `${pos.left}px`, zIndex: String(getNextZIndex()) };\n }\n\n render() {\n const events = this.trigger === 'hover' ? { onMouseEnter: this.show, onMouseLeave: this.hide } : { onClick: this.toggle };\n return (\n <div class=\"hb-popover\" {...events}>\n <div ref={(el: any) => { this.triggerRef = el; }} class=\"hb-popover__trigger\"><slot /></div>\n {this.visible && (\n <div ref={(el: any) => { this.popupRef = el; }} class=\"hb-popover__popup\" style={{ ...this.popupStyle, width: this.width }}\n onMouseEnter={() => this.trigger === 'hover' && this.show()} onMouseLeave={() => this.trigger === 'hover' && this.hide()}>\n {this.title && <div class=\"hb-popover__title\">{this.title}</div>}\n <div class=\"hb-popover__body\"><slot name=\"content\" /></div>\n </div>\n )}\n </div>\n );\n }\n}\n"],"mappings":"6FAAA,MAAMA,EAAa,+vMACnB,MAAAC,EAAeD,E,MCGFE,EAAO,M,iDAIVC,MAAgB,GAChBC,MAAgB,QAChBC,UAAuB,SACvBC,QAA6B,QAC7BC,SAAoB,MACnBC,QAAmB,MACnBC,WAAqC,GAEtCC,WACAC,SAEAC,KAAO,KAAQ,IAAKC,KAAKN,SAAU,CAAEM,KAAKL,QAAU,KAAMM,uBAAsB,IAAMD,KAAKE,kB,GAC3FC,KAAO,KAAQH,KAAKL,QAAU,KAAK,EACnCS,OAAS,KACf,GAAIJ,KAAKL,QAAS,CAChBK,KAAKG,M,KACA,CACLH,KAAKD,M,GAID,cAAAG,GACN,IAAKF,KAAKH,aAAeG,KAAKF,SAAU,OACxC,MAAMO,EAAOL,KAAKH,WAAWS,wBAC7B,MAAQf,MAAOgB,EAAIC,OAAQC,GAAOT,KAAKF,SAASQ,wBAChD,MAAMI,EAAMC,EAAgBN,EAAME,EAAIE,EAAIT,KAAKR,UAAW,GAC1DQ,KAAKJ,WAAa,CAAEgB,IAAK,GAAGF,EAAIE,QAASC,KAAM,GAAGH,EAAIG,SAAUC,OAAQC,OAAOC,K,CAGjF,MAAAC,GACE,MAAMC,EAASlB,KAAKP,UAAY,QAAU,CAAE0B,aAAcnB,KAAKD,KAAMqB,aAAcpB,KAAKG,MAAS,CAAEkB,QAASrB,KAAKI,QACjH,OACEkB,EAAA,OAAAC,IAAA,2CAAKC,MAAM,gBAAiBN,GAC1BI,EAAA,OAAAC,IAAA,2CAAKE,IAAMC,IAAc1B,KAAKH,WAAa6B,CAAE,EAAKF,MAAM,uBAAsBF,EAAA,QAAAC,IAAA,8CAC7EvB,KAAKL,SACJ2B,EAAA,OAAAC,IAAA,2CAAKE,IAAMC,IAAc1B,KAAKF,SAAW4B,CAAE,EAAKF,MAAM,oBAAoBG,MAAO,IAAK3B,KAAKJ,WAAYL,MAAOS,KAAKT,OACjH4B,aAAc,IAAMnB,KAAKP,UAAY,SAAWO,KAAKD,OAAQqB,aAAc,IAAMpB,KAAKP,UAAY,SAAWO,KAAKG,QACjHH,KAAKV,OAASgC,EAAA,OAAAC,IAAA,2CAAKC,MAAM,qBAAqBxB,KAAKV,OACpDgC,EAAA,OAAAC,IAAA,2CAAKC,MAAM,oBAAmBF,EAAA,QAAAC,IAAA,2CAAMK,KAAK,c","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{r as e,c as t,g as i,h as r}from"./p-e42dfa95.js";import{c as o}from"./p-4ef5a884.js";const s='/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}::file-selector-button{appearance:button;background-color:#0000;border:0 solid;border-radius:0;box-sizing:border-box;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;margin:0;margin-inline-end:4px;opacity:1;padding:0}:host,html{-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);line-height:1.5;tab-size:4;-webkit-tap-highlight-color:transparent}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}button,input,optgroup,select,textarea{background-color:#0000;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex;padding-block:0}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}} /*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */@layer properties{}@layer base{}@layer components;:host{display:block}.hb-tree-select{box-sizing:border-box;color:var(--hb-color-text);font-size:var(--hb-font-size-base);position:relative;width:100%}.hb-tree-select__input-wrapper{align-items:center;background-color:var(--hb-color-bg-container);border:1px solid var(--hb-input-border-color,var(--hb-color-border));border-radius:var(--hb-input-radius,var(--hb-border-radius-sm));box-sizing:border-box;cursor:pointer;display:flex;height:var(--hb-size-default,32px);padding:0 var(--hb-spacing-sm);transition:border-color var(--hb-transition-duration,.2s)}.hb-tree-select__input-wrapper:hover{border-color:var(--hb-input-hover-border-color,var(--hb-color-primary))}.hb-tree-select--open .hb-tree-select__input-wrapper{border-color:var(--hb-input-focus-border-color,var(--hb-color-primary))}.hb-tree-select--disabled .hb-tree-select__input-wrapper{background-color:var(--hb-color-fill-tertiary);cursor:not-allowed;opacity:.6}.hb-tree-select__display{flex:1;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;white-space:nowrap}.hb-tree-select__display--placeholder{color:var(--hb-input-placeholder-color,var(--hb-color-text-placeholder))}.hb-tree-select__suffix{gap:var(--hb-spacing-xxs)}.hb-tree-select__clear,.hb-tree-select__suffix{align-items:center;color:var(--hb-color-text-tertiary);display:inline-flex}.hb-tree-select__clear{background-color:var(--hb-color-fill);border-radius:50%;cursor:pointer;font-size:12px;height:16px;justify-content:center;width:16px}.hb-tree-select__clear:hover{color:var(--hb-color-text-secondary)}.hb-tree-select__arrow-icon{font-size:10px;transition:transform var(--hb-transition-duration,.2s)}.hb-tree-select__arrow-icon--open{transform:rotate(180deg)}.hb-tree-select__dropdown{background-color:var(--hb-color-bg-elevated);border:1px solid var(--hb-color-border-secondary);border-radius:var(--hb-border-radius-sm);box-shadow:0 6px 16px #00000014;box-sizing:border-box;left:0;max-height:280px;overflow-y:auto;padding:var(--hb-spacing-xxs);position:absolute;top:calc(100% + 4px);width:100%;z-index:1050}.hb-tree-select__empty{color:var(--hb-color-text-tertiary);font-size:var(--hb-font-size-sm);padding:var(--hb-spacing-md);text-align:center}.hb-tree-select__children,.hb-tree-select__tree{list-style:none;margin:0;padding:0}.hb-tree-select__node{list-style:none;white-space:nowrap}.hb-tree-select__node-content{align-items:center;border-radius:var(--hb-border-radius-sm);box-sizing:border-box;cursor:pointer;display:flex;gap:var(--hb-spacing-xxs);height:28px;padding-right:var(--hb-spacing-xs);transition:background-color var(--hb-transition-duration,.2s)}.hb-tree-select__node-content:hover{background-color:var(--hb-color-fill-tertiary)}.hb-tree-select__node-content--selected{color:var(--hb-color-primary);font-weight:500}.hb-tree-select__node-content--checked,.hb-tree-select__node-content--selected{background-color:var(--hb-color-primary-bg)}.hb-tree-select__node--disabled>.hb-tree-select__node-content{cursor:not-allowed;opacity:.5}.hb-tree-select__node--disabled>.hb-tree-select__node-content:hover{background-color:#0000}.hb-tree-select__switcher{align-items:center;color:var(--hb-color-text-tertiary);display:inline-flex;flex-shrink:0;height:18px;justify-content:center;width:18px}.hb-tree-select__arrow{display:inline-block;font-size:10px;transition:transform var(--hb-transition-duration,.2s)}.hb-tree-select__arrow--expanded{transform:rotate(90deg)}.hb-tree-select__checkbox{align-items:center;background-color:var(--hb-color-bg-container);border:1px solid var(--hb-color-border);border-radius:var(--hb-border-radius-xs,2px);color:#fff;display:inline-flex;flex-shrink:0;font-size:11px;height:16px;justify-content:center;line-height:1;transition:all var(--hb-transition-duration,.2s);width:16px}.hb-tree-select__checkbox--checked,.hb-tree-select__checkbox:hover:not(.hb-tree-select__checkbox--disabled){border-color:var(--hb-color-primary)}.hb-tree-select__checkbox--checked{background-color:var(--hb-color-primary)}.hb-tree-select__checkbox--disabled{cursor:not-allowed}.hb-tree-select__title{flex:1;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;user-select:none}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}';const n=s;const a=class{constructor(i){e(this,i);this.hbChange=t(this,"hbChange",7);this.hbVisibleChange=t(this,"hbVisibleChange",7)}get el(){return i(this)}data=[];modelValue="";multiple=false;placeholder="请选择";disabled=false;checkable=false;defaultExpandAll=false;isOpen=false;internalExpanded=[];internalSelected=[];internalChecked=[];hbChange;hbVisibleChange;clickOutside=o({host:null,isOpen:()=>this.isOpen,onClose:()=>this.closeDropdown()});componentWillLoad(){this.syncFromModelValue();if(this.defaultExpandAll){const e=[];this.collectExpandableKeys(this.data,e);this.internalExpanded=e}}componentDidLoad(){this.clickOutside=o({host:this.el,isOpen:()=>this.isOpen,onClose:()=>this.closeDropdown()});this.clickOutside.connect()}disconnectedCallback(){this.clickOutside.disconnect()}syncFromModelValue(){if(this.multiple){const e=Array.isArray(this.modelValue)?this.modelValue:[];this.internalSelected=[...e];this.internalChecked=[...e]}else{const e=typeof this.modelValue==="string"?this.modelValue:"";this.internalSelected=e?[e]:[];this.internalChecked=e?[e]:[]}}collectExpandableKeys(e,t){for(const i of e){if(i.children&&i.children.length>0){t.push(i.key);this.collectExpandableKeys(i.children,t)}}}findTitle(e,t){for(const i of e){if(i.key===t)return i.title;if(i.children){const e=this.findTitle(i.children,t);if(e)return e}}return null}getDisplayText(){if(this.multiple){const e=Array.isArray(this.modelValue)?this.modelValue:[];if(e.length===0)return"";const t=e.map((e=>this.findTitle(this.data,e)||e));return t.join(" / ")}const e=typeof this.modelValue==="string"?this.modelValue:"";return e?this.findTitle(this.data,e)||e:""}openDropdown=()=>{if(this.disabled||this.isOpen)return;this.isOpen=true;this.hbVisibleChange.emit(true)};closeDropdown=()=>{if(!this.isOpen)return;this.isOpen=false;this.hbVisibleChange.emit(false)};toggleDropdown=()=>{if(this.disabled)return;if(this.isOpen)this.closeDropdown();else this.openDropdown()};handleNodeSelect=e=>{if(this.multiple){const t=[...this.internalSelected];const i=t.indexOf(e);if(i>=0)t.splice(i,1);else t.push(e);this.internalSelected=t;this.modelValue=t;this.hbChange.emit(t)}else{this.internalSelected=[e];this.modelValue=e;this.hbChange.emit(e);this.closeDropdown()}};handleNodeCheck=e=>{const t=[...this.internalChecked];const i=t.indexOf(e);if(i>=0)t.splice(i,1);else t.push(e);this.internalChecked=t;this.modelValue=t;this.hbChange.emit(t)};handleToggleExpand=(e,t)=>{t.stopPropagation();const i=[...this.internalExpanded];const r=i.indexOf(e.key);if(r>=0)i.splice(r,1);else i.push(e.key);this.internalExpanded=i};handleClear=e=>{e.stopPropagation();if(this.disabled)return;this.internalSelected=[];this.internalChecked=[];this.modelValue=this.multiple?[]:"";this.hbChange.emit(this.modelValue)};renderNode=(e,t)=>{const i=!!(e.children&&e.children.length>0);const o=this.internalExpanded.includes(e.key);const s=this.internalSelected.includes(e.key);const n=this.internalChecked.includes(e.key);const a=!!e.disabled;return r("li",{class:{"hb-tree-select__node":true,"hb-tree-select__node--disabled":a},role:"treeitem"},r("div",{class:{"hb-tree-select__node-content":true,"hb-tree-select__node-content--selected":s,"hb-tree-select__node-content--checked":n},style:{paddingLeft:`${t*18+8}px`}},r("span",{class:"hb-tree-select__switcher",onClick:t=>i&&this.handleToggleExpand(e,t)},i?r("span",{class:{"hb-tree-select__arrow":true,"hb-tree-select__arrow--expanded":o}},"▶"):null),this.checkable&&r("span",{class:{"hb-tree-select__checkbox":true,"hb-tree-select__checkbox--checked":n,"hb-tree-select__checkbox--disabled":a},onClick:()=>!a&&this.handleNodeCheck(e.key)},n?"✓":""),r("span",{class:"hb-tree-select__title",onClick:()=>!a&&this.handleNodeSelect(e.key)},e.title)),i&&o&&r("ul",{class:"hb-tree-select__children",role:"group"},e.children.map((e=>this.renderNode(e,t+1)))))};render(){const e=this.getDisplayText();const t=this.multiple?Array.isArray(this.modelValue)&&this.modelValue.length>0:typeof this.modelValue==="string"&&this.modelValue!=="";return r("div",{key:"38d8a150ce1436bbea77250dd0bb3a44b9722cbc",class:{"hb-tree-select":true,"hb-tree-select--open":this.isOpen,"hb-tree-select--disabled":this.disabled,"hb-tree-select--multiple":this.multiple}},r("div",{key:"5928b61ce45dabece866b8de93a4353804ed05e4",class:"hb-tree-select__input-wrapper",onClick:this.toggleDropdown},r("span",{key:"af7b313ec51033487044aa3b9ef1620fbe292490",class:{"hb-tree-select__display":true,"hb-tree-select__display--placeholder":!t}},t?e:this.placeholder),r("span",{key:"ab26baf601b42f2e5d28768d70927a38afbf612f",class:"hb-tree-select__suffix"},t&&r("span",{key:"0095371d8cdb31f569e53117a36d93de1f09b304",class:"hb-tree-select__clear",onClick:this.handleClear},"×"),r("span",{key:"b824565183607eb6341223fcfc0110b224d9d156",class:{"hb-tree-select__arrow-icon":true,"hb-tree-select__arrow-icon--open":this.isOpen}},"▼"))),this.isOpen&&r("div",{key:"e03726804631a7e69c86319f9f5ec81fecb60bf0",class:"hb-tree-select__dropdown"},this.data.length===0?r("div",{class:"hb-tree-select__empty"},"暂无数据"):r("ul",{class:"hb-tree-select__tree",role:"tree"},this.data.map((e=>this.renderNode(e,0))))))}};a.style=n;export{a as hb_tree_select};
2
- //# sourceMappingURL=p-3c7f73c8.entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["treeSelectCss","HbTreeSelectStyle0","TreeSelect","data","modelValue","multiple","placeholder","disabled","checkable","defaultExpandAll","isOpen","internalExpanded","internalSelected","internalChecked","hbChange","hbVisibleChange","clickOutside","createClickOutsideHandler","host","this","onClose","closeDropdown","componentWillLoad","syncFromModelValue","all","collectExpandableKeys","componentDidLoad","el","connect","disconnectedCallback","disconnect","arr","Array","isArray","single","nodes","out","node","children","length","push","key","findTitle","title","found","getDisplayText","titles","map","k","join","openDropdown","emit","toggleDropdown","handleNodeSelect","current","idx","indexOf","splice","handleNodeCheck","handleToggleExpand","e","stopPropagation","handleClear","renderNode","level","hasChildren","expanded","includes","selected","checked","h","class","role","style","paddingLeft","onClick","child","render","displayText","hasValue"],"sources":["src/components/TreeSelect/tree-select.css?tag=hb-tree-select&encapsulation=shadow","src/components/TreeSelect/TreeSelect.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.hb-tree-select {\n position: relative;\n width: 100%;\n font-size: var(--hb-font-size-base);\n color: var(--hb-color-text);\n box-sizing: border-box;\n}\n\n.hb-tree-select__input-wrapper {\n display: flex;\n align-items: center;\n height: var(--hb-size-default, 32px);\n padding: 0 var(--hb-spacing-sm);\n border: 1px solid var(--hb-input-border-color, var(--hb-color-border));\n border-radius: var(--hb-input-radius, var(--hb-border-radius-sm));\n background-color: var(--hb-color-bg-container);\n cursor: pointer;\n transition: border-color var(--hb-transition-duration, 0.2s);\n box-sizing: border-box;\n}\n\n.hb-tree-select__input-wrapper:hover {\n border-color: var(--hb-input-hover-border-color, var(--hb-color-primary));\n}\n\n.hb-tree-select--open .hb-tree-select__input-wrapper {\n border-color: var(--hb-input-focus-border-color, var(--hb-color-primary));\n}\n\n.hb-tree-select--disabled .hb-tree-select__input-wrapper {\n background-color: var(--hb-color-fill-tertiary);\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.hb-tree-select__display {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: none;\n}\n\n.hb-tree-select__display--placeholder {\n color: var(--hb-input-placeholder-color, var(--hb-color-text-placeholder));\n}\n\n.hb-tree-select__suffix {\n display: inline-flex;\n align-items: center;\n gap: var(--hb-spacing-xxs);\n color: var(--hb-color-text-tertiary);\n}\n\n.hb-tree-select__clear {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n font-size: 12px;\n border-radius: 50%;\n color: var(--hb-color-text-tertiary);\n background-color: var(--hb-color-fill);\n cursor: pointer;\n}\n\n.hb-tree-select__clear:hover {\n color: var(--hb-color-text-secondary);\n}\n\n.hb-tree-select__arrow-icon {\n font-size: 10px;\n transition: transform var(--hb-transition-duration, 0.2s);\n}\n\n.hb-tree-select__arrow-icon--open {\n transform: rotate(180deg);\n}\n\n.hb-tree-select__dropdown {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n width: 100%;\n max-height: 280px;\n overflow-y: auto;\n padding: var(--hb-spacing-xxs);\n background-color: var(--hb-color-bg-elevated);\n border: 1px solid var(--hb-color-border-secondary);\n border-radius: var(--hb-border-radius-sm);\n box-shadow: 0 6px 16px rgba(0, 0, 0, 0.08);\n box-sizing: border-box;\n z-index: 1050;\n}\n\n.hb-tree-select__empty {\n padding: var(--hb-spacing-md);\n text-align: center;\n color: var(--hb-color-text-tertiary);\n font-size: var(--hb-font-size-sm);\n}\n\n.hb-tree-select__tree,\n.hb-tree-select__children {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.hb-tree-select__node {\n list-style: none;\n white-space: nowrap;\n}\n\n.hb-tree-select__node-content {\n display: flex;\n align-items: center;\n gap: var(--hb-spacing-xxs);\n height: 28px;\n padding-right: var(--hb-spacing-xs);\n border-radius: var(--hb-border-radius-sm);\n cursor: pointer;\n transition: background-color var(--hb-transition-duration, 0.2s);\n box-sizing: border-box;\n}\n\n.hb-tree-select__node-content:hover {\n background-color: var(--hb-color-fill-tertiary);\n}\n\n.hb-tree-select__node-content--selected {\n background-color: var(--hb-color-primary-bg);\n color: var(--hb-color-primary);\n font-weight: 500;\n}\n\n.hb-tree-select__node-content--checked {\n background-color: var(--hb-color-primary-bg);\n}\n\n.hb-tree-select__node--disabled > .hb-tree-select__node-content {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.hb-tree-select__node--disabled > .hb-tree-select__node-content:hover {\n background-color: transparent;\n}\n\n.hb-tree-select__switcher {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n flex-shrink: 0;\n color: var(--hb-color-text-tertiary);\n}\n\n.hb-tree-select__arrow {\n font-size: 10px;\n display: inline-block;\n transition: transform var(--hb-transition-duration, 0.2s);\n}\n\n.hb-tree-select__arrow--expanded {\n transform: rotate(90deg);\n}\n\n.hb-tree-select__checkbox {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n border: 1px solid var(--hb-color-border);\n border-radius: var(--hb-border-radius-xs, 2px);\n background-color: var(--hb-color-bg-container);\n color: #fff;\n font-size: 11px;\n line-height: 1;\n flex-shrink: 0;\n transition: all var(--hb-transition-duration, 0.2s);\n}\n\n.hb-tree-select__checkbox:hover:not(.hb-tree-select__checkbox--disabled) {\n border-color: var(--hb-color-primary);\n}\n\n.hb-tree-select__checkbox--checked {\n background-color: var(--hb-color-primary);\n border-color: var(--hb-color-primary);\n}\n\n.hb-tree-select__checkbox--disabled {\n cursor: not-allowed;\n}\n\n.hb-tree-select__title {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: none;\n}\n","import { Component, h, Prop, Event, EventEmitter, State, Element } from '@stencil/core';\nimport { createClickOutsideHandler } from '../../utils/click-outside';\nimport type { TreeNode } from '../Tree/Tree';\n\n/**\n * TreeSelect 树形选择器\n * 类似 Select,但下拉选项以树形结构展示,支持单选与多选\n */\n@Component({\n tag: 'hb-tree-select',\n styleUrl: 'tree-select.css',\n shadow: true,\n})\nexport class TreeSelect {\n @Element() el: HTMLElement;\n\n /**\n * 可选项数据源(与 Tree 相同的递归树结构)\n */\n @Prop() data: TreeNode[] = [];\n\n /**\n * (受控)绑定值,单选为 string,多选为 string[]\n */\n @Prop({ mutable: true }) modelValue: string | string[] = '';\n\n /**\n * 是否多选\n * @default false\n */\n @Prop() multiple: boolean = false;\n\n /**\n * 占位文本\n * @default '请选择'\n */\n @Prop() placeholder: string = '请选择';\n\n /**\n * 是否禁用\n * @default false\n */\n @Prop() disabled: boolean = false;\n\n /**\n * 是否显示 checkbox(多选模式下推荐开启)\n * @default false\n */\n @Prop() checkable: boolean = false;\n\n /**\n * 是否默认展开全部节点\n * @default false\n */\n @Prop() defaultExpandAll: boolean = false;\n\n @State() isOpen: boolean = false;\n @State() internalExpanded: string[] = [];\n @State() internalSelected: string[] = [];\n @State() internalChecked: string[] = [];\n\n /**\n * 值变化事件(单选为 string,多选为 string[])\n */\n @Event() hbChange: EventEmitter<string | string[]>;\n\n /**\n * 下拉浮层显隐变化事件\n */\n @Event() hbVisibleChange: EventEmitter<boolean>;\n\n private clickOutside = createClickOutsideHandler({\n host: null as any,\n isOpen: () => this.isOpen,\n onClose: () => this.closeDropdown(),\n });\n\n componentWillLoad() {\n this.syncFromModelValue();\n if (this.defaultExpandAll) {\n const all: string[] = [];\n this.collectExpandableKeys(this.data, all);\n this.internalExpanded = all;\n }\n }\n\n componentDidLoad() {\n this.clickOutside = createClickOutsideHandler({\n host: this.el,\n isOpen: () => this.isOpen,\n onClose: () => this.closeDropdown(),\n });\n this.clickOutside.connect();\n }\n\n disconnectedCallback() {\n this.clickOutside.disconnect();\n }\n\n private syncFromModelValue() {\n if (this.multiple) {\n const arr = Array.isArray(this.modelValue) ? this.modelValue : [];\n this.internalSelected = [...arr];\n this.internalChecked = [...arr];\n } else {\n const single = typeof this.modelValue === 'string' ? this.modelValue : '';\n this.internalSelected = single ? [single] : [];\n this.internalChecked = single ? [single] : [];\n }\n }\n\n private collectExpandableKeys(nodes: TreeNode[], out: string[]) {\n for (const node of nodes) {\n if (node.children && node.children.length > 0) {\n out.push(node.key);\n this.collectExpandableKeys(node.children, out);\n }\n }\n }\n\n private findTitle(nodes: TreeNode[], key: string): string | null {\n for (const node of nodes) {\n if (node.key === key) return node.title;\n if (node.children) {\n const found = this.findTitle(node.children, key);\n if (found) return found;\n }\n }\n return null;\n }\n\n private getDisplayText(): string {\n if (this.multiple) {\n const arr = Array.isArray(this.modelValue) ? this.modelValue : [];\n if (arr.length === 0) return '';\n const titles = arr.map((k) => this.findTitle(this.data, k) || k);\n return titles.join(' / ');\n }\n const single = typeof this.modelValue === 'string' ? this.modelValue : '';\n return single ? this.findTitle(this.data, single) || single : '';\n }\n\n private openDropdown = () => {\n if (this.disabled || this.isOpen) return;\n this.isOpen = true;\n this.hbVisibleChange.emit(true);\n };\n\n private closeDropdown = () => {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.hbVisibleChange.emit(false);\n };\n\n private toggleDropdown = () => {\n if (this.disabled) return;\n if (this.isOpen) this.closeDropdown();\n else this.openDropdown();\n };\n\n private handleNodeSelect = (key: string) => {\n if (this.multiple) {\n const current = [...this.internalSelected];\n const idx = current.indexOf(key);\n if (idx >= 0) current.splice(idx, 1);\n else current.push(key);\n this.internalSelected = current;\n this.modelValue = current;\n this.hbChange.emit(current);\n } else {\n this.internalSelected = [key];\n this.modelValue = key;\n this.hbChange.emit(key);\n this.closeDropdown();\n }\n };\n\n private handleNodeCheck = (key: string) => {\n // TODO: 父子联动 —— 当前仅管理单个节点勾选状态。\n const current = [...this.internalChecked];\n const idx = current.indexOf(key);\n if (idx >= 0) current.splice(idx, 1);\n else current.push(key);\n this.internalChecked = current;\n this.modelValue = current;\n this.hbChange.emit(current);\n };\n\n private handleToggleExpand = (node: TreeNode, e: Event) => {\n e.stopPropagation();\n const current = [...this.internalExpanded];\n const idx = current.indexOf(node.key);\n if (idx >= 0) current.splice(idx, 1);\n else current.push(node.key);\n this.internalExpanded = current;\n };\n\n private handleClear = (e: Event) => {\n e.stopPropagation();\n if (this.disabled) return;\n this.internalSelected = [];\n this.internalChecked = [];\n this.modelValue = this.multiple ? [] : '';\n this.hbChange.emit(this.modelValue);\n };\n\n private renderNode = (node: TreeNode, level: number): any => {\n const hasChildren = !!(node.children && node.children.length > 0);\n const expanded = this.internalExpanded.includes(node.key);\n const selected = this.internalSelected.includes(node.key);\n const checked = this.internalChecked.includes(node.key);\n const disabled = !!node.disabled;\n\n return (\n <li class={{ 'hb-tree-select__node': true, 'hb-tree-select__node--disabled': disabled }} role=\"treeitem\">\n <div\n class={{\n 'hb-tree-select__node-content': true,\n 'hb-tree-select__node-content--selected': selected,\n 'hb-tree-select__node-content--checked': checked,\n }}\n style={{ paddingLeft: `${level * 18 + 8}px` }}\n >\n <span class=\"hb-tree-select__switcher\" onClick={(e) => hasChildren && this.handleToggleExpand(node, e)}>\n {hasChildren ? (\n <span class={{ 'hb-tree-select__arrow': true, 'hb-tree-select__arrow--expanded': expanded }}>▶</span>\n ) : null}\n </span>\n\n {this.checkable && (\n <span\n class={{\n 'hb-tree-select__checkbox': true,\n 'hb-tree-select__checkbox--checked': checked,\n 'hb-tree-select__checkbox--disabled': disabled,\n }}\n onClick={() => !disabled && this.handleNodeCheck(node.key)}\n >\n {checked ? '✓' : ''}\n </span>\n )}\n\n <span class=\"hb-tree-select__title\" onClick={() => !disabled && this.handleNodeSelect(node.key)}>\n {node.title}\n </span>\n </div>\n\n {hasChildren && expanded && (\n <ul class=\"hb-tree-select__children\" role=\"group\">\n {node.children!.map((child) => this.renderNode(child, level + 1))}\n </ul>\n )}\n </li>\n );\n };\n\n render() {\n const displayText = this.getDisplayText();\n const hasValue = this.multiple\n ? Array.isArray(this.modelValue) && this.modelValue.length > 0\n : typeof this.modelValue === 'string' && this.modelValue !== '';\n\n return (\n <div\n class={{\n 'hb-tree-select': true,\n 'hb-tree-select--open': this.isOpen,\n 'hb-tree-select--disabled': this.disabled,\n 'hb-tree-select--multiple': this.multiple,\n }}\n >\n <div class=\"hb-tree-select__input-wrapper\" onClick={this.toggleDropdown}>\n <span\n class={{\n 'hb-tree-select__display': true,\n 'hb-tree-select__display--placeholder': !hasValue,\n }}\n >\n {hasValue ? displayText : this.placeholder}\n </span>\n <span class=\"hb-tree-select__suffix\">\n {hasValue && (\n <span class=\"hb-tree-select__clear\" onClick={this.handleClear}>\n ×\n </span>\n )}\n <span class={{ 'hb-tree-select__arrow-icon': true, 'hb-tree-select__arrow-icon--open': this.isOpen }}>▼</span>\n </span>\n </div>\n\n {this.isOpen && (\n <div class=\"hb-tree-select__dropdown\">\n {this.data.length === 0 ? (\n <div class=\"hb-tree-select__empty\">暂无数据</div>\n ) : (\n <ul class=\"hb-tree-select__tree\" role=\"tree\">\n {this.data.map((node) => this.renderNode(node, 0))}\n </ul>\n )}\n </div>\n )}\n </div>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["paginationCss","HbPaginationStyle0","Pagination","total","pageSize","currentPage","pageSizes","pagerCount","disabled","showTotal","showPageSize","internalCurrent","hbCurrentChange","hbSizeChange","handleCurrentPageChange","this","componentDidLoad","totalPages","Math","max","ceil","handlePageClick","page","emit","handleSizeChange","e","target","size","parseInt","value","getPages","pages","current","pager","i","push","half","floor","start","end","min","render","h","key","class","onChange","map","selected","type","onClick"],"sources":["src/components/Pagination/pagination.css?tag=hb-pagination&encapsulation=shadow","src/components/Pagination/Pagination.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.hb-pagination {\n display: flex;\n align-items: center;\n gap: var(--hb-spacing-xxs);\n font-size: var(--hb-font-size-sm);\n color: var(--hb-color-text);\n user-select: none;\n}\n\n.hb-pagination--disabled {\n opacity: 0.5;\n pointer-events: none;\n}\n\n.hb-pagination__total {\n margin-right: var(--hb-spacing-xs);\n color: var(--hb-color-text-secondary);\n}\n\n.hb-pagination__sizes {\n height: 28px;\n padding: 0 var(--hb-spacing-xs);\n border: 1px solid var(--hb-color-border);\n border-radius: var(--hb-border-radius-sm);\n background: var(--hb-color-bg);\n color: var(--hb-color-text);\n font-size: var(--hb-font-size-sm);\n cursor: pointer;\n outline: none;\n margin-right: var(--hb-spacing-xs);\n}\n\n.hb-pagination__sizes:focus {\n border-color: var(--hb-color-primary);\n}\n\n.hb-pagination__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 28px;\n padding: 0 4px;\n border: 1px solid var(--hb-color-border);\n border-radius: var(--hb-border-radius-sm);\n background: var(--hb-color-bg);\n color: var(--hb-color-text);\n font-size: var(--hb-font-size-sm);\n cursor: pointer;\n outline: none;\n transition: all var(--hb-transition-duration) var(--hb-transition-function);\n}\n\n.hb-pagination__btn:hover:not(:disabled):not(.hb-pagination__btn--active) {\n color: var(--hb-color-primary);\n border-color: var(--hb-color-primary);\n}\n\n.hb-pagination__btn:disabled {\n color: var(--hb-color-text-disabled);\n cursor: not-allowed;\n background: var(--hb-color-fill-quaternary);\n}\n\n.hb-pagination__btn--active {\n background-color: var(--hb-color-primary);\n border-color: var(--hb-color-primary);\n color: #fff;\n}\n\n.hb-pagination__ellipsis {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 28px;\n color: var(--hb-color-text-secondary);\n letter-spacing: 2px;\n}\n","import { Component, h, Prop, Event, EventEmitter, State, Watch } from '@stencil/core';\n\n/**\n * Pagination 分页组件\n * 当数据量过多时,使用分页分解数据\n */\n@Component({\n tag: 'hb-pagination',\n styleUrl: 'pagination.css',\n shadow: true,\n})\nexport class Pagination {\n /** 总条目数 */\n @Prop() total: number = 0;\n\n /** 每页显示条目数 */\n @Prop() pageSize: number = 10;\n\n /** 当前页数 */\n @Prop({ mutable: true }) currentPage: number = 1;\n\n /** 每页显示个数选择器的选项设置 */\n @Prop() pageSizes: number[] = [10, 20, 50, 100];\n\n /** 最大页码按钮数 */\n @Prop() pagerCount: number = 7;\n\n /** 是否禁用 */\n @Prop() disabled: boolean = false;\n\n /** 是否显示总条数 */\n @Prop() showTotal: boolean = false;\n\n /** 是否显示每页条数选择器 */\n @Prop() showPageSize: boolean = false;\n\n @State() internalCurrent: number = 1;\n\n /** 当前页改变事件 */\n @Event() hbCurrentChange: EventEmitter<number>;\n\n /** 每页条数改变事件 */\n @Event() hbSizeChange: EventEmitter<number>;\n\n @Watch('currentPage')\n handleCurrentPageChange() {\n this.internalCurrent = this.currentPage;\n }\n\n componentDidLoad() {\n this.internalCurrent = this.currentPage;\n }\n\n private get totalPages(): number {\n return Math.max(1, Math.ceil(this.total / this.pageSize));\n }\n\n private handlePageClick(page: number) {\n if (this.disabled || page === this.internalCurrent || page < 1 || page > this.totalPages) return;\n this.internalCurrent = page;\n this.currentPage = page;\n this.hbCurrentChange.emit(page);\n }\n\n private handleSizeChange(e: Event) {\n const target = e.target as HTMLSelectElement;\n const size = parseInt(target.value, 10);\n this.hbSizeChange.emit(size);\n this.internalCurrent = 1;\n this.currentPage = 1;\n this.hbCurrentChange.emit(1);\n }\n\n private getPages(): (number | '...')[] {\n const pages: (number | '...')[] = [];\n const total = this.totalPages;\n const current = this.internalCurrent;\n const pager = this.pagerCount;\n\n if (total <= pager) {\n for (let i = 1; i <= total; i++) pages.push(i);\n return pages;\n }\n\n const half = Math.floor((pager - 2) / 2);\n let start = current - half;\n let end = current + half;\n\n if (start < 2) {\n start = 2;\n end = Math.min(pager - 1, total - 1);\n }\n if (end > total - 1) {\n end = total - 1;\n start = Math.max(2, total - pager + 2);\n }\n\n pages.push(1);\n if (start > 2) pages.push('...');\n for (let i = start; i <= end; i++) pages.push(i);\n if (end < total - 1) pages.push('...');\n pages.push(total);\n\n return pages;\n }\n\n render() {\n const pages = this.getPages();\n\n return (\n <div class={{ 'hb-pagination': true, 'hb-pagination--disabled': this.disabled }}>\n {this.showTotal && (\n <span class=\"hb-pagination__total\">共 {this.total} 条</span>\n )}\n\n {this.showPageSize && (\n <select class=\"hb-pagination__sizes\" onChange={this.handleSizeChange} disabled={this.disabled}>\n {this.pageSizes.map(size => (\n <option value={size} selected={size === this.pageSize}>{size} 条/页</option>\n ))}\n </select>\n )}\n\n <button\n type=\"button\"\n class=\"hb-pagination__btn hb-pagination__prev\"\n disabled={this.disabled || this.internalCurrent <= 1}\n onClick={() => this.handlePageClick(this.internalCurrent - 1)}\n >\n ‹\n </button>\n\n {pages.map(page =>\n page === '...' ? (\n <span class=\"hb-pagination__ellipsis\">...</span>\n ) : (\n <button\n type=\"button\"\n class={{\n 'hb-pagination__btn': true,\n 'hb-pagination__btn--active': page === this.internalCurrent,\n }}\n disabled={this.disabled}\n onClick={() => this.handlePageClick(page as number)}\n >\n {page}\n </button>\n )\n )}\n\n <button\n type=\"button\"\n class=\"hb-pagination__btn hb-pagination__next\"\n disabled={this.disabled || this.internalCurrent >= this.totalPages}\n onClick={() => this.handlePageClick(this.internalCurrent + 1)}\n >\n ›\n </button>\n </div>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{r as t,c as e,g as i,h as o}from"./p-e42dfa95.js";const r='/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}::file-selector-button{appearance:button;background-color:#0000;border:0 solid;border-radius:0;box-sizing:border-box;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;margin:0;margin-inline-end:4px;opacity:1;padding:0}:host,html{-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);line-height:1.5;tab-size:4;-webkit-tap-highlight-color:transparent}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}button,input,optgroup,select,textarea{background-color:#0000;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex;padding-block:0}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}} /*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */@layer properties{}@layer base{}@layer components;:host{--hb-slider-main-bg-color:var(--hb-color-primary);--hb-slider-runway-bg-color:var(--hb-fill-color-light,#e4e7ed);--hb-slider-stop-bg-color:var(--hb-color-white,#fff);--hb-slider-button-size:20px;display:inline-block}.hb-slider{align-items:center;display:flex;height:40px;position:relative;width:100%}.hb-slider--vertical{flex-direction:column;height:100%;width:40px}.hb-slider__runway{background-color:var(--hb-slider-runway-bg-color);border-radius:3px;cursor:pointer;height:6px;margin:16px 0;position:relative;vertical-align:middle;width:100%}.hb-slider--vertical .hb-slider__runway{height:100%;margin:0 16px;width:6px}.hb-slider__bar{background-color:var(--hb-slider-main-bg-color);border-bottom-left-radius:3px;border-top-left-radius:3px;height:6px;left:0;position:absolute;top:0}.hb-slider--vertical .hb-slider__bar{border-bottom-left-radius:0;border-top-left-radius:3px;border-top-right-radius:3px;bottom:0;height:auto;top:auto;width:6px}.hb-slider__button-wrapper{background-color:#0000;margin-left:calc(var(--hb-slider-button-size)/-2);outline:none;position:absolute;text-align:center;top:50%;transform:translateY(-50%);-webkit-user-select:none;user-select:none;z-index:1001}.hb-slider--vertical .hb-slider__button-wrapper{bottom:0;left:50%;margin-bottom:calc(var(--hb-slider-button-size)/-2);margin-left:0;top:auto;transform:translate(-50%)}.hb-slider__button{background-color:var(--hb-color-white,#fff);border:2px solid var(--hb-slider-main-bg-color);border-radius:50%;cursor:grab;height:var(--hb-slider-button-size);transition:all .2s;-webkit-user-select:none;user-select:none;width:var(--hb-slider-button-size)}.hb-slider__button:active{cursor:grabbing}.hb-slider__button-wrapper--hover .hb-slider__button,.hb-slider__button-wrapper:hover .hb-slider__button{transform:scale(1.2)}.hb-slider__tooltip{background-color:#000000bf;border-radius:4px;bottom:calc(100% + 12px);color:var(--hb-color-white,#fff);font-size:12px;padding:6px 8px;white-space:nowrap}.hb-slider__tooltip,.hb-slider__tooltip:after{left:50%;position:absolute;transform:translate(-50%)}.hb-slider__tooltip:after{border:4px solid #0000;border-top-color:#000000bf;content:"";top:100%}.hb-slider--disabled{cursor:not-allowed}.hb-slider--disabled .hb-slider__runway{background-color:var(--hb-fill-color-light,#e4e7ed);cursor:not-allowed}.hb-slider--disabled .hb-slider__bar{background-color:var(--hb-color-text-disabled,#c0c4cc)}.hb-slider--disabled .hb-slider__button{border-color:var(--hb-color-text-disabled,#c0c4cc);cursor:not-allowed}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}';const s=r;const a=class{constructor(i){t(this,i);this.hbChange=e(this,"hbChange",7);this.hbInput=e(this,"hbInput",7)}get el(){return i(this)}modelValue=0;min=0;max=100;step=1;showTooltip=true;formatTooltip;disabled=false;range=false;vertical=false;height;dragging=false;currentValue=0;tooltipVisible=false;tooltipValue=0;sliderRef;isDragging=false;hbChange;hbInput;componentDidLoad(){this.currentValue=this.modelValue;this.addEventListeners()}disconnectedCallback(){this.removeEventListeners()}addEventListeners(){document.addEventListener("mousemove",this.handleMouseMove);document.addEventListener("mouseup",this.handleMouseUp)}removeEventListeners(){document.removeEventListener("mousemove",this.handleMouseMove);document.removeEventListener("mouseup",this.handleMouseUp)}getPercentage(t){return(t-this.min)/(this.max-this.min)*100}getValueFromPercentage(t){const e=this.min+t/100*(this.max-this.min);return Math.round(e/this.step)*this.step}handleMouseDown=t=>{if(this.disabled)return;t.preventDefault();this.isDragging=true;this.dragging=true;this.handleDrag(t)};handleMouseMove=t=>{if(!this.isDragging)return;this.handleDrag(t)};handleMouseUp=()=>{if(!this.isDragging)return;this.isDragging=false;this.dragging=false;this.tooltipVisible=false;this.hbChange.emit(this.currentValue)};handleDrag(t){if(!this.sliderRef)return;const e=this.sliderRef.getBoundingClientRect();const i=this.vertical?1-(t.clientY-e.top)/e.height:(t.clientX-e.left)/e.width;const o=Math.max(0,Math.min(100,i*100));const r=this.getValueFromPercentage(o);if(this.range){const t=this.currentValue;this.currentValue=[r,t[1]||this.max]}else{this.currentValue=r;this.tooltipValue=r;this.tooltipVisible=true}this.modelValue=this.currentValue;this.hbInput.emit(this.currentValue)}formatValue(t){if(this.formatTooltip){return this.formatTooltip(t)}return String(t)}render(){const t=this.range?this.getPercentage(this.currentValue[0]):this.getPercentage(this.currentValue);return o("div",{key:"b8ee15c3375f6786c252e6755ff6dd5d4ab0023f",class:{"hb-slider":true,"hb-slider--vertical":this.vertical,"hb-slider--disabled":this.disabled},style:this.vertical&&this.height?{height:this.height}:undefined},o("div",{key:"c75f1194e3a8a630d4ffa0cb82579fddc42e2461",class:"hb-slider__runway",ref:t=>this.sliderRef=t,onMouseDown:this.handleMouseDown},o("div",{key:"5dcf4d4807e85cd4a96fd919d4b9d999f0d837d7",class:"hb-slider__bar",style:{[this.vertical?"height":"width"]:`${t}%`,[this.vertical?"bottom":"left"]:"0"}}),o("div",{key:"e10dc431c839183de585debfd9991a2d75922cc9",class:{"hb-slider__button-wrapper":true,"hb-slider__button-wrapper--hover":this.tooltipVisible},style:{[this.vertical?"bottom":"left"]:`${t}%`}},this.showTooltip&&this.tooltipVisible&&o("div",{key:"270c0d8dd46b03fac7b4b8e62265a14158de18b7",class:"hb-slider__tooltip"},this.formatValue(this.tooltipValue)),o("div",{key:"20772f2a08bed8c009c119b1c148ff0448c9a288",class:"hb-slider__button"}))))}};a.style=s;export{a as hb_slider};
2
- //# sourceMappingURL=p-44c48246.entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["sliderCss","HbSliderStyle0","Slider","modelValue","min","max","step","showTooltip","formatTooltip","disabled","range","vertical","height","dragging","currentValue","tooltipVisible","tooltipValue","sliderRef","isDragging","hbChange","hbInput","componentDidLoad","this","addEventListeners","disconnectedCallback","removeEventListeners","document","addEventListener","handleMouseMove","handleMouseUp","removeEventListener","getPercentage","value","getValueFromPercentage","percentage","Math","round","handleMouseDown","e","preventDefault","handleDrag","emit","rect","getBoundingClientRect","clientY","top","clientX","left","width","clampedPercentage","values","formatValue","String","render","h","key","class","style","undefined","ref","el","onMouseDown"],"sources":["src/components/Slider/slider.css?tag=hb-slider&encapsulation=shadow","src/components/Slider/Slider.tsx"],"sourcesContent":[":host {\n display: inline-block;\n --hb-slider-main-bg-color: var(--hb-color-primary);\n --hb-slider-runway-bg-color: var(--hb-fill-color-light, #e4e7ed);\n --hb-slider-stop-bg-color: var(--hb-color-white, #ffffff);\n --hb-slider-button-size: 20px;\n}\n\n.hb-slider {\n width: 100%;\n height: 40px;\n display: flex;\n align-items: center;\n position: relative;\n}\n\n.hb-slider--vertical {\n width: 40px;\n height: 100%;\n flex-direction: column;\n}\n\n.hb-slider__runway {\n width: 100%;\n height: 6px;\n margin: 16px 0;\n background-color: var(--hb-slider-runway-bg-color);\n border-radius: 3px;\n position: relative;\n cursor: pointer;\n vertical-align: middle;\n}\n\n.hb-slider--vertical .hb-slider__runway {\n width: 6px;\n height: 100%;\n margin: 0 16px;\n}\n\n.hb-slider__bar {\n height: 6px;\n background-color: var(--hb-slider-main-bg-color);\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n position: absolute;\n top: 0;\n left: 0;\n}\n\n.hb-slider--vertical .hb-slider__bar {\n width: 6px;\n height: auto;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n border-bottom-left-radius: 0;\n bottom: 0;\n top: auto;\n}\n\n.hb-slider__button-wrapper {\n position: absolute;\n z-index: 1001;\n top: 50%;\n transform: translateY(-50%);\n background-color: transparent;\n text-align: center;\n user-select: none;\n outline: none;\n margin-left: calc(var(--hb-slider-button-size) / -2);\n}\n\n.hb-slider--vertical .hb-slider__button-wrapper {\n left: 50%;\n top: auto;\n bottom: 0;\n transform: translateX(-50%);\n margin-left: 0;\n margin-bottom: calc(var(--hb-slider-button-size) / -2);\n}\n\n.hb-slider__button {\n width: var(--hb-slider-button-size);\n height: var(--hb-slider-button-size);\n background-color: var(--hb-color-white, #ffffff);\n border: 2px solid var(--hb-slider-main-bg-color);\n border-radius: 50%;\n transition: 0.2s;\n user-select: none;\n cursor: grab;\n}\n\n.hb-slider__button:active {\n cursor: grabbing;\n}\n\n.hb-slider__button-wrapper:hover .hb-slider__button,\n.hb-slider__button-wrapper--hover .hb-slider__button {\n transform: scale(1.2);\n}\n\n.hb-slider__tooltip {\n position: absolute;\n bottom: calc(100% + 12px);\n left: 50%;\n transform: translateX(-50%);\n padding: 6px 8px;\n background-color: rgba(0, 0, 0, 0.75);\n color: var(--hb-color-white, #ffffff);\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n}\n\n.hb-slider__tooltip::after {\n content: '';\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 4px solid transparent;\n border-top-color: rgba(0, 0, 0, 0.75);\n}\n\n.hb-slider--disabled {\n cursor: not-allowed;\n}\n\n.hb-slider--disabled .hb-slider__runway {\n cursor: not-allowed;\n background-color: var(--hb-fill-color-light, #e4e7ed);\n}\n\n.hb-slider--disabled .hb-slider__bar {\n background-color: var(--hb-color-text-disabled, #c0c4cc);\n}\n\n.hb-slider--disabled .hb-slider__button {\n border-color: var(--hb-color-text-disabled, #c0c4cc);\n cursor: not-allowed;\n}\n\n","import { Component, h, Prop, Event, EventEmitter, State, Element } from '@stencil/core';\n\n/**\n * Slider 滑块组件\n * 通过拖动滑块在一个固定区间内进行选择\n */\n@Component({\n tag: 'hb-slider',\n styleUrl: 'slider.css',\n shadow: true,\n})\nexport class Slider {\n @Element() el: HTMLElement;\n\n /**\n * 绑定值\n */\n @Prop({ mutable: true }) modelValue: number | number[] = 0;\n\n /**\n * 最小值\n * @default 0\n */\n @Prop() min: number = 0;\n\n /**\n * 最大值\n * @default 100\n */\n @Prop() max: number = 100;\n\n /**\n * 步长\n * @default 1\n */\n @Prop() step: number = 1;\n\n /**\n * 是否显示工具提示\n * @default true\n */\n @Prop() showTooltip: boolean = true;\n\n /**\n * 格式化 tooltip message\n */\n @Prop() formatTooltip?: (value: number) => string;\n\n /**\n * 是否禁用\n * @default false\n */\n @Prop() disabled: boolean = false;\n\n /**\n * 是否为范围选择\n * @default false\n */\n @Prop() range: boolean = false;\n\n /**\n * 是否竖向模式\n * @default false\n */\n @Prop() vertical: boolean = false;\n\n /**\n * 高度,竖向模式时必填\n */\n @Prop() height?: string;\n\n @State() dragging: boolean = false;\n @State() currentValue: number | number[] = 0;\n @State() tooltipVisible: boolean = false;\n @State() tooltipValue: number = 0;\n\n private sliderRef?: HTMLDivElement;\n private isDragging: boolean = false;\n\n /**\n * 值改变事件\n */\n @Event() hbChange: EventEmitter<number | number[]>;\n\n /**\n * 值改变事件(拖拽时实时触发)\n */\n @Event() hbInput: EventEmitter<number | number[]>;\n\n componentDidLoad() {\n this.currentValue = this.modelValue;\n this.addEventListeners();\n }\n\n disconnectedCallback() {\n this.removeEventListeners();\n }\n\n private addEventListeners() {\n document.addEventListener('mousemove', this.handleMouseMove);\n document.addEventListener('mouseup', this.handleMouseUp);\n }\n\n private removeEventListeners() {\n document.removeEventListener('mousemove', this.handleMouseMove);\n document.removeEventListener('mouseup', this.handleMouseUp);\n }\n\n private getPercentage(value: number): number {\n return ((value - this.min) / (this.max - this.min)) * 100;\n }\n\n private getValueFromPercentage(percentage: number): number {\n const value = this.min + (percentage / 100) * (this.max - this.min);\n return Math.round(value / this.step) * this.step;\n }\n\n private handleMouseDown = (e: MouseEvent) => {\n if (this.disabled) return;\n e.preventDefault();\n this.isDragging = true;\n this.dragging = true;\n this.handleDrag(e);\n };\n\n private handleMouseMove = (e: MouseEvent) => {\n if (!this.isDragging) return;\n this.handleDrag(e);\n };\n\n private handleMouseUp = () => {\n if (!this.isDragging) return;\n this.isDragging = false;\n this.dragging = false;\n this.tooltipVisible = false;\n this.hbChange.emit(this.currentValue);\n };\n\n private handleDrag(e: MouseEvent) {\n if (!this.sliderRef) return;\n\n const rect = this.sliderRef.getBoundingClientRect();\n const percentage = this.vertical\n ? 1 - (e.clientY - rect.top) / rect.height\n : (e.clientX - rect.left) / rect.width;\n \n const clampedPercentage = Math.max(0, Math.min(100, percentage * 100));\n const value = this.getValueFromPercentage(clampedPercentage);\n\n if (this.range) {\n const values = this.currentValue as number[];\n // 简化处理:更新第一个值\n this.currentValue = [value, values[1] || this.max];\n } else {\n this.currentValue = value;\n this.tooltipValue = value;\n this.tooltipVisible = true;\n }\n\n this.modelValue = this.currentValue;\n this.hbInput.emit(this.currentValue);\n }\n\n private formatValue(value: number): string {\n if (this.formatTooltip) {\n return this.formatTooltip(value);\n }\n return String(value);\n }\n\n render() {\n const percentage = this.range\n ? this.getPercentage((this.currentValue as number[])[0])\n : this.getPercentage(this.currentValue as number);\n\n return (\n <div\n class={{\n 'hb-slider': true,\n 'hb-slider--vertical': this.vertical,\n 'hb-slider--disabled': this.disabled,\n }}\n style={this.vertical && this.height ? { height: this.height } : undefined}\n >\n <div\n class=\"hb-slider__runway\"\n ref={(el) => (this.sliderRef = el)}\n onMouseDown={this.handleMouseDown}\n >\n <div\n class=\"hb-slider__bar\"\n style={{\n [this.vertical ? 'height' : 'width']: `${percentage}%`,\n [this.vertical ? 'bottom' : 'left']: '0',\n }}\n ></div>\n <div\n class={{\n 'hb-slider__button-wrapper': true,\n 'hb-slider__button-wrapper--hover': this.tooltipVisible,\n }}\n style={{\n [this.vertical ? 'bottom' : 'left']: `${percentage}%`,\n }}\n >\n {this.showTooltip && this.tooltipVisible && (\n <div class=\"hb-slider__tooltip\">\n {this.formatValue(this.tooltipValue)}\n </div>\n )}\n <div class=\"hb-slider__button\"></div>\n </div>\n </div>\n </div>\n );\n }\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["descriptionsCss","HbDescriptionsStyle0","Descriptions","title","border","column","colon","items","render","h","key","class","this","style","gridTemplateColumns","map","item","span","gridColumn","undefined","label","value"],"sources":["src/components/Descriptions/descriptions.css?tag=hb-descriptions&encapsulation=shadow","src/components/Descriptions/Descriptions.tsx"],"sourcesContent":[":host { display: block; }\n.hb-descriptions {\n font-size: var(--hb-font-size-sm);\n color: var(--hb-color-text);\n background: var(--hb-color-bg-container);\n border-radius: var(--hb-border-radius-sm);\n}\n.hb-descriptions__title {\n font-size: var(--hb-font-size-lg);\n font-weight: 600;\n color: var(--hb-color-text-primary);\n margin-bottom: var(--hb-spacing-sm);\n}\n.hb-descriptions__view { width: 100%; }\n.hb-descriptions__row {\n display: grid;\n gap: 0;\n width: 100%;\n}\n.hb-descriptions__item {\n display: flex;\n padding: var(--hb-spacing-sm) var(--hb-spacing-md);\n border-bottom: 1px solid var(--hb-color-border-secondary);\n}\n.hb-descriptions__row .hb-descriptions__item:nth-last-child(-n+3):not(:nth-last-child(1)) {\n /* 保留默认下边框,最后一项由下方规则移除 */\n}\n/* 简化:最后一个 item 无下边框 */\n.hb-descriptions__row .hb-descriptions__item:last-child { border-bottom: none; }\n\n.hb-descriptions__label {\n color: var(--hb-color-text-secondary);\n white-space: nowrap;\n margin-right: var(--hb-spacing-sm);\n flex-shrink: 0;\n}\n.hb-descriptions__colon { margin-left: 0; }\n.hb-descriptions__value {\n color: var(--hb-color-text);\n word-break: break-all;\n}\n\n/* 带边框样式 */\n.hb-descriptions--bordered {\n border: 1px solid var(--hb-color-border-secondary);\n overflow: hidden;\n}\n.hb-descriptions--bordered .hb-descriptions__title { padding: var(--hb-spacing-sm) var(--hb-spacing-md); margin-bottom: 0; border-bottom: 1px solid var(--hb-color-border-secondary); }\n.hb-descriptions--bordered .hb-descriptions__item { border-right: 1px solid var(--hb-color-border-secondary); }\n.hb-descriptions--bordered .hb-descriptions__item:nth-child(3n) { border-right: none; }\n.hb-descriptions--bordered .hb-descriptions__item { padding: var(--hb-spacing-sm) var(--hb-spacing-md); }\n.hb-descriptions--bordered .hb-descriptions__item:last-child { border-bottom: none; }\n","import { Component, h, Prop } from '@stencil/core';\n\n/**\n * Descriptions 描述列表组件\n * 成组展示多个描述字段,支持列数、边框、冒号、跨列 span\n */\n@Component({ tag: 'hb-descriptions', styleUrl: 'descriptions.css', shadow: true })\nexport class Descriptions {\n /** 标题 */\n @Prop() title: string = '';\n\n /** 是否带边框 */\n @Prop() border: boolean = false;\n\n /** 每行列数 */\n @Prop() column: number = 3;\n\n /** 是否显示冒号 */\n @Prop() colon: boolean = true;\n\n /** 描述项数组 */\n @Prop() items: DescriptionItem[] = [];\n\n render() {\n return (\n <div class={{ 'hb-descriptions': true, 'hb-descriptions--bordered': this.border }}>\n {this.title && <div class=\"hb-descriptions__title\">{this.title}</div>}\n <div class=\"hb-descriptions__view\">\n <div class=\"hb-descriptions__row\" style={{ gridTemplateColumns: `repeat(${this.column}, minmax(0, 1fr))` }}>\n {this.items.map((item) => (\n <div\n class=\"hb-descriptions__item\"\n style={item.span ? { gridColumn: `span ${item.span}` } : undefined}\n >\n <span class=\"hb-descriptions__label\">\n {item.label}\n {this.colon && <span class=\"hb-descriptions__colon\">:</span>}\n </span>\n <span class=\"hb-descriptions__value\">{item.value}</span>\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n}\n\nexport interface DescriptionItem {\n label: string;\n value: string;\n span?: number;\n}\n"],"mappings":"2CAAA,MAAMA,EAAkB,ipOACxB,MAAAC,EAAeD,E,MCMFE,EAAY,M,yBAEfC,MAAgB,GAGhBC,OAAkB,MAGlBC,OAAiB,EAGjBC,MAAiB,KAGjBC,MAA2B,GAEnC,MAAAC,GACE,OACEC,EAAA,OAAAC,IAAA,2CAAKC,MAAO,CAAE,kBAAmB,KAAM,4BAA6BC,KAAKR,SACtEQ,KAAKT,OAASM,EAAA,OAAAC,IAAA,2CAAKC,MAAM,0BAA0BC,KAAKT,OACzDM,EAAA,OAAAC,IAAA,2CAAKC,MAAM,yBACTF,EAAA,OAAAC,IAAA,2CAAKC,MAAM,uBAAuBE,MAAO,CAAEC,oBAAqB,UAAUF,KAAKP,4BAC5EO,KAAKL,MAAMQ,KAAKC,GACfP,EAAA,OACEE,MAAM,wBACNE,MAAOG,EAAKC,KAAO,CAAEC,WAAY,QAAQF,EAAKC,QAAWE,WAEzDV,EAAA,QAAME,MAAM,0BACTK,EAAKI,MACLR,KAAKN,OAASG,EAAA,QAAME,MAAM,0BAAwB,MAErDF,EAAA,QAAME,MAAM,0BAA0BK,EAAKK,Y","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{r as e,g as a,h as b}from"./p-e42dfa95.js";const r=class{constructor(a){e(this,a)}get el(){return a(this)}href;render(){const e=this.href?"a":"span";const a=this.el.closest("hb-breadcrumb")?.separator;return b("span",{key:"f9ced0c34ef309a1240258786b4ecba3055caeed",class:"hb-breadcrumb-item"},b(e,{key:"2218776bb05edeba450f3ecaa23c6602f4ff3480",class:"hb-breadcrumb-item__inner",href:this.href},b("slot",{key:"5598e7b2fbd95c16b5ad5456f36c97e708104cf9"})),b("span",{key:"fcb0f6f10b2707a8d1d3d882e80854b0b24cb665",class:"hb-breadcrumb-item__separator"},b("slot",{key:"502eec59718fdd8391132d2395bc4d4420e851b1",name:"separator"},a??"/")))}};export{r as hb_breadcrumb_item};
2
- //# sourceMappingURL=p-4d0dff15.entry.js.map
@@ -1,2 +0,0 @@
1
- import{r as e,c as t,g as i,h as o}from"./p-e42dfa95.js";import{c as s}from"./p-4ef5a884.js";import{h as r}from"./p-cc0aeb50.js";const a='/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{border:0 solid;box-sizing:border-box;margin:0;padding:0}::file-selector-button{appearance:button;background-color:#0000;border:0 solid;border-radius:0;box-sizing:border-box;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;margin:0;margin-inline-end:4px;opacity:1;padding:0}:host,html{-webkit-text-size-adjust:100%;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);line-height:1.5;tab-size:4;-webkit-tap-highlight-color:transparent}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-size:1em;font-variation-settings:var(--default-mono-font-variation-settings,normal)}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}button,input,optgroup,select,textarea{background-color:#0000;border-radius:0;color:inherit;font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex;padding-block:0}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}} /*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */@layer properties{}@layer base{}@layer components;:host{--hb-select-font-size:14px;--hb-select-height:32px;--hb-select-border-color:var(--hb-border-color,#dcdfe6);--hb-select-border-color-hover:var(--hb-color-primary);--hb-select-bg-color:var(--hb-color-white,#fff);--hb-select-text-color:var(--hb-color-text-regular,#606266);--hb-select-placeholder-color:var(--hb-color-text-placeholder,#c0c4cc);display:inline-block;position:relative}.hb-select{display:inline-block;position:relative;width:240px}.hb-select__input-wrapper{position:relative}.hb-select__input,.hb-select__input-wrapper{cursor:pointer;display:inline-block;width:100%}.hb-select__input{background-color:var(--hb-select-bg-color);border:1px solid var(--hb-select-border-color);border-radius:4px;box-sizing:border-box;color:var(--hb-select-text-color);font-size:var(--hb-select-font-size);height:var(--hb-select-height);line-height:var(--hb-select-height);outline:none;padding:0 30px 0 15px;transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.hb-select__input::placeholder{color:var(--hb-select-placeholder-color)}.hb-select__input:focus,.hb-select__input:hover:not(:disabled){border-color:var(--hb-select-border-color-hover)}.hb-select__tags{align-items:center;background-color:var(--hb-select-bg-color);border:1px solid var(--hb-select-border-color);border-radius:4px;display:flex;flex-wrap:wrap;min-height:var(--hb-select-height);padding:0 30px 0 5px}.hb-select__tag{align-items:center;background-color:var(--hb-fill-color-light,#f0f2f5);border:1px solid var(--hb-border-color-lighter,#e4e7ed);border-radius:4px;color:var(--hb-color-text-regular,#606266);display:inline-flex;font-size:12px;height:24px;margin:2px 0 2px 6px;padding:0 8px}.hb-select__tag-text{margin-right:4px}.hb-select__tag-close{color:var(--hb-color-text-placeholder,#c0c4cc);cursor:pointer;font-size:14px;transition:color .2s}.hb-select__tag-close:hover{color:var(--hb-color-text-regular,#606266)}.hb-select__suffix{align-items:center;color:var(--hb-select-text-color);display:flex;position:absolute;right:8px;top:50%;transform:translateY(-50%)}.hb-select__clear{color:var(--hb-select-placeholder-color);cursor:pointer;font-size:16px;margin-right:8px;transition:color .2s}.hb-select__clear:hover{color:var(--hb-select-text-color)}.hb-select__arrow{font-size:12px;transition:transform .3s}.hb-select--open .hb-select__arrow{transform:rotate(180deg)}.hb-select__dropdown{background-color:var(--hb-select-bg-color);border:1px solid var(--hb-select-border-color);border-radius:4px;box-shadow:0 2px 12px #0000001a;left:0;margin-top:4px;max-height:300px;min-width:100%;overflow-y:auto;position:absolute;top:100%;z-index:1000}.hb-select__menu{list-style:none;margin:0;padding:6px 0}.hb-select__menu-item{align-items:center;color:var(--hb-select-text-color);cursor:pointer;display:flex;font-size:var(--hb-select-font-size);padding:8px 20px;transition:background-color .2s}.hb-select__menu-item:hover:not(.hb-select__menu-item--disabled):not(.hb-select__menu-item--divided){background-color:var(--hb-fill-color-light,#f5f7fa)}.hb-select__menu-item--selected{color:var(--hb-color-primary);font-weight:600}.hb-select__menu-item--disabled{color:var(--hb-color-text-disabled,#c0c4cc);cursor:not-allowed}.hb-select__menu-item--divided{border-top:1px solid var(--hb-border-color-lighter,#e4e7ed);margin-top:6px;padding-top:6px}.hb-select__menu-item--empty{color:var(--hb-select-placeholder-color);cursor:default}.hb-select__menu-item-checkbox{margin-right:8px;text-align:center;width:14px}.hb-select__menu-item-label{flex:1}.hb-select--small{font-size:12px}.hb-select--small .hb-select__input{font-size:12px;height:24px;line-height:24px;padding:0 25px 0 12px}.hb-select--large{font-size:16px}.hb-select--large .hb-select__input{font-size:16px;height:40px;line-height:40px;padding:0 35px 0 18px}.hb-select--disabled{cursor:not-allowed}.hb-select--disabled .hb-select__input{background-color:var(--hb-fill-color-light,#f5f7fa);border-color:var(--hb-select-border-color);color:var(--hb-color-text-disabled,#c0c4cc);cursor:not-allowed}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}';const l=a;const n=class{constructor(i){e(this,i);this.hbChange=t(this,"hbChange",7);this.hbVisibleChange=t(this,"hbVisibleChange",7)}get el(){return i(this)}modelValue;options=[];placeholder="请选择";disabled=false;size="default";clearable=false;multiple=false;filterable=false;filterMethod;defaultFirstOption=false;allowCreate=false;collapseTags=false;maxCollapseTags;isOpen=false;inputValue="";searchValue="";filteredOptions=[];activeOptionIndex=-1;hbChange;hbVisibleChange;clickOutside=s({host:null,isOpen:()=>this.isOpen,onClose:()=>{this.isOpen=false;this.hbVisibleChange.emit(false)}});componentDidLoad(){this.clickOutside=s({host:this.el,isOpen:()=>this.isOpen,onClose:()=>{this.isOpen=false;this.hbVisibleChange.emit(false)}});this.clickOutside.connect();this.updateInputValue();if(this.filterable){this.filteredOptions=this.options}}disconnectedCallback(){this.clickOutside.disconnect()}handleValueChange(){this.updateInputValue()}handleOptionsChange(){if(this.filterable){this.filteredOptions=this.options}}updateInputValue(){if(!this.modelValue){this.inputValue="";return}if(this.multiple&&Array.isArray(this.modelValue)){const e=this.modelValue.map((e=>{const t=this.options.find((t=>t.value===e));return t?t.label:String(e)}));this.inputValue=e.join(", ")}else{const e=this.options.find((e=>e.value===this.modelValue));this.inputValue=e?e.label:String(this.modelValue)}}handleInputClick=()=>{if(this.disabled)return;this.isOpen=!this.isOpen;if(this.isOpen)this.activeOptionIndex=-1;this.hbVisibleChange.emit(this.isOpen)};handleWrapperKeydown=e=>{if(this.disabled)return;const t=this.filterable?this.filteredOptions:this.options;if(!this.isOpen){if(e.key==="Enter"||e.key===" "||e.key==="Spacebar"||e.key==="ArrowDown"||e.key==="ArrowUp"){e.preventDefault();this.isOpen=true;this.activeOptionIndex=-1;this.hbVisibleChange.emit(true)}return}const i=r(e,{activeIndex:this.activeOptionIndex,itemCount:t.length,loop:true});switch(i.type){case"navigate":e.preventDefault();this.activeOptionIndex=i.index;break;case"select":{e.preventDefault();const o=t[i.index];if(o&&!o.disabled)this.handleSelect(o);break}case"close":e.preventDefault();this.isOpen=false;this.hbVisibleChange.emit(false);break}};handleSelect=e=>{if(e.disabled)return;if(this.multiple){const t=this.modelValue||[];const i=t.indexOf(e.value);if(i>-1){t.splice(i,1)}else{t.push(e.value)}this.modelValue=[...t]}else{this.modelValue=e.value;this.isOpen=false;this.hbVisibleChange.emit(false)}this.updateInputValue();this.hbChange.emit(this.modelValue)};handleClear=e=>{e.stopPropagation();this.modelValue=this.multiple?[]:undefined;this.inputValue="";this.isOpen=false;this.hbChange.emit(this.modelValue);this.hbVisibleChange.emit(false)};handleSearch=e=>{const t=e.target;this.searchValue=t.value;if(this.filterMethod){this.filterMethod(t.value)}else{this.filteredOptions=this.options.filter((e=>e.label.toLowerCase().includes(t.value.toLowerCase())))}};isSelected(e){if(this.multiple&&Array.isArray(this.modelValue)){return this.modelValue.includes(e.value)}return this.modelValue===e.value}render(){const e=this.filterable?this.filteredOptions:this.options;const t=this.clearable&&this.modelValue!==undefined&&(this.multiple?this.modelValue.length>0:true);return o("div",{key:"74d4a02c34f152b6795a11a54a276a2325e28fc8",class:{"hb-select":true,"hb-select--open":this.isOpen,"hb-select--disabled":this.disabled,[`hb-select--${this.size}`]:true},"aria-haspopup":"listbox","aria-expanded":this.isOpen?"true":"false"},o("div",{key:"acc60d9dd0cafa2264fae4bb2e468f9921eaf210",class:"hb-select__input-wrapper",onClick:this.handleInputClick,onKeyDown:this.handleWrapperKeydown},this.multiple&&Array.isArray(this.modelValue)&&this.modelValue.length>0?o("div",{class:"hb-select__tags"},this.modelValue.slice(0,this.collapseTags&&this.maxCollapseTags?this.maxCollapseTags:undefined).map((e=>{const t=this.options.find((t=>t.value===e));return o("span",{class:"hb-select__tag"},o("span",{class:"hb-select__tag-text"},t?t.label:e),o("span",{class:"hb-select__tag-close",role:"button","aria-label":"移除标签",onClick:i=>{i.stopPropagation();this.handleSelect(t||{value:e,label:String(e)})}},"×"))})),this.collapseTags&&this.maxCollapseTags&&this.modelValue.length>this.maxCollapseTags&&o("span",{class:"hb-select__tag"},o("span",{class:"hb-select__tag-text"},"+",this.modelValue.length-this.maxCollapseTags))):o("input",{type:"text",class:"hb-select__input",placeholder:this.placeholder,value:this.filterable&&this.isOpen?this.searchValue:this.inputValue,disabled:this.disabled,readonly:!this.filterable||!this.isOpen,onInput:this.handleSearch,"aria-haspopup":"listbox","aria-expanded":this.isOpen?"true":"false",role:"combobox"}),o("span",{key:"af18dc75d5ae183d953ff4c1ae9a1c437f5cb4f9",class:"hb-select__suffix"},t&&o("span",{key:"23d6891fa82878f78de89dea464c1a1787be6695",class:"hb-select__clear",role:"button","aria-label":"清空",onClick:this.handleClear},"×"),o("span",{key:"45bef57ec15707fe4f9c9b5fa4699eb8082b27d4",class:"hb-select__arrow"},"▼"))),this.isOpen&&o("div",{key:"a359fae561a9a25f85a72437f88f6ab11abcd90a",class:"hb-select__dropdown"},o("ul",{key:"f599eb59c8ff2f7e3effe395253a11c7934b41b8",class:"hb-select__menu",role:"listbox"},e.length===0?o("li",{class:"hb-select__menu-item hb-select__menu-item--empty","aria-disabled":"true"},"无数据"):e.map(((e,t)=>o("li",{class:{"hb-select__menu-item":true,"hb-select__menu-item--selected":this.isSelected(e),"hb-select__menu-item--disabled":e.disabled,"hb-select__menu-item--divided":e.divided,"hb-select__menu-item--active":t===this.activeOptionIndex},role:"option","aria-selected":this.isSelected(e)?"true":"false","aria-disabled":e.disabled?"true":undefined,onClick:()=>this.handleSelect(e)},this.multiple&&o("span",{class:"hb-select__menu-item-checkbox"},this.isSelected(e)?"✓":""),o("span",{class:"hb-select__menu-item-label"},e.label)))))))}static get watchers(){return{modelValue:["handleValueChange"],options:["handleOptionsChange"]}}};n.style=l;export{n as hb_select};
2
- //# sourceMappingURL=p-58d20809.entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["selectCss","HbSelectStyle0","Select","modelValue","options","placeholder","disabled","size","clearable","multiple","filterable","filterMethod","defaultFirstOption","allowCreate","collapseTags","maxCollapseTags","isOpen","inputValue","searchValue","filteredOptions","activeOptionIndex","hbChange","hbVisibleChange","clickOutside","createClickOutsideHandler","host","this","onClose","emit","componentDidLoad","el","connect","updateInputValue","disconnectedCallback","disconnect","handleValueChange","handleOptionsChange","Array","isArray","labels","map","val","option","find","opt","value","label","String","join","handleInputClick","handleWrapperKeydown","e","displayOptions","key","preventDefault","action","handleListKeyboard","activeIndex","itemCount","length","loop","type","index","handleSelect","currentValue","indexOf","splice","push","handleClear","stopPropagation","undefined","handleSearch","target","filter","toLowerCase","includes","isSelected","render","showClear","h","class","onClick","onKeyDown","slice","role","readonly","onInput","divided"],"sources":["src/components/Select/select.css?tag=hb-select&encapsulation=shadow","src/components/Select/Select.tsx"],"sourcesContent":[":host {\n display: inline-block;\n position: relative;\n --hb-select-font-size: 14px;\n --hb-select-height: 32px;\n --hb-select-border-color: var(--hb-border-color, #dcdfe6);\n --hb-select-border-color-hover: var(--hb-color-primary);\n --hb-select-bg-color: var(--hb-color-white, #ffffff);\n --hb-select-text-color: var(--hb-color-text-regular, #606266);\n --hb-select-placeholder-color: var(--hb-color-text-placeholder, #c0c4cc);\n}\n\n.hb-select {\n display: inline-block;\n position: relative;\n width: 240px;\n}\n\n.hb-select__input-wrapper {\n position: relative;\n display: inline-block;\n width: 100%;\n cursor: pointer;\n}\n\n.hb-select__input {\n display: inline-block;\n width: 100%;\n height: var(--hb-select-height);\n line-height: var(--hb-select-height);\n padding: 0 30px 0 15px;\n font-size: var(--hb-select-font-size);\n color: var(--hb-select-text-color);\n background-color: var(--hb-select-bg-color);\n border: 1px solid var(--hb-select-border-color);\n border-radius: 4px;\n box-sizing: border-box;\n cursor: pointer;\n outline: none;\n transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);\n}\n\n.hb-select__input::placeholder {\n color: var(--hb-select-placeholder-color);\n}\n\n.hb-select__input:hover:not(:disabled) {\n border-color: var(--hb-select-border-color-hover);\n}\n\n.hb-select__input:focus {\n border-color: var(--hb-select-border-color-hover);\n}\n\n.hb-select__tags {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n padding: 0 30px 0 5px;\n min-height: var(--hb-select-height);\n border: 1px solid var(--hb-select-border-color);\n border-radius: 4px;\n background-color: var(--hb-select-bg-color);\n}\n\n.hb-select__tag {\n display: inline-flex;\n align-items: center;\n height: 24px;\n padding: 0 8px;\n margin: 2px 0 2px 6px;\n background-color: var(--hb-fill-color-light, #f0f2f5);\n border: 1px solid var(--hb-border-color-lighter, #e4e7ed);\n border-radius: 4px;\n font-size: 12px;\n color: var(--hb-color-text-regular, #606266);\n}\n\n.hb-select__tag-text {\n margin-right: 4px;\n}\n\n.hb-select__tag-close {\n cursor: pointer;\n font-size: 14px;\n color: var(--hb-color-text-placeholder, #c0c4cc);\n transition: color 0.2s;\n}\n\n.hb-select__tag-close:hover {\n color: var(--hb-color-text-regular, #606266);\n}\n\n.hb-select__suffix {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n color: var(--hb-select-text-color);\n}\n\n.hb-select__clear {\n margin-right: 8px;\n cursor: pointer;\n font-size: 16px;\n color: var(--hb-select-placeholder-color);\n transition: color 0.2s;\n}\n\n.hb-select__clear:hover {\n color: var(--hb-select-text-color);\n}\n\n.hb-select__arrow {\n font-size: 12px;\n transition: transform 0.3s;\n}\n\n.hb-select--open .hb-select__arrow {\n transform: rotate(180deg);\n}\n\n.hb-select__dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n margin-top: 4px;\n background-color: var(--hb-select-bg-color);\n border: 1px solid var(--hb-select-border-color);\n border-radius: 4px;\n box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);\n z-index: 1000;\n min-width: 100%;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.hb-select__menu {\n margin: 0;\n padding: 6px 0;\n list-style: none;\n}\n\n.hb-select__menu-item {\n display: flex;\n align-items: center;\n padding: 8px 20px;\n font-size: var(--hb-select-font-size);\n color: var(--hb-select-text-color);\n cursor: pointer;\n transition: background-color 0.2s;\n}\n\n.hb-select__menu-item:hover:not(.hb-select__menu-item--disabled):not(.hb-select__menu-item--divided) {\n background-color: var(--hb-fill-color-light, #f5f7fa);\n}\n\n.hb-select__menu-item--selected {\n color: var(--hb-color-primary);\n font-weight: 600;\n}\n\n.hb-select__menu-item--disabled {\n color: var(--hb-color-text-disabled, #c0c4cc);\n cursor: not-allowed;\n}\n\n.hb-select__menu-item--divided {\n border-top: 1px solid var(--hb-border-color-lighter, #e4e7ed);\n margin-top: 6px;\n padding-top: 6px;\n}\n\n.hb-select__menu-item--empty {\n color: var(--hb-select-placeholder-color);\n cursor: default;\n}\n\n.hb-select__menu-item-checkbox {\n margin-right: 8px;\n width: 14px;\n text-align: center;\n}\n\n.hb-select__menu-item-label {\n flex: 1;\n}\n\n.hb-select--small {\n font-size: 12px;\n}\n\n.hb-select--small .hb-select__input {\n height: 24px;\n line-height: 24px;\n font-size: 12px;\n padding: 0 25px 0 12px;\n}\n\n.hb-select--large {\n font-size: 16px;\n}\n\n.hb-select--large .hb-select__input {\n height: 40px;\n line-height: 40px;\n font-size: 16px;\n padding: 0 35px 0 18px;\n}\n\n.hb-select--disabled {\n cursor: not-allowed;\n}\n\n.hb-select--disabled .hb-select__input {\n background-color: var(--hb-fill-color-light, #f5f7fa);\n border-color: var(--hb-select-border-color);\n color: var(--hb-color-text-disabled, #c0c4cc);\n cursor: not-allowed;\n}\n\n","import { Component, h, Prop, Event, EventEmitter, State, Element, Watch } from '@stencil/core';\nimport { createClickOutsideHandler } from '../../utils/click-outside';\nimport { handleListKeyboard } from '../../utils/a11y';\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n divided?: boolean;\n}\n\n/**\n * Select 选择器组件\n * 当选项过多时,使用下拉菜单展示并选择内容\n */\n@Component({\n tag: 'hb-select',\n styleUrl: 'select.css',\n shadow: true,\n})\nexport class Select {\n @Element() el: HTMLElement;\n\n /**\n * 绑定值\n */\n @Prop({ mutable: true }) modelValue?: string | number | (string | number)[];\n\n /**\n * 可选项数据源\n */\n @Prop() options: SelectOption[] = [];\n\n /**\n * 输入框占位文本\n */\n @Prop() placeholder: string = '请选择';\n\n /**\n * 是否禁用\n * @default false\n */\n @Prop() disabled: boolean = false;\n\n /**\n * 输入框尺寸\n */\n @Prop() size: 'large' | 'default' | 'small' = 'default';\n\n /**\n * 是否可清空\n * @default false\n */\n @Prop() clearable: boolean = false;\n\n /**\n * 是否多选\n * @default false\n */\n @Prop() multiple: boolean = false;\n\n /**\n * 是否可搜索\n * @default false\n */\n @Prop() filterable: boolean = false;\n\n /**\n * 自定义过滤方法\n */\n @Prop() filterMethod?: (query: string) => void;\n\n /**\n * 是否默认展开\n * @default false\n */\n @Prop() defaultFirstOption: boolean = false;\n\n /**\n * 是否允许创建新条目\n * @default false\n */\n @Prop() allowCreate: boolean = false;\n\n /**\n * 多选时是否将选中值按文字的形式展示\n * @default false\n */\n @Prop() collapseTags: boolean = false;\n\n /**\n * 多选时最多显示多少个tag\n */\n @Prop() maxCollapseTags?: number;\n\n @State() isOpen: boolean = false;\n @State() inputValue: string = '';\n @State() searchValue: string = '';\n @State() filteredOptions: SelectOption[] = [];\n /** 键盘高亮的选项索引(-1 表示无) */\n @State() activeOptionIndex: number = -1;\n\n /**\n * 值改变事件\n */\n @Event() hbChange: EventEmitter<string | number | (string | number)[]>;\n\n /**\n * 下拉框出现/隐藏时触发\n */\n @Event() hbVisibleChange: EventEmitter<boolean>;\n\n private clickOutside = createClickOutsideHandler({\n host: null as any,\n isOpen: () => this.isOpen,\n onClose: () => { this.isOpen = false; this.hbVisibleChange.emit(false); },\n });\n\n componentDidLoad() {\n this.clickOutside = createClickOutsideHandler({\n host: this.el,\n isOpen: () => this.isOpen,\n onClose: () => { this.isOpen = false; this.hbVisibleChange.emit(false); },\n });\n this.clickOutside.connect();\n this.updateInputValue();\n if (this.filterable) {\n this.filteredOptions = this.options;\n }\n }\n\n disconnectedCallback() {\n this.clickOutside.disconnect();\n }\n\n @Watch('modelValue')\n handleValueChange() {\n this.updateInputValue();\n }\n\n @Watch('options')\n handleOptionsChange() {\n if (this.filterable) {\n this.filteredOptions = this.options;\n }\n }\n\n private updateInputValue() {\n if (!this.modelValue) {\n this.inputValue = '';\n return;\n }\n\n if (this.multiple && Array.isArray(this.modelValue)) {\n const labels = this.modelValue.map(val => {\n const option = this.options.find(opt => opt.value === val);\n return option ? option.label : String(val);\n });\n this.inputValue = labels.join(', ');\n } else {\n const option = this.options.find(opt => opt.value === this.modelValue);\n this.inputValue = option ? option.label : String(this.modelValue);\n }\n }\n\n private handleInputClick = () => {\n if (this.disabled) return;\n this.isOpen = !this.isOpen;\n if (this.isOpen) this.activeOptionIndex = -1;\n this.hbVisibleChange.emit(this.isOpen);\n };\n\n private handleWrapperKeydown = (e: KeyboardEvent) => {\n if (this.disabled) return;\n const displayOptions = this.filterable ? this.filteredOptions : this.options;\n\n if (!this.isOpen) {\n // 关闭态:Enter / Space / 方向键 展开\n if (e.key === 'Enter' || e.key === ' ' || e.key === 'Spacebar' ||\n e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n this.isOpen = true;\n this.activeOptionIndex = -1;\n this.hbVisibleChange.emit(true);\n }\n return;\n }\n\n const action = handleListKeyboard(e, {\n activeIndex: this.activeOptionIndex,\n itemCount: displayOptions.length,\n loop: true,\n });\n switch (action.type) {\n case 'navigate':\n e.preventDefault();\n this.activeOptionIndex = action.index;\n break;\n case 'select': {\n e.preventDefault();\n const opt = displayOptions[action.index];\n if (opt && !opt.disabled) this.handleSelect(opt);\n break;\n }\n case 'close':\n e.preventDefault();\n this.isOpen = false;\n this.hbVisibleChange.emit(false);\n break;\n default:\n break;\n }\n };\n\n private handleSelect = (option: SelectOption) => {\n if (option.disabled) return;\n\n if (this.multiple) {\n const currentValue = (this.modelValue as (string | number)[]) || [];\n const index = currentValue.indexOf(option.value);\n \n if (index > -1) {\n currentValue.splice(index, 1);\n } else {\n currentValue.push(option.value);\n }\n \n this.modelValue = [...currentValue];\n } else {\n this.modelValue = option.value;\n this.isOpen = false;\n this.hbVisibleChange.emit(false);\n }\n \n this.updateInputValue();\n this.hbChange.emit(this.modelValue);\n };\n\n private handleClear = (e: Event) => {\n e.stopPropagation();\n this.modelValue = this.multiple ? [] : undefined;\n this.inputValue = '';\n this.isOpen = false;\n this.hbChange.emit(this.modelValue);\n this.hbVisibleChange.emit(false);\n };\n\n private handleSearch = (e: Event) => {\n const target = e.target as HTMLInputElement;\n this.searchValue = target.value;\n \n if (this.filterMethod) {\n this.filterMethod(target.value);\n } else {\n this.filteredOptions = this.options.filter(opt =>\n opt.label.toLowerCase().includes(target.value.toLowerCase())\n );\n }\n };\n\n private isSelected(option: SelectOption): boolean {\n if (this.multiple && Array.isArray(this.modelValue)) {\n return this.modelValue.includes(option.value);\n }\n return this.modelValue === option.value;\n }\n\n render() {\n const displayOptions = this.filterable ? this.filteredOptions : this.options;\n const showClear = this.clearable && this.modelValue !== undefined &&\n (this.multiple ? (this.modelValue as any[]).length > 0 : true);\n\n return (\n <div\n class={{\n 'hb-select': true,\n 'hb-select--open': this.isOpen,\n 'hb-select--disabled': this.disabled,\n [`hb-select--${this.size}`]: true,\n }}\n aria-haspopup=\"listbox\"\n aria-expanded={this.isOpen ? 'true' : 'false'}\n >\n <div class=\"hb-select__input-wrapper\" onClick={this.handleInputClick} onKeyDown={this.handleWrapperKeydown}>\n {this.multiple && Array.isArray(this.modelValue) && this.modelValue.length > 0 ? (\n <div class=\"hb-select__tags\">\n {this.modelValue.slice(0, this.collapseTags && this.maxCollapseTags ? this.maxCollapseTags : undefined).map((val) => {\n const option = this.options.find(opt => opt.value === val);\n return (\n <span class=\"hb-select__tag\">\n <span class=\"hb-select__tag-text\">{option ? option.label : val}</span>\n <span class=\"hb-select__tag-close\" role=\"button\" aria-label=\"移除标签\" onClick={(e) => {\n e.stopPropagation();\n this.handleSelect(option || { value: val, label: String(val) });\n }}>×</span>\n </span>\n );\n })}\n {this.collapseTags && this.maxCollapseTags && this.modelValue.length > this.maxCollapseTags && (\n <span class=\"hb-select__tag\">\n <span class=\"hb-select__tag-text\">+{this.modelValue.length - this.maxCollapseTags}</span>\n </span>\n )}\n </div>\n ) : (\n <input\n type=\"text\"\n class=\"hb-select__input\"\n placeholder={this.placeholder}\n value={this.filterable && this.isOpen ? this.searchValue : this.inputValue}\n disabled={this.disabled}\n readonly={!this.filterable || !this.isOpen}\n onInput={this.handleSearch}\n aria-haspopup=\"listbox\"\n aria-expanded={this.isOpen ? 'true' : 'false'}\n role=\"combobox\"\n />\n )}\n <span class=\"hb-select__suffix\">\n {showClear && (\n <span class=\"hb-select__clear\" role=\"button\" aria-label=\"清空\" onClick={this.handleClear}>\n ×\n </span>\n )}\n <span class=\"hb-select__arrow\">▼</span>\n </span>\n </div>\n {this.isOpen && (\n <div class=\"hb-select__dropdown\">\n <ul class=\"hb-select__menu\" role=\"listbox\">\n {displayOptions.length === 0 ? (\n <li class=\"hb-select__menu-item hb-select__menu-item--empty\" aria-disabled=\"true\">无数据</li>\n ) : (\n displayOptions.map((option, index) => (\n <li\n class={{\n 'hb-select__menu-item': true,\n 'hb-select__menu-item--selected': this.isSelected(option),\n 'hb-select__menu-item--disabled': option.disabled,\n 'hb-select__menu-item--divided': option.divided,\n 'hb-select__menu-item--active': index === this.activeOptionIndex,\n }}\n role=\"option\"\n aria-selected={this.isSelected(option) ? 'true' : 'false'}\n aria-disabled={option.disabled ? 'true' : undefined}\n onClick={() => this.handleSelect(option)}\n >\n {this.multiple && (\n <span class=\"hb-select__menu-item-checkbox\">\n {this.isSelected(option) ? '✓' : ''}\n </span>\n )}\n <span class=\"hb-select__menu-item-label\">{option.label}</span>\n </li>\n ))\n )}\n </ul>\n </div>\n )}\n </div>\n );\n }\n}\n\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["switchCss","HbSwitchStyle0","Switch","modelValue","disabled","activeText","inactiveText","activeColor","inactiveColor","activeValue","inactiveValue","width","inlinePrompt","hbChange","handleChange","e","this","preventDefault","checked","target","value","emit","render","isChecked","h","key","class","style","type","role","onChange","undefined"],"sources":["src/components/Switch/switch.css?tag=hb-switch&encapsulation=shadow","src/components/Switch/Switch.tsx"],"sourcesContent":[":host {\n display: inline-block;\n --hb-switch-width: 40px;\n --hb-switch-active-color: var(--hb-color-primary);\n --hb-switch-inactive-color: var(--hb-color-text-placeholder, #c0c4cc);\n}\n\n.hb-switch {\n display: inline-flex;\n align-items: center;\n position: relative;\n font-size: 14px;\n line-height: 20px;\n height: 20px;\n vertical-align: middle;\n cursor: pointer;\n}\n\n.hb-switch__original {\n opacity: 0;\n width: 0;\n height: 0;\n margin: 0;\n position: absolute;\n}\n\n.hb-switch__core {\n margin: 0;\n display: inline-block;\n position: relative;\n width: var(--hb-switch-width);\n height: 20px;\n border: 1px solid var(--hb-switch-inactive-color);\n outline: none;\n border-radius: 10px;\n box-sizing: border-box;\n background: var(--hb-switch-inactive-color);\n cursor: pointer;\n transition: border-color 0.3s, background-color 0.3s;\n vertical-align: middle;\n}\n\n.hb-switch__core::after {\n content: '';\n position: absolute;\n top: 1px;\n left: 1px;\n border-radius: 100%;\n transition: all 0.3s;\n width: 16px;\n height: 16px;\n background-color: var(--hb-color-white, #ffffff);\n}\n\n.hb-switch--checked .hb-switch__core {\n border-color: var(--hb-switch-active-color);\n background-color: var(--hb-switch-active-color);\n}\n\n.hb-switch--checked .hb-switch__core::after {\n left: 100%;\n margin-left: -17px;\n}\n\n.hb-switch__inner {\n position: absolute;\n left: 23px;\n font-size: 12px;\n color: var(--hb-color-white, #ffffff);\n transition: all 0.3s;\n}\n\n.hb-switch--checked .hb-switch__inner {\n left: 5px;\n}\n\n.hb-switch--disabled {\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.hb-switch--disabled .hb-switch__core {\n cursor: not-allowed;\n}\n\n","import { Component, h, Prop, Event, EventEmitter } from '@stencil/core';\n\n/**\n * Switch 开关组件\n * 表示两种相互对立的状态间的切换,多用于触发「开/关」\n */\n@Component({\n tag: 'hb-switch',\n styleUrl: 'switch.css',\n shadow: true,\n})\nexport class Switch {\n /**\n * 绑定值\n */\n @Prop({ mutable: true }) modelValue: boolean = false;\n\n /**\n * 是否禁用\n * @default false\n */\n @Prop() disabled: boolean = false;\n\n /**\n * 是否显示文字描述\n * @default false\n */\n @Prop() activeText?: string;\n\n /**\n * 关闭时的文字描述\n */\n @Prop() inactiveText?: string;\n\n /**\n * 打开时的背景色\n */\n @Prop() activeColor?: string;\n\n /**\n * 关闭时的背景色\n */\n @Prop() inactiveColor?: string;\n\n /**\n * 打开时的值\n * @default true\n */\n @Prop() activeValue: boolean | string | number = true;\n\n /**\n * 关闭时的值\n * @default false\n */\n @Prop() inactiveValue: boolean | string | number = false;\n\n /**\n * 宽度\n */\n @Prop() width?: number;\n\n /**\n * 是否内联提示\n * @default false\n */\n @Prop() inlinePrompt: boolean = false;\n\n /**\n * 值改变事件\n */\n @Event() hbChange: EventEmitter<boolean | string | number>;\n\n private handleChange = (e: Event) => {\n if (this.disabled) {\n e.preventDefault();\n return;\n }\n\n const checked = (e.target as HTMLInputElement).checked;\n const value = checked ? this.activeValue : this.inactiveValue;\n \n this.modelValue = checked;\n this.hbChange.emit(value);\n };\n\n render() {\n const isChecked = this.modelValue === this.activeValue;\n const width = this.width || (this.activeText || this.inactiveText ? 60 : 40);\n\n return (\n <label\n class={{\n 'hb-switch': true,\n 'hb-switch--checked': isChecked,\n 'hb-switch--disabled': this.disabled,\n }}\n style={{\n '--hb-switch-width': `${width}px`,\n '--hb-switch-active-color': this.activeColor || 'var(--hb-color-primary)',\n '--hb-switch-inactive-color': this.inactiveColor || 'var(--hb-color-text-placeholder, #c0c4cc)',\n }}\n >\n <input\n type=\"checkbox\"\n class=\"hb-switch__original\"\n role=\"switch\"\n aria-checked={isChecked ? 'true' : 'false'}\n checked={isChecked}\n disabled={this.disabled}\n onChange={this.handleChange}\n aria-label={this.activeText || this.inactiveText || undefined}\n />\n <span class=\"hb-switch__core\">\n {this.activeText || this.inactiveText ? (\n <span class=\"hb-switch__inner\">\n {isChecked ? this.activeText : this.inactiveText}\n </span>\n ) : null}\n </span>\n </label>\n );\n }\n}\n\n"],"mappings":"kDAAA,MAAMA,EAAY,m5NAClB,MAAAC,EAAeD,E,MCUFE,EAAM,M,4DAIQC,WAAsB,MAMvCC,SAAoB,MAMpBC,WAKAC,aAKAC,YAKAC,cAMAC,YAAyC,KAMzCC,cAA2C,MAK3CC,MAMAC,aAAwB,MAKvBC,SAEDC,aAAgBC,IACtB,GAAIC,KAAKZ,SAAU,CACjBW,EAAEE,iBACF,M,CAGF,MAAMC,EAAWH,EAAEI,OAA4BD,QAC/C,MAAME,EAAQF,EAAUF,KAAKP,YAAcO,KAAKN,cAEhDM,KAAKb,WAAae,EAClBF,KAAKH,SAASQ,KAAKD,EAAM,EAG3B,MAAAE,GACE,MAAMC,EAAYP,KAAKb,aAAea,KAAKP,YAC3C,MAAME,EAAQK,KAAKL,QAAUK,KAAKX,YAAcW,KAAKV,aAAe,GAAK,IAEzE,OACEkB,EAAA,SAAAC,IAAA,2CACEC,MAAO,CACL,YAAa,KACb,qBAAsBH,EACtB,sBAAuBP,KAAKZ,UAE9BuB,MAAO,CACL,oBAAqB,GAAGhB,MACxB,2BAA4BK,KAAKT,aAAe,0BAChD,6BAA8BS,KAAKR,eAAiB,8CAGtDgB,EAAA,SAAAC,IAAA,2CACEG,KAAK,WACLF,MAAM,sBACNG,KAAK,SAAQ,eACCN,EAAY,OAAS,QACnCL,QAASK,EACTnB,SAAUY,KAAKZ,SACf0B,SAAUd,KAAKF,aAAY,aACfE,KAAKX,YAAcW,KAAKV,cAAgByB,YAEtDP,EAAA,QAAAC,IAAA,2CAAMC,MAAM,mBACTV,KAAKX,YAAcW,KAAKV,aACvBkB,EAAA,QAAME,MAAM,oBACTH,EAAYP,KAAKX,WAAaW,KAAKV,cAEpC,M","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["tableCss","HbTableStyle0","Table","data","columns","stripe","border","size","loading","rowKey","emptyText","maxHeight","highlightCurrentRow","selectable","actions","virtualScroll","itemHeight","virtualScrollHeight","treeProps","editable","sortProp","sortDirection","currentRow","selectedRows","Set","scrollTop","expandedRowKeys","editingCell","hbSortChange","hbRowClick","hbSelectionChange","hbAction","hbExpandChange","hbCellChange","handleDataChange","this","emitSelection","isTreeMode","childrenField","children","flattenTree","list","level","parentKeyPath","field","result","forEach","row","i","keyPath","key","kids","hasKids","Array","isArray","length","push","hasChildren","index","indexOf","toggleExpand","idx","expanded","filter","k","emit","startEdit","e","prop","stopPropagation","commitEdit","input","target","value","onEditKeydown","preventDefault","allCheckboxRef","componentDidRender","indeterminate","isIndeterminate","virtualBuffer","handleVirtualScroll","visibleRange","total","startIndex","endIndex","viewport","Math","floor","ceil","virtualTotalHeight","handleSort","order","sortedData","direction","sort","a","b","va","vb","isAllSelected","toggleRow","next","has","delete","add","toggleAll","map","_","selected","from","Boolean","handleRowClick","handleAction","action","hasActions","fixedOffsets","leftAcc","c","side","fixed","left","width","rightAcc","right","cellStyle","base","off","style","position","zIndex","renderRow","rowIndex","fr","tree","rowKeyVal","indent","isEditing","h","class","onClick","type","checked","onChange","col","colIdx","isFirstCol","showExpand","editing","editableActive","textAlign","align","undefined","display","onBlur","onKeyDown","name","formatter","whiteSpace","act","disabled","label","renderHeader","ref","el","minWidth","sortable","render","displayData","isEmpty","flatRows","renderVirtualBody","offsetTop","height","overflowY","onScroll","colSpan","slice","renderNormalBody","overflow"],"sources":["src/components/Table/table.css?tag=hb-table&encapsulation=shadow","src/components/Table/Table.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.hb-table {\n position: relative;\n overflow: hidden;\n border-radius: var(--hb-border-radius-base);\n background-color: var(--hb-color-bg);\n}\n\n.hb-table--border {\n border: 1px solid var(--hb-color-border-secondary);\n}\n\n.hb-table--border .hb-table__td,\n.hb-table--border .hb-table__table th {\n border-right: 1px solid var(--hb-color-border-secondary);\n}\n\n.hb-table__wrapper {\n overflow-x: auto;\n}\n\n.hb-table__table {\n width: 100%;\n border-collapse: collapse;\n border-spacing: 0;\n table-layout: auto;\n}\n\n.hb-table__table th {\n background-color: var(--hb-table-header-bg);\n color: var(--hb-table-header-color);\n font-weight: 600;\n font-size: var(--hb-font-size-sm);\n padding: 10px 12px;\n text-align: left;\n border-bottom: 1px solid var(--hb-color-border-secondary);\n white-space: nowrap;\n user-select: none;\n}\n\n.hb-table__th-content {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.hb-table__th--sortable {\n cursor: pointer;\n}\n\n.hb-table__th--sortable:hover {\n background-color: var(--hb-color-fill-tertiary);\n}\n\n.hb-table__sort {\n display: inline-flex;\n flex-direction: column;\n line-height: 1;\n font-size: 10px;\n gap: 1px;\n}\n\n.hb-table__sort-icon {\n color: var(--hb-color-text-quaternary);\n transition: color var(--hb-transition-duration);\n}\n\n.hb-table__sort-icon--active {\n color: var(--hb-color-primary);\n}\n\n.hb-table__td {\n padding: 10px 12px;\n font-size: var(--hb-font-size-sm);\n color: var(--hb-color-text);\n border-bottom: 1px solid var(--hb-table-border-color);\n transition: background-color var(--hb-transition-duration);\n}\n\n.hb-table__row:hover .hb-table__td {\n background-color: var(--hb-table-row-hover-bg);\n}\n\n.hb-table__row--striped .hb-table__td {\n background-color: var(--hb-table-stripe-bg);\n}\n\n.hb-table__row--current .hb-table__td {\n background-color: var(--hb-color-primary-bg);\n}\n\n.hb-table__empty {\n text-align: center;\n color: var(--hb-color-text-secondary);\n padding: var(--hb-spacing-xl) 0;\n}\n\n.hb-table__loading {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: rgba(255, 255, 255, 0.7);\n z-index: 1;\n}\n\n.hb-table__loading-spinner {\n width: 32px;\n height: 32px;\n border: 3px solid var(--hb-color-border-secondary);\n border-top-color: var(--hb-color-primary);\n border-radius: 50%;\n animation: hb-spin 0.8s linear infinite;\n}\n\n/* ---- 尺寸 ---- */\n.hb-table--small .hb-table__table th,\n.hb-table--small .hb-table__td {\n padding: 6px 8px;\n font-size: var(--hb-font-size-xs);\n}\n\n.hb-table--large .hb-table__table th,\n.hb-table--large .hb-table__td {\n padding: 14px 16px;\n font-size: var(--hb-font-size-base);\n}\n\n/* ---- 行选择 ---- */\n.hb-table__selection {\n width: 48px;\n min-width: 48px;\n text-align: center;\n white-space: nowrap;\n}\n.hb-table__checkbox {\n width: 16px;\n height: 16px;\n cursor: pointer;\n accent-color: var(--hb-color-primary);\n vertical-align: middle;\n}\n.hb-table__selection .hb-table__checkbox {\n margin: 0;\n}\n.hb-table__row--selected .hb-table__td {\n background-color: var(--hb-color-primary-bg);\n}\n\n/* ---- 固定列(sticky) ---- */\n/* 固定列单元格需要不透明背景,避免横向滚动时底层内容透出 */\n.hb-table__cell--fixed-left,\n.hb-table__cell--fixed-right {\n position: sticky;\n z-index: 2;\n background-color: var(--hb-color-bg);\n}\n.hb-table__table th.hb-table__cell--fixed-left,\n.hb-table__table th.hb-table__cell--fixed-right {\n background-color: var(--hb-table-header-bg);\n}\n.hb-table__cell--fixed-right {\n box-shadow: -4px 0 8px rgba(0, 0, 0, 0.06);\n}\n.hb-table__cell--fixed-left:not(.hb-table__cell--fixed-right) {\n box-shadow: 4px 0 8px rgba(0, 0, 0, 0.06);\n}\n/* 固定列在选中行需保持选中背景 */\n.hb-table__row--selected .hb-table__cell--fixed-left,\n.hb-table__row--selected .hb-table__cell--fixed-right {\n background-color: var(--hb-color-primary-bg);\n}\n.hb-table__row:hover .hb-table__cell--fixed-left,\n.hb-table__row:hover .hb-table__cell--fixed-right {\n background-color: var(--hb-table-row-hover-bg);\n}\n\n@keyframes hb-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/* 行操作按钮(link 风格,类 Ant Design) */\n.hb-table__action {\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n font-size: var(--hb-font-size-sm, 14px);\n line-height: 1.5;\n color: var(--hb-color-primary, #1677ff);\n transition: opacity var(--hb-transition-duration, 0.2s);\n}\n.hb-table__action:hover {\n opacity: 0.8;\n}\n.hb-table__action:disabled {\n color: var(--hb-color-text-disabled, #c0c4cc);\n cursor: not-allowed;\n}\n.hb-table__action--danger {\n color: var(--hb-color-danger, #f5222d);\n}\n.hb-table__action--danger:disabled {\n color: var(--hb-color-text-disabled, #c0c4cc);\n}\n.hb-table__action + .hb-table__action {\n margin-left: var(--hb-spacing-sm, 12px);\n}\n\n/* ---- 虚拟滚动 ---- */\n.hb-table--virtual {\n overflow: hidden;\n}\n.hb-table__virtual-wrapper {\n display: flex;\n flex-direction: column;\n}\n.hb-table__virtual-viewport {\n overflow-y: auto;\n overflow-x: auto;\n position: relative;\n}\n.hb-table__virtual-spacer {\n position: relative;\n width: 100%;\n}\n.hb-table__table--virtual {\n width: 100%;\n table-layout: fixed;\n}\n.hb-table__table--virtual tbody {\n /* 可见窗口的行紧跟在 offset 占位行之后,撑高容器由 spacer 负责 */\n position: relative;\n}\n\n/* ---- 树形数据(可展开行) ---- */\n.hb-table__expand {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-right: 4px;\n padding: 0;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--hb-color-text-secondary, #595959);\n font-size: 10px;\n line-height: 1;\n vertical-align: middle;\n transition: color var(--hb-transition-duration, 0.2s);\n flex-shrink: 0;\n}\n.hb-table__expand:hover {\n color: var(--hb-color-primary, #1677ff);\n}\n.hb-table__row--tree .hb-table__td {\n /* 树形行第一列内容随缩进对齐 */\n white-space: nowrap;\n}\n\n/* ---- 行内编辑 ---- */\n.hb-table__cell--editable {\n cursor: text;\n}\n.hb-table__cell--editable:hover {\n background-color: var(--hb-color-fill-tertiary, #f5f5f5);\n}\n.hb-table__edit-input {\n width: 100%;\n min-width: 60px;\n box-sizing: border-box;\n padding: 2px 6px;\n font-size: var(--hb-font-size-sm, 14px);\n color: var(--hb-color-text, #262626);\n border: 1px solid var(--hb-color-primary, #1677ff);\n border-radius: var(--hb-border-radius-base, 4px);\n outline: none;\n background-color: var(--hb-color-bg, #fff);\n}\n","import { Component, h, Prop, State, Event, EventEmitter, Watch } from '@stencil/core';\n\nexport interface TableColumn {\n /** 列字段名 */\n prop: string;\n /** 列标题 */\n label: string;\n /** 列宽 */\n width?: string;\n /** 最小列宽 */\n minWidth?: string;\n /** 是否可排序 */\n sortable?: boolean;\n /** 对齐方式 */\n align?: 'left' | 'center' | 'right';\n /** 固定列:left / right / true(等同 left) */\n fixed?: 'left' | 'right' | boolean;\n /** 单元格文本格式化(框架无关,返回纯文本字符串) */\n formatter?: (row: Record<string, any>, index: number) => string;\n /** 该列是否可(行内)编辑;需同时开启 Table.editable 才生效 */\n editable?: boolean;\n}\n\n/**\n * 行操作按钮配置(框架无关)。\n * 由 Table 自身渲染按钮(在 shadow DOM 内),点击派发 hbAction 事件,\n * 消费方据此执行编辑/删除等逻辑——无需往每行塞框架专属元素,绕开「slot 跨行共享」限制。\n */\nexport interface TableAction {\n /** 操作标识,回传到 hbAction.detail.action */\n key: string;\n /** 按钮文案 */\n label: string;\n /** 按钮样式:default 主色文字 / danger 危险色 */\n type?: 'default' | 'primary' | 'danger';\n /** 是否禁用(按行判断) */\n disabled?: (row: Record<string, any>, index: number) => boolean;\n}\n\nexport type SortDirection = 'ascending' | 'descending' | null;\n\n/**\n * 树形数据配置。\n * `children` 指定子节点在每行数据中的字段名(默认 'children'),\n * 行存在该字段(非空数组)时渲染展开箭头,可递归展开后代。\n */\nexport interface TableTreeProps {\n children?: string;\n}\n\n/**\n * 拍平后的可见行:保留原始 row + 嵌套层级 + 唯一 key,\n * 供 render 一次性 map 成 <tr>(仅含已展开链路上的后代)。\n */\ninterface FlatRow {\n row: Record<string, any>;\n level: number;\n key: string | number;\n /** 该行是否有非空 children(决定是否渲染展开箭头) */\n hasChildren: boolean;\n /** 该行在父层数组中的索引(用于 rowKey 缺省回退与稳定 key) */\n index: number;\n}\n\ninterface FixedOffset {\n side?: 'left' | 'right';\n left?: string;\n right?: string;\n}\n\n/**\n * Table 表格组件\n * 用于展示多条结构类似的数据,可对数据进行排序、筛选、选择等操作\n */\n@Component({\n tag: 'hb-table',\n styleUrl: 'table.css',\n shadow: true,\n})\nexport class Table {\n /** 数据源 */\n @Prop() data: Record<string, any>[] = [];\n\n /** 列配置 */\n @Prop() columns: TableColumn[] = [];\n\n /** 是否带斑马纹 */\n @Prop() stripe: boolean = false;\n\n /** 是否带边框 */\n @Prop() border: boolean = false;\n\n /** 表格尺寸 */\n @Prop() size: 'large' | 'default' | 'small' = 'default';\n\n /** 是否显示加载状态 */\n @Prop() loading: boolean = false;\n\n /** 行数据的 Key */\n @Prop() rowKey: string = '';\n\n /** 空数据文案 */\n @Prop() emptyText: string = '暂无数据';\n\n /** 最大高度(超出固定表头) */\n @Prop() maxHeight?: string;\n\n /** 是否高亮当前行 */\n @Prop() highlightCurrentRow: boolean = false;\n\n /** 是否开启行选择(显示 checkbox 列) */\n @Prop() selectable: boolean = false;\n\n /** 行操作配置;非空时自动在末尾渲染「操作」列 */\n @Prop() actions: TableAction[] = [];\n\n /** 是否开启虚拟滚动(大数据量场景,默认关闭,向后兼容) */\n @Prop() virtualScroll: boolean = false;\n\n /** 虚拟滚动每行预估高度(px),用于计算撑高容器与可见窗口 */\n @Prop() itemHeight: number = 48;\n\n /** 虚拟滚动视口高度(px),超过此高度出现滚动条 */\n @Prop() virtualScrollHeight: number = 400;\n\n /**\n * 树形数据配置:传入后启用「可展开行」模式。\n * data 行含 `children` 字段(字段名可经此配置覆盖)时渲染展开箭头。\n * 默认 undefined —— 不启用树形。\n */\n @Prop() treeProps?: TableTreeProps;\n\n /** 是否开启行内编辑模式(默认关闭)。需列配置 column.editable=true 才对该列生效 */\n @Prop() editable: boolean = false;\n\n @State() sortProp: string = '';\n @State() sortDirection: SortDirection = null;\n @State() currentRow: number = -1;\n @State() selectedRows: Set<number> = new Set();\n /** 虚拟滚动:当前滚动位置(px),驱动可见窗口计算 */\n @State() scrollTop: number = 0;\n\n /** 树形模式:已展开行的 key 列表 */\n @State() expandedRowKeys: Array<string | number> = [];\n\n /** 行内编辑:当前正在编辑的单元格 { key, prop },null 表示无 */\n @State() editingCell: { rowKey: string | number; prop: string } | null = null;\n\n /** 排序变化事件 */\n @Event() hbSortChange: EventEmitter<{ prop: string; order: SortDirection }>;\n\n /** 行点击事件 */\n @Event() hbRowClick: EventEmitter<{ row: Record<string, any>; index: number }>;\n\n /** 选择变化事件 */\n @Event() hbSelectionChange: EventEmitter<Record<string, any>[]>;\n\n /** 行操作点击事件 */\n @Event() hbAction: EventEmitter<{ row: Record<string, any>; index: number; action: string }>;\n\n /** 树形行展开/收起事件 */\n @Event() hbExpandChange: EventEmitter<{ expanded: boolean; row: Record<string, any> }>;\n\n /** 行内编辑提交事件 */\n @Event() hbCellChange: EventEmitter<{ row: Record<string, any>; prop: string; value: any }>;\n\n @Watch('data')\n handleDataChange() {\n this.selectedRows = new Set();\n this.emitSelection();\n }\n\n /** 树形模式是否启用(显式传入 treeProps 即启用) */\n private get isTreeMode(): boolean {\n return !!this.treeProps;\n }\n\n /** 子节点字段名(treeProps.children 缺省回退 'children') */\n private get childrenField(): string {\n return (this.treeProps && this.treeProps.children) || 'children';\n }\n\n /**\n * 把树拍平成可见行列表:仅保留「祖先链路全部已展开」的后代。\n * @param list 当前层级的数组\n * @param level 当前层级(根 = 0)\n * @param parentKeyPath 父级 key 路径,用于构造深层稳定 key(避免不同分支同 index 撞 key)\n */\n private flattenTree(list: Record<string, any>[], level: number = 0, parentKeyPath: string = ''): FlatRow[] {\n const field = this.childrenField;\n const result: FlatRow[] = [];\n list.forEach((row, i) => {\n const keyPath = parentKeyPath ? `${parentKeyPath}.${i}` : `${i}`;\n const key = this.rowKey ? row[this.rowKey] : keyPath;\n const kids = row[field];\n const hasKids = Array.isArray(kids) && kids.length > 0;\n result.push({ row, level, key, hasChildren: hasKids, index: i });\n // 仅当该行已展开时,递归拍入其 children\n if (hasKids && this.expandedRowKeys.indexOf(key) !== -1) {\n result.push(...this.flattenTree(kids as Record<string, any>[], level + 1, keyPath));\n }\n });\n return result;\n }\n\n /** 树形展开/收起切换 */\n private toggleExpand = (row: Record<string, any>, key: string | number) => {\n const idx = this.expandedRowKeys.indexOf(key);\n const expanded = idx === -1;\n this.expandedRowKeys = expanded ? [...this.expandedRowKeys, key] : this.expandedRowKeys.filter((k) => k !== key);\n this.hbExpandChange.emit({ expanded, row });\n };\n\n /** 行内编辑:进入编辑态 */\n private startEdit = (e: Event, key: string | number, prop: string) => {\n e.stopPropagation();\n if (!this.editable) return;\n this.editingCell = { rowKey: key, prop };\n };\n\n /** 行内编辑:提交(回车 / 失焦 / Change) */\n private commitEdit = (e: Event, row: Record<string, any>, prop: string) => {\n const input = e.target as HTMLInputElement;\n const value = input.value;\n // 就地更新(简单可用版):修改 row[prop] 后强制重渲染\n row[prop] = value;\n this.editingCell = null;\n this.hbCellChange.emit({ row, prop, value });\n };\n\n /** 行内编辑:回车提交 / Esc 取消 */\n private onEditKeydown = (e: KeyboardEvent, row: Record<string, any>, prop: string) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.commitEdit(e, row, prop);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n this.editingCell = null;\n }\n };\n\n private allCheckboxRef?: HTMLInputElement;\n\n componentDidRender() {\n // indeterminate 不是可反射的 HTML 属性,必须通过 DOM 属性设置\n if (this.allCheckboxRef) {\n this.allCheckboxRef.indeterminate = this.isIndeterminate;\n }\n }\n\n /** 虚拟滚动上下缓冲行数 */\n private readonly virtualBuffer = 5;\n\n /** 虚拟滚动:滚动事件回调,更新 scrollTop 触发可见窗口重算 */\n private handleVirtualScroll = (e: Event) => {\n const target = e.target as HTMLElement;\n this.scrollTop = target.scrollTop;\n };\n\n /** 虚拟滚动:计算可见窗口 [startIndex, endIndex) */\n private get visibleRange(): { startIndex: number; endIndex: number } {\n const total = this.data.length;\n if (total === 0) return { startIndex: 0, endIndex: 0 };\n\n const itemHeight = this.itemHeight > 0 ? this.itemHeight : 1;\n const viewport = this.virtualScrollHeight;\n\n let startIndex = Math.floor(this.scrollTop / itemHeight) - this.virtualBuffer;\n if (startIndex < 0) startIndex = 0;\n\n let endIndex = Math.ceil((this.scrollTop + viewport) / itemHeight) + this.virtualBuffer;\n if (endIndex > total) endIndex = total;\n\n return { startIndex, endIndex };\n }\n\n /** 虚拟滚动:撑高容器总高度 */\n private get virtualTotalHeight(): number {\n return this.data.length * (this.itemHeight > 0 ? this.itemHeight : 1);\n }\n\n private handleSort = (prop: string) => {\n if (this.sortProp === prop) {\n this.sortDirection =\n this.sortDirection === 'ascending' ? 'descending' : this.sortDirection === 'descending' ? null : 'ascending';\n } else {\n this.sortProp = prop;\n this.sortDirection = 'ascending';\n }\n this.hbSortChange.emit({ prop, order: this.sortDirection });\n };\n\n private get sortedData(): Record<string, any>[] {\n if (!this.sortProp || !this.sortDirection) return this.data;\n const direction = this.sortDirection === 'ascending' ? 1 : -1;\n return [...this.data].sort((a, b) => {\n const va = a[this.sortProp];\n const vb = b[this.sortProp];\n if (va < vb) return -1 * direction;\n if (va > vb) return 1 * direction;\n return 0;\n });\n };\n\n private get isAllSelected(): boolean {\n return this.data.length > 0 && this.selectedRows.size === this.data.length;\n }\n\n private get isIndeterminate(): boolean {\n return this.selectedRows.size > 0 && this.selectedRows.size < this.data.length;\n }\n\n private toggleRow = (index: number, e: Event) => {\n e.stopPropagation();\n const next = new Set(this.selectedRows);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n this.selectedRows = next;\n this.emitSelection();\n };\n\n private toggleAll = () => {\n if (this.isAllSelected) {\n this.selectedRows = new Set();\n } else {\n this.selectedRows = new Set(this.data.map((_, i) => i));\n }\n this.emitSelection();\n };\n\n private emitSelection() {\n const selected = Array.from(this.selectedRows)\n .sort((a, b) => a - b)\n .map((i) => this.data[i])\n .filter(Boolean);\n this.hbSelectionChange.emit(selected);\n }\n\n private handleRowClick = (row: Record<string, any>, index: number) => {\n this.currentRow = index;\n this.hbRowClick.emit({ row, index });\n };\n\n private handleAction = (row: Record<string, any>, index: number, action: string) => {\n this.hbAction.emit({ row, index, action });\n };\n\n private get hasActions(): boolean {\n return !!this.actions && this.actions.length > 0;\n }\n\n /** 计算固定列的 sticky 偏移(左侧/右侧累计宽度) */\n private get fixedOffsets(): Record<string, FixedOffset> {\n const result: Record<string, FixedOffset> = {};\n let leftAcc = '0px';\n for (const c of this.columns) {\n const side = c.fixed === true ? 'left' : c.fixed;\n if (side === 'left') {\n result[c.prop] = { side: 'left', left: leftAcc };\n leftAcc = `calc(${leftAcc} + ${c.width || '0px'})`;\n }\n }\n let rightAcc = '0px';\n for (let i = this.columns.length - 1; i >= 0; i--) {\n const c = this.columns[i];\n if (c.fixed === 'right') {\n result[c.prop] = { side: 'right', right: rightAcc };\n rightAcc = `calc(${rightAcc} + ${c.width || '0px'})`;\n }\n }\n return result;\n }\n\n private cellStyle(prop: string, base?: Record<string, string>): Record<string, string> {\n const off = this.fixedOffsets[prop];\n const style: Record<string, string> = { ...(base || {}) };\n if (off?.side === 'left') {\n style.position = 'sticky';\n style.left = off.left as string;\n style.zIndex = '2';\n } else if (off?.side === 'right') {\n style.position = 'sticky';\n style.right = off.right as string;\n style.zIndex = '2';\n }\n return style;\n }\n\n /**\n * 渲染单行(普通 + 虚拟滚动 + 树形 共用)。\n * - 普通模式:rowIndex 为在 sortedData 中的全局索引。\n * - 树形模式:fr.level 决定缩进,第一列渲染展开箭头,key 取 fr.key。\n * fr 为可选;未传时按普通模式渲染。\n */\n private renderRow(row: Record<string, any>, rowIndex: number, fr?: FlatRow) {\n const tree = !!fr;\n const level = fr ? fr.level : 0;\n const rowKeyVal = fr ? fr.key : this.rowKey ? row[this.rowKey] : rowIndex;\n const indent = level * 16;\n\n const isEditing = (prop: string) => !!this.editingCell && this.editingCell.rowKey === rowKeyVal && this.editingCell.prop === prop;\n\n return (\n <tr\n key={rowKeyVal}\n class={{\n 'hb-table__row': true,\n 'hb-table__row--striped': this.stripe && rowIndex % 2 === 1,\n 'hb-table__row--current': this.highlightCurrentRow && rowIndex === this.currentRow,\n 'hb-table__row--selected': this.selectedRows.has(rowIndex),\n 'hb-table__row--tree': tree,\n }}\n onClick={() => this.handleRowClick(row, rowIndex)}\n >\n {this.selectable && (\n <td class=\"hb-table__selection\" onClick={(e) => e.stopPropagation()}>\n <input\n type=\"checkbox\"\n class=\"hb-table__checkbox\"\n checked={this.selectedRows.has(rowIndex)}\n onChange={(e) => this.toggleRow(rowIndex, e)}\n />\n </td>\n )}\n {this.columns.map((col, colIdx) => {\n const off = this.fixedOffsets[col.prop];\n // 树形模式:第一列加缩进 + 展开箭头\n const isFirstCol = colIdx === 0;\n const showExpand = tree && isFirstCol && fr!.hasChildren;\n const expanded = showExpand && this.expandedRowKeys.indexOf(rowKeyVal) !== -1;\n const editing = this.editable && !!col.editable && isEditing(col.prop);\n const editableActive = this.editable && !!col.editable;\n\n return (\n <td\n key={col.prop}\n style={this.cellStyle(col.prop, { textAlign: col.align || 'left' })}\n class={{\n 'hb-table__td': true,\n 'hb-table__cell--fixed-left': off?.side === 'left',\n 'hb-table__cell--fixed-right': off?.side === 'right',\n 'hb-table__cell--editable': editableActive,\n }}\n onClick={editableActive ? (e) => this.startEdit(e, rowKeyVal, col.prop) : undefined}\n >\n {tree && isFirstCol && (\n <span class=\"hb-table__indent\" style={{ display: 'inline-block', width: `${indent}px` }} aria-hidden=\"true\" />\n )}\n {showExpand && (\n <button\n type=\"button\"\n class={{ 'hb-table__expand': true, 'hb-table__expand--expanded': expanded }}\n aria-label={expanded ? '收起' : '展开'}\n onClick={(e) => {\n e.stopPropagation();\n this.toggleExpand(row, rowKeyVal);\n }}\n >\n {expanded ? '▼' : '▶'}\n </button>\n )}\n {showExpand === false && tree && isFirstCol && (\n <span class=\"hb-table__expand-placeholder\" style={{ display: 'inline-block', width: '16px' }} aria-hidden=\"true\" />\n )}\n {editing ? (\n <input\n class=\"hb-table__edit-input\"\n type=\"text\"\n value={row[col.prop] ?? ''}\n onBlur={(e) => this.commitEdit(e, row, col.prop)}\n onKeyDown={(e) => this.onEditKeydown(e, row, col.prop)}\n />\n ) : (\n <slot name={`cell-${col.prop}`}>{col.formatter ? col.formatter(row, rowIndex) : row[col.prop] ?? ''}</slot>\n )}\n </td>\n );\n })}\n {this.hasActions && (\n <td class=\"hb-table__td--actions\" style={{ textAlign: 'right', whiteSpace: 'nowrap' }} onClick={(e) => e.stopPropagation()}>\n {this.actions.map((act) => (\n <button\n type=\"button\"\n class={{\n 'hb-table__action': true,\n 'hb-table__action--primary': act.type === 'primary',\n 'hb-table__action--danger': act.type === 'danger',\n }}\n disabled={act.disabled ? act.disabled(row, rowIndex) : false}\n onClick={() => this.handleAction(row, rowIndex, act.key)}\n >\n {act.label}\n </button>\n ))}\n </td>\n )}\n </tr>\n );\n }\n\n /** 渲染表头(普通 + 虚拟滚动共用,表头始终固定不随滚) */\n private renderHeader() {\n return (\n <thead>\n <tr>\n {this.selectable && (\n <th class=\"hb-table__selection\">\n <input\n type=\"checkbox\"\n class=\"hb-table__checkbox\"\n checked={this.isAllSelected}\n ref={(el) => {\n this.allCheckboxRef = el as HTMLInputElement;\n }}\n onChange={this.toggleAll}\n />\n </th>\n )}\n {this.columns.map((col) => {\n const off = this.fixedOffsets[col.prop];\n return (\n <th\n key={col.prop}\n style={this.cellStyle(col.prop, {\n width: col.width,\n minWidth: col.minWidth,\n textAlign: col.align || 'left',\n })}\n class={{\n 'hb-table__th--sortable': col.sortable,\n 'hb-table__cell--fixed-left': off?.side === 'left',\n 'hb-table__cell--fixed-right': off?.side === 'right',\n }}\n onClick={col.sortable ? () => this.handleSort(col.prop) : undefined}\n >\n <div class=\"hb-table__th-content\">\n <span>{col.label}</span>\n {col.sortable && (\n <span class=\"hb-table__sort\">\n <span class={{ 'hb-table__sort-icon': true, 'hb-table__sort-icon--active': this.sortProp === col.prop && this.sortDirection === 'ascending' }}>▲</span>\n <span class={{ 'hb-table__sort-icon': true, 'hb-table__sort-icon--active': this.sortProp === col.prop && this.sortDirection === 'descending' }}>▼</span>\n </span>\n )}\n </div>\n </th>\n );\n })}\n {this.hasActions && (\n <th class=\"hb-table__th--actions\" style={{ textAlign: 'right', whiteSpace: 'nowrap' }}>\n 操作\n </th>\n )}\n </tr>\n </thead>\n );\n }\n\n render() {\n const displayData = this.sortedData;\n const isEmpty = displayData.length === 0;\n\n // 树形模式:把可见树拍平成带 level 的行列表(仅含已展开链路上的后代)\n const flatRows: FlatRow[] = this.isTreeMode ? this.flattenTree(displayData) : [];\n\n // 虚拟滚动:固定高度滚动视口 + 撑高容器 + 仅渲染可见窗口行(绝对定位 offset)\n // 注意:树形 + 虚拟滚动组合较复杂,此处虚拟滚动沿用普通行渲染(不展开树),\n // 保留树形仅在普通模式下生效以降低风险。\n const renderVirtualBody = () => {\n const { startIndex, endIndex } = this.visibleRange;\n const offsetTop = startIndex * (this.itemHeight > 0 ? this.itemHeight : 1);\n return (\n <div\n class=\"hb-table__virtual-viewport\"\n style={{ height: `${this.virtualScrollHeight}px`, overflowY: 'auto' }}\n onScroll={this.handleVirtualScroll}\n >\n <div class=\"hb-table__virtual-spacer\" style={{ height: `${this.virtualTotalHeight}px`, position: 'relative' }}>\n <table class=\"hb-table__table hb-table__table--virtual\">\n <tbody>\n {isEmpty ? (\n <tr>\n <td colSpan={this.columns.length + (this.selectable ? 1 : 0) + (this.hasActions ? 1 : 0)} class=\"hb-table__empty\">\n {this.emptyText}\n </td>\n </tr>\n ) : (\n <tr style={{ height: `${offsetTop}px` }} aria-hidden=\"true\" />\n )}\n {displayData.slice(startIndex, endIndex).map((row, i) => this.renderRow(row, startIndex + i))}\n </tbody>\n </table>\n </div>\n </div>\n );\n };\n\n // 普通模式:树形启用时按拍平列表渲染(带 level 缩进 + 展开箭头),否则原样按行渲染\n const renderNormalBody = () => (\n <tbody>\n {isEmpty ? (\n <tr>\n <td colSpan={this.columns.length + (this.selectable ? 1 : 0) + (this.hasActions ? 1 : 0)} class=\"hb-table__empty\">\n {this.emptyText}\n </td>\n </tr>\n ) : this.isTreeMode ? (\n flatRows.map((fr, i) => this.renderRow(fr.row, i, fr))\n ) : (\n displayData.map((row, rowIndex) => this.renderRow(row, rowIndex))\n )}\n </tbody>\n );\n\n return (\n <div class={{ 'hb-table': true, [`hb-table--${this.size}`]: true, 'hb-table--border': this.border, 'hb-table--virtual': this.virtualScroll }}>\n {this.loading && (\n <div class=\"hb-table__loading\">\n <div class=\"hb-table__loading-spinner\"></div>\n </div>\n )}\n {this.virtualScroll ? (\n <div class=\"hb-table__virtual-wrapper\">\n <table class=\"hb-table__table\">\n {this.renderHeader()}\n </table>\n {renderVirtualBody()}\n </div>\n ) : (\n <div class=\"hb-table__wrapper\" style={this.maxHeight ? { maxHeight: this.maxHeight, overflow: 'auto' } : undefined}>\n <table class=\"hb-table__table\">\n {this.renderHeader()}\n {renderNormalBody()}\n </table>\n </div>\n )}\n </div>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["imagePreviewCss","HbImagePreviewStyle0","ImagePreview","modelValue","src","srcList","current","zoomStep","minZoom","maxZoom","hbClose","hbChange","zoom","rotate","keyDownHandler","e","this","key","close","prev","next","handleVisibleChange","newVal","document","addEventListener","removeEventListener","handleCurrentChange","componentDidLoad","disconnectedCallback","imageList","length","currentIndex","list","currentSrc","isMulti","emit","emitChange","index","zoomIn","Math","min","round","zoomOut","max","handleReset","handleRotateLeft","handleRotateRight","handleWheel","preventDefault","deltaY","handleOverlayClick","target","currentTarget","stopAndClose","stopPropagation","render","imgStyle","transform","h","class","onClick","alt","style","onWheel","type"],"sources":["src/components/ImagePreview/image-preview.css?tag=hb-image-preview&encapsulation=shadow","src/components/ImagePreview/ImagePreview.tsx"],"sourcesContent":[":host {\n display: contents;\n}\n\n.hb-image-preview {\n position: fixed;\n inset: 0;\n z-index: var(--hb-z-index-modal-mask, 2000);\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--hb-color-bg-mask, rgba(0, 0, 0, 0.5));\n}\n\n.hb-image-preview__wrapper {\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.hb-image-preview__img {\n max-width: 90vw;\n max-height: 90vh;\n object-fit: contain;\n user-select: none;\n transition: transform 0.2s ease;\n pointer-events: none;\n}\n\n.hb-image-preview__btn {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: 44px;\n height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 50%;\n background-color: rgba(0, 0, 0, 0.4);\n color: var(--hb-color-text-inverse, #ffffff);\n font-size: 28px;\n line-height: 1;\n cursor: pointer;\n transition: background-color var(--hb-transition-duration, 0.2s) ease;\n}\n\n.hb-image-preview__btn:hover {\n background-color: rgba(0, 0, 0, 0.6);\n}\n\n.hb-image-preview__btn--prev {\n left: 24px;\n}\n\n.hb-image-preview__btn--next {\n right: 24px;\n}\n\n.hb-image-preview__toolbar {\n position: absolute;\n bottom: 32px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n border-radius: var(--hb-border-radius-base, 4px);\n background-color: rgba(0, 0, 0, 0.5);\n color: var(--hb-color-text-inverse, #ffffff);\n}\n\n.hb-image-preview__tool {\n min-width: 32px;\n height: 32px;\n padding: 0 8px;\n border: none;\n border-radius: var(--hb-border-radius-sm, 2px);\n background: transparent;\n color: var(--hb-color-text-inverse, #ffffff);\n font-size: 16px;\n cursor: pointer;\n transition: background-color var(--hb-transition-duration, 0.2s) ease;\n}\n\n.hb-image-preview__tool:hover {\n background-color: rgba(255, 255, 255, 0.15);\n}\n\n.hb-image-preview__tool-label {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 48px;\n padding: 0 4px;\n font-size: 13px;\n color: var(--hb-color-text-inverse, #ffffff);\n}\n\n.hb-image-preview__close {\n position: absolute;\n top: 24px;\n right: 24px;\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: 50%;\n background-color: rgba(0, 0, 0, 0.4);\n color: var(--hb-color-text-inverse, #ffffff);\n font-size: 28px;\n line-height: 1;\n cursor: pointer;\n transition: background-color var(--hb-transition-duration, 0.2s) ease;\n}\n\n.hb-image-preview__close:hover {\n background-color: rgba(0, 0, 0, 0.6);\n}\n","import { Component, h, Prop, Event, EventEmitter, State, Watch, Element } from '@stencil/core';\n\nexport interface ImagePreviewChangeDetail {\n src: string;\n index: number;\n}\n\n/**\n * ImagePreview 图片预览组件\n * 点击图片后展示大图,支持缩放、旋转、多图切换\n */\n@Component({\n tag: 'hb-image-preview',\n styleUrl: 'image-preview.css',\n shadow: true,\n})\nexport class ImagePreview {\n @Element() el: HTMLElement;\n\n /** 是否显示预览(受控,可双向) */\n @Prop({ mutable: true }) modelValue: boolean = false;\n\n /** 单图源(srcList 为空时使用) */\n @Prop() src: string = '';\n\n /** 多图源列表 */\n @Prop() srcList: string[] = [];\n\n /** 多图当前索引 */\n @Prop({ mutable: true }) current: number = 0;\n\n /** 单次缩放步长 */\n @Prop() zoomStep: number = 0.2;\n\n /** 最小缩放比例 */\n @Prop() minZoom: number = 0.5;\n\n /** 最大缩放比例 */\n @Prop() maxZoom: number = 3;\n\n /** 关闭事件 */\n @Event() hbClose: EventEmitter<void>;\n\n /** 切换事件,detail 为 { src, index } */\n @Event() hbChange: EventEmitter<ImagePreviewChangeDetail>;\n\n /** 当前缩放比例 */\n @State() zoom: number = 1;\n\n /** 当前旋转角度 */\n @State() rotate: number = 0;\n\n private keyDownHandler = (e: KeyboardEvent) => {\n if (!this.modelValue) return;\n if (e.key === 'Escape') {\n this.close();\n } else if (e.key === 'ArrowLeft') {\n this.prev();\n } else if (e.key === 'ArrowRight') {\n this.next();\n }\n };\n\n @Watch('modelValue')\n handleVisibleChange(newVal: boolean) {\n if (newVal) {\n // 打开时重置缩放与旋转\n this.zoom = 1;\n this.rotate = 0;\n document.addEventListener('keydown', this.keyDownHandler);\n } else {\n document.removeEventListener('keydown', this.keyDownHandler);\n }\n }\n\n @Watch('current')\n handleCurrentChange() {\n // 切换图片时重置变换\n this.zoom = 1;\n this.rotate = 0;\n }\n\n componentDidLoad() {\n if (this.modelValue) {\n document.addEventListener('keydown', this.keyDownHandler);\n }\n }\n\n disconnectedCallback() {\n document.removeEventListener('keydown', this.keyDownHandler);\n }\n\n /** 实际可切换的图片列表 */\n private get imageList(): string[] {\n if (this.srcList && this.srcList.length > 0) {\n return this.srcList;\n }\n return this.src ? [this.src] : [];\n }\n\n private get currentIndex(): number {\n const list = this.imageList;\n if (list.length === 0) return 0;\n if (this.current < 0) return 0;\n if (this.current >= list.length) return list.length - 1;\n return this.current;\n }\n\n private get currentSrc(): string {\n const list = this.imageList;\n if (list.length === 0) return '';\n return list[this.currentIndex] || '';\n }\n\n private get isMulti(): boolean {\n return this.imageList.length > 1;\n }\n\n private close = () => {\n this.modelValue = false;\n this.hbClose.emit();\n };\n\n private emitChange() {\n this.hbChange.emit({ src: this.currentSrc, index: this.currentIndex });\n }\n\n private next = () => {\n const list = this.imageList;\n if (list.length <= 1) return;\n this.current = (this.currentIndex + 1) % list.length;\n this.emitChange();\n };\n\n private prev = () => {\n const list = this.imageList;\n if (list.length <= 1) return;\n this.current = (this.currentIndex - 1 + list.length) % list.length;\n this.emitChange();\n };\n\n private zoomIn = () => {\n const next = Math.min(this.zoom + this.zoomStep, this.maxZoom);\n this.zoom = Math.round(next * 100) / 100;\n };\n\n private zoomOut = () => {\n const next = Math.max(this.zoom - this.zoomStep, this.minZoom);\n this.zoom = Math.round(next * 100) / 100;\n };\n\n private handleReset = () => {\n this.zoom = 1;\n this.rotate = 0;\n };\n\n private handleRotateLeft = () => {\n this.rotate = this.rotate - 90;\n };\n\n private handleRotateRight = () => {\n this.rotate = this.rotate + 90;\n };\n\n /** 滚轮缩放 */\n private handleWheel = (e: WheelEvent) => {\n // TODO: 平滑缩放 + 图片中心锚点;当前实现为基础步长缩放\n e.preventDefault();\n if (e.deltaY < 0) {\n this.zoomIn();\n } else {\n this.zoomOut();\n }\n };\n\n /** 点击遮罩空白处关闭 */\n private handleOverlayClick = (e: MouseEvent) => {\n if (e.target === e.currentTarget) {\n this.close();\n }\n };\n\n private stopAndClose = (e: MouseEvent) => {\n e.stopPropagation();\n this.close();\n };\n\n render() {\n if (!this.modelValue) return null;\n\n const imgStyle = {\n transform: `scale(${this.zoom}) rotate(${this.rotate}deg)`,\n };\n\n return (\n <div class=\"hb-image-preview\" onClick={this.handleOverlayClick}>\n <div class=\"hb-image-preview__wrapper\">\n <img\n class=\"hb-image-preview__img\"\n src={this.currentSrc}\n alt=\"\"\n style={imgStyle}\n onWheel={this.handleWheel}\n />\n </div>\n\n {this.isMulti && (\n <button\n type=\"button\"\n class=\"hb-image-preview__btn hb-image-preview__btn--prev\"\n onClick={this.prev}\n aria-label=\"上一张\"\n >\n ‹\n </button>\n )}\n {this.isMulti && (\n <button\n type=\"button\"\n class=\"hb-image-preview__btn hb-image-preview__btn--next\"\n onClick={this.next}\n aria-label=\"下一张\"\n >\n ›\n </button>\n )}\n\n <div class=\"hb-image-preview__toolbar\" onClick={(e) => e.stopPropagation()}>\n <button type=\"button\" class=\"hb-image-preview__tool\" onClick={this.zoomOut} aria-label=\"缩小\">\n -\n </button>\n <span class=\"hb-image-preview__tool-label\">{Math.round(this.zoom * 100)}%</span>\n <button type=\"button\" class=\"hb-image-preview__tool\" onClick={this.zoomIn} aria-label=\"放大\">\n +\n </button>\n <button type=\"button\" class=\"hb-image-preview__tool\" onClick={this.handleRotateLeft} aria-label=\"左旋\">\n ↺\n </button>\n <button type=\"button\" class=\"hb-image-preview__tool\" onClick={this.handleRotateRight} aria-label=\"右旋\">\n ↻\n </button>\n <button type=\"button\" class=\"hb-image-preview__tool\" onClick={this.handleReset} aria-label=\"重置\">\n ⟲\n </button>\n <button type=\"button\" class=\"hb-image-preview__tool\" onClick={this.stopAndClose} aria-label=\"关闭\">\n ✕\n </button>\n </div>\n\n <button\n type=\"button\"\n class=\"hb-image-preview__close\"\n onClick={this.stopAndClose}\n aria-label=\"关闭\"\n >\n ×\n </button>\n </div>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}