@agile-team/mach-table-react 0.5.0 → 0.13.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.
package/LICENSE CHANGED
@@ -1,21 +1,110 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 MachTable Contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MachTable Source-Available License 1.0
2
+
3
+ Copyright (c) 2026 ChenyCHENYU (Agile Team). All rights reserved.
4
+
5
+ IMPORTANT: The source code is publicly visible for review, but it is not
6
+ open-source software as defined by the Open Source Initiative. Except for the
7
+ limited inspection permission below, no permission is granted unless the
8
+ copyright holder gives you prior written authorization.
9
+
10
+ 1. Definitions
11
+
12
+ "Software" means MachTable and all source code, object code, packages,
13
+ documentation, examples, designs, assets, and other materials distributed with
14
+ this license.
15
+
16
+ "Licensor" means ChenyCHENYU (Agile Team), the copyright holder of the
17
+ Software.
18
+
19
+ "Written Authorization" means a durable written permission issued directly by
20
+ the Licensor that identifies the licensee and the permitted scope, purpose,
21
+ environment, term, and any other applicable conditions.
22
+
23
+ 2. Limited Inspection Permission
24
+
25
+ You may view the Software on the repository hosting service solely to inspect
26
+ and evaluate it, to link to its public repository, to discuss it, and to submit
27
+ good-faith issue reports. This limited permission does not include permission
28
+ to use, run, build, compile, copy, download for reuse, install, integrate,
29
+ modify, create derivative works from, deploy, distribute, sublicense, sell,
30
+ lease, provide as a service, or otherwise exploit the Software.
31
+
32
+ 3. Authorization Required
33
+
34
+ Any use beyond Section 2 requires the Licensor's prior Written Authorization.
35
+ This requirement applies to personal, educational, research, governmental,
36
+ non-profit, internal, evaluation, testing, development, staging, production,
37
+ and commercial use. Possession of a copy, cloning the repository, downloading
38
+ an npm package, receiving the Software from another person, or submitting a
39
+ contribution does not grant any additional rights.
40
+
41
+ The Licensor may grant separate commercial or non-commercial terms in a
42
+ written agreement. If such an agreement conflicts with this license, that
43
+ agreement controls only for the licensee and scope identified in it.
44
+
45
+ 4. Restrictions
46
+
47
+ Without prior Written Authorization, you must not, directly or indirectly:
48
+
49
+ a. use, execute, build, compile, install, test, or integrate the Software;
50
+ b. copy, reproduce, modify, adapt, translate, or create derivative works;
51
+ c. publish, distribute, sublicense, sell, rent, lease, transfer, host, or make
52
+ the Software available to any third party;
53
+ d. use the Software to provide a hosted, managed, consulting, outsourcing,
54
+ software-as-a-service, or other service;
55
+ e. remove or alter copyright, authorization, trademark, attribution, or other
56
+ proprietary notices; or
57
+ f. represent the Software as open source or represent that you have received
58
+ authorization when you have not.
59
+
60
+ 5. Contributions
61
+
62
+ Submitting a patch, pull request, code, documentation, design, or other
63
+ material to the project does not authorize you to use the Software. Unless a
64
+ separate written contributor agreement applies, by intentionally submitting a
65
+ contribution you represent that you have the right to submit it and grant the
66
+ Licensor a perpetual, worldwide, irrevocable, transferable, sublicensable,
67
+ royalty-free license to use, reproduce, modify, create derivative works from,
68
+ distribute, license, and relicense that contribution as part of the Software.
69
+
70
+ 6. Ownership and Trademarks
71
+
72
+ The Software is licensed, not sold. The Licensor and applicable contributors
73
+ retain all right, title, and interest in the Software. No trademark, service
74
+ mark, trade name, logo, or branding rights are granted by this license.
75
+
76
+ 7. Termination
77
+
78
+ Any permission granted under this license terminates automatically upon breach.
79
+ On termination, you must immediately stop all use and destroy all copies in
80
+ your possession or control, except where retention is required by law. Sections
81
+ 4 through 9 survive termination.
82
+
83
+ 8. Disclaimer
84
+
85
+ TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" AND
86
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND
88
+ NON-INFRINGEMENT.
89
+
90
+ 9. Limitation of Liability
91
+
92
+ TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE LICENSOR AND CONTRIBUTORS WILL NOT
93
+ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
94
+ CONSEQUENTIAL, OR OTHER DAMAGES, OR FOR LOSS OF DATA, PROFITS, REVENUE,
95
+ GOODWILL, OR BUSINESS INTERRUPTION, ARISING FROM OR RELATED TO THE SOFTWARE OR
96
+ THIS LICENSE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
97
+
98
+ 10. Contact and Authorization
99
+
100
+ See LICENSING.md in the repository for the authorization request process. No
101
+ request, discussion, issue, payment, or contribution constitutes authorization
102
+ unless and until the Licensor issues explicit Written Authorization.
103
+
104
+ 中文说明(仅为阅读便利;如有冲突,以英文条款为准)
105
+
106
+ 本项目源代码公开可查看,但不是 OSI 定义下的开源软件。除查看、链接、
107
+ 讨论和善意提交问题外,任何个人、教育、研究、公益、政府、内部、测试、
108
+ 开发、生产或商业用途,均须事先取得作者明确的书面授权。未经授权,不得
109
+ 运行、构建、复制、修改、集成、部署、分发、转授权、销售、出租、托管或
110
+ 以服务形式提供本软件。公开仓库、克隆代码或下载 npm 包不代表获得授权。
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # @agile-team/mach-table-react
6
6
 
7
- Official React 18+ adapter for MachTable. It provides `<MachTable>` / `<RobotGrid>`, `useMachGrid`, React cell/detail renderer factories, latest-closure event handling and StrictMode-safe cleanup.
7
+ Official React 18+ adapter for MachTable 0.13. It provides `<MachTable>`, `MachTableProvider`, `useMachGrid`, React cell/detail renderer factories, the complete workbench/lazy-tree/semantic-column/action/state Core API, latest-closure event handling and StrictMode-safe cleanup. `RobotGrid` remains a deprecated 0.x alias.
8
8
 
9
9
  ## Install
10
10
 
