# keyboard


<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->

------------------------------------------------------------------------

<a
href="https://github.com/cj-mills/cjm-fasthtml-sortable-queue/blob/main/cjm_fasthtml_sortable_queue/keyboard.py#L28"
target="_blank" style="float:right; font-size:smaller">source</a>

### create_queue_keyboard_system

``` python

def create_queue_keyboard_system(
    config:SortableQueueConfig, # Queue configuration
    ids:SortableQueueHtmlIds, # HTML ID generators
    urls:SortableQueueUrls, # URL endpoints for HTMX actions
    zone_focus_classes:tuple=('ring-0',), # CSS classes when queue zone is active
    item_focus_classes:Optional=None, # CSS classes on focused item (default: bg-base-300)
    data_attributes:tuple=(), # Data attributes to extract (e.g., ("record-id", "provider-id"))
    on_focus_change:Optional=None, # JS callback on item focus change
    hidden_input_prefix:Optional=None, # Prefix for hidden state inputs
    system_id:Optional=None, # Keyboard system ID (auto-generated from ids.system_id if not set)
    show_hints:bool=False, # Show keyboard hints UI
)->KeyboardSystem: # Complete rendered keyboard system

```

*Create a self-contained keyboard system for the sortable queue.*

Returns a rendered KeyboardSystem with a single FocusZone
(LinearVertical navigation) and built-in actions for Delete/Backspace
remove and Shift+Arrow reorder. Works standalone or as a child in a
hierarchy via `coord.setParent(system_id, parent_id)`.

## Tests

``` python
from fasthtml.common import to_xml

# Test setup
config = SortableQueueConfig(prefix="tk")
ids = SortableQueueHtmlIds(prefix="tk")
urls = SortableQueueUrls(reorder="/tk/reorder", remove="/tk/remove", clear="/tk/clear")

# --- Basic creation with defaults ---
kb = create_queue_keyboard_system(config, ids, urls)
assert isinstance(kb, KeyboardSystem)
assert kb.script is not None
assert kb.hidden_inputs is not None
assert kb.action_buttons is not None

# --- Default item focus classes (bg-base-300) ---
script_xml = to_xml(kb.script)
assert "bg-base-300" in script_xml  # Default focus styling in JS config

# --- System ID ---
assert "tk-queue-kb" in script_xml  # system_id appears in JS config

# Custom system_id
kb2 = create_queue_keyboard_system(config, ids, urls, system_id="my-custom-kb")
script_xml2 = to_xml(kb2.script)
assert "my-custom-kb" in script_xml2

# --- Action buttons ---
btns_xml = to_xml(kb.action_buttons)
assert ids.remove_btn in btns_xml  # Remove button present
assert ids.reorder_up_btn in btns_xml  # Reorder up button present
assert ids.reorder_down_btn in btns_xml  # Reorder down button present
assert "/tk/remove" in btns_xml  # Remove URL wired
assert "/tk/reorder" in btns_xml  # Reorder URL wired

# --- Direction vals on reorder buttons ---
assert "direction" in btns_xml

# --- Zone config in script ---
assert f"li.{config.item_class}" in script_xml  # Item selector
assert ids.container in script_xml  # Zone container ID

# --- Custom item focus classes override default ---
kb3 = create_queue_keyboard_system(
    config, ids, urls,
    item_focus_classes=("bg-custom",),
    data_attributes=("record-id", "provider-id"),
    on_focus_change="myFocusCallback",
    hidden_input_prefix="my-focused",
    show_hints=True,
)
assert isinstance(kb3, KeyboardSystem)
assert kb3.hints is not None  # Hints rendered when show_hints=True
script_xml3 = to_xml(kb3.script)
assert "bg-custom" in script_xml3
assert "bg-base-300" not in script_xml3  # Default overridden
assert "myFocusCallback" in script_xml3
assert "record-id" in script_xml3

print("All keyboard tests passed")
```

    All keyboard tests passed
