@rainbow-oh/yee-c 0.9.2 → 0.11.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 (162) hide show
  1. package/dist/cjs/Button/demo/icon.js +1 -1
  2. package/dist/cjs/Input/style/index.less +1 -0
  3. package/dist/cjs/Table/demo/resizable.d.ts +3 -0
  4. package/dist/cjs/Table/demo/resizable.js +143 -0
  5. package/dist/cjs/Table/hooks/useColumnResize.d.ts +30 -0
  6. package/dist/cjs/Table/hooks/useColumnResize.js +217 -0
  7. package/dist/cjs/Table/hooks/useColumns.d.ts +3 -1
  8. package/dist/cjs/Table/hooks/useColumns.js +14 -3
  9. package/dist/cjs/Table/interface.d.ts +49 -0
  10. package/dist/cjs/Table/style/index.less +42 -0
  11. package/dist/cjs/Table/table.js +62 -9
  12. package/dist/cjs/Table/theader/cell.js +46 -4
  13. package/dist/cjs/Table/util/index.d.ts +19 -1
  14. package/dist/cjs/Table/util/index.js +22 -0
  15. package/dist/cjs/Tabs/demo/overflow-center.d.ts +3 -0
  16. package/dist/cjs/Tabs/demo/overflow-center.js +54 -0
  17. package/dist/cjs/Tabs/hooks/useNavListMove.d.ts +2 -1
  18. package/dist/cjs/Tabs/hooks/useNavListMove.js +51 -16
  19. package/dist/cjs/Tabs/hooks/useTabScroll.d.ts +1 -0
  20. package/dist/cjs/Tabs/hooks/useTabScroll.js +5 -1
  21. package/dist/cjs/Tabs/interface.d.ts +10 -1
  22. package/dist/cjs/Tabs/style/index.less +5 -0
  23. package/dist/cjs/Tabs/tab-header/index.d.ts +1 -0
  24. package/dist/cjs/Tabs/tab-header/index.js +11 -3
  25. package/dist/cjs/Tabs/tabs.js +4 -1
  26. package/dist/cjs/Upload/demo/auto-upload.d.ts +3 -0
  27. package/dist/cjs/Upload/demo/auto-upload.js +65 -0
  28. package/dist/cjs/Upload/demo/basic.js +5 -10
  29. package/dist/cjs/Upload/demo/controlled.js +4 -4
  30. package/dist/cjs/Upload/demo/pictureWall.js +14 -13
  31. package/dist/cjs/Upload/dragger.d.ts +2 -1
  32. package/dist/cjs/Upload/dragger.js +32 -21
  33. package/dist/cjs/Upload/index.d.ts +1 -1
  34. package/dist/cjs/Upload/interface.d.ts +67 -120
  35. package/dist/cjs/Upload/style/index.less +40 -13
  36. package/dist/cjs/Upload/upload.d.ts +2 -2
  37. package/dist/cjs/Upload/upload.js +435 -185
  38. package/dist/cjs/Upload/uploaded-list/index.d.ts +2 -1
  39. package/dist/cjs/Upload/uploaded-list/index.js +6 -3
  40. package/dist/cjs/Upload/uploaded-list/uploaded-item.d.ts +6 -3
  41. package/dist/cjs/Upload/uploaded-list/uploaded-item.js +127 -138
  42. package/dist/cjs/locale/interface.d.ts +1 -0
  43. package/dist/cjs/locale/lang/en_US.js +2 -1
  44. package/dist/cjs/locale/lang/ja_JP.js +2 -1
  45. package/dist/cjs/locale/lang/zh_CN.js +2 -1
  46. package/dist/cjs/locale/lang/zh_TW.js +2 -1
  47. package/dist/cjs/style/size.css +2 -1
  48. package/dist/cjs/style/themes.css +1 -1
  49. package/dist/cjs/style/variables.css +3 -2
  50. package/dist/cjs/utils/ax/core.d.ts +3 -1
  51. package/dist/cjs/utils/ax/core.js +24 -37
  52. package/dist/cjs/utils/ax/index.d.ts +3 -1
  53. package/dist/cjs/utils/folder-scanner.d.ts +1 -1
  54. package/dist/cjs/utils/folder-scanner.js +43 -34
  55. package/dist/cjs/version.d.ts +1 -1
  56. package/dist/cjs/version.js +1 -1
  57. package/dist/esm/Button/demo/icon.js +7 -4
  58. package/dist/esm/Input/style/index.less +1 -0
  59. package/dist/esm/Table/demo/resizable.d.ts +3 -0
  60. package/dist/esm/Table/demo/resizable.js +110 -0
  61. package/dist/esm/Table/hooks/useColumnResize.d.ts +30 -0
  62. package/dist/esm/Table/hooks/useColumnResize.js +206 -0
  63. package/dist/esm/Table/hooks/useColumns.d.ts +3 -1
  64. package/dist/esm/Table/hooks/useColumns.js +9 -4
  65. package/dist/esm/Table/interface.d.ts +49 -0
  66. package/dist/esm/Table/style/index.less +42 -0
  67. package/dist/esm/Table/table.js +83 -13
  68. package/dist/esm/Table/theader/cell.js +38 -3
  69. package/dist/esm/Table/util/index.d.ts +19 -1
  70. package/dist/esm/Table/util/index.js +37 -0
  71. package/dist/esm/Tabs/demo/overflow-center.d.ts +3 -0
  72. package/dist/esm/Tabs/demo/overflow-center.js +61 -0
  73. package/dist/esm/Tabs/hooks/useNavListMove.d.ts +2 -1
  74. package/dist/esm/Tabs/hooks/useNavListMove.js +62 -25
  75. package/dist/esm/Tabs/hooks/useTabScroll.d.ts +1 -0
  76. package/dist/esm/Tabs/hooks/useTabScroll.js +9 -0
  77. package/dist/esm/Tabs/interface.d.ts +10 -1
  78. package/dist/esm/Tabs/style/index.less +5 -0
  79. package/dist/esm/Tabs/tab-header/index.d.ts +1 -0
  80. package/dist/esm/Tabs/tab-header/index.js +15 -3
  81. package/dist/esm/Tabs/tabs.js +4 -2
  82. package/dist/esm/Upload/demo/auto-upload.d.ts +3 -0
  83. package/dist/esm/Upload/demo/auto-upload.js +42 -0
  84. package/dist/esm/Upload/demo/basic.js +5 -11
  85. package/dist/esm/Upload/demo/controlled.js +8 -6
  86. package/dist/esm/Upload/demo/pictureWall.js +17 -14
  87. package/dist/esm/Upload/dragger.d.ts +2 -1
  88. package/dist/esm/Upload/dragger.js +10 -5
  89. package/dist/esm/Upload/index.d.ts +1 -1
  90. package/dist/esm/Upload/interface.d.ts +67 -120
  91. package/dist/esm/Upload/style/index.less +40 -13
  92. package/dist/esm/Upload/upload.d.ts +2 -2
  93. package/dist/esm/Upload/upload.js +573 -271
  94. package/dist/esm/Upload/uploaded-list/index.d.ts +2 -1
  95. package/dist/esm/Upload/uploaded-list/index.js +9 -4
  96. package/dist/esm/Upload/uploaded-list/uploaded-item.d.ts +6 -3
  97. package/dist/esm/Upload/uploaded-list/uploaded-item.js +145 -150
  98. package/dist/esm/locale/interface.d.ts +1 -0
  99. package/dist/esm/locale/lang/en_US.js +2 -1
  100. package/dist/esm/locale/lang/ja_JP.js +2 -1
  101. package/dist/esm/locale/lang/zh_CN.js +2 -1
  102. package/dist/esm/locale/lang/zh_TW.js +2 -1
  103. package/dist/esm/style/size.css +2 -1
  104. package/dist/esm/style/themes.css +1 -1
  105. package/dist/esm/style/variables.css +3 -2
  106. package/dist/esm/utils/ax/core.d.ts +3 -1
  107. package/dist/esm/utils/ax/core.js +32 -40
  108. package/dist/esm/utils/ax/index.d.ts +3 -1
  109. package/dist/esm/utils/folder-scanner.d.ts +1 -1
  110. package/dist/esm/utils/folder-scanner.js +76 -75
  111. package/dist/esm/version.d.ts +1 -1
  112. package/dist/esm/version.js +1 -1
  113. package/dist/umd/yee-c.min.css +2 -2
  114. package/dist/umd/yee-c.min.js +1 -1
  115. package/package.json +1 -1
  116. package/src/Button/demo/icon.tsx +5 -3
  117. package/src/Input/style/index.less +1 -0
  118. package/src/Table/demo/resizable.tsx +106 -0
  119. package/src/Table/hooks/useColumnResize.ts +224 -0
  120. package/src/Table/hooks/useColumns.ts +18 -3
  121. package/src/Table/index.en-US.md +7 -0
  122. package/src/Table/index.zh-CN.md +7 -0
  123. package/src/Table/interface.ts +52 -0
  124. package/src/Table/style/index.less +42 -0
  125. package/src/Table/table-resize.test.tsx +234 -0
  126. package/src/Table/table.tsx +90 -13
  127. package/src/Table/theader/cell.tsx +52 -2
  128. package/src/Table/util/index.ts +44 -1
  129. package/src/Tabs/demo/overflow-center.tsx +35 -0
  130. package/src/Tabs/hooks/useNavListMove.ts +60 -18
  131. package/src/Tabs/hooks/useTabScroll.ts +7 -1
  132. package/src/Tabs/index.en-US.md +33 -31
  133. package/src/Tabs/index.zh-CN.md +33 -31
  134. package/src/Tabs/interface.ts +10 -1
  135. package/src/Tabs/style/index.less +5 -0
  136. package/src/Tabs/tab-header/index.tsx +14 -3
  137. package/src/Tabs/tabs.tsx +2 -0
  138. package/src/Upload/demo/auto-upload.tsx +35 -0
  139. package/src/Upload/demo/basic.tsx +7 -11
  140. package/src/Upload/demo/controlled.tsx +12 -8
  141. package/src/Upload/demo/directory.tsx +3 -4
  142. package/src/Upload/demo/drag.tsx +5 -12
  143. package/src/Upload/demo/multiple.tsx +3 -4
  144. package/src/Upload/demo/pictureWall.tsx +22 -21
  145. package/src/Upload/dragger.tsx +47 -34
  146. package/src/Upload/index.en-US.md +63 -43
  147. package/src/Upload/index.ts +8 -1
  148. package/src/Upload/index.zh-CN.md +62 -42
  149. package/src/Upload/interface.ts +68 -120
  150. package/src/Upload/style/index.less +40 -13
  151. package/src/Upload/upload.tsx +546 -215
  152. package/src/Upload/uploaded-list/index.tsx +9 -5
  153. package/src/Upload/uploaded-list/uploaded-item.tsx +199 -228
  154. package/src/locale/interface.ts +1 -0
  155. package/src/locale/lang/en_US.ts +1 -0
  156. package/src/locale/lang/ja_JP.ts +1 -0
  157. package/src/locale/lang/zh_CN.ts +1 -0
  158. package/src/locale/lang/zh_TW.ts +1 -0
  159. package/src/style/size.css +2 -1
  160. package/src/utils/ax/core.ts +28 -41
  161. package/src/utils/folder-scanner.ts +51 -37
  162. package/src/version.ts +1 -1
