@toolbox-web/grid-vue 0.10.1 → 0.10.2
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/index.js +31 -31
- package/index.js.map +1 -1
- package/lib/vue-grid-adapter.d.ts +2 -1
- package/lib/vue-grid-adapter.d.ts.map +1 -1
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -43,26 +43,26 @@ const X = h({
|
|
|
43
43
|
setup(o, { slots: r }) {
|
|
44
44
|
return k(z, o.defaults), () => r.default?.();
|
|
45
45
|
}
|
|
46
|
-
}), $ = /* @__PURE__ */ new WeakMap(), q = /* @__PURE__ */ new WeakMap(), v = /* @__PURE__ */ new WeakMap(),
|
|
46
|
+
}), $ = /* @__PURE__ */ new WeakMap(), q = /* @__PURE__ */ new WeakMap(), v = /* @__PURE__ */ new WeakMap(), w = /* @__PURE__ */ new Map();
|
|
47
47
|
function Z(o, r) {
|
|
48
48
|
const t = o.getAttribute("field"), e = v.get(o) ?? {};
|
|
49
49
|
if (e.renderer = r, v.set(o, e), t) {
|
|
50
|
-
const n =
|
|
51
|
-
n.renderer = r,
|
|
50
|
+
const n = w.get(t) ?? {};
|
|
51
|
+
n.renderer = r, w.set(t, n);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
function ee(o, r) {
|
|
55
55
|
const t = o.getAttribute("field"), e = v.get(o) ?? {};
|
|
56
56
|
if (e.editor = r, v.set(o, e), t) {
|
|
57
|
-
const n =
|
|
58
|
-
n.editor = r,
|
|
57
|
+
const n = w.get(t) ?? {};
|
|
58
|
+
n.editor = r, w.set(t, n);
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
function te(o) {
|
|
62
62
|
let r = v.get(o)?.renderer;
|
|
63
63
|
if (!r) {
|
|
64
64
|
const t = o.getAttribute("field");
|
|
65
|
-
t && (r =
|
|
65
|
+
t && (r = w.get(t)?.renderer);
|
|
66
66
|
}
|
|
67
67
|
return r;
|
|
68
68
|
}
|
|
@@ -70,7 +70,7 @@ function re(o) {
|
|
|
70
70
|
let r = v.get(o)?.editor;
|
|
71
71
|
if (!r) {
|
|
72
72
|
const t = o.getAttribute("field");
|
|
73
|
-
t && (r =
|
|
73
|
+
t && (r = w.get(t)?.editor);
|
|
74
74
|
}
|
|
75
75
|
return r;
|
|
76
76
|
}
|
|
@@ -89,7 +89,7 @@ function y(o) {
|
|
|
89
89
|
}
|
|
90
90
|
return !1;
|
|
91
91
|
}
|
|
92
|
-
function
|
|
92
|
+
function C(o) {
|
|
93
93
|
return typeof o == "function" && !y(o);
|
|
94
94
|
}
|
|
95
95
|
const f = /* @__PURE__ */ Symbol.for("tbw:vue-processed");
|
|
@@ -134,7 +134,7 @@ class ne {
|
|
|
134
134
|
const t = r, e = { ...t };
|
|
135
135
|
return t.columns && (e.columns = t.columns.map((n) => this.processColumn(n))), t.typeDefaults && (e.typeDefaults = this.processTypeDefaults(t.typeDefaults)), t.loadingRenderer && (y(t.loadingRenderer) ? e.loadingRenderer = this.createComponentLoadingRenderer(
|
|
136
136
|
t.loadingRenderer
|
|
137
|
-
) :
|
|
137
|
+
) : C(t.loadingRenderer) && (e.loadingRenderer = this.createVNodeLoadingRenderer(
|
|
138
138
|
t.loadingRenderer
|
|
139
139
|
))), e;
|
|
140
140
|
}
|
|
@@ -151,11 +151,11 @@ class ne {
|
|
|
151
151
|
const i = {
|
|
152
152
|
editorParams: n.editorParams
|
|
153
153
|
};
|
|
154
|
-
n.renderer && (y(n.renderer) ? i.renderer = this.createConfigComponentRenderer(n.renderer) :
|
|
154
|
+
n.renderer && (y(n.renderer) ? i.renderer = this.createConfigComponentRenderer(n.renderer) : C(n.renderer) && (i.renderer = this.createTypeRenderer(
|
|
155
155
|
n.renderer
|
|
156
156
|
))), n.editor && (y(n.editor) ? i.editor = this.createConfigComponentEditor(
|
|
157
157
|
n.editor
|
|
158
|
-
) :
|
|
158
|
+
) : C(n.editor) && (i.editor = this.createTypeEditor(
|
|
159
159
|
n.editor
|
|
160
160
|
))), n.filterPanelRenderer && (i.filterPanelRenderer = this.createFilterPanelRenderer(n.filterPanelRenderer)), t[e] = i;
|
|
161
161
|
}
|
|
@@ -174,7 +174,7 @@ class ne {
|
|
|
174
174
|
if (y(r.renderer)) {
|
|
175
175
|
const e = this.createConfigComponentRenderer(r.renderer);
|
|
176
176
|
e[f] = !0, t.renderer = e;
|
|
177
|
-
} else if (
|
|
177
|
+
} else if (C(r.renderer)) {
|
|
178
178
|
const e = this.createConfigVNodeRenderer(r.renderer);
|
|
179
179
|
e[f] = !0, t.renderer = e;
|
|
180
180
|
}
|
|
@@ -183,7 +183,7 @@ class ne {
|
|
|
183
183
|
if (y(r.editor)) {
|
|
184
184
|
const e = this.createConfigComponentEditor(r.editor);
|
|
185
185
|
e[f] = !0, t.editor = e;
|
|
186
|
-
} else if (
|
|
186
|
+
} else if (C(r.editor)) {
|
|
187
187
|
const e = this.createConfigVNodeEditor(r.editor);
|
|
188
188
|
e[f] = !0, t.editor = e;
|
|
189
189
|
}
|
|
@@ -192,7 +192,7 @@ class ne {
|
|
|
192
192
|
if (y(r.headerRenderer)) {
|
|
193
193
|
const e = this.createConfigComponentHeaderRenderer(r.headerRenderer);
|
|
194
194
|
e[f] = !0, t.headerRenderer = e;
|
|
195
|
-
} else if (
|
|
195
|
+
} else if (C(r.headerRenderer)) {
|
|
196
196
|
const e = this.createConfigVNodeHeaderRenderer(
|
|
197
197
|
r.headerRenderer
|
|
198
198
|
);
|
|
@@ -203,7 +203,7 @@ class ne {
|
|
|
203
203
|
if (y(r.headerLabelRenderer)) {
|
|
204
204
|
const e = this.createConfigComponentHeaderLabelRenderer(r.headerLabelRenderer);
|
|
205
205
|
e[f] = !0, t.headerLabelRenderer = e;
|
|
206
|
-
} else if (
|
|
206
|
+
} else if (C(r.headerLabelRenderer)) {
|
|
207
207
|
const e = this.createConfigVNodeHeaderLabelRenderer(
|
|
208
208
|
r.headerLabelRenderer
|
|
209
209
|
);
|
|
@@ -228,16 +228,16 @@ class ne {
|
|
|
228
228
|
const d = document.createElement("div");
|
|
229
229
|
d.className = "vue-cell-renderer", d.style.display = "contents";
|
|
230
230
|
let p = e;
|
|
231
|
-
const g = r,
|
|
231
|
+
const g = r, b = u({
|
|
232
232
|
render() {
|
|
233
233
|
return V(g, { ...p });
|
|
234
234
|
}
|
|
235
235
|
});
|
|
236
|
-
return
|
|
237
|
-
app:
|
|
236
|
+
return b.mount(d), t.set(n, {
|
|
237
|
+
app: b,
|
|
238
238
|
container: d,
|
|
239
239
|
update: (N) => {
|
|
240
|
-
p = N,
|
|
240
|
+
p = N, b._instance?.update();
|
|
241
241
|
}
|
|
242
242
|
}), d;
|
|
243
243
|
}
|
|
@@ -452,7 +452,7 @@ class ne {
|
|
|
452
452
|
const t = r.getAttribute("field");
|
|
453
453
|
let e = v.get(r);
|
|
454
454
|
if (!e && t) {
|
|
455
|
-
const s =
|
|
455
|
+
const s = w.get(t);
|
|
456
456
|
s && (s.renderer || s.editor) && (e = s, v.set(r, e));
|
|
457
457
|
}
|
|
458
458
|
const n = e?.renderer !== void 0, i = e?.editor !== void 0;
|
|
@@ -484,8 +484,8 @@ class ne {
|
|
|
484
484
|
return g.mount(d), e.set(i, {
|
|
485
485
|
app: g,
|
|
486
486
|
container: d,
|
|
487
|
-
update: (
|
|
488
|
-
p =
|
|
487
|
+
update: (b) => {
|
|
488
|
+
p = b, g._instance?.update();
|
|
489
489
|
}
|
|
490
490
|
}), d;
|
|
491
491
|
}
|
|
@@ -676,7 +676,7 @@ class ne {
|
|
|
676
676
|
r.unmount(), t.remove();
|
|
677
677
|
} catch {
|
|
678
678
|
}
|
|
679
|
-
this.editorViews = [];
|
|
679
|
+
this.editorViews = [], w.clear();
|
|
680
680
|
}
|
|
681
681
|
/**
|
|
682
682
|
* Unmount a specific container (e.g., detail panel, tool panel).
|
|
@@ -899,7 +899,7 @@ const oe = ne, me = /* @__PURE__ */ h({
|
|
|
899
899
|
"print-complete": ""
|
|
900
900
|
}, c = t, d = _(null);
|
|
901
901
|
k(x, d);
|
|
902
|
-
const p = H(), g = J(),
|
|
902
|
+
const p = H(), g = J(), b = [
|
|
903
903
|
"selection",
|
|
904
904
|
"editing",
|
|
905
905
|
"clipboard",
|
|
@@ -930,17 +930,17 @@ const oe = ne, me = /* @__PURE__ */ h({
|
|
|
930
930
|
];
|
|
931
931
|
function N() {
|
|
932
932
|
const l = [];
|
|
933
|
-
for (const m of
|
|
934
|
-
const
|
|
935
|
-
if (
|
|
936
|
-
const E = Y(m,
|
|
933
|
+
for (const m of b) {
|
|
934
|
+
const R = s[m];
|
|
935
|
+
if (R !== void 0) {
|
|
936
|
+
const E = Y(m, R);
|
|
937
937
|
E && l.push(E);
|
|
938
938
|
}
|
|
939
939
|
}
|
|
940
940
|
return l;
|
|
941
941
|
}
|
|
942
942
|
const S = U(() => {
|
|
943
|
-
const l = s.gridConfig ?? {}, m = N(),
|
|
943
|
+
const l = s.gridConfig ?? {}, m = N(), R = l.plugins ?? [], E = [...m, ...R], O = g ? { ...l.icons, ...g } : l.icons;
|
|
944
944
|
return {
|
|
945
945
|
...l,
|
|
946
946
|
...s.columns ? { columns: s.columns } : {},
|
|
@@ -953,8 +953,8 @@ const oe = ne, me = /* @__PURE__ */ h({
|
|
|
953
953
|
if (!l) return;
|
|
954
954
|
const m = i();
|
|
955
955
|
l.__frameworkAdapter = m, m.setTypeDefaults(p ?? null);
|
|
956
|
-
for (const
|
|
957
|
-
F.push(l.on(
|
|
956
|
+
for (const R of Object.keys(a))
|
|
957
|
+
F.push(l.on(R, (E, O) => c(R, O)));
|
|
958
958
|
s.rows.length > 0 && (l.rows = s.rows), S.value && (l.gridConfig = S.value), s.fitMode && (l.fitMode = s.fitMode);
|
|
959
959
|
}), M(() => {
|
|
960
960
|
d.value && (F.forEach((m) => m()), F.length = 0);
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../libs/grid-vue/src/lib/grid-icon-registry.ts","../../../libs/grid-vue/src/lib/grid-type-registry.ts","../../../libs/grid-vue/src/lib/detail-panel-registry.ts","../../../libs/grid-vue/src/lib/responsive-card-registry.ts","../../../libs/grid-vue/src/lib/vue-grid-adapter.ts","../../../libs/grid-vue/src/lib/TbwGrid.vue","../../../libs/grid-vue/src/lib/TbwGridColumn.vue","../../../libs/grid-vue/src/lib/TbwGridDetailPanel.vue","../../../libs/grid-vue/src/lib/TbwGridResponsiveCard.vue","../../../libs/grid-vue/src/lib/TbwGridToolButtons.vue","../../../libs/grid-vue/src/lib/tool-panel-registry.ts","../../../libs/grid-vue/src/lib/TbwGridToolPanel.vue","../../../libs/grid-vue/src/lib/use-grid-event.ts","../../../libs/grid-vue/src/lib/grid-provider.ts"],"sourcesContent":["/**\n * Icon registry for Vue applications.\n *\n * Provides application-wide icon overrides that all grids inherit\n * automatically via Vue's provide/inject.\n */\nimport type { GridIcons } from '@toolbox-web/grid';\nimport { defineComponent, inject, provide, type InjectionKey, type PropType } from 'vue';\n\n/**\n * Injection key for grid icons.\n */\nexport const GRID_ICONS: InjectionKey<Partial<GridIcons>> = Symbol('grid-icons');\n\n/**\n * Composable to get the current icon overrides from the nearest provider.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useGridIcons } from '@toolbox-web/grid-vue';\n *\n * const icons = useGridIcons();\n * </script>\n * ```\n */\nexport function useGridIcons(): Partial<GridIcons> | undefined {\n return inject(GRID_ICONS, undefined);\n}\n\n/**\n * Provides application-wide icon overrides for all descendant grids.\n *\n * Wrap your application (or part of it) with this provider to customize\n * icons used by all TbwGrid components.\n *\n * @example\n * ```vue\n * <script setup>\n * import { GridIconProvider } from '@toolbox-web/grid-vue';\n *\n * const icons = {\n * sortAsc: '↑',\n * sortDesc: '↓',\n * expand: '+',\n * collapse: '−',\n * };\n * </script>\n *\n * <template>\n * <GridIconProvider :icons=\"icons\">\n * <App />\n * </GridIconProvider>\n * </template>\n * ```\n */\nexport const GridIconProvider = defineComponent({\n name: 'GridIconProvider',\n props: {\n /**\n * Icon overrides to provide to all descendant grids.\n */\n icons: {\n type: Object as PropType<Partial<GridIcons>>,\n required: true,\n },\n },\n setup(props, { slots }) {\n // Provide icons to descendants\n provide(GRID_ICONS, props.icons);\n\n // Render children\n return () => slots.default?.();\n },\n});\n\nexport type GridIconProviderProps = InstanceType<typeof GridIconProvider>['$props'];\n","/**\n * Type-level default registry for Vue applications.\n *\n * Provides application-wide type defaults for renderers and editors\n * that all grids inherit automatically via Vue's provide/inject.\n */\nimport type { CellRenderContext, ColumnEditorContext } from '@toolbox-web/grid';\nimport type { FilterPanelParams } from '@toolbox-web/grid/plugins/filtering';\nimport { defineComponent, inject, provide, type InjectionKey, type PropType, type VNode } from 'vue';\n\n// #region TypeDefault Interface\n/**\n * Type default configuration for Vue applications.\n *\n * Defines default renderer, editor, and editorParams for a data type\n * using Vue render functions.\n *\n * @example\n * ```ts\n * import type { TypeDefault } from '@toolbox-web/grid-vue';\n * import CountryFlag from './CountryFlag.vue';\n * import CountrySelect from './CountrySelect.vue';\n *\n * const countryDefault: TypeDefault<Employee, string> = {\n * renderer: (ctx) => h(CountryFlag, { code: ctx.value }),\n * editor: (ctx) => h(CountrySelect, {\n * modelValue: ctx.value,\n * 'onUpdate:modelValue': ctx.commit,\n * }),\n * };\n * ```\n */\nexport interface TypeDefault<TRow = unknown, TValue = unknown> {\n /** Vue render function for rendering cells of this type */\n renderer?: (ctx: CellRenderContext<TRow, TValue>) => VNode;\n /** Vue render function for editing cells of this type */\n editor?: (ctx: ColumnEditorContext<TRow, TValue>) => VNode;\n /** Default editorParams for this type */\n editorParams?: Record<string, unknown>;\n /**\n * Vue render function for custom filter panels for this type.\n *\n * Unlike the core imperative API `(container, params) => void`, this accepts\n * a Vue render function that receives only the params and returns a VNode.\n * The bridge handles mounting and appending to the container automatically.\n *\n * @example\n * ```ts\n * import { h } from 'vue';\n * import CustomFilter from './CustomFilter.vue';\n *\n * const typeDefault: TypeDefault = {\n * filterPanelRenderer: (params) => h(CustomFilter, {\n * field: params.field,\n * uniqueValues: params.uniqueValues,\n * onApply: (values: Set<unknown>) => params.applySetFilter(values),\n * }),\n * };\n * ```\n */\n filterPanelRenderer?: (params: FilterPanelParams) => VNode;\n}\n\n/**\n * @deprecated Use `TypeDefault` instead. Will be removed in v2.\n * @see {@link TypeDefault}\n */\nexport type VueTypeDefault<TRow = unknown, TValue = unknown> = TypeDefault<TRow, TValue>;\n// #endregion\n\n/**\n * Type defaults registry - a map of type names to their defaults.\n */\nexport type TypeDefaultsMap = Record<string, TypeDefault>;\n\n/**\n * Injection key for type defaults.\n */\nexport const GRID_TYPE_DEFAULTS: InjectionKey<TypeDefaultsMap> = Symbol('grid-type-defaults');\n\n/**\n * Composable to get the current type defaults from the nearest provider.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useGridTypeDefaults } from '@toolbox-web/grid-vue';\n *\n * const typeDefaults = useGridTypeDefaults();\n * </script>\n * ```\n */\nexport function useGridTypeDefaults(): TypeDefaultsMap | undefined {\n return inject(GRID_TYPE_DEFAULTS, undefined);\n}\n\n/**\n * Composable to get a specific type's default configuration.\n *\n * @param typeName - The type name to look up\n *\n * @example\n * ```vue\n * <script setup>\n * import { useTypeDefault } from '@toolbox-web/grid-vue';\n *\n * const countryDefault = useTypeDefault('country');\n * </script>\n * ```\n */\nexport function useTypeDefault<TRow = unknown, TValue = unknown>(\n typeName: string,\n): TypeDefault<TRow, TValue> | undefined {\n const defaults = useGridTypeDefaults();\n return defaults?.[typeName] as TypeDefault<TRow, TValue> | undefined;\n}\n\n/**\n * Provides application-wide type defaults for all descendant grids.\n *\n * Wrap your application (or part of it) with this provider to make\n * type-level renderers and editors available to all TbwGrid components.\n *\n * @example\n * ```vue\n * <script setup>\n * import { GridTypeProvider, type TypeDefaultsMap } from '@toolbox-web/grid-vue';\n * import { h } from 'vue';\n * import CountryBadge from './CountryBadge.vue';\n *\n * const typeDefaults: TypeDefaultsMap = {\n * country: {\n * renderer: (ctx) => h(CountryBadge, { code: ctx.value }),\n * },\n * };\n * </script>\n *\n * <template>\n * <GridTypeProvider :defaults=\"typeDefaults\">\n * <App />\n * </GridTypeProvider>\n * </template>\n * ```\n */\nexport const GridTypeProvider = defineComponent({\n name: 'GridTypeProvider',\n props: {\n /**\n * Type defaults to provide to all descendant grids.\n */\n defaults: {\n type: Object as PropType<TypeDefaultsMap>,\n required: true,\n },\n },\n setup(props, { slots }) {\n // Provide type defaults to descendants\n provide(GRID_TYPE_DEFAULTS, props.defaults);\n\n // Render children\n return () => slots.default?.();\n },\n});\n\nexport type GridTypeProviderProps = InstanceType<typeof GridTypeProvider>['$props'];\n","/**\n * Registry for detail panel renderers.\n * @internal\n */\nimport type { VNode } from 'vue';\n\n/**\n * Context object passed to the detail panel slot.\n */\nexport interface DetailPanelContext<T = unknown> {\n /** The row data for this detail panel */\n row: T;\n /** The row index */\n rowIndex: number;\n}\n\n/**\n * Registry for detail renderers (per grid element)\n */\nexport const detailRegistry = new WeakMap<HTMLElement, (ctx: DetailPanelContext<unknown>) => VNode[] | undefined>();\n\n/**\n * Get the detail renderer for a grid element.\n * @internal\n */\nexport function getDetailRenderer(\n gridElement: HTMLElement,\n): ((ctx: DetailPanelContext<unknown>) => VNode[] | undefined) | undefined {\n const detailElement = gridElement.querySelector('tbw-grid-detail') as HTMLElement | null;\n if (detailElement) {\n return detailRegistry.get(detailElement);\n }\n return undefined;\n}\n","/**\n * Registry for responsive card renderers.\n * @internal\n */\nimport type { VNode } from 'vue';\n\n/**\n * Context object passed to the responsive card slot.\n */\nexport interface ResponsiveCardContext<T = unknown> {\n /** The row data */\n row: T;\n /** The row index */\n rowIndex: number;\n}\n\n/**\n * Registry for responsive card renderers (per element)\n */\nexport const cardRegistry = new WeakMap<HTMLElement, (ctx: ResponsiveCardContext<unknown>) => VNode[] | undefined>();\n\n/**\n * Get the responsive card renderer for a grid element.\n * @internal\n */\nexport function getResponsiveCardRenderer(\n gridElement: HTMLElement,\n): ((ctx: ResponsiveCardContext<unknown>) => VNode[] | undefined) | undefined {\n const cardElement = gridElement.querySelector('tbw-grid-responsive-card') as HTMLElement | null;\n if (cardElement) {\n return cardRegistry.get(cardElement);\n }\n return undefined;\n}\n","import type {\n ColumnConfig as BaseColumnConfig,\n GridConfig as BaseGridConfig,\n TypeDefault as BaseTypeDefault,\n CellRenderContext,\n ColumnEditorContext,\n ColumnEditorSpec,\n ColumnViewRenderer,\n FrameworkAdapter,\n HeaderCellContext,\n HeaderLabelContext,\n LoadingContext,\n} from '@toolbox-web/grid';\nimport type { FilterPanelParams } from '@toolbox-web/grid/plugins/filtering';\nimport { createApp, createVNode, type App, type Component, type VNode } from 'vue';\nimport { detailRegistry, type DetailPanelContext } from './detail-panel-registry';\nimport type { TypeDefault, TypeDefaultsMap } from './grid-type-registry';\nimport { cardRegistry, type ResponsiveCardContext } from './responsive-card-registry';\nimport type { ColumnConfig, GridConfig } from './vue-column-config';\nexport type { GridConfig };\n\n/**\n * Registry mapping column elements to their Vue render functions.\n * Each column element stores its renderer/editor functions here.\n */\ninterface ColumnRegistry {\n renderer?: (ctx: CellRenderContext<unknown, unknown>) => VNode;\n editor?: (ctx: ColumnEditorContext<unknown, unknown>) => VNode;\n}\n\nconst columnRegistries = new WeakMap<HTMLElement, ColumnRegistry>();\n\n// Secondary registry by field name to handle Vue component re-creation\nconst fieldRegistries = new Map<string, ColumnRegistry>();\n\n/**\n * Register a Vue cell renderer for a column element.\n * Called by TbwGridColumn when it has a #cell slot.\n */\nexport function registerColumnRenderer(\n element: HTMLElement,\n renderer: (ctx: CellRenderContext<unknown, unknown>) => VNode,\n): void {\n const field = element.getAttribute('field');\n\n const registry = columnRegistries.get(element) ?? {};\n registry.renderer = renderer;\n columnRegistries.set(element, registry);\n\n // Also register by field name for fallback lookup\n if (field) {\n const fieldRegistry = fieldRegistries.get(field) ?? {};\n fieldRegistry.renderer = renderer;\n fieldRegistries.set(field, fieldRegistry);\n }\n}\n\n/**\n * Register a Vue cell editor for a column element.\n * Called by TbwGridColumn when it has an #editor slot.\n */\nexport function registerColumnEditor(\n element: HTMLElement,\n editor: (ctx: ColumnEditorContext<unknown, unknown>) => VNode,\n): void {\n const field = element.getAttribute('field');\n const registry = columnRegistries.get(element) ?? {};\n registry.editor = editor;\n columnRegistries.set(element, registry);\n\n // Also register by field name for fallback lookup\n if (field) {\n const fieldRegistry = fieldRegistries.get(field) ?? {};\n fieldRegistry.editor = editor;\n fieldRegistries.set(field, fieldRegistry);\n }\n}\n\n/**\n * Get the renderer registered for a column element.\n * Falls back to field-based lookup if WeakMap lookup fails.\n */\nexport function getColumnRenderer(\n element: HTMLElement,\n): ((ctx: CellRenderContext<unknown, unknown>) => VNode) | undefined {\n let renderer = columnRegistries.get(element)?.renderer;\n\n // Fallback to field-based lookup for Vue component re-creation scenarios\n if (!renderer) {\n const field = element.getAttribute('field');\n if (field) {\n renderer = fieldRegistries.get(field)?.renderer;\n }\n }\n\n return renderer;\n}\n\n/**\n * Get the editor registered for a column element.\n * Falls back to field-based lookup if WeakMap lookup fails.\n */\nexport function getColumnEditor(\n element: HTMLElement,\n): ((ctx: ColumnEditorContext<unknown, unknown>) => VNode) | undefined {\n let editor = columnRegistries.get(element)?.editor;\n\n // Fallback to field-based lookup for Vue component re-creation scenarios\n if (!editor) {\n const field = element.getAttribute('field');\n if (field) {\n editor = fieldRegistries.get(field)?.editor;\n }\n }\n\n return editor;\n}\n\n/**\n * Get all registered field names.\n * @internal - for testing only\n */\nexport function getRegisteredFields(): string[] {\n return Array.from(fieldRegistries.keys());\n}\n\n/**\n * Clear the field registries.\n * @internal - for testing only\n */\nexport function clearFieldRegistries(): void {\n fieldRegistries.clear();\n}\n\n// #region Vue Component Detection\n\n/**\n * Checks if a value is a Vue component (SFC or defineComponent result).\n *\n * Vue components are identified by:\n * - Having `__name` (SFC compiled marker)\n * - Having `setup` function (Composition API component)\n * - Having `render` function (Options API component)\n * - Being an ES6 class (class-based component)\n *\n * Regular functions `(ctx) => HTMLElement` that are already processed\n * will not match these checks, making this idempotent.\n */\nexport function isVueComponent(value: unknown): value is Component {\n if (value == null) return false;\n\n // Already a DOM-returning function (processed) — skip\n if (typeof value === 'function' && value.prototype === undefined) {\n // Plain arrow/function — could be a VNode-returning render fn OR\n // an already-processed DOM-returning fn. We can't distinguish at runtime,\n // so we check if it looks like a Vue component (has component markers).\n // Plain functions without component markers are treated as VNode-returning.\n return false;\n }\n\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n // SFC compiled marker\n if ('__name' in obj) return true;\n // Composition API\n if (typeof obj['setup'] === 'function') return true;\n // Options API\n if (typeof obj['render'] === 'function') return true;\n }\n\n if (typeof value === 'function') {\n // ES6 class-based component\n const fnString = Function.prototype.toString.call(value);\n if (fnString.startsWith('class ') || fnString.startsWith('class{')) return true;\n\n // defineComponent returns a function with component markers\n const fn = value as unknown as Record<string, unknown>;\n if ('__name' in fn || typeof fn['setup'] === 'function') return true;\n }\n\n return false;\n}\n\n/**\n * Checks if a value is a VNode-returning render function.\n * These are plain functions (not component objects) that return VNodes.\n * They need wrapping to produce HTMLElements for the grid core.\n */\nfunction isVNodeRenderFunction(value: unknown): value is (...args: unknown[]) => VNode {\n return typeof value === 'function' && !isVueComponent(value);\n}\n\n/**\n * Symbol used to mark renderer/editor functions that have already been\n * processed by the adapter (i.e., wrapped from VNode/Component → DOM).\n * Prevents double-wrapping when `processGridConfig` is called multiple times.\n */\nconst PROCESSED_MARKER = Symbol.for('tbw:vue-processed');\n\n// #endregion\n\n/**\n * Tracks mounted Vue apps for cleanup.\n */\ninterface MountedView {\n app: App;\n container: HTMLElement;\n}\n\n/**\n * Cache for cell containers and their Vue apps.\n */\ninterface CellAppCache {\n app: App;\n container: HTMLElement;\n update: (ctx: CellRenderContext<unknown, unknown>) => void;\n}\n\n/**\n * Framework adapter that enables Vue 3 component integration\n * with the grid's light DOM configuration API.\n *\n * ## Usage\n *\n * The adapter is automatically registered when using the TbwGrid component.\n * For advanced use cases, you can manually register:\n *\n * ```ts\n * import { GridElement } from '@toolbox-web/grid';\n * import { GridAdapter } from '@toolbox-web/grid-vue';\n *\n * // One-time registration\n * GridElement.registerAdapter(new GridAdapter());\n * ```\n *\n * ## Declarative usage with TbwGrid:\n *\n * ```vue\n * <TbwGrid :rows=\"data\" :grid-config=\"config\">\n * <TbwGridColumn field=\"status\">\n * <template #cell=\"{ value, row }\">\n * <StatusBadge :value=\"value\" />\n * </template>\n * </TbwGridColumn>\n * </TbwGrid>\n * ```\n */\nexport class GridAdapter implements FrameworkAdapter {\n private mountedViews: MountedView[] = [];\n /** Editor-specific views tracked separately for per-cell cleanup via releaseCell. */\n private editorViews: MountedView[] = [];\n private typeDefaults: TypeDefaultsMap | null = null;\n\n // #region Config Processing\n\n /**\n * Processes a Vue grid configuration, converting Vue component references\n * and VNode-returning render functions to DOM-returning functions.\n *\n * This is idempotent — already-processed configs pass through safely.\n *\n * @example\n * ```ts\n * import { GridAdapter, type GridConfig } from '@toolbox-web/grid-vue';\n * import StatusBadge from './StatusBadge.vue';\n *\n * const config: GridConfig<Employee> = {\n * columns: [\n * { field: 'status', renderer: StatusBadge },\n * ],\n * };\n *\n * const adapter = new GridAdapter();\n * const processedConfig = adapter.processGridConfig(config);\n * ```\n *\n * @param config - Vue grid config with possible component/VNode references\n * @returns Processed config with DOM-returning functions\n */\n processGridConfig<TRow = unknown>(config: GridConfig<TRow>): BaseGridConfig<TRow> {\n return this.processConfig(config as BaseGridConfig<TRow>);\n }\n\n /**\n * FrameworkAdapter.processConfig implementation.\n * Called automatically by the grid's `set gridConfig` setter.\n */\n processConfig<TRow = unknown>(config: BaseGridConfig<TRow>): BaseGridConfig<TRow> {\n // Cast to Vue's extended GridConfig since the config may contain\n // Vue component classes or VNode-returning functions at runtime\n const vueConfig = config as unknown as GridConfig<TRow>;\n const result = { ...vueConfig };\n\n // Process columns\n if (vueConfig.columns) {\n (result as BaseGridConfig<TRow>).columns = vueConfig.columns.map((col) => this.processColumn(col));\n }\n\n // Process typeDefaults\n if (vueConfig.typeDefaults) {\n result.typeDefaults = this.processTypeDefaults(vueConfig.typeDefaults as Record<string, TypeDefault>) as Record<\n string,\n BaseTypeDefault<TRow>\n >;\n }\n\n // Process loadingRenderer - convert Vue component/VNode to DOM-returning function\n if (vueConfig.loadingRenderer) {\n if (isVueComponent(vueConfig.loadingRenderer)) {\n (result as BaseGridConfig<TRow>).loadingRenderer = this.createComponentLoadingRenderer(\n vueConfig.loadingRenderer as unknown as Component,\n ) as unknown as BaseGridConfig<TRow>['loadingRenderer'];\n } else if (isVNodeRenderFunction(vueConfig.loadingRenderer)) {\n (result as BaseGridConfig<TRow>).loadingRenderer = this.createVNodeLoadingRenderer(\n vueConfig.loadingRenderer as unknown as (ctx: LoadingContext) => VNode,\n ) as unknown as BaseGridConfig<TRow>['loadingRenderer'];\n }\n }\n\n return result as BaseGridConfig<TRow>;\n }\n\n /**\n * Processes typeDefaults, converting Vue component/VNode references\n * to DOM-returning functions.\n *\n * @param typeDefaults - Vue type defaults with possible component references\n * @returns Processed TypeDefault record\n */\n processTypeDefaults<TRow = unknown>(\n typeDefaults: Record<string, TypeDefault<TRow>>,\n ): Record<string, BaseTypeDefault<TRow>> {\n const processed: Record<string, BaseTypeDefault<TRow>> = {};\n\n for (const [type, config] of Object.entries(typeDefaults)) {\n const processedConfig: BaseTypeDefault<TRow> = {\n editorParams: config.editorParams,\n };\n\n if (config.renderer) {\n if (isVueComponent(config.renderer)) {\n processedConfig.renderer = this.createConfigComponentRenderer(config.renderer as Component);\n } else if (isVNodeRenderFunction(config.renderer)) {\n processedConfig.renderer = this.createTypeRenderer(\n config.renderer as (ctx: CellRenderContext<TRow>) => VNode,\n );\n }\n }\n\n if (config.editor) {\n if (isVueComponent(config.editor)) {\n processedConfig.editor = this.createConfigComponentEditor(\n config.editor as Component,\n ) as BaseTypeDefault['editor'];\n } else if (isVNodeRenderFunction(config.editor)) {\n processedConfig.editor = this.createTypeEditor(\n config.editor as (ctx: ColumnEditorContext<TRow>) => VNode,\n ) as BaseTypeDefault['editor'];\n }\n }\n\n if (config.filterPanelRenderer) {\n processedConfig.filterPanelRenderer = this.createFilterPanelRenderer(config.filterPanelRenderer);\n }\n\n processed[type] = processedConfig;\n }\n\n return processed;\n }\n\n /**\n * Processes a single column configuration, converting Vue component references\n * and VNode-returning render functions to DOM-returning functions.\n *\n * @param column - Vue column config\n * @returns Processed ColumnConfig with DOM-returning functions\n */\n processColumn<TRow = unknown>(column: ColumnConfig<TRow>): BaseColumnConfig<TRow> {\n const processed = { ...column } as BaseColumnConfig<TRow>;\n\n if (column.renderer && !(column.renderer as unknown as Record<symbol, unknown>)[PROCESSED_MARKER]) {\n if (isVueComponent(column.renderer)) {\n const wrapped = this.createConfigComponentRenderer(column.renderer as Component);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.renderer = wrapped as BaseColumnConfig<TRow>['renderer'];\n } else if (isVNodeRenderFunction(column.renderer)) {\n const wrapped = this.createConfigVNodeRenderer(column.renderer as (ctx: CellRenderContext<TRow>) => VNode);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.renderer = wrapped as BaseColumnConfig<TRow>['renderer'];\n }\n }\n\n if (column.editor && !(column.editor as unknown as Record<symbol, unknown>)[PROCESSED_MARKER]) {\n if (isVueComponent(column.editor)) {\n const wrapped = this.createConfigComponentEditor(column.editor as Component);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.editor = wrapped as BaseColumnConfig<TRow>['editor'];\n } else if (isVNodeRenderFunction(column.editor)) {\n const wrapped = this.createConfigVNodeEditor(column.editor as (ctx: ColumnEditorContext<TRow>) => VNode);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.editor = wrapped as BaseColumnConfig<TRow>['editor'];\n }\n }\n\n if (column.headerRenderer && !(column.headerRenderer as unknown as Record<symbol, unknown>)[PROCESSED_MARKER]) {\n if (isVueComponent(column.headerRenderer)) {\n const wrapped = this.createConfigComponentHeaderRenderer(column.headerRenderer as Component);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.headerRenderer = wrapped as any;\n } else if (isVNodeRenderFunction(column.headerRenderer)) {\n const wrapped = this.createConfigVNodeHeaderRenderer(\n column.headerRenderer as (ctx: HeaderCellContext<TRow>) => VNode,\n );\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.headerRenderer = wrapped as any;\n }\n }\n\n if (\n column.headerLabelRenderer &&\n !(column.headerLabelRenderer as unknown as Record<symbol, unknown>)[PROCESSED_MARKER]\n ) {\n if (isVueComponent(column.headerLabelRenderer)) {\n const wrapped = this.createConfigComponentHeaderLabelRenderer(column.headerLabelRenderer as Component);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.headerLabelRenderer = wrapped as any;\n } else if (isVNodeRenderFunction(column.headerLabelRenderer)) {\n const wrapped = this.createConfigVNodeHeaderLabelRenderer(\n column.headerLabelRenderer as (ctx: HeaderLabelContext<TRow>) => VNode,\n );\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.headerLabelRenderer = wrapped as any;\n }\n }\n\n return processed;\n }\n\n /**\n * Creates a DOM-returning renderer from a Vue component class.\n * Used for config-based renderers (not slot-based).\n * @internal\n */\n private createConfigComponentRenderer<TRow = unknown, TValue = unknown>(\n component: Component,\n ): ColumnViewRenderer<TRow, TValue> {\n const cellCache = new WeakMap<HTMLElement, CellAppCache>();\n\n return (ctx: CellRenderContext<TRow, TValue>) => {\n const cellEl = (ctx as any).cellEl as HTMLElement | undefined;\n\n if (cellEl) {\n const cached = cellCache.get(cellEl);\n if (cached) {\n cached.update(ctx as CellRenderContext<unknown, unknown>);\n return cached.container;\n }\n\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n let currentCtx = ctx as CellRenderContext<unknown, unknown>;\n const comp = component;\n\n const app = createApp({\n render() {\n return createVNode(comp, { ...currentCtx });\n },\n });\n\n app.mount(container);\n\n cellCache.set(cellEl, {\n app,\n container,\n update: (newCtx) => {\n currentCtx = newCtx;\n app._instance?.update();\n },\n });\n\n return container;\n }\n\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n const comp = component;\n const app = createApp({\n render() {\n return createVNode(comp, { ...ctx });\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning renderer from a VNode-returning render function.\n * Used for config-based renderers (not slot-based).\n * @internal\n */\n private createConfigVNodeRenderer<TRow = unknown, TValue = unknown>(\n renderFn: (ctx: CellRenderContext<TRow, TValue>) => VNode,\n ): ColumnViewRenderer<TRow, TValue> {\n const cellCache = new WeakMap<HTMLElement, CellAppCache>();\n\n return (ctx: CellRenderContext<TRow, TValue>) => {\n const cellEl = (ctx as any).cellEl as HTMLElement | undefined;\n\n if (cellEl) {\n const cached = cellCache.get(cellEl);\n if (cached) {\n cached.update(ctx as CellRenderContext<unknown, unknown>);\n return cached.container;\n }\n\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n let currentCtx = ctx as CellRenderContext<unknown, unknown>;\n\n const app = createApp({\n render() {\n return renderFn(currentCtx as CellRenderContext<TRow, TValue>);\n },\n });\n\n app.mount(container);\n\n cellCache.set(cellEl, {\n app,\n container,\n update: (newCtx) => {\n currentCtx = newCtx;\n app._instance?.update();\n },\n });\n\n return container;\n }\n\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning editor from a Vue component class.\n * Used for config-based editors (not slot-based).\n * @internal\n */\n private createConfigComponentEditor<TRow = unknown, TValue = unknown>(\n component: Component,\n ): ColumnEditorSpec<TRow, TValue> {\n return (ctx: ColumnEditorContext<TRow, TValue>): HTMLElement => {\n const container = document.createElement('div');\n container.className = 'vue-cell-editor';\n container.style.display = 'contents';\n\n const comp = component;\n const app = createApp({\n render() {\n return createVNode(comp, { ...ctx });\n },\n });\n\n app.mount(container);\n // Track in editor-specific array for per-cell cleanup via releaseCell\n this.editorViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning editor from a VNode-returning render function.\n * Used for config-based editors (not slot-based).\n * @internal\n */\n private createConfigVNodeEditor<TRow = unknown, TValue = unknown>(\n renderFn: (ctx: ColumnEditorContext<TRow, TValue>) => VNode,\n ): ColumnEditorSpec<TRow, TValue> {\n return (ctx: ColumnEditorContext<TRow, TValue>): HTMLElement => {\n const container = document.createElement('div');\n container.className = 'vue-cell-editor';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n // Track in editor-specific array for per-cell cleanup via releaseCell\n this.editorViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning header renderer from a Vue component class.\n * Used for config-based headerRenderer (not slot-based).\n * @internal\n */\n private createConfigComponentHeaderRenderer<TRow = unknown>(\n component: Component,\n ): (ctx: HeaderCellContext<TRow>) => HTMLElement {\n return (ctx: HeaderCellContext<TRow>) => {\n const container = document.createElement('div');\n container.className = 'vue-header-renderer';\n container.style.display = 'contents';\n\n const comp = component;\n const app = createApp({\n render() {\n return createVNode(comp, {\n column: ctx.column,\n value: ctx.value,\n sortState: ctx.sortState,\n filterActive: ctx.filterActive,\n renderSortIcon: ctx.renderSortIcon,\n renderFilterButton: ctx.renderFilterButton,\n });\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning header renderer from a VNode-returning render function.\n * Used for config-based headerRenderer (not slot-based).\n * @internal\n */\n private createConfigVNodeHeaderRenderer<TRow = unknown>(\n renderFn: (ctx: HeaderCellContext<TRow>) => VNode,\n ): (ctx: HeaderCellContext<TRow>) => HTMLElement {\n return (ctx: HeaderCellContext<TRow>) => {\n const container = document.createElement('div');\n container.className = 'vue-header-renderer';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning header label renderer from a Vue component class.\n * Used for config-based headerLabelRenderer (not slot-based).\n * @internal\n */\n private createConfigComponentHeaderLabelRenderer<TRow = unknown>(\n component: Component,\n ): (ctx: HeaderLabelContext<TRow>) => HTMLElement {\n return (ctx: HeaderLabelContext<TRow>) => {\n const container = document.createElement('div');\n container.className = 'vue-header-label-renderer';\n container.style.display = 'contents';\n\n const comp = component;\n const app = createApp({\n render() {\n return createVNode(comp, {\n column: ctx.column,\n value: ctx.value,\n });\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning header label renderer from a VNode-returning render function.\n * Used for config-based headerLabelRenderer (not slot-based).\n * @internal\n */\n private createConfigVNodeHeaderLabelRenderer<TRow = unknown>(\n renderFn: (ctx: HeaderLabelContext<TRow>) => VNode,\n ): (ctx: HeaderLabelContext<TRow>) => HTMLElement {\n return (ctx: HeaderLabelContext<TRow>) => {\n const container = document.createElement('div');\n container.className = 'vue-header-label-renderer';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning loading renderer from a Vue component class.\n * @internal\n */\n private createComponentLoadingRenderer(component: Component): (ctx: LoadingContext) => HTMLElement {\n return (ctx: LoadingContext) => {\n const container = document.createElement('div');\n container.className = 'vue-loading-renderer';\n container.style.display = 'contents';\n\n const comp = component;\n const app = createApp({\n render() {\n return createVNode(comp, { size: ctx.size });\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning loading renderer from a VNode-returning render function.\n * @internal\n */\n private createVNodeLoadingRenderer(renderFn: (ctx: LoadingContext) => VNode): (ctx: LoadingContext) => HTMLElement {\n return (ctx: LoadingContext) => {\n const container = document.createElement('div');\n container.className = 'vue-loading-renderer';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n // #endregion\n\n /**\n * Sets the type defaults map for this adapter.\n * Called by TbwGrid when it receives type defaults from context.\n *\n * @internal\n */\n setTypeDefaults(defaults: TypeDefaultsMap | null): void {\n this.typeDefaults = defaults;\n }\n\n /**\n * Determines if this adapter can handle the given element.\n * Checks if a renderer or editor is registered for this element.\n */\n canHandle(element: HTMLElement): boolean {\n const field = element.getAttribute('field');\n let registry = columnRegistries.get(element);\n\n // If not found in WeakMap, try field-based lookup\n if (!registry && field) {\n const fieldRegistry = fieldRegistries.get(field);\n if (fieldRegistry && (fieldRegistry.renderer || fieldRegistry.editor)) {\n registry = fieldRegistry;\n columnRegistries.set(element, registry);\n }\n }\n\n const hasRenderer = registry?.renderer !== undefined;\n const hasEditor = registry?.editor !== undefined;\n return registry !== undefined && (hasRenderer || hasEditor);\n }\n\n /**\n * Creates a view renderer function that renders a Vue component\n * and returns its container DOM element.\n */\n createRenderer<TRow = unknown, TValue = unknown>(element: HTMLElement): ColumnViewRenderer<TRow, TValue> | undefined {\n const renderFn = getColumnRenderer(element);\n\n if (!renderFn) {\n return undefined;\n }\n\n // Cell cache for this field - maps cell element to its Vue app\n const cellCache = new WeakMap<HTMLElement, CellAppCache>();\n\n return (ctx: CellRenderContext<TRow, TValue>) => {\n const cellEl = (ctx as any).cellEl as HTMLElement | undefined;\n\n if (cellEl) {\n // Check if we have a cached app for this cell\n const cached = cellCache.get(cellEl);\n if (cached) {\n // Update the existing app with new context\n cached.update(ctx as CellRenderContext<unknown, unknown>);\n return cached.container;\n }\n\n // Create new container and Vue app for this cell\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n // Create reactive context that can be updated\n let currentCtx = ctx as CellRenderContext<unknown, unknown>;\n\n const app = createApp({\n render() {\n return renderFn(currentCtx);\n },\n });\n\n app.mount(container);\n\n // Store in cache with update function\n cellCache.set(cellEl, {\n app,\n container,\n update: (newCtx) => {\n currentCtx = newCtx;\n // Force re-render\n app._instance?.update();\n },\n });\n\n return container;\n }\n\n // Fallback: create container without caching\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx as CellRenderContext<unknown, unknown>);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates an editor spec that renders a Vue component for cell editing.\n * Returns a function that creates the editor DOM element.\n */\n createEditor<TRow = unknown, TValue = unknown>(element: HTMLElement): ColumnEditorSpec<TRow, TValue> | undefined {\n const editorFn = getColumnEditor(element);\n\n if (!editorFn) {\n return undefined;\n }\n\n // Return a function that creates the editor element\n return (ctx: ColumnEditorContext<TRow, TValue>): HTMLElement => {\n const container = document.createElement('div');\n container.className = 'vue-cell-editor';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return editorFn(ctx as ColumnEditorContext<unknown, unknown>);\n },\n });\n\n app.mount(container);\n // Track in editor-specific array for per-cell cleanup via releaseCell\n this.editorViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Framework adapter hook called by MasterDetailPlugin during attach().\n * Parses the <tbw-grid-detail> element and returns a Vue-based renderer.\n */\n parseDetailElement<TRow = unknown>(\n detailElement: Element,\n ): ((row: TRow, rowIndex: number) => HTMLElement) | undefined {\n const gridElement = detailElement.closest('tbw-grid') as HTMLElement | null;\n if (!gridElement) return undefined;\n\n // Get renderer from registry (registered by TbwGridDetailPanel)\n const detailEl = gridElement.querySelector('tbw-grid-detail') as HTMLElement | null;\n if (!detailEl) return undefined;\n\n const renderFn = detailRegistry.get(detailEl);\n if (!renderFn) return undefined;\n\n return (row: TRow, rowIndex: number): HTMLElement => {\n const container = document.createElement('div');\n container.className = 'vue-detail-panel';\n\n const ctx: DetailPanelContext<TRow> = { row, rowIndex };\n const vnodes = renderFn(ctx as DetailPanelContext<unknown>);\n\n if (vnodes && vnodes.length > 0) {\n // Render VNodes into container\n const app = createApp({\n render() {\n return vnodes;\n },\n });\n app.mount(container);\n this.mountedViews.push({ app, container });\n }\n\n return container;\n };\n }\n\n /**\n * Framework adapter hook called by ResponsivePlugin during attach().\n * Parses the <tbw-grid-responsive-card> element and returns a Vue-based renderer.\n */\n parseResponsiveCardElement<TRow = unknown>(\n cardElement: Element,\n ): ((row: TRow, rowIndex: number) => HTMLElement) | undefined {\n const gridElement = cardElement.closest('tbw-grid') as HTMLElement | null;\n if (!gridElement) return undefined;\n\n // Get renderer from registry (registered by TbwGridResponsiveCard)\n const cardEl = gridElement.querySelector('tbw-grid-responsive-card') as HTMLElement | null;\n if (!cardEl) return undefined;\n\n const renderFn = cardRegistry.get(cardEl);\n if (!renderFn) return undefined;\n\n return (row: TRow, rowIndex: number): HTMLElement => {\n const container = document.createElement('div');\n container.className = 'vue-responsive-card';\n\n const ctx: ResponsiveCardContext<TRow> = { row, rowIndex };\n const vnodes = renderFn(ctx as ResponsiveCardContext<unknown>);\n\n if (vnodes && vnodes.length > 0) {\n // Render VNodes into container\n const app = createApp({\n render() {\n return vnodes;\n },\n });\n app.mount(container);\n this.mountedViews.push({ app, container });\n }\n\n return container;\n };\n }\n\n // #region Type Defaults Support\n\n /**\n * Gets type-level defaults from the type defaults map.\n *\n * This enables application-wide type defaults configured via GridTypeProvider.\n * The returned TypeDefault contains renderer/editor functions that render\n * Vue components into the grid's cells.\n *\n * @example\n * ```vue\n * <script setup>\n * import { GridTypeProvider } from '@toolbox-web/grid-vue';\n * import { h } from 'vue';\n * import CountryBadge from './CountryBadge.vue';\n *\n * const typeDefaults = {\n * country: {\n * renderer: (ctx) => h(CountryBadge, { code: ctx.value }),\n * },\n * };\n * </script>\n *\n * <template>\n * <GridTypeProvider :defaults=\"typeDefaults\">\n * <App />\n * </GridTypeProvider>\n * </template>\n * ```\n */\n getTypeDefault<TRow = unknown>(type: string): BaseTypeDefault<TRow> | undefined {\n if (!this.typeDefaults) {\n return undefined;\n }\n\n const vueDefault = this.typeDefaults[type] as TypeDefault<TRow> | undefined;\n if (!vueDefault) {\n return undefined;\n }\n\n const typeDefault: BaseTypeDefault<TRow> = {\n editorParams: vueDefault.editorParams,\n };\n\n // Create renderer function that renders Vue component\n if (vueDefault.renderer) {\n typeDefault.renderer = this.createTypeRenderer<TRow>(vueDefault.renderer);\n }\n\n // Create editor function that renders Vue component\n if (vueDefault.editor) {\n typeDefault.editor = this.createTypeEditor<TRow>(vueDefault.editor) as BaseTypeDefault['editor'];\n }\n\n // Create filterPanelRenderer function that renders Vue component\n if (vueDefault.filterPanelRenderer) {\n typeDefault.filterPanelRenderer = this.createFilterPanelRenderer(vueDefault.filterPanelRenderer);\n }\n\n return typeDefault;\n }\n\n /**\n * Creates a renderer function from a Vue render function for type defaults.\n * @internal\n */\n private createTypeRenderer<TRow = unknown, TValue = unknown>(\n renderFn: (ctx: CellRenderContext<TRow, TValue>) => VNode,\n ): ColumnViewRenderer<TRow, TValue> {\n return (ctx: CellRenderContext<TRow, TValue>) => {\n const container = document.createElement('span');\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates an editor function from a Vue render function for type defaults.\n * @internal\n */\n private createTypeEditor<TRow = unknown, TValue = unknown>(\n renderFn: (ctx: ColumnEditorContext<TRow, TValue>) => VNode,\n ): ColumnEditorSpec<TRow, TValue> {\n return (ctx: ColumnEditorContext<TRow, TValue>) => {\n const container = document.createElement('span');\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n // Track in editor-specific array for per-cell cleanup via releaseCell\n this.editorViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a filter panel renderer function from a Vue render function.\n *\n * Wraps a Vue `(params: FilterPanelParams) => VNode` function into the\n * imperative `(container, params) => void` signature expected by the core grid.\n * @internal\n */\n private createFilterPanelRenderer(\n renderFn: (params: FilterPanelParams) => VNode,\n ): (container: HTMLElement, params: FilterPanelParams) => void {\n return (container: HTMLElement, params: FilterPanelParams) => {\n const wrapper = document.createElement('div');\n wrapper.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(params);\n },\n });\n\n app.mount(wrapper);\n this.mountedViews.push({ app, container: wrapper });\n container.appendChild(wrapper);\n };\n }\n\n // #endregion\n\n /**\n * Cleanup all mounted Vue apps.\n */\n cleanup(): void {\n for (const { app, container } of this.mountedViews) {\n try {\n app.unmount();\n container.remove();\n } catch {\n // Ignore cleanup errors\n }\n }\n this.mountedViews = [];\n for (const { app, container } of this.editorViews) {\n try {\n app.unmount();\n container.remove();\n } catch {\n // Ignore cleanup errors\n }\n }\n this.editorViews = [];\n }\n\n /**\n * Unmount a specific container (e.g., detail panel, tool panel).\n * Finds the matching entry in mountedViews by container reference\n * and properly destroys the Vue app to prevent memory leaks.\n */\n unmount(container: HTMLElement): void {\n for (let i = this.mountedViews.length - 1; i >= 0; i--) {\n const view = this.mountedViews[i];\n if (view.container === container || container.contains(view.container)) {\n try {\n view.app.unmount();\n } catch {\n // Ignore cleanup errors\n }\n this.mountedViews.splice(i, 1);\n return;\n }\n }\n }\n\n /**\n * Called when a cell's content is about to be wiped.\n * Destroys editor Vue apps whose container is inside the cell.\n */\n releaseCell(cellEl: HTMLElement): void {\n for (let i = this.editorViews.length - 1; i >= 0; i--) {\n const { app, container } = this.editorViews[i];\n if (cellEl.contains(container)) {\n try {\n app.unmount();\n container.remove();\n } catch {\n // Ignore cleanup errors\n }\n this.editorViews.splice(i, 1);\n }\n }\n }\n}\n\n/**\n * @deprecated Use `GridAdapter` instead. This alias will be removed in v2.\n * @see {@link GridAdapter}\n */\nexport const VueGridAdapter = GridAdapter;\n","<script setup lang=\"ts\" generic=\"TRow = unknown\">\nimport type { BaseGridPlugin, ColumnConfig, DataGridElement, FitMode, GridConfig } from '@toolbox-web/grid';\nimport { DataGridElement as GridElement } from '@toolbox-web/grid';\nimport type {\n CellActivateDetail,\n CellChangeDetail,\n CellClickDetail,\n CellCommitDetail,\n ClipboardConfig,\n ColumnMoveDetail,\n ColumnResizeDetail,\n ColumnVirtualizationConfig,\n ColumnVisibilityDetail,\n ContextMenuConfig,\n CopyDetail,\n DetailExpandDetail,\n ExportCompleteDetail,\n ExportConfig,\n FilterChangeDetail,\n FilterConfig,\n GridColumnState,\n GroupingColumnsConfig,\n GroupingRowsConfig,\n GroupToggleDetail,\n MasterDetailConfig,\n MultiSortConfig,\n PasteDetail,\n PinnedRowsConfig,\n PivotConfig,\n PrintCompleteDetail,\n PrintConfig,\n PrintStartDetail,\n ReorderConfig,\n ResponsiveChangeDetail,\n ResponsivePluginConfig,\n RowClickDetail,\n RowCommitDetail,\n RowMoveDetail,\n RowReorderConfig,\n SelectionChangeDetail,\n SelectionConfig,\n ServerSideConfig,\n SortChangeDetail,\n TreeConfig,\n TreeExpandDetail,\n UndoRedoConfig,\n UndoRedoDetail,\n VisibilityConfig,\n} from '@toolbox-web/grid/all';\nimport { computed, onBeforeUnmount, onMounted, provide, ref, watch, type PropType } from 'vue';\nimport { createPluginFromFeature, type FeatureName } from './feature-registry';\nimport { useGridIcons } from './grid-icon-registry';\nimport { useGridTypeDefaults } from './grid-type-registry';\nimport { GRID_ELEMENT_KEY } from './use-grid';\nimport { GridAdapter, VueGridAdapter } from './vue-grid-adapter';\n\n// Track if adapter is registered\nlet adapterRegistered = false;\nlet globalAdapter: GridAdapter | null = null;\n\n/**\n * Ensure the Vue adapter is registered globally.\n */\nfunction ensureAdapterRegistered(): GridAdapter {\n if (!adapterRegistered) {\n globalAdapter = new VueGridAdapter();\n GridElement.registerAdapter(globalAdapter);\n adapterRegistered = true;\n }\n return globalAdapter as GridAdapter;\n}\n\n// Register adapter at module load\nensureAdapterRegistered();\n\n/**\n * Props for TbwGrid component\n */\nconst props = defineProps({\n /** Row data to display */\n rows: {\n type: Array as PropType<TRow[]>,\n default: () => [],\n },\n /** Column definitions (shorthand for gridConfig.columns) */\n columns: {\n type: Array as PropType<ColumnConfig<TRow>[]>,\n default: undefined,\n },\n /** Full grid configuration */\n gridConfig: {\n type: Object as PropType<GridConfig<TRow>>,\n default: undefined,\n },\n /** Fit mode shorthand */\n fitMode: {\n type: String as PropType<FitMode>,\n default: undefined,\n },\n\n // ═══════════════════════════════════════════════════════════════════\n // FEATURE PROPS - Declarative plugin configuration\n // ═══════════════════════════════════════════════════════════════════\n\n /** Enable cell/row/range selection */\n selection: {\n type: [String, Object] as PropType<'cell' | 'row' | 'range' | SelectionConfig<TRow>>,\n default: undefined,\n },\n /** Enable inline cell editing */\n editing: {\n type: [Boolean, String] as PropType<boolean | 'click' | 'dblclick' | 'manual'>,\n default: undefined,\n },\n /** Enable clipboard copy/paste */\n clipboard: {\n type: [Boolean, Object] as PropType<boolean | ClipboardConfig>,\n default: undefined,\n },\n /** Enable right-click context menu */\n contextMenu: {\n type: [Boolean, Object] as PropType<boolean | ContextMenuConfig>,\n default: undefined,\n },\n /** Enable multi-column sorting */\n multiSort: {\n type: [Boolean, String, Object] as PropType<boolean | 'single' | 'multi' | MultiSortConfig>,\n default: undefined,\n },\n /** @deprecated Use multiSort instead. Will be removed in v2. */\n sorting: {\n type: [Boolean, String, Object] as PropType<boolean | 'single' | 'multi' | MultiSortConfig>,\n default: undefined,\n },\n /** Enable column filtering */\n filtering: {\n type: [Boolean, Object] as PropType<boolean | FilterConfig<TRow>>,\n default: undefined,\n },\n /** Enable column drag-to-reorder */\n reorderColumns: {\n type: [Boolean, Object] as PropType<boolean | ReorderConfig>,\n default: undefined,\n },\n /** @deprecated Use `reorderColumns` instead. Will be removed in v2. */\n reorder: {\n type: [Boolean, Object] as PropType<boolean | ReorderConfig>,\n default: undefined,\n },\n /** Enable column visibility toggle panel */\n visibility: {\n type: [Boolean, Object] as PropType<boolean | VisibilityConfig>,\n default: undefined,\n },\n /** Enable pinned/sticky columns */\n pinnedColumns: {\n type: Boolean as PropType<boolean>,\n default: undefined,\n },\n /** Enable multi-level column headers */\n groupingColumns: {\n type: [Boolean, Object] as PropType<boolean | GroupingColumnsConfig>,\n default: undefined,\n },\n /** Enable horizontal column virtualization */\n columnVirtualization: {\n type: [Boolean, Object] as PropType<boolean | ColumnVirtualizationConfig>,\n default: undefined,\n },\n /** Enable row drag-to-reorder */\n reorderRows: {\n type: [Boolean, Object] as PropType<boolean | RowReorderConfig>,\n default: undefined,\n },\n /** @deprecated Use `reorderRows` instead. Will be removed in v2. */\n rowReorder: {\n type: [Boolean, Object] as PropType<boolean | RowReorderConfig>,\n default: undefined,\n },\n /** Enable row grouping by field values */\n groupingRows: {\n type: Object as PropType<GroupingRowsConfig>,\n default: undefined,\n },\n /** Enable pinned rows */\n pinnedRows: {\n type: [Boolean, Object] as PropType<boolean | PinnedRowsConfig>,\n default: undefined,\n },\n /** Enable hierarchical tree view */\n tree: {\n type: [Boolean, Object] as PropType<boolean | TreeConfig>,\n default: undefined,\n },\n /** Enable master-detail expandable rows */\n masterDetail: {\n type: Object as PropType<MasterDetailConfig>,\n default: undefined,\n },\n /** Enable responsive card layout */\n responsive: {\n type: [Boolean, Object] as PropType<boolean | ResponsivePluginConfig>,\n default: undefined,\n },\n /** Enable undo/redo for cell edits */\n undoRedo: {\n type: [Boolean, Object] as PropType<boolean | UndoRedoConfig>,\n default: undefined,\n },\n /** Enable CSV/JSON export */\n export: {\n type: [Boolean, Object] as PropType<boolean | ExportConfig>,\n default: undefined,\n },\n /** Enable print functionality */\n print: {\n type: [Boolean, Object] as PropType<boolean | PrintConfig>,\n default: undefined,\n },\n /** Enable pivot table functionality */\n pivot: {\n type: Object as PropType<PivotConfig>,\n default: undefined,\n },\n /** Enable server-side data operations */\n serverSide: {\n type: Object as PropType<ServerSideConfig>,\n default: undefined,\n },\n});\n\n/**\n * Event name → CustomEvent detail type map.\n * Used internally to wire up event listeners.\n */\nconst EVENT_MAP = {\n 'cell-click': '' as unknown as CellClickDetail,\n 'row-click': '' as unknown as RowClickDetail,\n 'cell-activate': '' as unknown as CellActivateDetail,\n 'cell-change': '' as unknown as CellChangeDetail,\n 'cell-commit': '' as unknown as CellCommitDetail,\n 'row-commit': '' as unknown as RowCommitDetail,\n 'sort-change': '' as unknown as SortChangeDetail,\n 'filter-change': '' as unknown as FilterChangeDetail,\n 'column-resize': '' as unknown as ColumnResizeDetail,\n 'column-move': '' as unknown as ColumnMoveDetail,\n 'column-visibility': '' as unknown as ColumnVisibilityDetail,\n 'column-state-change': '' as unknown as GridColumnState,\n 'selection-change': '' as unknown as SelectionChangeDetail,\n 'row-move': '' as unknown as RowMoveDetail,\n 'group-toggle': '' as unknown as GroupToggleDetail,\n 'tree-expand': '' as unknown as TreeExpandDetail,\n 'detail-expand': '' as unknown as DetailExpandDetail,\n 'responsive-change': '' as unknown as ResponsiveChangeDetail,\n copy: '' as unknown as CopyDetail,\n paste: '' as unknown as PasteDetail,\n 'undo-redo': '' as unknown as UndoRedoDetail,\n 'export-complete': '' as unknown as ExportCompleteDetail,\n 'print-start': '' as unknown as PrintStartDetail,\n 'print-complete': '' as unknown as PrintCompleteDetail,\n} as const;\n\n/**\n * Emits for TbwGrid — all grid events forwarded as Vue emits.\n */\nconst emit = defineEmits<{\n (e: 'cell-click', event: CustomEvent<CellClickDetail<TRow>>): void;\n (e: 'row-click', event: CustomEvent<RowClickDetail<TRow>>): void;\n (e: 'cell-activate', event: CustomEvent<CellActivateDetail<TRow>>): void;\n (e: 'cell-change', event: CustomEvent<CellChangeDetail<TRow>>): void;\n (e: 'cell-commit', event: CustomEvent<CellCommitDetail<TRow>>): void;\n (e: 'row-commit', event: CustomEvent<RowCommitDetail<TRow>>): void;\n (e: 'sort-change', event: CustomEvent<SortChangeDetail>): void;\n (e: 'filter-change', event: CustomEvent<FilterChangeDetail>): void;\n (e: 'column-resize', event: CustomEvent<ColumnResizeDetail>): void;\n (e: 'column-move', event: CustomEvent<ColumnMoveDetail>): void;\n (e: 'column-visibility', event: CustomEvent<ColumnVisibilityDetail>): void;\n (e: 'column-state-change', event: CustomEvent<GridColumnState>): void;\n (e: 'selection-change', event: CustomEvent<SelectionChangeDetail>): void;\n (e: 'row-move', event: CustomEvent<RowMoveDetail<TRow>>): void;\n (e: 'group-toggle', event: CustomEvent<GroupToggleDetail>): void;\n (e: 'tree-expand', event: CustomEvent<TreeExpandDetail<TRow>>): void;\n (e: 'detail-expand', event: CustomEvent<DetailExpandDetail>): void;\n (e: 'responsive-change', event: CustomEvent<ResponsiveChangeDetail>): void;\n (e: 'copy', event: CustomEvent<CopyDetail>): void;\n (e: 'paste', event: CustomEvent<PasteDetail>): void;\n (e: 'undo-redo', event: CustomEvent<UndoRedoDetail>): void;\n (e: 'export-complete', event: CustomEvent<ExportCompleteDetail>): void;\n (e: 'print-start', event: CustomEvent<PrintStartDetail>): void;\n (e: 'print-complete', event: CustomEvent<PrintCompleteDetail>): void;\n}>();\n\n// Template ref for the grid element\nconst gridRef = ref<DataGridElement<TRow> | null>(null);\n\n// Provide grid element to descendants (for useGrid composable)\nprovide(GRID_ELEMENT_KEY, gridRef);\n\n// Get type defaults and icons from providers\nconst typeDefaults = useGridTypeDefaults();\nconst iconOverrides = useGridIcons();\n\n// Feature prop names for creating plugins\nconst FEATURE_PROPS: FeatureName[] = [\n 'selection',\n 'editing',\n 'clipboard',\n 'contextMenu',\n 'multiSort',\n 'sorting',\n 'filtering',\n 'reorderColumns',\n 'reorder', // deprecated alias for reorderColumns\n 'visibility',\n 'pinnedColumns',\n 'groupingColumns',\n 'columnVirtualization',\n 'reorderRows',\n 'rowReorder', // deprecated alias for reorderRows\n 'groupingRows',\n 'pinnedRows',\n 'tree',\n 'masterDetail',\n 'responsive',\n 'undoRedo',\n 'export',\n 'print',\n 'pivot',\n 'serverSide',\n];\n\n/**\n * Create plugins from feature props.\n */\nfunction createFeaturePlugins(): BaseGridPlugin[] {\n const plugins: BaseGridPlugin[] = [];\n\n for (const feature of FEATURE_PROPS) {\n const propValue = props[feature as keyof typeof props];\n if (propValue !== undefined) {\n const plugin = createPluginFromFeature(feature, propValue);\n if (plugin) {\n plugins.push(plugin as BaseGridPlugin);\n }\n }\n }\n\n return plugins;\n}\n\n// Merged config with feature plugins\nconst mergedConfig = computed<GridConfig<TRow> | undefined>(() => {\n const baseConfig = props.gridConfig ?? {};\n const featurePlugins = createFeaturePlugins();\n const configPlugins = (baseConfig.plugins as BaseGridPlugin[]) ?? [];\n\n // Merge: feature plugins first, then config plugins\n const mergedPlugins = [...featurePlugins, ...configPlugins];\n\n // Apply type defaults if provided\n const typeDefaults$ = typeDefaults;\n\n // Apply icon overrides if provided\n const icons = iconOverrides ? { ...baseConfig.icons, ...iconOverrides } : baseConfig.icons;\n\n return {\n ...baseConfig,\n ...(props.columns ? { columns: props.columns } : {}),\n ...(mergedPlugins.length > 0 ? { plugins: mergedPlugins } : {}),\n ...(icons ? { icons } : {}),\n } as GridConfig<TRow>;\n});\n\n// Unsubscribe functions for grid event listeners\nconst eventCleanups: (() => void)[] = [];\n\n// Setup and cleanup\nonMounted(() => {\n const grid = gridRef.value as unknown as HTMLElement & DataGridElement<TRow>;\n if (!grid) return;\n\n // Attach the framework adapter to the grid element\n // This enables MasterDetailPlugin and ResponsivePlugin to use Vue-based renderers\n const adapter = ensureAdapterRegistered();\n (grid as any).__frameworkAdapter = adapter;\n\n // Pass type defaults to the adapter\n adapter.setTypeDefaults(typeDefaults ?? null);\n\n // Subscribe to grid events and store unsubscribe functions\n // Subscribe to all grid events and forward as Vue emits\n for (const eventName of Object.keys(EVENT_MAP)) {\n eventCleanups.push(grid.on(eventName as string, (_d: unknown, e: CustomEvent) => emit(eventName as any, e)));\n }\n\n // Set initial data\n if (props.rows.length > 0) {\n grid.rows = props.rows;\n }\n if (mergedConfig.value) {\n // Process through adapter before passing to grid\n grid.gridConfig = mergedConfig.value;\n }\n if (props.fitMode) {\n grid.fitMode = props.fitMode;\n }\n});\n\nonBeforeUnmount(() => {\n const grid = gridRef.value as unknown as HTMLElement & DataGridElement<TRow>;\n if (!grid) return;\n\n // Unsubscribe all grid event listeners\n eventCleanups.forEach((fn) => fn());\n eventCleanups.length = 0;\n});\n\n// Watch for prop changes\nwatch(\n () => props.rows,\n (newRows) => {\n if (gridRef.value) {\n gridRef.value.rows = newRows;\n }\n },\n { deep: true },\n);\n\nwatch(\n mergedConfig,\n (newConfig) => {\n if (gridRef.value && newConfig) {\n gridRef.value.gridConfig = newConfig;\n }\n },\n { deep: true },\n);\n\nwatch(\n () => props.fitMode,\n (newFitMode) => {\n if (gridRef.value && newFitMode) {\n gridRef.value.fitMode = newFitMode;\n }\n },\n);\n\n// Watch for type defaults changes\nwatch(\n () => typeDefaults,\n (newTypeDefaults) => {\n const adapter = ensureAdapterRegistered();\n adapter.setTypeDefaults(newTypeDefaults ?? null);\n },\n { deep: true },\n);\n\n// Expose the grid element for programmatic access\ndefineExpose({\n /** The underlying grid element */\n gridElement: gridRef,\n /** Force a layout recalculation */\n forceLayout: () => gridRef.value?.forceLayout(),\n /** Get current grid configuration */\n getConfig: () => gridRef.value?.getConfig(),\n /** Wait for grid to be ready */\n ready: () => gridRef.value?.ready(),\n});\n</script>\n\n<template>\n <tbw-grid ref=\"gridRef\">\n <slot></slot>\n </tbw-grid>\n</template>\n","<script setup lang=\"ts\">\nimport type { CellRenderContext, ColumnEditorContext } from '@toolbox-web/grid';\nimport { h, onMounted, ref, type VNode } from 'vue';\nimport type { CellSlotProps, EditorSlotProps } from './slot-types';\nimport { registerColumnEditor, registerColumnRenderer } from './vue-grid-adapter';\n\n/**\n * Props for TbwGridColumn\n */\nconst props = defineProps<{\n /** Field path in the row object */\n field: string;\n /** Column header text */\n header?: string;\n /** Column width */\n width?: string | number;\n /** Minimum column width */\n minWidth?: string | number;\n /** Maximum column width */\n maxWidth?: string | number;\n /** Whether the column is sortable */\n sortable?: boolean;\n /** Whether the column is resizable */\n resizable?: boolean;\n /** Whether the column is editable */\n editable?: boolean;\n /** Data type for the column */\n type?: string;\n /** Column alignment */\n align?: 'left' | 'center' | 'right';\n /** Whether the column is hidden */\n hidden?: boolean;\n}>();\n\n// Define slots with proper typing and get the slots object\nconst slots = defineSlots<{\n /** Custom cell renderer slot */\n cell?: (props: CellSlotProps) => VNode[];\n /** Custom cell editor slot */\n editor?: (props: EditorSlotProps) => VNode[];\n}>();\n\n// Template ref for the column element\nconst columnRef = ref<HTMLElement | null>(null);\n\nonMounted(() => {\n const element = columnRef.value;\n if (!element) return;\n\n // Check if cell slot exists by trying to access it\n const hasCellSlot = !!slots.cell;\n const hasEditorSlot = !!slots.editor;\n\n // Register renderer if #cell slot is provided\n if (hasCellSlot) {\n registerColumnRenderer(element, (ctx: CellRenderContext<unknown, unknown>) => {\n const slotFn = slots.cell;\n if (!slotFn) return h('span');\n const slotContent = slotFn({\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n });\n // Return the VNode array wrapped in a div\n return h('div', { style: 'display: contents' }, slotContent);\n });\n }\n\n // Register editor if #editor slot is provided\n if (hasEditorSlot) {\n registerColumnEditor(element, (ctx: ColumnEditorContext<unknown, unknown>) => {\n const slotFn = slots.editor;\n if (!slotFn) return h('span');\n const slotContent = slotFn({\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n field: ctx.field,\n rowId: ctx.rowId ?? '',\n commit: ctx.commit,\n cancel: ctx.cancel,\n updateRow: ctx.updateRow,\n onValueChange: ctx.onValueChange,\n });\n return h('div', { style: 'display: contents' }, slotContent);\n });\n }\n});\n</script>\n\n<template>\n <tbw-grid-column\n ref=\"columnRef\"\n :field=\"field\"\n :header=\"header\"\n :width=\"width\"\n :min-width=\"minWidth\"\n :max-width=\"maxWidth\"\n :sortable=\"sortable\"\n :resizable=\"resizable\"\n :editable=\"editable\"\n :type=\"type\"\n :align=\"align\"\n :hidden=\"hidden\"\n >\n <!-- Hidden slot to capture slot definitions -->\n </tbw-grid-column>\n</template>\n","<script setup lang=\"ts\" generic=\"TRow = unknown\">\nimport { onMounted, ref, useSlots, type VNode } from 'vue';\nimport { detailRegistry, type DetailPanelContext } from './detail-panel-registry';\n\n/**\n * Props for TbwGridDetailPanel\n */\nconst props = withDefaults(\n defineProps<{\n /**\n * Whether to show the expand/collapse column.\n * @default true\n */\n showExpandColumn?: boolean;\n\n /**\n * Animation style for expand/collapse.\n * - 'slide': Smooth height animation (default)\n * - 'fade': Opacity transition\n * - false: No animation\n * @default 'slide'\n */\n animation?: 'slide' | 'fade' | false;\n }>(),\n {\n showExpandColumn: true,\n animation: 'slide',\n },\n);\n\n// Define slots with proper typing\ndefineSlots<{\n /** Detail panel content slot */\n default?: (props: DetailPanelContext<TRow>) => VNode[];\n}>();\n\n// Template ref for the detail element\nconst detailRef = ref<HTMLElement | null>(null);\nconst slots = useSlots();\n\nonMounted(() => {\n const element = detailRef.value;\n if (!element || !slots.default) return;\n\n // Register the slot renderer\n detailRegistry.set(element, (ctx: DetailPanelContext<unknown>) => {\n return slots.default?.(ctx as DetailPanelContext<TRow>);\n });\n});\n</script>\n\n<template>\n <tbw-grid-detail ref=\"detailRef\" :show-expand-column=\"showExpandColumn\" :animation=\"animation\" />\n</template>\n","<script setup lang=\"ts\" generic=\"TRow = unknown\">\nimport { onMounted, ref, useSlots, type VNode } from 'vue';\nimport { cardRegistry, type ResponsiveCardContext } from './responsive-card-registry';\n\n/**\n * Props for TbwGridResponsiveCard\n */\nconst props = defineProps<{\n // Currently no additional props needed\n}>();\n\n// Define slots with proper typing\ndefineSlots<{\n /** Card content slot */\n default?: (props: ResponsiveCardContext<TRow>) => VNode[];\n}>();\n\n// Template ref for the card element\nconst cardRef = ref<HTMLElement | null>(null);\nconst slots = useSlots();\n\nonMounted(() => {\n const element = cardRef.value;\n if (!element || !slots.default) return;\n\n // Register the slot renderer\n cardRegistry.set(element, (ctx: ResponsiveCardContext<unknown>) => {\n return slots.default?.(ctx as ResponsiveCardContext<TRow>);\n });\n});\n</script>\n\n<template>\n <tbw-grid-responsive-card ref=\"cardRef\" />\n</template>\n","<script setup lang=\"ts\">\nimport { type VNode } from 'vue';\n\n/**\n * Props for TbwGridToolButtons\n */\ndefineProps<{\n // Currently no additional props needed\n}>();\n\n// Define slots with proper typing\ndefineSlots<{\n /** Tool button content slot */\n default?: () => VNode[];\n}>();\n</script>\n\n<template>\n <tbw-grid-tool-buttons>\n <slot />\n </tbw-grid-tool-buttons>\n</template>\n","/**\n * Registry for tool panel renderers.\n * @internal\n */\nimport type { VNode } from 'vue';\n\n/**\n * Context object passed to the tool panel slot.\n */\nexport interface ToolPanelContext {\n /** The grid element */\n gridElement: HTMLElement;\n}\n\n/**\n * Registry for tool panel renderers (per element)\n */\nexport const toolPanelRegistry = new WeakMap<HTMLElement, (ctx: ToolPanelContext) => VNode[] | undefined>();\n\n/**\n * Get the tool panel renderer for an element.\n * @internal\n */\nexport function getToolPanelRenderer(\n panelElement: HTMLElement,\n): ((ctx: ToolPanelContext) => VNode[] | undefined) | undefined {\n return toolPanelRegistry.get(panelElement);\n}\n","<script setup lang=\"ts\">\nimport { onMounted, ref, useSlots, type VNode } from 'vue';\nimport { toolPanelRegistry, type ToolPanelContext } from './tool-panel-registry';\n\n/**\n * Props for TbwGridToolPanel\n */\nconst props = withDefaults(\n defineProps<{\n /**\n * Unique identifier for this tool panel.\n */\n id: string;\n\n /**\n * Display label for the panel tab/button.\n */\n label: string;\n\n /**\n * Icon for the panel tab (string or SVG).\n */\n icon?: string;\n\n /**\n * Position of the panel.\n * @default 'right'\n */\n position?: 'left' | 'right';\n\n /**\n * Width of the panel when open.\n * @default '250px'\n */\n width?: string;\n }>(),\n {\n position: 'right',\n width: '250px',\n },\n);\n\n// Define slots with proper typing\ndefineSlots<{\n /** Tool panel content slot */\n default?: (props: ToolPanelContext) => VNode[];\n}>();\n\n// Template ref for the tool panel element\nconst panelRef = ref<HTMLElement | null>(null);\nconst slots = useSlots();\n\nonMounted(() => {\n const element = panelRef.value;\n if (!element || !slots.default) return;\n\n // Register the slot renderer\n toolPanelRegistry.set(element, (ctx: ToolPanelContext) => {\n return slots.default?.(ctx);\n });\n});\n</script>\n\n<template>\n <tbw-grid-tool-panel ref=\"panelRef\" :id=\"id\" :label=\"label\" :icon=\"icon\" :position=\"position\" :width=\"width\" />\n</template>\n","import type { DataGridElement } from '@toolbox-web/grid';\nimport type {\n CellActivateDetail,\n CellChangeDetail,\n CellClickDetail,\n CellCommitDetail,\n ColumnMoveDetail,\n ColumnResizeDetail,\n ColumnVisibilityDetail,\n CopyDetail,\n DetailExpandDetail,\n ExportCompleteDetail,\n FilterChangeDetail,\n GridColumnState,\n GroupToggleDetail,\n PasteDetail,\n PrintCompleteDetail,\n PrintStartDetail,\n ResponsiveChangeDetail,\n RowClickDetail,\n RowCommitDetail,\n RowMoveDetail,\n SelectionChangeDetail,\n SortChangeDetail,\n TreeExpandDetail,\n UndoRedoDetail,\n} from '@toolbox-web/grid/all';\nimport { inject, onBeforeUnmount, onMounted, ref, type Ref } from 'vue';\nimport { GRID_ELEMENT_KEY } from './use-grid';\n\n/**\n * Grid event types and their payload types.\n *\n * @deprecated Use `@event` handlers directly on `<TbwGrid>` instead of useGridEvent.\n * Will be removed in v2.\n */\nexport interface GridEventMap {\n 'cell-click': CellClickDetail;\n 'row-click': RowClickDetail;\n 'cell-activate': CellActivateDetail;\n 'cell-change': CellChangeDetail;\n 'cell-commit': CellCommitDetail;\n 'row-commit': RowCommitDetail;\n 'sort-change': SortChangeDetail;\n 'filter-change': FilterChangeDetail;\n 'column-resize': ColumnResizeDetail;\n 'column-move': ColumnMoveDetail;\n 'column-visibility': ColumnVisibilityDetail;\n 'column-state-change': GridColumnState;\n 'selection-change': SelectionChangeDetail;\n 'row-move': RowMoveDetail;\n 'group-toggle': GroupToggleDetail;\n 'tree-expand': TreeExpandDetail;\n 'detail-expand': DetailExpandDetail;\n 'responsive-change': ResponsiveChangeDetail;\n copy: CopyDetail;\n paste: PasteDetail;\n 'undo-redo': UndoRedoDetail;\n 'export-complete': ExportCompleteDetail;\n 'print-start': PrintStartDetail;\n 'print-complete': PrintCompleteDetail;\n}\n\n// Track whether we've shown the deprecation warning (only show once per session)\nlet hasShownDeprecationWarning = false;\n\n/**\n * @deprecated Use `@event` handlers directly on `<TbwGrid>` instead of useGridEvent. Will be removed in v2.\n *\n * ## Migration Guide\n *\n * **Before (useGridEvent):**\n * ```vue\n * <script setup>\n * import { useGridEvent } from '@toolbox-web/grid-vue';\n * useGridEvent('selection-change', (e) => console.log(e.detail));\n * </script>\n * <template><TbwGrid :rows=\"rows\" /></template>\n * ```\n *\n * **After (@event handlers):**\n * ```vue\n * <template>\n * <TbwGrid :rows=\"rows\" @selection-change=\"(e) => console.log(e.detail)\" />\n * </template>\n * ```\n *\n * Event handlers on `<TbwGrid>` provide:\n * - Cleaner, more declarative API\n * - Automatic cleanup (no composable needed)\n * - Better TypeScript inference via typed emits\n * - Consistent with Vue patterns\n *\n * @param eventName - The name of the grid event to listen for\n * @param handler - The event handler function\n * @param gridElement - Optional grid element ref (uses injected if not provided)\n */\nexport function useGridEvent<K extends keyof GridEventMap>(\n eventName: K,\n handler: (event: CustomEvent<GridEventMap[K]>) => void,\n gridElement?: Ref<DataGridElement | null>,\n): void {\n // Show deprecation warning once per session (in development only)\n if (!hasShownDeprecationWarning && typeof window !== 'undefined') {\n const isDev =\n window.location.hostname === 'localhost' ||\n window.location.hostname === '127.0.0.1' ||\n window.location.hostname.includes('.local');\n\n if (isDev) {\n hasShownDeprecationWarning = true;\n console.warn(\n `[useGridEvent] Deprecated: Use @event handlers directly on <TbwGrid> instead.\\n` +\n `Example: <TbwGrid @selection-change=\"handler\" />\\n` +\n `See migration guide: https://toolboxjs.com/grid-vue/migration`,\n );\n }\n }\n\n const grid = gridElement ?? inject(GRID_ELEMENT_KEY, ref(null));\n let cleanup: (() => void) | null = null;\n\n onMounted(() => {\n const element = grid.value;\n if (!element) return;\n\n cleanup = element.on(eventName as string, (_detail: unknown, event: CustomEvent) =>\n handler(event as CustomEvent<GridEventMap[K]>),\n );\n });\n\n onBeforeUnmount(() => {\n cleanup?.();\n });\n}\n","/**\n * Combined provider for type defaults and icons.\n *\n * Convenience component that combines GridTypeProvider and GridIconProvider.\n */\nimport type { GridIcons } from '@toolbox-web/grid';\nimport { defineComponent, h, type PropType, type VNode } from 'vue';\nimport { GridIconProvider } from './grid-icon-registry';\nimport { GridTypeProvider, type TypeDefaultsMap } from './grid-type-registry';\n\n/**\n * Combined provider for type defaults and icons.\n *\n * @example\n * ```vue\n * <script setup>\n * import { GridProvider, type TypeDefaultsMap } from '@toolbox-web/grid-vue';\n * import { h } from 'vue';\n *\n * const typeDefaults: TypeDefaultsMap = {\n * country: { renderer: (ctx) => h('span', ctx.value) },\n * };\n *\n * const icons = { sortAsc: '↑', sortDesc: '↓' };\n * </script>\n *\n * <template>\n * <GridProvider :typeDefaults=\"typeDefaults\" :icons=\"icons\">\n * <App />\n * </GridProvider>\n * </template>\n * ```\n */\nexport const GridProvider = defineComponent({\n name: 'GridProvider',\n props: {\n /**\n * Type defaults to provide to all descendant grids.\n */\n typeDefaults: {\n type: Object as PropType<TypeDefaultsMap>,\n default: undefined,\n },\n /**\n * Icon overrides to provide to all descendant grids.\n */\n icons: {\n type: Object as PropType<Partial<GridIcons>>,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n return () => {\n let content: VNode[] | VNode | undefined = slots.default?.();\n\n // Wrap with type provider if typeDefaults is provided\n if (props.typeDefaults) {\n const inner = content;\n content = h(GridTypeProvider, { defaults: props.typeDefaults }, () => inner);\n }\n\n // Wrap with icon provider if icons is provided\n if (props.icons) {\n const inner = content;\n content = h(GridIconProvider, { icons: props.icons }, () => inner);\n }\n\n return content;\n };\n },\n});\n\nexport type GridProviderProps = InstanceType<typeof GridProvider>['$props'];\n"],"names":["GRID_ICONS","useGridIcons","inject","GridIconProvider","defineComponent","props","slots","provide","GRID_TYPE_DEFAULTS","useGridTypeDefaults","useTypeDefault","typeName","GridTypeProvider","detailRegistry","cardRegistry","columnRegistries","fieldRegistries","registerColumnRenderer","element","renderer","field","registry","fieldRegistry","registerColumnEditor","editor","getColumnRenderer","getColumnEditor","isVueComponent","value","obj","fnString","fn","isVNodeRenderFunction","PROCESSED_MARKER","GridAdapter","config","vueConfig","result","col","typeDefaults","processed","type","processedConfig","column","wrapped","component","cellCache","ctx","cellEl","cached","container","currentCtx","comp","app","createApp","createVNode","newCtx","renderFn","defaults","hasRenderer","hasEditor","editorFn","detailElement","gridElement","detailEl","row","rowIndex","vnodes","cardElement","cardEl","vueDefault","typeDefault","params","wrapper","i","view","VueGridAdapter","adapterRegistered","globalAdapter","ensureAdapterRegistered","GridElement","__props","EVENT_MAP","emit","__emit","gridRef","ref","GRID_ELEMENT_KEY","iconOverrides","FEATURE_PROPS","createFeaturePlugins","plugins","feature","propValue","plugin","createPluginFromFeature","mergedConfig","computed","baseConfig","featurePlugins","configPlugins","mergedPlugins","icons","eventCleanups","onMounted","grid","adapter","eventName","_d","e","onBeforeUnmount","watch","newRows","newConfig","newFitMode","newTypeDefaults","__expose","_createElementBlock","_renderSlot","_ctx","_useSlots","columnRef","hasCellSlot","hasEditorSlot","slotFn","h","slotContent","detailRef","useSlots","cardRef","toolPanelRegistry","panelRef","hasShownDeprecationWarning","useGridEvent","handler","cleanup","_detail","event","GridProvider","content","inner"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../libs/grid-vue/src/lib/grid-icon-registry.ts","../../../libs/grid-vue/src/lib/grid-type-registry.ts","../../../libs/grid-vue/src/lib/detail-panel-registry.ts","../../../libs/grid-vue/src/lib/responsive-card-registry.ts","../../../libs/grid-vue/src/lib/vue-grid-adapter.ts","../../../libs/grid-vue/src/lib/TbwGrid.vue","../../../libs/grid-vue/src/lib/TbwGridColumn.vue","../../../libs/grid-vue/src/lib/TbwGridDetailPanel.vue","../../../libs/grid-vue/src/lib/TbwGridResponsiveCard.vue","../../../libs/grid-vue/src/lib/TbwGridToolButtons.vue","../../../libs/grid-vue/src/lib/tool-panel-registry.ts","../../../libs/grid-vue/src/lib/TbwGridToolPanel.vue","../../../libs/grid-vue/src/lib/use-grid-event.ts","../../../libs/grid-vue/src/lib/grid-provider.ts"],"sourcesContent":["/**\n * Icon registry for Vue applications.\n *\n * Provides application-wide icon overrides that all grids inherit\n * automatically via Vue's provide/inject.\n */\nimport type { GridIcons } from '@toolbox-web/grid';\nimport { defineComponent, inject, provide, type InjectionKey, type PropType } from 'vue';\n\n/**\n * Injection key for grid icons.\n */\nexport const GRID_ICONS: InjectionKey<Partial<GridIcons>> = Symbol('grid-icons');\n\n/**\n * Composable to get the current icon overrides from the nearest provider.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useGridIcons } from '@toolbox-web/grid-vue';\n *\n * const icons = useGridIcons();\n * </script>\n * ```\n */\nexport function useGridIcons(): Partial<GridIcons> | undefined {\n return inject(GRID_ICONS, undefined);\n}\n\n/**\n * Provides application-wide icon overrides for all descendant grids.\n *\n * Wrap your application (or part of it) with this provider to customize\n * icons used by all TbwGrid components.\n *\n * @example\n * ```vue\n * <script setup>\n * import { GridIconProvider } from '@toolbox-web/grid-vue';\n *\n * const icons = {\n * sortAsc: '↑',\n * sortDesc: '↓',\n * expand: '+',\n * collapse: '−',\n * };\n * </script>\n *\n * <template>\n * <GridIconProvider :icons=\"icons\">\n * <App />\n * </GridIconProvider>\n * </template>\n * ```\n */\nexport const GridIconProvider = defineComponent({\n name: 'GridIconProvider',\n props: {\n /**\n * Icon overrides to provide to all descendant grids.\n */\n icons: {\n type: Object as PropType<Partial<GridIcons>>,\n required: true,\n },\n },\n setup(props, { slots }) {\n // Provide icons to descendants\n provide(GRID_ICONS, props.icons);\n\n // Render children\n return () => slots.default?.();\n },\n});\n\nexport type GridIconProviderProps = InstanceType<typeof GridIconProvider>['$props'];\n","/**\n * Type-level default registry for Vue applications.\n *\n * Provides application-wide type defaults for renderers and editors\n * that all grids inherit automatically via Vue's provide/inject.\n */\nimport type { CellRenderContext, ColumnEditorContext } from '@toolbox-web/grid';\nimport type { FilterPanelParams } from '@toolbox-web/grid/plugins/filtering';\nimport { defineComponent, inject, provide, type InjectionKey, type PropType, type VNode } from 'vue';\n\n// #region TypeDefault Interface\n/**\n * Type default configuration for Vue applications.\n *\n * Defines default renderer, editor, and editorParams for a data type\n * using Vue render functions.\n *\n * @example\n * ```ts\n * import type { TypeDefault } from '@toolbox-web/grid-vue';\n * import CountryFlag from './CountryFlag.vue';\n * import CountrySelect from './CountrySelect.vue';\n *\n * const countryDefault: TypeDefault<Employee, string> = {\n * renderer: (ctx) => h(CountryFlag, { code: ctx.value }),\n * editor: (ctx) => h(CountrySelect, {\n * modelValue: ctx.value,\n * 'onUpdate:modelValue': ctx.commit,\n * }),\n * };\n * ```\n */\nexport interface TypeDefault<TRow = unknown, TValue = unknown> {\n /** Vue render function for rendering cells of this type */\n renderer?: (ctx: CellRenderContext<TRow, TValue>) => VNode;\n /** Vue render function for editing cells of this type */\n editor?: (ctx: ColumnEditorContext<TRow, TValue>) => VNode;\n /** Default editorParams for this type */\n editorParams?: Record<string, unknown>;\n /**\n * Vue render function for custom filter panels for this type.\n *\n * Unlike the core imperative API `(container, params) => void`, this accepts\n * a Vue render function that receives only the params and returns a VNode.\n * The bridge handles mounting and appending to the container automatically.\n *\n * @example\n * ```ts\n * import { h } from 'vue';\n * import CustomFilter from './CustomFilter.vue';\n *\n * const typeDefault: TypeDefault = {\n * filterPanelRenderer: (params) => h(CustomFilter, {\n * field: params.field,\n * uniqueValues: params.uniqueValues,\n * onApply: (values: Set<unknown>) => params.applySetFilter(values),\n * }),\n * };\n * ```\n */\n filterPanelRenderer?: (params: FilterPanelParams) => VNode;\n}\n\n/**\n * @deprecated Use `TypeDefault` instead. Will be removed in v2.\n * @see {@link TypeDefault}\n */\nexport type VueTypeDefault<TRow = unknown, TValue = unknown> = TypeDefault<TRow, TValue>;\n// #endregion\n\n/**\n * Type defaults registry - a map of type names to their defaults.\n */\nexport type TypeDefaultsMap = Record<string, TypeDefault>;\n\n/**\n * Injection key for type defaults.\n */\nexport const GRID_TYPE_DEFAULTS: InjectionKey<TypeDefaultsMap> = Symbol('grid-type-defaults');\n\n/**\n * Composable to get the current type defaults from the nearest provider.\n *\n * @example\n * ```vue\n * <script setup>\n * import { useGridTypeDefaults } from '@toolbox-web/grid-vue';\n *\n * const typeDefaults = useGridTypeDefaults();\n * </script>\n * ```\n */\nexport function useGridTypeDefaults(): TypeDefaultsMap | undefined {\n return inject(GRID_TYPE_DEFAULTS, undefined);\n}\n\n/**\n * Composable to get a specific type's default configuration.\n *\n * @param typeName - The type name to look up\n *\n * @example\n * ```vue\n * <script setup>\n * import { useTypeDefault } from '@toolbox-web/grid-vue';\n *\n * const countryDefault = useTypeDefault('country');\n * </script>\n * ```\n */\nexport function useTypeDefault<TRow = unknown, TValue = unknown>(\n typeName: string,\n): TypeDefault<TRow, TValue> | undefined {\n const defaults = useGridTypeDefaults();\n return defaults?.[typeName] as TypeDefault<TRow, TValue> | undefined;\n}\n\n/**\n * Provides application-wide type defaults for all descendant grids.\n *\n * Wrap your application (or part of it) with this provider to make\n * type-level renderers and editors available to all TbwGrid components.\n *\n * @example\n * ```vue\n * <script setup>\n * import { GridTypeProvider, type TypeDefaultsMap } from '@toolbox-web/grid-vue';\n * import { h } from 'vue';\n * import CountryBadge from './CountryBadge.vue';\n *\n * const typeDefaults: TypeDefaultsMap = {\n * country: {\n * renderer: (ctx) => h(CountryBadge, { code: ctx.value }),\n * },\n * };\n * </script>\n *\n * <template>\n * <GridTypeProvider :defaults=\"typeDefaults\">\n * <App />\n * </GridTypeProvider>\n * </template>\n * ```\n */\nexport const GridTypeProvider = defineComponent({\n name: 'GridTypeProvider',\n props: {\n /**\n * Type defaults to provide to all descendant grids.\n */\n defaults: {\n type: Object as PropType<TypeDefaultsMap>,\n required: true,\n },\n },\n setup(props, { slots }) {\n // Provide type defaults to descendants\n provide(GRID_TYPE_DEFAULTS, props.defaults);\n\n // Render children\n return () => slots.default?.();\n },\n});\n\nexport type GridTypeProviderProps = InstanceType<typeof GridTypeProvider>['$props'];\n","/**\n * Registry for detail panel renderers.\n * @internal\n */\nimport type { VNode } from 'vue';\n\n/**\n * Context object passed to the detail panel slot.\n */\nexport interface DetailPanelContext<T = unknown> {\n /** The row data for this detail panel */\n row: T;\n /** The row index */\n rowIndex: number;\n}\n\n/**\n * Registry for detail renderers (per grid element)\n */\nexport const detailRegistry = new WeakMap<HTMLElement, (ctx: DetailPanelContext<unknown>) => VNode[] | undefined>();\n\n/**\n * Get the detail renderer for a grid element.\n * @internal\n */\nexport function getDetailRenderer(\n gridElement: HTMLElement,\n): ((ctx: DetailPanelContext<unknown>) => VNode[] | undefined) | undefined {\n const detailElement = gridElement.querySelector('tbw-grid-detail') as HTMLElement | null;\n if (detailElement) {\n return detailRegistry.get(detailElement);\n }\n return undefined;\n}\n","/**\n * Registry for responsive card renderers.\n * @internal\n */\nimport type { VNode } from 'vue';\n\n/**\n * Context object passed to the responsive card slot.\n */\nexport interface ResponsiveCardContext<T = unknown> {\n /** The row data */\n row: T;\n /** The row index */\n rowIndex: number;\n}\n\n/**\n * Registry for responsive card renderers (per element)\n */\nexport const cardRegistry = new WeakMap<HTMLElement, (ctx: ResponsiveCardContext<unknown>) => VNode[] | undefined>();\n\n/**\n * Get the responsive card renderer for a grid element.\n * @internal\n */\nexport function getResponsiveCardRenderer(\n gridElement: HTMLElement,\n): ((ctx: ResponsiveCardContext<unknown>) => VNode[] | undefined) | undefined {\n const cardElement = gridElement.querySelector('tbw-grid-responsive-card') as HTMLElement | null;\n if (cardElement) {\n return cardRegistry.get(cardElement);\n }\n return undefined;\n}\n","import type {\n ColumnConfig as BaseColumnConfig,\n GridConfig as BaseGridConfig,\n TypeDefault as BaseTypeDefault,\n CellRenderContext,\n ColumnEditorContext,\n ColumnEditorSpec,\n ColumnViewRenderer,\n FrameworkAdapter,\n HeaderCellContext,\n HeaderLabelContext,\n LoadingContext,\n} from '@toolbox-web/grid';\nimport type { FilterPanelParams } from '@toolbox-web/grid/plugins/filtering';\nimport { createApp, createVNode, type App, type Component, type VNode } from 'vue';\nimport { detailRegistry, type DetailPanelContext } from './detail-panel-registry';\nimport type { TypeDefault, TypeDefaultsMap } from './grid-type-registry';\nimport { cardRegistry, type ResponsiveCardContext } from './responsive-card-registry';\nimport type { ColumnConfig, GridConfig } from './vue-column-config';\nexport type { GridConfig };\n\n/**\n * Registry mapping column elements to their Vue render functions.\n * Each column element stores its renderer/editor functions here.\n */\ninterface ColumnRegistry {\n renderer?: (ctx: CellRenderContext<unknown, unknown>) => VNode;\n editor?: (ctx: ColumnEditorContext<unknown, unknown>) => VNode;\n}\n\nconst columnRegistries = new WeakMap<HTMLElement, ColumnRegistry>();\n\n// Secondary registry by field name to handle Vue component re-creation\nconst fieldRegistries = new Map<string, ColumnRegistry>();\n\n/**\n * Register a Vue cell renderer for a column element.\n * Called by TbwGridColumn when it has a #cell slot.\n */\nexport function registerColumnRenderer(\n element: HTMLElement,\n renderer: (ctx: CellRenderContext<unknown, unknown>) => VNode,\n): void {\n const field = element.getAttribute('field');\n\n const registry = columnRegistries.get(element) ?? {};\n registry.renderer = renderer;\n columnRegistries.set(element, registry);\n\n // Also register by field name for fallback lookup\n if (field) {\n const fieldRegistry = fieldRegistries.get(field) ?? {};\n fieldRegistry.renderer = renderer;\n fieldRegistries.set(field, fieldRegistry);\n }\n}\n\n/**\n * Register a Vue cell editor for a column element.\n * Called by TbwGridColumn when it has an #editor slot.\n */\nexport function registerColumnEditor(\n element: HTMLElement,\n editor: (ctx: ColumnEditorContext<unknown, unknown>) => VNode,\n): void {\n const field = element.getAttribute('field');\n const registry = columnRegistries.get(element) ?? {};\n registry.editor = editor;\n columnRegistries.set(element, registry);\n\n // Also register by field name for fallback lookup\n if (field) {\n const fieldRegistry = fieldRegistries.get(field) ?? {};\n fieldRegistry.editor = editor;\n fieldRegistries.set(field, fieldRegistry);\n }\n}\n\n/**\n * Get the renderer registered for a column element.\n * Falls back to field-based lookup if WeakMap lookup fails.\n */\nexport function getColumnRenderer(\n element: HTMLElement,\n): ((ctx: CellRenderContext<unknown, unknown>) => VNode) | undefined {\n let renderer = columnRegistries.get(element)?.renderer;\n\n // Fallback to field-based lookup for Vue component re-creation scenarios\n if (!renderer) {\n const field = element.getAttribute('field');\n if (field) {\n renderer = fieldRegistries.get(field)?.renderer;\n }\n }\n\n return renderer;\n}\n\n/**\n * Get the editor registered for a column element.\n * Falls back to field-based lookup if WeakMap lookup fails.\n */\nexport function getColumnEditor(\n element: HTMLElement,\n): ((ctx: ColumnEditorContext<unknown, unknown>) => VNode) | undefined {\n let editor = columnRegistries.get(element)?.editor;\n\n // Fallback to field-based lookup for Vue component re-creation scenarios\n if (!editor) {\n const field = element.getAttribute('field');\n if (field) {\n editor = fieldRegistries.get(field)?.editor;\n }\n }\n\n return editor;\n}\n\n/**\n * Get all registered field names.\n * @internal - for testing only\n */\nexport function getRegisteredFields(): string[] {\n return Array.from(fieldRegistries.keys());\n}\n\n/**\n * Clear the field registries.\n * Called during adapter cleanup and in tests.\n * @internal\n */\nexport function clearFieldRegistries(): void {\n fieldRegistries.clear();\n}\n\n// #region Vue Component Detection\n\n/**\n * Checks if a value is a Vue component (SFC or defineComponent result).\n *\n * Vue components are identified by:\n * - Having `__name` (SFC compiled marker)\n * - Having `setup` function (Composition API component)\n * - Having `render` function (Options API component)\n * - Being an ES6 class (class-based component)\n *\n * Regular functions `(ctx) => HTMLElement` that are already processed\n * will not match these checks, making this idempotent.\n */\nexport function isVueComponent(value: unknown): value is Component {\n if (value == null) return false;\n\n // Already a DOM-returning function (processed) — skip\n if (typeof value === 'function' && value.prototype === undefined) {\n // Plain arrow/function — could be a VNode-returning render fn OR\n // an already-processed DOM-returning fn. We can't distinguish at runtime,\n // so we check if it looks like a Vue component (has component markers).\n // Plain functions without component markers are treated as VNode-returning.\n return false;\n }\n\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n // SFC compiled marker\n if ('__name' in obj) return true;\n // Composition API\n if (typeof obj['setup'] === 'function') return true;\n // Options API\n if (typeof obj['render'] === 'function') return true;\n }\n\n if (typeof value === 'function') {\n // ES6 class-based component\n const fnString = Function.prototype.toString.call(value);\n if (fnString.startsWith('class ') || fnString.startsWith('class{')) return true;\n\n // defineComponent returns a function with component markers\n const fn = value as unknown as Record<string, unknown>;\n if ('__name' in fn || typeof fn['setup'] === 'function') return true;\n }\n\n return false;\n}\n\n/**\n * Checks if a value is a VNode-returning render function.\n * These are plain functions (not component objects) that return VNodes.\n * They need wrapping to produce HTMLElements for the grid core.\n */\nfunction isVNodeRenderFunction(value: unknown): value is (...args: unknown[]) => VNode {\n return typeof value === 'function' && !isVueComponent(value);\n}\n\n/**\n * Symbol used to mark renderer/editor functions that have already been\n * processed by the adapter (i.e., wrapped from VNode/Component → DOM).\n * Prevents double-wrapping when `processGridConfig` is called multiple times.\n */\nconst PROCESSED_MARKER = Symbol.for('tbw:vue-processed');\n\n// #endregion\n\n/**\n * Tracks mounted Vue apps for cleanup.\n */\ninterface MountedView {\n app: App;\n container: HTMLElement;\n}\n\n/**\n * Cache for cell containers and their Vue apps.\n */\ninterface CellAppCache {\n app: App;\n container: HTMLElement;\n update: (ctx: CellRenderContext<unknown, unknown>) => void;\n}\n\n/**\n * Framework adapter that enables Vue 3 component integration\n * with the grid's light DOM configuration API.\n *\n * ## Usage\n *\n * The adapter is automatically registered when using the TbwGrid component.\n * For advanced use cases, you can manually register:\n *\n * ```ts\n * import { GridElement } from '@toolbox-web/grid';\n * import { GridAdapter } from '@toolbox-web/grid-vue';\n *\n * // One-time registration\n * GridElement.registerAdapter(new GridAdapter());\n * ```\n *\n * ## Declarative usage with TbwGrid:\n *\n * ```vue\n * <TbwGrid :rows=\"data\" :grid-config=\"config\">\n * <TbwGridColumn field=\"status\">\n * <template #cell=\"{ value, row }\">\n * <StatusBadge :value=\"value\" />\n * </template>\n * </TbwGridColumn>\n * </TbwGrid>\n * ```\n */\nexport class GridAdapter implements FrameworkAdapter {\n private mountedViews: MountedView[] = [];\n /** Editor-specific views tracked separately for per-cell cleanup via releaseCell. */\n private editorViews: MountedView[] = [];\n private typeDefaults: TypeDefaultsMap | null = null;\n\n // #region Config Processing\n\n /**\n * Processes a Vue grid configuration, converting Vue component references\n * and VNode-returning render functions to DOM-returning functions.\n *\n * This is idempotent — already-processed configs pass through safely.\n *\n * @example\n * ```ts\n * import { GridAdapter, type GridConfig } from '@toolbox-web/grid-vue';\n * import StatusBadge from './StatusBadge.vue';\n *\n * const config: GridConfig<Employee> = {\n * columns: [\n * { field: 'status', renderer: StatusBadge },\n * ],\n * };\n *\n * const adapter = new GridAdapter();\n * const processedConfig = adapter.processGridConfig(config);\n * ```\n *\n * @param config - Vue grid config with possible component/VNode references\n * @returns Processed config with DOM-returning functions\n */\n processGridConfig<TRow = unknown>(config: GridConfig<TRow>): BaseGridConfig<TRow> {\n return this.processConfig(config as BaseGridConfig<TRow>);\n }\n\n /**\n * FrameworkAdapter.processConfig implementation.\n * Called automatically by the grid's `set gridConfig` setter.\n */\n processConfig<TRow = unknown>(config: BaseGridConfig<TRow>): BaseGridConfig<TRow> {\n // Cast to Vue's extended GridConfig since the config may contain\n // Vue component classes or VNode-returning functions at runtime\n const vueConfig = config as unknown as GridConfig<TRow>;\n const result = { ...vueConfig };\n\n // Process columns\n if (vueConfig.columns) {\n (result as BaseGridConfig<TRow>).columns = vueConfig.columns.map((col) => this.processColumn(col));\n }\n\n // Process typeDefaults\n if (vueConfig.typeDefaults) {\n result.typeDefaults = this.processTypeDefaults(vueConfig.typeDefaults as Record<string, TypeDefault>) as Record<\n string,\n BaseTypeDefault<TRow>\n >;\n }\n\n // Process loadingRenderer - convert Vue component/VNode to DOM-returning function\n if (vueConfig.loadingRenderer) {\n if (isVueComponent(vueConfig.loadingRenderer)) {\n (result as BaseGridConfig<TRow>).loadingRenderer = this.createComponentLoadingRenderer(\n vueConfig.loadingRenderer as unknown as Component,\n ) as unknown as BaseGridConfig<TRow>['loadingRenderer'];\n } else if (isVNodeRenderFunction(vueConfig.loadingRenderer)) {\n (result as BaseGridConfig<TRow>).loadingRenderer = this.createVNodeLoadingRenderer(\n vueConfig.loadingRenderer as unknown as (ctx: LoadingContext) => VNode,\n ) as unknown as BaseGridConfig<TRow>['loadingRenderer'];\n }\n }\n\n return result as BaseGridConfig<TRow>;\n }\n\n /**\n * Processes typeDefaults, converting Vue component/VNode references\n * to DOM-returning functions.\n *\n * @param typeDefaults - Vue type defaults with possible component references\n * @returns Processed TypeDefault record\n */\n processTypeDefaults<TRow = unknown>(\n typeDefaults: Record<string, TypeDefault<TRow>>,\n ): Record<string, BaseTypeDefault<TRow>> {\n const processed: Record<string, BaseTypeDefault<TRow>> = {};\n\n for (const [type, config] of Object.entries(typeDefaults)) {\n const processedConfig: BaseTypeDefault<TRow> = {\n editorParams: config.editorParams,\n };\n\n if (config.renderer) {\n if (isVueComponent(config.renderer)) {\n processedConfig.renderer = this.createConfigComponentRenderer(config.renderer as Component);\n } else if (isVNodeRenderFunction(config.renderer)) {\n processedConfig.renderer = this.createTypeRenderer(\n config.renderer as (ctx: CellRenderContext<TRow>) => VNode,\n );\n }\n }\n\n if (config.editor) {\n if (isVueComponent(config.editor)) {\n processedConfig.editor = this.createConfigComponentEditor(\n config.editor as Component,\n ) as BaseTypeDefault['editor'];\n } else if (isVNodeRenderFunction(config.editor)) {\n processedConfig.editor = this.createTypeEditor(\n config.editor as (ctx: ColumnEditorContext<TRow>) => VNode,\n ) as BaseTypeDefault['editor'];\n }\n }\n\n if (config.filterPanelRenderer) {\n processedConfig.filterPanelRenderer = this.createFilterPanelRenderer(config.filterPanelRenderer);\n }\n\n processed[type] = processedConfig;\n }\n\n return processed;\n }\n\n /**\n * Processes a single column configuration, converting Vue component references\n * and VNode-returning render functions to DOM-returning functions.\n *\n * @param column - Vue column config\n * @returns Processed ColumnConfig with DOM-returning functions\n */\n processColumn<TRow = unknown>(column: ColumnConfig<TRow>): BaseColumnConfig<TRow> {\n const processed = { ...column } as BaseColumnConfig<TRow>;\n\n if (column.renderer && !(column.renderer as unknown as Record<symbol, unknown>)[PROCESSED_MARKER]) {\n if (isVueComponent(column.renderer)) {\n const wrapped = this.createConfigComponentRenderer(column.renderer as Component);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.renderer = wrapped as BaseColumnConfig<TRow>['renderer'];\n } else if (isVNodeRenderFunction(column.renderer)) {\n const wrapped = this.createConfigVNodeRenderer(column.renderer as (ctx: CellRenderContext<TRow>) => VNode);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.renderer = wrapped as BaseColumnConfig<TRow>['renderer'];\n }\n }\n\n if (column.editor && !(column.editor as unknown as Record<symbol, unknown>)[PROCESSED_MARKER]) {\n if (isVueComponent(column.editor)) {\n const wrapped = this.createConfigComponentEditor(column.editor as Component);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.editor = wrapped as BaseColumnConfig<TRow>['editor'];\n } else if (isVNodeRenderFunction(column.editor)) {\n const wrapped = this.createConfigVNodeEditor(column.editor as (ctx: ColumnEditorContext<TRow>) => VNode);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.editor = wrapped as BaseColumnConfig<TRow>['editor'];\n }\n }\n\n if (column.headerRenderer && !(column.headerRenderer as unknown as Record<symbol, unknown>)[PROCESSED_MARKER]) {\n if (isVueComponent(column.headerRenderer)) {\n const wrapped = this.createConfigComponentHeaderRenderer(column.headerRenderer as Component);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.headerRenderer = wrapped as any;\n } else if (isVNodeRenderFunction(column.headerRenderer)) {\n const wrapped = this.createConfigVNodeHeaderRenderer(\n column.headerRenderer as (ctx: HeaderCellContext<TRow>) => VNode,\n );\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.headerRenderer = wrapped as any;\n }\n }\n\n if (\n column.headerLabelRenderer &&\n !(column.headerLabelRenderer as unknown as Record<symbol, unknown>)[PROCESSED_MARKER]\n ) {\n if (isVueComponent(column.headerLabelRenderer)) {\n const wrapped = this.createConfigComponentHeaderLabelRenderer(column.headerLabelRenderer as Component);\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.headerLabelRenderer = wrapped as any;\n } else if (isVNodeRenderFunction(column.headerLabelRenderer)) {\n const wrapped = this.createConfigVNodeHeaderLabelRenderer(\n column.headerLabelRenderer as (ctx: HeaderLabelContext<TRow>) => VNode,\n );\n (wrapped as unknown as Record<symbol, unknown>)[PROCESSED_MARKER] = true;\n processed.headerLabelRenderer = wrapped as any;\n }\n }\n\n return processed;\n }\n\n /**\n * Creates a DOM-returning renderer from a Vue component class.\n * Used for config-based renderers (not slot-based).\n * @internal\n */\n private createConfigComponentRenderer<TRow = unknown, TValue = unknown>(\n component: Component,\n ): ColumnViewRenderer<TRow, TValue> {\n const cellCache = new WeakMap<HTMLElement, CellAppCache>();\n\n return (ctx: CellRenderContext<TRow, TValue>) => {\n const cellEl = (ctx as any).cellEl as HTMLElement | undefined;\n\n if (cellEl) {\n const cached = cellCache.get(cellEl);\n if (cached) {\n cached.update(ctx as CellRenderContext<unknown, unknown>);\n return cached.container;\n }\n\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n let currentCtx = ctx as CellRenderContext<unknown, unknown>;\n const comp = component;\n\n const app = createApp({\n render() {\n return createVNode(comp, { ...currentCtx });\n },\n });\n\n app.mount(container);\n\n cellCache.set(cellEl, {\n app,\n container,\n update: (newCtx) => {\n currentCtx = newCtx;\n app._instance?.update();\n },\n });\n\n return container;\n }\n\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n const comp = component;\n const app = createApp({\n render() {\n return createVNode(comp, { ...ctx });\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning renderer from a VNode-returning render function.\n * Used for config-based renderers (not slot-based).\n * @internal\n */\n private createConfigVNodeRenderer<TRow = unknown, TValue = unknown>(\n renderFn: (ctx: CellRenderContext<TRow, TValue>) => VNode,\n ): ColumnViewRenderer<TRow, TValue> {\n const cellCache = new WeakMap<HTMLElement, CellAppCache>();\n\n return (ctx: CellRenderContext<TRow, TValue>) => {\n const cellEl = (ctx as any).cellEl as HTMLElement | undefined;\n\n if (cellEl) {\n const cached = cellCache.get(cellEl);\n if (cached) {\n cached.update(ctx as CellRenderContext<unknown, unknown>);\n return cached.container;\n }\n\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n let currentCtx = ctx as CellRenderContext<unknown, unknown>;\n\n const app = createApp({\n render() {\n return renderFn(currentCtx as CellRenderContext<TRow, TValue>);\n },\n });\n\n app.mount(container);\n\n cellCache.set(cellEl, {\n app,\n container,\n update: (newCtx) => {\n currentCtx = newCtx;\n app._instance?.update();\n },\n });\n\n return container;\n }\n\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning editor from a Vue component class.\n * Used for config-based editors (not slot-based).\n * @internal\n */\n private createConfigComponentEditor<TRow = unknown, TValue = unknown>(\n component: Component,\n ): ColumnEditorSpec<TRow, TValue> {\n return (ctx: ColumnEditorContext<TRow, TValue>): HTMLElement => {\n const container = document.createElement('div');\n container.className = 'vue-cell-editor';\n container.style.display = 'contents';\n\n const comp = component;\n const app = createApp({\n render() {\n return createVNode(comp, { ...ctx });\n },\n });\n\n app.mount(container);\n // Track in editor-specific array for per-cell cleanup via releaseCell\n this.editorViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning editor from a VNode-returning render function.\n * Used for config-based editors (not slot-based).\n * @internal\n */\n private createConfigVNodeEditor<TRow = unknown, TValue = unknown>(\n renderFn: (ctx: ColumnEditorContext<TRow, TValue>) => VNode,\n ): ColumnEditorSpec<TRow, TValue> {\n return (ctx: ColumnEditorContext<TRow, TValue>): HTMLElement => {\n const container = document.createElement('div');\n container.className = 'vue-cell-editor';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n // Track in editor-specific array for per-cell cleanup via releaseCell\n this.editorViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning header renderer from a Vue component class.\n * Used for config-based headerRenderer (not slot-based).\n * @internal\n */\n private createConfigComponentHeaderRenderer<TRow = unknown>(\n component: Component,\n ): (ctx: HeaderCellContext<TRow>) => HTMLElement {\n return (ctx: HeaderCellContext<TRow>) => {\n const container = document.createElement('div');\n container.className = 'vue-header-renderer';\n container.style.display = 'contents';\n\n const comp = component;\n const app = createApp({\n render() {\n return createVNode(comp, {\n column: ctx.column,\n value: ctx.value,\n sortState: ctx.sortState,\n filterActive: ctx.filterActive,\n renderSortIcon: ctx.renderSortIcon,\n renderFilterButton: ctx.renderFilterButton,\n });\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning header renderer from a VNode-returning render function.\n * Used for config-based headerRenderer (not slot-based).\n * @internal\n */\n private createConfigVNodeHeaderRenderer<TRow = unknown>(\n renderFn: (ctx: HeaderCellContext<TRow>) => VNode,\n ): (ctx: HeaderCellContext<TRow>) => HTMLElement {\n return (ctx: HeaderCellContext<TRow>) => {\n const container = document.createElement('div');\n container.className = 'vue-header-renderer';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning header label renderer from a Vue component class.\n * Used for config-based headerLabelRenderer (not slot-based).\n * @internal\n */\n private createConfigComponentHeaderLabelRenderer<TRow = unknown>(\n component: Component,\n ): (ctx: HeaderLabelContext<TRow>) => HTMLElement {\n return (ctx: HeaderLabelContext<TRow>) => {\n const container = document.createElement('div');\n container.className = 'vue-header-label-renderer';\n container.style.display = 'contents';\n\n const comp = component;\n const app = createApp({\n render() {\n return createVNode(comp, {\n column: ctx.column,\n value: ctx.value,\n });\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning header label renderer from a VNode-returning render function.\n * Used for config-based headerLabelRenderer (not slot-based).\n * @internal\n */\n private createConfigVNodeHeaderLabelRenderer<TRow = unknown>(\n renderFn: (ctx: HeaderLabelContext<TRow>) => VNode,\n ): (ctx: HeaderLabelContext<TRow>) => HTMLElement {\n return (ctx: HeaderLabelContext<TRow>) => {\n const container = document.createElement('div');\n container.className = 'vue-header-label-renderer';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning loading renderer from a Vue component class.\n * @internal\n */\n private createComponentLoadingRenderer(component: Component): (ctx: LoadingContext) => HTMLElement {\n return (ctx: LoadingContext) => {\n const container = document.createElement('div');\n container.className = 'vue-loading-renderer';\n container.style.display = 'contents';\n\n const comp = component;\n const app = createApp({\n render() {\n return createVNode(comp, { size: ctx.size });\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a DOM-returning loading renderer from a VNode-returning render function.\n * @internal\n */\n private createVNodeLoadingRenderer(renderFn: (ctx: LoadingContext) => VNode): (ctx: LoadingContext) => HTMLElement {\n return (ctx: LoadingContext) => {\n const container = document.createElement('div');\n container.className = 'vue-loading-renderer';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n // #endregion\n\n /**\n * Sets the type defaults map for this adapter.\n * Called by TbwGrid when it receives type defaults from context.\n *\n * @internal\n */\n setTypeDefaults(defaults: TypeDefaultsMap | null): void {\n this.typeDefaults = defaults;\n }\n\n /**\n * Determines if this adapter can handle the given element.\n * Checks if a renderer or editor is registered for this element.\n */\n canHandle(element: HTMLElement): boolean {\n const field = element.getAttribute('field');\n let registry = columnRegistries.get(element);\n\n // If not found in WeakMap, try field-based lookup\n if (!registry && field) {\n const fieldRegistry = fieldRegistries.get(field);\n if (fieldRegistry && (fieldRegistry.renderer || fieldRegistry.editor)) {\n registry = fieldRegistry;\n columnRegistries.set(element, registry);\n }\n }\n\n const hasRenderer = registry?.renderer !== undefined;\n const hasEditor = registry?.editor !== undefined;\n return registry !== undefined && (hasRenderer || hasEditor);\n }\n\n /**\n * Creates a view renderer function that renders a Vue component\n * and returns its container DOM element.\n */\n createRenderer<TRow = unknown, TValue = unknown>(element: HTMLElement): ColumnViewRenderer<TRow, TValue> | undefined {\n const renderFn = getColumnRenderer(element);\n\n if (!renderFn) {\n return undefined;\n }\n\n // Cell cache for this field - maps cell element to its Vue app\n const cellCache = new WeakMap<HTMLElement, CellAppCache>();\n\n return (ctx: CellRenderContext<TRow, TValue>) => {\n const cellEl = (ctx as any).cellEl as HTMLElement | undefined;\n\n if (cellEl) {\n // Check if we have a cached app for this cell\n const cached = cellCache.get(cellEl);\n if (cached) {\n // Update the existing app with new context\n cached.update(ctx as CellRenderContext<unknown, unknown>);\n return cached.container;\n }\n\n // Create new container and Vue app for this cell\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n // Create reactive context that can be updated\n let currentCtx = ctx as CellRenderContext<unknown, unknown>;\n\n const app = createApp({\n render() {\n return renderFn(currentCtx);\n },\n });\n\n app.mount(container);\n\n // Store in cache with update function\n cellCache.set(cellEl, {\n app,\n container,\n update: (newCtx) => {\n currentCtx = newCtx;\n // Force re-render\n app._instance?.update();\n },\n });\n\n return container;\n }\n\n // Fallback: create container without caching\n const container = document.createElement('div');\n container.className = 'vue-cell-renderer';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx as CellRenderContext<unknown, unknown>);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates an editor spec that renders a Vue component for cell editing.\n * Returns a function that creates the editor DOM element.\n */\n createEditor<TRow = unknown, TValue = unknown>(element: HTMLElement): ColumnEditorSpec<TRow, TValue> | undefined {\n const editorFn = getColumnEditor(element);\n\n if (!editorFn) {\n return undefined;\n }\n\n // Return a function that creates the editor element\n return (ctx: ColumnEditorContext<TRow, TValue>): HTMLElement => {\n const container = document.createElement('div');\n container.className = 'vue-cell-editor';\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return editorFn(ctx as ColumnEditorContext<unknown, unknown>);\n },\n });\n\n app.mount(container);\n // Track in editor-specific array for per-cell cleanup via releaseCell\n this.editorViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Framework adapter hook called by MasterDetailPlugin during attach().\n * Parses the <tbw-grid-detail> element and returns a Vue-based renderer.\n */\n parseDetailElement<TRow = unknown>(\n detailElement: Element,\n ): ((row: TRow, rowIndex: number) => HTMLElement) | undefined {\n const gridElement = detailElement.closest('tbw-grid') as HTMLElement | null;\n if (!gridElement) return undefined;\n\n // Get renderer from registry (registered by TbwGridDetailPanel)\n const detailEl = gridElement.querySelector('tbw-grid-detail') as HTMLElement | null;\n if (!detailEl) return undefined;\n\n const renderFn = detailRegistry.get(detailEl);\n if (!renderFn) return undefined;\n\n return (row: TRow, rowIndex: number): HTMLElement => {\n const container = document.createElement('div');\n container.className = 'vue-detail-panel';\n\n const ctx: DetailPanelContext<TRow> = { row, rowIndex };\n const vnodes = renderFn(ctx as DetailPanelContext<unknown>);\n\n if (vnodes && vnodes.length > 0) {\n // Render VNodes into container\n const app = createApp({\n render() {\n return vnodes;\n },\n });\n app.mount(container);\n this.mountedViews.push({ app, container });\n }\n\n return container;\n };\n }\n\n /**\n * Framework adapter hook called by ResponsivePlugin during attach().\n * Parses the <tbw-grid-responsive-card> element and returns a Vue-based renderer.\n */\n parseResponsiveCardElement<TRow = unknown>(\n cardElement: Element,\n ): ((row: TRow, rowIndex: number) => HTMLElement) | undefined {\n const gridElement = cardElement.closest('tbw-grid') as HTMLElement | null;\n if (!gridElement) return undefined;\n\n // Get renderer from registry (registered by TbwGridResponsiveCard)\n const cardEl = gridElement.querySelector('tbw-grid-responsive-card') as HTMLElement | null;\n if (!cardEl) return undefined;\n\n const renderFn = cardRegistry.get(cardEl);\n if (!renderFn) return undefined;\n\n return (row: TRow, rowIndex: number): HTMLElement => {\n const container = document.createElement('div');\n container.className = 'vue-responsive-card';\n\n const ctx: ResponsiveCardContext<TRow> = { row, rowIndex };\n const vnodes = renderFn(ctx as ResponsiveCardContext<unknown>);\n\n if (vnodes && vnodes.length > 0) {\n // Render VNodes into container\n const app = createApp({\n render() {\n return vnodes;\n },\n });\n app.mount(container);\n this.mountedViews.push({ app, container });\n }\n\n return container;\n };\n }\n\n // #region Type Defaults Support\n\n /**\n * Gets type-level defaults from the type defaults map.\n *\n * This enables application-wide type defaults configured via GridTypeProvider.\n * The returned TypeDefault contains renderer/editor functions that render\n * Vue components into the grid's cells.\n *\n * @example\n * ```vue\n * <script setup>\n * import { GridTypeProvider } from '@toolbox-web/grid-vue';\n * import { h } from 'vue';\n * import CountryBadge from './CountryBadge.vue';\n *\n * const typeDefaults = {\n * country: {\n * renderer: (ctx) => h(CountryBadge, { code: ctx.value }),\n * },\n * };\n * </script>\n *\n * <template>\n * <GridTypeProvider :defaults=\"typeDefaults\">\n * <App />\n * </GridTypeProvider>\n * </template>\n * ```\n */\n getTypeDefault<TRow = unknown>(type: string): BaseTypeDefault<TRow> | undefined {\n if (!this.typeDefaults) {\n return undefined;\n }\n\n const vueDefault = this.typeDefaults[type] as TypeDefault<TRow> | undefined;\n if (!vueDefault) {\n return undefined;\n }\n\n const typeDefault: BaseTypeDefault<TRow> = {\n editorParams: vueDefault.editorParams,\n };\n\n // Create renderer function that renders Vue component\n if (vueDefault.renderer) {\n typeDefault.renderer = this.createTypeRenderer<TRow>(vueDefault.renderer);\n }\n\n // Create editor function that renders Vue component\n if (vueDefault.editor) {\n typeDefault.editor = this.createTypeEditor<TRow>(vueDefault.editor) as BaseTypeDefault['editor'];\n }\n\n // Create filterPanelRenderer function that renders Vue component\n if (vueDefault.filterPanelRenderer) {\n typeDefault.filterPanelRenderer = this.createFilterPanelRenderer(vueDefault.filterPanelRenderer);\n }\n\n return typeDefault;\n }\n\n /**\n * Creates a renderer function from a Vue render function for type defaults.\n * @internal\n */\n private createTypeRenderer<TRow = unknown, TValue = unknown>(\n renderFn: (ctx: CellRenderContext<TRow, TValue>) => VNode,\n ): ColumnViewRenderer<TRow, TValue> {\n return (ctx: CellRenderContext<TRow, TValue>) => {\n const container = document.createElement('span');\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n this.mountedViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates an editor function from a Vue render function for type defaults.\n * @internal\n */\n private createTypeEditor<TRow = unknown, TValue = unknown>(\n renderFn: (ctx: ColumnEditorContext<TRow, TValue>) => VNode,\n ): ColumnEditorSpec<TRow, TValue> {\n return (ctx: ColumnEditorContext<TRow, TValue>) => {\n const container = document.createElement('span');\n container.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(ctx);\n },\n });\n\n app.mount(container);\n // Track in editor-specific array for per-cell cleanup via releaseCell\n this.editorViews.push({ app, container });\n\n return container;\n };\n }\n\n /**\n * Creates a filter panel renderer function from a Vue render function.\n *\n * Wraps a Vue `(params: FilterPanelParams) => VNode` function into the\n * imperative `(container, params) => void` signature expected by the core grid.\n * @internal\n */\n private createFilterPanelRenderer(\n renderFn: (params: FilterPanelParams) => VNode,\n ): (container: HTMLElement, params: FilterPanelParams) => void {\n return (container: HTMLElement, params: FilterPanelParams) => {\n const wrapper = document.createElement('div');\n wrapper.style.display = 'contents';\n\n const app = createApp({\n render() {\n return renderFn(params);\n },\n });\n\n app.mount(wrapper);\n this.mountedViews.push({ app, container: wrapper });\n container.appendChild(wrapper);\n };\n }\n\n // #endregion\n\n /**\n * Cleanup all mounted Vue apps.\n */\n cleanup(): void {\n for (const { app, container } of this.mountedViews) {\n try {\n app.unmount();\n container.remove();\n } catch {\n // Ignore cleanup errors\n }\n }\n this.mountedViews = [];\n for (const { app, container } of this.editorViews) {\n try {\n app.unmount();\n container.remove();\n } catch {\n // Ignore cleanup errors\n }\n }\n this.editorViews = [];\n fieldRegistries.clear();\n }\n\n /**\n * Unmount a specific container (e.g., detail panel, tool panel).\n * Finds the matching entry in mountedViews by container reference\n * and properly destroys the Vue app to prevent memory leaks.\n */\n unmount(container: HTMLElement): void {\n for (let i = this.mountedViews.length - 1; i >= 0; i--) {\n const view = this.mountedViews[i];\n if (view.container === container || container.contains(view.container)) {\n try {\n view.app.unmount();\n } catch {\n // Ignore cleanup errors\n }\n this.mountedViews.splice(i, 1);\n return;\n }\n }\n }\n\n /**\n * Called when a cell's content is about to be wiped.\n * Destroys editor Vue apps whose container is inside the cell.\n */\n releaseCell(cellEl: HTMLElement): void {\n for (let i = this.editorViews.length - 1; i >= 0; i--) {\n const { app, container } = this.editorViews[i];\n if (cellEl.contains(container)) {\n try {\n app.unmount();\n container.remove();\n } catch {\n // Ignore cleanup errors\n }\n this.editorViews.splice(i, 1);\n }\n }\n }\n}\n\n/**\n * @deprecated Use `GridAdapter` instead. This alias will be removed in v2.\n * @see {@link GridAdapter}\n */\nexport const VueGridAdapter = GridAdapter;\n","<script setup lang=\"ts\" generic=\"TRow = unknown\">\nimport type { BaseGridPlugin, ColumnConfig, DataGridElement, FitMode, GridConfig } from '@toolbox-web/grid';\nimport { DataGridElement as GridElement } from '@toolbox-web/grid';\nimport type {\n CellActivateDetail,\n CellChangeDetail,\n CellClickDetail,\n CellCommitDetail,\n ClipboardConfig,\n ColumnMoveDetail,\n ColumnResizeDetail,\n ColumnVirtualizationConfig,\n ColumnVisibilityDetail,\n ContextMenuConfig,\n CopyDetail,\n DetailExpandDetail,\n ExportCompleteDetail,\n ExportConfig,\n FilterChangeDetail,\n FilterConfig,\n GridColumnState,\n GroupingColumnsConfig,\n GroupingRowsConfig,\n GroupToggleDetail,\n MasterDetailConfig,\n MultiSortConfig,\n PasteDetail,\n PinnedRowsConfig,\n PivotConfig,\n PrintCompleteDetail,\n PrintConfig,\n PrintStartDetail,\n ReorderConfig,\n ResponsiveChangeDetail,\n ResponsivePluginConfig,\n RowClickDetail,\n RowCommitDetail,\n RowMoveDetail,\n RowReorderConfig,\n SelectionChangeDetail,\n SelectionConfig,\n ServerSideConfig,\n SortChangeDetail,\n TreeConfig,\n TreeExpandDetail,\n UndoRedoConfig,\n UndoRedoDetail,\n VisibilityConfig,\n} from '@toolbox-web/grid/all';\nimport { computed, onBeforeUnmount, onMounted, provide, ref, watch, type PropType } from 'vue';\nimport { createPluginFromFeature, type FeatureName } from './feature-registry';\nimport { useGridIcons } from './grid-icon-registry';\nimport { useGridTypeDefaults } from './grid-type-registry';\nimport { GRID_ELEMENT_KEY } from './use-grid';\nimport { GridAdapter, VueGridAdapter } from './vue-grid-adapter';\n\n// Track if adapter is registered\nlet adapterRegistered = false;\nlet globalAdapter: GridAdapter | null = null;\n\n/**\n * Ensure the Vue adapter is registered globally.\n */\nfunction ensureAdapterRegistered(): GridAdapter {\n if (!adapterRegistered) {\n globalAdapter = new VueGridAdapter();\n GridElement.registerAdapter(globalAdapter);\n adapterRegistered = true;\n }\n return globalAdapter as GridAdapter;\n}\n\n// Register adapter at module load\nensureAdapterRegistered();\n\n/**\n * Props for TbwGrid component\n */\nconst props = defineProps({\n /** Row data to display */\n rows: {\n type: Array as PropType<TRow[]>,\n default: () => [],\n },\n /** Column definitions (shorthand for gridConfig.columns) */\n columns: {\n type: Array as PropType<ColumnConfig<TRow>[]>,\n default: undefined,\n },\n /** Full grid configuration */\n gridConfig: {\n type: Object as PropType<GridConfig<TRow>>,\n default: undefined,\n },\n /** Fit mode shorthand */\n fitMode: {\n type: String as PropType<FitMode>,\n default: undefined,\n },\n\n // ═══════════════════════════════════════════════════════════════════\n // FEATURE PROPS - Declarative plugin configuration\n // ═══════════════════════════════════════════════════════════════════\n\n /** Enable cell/row/range selection */\n selection: {\n type: [String, Object] as PropType<'cell' | 'row' | 'range' | SelectionConfig<TRow>>,\n default: undefined,\n },\n /** Enable inline cell editing */\n editing: {\n type: [Boolean, String] as PropType<boolean | 'click' | 'dblclick' | 'manual'>,\n default: undefined,\n },\n /** Enable clipboard copy/paste */\n clipboard: {\n type: [Boolean, Object] as PropType<boolean | ClipboardConfig>,\n default: undefined,\n },\n /** Enable right-click context menu */\n contextMenu: {\n type: [Boolean, Object] as PropType<boolean | ContextMenuConfig>,\n default: undefined,\n },\n /** Enable multi-column sorting */\n multiSort: {\n type: [Boolean, String, Object] as PropType<boolean | 'single' | 'multi' | MultiSortConfig>,\n default: undefined,\n },\n /** @deprecated Use multiSort instead. Will be removed in v2. */\n sorting: {\n type: [Boolean, String, Object] as PropType<boolean | 'single' | 'multi' | MultiSortConfig>,\n default: undefined,\n },\n /** Enable column filtering */\n filtering: {\n type: [Boolean, Object] as PropType<boolean | FilterConfig<TRow>>,\n default: undefined,\n },\n /** Enable column drag-to-reorder */\n reorderColumns: {\n type: [Boolean, Object] as PropType<boolean | ReorderConfig>,\n default: undefined,\n },\n /** @deprecated Use `reorderColumns` instead. Will be removed in v2. */\n reorder: {\n type: [Boolean, Object] as PropType<boolean | ReorderConfig>,\n default: undefined,\n },\n /** Enable column visibility toggle panel */\n visibility: {\n type: [Boolean, Object] as PropType<boolean | VisibilityConfig>,\n default: undefined,\n },\n /** Enable pinned/sticky columns */\n pinnedColumns: {\n type: Boolean as PropType<boolean>,\n default: undefined,\n },\n /** Enable multi-level column headers */\n groupingColumns: {\n type: [Boolean, Object] as PropType<boolean | GroupingColumnsConfig>,\n default: undefined,\n },\n /** Enable horizontal column virtualization */\n columnVirtualization: {\n type: [Boolean, Object] as PropType<boolean | ColumnVirtualizationConfig>,\n default: undefined,\n },\n /** Enable row drag-to-reorder */\n reorderRows: {\n type: [Boolean, Object] as PropType<boolean | RowReorderConfig>,\n default: undefined,\n },\n /** @deprecated Use `reorderRows` instead. Will be removed in v2. */\n rowReorder: {\n type: [Boolean, Object] as PropType<boolean | RowReorderConfig>,\n default: undefined,\n },\n /** Enable row grouping by field values */\n groupingRows: {\n type: Object as PropType<GroupingRowsConfig>,\n default: undefined,\n },\n /** Enable pinned rows */\n pinnedRows: {\n type: [Boolean, Object] as PropType<boolean | PinnedRowsConfig>,\n default: undefined,\n },\n /** Enable hierarchical tree view */\n tree: {\n type: [Boolean, Object] as PropType<boolean | TreeConfig>,\n default: undefined,\n },\n /** Enable master-detail expandable rows */\n masterDetail: {\n type: Object as PropType<MasterDetailConfig>,\n default: undefined,\n },\n /** Enable responsive card layout */\n responsive: {\n type: [Boolean, Object] as PropType<boolean | ResponsivePluginConfig>,\n default: undefined,\n },\n /** Enable undo/redo for cell edits */\n undoRedo: {\n type: [Boolean, Object] as PropType<boolean | UndoRedoConfig>,\n default: undefined,\n },\n /** Enable CSV/JSON export */\n export: {\n type: [Boolean, Object] as PropType<boolean | ExportConfig>,\n default: undefined,\n },\n /** Enable print functionality */\n print: {\n type: [Boolean, Object] as PropType<boolean | PrintConfig>,\n default: undefined,\n },\n /** Enable pivot table functionality */\n pivot: {\n type: Object as PropType<PivotConfig>,\n default: undefined,\n },\n /** Enable server-side data operations */\n serverSide: {\n type: Object as PropType<ServerSideConfig>,\n default: undefined,\n },\n});\n\n/**\n * Event name → CustomEvent detail type map.\n * Used internally to wire up event listeners.\n */\nconst EVENT_MAP = {\n 'cell-click': '' as unknown as CellClickDetail,\n 'row-click': '' as unknown as RowClickDetail,\n 'cell-activate': '' as unknown as CellActivateDetail,\n 'cell-change': '' as unknown as CellChangeDetail,\n 'cell-commit': '' as unknown as CellCommitDetail,\n 'row-commit': '' as unknown as RowCommitDetail,\n 'sort-change': '' as unknown as SortChangeDetail,\n 'filter-change': '' as unknown as FilterChangeDetail,\n 'column-resize': '' as unknown as ColumnResizeDetail,\n 'column-move': '' as unknown as ColumnMoveDetail,\n 'column-visibility': '' as unknown as ColumnVisibilityDetail,\n 'column-state-change': '' as unknown as GridColumnState,\n 'selection-change': '' as unknown as SelectionChangeDetail,\n 'row-move': '' as unknown as RowMoveDetail,\n 'group-toggle': '' as unknown as GroupToggleDetail,\n 'tree-expand': '' as unknown as TreeExpandDetail,\n 'detail-expand': '' as unknown as DetailExpandDetail,\n 'responsive-change': '' as unknown as ResponsiveChangeDetail,\n copy: '' as unknown as CopyDetail,\n paste: '' as unknown as PasteDetail,\n 'undo-redo': '' as unknown as UndoRedoDetail,\n 'export-complete': '' as unknown as ExportCompleteDetail,\n 'print-start': '' as unknown as PrintStartDetail,\n 'print-complete': '' as unknown as PrintCompleteDetail,\n} as const;\n\n/**\n * Emits for TbwGrid — all grid events forwarded as Vue emits.\n */\nconst emit = defineEmits<{\n (e: 'cell-click', event: CustomEvent<CellClickDetail<TRow>>): void;\n (e: 'row-click', event: CustomEvent<RowClickDetail<TRow>>): void;\n (e: 'cell-activate', event: CustomEvent<CellActivateDetail<TRow>>): void;\n (e: 'cell-change', event: CustomEvent<CellChangeDetail<TRow>>): void;\n (e: 'cell-commit', event: CustomEvent<CellCommitDetail<TRow>>): void;\n (e: 'row-commit', event: CustomEvent<RowCommitDetail<TRow>>): void;\n (e: 'sort-change', event: CustomEvent<SortChangeDetail>): void;\n (e: 'filter-change', event: CustomEvent<FilterChangeDetail>): void;\n (e: 'column-resize', event: CustomEvent<ColumnResizeDetail>): void;\n (e: 'column-move', event: CustomEvent<ColumnMoveDetail>): void;\n (e: 'column-visibility', event: CustomEvent<ColumnVisibilityDetail>): void;\n (e: 'column-state-change', event: CustomEvent<GridColumnState>): void;\n (e: 'selection-change', event: CustomEvent<SelectionChangeDetail>): void;\n (e: 'row-move', event: CustomEvent<RowMoveDetail<TRow>>): void;\n (e: 'group-toggle', event: CustomEvent<GroupToggleDetail>): void;\n (e: 'tree-expand', event: CustomEvent<TreeExpandDetail<TRow>>): void;\n (e: 'detail-expand', event: CustomEvent<DetailExpandDetail>): void;\n (e: 'responsive-change', event: CustomEvent<ResponsiveChangeDetail>): void;\n (e: 'copy', event: CustomEvent<CopyDetail>): void;\n (e: 'paste', event: CustomEvent<PasteDetail>): void;\n (e: 'undo-redo', event: CustomEvent<UndoRedoDetail>): void;\n (e: 'export-complete', event: CustomEvent<ExportCompleteDetail>): void;\n (e: 'print-start', event: CustomEvent<PrintStartDetail>): void;\n (e: 'print-complete', event: CustomEvent<PrintCompleteDetail>): void;\n}>();\n\n// Template ref for the grid element\nconst gridRef = ref<DataGridElement<TRow> | null>(null);\n\n// Provide grid element to descendants (for useGrid composable)\nprovide(GRID_ELEMENT_KEY, gridRef);\n\n// Get type defaults and icons from providers\nconst typeDefaults = useGridTypeDefaults();\nconst iconOverrides = useGridIcons();\n\n// Feature prop names for creating plugins\nconst FEATURE_PROPS: FeatureName[] = [\n 'selection',\n 'editing',\n 'clipboard',\n 'contextMenu',\n 'multiSort',\n 'sorting',\n 'filtering',\n 'reorderColumns',\n 'reorder', // deprecated alias for reorderColumns\n 'visibility',\n 'pinnedColumns',\n 'groupingColumns',\n 'columnVirtualization',\n 'reorderRows',\n 'rowReorder', // deprecated alias for reorderRows\n 'groupingRows',\n 'pinnedRows',\n 'tree',\n 'masterDetail',\n 'responsive',\n 'undoRedo',\n 'export',\n 'print',\n 'pivot',\n 'serverSide',\n];\n\n/**\n * Create plugins from feature props.\n */\nfunction createFeaturePlugins(): BaseGridPlugin[] {\n const plugins: BaseGridPlugin[] = [];\n\n for (const feature of FEATURE_PROPS) {\n const propValue = props[feature as keyof typeof props];\n if (propValue !== undefined) {\n const plugin = createPluginFromFeature(feature, propValue);\n if (plugin) {\n plugins.push(plugin as BaseGridPlugin);\n }\n }\n }\n\n return plugins;\n}\n\n// Merged config with feature plugins\nconst mergedConfig = computed<GridConfig<TRow> | undefined>(() => {\n const baseConfig = props.gridConfig ?? {};\n const featurePlugins = createFeaturePlugins();\n const configPlugins = (baseConfig.plugins as BaseGridPlugin[]) ?? [];\n\n // Merge: feature plugins first, then config plugins\n const mergedPlugins = [...featurePlugins, ...configPlugins];\n\n // Apply type defaults if provided\n const typeDefaults$ = typeDefaults;\n\n // Apply icon overrides if provided\n const icons = iconOverrides ? { ...baseConfig.icons, ...iconOverrides } : baseConfig.icons;\n\n return {\n ...baseConfig,\n ...(props.columns ? { columns: props.columns } : {}),\n ...(mergedPlugins.length > 0 ? { plugins: mergedPlugins } : {}),\n ...(icons ? { icons } : {}),\n } as GridConfig<TRow>;\n});\n\n// Unsubscribe functions for grid event listeners\nconst eventCleanups: (() => void)[] = [];\n\n// Setup and cleanup\nonMounted(() => {\n const grid = gridRef.value as unknown as HTMLElement & DataGridElement<TRow>;\n if (!grid) return;\n\n // Attach the framework adapter to the grid element\n // This enables MasterDetailPlugin and ResponsivePlugin to use Vue-based renderers\n const adapter = ensureAdapterRegistered();\n (grid as any).__frameworkAdapter = adapter;\n\n // Pass type defaults to the adapter\n adapter.setTypeDefaults(typeDefaults ?? null);\n\n // Subscribe to grid events and store unsubscribe functions\n // Subscribe to all grid events and forward as Vue emits\n for (const eventName of Object.keys(EVENT_MAP)) {\n eventCleanups.push(grid.on(eventName as string, (_d: unknown, e: CustomEvent) => emit(eventName as any, e)));\n }\n\n // Set initial data\n if (props.rows.length > 0) {\n grid.rows = props.rows;\n }\n if (mergedConfig.value) {\n // Process through adapter before passing to grid\n grid.gridConfig = mergedConfig.value;\n }\n if (props.fitMode) {\n grid.fitMode = props.fitMode;\n }\n});\n\nonBeforeUnmount(() => {\n const grid = gridRef.value as unknown as HTMLElement & DataGridElement<TRow>;\n if (!grid) return;\n\n // Unsubscribe all grid event listeners\n eventCleanups.forEach((fn) => fn());\n eventCleanups.length = 0;\n});\n\n// Watch for prop changes\nwatch(\n () => props.rows,\n (newRows) => {\n if (gridRef.value) {\n gridRef.value.rows = newRows;\n }\n },\n { deep: true },\n);\n\nwatch(\n mergedConfig,\n (newConfig) => {\n if (gridRef.value && newConfig) {\n gridRef.value.gridConfig = newConfig;\n }\n },\n { deep: true },\n);\n\nwatch(\n () => props.fitMode,\n (newFitMode) => {\n if (gridRef.value && newFitMode) {\n gridRef.value.fitMode = newFitMode;\n }\n },\n);\n\n// Watch for type defaults changes\nwatch(\n () => typeDefaults,\n (newTypeDefaults) => {\n const adapter = ensureAdapterRegistered();\n adapter.setTypeDefaults(newTypeDefaults ?? null);\n },\n { deep: true },\n);\n\n// Expose the grid element for programmatic access\ndefineExpose({\n /** The underlying grid element */\n gridElement: gridRef,\n /** Force a layout recalculation */\n forceLayout: () => gridRef.value?.forceLayout(),\n /** Get current grid configuration */\n getConfig: () => gridRef.value?.getConfig(),\n /** Wait for grid to be ready */\n ready: () => gridRef.value?.ready(),\n});\n</script>\n\n<template>\n <tbw-grid ref=\"gridRef\">\n <slot></slot>\n </tbw-grid>\n</template>\n","<script setup lang=\"ts\">\nimport type { CellRenderContext, ColumnEditorContext } from '@toolbox-web/grid';\nimport { h, onMounted, ref, type VNode } from 'vue';\nimport type { CellSlotProps, EditorSlotProps } from './slot-types';\nimport { registerColumnEditor, registerColumnRenderer } from './vue-grid-adapter';\n\n/**\n * Props for TbwGridColumn\n */\nconst props = defineProps<{\n /** Field path in the row object */\n field: string;\n /** Column header text */\n header?: string;\n /** Column width */\n width?: string | number;\n /** Minimum column width */\n minWidth?: string | number;\n /** Maximum column width */\n maxWidth?: string | number;\n /** Whether the column is sortable */\n sortable?: boolean;\n /** Whether the column is resizable */\n resizable?: boolean;\n /** Whether the column is editable */\n editable?: boolean;\n /** Data type for the column */\n type?: string;\n /** Column alignment */\n align?: 'left' | 'center' | 'right';\n /** Whether the column is hidden */\n hidden?: boolean;\n}>();\n\n// Define slots with proper typing and get the slots object\nconst slots = defineSlots<{\n /** Custom cell renderer slot */\n cell?: (props: CellSlotProps) => VNode[];\n /** Custom cell editor slot */\n editor?: (props: EditorSlotProps) => VNode[];\n}>();\n\n// Template ref for the column element\nconst columnRef = ref<HTMLElement | null>(null);\n\nonMounted(() => {\n const element = columnRef.value;\n if (!element) return;\n\n // Check if cell slot exists by trying to access it\n const hasCellSlot = !!slots.cell;\n const hasEditorSlot = !!slots.editor;\n\n // Register renderer if #cell slot is provided\n if (hasCellSlot) {\n registerColumnRenderer(element, (ctx: CellRenderContext<unknown, unknown>) => {\n const slotFn = slots.cell;\n if (!slotFn) return h('span');\n const slotContent = slotFn({\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n });\n // Return the VNode array wrapped in a div\n return h('div', { style: 'display: contents' }, slotContent);\n });\n }\n\n // Register editor if #editor slot is provided\n if (hasEditorSlot) {\n registerColumnEditor(element, (ctx: ColumnEditorContext<unknown, unknown>) => {\n const slotFn = slots.editor;\n if (!slotFn) return h('span');\n const slotContent = slotFn({\n value: ctx.value,\n row: ctx.row,\n column: ctx.column,\n field: ctx.field,\n rowId: ctx.rowId ?? '',\n commit: ctx.commit,\n cancel: ctx.cancel,\n updateRow: ctx.updateRow,\n onValueChange: ctx.onValueChange,\n });\n return h('div', { style: 'display: contents' }, slotContent);\n });\n }\n});\n</script>\n\n<template>\n <tbw-grid-column\n ref=\"columnRef\"\n :field=\"field\"\n :header=\"header\"\n :width=\"width\"\n :min-width=\"minWidth\"\n :max-width=\"maxWidth\"\n :sortable=\"sortable\"\n :resizable=\"resizable\"\n :editable=\"editable\"\n :type=\"type\"\n :align=\"align\"\n :hidden=\"hidden\"\n >\n <!-- Hidden slot to capture slot definitions -->\n </tbw-grid-column>\n</template>\n","<script setup lang=\"ts\" generic=\"TRow = unknown\">\nimport { onMounted, ref, useSlots, type VNode } from 'vue';\nimport { detailRegistry, type DetailPanelContext } from './detail-panel-registry';\n\n/**\n * Props for TbwGridDetailPanel\n */\nconst props = withDefaults(\n defineProps<{\n /**\n * Whether to show the expand/collapse column.\n * @default true\n */\n showExpandColumn?: boolean;\n\n /**\n * Animation style for expand/collapse.\n * - 'slide': Smooth height animation (default)\n * - 'fade': Opacity transition\n * - false: No animation\n * @default 'slide'\n */\n animation?: 'slide' | 'fade' | false;\n }>(),\n {\n showExpandColumn: true,\n animation: 'slide',\n },\n);\n\n// Define slots with proper typing\ndefineSlots<{\n /** Detail panel content slot */\n default?: (props: DetailPanelContext<TRow>) => VNode[];\n}>();\n\n// Template ref for the detail element\nconst detailRef = ref<HTMLElement | null>(null);\nconst slots = useSlots();\n\nonMounted(() => {\n const element = detailRef.value;\n if (!element || !slots.default) return;\n\n // Register the slot renderer\n detailRegistry.set(element, (ctx: DetailPanelContext<unknown>) => {\n return slots.default?.(ctx as DetailPanelContext<TRow>);\n });\n});\n</script>\n\n<template>\n <tbw-grid-detail ref=\"detailRef\" :show-expand-column=\"showExpandColumn\" :animation=\"animation\" />\n</template>\n","<script setup lang=\"ts\" generic=\"TRow = unknown\">\nimport { onMounted, ref, useSlots, type VNode } from 'vue';\nimport { cardRegistry, type ResponsiveCardContext } from './responsive-card-registry';\n\n/**\n * Props for TbwGridResponsiveCard\n */\nconst props = defineProps<{\n // Currently no additional props needed\n}>();\n\n// Define slots with proper typing\ndefineSlots<{\n /** Card content slot */\n default?: (props: ResponsiveCardContext<TRow>) => VNode[];\n}>();\n\n// Template ref for the card element\nconst cardRef = ref<HTMLElement | null>(null);\nconst slots = useSlots();\n\nonMounted(() => {\n const element = cardRef.value;\n if (!element || !slots.default) return;\n\n // Register the slot renderer\n cardRegistry.set(element, (ctx: ResponsiveCardContext<unknown>) => {\n return slots.default?.(ctx as ResponsiveCardContext<TRow>);\n });\n});\n</script>\n\n<template>\n <tbw-grid-responsive-card ref=\"cardRef\" />\n</template>\n","<script setup lang=\"ts\">\nimport { type VNode } from 'vue';\n\n/**\n * Props for TbwGridToolButtons\n */\ndefineProps<{\n // Currently no additional props needed\n}>();\n\n// Define slots with proper typing\ndefineSlots<{\n /** Tool button content slot */\n default?: () => VNode[];\n}>();\n</script>\n\n<template>\n <tbw-grid-tool-buttons>\n <slot />\n </tbw-grid-tool-buttons>\n</template>\n","/**\n * Registry for tool panel renderers.\n * @internal\n */\nimport type { VNode } from 'vue';\n\n/**\n * Context object passed to the tool panel slot.\n */\nexport interface ToolPanelContext {\n /** The grid element */\n gridElement: HTMLElement;\n}\n\n/**\n * Registry for tool panel renderers (per element)\n */\nexport const toolPanelRegistry = new WeakMap<HTMLElement, (ctx: ToolPanelContext) => VNode[] | undefined>();\n\n/**\n * Get the tool panel renderer for an element.\n * @internal\n */\nexport function getToolPanelRenderer(\n panelElement: HTMLElement,\n): ((ctx: ToolPanelContext) => VNode[] | undefined) | undefined {\n return toolPanelRegistry.get(panelElement);\n}\n","<script setup lang=\"ts\">\nimport { onMounted, ref, useSlots, type VNode } from 'vue';\nimport { toolPanelRegistry, type ToolPanelContext } from './tool-panel-registry';\n\n/**\n * Props for TbwGridToolPanel\n */\nconst props = withDefaults(\n defineProps<{\n /**\n * Unique identifier for this tool panel.\n */\n id: string;\n\n /**\n * Display label for the panel tab/button.\n */\n label: string;\n\n /**\n * Icon for the panel tab (string or SVG).\n */\n icon?: string;\n\n /**\n * Position of the panel.\n * @default 'right'\n */\n position?: 'left' | 'right';\n\n /**\n * Width of the panel when open.\n * @default '250px'\n */\n width?: string;\n }>(),\n {\n position: 'right',\n width: '250px',\n },\n);\n\n// Define slots with proper typing\ndefineSlots<{\n /** Tool panel content slot */\n default?: (props: ToolPanelContext) => VNode[];\n}>();\n\n// Template ref for the tool panel element\nconst panelRef = ref<HTMLElement | null>(null);\nconst slots = useSlots();\n\nonMounted(() => {\n const element = panelRef.value;\n if (!element || !slots.default) return;\n\n // Register the slot renderer\n toolPanelRegistry.set(element, (ctx: ToolPanelContext) => {\n return slots.default?.(ctx);\n });\n});\n</script>\n\n<template>\n <tbw-grid-tool-panel ref=\"panelRef\" :id=\"id\" :label=\"label\" :icon=\"icon\" :position=\"position\" :width=\"width\" />\n</template>\n","import type { DataGridElement } from '@toolbox-web/grid';\nimport type {\n CellActivateDetail,\n CellChangeDetail,\n CellClickDetail,\n CellCommitDetail,\n ColumnMoveDetail,\n ColumnResizeDetail,\n ColumnVisibilityDetail,\n CopyDetail,\n DetailExpandDetail,\n ExportCompleteDetail,\n FilterChangeDetail,\n GridColumnState,\n GroupToggleDetail,\n PasteDetail,\n PrintCompleteDetail,\n PrintStartDetail,\n ResponsiveChangeDetail,\n RowClickDetail,\n RowCommitDetail,\n RowMoveDetail,\n SelectionChangeDetail,\n SortChangeDetail,\n TreeExpandDetail,\n UndoRedoDetail,\n} from '@toolbox-web/grid/all';\nimport { inject, onBeforeUnmount, onMounted, ref, type Ref } from 'vue';\nimport { GRID_ELEMENT_KEY } from './use-grid';\n\n/**\n * Grid event types and their payload types.\n *\n * @deprecated Use `@event` handlers directly on `<TbwGrid>` instead of useGridEvent.\n * Will be removed in v2.\n */\nexport interface GridEventMap {\n 'cell-click': CellClickDetail;\n 'row-click': RowClickDetail;\n 'cell-activate': CellActivateDetail;\n 'cell-change': CellChangeDetail;\n 'cell-commit': CellCommitDetail;\n 'row-commit': RowCommitDetail;\n 'sort-change': SortChangeDetail;\n 'filter-change': FilterChangeDetail;\n 'column-resize': ColumnResizeDetail;\n 'column-move': ColumnMoveDetail;\n 'column-visibility': ColumnVisibilityDetail;\n 'column-state-change': GridColumnState;\n 'selection-change': SelectionChangeDetail;\n 'row-move': RowMoveDetail;\n 'group-toggle': GroupToggleDetail;\n 'tree-expand': TreeExpandDetail;\n 'detail-expand': DetailExpandDetail;\n 'responsive-change': ResponsiveChangeDetail;\n copy: CopyDetail;\n paste: PasteDetail;\n 'undo-redo': UndoRedoDetail;\n 'export-complete': ExportCompleteDetail;\n 'print-start': PrintStartDetail;\n 'print-complete': PrintCompleteDetail;\n}\n\n// Track whether we've shown the deprecation warning (only show once per session)\nlet hasShownDeprecationWarning = false;\n\n/**\n * @deprecated Use `@event` handlers directly on `<TbwGrid>` instead of useGridEvent. Will be removed in v2.\n *\n * ## Migration Guide\n *\n * **Before (useGridEvent):**\n * ```vue\n * <script setup>\n * import { useGridEvent } from '@toolbox-web/grid-vue';\n * useGridEvent('selection-change', (e) => console.log(e.detail));\n * </script>\n * <template><TbwGrid :rows=\"rows\" /></template>\n * ```\n *\n * **After (@event handlers):**\n * ```vue\n * <template>\n * <TbwGrid :rows=\"rows\" @selection-change=\"(e) => console.log(e.detail)\" />\n * </template>\n * ```\n *\n * Event handlers on `<TbwGrid>` provide:\n * - Cleaner, more declarative API\n * - Automatic cleanup (no composable needed)\n * - Better TypeScript inference via typed emits\n * - Consistent with Vue patterns\n *\n * @param eventName - The name of the grid event to listen for\n * @param handler - The event handler function\n * @param gridElement - Optional grid element ref (uses injected if not provided)\n */\nexport function useGridEvent<K extends keyof GridEventMap>(\n eventName: K,\n handler: (event: CustomEvent<GridEventMap[K]>) => void,\n gridElement?: Ref<DataGridElement | null>,\n): void {\n // Show deprecation warning once per session (in development only)\n if (!hasShownDeprecationWarning && typeof window !== 'undefined') {\n const isDev =\n window.location.hostname === 'localhost' ||\n window.location.hostname === '127.0.0.1' ||\n window.location.hostname.includes('.local');\n\n if (isDev) {\n hasShownDeprecationWarning = true;\n console.warn(\n `[useGridEvent] Deprecated: Use @event handlers directly on <TbwGrid> instead.\\n` +\n `Example: <TbwGrid @selection-change=\"handler\" />\\n` +\n `See migration guide: https://toolboxjs.com/grid-vue/migration`,\n );\n }\n }\n\n const grid = gridElement ?? inject(GRID_ELEMENT_KEY, ref(null));\n let cleanup: (() => void) | null = null;\n\n onMounted(() => {\n const element = grid.value;\n if (!element) return;\n\n cleanup = element.on(eventName as string, (_detail: unknown, event: CustomEvent) =>\n handler(event as CustomEvent<GridEventMap[K]>),\n );\n });\n\n onBeforeUnmount(() => {\n cleanup?.();\n });\n}\n","/**\n * Combined provider for type defaults and icons.\n *\n * Convenience component that combines GridTypeProvider and GridIconProvider.\n */\nimport type { GridIcons } from '@toolbox-web/grid';\nimport { defineComponent, h, type PropType, type VNode } from 'vue';\nimport { GridIconProvider } from './grid-icon-registry';\nimport { GridTypeProvider, type TypeDefaultsMap } from './grid-type-registry';\n\n/**\n * Combined provider for type defaults and icons.\n *\n * @example\n * ```vue\n * <script setup>\n * import { GridProvider, type TypeDefaultsMap } from '@toolbox-web/grid-vue';\n * import { h } from 'vue';\n *\n * const typeDefaults: TypeDefaultsMap = {\n * country: { renderer: (ctx) => h('span', ctx.value) },\n * };\n *\n * const icons = { sortAsc: '↑', sortDesc: '↓' };\n * </script>\n *\n * <template>\n * <GridProvider :typeDefaults=\"typeDefaults\" :icons=\"icons\">\n * <App />\n * </GridProvider>\n * </template>\n * ```\n */\nexport const GridProvider = defineComponent({\n name: 'GridProvider',\n props: {\n /**\n * Type defaults to provide to all descendant grids.\n */\n typeDefaults: {\n type: Object as PropType<TypeDefaultsMap>,\n default: undefined,\n },\n /**\n * Icon overrides to provide to all descendant grids.\n */\n icons: {\n type: Object as PropType<Partial<GridIcons>>,\n default: undefined,\n },\n },\n setup(props, { slots }) {\n return () => {\n let content: VNode[] | VNode | undefined = slots.default?.();\n\n // Wrap with type provider if typeDefaults is provided\n if (props.typeDefaults) {\n const inner = content;\n content = h(GridTypeProvider, { defaults: props.typeDefaults }, () => inner);\n }\n\n // Wrap with icon provider if icons is provided\n if (props.icons) {\n const inner = content;\n content = h(GridIconProvider, { icons: props.icons }, () => inner);\n }\n\n return content;\n };\n },\n});\n\nexport type GridProviderProps = InstanceType<typeof GridProvider>['$props'];\n"],"names":["GRID_ICONS","useGridIcons","inject","GridIconProvider","defineComponent","props","slots","provide","GRID_TYPE_DEFAULTS","useGridTypeDefaults","useTypeDefault","typeName","GridTypeProvider","detailRegistry","cardRegistry","columnRegistries","fieldRegistries","registerColumnRenderer","element","renderer","field","registry","fieldRegistry","registerColumnEditor","editor","getColumnRenderer","getColumnEditor","isVueComponent","value","obj","fnString","fn","isVNodeRenderFunction","PROCESSED_MARKER","GridAdapter","config","vueConfig","result","col","typeDefaults","processed","type","processedConfig","column","wrapped","component","cellCache","ctx","cellEl","cached","container","currentCtx","comp","app","createApp","createVNode","newCtx","renderFn","defaults","hasRenderer","hasEditor","editorFn","detailElement","gridElement","detailEl","row","rowIndex","vnodes","cardElement","cardEl","vueDefault","typeDefault","params","wrapper","i","view","VueGridAdapter","adapterRegistered","globalAdapter","ensureAdapterRegistered","GridElement","__props","EVENT_MAP","emit","__emit","gridRef","ref","GRID_ELEMENT_KEY","iconOverrides","FEATURE_PROPS","createFeaturePlugins","plugins","feature","propValue","plugin","createPluginFromFeature","mergedConfig","computed","baseConfig","featurePlugins","configPlugins","mergedPlugins","icons","eventCleanups","onMounted","grid","adapter","eventName","_d","e","onBeforeUnmount","watch","newRows","newConfig","newFitMode","newTypeDefaults","__expose","_createElementBlock","_renderSlot","_ctx","_useSlots","columnRef","hasCellSlot","hasEditorSlot","slotFn","h","slotContent","detailRef","useSlots","cardRef","toolPanelRegistry","panelRef","hasShownDeprecationWarning","useGridEvent","handler","cleanup","_detail","event","GridProvider","content","inner"],"mappings":"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"}
|
|
@@ -30,7 +30,8 @@ export declare function getColumnEditor(element: HTMLElement): ((ctx: ColumnEdit
|
|
|
30
30
|
export declare function getRegisteredFields(): string[];
|
|
31
31
|
/**
|
|
32
32
|
* Clear the field registries.
|
|
33
|
-
*
|
|
33
|
+
* Called during adapter cleanup and in tests.
|
|
34
|
+
* @internal
|
|
34
35
|
*/
|
|
35
36
|
export declare function clearFieldRegistries(): void;
|
|
36
37
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue-grid-adapter.d.ts","sourceRoot":"","sources":["../../../../libs/grid-vue/src/lib/vue-grid-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,IAAI,gBAAgB,EAChC,UAAU,IAAI,cAAc,EAC5B,WAAW,IAAI,eAAe,EAC9B,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAIjB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAoC,KAAK,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC;AAEnF,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACpE,YAAY,EAAE,UAAU,EAAE,CAAC;AAgB3B;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,CAAC,GAAG,EAAE,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,GAC5D,IAAI,CAaN;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,CAAC,GAAG,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,GAC5D,IAAI,CAYN;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,GACnB,CAAC,CAAC,GAAG,EAAE,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,CAAC,GAAG,SAAS,CAYnE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,WAAW,GACnB,CAAC,CAAC,GAAG,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,CAAC,GAAG,SAAS,CAYrE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAED
|
|
1
|
+
{"version":3,"file":"vue-grid-adapter.d.ts","sourceRoot":"","sources":["../../../../libs/grid-vue/src/lib/vue-grid-adapter.ts"],"names":[],"mappings":"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"}
|