@ornery/ui-grid-react 0.1.7 → 0.1.8

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/demo/demo.css ADDED
@@ -0,0 +1,122 @@
1
+ .react-demo-shell {
2
+ display: grid;
3
+ gap: 1rem;
4
+ color: var(--ui-grid-cell-color);
5
+ }
6
+
7
+ .react-demo-shell__header {
8
+ display: grid;
9
+ gap: 1rem;
10
+ }
11
+
12
+ .react-demo-shell__header h2,
13
+ .react-demo-shell__header p,
14
+ .react-demo-shell__toolbar p {
15
+ margin: 0;
16
+ }
17
+
18
+ .react-demo-shell__eyebrow {
19
+ margin: 0 0 0.35rem;
20
+ font-size: 0.75rem;
21
+ letter-spacing: 0.12em;
22
+ text-transform: uppercase;
23
+ color: var(--ui-grid-accent);
24
+ }
25
+
26
+ .react-demo-shell__header p,
27
+ .react-demo-shell__metrics span,
28
+ .react-demo-shell__toolbar p,
29
+ .react-demo-shell__stats small {
30
+ color: var(--ui-grid-muted-color);
31
+ }
32
+
33
+ .react-demo-shell__actions {
34
+ display: flex;
35
+ flex-wrap: wrap;
36
+ gap: 0.75rem;
37
+ align-items: center;
38
+ }
39
+
40
+ .react-demo-shell__button {
41
+ display: inline-flex;
42
+ align-items: center;
43
+ justify-content: center;
44
+ border-radius: 999px;
45
+ padding: 0.7rem 1.1rem;
46
+ font: inherit;
47
+ font-weight: 800;
48
+ cursor: pointer;
49
+ border: 1px solid color-mix(in srgb, var(--ui-grid-accent) 40%, transparent);
50
+ background: linear-gradient(
51
+ 135deg,
52
+ color-mix(in srgb, var(--ui-grid-accent) 86%, black),
53
+ color-mix(in srgb, var(--ui-grid-accent) 66%, black)
54
+ );
55
+ color: white;
56
+ box-shadow: 0 12px 24px rgba(15, 23, 42, 0.14);
57
+ }
58
+
59
+ .react-demo-shell__button-secondary {
60
+ background: var(--ui-grid-surface);
61
+ color: var(--ui-grid-cell-color);
62
+ border-color: var(--ui-grid-border-color);
63
+ box-shadow: none;
64
+ }
65
+
66
+ .react-demo-shell__stats,
67
+ .react-demo-shell__metrics article,
68
+ .react-demo-shell__toolbar {
69
+ border: 1px solid var(--ui-grid-border-color);
70
+ border-radius: var(--ui-grid-radius);
71
+ background: var(--ui-grid-surface);
72
+ }
73
+
74
+ .react-demo-shell__stats {
75
+ display: inline-grid;
76
+ min-width: 7rem;
77
+ padding: 0.8rem 1rem;
78
+ }
79
+
80
+ .react-demo-shell__stats span {
81
+ font-size: 1.8rem;
82
+ font-weight: 800;
83
+ line-height: 1;
84
+ }
85
+
86
+ .react-demo-shell__metrics {
87
+ display: grid;
88
+ gap: 0.85rem;
89
+ grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
90
+ }
91
+
92
+ .react-demo-shell__metrics article {
93
+ display: grid;
94
+ gap: 0.2rem;
95
+ padding: 0.9rem 1rem;
96
+ }
97
+
98
+ .react-demo-shell__metrics strong {
99
+ font-size: 1.45rem;
100
+ line-height: 1.1;
101
+ }
102
+
103
+ .react-demo-shell__toolbar {
104
+ display: grid;
105
+ gap: 0.5rem;
106
+ padding: 0.9rem 1rem;
107
+ }
108
+
109
+ .react-demo-shell__toolbar strong {
110
+ margin-right: 0.4rem;
111
+ }
112
+
113
+ @media (max-width: 720px) {
114
+ .react-demo-shell__actions {
115
+ align-items: stretch;
116
+ }
117
+
118
+ .react-demo-shell__button,
119
+ .react-demo-shell__button-secondary {
120
+ width: 100%;
121
+ }
122
+ }
package/demo/main.tsx CHANGED
@@ -1,9 +1,10 @@
1
- import React, { useState, useMemo } from 'react';
1
+ import React, { useEffect, useMemo, useState } from 'react';
2
2
  import { createRoot } from 'react-dom/client';
