Exported source
kbd = SingleValueFactory("kbd", "Keyboard key or shortcut display component") # Kbd componentThe base kbd component:
Kbd size variants:
test_kbd_basic_examples ()
Test basic kbd utilities.
test_kbd_sizes_examples ()
Test kbd size variants.
def test_kbd_sizes_examples():
"""Test kbd size variants."""
assert str(kbd_sizes.xs) == "kbd-xs"
assert str(kbd_sizes.sm) == "kbd-sm"
assert str(kbd_sizes.md) == "kbd-md"
assert str(kbd_sizes.lg) == "kbd-lg"
assert str(kbd_sizes.xl) == "kbd-xl"
# With responsive modifiers
assert str(kbd_sizes.xs.sm) == "sm:kbd-xs"
assert str(kbd_sizes.lg.md) == "md:kbd-lg"
# Run the tests
test_kbd_sizes_examples()test_kbd_basic_fasthtml_examples ()
Test basic kbd and sizes from daisyUI v5 documentation.
def test_kbd_basic_fasthtml_examples():
"""Test basic kbd and sizes from daisyUI v5 documentation."""
from fasthtml.common import Kbd, Div
from cjm_fasthtml_tailwind.core.base import combine_classes
# Basic kbd
basic_kbd = Kbd("K", cls=str(kbd))
assert basic_kbd.tag == "kbd"
assert basic_kbd.attrs['class'] == "kbd"
assert basic_kbd.children[0] == "K"
# Kbd sizes
kbd_xs_elem = Kbd("Xsmall", cls=combine_classes(kbd, kbd_sizes.xs))
assert kbd_xs_elem.tag == "kbd"
assert "kbd" in kbd_xs_elem.attrs['class']
assert "kbd-xs" in kbd_xs_elem.attrs['class']
assert kbd_xs_elem.children[0] == "Xsmall"
kbd_sm_elem = Kbd("Small", cls=combine_classes(kbd, kbd_sizes.sm))
assert "kbd" in kbd_sm_elem.attrs['class']
assert "kbd-sm" in kbd_sm_elem.attrs['class']
assert kbd_sm_elem.children[0] == "Small"
kbd_md_elem = Kbd("Medium", cls=combine_classes(kbd, kbd_sizes.md))
assert "kbd" in kbd_md_elem.attrs['class']
assert "kbd-md" in kbd_md_elem.attrs['class']
assert kbd_md_elem.children[0] == "Medium"
kbd_lg_elem = Kbd("Large", cls=combine_classes(kbd, kbd_sizes.lg))
assert "kbd" in kbd_lg_elem.attrs['class']
assert "kbd-lg" in kbd_lg_elem.attrs['class']
assert kbd_lg_elem.children[0] == "Large"
kbd_xl_elem = Kbd("Xlarge", cls=combine_classes(kbd, kbd_sizes.xl))
assert "kbd" in kbd_xl_elem.attrs['class']
assert "kbd-xl" in kbd_xl_elem.attrs['class']
assert kbd_xl_elem.children[0] == "Xlarge"
# In text example
kbd_in_text = Kbd("F", cls=combine_classes(kbd, kbd_sizes.sm))
assert kbd_in_text.tag == "kbd"
assert "kbd" in kbd_in_text.attrs['class']
assert "kbd-sm" in kbd_in_text.attrs['class']
assert kbd_in_text.children[0] == "F"
# Return all elements in a Div
return Div(
basic_kbd,
kbd_xs_elem,
kbd_sm_elem,
kbd_md_elem,
kbd_lg_elem,
kbd_xl_elem,
kbd_in_text
)
# Run the tests
test_kbd_basic_fasthtml_examples()test_kbd_combination_fasthtml_examples ()
Test key combinations and function keys from daisyUI v5 documentation.
def test_kbd_combination_fasthtml_examples():
"""Test key combinations and function keys from daisyUI v5 documentation."""
from fasthtml.common import Kbd, Div
from cjm_fasthtml_tailwind.core.base import combine_classes
# Key combination
ctrl = Kbd("ctrl", cls=str(kbd))
shift = Kbd("shift", cls=str(kbd))
delete = Kbd("del", cls=str(kbd))
assert ctrl.tag == "kbd"
assert ctrl.attrs['class'] == "kbd"
assert ctrl.children[0] == "ctrl"
assert shift.tag == "kbd"
assert shift.attrs['class'] == "kbd"
assert shift.children[0] == "shift"
assert delete.tag == "kbd"
assert delete.attrs['class'] == "kbd"
assert delete.children[0] == "del"
# Function Keys
cmd = Kbd("⌘", cls=str(kbd))
option = Kbd("⌥", cls=str(kbd))
shift_key = Kbd("⇧", cls=str(kbd))
ctrl_key = Kbd("⌃", cls=str(kbd))
assert cmd.tag == "kbd"
assert cmd.attrs['class'] == "kbd"
assert cmd.children[0] == "⌘"
assert option.tag == "kbd"
assert option.attrs['class'] == "kbd"
assert option.children[0] == "⌥"
assert shift_key.tag == "kbd"
assert shift_key.attrs['class'] == "kbd"
assert shift_key.children[0] == "⇧"
assert ctrl_key.tag == "kbd"
assert ctrl_key.attrs['class'] == "kbd"
assert ctrl_key.children[0] == "⌃"
# Return all elements in a Div
return Div(
# Key combination row
Div(ctrl, shift, delete),
# Function keys row
Div(cmd, option, shift_key, ctrl_key)
)
# Run the tests
test_kbd_combination_fasthtml_examples()test_kbd_keyboard_fasthtml_examples ()
Test full keyboard and arrow keys from daisyUI v5 documentation.
def test_kbd_keyboard_fasthtml_examples():
"""Test full keyboard and arrow keys from daisyUI v5 documentation."""
from fasthtml.common import Kbd, Div
from cjm_fasthtml_tailwind.utilities.spacing import m
from cjm_fasthtml_tailwind.utilities.flexbox_and_grid import gap, justify, flex_display
from cjm_fasthtml_tailwind.utilities.sizing import w
from cjm_fasthtml_tailwind.utilities.layout import display_tw
from cjm_fasthtml_tailwind.core.base import combine_classes
# Full keyboard - first row
row1 = Div(
Kbd("q", cls=str(kbd)),
Kbd("w", cls=str(kbd)),
Kbd("e", cls=str(kbd)),
Kbd("r", cls=str(kbd)),
Kbd("t", cls=str(kbd)),
Kbd("y", cls=str(kbd)),
Kbd("u", cls=str(kbd)),
Kbd("i", cls=str(kbd)),
Kbd("o", cls=str(kbd)),
Kbd("p", cls=str(kbd)),
cls=combine_classes(m.y_1, flex_display, w.full, justify.center, gap._1)
)
assert row1.tag == "div"
assert "m-y-1" in row1.attrs['class']
assert "flex" in row1.attrs['class']
assert "w-full" in row1.attrs['class']
assert "justify-center" in row1.attrs['class']
assert "gap-1" in row1.attrs['class']
assert len(row1.children) == 10
for i, letter in enumerate("qwertyuiop"):
assert row1.children[i].tag == "kbd"
assert row1.children[i].attrs['class'] == "kbd"
assert row1.children[i].children[0] == letter
# Second row
row2 = Div(
Kbd("a", cls=str(kbd)),
Kbd("s", cls=str(kbd)),
Kbd("d", cls=str(kbd)),
Kbd("f", cls=str(kbd)),
Kbd("g", cls=str(kbd)),
Kbd("h", cls=str(kbd)),
Kbd("j", cls=str(kbd)),
Kbd("k", cls=str(kbd)),
Kbd("l", cls=str(kbd)),
cls=combine_classes(m.y_1, flex_display, w.full, justify.center, gap._1)
)
assert len(row2.children) == 9
for i, letter in enumerate("asdfghjkl"):
assert row2.children[i].children[0] == letter
# Third row
row3 = Div(
Kbd("z", cls=str(kbd)),
Kbd("x", cls=str(kbd)),
Kbd("c", cls=str(kbd)),
Kbd("v", cls=str(kbd)),
Kbd("b", cls=str(kbd)),
Kbd("n", cls=str(kbd)),
Kbd("m", cls=str(kbd)),
Kbd("/", cls=str(kbd)),
cls=combine_classes(m.y_1, flex_display, w.full, justify.center, gap._1)
)
assert len(row3.children) == 8
for i, char in enumerate("zxcvbnm/"):
assert row3.children[i].children[0] == char
# Arrow Keys
# Up arrow
up_row = Div(
Kbd("▲", cls=str(kbd)),
cls=combine_classes(flex_display, w.full, justify.center)
)
assert up_row.tag == "div"
assert "flex" in up_row.attrs['class']
assert "w-full" in up_row.attrs['class']
assert "justify-center" in up_row.attrs['class']
assert len(up_row.children) == 1
assert up_row.children[0].children[0] == "▲"
# Left and right arrows
middle_row = Div(
Kbd("◀︎", cls=str(kbd)),
Kbd("▶︎", cls=str(kbd)),
cls=combine_classes(flex_display, w.full, justify.center, gap._12)
)
assert "gap-12" in middle_row.attrs['class']
assert len(middle_row.children) == 2
assert middle_row.children[0].children[0] == "◀︎"
assert middle_row.children[1].children[0] == "▶︎"
# Down arrow
down_row = Div(
Kbd("▼", cls=str(kbd)),
cls=combine_classes(flex_display, w.full, justify.center)
)
assert len(down_row.children) == 1
assert down_row.children[0].children[0] == "▼"
# Return all elements in a Div
return Div(
# Full keyboard
Div(row1, row2, row3),
# Arrow keys
Div(up_row, middle_row, down_row)
)
# Run the tests
test_kbd_keyboard_fasthtml_examples()<div>
<div>
<div class="m-y-1 flex w-full justify-center gap-1">
<kbd class="kbd">q</kbd><kbd class="kbd">w</kbd><kbd class="kbd">e</kbd><kbd class="kbd">r</kbd><kbd class="kbd">t</kbd><kbd class="kbd">y</kbd><kbd class="kbd">u</kbd><kbd class="kbd">i</kbd><kbd class="kbd">o</kbd><kbd class="kbd">p</kbd> </div>
<div class="m-y-1 flex w-full justify-center gap-1">
<kbd class="kbd">a</kbd><kbd class="kbd">s</kbd><kbd class="kbd">d</kbd><kbd class="kbd">f</kbd><kbd class="kbd">g</kbd><kbd class="kbd">h</kbd><kbd class="kbd">j</kbd><kbd class="kbd">k</kbd><kbd class="kbd">l</kbd> </div>
<div class="m-y-1 flex w-full justify-center gap-1">
<kbd class="kbd">z</kbd><kbd class="kbd">x</kbd><kbd class="kbd">c</kbd><kbd class="kbd">v</kbd><kbd class="kbd">b</kbd><kbd class="kbd">n</kbd><kbd class="kbd">m</kbd><kbd class="kbd">/</kbd> </div>
</div>
<div>
<div class="flex w-full justify-center">
<kbd class="kbd">▲</kbd> </div>
<div class="flex w-full justify-center gap-12">
<kbd class="kbd">◀︎</kbd><kbd class="kbd">▶︎</kbd> </div>
<div class="flex w-full justify-center">
<kbd class="kbd">▼</kbd> </div>
</div>
</div>