Skip to main content

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}