@fangxinyan/lumina 0.7.0 → 0.8.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 (46) hide show
  1. package/dist/Pagination.cjs +3 -3
  2. package/dist/Pagination.js +2 -2
  3. package/dist/Select.cjs +2 -2
  4. package/dist/Select.d.cts +4 -0
  5. package/dist/Select.d.ts +4 -0
  6. package/dist/Select.js +1 -1
  7. package/dist/Splitter.cjs +2 -2
  8. package/dist/Splitter.d.cts +10 -0
  9. package/dist/Splitter.d.ts +10 -0
  10. package/dist/Splitter.js +1 -1
  11. package/dist/{Table-W4HPZ7MZ.css → Table-KB6EEBDJ.css} +28 -1
  12. package/dist/Table.cjs +4 -4
  13. package/dist/Table.d.cts +7 -1
  14. package/dist/Table.d.ts +7 -1
  15. package/dist/Table.js +3 -3
  16. package/dist/TablePro.cjs +5 -5
  17. package/dist/TablePro.js +4 -4
  18. package/dist/{Tabs-A3IG6UZ6.css → Tabs-FB2AMBWL.css} +14 -0
  19. package/dist/Tabs.cjs +2 -2
  20. package/dist/Tabs.d.cts +6 -0
  21. package/dist/Tabs.d.ts +6 -0
  22. package/dist/Tabs.js +1 -1
  23. package/dist/{chunk-WMZV7PNO.js → chunk-63RSKQID.js} +5 -1
  24. package/dist/{chunk-3EHJ5QI3.js → chunk-DURKCGEM.js} +26 -12
  25. package/dist/{chunk-BJDQVVCG.js → chunk-HQNDVNTQ.js} +1 -1
  26. package/dist/{chunk-RAK6CENJ.js → chunk-IJDM2U3B.js} +52 -35
  27. package/dist/{chunk-LOWTSOWT.js → chunk-J5UEQ3ZQ.js} +32 -5
  28. package/dist/{chunk-U7VEPMCX.cjs → chunk-JBS353O4.cjs} +32 -5
  29. package/dist/{chunk-56I6ZKGU.cjs → chunk-PJFYIXBX.cjs} +2 -2
  30. package/dist/{chunk-ENFLP7SN.cjs → chunk-PNKNZREC.cjs} +15 -5
  31. package/dist/{chunk-XZXY3XCL.cjs → chunk-RR7KWH26.cjs} +52 -35
  32. package/dist/{chunk-D7YSY5RZ.cjs → chunk-SF7BPXDJ.cjs} +26 -12
  33. package/dist/{chunk-JINKQT6H.cjs → chunk-WHBKQZU5.cjs} +6 -2
  34. package/dist/{chunk-EA3NZBCZ.js → chunk-WMISXERU.js} +14 -4
  35. package/dist/index.cjs +13 -13
  36. package/dist/index.d.cts +2 -2
  37. package/dist/index.d.ts +2 -2
  38. package/dist/index.js +7 -7
  39. package/dist/styles.css +42 -1
  40. package/docs/llms/drawer.md +8 -1
  41. package/docs/llms/select.md +19 -0
  42. package/docs/llms/splitter.md +12 -1
  43. package/docs/llms/tablepro.md +23 -1
  44. package/docs/llms/tabs.md +21 -0
  45. package/docs/llms.md +1 -1
  46. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunk56I6ZKGU_cjs = require('./chunk-56I6ZKGU.cjs');
4
- require('./chunk-D7YSY5RZ.cjs');
3
+ var chunkPJFYIXBX_cjs = require('./chunk-PJFYIXBX.cjs');
4
+ require('./chunk-SF7BPXDJ.cjs');
5
5
  require('./chunk-GFKWSDD6.cjs');
6
6
  require('./chunk-FJB3243S.cjs');
7
7
  require('./chunk-STQDKMS5.cjs');
@@ -15,5 +15,5 @@ require('./chunk-EE5KXDRK.cjs');
15
15
 
16
16
  Object.defineProperty(exports, "Pagination", {
17
17
  enumerable: true,
18
- get: function () { return chunk56I6ZKGU_cjs.Pagination; }
18
+ get: function () { return chunkPJFYIXBX_cjs.Pagination; }
19
19
  });
@@ -1,5 +1,5 @@
1
- export { Pagination } from './chunk-BJDQVVCG.js';
2
- import './chunk-3EHJ5QI3.js';
1
+ export { Pagination } from './chunk-HQNDVNTQ.js';
2
+ import './chunk-DURKCGEM.js';
3
3
  import './chunk-62VV5COT.js';
4
4
  import './chunk-3QXP2ZNP.js';
5
5
  import './chunk-UE4HFGJ6.js';
package/dist/Select.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkD7YSY5RZ_cjs = require('./chunk-D7YSY5RZ.cjs');
3
+ var chunkSF7BPXDJ_cjs = require('./chunk-SF7BPXDJ.cjs');
4
4
  require('./chunk-GFKWSDD6.cjs');
