Usage
Use the v-model directive to control the value of the Input.
<script setup lang="ts">
const value = ref('')
</script>
<template>
<B24Input v-model="value" />
</template>
Type
Use the type prop to change the input type. Defaults to text.
Some types have been implemented in their own components such as Checkbox, Radio, InputNumber etc. and others have been styled like file for example.
<template>
<B24Input type="file" />
</template>
Placeholder
Use the placeholder prop to set a placeholder text.
<template>
<B24Input placeholder="Search..." />
</template>
Color
Use the color prop to change the ring color when the Input is focused.
<template>
<B24Input color="air-primary-warning" highlight placeholder="Search..." />
</template>
highlight prop is used here to show the focus state. It's used internally when a validation error occurs.Tag
Use the tag property to display a Badge on top of the Input.
<template>
<B24Input tag="note" color="air-primary-warning" highlight placeholder="Search..." />
</template>
highlight prop is used here to show the focus state. It's used internally when a validation error occurs.Use the tagColor property to set the color for Badge.
<template>
<B24Input
tag-color="air-secondary-alert"
tag="note"
color="air-primary-warning"
highlight
placeholder="Search..."
/>
</template>
highlight prop is used here to show the focus state. It's used internally when a validation error occurs.Size
Use the size prop to change the size of the Input.
<template>
<B24Input size="xl" placeholder="Search..." />
</template>
Icon
Use the icon prop to show an Icon inside the Input.
<script setup lang="ts">
import RocketIcon from '@bitrix24/b24icons-vue/main/RocketIcon'
</script>
<template>
<B24Input :icon="RocketIcon" size="md" placeholder="Search..." />
</template>
Trailing Icon
Use the trailing-icon prop to set icon for trailing position.
<script setup lang="ts">
import RocketIcon from '@bitrix24/b24icons-vue/main/RocketIcon'
</script>
<template>
<B24Input :trailing-icon="RocketIcon" placeholder="Enter your email" size="md" />
</template>
Avatar
Use the avatar prop to show an Avatar inside the Input.
<template>
<B24Input
:avatar="{
src: '/b24ui/avatar/employee.png'
}"
size="md"
placeholder="Search..."
/>
</template>
Loading
Use the loading prop to show a loading icon on the Input.
<template>
<B24Input loading placeholder="Search..." />
</template>
Disabled
Use the disabled prop to disable the Input.
<template>
<B24Input disabled placeholder="Search..." />
</template>
No padding
Use the noPadding prop to removes padding from the Input.
<template>
<B24Input no-padding highlight placeholder="Search..." />
</template>
highlight prop is used here to show the focus state.No border
Use the noBorder prop to removes all borders (rings) from the Input.
<template>
<B24Input no-border highlight placeholder="Search..." />
</template>
highlight prop is used here to indicate that there is no focus state.Underline
Use the underline prop to removes all borders (rings) except the bottom one from the Input.
<template>
<B24Input underline highlight placeholder="Search..." />
</template>
highlight prop is used here to show the focus state.Rounded
Use the rounded prop to round the Input.
<template>
<B24Input rounded highlight placeholder="Search..." />
</template>
highlight prop is used here to show the focus state.Examples
With clear button
You can put a Button inside the #trailing slot to clear the Input.
With copy button
You can put a Button inside the #trailing slot to copy the value to the clipboard.
With password toggle
You can put a Button inside the #trailing slot to toggle the password visibility.
With password strength indicator
You can use the Progress component to display the password strength indicator.
Enter a password. Must contain:
- At least 8 characters - Requirement not met
- At least 1 number - Requirement not met
- At least 1 lowercase letter - Requirement not met
- At least 1 uppercase letter - Requirement not met
With character limit
You can use the #trailing slot to add a character limit to the Input.
With keyboard shortcut
You can use the Kbd component inside the #trailing slot to add a keyboard shortcut to the Input.
With mask
There's no built-in support for masks, but you can use libraries like maska to mask the Input.
With floating label
You can use the #default slot to add a floating label to the Input.
Within a FormField
You can use the Input within a FormField component to display a label, help text, required indicator, etc.
Within a FieldGroup
You can use the Input within a FieldGroup component to group multiple elements together.
https://
API
Props
Slots
Emits
Expose
When accessing the component via a template ref, you can use the following:
Theme
export default defineAppConfig({
b24ui: {
input: {
slots: {
root: 'isolate relative inline-flex items-center',
base: 'px-3 w-full py-0 border-0 focus:outline-none disabled:cursor-not-allowed disabled:pointer-events-none disabled:select-none disabled:opacity-30 disabled:resize-none appearance-none transition duration-300 ease-linear text-(--ui-color-base-1) style-blurred-bg-input placeholder:text-(--ui-color-design-plain-na-content-secondary) hover:text-(--ui-color-base-1) focus:text-(--ui-color-base-1) active:text-(--ui-color-base-1) font-[family-name:var(--ui-font-family-primary)] font-(--ui-font-weight-regular) align-middle text-ellipsis whitespace-nowrap',
leading: 'absolute inset-y-0 start-0 flex items-center',
leadingIcon: 'shrink-0 text-(--b24ui-icon-color)',
leadingAvatar: 'shrink-0',
leadingAvatarSize: '',
trailing: 'absolute inset-y-0 end-0 flex items-center',
trailingIcon: 'shrink-0 text-(--b24ui-icon-color)',
tag: 'pointer-events-none select-none absolute z-10 -top-[7px] right-[14px] flex flex-col justify-center items-center'
},
variants: {
fieldGroup: {
horizontal: {
root: 'group leading-none has-focus-visible:z-[1]',
base: 'focus-visible:outline-none ring ring-inset ring-1 focus-visible:ring-2 group-not-only:group-first:rounded-e-3xl group-not-only:group-last:rounded-s-none group-not-last:group-not-first:rounded-none group-not-only:group-first:rounded-e-none group-not-only:group-last:rounded-s-none group-not-last:group-not-first:rounded-none group-not-only:group-first:border-e-0 group-not-only:group-not-first:border-s-0'
},
vertical: {
root: 'group has-focus-visible:z-[1]',
base: 'focus-visible:outline-none ring ring-inset ring-1 focus-visible:ring-2 group-not-only:group-first:rounded-b-none group-not-only:group-last:rounded-t-none group-not-last:group-not-first:rounded-none'
}
},
noSplit: {
false: "group-not-only:not-first:after:content-[''] group-not-only:not-first:after:absolute group-not-only:not-first:after:top-[7px] group-not-only:not-first:after:bottom-[6px] group-not-only:not-first:after:left-0 group-not-only:not-first:after:w-px group-not-only:not-first:after:bg-current/30"
},
size: {
xss: {
base: 'h-[20px] gap-1 text-(length:--ui-font-size-4xs)/[normal]',
leading: 'px-1',
trailing: 'px-1',
leadingIcon: 'size-[12px]',
leadingAvatarSize: '3xs',
trailingIcon: 'size-[12px]'
},
xs: {
base: 'h-[24px] gap-1 text-(length:--ui-font-size-xs)/[normal]',
leading: 'px-1',
trailing: 'px-1',
leadingIcon: 'size-[14px]',
leadingAvatarSize: '3xs',
trailingIcon: 'size-[14px]'
},
sm: {
base: 'h-[28px] gap-1.5 text-(length:--ui-font-size-sm)/[normal]',
leading: 'px-1.5',
trailing: 'px-1.5',
leadingIcon: 'size-[16px]',
leadingAvatar: 'size-[16px]',
leadingAvatarSize: '2xs',
trailingIcon: 'size-[16px]'
},
md: {
base: 'h-[34px] gap-1.5 text-(length:--ui-font-size-lg)/[normal]',
leading: 'px-2',
trailing: 'px-2',
leadingIcon: 'size-[18px]',
leadingAvatarSize: '2xs',
trailingIcon: 'size-[18px]'
},
lg: {
base: 'h-[38px] gap-2 text-(length:--ui-font-size-lg)/[normal]',
leading: 'px-2',
trailing: 'px-2',
leadingIcon: 'size-[22px]',
leadingAvatarSize: '2xs',
trailingIcon: 'size-[22px]'
},
xl: {
base: 'h-[46px] gap-2 text-(length:--ui-font-size-2xl)/[normal]',
leading: 'px-2',
trailing: 'px-2',
leadingIcon: 'size-[22px]',
leadingAvatarSize: '2xs',
trailingIcon: 'size-[22px]'
}
},
color: {
'air-primary': {
base: 'style-filled'
},
'air-primary-success': {
base: 'style-filled-success'
},
'air-primary-alert': {
base: 'style-filled-alert'
},
'air-primary-copilot': {
base: 'style-filled-copilot'
},
'air-primary-warning': {
base: 'style-filled-warning'
},
default: {
base: 'style-old-default'
},
danger: {
base: 'style-old-danger'
},
success: {
base: 'style-old-success'
},
warning: {
base: 'style-old-warning'
},
primary: {
base: 'style-old-primary'
},
secondary: {
base: 'style-old-secondary'
},
collab: {
base: 'style-old-collab'
},
ai: {
base: 'style-old-ai'
}
},
rounded: {
true: 'rounded-(--ui-border-radius-3xl)',
false: 'rounded-(--ui-border-radius-sm)'
},
noPadding: {
true: {
base: 'px-0'
}
},
noBorder: {
true: 'ring-0 focus-visible:ring-0 style-transparent-bg'
},
underline: {
true: 'rounded-none ring-0 focus-visible:ring-0 style-transparent-bg border-b-1 border-b-(--ui-color-design-outline-stroke)'
},
leading: {
true: ''
},
trailing: {
true: ''
},
loading: {
true: ''
},
highlight: {
true: 'ring ring-inset ring-(--b24ui-border-color)'
},
type: {
file: 'file:me-1.5 file:text-(--ui-color-design-plain-na-content-secondary) file:outline-none'
}
},
compoundVariants: [
{
highlight: false,
noBorder: false,
underline: false,
class: {
base: 'ring ring-inset ring-(--ui-color-design-outline-stroke) focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-(--b24ui-border-color) hover:not-disabled:not-data-disabled:ring-1 hover:not-disabled:not-data-disabled:ring-inset hover:not-disabled:not-data-disabled:ring-(--b24ui-border-color) data-[state=open]:ring-1 data-[state=open]:ring-inset data-[state=open]:ring-(--b24ui-border-color)'
}
},
{
highlight: true,
noBorder: false,
underline: false,
class: {
base: 'ring ring-inset ring-(--b24ui-border-color) focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-(--b24ui-border-color) hover:ring-1 hover:ring-inset hover:ring-(--b24ui-border-color) data-[state=open]:ring-1 data-[state=open]:ring-inset data-[state=open]:ring-(--b24ui-border-color)'
}
},
{
noBorder: false,
underline: true,
class: {
base: 'focus-visible:border-(--b24ui-border-color) hover:border-(--b24ui-border-color) data-[state=open]:border-(--b24ui-border-color)'
}
},
{
highlight: true,
noBorder: false,
underline: true,
class: {
base: 'ring-0 border-b-(--b24ui-border-color)'
}
},
{
highlight: true,
noBorder: true,
underline: false,
class: {
base: 'ring-0'
}
},
{
type: 'file',
size: 'xss',
class: 'py-[2px]'
},
{
type: 'file',
size: 'xs',
class: 'py-[4px]'
},
{
type: 'file',
size: 'sm',
class: 'py-[5px]'
},
{
type: 'file',
size: 'md',
class: 'py-[7px]'
},
{
type: 'file',
size: 'lg',
class: 'py-[9px]'
},
{
type: 'file',
size: 'xl',
class: 'py-[11px]'
},
{
leading: true,
noPadding: false,
size: 'xss',
class: 'ps-[20px]'
},
{
leading: true,
noPadding: false,
size: 'xs',
class: 'ps-[22px]'
},
{
leading: true,
noPadding: false,
size: 'sm',
class: 'ps-[28px]'
},
{
leading: true,
noPadding: false,
size: 'md',
class: 'ps-[32px]'
},
{
leading: true,
noPadding: false,
size: 'lg',
class: 'ps-[32px]'
},
{
leading: true,
noPadding: false,
size: 'xl',
class: 'ps-[32px]'
},
{
trailing: true,
noPadding: false,
size: 'xss',
class: 'pe-[20px]'
},
{
trailing: true,
noPadding: false,
size: 'xs',
class: 'pe-[22px]'
},
{
trailing: true,
noPadding: false,
size: 'sm',
class: 'pe-[28px]'
},
{
trailing: true,
noPadding: false,
size: 'md',
class: 'pe-[34px]'
},
{
trailing: true,
noPadding: false,
size: 'lg',
class: 'pe-[38px]'
},
{
trailing: true,
noPadding: false,
size: 'xl',
class: 'pe-[38px]'
},
{
loading: true,
leading: true,
class: {
leadingIcon: 'size-[21px]'
}
},
{
loading: true,
leading: false,
trailing: true,
class: {
trailingIcon: 'size-[21px]'
}
},
{
fieldGroup: [
'horizontal',
'vertical'
],
size: [
'xl',
'lg',
'md'
],
rounded: false,
class: 'rounded-(--ui-border-radius-md)'
},
{
fieldGroup: [
'horizontal',
'vertical'
],
size: 'sm',
rounded: false,
class: 'rounded-(--ui-border-radius-sm)'
},
{
fieldGroup: [
'horizontal',
'vertical'
],
size: 'xs',
rounded: false,
class: 'rounded-(--ui-border-radius-xs)'
},
{
fieldGroup: [
'horizontal',
'vertical'
],
size: 'xss',
rounded: false,
class: 'rounded-[5px]'
}
],
defaultVariants: {
color: 'air-primary',
size: 'md'
}
}
}
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import bitrix24UIPluginVite from '@bitrix24/b24ui-nuxt/vite'
export default defineConfig({
plugins: [
vue(),
bitrix24UIPluginVite({
b24ui: {
input: {
slots: {
root: 'isolate relative inline-flex items-center',
base: 'px-3 w-full py-0 border-0 focus:outline-none disabled:cursor-not-allowed disabled:pointer-events-none disabled:select-none disabled:opacity-30 disabled:resize-none appearance-none transition duration-300 ease-linear text-(--ui-color-base-1) style-blurred-bg-input placeholder:text-(--ui-color-design-plain-na-content-secondary) hover:text-(--ui-color-base-1) focus:text-(--ui-color-base-1) active:text-(--ui-color-base-1) font-[family-name:var(--ui-font-family-primary)] font-(--ui-font-weight-regular) align-middle text-ellipsis whitespace-nowrap',
leading: 'absolute inset-y-0 start-0 flex items-center',
leadingIcon: 'shrink-0 text-(--b24ui-icon-color)',
leadingAvatar: 'shrink-0',
leadingAvatarSize: '',
trailing: 'absolute inset-y-0 end-0 flex items-center',
trailingIcon: 'shrink-0 text-(--b24ui-icon-color)',
tag: 'pointer-events-none select-none absolute z-10 -top-[7px] right-[14px] flex flex-col justify-center items-center'
},
variants: {
fieldGroup: {
horizontal: {
root: 'group leading-none has-focus-visible:z-[1]',
base: 'focus-visible:outline-none ring ring-inset ring-1 focus-visible:ring-2 group-not-only:group-first:rounded-e-3xl group-not-only:group-last:rounded-s-none group-not-last:group-not-first:rounded-none group-not-only:group-first:rounded-e-none group-not-only:group-last:rounded-s-none group-not-last:group-not-first:rounded-none group-not-only:group-first:border-e-0 group-not-only:group-not-first:border-s-0'
},
vertical: {
root: 'group has-focus-visible:z-[1]',
base: 'focus-visible:outline-none ring ring-inset ring-1 focus-visible:ring-2 group-not-only:group-first:rounded-b-none group-not-only:group-last:rounded-t-none group-not-last:group-not-first:rounded-none'
}
},
noSplit: {
false: "group-not-only:not-first:after:content-[''] group-not-only:not-first:after:absolute group-not-only:not-first:after:top-[7px] group-not-only:not-first:after:bottom-[6px] group-not-only:not-first:after:left-0 group-not-only:not-first:after:w-px group-not-only:not-first:after:bg-current/30"
},
size: {
xss: {
base: 'h-[20px] gap-1 text-(length:--ui-font-size-4xs)/[normal]',
leading: 'px-1',
trailing: 'px-1',
leadingIcon: 'size-[12px]',
leadingAvatarSize: '3xs',
trailingIcon: 'size-[12px]'
},
xs: {
base: 'h-[24px] gap-1 text-(length:--ui-font-size-xs)/[normal]',
leading: 'px-1',
trailing: 'px-1',
leadingIcon: 'size-[14px]',
leadingAvatarSize: '3xs',
trailingIcon: 'size-[14px]'
},
sm: {
base: 'h-[28px] gap-1.5 text-(length:--ui-font-size-sm)/[normal]',
leading: 'px-1.5',
trailing: 'px-1.5',
leadingIcon: 'size-[16px]',
leadingAvatar: 'size-[16px]',
leadingAvatarSize: '2xs',
trailingIcon: 'size-[16px]'
},
md: {
base: 'h-[34px] gap-1.5 text-(length:--ui-font-size-lg)/[normal]',
leading: 'px-2',
trailing: 'px-2',
leadingIcon: 'size-[18px]',
leadingAvatarSize: '2xs',
trailingIcon: 'size-[18px]'
},
lg: {
base: 'h-[38px] gap-2 text-(length:--ui-font-size-lg)/[normal]',
leading: 'px-2',
trailing: 'px-2',
leadingIcon: 'size-[22px]',
leadingAvatarSize: '2xs',
trailingIcon: 'size-[22px]'
},
xl: {
base: 'h-[46px] gap-2 text-(length:--ui-font-size-2xl)/[normal]',
leading: 'px-2',
trailing: 'px-2',
leadingIcon: 'size-[22px]',
leadingAvatarSize: '2xs',
trailingIcon: 'size-[22px]'
}
},
color: {
'air-primary': {
base: 'style-filled'
},
'air-primary-success': {
base: 'style-filled-success'
},
'air-primary-alert': {
base: 'style-filled-alert'
},
'air-primary-copilot': {
base: 'style-filled-copilot'
},
'air-primary-warning': {
base: 'style-filled-warning'
},
default: {
base: 'style-old-default'
},
danger: {
base: 'style-old-danger'
},
success: {
base: 'style-old-success'
},
warning: {
base: 'style-old-warning'
},
primary: {
base: 'style-old-primary'
},
secondary: {
base: 'style-old-secondary'
},
collab: {
base: 'style-old-collab'
},
ai: {
base: 'style-old-ai'
}
},
rounded: {
true: 'rounded-(--ui-border-radius-3xl)',
false: 'rounded-(--ui-border-radius-sm)'
},
noPadding: {
true: {
base: 'px-0'
}
},
noBorder: {
true: 'ring-0 focus-visible:ring-0 style-transparent-bg'
},
underline: {
true: 'rounded-none ring-0 focus-visible:ring-0 style-transparent-bg border-b-1 border-b-(--ui-color-design-outline-stroke)'
},
leading: {
true: ''
},
trailing: {
true: ''
},
loading: {
true: ''
},
highlight: {
true: 'ring ring-inset ring-(--b24ui-border-color)'
},
type: {
file: 'file:me-1.5 file:text-(--ui-color-design-plain-na-content-secondary) file:outline-none'
}
},
compoundVariants: [
{
highlight: false,
noBorder: false,
underline: false,
class: {
base: 'ring ring-inset ring-(--ui-color-design-outline-stroke) focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-(--b24ui-border-color) hover:not-disabled:not-data-disabled:ring-1 hover:not-disabled:not-data-disabled:ring-inset hover:not-disabled:not-data-disabled:ring-(--b24ui-border-color) data-[state=open]:ring-1 data-[state=open]:ring-inset data-[state=open]:ring-(--b24ui-border-color)'
}
},
{
highlight: true,
noBorder: false,
underline: false,
class: {
base: 'ring ring-inset ring-(--b24ui-border-color) focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-(--b24ui-border-color) hover:ring-1 hover:ring-inset hover:ring-(--b24ui-border-color) data-[state=open]:ring-1 data-[state=open]:ring-inset data-[state=open]:ring-(--b24ui-border-color)'
}
},
{
noBorder: false,
underline: true,
class: {
base: 'focus-visible:border-(--b24ui-border-color) hover:border-(--b24ui-border-color) data-[state=open]:border-(--b24ui-border-color)'
}
},
{
highlight: true,
noBorder: false,
underline: true,
class: {
base: 'ring-0 border-b-(--b24ui-border-color)'
}
},
{
highlight: true,
noBorder: true,
underline: false,
class: {
base: 'ring-0'
}
},
{
type: 'file',
size: 'xss',
class: 'py-[2px]'
},
{
type: 'file',
size: 'xs',
class: 'py-[4px]'
},
{
type: 'file',
size: 'sm',
class: 'py-[5px]'
},
{
type: 'file',
size: 'md',
class: 'py-[7px]'
},
{
type: 'file',
size: 'lg',
class: 'py-[9px]'
},
{
type: 'file',
size: 'xl',
class: 'py-[11px]'
},
{
leading: true,
noPadding: false,
size: 'xss',
class: 'ps-[20px]'
},
{
leading: true,
noPadding: false,
size: 'xs',
class: 'ps-[22px]'
},
{
leading: true,
noPadding: false,
size: 'sm',
class: 'ps-[28px]'
},
{
leading: true,
noPadding: false,
size: 'md',
class: 'ps-[32px]'
},
{
leading: true,
noPadding: false,
size: 'lg',
class: 'ps-[32px]'
},
{
leading: true,
noPadding: false,
size: 'xl',
class: 'ps-[32px]'
},
{
trailing: true,
noPadding: false,
size: 'xss',
class: 'pe-[20px]'
},
{
trailing: true,
noPadding: false,
size: 'xs',
class: 'pe-[22px]'
},
{
trailing: true,
noPadding: false,
size: 'sm',
class: 'pe-[28px]'
},
{
trailing: true,
noPadding: false,
size: 'md',
class: 'pe-[34px]'
},
{
trailing: true,
noPadding: false,
size: 'lg',
class: 'pe-[38px]'
},
{
trailing: true,
noPadding: false,
size: 'xl',
class: 'pe-[38px]'
},
{
loading: true,
leading: true,
class: {
leadingIcon: 'size-[21px]'
}
},
{
loading: true,
leading: false,
trailing: true,
class: {
trailingIcon: 'size-[21px]'
}
},
{
fieldGroup: [
'horizontal',
'vertical'
],
size: [
'xl',
'lg',
'md'
],
rounded: false,
class: 'rounded-(--ui-border-radius-md)'
},
{
fieldGroup: [
'horizontal',
'vertical'
],
size: 'sm',
rounded: false,
class: 'rounded-(--ui-border-radius-sm)'
},
{
fieldGroup: [
'horizontal',
'vertical'
],
size: 'xs',
rounded: false,
class: 'rounded-(--ui-border-radius-xs)'
},
{
fieldGroup: [
'horizontal',
'vertical'
],
size: 'xss',
rounded: false,
class: 'rounded-[5px]'
}
],
defaultVariants: {
color: 'air-primary',
size: 'md'
}
}
}
})
]
})