huibo-ui 0.5.0 → 0.6.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 (69) hide show
  1. package/dist/cjs/hb-form-item.cjs.entry.js +59 -9
  2. package/dist/cjs/hb-form-item.cjs.entry.js.map +1 -1
  3. package/dist/cjs/hb-form.cjs.entry.js +105 -2
  4. package/dist/cjs/hb-form.cjs.entry.js.map +1 -1
  5. package/dist/cjs/hb-select.cjs.entry.js +82 -10
  6. package/dist/cjs/hb-select.cjs.entry.js.map +1 -1
  7. package/dist/cjs/hb-steps.cjs.entry.js +1 -1
  8. package/dist/cjs/hb-steps.cjs.entry.js.map +1 -1
  9. package/dist/cjs/hb-table.cjs.entry.js +195 -27
  10. package/dist/cjs/hb-table.cjs.entry.js.map +1 -1
  11. package/dist/cjs/huibo-ui.cjs.js +1 -1
  12. package/dist/cjs/loader.cjs.js +1 -1
  13. package/dist/collection/components/Form/Form.js +205 -2
  14. package/dist/collection/components/Form/Form.js.map +1 -1
  15. package/dist/collection/components/Form/FormItem.js +117 -10
  16. package/dist/collection/components/Form/FormItem.js.map +1 -1
  17. package/dist/collection/components/Select/Select.js +105 -10
  18. package/dist/collection/components/Select/Select.js.map +1 -1
  19. package/dist/collection/components/Table/Table.js +273 -27
  20. package/dist/collection/components/Table/Table.js.map +1 -1
  21. package/dist/collection/utils/virtual-scroll.js +39 -0
  22. package/dist/collection/utils/virtual-scroll.js.map +1 -0
  23. package/dist/components/hb-form-item.js +62 -9
  24. package/dist/components/hb-form-item.js.map +1 -1
  25. package/dist/components/hb-form.js +110 -2
  26. package/dist/components/hb-form.js.map +1 -1
  27. package/dist/components/hb-select.js +87 -11
  28. package/dist/components/hb-select.js.map +1 -1
  29. package/dist/components/hb-steps.js +1 -1
  30. package/dist/components/hb-steps.js.map +1 -1
  31. package/dist/components/hb-table.js +203 -29
  32. package/dist/components/hb-table.js.map +1 -1
  33. package/dist/esm/hb-form-item.entry.js +59 -9
  34. package/dist/esm/hb-form-item.entry.js.map +1 -1
  35. package/dist/esm/hb-form.entry.js +105 -2
  36. package/dist/esm/hb-form.entry.js.map +1 -1
  37. package/dist/esm/hb-select.entry.js +82 -10
  38. package/dist/esm/hb-select.entry.js.map +1 -1
  39. package/dist/esm/hb-steps.entry.js +1 -1
  40. package/dist/esm/hb-steps.entry.js.map +1 -1
  41. package/dist/esm/hb-table.entry.js +195 -27
  42. package/dist/esm/hb-table.entry.js.map +1 -1
  43. package/dist/esm/huibo-ui.js +1 -1
  44. package/dist/esm/loader.js +1 -1
  45. package/dist/huibo-ui/huibo-ui.esm.js +1 -1
  46. package/dist/huibo-ui/huibo-ui.esm.js.map +1 -1
  47. package/dist/huibo-ui/{p-79b24b83.entry.js → p-2cf5bf20.entry.js} +2 -2
  48. package/dist/huibo-ui/{p-79b24b83.entry.js.map → p-2cf5bf20.entry.js.map} +1 -1
  49. package/dist/huibo-ui/p-4148d875.entry.js +2 -0
  50. package/dist/huibo-ui/p-4148d875.entry.js.map +1 -0
  51. package/dist/huibo-ui/{p-54a28052.entry.js → p-6bfe1954.entry.js} +2 -2
  52. package/dist/huibo-ui/p-6bfe1954.entry.js.map +1 -0
  53. package/dist/huibo-ui/{p-ac18c68b.entry.js → p-e8824b2c.entry.js} +2 -2
  54. package/dist/huibo-ui/p-e8824b2c.entry.js.map +1 -0
  55. package/dist/huibo-ui/p-f69599fa.entry.js +2 -0
  56. package/dist/huibo-ui/p-f69599fa.entry.js.map +1 -0
  57. package/dist/types/components/Form/Form.d.ts +57 -0
  58. package/dist/types/components/Form/FormItem.d.ts +23 -0
  59. package/dist/types/components/Select/Select.d.ts +19 -0
  60. package/dist/types/components/Table/Table.d.ts +103 -8
  61. package/dist/types/components.d.ts +148 -2
  62. package/dist/types/utils/virtual-scroll.d.ts +38 -0
  63. package/package.json +1 -1
  64. package/dist/huibo-ui/p-29092b85.entry.js +0 -2
  65. package/dist/huibo-ui/p-29092b85.entry.js.map +0 -1
  66. package/dist/huibo-ui/p-2bc30b1b.entry.js +0 -2
  67. package/dist/huibo-ui/p-2bc30b1b.entry.js.map +0 -1
  68. package/dist/huibo-ui/p-54a28052.entry.js.map +0 -1
  69. package/dist/huibo-ui/p-ac18c68b.entry.js.map +0 -1
@@ -22,7 +22,7 @@ import { SegmentedOption } from "./components/Segmented/Segmented";
22
22
  import { SelectOption } from "./components/Select/Select";
23
23
  import { SliderMark } from "./components/Slider/Slider";
24
24
  import { StepStatus } from "./components/Steps/Steps";
25
- import { SortDirection, TableAction, TableColumn, TableTreeProps } from "./components/Table/Table";
25
+ import { SortDirection, TableAction, TableColumn, TablePagination, TableTreeProps } from "./components/Table/Table";
26
26
  import { TimelineItem } from "./components/Timeline/Timeline";
27
27
  import { TourStep } from "./components/Tour/Tour";
28
28
  import { TransferDataItem } from "./components/Transfer/Transfer";
@@ -46,7 +46,7 @@ export { SegmentedOption } from "./components/Segmented/Segmented";
46
46
  export { SelectOption } from "./components/Select/Select";
47
47
  export { SliderMark } from "./components/Slider/Slider";