5
5
  require('./chunk-FJB3243S.cjs');
6
6
  require('./chunk-STQDKMS5.cjs');
@@ -14,5 +14,5 @@ require('./chunk-EE5KXDRK.cjs');
14
14
 
15
15
  Object.defineProperty(exports, "Select", {
16
16
  enumerable: true,
17
- get: function () { return chunkD7YSY5RZ_cjs.Select; }
17
+ get: function () { return chunkSF7BPXDJ_cjs.Select; }
18
18
  });
package/dist/Select.d.cts CHANGED
@@ -74,6 +74,8 @@ interface BaseSelectProps<T extends string | number = string> extends Omit<React
74
74
  listHeight?: number;
75
75
  /** Portal 菜单的额外内联样式,可覆盖宽度或高度。 */
76
76
  popupStyle?: React.CSSProperties;
77
+ /** 按当前选择动态禁用候选项;静态 disabled 仍然优先。 */
78
+ getOptionDisabled?: (option: SelectOption<T>, selectedValues: readonly T[]) => boolean;
77
79
  /** Controlled open state. */
78
80
  open?: boolean;
79
81
  defaultOpen?: boolean;
@@ -103,6 +105,8 @@ interface MultiSelectProps<T extends string | number = string> extends BaseSelec
103
105
  onClear?: () => void;
104
106
  /** Max selected items shown as tags before collapsing to "+N". */
105
107
  maxTagCount?: number;
108
+ /** 多选允许的最大选择数;达到上限后禁用尚未选中的候选项。 */
109
+ maxCount?: number;
106
110
  }
107
111
  type SelectProps<T extends string | number = string> = SingleSelectProps<T> | MultiSelectProps<T>;
108
112
  type SelectComponent = {
package/dist/Select.d.ts CHANGED
@@ -74,6 +74,8 @@ interface BaseSelectProps<T extends string | number = string> extends Omit<React
74
74
  listHeight?: number;
75
75
  /** Portal 菜单的额外内联样式,可覆盖宽度或高度。 */
76
76
  popupStyle?: React.CSSProperties;
77
+ /** 按当前选择动态禁用候选项;静态 disabled 仍然优先。 */
78
+ getOptionDisabled?: (option: SelectOption<T>, selectedValues: readonly T[]) => boolean;
77
79
  /** Controlled open state. */
78
80
  open?: boolean;
79
81
  defaultOpen?: boolean;
@@ -103,6 +105,8 @@ interface MultiSelectProps<T extends string | number = string> extends BaseSelec
103
105
  onClear?: () => void;
104
106
  /** Max selected items shown as tags before collapsing to "+N". */
105
107
  maxTagCount?: number;
108
+ /** 多选允许的最大选择数;达到上限后禁用尚未选中的候选项。 */
109
+ maxCount?: number;
106
110
  }
107
111
  type SelectProps<T extends string | number = string> = SingleSelectProps<T> | MultiSelectProps<T>;
108
112
  type SelectComponent = {
package/dist/Select.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Select } from './chunk-3EHJ5QI3.js';
1
+ export { Select } from './chunk-DURKCGEM.js';
2
2
  import './chunk-62VV5COT.js';
3
3
  import './chunk-3QXP2ZNP.js';
4
4
  import './chunk-UE4HFGJ6.js';
package/dist/Splitter.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkU7VEPMCX_cjs = require('./chunk-U7VEPMCX.cjs');
3
+ var chunkJBS353O4_cjs = require('./chunk-JBS353O4.cjs');
4
4
  require('./chunk-NRJXZPZR.cjs');
5
5
  require('./chunk-EE5KXDRK.cjs');
6
6
 
@@ -8,5 +8,5 @@ require('./chunk-EE5KXDRK.cjs');
8
8
 
9
9
  Object.defineProperty(exports, "Splitter", {
10
10
  enumerable: true,
11
- get: function () { return chunkU7VEPMCX_cjs.Splitter; }
11
+ get: function () { return chunkJBS353O4_cjs.Splitter; }
12
12
  });
@@ -30,6 +30,16 @@ interface SplitterProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "chil
30
30
  handleClassName?: string;
31
31
  /** 原生属性透传到拖拽手柄,可用于设置 aria-label。 */
32
32
  handleProps?: Omit<React.HTMLAttributes<HTMLDivElement>, "onPointerDown">;
33
+ /** 第一个面板的附加类名。 */
34
+ firstPaneClassName?: string;
35
+ /** 第一个面板的内联样式,优先级高于内部分栏尺寸样式。 */
36
+ firstPaneStyle?: React.CSSProperties;
37
+ /** 第二个面板的附加类名。 */
38
+ secondPaneClassName?: string;
39
+ /** 第二个面板的内联样式。 */
40
+ secondPaneStyle?: React.CSSProperties;
41
+ /** 自定义分隔手柄内容;传入 null 可隐藏默认握柄。 */
42
+ handle?: React.ReactNode;
33
43
  /** 第二个面板保留的最小尺寸。默认 24px。 */
