VfButton
Basic
A simple button with label text.
<VfButton name="submit" text="Button" /><template>
<VfButton name="submit" text="Button" />
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const schema = defineSchema({
submit: { type: 'button', text: 'Button' },
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Actions
Use the action prop to trigger form actions. Set it to 'submit' to submit the form or 'reset' to reset all elements to their default values.
<VfButton name="submit" text="Submit" action="submit" />
<VfButton name="reset" text="Reset" action="reset" /><script setup lang="ts">
const handleClick = ({ form$ }) => {
alert(`Hello ${form$.model.name || 'there'}!`)
}
</script>
<template>
<VfForm stacked>
<VfText name="name" placeholder="Type your name" />
<VfButton
name="submit"
text="Submit"
action="submit"
@click="handleClick"
/>
<VfButton name="reset" text="Reset" action="reset" />
</VfForm>
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const handleClick = ({ form$ }) => {
alert(`Hello ${form$.model.name || 'there'}!`)
}
const schema = defineSchema({
actions: {
type: 'group',
stacked: true,
schema: {
name: { type: 'text', placeholder: 'Type your name' },
submit: {
type: 'button',
text: 'Submit',
action: 'submit',
onClick: handleClick,
},
reset: { type: 'button', text: 'Reset', action: 'reset' },
}
}
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Icons
Use the icon prop to display an icon inside the button. Control icon placement with iconPos — 'left' (default), 'right', 'top', or 'bottom'. When no text is provided, the button renders as an icon-only button.
<VfButton name="home" icon="home" />
<VfButton name="profile" text="Profile" icon="user" icon-pos="left" />
<VfButton name="save" text="Save" icon="check" icon-pos="right" />
<VfButton name="search" text="Search" icon="search" icon-pos="top" />
<VfButton name="update" text="Update" icon="redo" icon-pos="bottom" /><template>
<VfGroup name="icons1" stacked>
<VfButton name="home" icon="home" />
<VfButton
name="profile"
text="Profile"
icon="user"
/>
<VfButton
name="save"
text="Save"
icon="check"
icon-pos="right"
/>
</VfGroup>
<VfGroup name="icons2" stacked>
<VfButton
name="search"
text="Search"
icon="search"
icon-pos="top"
/>
<VfButton
name="update"
text="Update"
icon="redo"
icon-pos="bottom"
/>
</VfGroup>
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const schema = defineSchema({
icons1: {
type: 'group',
stacked: true,
schema: {
home: { type: 'button', icon: 'home' },
profile: { type: 'button', text: 'Profile', icon: 'user', iconPos: 'left' },
save: { type: 'button', text: 'Save', icon: 'check', iconPos: 'right' },
}
},
icons2: {
type: 'group',
stacked: true,
schema: {
search: { type: 'button', text: 'Search', icon: 'search', iconPos: 'top' },
update: { type: 'button', text: 'Update', icon: 'redo', iconPos: 'bottom' },
}
},
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Loading
Set the loading prop to display a loading spinner. It accepts a boolean, a reactive ref, a function, or a conditions array.
<VfButton name="submit" :loading /><script setup lang="ts">
import { ref } from 'vue'
const loading = ref(false)
const handleClick = () => {
loading.value = true
setTimeout(() => {
loading.value = false
}, 1500)
}
</script>
<template>
<VfButton
name="submit"
text="Loading"
icon="check"
:loading
@click="handleClick"
/>
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
import { ref } from 'vue'
const loading = ref(false)
const schema = defineSchema({
submit: {
type: 'button',
text: 'Loading',
icon: 'check',
loading,
onClick() {
loading.value = true
setTimeout(() => {
loading.value = false
}, 1500)
}
},
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Links
Use href to render the button as an <a> element. Set target for external links. Use to for vue-router navigation.
<VfButton name="link" href="#usage.links" />
<VfButton name="external" href="https://vuejs.org" target="_blank" />
<VfButton name="router" to="/" /><template>
<VfGroup name="links" stacked>
<VfButton
name="link"
text="Link"
variant="link"
href="#usage.links"
/>
<VfButton
name="external"
text="External"
icon="arrow-up-right-from-square"
icon-pos="right"
href="https://vuejs.org"
target="_blank"
/>
<VfButton name="router" text="Router" to="/" />
</VfGroup>
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const schema = defineSchema({
links: {
type: 'group',
stacked: true,
schema: {
link: {
type: 'button',
text: 'Link',
variant: 'link',
href: '#usage.links',
},
external: {
type: 'button',
text: 'External',
icon: 'arrow-up-right-from-square',
iconPos: 'right',
href: 'https://vuejs.org',
target: '_blank',
},
router: {
type: 'button',
text: 'Router',
to: '/',
},
},
},
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Severities
The severity prop controls the button's color. Available values are 'primary', 'secondary' (default), 'success', 'info', 'warn', 'help', 'danger', and 'contrast'.
<VfButton name="primary" severity="primary" />
<VfButton name="secondary" severity="secondary" />
<VfButton name="success" severity="success" />
<VfButton name="info" severity="info" />
<VfButton name="warn" severity="warn" />
<VfButton name="help" severity="help" />
<VfButton name="danger" severity="danger" />
<VfButton name="contrast" severity="contrast" /><template>
<VfGroup name="severities" stacked>
<VfButton name="primary" text="Primary" severity="primary" />
<VfButton name="secondary" text="Secondary" severity="secondary" />
<VfButton name="success" text="Success" severity="success" />
<VfButton name="info" text="Info" severity="info" />
<VfButton name="warn" text="Warn" severity="warn" />
<VfButton name="help" text="Help" severity="help" />
<VfButton name="danger" text="Danger" severity="danger" />
<VfButton name="contrast" text="Contrast" severity="contrast" />
</VfGroup>
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const schema = defineSchema({
severities: {
type: 'group',
stacked: true,
schema: {
primary: { type: 'button', text: 'Primary', severity: 'primary' },
secondary: { type: 'button', text: 'Secondary', severity: 'secondary' },
success: { type: 'button', text: 'Success', severity: 'success' },
info: { type: 'button', text: 'Info', severity: 'info' },
warn: { type: 'button', text: 'Warn', severity: 'warn' },
help: { type: 'button', text: 'Help', severity: 'help' },
danger: { type: 'button', text: 'Danger', severity: 'danger' },
contrast: { type: 'button', text: 'Contrast', severity: 'contrast' },
}
}
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Disabled
The disabled prop prevents interaction. It works with all severity and variant combinations. It also accepts conditions.
<VfButton name="primary" severity="primary" disabled />
<VfButton name="secondary" severity="secondary" disabled />
<VfButton name="success" severity="success" disabled />
<VfButton name="info" severity="info" disabled />
<VfButton name="warn" severity="warn" disabled />
<VfButton name="help" severity="help" disabled />
<VfButton name="danger" severity="danger" disabled />
<VfButton name="contrast" severity="contrast" disabled /><template>
<VfGroup name="disableds" stacked disabled>
<VfButton name="primary" text="Primary" severity="primary" />
<VfButton name="secondary" text="Secondary" severity="secondary" />
<VfButton name="success" text="Success" severity="success" />
<VfButton name="info" text="Info" severity="info" />
<VfButton name="warn" text="Warn" severity="warn" />
<VfButton name="help" text="Help" severity="help" />
<VfButton name="danger" text="Danger" severity="danger" />
<VfButton name="contrast" text="Contrast" severity="contrast" />
</VfGroup>
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const schema = defineSchema({
disableds: {
type: 'group',
stacked: true,
schema: {
primary: {type: 'button', text: 'Primary', severity: 'primary', disabled: true },
secondary: {type: 'button', text: 'Secondary', severity: 'secondary', disabled: true },
success: {type: 'button', text: 'Success', severity: 'success', disabled: true },
info: {type: 'button', text: 'Info', severity: 'info', disabled: true },
warn: {type: 'button', text: 'Warn', severity: 'warn', disabled: true },
help: {type: 'button', text: 'Help', severity: 'help', disabled: true },
danger: {type: 'button', text: 'Danger', severity: 'danger', disabled: true },
contrast: {type: 'button', text: 'Contrast', severity: 'contrast', disabled: true },
}
}
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Outlined Variant
The 'outlined' variant renders the button with a border and transparent background that fills on hover.
<VfButton name="primary" severity="primary" variant="outlined" />
<VfButton name="secondary" severity="secondary" variant="outlined" />
<VfButton name="success" severity="success" variant="outlined" />
<VfButton name="info" severity="info" variant="outlined" />
<VfButton name="warn" severity="warn" variant="outlined" />
<VfButton name="help" severity="help" variant="outlined" />
<VfButton name="danger" severity="danger" variant="outlined" />
<VfButton name="contrast" severity="contrast" variant="outlined" /><template>
<VfGroup name="outlineds" stacked>
<VfButton name="primary" text="Primary" severity="primary" variant="outlined" />
<VfButton name="secondary" text="Secondary" severity="secondary" variant="outlined" />
<VfButton name="success" text="Success" severity="success" variant="outlined" />
<VfButton name="info" text="Info" severity="info" variant="outlined" />
<VfButton name="warn" text="Warn" severity="warn" variant="outlined" />
<VfButton name="help" text="Help" severity="help" variant="outlined" />
<VfButton name="danger" text="Danger" severity="danger" variant="outlined" />
<VfButton name="contrast" text="Contrast" severity="contrast" variant="outlined" />
</VfGroup>
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const schema = defineSchema({
outlineds: {
type: 'group',
stacked: true,
schema: {
primary: { type: 'button', text: 'Primary', severity: 'primary', variant: 'outlined' },
secondary: { type: 'button', text: 'Secondary', severity: 'secondary', variant: 'outlined' },
success: { type: 'button', text: 'Success', severity: 'success', variant: 'outlined' },
info: { type: 'button', text: 'Info', severity: 'info', variant: 'outlined' },
warn: { type: 'button', text: 'Warn', severity: 'warn', variant: 'outlined' },
help: { type: 'button', text: 'Help', severity: 'help', variant: 'outlined' },
danger: { type: 'button', text: 'Danger', severity: 'danger', variant: 'outlined' },
contrast: { type: 'button', text: 'Contrast', severity: 'contrast', variant: 'outlined' },
}
}
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Text Variant
The 'text' variant renders the button without a background, showing only the label with the severity color.
<VfButton name="primary" severity="primary" variant="text" />
<VfButton name="secondary" severity="secondary" variant="text" />
<VfButton name="success" severity="success" variant="text" />
<VfButton name="info" severity="info" variant="text" />
<VfButton name="warn" severity="warn" variant="text" />
<VfButton name="help" severity="help" variant="text" />
<VfButton name="danger" severity="danger" variant="text" />
<VfButton name="contrast" severity="contrast" variant="text" /><template>
<VfGroup name="texts" stacked>
<VfButton name="primary" text="Primary" severity="primary" variant="text" />
<VfButton name="secondary" text="Secondary" severity="secondary" variant="text" />
<VfButton name="success" text="Success" severity="success" variant="text" />
<VfButton name="info" text="Info" severity="info" variant="text" />
<VfButton name="warn" text="Warn" severity="warn" variant="text" />
<VfButton name="help" text="Help" severity="help" variant="text" />
<VfButton name="danger" text="Danger" severity="danger" variant="text" />
<VfButton name="contrast" text="Contrast" severity="contrast" variant="text" />
</VfGroup>
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const schema = defineSchema({
actions: {
type: 'group',
stacked: true,
schema: {
primary: { type: 'button', text: 'Primary', severity: 'primary', variant: 'text' },
secondary: { type: 'button', text: 'Secondary', severity: 'secondary', variant: 'text' },
success: { type: 'button', text: 'Success', severity: 'success', variant: 'text' },
info: { type: 'button', text: 'Info', severity: 'info', variant: 'text' },
warn: { type: 'button', text: 'Warn', severity: 'warn', variant: 'text' },
help: { type: 'button', text: 'Help', severity: 'help', variant: 'text' },
danger: { type: 'button', text: 'Danger', severity: 'danger', variant: 'text' },
contrast: { type: 'button', text: 'Contrast', severity: 'contrast', variant: 'text' },
}
}
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Icon Only
Icon-only buttons combine icon with a variant and severity for compact action buttons. The example below shows all severity and variant combinations in both medium and small sizes.
<VfButton name="primary" icon="check" severity="primary" />
<VfButton name="secondary" icon="bookmark" severity="secondary" />
<VfButton name="success" icon="search" severity="success" />
<VfButton name="info" icon="user" severity="info" />
<VfButton name="warn" icon="bell" severity="warn" />
<VfButton name="help" icon="heart" severity="help" />
<VfButton name="danger" icon="times" severity="danger" />
<VfButton name="contrast" icon="star" severity="contrast" />
<VfButton name="primary" icon="check" severity="primary" variant="outlined" />
<VfButton name="secondary" icon="bookmark" severity="secondary" variant="outlined" />
<VfButton name="success" icon="search" severity="success" variant="outlined" />
<VfButton name="info" icon="user" severity="info" variant="outlined" />
<VfButton name="warn" icon="bell" severity="warn" variant="outlined" />
<VfButton name="help" icon="heart" severity="help" variant="outlined" />
<VfButton name="danger" icon="times" severity="danger" variant="outlined" />
<VfButton name="contrast" icon="star" severity="contrast" variant="outlined" />
<VfButton name="primary" icon="check" severity="primary" variant="text" />
<VfButton name="secondary" icon="bookmark" severity="secondary" variant="text" />
<VfButton name="success" icon="search" severity="success" variant="text" />
<VfButton name="info" icon="user" severity="info" variant="text" />
<VfButton name="warn" icon="bell" severity="warn" variant="text" />
<VfButton name="help" icon="heart" severity="help" variant="text" />
<VfButton name="danger" icon="times" severity="danger" variant="text" />
<VfButton name="contrast" icon="star" severity="contrast" variant="text" /><template>
<VfGroup name="iconOnly" tabbed>
<VfGroup name="medium" page="Medium">
<VfGroup name="filled" stacked>
<VfButton name="primary" icon="check" severity="primary" />
<VfButton name="secondary" icon="bookmark" severity="secondary" />
<VfButton name="success" icon="search" severity="success" />
<VfButton name="info" icon="user" severity="info" />
<VfButton name="warn" icon="bell" severity="warn" />
<VfButton name="help" icon="heart" severity="help" />
<VfButton name="danger" icon="times" severity="danger" />
<VfButton name="contrast" icon="star" severity="contrast" />
</VfGroup>
<VfGroup name="outlined" stacked>
<VfButton name="primary" icon="check" severity="primary" variant="outlined" />
<VfButton name="secondary" icon="bookmark" severity="secondary" variant="outlined" />
<VfButton name="success" icon="search" severity="success" variant="outlined" />
<VfButton name="info" icon="user" severity="info" variant="outlined" />
<VfButton name="warn" icon="bell" severity="warn" variant="outlined" />
<VfButton name="help" icon="heart" severity="help" variant="outlined" />
<VfButton name="danger" icon="times" severity="danger" variant="outlined" />
<VfButton name="contrast" icon="star" severity="contrast" variant="outlined" />
</VfGroup>
<VfGroup name="text" stacked>
<VfButton name="primary" icon="check" severity="primary" variant="text" />
<VfButton name="secondary" icon="bookmark" severity="secondary" variant="text" />
<VfButton name="success" icon="search" severity="success" variant="text" />
<VfButton name="info" icon="user" severity="info" variant="text" />
<VfButton name="warn" icon="bell" severity="warn" variant="text" />
<VfButton name="help" icon="heart" severity="help" variant="text" />
<VfButton name="danger" icon="times" severity="danger" variant="text" />
<VfButton name="contrast" icon="star" severity="contrast" variant="text" />
</VfGroup>
</VfGroup>
<VfGroup name="small" page="Small">
<VfGroup name="filled" stacked>
<VfButton name="primary" icon="check" severity="primary" size="small" />
<VfButton name="secondary" icon="bookmark" severity="secondary" size="small" />
<VfButton name="success" icon="search" severity="success" size="small" />
<VfButton name="info" icon="user" severity="info" size="small" />
<VfButton name="warn" icon="bell" severity="warn" size="small" />
<VfButton name="help" icon="heart" severity="help" size="small" />
<VfButton name="danger" icon="times" severity="danger" size="small" />
<VfButton name="contrast" icon="star" severity="contrast" size="small" />
</VfGroup>
<VfGroup name="outlined" stacked>
<VfButton name="primary" icon="check" severity="primary" size="small" variant="outlined" />
<VfButton name="secondary" icon="bookmark" severity="secondary" size="small" variant="outlined" />
<VfButton name="success" icon="search" severity="success" size="small" variant="outlined" />
<VfButton name="info" icon="user" severity="info" size="small" variant="outlined" />
<VfButton name="warn" icon="bell" severity="warn" size="small" variant="outlined" />
<VfButton name="help" icon="heart" severity="help" size="small" variant="outlined" />
<VfButton name="danger" icon="times" severity="danger" size="small" variant="outlined" />
<VfButton name="contrast" icon="star" severity="contrast" size="small" variant="outlined" />
</VfGroup>
<VfGroup name="text" stacked>
<VfButton name="primary" icon="check" severity="primary" size="small" variant="text" />
<VfButton name="secondary" icon="bookmark" severity="secondary" size="small" variant="text" />
<VfButton name="success" icon="search" severity="success" size="small" variant="text" />
<VfButton name="info" icon="user" severity="info" size="small" variant="text" />
<VfButton name="warn" icon="bell" severity="warn" size="small" variant="text" />
<VfButton name="help" icon="heart" severity="help" size="small" variant="text" />
<VfButton name="danger" icon="times" severity="danger" size="small" variant="text" />
<VfButton name="contrast" icon="star" severity="contrast" size="small" variant="text" />
</VfGroup>
</VfGroup>
</VfGroup>
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const schema = defineSchema({
medium: {
type: 'group',
page: 'Medium',
schema: {
filled: {
type: 'group',
stacked: true,
schema: {
primary: { type: 'button', icon: 'check', severity: 'primary' },
secondary: { type: 'button', icon: 'bookmark', severity: 'secondary' },
success: { type: 'button', icon: 'search', severity: 'success' },
info: { type: 'button', icon: 'user', severity: 'info' },
warn: { type: 'button', icon: 'bell', severity: 'warn' },
help: { type: 'button', icon: 'heart', severity: 'help' },
danger: { type: 'button', icon: 'times', severity: 'danger' },
contrast: { type: 'button', icon: 'star', severity: 'contrast' },
},
},
outlined: {
type: 'group',
stacked: true,
schema: {
primary: { type: 'button', icon: 'check', severity: 'primary', variant: 'outlined' },
secondary: { type: 'button', icon: 'bookmark', severity: 'secondary', variant: 'outlined' },
success: { type: 'button', icon: 'search', severity: 'success', variant: 'outlined' },
info: { type: 'button', icon: 'user', severity: 'info', variant: 'outlined' },
warn: { type: 'button', icon: 'bell', severity: 'warn', variant: 'outlined' },
help: { type: 'button', icon: 'heart', severity: 'help', variant: 'outlined' },
danger: { type: 'button', icon: 'times', severity: 'danger', variant: 'outlined' },
contrast: { type: 'button', icon: 'star', severity: 'contrast', variant: 'outlined' },
},
},
text: {
type: 'group',
stacked: true,
schema: {
primary: { type: 'button', icon: 'check', severity: 'primary', variant: 'text' },
secondary: { type: 'button', icon: 'bookmark', severity: 'secondary', variant: 'text' },
success: { type: 'button', icon: 'search', severity: 'success', variant: 'text' },
info: { type: 'button', icon: 'user', severity: 'info', variant: 'text' },
warn: { type: 'button', icon: 'bell', severity: 'warn', variant: 'text' },
help: { type: 'button', icon: 'heart', severity: 'help', variant: 'text' },
danger: { type: 'button', icon: 'times', severity: 'danger', variant: 'text' },
contrast: { type: 'button', icon: 'star', severity: 'contrast', variant: 'text' },
},
},
},
},
small: {
type: 'group',
page: 'Small',
schema: {
filled: {
type: 'group',
stacked: true,
schema: {
primary: { type: 'button', icon: 'check', severity: 'primary', size: 'small' },
secondary: { type: 'button', icon: 'bookmark', severity: 'secondary', size: 'small' },
success: { type: 'button', icon: 'search', severity: 'success', size: 'small' },
info: { type: 'button', icon: 'user', severity: 'info', size: 'small' },
warn: { type: 'button', icon: 'bell', severity: 'warn', size: 'small' },
help: { type: 'button', icon: 'heart', severity: 'help', size: 'small' },
danger: { type: 'button', icon: 'times', severity: 'danger', size: 'small' },
contrast: { type: 'button', icon: 'star', severity: 'contrast', size: 'small' },
},
},
outlined: {
type: 'group',
stacked: true,
schema: {
primary: { type: 'button', icon: 'check', severity: 'primary', size: 'small', variant: 'outlined' },
secondary: { type: 'button', icon: 'bookmark', severity: 'secondary', size: 'small', variant: 'outlined' },
success: { type: 'button', icon: 'search', severity: 'success', size: 'small', variant: 'outlined' },
info: { type: 'button', icon: 'user', severity: 'info', size: 'small', variant: 'outlined' },
warn: { type: 'button', icon: 'bell', severity: 'warn', size: 'small', variant: 'outlined' },
help: { type: 'button', icon: 'heart', severity: 'help', size: 'small', variant: 'outlined' },
danger: { type: 'button', icon: 'times', severity: 'danger', size: 'small', variant: 'outlined' },
contrast: { type: 'button', icon: 'star', severity: 'contrast', size: 'small', variant: 'outlined' },
},
},
text: {
type: 'group',
stacked: true,
schema: {
primary: { type: 'button', icon: 'check', severity: 'primary', size: 'small', variant: 'text' },
secondary: { type: 'button', icon: 'bookmark', severity: 'secondary', size: 'small', variant: 'text' },
success: { type: 'button', icon: 'search', severity: 'success', size: 'small', variant: 'text' },
info: { type: 'button', icon: 'user', severity: 'info', size: 'small', variant: 'text' },
warn: { type: 'button', icon: 'bell', severity: 'warn', size: 'small', variant: 'text' },
help: { type: 'button', icon: 'heart', severity: 'help', size: 'small', variant: 'text' },
danger: { type: 'button', icon: 'times', severity: 'danger', size: 'small', variant: 'text' },
contrast: { type: 'button', icon: 'star', severity: 'contrast', size: 'small', variant: 'text' },
},
},
},
},
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Sizes
The size prop controls the button's size. Available values are 'medium' (default) and 'small'.
<VfButton name="small" text="Small" icon="check" size="small" />
<VfButton name="medium" text="Medium" icon="check" size="medium" /><template>
<VfGroup name="sizes" stacked>
<VfButton
name="small"
text="Small"
icon="check"
size="small"
/>
<VfButton
name="medium"
text="Medium"
icon="check"
size="medium"
/>
</VfGroup>
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const schema = defineSchema({
sizes: {
type: 'group',
stacked: true,
schema: {
small: { type: 'button', text: 'Small', icon: 'check', size: 'small' },
medium: { type: 'button', text: 'Medium', icon: 'check', size: 'medium' },
},
},
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Alignment
The align prop controls the horizontal alignment of the button within its container. Available values are 'left' (default), 'center', and 'right'.
<VfButton name="left" text="Left" align="left" />
<VfButton name="center" text="Center" align="center" />
<VfButton name="right" text="Right" align="right" /><template>
<VfButton name="left" text="Left" align="left" />
<VfButton name="center" text="Center" align="center" />
<VfButton name="right" text="Right" align="right" />
</template><script setup lang="ts">
import { defineSchema, useForm } from '@vueform/ui'
const schema = defineSchema({
left: { type: 'button', text: 'Left', align: 'left' },
center: { type: 'button', text: 'Center', align: 'center' },
right: { type: 'button', text: 'Right', align: 'right' },
})
const [Form] = useForm({ schema })
</script>
<template>
<Form />
</template>Props
Configure the component's behavior and appearance with these props.
General
| Prop | Default | Description |
|---|---|---|
name | — | Required. The element's unique identifier and path in the current level of form data model. |
type | 'button' | The element type identifier. |
id | — | The HTML id attribute for the input element. |
Layout
| Prop | Default | Description |
|---|---|---|
label | — | The label displayed alongside the element. |
hideLabel | false | Whether to visually hide the element's label. |
page | — | Page configuration for stepped/tabbed forms. Accepts a simple label or a metadata tuple with at least a label property. |
help | — | A help text displayed below the label. |
loading | false | Whether the element is in loading state. |
align | — | Horizontal alignment of the button within its container. |
columns | — | Responsive grid column sizing for the element's layout. |
layout | true | Custom layout template for this element, false to render the element without any layout wrapper, or true (default) for normal layout. |
spaceTop | — | Adds vertical spacing (padding) above the element. The value maps to a spacing token (1-3): 1 = var(--vf-space-1), .... |
spaceBottom | — | Adds vertical spacing (padding) above the element. The value maps to a spacing token (1-3): 1 = var(--vf-space-1), .... |
lineTop | false | Renders a horizontal line (border) above the element. |
lineBottom | false | Renders a horizontal line (border) below the element. |
Element
| Prop | Default | Description |
|---|---|---|
variant | 'filled' | The visual variant of the button. |
severity | 'secondary' | The color severity of the button. |
size | 'medium' | The size of the button. |
noExpressions | false | Disables expression resolution for this element. Applies to the element itself only (container elements don't cascade it to their children), and a form-level noExpressions cannot be overridden by setting it to false here. |
description | — | A description text displayed below the element. |
disabled | false | Whether the element is disabled. |
text | — | The label text displayed on the button. |
action | — | The action performed when the button is clicked. Use 'submit' to submit the parent form or 'reset' to reset it. Custom string values can be used for application-specific actions handled via the click event. |
icon | — | The icon to display inside the button. |
iconPos | 'left' | The position of the icon relative to the button label. |
href | — | When set the button renders as an <a> element instead of <button>. |
target | — | The target attribute for the anchor element. |
rel | — | The rel attribute for the anchor element. |
download | — | The download attribute for the anchor element. |
to | — | Route location to navigate to when using vue-router. |
fluid | false | Whether the button spans the full width of its container. |
Data
| Prop | Default | Description |
|---|---|---|
detached | false | Whether the element is detached from the form's element registry and data model (if applicable). |
Conditions
| Prop | Default | Description |
|---|---|---|
conditions | — | Conditions that control the element's visibility and availability. |
conditionsTrigger | — | The source that triggers re-evaluation of this element's async conditional props (conditions, disabled, readonly, and validation rule conditions). Accepts an array of element paths whose values are watched, a Ref, or a function used as a watch getter. When omitted, any change in the form model re-triggers evaluation. |
conditionsDebounce | — | The debounce delay in milliseconds applied before re-evaluating this element's async conditional props when the trigger source changes. Overrides the global $conditions.debounce config (default 300). |
Customization
| Prop | Default | Description |
|---|---|---|
parts | — | Custom DOM attribute overrides for the component's structural parts. |
class | — | CSS classes to apply to the component's root element. |
classes | — | Custom CSS class overrides for the component's structural parts. |
reclass | — | CSS class overrides that replace (rather than merge with) default classes. |
tokens | — | Token overrides applied to the element's CSS custom properties. |
slots | — | Custom Vue components to use for named slots. Every component resolves it through the standard outlets pipeline (see useOutlets). |
presets | — | Named configuration presets to apply to the component. |
template | — | A custom Vue component to use as the template instead of the default. |
component | — | A custom Vue component to render in the component's default slot. |
Context
Reactive properties and methods accessible on the component's Context object.
General
| Name | Description |
|---|---|
type | The element's type identifier (e.g. "text", "checkbox", "select"). |
name | The element's name as a string ref. |
props | The resolved component props with defaults applied. |
Button
| Name | Description |
|---|---|
isStatic | Whether the element is a static (non-data) element. |
description | The resolved description text for the element. |
descriptionId | The DOM id for the element's description text region. |
icon | The resolved icon CSS class string. $-prefixed names are mapped through the config-level semantic icons map. |
href | The resolved href for the button, supporting dynamic text props. |
to | The resolved route location for the button, supporting dynamic text props. |
severity | The resolved severity of the button, supporting dynamic text props. |
handleClick() | Handles the click event, fires the click event through the event system, and performs the configured action (submit or reset) on the parent form. |
State
| Name | Description |
|---|---|
visible | Whether the element is currently visible, based on availability, container visibility, and pager state. |
available | Whether the element is available (not hidden by conditional logic). |
disabled | Whether the element is currently disabled, considering form state, parent container state, local override, and the disabled prop. The prop is evaluated through the conditions pipeline, so sync and async conditional values are supported uniformly. |
loading | Whether the button is in a loading state. The loading prop is evaluated through the conditions pipeline, so sync and async conditional values are supported uniformly. |
enable() | Programmatically enables the element. |
disable() | Programmatically disables the element. |
Validation
| Name | Description |
|---|---|
errors | The reactive list of validation error messages. |
displayErrors | The reactive list of validation error messages. |
messages | The reactive list of informational messages. |
messageBag | The element's message bag for custom errors and messages. |
genericName | A human-readable name resolved from displayName, label, floating, placeholder, or the element's name prop. |
Layout
| Name | Description |
|---|---|
id | The resolved element id, using the id prop or falling back to the auto-generated uid. |
text | The resolved label text for the button. |
label | The resolved label text for the element. |
help | The resolved help text for the element. |
page | Page metadata for stepped/tabbed forms. |
classes | The resolved CSS class map for the component. |
parts | The resolved DOM attribute overrides for internal elements. |
tokenClass | A unique CSS class scoped to this component instance, used to target the injected token style rule. |
tokenCss | The CSS text for scoped token custom properties on this component instance — a base rule plus a browser-resolved dark-mode block, so the text is identical between server and client renders. |
nonce | Unique security nonce for injecting scoped styles. |
viewLoaded | Whether the element's view has been loaded (used for lazy rendering optimization). |
$el | Reference to the component's root DOM element. |
resolvedColumns | Resolved column sizes per breakpoint, normalized into container/label/wrapper/group values. |
updateColumns() | Updates the column configuration programmatically. |
scrollTo() | Scrolls the window to this element. If the element belongs to a step or tab, that page is selected first before scrolling. |
focus() | Focuses the first focusable HTML element (input, select, textarea, button, etc.) within the wrapper. Optionally scrolls to the element first. |
Tree
| Name | Description |
|---|---|
form$ | The parent form's context, providing access to form-level state and methods. |
path | The element's dot-notation path in the form tree (e.g. "user.name"). |
componentName | The resolved Vue component name for this element. |
container | The container context providing path, model, and registration methods for child elements. |
children | The child element registry providing registration, unregistration, and reactive child lists. |
Events
| Name | Description |
|---|---|
fire() | Fires an event synchronously, invoking before, main, and after listeners in order. |
fireAsync() | Fires an event asynchronously, awaiting each callback and short-circuiting when any returns false. |
on() | Subscribes a callback to a specific event. |
off() | Removes a previously registered event callback. |
onBefore() | Registers a callback that runs before the main event listeners. |
onAfter() | Registers a callback that runs after the main event listeners. |
Accessibility
| Name | Description |
|---|---|
uid | A unique auto-generated identifier for the element. |
helpId | The DOM id for the element's help text region. |
errorId | The DOM id for the element's error message region. |
labelId | The DOM id for the element's label region. |
Events
Events emitted by the component. See Events for details.
| Name | Params | Description |
|---|---|---|
click | event, context$ | Emitted when the button is clicked. |
focus | context$ | Emitted when the element receives focus. |
blur | context$ | Emitted when the element loses focus. |
beforeMount | context$ | Emitted before the component is mounted. |
mounted | context$ | Emitted after the component is mounted. |
beforeUnmount | context$ | Emitted before the component is unmounted. |
unmounted | context$ | Emitted after the component is unmounted. |
updated | context$ | Emitted after the component is updated. |
Slots
Named Slots for replacing parts of the component's rendering.
| Name | Scope | Description |
|---|---|---|
template | context | Slot that replaces the entire component rendering. Receives the full component context as a single context prop. |
label | label | Slot for customizing the element's label content. |
required | — | Slot for customizing the required indicator. |
help | help | Slot for customizing the help text. |
before | — | Slot for content rendered before the label. |
default | text bindings | Default slot that replaces the button label content. |
after | — | Slot for content rendered after the label. |
description | description | Slot for customizing the description text. |
errors | errors | Slot for customizing the validation errors display. |
messages | messages | Slot for customizing the info messages display. |
Parts
DOM attribute overrides targeting internal elements. See Parts for details.
panel
The wrapper around root with display: contents when the element is a step or a tab.
| Element | <div> |
| Classes | .vf-panel |
root
The element's root wrapper.
| Element | <div> <fieldset> |
| Classes | .vf-element .vf-space-top-1? .vf-space-top-2? .vf-space-top-3? .vf-space-bottom-1? .vf-space-bottom-2? .vf-space-bottom-3? .vf-line-top? .vf-line-bottom? .vf-button |
labelGroup
The container holding the label and required indicator.
| Element | <div> |
| Classes | .vf-label-group |
label
The label element, associated with the control via for.
| Element | <label> <span> |
| Classes | .vf-label |
| Bindings | id |
required
The required indicator.
| Element | <div> |
| Classes | .vf-required |
elementGroup
The container wrapping the input and related UI.
| Element | <div> |
| Classes | .vf-element-group |
elementWrapper
The wrapper directly around the input control.
| Element | <div> |
| Classes | .vf-element-wrapper |
help
The help text area.
| Element | <div> |
| Classes | .vf-help |
| Bindings | id |
button
The root button or anchor element.
| Element | <button> <a> |
| Classes | .vf-btn |
| Bindings | data-variant data-severity data-size data-align data-fluid data-icon-only data-loading data-disabled disabled aria-disabled aria-busy aria-label aria-describedby |
icon
The icon of the button.
| Element | <i> |
| Classes | .vf-btn-icon |
| Bindings | data-pos |
text
The text of the button.
| Element | <span> |
| Classes | .vf-btn-text |
description
The description text area.
| Element | <div> |
| Classes | .vf-description |
| Bindings | id |
errors
The validation errors container.
| Element | <div> |
| Classes | .vf-errors |
| Bindings | id role |
error
An individual validation error.
| Element | <div> |
| Classes | .vf-error |
messages
The info messages container.
| Element | <div> |
| Classes | .vf-messages |
message
An individual info message.
| Element | <div> |
| Classes | .vf-message |
Tokens
All the CSS variables that control this component's appearance with default values in the default theme. See Theming Guide for details.
:root {
/**
* Element tokens
* -------------------------------------------------------------------------- */
--vf-btn-gutter-x: 0.5rem;
--vf-btn-gutter-x-sm: 0.5rem;
--vf-btn-gutter-y: 0;
--vf-btn-gutter-y-sm: 0;
--vf-btn-padding-x: var(--vf-px);
--vf-btn-padding-x-sm: 0.5rem;
--vf-btn-padding-y: var(--vf-py);
--vf-btn-padding-y-sm: 0.125rem;
--vf-btn-width: auto;
--vf-btn-font-size: 1rem;
--vf-btn-font-size-sm: 0.875rem;
--vf-btn-ring-offset: 1px;
--vf-btn-ring-style: solid;
--vf-btn-ring-width: 1px;
--vf-btn-border-style: solid;
--vf-btn-border-width: 1px;
--vf-btn-radius: var(--vf-radius);
--vf-btn-radius-sm: var(--vf-radius-sm);
--vf-btn-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0);
--vf-btn-disabled-opacity: 0.6;
--vf-btn-outline-bg-percent: 15%;
--vf-btn-outline-transparent-percent: 100%;
--vf-btn-bg-primary: var(--vf-brand);
--vf-btn-bg-primary-hover: color-mix(in srgb, var(--vf-brand) 100%, black 15%);
--vf-btn-border-color-primary: var(--vf-brand);
--vf-btn-border-color-primary-hover: color-mix(in srgb, var(--vf-brand) 100%, black 15%);
--vf-btn-color-primary: var(--vf-white);
--vf-btn-color-primary-hover: var(--vf-white);
--vf-btn-outline-primary: var(--vf-brand);
--vf-btn-ring-color-primary: var(--vf-brand);
--vf-btn-ring-shadow-primary: none;
--vf-btn-bg-secondary: var(--vf-gray-200);
--vf-btn-bg-secondary-hover: var(--vf-gray-300);
--vf-btn-border-color-secondary: var(--vf-gray-200);
--vf-btn-border-color-secondary-hover: var(--vf-gray-300);
--vf-btn-color-secondary: var(--vf-gray-700);
--vf-btn-color-secondary-hover: var(--vf-gray-700);
--vf-btn-outline-secondary: var(--vf-gray-400);
--vf-btn-ring-color-secondary: var(--vf-gray-200);
--vf-btn-ring-shadow-secondary: none;
--vf-btn-bg-success: var(--vf-green);
--vf-btn-bg-success-hover: color-mix(in srgb, var(--vf-green) 100%, black 15%);
--vf-btn-border-color-success: var(--vf-green);
--vf-btn-border-color-success-hover: color-mix(in srgb, var(--vf-green) 100%, black 15%);
--vf-btn-color-success: var(--vf-white);
--vf-btn-color-success-hover: var(--vf-white);
--vf-btn-outline-success: var(--vf-green);
--vf-btn-ring-color-success: var(--vf-green);
--vf-btn-ring-shadow-success: none;
--vf-btn-bg-info: var(--vf-sky);
--vf-btn-bg-info-hover: color-mix(in srgb, var(--vf-sky) 100%, black 15%);
--vf-btn-border-color-info: var(--vf-sky);
--vf-btn-border-color-info-hover: color-mix(in srgb, var(--vf-sky) 100%, black 15%);
--vf-btn-color-info: var(--vf-white);
--vf-btn-color-info-hover: var(--vf-white);
--vf-btn-outline-info: var(--vf-sky);
--vf-btn-ring-color-info: var(--vf-sky);
--vf-btn-ring-shadow-info: none;
--vf-btn-bg-warn: var(--vf-orange);
--vf-btn-bg-warn-hover: color-mix(in srgb, var(--vf-orange) 100%, black 15%);
--vf-btn-border-color-warn: var(--vf-orange);
--vf-btn-border-color-warn-hover: color-mix(in srgb, var(--vf-orange) 100%, black 15%);
--vf-btn-color-warn: var(--vf-white);
--vf-btn-color-warn-hover: var(--vf-white);
--vf-btn-outline-warn: var(--vf-orange);
--vf-btn-ring-color-warn: var(--vf-orange);
--vf-btn-ring-shadow-warn: none;
--vf-btn-bg-help: var(--vf-purple);
--vf-btn-bg-help-hover: color-mix(in srgb, var(--vf-purple) 100%, black 15%);
--vf-btn-border-color-help: var(--vf-purple);
--vf-btn-border-color-help-hover: color-mix(in srgb, var(--vf-purple) 100%, black 15%);
--vf-btn-color-help: var(--vf-white);
--vf-btn-color-help-hover: var(--vf-white);
--vf-btn-outline-help: var(--vf-purple);
--vf-btn-ring-color-help: var(--vf-purple);
--vf-btn-ring-shadow-help: none;
--vf-btn-bg-danger: var(--vf-red);
--vf-btn-bg-danger-hover: color-mix(in srgb, var(--vf-red) 100%, black 15%);
--vf-btn-border-color-danger: var(--vf-red);
--vf-btn-border-color-danger-hover: color-mix(in srgb, var(--vf-red) 100%, black 15%);
--vf-btn-color-danger: var(--vf-white);
--vf-btn-color-danger-hover: var(--vf-white);
--vf-btn-outline-danger: var(--vf-red);
--vf-btn-ring-color-danger: var(--vf-red);
--vf-btn-ring-shadow-danger: none;
--vf-btn-bg-contrast: var(--vf-gray-900);
--vf-btn-bg-contrast-hover: var(--vf-gray-800);
--vf-btn-border-color-contrast: var(--vf-gray-900);
--vf-btn-border-color-contrast-hover: var(--vf-gray-800);
--vf-btn-color-contrast: var(--vf-white);
--vf-btn-color-contrast-hover: var(--vf-white);
--vf-btn-outline-contrast: var(--vf-gray-900);
--vf-btn-ring-color-contrast: var(--vf-gray-900);
--vf-btn-ring-shadow-contrast: none;
/**
* Shared element layout tokens
* -------------------------------------------------------------------------- */
--vf-element-line-color: var(--vf-gray-300);
--vf-label-font-size: 1rem;
--vf-label-font-weight: 600;
--vf-label-group-h-padding: calc(var(--vf-py) + var(--vf-border-width-t)) 0 0 0;
--vf-label-group-v-padding: 0 0 0.375rem 0;
--vf-required-bg: transparent;
--vf-required-color: inherit;
--vf-required-content: '*';
--vf-required-h: auto;
--vf-required-icon: none;
--vf-required-w: auto;
--vf-help-bg: transparent;
--vf-help-border-color: transparent;
--vf-help-border-style: solid;
--vf-help-border-width: 0;
--vf-help-color: var(--vf-text-soft);
--vf-help-font-size: 0.875rem;
--vf-help-padding: 0;
--vf-help-radius: var(--vf-radius);
--vf-description-bg: transparent;
--vf-description-border-color: transparent;
--vf-description-border-style: solid;
--vf-description-border-width: 0;
--vf-description-color: var(--vf-text-soft);
--vf-description-font-size: 0.875rem;
--vf-description-padding: 0;
--vf-description-radius: var(--vf-radius);
--vf-errors-bg: transparent;
--vf-errors-border-color: transparent;
--vf-errors-border-style: solid;
--vf-errors-border-width: 0;
--vf-errors-color: var(--vf-red);
--vf-errors-font-size: 0.875rem;
--vf-errors-padding: 0;
--vf-errors-radius: var(--vf-radius);
--vf-messages-bg: transparent;
--vf-messages-border-color: var(--vf-border-success);
--vf-messages-border-style: solid;
--vf-messages-border-width: 0;
--vf-messages-color: var(--vf-green);
--vf-messages-font-size: 0.875rem;
--vf-messages-padding: 0;
--vf-messages-radius: var(--vf-radius);
--vf-input-border-width-l: var(--vf-border-width-l);
--vf-icon-font-size: 0.875rem;
--vf-icon-group-color: inherit;
--vf-icon-group-color-danger: var(--vf-color-danger);
--vf-icon-group-width: 2.5rem;
--vf-element-group-gutter-x: 0;
--vf-element-group-gutter-y: 0.25rem;
--vf-element-wrapper-padding: 0;
/**
* Semantic tokens
* -------------------------------------------------------------------------- */
--vf-icon-height: 0.75rem;
--vf-icon-width: 0.75rem;
/**
* Primitives tokens
* -------------------------------------------------------------------------- */
--vf-icon-loading: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='6.5' fill='none' stroke='currentColor' stroke-width='1.5' stroke-dasharray='30.6 10.2' stroke-linecap='round'/%3E%3C/svg%3E");
--vf-space-1: 1rem;
--vf-space-2: 2rem;
--vf-space-3: 3rem;
}{
/**
* Element tokens
* -------------------------------------------------------------------------- */
btnGutterX: '0.5rem',
btnGutterXSm: '0.5rem',
btnGutterY: '0',
btnGutterYSm: '0',
btnPaddingX: '$px',
btnPaddingXSm: '0.5rem',
btnPaddingY: '$py',
btnPaddingYSm: '0.125rem',
btnWidth: 'auto',
btnFontSize: '1rem',
btnFontSizeSm: '0.875rem',
btnRingOffset: '1px',
btnRingStyle: 'solid',
btnRingWidth: '1px',
btnBorderStyle: 'solid',
btnBorderWidth: '1px',
btnRadius: '$radius',
btnRadiusSm: '$radiusSm',
btnShadow: '0px 0px 0px 0px rgba(0, 0, 0, 0)',
btnDisabledOpacity: '0.6',
btnOutlineBgPercent: '15%',
btnOutlineTransparentPercent: '100%',
btnBgPrimary: '$brand',
btnBgPrimaryHover: 'color-mix(in srgb, $brand 100%, black 15%)',
btnBorderColorPrimary: '$brand',
btnBorderColorPrimaryHover: 'color-mix(in srgb, $brand 100%, black 15%)',
btnColorPrimary: '$white',
btnColorPrimaryHover: '$white',
btnOutlinePrimary: '$brand',
btnRingColorPrimary: '$brand',
btnRingShadowPrimary: 'none',
btnBgSecondary: '$gray200',
btnBgSecondaryHover: '$gray300',
btnBorderColorSecondary: '$gray200',
btnBorderColorSecondaryHover: '$gray300',
btnColorSecondary: '$gray700',
btnColorSecondaryHover: '$gray700',
btnOutlineSecondary: '$gray400',
btnRingColorSecondary: '$gray200',
btnRingShadowSecondary: 'none',
btnBgSuccess: '$green',
btnBgSuccessHover: 'color-mix(in srgb, $green 100%, black 15%)',
btnBorderColorSuccess: '$green',
btnBorderColorSuccessHover: 'color-mix(in srgb, $green 100%, black 15%)',
btnColorSuccess: '$white',
btnColorSuccessHover: '$white',
btnOutlineSuccess: '$green',
btnRingColorSuccess: '$green',
btnRingShadowSuccess: 'none',
btnBgInfo: '$sky',
btnBgInfoHover: 'color-mix(in srgb, $sky 100%, black 15%)',
btnBorderColorInfo: '$sky',
btnBorderColorInfoHover: 'color-mix(in srgb, $sky 100%, black 15%)',
btnColorInfo: '$white',
btnColorInfoHover: '$white',
btnOutlineInfo: '$sky',
btnRingColorInfo: '$sky',
btnRingShadowInfo: 'none',
btnBgWarn: '$orange',
btnBgWarnHover: 'color-mix(in srgb, $orange 100%, black 15%)',
btnBorderColorWarn: '$orange',
btnBorderColorWarnHover: 'color-mix(in srgb, $orange 100%, black 15%)',
btnColorWarn: '$white',
btnColorWarnHover: '$white',
btnOutlineWarn: '$orange',
btnRingColorWarn: '$orange',
btnRingShadowWarn: 'none',
btnBgHelp: '$purple',
btnBgHelpHover: 'color-mix(in srgb, $purple 100%, black 15%)',
btnBorderColorHelp: '$purple',
btnBorderColorHelpHover: 'color-mix(in srgb, $purple 100%, black 15%)',
btnColorHelp: '$white',
btnColorHelpHover: '$white',
btnOutlineHelp: '$purple',
btnRingColorHelp: '$purple',
btnRingShadowHelp: 'none',
btnBgDanger: '$red',
btnBgDangerHover: 'color-mix(in srgb, $red 100%, black 15%)',
btnBorderColorDanger: '$red',
btnBorderColorDangerHover: 'color-mix(in srgb, $red 100%, black 15%)',
btnColorDanger: '$white',
btnColorDangerHover: '$white',
btnOutlineDanger: '$red',
btnRingColorDanger: '$red',
btnRingShadowDanger: 'none',
btnBgContrast: '$gray900',
btnBgContrastHover: '$gray800',
btnBorderColorContrast: '$gray900',
btnBorderColorContrastHover: '$gray800',
btnColorContrast: '$white',
btnColorContrastHover: '$white',
btnOutlineContrast: '$gray900',
btnRingColorContrast: '$gray900',
btnRingShadowContrast: 'none',
/**
* Shared element layout tokens
* -------------------------------------------------------------------------- */
elementLineColor: '$gray300',
labelFontSize: '1rem',
labelFontWeight: '600',
labelGroupHPadding: 'calc($py + $borderWidthT) 0 0 0',
labelGroupVPadding: '0 0 0.375rem 0',
requiredBg: 'transparent',
requiredColor: 'inherit',
requiredContent: "'*'",
requiredH: 'auto',
requiredIcon: 'none',
requiredW: 'auto',
helpBg: 'transparent',
helpBorderColor: 'transparent',
helpBorderStyle: 'solid',
helpBorderWidth: '0',
helpColor: '$textSoft',
helpFontSize: '0.875rem',
helpPadding: '0',
helpRadius: '$radius',
descriptionBg: 'transparent',
descriptionBorderColor: 'transparent',
descriptionBorderStyle: 'solid',
descriptionBorderWidth: '0',
descriptionColor: '$textSoft',
descriptionFontSize: '0.875rem',
descriptionPadding: '0',
descriptionRadius: '$radius',
errorsBg: 'transparent',
errorsBorderColor: 'transparent',
errorsBorderStyle: 'solid',
errorsBorderWidth: '0',
errorsColor: '$red',
errorsFontSize: '0.875rem',
errorsPadding: '0',
errorsRadius: '$radius',
messagesBg: 'transparent',
messagesBorderColor: '$borderSuccess',
messagesBorderStyle: 'solid',
messagesBorderWidth: '0',
messagesColor: '$green',
messagesFontSize: '0.875rem',
messagesPadding: '0',
messagesRadius: '$radius',
inputBorderWidthL: '$borderWidthL',
iconFontSize: '0.875rem',
iconGroupColor: 'inherit',
iconGroupColorDanger: '$colorDanger',
iconGroupWidth: '2.5rem',
elementGroupGutterX: '0',
elementGroupGutterY: '0.25rem',
elementWrapperPadding: '0',
/**
* Semantic tokens
* -------------------------------------------------------------------------- */
iconHeight: '0.75rem',
iconWidth: '0.75rem',
/**
* Primitives tokens
* -------------------------------------------------------------------------- */
iconLoading: "url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='6.5' fill='none' stroke='currentColor' stroke-width='1.5' stroke-dasharray='30.6 10.2' stroke-linecap='round'/%3E%3C/svg%3E\")",
space1: '1rem',
space2: '2rem',
space3: '3rem',
}