def test_modal_dialog_fasthtml_examples():
"""Test modal examples using HTML dialog element (recommended method)."""
from fasthtml.common import Dialog, Div, Button, H3, P, Form
from cjm_fasthtml_tailwind.utilities.spacing import p
from cjm_fasthtml_tailwind.utilities.typography import font_size, font_weight, font_family, text_color
from cjm_fasthtml_tailwind.utilities.sizing import w, max_w
from cjm_fasthtml_tailwind.utilities.layout import position, right, top
from cjm_fasthtml_daisyui.components.actions.button import btn, btn_sizes, btn_modifiers, btn_styles
# Basic dialog modal
dialog_modal = Dialog(
Div(
H3("Hello!", cls=combine_classes(font_size.lg, font_weight.bold)),
P("Press ESC key or click the button below to close", cls=p.y._4),
Div(
Form(
Button("Close", cls=str(btn)),
method="dialog"
),
cls=str(modal_action)
),
cls=str(modal_box)
),
id="my_modal_1",
cls=str(modal)
)
assert dialog_modal.tag == "dialog"
assert dialog_modal.attrs['id'] == "my_modal_1"
assert "modal" in dialog_modal.attrs['class']
assert "modal-box" in dialog_modal.children[0].attrs['class']
assert "modal-action" in dialog_modal.children[0].children[2].attrs['class']
# Dialog modal with backdrop (closes when clicked outside)
backdrop_modal = Dialog(
Div(
H3("Hello!", cls=combine_classes(font_size.lg, font_weight.bold)),
P("Press ESC key or click outside to close", cls=p.y._4),
cls=str(modal_box)
),
Form(
Button("close"),
method="dialog",
cls=str(modal_backdrop)
),
id="my_modal_2",
cls=str(modal)
)
assert "modal-backdrop" in backdrop_modal.children[1].attrs['class']
assert backdrop_modal.children[1].tag == "form"
assert backdrop_modal.children[1].attrs['method'] == "dialog"
# Dialog modal with close button at corner
close_button_modal = Dialog(
Div(
Form(
Button(
"✕",
cls=combine_classes(
btn,
btn_sizes.sm,
btn_modifiers.circle,
btn_styles.ghost,
position.absolute,
right._2,
top._2
)
),
method="dialog"
),
H3("Hello!", cls=combine_classes(font_size.lg, font_weight.bold)),
P("Press ESC key or click on ✕ button to close", cls=p.y._4),
cls=str(modal_box)
),
id="my_modal_3",
cls=str(modal)
)
assert "btn-sm" in close_button_modal.children[0].children[0].children[0].attrs['class']
assert "btn-circle" in close_button_modal.children[0].children[0].children[0].attrs['class']
assert "absolute" in close_button_modal.children[0].children[0].children[0].attrs['class']
assert "right-2" in close_button_modal.children[0].children[0].children[0].attrs['class']
assert "top-2" in close_button_modal.children[0].children[0].children[0].attrs['class']
# Dialog modal with custom width
wide_modal = Dialog(
Div(
H3("Hello!", cls=combine_classes(font_size.lg, font_weight.bold)),
P("Click the button below to close", cls=p.y._4),
Div(
Form(
Button("Close", cls=str(btn)),
method="dialog"
),
cls=str(modal_action)
),
cls=combine_classes(modal_box, w("11/12"), max_w._5xl)
),
id="my_modal_4",
cls=str(modal)
)
assert "w-11/12" in wide_modal.children[0].attrs['class']
assert "max-w-5xl" in wide_modal.children[0].attrs['class']
# Responsive modal (bottom on mobile, middle on larger screens)
responsive_modal = Dialog(
Div(
H3("Hello!", cls=combine_classes(font_size.lg, font_weight.bold)),
P("Press ESC key or click the button below to close", cls=p.y._4),
Div(
Form(
Button("Close", cls=str(btn)),
method="dialog"
),
cls=str(modal_action)
),
cls=str(modal_box)
),
id="my_modal_5",
cls=combine_classes(modal, modal_placement.bottom, modal_placement.middle.sm)
)
assert "modal-bottom" in responsive_modal.attrs['class']
assert "sm:modal-middle" in responsive_modal.attrs['class']
# Test button triggers with onclick
trigger_button = Button(
"open modal",
cls=str(btn),
onclick="my_modal_1.showModal()"
)
assert trigger_button.attrs['onclick'] == "my_modal_1.showModal()"
# Return all elements in a Div
return Div(
trigger_button,
dialog_modal,
backdrop_modal,
close_button_modal,
wide_modal,
responsive_modal
)
# Run the tests
test_modal_dialog_fasthtml_examples()