@pyreon/table 0.0.1

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/lib/index.js ADDED
@@ -0,0 +1,94 @@
1
+ import { createTable } from "@tanstack/table-core";
2
+ import { onUnmount } from "@pyreon/core";
3
+ import { batch, computed, effect, signal } from "@pyreon/reactivity";
4
+
5
+ export * from "@tanstack/table-core"
6
+
7
+ //#region src/use-table.ts
8
+ /**
9
+ * Create a reactive TanStack Table instance. Returns a read-only signal
10
+ * that holds the Table instance — read it in effects or templates to
11
+ * track state changes.
12
+ *
13
+ * Options are passed as a function so reactive signals (e.g. data, columns)
14
+ * can be read inside, and the table updates automatically when they change.
15
+ *
16
+ * @example
17
+ * const data = signal([{ name: "Alice" }, { name: "Bob" }])
18
+ * const table = useTable(() => ({
19
+ * data: data(),
20
+ * columns: [{ accessorKey: "name", header: "Name" }],
21
+ * getCoreRowModel: getCoreRowModel(),
22
+ * }))
23
+ * // In template: () => table().getRowModel().rows
24
+ */
25
+ function useTable(options) {
26
+ const tableState = signal({});
27
+ const version = signal(0);
28
+ const table = createTable({
29
+ state: {},
30
+ onStateChange() {},
31
+ renderFallbackValue: null,
32
+ ...options()
33
+ });
34
+ tableState.set(table.initialState);
35
+ const tableSig = computed(() => {
36
+ version();
37
+ return table;
38
+ });
39
+ const cleanup = effect(() => {
40
+ const userOpts = options();
41
+ const currentState = tableState();
42
+ let stateChanged = false;
43
+ table.setOptions((prev) => ({
44
+ ...prev,
45
+ ...userOpts,
46
+ state: {
47
+ ...currentState,
48
+ ...userOpts.state
49
+ },
50
+ onStateChange: (updater) => {
51
+ const newState = typeof updater === "function" ? updater(tableState.peek()) : updater;
52
+ stateChanged = true;
53
+ batch(() => {
54
+ tableState.set(newState);
55
+ version.update((n) => n + 1);
56
+ });
57
+ userOpts.onStateChange?.(updater);
58
+ }
59
+ }));
60
+ if (!stateChanged) version.update((n) => n + 1);
61
+ });
62
+ onUnmount(() => cleanup.dispose());
63
+ return tableSig;
64
+ }
65
+
66
+ //#endregion
67
+ //#region src/flex-render.ts
68
+ /**
69
+ * Check whether a value is a Pyreon VNode (has type, props, children, key).
70
+ */
71
+ function isVNode(value) {
72
+ return value != null && typeof value === "object" && !Array.isArray(value) && "type" in value && "props" in value && "children" in value;
73
+ }
74
+ /**
75
+ * Renders a TanStack Table column def template (header, cell, footer).
76
+ * Handles strings, numbers, functions (components/render fns), and VNodes.
77
+ *
78
+ * @example
79
+ * // In a header:
80
+ * flexRender(header.column.columnDef.header, header.getContext())
81
+ * // In a cell:
82
+ * flexRender(cell.column.columnDef.cell, cell.getContext())
83
+ */
84
+ function flexRender(component, props) {
85
+ if (component == null) return null;
86
+ if (typeof component === "string" || typeof component === "number") return component;
87
+ if (typeof component === "function") return component(props);
88
+ if (isVNode(component)) return component;
89
+ return null;
90
+ }
91
+
92
+ //#endregion
93
+ export { flexRender, useTable };
94
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/use-table.ts","../src/flex-render.ts"],"sourcesContent":["import { onUnmount } from '@pyreon/core'\nimport { signal, computed, effect, batch } from '@pyreon/reactivity'\nimport type { Computed } from '@pyreon/reactivity'\nimport {\n createTable,\n type RowData,\n type TableOptions,\n type TableOptionsResolved,\n type TableState,\n type Table,\n type Updater,\n} from '@tanstack/table-core'\n\nexport type UseTableOptions<TData extends RowData> = () => TableOptions<TData>\n\n/**\n * Create a reactive TanStack Table instance. Returns a read-only signal\n * that holds the Table instance — read it in effects or templates to\n * track state changes.\n *\n * Options are passed as a function so reactive signals (e.g. data, columns)\n * can be read inside, and the table updates automatically when they change.\n *\n * @example\n * const data = signal([{ name: \"Alice\" }, { name: \"Bob\" }])\n * const table = useTable(() => ({\n * data: data(),\n * columns: [{ accessorKey: \"name\", header: \"Name\" }],\n * getCoreRowModel: getCoreRowModel(),\n * }))\n * // In template: () => table().getRowModel().rows\n */\nexport function useTable<TData extends RowData>(\n options: UseTableOptions<TData>,\n): Computed<Table<TData>> {\n // Internal state managed by the adapter — merged with user-provided state.\n const tableState = signal<TableState>({} as TableState)\n\n // Version counter — Pyreon signals use Object.is for equality, so\n // setting the same table reference is a no-op. We bump a version\n // counter to force the computed to re-evaluate and notify consumers.\n const version = signal(0)\n\n // Resolve user options with adapter-required defaults.\n const resolvedOptions: TableOptionsResolved<TData> = {\n state: {},\n onStateChange() {\n /* default noop */\n },\n renderFallbackValue: null,\n ...options(),\n }\n\n // Create the table instance once.\n const table = createTable(resolvedOptions)\n\n // Initialize internal state from the table's initial state.\n tableState.set(table.initialState)\n\n // The signal that consumers read — depends on `version` so it\n // re-notifies whenever we bump the version after a state/option change.\n const tableSig = computed(() => {\n version()\n return table\n })\n\n // Sync options reactively: when signals inside options() change, or when\n // internal state changes, update the table and notify consumers.\n const cleanup = effect(() => {\n const userOpts = options()\n const currentState = tableState()\n let stateChanged = false\n\n table.setOptions((prev) => ({\n ...prev,\n ...userOpts,\n state: {\n ...currentState,\n ...userOpts.state,\n },\n onStateChange: (updater: Updater<TableState>) => {\n const newState =\n typeof updater === 'function' ? updater(tableState.peek()) : updater\n\n stateChanged = true\n batch(() => {\n tableState.set(newState)\n version.update((n) => n + 1)\n })\n\n userOpts.onStateChange?.(updater)\n },\n }))\n\n // Only bump if setOptions didn't already trigger a state change\n if (!stateChanged) {\n version.update((n) => n + 1)\n }\n })\n\n // Clean up the effect when the component unmounts.\n onUnmount(() => cleanup.dispose())\n\n return tableSig\n}\n","import type { RowData } from '@tanstack/table-core'\n\n/**\n * Check whether a value is a Pyreon VNode (has type, props, children, key).\n */\nfunction isVNode(value: unknown): boolean {\n return (\n value != null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n 'type' in (value as Record<string, unknown>) &&\n 'props' in (value as Record<string, unknown>) &&\n 'children' in (value as Record<string, unknown>)\n )\n}\n\n/**\n * Renders a TanStack Table column def template (header, cell, footer).\n * Handles strings, numbers, functions (components/render fns), and VNodes.\n *\n * @example\n * // In a header:\n * flexRender(header.column.columnDef.header, header.getContext())\n * // In a cell:\n * flexRender(cell.column.columnDef.cell, cell.getContext())\n */\nexport function flexRender<_TData extends RowData, TValue>(\n component:\n | ((p: TValue) => unknown)\n | string\n | number\n | undefined\n | null\n | unknown,\n props: TValue,\n): unknown {\n if (component == null) return null\n if (typeof component === 'string' || typeof component === 'number')\n return component\n if (typeof component === 'function')\n return (component as (p: TValue) => unknown)(props)\n // Pass through VNodes and other objects as-is (the renderer handles them)\n if (isVNode(component)) return component\n return null\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,SACd,SACwB;CAExB,MAAM,aAAa,OAAmB,EAAE,CAAe;CAKvD,MAAM,UAAU,OAAO,EAAE;CAazB,MAAM,QAAQ,YAVuC;EACnD,OAAO,EAAE;EACT,gBAAgB;EAGhB,qBAAqB;EACrB,GAAG,SAAS;EACb,CAGyC;AAG1C,YAAW,IAAI,MAAM,aAAa;CAIlC,MAAM,WAAW,eAAe;AAC9B,WAAS;AACT,SAAO;GACP;CAIF,MAAM,UAAU,aAAa;EAC3B,MAAM,WAAW,SAAS;EAC1B,MAAM,eAAe,YAAY;EACjC,IAAI,eAAe;AAEnB,QAAM,YAAY,UAAU;GAC1B,GAAG;GACH,GAAG;GACH,OAAO;IACL,GAAG;IACH,GAAG,SAAS;IACb;GACD,gBAAgB,YAAiC;IAC/C,MAAM,WACJ,OAAO,YAAY,aAAa,QAAQ,WAAW,MAAM,CAAC,GAAG;AAE/D,mBAAe;AACf,gBAAY;AACV,gBAAW,IAAI,SAAS;AACxB,aAAQ,QAAQ,MAAM,IAAI,EAAE;MAC5B;AAEF,aAAS,gBAAgB,QAAQ;;GAEpC,EAAE;AAGH,MAAI,CAAC,aACH,SAAQ,QAAQ,MAAM,IAAI,EAAE;GAE9B;AAGF,iBAAgB,QAAQ,SAAS,CAAC;AAElC,QAAO;;;;;;;;AClGT,SAAS,QAAQ,OAAyB;AACxC,QACE,SAAS,QACT,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,MAAM,IACrB,UAAW,SACX,WAAY,SACZ,cAAe;;;;;;;;;;;;AAcnB,SAAgB,WACd,WAOA,OACS;AACT,KAAI,aAAa,KAAM,QAAO;AAC9B,KAAI,OAAO,cAAc,YAAY,OAAO,cAAc,SACxD,QAAO;AACT,KAAI,OAAO,cAAc,WACvB,QAAQ,UAAqC,MAAM;AAErD,KAAI,QAAQ,UAAU,CAAE,QAAO;AAC/B,QAAO"}
@@ -0,0 +1,93 @@
1
+ import { createTable } from "@tanstack/table-core";
2
+ import { onUnmount } from "@pyreon/core";
3
+ import { batch, computed, effect, signal } from "@pyreon/reactivity";
4
+ export * from "@tanstack/table-core";
5
+
6
+ //#region src/use-table.ts
7
+ /**
8
+ * Create a reactive TanStack Table instance. Returns a read-only signal
9
+ * that holds the Table instance — read it in effects or templates to
10
+ * track state changes.
11
+ *
12
+ * Options are passed as a function so reactive signals (e.g. data, columns)
13
+ * can be read inside, and the table updates automatically when they change.
14
+ *
15
+ * @example
16
+ * const data = signal([{ name: "Alice" }, { name: "Bob" }])
17
+ * const table = useTable(() => ({
18
+ * data: data(),
19
+ * columns: [{ accessorKey: "name", header: "Name" }],
20
+ * getCoreRowModel: getCoreRowModel(),
21
+ * }))
22
+ * // In template: () => table().getRowModel().rows
23
+ */
24
+ function useTable(options) {
25
+ const tableState = signal({});
26
+ const version = signal(0);
27
+ const table = createTable({
28
+ state: {},
29
+ onStateChange() {},
30
+ renderFallbackValue: null,
31
+ ...options()
32
+ });
33
+ tableState.set(table.initialState);
34
+ const tableSig = computed(() => {
35
+ version();
36
+ return table;
37
+ });
38
+ const cleanup = effect(() => {
39
+ const userOpts = options();
40
+ const currentState = tableState();
41
+ let stateChanged = false;
42
+ table.setOptions(prev => ({
43
+ ...prev,
44
+ ...userOpts,
45
+ state: {
46
+ ...currentState,
47
+ ...userOpts.state
48
+ },
49
+ onStateChange: updater => {
50
+ const newState = typeof updater === "function" ? updater(tableState.peek()) : updater;
51
+ stateChanged = true;
52
+ batch(() => {
53
+ tableState.set(newState);
54
+ version.update(n => n + 1);
55
+ });
56
+ userOpts.onStateChange?.(updater);
57
+ }
58
+ }));
59
+ if (!stateChanged) version.update(n => n + 1);
60
+ });
61
+ onUnmount(() => cleanup.dispose());
62
+ return tableSig;
63
+ }
64
+
65
+ //#endregion
66
+ //#region src/flex-render.ts
67
+ /**
68
+ * Check whether a value is a Pyreon VNode (has type, props, children, key).
69
+ */
70
+ function isVNode(value) {
71
+ return value != null && typeof value === "object" && !Array.isArray(value) && "type" in value && "props" in value && "children" in value;
72
+ }
73
+ /**
74
+ * Renders a TanStack Table column def template (header, cell, footer).
75
+ * Handles strings, numbers, functions (components/render fns), and VNodes.
76
+ *
77
+ * @example
78
+ * // In a header:
79
+ * flexRender(header.column.columnDef.header, header.getContext())
80
+ * // In a cell:
81
+ * flexRender(cell.column.columnDef.cell, cell.getContext())
82
+ */
83
+ function flexRender(component, props) {
84
+ if (component == null) return null;
85
+ if (typeof component === "string" || typeof component === "number") return component;
86
+ if (typeof component === "function") return component(props);
87
+ if (isVNode(component)) return component;
88
+ return null;
89
+ }
90
+
91
+ //#endregion
92
+ export { flexRender, useTable };
93
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../src/use-table.ts","../../src/flex-render.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,QAAA,CACd,OAAA,EACwB;EAExB,MAAM,UAAA,GAAa,MAAA,CAAmB,CAAA,CAAE,CAAe;EAKvD,MAAM,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE;EAazB,MAAM,KAAA,GAAQ,WAAA,CAVuC;IACnD,KAAA,EAAO,CAAA,CAAE;IACT,aAAA,CAAA,EAAgB,CAAA,CAAA;IAGhB,mBAAA,EAAqB,IAAA;IACrB,GAAG,OAAA,CAAA;GACJ,CAGyC;EAG1C,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa;EAIlC,MAAM,QAAA,GAAW,QAAA,CAAA,MAAe;IAC9B,OAAA,CAAA,CAAS;IACT,OAAO,KAAA;IACP;EAIF,MAAM,OAAA,GAAU,MAAA,CAAA,MAAa;IAC3B,MAAM,QAAA,GAAW,OAAA,CAAA,CAAS;IAC1B,MAAM,YAAA,GAAe,UAAA,CAAA,CAAY;IACjC,IAAI,YAAA,GAAe,KAAA;IAEnB,KAAA,CAAM,UAAA,CAAY,IAAA,KAAU;MAC1B,GAAG,IAAA;MACH,GAAG,QAAA;MACH,KAAA,EAAO;QACL,GAAG,YAAA;QACH,GAAG,QAAA,CAAS;OACb;MACD,aAAA,EAAgB,OAAA,IAAiC;QAC/C,MAAM,QAAA,GACJ,OAAO,OAAA,KAAY,UAAA,GAAa,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAA,CAAM,CAAC,GAAG,OAAA;QAE/D,YAAA,GAAe,IAAA;QACf,KAAA,CAAA,MAAY;UACV,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS;UACxB,OAAA,CAAQ,MAAA,CAAQ,CAAA,IAAM,CAAA,GAAI,CAAA,CAAE;UAC5B;QAEF,QAAA,CAAS,aAAA,GAAgB,OAAA,CAAQ;;KAEpC,CAAA,CAAE;IAGH,IAAI,CAAC,YAAA,EACH,OAAA,CAAQ,MAAA,CAAQ,CAAA,IAAM,CAAA,GAAI,CAAA,CAAE;IAE9B;EAGF,SAAA,CAAA,MAAgB,OAAA,CAAQ,OAAA,CAAA,CAAS,CAAC;EAElC,OAAO,QAAA;;;;;;;;AClGT,SAAS,OAAA,CAAQ,KAAA,EAAyB;EACxC,OACE,KAAA,IAAS,IAAA,IACT,OAAO,KAAA,KAAU,QAAA,IACjB,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IACrB,MAAA,IAAW,KAAA,IACX,OAAA,IAAY,KAAA,IACZ,UAAA,IAAe,KAAA;;;;;;;;;;;;AAcnB,SAAgB,UAAA,CACd,SAAA,EAOA,KAAA,EACS;EACT,IAAI,SAAA,IAAa,IAAA,EAAM,OAAO,IAAA;EAC9B,IAAI,OAAO,SAAA,KAAc,QAAA,IAAY,OAAO,SAAA,KAAc,QAAA,EACxD,OAAO,SAAA;EACT,IAAI,OAAO,SAAA,KAAc,UAAA,EACvB,OAAQ,SAAA,CAAqC,KAAA,CAAM;EAErD,IAAI,OAAA,CAAQ,SAAA,CAAU,EAAE,OAAO,SAAA;EAC/B,OAAO,IAAA"}
@@ -0,0 +1,40 @@
1
+ import { RowData, Table, TableOptions } from "@tanstack/table-core";
2
+ import { Computed } from "@pyreon/reactivity";
3
+ export * from "@tanstack/table-core";
4
+
5
+ //#region src/use-table.d.ts
6
+ type UseTableOptions<TData extends RowData> = () => TableOptions<TData>;
7
+ /**
8
+ * Create a reactive TanStack Table instance. Returns a read-only signal
9
+ * that holds the Table instance — read it in effects or templates to
10
+ * track state changes.
11
+ *
12
+ * Options are passed as a function so reactive signals (e.g. data, columns)
13
+ * can be read inside, and the table updates automatically when they change.
14
+ *
15
+ * @example
16
+ * const data = signal([{ name: "Alice" }, { name: "Bob" }])
17
+ * const table = useTable(() => ({
18
+ * data: data(),
19
+ * columns: [{ accessorKey: "name", header: "Name" }],
20
+ * getCoreRowModel: getCoreRowModel(),
21
+ * }))
22
+ * // In template: () => table().getRowModel().rows
23
+ */
24
+ declare function useTable<TData extends RowData>(options: UseTableOptions<TData>): Computed<Table<TData>>;
25
+ //#endregion
26
+ //#region src/flex-render.d.ts
27
+ /**
28
+ * Renders a TanStack Table column def template (header, cell, footer).
29
+ * Handles strings, numbers, functions (components/render fns), and VNodes.
30
+ *
31
+ * @example
32
+ * // In a header:
33
+ * flexRender(header.column.columnDef.header, header.getContext())
34
+ * // In a cell:
35
+ * flexRender(cell.column.columnDef.cell, cell.getContext())
36
+ */
37
+ declare function flexRender<_TData extends RowData, TValue>(component: ((p: TValue) => unknown) | string | number | undefined | null | unknown, props: TValue): unknown;
38
+ //#endregion
39
+ export { type UseTableOptions, flexRender, useTable };
40
+ //# sourceMappingURL=index2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index2.d.ts","names":[],"sources":["../../src/use-table.ts","../../src/flex-render.ts"],"mappings":";;;;;KAaY,eAAA,eAA8B,OAAA,UAAiB,YAAA,CAAa,KAAA;;;;AAAxE;;;;;;;;;;;;;;iBAmBgB,QAAA,eAAuB,OAAA,CAAA,CACrC,OAAA,EAAS,eAAA,CAAgB,KAAA,IACxB,QAAA,CAAS,KAAA,CAAM,KAAA;;;;;;;;AArBlB;;;;;iBCagB,UAAA,gBAA0B,OAAA,SAAA,CACxC,SAAA,IACM,CAAA,EAAG,MAAA,8DAMT,KAAA,EAAO,MAAA"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@pyreon/table",
3
+ "version": "0.0.1",
4
+ "description": "Pyreon adapter for TanStack Table",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/pyreon/fundamentals.git",
9
+ "directory": "packages/table"
10
+ },
11
+ "homepage": "https://github.com/pyreon/fundamentals/tree/main/packages/table#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/pyreon/fundamentals/issues"
14
+ },
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "files": [
19
+ "lib",
20
+ "src",
21
+ "README.md",
22
+ "LICENSE"
23
+ ],
24
+ "type": "module",
25
+ "sideEffects": false,
26
+ "main": "./lib/index.js",
27
+ "module": "./lib/index.js",
28
+ "types": "./lib/types/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "bun": "./src/index.ts",
32
+ "import": "./lib/index.js",
33
+ "types": "./lib/types/index.d.ts"
34
+ }
35
+ },
36
+ "scripts": {
37
+ "build": "vl_rolldown_build",
38
+ "dev": "vl_rolldown_build-watch",
39
+ "test": "vitest run",
40
+ "typecheck": "tsc --noEmit"
41
+ },
42
+ "dependencies": {
43
+ "@tanstack/table-core": "^8.0.0"
44
+ },
45
+ "peerDependencies": {
46
+ "@pyreon/core": "^0.2.1",
47
+ "@pyreon/reactivity": "^0.2.1"
48
+ },
49
+ "devDependencies": {
50
+ "@happy-dom/global-registrator": "^20.8.3",
51
+ "@pyreon/core": "^0.2.1",
52
+ "@pyreon/reactivity": "^0.2.1",
53
+ "@pyreon/runtime-dom": "^0.2.1"
54
+ }
55
+ }
@@ -0,0 +1,45 @@
1
+ import type { RowData } from '@tanstack/table-core'
2
+
3
+ /**
4
+ * Check whether a value is a Pyreon VNode (has type, props, children, key).
5
+ */
6
+ function isVNode(value: unknown): boolean {
7
+ return (
8
+ value != null &&
9
+ typeof value === 'object' &&
10
+ !Array.isArray(value) &&
11
+ 'type' in (value as Record<string, unknown>) &&
12
+ 'props' in (value as Record<string, unknown>) &&
13
+ 'children' in (value as Record<string, unknown>)
14
+ )
15
+ }
16
+
17
+ /**
18
+ * Renders a TanStack Table column def template (header, cell, footer).
19
+ * Handles strings, numbers, functions (components/render fns), and VNodes.
20
+ *
21
+ * @example
22
+ * // In a header:
23
+ * flexRender(header.column.columnDef.header, header.getContext())
24
+ * // In a cell:
25
+ * flexRender(cell.column.columnDef.cell, cell.getContext())
26
+ */
27
+ export function flexRender<_TData extends RowData, TValue>(
28
+ component:
29
+ | ((p: TValue) => unknown)
30
+ | string
31
+ | number
32
+ | undefined
33
+ | null
34
+ | unknown,
35
+ props: TValue,
36
+ ): unknown {
37
+ if (component == null) return null
38
+ if (typeof component === 'string' || typeof component === 'number')
39
+ return component
40
+ if (typeof component === 'function')
41
+ return (component as (p: TValue) => unknown)(props)
42
+ // Pass through VNodes and other objects as-is (the renderer handles them)
43
+ if (isVNode(component)) return component
44
+ return null
45
+ }
package/src/index.ts ADDED
@@ -0,0 +1,11 @@
1
+ // ─── TanStack Table core — re-export everything ─────────────────────────────
2
+ // Mirrors the approach of @tanstack/react-table and @tanstack/solid-table:
3
+ // users can import any core utility, type, or built-in fn from @pyreon/table.
4
+ export * from '@tanstack/table-core'
5
+
6
+ // ─── Pyreon adapter ─────────────────────────────────────────────────────────────
7
+
8
+ export { useTable } from './use-table'
9
+ export type { UseTableOptions } from './use-table'
10
+
11
+ export { flexRender } from './flex-render'