def test_timeline_vertical_fasthtml_examples():
"""Test vertical timeline variations from daisyUI v5 documentation."""
from fasthtml.common import Ul, Li, Div, Hr
from fasthtml.svg import Svg, Path
from cjm_fasthtml_tailwind.utilities.sizing import h, w
from cjm_fasthtml_tailwind.core.base import combine_classes
from cjm_fasthtml_daisyui.utilities.semantic_colors import text_dui, bg_dui
# Create checkmark SVG icon as reusable component
checkmark_icon = Svg(
Path(
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",
fill_rule="evenodd",
clip_rule="evenodd"
),
xmlns="http://www.w3.org/2000/svg",
viewBox="0 0 20 20",
fill="currentColor",
cls=combine_classes(h._5, w._5)
)
# Vertical timeline with text on both sides and icon
vertical_timeline_both = Ul(
Li(
Div("1984", cls=str(timeline_start)),
Div(checkmark_icon, cls=str(timeline_middle)),
Div("First Macintosh computer", cls=combine_classes(timeline_end, timeline_modifiers.box)),
Hr()
),
Li(
Hr(),
Div("1998", cls=str(timeline_start)),
Div(checkmark_icon, cls=str(timeline_middle)),
Div("iMac", cls=combine_classes(timeline_end, timeline_modifiers.box)),
Hr()
),
Li(
Hr(),
Div("2001", cls=str(timeline_start)),
Div(checkmark_icon, cls=str(timeline_middle)),
Div("iPod", cls=combine_classes(timeline_end, timeline_modifiers.box)),
Hr()
),
Li(
Hr(),
Div("2007", cls=str(timeline_start)),
Div(checkmark_icon, cls=str(timeline_middle)),
Div("iPhone", cls=combine_classes(timeline_end, timeline_modifiers.box)),
Hr()
),
Li(
Hr(),
Div("2015", cls=str(timeline_start)),
Div(checkmark_icon, cls=str(timeline_middle)),
Div("Apple Watch", cls=combine_classes(timeline_end, timeline_modifiers.box))
),
cls=combine_classes(timeline, timeline_direction.vertical)
)
# Verify vertical timeline with both sides
assert vertical_timeline_both.tag == "ul"
assert "timeline" in vertical_timeline_both.attrs['class']
assert "timeline-vertical" in vertical_timeline_both.attrs['class']
assert len(vertical_timeline_both.children) == 5
# Vertical timeline with right side only
vertical_timeline_right = Ul(
Li(
Div(checkmark_icon, cls=str(timeline_middle)),
Div("First Macintosh computer", cls=combine_classes(timeline_end, timeline_modifiers.box)),
Hr()
),
Li(
Hr(),
Div(checkmark_icon, cls=str(timeline_middle)),
Div("iMac", cls=combine_classes(timeline_end, timeline_modifiers.box)),
Hr()
),
Li(
Hr(),
Div(checkmark_icon, cls=str(timeline_middle)),
Div("iPod", cls=combine_classes(timeline_end, timeline_modifiers.box)),
Hr()
),
Li(
Hr(),
Div(checkmark_icon, cls=str(timeline_middle)),
Div("iPhone", cls=combine_classes(timeline_end, timeline_modifiers.box)),
Hr()
),
Li(
Hr(),
Div(checkmark_icon, cls=str(timeline_middle)),
Div("Apple Watch", cls=combine_classes(timeline_end, timeline_modifiers.box))
),
cls=combine_classes(timeline, timeline_direction.vertical)
)
# Verify vertical timeline with right side only
assert "timeline" in vertical_timeline_right.attrs['class']
assert "timeline-vertical" in vertical_timeline_right.attrs['class']
first_item = vertical_timeline_right.children[0]
assert len(first_item.children) == 3 # middle, end, hr (no start)
# Vertical timeline with left side only
vertical_timeline_left = Ul(
Li(
Div("First Macintosh computer", cls=combine_classes(timeline_start, timeline_modifiers.box)),
Div(checkmark_icon, cls=str(timeline_middle)),
Hr()
),
Li(
Hr(),
Div("iMac", cls=combine_classes(timeline_start, timeline_modifiers.box)),
Div(checkmark_icon, cls=str(timeline_middle)),
Hr()
),
Li(
Hr(),
Div("iPod", cls=combine_classes(timeline_start, timeline_modifiers.box)),
Div(checkmark_icon, cls=str(timeline_middle)),
Hr()
),
Li(
Hr(),
Div("iPhone", cls=combine_classes(timeline_start, timeline_modifiers.box)),
Div(checkmark_icon, cls=str(timeline_middle)),
Hr()
),
Li(
Hr(),
Div("Apple Watch", cls=combine_classes(timeline_start, timeline_modifiers.box)),
Div(checkmark_icon, cls=str(timeline_middle))
),
cls=combine_classes(timeline, timeline_direction.vertical)
)
# Verify vertical timeline with left side only
assert "timeline" in vertical_timeline_left.attrs['class']
assert "timeline-vertical" in vertical_timeline_left.attrs['class']
first_item = vertical_timeline_left.children[0]
assert len(first_item.children) == 3 # start, middle, hr (no end)
assert "timeline-start" in first_item.children[0].attrs['class']
# Return all elements in a Div
return Div(vertical_timeline_both, vertical_timeline_right, vertical_timeline_left)
# Run the test
test_timeline_vertical_fasthtml_examples()