def test_navbar_with_icon_indicator_and_dropdown_fasthtml_examples():
"""Test navbar with icon, indicator and dropdown from daisyUI v5 documentation."""
from fasthtml.common import Div, A, Ul, Li, Span, Button, Img
from fasthtml.svg import Svg, Path
from cjm_fasthtml_tailwind.utilities.typography import font_size, font_weight, font_family, text_color
from cjm_fasthtml_tailwind.utilities.effects import shadow
from cjm_fasthtml_tailwind.utilities.flexbox_and_grid import flex, justify
from cjm_fasthtml_tailwind.utilities.sizing import h, w
from cjm_fasthtml_tailwind.utilities.spacing import m, p
from cjm_fasthtml_tailwind.utilities.layout import z
from cjm_fasthtml_tailwind.utilities.borders import rounded
from cjm_fasthtml_daisyui.utilities.semantic_colors import bg_dui, text_dui
from cjm_fasthtml_daisyui.utilities.border_radius import border_radius
from cjm_fasthtml_daisyui.components.actions.button import btn, btn_styles, btn_modifiers, btn_colors
from cjm_fasthtml_daisyui.components.actions.dropdown import dropdown, dropdown_placement, dropdown_content
from cjm_fasthtml_daisyui.components.navigation.menu import menu, menu_sizes
from cjm_fasthtml_daisyui.components.data_display.badge import badge, badge_sizes
from cjm_fasthtml_daisyui.components.data_display.avatar import avatar
from cjm_fasthtml_daisyui.components.layout.indicator import indicator, indicator_item
from cjm_fasthtml_daisyui.components.data_display.card import card, card_body, card_actions, card_sizes
# Create shopping cart icon
cart_icon = Svg(
Path(
stroke_linecap="round",
stroke_linejoin="round",
stroke_width="2",
d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"
),
xmlns="http://www.w3.org/2000/svg",
cls=combine_classes(h._5, w._5),
fill="none",
viewBox="0 0 24 24",
stroke="currentColor"
)
# Navbar with icon, indicator and dropdown
navbar_icon_indicator = Div(
Div(
A("daisyUI", cls=combine_classes(btn, btn_styles.ghost, font_size.xl)),
cls=combine_classes(flex._1)
),
Div(
# Shopping cart dropdown
Div(
Div(
Div(
cart_icon,
Span("8", cls=combine_classes(badge, badge_sizes.sm, indicator_item)),
cls=str(indicator)
),
tabindex="0",
role="button",
cls=combine_classes(btn, btn_styles.ghost, btn_modifiers.circle)
),
Div(
Div(
Span("8 Items", cls=combine_classes(font_size.lg, font_weight.bold)),
Span("Subtotal: $999", cls=str(text_dui.info)),
Div(
Button("View cart", cls=combine_classes(btn, btn_colors.primary, btn_modifiers.block)),
cls=str(card_actions)
),
cls=str(card_body)
),
tabindex="0",
cls=combine_classes(
card, card_sizes.sm, dropdown_content,
bg_dui.base_100, z._1, m.t._3, w._52, shadow.sm
)
),
cls=combine_classes(dropdown, dropdown_placement.end)
),
# Avatar dropdown
Div(
Div(
Div(
Img(
alt="Tailwind CSS Navbar component",
src="https://img.daisyui.com/images/stock/photo-1534528741775-53994a69daeb.webp",
cls=combine_classes(w._10, rounded.full)
),
cls=str(w._10)
),
tabindex="0",
role="button",
cls=combine_classes(btn, btn_styles.ghost, btn_modifiers.circle, avatar)
),
Ul(
Li(
A(
"Profile",
Span("New", cls=str(badge)),
cls=combine_classes(justify.between)
)
),
Li(A("Settings")),
Li(A("Logout")),
tabindex="0",
cls=combine_classes(
menu, menu_sizes.sm, dropdown_content,
bg_dui.base_100, border_radius.box,
z._1, m.t._3, w._52, p._2, shadow.sm
)
),
cls=combine_classes(dropdown, dropdown_placement.end)
),
cls=combine_classes(flex.none)
),
cls=combine_classes(navbar, bg_dui.base_100, shadow.sm)
)
# Verify structure
assert navbar_icon_indicator.tag == "div"
assert "navbar" in navbar_icon_indicator.attrs['class']
assert "bg-base-100" in navbar_icon_indicator.attrs['class']
assert "shadow-sm" in navbar_icon_indicator.attrs['class']
# Verify title div
title_div = navbar_icon_indicator.children[0]
assert title_div.tag == "div"
assert "flex-1" in title_div.attrs['class']
assert title_div.children[0].tag == "a"
assert title_div.children[0].children[0] == "daisyUI"
# Verify flex-none container with two dropdowns
dropdowns_div = navbar_icon_indicator.children[1]
assert dropdowns_div.tag == "div"
assert "flex-none" in dropdowns_div.attrs['class']
assert len(dropdowns_div.children) == 2
# Verify shopping cart dropdown
cart_dropdown = dropdowns_div.children[0]
assert "dropdown" in cart_dropdown.attrs['class']
assert "dropdown-end" in cart_dropdown.attrs['class']
# Verify cart button with indicator
cart_button = cart_dropdown.children[0]
assert cart_button.attrs['tabindex'] == "0"
assert cart_button.attrs['role'] == "button"
assert "btn" in cart_button.attrs['class']
assert "btn-ghost" in cart_button.attrs['class']
assert "btn-circle" in cart_button.attrs['class']
# Verify indicator with badge
indicator_div = cart_button.children[0]
assert "indicator" in indicator_div.attrs['class']
assert indicator_div.children[0].tag == "svg" # Cart icon
indicator_badge = indicator_div.children[1]
assert "badge" in indicator_badge.attrs['class']
assert "badge-sm" in indicator_badge.attrs['class']
assert "indicator-item" in indicator_badge.attrs['class']
assert indicator_badge.children[0] == "8"
# Verify cart dropdown content (card)
cart_content = cart_dropdown.children[1]
assert cart_content.attrs['tabindex'] == "0"
assert "card" in cart_content.attrs['class']
assert "card-sm" in cart_content.attrs['class'] # Using card-compact
assert "dropdown-content" in cart_content.attrs['class']
# Verify cart card body
cart_body = cart_content.children[0]
assert "card-body" in cart_body.attrs['class']
assert cart_body.children[0].tag == "span"
assert "text-lg" in cart_body.children[0].attrs['class']
assert "font-bold" in cart_body.children[0].attrs['class']
assert cart_body.children[0].children[0] == "8 Items"
assert cart_body.children[1].tag == "span"
assert "text-info" in cart_body.children[1].attrs['class']
assert cart_body.children[1].children[0] == "Subtotal: $999"
# Verify view cart button
cart_actions = cart_body.children[2]
assert "card-actions" in cart_actions.attrs['class']
view_cart_btn = cart_actions.children[0]
assert view_cart_btn.tag == "button"
assert "btn" in view_cart_btn.attrs['class']
assert "btn-primary" in view_cart_btn.attrs['class']
assert "btn-block" in view_cart_btn.attrs['class']
assert view_cart_btn.children[0] == "View cart"
# Verify avatar dropdown
avatar_dropdown = dropdowns_div.children[1]
assert "dropdown" in avatar_dropdown.attrs['class']
assert "dropdown-end" in avatar_dropdown.attrs['class']
# Verify avatar button
avatar_button = avatar_dropdown.children[0]
assert "btn" in avatar_button.attrs['class']
assert "btn-ghost" in avatar_button.attrs['class']
assert "btn-circle" in avatar_button.attrs['class']
assert "avatar" in avatar_button.attrs['class']
# Verify avatar dropdown menu
avatar_menu = avatar_dropdown.children[1]
assert avatar_menu.tag == "ul"
assert "menu" in avatar_menu.attrs['class']
assert "menu-sm" in avatar_menu.attrs['class']
assert len(avatar_menu.children) == 3
return navbar_icon_indicator
# Run the tests
test_navbar_with_icon_indicator_and_dropdown_fasthtml_examples()