@@ -66,8 +66,40 @@ export function OrdersPage() {
66
66
 
67
67
  When the page itself is route-lazy, a normal named import inside that page already produces the same route-level split. Use `React.lazy` when the grid should be split independently from the page.
68
68
 
69
+ ## Application and route defaults
70
+
71
+ Providers can be nested; the nearest defaults are merged and table props win:
72
+
73
+ ```tsx
74
+ import { MachTableProvider } from "@agile-team/mach-table-react";
75
+
76
+ <MachTableProvider defaults={{
77
+ size: "compact",
78
+ pagination: false,
79
+ defaultColDef: { sortable: true, resizable: true, filter: true }
80
+ }}>
81
+ <App />
82
+ </MachTableProvider>
83
+ ```
84
+
69
85
  The adapter installs the matching `@agile-team/mach-table` core automatically and re-exports its complete API and types. Only `react >= 18` and `react-dom >= 18` remain peer dependencies supplied by the host application.
70
86
 
87
+ ## Cell and full-row editing
88
+
89
+ ```tsx
90
+ import { MachTable, rowActionsColumn } from "@agile-team/mach-table-react";
91
+
92
+ const columns = [
93
+ { field: "name", editable: true },
94
+ { field: "age", editable: true, cellEditor: "number" },
95
+ rowActionsColumn({ onView, onDelete, overflow: "drawer" })
96
+ ];
97
+
98
+ <MachTable editType="fullRow" columnDefs={columns} rowData={rows} />;
99
+ ```
100
+
101
+ Cell mode is the default and provides a pencil plus inline confirm/cancel controls. Use `editableIndicator="always" | "hover" | "none"` to match the page density.
102
+
71
103
  Documentation: [React guide](https://github.com/ChenyCHENYU/MachTable/blob/main/docs/guide/react.md) · [Enterprise integration](https://github.com/ChenyCHENYU/MachTable/blob/main/docs/guide/enterprise-integration.md) · [Next.js / SSR](https://github.com/ChenyCHENYU/MachTable/blob/main/docs/guide/ssr.md)
72
104
 
73
- MIT © Agile Team
105
+ Source-available © ChenyCHENYU (Agile Team). Any use requires prior written authorization. See the [license](https://github.com/ChenyCHENYU/MachTable/blob/main/LICENSE) and [authorization process](https://github.com/ChenyCHENYU/MachTable/blob/main/LICENSING.md).
package/dist/index.cjs CHANGED
@@ -1,206 +1,2 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
19
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
-
21
- // src/index.ts
22
- var index_exports = {};
23
- __export(index_exports, {
24
- MachTable: () => RobotGrid,
25
- RobotGrid: () => RobotGrid,
26
- default: () => index_default,
27
- reactCellRenderer: () => reactCellRenderer,
28
- reactDetailRenderer: () => reactDetailRenderer,
29
- useMachGrid: () => useMachGrid
30
- });
31
- module.exports = __toCommonJS(index_exports);
32
-
33
- // src/RobotGrid.tsx
34
- var import_react = require("react");
35
- var import_mach_table = require("@agile-team/mach-table");
36
- var UPDATABLE_KEYS = import_mach_table.DIRECT_GRID_OPTION_KEYS.filter((key) => key !== "className");
37
- function RobotGrid(props) {
38
- const { className, style, apiRef } = props;
39
- const hostRef = (0, import_react.useRef)(null);
40
- const gridApiRef = (0, import_react.useRef)(null);
41
- const propsRef = (0, import_react.useRef)(props);
42
- propsRef.current = props;
43
- (0, import_react.useEffect)(() => {
44
- const host = hostRef.current;
45
- if (!host) return;
46
- const initial = propsRef.current;
47
- const options = {};
48
- for (const key of Object.keys(initial)) {
49
- if (key === "className" || key === "gridClassName" || key === "style" || key === "apiRef") continue;
50
- if (key.startsWith("on")) continue;
51
- options[key] = initial[key];
52
- }
53
- if (initial.gridClassName !== void 0) options.className = initial.gridClassName;
54
- for (const eventType of import_mach_table.EVENT_TYPES) {
55
- const handlerKey = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}`;
56
- options[handlerKey] = (event) => {
57
- const latest = propsRef.current;
58
- const handler = latest[handlerKey];
59
- if (typeof handler === "function") handler(event);
60
- };
61
- }
62
- const api = (0, import_mach_table.createGrid)(host, options);
63
- gridApiRef.current = api;
64
- return () => {
65
- api.destroy();
66
- gridApiRef.current = null;
67
- };
68
- }, []);
69
- (0, import_react.useEffect)(() => {
70
- if (!apiRef) return;
71
- const assigned = gridApiRef.current;
72
- apiRef.current = assigned;
73
- return () => {
74
- if (apiRef.current === assigned) apiRef.current = null;
75
- };
76
- }, [apiRef]);
77
- const rowDataReady = (0, import_react.useRef)(false);
78
- (0, import_react.useEffect)(() => {
79
- if (!rowDataReady.current) {
80
- rowDataReady.current = true;
81
- return;
82
- }
83
- gridApiRef.current?.setRowData(props.rowData);
84
- }, [props.rowData]);
85
- const columnDefsReady = (0, import_react.useRef)(false);
86
- (0, import_react.useEffect)(() => {
87
- if (!columnDefsReady.current) {
88
- columnDefsReady.current = true;
89
- return;
90
- }
91
- gridApiRef.current?.setColumnDefs(props.columnDefs);
92
- }, [props.columnDefs]);
93
- const quickFilterReady = (0, import_react.useRef)(false);
94
- (0, import_react.useEffect)(() => {
95
- if (!quickFilterReady.current) {
96
- quickFilterReady.current = true;
97
- return;
98
- }
99
- gridApiRef.current?.setQuickFilter(props.quickFilterText);
100
- }, [props.quickFilterText]);
101
- const gridClassNameReady = (0, import_react.useRef)(false);
102
- (0, import_react.useEffect)(() => {
103
- if (!gridClassNameReady.current) {
104
- gridClassNameReady.current = true;
105
- return;
106
- }
107
- gridApiRef.current?.updateOptions({ className: props.gridClassName });
108
- }, [props.gridClassName]);
109
- const optionValues = UPDATABLE_KEYS.map((key) => props[key]);
110
- const previousOptionValues = (0, import_react.useRef)(null);
111
- (0, import_react.useEffect)(() => {
112
- const previous = previousOptionValues.current;
113
- previousOptionValues.current = optionValues;
114
- if (!previous) {
115
- return;
116
- }
117
- const changed = {};
118
- optionValues.forEach((value, index) => {
119
- if (!Object.is(value, previous[index])) changed[UPDATABLE_KEYS[index]] = value;
120
- });
121
- if (Object.keys(changed).length > 0) {
122
- gridApiRef.current?.updateOptions(changed);
123
- }
124
- }, optionValues);
125
- return (0, import_react.createElement)("div", {
126
- ref: hostRef,
127
- className: `mach-react-host ${className ?? ""}`.trim() || void 0,
128
- style
129
- });
130
- }
131
-
132
- // src/useMachGrid.ts
133
- var import_react2 = require("react");
134
- function useMachGrid() {
135
- const [api, setApi] = (0, import_react2.useState)(null);
136
- const apiRef = (0, import_react2.useMemo)(() => {
137
- let current = null;
138
- return Object.defineProperty({}, "current", {
139
- enumerable: true,
140
- get: () => current,
141
- set: (next) => {
142
- if (next === current) return;
143
- current = next;
144
- setApi(next);
145
- }
146
- });
147
- }, []);
148
- return { apiRef, api };
149
- }
150
-
151
- // src/adapters.ts
152
- var import_react3 = require("react");
153
- var import_client = require("react-dom/client");
154
- function reactCellRenderer(Component) {
155
- return (params) => {
156
- const host = document.createElement("div");
157
- host.className = "mach-cell-react";
158
- host.style.width = "100%";
159
- const root = (0, import_client.createRoot)(host);
160
- root.render((0, import_react3.createElement)(Component, params));
161
- let destroyed = false;
162
- return {
163
- el: host,
164
- destroy: () => {
165
- if (destroyed) return;
166
- destroyed = true;
167
- window.setTimeout(() => {
168
- root.unmount();
169
- }, 0);
170
- }
171
- };
172
- };
173
- }
174
- function reactDetailRenderer(Component) {
175
- return (params) => {
176
- const host = document.createElement("div");
177
- host.style.height = "100%";
178
- const root = (0, import_client.createRoot)(host);
179
- root.render((0, import_react3.createElement)(Component, params));
180
- let destroyed = false;
181
- return {
182
- el: host,
183
- destroy: () => {
184
- if (destroyed) return;
185
- destroyed = true;
186
- window.setTimeout(() => {
187
- root.unmount();
188
- }, 0);
189
- }
190
- };
191
- };
192
- }
193
-
194
- // src/index.ts
195
- __reExport(index_exports, require("@agile-team/mach-table"), module.exports);
196
- var index_default = RobotGrid;
197
- // Annotate the CommonJS export names for ESM import in node:
198
- 0 && (module.exports = {
199
- MachTable,
200
- RobotGrid,
201
- reactCellRenderer,
202
- reactDetailRenderer,
203
- useMachGrid,
204
- ...require("@agile-team/mach-table")
205
- });
1
+ "use strict";var x=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var F=(e,r)=>{for(var t in r)x(e,t,{get:r[t],enumerable:!0})},v=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of _(r))!$.call(e,n)&&n!==t&&x(e,n,{get:()=>r[n],enumerable:!(a=I(r,n))||a.enumerable});return e},f=(e,r,t)=>(v(e,r,"default"),t&&v(t,r,"default"));var K=e=>v(x({},"__esModule",{value:!0}),e);var u={};F(u,{MachTable:()=>D,MachTableProvider:()=>k,RobotGrid:()=>V,default:()=>q,reactCellRenderer:()=>U,reactDetailRenderer:()=>H,useMachGrid:()=>S,useMachTableDefaults:()=>R});module.exports=K(u);var o=require("react"),l=require("@agile-team/mach-table");var d=require("react"),j=require("@agile-team/mach-table"),w=(0,d.createContext)({});function k({defaults:e,children:r}){let t=(0,d.useContext)(w),a=(0,d.useMemo)(()=>(0,j.createMachTablePreset)(t,e),[t,e]);return(0,d.createElement)(w.Provider,{value:a},r)}function R(){return(0,d.useContext)(w)}function Y(e,r){let t={};for(let a of l.GRID_OPTION_KEYS){if(a==="className")continue;let n=a==="ariaLabel"?e.gridAriaLabel:a==="ariaLabelledBy"?e.gridAriaLabelledBy:a==="ariaDescribedBy"?e.gridAriaDescribedBy:e[a];n!==void 0&&(t[a]=n)}return e.gridClassName!==void 0&&(t.className=e.gridClassName),(0,l.createMachTablePreset)(r,t)}function D(e){let{className:r,style:t,apiRef:a}=e,n=(0,o.useRef)(null),c=(0,o.useRef)(null),s=(0,o.useRef)(e);s.current=e;let E=R(),P=[E,...l.GRID_OPTION_KEYS.map(i=>i==="className"?e.gridClassName:i==="ariaLabel"?e.gridAriaLabel:i==="ariaLabelledBy"?e.gridAriaLabelledBy:i==="ariaDescribedBy"?e.gridAriaDescribedBy:e[i])],m=(0,o.useRef)(null);(!m.current||m.current.inputs.length!==P.length||P.some((i,p)=>!Object.is(i,m.current?.inputs[p])))&&(m.current={inputs:P,options:Y(e,E)});let G=m.current.options,g=(0,o.useRef)(G);g.current=G,(0,o.useEffect)(()=>{let i=n.current;if(!i)return;let p={...g.current};for(let b of l.EVENT_TYPES){let O=`on${b.charAt(0).toUpperCase()}${b.slice(1)}`;p[O]=B=>{let A=g.current[O];typeof A=="function"&&A(B);let C=s.current[O];typeof C=="function"&&C!==A&&C(B)}}let T=(0,l.createGrid)(i,p);return c.current=T,()=>{T.destroy(),c.current=null}},[]),(0,o.useEffect)(()=>{if(!a)return;let i=c.current;return a.current=i,()=>{a.current===i&&(a.current=null)}},[a]);let M=l.GRID_OPTION_KEYS.map(i=>G[i]),L=(0,o.useRef)(null);return(0,o.useEffect)(()=>{let i=L.current;if(L.current=M,!i)return;let p={};M.forEach((T,b)=>{Object.is(T,i[b])||(p[l.GRID_OPTION_KEYS[b]]=T)}),Object.keys(p).length>0&&c.current?.updateOptions(p)},M),(0,o.createElement)("div",{ref:n,className:`mach-react-host ${r??""}`.trim()||void 0,style:t,"aria-label":e["aria-label"],"aria-labelledby":e["aria-labelledby"],"aria-describedby":e["aria-describedby"]})}var V=D;var y=require("react");function S(){let[e,r]=(0,y.useState)(null),[t,a]=(0,y.useState)(!1);return{apiRef:(0,y.useMemo)(()=>{let c=null;return Object.defineProperty({},"current",{enumerable:!0,get:()=>c,set:s=>{s!==c&&(c=s,r(s),a(!1),s&&s.whenReady().then(()=>{c===s&&!s.isDestroyed()&&a(!0)}))}})},[]),api:e,ready:t}}var h=require("react"),N=require("react-dom/client");function U(e){return r=>{let t=document.createElement("div");t.className="mach-cell-react",t.style.width="100%";let a=(0,N.createRoot)(t);a.render((0,h.createElement)(e,r));let n=!1;return{el:t,destroy:()=>{n||(n=!0,window.setTimeout(()=>{a.unmount()},0))}}}}function H(e){return r=>{let t=document.createElement("div");t.style.height="100%";let a=(0,N.createRoot)(t);a.render((0,h.createElement)(e,r));let n=!1;return{el:t,destroy:()=>{n||(n=!0,window.setTimeout(()=>{a.unmount()},0))}}}}f(u,require("@agile-team/mach-table"),module.exports);var q=D;0&&(module.exports={MachTable,MachTableProvider,RobotGrid,reactCellRenderer,reactDetailRenderer,useMachGrid,useMachTableDefaults,...require("@agile-team/mach-table")});
206
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/RobotGrid.tsx","../src/useMachGrid.ts","../src/adapters.ts"],"sourcesContent":["import { RobotGrid } from \"./RobotGrid\";\n\nexport { RobotGrid };\nexport { RobotGrid as MachTable };\nexport type { RobotGridReactProps } from \"./RobotGrid\";\nexport { useMachGrid } from \"./useMachGrid\";\nexport type { UseMachGridReturn } from \"./useMachGrid\";\nexport { reactCellRenderer, reactDetailRenderer } from \"./adapters\";\nexport type { ReactCellRendererProps, ReactDetailProps } from \"./adapters\";\nexport * from \"@agile-team/mach-table\";\n\n/** Enables `React.lazy(() => import(\"@agile-team/mach-table-react\"))`. */\nexport default RobotGrid;\n","import {\n createElement,\n useEffect,\n useRef,\n type CSSProperties,\n type MutableRefObject\n} from \"react\";\nimport { createGrid, DIRECT_GRID_OPTION_KEYS, EVENT_TYPES } from \"@agile-team/mach-table\";\nimport type { GridApi, GridOptions } from \"@agile-team/mach-table\";\n\nexport type RobotGridReactProps<TData = any> = Omit<GridOptions<TData>, \"className\"> & {\n /** CSS class applied to the React host element. */\n className?: string;\n /** CSS class forwarded to MachTable's inner grid root. */\n gridClassName?: string;\n style?: CSSProperties;\n apiRef?: MutableRefObject<GridApi<TData> | null>;\n};\n\nconst UPDATABLE_KEYS = DIRECT_GRID_OPTION_KEYS.filter((key) => key !== \"className\");\n\nexport function RobotGrid<TData = any>(props: RobotGridReactProps<TData>) {\n const { className, style, apiRef } = props;\n const hostRef = useRef<HTMLDivElement | null>(null);\n const gridApiRef = useRef<GridApi<TData> | null>(null);\n const propsRef = useRef(props);\n propsRef.current = props;\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n const initial = propsRef.current;\n const options: Record<string, unknown> = {};\n for (const key of Object.keys(initial) as string[]) {\n if (key === \"className\" || key === \"gridClassName\" || key === \"style\" || key === \"apiRef\") continue;\n if (key.startsWith(\"on\")) continue;\n options[key] = (initial as Record<string, unknown>)[key];\n }\n if (initial.gridClassName !== undefined) options.className = initial.gridClassName;\n for (const eventType of EVENT_TYPES) {\n const handlerKey = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}`;\n options[handlerKey] = (event: unknown) => {\n const latest = propsRef.current as Record<string, unknown>;\n const handler = latest[handlerKey];\n if (typeof handler === \"function\") (handler as (event: unknown) => void)(event);\n };\n }\n\n const api = createGrid<TData>(host, options as GridOptions<TData>);\n gridApiRef.current = api;\n return () => {\n api.destroy();\n gridApiRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!apiRef) return;\n const assigned = gridApiRef.current;\n apiRef.current = assigned;\n return () => {\n if (apiRef.current === assigned) apiRef.current = null;\n };\n }, [apiRef]);\n\n const rowDataReady = useRef(false);\n useEffect(() => {\n if (!rowDataReady.current) {\n rowDataReady.current = true;\n return;\n }\n gridApiRef.current?.setRowData(props.rowData);\n }, [props.rowData]);\n\n const columnDefsReady = useRef(false);\n useEffect(() => {\n if (!columnDefsReady.current) {\n columnDefsReady.current = true;\n return;\n }\n gridApiRef.current?.setColumnDefs(props.columnDefs);\n }, [props.columnDefs]);\n\n const quickFilterReady = useRef(false);\n useEffect(() => {\n if (!quickFilterReady.current) {\n quickFilterReady.current = true;\n return;\n }\n gridApiRef.current?.setQuickFilter(props.quickFilterText);\n }, [props.quickFilterText]);\n\n const gridClassNameReady = useRef(false);\n useEffect(() => {\n if (!gridClassNameReady.current) {\n gridClassNameReady.current = true;\n return;\n }\n gridApiRef.current?.updateOptions({ className: props.gridClassName });\n }, [props.gridClassName]);\n\n const optionValues = UPDATABLE_KEYS.map((key) => props[key]);\n const previousOptionValues = useRef<readonly unknown[] | null>(null);\n useEffect(() => {\n const previous = previousOptionValues.current;\n previousOptionValues.current = optionValues;\n if (!previous) {\n return;\n }\n const changed: Record<string, unknown> = {};\n optionValues.forEach((value, index) => {\n if (!Object.is(value, previous[index])) changed[UPDATABLE_KEYS[index]] = value;\n });\n if (Object.keys(changed).length > 0) {\n gridApiRef.current?.updateOptions(changed as Partial<GridOptions<TData>>);\n }\n }, optionValues);\n\n return createElement(\"div\", {\n ref: hostRef,\n className: `mach-react-host ${className ?? \"\"}`.trim() || undefined,\n style\n });\n}\n","import { useMemo, useState, type MutableRefObject } from \"react\";\nimport type { GridApi } from \"@agile-team/mach-table\";\n\nexport interface UseMachGridReturn<TData = any> {\n apiRef: MutableRefObject<GridApi<TData> | null>;\n api: GridApi<TData> | null;\n}\n\nexport function useMachGrid<TData = any>(): UseMachGridReturn<TData> {\n const [api, setApi] = useState<GridApi<TData> | null>(null);\n const apiRef = useMemo(() => {\n let current: GridApi<TData> | null = null;\n return Object.defineProperty({}, \"current\", {\n enumerable: true,\n get: () => current,\n set: (next: GridApi<TData> | null) => {\n if (next === current) return;\n current = next;\n setApi(next);\n }\n }) as MutableRefObject<GridApi<TData> | null>;\n }, []);\n\n return { apiRef, api };\n}\n","import { createElement, isValidElement, type ComponentType, type ReactNode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { CellRendererParams, CellRendererFn, DetailRowRendererParams, GridApi, RowNode } from \"@agile-team/mach-table\";\n\nexport interface ReactCellRendererProps<TData = any, TValue = any> extends CellRendererParams<TData, TValue> {\n children?: ReactNode;\n}\n\nexport interface ReactDetailProps<TData = any> {\n data: TData | null;\n node: RowNode<TData>;\n api: GridApi<TData>;\n}\n\nexport function reactCellRenderer<TData = any, TValue = any>(\n Component: ComponentType<ReactCellRendererProps<TData, TValue>>\n): CellRendererFn {\n return (params) => {\n const host = document.createElement(\"div\");\n host.className = \"mach-cell-react\";\n host.style.width = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params as ReactCellRendererProps<TData, TValue>));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function reactDetailRenderer<TData = any>(\n Component: ComponentType<ReactDetailProps<TData>>\n): (params: DetailRowRendererParams<TData>) => { el: HTMLElement; destroy?: () => void } {\n return (params) => {\n const host = document.createElement(\"div\");\n host.style.height = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function isReactElement(value: unknown): boolean {\n return isValidElement(value);\n}\n"],"mappings":"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","names":["import_react","import_react"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/MachTable.tsx","../src/defaults.tsx","../src/useMachGrid.ts","../src/adapters.ts"],"sourcesContent":["import { MachTable, RobotGrid } from \"./MachTable\";\n\nexport { MachTable, RobotGrid };\nexport type { MachTableReactProps, RobotGridReactProps } from \"./MachTable\";\nexport { useMachGrid } from \"./useMachGrid\";\nexport type { UseMachGridReturn } from \"./useMachGrid\";\nexport { MachTableProvider, useMachTableDefaults } from \"./defaults\";\nexport type { MachTableProviderProps } from \"./defaults\";\nexport { reactCellRenderer, reactDetailRenderer } from \"./adapters\";\nexport type { ReactCellRendererProps, ReactDetailProps } from \"./adapters\";\nexport * from \"@agile-team/mach-table\";\n\n/** Enables `React.lazy(() => import(\"@agile-team/mach-table-react\"))`. */\nexport default MachTable;\n","import {\n createElement,\n useEffect,\n useRef,\n type CSSProperties,\n type MutableRefObject\n} from \"react\";\nimport { createGrid, createMachTablePreset, GRID_OPTION_KEYS, EVENT_TYPES } from \"@agile-team/mach-table\";\nimport type { GridApi, GridOptions } from \"@agile-team/mach-table\";\nimport { useMachTableDefaults } from \"./defaults\";\n\ntype AdapterOnlyGridOption = \"className\" | \"ariaLabel\" | \"ariaLabelledBy\" | \"ariaDescribedBy\";\n\nexport type MachTableReactProps<TData = any> = Omit<GridOptions<TData>, AdapterOnlyGridOption> & {\n /** CSS class applied to the React host element. */\n className?: string;\n /** CSS class forwarded to MachTable's inner grid root. */\n gridClassName?: string;\n gridAriaLabel?: string;\n gridAriaLabelledBy?: string;\n gridAriaDescribedBy?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n style?: CSSProperties;\n apiRef?: MutableRefObject<GridApi<TData> | null>;\n};\n\nfunction collectGridOptions<TData>(\n props: MachTableReactProps<TData>,\n defaults: Partial<GridOptions<TData>>\n): GridOptions<TData> {\n const explicit: Record<string, unknown> = {};\n for (const key of GRID_OPTION_KEYS) {\n if (key === \"className\") continue;\n const value = key === \"ariaLabel\"\n ? props.gridAriaLabel\n : key === \"ariaLabelledBy\"\n ? props.gridAriaLabelledBy\n : key === \"ariaDescribedBy\"\n ? props.gridAriaDescribedBy\n : props[key];\n if (value !== undefined) explicit[key] = value;\n }\n if (props.gridClassName !== undefined) explicit.className = props.gridClassName;\n return createMachTablePreset(defaults, explicit as Partial<GridOptions<TData>>);\n}\n\nexport function MachTable<TData = any>(props: MachTableReactProps<TData>) {\n const { className, style, apiRef } = props;\n const hostRef = useRef<HTMLDivElement | null>(null);\n const gridApiRef = useRef<GridApi<TData> | null>(null);\n const propsRef = useRef(props);\n propsRef.current = props;\n const defaults = useMachTableDefaults<TData>();\n const effectiveInputs = [\n defaults,\n ...GRID_OPTION_KEYS.map((key) => key === \"className\"\n ? props.gridClassName\n : key === \"ariaLabel\"\n ? props.gridAriaLabel\n : key === \"ariaLabelledBy\"\n ? props.gridAriaLabelledBy\n : key === \"ariaDescribedBy\"\n ? props.gridAriaDescribedBy\n : props[key])\n ];\n const effectiveCache = useRef<{ inputs: readonly unknown[]; options: GridOptions<TData> } | null>(null);\n if (\n !effectiveCache.current ||\n effectiveCache.current.inputs.length !== effectiveInputs.length ||\n effectiveInputs.some((value, index) => !Object.is(value, effectiveCache.current?.inputs[index]))\n ) {\n effectiveCache.current = { inputs: effectiveInputs, options: collectGridOptions(props, defaults) };\n }\n const effectiveOptions = effectiveCache.current.options;\n const effectiveRef = useRef(effectiveOptions);\n effectiveRef.current = effectiveOptions;\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n const options = { ...effectiveRef.current } as Record<string, unknown>;\n for (const eventType of EVENT_TYPES) {\n const handlerKey = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}`;\n options[handlerKey] = (event: unknown) => {\n const defaultHandler = (effectiveRef.current as Record<string, unknown>)[handlerKey];\n if (typeof defaultHandler === \"function\") (defaultHandler as (value: unknown) => void)(event);\n const latest = propsRef.current as Record<string, unknown>;\n const handler = latest[handlerKey];\n if (typeof handler === \"function\" && handler !== defaultHandler) {\n (handler as (value: unknown) => void)(event);\n }\n };\n }\n\n const api = createGrid<TData>(host, options);\n gridApiRef.current = api;\n return () => {\n api.destroy();\n gridApiRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!apiRef) return;\n const assigned = gridApiRef.current;\n apiRef.current = assigned;\n return () => {\n if (apiRef.current === assigned) apiRef.current = null;\n };\n }, [apiRef]);\n\n const optionValues = GRID_OPTION_KEYS.map((key) => effectiveOptions[key]);\n const previousOptionValues = useRef<readonly unknown[] | null>(null);\n useEffect(() => {\n const previous = previousOptionValues.current;\n previousOptionValues.current = optionValues;\n if (!previous) {\n return;\n }\n const changed: Record<string, unknown> = {};\n optionValues.forEach((value, index) => {\n if (Object.is(value, previous[index])) return;\n changed[GRID_OPTION_KEYS[index]] = value;\n });\n if (Object.keys(changed).length > 0) {\n gridApiRef.current?.updateOptions(changed);\n }\n }, optionValues);\n\n return createElement(\"div\", {\n ref: hostRef,\n className: `mach-react-host ${className ?? \"\"}`.trim() || undefined,\n style,\n \"aria-label\": props[\"aria-label\"],\n \"aria-labelledby\": props[\"aria-labelledby\"],\n \"aria-describedby\": props[\"aria-describedby\"]\n });\n}\n\n/** @deprecated Use MachTable. Kept as a source-compatible alias through 0.x. */\nexport const RobotGrid = MachTable;\n/** @deprecated Use MachTableReactProps. */\nexport type RobotGridReactProps<TData = any> = MachTableReactProps<TData>;\n","import { createContext, createElement, useContext, useMemo, type ReactNode } from \"react\";\nimport { createMachTablePreset, type GridOptions } from \"@agile-team/mach-table\";\n\nconst MachTableDefaultsContext = createContext<Partial<GridOptions<any>>>({});\n\nexport interface MachTableProviderProps<TData = any> {\n defaults: Partial<GridOptions<TData>>;\n children?: ReactNode;\n}\n\n/** Supplies app-, route- or layout-scoped defaults without making tables eager. */\nexport function MachTableProvider<TData = any>({ defaults, children }: MachTableProviderProps<TData>) {\n const parent = useContext(MachTableDefaultsContext);\n const value = useMemo(() => createMachTablePreset(parent, defaults), [parent, defaults]);\n return createElement(MachTableDefaultsContext.Provider, { value }, children);\n}\n\nexport function useMachTableDefaults<TData = any>(): Partial<GridOptions<TData>> {\n return useContext(MachTableDefaultsContext) as Partial<GridOptions<TData>>;\n}\n","import { useMemo, useState, type MutableRefObject } from \"react\";\nimport type { GridApi } from \"@agile-team/mach-table\";\n\nexport interface UseMachGridReturn<TData = any> {\n apiRef: MutableRefObject<GridApi<TData> | null>;\n api: GridApi<TData> | null;\n ready: boolean;\n}\n\nexport function useMachGrid<TData = any>(): UseMachGridReturn<TData> {\n const [api, setApi] = useState<GridApi<TData> | null>(null);\n const [ready, setReady] = useState(false);\n const apiRef = useMemo(() => {\n let current: GridApi<TData> | null = null;\n return Object.defineProperty({}, \"current\", {\n enumerable: true,\n get: () => current,\n set: (next: GridApi<TData> | null) => {\n if (next === current) return;\n current = next;\n setApi(next);\n setReady(false);\n if (next) {\n void next.whenReady().then(() => {\n if (current === next && !next.isDestroyed()) setReady(true);\n });\n }\n }\n }) as MutableRefObject<GridApi<TData> | null>;\n }, []);\n\n return { apiRef, api, ready };\n}\n","import { createElement, isValidElement, type ComponentType, type ReactNode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { CellRendererParams, CellRendererFn, DetailRowRendererParams, GridApi, RowNode } from \"@agile-team/mach-table\";\n\nexport interface ReactCellRendererProps<TData = any, TValue = any> extends CellRendererParams<TData, TValue> {\n children?: ReactNode;\n}\n\nexport interface ReactDetailProps<TData = any> {\n data: TData | null;\n node: RowNode<TData>;\n api: GridApi<TData>;\n}\n\nexport function reactCellRenderer<TData = any, TValue = any>(\n Component: ComponentType<ReactCellRendererProps<TData, TValue>>\n): CellRendererFn {\n return (params) => {\n const host = document.createElement(\"div\");\n host.className = \"mach-cell-react\";\n host.style.width = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params as ReactCellRendererProps<TData, TValue>));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function reactDetailRenderer<TData = any>(\n Component: ComponentType<ReactDetailProps<TData>>\n): (params: DetailRowRendererParams<TData>) => { el: HTMLElement; destroy?: () => void } {\n return (params) => {\n const host = document.createElement(\"div\");\n host.style.height = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function isReactElement(value: unknown): boolean {\n return isValidElement(value);\n}\n"],"mappings":"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","names":["index_exports","__export","MachTable","MachTableProvider","RobotGrid","index_default","reactCellRenderer","reactDetailRenderer","useMachGrid","useMachTableDefaults","__toCommonJS","import_react","import_mach_table","import_react","import_mach_table","MachTableDefaultsContext","MachTableProvider","defaults","children","parent","value","useMachTableDefaults","collectGridOptions","props","defaults","explicit","key","value","MachTable","className","style","apiRef","hostRef","gridApiRef","propsRef","useMachTableDefaults","effectiveInputs","effectiveCache","index","effectiveOptions","effectiveRef","host","options","eventType","handlerKey","event","defaultHandler","handler","api","assigned","optionValues","previousOptionValues","previous","changed","RobotGrid","import_react","useMachGrid","api","setApi","ready","setReady","current","next","import_react","import_client","reactCellRenderer","Component","params","host","root","destroyed","reactDetailRenderer","__reExport","index_exports","index_default","MachTable"]}
package/dist/index.d.cts CHANGED
@@ -3,26 +3,49 @@ import { CSSProperties, MutableRefObject, ReactNode, ComponentType } from 'react
3
3
  import { GridOptions, GridApi, CellRendererParams, RowNode, CellRendererFn, DetailRowRendererParams } from '@agile-team/mach-table';
4
4
  export * from '@agile-team/mach-table';
5
5
 
6
- type RobotGridReactProps<TData = any> = Omit<GridOptions<TData>, "className"> & {
6
+ type AdapterOnlyGridOption = "className" | "ariaLabel" | "ariaLabelledBy" | "ariaDescribedBy";
7
+ type MachTableReactProps<TData = any> = Omit<GridOptions<TData>, AdapterOnlyGridOption> & {
7
8
  /** CSS class applied to the React host element. */
8
9
  className?: string;
9
10
  /** CSS class forwarded to MachTable's inner grid root. */
10
11
  gridClassName?: string;
12
+ gridAriaLabel?: string;
13
+ gridAriaLabelledBy?: string;
14
+ gridAriaDescribedBy?: string;
15
+ "aria-label"?: string;
16
+ "aria-labelledby"?: string;
17
+ "aria-describedby"?: string;
11
18
  style?: CSSProperties;
12
19
  apiRef?: MutableRefObject<GridApi<TData> | null>;
13
20
  };
14
- declare function RobotGrid<TData = any>(props: RobotGridReactProps<TData>): react.DetailedReactHTMLElement<{
21
+ declare function MachTable<TData = any>(props: MachTableReactProps<TData>): react.DetailedReactHTMLElement<{
15
22
  ref: MutableRefObject<HTMLDivElement | null>;
16
23
  className: string | undefined;
17
24
  style: CSSProperties | undefined;
25
+ "aria-label": string | undefined;
26
+ "aria-labelledby": string | undefined;
27
+ "aria-describedby": string | undefined;
18
28
  }, HTMLDivElement>;
29
+ /** @deprecated Use MachTable. Kept as a source-compatible alias through 0.x. */
30
+ declare const RobotGrid: typeof MachTable;
31
+ /** @deprecated Use MachTableReactProps. */
32
+ type RobotGridReactProps<TData = any> = MachTableReactProps<TData>;
19
33
 
20
34
  interface UseMachGridReturn<TData = any> {
21
35
  apiRef: MutableRefObject<GridApi<TData> | null>;
22
36
  api: GridApi<TData> | null;
37
+ ready: boolean;
23
38
  }
24
39
  declare function useMachGrid<TData = any>(): UseMachGridReturn<TData>;
25
40
 
41
+ interface MachTableProviderProps<TData = any> {
42
+ defaults: Partial<GridOptions<TData>>;
43
+ children?: ReactNode;
44
+ }
45
+ /** Supplies app-, route- or layout-scoped defaults without making tables eager. */
46
+ declare function MachTableProvider<TData = any>({ defaults, children }: MachTableProviderProps<TData>): react.FunctionComponentElement<react.ProviderProps<Partial<GridOptions<any>>>>;
47
+ declare function useMachTableDefaults<TData = any>(): Partial<GridOptions<TData>>;
48
+
26
49
  interface ReactCellRendererProps<TData = any, TValue = any> extends CellRendererParams<TData, TValue> {
27
50
  children?: ReactNode;
28
51
  }
@@ -37,4 +60,4 @@ declare function reactDetailRenderer<TData = any>(Component: ComponentType<React
37
60
  destroy?: () => void;
38
61
  };
39
62
 
40
- export { RobotGrid as MachTable, type ReactCellRendererProps, type ReactDetailProps, RobotGrid, type RobotGridReactProps, type UseMachGridReturn, RobotGrid as default, reactCellRenderer, reactDetailRenderer, useMachGrid };
63
+ export { MachTable, MachTableProvider, type MachTableProviderProps, type MachTableReactProps, type ReactCellRendererProps, type ReactDetailProps, RobotGrid, type RobotGridReactProps, type UseMachGridReturn, MachTable as default, reactCellRenderer, reactDetailRenderer, useMachGrid, useMachTableDefaults };
package/dist/index.d.ts CHANGED
@@ -3,26 +3,49 @@ import { CSSProperties, MutableRefObject, ReactNode, ComponentType } from 'react
3
3
  import { GridOptions, GridApi, CellRendererParams, RowNode, CellRendererFn, DetailRowRendererParams } from '@agile-team/mach-table';
4
4
  export * from '@agile-team/mach-table';
5
5
 
6
- type RobotGridReactProps<TData = any> = Omit<GridOptions<TData>, "className"> & {
6
+ type AdapterOnlyGridOption = "className" | "ariaLabel" | "ariaLabelledBy" | "ariaDescribedBy";
7
+ type MachTableReactProps<TData = any> = Omit<GridOptions<TData>, AdapterOnlyGridOption> & {
7
8
  /** CSS class applied to the React host element. */
8
9
  className?: string;
9
10
  /** CSS class forwarded to MachTable's inner grid root. */
10
11
  gridClassName?: string;
12
+ gridAriaLabel?: string;
13
+ gridAriaLabelledBy?: string;
14
+ gridAriaDescribedBy?: string;
15
+ "aria-label"?: string;
16
+ "aria-labelledby"?: string;
17
+ "aria-describedby"?: string;
11
18
  style?: CSSProperties;
12
19
  apiRef?: MutableRefObject<GridApi<TData> | null>;
13
20
  };
14
- declare function RobotGrid<TData = any>(props: RobotGridReactProps<TData>): react.DetailedReactHTMLElement<{
21
+ declare function MachTable<TData = any>(props: MachTableReactProps<TData>): react.DetailedReactHTMLElement<{
15
22
  ref: MutableRefObject<HTMLDivElement | null>;
16
23
  className: string | undefined;
17
24
  style: CSSProperties | undefined;
25
+ "aria-label": string | undefined;
26
+ "aria-labelledby": string | undefined;
27
+ "aria-describedby": string | undefined;
18
28
  }, HTMLDivElement>;
29
+ /** @deprecated Use MachTable. Kept as a source-compatible alias through 0.x. */
30
+ declare const RobotGrid: typeof MachTable;
31
+ /** @deprecated Use MachTableReactProps. */
32
+ type RobotGridReactProps<TData = any> = MachTableReactProps<TData>;
19
33
 
20
34
  interface UseMachGridReturn<TData = any> {
21
35
  apiRef: MutableRefObject<GridApi<TData> | null>;
22
36
  api: GridApi<TData> | null;
37
+ ready: boolean;
23
38
  }
24
39
  declare function useMachGrid<TData = any>(): UseMachGridReturn<TData>;
25
40
 
41
+ interface MachTableProviderProps<TData = any> {
42
+ defaults: Partial<GridOptions<TData>>;
43
+ children?: ReactNode;
44
+ }
45
+ /** Supplies app-, route- or layout-scoped defaults without making tables eager. */
46
+ declare function MachTableProvider<TData = any>({ defaults, children }: MachTableProviderProps<TData>): react.FunctionComponentElement<react.ProviderProps<Partial<GridOptions<any>>>>;
47
+ declare function useMachTableDefaults<TData = any>(): Partial<GridOptions<TData>>;
48
+
26
49
  interface ReactCellRendererProps<TData = any, TValue = any> extends CellRendererParams<TData, TValue> {
27
50
  children?: ReactNode;
28
51
  }
@@ -37,4 +60,4 @@ declare function reactDetailRenderer<TData = any>(Component: ComponentType<React
37
60
  destroy?: () => void;
38
61
  };
39
62
 
40
- export { RobotGrid as MachTable, type ReactCellRendererProps, type ReactDetailProps, RobotGrid, type RobotGridReactProps, type UseMachGridReturn, RobotGrid as default, reactCellRenderer, reactDetailRenderer, useMachGrid };
63
+ export { MachTable, MachTableProvider, type MachTableProviderProps, type MachTableReactProps, type ReactCellRendererProps, type ReactDetailProps, RobotGrid, type RobotGridReactProps, type UseMachGridReturn, MachTable as default, reactCellRenderer, reactDetailRenderer, useMachGrid, useMachTableDefaults };
package/dist/index.js CHANGED
@@ -1,177 +1,2 @@
1
- // src/RobotGrid.tsx
2
- import {
3
- createElement,
4
- useEffect,
5
- useRef
6
- } from "react";
7
- import { createGrid, DIRECT_GRID_OPTION_KEYS, EVENT_TYPES } from "@agile-team/mach-table";
8
- var UPDATABLE_KEYS = DIRECT_GRID_OPTION_KEYS.filter((key) => key !== "className");
9
- function RobotGrid(props) {
10
- const { className, style, apiRef } = props;
11
- const hostRef = useRef(null);
12
- const gridApiRef = useRef(null);
13
- const propsRef = useRef(props);
14
- propsRef.current = props;
15
- useEffect(() => {
16
- const host = hostRef.current;
17
- if (!host) return;
18
- const initial = propsRef.current;
19
- const options = {};
20
- for (const key of Object.keys(initial)) {
21
- if (key === "className" || key === "gridClassName" || key === "style" || key === "apiRef") continue;
22
- if (key.startsWith("on")) continue;
23
- options[key] = initial[key];
24
- }
25
- if (initial.gridClassName !== void 0) options.className = initial.gridClassName;
26
- for (const eventType of EVENT_TYPES) {
27
- const handlerKey = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}`;
28
- options[handlerKey] = (event) => {
29
- const latest = propsRef.current;
30
- const handler = latest[handlerKey];
31
- if (typeof handler === "function") handler(event);
32
- };
33
- }
34
- const api = createGrid(host, options);
35
- gridApiRef.current = api;
36
- return () => {
37
- api.destroy();
38
- gridApiRef.current = null;
39
- };
40
- }, []);
41
- useEffect(() => {
42
- if (!apiRef) return;
43
- const assigned = gridApiRef.current;
44
- apiRef.current = assigned;
45
- return () => {
46
- if (apiRef.current === assigned) apiRef.current = null;
47
- };
48
- }, [apiRef]);
49
- const rowDataReady = useRef(false);
50
- useEffect(() => {
51
- if (!rowDataReady.current) {
52
- rowDataReady.current = true;
53
- return;
54
- }
55
- gridApiRef.current?.setRowData(props.rowData);
56
- }, [props.rowData]);
57
- const columnDefsReady = useRef(false);
58
- useEffect(() => {
59
- if (!columnDefsReady.current) {
60
- columnDefsReady.current = true;
61
- return;
62
- }
63
- gridApiRef.current?.setColumnDefs(props.columnDefs);
64
- }, [props.columnDefs]);
65
- const quickFilterReady = useRef(false);
66
- useEffect(() => {
67
- if (!quickFilterReady.current) {
68
- quickFilterReady.current = true;
69
- return;
70
- }
71
- gridApiRef.current?.setQuickFilter(props.quickFilterText);
72
- }, [props.quickFilterText]);
73
- const gridClassNameReady = useRef(false);
74
- useEffect(() => {
75
- if (!gridClassNameReady.current) {
76
- gridClassNameReady.current = true;
77
- return;
78
- }
79
- gridApiRef.current?.updateOptions({ className: props.gridClassName });
80
- }, [props.gridClassName]);
81
- const optionValues = UPDATABLE_KEYS.map((key) => props[key]);
82
- const previousOptionValues = useRef(null);
83
- useEffect(() => {
84
- const previous = previousOptionValues.current;
85
- previousOptionValues.current = optionValues;
86
- if (!previous) {
87
- return;
88
- }
89
- const changed = {};
90
- optionValues.forEach((value, index) => {
91
- if (!Object.is(value, previous[index])) changed[UPDATABLE_KEYS[index]] = value;
92
- });
93
- if (Object.keys(changed).length > 0) {
94
- gridApiRef.current?.updateOptions(changed);
95
- }
96
- }, optionValues);
97
- return createElement("div", {
98
- ref: hostRef,
99
- className: `mach-react-host ${className ?? ""}`.trim() || void 0,
100
- style
101
- });
102
- }
103
-
104
- // src/useMachGrid.ts
105
- import { useMemo, useState } from "react";
106
- function useMachGrid() {
107
- const [api, setApi] = useState(null);
108
- const apiRef = useMemo(() => {
109
- let current = null;
110
- return Object.defineProperty({}, "current", {
111
- enumerable: true,
112
- get: () => current,
113
- set: (next) => {
114
- if (next === current) return;
115
- current = next;
116
- setApi(next);
117
- }
118
- });
119
- }, []);
120
- return { apiRef, api };
121
- }
122
-
123
- // src/adapters.ts
124
- import { createElement as createElement2, isValidElement } from "react";
125
- import { createRoot } from "react-dom/client";
126
- function reactCellRenderer(Component) {
127
- return (params) => {
128
- const host = document.createElement("div");
129
- host.className = "mach-cell-react";
130
- host.style.width = "100%";
131
- const root = createRoot(host);
132
- root.render(createElement2(Component, params));
133
- let destroyed = false;
134
- return {
135
- el: host,
136
- destroy: () => {
137
- if (destroyed) return;
138
- destroyed = true;
139
- window.setTimeout(() => {
140
- root.unmount();
141
- }, 0);
142
- }
143
- };
144
- };
145
- }
146
- function reactDetailRenderer(Component) {
147
- return (params) => {
148
- const host = document.createElement("div");
149
- host.style.height = "100%";
150
- const root = createRoot(host);
151
- root.render(createElement2(Component, params));
152
- let destroyed = false;
153
- return {
154
- el: host,
155
- destroy: () => {
156
- if (destroyed) return;
157
- destroyed = true;
158
- window.setTimeout(() => {
159
- root.unmount();
160
- }, 0);
161
- }
162
- };
163
- };
164
- }
165
-
166
- // src/index.ts
167
- export * from "@agile-team/mach-table";
168
- var index_default = RobotGrid;
169
- export {
170
- RobotGrid as MachTable,
171
- RobotGrid,
172
- index_default as default,
173
- reactCellRenderer,
174
- reactDetailRenderer,
175
- useMachGrid
176
- };
1
+ import{createElement as V,useEffect as g,useRef as c}from"react";import{createGrid as S,createMachTablePreset as U,GRID_OPTION_KEYS as f,EVENT_TYPES as H}from"@agile-team/mach-table";import{createContext as E,createElement as L,useContext as v,useMemo as B}from"react";import{createMachTablePreset as j}from"@agile-team/mach-table";var P=E({});function k({defaults:e,children:i}){let a=v(P),t=B(()=>j(a,e),[a,e]);return L(P.Provider,{value:t},i)}function G(){return v(P)}function I(e,i){let a={};for(let t of f){if(t==="className")continue;let n=t==="ariaLabel"?e.gridAriaLabel:t==="ariaLabelledBy"?e.gridAriaLabelledBy:t==="ariaDescribedBy"?e.gridAriaDescribedBy:e[t];n!==void 0&&(a[t]=n)}return e.gridClassName!==void 0&&(a.className=e.gridClassName),U(i,a)}function M(e){let{className:i,style:a,apiRef:t}=e,n=c(null),l=c(null),o=c(e);o.current=e;let O=G(),m=[O,...f.map(r=>r==="className"?e.gridClassName:r==="ariaLabel"?e.gridAriaLabel:r==="ariaLabelledBy"?e.gridAriaLabelledBy:r==="ariaDescribedBy"?e.gridAriaDescribedBy:e[r])],d=c(null);(!d.current||d.current.inputs.length!==m.length||m.some((r,s)=>!Object.is(r,d.current?.inputs[s])))&&(d.current={inputs:m,options:I(e,O)});let T=d.current.options,b=c(T);b.current=T,g(()=>{let r=n.current;if(!r)return;let s={...b.current};for(let p of H){let R=`on${p.charAt(0).toUpperCase()}${p.slice(1)}`;s[R]=C=>{let D=b.current[R];typeof D=="function"&&D(C);let h=o.current[R];typeof h=="function"&&h!==D&&h(C)}}let u=S(r,s);return l.current=u,()=>{u.destroy(),l.current=null}},[]),g(()=>{if(!t)return;let r=l.current;return t.current=r,()=>{t.current===r&&(t.current=null)}},[t]);let y=f.map(r=>T[r]),A=c(null);return g(()=>{let r=A.current;if(A.current=y,!r)return;let s={};y.forEach((u,p)=>{Object.is(u,r[p])||(s[f[p]]=u)}),Object.keys(s).length>0&&l.current?.updateOptions(s)},y),V("div",{ref:n,className:`mach-react-host ${i??""}`.trim()||void 0,style:a,"aria-label":e["aria-label"],"aria-labelledby":e["aria-labelledby"],"aria-describedby":e["aria-describedby"]})}var _=M;import{useMemo as $,useState as x}from"react";function F(){let[e,i]=x(null),[a,t]=x(!1);return{apiRef:$(()=>{let l=null;return Object.defineProperty({},"current",{enumerable:!0,get:()=>l,set:o=>{o!==l&&(l=o,i(o),t(!1),o&&o.whenReady().then(()=>{l===o&&!o.isDestroyed()&&t(!0)}))}})},[]),api:e,ready:a}}import{createElement as w,isValidElement as ne}from"react";import{createRoot as N}from"react-dom/client";function K(e){return i=>{let a=document.createElement("div");a.className="mach-cell-react",a.style.width="100%";let t=N(a);t.render(w(e,i));let n=!1;return{el:a,destroy:()=>{n||(n=!0,window.setTimeout(()=>{t.unmount()},0))}}}}function Y(e){return i=>{let a=document.createElement("div");a.style.height="100%";let t=N(a);t.render(w(e,i));let n=!1;return{el:a,destroy:()=>{n||(n=!0,window.setTimeout(()=>{t.unmount()},0))}}}}export*from"@agile-team/mach-table";var se=M;export{M as MachTable,k as MachTableProvider,_ as RobotGrid,se as default,K as reactCellRenderer,Y as reactDetailRenderer,F as useMachGrid,G as useMachTableDefaults};
177
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/RobotGrid.tsx","../src/useMachGrid.ts","../src/adapters.ts","../src/index.ts"],"sourcesContent":["import {\n createElement,\n useEffect,\n useRef,\n type CSSProperties,\n type MutableRefObject\n} from \"react\";\nimport { createGrid, DIRECT_GRID_OPTION_KEYS, EVENT_TYPES } from \"@agile-team/mach-table\";\nimport type { GridApi, GridOptions } from \"@agile-team/mach-table\";\n\nexport type RobotGridReactProps<TData = any> = Omit<GridOptions<TData>, \"className\"> & {\n /** CSS class applied to the React host element. */\n className?: string;\n /** CSS class forwarded to MachTable's inner grid root. */\n gridClassName?: string;\n style?: CSSProperties;\n apiRef?: MutableRefObject<GridApi<TData> | null>;\n};\n\nconst UPDATABLE_KEYS = DIRECT_GRID_OPTION_KEYS.filter((key) => key !== \"className\");\n\nexport function RobotGrid<TData = any>(props: RobotGridReactProps<TData>) {\n const { className, style, apiRef } = props;\n const hostRef = useRef<HTMLDivElement | null>(null);\n const gridApiRef = useRef<GridApi<TData> | null>(null);\n const propsRef = useRef(props);\n propsRef.current = props;\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n const initial = propsRef.current;\n const options: Record<string, unknown> = {};\n for (const key of Object.keys(initial) as string[]) {\n if (key === \"className\" || key === \"gridClassName\" || key === \"style\" || key === \"apiRef\") continue;\n if (key.startsWith(\"on\")) continue;\n options[key] = (initial as Record<string, unknown>)[key];\n }\n if (initial.gridClassName !== undefined) options.className = initial.gridClassName;\n for (const eventType of EVENT_TYPES) {\n const handlerKey = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}`;\n options[handlerKey] = (event: unknown) => {\n const latest = propsRef.current as Record<string, unknown>;\n const handler = latest[handlerKey];\n if (typeof handler === \"function\") (handler as (event: unknown) => void)(event);\n };\n }\n\n const api = createGrid<TData>(host, options as GridOptions<TData>);\n gridApiRef.current = api;\n return () => {\n api.destroy();\n gridApiRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!apiRef) return;\n const assigned = gridApiRef.current;\n apiRef.current = assigned;\n return () => {\n if (apiRef.current === assigned) apiRef.current = null;\n };\n }, [apiRef]);\n\n const rowDataReady = useRef(false);\n useEffect(() => {\n if (!rowDataReady.current) {\n rowDataReady.current = true;\n return;\n }\n gridApiRef.current?.setRowData(props.rowData);\n }, [props.rowData]);\n\n const columnDefsReady = useRef(false);\n useEffect(() => {\n if (!columnDefsReady.current) {\n columnDefsReady.current = true;\n return;\n }\n gridApiRef.current?.setColumnDefs(props.columnDefs);\n }, [props.columnDefs]);\n\n const quickFilterReady = useRef(false);\n useEffect(() => {\n if (!quickFilterReady.current) {\n quickFilterReady.current = true;\n return;\n }\n gridApiRef.current?.setQuickFilter(props.quickFilterText);\n }, [props.quickFilterText]);\n\n const gridClassNameReady = useRef(false);\n useEffect(() => {\n if (!gridClassNameReady.current) {\n gridClassNameReady.current = true;\n return;\n }\n gridApiRef.current?.updateOptions({ className: props.gridClassName });\n }, [props.gridClassName]);\n\n const optionValues = UPDATABLE_KEYS.map((key) => props[key]);\n const previousOptionValues = useRef<readonly unknown[] | null>(null);\n useEffect(() => {\n const previous = previousOptionValues.current;\n previousOptionValues.current = optionValues;\n if (!previous) {\n return;\n }\n const changed: Record<string, unknown> = {};\n optionValues.forEach((value, index) => {\n if (!Object.is(value, previous[index])) changed[UPDATABLE_KEYS[index]] = value;\n });\n if (Object.keys(changed).length > 0) {\n gridApiRef.current?.updateOptions(changed as Partial<GridOptions<TData>>);\n }\n }, optionValues);\n\n return createElement(\"div\", {\n ref: hostRef,\n className: `mach-react-host ${className ?? \"\"}`.trim() || undefined,\n style\n });\n}\n","import { useMemo, useState, type MutableRefObject } from \"react\";\nimport type { GridApi } from \"@agile-team/mach-table\";\n\nexport interface UseMachGridReturn<TData = any> {\n apiRef: MutableRefObject<GridApi<TData> | null>;\n api: GridApi<TData> | null;\n}\n\nexport function useMachGrid<TData = any>(): UseMachGridReturn<TData> {\n const [api, setApi] = useState<GridApi<TData> | null>(null);\n const apiRef = useMemo(() => {\n let current: GridApi<TData> | null = null;\n return Object.defineProperty({}, \"current\", {\n enumerable: true,\n get: () => current,\n set: (next: GridApi<TData> | null) => {\n if (next === current) return;\n current = next;\n setApi(next);\n }\n }) as MutableRefObject<GridApi<TData> | null>;\n }, []);\n\n return { apiRef, api };\n}\n","import { createElement, isValidElement, type ComponentType, type ReactNode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { CellRendererParams, CellRendererFn, DetailRowRendererParams, GridApi, RowNode } from \"@agile-team/mach-table\";\n\nexport interface ReactCellRendererProps<TData = any, TValue = any> extends CellRendererParams<TData, TValue> {\n children?: ReactNode;\n}\n\nexport interface ReactDetailProps<TData = any> {\n data: TData | null;\n node: RowNode<TData>;\n api: GridApi<TData>;\n}\n\nexport function reactCellRenderer<TData = any, TValue = any>(\n Component: ComponentType<ReactCellRendererProps<TData, TValue>>\n): CellRendererFn {\n return (params) => {\n const host = document.createElement(\"div\");\n host.className = \"mach-cell-react\";\n host.style.width = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params as ReactCellRendererProps<TData, TValue>));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function reactDetailRenderer<TData = any>(\n Component: ComponentType<ReactDetailProps<TData>>\n): (params: DetailRowRendererParams<TData>) => { el: HTMLElement; destroy?: () => void } {\n return (params) => {\n const host = document.createElement(\"div\");\n host.style.height = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function isReactElement(value: unknown): boolean {\n return isValidElement(value);\n}\n","import { RobotGrid } from \"./RobotGrid\";\n\nexport { RobotGrid };\nexport { RobotGrid as MachTable };\nexport type { RobotGridReactProps } from \"./RobotGrid\";\nexport { useMachGrid } from \"./useMachGrid\";\nexport type { UseMachGridReturn } from \"./useMachGrid\";\nexport { reactCellRenderer, reactDetailRenderer } from \"./adapters\";\nexport type { ReactCellRendererProps, ReactDetailProps } from \"./adapters\";\nexport * from \"@agile-team/mach-table\";\n\n/** Enables `React.lazy(() => import(\"@agile-team/mach-table-react\"))`. */\nexport default RobotGrid;\n"],"mappings":"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","names":["createElement"]}
1
+ {"version":3,"sources":["../src/MachTable.tsx","../src/defaults.tsx","../src/useMachGrid.ts","../src/adapters.ts","../src/index.ts"],"sourcesContent":["import {\n createElement,\n useEffect,\n useRef,\n type CSSProperties,\n type MutableRefObject\n} from \"react\";\nimport { createGrid, createMachTablePreset, GRID_OPTION_KEYS, EVENT_TYPES } from \"@agile-team/mach-table\";\nimport type { GridApi, GridOptions } from \"@agile-team/mach-table\";\nimport { useMachTableDefaults } from \"./defaults\";\n\ntype AdapterOnlyGridOption = \"className\" | \"ariaLabel\" | \"ariaLabelledBy\" | \"ariaDescribedBy\";\n\nexport type MachTableReactProps<TData = any> = Omit<GridOptions<TData>, AdapterOnlyGridOption> & {\n /** CSS class applied to the React host element. */\n className?: string;\n /** CSS class forwarded to MachTable's inner grid root. */\n gridClassName?: string;\n gridAriaLabel?: string;\n gridAriaLabelledBy?: string;\n gridAriaDescribedBy?: string;\n \"aria-label\"?: string;\n \"aria-labelledby\"?: string;\n \"aria-describedby\"?: string;\n style?: CSSProperties;\n apiRef?: MutableRefObject<GridApi<TData> | null>;\n};\n\nfunction collectGridOptions<TData>(\n props: MachTableReactProps<TData>,\n defaults: Partial<GridOptions<TData>>\n): GridOptions<TData> {\n const explicit: Record<string, unknown> = {};\n for (const key of GRID_OPTION_KEYS) {\n if (key === \"className\") continue;\n const value = key === \"ariaLabel\"\n ? props.gridAriaLabel\n : key === \"ariaLabelledBy\"\n ? props.gridAriaLabelledBy\n : key === \"ariaDescribedBy\"\n ? props.gridAriaDescribedBy\n : props[key];\n if (value !== undefined) explicit[key] = value;\n }\n if (props.gridClassName !== undefined) explicit.className = props.gridClassName;\n return createMachTablePreset(defaults, explicit as Partial<GridOptions<TData>>);\n}\n\nexport function MachTable<TData = any>(props: MachTableReactProps<TData>) {\n const { className, style, apiRef } = props;\n const hostRef = useRef<HTMLDivElement | null>(null);\n const gridApiRef = useRef<GridApi<TData> | null>(null);\n const propsRef = useRef(props);\n propsRef.current = props;\n const defaults = useMachTableDefaults<TData>();\n const effectiveInputs = [\n defaults,\n ...GRID_OPTION_KEYS.map((key) => key === \"className\"\n ? props.gridClassName\n : key === \"ariaLabel\"\n ? props.gridAriaLabel\n : key === \"ariaLabelledBy\"\n ? props.gridAriaLabelledBy\n : key === \"ariaDescribedBy\"\n ? props.gridAriaDescribedBy\n : props[key])\n ];\n const effectiveCache = useRef<{ inputs: readonly unknown[]; options: GridOptions<TData> } | null>(null);\n if (\n !effectiveCache.current ||\n effectiveCache.current.inputs.length !== effectiveInputs.length ||\n effectiveInputs.some((value, index) => !Object.is(value, effectiveCache.current?.inputs[index]))\n ) {\n effectiveCache.current = { inputs: effectiveInputs, options: collectGridOptions(props, defaults) };\n }\n const effectiveOptions = effectiveCache.current.options;\n const effectiveRef = useRef(effectiveOptions);\n effectiveRef.current = effectiveOptions;\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n const options = { ...effectiveRef.current } as Record<string, unknown>;\n for (const eventType of EVENT_TYPES) {\n const handlerKey = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}`;\n options[handlerKey] = (event: unknown) => {\n const defaultHandler = (effectiveRef.current as Record<string, unknown>)[handlerKey];\n if (typeof defaultHandler === \"function\") (defaultHandler as (value: unknown) => void)(event);\n const latest = propsRef.current as Record<string, unknown>;\n const handler = latest[handlerKey];\n if (typeof handler === \"function\" && handler !== defaultHandler) {\n (handler as (value: unknown) => void)(event);\n }\n };\n }\n\n const api = createGrid<TData>(host, options);\n gridApiRef.current = api;\n return () => {\n api.destroy();\n gridApiRef.current = null;\n };\n }, []);\n\n useEffect(() => {\n if (!apiRef) return;\n const assigned = gridApiRef.current;\n apiRef.current = assigned;\n return () => {\n if (apiRef.current === assigned) apiRef.current = null;\n };\n }, [apiRef]);\n\n const optionValues = GRID_OPTION_KEYS.map((key) => effectiveOptions[key]);\n const previousOptionValues = useRef<readonly unknown[] | null>(null);\n useEffect(() => {\n const previous = previousOptionValues.current;\n previousOptionValues.current = optionValues;\n if (!previous) {\n return;\n }\n const changed: Record<string, unknown> = {};\n optionValues.forEach((value, index) => {\n if (Object.is(value, previous[index])) return;\n changed[GRID_OPTION_KEYS[index]] = value;\n });\n if (Object.keys(changed).length > 0) {\n gridApiRef.current?.updateOptions(changed);\n }\n }, optionValues);\n\n return createElement(\"div\", {\n ref: hostRef,\n className: `mach-react-host ${className ?? \"\"}`.trim() || undefined,\n style,\n \"aria-label\": props[\"aria-label\"],\n \"aria-labelledby\": props[\"aria-labelledby\"],\n \"aria-describedby\": props[\"aria-describedby\"]\n });\n}\n\n/** @deprecated Use MachTable. Kept as a source-compatible alias through 0.x. */\nexport const RobotGrid = MachTable;\n/** @deprecated Use MachTableReactProps. */\nexport type RobotGridReactProps<TData = any> = MachTableReactProps<TData>;\n","import { createContext, createElement, useContext, useMemo, type ReactNode } from \"react\";\nimport { createMachTablePreset, type GridOptions } from \"@agile-team/mach-table\";\n\nconst MachTableDefaultsContext = createContext<Partial<GridOptions<any>>>({});\n\nexport interface MachTableProviderProps<TData = any> {\n defaults: Partial<GridOptions<TData>>;\n children?: ReactNode;\n}\n\n/** Supplies app-, route- or layout-scoped defaults without making tables eager. */\nexport function MachTableProvider<TData = any>({ defaults, children }: MachTableProviderProps<TData>) {\n const parent = useContext(MachTableDefaultsContext);\n const value = useMemo(() => createMachTablePreset(parent, defaults), [parent, defaults]);\n return createElement(MachTableDefaultsContext.Provider, { value }, children);\n}\n\nexport function useMachTableDefaults<TData = any>(): Partial<GridOptions<TData>> {\n return useContext(MachTableDefaultsContext) as Partial<GridOptions<TData>>;\n}\n","import { useMemo, useState, type MutableRefObject } from \"react\";\nimport type { GridApi } from \"@agile-team/mach-table\";\n\nexport interface UseMachGridReturn<TData = any> {\n apiRef: MutableRefObject<GridApi<TData> | null>;\n api: GridApi<TData> | null;\n ready: boolean;\n}\n\nexport function useMachGrid<TData = any>(): UseMachGridReturn<TData> {\n const [api, setApi] = useState<GridApi<TData> | null>(null);\n const [ready, setReady] = useState(false);\n const apiRef = useMemo(() => {\n let current: GridApi<TData> | null = null;\n return Object.defineProperty({}, \"current\", {\n enumerable: true,\n get: () => current,\n set: (next: GridApi<TData> | null) => {\n if (next === current) return;\n current = next;\n setApi(next);\n setReady(false);\n if (next) {\n void next.whenReady().then(() => {\n if (current === next && !next.isDestroyed()) setReady(true);\n });\n }\n }\n }) as MutableRefObject<GridApi<TData> | null>;\n }, []);\n\n return { apiRef, api, ready };\n}\n","import { createElement, isValidElement, type ComponentType, type ReactNode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport type { CellRendererParams, CellRendererFn, DetailRowRendererParams, GridApi, RowNode } from \"@agile-team/mach-table\";\n\nexport interface ReactCellRendererProps<TData = any, TValue = any> extends CellRendererParams<TData, TValue> {\n children?: ReactNode;\n}\n\nexport interface ReactDetailProps<TData = any> {\n data: TData | null;\n node: RowNode<TData>;\n api: GridApi<TData>;\n}\n\nexport function reactCellRenderer<TData = any, TValue = any>(\n Component: ComponentType<ReactCellRendererProps<TData, TValue>>\n): CellRendererFn {\n return (params) => {\n const host = document.createElement(\"div\");\n host.className = \"mach-cell-react\";\n host.style.width = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params as ReactCellRendererProps<TData, TValue>));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function reactDetailRenderer<TData = any>(\n Component: ComponentType<ReactDetailProps<TData>>\n): (params: DetailRowRendererParams<TData>) => { el: HTMLElement; destroy?: () => void } {\n return (params) => {\n const host = document.createElement(\"div\");\n host.style.height = \"100%\";\n const root = createRoot(host);\n root.render(createElement(Component, params));\n let destroyed = false;\n return {\n el: host,\n destroy: () => {\n if (destroyed) return;\n destroyed = true;\n window.setTimeout(() => {\n root.unmount();\n }, 0);\n }\n };\n };\n}\n\nexport function isReactElement(value: unknown): boolean {\n return isValidElement(value);\n}\n","import { MachTable, RobotGrid } from \"./MachTable\";\n\nexport { MachTable, RobotGrid };\nexport type { MachTableReactProps, RobotGridReactProps } from \"./MachTable\";\nexport { useMachGrid } from \"./useMachGrid\";\nexport type { UseMachGridReturn } from \"./useMachGrid\";\nexport { MachTableProvider, useMachTableDefaults } from \"./defaults\";\nexport type { MachTableProviderProps } from \"./defaults\";\nexport { reactCellRenderer, reactDetailRenderer } from \"./adapters\";\nexport type { ReactCellRendererProps, ReactDetailProps } from \"./adapters\";\nexport * from \"@agile-team/mach-table\";\n\n/** Enables `React.lazy(() => import(\"@agile-team/mach-table-react\"))`. */\nexport default MachTable;\n"],"mappings":"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","names":["createElement","useEffect","useRef","createGrid","createMachTablePreset","GRID_OPTION_KEYS","EVENT_TYPES","createContext","createElement","useContext","useMemo","createMachTablePreset","MachTableDefaultsContext","MachTableProvider","defaults","children","parent","value","useMachTableDefaults","collectGridOptions","props","defaults","explicit","key","GRID_OPTION_KEYS","value","createMachTablePreset","MachTable","className","style","apiRef","hostRef","useRef","gridApiRef","propsRef","useMachTableDefaults","effectiveInputs","effectiveCache","index","effectiveOptions","effectiveRef","useEffect","host","options","eventType","EVENT_TYPES","handlerKey","event","defaultHandler","handler","api","createGrid","assigned","optionValues","previousOptionValues","previous","changed","createElement","RobotGrid","useMemo","useState","useMachGrid","api","setApi","ready","setReady","current","next","createElement","isValidElement","createRoot","reactCellRenderer","Component","params","host","root","destroyed","reactDetailRenderer","index_default","MachTable"]}
@@ -531,6 +531,23 @@ input.mach-select-all {
531
531
  transform: rotate(90deg);
532
532
  }
533
533
 
534
+ .mach-detail-toggle--loading {
535
+ animation: mach-tree-spin 0.8s linear infinite;
536
+ color: var(--mach-primary);
537
+ }
538
+
539
+ .mach-detail-toggle--error {
540
+ color: #dc2626;
541
+ }
542
+
543
+ @keyframes mach-tree-spin {
544
+ to { transform: rotate(360deg); }
545
+ }
546
+
547
+ @media (prefers-reduced-motion: reduce) {
548
+ .mach-detail-toggle--loading { animation: none; }
549
+ }
550
+
534
551
  .mach-cell--group {
535
552
  cursor: pointer;
536
553
  background: var(--mach-header-bg);
@@ -637,6 +654,11 @@ input.mach-select-all {
637
654
  box-shadow: 0 0 0 1px rgba(239, 68, 68, 0.35);
638
655
  }
639
656
 
657
+ .mach-editor-validating {
658
+ cursor: progress;
659
+ opacity: 0.72;
660
+ }
661
+
640
662
  .mach-footer {
641
663
  display: flex;
642
664
  flex-shrink: 0;
@@ -1025,11 +1047,33 @@ input.mach-select-all {
1025
1047
  }
1026
1048
 
1027
1049
  .mach-column-panel {
1028
- min-width: 200px;
1050
+ min-width: 220px;
1029
1051
  max-height: 70vh;
1030
1052
  overflow: auto;
1031
1053
  }
1032
1054
 
1055
+ .mach-column-panel[role="dialog"] {
1056
+ width: min(440px, calc(100vw - 16px));
1057
+ }
1058
+
1059
+ .mach-column-workbench-search {
1060
+ box-sizing: border-box;
1061
+ width: 100%;
1062
+ height: 30px;
1063
+ padding: 0 9px;
1064
+ border: 1px solid var(--mach-border-color);
1065
+ border-radius: var(--mach-radius);
1066
+ background: var(--mach-body-bg);
1067
+ color: var(--mach-body-fg);
1068
+ font: inherit;
1069
+ outline: none;
1070
+ }
1071
+
1072
+ .mach-column-workbench-search:focus {
1073
+ border-color: var(--mach-primary);
1074
+ box-shadow: 0 0 0 2px var(--mach-primary-weak);
1075
+ }
1076
+
1033
1077
  .mach-column-panel-title {
1034
1078
  font-weight: 600;
1035
1079
  color: var(--mach-header-fg);
@@ -1076,7 +1120,7 @@ input.mach-select-all {
1076
1120
  }
1077
1121
 
1078
1122
  .mach-column-panel-list {
1079
- max-height: 180px;
1123
+ max-height: 280px;
1080
1124
  overflow: auto;
1081
1125
  display: flex;
1082
1126
  flex-direction: column;
@@ -1086,6 +1130,54 @@ input.mach-select-all {
1086
1130
  padding: 4px;
1087
1131
  }
1088
1132
 
1133
+ .mach-column-workbench-item {
1134
+ display: grid;
1135
+ grid-template-columns: minmax(120px, 1fr) 108px 26px 26px;
1136
+ align-items: center;
1137
+ gap: 4px;
1138
+ min-height: 32px;
1139
+ padding: 2px 3px;
1140
+ border-radius: var(--mach-radius);
1141
+ }
1142
+
1143
+ .mach-column-workbench-item:hover {
1144
+ background: var(--mach-row-hover-bg);
1145
+ }
1146
+
1147
+ .mach-column-workbench-label {
1148
+ display: flex;
1149
+ min-width: 0;
1150
+ align-items: center;
1151
+ gap: 7px;
1152
+ cursor: pointer;
1153
+ }
1154
+
1155
+ .mach-column-workbench-name {
1156
+ overflow: hidden;
1157
+ text-overflow: ellipsis;
1158
+ white-space: nowrap;
1159
+ }
1160
+
1161
+ .mach-column-workbench-pin,
1162
+ .mach-column-workbench-move {
1163
+ height: 26px;
1164
+ border: 1px solid var(--mach-border-color);
1165
+ border-radius: var(--mach-radius);
1166
+ background: var(--mach-body-bg);
1167
+ color: inherit;
1168
+ font: inherit;
1169
+ }
1170
+
1171
+ .mach-column-workbench-move {
1172
+ padding: 0;
1173
+ cursor: pointer;
1174
+ }
1175
+
1176
+ .mach-column-workbench-move:disabled {
1177
+ cursor: not-allowed;
1178
+ opacity: 0.35;
1179
+ }
1180
+
1089
1181
  .mach-tag {
1090
1182
  display: inline-flex;
1091
1183
  align-items: center;
@@ -1177,6 +1269,18 @@ input.mach-select-all {
1177
1269
  gap: 2px;
1178
1270
  }
1179
1271
 
1272
+ .mach-sr-only {
1273
+ position: absolute !important;
1274
+ width: 1px !important;
1275
+ height: 1px !important;
1276
+ padding: 0 !important;
1277
+ margin: -1px !important;
1278
+ overflow: hidden !important;
1279
+ clip: rect(0, 0, 0, 0) !important;
1280
+ white-space: nowrap !important;
1281
+ border: 0 !important;
1282
+ }
1283
+
1180
1284
  .mach-action-btn {
1181
1285
  display: inline-flex;
1182
1286
  align-items: center;
@@ -1203,6 +1307,50 @@ input.mach-select-all {
1203
1307
  color: var(--mach-danger);
1204
1308
  }
1205
1309
 
1310
+ .mach-action-btn--primary {
1311
+ color: var(--mach-primary);
1312
+ }
1313
+
1314
+ .mach-action-btn--warning {
1315
+ color: var(--mach-warning);
1316
+ }
1317
+
1318
+ .mach-action-btn--success,
1319
+ .mach-edit-control--confirm {
1320
+ color: var(--mach-success);
1321
+ }
1322
+
1323
+ .mach-action-btn--danger {
1324
+ color: var(--mach-danger);
1325
+ }
1326
+
1327
+ .mach-action-btn:focus-visible,
1328
+ .mach-edit-control:focus-visible,
1329
+ .mach-cell-edit-trigger:focus-visible,
1330
+ .mach-action-drawer__close:focus-visible {
1331
+ outline: 2px solid color-mix(in srgb, var(--mach-primary) 65%, transparent);
1332
+ outline-offset: 1px;
1333
+ }
1334
+
1335
+ .mach-action-btn:disabled {
1336
+ cursor: not-allowed;
1337
+ opacity: 0.4;
1338
+ }
1339
+
1340
+ .mach-action-btn--loading svg {
1341
+ animation: mach-spin 0.8s linear infinite;
1342
+ }
1343
+
1344
+ .mach-dictionary-value--loading {
1345
+ color: var(--mach-header-fg);
1346
+ opacity: 0.72;
1347
+ }
1348
+
1349
+ .mach-dictionary-value--error {
1350
+ text-decoration: underline dotted;
1351
+ text-underline-offset: 3px;
1352
+ }
1353
+
1206
1354
  .mach-action-btn--icon {
1207
1355
  padding: 0;
1208
1356
  width: 24px;
@@ -1210,7 +1358,262 @@ input.mach-select-all {
1210
1358
 
1211
1359
  .mach-context-menu-item--danger {
1212
1360
  color: var(--mach-danger);
1213
- }
1361
+ }
1362
+
1363
+ .mach-context-menu-item,
1364
+ .mach-action-drawer__item {
1365
+ display: flex;
1366
+ align-items: center;
1367
+ gap: 9px;
1368
+ }
1369
+
1370
+ .mach-context-menu-item--primary,
1371
+ .mach-action-drawer__item--primary {
1372
+ color: var(--mach-primary);
1373
+ }
1374
+
1375
+ .mach-context-menu-item--warning,
1376
+ .mach-action-drawer__item--warning {
1377
+ color: var(--mach-warning);
1378
+ }
1379
+
1380
+ .mach-context-menu-item--success,
1381
+ .mach-action-drawer__item--success {
1382
+ color: var(--mach-success);
1383
+ }
1384
+
1385
+ .mach-context-menu-item--danger,
1386
+ .mach-action-drawer__item--danger {
1387
+ color: var(--mach-danger);
1388
+ }
1389
+
1390
+ .mach-action-drawer-backdrop {
1391
+ position: fixed;
1392
+ inset: 0;
1393
+ z-index: calc(var(--mach-z-menu) + 2);
1394
+ background: rgba(15, 23, 42, 0.2);
1395
+ backdrop-filter: blur(1px);
1396
+ }
1397
+
1398
+ .mach-action-drawer {
1399
+ position: absolute;
1400
+ top: 0;
1401
+ right: 0;
1402
+ display: flex;
1403
+ flex-direction: column;
1404
+ width: min(340px, calc(100vw - 24px));
1405
+ height: 100%;
1406
+ background: var(--mach-body-bg);
1407
+ color: var(--mach-body-fg);
1408
+ border-left: 1px solid var(--mach-border-color);
1409
+ box-shadow: -16px 0 40px rgba(15, 23, 42, 0.14);
1410
+ font-family: var(--mach-font-family);
1411
+ animation: mach-drawer-in 0.18s ease-out;
1412
+ }
1413
+
1414
+ .mach-action-drawer__header {
1415
+ display: flex;
1416
+ align-items: center;
1417
+ justify-content: space-between;
1418
+ min-height: 56px;
1419
+ padding: 0 16px 0 20px;
1420
+ border-bottom: 1px solid var(--mach-border-color);
1421
+ }
1422
+
1423
+ .mach-action-drawer__close {
1424
+ display: inline-flex;
1425
+ align-items: center;
1426
+ justify-content: center;
1427
+ width: 30px;
1428
+ height: 30px;
1429
+ padding: 0;
1430
+ border: 0;
1431
+ border-radius: var(--mach-radius);
1432
+ background: transparent;
1433
+ color: var(--mach-header-fg);
1434
+ cursor: pointer;
1435
+ }
1436
+
1437
+ .mach-action-drawer__close:hover {
1438
+ color: var(--mach-primary);
1439
+ background: var(--mach-row-hover-bg);
1440
+ }
1441
+
1442
+ .mach-action-drawer__body {
1443
+ display: flex;
1444
+ flex-direction: column;
1445
+ gap: 4px;
1446
+ padding: 12px;
1447
+ overflow: auto;
1448
+ }
1449
+
1450
+ .mach-action-drawer__item {
1451
+ width: 100%;
1452
+ min-height: 40px;
1453
+ padding: 0 12px;
1454
+ border: 0;
1455
+ border-radius: var(--mach-radius);
1456
+ background: transparent;
1457
+ font: inherit;
1458
+ text-align: left;
1459
+ cursor: pointer;
1460
+ }
1461
+
1462
+ .mach-action-drawer__item:hover:not(:disabled) {
1463
+ background: var(--mach-row-hover-bg);
1464
+ }
1465
+
1466
+ .mach-action-drawer__item:disabled {
1467
+ opacity: 0.4;
1468
+ cursor: not-allowed;
1469
+ }
1470
+
1471
+ @keyframes mach-drawer-in {
1472
+ from { transform: translateX(18px); opacity: 0; }
1473
+ to { transform: translateX(0); opacity: 1; }
1474
+ }
1475
+
1476
+ @media (max-width: 640px) {
1477
+ .mach-action-drawer {
1478
+ top: auto;
1479
+ bottom: 0;
1480
+ width: 100%;
1481
+ height: auto;
1482
+ max-height: min(70vh, 520px);
1483
+ border-top: 1px solid var(--mach-border-color);
1484
+ border-left: 0;
1485
+ border-radius: var(--mach-radius-lg) var(--mach-radius-lg) 0 0;
1486
+ animation-name: mach-drawer-up;
1487
+ }
1488
+ }
1489
+
1490
+ @keyframes mach-drawer-up {
1491
+ from { transform: translateY(18px); opacity: 0; }
1492
+ to { transform: translateY(0); opacity: 1; }
1493
+ }
1494
+
1495
+ .mach-cell:has(.mach-cell-edit-trigger) {
1496
+ padding-right: 29px;
1497
+ }
1498
+
1499
+ .mach-cell-edit-trigger {
1500
+ position: absolute;
1501
+ right: 5px;
1502
+ top: 50%;
1503
+ display: inline-flex;
1504
+ align-items: center;
1505
+ justify-content: center;
1506
+ width: 20px;
1507
+ height: 20px;
1508
+ padding: 0;
1509
+ transform: translateY(-50%);
1510
+ border: 0;
1511
+ border-radius: var(--mach-radius-sm);
1512
+ background: transparent;
1513
+ color: var(--mach-header-fg);
1514
+ cursor: pointer;
1515
+ opacity: 0;
1516
+ transition: opacity var(--mach-transition), color var(--mach-transition), background-color var(--mach-transition);
1517
+ }
1518
+
1519
+ .mach-cell-edit-trigger svg {
1520
+ width: 13px;
1521
+ height: 13px;
1522
+ }
1523
+
1524
+ .mach-cell:hover .mach-cell-edit-trigger--hover,
1525
+ .mach-cell:focus-within .mach-cell-edit-trigger--hover,
1526
+ .mach-cell-edit-trigger--always {
1527
+ opacity: 0.72;
1528
+ }
1529
+
1530
+ .mach-cell-edit-trigger:hover {
1531
+ opacity: 1;
1532
+ color: var(--mach-primary);
1533
+ background: color-mix(in srgb, var(--mach-primary) 9%, transparent);
1534
+ }
1535
+
1536
+ .mach-cell--editing {
1537
+ overflow: visible;
1538
+ z-index: 4;
1539
+ }
1540
+
1541
+ .mach-cell-editor-shell,
1542
+ .mach-row-editor-shell {
1543
+ display: flex;
1544
+ align-items: center;
1545
+ width: 100%;
1546
+ min-width: 0;
1547
+ gap: 5px;
1548
+ }
1549
+
1550
+ .mach-cell-editor-shell > .mach-editor-input,
1551
+ .mach-cell-editor-shell > .mach-editor-select,
1552
+ .mach-cell-editor-shell > :not(.mach-cell-editor-controls),
1553
+ .mach-row-editor-shell > * {
1554
+ flex: 1 1 auto;
1555
+ min-width: 0;
1556
+ }
1557
+
1558
+ .mach-cell-editor-controls {
1559
+ display: inline-flex;
1560
+ flex: 0 0 auto;
1561
+ align-items: center;
1562
+ padding: 2px;
1563
+ border: 1px solid var(--mach-border-color);
1564
+ border-radius: var(--mach-radius);
1565
+ background: var(--mach-body-bg);
1566
+ box-shadow: var(--mach-shadow-sm);
1567
+ }
1568
+
1569
+ .mach-edit-control {
1570
+ display: inline-flex;
1571
+ align-items: center;
1572
+ justify-content: center;
1573
+ width: 23px;
1574
+ height: 23px;
1575
+ padding: 0;
1576
+ border: 0;
1577
+ border-radius: var(--mach-radius-sm);
1578
+ background: transparent;
1579
+ color: var(--mach-header-fg);
1580
+ cursor: pointer;
1581
+ }
1582
+
1583
+ .mach-edit-control svg {
1584
+ width: 14px;
1585
+ height: 14px;
1586
+ }
1587
+
1588
+ .mach-edit-control--confirm {
1589
+ color: var(--mach-primary);
1590
+ }
1591
+
1592
+ .mach-edit-control:hover {
1593
+ background: var(--mach-row-hover-bg);
1594
+ }
1595
+
1596
+ .mach-edit-control:disabled {
1597
+ opacity: 0.35;
1598
+ cursor: wait;
1599
+ }
1600
+
1601
+ .mach-row--editing,
1602
+ .mach-row--editing .mach-cell {
1603
+ background: color-mix(in srgb, var(--mach-primary) 3%, var(--mach-body-bg));
1604
+ }
1605
+
1606
+ .mach-cell--row-editing .mach-editor-input,
1607
+ .mach-cell--row-editing .mach-editor-select {
1608
+ border-color: color-mix(in srgb, var(--mach-primary) 45%, var(--mach-border-color));
1609
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
1610
+ }
1611
+
1612
+ .mach-cell--row-editing .mach-editor-input:focus,
1613
+ .mach-cell--row-editing .mach-editor-select:focus {
1614
+ border-color: var(--mach-primary);
1615
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--mach-primary) 12%, transparent);
1616
+ }
1214
1617
 
1215
1618
  .mach-tooltip {
1216
1619
  position: fixed;
@@ -1381,4 +1784,8 @@ input.mach-select-all {
1381
1784
  animation-iteration-count: 1 !important;
1382
1785
  transition-duration: 0.01ms !important;
1383
1786
  }
1787
+
1788
+ .mach-action-drawer {
1789
+ animation: none !important;
1790
+ }
1384
1791
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agile-team/mach-table-react",
3
- "version": "0.5.0",
3
+ "version": "0.13.0",
4
4
  "description": "Official React 18+ adapter for the MachTable enterprise data grid",
5
5
  "keywords": [
6
6
  "react",
@@ -9,8 +9,8 @@
9
9
  "typescript",
10
10
  "virtualization"
11
11
  ],
12
- "author": "Agile Team",
13
- "license": "MIT",
12
+ "author": "ChenyCHENYU (Agile Team)",
13
+ "license": "SEE LICENSE IN LICENSE",
14
14
  "homepage": "https://github.com/ChenyCHENYU/MachTable#readme",
15
15
  "bugs": {
16
16
  "url": "https://github.com/ChenyCHENYU/MachTable/issues"
@@ -57,7 +57,7 @@
57
57
  "**/*.css"
58
58
  ],
59
59
  "dependencies": {
60
- "@agile-team/mach-table": "0.5.0"
60
+ "@agile-team/mach-table": "0.13.0"
61
61
  },
62
62
  "peerDependencies": {
63
63
  "react": ">=18.0.0",