@@ -36,5 +36,5 @@ var import_yee_c = require("../..");
36
36
  var import_lucide_react = require("lucide-react");
37
37
  var import_react = __toESM(require("react"));
38
38
  var icon_default = () => {
39
- return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { type: "primary", icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Search, { size: 16 }) }, "Search"), /* @__PURE__ */ import_react.default.createElement("span", { style: { margin: "0 10px" } }), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Download, { size: 16 }) }, "Download"), /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { shape: "circle", icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Plus, { size: 16 }) }), /* @__PURE__ */ import_react.default.createElement("span", { style: { margin: "0 10px" } }), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { shape: "circle", type: "primary", icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Search, { size: 16 }) }), /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Search, { size: 16 }) }), /* @__PURE__ */ import_react.default.createElement("span", { style: { margin: "0 10px" } }), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Search, { size: 16 }), type: "primary" }));
39
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { type: "primary", icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Search, { size: 16 }), title: "search" }, "Search"), /* @__PURE__ */ import_react.default.createElement("span", { style: { margin: "0 10px" } }), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Download, { size: 16 }) }, "Download"), /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { shape: "circle", icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Plus, { size: 16 }) }), /* @__PURE__ */ import_react.default.createElement("span", { style: { margin: "0 10px" } }), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Tooltip, { title: "Search" }, /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { shape: "circle", type: "primary", icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Search, { size: 16 }) })), /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement("br", null), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Search, { size: 16 }) }), /* @__PURE__ */ import_react.default.createElement("span", { style: { margin: "0 10px" } }), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { icon: /* @__PURE__ */ import_react.default.createElement(import_lucide_react.Search, { size: 16 }), type: "primary" }));
40
40
  };