3
3
  import { UiGrid } from '../src/index';
4
- import type { GridOptions, UiGridApi } from '../src/index';
4
+ import type { GridBenchmarkResult, GridOptions, UiGridApi } from '../src/index';
5
5
  import { FILTER_CONDITIONS } from '@ornery/ui-grid-core';
6
6
  import '../src/ui-grid.css';
7
+ import './demo.css';
7
8
 
8
9
  const statuses = ['Active', 'Expansion', 'Enterprise', 'Pilot'] as const;
9
10
  const companies = ['Northwind', 'Blue Harbor', 'Forge Group', 'Larkspur', 'Atlas'] as const;
@@ -29,6 +30,8 @@ const currencyFormat = new Intl.NumberFormat('en-US', {
29
30
 
30
31
  function App() {
31
32
  const [gridApi, setGridApi] = useState<UiGridApi | null>(null);
33
+ const [visibleRowCount, setVisibleRowCount] = useState(0);
34
+ const [benchmarkResult, setBenchmarkResult] = useState<GridBenchmarkResult | null>(null);
32
35
  const data = useMemo(() => createDemoData(), []);
33
36
 
34
37
  const options = useMemo<GridOptions>(
@@ -46,6 +49,7 @@ function App() {
46
49
  enableCellEditOnFocus: true,
47
50
  virtualizationThreshold: 25,
48
51
  grouping: { groupBy: ['status'] },
52
+ benchmark: { iterations: 40 },
49
53
  rowIdentity: (row) => String(row['id']),
50
54
  onRegisterApi: (api) => setGridApi(api as UiGridApi),
51
55
  columnDefs: [
@@ -89,7 +93,89 @@ function App() {
89
93
  [data],
90
94
  );
91
95
 
92
- return <UiGrid options={options} onRegisterApi={options.onRegisterApi} />;
96
+ useEffect(() => {
97
+ if (!gridApi) {
98
+ return;
99
+ }
100
+
101
+ setVisibleRowCount(gridApi.core.getVisibleRows().length);
102
+
103
+ const disposeVisibleRows = gridApi.core.on.rowsVisibleChanged((rows) => {
104
+ setVisibleRowCount(rows.length);
105
+ });
106
+ const disposeBenchmark = gridApi.core.on.benchmarkComplete((result) => {
107
+ setBenchmarkResult(result);
108
+ });
109
+
110
+ return () => {
111
+ disposeVisibleRows();
112
+ disposeBenchmark();
113
+ };
114
+ }, [gridApi]);
115
+
116
+ return (
117
+ <section className="react-demo-shell">
118
+ <header className="react-demo-shell__header">
119
+ <div>
120
+ <p className="react-demo-shell__eyebrow">React package demo</p>
121
+ <h2>{options.title ?? 'UI Grid'}</h2>
122
+ <p>
123
+ Familiar <code>gridOptions</code> and <code>onRegisterApi</code>, rebuilt with React
124
+ hooks, virtualization, grouping, sorting, filtering, and column ordering.
125
+ </p>
126
+ </div>
127
+
128
+ <div className="react-demo-shell__actions">
129
+ <button
130
+ type="button"
131
+ className="react-demo-shell__button"
132
+ onClick={() => gridApi?.core.benchmark()}
133
+ >
134
+ Benchmark
135
+ </button>
136
+ <button
137
+ type="button"
138
+ className="react-demo-shell__button react-demo-shell__button-secondary"
139
+ onClick={() => gridApi?.core.exportCsv()}
140
+ >
141
+ Export CSV
142
+ </button>
143
+ <div className="react-demo-shell__stats">
144
+ <span>{visibleRowCount}</span>
145
+ <small>visible rows</small>
146
+ </div>
147
+ </div>
148
+ </header>
149
+
150
+ <section className="react-demo-shell__metrics" aria-label="React grid metrics">
151
+ <article>
152
+ <strong>{options.enableVirtualization ? 'On' : 'Off'}</strong>
153
+ <span>virtualization</span>
154
+ </article>
155
+ <article>
156
+ <strong>{options.grouping?.groupBy?.length ?? 0}</strong>
157
+ <span>group columns</span>
158
+ </article>
159
+ <article>
160
+ <strong>{benchmarkResult?.averageMs?.toFixed(2) || '—'}</strong>
161
+ <span>benchmark avg</span>
162
+ </article>
163
+ </section>
164
+
165
+ <div className="react-demo-shell__toolbar">
166
+ <div>
167
+ <strong>{visibleRowCount}</strong>
168
+ <span>of {data.length} rows</span>
169
+ </div>
170
+ <p>
171
+ <code>gridOptions</code> compatibility layer: sorting, filtering, grouping, column moving,
172
+ templating, and virtualized rendering.
173
+ </p>
174
+ </div>
175
+
176
+ <UiGrid options={options} onRegisterApi={options.onRegisterApi} />
177
+ </section>
178
+ );
93
179
  }
94
180
 
95
181
  createRoot(document.getElementById('root')!).render(<App />);
package/dist/UiGrid.d.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  import React from 'react';
2
- import type { GridOptions, GridCellTemplateContext, GridExpandableTemplateContext, UiGridApi } from '@ornery/ui-grid-core';
2
+ import type { GridOptions, GridCellTemplateContext, GridExpandableTemplateContext, GridHeaderTemplateContext, UiGridApi } from '@ornery/ui-grid-core';
3
3
  export interface UiGridProps {
4
4
  options: GridOptions;
5
5
  onRegisterApi?: (api: UiGridApi) => void;
6
6
  cellRenderer?: (context: GridCellTemplateContext) => React.ReactNode;
7
+ headerRenderer?: (context: GridHeaderTemplateContext) => React.ReactNode;
7
8
  expandableRenderer?: (context: GridExpandableTemplateContext) => React.ReactNode;
8
9
  className?: string;
9
10
  }
10
- export declare function UiGrid({ options, onRegisterApi, cellRenderer, expandableRenderer, className, }: UiGridProps): import("react/jsx-runtime").JSX.Element;
11
+ export declare function UiGrid({ options, onRegisterApi, cellRenderer, headerRenderer, expandableRenderer, className, }: UiGridProps): import("react/jsx-runtime").JSX.Element;
11
12
  //# sourceMappingURL=UiGrid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UiGrid.d.ts","sourceRoot":"","sources":["../src/UiGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,6BAA6B,EAC7B,SAAS,EAGV,MAAM,sBAAsB,CAAC;AAK9B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,6BAA6B,KAAK,KAAK,CAAC,SAAS,CAAC;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,SAAS,GACV,EAAE,WAAW,2CAsxBb"}
1
+ {"version":3,"file":"UiGrid.d.ts","sourceRoot":"","sources":["../src/UiGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,6BAA6B,EAC7B,yBAAyB,EACzB,SAAS,EAGV,MAAM,sBAAsB,CAAC;AAK9B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,IAAI,CAAC;IACzC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,KAAK,CAAC,SAAS,CAAC;IACzE,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,6BAA6B,KAAK,KAAK,CAAC,SAAS,CAAC;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAO,EACP,aAAa,EACb,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,SAAS,GACV,EAAE,WAAW,2CA+rBb"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { UiGrid } from './UiGrid';
2
2
  export type { UiGridProps } from './UiGrid';
3
- export { mountUiGrid } from './mountUiGrid';
3
+ export { mountUiGrid, updateUiGrid, styledCell } from './mountUiGrid';
4
4
  export { mountUiGridCustomElement, type MountUiGridCustomElementOptions, type MountedUiGridCustomElement, } from './vanillaAdapter';
5
5
  export { useGridState } from './useGridState';
6
6
  export type { UseGridStateResult } from './useGridState';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACL,wBAAwB,EACxB,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,GAChC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,2BAA2B,EAC3B,uCAAuC,GACxC,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,WAAW,EACX,aAAa,EACb,OAAO,EACP,UAAU,EACV,UAAU,EACV,uBAAuB,EACvB,6BAA6B,EAC7B,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,SAAS,GACV,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EACL,wBAAwB,EACxB,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,GAChC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,2BAA2B,EAC3B,uCAAuC,GACxC,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,WAAW,EACX,aAAa,EACb,OAAO,EACP,UAAU,EACV,UAAU,EACV,uBAAuB,EACvB,6BAA6B,EAC7B,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,SAAS,GACV,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}