Text Field

Captures user input with an optional slot for buttons and icons.

use radix_yew_icons::MagnifyingGlassIcon;
use radix_yew_themes::{TextField, TextFieldSlot};
use yew::prelude::*;

#[function_component]
pub fn TextFieldExample() -> Html {
    html! {
        <TextField placeholder="Search the docs…">
            <TextFieldSlot>
                <MagnifyingGlassIcon height="16" width="16" />
            </TextFieldSlot>
        </TextField>
    }
}

API Reference

Root

Groups Slot and Input parts. This component is based on the input element and supports common margin props.

PropTypeDefault
sizeResponsive<1..3>2
variantTextFieldVariantTextFieldVariant::Surface
colorOption<AccentColor>-
radiusOption<Radius>-

Slot

Contains icons or buttons associated with an Input.

PropTypeDefault
sideOption<TextFieldSlotSide>-
colorOption<AccentColor>-
gapOption<Responsive<0..9>>-
pxOption<Responsive<0..9>>-
plOption<Responsive<0..9>>-
prOption<Responsive<0..9>>-

Examples

Size

Use the size prop to control the size.

use radix_yew_themes::{Box, Flex, FlexDirection, TextField};
use yew::prelude::*;

#[function_component]
pub fn TextFieldSizeExample() -> Html {
    html! {
        <Flex direction={FlexDirection::Column} gap=3>
            <Box max_width="200px">
                <TextField size=1 placeholder="Search the docs…" />
            </Box>
            <Box max_width="250px">
                <TextField size=2 placeholder="Search the docs…" />
            </Box>
            <Box max_width="300px">
                <TextField size=3 placeholder="Search the docs…" />
            </Box>
        </Flex>
    }
}

Use matching component sizes when composing Text Field with buttons. However, don't use size 1 inputs with buttons - at this size, there is not enough vertical space to nest other interactive elements.

use radix_yew_icons::{DotsHorizontalIcon, MagnifyingGlassIcon};
use radix_yew_themes::{
    Box, Flex, FlexDirection, IconButton, IconButtonVariant, TextField, TextFieldSlot,
};
use yew::prelude::*;

#[function_component]
pub fn TextFieldSizeButtonsExample() -> Html {
    html! {
        <Flex direction={FlexDirection::Column} gap=3 max_width="400px">
            <Box max_width="200px">
                <TextField placeholder="Search the docs…" size=1>
                    <TextFieldSlot>
                        <MagnifyingGlassIcon height="16" width="16" />
                    </TextFieldSlot>
                </TextField>
            </Box>

            <Box max_width="250px">
                <TextField placeholder="Search the docs…" size=2>
                    <TextFieldSlot>
                        <MagnifyingGlassIcon height="16" width="16" />
                    </TextFieldSlot>
                    <TextFieldSlot>
                        <IconButton size=1 variant={IconButtonVariant::Ghost}>
                            <DotsHorizontalIcon height="14" width="14" />
                        </IconButton>
                    </TextFieldSlot>
                </TextField>
            </Box>

            <Box max_width="300px">
                <TextField placeholder="Search the docs…" size=3>
                    <TextFieldSlot>
                        <MagnifyingGlassIcon height="16" width="16" />
                    </TextFieldSlot>
                    <TextFieldSlot pr=3>
                        <IconButton size=2 variant={IconButtonVariant::Ghost}>
                            <DotsHorizontalIcon height="16" width="16" />
                        </IconButton>
                    </TextFieldSlot>
                </TextField>
            </Box>
        </Flex>
    }
}

Variant

Use the variant prop to control the visual style.

use radix_yew_themes::{Flex, FlexDirection, TextField, TextFieldVariant};
use yew::prelude::*;

#[function_component]
pub fn TextFieldVariantExample() -> Html {
    html! {
        <Flex direction={FlexDirection::Column} gap=3 max_width="250px">
            <TextField variant={TextFieldVariant::Surface} placeholder="Search the docs…" />
            <TextField variant={TextFieldVariant::Classic} placeholder="Search the docs…" />
            <TextField variant={TextFieldVariant::Soft} placeholder="Search the docs…" />
        </Flex>
    }
}

Color

Use the color prop to assign a specific color.

use radix_yew_themes::{AccentColor, Flex, FlexDirection, TextField, TextFieldVariant};
use yew::prelude::*;

#[function_component]
pub fn TextFieldColorExample() -> Html {
    html! {
        <Flex direction={FlexDirection::Column} gap=3 max_width="250px">
            <TextField color={AccentColor::Indigo} variant={TextFieldVariant::Soft} placeholder="Search the docs…" />
            <TextField color={AccentColor::Green} variant={TextFieldVariant::Soft} placeholder="Search the docs…" />
            <TextField color={AccentColor::Red} variant={TextFieldVariant::Soft} placeholder="Search the docs…" />
        </Flex>
    }
}

Radius

Use the radius prop to assign a specific radius value.

use radix_yew_themes::{Flex, FlexDirection, Radius, TextField};
use yew::prelude::*;

#[function_component]
pub fn TextFieldRadiusExample() -> Html {
    html! {
        <Flex direction={FlexDirection::Column} gap=3 max_width="250px">
            <TextField radius={Radius::None} placeholder="Search the docs…" />
            <TextField radius={Radius::Large} placeholder="Search the docs…" />
            <TextField radius={Radius::Full} placeholder="Search the docs…" />
        </Flex>
    }
}

See Also