diff --git a/packages/vue-vanilla/dev/components/App.vue b/packages/vue-vanilla/dev/components/App.vue
index 59dc1afd0b..7ce2fc2b91 100644
--- a/packages/vue-vanilla/dev/components/App.vue
+++ b/packages/vue-vanilla/dev/components/App.vue
@@ -1,7 +1,12 @@
diff --git a/packages/vue-vanilla/src/cells/DateCell.vue b/packages/vue-vanilla/src/cells/DateCell.vue
new file mode 100644
index 0000000000..aa5df7f09e
--- /dev/null
+++ b/packages/vue-vanilla/src/cells/DateCell.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
diff --git a/packages/vue-vanilla/src/cells/DateTimeCell.vue b/packages/vue-vanilla/src/cells/DateTimeCell.vue
new file mode 100644
index 0000000000..8a52acb4d0
--- /dev/null
+++ b/packages/vue-vanilla/src/cells/DateTimeCell.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
diff --git a/packages/vue-vanilla/src/cells/EnumCell.vue b/packages/vue-vanilla/src/cells/EnumCell.vue
new file mode 100644
index 0000000000..6ecd7c4b8f
--- /dev/null
+++ b/packages/vue-vanilla/src/cells/EnumCell.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/packages/vue-vanilla/src/cells/EnumOneOfCell.vue b/packages/vue-vanilla/src/cells/EnumOneOfCell.vue
new file mode 100644
index 0000000000..aeade4c756
--- /dev/null
+++ b/packages/vue-vanilla/src/cells/EnumOneOfCell.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/packages/vue-vanilla/src/cells/IntegerCell.vue b/packages/vue-vanilla/src/cells/IntegerCell.vue
new file mode 100644
index 0000000000..7966a2fd48
--- /dev/null
+++ b/packages/vue-vanilla/src/cells/IntegerCell.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
diff --git a/packages/vue-vanilla/src/cells/NumberCell.vue b/packages/vue-vanilla/src/cells/NumberCell.vue
new file mode 100644
index 0000000000..fe9fb4d29b
--- /dev/null
+++ b/packages/vue-vanilla/src/cells/NumberCell.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/packages/vue-vanilla/src/cells/TextCell.vue b/packages/vue-vanilla/src/cells/TextCell.vue
new file mode 100644
index 0000000000..4210e8ae5d
--- /dev/null
+++ b/packages/vue-vanilla/src/cells/TextCell.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
diff --git a/packages/vue-vanilla/src/cells/TextareaCell.vue b/packages/vue-vanilla/src/cells/TextareaCell.vue
new file mode 100644
index 0000000000..ef5a95db9e
--- /dev/null
+++ b/packages/vue-vanilla/src/cells/TextareaCell.vue
@@ -0,0 +1,37 @@
+
+
+
+
+
diff --git a/packages/vue-vanilla/src/cells/TimeCell.vue b/packages/vue-vanilla/src/cells/TimeCell.vue
new file mode 100644
index 0000000000..d27c4d2dd8
--- /dev/null
+++ b/packages/vue-vanilla/src/cells/TimeCell.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
diff --git a/packages/vue-vanilla/src/cells/index.ts b/packages/vue-vanilla/src/cells/index.ts
new file mode 100644
index 0000000000..5285aacda3
--- /dev/null
+++ b/packages/vue-vanilla/src/cells/index.ts
@@ -0,0 +1,24 @@
+import { type JsonFormsCellRendererRegistryEntry } from '@jsonforms/core';
+import TextCell from './TextCell.vue';
+import NumberCell from './NumberCell.vue';
+import IntegerCell from './IntegerCell.vue';
+import DateCell from './DateCell.vue';
+import TimeCell from './TimeCell.vue';
+import DateTimeCell from './DateTimeCell.vue';
+import TextareaCell from './TextareaCell.vue';
+import EnumCell from './EnumCell.vue';
+import EnumOneOfCell from './EnumOneOfCell.vue';
+import BooleanCell from './BooleanCell.vue';
+
+export const vanillaCells: JsonFormsCellRendererRegistryEntry[] = [
+ { cell: TextCell, tester: TextCell.tester },
+ { cell: NumberCell, tester: NumberCell.tester },
+ { cell: IntegerCell, tester: IntegerCell.tester },
+ { cell: DateCell, tester: DateCell.tester },
+ { cell: TimeCell, tester: TimeCell.tester },
+ { cell: DateTimeCell, tester: DateTimeCell.tester },
+ { cell: TextareaCell, tester: TextareaCell.tester },
+ { cell: EnumCell, tester: EnumCell.tester },
+ { cell: EnumOneOfCell, tester: EnumOneOfCell.tester },
+ { cell: BooleanCell, tester: BooleanCell.tester },
+];
diff --git a/packages/vue-vanilla/src/complex/OneOfRenderer.vue b/packages/vue-vanilla/src/complex/OneOfRenderer.vue
index 471d89dd7d..7a4e7198d6 100644
--- a/packages/vue-vanilla/src/complex/OneOfRenderer.vue
+++ b/packages/vue-vanilla/src/complex/OneOfRenderer.vue
@@ -70,12 +70,15 @@
diff --git a/packages/vue-vanilla/src/controls/BooleanControlRenderer.vue b/packages/vue-vanilla/src/controls/BooleanControlRenderer.vue
deleted file mode 100644
index d8332eb821..0000000000
--- a/packages/vue-vanilla/src/controls/BooleanControlRenderer.vue
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vanilla/src/controls/DateControlRenderer.vue b/packages/vue-vanilla/src/controls/DateControlRenderer.vue
deleted file mode 100644
index 14ef0e8fff..0000000000
--- a/packages/vue-vanilla/src/controls/DateControlRenderer.vue
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vanilla/src/controls/DateTimeControlRenderer.vue b/packages/vue-vanilla/src/controls/DateTimeControlRenderer.vue
deleted file mode 100644
index 39b0400b04..0000000000
--- a/packages/vue-vanilla/src/controls/DateTimeControlRenderer.vue
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vanilla/src/controls/EnumControlRenderer.vue b/packages/vue-vanilla/src/controls/EnumControlRenderer.vue
deleted file mode 100644
index d713e584fd..0000000000
--- a/packages/vue-vanilla/src/controls/EnumControlRenderer.vue
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vanilla/src/controls/EnumOneOfControlRenderer.vue b/packages/vue-vanilla/src/controls/EnumOneOfControlRenderer.vue
deleted file mode 100644
index 0b520279d9..0000000000
--- a/packages/vue-vanilla/src/controls/EnumOneOfControlRenderer.vue
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vanilla/src/controls/StringControlRenderer.vue b/packages/vue-vanilla/src/controls/InputControlRenderer.vue
similarity index 70%
rename from packages/vue-vanilla/src/controls/StringControlRenderer.vue
rename to packages/vue-vanilla/src/controls/InputControlRenderer.vue
index 958126a333..ccb5af1eae 100644
--- a/packages/vue-vanilla/src/controls/StringControlRenderer.vue
+++ b/packages/vue-vanilla/src/controls/InputControlRenderer.vue
@@ -5,40 +5,37 @@
:is-focused="isFocused"
:applied-options="appliedOptions"
>
-
diff --git a/packages/vue-vanilla/src/controls/IntegerControlRenderer.vue b/packages/vue-vanilla/src/controls/IntegerControlRenderer.vue
deleted file mode 100644
index 0e0654c5d5..0000000000
--- a/packages/vue-vanilla/src/controls/IntegerControlRenderer.vue
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vanilla/src/controls/MultiStringControlRenderer.vue b/packages/vue-vanilla/src/controls/MultiStringControlRenderer.vue
deleted file mode 100644
index 0d1b80e367..0000000000
--- a/packages/vue-vanilla/src/controls/MultiStringControlRenderer.vue
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vanilla/src/controls/NumberControlRenderer.vue b/packages/vue-vanilla/src/controls/NumberControlRenderer.vue
deleted file mode 100644
index 418dca9832..0000000000
--- a/packages/vue-vanilla/src/controls/NumberControlRenderer.vue
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vanilla/src/controls/TimeControlRenderer.vue b/packages/vue-vanilla/src/controls/TimeControlRenderer.vue
deleted file mode 100644
index edae10174a..0000000000
--- a/packages/vue-vanilla/src/controls/TimeControlRenderer.vue
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
-
-
diff --git a/packages/vue-vanilla/src/controls/index.ts b/packages/vue-vanilla/src/controls/index.ts
index 6bfaa073a6..18f0aba934 100644
--- a/packages/vue-vanilla/src/controls/index.ts
+++ b/packages/vue-vanilla/src/controls/index.ts
@@ -1,35 +1,6 @@
export { default as ControlWrapper } from './ControlWrapper.vue';
-export { default as StringControlRenderer } from './StringControlRenderer.vue';
-export { default as MultiStringControlRenderer } from './MultiStringControlRenderer.vue';
-export { default as NumberControlRenderer } from './NumberControlRenderer.vue';
-export { default as IntegerControlRenderer } from './IntegerControlRenderer.vue';
-export { default as EnumControlRenderer } from './EnumControlRenderer.vue';
-export { default as oneOfEnumControlRenderer } from './EnumOneOfControlRenderer.vue';
-export { default as DateControlRenderer } from './DateControlRenderer.vue';
-export { default as DateTimeControlRenderer } from './DateTimeControlRenderer.vue';
-export { default as TimeControlRenderer } from './TimeControlRenderer.vue';
-export { default as BooleanControlRenderer } from './BooleanControlRenderer.vue';
+export { default as InputControlRenderer } from './InputControlRenderer.vue';
-import { entry as stringControlRendererEntry } from './StringControlRenderer.vue';
-import { entry as multiStringControlRendererEntry } from './MultiStringControlRenderer.vue';
-import { entry as numberControlRendererEntry } from './NumberControlRenderer.vue';
-import { entry as integerControlRendererEntry } from './IntegerControlRenderer.vue';
-import { entry as enumControlRendererEntry } from './EnumControlRenderer.vue';
-import { entry as oneOfEnumControlRendererEntry } from './EnumOneOfControlRenderer.vue';
-import { entry as dateControlRendererEntry } from './DateControlRenderer.vue';
-import { entry as dateTimeControlRendererEntry } from './DateTimeControlRenderer.vue';
-import { entry as timeControlRendererEntry } from './TimeControlRenderer.vue';
-import { entry as booleanControlRendererEntry } from './BooleanControlRenderer.vue';
+import { entry as InputControlRendererEntry } from './InputControlRenderer.vue';
-export const controlRenderers = [
- stringControlRendererEntry,
- multiStringControlRendererEntry,
- numberControlRendererEntry,
- integerControlRendererEntry,
- enumControlRendererEntry,
- oneOfEnumControlRendererEntry,
- dateControlRendererEntry,
- dateTimeControlRendererEntry,
- timeControlRendererEntry,
- booleanControlRendererEntry,
-];
+export const controlRenderers = [InputControlRendererEntry];
diff --git a/packages/vue-vanilla/src/index.ts b/packages/vue-vanilla/src/index.ts
index 90770dbcd4..cda18843cb 100644
--- a/packages/vue-vanilla/src/index.ts
+++ b/packages/vue-vanilla/src/index.ts
@@ -5,3 +5,4 @@ export * from './renderers';
export * from './styles';
export * from './util';
export * from './label';
+export * from './cells';
diff --git a/packages/vue-vanilla/src/util/composition.ts b/packages/vue-vanilla/src/util/composition.ts
index 89bc88e6d4..aa820020bb 100644
--- a/packages/vue-vanilla/src/util/composition.ts
+++ b/packages/vue-vanilla/src/util/composition.ts
@@ -9,6 +9,35 @@ import {
Resolve,
} from '@jsonforms/core';
+/**
+ * Adds styles, isFocused, appliedOptions and onChange
+ */
+export const useVanillaCell = (
+ input: I,
+ adaptTarget: (target: any) => any = (v) => v.value
+) => {
+ const appliedOptions = computed(() =>
+ merge(
+ {},
+ cloneDeep(input.cell.value.config),
+ cloneDeep(input.cell.value.uischema.options)
+ )
+ );
+
+ const isFocused = ref(false);
+ const onChange = (event: Event) => {
+ input.handleChange(input.cell.value.path, adaptTarget(event.target));
+ };
+
+ return {
+ ...input,
+ styles: useStyles(input.cell.value.uischema),
+ isFocused,
+ appliedOptions,
+ onChange,
+ };
+};
+
/**
* Adds styles, isFocused, appliedOptions and onChange
*/
diff --git a/packages/vue-vanilla/tests/unit/util/TestComponent.vue b/packages/vue-vanilla/tests/unit/util/TestComponent.vue
index 8e3f764a1e..26952ce534 100644
--- a/packages/vue-vanilla/tests/unit/util/TestComponent.vue
+++ b/packages/vue-vanilla/tests/unit/util/TestComponent.vue
@@ -1,7 +1,7 @@