Default view stays the all-feeds joined article list, now with a sidebar listing every subscribed feed so a reader can pin down to one feed's articles. Filtering happens server-side (list_ranked_articles now takes an optional feed_id). Pulled in the sidebar/badge/scroll_area (plus their sheet/skeleton/ tooltip/separator dependencies) components via `dx components add` instead of hand-rolling nav/tag/scroll markup, matching this project's existing pattern of using the Dioxus component library over raw elements (see button/input). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PqTJmazHBQK878vjQ4JnnF
80 lines
1.9 KiB
Rust
80 lines
1.9 KiB
Rust
use dioxus::prelude::*;
|
|
use dioxus_icons::lucide::BadgeCheck;
|
|
|
|
#[css_module("/src/components/badge/style.css")]
|
|
struct Styles;
|
|
|
|
// Variants beyond the ones this app currently uses are part of the
|
|
// component library's public API, not unused code — CI runs clippy with
|
|
// `-D warnings`, which would otherwise turn this dead_code lint into a
|
|
// build failure.
|
|
#[allow(dead_code)]
|
|
#[derive(Copy, Clone, PartialEq, Default)]
|
|
#[non_exhaustive]
|
|
pub enum BadgeVariant {
|
|
#[default]
|
|
Primary,
|
|
Secondary,
|
|
Destructive,
|
|
Outline,
|
|
}
|
|
|
|
impl BadgeVariant {
|
|
#[allow(dead_code)]
|
|
pub fn class(&self) -> &'static str {
|
|
match self {
|
|
BadgeVariant::Primary => "primary",
|
|
BadgeVariant::Secondary => "secondary",
|
|
BadgeVariant::Destructive => "destructive",
|
|
BadgeVariant::Outline => "outline",
|
|
}
|
|
}
|
|
}
|
|
|
|
/// The props for the [`Badge`] component.
|
|
#[derive(Props, Clone, PartialEq)]
|
|
pub struct BadgeProps {
|
|
#[props(default)]
|
|
pub variant: BadgeVariant,
|
|
|
|
/// Additional attributes to extend the badge element
|
|
#[props(extends = GlobalAttributes)]
|
|
pub attributes: Vec<Attribute>,
|
|
|
|
/// The children of the badge element
|
|
pub children: Element,
|
|
}
|
|
|
|
#[component]
|
|
pub fn Badge(props: BadgeProps) -> Element {
|
|
rsx! {
|
|
BadgeElement {
|
|
"padding": true,
|
|
variant: props.variant,
|
|
attributes: props.attributes,
|
|
{props.children}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[component]
|
|
fn BadgeElement(props: BadgeProps) -> Element {
|
|
rsx! {
|
|
span {
|
|
class: Styles::dx_badge,
|
|
"data-style": props.variant.class(),
|
|
..props.attributes,
|
|
{props.children}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[component]
|
|
pub fn VerifiedIcon() -> Element {
|
|
rsx! {
|
|
BadgeCheck {
|
|
size: "12px",
|
|
stroke: "var(--secondary-color-4)",
|
|
}
|
|
}
|
|
}
|