@toolbox-web/grid-vue 0.5.0 → 0.5.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 CHANGED
@@ -1,4 +1,4 @@
1
- import { defineComponent as y, provide as L, inject as F, createApp as f, createVNode as k, ref as R, computed as ne, onMounted as T, onBeforeUnmount as q, watch as j, createElementBlock as O, openBlock as P, renderSlot as U, useSlots as B, h as C } from "vue";
1
+ import { defineComponent as y, provide as L, inject as F, createApp as f, createVNode as k, ref as R, computed as ne, onMounted as T, onBeforeUnmount as q, watch as G, createElementBlock as O, openBlock as P, renderSlot as U, useSlots as B, h as C } from "vue";
2
2
  import { DataGridElement as re } from "@toolbox-web/grid";
3
3
  import { c as oe } from "./chunks/feature-registry-BgEOysSJ.js";
4
4
  import { a as Se, g as ke, b as Le, i as Fe, r as Me } from "./chunks/feature-registry-BgEOysSJ.js";
@@ -74,7 +74,7 @@ function ue(i) {
74
74
  }
75
75
  return e;
76
76
  }
77
- function G(i) {
77
+ function D(i) {
78
78
  if (i == null || typeof i == "function" && i.prototype === void 0)
79
79
  return !1;
80
80
  if (typeof i == "object") {
@@ -89,8 +89,8 @@ function G(i) {
89
89
  }
90
90
  return !1;
91
91
  }
92
- function V(i) {
93
- return typeof i == "function" && !G(i);
92
+ function j(i) {
93
+ return typeof i == "function" && !D(i);
94
94
  }
95
95
  const E = /* @__PURE__ */ Symbol.for("tbw:vue-processed");
96
96
  class fe {
@@ -140,11 +140,11 @@ class fe {
140
140
  const s = {
141
141
  editorParams: r.editorParams
142
142
  };
143
- r.renderer && (G(r.renderer) ? s.renderer = this.createConfigComponentRenderer(r.renderer) : V(r.renderer) && (s.renderer = this.createTypeRenderer(
143
+ r.renderer && (D(r.renderer) ? s.renderer = this.createConfigComponentRenderer(r.renderer) : j(r.renderer) && (s.renderer = this.createTypeRenderer(
144
144
  r.renderer
145
- ))), r.editor && (G(r.editor) ? s.editor = this.createConfigComponentEditor(
145
+ ))), r.editor && (D(r.editor) ? s.editor = this.createConfigComponentEditor(
146
146
  r.editor
147
- ) : V(r.editor) && (s.editor = this.createTypeEditor(
147
+ ) : j(r.editor) && (s.editor = this.createTypeEditor(
148
148
  r.editor
149
149
  ))), r.filterPanelRenderer && (s.filterPanelRenderer = this.createFilterPanelRenderer(r.filterPanelRenderer)), t[n] = s;
150
150
  }
@@ -160,19 +160,19 @@ class fe {
160
160
  processColumn(e) {
161
161
  const t = { ...e };
162
162
  if (e.renderer && !e.renderer[E]) {
163
- if (G(e.renderer)) {
163
+ if (D(e.renderer)) {
164
164
  const n = this.createConfigComponentRenderer(e.renderer);
165
165
  n[E] = !0, t.renderer = n;
166
- } else if (V(e.renderer)) {
166
+ } else if (j(e.renderer)) {
167
167
  const n = this.createConfigVNodeRenderer(e.renderer);
168
168
  n[E] = !0, t.renderer = n;
169
169
  }
170
170
  }
171
171
  if (e.editor && !e.editor[E]) {
172
- if (G(e.editor)) {
172
+ if (D(e.editor)) {
173
173
  const n = this.createConfigComponentEditor(e.editor);
174
174
  n[E] = !0, t.editor = n;
175
- } else if (V(e.editor)) {
175
+ } else if (j(e.editor)) {
176
176
  const n = this.createConfigVNodeEditor(e.editor);
177
177
  n[E] = !0, t.editor = n;
178
178
  }
@@ -203,8 +203,8 @@ class fe {
203
203
  return h.mount(c), t.set(r, {
204
204
  app: h,
205
205
  container: c,
206
- update: (_) => {
207
- u = _, h._instance?.update();
206
+ update: (V) => {
207
+ u = V, h._instance?.update();
208
208
  }
209
209
  }), c;
210
210
  }
@@ -535,6 +535,24 @@ class fe {
535
535
  }
536
536
  this.editorViews = [];
537
537
  }
538
+ /**
539
+ * Unmount a specific container (e.g., detail panel, tool panel).
540
+ * Finds the matching entry in mountedViews by container reference
541
+ * and properly destroys the Vue app to prevent memory leaks.
542
+ */
543
+ unmount(e) {
544
+ for (let t = this.mountedViews.length - 1; t >= 0; t--) {
545
+ const n = this.mountedViews[t];
546
+ if (n.container === e || e.contains(n.container)) {
547
+ try {
548
+ n.app.unmount();
549
+ } catch {
550
+ }
551
+ this.mountedViews.splice(t, 1);
552
+ return;
553
+ }
554
+ }
555
+ }
538
556
  /**
539
557
  * Called when a cell's content is about to be wiped.
540
558
  * Destroys editor Vue apps whose container is inside the cell.
@@ -739,13 +757,13 @@ const pe = fe, Re = /* @__PURE__ */ y({
739
757
  }
740
758
  return o;
741
759
  }
742
- const _ = ne(() => {
743
- const o = d.gridConfig ?? {}, p = h(), b = o.plugins ?? [], m = [...p, ...b], D = u ? { ...o.icons, ...u } : o.icons;
760
+ const V = ne(() => {
761
+ const o = d.gridConfig ?? {}, p = h(), b = o.plugins ?? [], m = [...p, ...b], _ = u ? { ...o.icons, ...u } : o.icons;
744
762
  return {
745
763
  ...o,
746
764
  ...d.columns ? { columns: d.columns } : {},
747
765
  ...m.length > 0 ? { plugins: m } : {},
748
- ...D ? { icons: D } : {}
766
+ ..._ ? { icons: _ } : {}
749
767
  };
750
768
  });
751
769
  function M(o) {
@@ -775,13 +793,13 @@ const pe = fe, Re = /* @__PURE__ */ y({
775
793
  function Z(o, p) {
776
794
  const b = Object.getPrototypeOf(o), m = Object.getOwnPropertyDescriptor(b, "gridConfig");
777
795
  if (!m?.set || !m?.get) return;
778
- const D = m.set, te = m.get;
796
+ const _ = m.set, te = m.get;
779
797
  Object.defineProperty(o, "gridConfig", {
780
798
  get() {
781
799
  return te.call(this);
782
800
  },
783
801
  set(S) {
784
- S && p ? D.call(this, p.processGridConfig(S)) : D.call(this, S);
802
+ S && p ? _.call(this, p.processGridConfig(S)) : _.call(this, S);
785
803
  },
786
804
  configurable: !0
787
805
  });
@@ -793,28 +811,28 @@ const pe = fe, Re = /* @__PURE__ */ y({
793
811
  const o = a.value;
794
812
  if (!o) return;
795
813
  const p = s();
796
- o.__frameworkAdapter = p, p.setTypeDefaults(c ?? null), Z(o, p), o.addEventListener("cell-commit", M), o.addEventListener("row-commit", N), o.addEventListener("cell-click", A), o.addEventListener("cell-dblclick", W), o.addEventListener("selection-change", I), o.addEventListener("row-toggle", x), o.addEventListener("sort-change", $), o.addEventListener("ready", z), d.rows.length > 0 && (o.rows = d.rows), _.value && (o.gridConfig = _.value), d.fitMode && (o.fitMode = d.fitMode);
814
+ o.__frameworkAdapter = p, p.setTypeDefaults(c ?? null), Z(o, p), o.addEventListener("cell-commit", M), o.addEventListener("row-commit", N), o.addEventListener("cell-click", A), o.addEventListener("cell-dblclick", W), o.addEventListener("selection-change", I), o.addEventListener("row-toggle", x), o.addEventListener("sort-change", $), o.addEventListener("ready", z), d.rows.length > 0 && (o.rows = d.rows), V.value && (o.gridConfig = V.value), d.fitMode && (o.fitMode = d.fitMode);
797
815
  }), q(() => {
798
816
  const o = a.value;
799
817
  o && (ee(o), o.removeEventListener("cell-commit", M), o.removeEventListener("row-commit", N), o.removeEventListener("cell-click", A), o.removeEventListener("cell-dblclick", W), o.removeEventListener("selection-change", I), o.removeEventListener("row-toggle", x), o.removeEventListener("sort-change", $), o.removeEventListener("ready", z));
800
- }), j(
818
+ }), G(
801
819
  () => d.rows,
802
820
  (o) => {
803
821
  a.value && (a.value.rows = o);
804
822
  },
805
823
  { deep: !0 }
806
- ), j(
807
- _,
824
+ ), G(
825
+ V,
808
826
  (o) => {
809
827
  a.value && o && (a.value.gridConfig = o);
810
828
  },
811
829
  { deep: !0 }
812
- ), j(
830
+ ), G(
813
831
  () => d.fitMode,
814
832
  (o) => {
815
833
  a.value && o && (a.value.fitMode = o);
816
834
  }
817
- ), j(
835
+ ), G(
818
836
  () => c,
819
837
  (o) => {
820
838
  s().setTypeDefaults(o ?? null);
@@ -928,14 +946,14 @@ const pe = fe, Re = /* @__PURE__ */ y({
928
946
  ref: e
929
947
  }, null, 512));
930
948
  }
931
- }), _e = /* @__PURE__ */ y({
949
+ }), Ve = /* @__PURE__ */ y({
932
950
  __name: "TbwGridToolButtons",
933
951
  setup(i) {
934
952
  return (e, t) => (P(), O("tbw-grid-tool-buttons", null, [
935
953
  U(e.$slots, "default")
936
954
  ]));
937
955
  }
938
- }), ye = /* @__PURE__ */ new WeakMap(), ve = ["id", "label", "icon", "position", "width"], De = /* @__PURE__ */ y({
956
+ }), ye = /* @__PURE__ */ new WeakMap(), ve = ["id", "label", "icon", "position", "width"], _e = /* @__PURE__ */ y({
939
957
  __name: "TbwGridToolPanel",
940
958
  props: {
941
959
  id: {},
@@ -960,7 +978,7 @@ const pe = fe, Re = /* @__PURE__ */ y({
960
978
  }, null, 8, ve));
961
979
  }
962
980
  });
963
- function Ge(i, e, t) {
981
+ function De(i, e, t) {
964
982
  const n = t ?? F(H, R(null));
965
983
  let r = null;
966
984
  T(() => {
@@ -972,7 +990,7 @@ function Ge(i, e, t) {
972
990
  r?.();
973
991
  });
974
992
  }
975
- const je = y({
993
+ const Ge = y({
976
994
  name: "GridProvider",
977
995
  props: {
978
996
  /**
@@ -1003,24 +1021,24 @@ export {
1003
1021
  Y as GRID_TYPE_DEFAULTS,
1004
1022
  fe as GridAdapter,
1005
1023
  se as GridIconProvider,
1006
- je as GridProvider,
1024
+ Ge as GridProvider,
1007
1025
  de as GridTypeProvider,
1008
1026
  Re as TbwGrid,
1009
1027
  Te as TbwGridColumn,
1010
1028
  Oe as TbwGridDetailPanel,
1011
1029
  Pe as TbwGridResponsiveCard,
1012
- _e as TbwGridToolButtons,
1013
- De as TbwGridToolPanel,
1030
+ Ve as TbwGridToolButtons,
1031
+ _e as TbwGridToolPanel,
1014
1032
  pe as VueGridAdapter,
1015
1033
  Se as clearFeatureRegistry,
1016
1034
  oe as createPluginFromFeature,
1017
1035
  ke as getFeatureFactory,
1018
1036
  Le as getRegisteredFeatures,
1019
1037
  Fe as isFeatureRegistered,
1020
- G as isVueComponent,
1038
+ D as isVueComponent,
1021
1039
  Me as registerFeature,
1022
1040
  Ae as useGrid,
1023
- Ge as useGridEvent,
1041
+ De as useGridEvent,
1024
1042
  ie as useGridIcons,
1025
1043
  J as useGridTypeDefaults,
1026
1044
  Ce as useTypeDefault
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.\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} 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 const result = { ...config } as BaseGridConfig<TRow>;\n\n // Process columns\n if (config.columns) {\n result.columns = config.columns.map((col) => this.processColumn(col));\n }\n\n // Process typeDefaults\n if (config.typeDefaults) {\n result.typeDefaults = this.processTypeDefaults(config.typeDefaults as Record<string, TypeDefault>) as Record<\n string,\n BaseTypeDefault<TRow>\n >;\n }\n\n return result;\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 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 // #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> {\n const renderFn = getColumnRenderer(element);\n\n if (!renderFn) {\n return undefined as unknown as ColumnViewRenderer<TRow, TValue>;\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> {\n const editorFn = getColumnEditor(element);\n\n if (!editorFn) {\n return undefined as unknown as ColumnEditorSpec<TRow, TValue>;\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 * 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 a future version.\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 ClipboardConfig,\n ColumnVirtualizationConfig,\n ContextMenuConfig,\n ExportConfig,\n FilterConfig,\n GroupingColumnsConfig,\n GroupingRowsConfig,\n MasterDetailConfig,\n MultiSortConfig,\n PinnedRowsConfig,\n PivotConfig,\n PrintConfig,\n ReorderConfig,\n ResponsivePluginConfig,\n RowReorderConfig,\n SelectionConfig,\n ServerSideConfig,\n TreeConfig,\n UndoRedoConfig,\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, type GridConfig as VueGridConfig } 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 */\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 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 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 * Emits for TbwGrid\n */\nconst emit = defineEmits<{\n /** Emitted when a cell value is committed */\n (e: 'cell-commit', event: CustomEvent): void;\n /** Emitted when a row's values are committed */\n (e: 'row-commit', event: CustomEvent): void;\n /** Emitted when a cell is clicked */\n (e: 'cell-click', event: CustomEvent): void;\n /** Emitted when a cell is double-clicked */\n (e: 'cell-dblclick', event: CustomEvent): void;\n /** Emitted when selection changes */\n (e: 'selection-change', event: CustomEvent): void;\n /** Emitted when a row is expanded/collapsed */\n (e: 'row-toggle', event: CustomEvent): void;\n /** Emitted when sorting changes */\n (e: 'sort-change', event: CustomEvent): void;\n /** Emitted when the grid is ready */\n (e: 'ready', event: CustomEvent): 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 'reorder',\n 'visibility',\n 'pinnedColumns',\n 'groupingColumns',\n 'columnVirtualization',\n 'rowReorder',\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// Event handlers\nfunction handleCellCommit(event: Event) {\n emit('cell-commit', event as CustomEvent);\n}\n\nfunction handleRowCommit(event: Event) {\n emit('row-commit', event as CustomEvent);\n}\n\nfunction handleCellClick(event: Event) {\n emit('cell-click', event as CustomEvent);\n}\n\nfunction handleCellDblclick(event: Event) {\n emit('cell-dblclick', event as CustomEvent);\n}\n\nfunction handleSelectionChange(event: Event) {\n emit('selection-change', event as CustomEvent);\n}\n\nfunction handleRowToggle(event: Event) {\n emit('row-toggle', event as CustomEvent);\n}\n\nfunction handleSortChange(event: Event) {\n emit('sort-change', event as CustomEvent);\n}\n\nfunction handleReady(event: Event) {\n emit('ready', event as CustomEvent);\n}\n\n/**\n * Intercepts the element's `gridConfig` property so ALL writes\n * go through the adapter's processGridConfig first.\n *\n * This converts Vue component classes and VNode-returning functions\n * to DOM-returning functions before the grid core sees them.\n * Handles cases where `:grid-config` is bound directly to the\n * custom element (bypassing TbwGrid.vue).\n */\nfunction interceptElementGridConfig(grid: HTMLElement, adapter: GridAdapter): void {\n const proto = Object.getPrototypeOf(grid);\n const desc = Object.getOwnPropertyDescriptor(proto, 'gridConfig');\n if (!desc?.set || !desc?.get) return;\n\n const originalSet = desc.set;\n const originalGet = desc.get;\n\n // Instance-level override (does not affect the prototype or other grid elements)\n Object.defineProperty(grid, 'gridConfig', {\n get() {\n return originalGet.call(this);\n },\n set(value: VueGridConfig | undefined) {\n if (value && adapter) {\n // processGridConfig is idempotent: already-processed functions pass\n // through isVueComponent unchanged, so double-processing is safe.\n originalSet.call(this, adapter.processGridConfig(value));\n } else {\n originalSet.call(this, value);\n }\n },\n configurable: true,\n });\n}\n\n/**\n * Removes the instance-level gridConfig interceptor,\n * restoring the prototype's original getter/setter.\n */\nfunction removeGridConfigInterceptor(grid: HTMLElement): void {\n // Deleting the instance property restores the prototype accessor\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete (grid as any).gridConfig;\n}\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 // Intercept the element's gridConfig setter so ALL writes\n // (including direct custom element bindings) go through processGridConfig.\n interceptElementGridConfig(grid, adapter);\n\n // Add event listeners\n grid.addEventListener('cell-commit', handleCellCommit);\n grid.addEventListener('row-commit', handleRowCommit);\n grid.addEventListener('cell-click', handleCellClick);\n grid.addEventListener('cell-dblclick', handleCellDblclick);\n grid.addEventListener('selection-change', handleSelectionChange);\n grid.addEventListener('row-toggle', handleRowToggle);\n grid.addEventListener('sort-change', handleSortChange);\n grid.addEventListener('ready', handleReady);\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 // Remove the gridConfig setter interceptor\n removeGridConfigInterceptor(grid);\n\n // Remove event listeners\n grid.removeEventListener('cell-commit', handleCellCommit);\n grid.removeEventListener('row-commit', handleRowCommit);\n grid.removeEventListener('cell-click', handleCellClick);\n grid.removeEventListener('cell-dblclick', handleCellDblclick);\n grid.removeEventListener('selection-change', handleSelectionChange);\n grid.removeEventListener('row-toggle', handleRowToggle);\n grid.removeEventListener('sort-change', handleSortChange);\n grid.removeEventListener('ready', handleReady);\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 { 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 */\nexport interface GridEventMap {\n 'cell-click': { value: unknown; row: unknown; column: unknown; rowIndex: number; colIndex: number };\n 'cell-dblclick': { value: unknown; row: unknown; column: unknown; rowIndex: number; colIndex: number };\n 'cell-commit': { value: unknown; oldValue: unknown; row: unknown; column: unknown };\n 'row-commit': { row: unknown; changes: Record<string, unknown> };\n 'selection-change': { selectedRows: unknown[]; selectedCells: unknown[] };\n 'sort-change': { field: string; direction: 'asc' | 'desc' | null };\n 'row-toggle': { row: unknown; expanded: boolean };\n ready: undefined;\n}\n\n/**\n * Composable for subscribing to grid events with automatic cleanup.\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 *\n * @example\n * ```vue\n * <script setup>\n * import { useGridEvent } from '@toolbox-web/grid-vue';\n *\n * useGridEvent('cell-commit', (event) => {\n * console.log('Cell committed:', event.detail);\n * });\n *\n * useGridEvent('selection-change', (event) => {\n * console.log('Selection changed:', event.detail);\n * });\n * </script>\n * ```\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 const grid = gridElement ?? inject(GRID_ELEMENT_KEY, ref(null));\n let cleanup: (() => void) | null = null;\n\n onMounted(() => {\n const element = grid.value as unknown as HTMLElement | null;\n if (!element) return;\n\n const eventHandler = handler as EventListener;\n element.addEventListener(eventName, eventHandler);\n cleanup = () => element.removeEventListener(eventName, eventHandler);\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 content = h(GridTypeProvider, { defaults: props.typeDefaults }, () => content);\n }\n\n // Wrap with icon provider if icons is provided\n if (props.icons) {\n content = h(GridIconProvider, { icons: props.icons }, () => content);\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","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","VueGridAdapter","adapterRegistered","globalAdapter","ensureAdapterRegistered","GridElement","__props","emit","__emit","gridRef","ref","GRID_ELEMENT_KEY","iconOverrides","FEATURE_PROPS","createFeaturePlugins","plugins","feature","propValue","plugin","createPluginFromFeature","mergedConfig","computed","baseConfig","featurePlugins","configPlugins","mergedPlugins","icons","handleCellCommit","event","handleRowCommit","handleCellClick","handleCellDblclick","handleSelectionChange","handleRowToggle","handleSortChange","handleReady","interceptElementGridConfig","grid","adapter","proto","desc","originalSet","originalGet","removeGridConfigInterceptor","onMounted","onBeforeUnmount","watch","newRows","newConfig","newFitMode","newTypeDefaults","__expose","_createElementBlock","_renderSlot","_ctx","_useSlots","columnRef","hasCellSlot","hasEditorSlot","slotFn","h","slotContent","detailRef","useSlots","cardRef","toolPanelRegistry","panelRef","useGridEvent","eventName","handler","cleanup","eventHandler","GridProvider","content"],"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.\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} 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 const result = { ...config } as BaseGridConfig<TRow>;\n\n // Process columns\n if (config.columns) {\n result.columns = config.columns.map((col) => this.processColumn(col));\n }\n\n // Process typeDefaults\n if (config.typeDefaults) {\n result.typeDefaults = this.processTypeDefaults(config.typeDefaults as Record<string, TypeDefault>) as Record<\n string,\n BaseTypeDefault<TRow>\n >;\n }\n\n return result;\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 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 // #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> {\n const renderFn = getColumnRenderer(element);\n\n if (!renderFn) {\n return undefined as unknown as ColumnViewRenderer<TRow, TValue>;\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> {\n const editorFn = getColumnEditor(element);\n\n if (!editorFn) {\n return undefined as unknown as ColumnEditorSpec<TRow, TValue>;\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 a future version.\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 ClipboardConfig,\n ColumnVirtualizationConfig,\n ContextMenuConfig,\n ExportConfig,\n FilterConfig,\n GroupingColumnsConfig,\n GroupingRowsConfig,\n MasterDetailConfig,\n MultiSortConfig,\n PinnedRowsConfig,\n PivotConfig,\n PrintConfig,\n ReorderConfig,\n ResponsivePluginConfig,\n RowReorderConfig,\n SelectionConfig,\n ServerSideConfig,\n TreeConfig,\n UndoRedoConfig,\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, type GridConfig as VueGridConfig } 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 */\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 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 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 * Emits for TbwGrid\n */\nconst emit = defineEmits<{\n /** Emitted when a cell value is committed */\n (e: 'cell-commit', event: CustomEvent): void;\n /** Emitted when a row's values are committed */\n (e: 'row-commit', event: CustomEvent): void;\n /** Emitted when a cell is clicked */\n (e: 'cell-click', event: CustomEvent): void;\n /** Emitted when a cell is double-clicked */\n (e: 'cell-dblclick', event: CustomEvent): void;\n /** Emitted when selection changes */\n (e: 'selection-change', event: CustomEvent): void;\n /** Emitted when a row is expanded/collapsed */\n (e: 'row-toggle', event: CustomEvent): void;\n /** Emitted when sorting changes */\n (e: 'sort-change', event: CustomEvent): void;\n /** Emitted when the grid is ready */\n (e: 'ready', event: CustomEvent): 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 'reorder',\n 'visibility',\n 'pinnedColumns',\n 'groupingColumns',\n 'columnVirtualization',\n 'rowReorder',\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// Event handlers\nfunction handleCellCommit(event: Event) {\n emit('cell-commit', event as CustomEvent);\n}\n\nfunction handleRowCommit(event: Event) {\n emit('row-commit', event as CustomEvent);\n}\n\nfunction handleCellClick(event: Event) {\n emit('cell-click', event as CustomEvent);\n}\n\nfunction handleCellDblclick(event: Event) {\n emit('cell-dblclick', event as CustomEvent);\n}\n\nfunction handleSelectionChange(event: Event) {\n emit('selection-change', event as CustomEvent);\n}\n\nfunction handleRowToggle(event: Event) {\n emit('row-toggle', event as CustomEvent);\n}\n\nfunction handleSortChange(event: Event) {\n emit('sort-change', event as CustomEvent);\n}\n\nfunction handleReady(event: Event) {\n emit('ready', event as CustomEvent);\n}\n\n/**\n * Intercepts the element's `gridConfig` property so ALL writes\n * go through the adapter's processGridConfig first.\n *\n * This converts Vue component classes and VNode-returning functions\n * to DOM-returning functions before the grid core sees them.\n * Handles cases where `:grid-config` is bound directly to the\n * custom element (bypassing TbwGrid.vue).\n */\nfunction interceptElementGridConfig(grid: HTMLElement, adapter: GridAdapter): void {\n const proto = Object.getPrototypeOf(grid);\n const desc = Object.getOwnPropertyDescriptor(proto, 'gridConfig');\n if (!desc?.set || !desc?.get) return;\n\n const originalSet = desc.set;\n const originalGet = desc.get;\n\n // Instance-level override (does not affect the prototype or other grid elements)\n Object.defineProperty(grid, 'gridConfig', {\n get() {\n return originalGet.call(this);\n },\n set(value: VueGridConfig | undefined) {\n if (value && adapter) {\n // processGridConfig is idempotent: already-processed functions pass\n // through isVueComponent unchanged, so double-processing is safe.\n originalSet.call(this, adapter.processGridConfig(value));\n } else {\n originalSet.call(this, value);\n }\n },\n configurable: true,\n });\n}\n\n/**\n * Removes the instance-level gridConfig interceptor,\n * restoring the prototype's original getter/setter.\n */\nfunction removeGridConfigInterceptor(grid: HTMLElement): void {\n // Deleting the instance property restores the prototype accessor\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete (grid as any).gridConfig;\n}\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 // Intercept the element's gridConfig setter so ALL writes\n // (including direct custom element bindings) go through processGridConfig.\n interceptElementGridConfig(grid, adapter);\n\n // Add event listeners\n grid.addEventListener('cell-commit', handleCellCommit);\n grid.addEventListener('row-commit', handleRowCommit);\n grid.addEventListener('cell-click', handleCellClick);\n grid.addEventListener('cell-dblclick', handleCellDblclick);\n grid.addEventListener('selection-change', handleSelectionChange);\n grid.addEventListener('row-toggle', handleRowToggle);\n grid.addEventListener('sort-change', handleSortChange);\n grid.addEventListener('ready', handleReady);\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 // Remove the gridConfig setter interceptor\n removeGridConfigInterceptor(grid);\n\n // Remove event listeners\n grid.removeEventListener('cell-commit', handleCellCommit);\n grid.removeEventListener('row-commit', handleRowCommit);\n grid.removeEventListener('cell-click', handleCellClick);\n grid.removeEventListener('cell-dblclick', handleCellDblclick);\n grid.removeEventListener('selection-change', handleSelectionChange);\n grid.removeEventListener('row-toggle', handleRowToggle);\n grid.removeEventListener('sort-change', handleSortChange);\n grid.removeEventListener('ready', handleReady);\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 { 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 */\nexport interface GridEventMap {\n 'cell-click': { value: unknown; row: unknown; column: unknown; rowIndex: number; colIndex: number };\n 'cell-dblclick': { value: unknown; row: unknown; column: unknown; rowIndex: number; colIndex: number };\n 'cell-commit': { value: unknown; oldValue: unknown; row: unknown; column: unknown };\n 'row-commit': { row: unknown; changes: Record<string, unknown> };\n 'selection-change': { selectedRows: unknown[]; selectedCells: unknown[] };\n 'sort-change': { field: string; direction: 'asc' | 'desc' | null };\n 'row-toggle': { row: unknown; expanded: boolean };\n ready: undefined;\n}\n\n/**\n * Composable for subscribing to grid events with automatic cleanup.\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 *\n * @example\n * ```vue\n * <script setup>\n * import { useGridEvent } from '@toolbox-web/grid-vue';\n *\n * useGridEvent('cell-commit', (event) => {\n * console.log('Cell committed:', event.detail);\n * });\n *\n * useGridEvent('selection-change', (event) => {\n * console.log('Selection changed:', event.detail);\n * });\n * </script>\n * ```\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 const grid = gridElement ?? inject(GRID_ELEMENT_KEY, ref(null));\n let cleanup: (() => void) | null = null;\n\n onMounted(() => {\n const element = grid.value as unknown as HTMLElement | null;\n if (!element) return;\n\n const eventHandler = handler as EventListener;\n element.addEventListener(eventName, eventHandler);\n cleanup = () => element.removeEventListener(eventName, eventHandler);\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 content = h(GridTypeProvider, { defaults: props.typeDefaults }, () => content);\n }\n\n // Wrap with icon provider if icons is provided\n if (props.icons) {\n content = h(GridIconProvider, { icons: props.icons }, () => content);\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","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","emit","__emit","gridRef","ref","GRID_ELEMENT_KEY","iconOverrides","FEATURE_PROPS","createFeaturePlugins","plugins","feature","propValue","plugin","createPluginFromFeature","mergedConfig","computed","baseConfig","featurePlugins","configPlugins","mergedPlugins","icons","handleCellCommit","event","handleRowCommit","handleCellClick","handleCellDblclick","handleSelectionChange","handleRowToggle","handleSortChange","handleReady","interceptElementGridConfig","grid","adapter","proto","desc","originalSet","originalGet","removeGridConfigInterceptor","onMounted","onBeforeUnmount","watch","newRows","newConfig","newFitMode","newTypeDefaults","__expose","_createElementBlock","_renderSlot","_ctx","_useSlots","columnRef","hasCellSlot","hasEditorSlot","slotFn","h","slotContent","detailRef","useSlots","cardRef","toolPanelRegistry","panelRef","useGridEvent","eventName","handler","cleanup","eventHandler","GridProvider","content"],"mappings":"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"}
@@ -228,6 +228,12 @@ export declare class GridAdapter implements FrameworkAdapter {
228
228
  * Cleanup all mounted Vue apps.
229
229
  */
230
230
  cleanup(): void;
231
+ /**
232
+ * Unmount a specific container (e.g., detail panel, tool panel).
233
+ * Finds the matching entry in mountedViews by container reference
234
+ * and properly destroys the Vue app to prevent memory leaks.
235
+ */
236
+ unmount(container: HTMLElement): void;
231
237
  /**
232
238
  * Called when a cell's content is about to be wiped.
233
239
  * Destroys editor Vue apps whose container is inside the cell.
@@ -1 +1 @@
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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"}
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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"}
package/package.json CHANGED
@@ -1,11 +1,21 @@
1
1
  {
2
2
  "name": "@toolbox-web/grid-vue",
3
- "version": "0.5.0",
3
+ "version": "0.5.2",
4
4
  "description": "Vue 3 adapter for @toolbox-web/grid data grid component",
5
5
  "type": "module",
6
6
  "main": "./index.js",
7
7
  "module": "./index.js",
8
8
  "types": "./index.d.ts",
9
+ "typesVersions": {
10
+ "*": {
11
+ "features": [
12
+ "features/index.d.ts"
13
+ ],
14
+ "features/*": [
15
+ "features/*.d.ts"
16
+ ]
17
+ }
18
+ },
9
19
  "exports": {
10
20
  "./package.json": "./package.json",
11
21
  ".": {