def test_drawer_navbar_mobile_fasthtml_examples():
"""Test navbar menu for desktop + sidebar drawer for mobile from daisyUI v5 documentation."""
from fasthtml.common import Div, Input, Label, Ul, Li, A
from fasthtml.svg import Svg, Path
from cjm_fasthtml_daisyui.components.actions.button import btn, btn_modifiers, btn_styles
from cjm_fasthtml_daisyui.components.navigation.menu import menu, menu_directions
from cjm_fasthtml_daisyui.components.navigation.navbar import navbar
from cjm_fasthtml_daisyui.utilities.semantic_colors import bg_dui, text_dui
from cjm_fasthtml_tailwind.utilities.sizing import w, h, min_h
from cjm_fasthtml_tailwind.utilities.spacing import p, m
from cjm_fasthtml_tailwind.utilities.flexbox_and_grid import flex, flex_direction, flex_display
from cjm_fasthtml_tailwind.utilities.layout import display_tw
from cjm_fasthtml_tailwind.utilities.svg import stroke
# Hamburger menu icon
hamburger_icon = Svg(
Path(
stroke_linecap="round",
stroke_linejoin="round",
stroke_width="2",
d="M4 6h16M4 12h16M4 18h16"
),
xmlns="http://www.w3.org/2000/svg",
fill="none",
viewBox="0 0 24 24",
cls=combine_classes(display_tw.inline_block, h._6, w._6, stroke.current)
)
# Navbar with drawer for mobile
navbar_drawer = Div(
Input(id="my-drawer-3", type="checkbox", cls=str(drawer_toggle)),
Div(
# Navbar
Div(
Div(
Label(
hamburger_icon,
_for="my-drawer-3",
aria_label="open sidebar",
cls=combine_classes(btn, btn_modifiers.square, btn_styles.ghost)
),
cls=combine_classes(flex.none, display_tw.hidden.lg)
),
Div("Navbar Title", cls=combine_classes(m.x._2, flex(1), p.x._2)),
Div(
Ul(
# Navbar menu content here
Li(A("Navbar Item 1", href="#")),
Li(A("Navbar Item 2", href="#")),
cls=combine_classes(menu, menu_directions.horizontal)
),
cls=combine_classes(display_tw.hidden, flex.none, display_tw.block.lg)
),
cls=combine_classes(navbar, bg_dui.base_300, w.full)
),
# Page content here
"Content",
cls=combine_classes(drawer_content, flex_display, flex.col)
),
Div(
Label(_for="my-drawer-3", aria_label="close sidebar", cls=str(drawer_overlay)),
Ul(
# Sidebar content here
Li(A("Sidebar Item 1", href="#")),
Li(A("Sidebar Item 2", href="#")),
cls=combine_classes(menu, bg_dui.base_200, min_h.full, w._80, p._4)
),
cls=str(drawer_side)
),
cls=str(drawer)
)
# Verify structure
assert navbar_drawer.tag == "div"
assert navbar_drawer.attrs['class'] == "drawer"
# Verify input checkbox
input_element = navbar_drawer.children[0]
assert input_element.tag == "input"
assert input_element.attrs['id'] == "my-drawer-3"
assert input_element.attrs['type'] == "checkbox"
assert input_element.attrs['class'] == "drawer-toggle"
# Verify drawer content
content_div = navbar_drawer.children[1]
assert content_div.tag == "div"
assert "drawer-content" in content_div.attrs['class']
assert "flex" in content_div.attrs['class']
assert "flex-col" in content_div.attrs['class']
# Verify navbar
navbar_div = content_div.children[0]
assert navbar_div.tag == "div"
assert "navbar" in navbar_div.attrs['class']
assert "bg-base-300" in navbar_div.attrs['class']
assert "w-full" in navbar_div.attrs['class']
# Verify mobile menu button
mobile_button_div = navbar_div.children[0]
assert "flex-none" in mobile_button_div.attrs['class']
assert "lg:hidden" in mobile_button_div.attrs['class']
mobile_label = mobile_button_div.children[0]
assert mobile_label.tag == "label"
assert mobile_label.attrs['for'] == "my-drawer-3"
assert mobile_label.attrs['aria-label'] == "open sidebar"
assert "btn" in mobile_label.attrs['class']
assert "btn-square" in mobile_label.attrs['class']
assert "btn-ghost" in mobile_label.attrs['class']
assert mobile_label.children[0].tag == "svg"
# Verify navbar title
title_div = navbar_div.children[1]
assert "mx-2" in title_div.attrs['class']
assert "flex-1" in title_div.attrs['class']
assert "px-2" in title_div.attrs['class']
assert title_div.children[0] == "Navbar Title"
# Verify desktop menu
desktop_menu_div = navbar_div.children[2]
assert "hidden" in desktop_menu_div.attrs['class']
assert "flex-none" in desktop_menu_div.attrs['class']
assert "lg:block" in desktop_menu_div.attrs['class']
desktop_menu = desktop_menu_div.children[0]
assert desktop_menu.tag == "ul"
assert "menu" in desktop_menu.attrs['class']
assert "menu-horizontal" in desktop_menu.attrs['class']
# Verify page content
assert content_div.children[1] == "Content"
# Verify drawer side
side_div = navbar_drawer.children[2]
assert side_div.tag == "div"
assert side_div.attrs['class'] == "drawer-side"
return navbar_drawer
# Run the tests
test_drawer_navbar_mobile_fasthtml_examples()