@@ -13,6 +13,7 @@
13
13
  border: var(--yee-input-border-width) solid var(--yee-input-border-color);
14
14
  border-radius: var(--yee-input-border-radius, 4px);
15
15
  font-family: var(--yee-font-family);
16
+ outline: inherit;
16
17
 
17
18
  &:not(@{pls}-disabled):hover {
18
19
  border-color: var(--yee-input-hover-border-color);
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const _default: () => React.JSX.Element;
3
+ export default _default;
@@ -0,0 +1,143 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __spreadValues = (a, b) => {
13
+ for (var prop in b || (b = {}))
14
+ if (__hasOwnProp.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ if (__getOwnPropSymbols)
17
+ for (var prop of __getOwnPropSymbols(b)) {
18
+ if (__propIsEnum.call(b, prop))
19
+ __defNormalProp(a, prop, b[prop]);
20
+ }
21
+ return a;
22
+ };
23
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
+ var __export = (target, all) => {
25
+ for (var name in all)
26
+ __defProp(target, name, { get: all[name], enumerable: true });
27
+ };
28
+ var __copyProps = (to, from, except, desc) => {
29
+ if (from && typeof from === "object" || typeof from === "function") {
30
+ for (let key of __getOwnPropNames(from))
31
+ if (!__hasOwnProp.call(to, key) && key !== except)
32
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
33
+ }
34
+ return to;
35
+ };
36
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
37
+ // If the importer is in node compatibility mode or this is not an ESM
38
+ // file that has been converted to a CommonJS file using a Babel-
39
+ // compatible transform (i.e. "__esModule" has not been set), then set
40
+ // "default" to the CommonJS "module.exports" for node compatibility.
41
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
42
+ mod
43
+ ));
44
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
45
+
46
+ // src/Table/demo/resizable.tsx
47
+ var resizable_exports = {};
48
+ __export(resizable_exports, {
49
+ default: () => resizable_default
50
+ });
51
+ module.exports = __toCommonJS(resizable_exports);
52
+ var import_yee_c = require("../..");
53
+ var import_react = __toESM(require("react"));
54
+ var columns = [
55
+ {
56
+ title: "Name",
57
+ dataIndex: "name",
58
+ key: "name",
59
+ fixed: "left",
60
+ width: 140,
61
+ minWidth: 100
62
+ },
63
+ {
64
+ title: "Age",
65
+ dataIndex: "age",
66
+ key: "age",
67
+ width: 100,
68
+ sorter: true
69
+ },
70
+ {
71
+ title: "Address",
72
+ dataIndex: "address",
73
+ key: "address",
74
+ width: 240
75
+ },
76
+ {
77
+ title: "Company",
78
+ dataIndex: "company",
79
+ key: "company",
80
+ width: 180
81
+ },
82
+ {
83
+ title: "Email",
84
+ dataIndex: "email",
85
+ key: "email",
86
+ width: 240
87
+ },
88
+ {
89
+ // Opt this column out of resizing while the rest stay resizable.
90
+ title: "Action",
91
+ key: "action",
92
+ fixed: "right",
93
+ width: 100,
94
+ resizable: false,
95
+ render: (record) => /* @__PURE__ */ import_react.default.createElement("a", { onClick: () => console.log(record) }, "View")
96
+ }
97
+ ];
98
+ var dataSource = [
99
+ {
100
+ key: "1",
101
+ name: "John Brown",
102
+ age: 32,
103
+ address: "New York No. 1 Lake Park",
104
+ company: "Acme Inc.",
105
+ email: "john.brown@example.com"
106
+ },
107
+ {
108
+ key: "2",
109
+ name: "Jim Green",
110
+ age: 42,
111
+ address: "London No. 1 Lake Park",
112
+ company: "Globex",
113
+ email: "jim.green@example.com"
114
+ },
115
+ {
116
+ key: "3",
117
+ name: "Joe Black",
118
+ age: 28,
119
+ address: "Sidney No. 1 Lake Park",
120
+ company: "Initech",
121
+ email: "joe.black@example.com"
122
+ }
123
+ ];
124
+ var resizable_default = () => {
125
+ const [widths, setWidths] = import_react.default.useState({});
126
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(
127
+ import_yee_c.Table,
128
+ {
129
+ resizable: true,
130
+ columns,
131
+ dataSource,
132
+ rowKey: "key",
133
+ pagination: false,
134
+ scroll: { x: 1e3 },
135
+ onColumnResizeEnd: (width, column) => setWidths((current) => {
136
+ var _a;
137
+ return __spreadProps(__spreadValues({}, current), {
138
+ [String((_a = column.key) != null ? _a : column.dataIndex)]: width
139
+ });
140
+ })
141
+ }
142
+ ), /* @__PURE__ */ import_react.default.createElement("p", { style: { marginTop: 12 } }, "最近调整:", Object.keys(widths).length ? Object.entries(widths).map(([key, width]) => `${key}=${width}px`).join(",") : "拖动表头右边缘试试"));
143
+ };
@@ -0,0 +1,30 @@
1
+ import * as React from 'react';
2
+ import type { WrapedColumnProps } from '../interface';
3
+ interface UseColumnResizeOptions {
4
+ tableRef: React.RefObject<HTMLTableElement | null>;
5
+ /**
6
+ * Latest leaf columns. Passed as a ref because the columns are themselves
7
+ * derived from `resizedWidths`; depending on the array would make every
8
+ * width change rebuild the drag handlers mid-drag.
9
+ */
10
+ columnsRef: React.RefObject<WrapedColumnProps[]>;
11
+ onColumnResize?: (width: number, column: WrapedColumnProps) => void;
12
+ onColumnResizeEnd?: (width: number, column: WrapedColumnProps) => void;
13
+ }
14
+ /**
15
+ * Pointer (and keyboard) driven column resizing.
16
+ *
17
+ * The table normally lets the browser distribute widths (`width: 100%` with an
18
+ * `auto` layout), which means writing a width onto one column would silently
19
+ * steal space from its neighbours. So the first resize interaction snapshots the
20
+ * rendered width of *every* column; from then on the table is fully px
21
+ * controlled and a drag only moves the column it grabbed.
22
+ */
23
+ export default function useColumnResize({ tableRef, columnsRef, onColumnResize, onColumnResizeEnd, }: UseColumnResizeOptions): {
24
+ resizedWidths: Record<string, number>;
25
+ resizingKey: string | null;
26
+ onResizeStart: (event: React.PointerEvent<HTMLElement>, resizeKey: string) => void;
27
+ onResizeStep: (resizeKey: string, direction: number) => void;
28
+ resetResizedWidths: () => void;
29
+ };
30
+ export {};
@@ -0,0 +1,217 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __spreadValues = (a, b) => {
13
+ for (var prop in b || (b = {}))
14
+ if (__hasOwnProp.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ if (__getOwnPropSymbols)
17
+ for (var prop of __getOwnPropSymbols(b)) {
18
+ if (__propIsEnum.call(b, prop))
19
+ __defNormalProp(a, prop, b[prop]);
20
+ }
21
+ return a;
22
+ };
23
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
+ var __export = (target, all) => {
25
+ for (var name in all)
26
+ __defProp(target, name, { get: all[name], enumerable: true });
27
+ };
28
+ var __copyProps = (to, from, except, desc) => {
29
+ if (from && typeof from === "object" || typeof from === "function") {
30
+ for (let key of __getOwnPropNames(from))
31
+ if (!__hasOwnProp.call(to, key) && key !== except)
32
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
33
+ }
34
+ return to;
35
+ };
36
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
37
+ // If the importer is in node compatibility mode or this is not an ESM
38
+ // file that has been converted to a CommonJS file using a Babel-
39
+ // compatible transform (i.e. "__esModule" has not been set), then set
40
+ // "default" to the CommonJS "module.exports" for node compatibility.
41
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
42
+ mod
43
+ ));
44
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
45
+
46
+ // src/Table/hooks/useColumnResize.ts
47
+ var useColumnResize_exports = {};
48
+ __export(useColumnResize_exports, {
49
+ default: () => useColumnResize
50
+ });
51
+ module.exports = __toCommonJS(useColumnResize_exports);
52
+ var React = __toESM(require("react"));
53
+ var import_useLatest = __toESM(require("../../hooks/useLatest"));
54
+ var DEFAULT_MIN_COLUMN_WIDTH = 40;
55
+ var KEYBOARD_STEP = 8;
56
+ var clampWidth = (width, column) => {
57
+ var _a;
58
+ const min = Math.max((_a = column.minWidth) != null ? _a : DEFAULT_MIN_COLUMN_WIDTH, 0);
59
+ const max = column.maxWidth;
60
+ if (width < min)
61
+ return min;
62
+ if (max !== void 0 && width > max)
63
+ return max;
64
+ return Math.round(width);
65
+ };
66
+ function useColumnResize({
67
+ tableRef,
68
+ columnsRef,
69
+ onColumnResize,
70
+ onColumnResizeEnd
71
+ }) {
72
+ const [resizedWidths, setResizedWidths] = React.useState({});
73
+ const [resizingKey, setResizingKey] = React.useState(null);
74
+ const onColumnResizeRef = (0, import_useLatest.default)(onColumnResize);
75
+ const onColumnResizeEndRef = (0, import_useLatest.default)(onColumnResizeEnd);
76
+ const resizedWidthsRef = (0, import_useLatest.default)(resizedWidths);
77
+ const frameRef = React.useRef(0);
78
+ const teardownRef = React.useRef(null);
79
+ const snapshotWidths = React.useCallback(() => {
80
+ var _a, _b;
81
+ const columns = columnsRef.current || [];
82
+ const colElements = (_a = tableRef.current) == null ? void 0 : _a.querySelectorAll(
83
+ ":scope > colgroup > col"
84
+ );
85
+ if (!colElements || colElements.length !== columns.length)
86
+ return null;
87
+ if (!columns.length)
88
+ return null;
89
+ const snapshot = {};
90
+ for (let index = 0; index < columns.length; index += 1) {
91
+ const key = (_b = columns[index]) == null ? void 0 : _b.resizeKey;
92
+ const width = Math.round(
93
+ colElements[index].getBoundingClientRect().width
94
+ );
95
+ if (!key || !Number.isFinite(width) || width <= 0)
96
+ return null;
97
+ snapshot[key] = width;
98
+ }
99
+ return snapshot;
100
+ }, [columnsRef, tableRef]);
101
+ const findColumn = React.useCallback(
102
+ (resizeKey) => (columnsRef.current || []).find(
103
+ (column) => column.resizeKey === resizeKey
104
+ ),
105
+ [columnsRef]
106
+ );
107
+ const onResizeStart = React.useCallback(
108
+ (event, resizeKey) => {
109
+ if (event.button !== 0)
110
+ return;
111
+ event.preventDefault();
112
+ event.stopPropagation();
113
+ const column = findColumn(resizeKey);
114
+ if (!column)
115
+ return;
116
+ const snapshot = snapshotWidths();
117
+ if (!snapshot)
118
+ return;
119
+ const startX = event.clientX;
120
+ const startWidth = snapshot[resizeKey];
121
+ let latestWidth = startWidth;
122
+ setResizingKey(resizeKey);
123
+ setResizedWidths(snapshot);
124
+ document.body.style.userSelect = "none";
125
+ document.body.style.cursor = "col-resize";
126
+ const applyWidth = (clientX) => {
127
+ var _a;
128
+ const next = clampWidth(startWidth + (clientX - startX), column);
129
+ if (next === latestWidth)
130
+ return;
131
+ latestWidth = next;
132
+ setResizedWidths((current) => __spreadProps(__spreadValues({}, current), { [resizeKey]: next }));
133
+ (_a = onColumnResizeRef.current) == null ? void 0 : _a.call(onColumnResizeRef, next, column);
134
+ };
135
+ const onPointerMove = (moveEvent) => {
136
+ const { clientX } = moveEvent;
137
+ if (frameRef.current)
138
+ cancelAnimationFrame(frameRef.current);
139
+ frameRef.current = requestAnimationFrame(() => {
140
+ frameRef.current = 0;
141
+ applyWidth(clientX);
142
+ });
143
+ };
144
+ const detachers = [];
145
+ const bind = (type, handler) => {
146
+ window.addEventListener(type, handler);
147
+ detachers.push(
148
+ () => window.removeEventListener(type, handler)
149
+ );
150
+ };
151
+ const teardown = () => {
152
+ if (frameRef.current) {
153
+ cancelAnimationFrame(frameRef.current);
154
+ frameRef.current = 0;
155
+ }
156
+ detachers.forEach((detach) => detach());
157
+ detachers.length = 0;
158
+ document.body.style.userSelect = "";
159
+ document.body.style.cursor = "";
160
+ teardownRef.current = null;
161
+ };
162
+ const stop = () => {
163
+ var _a;
164
+ teardown();
165
+ setResizingKey(null);
166
+ (_a = onColumnResizeEndRef.current) == null ? void 0 : _a.call(onColumnResizeEndRef, latestWidth, column);
167
+ };
168
+ teardownRef.current = teardown;
169
+ bind("pointermove", onPointerMove);
170
+ bind("pointerup", stop);
171
+ bind("pointercancel", stop);
172
+ },
173
+ [findColumn, snapshotWidths, onColumnResizeRef, onColumnResizeEndRef]
174
+ );
175
+ const onResizeStep = React.useCallback(
176
+ (resizeKey, direction) => {
177
+ var _a, _b;
178
+ const column = findColumn(resizeKey);
179
+ if (!column)
180
+ return;
181
+ const base = resizedWidthsRef.current;
182
+ const snapshot = base[resizeKey] === void 0 ? snapshotWidths() : base;
183
+ if (!snapshot)
184
+ return;
185
+ const next = clampWidth(
186
+ snapshot[resizeKey] + direction * KEYBOARD_STEP,
187
+ column
188
+ );
189
+ if (next === snapshot[resizeKey])
190
+ return;
191
+ setResizedWidths(__spreadProps(__spreadValues({}, snapshot), { [resizeKey]: next }));
192
+ (_a = onColumnResizeRef.current) == null ? void 0 : _a.call(onColumnResizeRef, next, column);
193
+ (_b = onColumnResizeEndRef.current) == null ? void 0 : _b.call(onColumnResizeEndRef, next, column);
194
+ },
195
+ [
196
+ findColumn,
197
+ snapshotWidths,
198
+ resizedWidthsRef,
199
+ onColumnResizeRef,
200
+ onColumnResizeEndRef
201
+ ]
202
+ );
203
+ const resetResizedWidths = React.useCallback(() => {
204
+ setResizedWidths((current) => Object.keys(current).length ? {} : current);
205
+ }, []);
206
+ React.useEffect(() => () => {
207
+ var _a;
208
+ return (_a = teardownRef.current) == null ? void 0 : _a.call(teardownRef);
209
+ }, []);
210
+ return {
211
+ resizedWidths,
212
+ resizingKey,
213
+ onResizeStart,
214
+ onResizeStep,
215
+ resetResizedWidths
216
+ };
217
+ }
@@ -1,11 +1,13 @@
1
1
  import React from 'react';