48
48
  export { StepStatus } from "./components/Steps/Steps";
49
- export { SortDirection, TableAction, TableColumn, TableTreeProps } from "./components/Table/Table";
49
+ export { SortDirection, TableAction, TableColumn, TablePagination, TableTreeProps } from "./components/Table/Table";
50
50
  export { TimelineItem } from "./components/Timeline/Timeline";
51
51
  export { TourStep } from "./components/Tour/Tour";
52
52
  export { TransferDataItem } from "./components/Transfer/Transfer";
@@ -1000,6 +1000,10 @@ export namespace Components {
1000
1000
  * 是否禁用
1001
1001
  */
1002
1002
  "disabled": boolean;
1003
+ /**
1004
+ * F1:初始值(非受控)。挂载后把这些值写到对应字段的子控件 modelValue。 key = FormItem 的 prop。
1005
+ */
1006
+ "initialValues"?: Record<string, any>;
1003
1007
  /**
1004
1008
  * 是否行内表单
1005
1009
  */
@@ -1024,6 +1028,18 @@ export namespace Components {
1024
1028
  * 表单数据对象
1025
1029
  */
1026
1030
  "model": Record<string, any>;
1031
+ /**
1032
+ * F2:提交且校验通过后的回调。参数为各字段当前值组成的对象。 由表单 submit(form onSubmit)触发——表单内放 type="submit" 的按钮即可。
1033
+ */
1034
+ "onFinish"?: (values: Record<string, any>) => void;
1035
+ /**
1036
+ * F2:提交且校验失败后的回调。
1037
+ */
1038
+ "onFinishFailed"?: (errors: { prop: string; errors: string[] }[]) => void;
1039
+ /**
1040
+ * F3:任意字段值变化时的回调。参数为 { prop, value, values }。 由子控件冒泡的 hbChange 触发。
1041
+ */
1042
+ "onValuesChange"?: (info: { prop: string; value: any; values: Record<string, any> }) => void;
1027
1043
  /**
1028
1044
  * 重置表单
1029
1045
  */
@@ -1041,6 +1057,10 @@ export namespace Components {
1041
1057
  * @returns 是否验证通过
1042
1058
  */
1043
1059
  "validate": () => Promise<boolean>;
1060
+ /**
1061
+ * F4:校验提示模板。覆盖默认的「{label}不能为空」「{label}格式不正确」等文案。 支持 {label} 占位符。仅对未在 rule.message 显式指定消息的规则生效。
1062
+ */
1063
+ "validateMessages"?: { required?: string; pattern?: string; email?: string; min?: string; max?: string };
1044
1064
  }
1045
1065
  /**
1046
1066
  * FormItem 表单项组件
@@ -1048,10 +1068,22 @@ export namespace Components {
1048
1068
  */
1049
1069
  interface HbFormItem {
1050
1070
  "getValue": () => any;
1071
+ /**
1072
+ * F6:手动错误/帮助文案(配合 validateStatus='error' 显示自定义提示)
1073
+ */
1074
+ "help"?: string;
1051
1075
  /**
1052
1076
  * 标签文本
1053
1077
  */
1054
1078
  "label": string;
1079
+ /**
1080
+ * F7:标签栅格占比(1-24)。未设置时用 labelWidth。 对齐 antd labelCol(简化为纯数字栅格,labelCol.span)。
1081
+ */
1082
+ "labelCol"?: number;
1083
+ /**
1084
+ * @deprecated use camelCase instead. Support for dash-casing will be removed in Stencil v5.
1085
+ */
1086
+ "label-col"?: number;
1055
1087
  /**
1056
1088
  * 标签宽度
1057
1089
  */
@@ -1081,6 +1113,14 @@ export namespace Components {
1081
1113
  * 验证此字段
1082
1114
  */
1083
1115
  "validate": () => Promise<string[]>;
1116
+ /**
1117
+ * F6:手动校验态('success' | 'warning' | 'error' | 'validating' | '')。 设置后覆盖内部校验结果驱动的错误显示(对齐 antd validateStatus)。
1118
+ */
1119
+ "validateStatus"?: '' | 'success' | 'warning' | 'error' | 'validating';
1120
+ /**
1121
+ * @deprecated use camelCase instead. Support for dash-casing will be removed in Stencil v5.
1122
+ */
1123
+ "validate-status"?: '' | 'success' | 'warning' | 'error' | 'validating';
1084
1124
  }
1085
1125
  /**
1086
1126
  * Container Header 组件
@@ -2103,6 +2143,14 @@ export namespace Components {
2103
2143
  * @default false
2104
2144
  */
2105
2145
  "disabled": boolean;
2146
+ /**
2147
+ * V1:下拉最大高度(px)。virtual=true 时必填(定义视口高度)。默认 256。
2148
+ */
2149
+ "dropdownMaxHeight": number;
2150
+ /**
2151
+ * @deprecated use camelCase instead. Support for dash-casing will be removed in Stencil v5.
2152
+ */
2153
+ "dropdown-max-height"?: number;
2106
2154
  /**
2107
2155
  * 自定义过滤方法
2108
2156
  */
@@ -2145,6 +2193,18 @@ export namespace Components {
2145
2193
  * 输入框尺寸
2146
2194
  */
2147
2195
  "size": 'large' | 'default' | 'small';
2196
+ /**
2197
+ * V1:是否开启虚拟滚动(1000+ 选项时推荐)。默认 false。 开启后下拉仅渲染可见窗口内的选项,DOM 节点数恒定。
2198
+ */
2199
+ "virtual": boolean;
2200
+ /**
2201
+ * V1:虚拟滚动每项预估高度(px)。默认 34。
2202
+ */
2203
+ "virtualItemHeight": number;
2204
+ /**
2205
+ * @deprecated use camelCase instead. Support for dash-casing will be removed in Stencil v5.
2206
+ */
2207
+ "virtual-item-height"?: number;
2148
2208
  }
2149
2209
  /**
2150
2210
  * Skeleton 骨架屏组件
@@ -2526,6 +2586,14 @@ export namespace Components {
2526
2586
  * @deprecated use camelCase instead. Support for dash-casing will be removed in Stencil v5.
2527
2587
  */
2528
2588
  "max-height"?: string;
2589
+ /**
2590
+ * 内置分页配置(T1)。传入后 Table 自动对 data 切片并在底部渲染 <hb-pagination>。 不传则不分页(向后兼容)。
2591
+ */
2592
+ "pagination"?: TablePagination;
2593
+ /**
2594
+ * 行 className(函数,按行返回附加 class,T8)
2595
+ */
2596
+ "rowClassName"?: (row: Record<string, any>, index: number) => string;
2529
2597
  /**
2530
2598
  * 行数据的 Key
2531
2599
  */
@@ -4340,6 +4408,8 @@ declare global {
4340
4408
  "hbAction": { row: Record<string, any>; index: number; action: string };
4341
4409
  "hbExpandChange": { expanded: boolean; row: Record<string, any> };
4342
4410
  "hbCellChange": { row: Record<string, any>; prop: string; value: any };
4411
+ "hbPageChange": { current: number; pageSize: number };
4412
+ "hbFilterChange": { prop: string; values: (string | number)[] };
4343
4413
  }
4344
4414
  /**
4345
4415
  * Table 表格组件
@@ -5724,6 +5794,10 @@ declare namespace LocalJSX {
5724
5794
  * 是否禁用
5725
5795
  */
5726
5796
  "disabled"?: boolean;
5797
+ /**
5798
+ * F1:初始值(非受控)。挂载后把这些值写到对应字段的子控件 modelValue。 key = FormItem 的 prop。
5799
+ */
5800
+ "initialValues"?: Record<string, any>;
5727
5801
  /**
5728
5802
  * 是否行内表单
5729
5803
  */
@@ -5748,6 +5822,18 @@ declare namespace LocalJSX {
5748
5822
  * 表单数据对象
5749
5823
  */
5750
5824
  "model"?: Record<string, any>;
5825
+ /**
5826
+ * F2:提交且校验通过后的回调。参数为各字段当前值组成的对象。 由表单 submit(form onSubmit)触发——表单内放 type="submit" 的按钮即可。
5827
+ */
5828
+ "onFinish"?: (values: Record<string, any>) => void;
5829
+ /**
5830
+ * F2:提交且校验失败后的回调。
5831
+ */
5832
+ "onFinishFailed"?: (errors: { prop: string; errors: string[] }[]) => void;
5833
+ /**
5834
+ * F3:任意字段值变化时的回调。参数为 { prop, value, values }。 由子控件冒泡的 hbChange 触发。
5835
+ */
5836
+ "onValuesChange"?: (info: { prop: string; value: any; values: Record<string, any> }) => void;
5751
5837
  /**
5752
5838
  * 重置表单
5753
5839
  */
@@ -5765,6 +5851,10 @@ declare namespace LocalJSX {
5765
5851
  * @returns 是否验证通过
5766
5852
  */
5767
5853
  "validate"?: () => Promise<boolean>;
5854
+ /**
5855
+ * F4:校验提示模板。覆盖默认的「{label}不能为空」「{label}格式不正确」等文案。 支持 {label} 占位符。仅对未在 rule.message 显式指定消息的规则生效。
5856
+ */
5857
+ "validateMessages"?: { required?: string; pattern?: string; email?: string; min?: string; max?: string };
5768
5858
  }
5769
5859
  /**
5770
5860
  * FormItem 表单项组件
@@ -5772,10 +5862,22 @@ declare namespace LocalJSX {
5772
5862
  */
5773
5863
  interface HbFormItem {
5774
5864
  "getValue"?: () => any;
5865
+ /**
5866
+ * F6:手动错误/帮助文案(配合 validateStatus='error' 显示自定义提示)
5867
+ */
5868
+ "help"?: string;
5775
5869
  /**
5776
5870
  * 标签文本
5777
5871
  */
5778
5872
  "label"?: string;
5873
+ /**
5874
+ * F7:标签栅格占比(1-24)。未设置时用 labelWidth。 对齐 antd labelCol(简化为纯数字栅格,labelCol.span)。
5875
+ */
5876
+ "labelCol"?: number;
5877
+ /**
5878
+ * @deprecated use camelCase instead. Support for dash-casing will be removed in Stencil v5.
5879
+ */
5880
+ "label-col"?: number;
5779
5881
  /**
5780
5882
  * 标签宽度
5781
5883
  */
@@ -5805,6 +5907,14 @@ declare namespace LocalJSX {
5805
5907
  * 验证此字段
5806
5908
  */
5807
5909
  "validate"?: () => Promise<string[]>;
5910
+ /**
5911
+ * F6:手动校验态('success' | 'warning' | 'error' | 'validating' | '')。 设置后覆盖内部校验结果驱动的错误显示(对齐 antd validateStatus)。
5912
+ */
5913
+ "validateStatus"?: '' | 'success' | 'warning' | 'error' | 'validating';
5914
+ /**
5915
+ * @deprecated use camelCase instead. Support for dash-casing will be removed in Stencil v5.
5916
+ */
5917
+ "validate-status"?: '' | 'success' | 'warning' | 'error' | 'validating';
5808
5918
  }
5809
5919
  /**
5810
5920
  * Container Header 组件
@@ -6899,6 +7009,14 @@ declare namespace LocalJSX {
6899
7009
  * @default false
6900
7010
  */
6901
7011
  "disabled"?: boolean;
7012
+ /**
7013
+ * V1:下拉最大高度(px)。virtual=true 时必填(定义视口高度)。默认 256。
7014
+ */
7015
+ "dropdownMaxHeight"?: number;
7016
+ /**
7017
+ * @deprecated use camelCase instead. Support for dash-casing will be removed in Stencil v5.
7018
+ */
7019
+ "dropdown-max-height"?: number;
6902
7020
  /**
6903
7021
  * 自定义过滤方法
6904
7022
  */
@@ -6949,6 +7067,18 @@ declare namespace LocalJSX {
6949
7067
  * 输入框尺寸
6950
7068
  */
6951
7069
  "size"?: 'large' | 'default' | 'small';
7070
+ /**
7071
+ * V1:是否开启虚拟滚动(1000+ 选项时推荐)。默认 false。 开启后下拉仅渲染可见窗口内的选项,DOM 节点数恒定。
7072
+ */
7073
+ "virtual"?: boolean;
7074
+ /**
7075
+ * V1:虚拟滚动每项预估高度(px)。默认 34。
7076
+ */
7077
+ "virtualItemHeight"?: number;
7078
+ /**
7079
+ * @deprecated use camelCase instead. Support for dash-casing will be removed in Stencil v5.
7080
+ */
7081
+ "virtual-item-height"?: number;
6952
7082
  }
6953
7083
  /**
6954
7084
  * Skeleton 骨架屏组件
@@ -7354,6 +7484,14 @@ declare namespace LocalJSX {
7354
7484
  * 树形行展开/收起事件
7355
7485
  */
7356
7486
  "onHbExpandChange"?: (event: HbTableCustomEvent<{ expanded: boolean; row: Record<string, any> }>) => void;
7487
+ /**
7488
+ * T3 筛选变化事件 { prop, values }
7489
+ */
7490
+ "onHbFilterChange"?: (event: HbTableCustomEvent<{ prop: string; values: (string | number)[] }>) => void;
7491
+ /**
7492
+ * T1 分页变化事件 { current, pageSize }
7493
+ */
7494
+ "onHbPageChange"?: (event: HbTableCustomEvent<{ current: number; pageSize: number }>) => void;
7357
7495
  /**
7358
7496
  * 行点击事件
7359
7497
  */
@@ -7366,6 +7504,14 @@ declare namespace LocalJSX {
7366
7504
  * 排序变化事件
7367
7505
  */
7368
7506
  "onHbSortChange"?: (event: HbTableCustomEvent<{ prop: string; order: SortDirection }>) => void;
7507
+ /**
7508
+ * 内置分页配置(T1)。传入后 Table 自动对 data 切片并在底部渲染 <hb-pagination>。 不传则不分页(向后兼容)。
7509
+ */
7510
+ "pagination"?: TablePagination;
7511
+ /**
7512
+ * 行 className(函数,按行返回附加 class,T8)
7513
+ */
7514
+ "rowClassName"?: (row: Record<string, any>, index: number) => string;
7369
7515
  /**
7370
7516
  * 行数据的 Key
7371
7517
  */
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 通用虚拟滚动工具(V1,包2)。
3
+ *
4
+ * 从 Table 的虚拟滚动逻辑提取,供 Select/Cascader/Tree/TreeSelect/Menu 复用。
5
+ * 仅渲染「可见窗口 + 上下缓冲」范围的项,而非全量列表——1000+ 选项时 DOM 节点数恒定。
6
+ *
7
+ * 用法(组件内):
8
+ * 1. 维护 scrollTop state(onScroll 回调更新)
9
+ * 2. 调 getVirtualRange({ total, itemHeight, viewportHeight, scrollTop, buffer }) 得 [start, end)
10
+ * 3. 仅渲染 list.slice(start, end),用 getOffsetTop(start, itemHeight) 撑出顶部空白
11
+ */
12
+ export interface VirtualRangeOptions {
13
+ /** 列表总项数 */
14
+ total: number;
15
+ /** 每项高度(px),>0 */
16
+ itemHeight: number;
17
+ /** 视口高度(px) */
18
+ viewportHeight: number;
19
+ /** 当前滚动位置(px) */
20
+ scrollTop: number;
21
+ /** 上下缓冲行数(默认 5) */
22
+ buffer?: number;
23
+ }
24
+ export interface VirtualRange {
25
+ /** 起始索引(含) */
26
+ startIndex: number;
27
+ /** 结束索引(不含) */
28
+ endIndex: number;
29
+ }
30
+ /**
31
+ * 计算可见窗口 [startIndex, endIndex)。
32
+ * startIndex 夹到 [0, total),endIndex 夹到 [0, total]。
33
+ */
34
+ export declare function getVirtualRange(opts: VirtualRangeOptions): VirtualRange;
35
+ /** 撑出顶部空白高度(px),用于偏移可见窗口到正确滚动位置。 */
36
+ export declare function getOffsetTop(startIndex: number, itemHeight: number): number;
37
+ /** 容器总高度(px),用于撑出滚动条。 */
38
+ export declare function getTotalHeight(total: number, itemHeight: number): number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "huibo-ui",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "type": "module",
5
5
  "description": "Stencil Component Starter",
6
6
  "main": "dist/index.cjs.js",
@@ -1,2 +0,0 @@
1
- import{r as t,c as e,h as i}from"./p-e42dfa95.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-border-style:solid;--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;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@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{.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inline-block{display:inline-block}.border{border-style:var(--tw-border-style);border-width:1px}.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)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}} /*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */@layer properties{}@layer base{}@layer components;:host{display:block}.hb-table{background-color:var(--hb-color-bg);border-radius:var(--hb-border-radius-base);overflow:hidden;position:relative}.hb-table--border{border:1px solid var(--hb-color-border-secondary)}.hb-table--border .hb-table__table th,.hb-table--border .hb-table__td{border-right:1px solid var(--hb-color-border-secondary)}.hb-table__wrapper{overflow-x:auto}.hb-table__table{border-collapse:collapse;border-spacing:0;table-layout:auto;width:100%}.hb-table__table th{background-color:var(--hb-table-header-bg);border-bottom:1px solid var(--hb-color-border-secondary);color:var(--hb-table-header-color);font-size:var(--hb-font-size-sm);font-weight:600;padding:10px 12px;text-align:left;-webkit-user-select:none;user-select:none;white-space:nowrap}.hb-table__th-content{align-items:center;display:inline-flex;gap:4px}.hb-table__th--sortable{cursor:pointer}.hb-table__th--sortable:hover{background-color:var(--hb-color-fill-tertiary)}.hb-table__sort{display:inline-flex;flex-direction:column;font-size:10px;gap:1px;line-height:1}.hb-table__sort-icon{color:var(--hb-color-text-quaternary);transition:color var(--hb-transition-duration)}.hb-table__sort-icon--active{color:var(--hb-color-primary)}.hb-table__td{border-bottom:1px solid var(--hb-table-border-color);color:var(--hb-color-text);font-size:var(--hb-font-size-sm);padding:10px 12px;transition:background-color var(--hb-transition-duration)}.hb-table__row:hover .hb-table__td{background-color:var(--hb-table-row-hover-bg)}.hb-table__row--striped .hb-table__td{background-color:var(--hb-table-stripe-bg)}.hb-table__row--current .hb-table__td{background-color:var(--hb-color-primary-bg)}.hb-table__empty{color:var(--hb-color-text-secondary);padding:var(--hb-spacing-xl)0;text-align:center}.hb-table__loading{align-items:center;background-color:#ffffffb3;display:flex;inset:0;justify-content:center;position:absolute;z-index:1}.hb-table__loading-spinner{animation:hb-spin .8s linear infinite;border:3px solid var(--hb-color-border-secondary);border-radius:50%;border-top-color:var(--hb-color-primary);height:32px;width:32px}.hb-table--small .hb-table__table th,.hb-table--small .hb-table__td{font-size:var(--hb-font-size-xs);padding:6px 8px}.hb-table--large .hb-table__table th,.hb-table--large .hb-table__td{font-size:var(--hb-font-size-base);padding:14px 16px}.hb-table__selection{min-width:48px;text-align:center;white-space:nowrap;width:48px}.hb-table__checkbox{accent-color:var(--hb-color-primary);cursor:pointer;height:16px;vertical-align:middle;width:16px}.hb-table__selection .hb-table__checkbox{margin:0}.hb-table__row--selected .hb-table__td{background-color:var(--hb-color-primary-bg)}.hb-table__cell--fixed-left,.hb-table__cell--fixed-right{background-color:var(--hb-color-bg);position:sticky;z-index:2}.hb-table__table th.hb-table__cell--fixed-left,.hb-table__table th.hb-table__cell--fixed-right{background-color:var(--hb-table-header-bg)}.hb-table__cell--fixed-right{box-shadow:-4px 0 8px #0000000f}.hb-table__cell--fixed-left:not(.hb-table__cell--fixed-right){box-shadow:4px 0 8px #0000000f}.hb-table__row--selected .hb-table__cell--fixed-left,.hb-table__row--selected .hb-table__cell--fixed-right{background-color:var(--hb-color-primary-bg)}.hb-table__row:hover .hb-table__cell--fixed-left,.hb-table__row:hover .hb-table__cell--fixed-right{background-color:var(--hb-table-row-hover-bg)}@keyframes hb-spin{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.hb-table__action{background:0 0;border:none;color:var(--hb-color-primary,#1677ff);cursor:pointer;font-size:var(--hb-font-size-sm,14px);line-height:1.5;padding:0;transition:opacity var(--hb-transition-duration,.2s)}.hb-table__action:hover{opacity:.8}.hb-table__action:disabled{color:var(--hb-color-text-disabled,#c0c4cc);cursor:not-allowed}.hb-table__action--danger{color:var(--hb-color-danger,#f5222d)}.hb-table__action--danger:disabled{color:var(--hb-color-text-disabled,#c0c4cc)}.hb-table__action+.hb-table__action{margin-left:var(--hb-spacing-sm,12px)}.hb-table--virtual{overflow:hidden}.hb-table__virtual-wrapper{display:flex;flex-direction:column}.hb-table__virtual-viewport{overflow:auto;position:relative}.hb-table__virtual-spacer{position:relative;width:100%}.hb-table__table--virtual{table-layout:fixed;width:100%}.hb-table__table--virtual tbody{position:relative}.hb-table__expand{align-items:center;background:0 0;border:none;color:var(--hb-color-text-secondary,#595959);cursor:pointer;display:inline-flex;flex-shrink:0;font-size:10px;height:16px;justify-content:center;line-height:1;margin-right:4px;padding:0;transition:color var(--hb-transition-duration,.2s);vertical-align:middle;width:16px}.hb-table__expand:hover{color:var(--hb-color-primary,#1677ff)}.hb-table__row--tree .hb-table__td{white-space:nowrap}.hb-table__cell--editable{cursor:text}.hb-table__cell--editable:hover{background-color:var(--hb-color-fill-tertiary,#f5f5f5)}.hb-table__edit-input{background-color:var(--hb-color-bg,#fff);border:1px solid var(--hb-color-primary,#1677ff);border-radius:var(--hb-border-radius-base,4px);box-sizing:border-box;color:var(--hb-color-text,#262626);font-size:var(--hb-font-size-sm,14px);min-width:60px;outline:none;padding:2px 6px;width:100%}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@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}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@media (max-width:575.98px){.hb-table__table{min-width:480px}.hb-table__table thead th{background-color:var(--hb-color-bg-container,#fafafa);position:sticky;top:0;z-index:2}}';const r=a;const o=class{constructor(i){t(this,i);this.hbSortChange=e(this,"hbSortChange",7);this.hbRowClick=e(this,"hbRowClick",7);this.hbSelectionChange=e(this,"hbSelectionChange",7);this.hbAction=e(this,"hbAction",7);this.hbExpandChange=e(this,"hbExpandChange",7);this.hbCellChange=e(this,"hbCellChange",7)}data=[];columns=[];stripe=false;border=false;size="default";loading=false;rowKey="";emptyText="暂无数据";maxHeight;highlightCurrentRow=false;selectable=false;actions=[];virtualScroll=false;itemHeight=48;virtualScrollHeight=400;treeProps;editable=false;sortProp="";sortDirection=null;currentRow=-1;selectedRows=new Set;scrollTop=0;expandedRowKeys=[];editingCell=null;hbSortChange;hbRowClick;hbSelectionChange;hbAction;hbExpandChange;hbCellChange;handleDataChange(){this.selectedRows=new Set;this.emitSelection()}get isTreeMode(){return!!this.treeProps}get childrenField(){return this.treeProps&&this.treeProps.children||"children"}flattenTree(t,e=0,i=""){const a=this.childrenField;const r=[];t.forEach(((t,o)=>{const l=i?`${i}.${o}`:`${o}`;const s=this.rowKey?t[this.rowKey]:l;const n=t[a];const h=Array.isArray(n)&&n.length>0;r.push({row:t,level:e,key:s,hasChildren:h,index:o});if(h&&this.expandedRowKeys.indexOf(s)!==-1){r.push(...this.flattenTree(n,e+1,l))}}));return r}toggleExpand=(t,e)=>{const i=this.expandedRowKeys.indexOf(e);const a=i===-1;this.expandedRowKeys=a?[...this.expandedRowKeys,e]:this.expandedRowKeys.filter((t=>t!==e));this.hbExpandChange.emit({expanded:a,row:t})};startEdit=(t,e,i)=>{t.stopPropagation();if(!this.editable)return;this.editingCell={rowKey:e,prop:i}};commitEdit=(t,e,i)=>{const a=t.target;const r=a.value;e[i]=r;this.editingCell=null;this.hbCellChange.emit({row:e,prop:i,value:r})};onEditKeydown=(t,e,i)=>{if(t.key==="Enter"){t.preventDefault();this.commitEdit(t,e,i)}else if(t.key==="Escape"){t.preventDefault();this.editingCell=null}};allCheckboxRef;componentDidRender(){if(this.allCheckboxRef){this.allCheckboxRef.indeterminate=this.isIndeterminate}}virtualBuffer=5;handleVirtualScroll=t=>{const e=t.target;this.scrollTop=e.scrollTop};get visibleRange(){const t=this.data.length;if(t===0)return{startIndex:0,endIndex:0};const e=this.itemHeight>0?this.itemHeight:1;const i=this.virtualScrollHeight;let a=Math.floor(this.scrollTop/e)-this.virtualBuffer;if(a<0)a=0;let r=Math.ceil((this.scrollTop+i)/e)+this.virtualBuffer;if(r>t)r=t;return{startIndex:a,endIndex:r}}get virtualTotalHeight(){return this.data.length*(this.itemHeight>0?this.itemHeight:1)}handleSort=t=>{if(this.sortProp===t){this.sortDirection=this.sortDirection==="ascending"?"descending":this.sortDirection==="descending"?null:"ascending"}else{this.sortProp=t;this.sortDirection="ascending"}this.hbSortChange.emit({prop:t,order:this.sortDirection})};get sortedData(){if(!this.sortProp||!this.sortDirection)return this.data;const t=this.sortDirection==="ascending"?1:-1;return[...this.data].sort(((e,i)=>{const a=e[this.sortProp];const r=i[this.sortProp];if(a<r)return-1*t;if(a>r)return 1*t;return 0}))}get isAllSelected(){return this.data.length>0&&this.selectedRows.size===this.data.length}get isIndeterminate(){return this.selectedRows.size>0&&this.selectedRows.size<this.data.length}toggleRow=(t,e)=>{e.stopPropagation();const i=new Set(this.selectedRows);if(i.has(t)){i.delete(t)}else{i.add(t)}this.selectedRows=i;this.emitSelection()};toggleAll=()=>{if(this.isAllSelected){this.selectedRows=new Set}else{this.selectedRows=new Set(this.data.map(((t,e)=>e)))}this.emitSelection()};emitSelection(){const t=Array.from(this.selectedRows).sort(((t,e)=>t-e)).map((t=>this.data[t])).filter(Boolean);this.hbSelectionChange.emit(t)}handleRowClick=(t,e)=>{this.currentRow=e;this.hbRowClick.emit({row:t,index:e})};handleAction=(t,e,i)=>{this.hbAction.emit({row:t,index:e,action:i})};get hasActions(){return!!this.actions&&this.actions.length>0}_fixedOffsetsCache=null;_fixedOffsetsColumnsRef=null;getFixedOffsets(){if(this._fixedOffsetsCache&&this._fixedOffsetsColumnsRef===this.columns){return this._fixedOffsetsCache}const t={};let e="0px";for(const i of this.columns){const a=i.fixed===true?"left":i.fixed;if(a==="left"){t[i.prop]={side:"left",left:e};e=`calc(${e} + ${i.width||"0px"})`}}let i="0px";for(let e=this.columns.length-1;e>=0;e--){const a=this.columns[e];if(a.fixed==="right"){t[a.prop]={side:"right",right:i};i=`calc(${i} + ${a.width||"0px"})`}}this._fixedOffsetsCache=t;this._fixedOffsetsColumnsRef=this.columns;return t}cellStyle(t,e){const i=this.getFixedOffsets()[t];const a={...e||{}};if(i?.side==="left"){a.position="sticky";a.left=i.left;a.zIndex="2"}else if(i?.side==="right"){a.position="sticky";a.right=i.right;a.zIndex="2"}return a}renderRow(t,e,a){const r=!!a;const o=a?a.level:0;const l=a?a.key:this.rowKey?t[this.rowKey]:e;const s=o*16;const n=t=>!!this.editingCell&&this.editingCell.rowKey===l&&this.editingCell.prop===t;return i("tr",{key:l,class:{"hb-table__row":true,"hb-table__row--striped":this.stripe&&e%2===1,"hb-table__row--current":this.highlightCurrentRow&&e===this.currentRow,"hb-table__row--selected":this.selectedRows.has(e),"hb-table__row--tree":r},onClick:()=>this.handleRowClick(t,e)},this.selectable&&i("td",{class:"hb-table__selection",onClick:t=>t.stopPropagation()},i("input",{type:"checkbox",class:"hb-table__checkbox",checked:this.selectedRows.has(e),onChange:t=>this.toggleRow(e,t)})),this.columns.map(((o,h)=>{const b=this.getFixedOffsets()[o.prop];const d=h===0;const c=r&&d&&a.hasChildren;const p=c&&this.expandedRowKeys.indexOf(l)!==-1;const f=this.editable&&!!o.editable&&n(o.prop);const u=this.editable&&!!o.editable;return i("td",{key:o.prop,style:this.cellStyle(o.prop,{textAlign:o.align||"left"}),class:{"hb-table__td":true,"hb-table__cell--fixed-left":b?.side==="left","hb-table__cell--fixed-right":b?.side==="right","hb-table__cell--editable":u},onClick:u?t=>this.startEdit(t,l,o.prop):undefined},r&&d&&i("span",{class:"hb-table__indent",style:{display:"inline-block",width:`${s}px`},"aria-hidden":"true"}),c&&i("button",{type:"button",class:{"hb-table__expand":true,"hb-table__expand--expanded":p},"aria-label":p?"收起":"展开",onClick:e=>{e.stopPropagation();this.toggleExpand(t,l)}},p?"▼":"▶"),c===false&&r&&d&&i("span",{class:"hb-table__expand-placeholder",style:{display:"inline-block",width:"16px"},"aria-hidden":"true"}),f?i("input",{class:"hb-table__edit-input",type:"text",value:t[o.prop]??"",onBlur:e=>this.commitEdit(e,t,o.prop),onKeyDown:e=>this.onEditKeydown(e,t,o.prop)}):i("slot",{name:`cell-${o.prop}`},o.formatter?o.formatter(t,e):t[o.prop]??""))})),this.hasActions&&i("td",{class:"hb-table__td--actions",style:{textAlign:"right",whiteSpace:"nowrap"},onClick:t=>t.stopPropagation()},this.actions.map((a=>i("button",{type:"button",class:{"hb-table__action":true,"hb-table__action--primary":a.type==="primary","hb-table__action--danger":a.type==="danger"},disabled:a.disabled?a.disabled(t,e):false,onClick:()=>this.handleAction(t,e,a.key)},a.label)))))}renderHeader(){return i("thead",null,i("tr",null,this.selectable&&i("th",{class:"hb-table__selection"},i("input",{type:"checkbox",class:"hb-table__checkbox",checked:this.isAllSelected,ref:t=>{this.allCheckboxRef=t},onChange:this.toggleAll})),this.columns.map((t=>{const e=this.getFixedOffsets()[t.prop];return i("th",{key:t.prop,style:this.cellStyle(t.prop,{width:t.width,minWidth:t.minWidth,textAlign:t.align||"left"}),class:{"hb-table__th--sortable":t.sortable,"hb-table__cell--fixed-left":e?.side==="left","hb-table__cell--fixed-right":e?.side==="right"},onClick:t.sortable?()=>this.handleSort(t.prop):undefined},i("div",{class:"hb-table__th-content"},i("span",null,t.label),t.sortable&&i("span",{class:"hb-table__sort"},i("span",{class:{"hb-table__sort-icon":true,"hb-table__sort-icon--active":this.sortProp===t.prop&&this.sortDirection==="ascending"}},"▲"),i("span",{class:{"hb-table__sort-icon":true,"hb-table__sort-icon--active":this.sortProp===t.prop&&this.sortDirection==="descending"}},"▼"))))})),this.hasActions&&i("th",{class:"hb-table__th--actions",style:{textAlign:"right",whiteSpace:"nowrap"}},"操作")))}render(){const t=this.sortedData;const e=t.length===0;const a=this.isTreeMode?this.flattenTree(t):[];const r=()=>{const{startIndex:a,endIndex:r}=this.visibleRange;const o=a*(this.itemHeight>0?this.itemHeight:1);return i("div",{class:"hb-table__virtual-viewport",style:{height:`${this.virtualScrollHeight}px`,overflowY:"auto"},onScroll:this.handleVirtualScroll},i("div",{class:"hb-table__virtual-spacer",style:{height:`${this.virtualTotalHeight}px`,position:"relative"}},i("table",{class:"hb-table__table hb-table__table--virtual"},i("tbody",null,e?i("tr",null,i("td",{colSpan:this.columns.length+(this.selectable?1:0)+(this.hasActions?1:0),class:"hb-table__empty"},this.emptyText)):i("tr",{style:{height:`${o}px`},"aria-hidden":"true"}),t.slice(a,r).map(((t,e)=>this.renderRow(t,a+e)))))))};const o=()=>i("tbody",null,e?i("tr",null,i("td",{colSpan:this.columns.length+(this.selectable?1:0)+(this.hasActions?1:0),class:"hb-table__empty"},this.emptyText)):this.isTreeMode?a.map(((t,e)=>this.renderRow(t.row,e,t))):t.map(((t,e)=>this.renderRow(t,e))));return i("div",{class:{"hb-table":true,[`hb-table--${this.size}`]:true,"hb-table--border":this.border,"hb-table--virtual":this.virtualScroll}},this.loading&&i("div",{class:"hb-table__loading"},i("div",{class:"hb-table__loading-spinner"})),this.virtualScroll?i("div",{class:"hb-table__virtual-wrapper"},i("table",{class:"hb-table__table"},this.renderHeader()),r()):i("div",{class:"hb-table__wrapper",style:this.maxHeight?{maxHeight:this.maxHeight,overflow:"auto"}:undefined},i("table",{class:"hb-table__table"},this.renderHeader(),o())))}static get watchers(){return{data:["handleDataChange"]}}};o.style=r;export{o as hb_table};
2
- //# sourceMappingURL=p-29092b85.entry.js.map
@@ -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","_fixedOffsetsCache","_fixedOffsetsColumnsRef","getFixedOffsets","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 {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\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\n/* ============================================================\n * 响应式(移动端):\n * - 小屏强制最小宽度,避免列被挤压到不可读(保留横向滚动)\n * - sticky 表头在滚动时保持可见\n * ============================================================ */\n@media (max-width: 575.98px) {\n .hb-table__table {\n /* 最小宽度保证列内容可读,超出靠 wrapper 横向滚动 */\n min-width: 480px;\n }\n\n /* sticky 表头:横向滚动时表头跟随 */\n .hb-table__table thead th {\n position: sticky;\n top: 0;\n z-index: 2;\n background-color: var(--hb-color-bg-container, #fafafa);\n }\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 = 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 /**\n * 计算固定列的 sticky 偏移(左侧/右侧累计宽度)。\n * P1 优化:缓存结果,仅当 columns 引用变化时重算。\n * 修复前是 getter,被每个 <td>/<th> 反复调用,复杂度 O(rows×cols²)。\n */\n private _fixedOffsetsCache: Record<string, FixedOffset> | null = null;\n private _fixedOffsetsColumnsRef: TableColumn[] | null = null;\n private getFixedOffsets(): Record<string, FixedOffset> {\n if (this._fixedOffsetsCache && this._fixedOffsetsColumnsRef === this.columns) {\n return this._fixedOffsetsCache;\n }\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 this._fixedOffsetsCache = result;\n this._fixedOffsetsColumnsRef = this.columns;\n return result;\n }\n\n private cellStyle(prop: string, base?: Record<string, string>): Record<string, string> {\n const off = this.getFixedOffsets()[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 type=\"checkbox\" class=\"hb-table__checkbox\" checked={this.selectedRows.has(rowIndex)} onChange={e => this.toggleRow(rowIndex, e)} />\n </td>\n )}\n {this.columns.map((col, colIdx) => {\n const off = this.getFixedOffsets()[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 && <span class=\"hb-table__indent\" style={{ display: 'inline-block', width: `${indent}px` }} aria-hidden=\"true\" />}\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 && <span class=\"hb-table__expand-placeholder\" style={{ display: 'inline-block', width: '16px' }} aria-hidden=\"true\" />}\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.getFixedOffsets()[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 class=\"hb-table__virtual-viewport\" style={{ height: `${this.virtualScrollHeight}px`, overflowY: 'auto' }} onScroll={this.handleVirtualScroll}>\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\">{this.renderHeader()}</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,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{a as r,h as a}from"./p-00aa34c8.js";const l='/*! 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{align-items:center;color:var(--hb-color-text-placeholder,#c0c4cc);cursor:pointer;display:inline-flex;height:12px;justify-content:center;transition:color .2s;width:12px}.hb-select__tag-close svg{height:100%;width:100%}.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{align-items:center;color:var(--hb-select-placeholder-color);cursor:pointer;display:inline-flex;height:14px;justify-content:center;margin-right:8px;transition:color .2s;width:14px}.hb-select__clear svg{height:100%;width:100%}.hb-select__clear:hover{color:var(--hb-select-text-color)}.hb-select__arrow{align-items:center;color:var(--hb-select-placeholder-color);display:inline-flex;height:12px;justify-content:center;transition:transform .3s;width:12px}.hb-select__arrow svg{height:100%;width:100%}.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{align-items:center;color:var(--hb-color-primary,#1677ff);display:inline-flex;height:14px;justify-content:center;margin-right:8px;width:14px}.hb-select__menu-item-checkbox svg{height:100%;width:100%}.hb-select__menu-item--create{color:var(--hb-color-primary,#1677ff);font-weight:500}.hb-select__menu-item--create:hover{background-color:var(--hb-color-primary-bg,#e6f4ff)}.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 n=l;const h=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;listboxId=`hb-select-listbox-${Math.random().toString(36).slice(2,11)}`;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=this.defaultFirstOption?Math.max(-1,this.options.findIndex((e=>!e.disabled))):-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=a(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}get createOption(){if(!this.allowCreate||!this.filterable||!this.isOpen)return null;const e=this.searchValue.trim();if(!e)return null;const t=this.options.some((t=>String(t.label).toLowerCase()===e.toLowerCase()||String(t.value).toLowerCase()===e.toLowerCase()));if(t)return null;return{value:e,label:e}}handleCreate=()=>{const e=this.createOption;if(!e)return;if(this.multiple){const t=(this.modelValue||[]).slice();if(!t.includes(e.value))t.push(e.value);this.modelValue=t}else{this.modelValue=e.value;this.isOpen=false;this.hbVisibleChange.emit(false)}this.searchValue="";this.filteredOptions=this.options;this.updateInputValue();this.hbChange.emit(this.modelValue)};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:"b4a502d0791ec418009f85cb7f56e28dd883a29d",class:{"hb-select":true,"hb-select--open":this.isOpen,"hb-select--disabled":this.disabled,[`hb-select--${this.size}`]:true},role:"combobox","aria-haspopup":"listbox","aria-expanded":this.isOpen?"true":"false","aria-controls":this.isOpen?this.listboxId:undefined,"aria-activedescendant":this.isOpen&&this.activeOptionIndex>=0?`${this.listboxId}-opt-${this.activeOptionIndex}`:undefined},o("div",{key:"1d94bc1d92b716386d6f791e5cb0b4aa5f4e7c6b",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":"移除标签",tabIndex:0,onClick:i=>{i.stopPropagation();this.handleSelect(t||{value:e,label:String(e)})},onKeyDown:r},o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},o("path",{d:"M6 6l12 12M18 6L6 18"}))))})),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:"a3baeacc8cdbf27eba98f6598691bda8d2eb05a1",class:"hb-select__suffix"},t&&o("span",{key:"a6949d1ab21d12029532dc74d8211075d2eef3cc",class:"hb-select__clear",role:"button","aria-label":"清空",tabIndex:0,onClick:this.handleClear,onKeyDown:r},o("svg",{key:"e9c4b5432f7880392485135eeab6ea704a6b8276",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},o("path",{key:"2a8a040a65bb299cad10023d22f4875c46dfb532",d:"M6 6l12 12M18 6L6 18"}))),o("span",{key:"5b7c7a3cf6adfc64b7310e5564b447256cf317cb",class:"hb-select__arrow","aria-hidden":"true"},o("svg",{key:"72d1d5fe5ec09baf891abc60c0c08e1803c82979",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"},o("path",{key:"136724fc7a387c0831a703f5561e40b9681f7c08",d:"M6 9l6 6 6-6"}))))),this.isOpen&&o("div",{key:"25f7454d0e3bbcaacc1032d97fbcb3a7bd40300b",class:"hb-select__dropdown"},o("ul",{key:"41037c823d64c4c5b4fc7dac74c7ae39a8557867",class:"hb-select__menu",role:"listbox",id:this.listboxId},this.createOption&&o("li",{key:"25337a9a9f1ee67957aacad3c106edbc57284029",class:{"hb-select__menu-item":true,"hb-select__menu-item--create":true},role:"option","aria-selected":"false",onClick:this.handleCreate},o("span",{key:"43b94deb1f4d4ab2fac5d248a8fb538dd476e7de",class:"hb-select__menu-item-label"},"创建「",this.createOption.label,"」")),e.length===0&&!this.createOption?o("li",{class:"hb-select__menu-item hb-select__menu-item--empty","aria-disabled":"true"},"无数据"):e.map(((e,t)=>o("li",{id:`${this.listboxId}-opt-${t}`,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","aria-hidden":"true"},this.isSelected(e)?o("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":3,"stroke-linecap":"round","stroke-linejoin":"round"},o("path",{d:"M5 12l5 5L20 7"})):null),o("span",{class:"hb-select__menu-item-label"},e.label)))))))}static get watchers(){return{modelValue:["handleValueChange"],options:["handleOptionsChange"]}}};h.style=n;export{h as hb_select};
2
- //# sourceMappingURL=p-2bc30b1b.entry.js.map