def test_borders_fasthtml_examples():
"""Test border utilities in practical FastHTML component examples."""
from fasthtml.common import Div, Button, Ul, Li, H3, P, Input, Link
from cjm_fasthtml_tailwind.utilities.spacing import p
from cjm_fasthtml_tailwind.utilities.layout import display_tw, overflow
from cjm_fasthtml_tailwind.utilities.flexbox_and_grid import gap, flex_display, grid_display
from cjm_fasthtml_tailwind.core.base import combine_classes
# Card with rounded corners and colored border
card = Div(
H3("Card Title"),
P("Card content goes here."),
cls=combine_classes(
rounded.lg,
border(),
border_color.gray._300,
p(6)
)
)
assert "rounded-lg" in card.attrs['class']
assert "border" in card.attrs['class']
assert "border-gray-300" in card.attrs['class']
# Button with full rounded corners and colored border
button = Button(
"Click me",
cls=combine_classes(
rounded.full,
border._2,
border_color.blue._500,
p.x(4),
p.y(2)
)
)
assert "rounded-full" in button.attrs['class']
assert "border-2" in button.attrs['class']
assert "border-blue-500" in button.attrs['class']
# Container with top rounded corners and different border colors
container = Div(
"Content",
cls=combine_classes(
rounded.t.xl,
rounded.b.none,
border(),
border_color.t.red._500,
border_color.x.gray._300,
border_color.b.transparent,
p(4)
)
)
assert "rounded-t-xl" in container.attrs['class']
assert "rounded-b-none" in container.attrs['class']
assert "border-t-red-500" in container.attrs['class']
assert "border-x-gray-300" in container.attrs['class']
assert "border-b-transparent" in container.attrs['class']
# List with colored dividers between items
list_with_dividers = Ul(
Li("Item 1"),
Li("Item 2"),
Li("Item 3"),
cls=combine_classes(
divide.y._2,
divide_color.gray._200,
p.y(2)
)
)
assert "divide-y-2" in list_with_dividers.attrs['class']
assert "divide-gray-200" in list_with_dividers.attrs['class']
# Horizontal button group with colored dividers
button_group = Div(
Button("Left"),
Button("Center"),
Button("Right"),
cls=combine_classes(
flex_display,
divide.x(),
divide_color.gray._400,
border(),
border_color.gray._400,
rounded.lg,
overflow.hidden
)
)
assert "divide-x" in button_group.attrs['class']
assert "divide-gray-400" in button_group.attrs['class']
assert "border" in button_group.attrs['class']
assert "border-gray-400" in button_group.attrs['class']
assert "rounded-lg" in button_group.attrs['class']
# Complex border example with colors
complex_border = Div(
"Complex borders",
cls=combine_classes(
border.t._4,
border.r._2,
border.b._0,
border.l._2,
border_color.t.red._600,
border_color.r.blue._400,
border_color.l.green._500,
rounded.tl.xl,
rounded.tr.sm,
rounded.br.none,
rounded.bl.md,
p(4)
)
)
assert "border-t-4" in complex_border.attrs['class']
assert "border-r-2" in complex_border.attrs['class']
assert "border-b-0" in complex_border.attrs['class']
assert "border-l-2" in complex_border.attrs['class']
assert "border-t-red-600" in complex_border.attrs['class']
assert "border-r-blue-400" in complex_border.attrs['class']
assert "border-l-green-500" in complex_border.attrs['class']
assert "rounded-tl-xl" in complex_border.attrs['class']
assert "rounded-tr-sm" in complex_border.attrs['class']
assert "rounded-br-none" in complex_border.attrs['class']
assert "rounded-bl-md" in complex_border.attrs['class']
# Card with semi-transparent border
transparent_card = Div(
"Semi-transparent border",
cls=combine_classes(
border._2,
border_color.black.opacity(20),
rounded.md,
p(4)
)
)
assert "border-2" in transparent_card.attrs['class']
assert "border-black/20" in transparent_card.attrs['class']
assert "rounded-md" in transparent_card.attrs['class']
# Input with dashed border style
input_field = Input(
type="text",
placeholder="Enter text",
cls=combine_classes(
border._2,
border_color.gray._400,
border_style.dashed,
rounded.md,
p.x(3),
p.y(2)
)
)
assert "border-2" in input_field.attrs['class']
assert "border-gray-400" in input_field.attrs['class']
assert "border-dashed" in input_field.attrs['class']
# List with dotted dividers
dotted_list = Ul(
Li("First item"),
Li("Second item"),
Li("Third item"),
cls=combine_classes(
divide.y(),
divide_color.gray._300,
divide_style.dotted,
p.y(1)
)
)
assert "divide-y" in dotted_list.attrs['class']
assert "divide-gray-300" in dotted_list.attrs['class']
assert "divide-dotted" in dotted_list.attrs['class']
# Button with focus outline
focus_button = Button(
"Focus Me",
cls=combine_classes(
p.x(4),
p.y(2),
outline_style.none,
outline._2.focus,
outline_color.blue._500.focus,
outline_offset._2.focus
)
)
assert "outline-none" in focus_button.attrs['class']
assert "focus:outline-2" in focus_button.attrs['class']
assert "focus:outline-blue-500" in focus_button.attrs['class']
assert "focus:outline-offset-2" in focus_button.attrs['class']
# Link with custom outline
custom_link = Link(
"Custom Link",
href="#",
cls=combine_classes(
display_tw.inline_block,
p.x(3),
p.y(1),
outline(),
outline_color.purple._400,
outline_style.dashed,
outline_offset._1,
rounded.sm
)
)
assert "outline" in custom_link.attrs['class']
assert "outline-purple-400" in custom_link.attrs['class']
assert "outline-dashed" in custom_link.attrs['class']
assert "outline-offset-1" in custom_link.attrs['class']
# Box with double border style
double_border_box = Div(
"Double Border",
cls=combine_classes(
border._4,
border_color.indigo._600,
border_style.double,
rounded.lg,
p(6)
)
)
assert "border-4" in double_border_box.attrs['class']
assert "border-indigo-600" in double_border_box.attrs['class']
assert "border-double" in double_border_box.attrs['class']
# Container with hidden outline for accessibility
accessible_container = Div(
"Accessible content",
tabindex="0",
cls=combine_classes(
outline_hidden,
outline._2.focus,
outline_color.blue._500.focus,
p(4)
)
)
assert "outline-hidden" in accessible_container.attrs['class']
# Return all examples in a grid layout
return Div(
card,
button,
container,
list_with_dividers,
button_group,
complex_border,
transparent_card,
input_field,
dotted_list,
focus_button,
custom_link,
double_border_box,
accessible_container,
cls=combine_classes(grid_display, gap(5))
)
# Run the tests
test_borders_fasthtml_examples()