Component
item
dx components add itemA component for displaying content.
Basic Item
A simple item with title and description.
Your profile has been verified.
Installation
Use the CLI command for the common path, or copy the component files manually.
Manual installation files
Copy the component source and CSS into your app. Import the shared theme CSS once near your app root.
use crate::components::separator::Separator;
use dioxus::prelude::*;
use dioxus_primitives::dioxus_attributes::attributes;
use dioxus_primitives::merge_attributes;
#[derive(Copy, Clone, PartialEq, Default)]
#[non_exhaustive]
pub enum ItemVariant {
#[default]
Default,
Outline,
Muted,
}
impl ItemVariant {
pub fn class(&self) -> &'static str {
match self {
ItemVariant::Default => "default",
ItemVariant::Outline => "outline",
ItemVariant::Muted => "muted",
}
}
}
#[derive(Copy, Clone, PartialEq, Default)]
#[non_exhaustive]
pub enum ItemSize {
#[default]
Default,
Sm,
}
impl ItemSize {
pub fn class(&self) -> &'static str {
match self {
ItemSize::Default => "default",
ItemSize::Sm => "sm",
}
}
}
#[derive(Copy, Clone, PartialEq, Default)]
#[non_exhaustive]
pub enum ItemMediaVariant {
#[default]
Default,
Icon,
Image,
}
impl ItemMediaVariant {
pub fn class(&self) -> &'static str {
match self {
ItemMediaVariant::Default => "default",
ItemMediaVariant::Icon => "icon",
ItemMediaVariant::Image => "image",
}
}
}
#[component]
pub fn ItemGroup(
#[props(extends=GlobalAttributes)]
#[props(extends=div)]
attributes: Vec<Attribute>,
children: Element,
) -> Element {
let base = attributes!(div {
class: "dx-item-group",
role: "list",
"data-slot": "item-group",
});
let merged = merge_attributes(vec![base, attributes]);
rsx! {
document::Link { rel: "stylesheet", href: asset!("/src/components/item/style.css") }
div { ..merged,{children} }
}
}
#[component]
pub fn ItemSeparator(
#[props(extends=GlobalAttributes)]
#[props(extends=div)]
attributes: Vec<Attribute>,
) -> Element {
let base = attributes!(div {
class: "dx-item-separator",
"data-slot": "item-separator",
});
let merged = merge_attributes(vec![base, attributes]);
rsx! {
document::Link { rel: "stylesheet", href: asset!("/src/components/item/style.css") }
Separator { horizontal: true, decorative: true, attributes: merged }
}
}
#[component]
pub fn Item(
#[props(default)] variant: ItemVariant,
#[props(default)] size: ItemSize,
#[props(extends=GlobalAttributes)]
#[props(extends=div)]
attributes: Vec<Attribute>,
onclick: Option<EventHandler<MouseEvent>>,
onkeydown: Option<EventHandler<KeyboardEvent>>,
r#as: Option<Callback<Vec<Attribute>, Element>>,
children: Element,
) -> Element {
let base = attributes!(div {
class: "dx-item",
"data-slot": "item",
"data-variant": variant.class(),
"data-size": size.class(),
});
let merged = merge_attributes(vec![base, attributes]);
rsx! {
document::Link { rel: "stylesheet", href: asset!("/src/components/item/style.css") }
if let Some(dynamic) = r#as {
{dynamic.call(merged)}
} else {
div {
onclick: move |event| {
if let Some(f) = &onclick {
f.call(event);
}
},
onkeydown: move |event| {
if let Some(f) = &onkeydown {
f.call(event);
}
},
..merged,
{children}
}
}
}
}
#[component]
pub fn ItemMedia(
#[props(default)] variant: ItemMediaVariant,
#[props(extends=GlobalAttributes)]
#[props(extends=div)]
attributes: Vec<Attribute>,
children: Element,
) -> Element {
let base = attributes!(div {
class: "dx-item-media",
"data-slot": "item-media",
"data-variant": variant.class(),
});
let merged = merge_attributes(vec![base, attributes]);
rsx! {
document::Link { rel: "stylesheet", href: asset!("/src/components/item/style.css") }
div { ..merged,{children} }
}
}
#[component]
pub fn ItemContent(
#[props(extends=GlobalAttributes)]
#[props(extends=div)]
attributes: Vec<Attribute>,
children: Element,
) -> Element {
let base = attributes!(div {
class: "dx-item-content",
"data-slot": "item-content",
});
let merged = merge_attributes(vec![base, attributes]);
rsx! {
document::Link { rel: "stylesheet", href: asset!("/src/components/item/style.css") }
div { ..merged,{children} }
}
}
#[component]
pub fn ItemTitle(
#[props(extends=GlobalAttributes)]
#[props(extends=div)]
attributes: Vec<Attribute>,
children: Element,
) -> Element {
let base = attributes!(div {
class: "dx-item-title",
"data-slot": "item-title",
});
let merged = merge_attributes(vec![base, attributes]);
rsx! {
document::Link { rel: "stylesheet", href: asset!("/src/components/item/style.css") }
div { ..merged,{children} }
}
}
#[component]
pub fn ItemDescription(
#[props(extends=GlobalAttributes)]
#[props(extends=p)]
attributes: Vec<Attribute>,
children: Element,
) -> Element {
let base = attributes!(p {
class: "dx-item-description",
"data-slot": "item-description",
});
let merged = merge_attributes(vec![base, attributes]);
rsx! {
document::Link { rel: "stylesheet", href: asset!("/src/components/item/style.css") }
p { ..merged,{children} }
}
}
#[component]
pub fn ItemActions(
#[props(extends=GlobalAttributes)]
#[props(extends=div)]
attributes: Vec<Attribute>,
children: Element,
) -> Element {
let base = attributes!(div {
class: "dx-item-actions",
"data-slot": "item-actions",
});
let merged = merge_attributes(vec![base, attributes]);
rsx! {
document::Link { rel: "stylesheet", href: asset!("/src/components/item/style.css") }
div { ..merged,{children} }
}
}
#[component]
pub fn ItemHeader(
#[props(extends=GlobalAttributes)]
#[props(extends=div)]
attributes: Vec<Attribute>,
children: Element,
) -> Element {
let base = attributes!(div {
class: "dx-item-header",
"data-slot": "item-header",
});
let merged = merge_attributes(vec![base, attributes]);
rsx! {
document::Link { rel: "stylesheet", href: asset!("/src/components/item/style.css") }
div { ..merged,{children} }
}
}
#[component]
pub fn ItemFooter(
#[props(extends=GlobalAttributes)]
#[props(extends=div)]
attributes: Vec<Attribute>,
children: Element,
) -> Element {
let base = attributes!(div {
class: "dx-item-footer",
"data-slot": "item-footer",
});
let merged = merge_attributes(vec![base, attributes]);
rsx! {
document::Link { rel: "stylesheet", href: asset!("/src/components/item/style.css") }
div { ..merged,{children} }
}
}Usage notes
A versatile component for displaying content with media, title, description, and actions.
Component Structure
ItemGroup {
Item {
// Available variants: Default, Outline, Muted
variant: ItemVariant::Outline,
// Available sizes: Default, Sm
size: ItemSize::Default,
ItemHeader {
"Optional header"
}
ItemMedia {
// Media variants: Default, Icon, Image
variant: ItemMediaVariant::Image,
img { src: "/path/to/image.png", alt: "Description" }
}
ItemContent {
ItemTitle { "Item title" }
ItemDescription { "Detailed description that can span multiple lines." }
}
ItemActions {
button { "Primary action" }
}
ItemFooter {
"Optional footer"
}
}
ItemSeparator {}
Item {
// ... next item in the group
}
}Variants
Alternative examples for common configurations.
variant
Default Variant
Standard styling with subtle background and borders.
Outline Variant
Outlined style with clear borders and transparent background.
Muted Variant
Subdued appearance with muted colors for secondary content.
size
Basic Item
A simple item with title and description.
Your profile has been verified.
image
group
jkelleyrtp
jkelleyrtp@dioxuslabs.com
ealmloff
ealmloff@dioxuslabs.com
DioxusLabs
team@dioxuslabs.com