34
44
  secondMin?: number;
35
45
  /** 可选持久化键;仅保存一个数值尺寸。 */
@@ -30,6 +30,16 @@ interface SplitterProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "chil
30
30
  handleClassName?: string;
31
31
  /** 原生属性透传到拖拽手柄,可用于设置 aria-label。 */
32
32
  handleProps?: Omit<React.HTMLAttributes<HTMLDivElement>, "onPointerDown">;
33
+ /** 第一个面板的附加类名。 */
34
+ firstPaneClassName?: string;
35
+ /** 第一个面板的内联样式,优先级高于内部分栏尺寸样式。 */
36
+ firstPaneStyle?: React.CSSProperties;
37
+ /** 第二个面板的附加类名。 */
38
+ secondPaneClassName?: string;
39
+ /** 第二个面板的内联样式。 */
40
+ secondPaneStyle?: React.CSSProperties;
41
+ /** 自定义分隔手柄内容;传入 null 可隐藏默认握柄。 */
42
+ handle?: React.ReactNode;
33
43
  /** 第二个面板保留的最小尺寸。默认 24px。 */
34
44
  secondMin?: number;
35
45
  /** 可选持久化键;仅保存一个数值尺寸。 */
package/dist/Splitter.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Splitter } from './chunk-LOWTSOWT.js';
1
+ export { Splitter } from './chunk-J5UEQ3ZQ.js';
2
2
  import './chunk-DRDDQCDD.js';
3
3
  import './chunk-ULTDRMGN.js';
@@ -4,6 +4,7 @@
4
4
  background: var(--lmn-table-bg, var(--bg));
5
5
  box-shadow: var(--lmn-table-neu-shadow-inset, var(--neu-shadow-inset));
6
6
  overflow: auto;
7
+ container-type: inline-size;
7
8
  }
8
9
  /* When scroll=y is on, the wrap itself becomes the scroll region. */
9
10
  .table-wrap.scroll-y { overflow-y: auto; }
@@ -72,6 +73,10 @@
72
73
  .table.striped tbody tr:nth-child(even) td {
73
74
  background: color-mix(in oklch, var(--lmn-table-bg-sunken, var(--bg-sunken)) 40%, transparent);
74
75
  }
76
+ .table:not(.cards) tbody tr.active-row td {
77
+ background: color-mix(in oklch, var(--lmn-table-accent-soft, var(--accent-soft)) 72%, transparent);
78
+ color: var(--lmn-table-accent-ink, var(--accent-ink));
79
+ }
75
80
 
76
81
  /* Embossed: each row sits on the surface */
77
82
  .table.embossed { border-spacing: 0; }
@@ -128,11 +133,33 @@
128
133
  }
129
134
  .table.cards.hoverable tbody tr:hover .card-row-surface { box-shadow: var(--lmn-table-neu-shadow-panel, var(--neu-shadow-panel)); }
130
135
  .table.cards.hoverable tbody tr:hover td { background: transparent; }
136
+ .table.cards tbody tr.active-row .card-row-surface {
137
+ box-shadow:
138
+ var(--lmn-table-neu-shadow-control, var(--neu-shadow-control)),
139
+ inset 0 0 0 2px var(--lmn-table-accent-glow, var(--accent-glow));
140
+ }
141
+ .table.cards tbody tr.active-row td {
142
+ color: var(--lmn-table-accent-ink, var(--accent-ink));
143
+ }
131
144
 
132
145
  .table .row-check { width: 44px; }
133
146
  .table .row-check .checkbox { display: inline-flex; }
134
147
  .table .row-expand { width: 40px; text-align: center; }
135
- .table-empty { padding: 60px 20px; text-align: center; color: var(--lmn-table-fg-muted, var(--fg-muted)); }
148
+ .table .table-empty {
149
+ padding: 0;
150
+ color: var(--lmn-table-fg-muted, var(--fg-muted));
151
+ }
152
+ .table-empty-content {
153
+ box-sizing: border-box;
154
+ width: 100%;
155
+ padding: 60px 20px;
156
+ text-align: center;
157
+ }
158
+ .table-wrap.scroll-x .table-empty-content {
159
+ position: sticky;
160
+ left: 0;
161
+ width: 100cqi;
162
+ }
136
163
 
137
164
  /* Expand button */
