diff --git a/apps/docs/.vitepress/config.js b/apps/docs/.vitepress/config.js
index e7152b2..3ce522b 100644
--- a/apps/docs/.vitepress/config.js
+++ b/apps/docs/.vitepress/config.js
@@ -58,6 +58,7 @@ export default defineConfig({
{ text: 'FieldColor', link: '/guide/fields/FieldColor' },
{ text: 'FieldMask', link: '/guide/fields/FieldMask' },
{ text: 'FieldNumber', link: '/guide/fields/FieldNumber' },
+ { text: 'FieldObject', link: '/guide/fields/FieldObject' },
{ text: 'FieldPassword', link: '/guide/fields/FieldPassword' },
{ text: 'FieldRadio', link: '/guide/fields/FieldRadio' },
{ text: 'FieldReset', link: '/guide/fields/FieldReset' },
diff --git a/apps/docs/components/examples/fields/FieldObjectExample.vue b/apps/docs/components/examples/fields/FieldObjectExample.vue
new file mode 100644
index 0000000..d59116e
--- /dev/null
+++ b/apps/docs/components/examples/fields/FieldObjectExample.vue
@@ -0,0 +1,63 @@
+
+ Person: {{ form.model.person }}
+
+
+
+
\ No newline at end of file
diff --git a/apps/docs/guide/fields/FieldObject.md b/apps/docs/guide/fields/FieldObject.md
new file mode 100644
index 0000000..d3c1c24
--- /dev/null
+++ b/apps/docs/guide/fields/FieldObject.md
@@ -0,0 +1,112 @@
+# FieldObject
+`FieldObject` is a field that has its own `schema`, meaning the field itself
+renders other fields. These fields will return their values to the object inside
+the model that is assigned to the `FieldObject` component.
+
+### type `object`
+
+
+
+## Basic example
+::: details Code
+```js
+const form = ref({
+ model: {
+ person: {
+ name: '',
+ surname: '',
+ age: null
+ }
+ },
+ schema: {
+ fields: [
+ {
+ type: 'object',
+ model: 'person',
+ schema: {
+ fields: [
+ {
+ type: 'input',
+ inputType: 'text',
+ model: 'name',
+ label: 'Name'
+ },
+ {
+ type: 'input',
+ inputType: 'text',
+ model: 'surname',
+ label: 'Surname'
+ },
+ {
+ type: 'input',
+ inputType: 'number',
+ model: 'age',
+ label: 'Age'
+ }
+ ]
+ }
+ }
+ ]
+ }
+})
+```
+:::
+
+
+## With validators
+::: details Code
+```js
+function minLengthThree (value) {
+ return value && value.length >= 3
+}
+
+function overEighteen (value) {
+ return value && value >= 18
+}
+
+// ......
+fields: [
+ {
+ type: 'object',
+ model: 'person',
+ schema: {
+ fields: [
+ {
+ type: 'input',
+ inputType: 'text',
+ model: 'name',
+ label: 'Name',
+ validator: minLengthThree
+ },
+ {
+ type: 'input',
+ inputType: 'text',
+ model: 'surname',
+ label: 'Surname',
+ validator: minLengthThree
+ },
+ {
+ type: 'input',
+ inputType: 'number',
+ model: 'age',
+ label: 'Age',
+ validator: overEighteen
+ }
+ ]
+ }
+ }
+ ]
+```
+:::
+::: info
+In this example, `name` and `surname` must have a length of three letters or more, `age` must be at least 18.
+:::
+
+
+
+## Properties
+| Property | Default | Type | Description |
+|----------|---------|----------|---------------------------------------------|
+| schema | `{}` | `Object` | A form schema, as seen in `FormGenerator.vue` |
\ No newline at end of file
diff --git a/apps/docs/guide/form-generator/events.md b/apps/docs/guide/form-generator/events.md
index 7971642..239031d 100644
--- a/apps/docs/guide/form-generator/events.md
+++ b/apps/docs/guide/form-generator/events.md
@@ -1,4 +1,27 @@
These are events emitted by the `vue-form-generator` component.
+## `field-validated`
+Emitted when a field inside the form has been validated.
+
+### Event arguments
+- `validations` - an object with the field's errors and the field schema
+ - `fieldErrors` - an array of error messages that have been thrown during validations;
+ - `field` - the field as defined in the schema
+
+An example from the [`FieldObject`](/guide/fields/FieldObject) component:
+```vue [FieldObject.vue]
+
+```
+
## `submit`
-Emitted when all fields have been validated and no errors occurred during said validations.
\ No newline at end of file
+Emitted when all fields have been validated and no errors occurred during said validations.
diff --git a/package.json b/package.json
index de122c7..dbc5e92 100644
--- a/package.json
+++ b/package.json
@@ -9,7 +9,7 @@
"main": "./dist/vue3-form-generator.js",
"scripts": {
"dev": "vite",
- "dev:sass": "sass --watch src/scss/themes:playground/css/",
+ "dev:sass": "sass --watch src/scss/themes:apps/playground/css/",
"test": "vitest",
"build": "vite build && sass src/scss/themes/:dist/themes/",
"preview": "vite preview",
@@ -79,4 +79,4 @@
"@vueuse/core": "^13.1.0",
"maska": "^3.1.1"
}
-}
\ No newline at end of file
+}
diff --git a/src/FormGenerator.vue b/src/FormGenerator.vue
index 4b99637..0bab1af 100644
--- a/src/FormGenerator.vue
+++ b/src/FormGenerator.vue
@@ -1,50 +1,31 @@
-
@@ -95,8 +78,8 @@ defineExpose({ hasErrors })
>
-
\ No newline at end of file
diff --git a/src/fields/core/FieldText.vue b/src/fields/core/FieldText.vue
index 01cb397..714fe04 100644
--- a/src/fields/core/FieldText.vue
+++ b/src/fields/core/FieldText.vue
@@ -1,27 +1,30 @@
-