def test_stat_detailed_fasthtml_examples():
"""Test detailed stat examples with different icons from daisyUI v5 documentation."""
from fasthtml.common import Div
from fasthtml.svg import Svg, Path
from cjm_fasthtml_tailwind.utilities.sizing import w, h
from cjm_fasthtml_tailwind.utilities.layout import display_tw
from cjm_fasthtml_tailwind.utilities.svg import stroke
from cjm_fasthtml_tailwind.utilities.effects import shadow
from cjm_fasthtml_tailwind.core.base import combine_classes
from cjm_fasthtml_daisyui.utilities.semantic_colors import text_dui
# Define reusable SVG icons
info_icon = Svg(
Path(
d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z",
stroke_linecap="round",
stroke_linejoin="round",
stroke_width="2"
),
xmlns="http://www.w3.org/2000/svg",
fill="none",
viewBox="0 0 24 24",
cls=combine_classes(display_tw.inline_block, h(8), w(8), stroke.current)
)
settings_icon = Svg(
Path(
d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4",
stroke_linecap="round",
stroke_linejoin="round",
stroke_width="2"
),
xmlns="http://www.w3.org/2000/svg",
fill="none",
viewBox="0 0 24 24",
cls=combine_classes(display_tw.inline_block, h(8), w(8), stroke.current)
)
archive_icon = Svg(
Path(
d="M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4",
stroke_linecap="round",
stroke_linejoin="round",
stroke_width="2"
),
xmlns="http://www.w3.org/2000/svg",
fill="none",
viewBox="0 0 24 24",
cls=combine_classes(display_tw.inline_block, h(8), w(8), stroke.current)
)
# Stats container with detailed information
detailed_stats = Div(
# Downloads stat
Div(
Div(
info_icon,
cls=combine_classes(stat_figure, text_dui.secondary)
),
Div("Downloads", cls=str(stat_title)),
Div("31K", cls=str(stat_value)),
Div("Jan 1st - Feb 1st", cls=str(stat_desc)),
cls=str(stat)
),
# New Users stat
Div(
Div(
settings_icon,
cls=combine_classes(stat_figure, text_dui.secondary)
),
Div("New Users", cls=str(stat_title)),
Div("4,200", cls=str(stat_value)),
Div("↗︎ 400 (22%)", cls=str(stat_desc)),
cls=str(stat)
),
# New Registers stat
Div(
Div(
archive_icon,
cls=combine_classes(stat_figure, text_dui.secondary)
),
Div("New Registers", cls=str(stat_title)),
Div("1,200", cls=str(stat_value)),
Div("↘︎ 90 (14%)", cls=str(stat_desc)),
cls=str(stat)
),
cls=combine_classes(stats, shadow())
)
# Verify structure
assert detailed_stats.tag == "div"
assert "stats" in detailed_stats.attrs['class']
assert "shadow" in detailed_stats.attrs['class']
assert len(detailed_stats.children) == 3
# Check each stat has the correct structure
for i, (expected_title, expected_value, expected_desc) in enumerate([
("Downloads", "31K", "Jan 1st - Feb 1st"),
("New Users", "4,200", "↗︎ 400 (22%)"),
("New Registers", "1,200", "↘︎ 90 (14%)")
]):
stat_elem = detailed_stats.children[i]
assert "stat" in stat_elem.attrs['class']
assert len(stat_elem.children) == 4
# Check figure
figure = stat_elem.children[0]
assert "stat-figure" in figure.attrs['class']
assert "text-secondary" in figure.attrs['class']
assert figure.children[0].tag == "svg"
# Check title
title = stat_elem.children[1]
assert "stat-title" in title.attrs['class']
assert title.children[0] == expected_title
# Check value
value = stat_elem.children[2]
assert "stat-value" in value.attrs['class']
assert value.children[0] == expected_value
# Check desc
desc = stat_elem.children[3]
assert "stat-desc" in desc.attrs['class']
assert desc.children[0] == expected_desc
# Return the created element
return Div(detailed_stats)
# Run the test
test_stat_detailed_fasthtml_examples()