138
165
  .expand-btn {
package/dist/Table.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var chunkENFLP7SN_cjs = require('./chunk-ENFLP7SN.cjs');
4
- require('./chunk-56I6ZKGU.cjs');
5
- require('./chunk-D7YSY5RZ.cjs');
3
+ var chunkPNKNZREC_cjs = require('./chunk-PNKNZREC.cjs');
4
+ require('./chunk-PJFYIXBX.cjs');
5
+ require('./chunk-SF7BPXDJ.cjs');
6
6
  require('./chunk-GFKWSDD6.cjs');
7
7
  require('./chunk-KCDOC3HS.cjs');
8
8
  require('./chunk-FJB3243S.cjs');
@@ -18,5 +18,5 @@ require('./chunk-EE5KXDRK.cjs');
18
18
 
19
19
  Object.defineProperty(exports, "Table", {
20
20
  enumerable: true,
21
- get: function () { return chunkENFLP7SN_cjs.Table; }
21
+ get: function () { return chunkPNKNZREC_cjs.Table; }
22
22
  });
package/dist/Table.d.cts CHANGED
@@ -2,6 +2,8 @@ import * as React from 'react';
2
2
  import { f as ComponentThemeProps } from './componentThemeTypes-Jt4B5aU8.cjs';
3
3
 
4
4
  type RowKey = string | number;
5
+ /** 根据当前数据行生成附加类名,或为全部行使用同一个类名。 */
6
+ type TableRowClassName<Row = any> = string | ((row: Row, index: number) => string | undefined);
5
7
  interface TableColumnFilterItem {
6
8
  text: React.ReactNode;
7
9
  value: string | number;
@@ -154,6 +156,10 @@ interface TableProps<Row = any> extends Omit<React.HTMLAttributes<HTMLDivElement
154
156
  caption?: React.ReactNode;
155
157
  /** Called when user clicks a row. */
156
158
  onRowClick?: (row: Row, index: number) => void;
159
+ /** 仅高亮指定行,不改变选择状态或复选框。 */
160
+ activeRowKey?: RowKey;
161
+ /** 为数据行提供固定类名或按行计算类名。 */
162
+ rowClassName?: TableRowClassName<Row>;
157
163
  /** Empty state. */
158
164
  empty?: React.ReactNode;
159
165
  className?: string;
@@ -161,4 +167,4 @@ interface TableProps<Row = any> extends Omit<React.HTMLAttributes<HTMLDivElement
161
167
  type TableComponent = <Row extends Record<string, any> = any>(props: TableProps<Row> & React.RefAttributes<HTMLDivElement>) => React.ReactElement | null;
162
168
  declare const Table: TableComponent;
163
169
 
164
- export { type ExpandableConfig, type PaginationConfig, type RowKey, type RowSelectionConfig, Table, type TableChangeAction, type TableChangeInfo, type TableColumn, type TableColumnFilterItem, type TablePaginationState, type TableProps, type TableScrollConfig, type TableSorterState, type TableVariant };
170
+ export { type ExpandableConfig, type PaginationConfig, type RowKey, type RowSelectionConfig, Table, type TableChangeAction, type TableChangeInfo, type TableColumn, type TableColumnFilterItem, type TablePaginationState, type TableProps, type TableRowClassName, type TableScrollConfig, type TableSorterState, type TableVariant };
package/dist/Table.d.ts CHANGED
@@ -2,6 +2,8 @@ import * as React from 'react';
2
2
  import { f as ComponentThemeProps } from './componentThemeTypes-Jt4B5aU8.js';
3
3
 
4
4
  type RowKey = string | number;
5
+ /** 根据当前数据行生成附加类名,或为全部行使用同一个类名。 */
6
+ type TableRowClassName<Row = any> = string | ((row: Row, index: number) => string | undefined);
5
7
  interface TableColumnFilterItem {
6
8
  text: React.ReactNode;
7
9
  value: string | number;
@@ -154,6 +156,10 @@ interface TableProps<Row = any> extends Omit<React.HTMLAttributes<HTMLDivElement
154
156
  caption?: React.ReactNode;
155
157
  /** Called when user clicks a row. */
156
158
  onRowClick?: (row: Row, index: number) => void;
159
+ /** 仅高亮指定行,不改变选择状态或复选框。 */
160
+ activeRowKey?: RowKey;
161
+ /** 为数据行提供固定类名或按行计算类名。 */
162
+ rowClassName?: TableRowClassName<Row>;
157
163
  /** Empty state. */
158
164
  empty?: React.ReactNode;
159
165
  className?: string;
@@ -161,4 +167,4 @@ interface TableProps<Row = any> extends Omit<React.HTMLAttributes<HTMLDivElement
161
167
  type TableComponent = <Row extends Record<string, any> = any>(props: TableProps<Row> & React.RefAttributes<HTMLDivElement>) => React.ReactElement | null;
162
168
  declare const Table: TableComponent;
163
169
 
164
- export { type ExpandableConfig, type PaginationConfig, type RowKey, type RowSelectionConfig, Table, type TableChangeAction, type TableChangeInfo, type TableColumn, type TableColumnFilterItem, type TablePaginationState, type TableProps, type TableScrollConfig, type TableSorterState, type TableVariant };
170
+ export { type ExpandableConfig, type PaginationConfig, type RowKey, type RowSelectionConfig, Table, type TableChangeAction, type TableChangeInfo, type TableColumn, type TableColumnFilterItem, type TablePaginationState, type TableProps, type TableRowClassName, type TableScrollConfig, type TableSorterState, type TableVariant };
package/dist/Table.js CHANGED
@@ -1,6 +1,6 @@
1
- export { Table } from './chunk-EA3NZBCZ.js';
2
- import './chunk-BJDQVVCG.js';
3
- import './chunk-3EHJ5QI3.js';
1
+ export { Table } from './chunk-WMISXERU.js';
2
+ import './chunk-HQNDVNTQ.js';
3
+ import './chunk-DURKCGEM.js';
4
4
  import './chunk-62VV5COT.js';
5
5
  import './chunk-KATJAJUU.js';
6
6
  import './chunk-3QXP2ZNP.js';
package/dist/TablePro.cjs CHANGED
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkJINKQT6H_cjs = require('./chunk-JINKQT6H.cjs');
4
- require('./chunk-ENFLP7SN.cjs');
5
- require('./chunk-56I6ZKGU.cjs');
6
- require('./chunk-D7YSY5RZ.cjs');
3
+ var chunkWHBKQZU5_cjs = require('./chunk-WHBKQZU5.cjs');
4
+ require('./chunk-PNKNZREC.cjs');
5
+ require('./chunk-PJFYIXBX.cjs');
6
+ require('./chunk-SF7BPXDJ.cjs');
7
7
  require('./chunk-GFKWSDD6.cjs');
8
8
  require('./chunk-KCDOC3HS.cjs');
9
9
  require('./chunk-FJB3243S.cjs');
@@ -19,5 +19,5 @@ require('./chunk-EE5KXDRK.cjs');
19
19
 
20
20
  Object.defineProperty(exports, "TablePro", {
21
21
  enumerable: true,
22
- get: function () { return chunkJINKQT6H_cjs.TablePro; }
22
+ get: function () { return chunkWHBKQZU5_cjs.TablePro; }
23
23
  });
package/dist/TablePro.js CHANGED
@@ -1,7 +1,7 @@
1
- export { TablePro } from './chunk-WMZV7PNO.js';
2
- import './chunk-EA3NZBCZ.js';
3
- import './chunk-BJDQVVCG.js';
4
- import './chunk-3EHJ5QI3.js';
1
+ export { TablePro } from './chunk-63RSKQID.js';
2
+ import './chunk-WMISXERU.js';
3
+ import './chunk-HQNDVNTQ.js';
4
+ import './chunk-DURKCGEM.js';
5
5
  import './chunk-62VV5COT.js';
6
6
  import './chunk-KATJAJUU.js';
7
7
  import './chunk-3QXP2ZNP.js';
@@ -1,5 +1,12 @@
1
1
  /* ============ Tabs ============ */
2
2
  .tabs { display: flex; flex-direction: column; gap: var(--gap-3); }
3
+ .tabs.fill {
4
+ flex: 1 1 auto;
5
+ width: 100%;
6
+ height: 100%;
7
+ min-width: 0;
8
+ min-height: 0;
9
+ }
3
10
  .tabs-nav {
4
11
  display: inline-flex;
5
12
  padding: 5px;
@@ -8,6 +15,7 @@
8
15
  box-shadow: var(--lmn-tabs-neu-shadow-inset, var(--neu-shadow-inset));
9
16
  gap: 2px;
10
17
  align-self: flex-start;
18
+ flex-shrink: 0;
11
19
  }
12
20
  .tabs-nav .tab {
13
21
  padding: 8px 16px;
@@ -66,3 +74,9 @@
66
74
  .tabs.centered.underline .tabs-nav .tab { margin-right: 11px; margin-left: 11px; }
67
75
 
68
76
  .tabs-content { padding: var(--gap-2) 0; }
77
+ .tabs.fill .tabs-content {
78
+ flex: 1 1 auto;
79
+ min-width: 0;
80
+ min-height: 0;
81
+ overflow: auto;
82
+ }
package/dist/Tabs.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkXZXY3XCL_cjs = require('./chunk-XZXY3XCL.cjs');
3
+ var chunkRR7KWH26_cjs = require('./chunk-RR7KWH26.cjs');
4
4
  require('./chunk-NRJXZPZR.cjs');
5
5
  require('./chunk-EE5KXDRK.cjs');
6
6
 
@@ -8,5 +8,5 @@ require('./chunk-EE5KXDRK.cjs');
8
8
 
9
9
  Object.defineProperty(exports, "Tabs", {
10
10
  enumerable: true,
11
- get: function () { return chunkXZXY3XCL_cjs.Tabs; }
11
+ get: function () { return chunkRR7KWH26_cjs.Tabs; }
12
12
  });
package/dist/Tabs.d.cts CHANGED
@@ -15,6 +15,12 @@ interface TabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange
15
15
  variant?: "line" | "pill" | "segmented";
16
16
  /** Center-align the tab bar horizontally. */
17
17
  centered?: boolean;
18
+ /** 标签条容器的附加类名。 */
19
+ tabBarClassName?: string;
20
+ /** 正文容器的附加类名。 */
21
+ contentClassName?: string;
22
+ /** 占满父容器,并让正文区域独立滚动。 */
23
+ fill?: boolean;
18
24
  className?: string;
19
25
  }
20
26
  declare const Tabs: React.ForwardRefExoticComponent<TabsProps & React.RefAttributes<HTMLDivElement>>;
package/dist/Tabs.d.ts CHANGED
@@ -15,6 +15,12 @@ interface TabsProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange
15
15
  variant?: "line" | "pill" | "segmented";
16
16
  /** Center-align the tab bar horizontally. */
17
17
  centered?: boolean;
18
+ /** 标签条容器的附加类名。 */
19
+ tabBarClassName?: string;
20
+ /** 正文容器的附加类名。 */
21
+ contentClassName?: string;
22
+ /** 占满父容器,并让正文区域独立滚动。 */
23
+ fill?: boolean;
18
24
  className?: string;
19
25
  }
20
26
  declare const Tabs: React.ForwardRefExoticComponent<TabsProps & React.RefAttributes<HTMLDivElement>>;
package/dist/Tabs.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Tabs } from './chunk-RAK6CENJ.js';
1
+ export { Tabs } from './chunk-IJDM2U3B.js';
2
2
  import './chunk-DRDDQCDD.js';
3
3
  import './chunk-ULTDRMGN.js';
@@ -1,4 +1,4 @@
1
- import { Table } from './chunk-EA3NZBCZ.js';
1
+ import { Table } from './chunk-WMISXERU.js';
2
2
  import { withComponentTheme, InternalComponentThemePart } from './chunk-DRDDQCDD.js';
3
3
  import './tokens-CEJVVA3G.css';
4
4
  import './shared-NJHRNLRH.css';
@@ -35,6 +35,8 @@ var TableProInner = ({
35
35
  tableProps,
36
36
  caption,
37
37
  onRowClick,
38
+ activeRowKey,
39
+ rowClassName,
38
40
  empty,
39
41
  ...rootProps
40
42
  }, ref) => {
@@ -75,6 +77,8 @@ var TableProInner = ({
75
77
  tableProps,
76
78
  caption,
77
79
  onRowClick,
80
+ activeRowKey,
81
+ rowClassName,
78
82
  empty,
79
83
  className: innerTableClassName,
80
84
  style: tableStyle
@@ -46,6 +46,7 @@ var SelectInner = (props, forwardedRef) => {
46
46
  selectedRender,
47
47
  listHeight = 260,
48
48
  popupStyle,
49
+ getOptionDisabled,
49
50
  open: openProp,
50
51
  defaultOpen,
51
52
  onOpenChange,
@@ -67,7 +68,8 @@ var SelectInner = (props, forwardedRef) => {
67
68
  defaultValue: _defaultValue,
68
69
  onChange: _selectionChange,
69
70
  onClear: _onClear,
70
- maxTagCount: _maxTagCount,
71
+ maxTagCount,
72
+ maxCount,
71
73
  ...rest
72
74
  } = props;
73
75
  const isMulti = multiple === true;
@@ -141,6 +143,15 @@ var SelectInner = (props, forwardedRef) => {
141
143
  const singleValue = singleControlled ? props.value : innerSingle;
142
144
  const controlledMultiValue = props.value;
143
145
  const multiValue = multiControlled ? Array.isArray(controlledMultiValue) ? controlledMultiValue : [] : innerMulti;
146
+ const selectedValues = React.useMemo(
147
+ () => isMulti ? multiValue : singleValue !== void 0 ? [singleValue] : [],
148
+ [isMulti, multiValue, singleValue]
149
+ );
150
+ const selectionLimit = maxCount !== void 0 && Number.isFinite(maxCount) ? Math.max(0, Math.floor(maxCount)) : void 0;
151
+ const isOptionDisabled = React.useCallback((option) => {
152
+ const selected = selectedValues.includes(option.value);
153
+ return !!option.disabled || !!getOptionDisabled?.(option, selectedValues) || isMulti && !selected && selectionLimit !== void 0 && selectedValues.length >= selectionLimit;
154
+ }, [getOptionDisabled, isMulti, selectedValues, selectionLimit]);
144
155
  React.useEffect(() => {
145
156
  if (!open) return;
146
157
  const h = (e) => {
@@ -177,20 +188,20 @@ var SelectInner = (props, forwardedRef) => {
177
188
  }, [options, filteredFlat, query]);
178
189
  React.useEffect(() => {
179
190
  setActiveIdx((current) => {
180
- if (current >= 0 && current < filteredFlat.length && !filteredFlat[current].disabled) {
191
+ if (current >= 0 && current < filteredFlat.length && !isOptionDisabled(filteredFlat[current])) {
181
192
  return current;
182
193
  }
183
- return filteredFlat.findIndex((option) => !option.disabled);
194
+ return filteredFlat.findIndex((option) => !isOptionDisabled(option));
184
195
  });
185
- }, [filteredFlat]);
196
+ }, [filteredFlat, isOptionDisabled]);
186
197
  const pickSingle = (opt) => {
187
- if (disabled || opt.disabled) return;
198
+ if (disabled || isOptionDisabled(opt)) return;
188
199
  if (!singleControlled) setInnerSingle(opt.value);
189
200
  props.onChange?.(opt.value);
190
201
  setOpen(false);
191
202
  };
192
203
  const toggleMulti = (opt) => {
193
- if (disabled || opt.disabled) return;
204
+ if (disabled || isOptionDisabled(opt)) return;
194
205
  const cur = multiValue ?? [];
195
206
  const next = cur.includes(opt.value) ? cur.filter((v) => v !== opt.value) : [...cur, opt.value];
196
207
  if (!multiControlled) setInnerMulti(next);
@@ -232,7 +243,7 @@ var SelectInner = (props, forwardedRef) => {
232
243
  setActiveIdx((i) => {
233
244
  for (let step = 1; step <= filteredFlat.length; step++) {
234
245
  const next = (Math.max(i, -1) + step) % filteredFlat.length;
235
- if (!filteredFlat[next]?.disabled) return next;
246
+ if (filteredFlat[next] && !isOptionDisabled(filteredFlat[next])) return next;
236
247
  }
237
248
  return i;
238
249
  });
@@ -243,7 +254,7 @@ var SelectInner = (props, forwardedRef) => {
243
254
  setActiveIdx((i) => {
244
255
  for (let step = 1; step <= filteredFlat.length; step++) {
245
256
  const next = (i - step + filteredFlat.length) % filteredFlat.length;
246
- if (!filteredFlat[next]?.disabled) return next;
257
+ if (filteredFlat[next] && !isOptionDisabled(filteredFlat[next])) return next;
247
258
  }
248
259
  return i;
249
260
  });
@@ -252,7 +263,7 @@ var SelectInner = (props, forwardedRef) => {
252
263
  if (e.key === "Enter") {
253
264
  e.preventDefault();
254
265
  const opt = filteredFlat[activeIdx];
255
- if (opt && !opt.disabled) {
266
+ if (opt && !isOptionDisabled(opt)) {
256
267
  if (isMulti) toggleMulti(opt);
257
268
  else pickSingle(opt);
258
269
  }
@@ -262,7 +273,7 @@ var SelectInner = (props, forwardedRef) => {
262
273
  const renderTrigger = () => {
263
274
  if (isMulti) {
264
275
  const selected = (multiValue ?? []).map((v) => allFlat.find((o) => o.value === v)).filter((o) => !!o);
265
- const max = props.maxTagCount;
276
+ const max = maxTagCount;
266
277
  const shown = max != null ? selected.slice(0, max) : selected;
267
278
  const overflow = selected.length - shown.length;
268
279
  if (selected.length === 0) {
@@ -309,6 +320,7 @@ var SelectInner = (props, forwardedRef) => {
309
320
  const idx = renderIdx;
310
321
  const sel = isSelected(o.value);
311
322
  const active = idx === activeIdx;
323
+ const optionDisabled = isOptionDisabled(o);
312
324
  return /* @__PURE__ */ jsxs(
313
325
  "button",
314
326
  {
@@ -317,9 +329,11 @@ var SelectInner = (props, forwardedRef) => {
317
329
  role: "option",
318
330
  "aria-selected": sel,
319
331
  "aria-label": getOptionAriaLabel(o),
320
- disabled: o.disabled,
332
+ disabled: optionDisabled,
321
333
  className: `menu-item ${sel ? "active" : ""} ${active ? "highlight" : ""}`,
322
- onMouseEnter: () => setActiveIdx(idx),
334
+ onMouseEnter: () => {
335
+ if (!optionDisabled) setActiveIdx(idx);
336
+ },
323
337
  onClick: () => isMulti ? toggleMulti(o) : pickSingle(o),
324
338
  children: [
325
339
  isMulti && /* @__PURE__ */ jsx("span", { className: `menu-check ${sel ? "on" : ""}`, "aria-hidden": true, children: sel && /* @__PURE__ */ jsx(Icon, { name: "check", size: 11, stroke: 3 }) }),
@@ -1,4 +1,4 @@
1
- import { Select } from './chunk-3EHJ5QI3.js';
1
+ import { Select } from './chunk-DURKCGEM.js';
2
2
  import { Input } from './chunk-UE4HFGJ6.js';
3
3
  import { Icon } from './chunk-LQMOYVQF.js';
4
4
  import { InternalComponentThemePart, withComponentTheme } from './chunk-DRDDQCDD.js';
@@ -1,7 +1,7 @@
1
1
  import { withComponentTheme } from './chunk-DRDDQCDD.js';
2
2
  import './tokens-CEJVVA3G.css';
3
3
  import './shared-NJHRNLRH.css';
4
- import './Tabs-A3IG6UZ6.css';
4
+ import './Tabs-FB2AMBWL.css';
5
5
  import * as React from 'react';
6
6
  import { jsxs, jsx } from 'react/jsx-runtime';
7
7
 
@@ -13,6 +13,9 @@ var TabsBase = React.forwardRef(({
13
13
  onChange,
14
14
  variant = "line",
15
15
  centered,
16
+ tabBarClassName = "",
17
+ contentClassName = "",
18
+ fill = false,
16
19
  className = "",
17
20
  ...rest
18
21
  }, ref) => {
@@ -42,40 +45,54 @@ var TabsBase = React.forwardRef(({
42
45
  };
43
46
  const active = items.find((i) => i.key === current);
44
47
  const activeIndex = items.findIndex((item) => item.key === current);
45
- return /* @__PURE__ */ jsxs("div", { ref, className: `tabs ${variant} ${centered ? "centered" : ""} ${className}`, ...rest, children: [
46
- /* @__PURE__ */ jsx("div", { className: "tabs-nav", role: "tablist", children: items.map((it, index) => /* @__PURE__ */ jsx(
47
- "button",
48
- {
49
- ref: (node) => {
50
- if (node) tabRefs.current.set(it.key, node);
51
- else tabRefs.current.delete(it.key);
52
- },
53
- type: "button",
54
- role: "tab",
55
- id: `${baseId}-tab-${index}`,
56
- "aria-selected": current === it.key,
57
- "aria-controls": it.content !== void 0 ? `${baseId}-panel-${index}` : void 0,
58
- tabIndex: current === it.key ? 0 : -1,
59
- disabled: it.disabled,
60
- className: `tab ${current === it.key ? "active" : ""}`,
61
- onClick: () => select(it.key),
62
- onKeyDown: handleTabKeyDown,
63
- children: it.label
64
- },
65
- it.key
66
- )) }),
67
- active?.content !== void 0 && /* @__PURE__ */ jsx(
68
- "div",
69
- {
70
- id: `${baseId}-panel-${activeIndex}`,
71
- className: "tabs-content",
72
- role: "tabpanel",
73
- "aria-labelledby": `${baseId}-tab-${activeIndex}`,
74
- tabIndex: 0,
75
- children: active.content
76
- }
77
- )
78
- ] });
48
+ return /* @__PURE__ */ jsxs(
49
+ "div",
50
+ {
51
+ ref,
52
+ className: [
53
+ "tabs",
54
+ variant,
55
+ centered ? "centered" : "",
56
+ fill ? "fill" : "",
57
+ className
58
+ ].filter(Boolean).join(" "),
59
+ ...rest,
60
+ children: [
61
+ /* @__PURE__ */ jsx("div", { className: ["tabs-nav", tabBarClassName].filter(Boolean).join(" "), role: "tablist", children: items.map((it, index) => /* @__PURE__ */ jsx(
62
+ "button",
63
+ {
64
+ ref: (node) => {
65
+ if (node) tabRefs.current.set(it.key, node);
66
+ else tabRefs.current.delete(it.key);
67
+ },
68
+ type: "button",
69
+ role: "tab",
70
+ id: `${baseId}-tab-${index}`,
71
+ "aria-selected": current === it.key,
72
+ "aria-controls": it.content !== void 0 ? `${baseId}-panel-${index}` : void 0,
73
+ tabIndex: current === it.key ? 0 : -1,
74
+ disabled: it.disabled,
75
+ className: `tab ${current === it.key ? "active" : ""}`,
76
+ onClick: () => select(it.key),
77
+ onKeyDown: handleTabKeyDown,
78
+ children: it.label
79
+ },
80
+ it.key
81
+ )) }),
82
+ active?.content !== void 0 && /* @__PURE__ */ jsx(
83
+ "div",
84
+ {
85
+ id: `${baseId}-panel-${activeIndex}`,
86
+ className: ["tabs-content", contentClassName].filter(Boolean).join(" "),
87
+ role: "tabpanel",
88
+ "aria-labelledby": `${baseId}-tab-${activeIndex}`,
89
+ tabIndex: 0,
90
+ children: active.content
91
+ }
92
+ )
93
+ ]
94
+ }
95
+ );
79
96
  });
80
97
  TabsBase.displayName = "Tabs";
81
98
  var Tabs = withComponentTheme(TabsBase, "Tabs", "tabs");