yew_nav_link/components/page_link.rs
1//! # `PageLink`
2//!
3//! Link or span element within a pagination page item.
4//! Renders an `<a>` when `href` is set, otherwise a `<span>`.
5//!
6//! # Example
7//!
8//! ```rust
9//! use yew::prelude::*;
10//! use yew_nav_link::components::{PageItem, PageLink};
11//!
12//! #[component]
13//! fn PaginationNav() -> Html {
14//! html! {
15//! <nav><ul class="pagination">
16//! <PageItem page={1} active=true>
17//! <PageLink href={Some("/page/1")}>{ "1" }</PageLink>
18//! </PageItem>
19//! <PageItem page={0} disabled=true>
20//! <PageLink href={None}>{ "..." }</PageLink>
21//! </PageItem>
22//! </ul></nav>
23//! }
24//! }
25//! ```
26//!
27//! # CSS Classes
28//!
29//! | Class | Condition |
30//! |-------|-----------|
31//! | `page-link` | Always applied |
32//!
33//! # Props
34//!
35//! | Prop | Type | Default | Description |
36//! |------|------|---------|-------------|
37//! | `href` | `Option<&'static str>` | `None` | Link URL |
38//! | `classes` | `Classes` | — | Additional CSS classes |
39//! | `children` | `Children` | — | Content |
40
41use yew::prelude::*;
42
43/// Properties for the [`PageLink`] component.
44///
45/// | Prop | Type | Default | Description |
46/// |------|------|---------|-------------|
47/// | `href` | `Option<&'static str>` | `None` | Link URL |
48/// | `classes` | `Classes` | — | Additional CSS classes |
49/// | `children` | `Children` | — | Content |
50#[derive(Properties, Clone, PartialEq, Debug)]
51pub struct PageLinkProps {
52 /// Additional CSS classes applied to the page link.
53 #[prop_or_default]
54 pub classes: Classes,
55
56 /// Optional URL. When set, renders an `<a>` element; otherwise a `<span>`.
57 #[prop_or_default]
58 pub href: Option<&'static str>,
59
60 /// Content rendered inside the page link.
61 #[prop_or_default]
62 pub children: Children
63}
64
65/// Link or span element within a pagination page item.
66///
67/// Renders an `<a>` when `href` is set, otherwise a `<span>`.
68///
69/// # CSS Classes
70///
71/// - `page-link` - Always applied
72#[function_component]
73pub fn PageLink(props: &PageLinkProps) -> Html {
74 let mut classes = props.classes.clone();
75 classes.push("page-link");
76
77 if let Some(href) = props.href {
78 html! {
79 <a {href} {classes}>
80 { for props.children.iter() }
81 </a>
82 }
83 } else {
84 html! {
85 <span {classes}>
86 { for props.children.iter() }
87 </span>
88 }
89 }
90}
91
92#[cfg(test)]
93mod tests {
94 use super::*;
95
96 #[test]
97 fn page_link_with_href() {
98 let props = PageLinkProps {
99 classes: Classes::default(),
100 href: Some("/page/2"),
101 children: Children::new(vec![])
102 };
103
104 assert_eq!(props.href, Some("/page/2"));
105 }
106
107 #[test]
108 fn page_link_without_href() {
109 let props = PageLinkProps {
110 classes: Classes::default(),
111 href: None,
112 children: Children::new(vec![])
113 };
114
115 assert!(props.href.is_none());
116 }
117}