def test_accessibility_fasthtml_examples(
):
"""Test accessibility utilities in practical FastHTML component examples."""
from fasthtml.common import Div, Button, Span, Input, Label, Nav, A
from cjm_fasthtml_tailwind.utilities.layout import position, top, left
from cjm_fasthtml_tailwind.utilities.backgrounds import bg
from cjm_fasthtml_tailwind.utilities.spacing import p
from cjm_fasthtml_tailwind.utilities.borders import rounded, border, border_color
from cjm_fasthtml_tailwind.utilities.sizing import w, h
from cjm_fasthtml_tailwind.utilities.typography import font_size, text_color
from cjm_fasthtml_tailwind.utilities.transitions_and_animation import animate
from cjm_fasthtml_tailwind.utilities.flexbox_and_grid import gap, items, grid_display, flex_display
from cjm_fasthtml_tailwind.core.base import combine_classes
# Skip link for keyboard navigation
skip_link = A(
"Skip to main content",
href="#main-content",
cls=combine_classes(
sr_only,
not_sr_only.focus,
position.absolute.focus,
top(4).focus,
left(4).focus,
bg.white,
p(2),
rounded.full
)
)
assert "sr-only" in skip_link.attrs['class']
assert "focus:not-sr-only" in skip_link.attrs['class']
# Form with screen reader only label
form_field = Div(
Label("Search", cls=str(sr_only), for_="search"),
Input(
type="search",
id="search",
placeholder="Search...",
cls=combine_classes(w.full, p.x(4), p.y(2), border._1, rounded.full)
)
)
assert form_field.children[0].attrs['class'] == "sr-only"
# Icon button with screen reader text
icon_button = Button(
# Icon would go here (e.g., SVG)
Span("Close dialog", cls=str(sr_only)),
cls=combine_classes(p(2), rounded.full, bg.gray._100.hover),
aria_label="Close dialog"
)
assert icon_button.children[0].attrs['class'] == "sr-only"
# Navigation with forced color adjustments
high_contrast_nav = Nav(
A("Home", href="/", cls=combine_classes(forced_color_adjust.none, text_color.blue._600)),
A("About", href="/about", cls=combine_classes(forced_color_adjust.none, text_color.blue._600)),
A("Contact", href="/contact", cls=combine_classes(forced_color_adjust.none, text_color.blue._600)),
cls=combine_classes(forced_color_adjust.auto, flex_display, gap(4))
)
assert high_contrast_nav.attrs['class'] == "forced-color-adjust-auto flex gap-4"
assert "forced-color-adjust-none" in high_contrast_nav.children[0].attrs['class']
# Loading spinner with screen reader text
loading_spinner = Div(
Div(cls=combine_classes(
animate.spin,
h(5),
w(5),
border._2,
border_color.gray._900,
rounded.full,
border_color.t.transparent
)),
Span("Loading...", cls=str(sr_only)),
cls=combine_classes(flex_display.inline, items.center)
)
assert loading_spinner.children[1].attrs['class'] == "sr-only"
# Return all examples in a grid layout
return Div(
skip_link,
form_field,
icon_button,
high_contrast_nav,
loading_spinner,
cls=combine_classes(grid_display, gap(5))
)
# Run the tests
test_accessibility_fasthtml_examples()