2
2
  import type { ColumnProps, ExpandableType, RowSelectionType, WrapedColumnProps } from '../interface';
3
- export default function useColumns({ children, columns, rowSelection, expandable, measuredColumnWidths, }: {
3
+ export default function useColumns({ children, columns, rowSelection, expandable, measuredColumnWidths, resizable, resizedWidths, }: {
4
4
  children?: React.ReactElement<ColumnProps> | React.ReactElement<ColumnProps>[];
5
5
  columns: ColumnProps[];
6
6
  rowSelection?: RowSelectionType;
7
7
  expandable?: ExpandableType;
8
8
  measuredColumnWidths?: number[];
9
+ resizable?: boolean;
10
+ resizedWidths?: Record<string, number>;
9
11
  }): {
10
12
  wrapedColumns: WrapedColumnProps[];
11
13
  headerRows: import("../interface").HeaderCell[][];
@@ -64,7 +64,9 @@ function useColumns({
64
64
  columns,
65
65
  rowSelection,
66
66
  expandable,
67
- measuredColumnWidths
67
+ measuredColumnWidths,
68
+ resizable,
69
+ resizedWidths
68
70
  }) {
69
71
  const childColumns = (0, import_react.useMemo)(() => {
70
72
  return children ? getColumnsFromChild(children) : null;
@@ -73,10 +75,19 @@ function useColumns({
73
75
  const base = (0, import_deepClone.default)(childColumns || columns || []) || [];
74
76
  const tree = (0, import_header.injectSelectionExpand)(base, rowSelection, expandable);
75
77
  const leaves = (0, import_header.flattenLeafColumns)(tree);
76
- const wraped = (0, import_util.handleColumns)(leaves, measuredColumnWidths);
78
+ const resized = (0, import_util.applyColumnResize)(leaves, resizable, resizedWidths);
79
+ const wraped = (0, import_util.handleColumns)(resized, measuredColumnWidths);
77
80
  const rows = (0, import_header.parseHeaderRows)(tree, wraped);
78
81
  return { wrapedColumns: wraped, headerRows: rows };
79
- }, [childColumns, columns, rowSelection, expandable, measuredColumnWidths]);
82
+ }, [
83
+ childColumns,
84
+ columns,
85
+ rowSelection,
86
+ expandable,
87
+ measuredColumnWidths,
88
+ resizable,
89
+ resizedWidths
90
+ ]);
80
91
  return {
81
92
  wrapedColumns,
82
93
  headerRows
@@ -67,6 +67,18 @@ export interface HeadCellProps extends Omit<WrapedColumnProps, 'title'> {
67
67
  };
68
68
  onSort?: (dataIndex: string, sorter: any) => void;
69
69
  onInternalFilter?: (dataIndex: string, value: string) => void;
70
+ /**
71
+ * `resizeKey` of the column currently being dragged, if any
72
+ */
73
+ resizingKey?: string | null;
74
+ /**
75
+ * Begin a pointer driven column resize. Injected by Table when resizing is on.
76
+ */
77
+ onResizeStart?: (event: React.PointerEvent<HTMLElement>, resizeKey: string) => void;
78
+ /**
79
+ * Nudge a column width by `delta` px, for keyboard driven resizing
80
+ */
81
+ onResizeStep?: (resizeKey: string, delta: number) => void;
70
82
  /**
71
83
  * Horizontal span, used for grouped header cells
72
84
  */
@@ -227,6 +239,20 @@ export interface ColumnProps {
227
239
  * Set width
228
240
  */
229
241
  width?: number | string;
242
+ /**
243
+ * Whether this column can be resized by dragging the right edge of its header
244
+ * cell. Falls back to the table level `resizable` when not set.
245
+ */
246
+ resizable?: boolean;
247
+ /**
248
+ * Lower bound (in px) applied while resizing this column
249
+ * @default 40
250
+ */
251
+ minWidth?: number;
252
+ /**
253
+ * Upper bound (in px) applied while resizing this column
254
+ */
255
+ maxWidth?: number;
230
256
  /**
231
257
  * Set header display text
232
258
  */
@@ -261,6 +287,12 @@ export interface WrapedColumnProps extends ColumnProps, ExpandableType, Omit<Row
261
287
  * Whether this is the first column fixed to the right
262
288
  */
263
289
  isFixedRightFirst?: boolean;
290
+ /**
291
+ * Stable identity of this leaf column, used as the key of the resized width
292
+ * map. Only assigned to leaf columns, so its presence also marks a column as
293
+ * a valid resize target (group header cells never carry one).
294
+ */
295
+ resizeKey?: string;
264
296
  }
265
297
  /**
266
298
  * A header cell resolved from the column tree, with computed span info for multi-level headers.
@@ -554,6 +586,23 @@ export interface TableProps extends FooterProps, Omit<HeaderProps, 'pageData'>,
554
586
  * Set table layout
555
587
  */
556
588
  tableLayout?: 'auto' | 'fixed';
589
+ /**
590
+ * Whether columns can be resized by dragging the right edge of their header
591
+ * cell. Individual columns can opt out with `column.resizable: false`.
592
+ *
593
+ * The first drag snapshots the rendered width of every column and switches the
594
+ * table to a px controlled `table-layout: fixed`, so column widths stay exactly
595
+ * where they are dragged instead of being redistributed by the browser.
596
+ */
597
+ resizable?: boolean;
598
+ /**
599
+ * Fired on every width change while a column is being dragged
600
+ */
601
+ onColumnResize?: (width: number, column: WrapedColumnProps) => void;
602
+ /**
603
+ * Fired once when a column resize interaction finishes
604
+ */
605
+ onColumnResizeEnd?: (width: number, column: WrapedColumnProps) => void;
557
606
  /**
558
607
  * Whether to enable virtual list
559
608
  */
@@ -71,6 +71,48 @@
71
71
  }
72
72
  }
73
73
 
74
+ // Sits inside the header cell's right padding so it never overlaps the sorter
75
+ // or filter controls, which are laid out against the content edge.
76
+ &-resize-handle {
77
+ position: absolute;
78
+ top: 0;
79
+ right: 0;
80
+ z-index: 2;
81
+ width: var(--yee-table-resize-handle-width);
82
+ height: 100%;
83
+ cursor: col-resize;
84
+ background-color: transparent;
85
+ touch-action: none;
86
+ user-select: none;
87
+
88
+ &::after {
89
+ position: absolute;
90
+ content: '';
91
+ top: 25%;
92
+ right: calc(var(--yee-table-resize-handle-width) / 2 - 1px);
93
+ width: 2px;
94
+ height: 50%;
95
+ background-color: transparent;
96
+ }
97
+
98
+ &:hover::after,
99
+ &:focus-visible::after,
100
+ &-active::after {
101
+ background-color: var(--yee-primary-color);
102
+ }
103
+
104
+ &:focus-visible {
105
+ outline: none;
106
+ }
107
+ }
108
+
109
+ // While dragging, the pointer leaves the handle constantly; keep the cursor and
110
+ // the selection lock consistent across the whole table.
111
+ &-resizing {
112
+ cursor: col-resize;
113
+ user-select: none;
114
+ }
115
+
74
116
  &-filter {
75
117
  max-height: var(--yee-table-filter-popup-height);
76
118
  background-color: var(--yee-table-filter-list-bg-color);