xnano.components.input
xnano.components.input
¶
xnano.components.input
Edit single-line or multiline text with optional masking and length limits.
Classes:
-
Input–Editable text field.
Input
dataclass
¶
Input(
content: str | Text | list[str | Text] = "",
foreground: ColorLike | None = None,
background: ColorLike | None = None,
modifiers: tuple[CharacterModifier, ...] = (),
horizontal_align: Alignment | None = None,
vertical_align: VerticalAlignment | None = None,
wrap: bool = True,
input: bool = False,
placeholder: str | Text | None = None,
cursor: int | None = None,
multiline: bool = False,
rows: int | None = None,
ansi: bool = False,
markdown: bool = False,
language: str | None = None,
passthrough: Sequence[str] = (),
mask: str | None = None,
max_length: int | None = None,
read_only: bool = False,
tab_size: int = 4,
focusable: bool = False,
fill: bool = False,
submit_keys: Sequence[str] = ("enter",),
auto_height: bool = False,
min_rows: int = 1,
max_rows: int | None = None,
*,
visible: bool = True,
z: int = 0,
fit_content: bool = True
)
Bases: Text
Editable text field.
Input is single-line by default. Set multiline=True for an editor
that supports line breaks, selection, and navigation. Set
auto_height=True for a composer that grows as the text soft-wraps,
bounded by min_rows and max_rows — pair it with a
Field(height="fit") slot so layout consumes the reported height.
Example
Input(placeholder="Search", submit_keys=("enter",))
Attributes:
-
submit_keys(Sequence[str]) –Keys reserved for submit hooks instead of text editing.
-
auto_height(bool) –Grow the reported height to fit soft-wrapped content.
-
min_rows(int) –Minimum reported height when
auto_heightis set. -
max_rows(int | None) –Maximum reported height when
auto_heightis set.
Methods:
-
component_post_init–Force input mode, then run
Texteditor setup. -
get_size–Report the preferred cell size, growing with content when asked.
-
get_frame–Optional frame/panel chrome around composed content.
-
before_render–Called before rendering; returns the effective render area.
-
after_render–Record the multi-line editor caret so the terminal cursor tracks it.
-
compose–Compose interface-neutral content for this Text.
-
compose_extra_small–Compose content when the viewport is extra small (< 40 cols).
-
compose_small–Compose content when the viewport is small (40–79 cols).
-
compose_medium–Compose content when the viewport is medium (80–119 cols).
-
compose_large–Compose content when the viewport is large (120–159 cols).
-
compose_extra_large–Compose content when the viewport is extra large (>= 160 cols).
-
handle_keyboard–Edit this text when it has focus.
-
handle_paste–Insert pasted text at the caret of a multi-line editor.
-
get_terminal_node–Return composed content for terminal compatibility.
submit_keys
class-attribute
instance-attribute
¶
Read-only convenience for hook matching; not consumed here.
auto_height
class-attribute
instance-attribute
¶
auto_height: bool = False
Report a preferred height that grows with soft-wrapped content.
Works with a Field(height="fit") slot: the input measures how many
rows its value occupies at the available width and reports that height,
clamped to [min_rows, max_rows] — no manual grid_set_field loop.
min_rows
class-attribute
instance-attribute
¶
min_rows: int = 1
Smallest reported height (rows) while auto_height is set.
max_rows
class-attribute
instance-attribute
¶
max_rows: int | None = None
Largest reported height (rows) while auto_height is set, or
None for unbounded growth.
visible
class-attribute
instance-attribute
¶
visible: bool = dataclasses.field(
default=True, kw_only=True
)
Whether this component paints at all.
z
class-attribute
instance-attribute
¶
z: int = dataclasses.field(default=0, kw_only=True)
Stacking order among sibling content.
fit_content
class-attribute
instance-attribute
¶
fit_content: bool = dataclasses.field(
default=True, kw_only=True
)
When True, paint at natural size inside a larger slot.
content
class-attribute
instance-attribute
¶
Plain string, nested Text, or a list of either.
foreground
class-attribute
instance-attribute
¶
foreground: ColorLike | None = None
Foreground color (deprecated alias: color).
background
class-attribute
instance-attribute
¶
background: ColorLike | None = None
Background color.
modifiers
class-attribute
instance-attribute
¶
modifiers: tuple[CharacterModifier, ...] = ()
Character modifiers such as bold or underline.
horizontal_align
class-attribute
instance-attribute
¶
horizontal_align: Alignment | None = None
Horizontal alignment at the paragraph level.
vertical_align
class-attribute
instance-attribute
¶
vertical_align: VerticalAlignment | None = None
Vertical alignment within the painted area.
input
class-attribute
instance-attribute
¶
input: bool = False
When True on a leaf, the component is an editable field.
placeholder
class-attribute
instance-attribute
¶
Shown when input is empty and unfocused.
cursor
class-attribute
instance-attribute
¶
cursor: int | None = None
Caret index for single-line input; None means end of string.
multiline
class-attribute
instance-attribute
¶
multiline: bool = False
When True with input, editing uses CoreTextEditor.
rows
class-attribute
instance-attribute
¶
rows: int | None = None
Preferred visible height (lines) for a multiline input.
ansi
class-attribute
instance-attribute
¶
ansi: bool = False
Parse ANSI SGR sequences in leaf content.
markdown
class-attribute
instance-attribute
¶
markdown: bool = False
Parse leaf content as markdown.
language
class-attribute
instance-attribute
¶
language: str | None = None
Pygments lexer name for syntax highlighting only.
passthrough
class-attribute
instance-attribute
¶
Key bindings this input never captures while focused.
mask
class-attribute
instance-attribute
¶
mask: str | None = None
Display-only mask character(s); real value is preserved.
max_length
class-attribute
instance-attribute
¶
max_length: int | None = None
Maximum plain-string length; longer input is clamped.
read_only
class-attribute
instance-attribute
¶
read_only: bool = False
Reject edits while remaining focusable.
tab_size
class-attribute
instance-attribute
¶
tab_size: int = 4
Tab width applied to multiline tab insertion and paste.
focusable
class-attribute
instance-attribute
¶
focusable: bool = False
Whether this component participates in field focus.
fill
class-attribute
instance-attribute
¶
fill: bool = False
Whether background fills the whole slot rather than only the
text glyphs. When True short lines still paint the background across
the full cell width (no manual right-padding required).
owns_cursor
property
¶
owns_cursor: bool
Whether this Text paints its own caret (multi-line editor).
cursor_position
property
¶
Absolute caret cell for the terminal cursor, set during paint.
Reported only for a focused multi-line editor (a single-line input
paints its own ▌ caret inline). None otherwise, which hides
the hardware cursor.
component_post_init
¶
get_size
¶
get_size(ctx: 'ComponentRenderContext') -> Size
Report the preferred cell size, growing with content when asked.
Source code in xnano/components/input.py
before_render
¶
before_render(
ctx: ComponentRenderContext[StateT], area: "Area"
) -> "Area"
after_render
¶
Record the multi-line editor caret so the terminal cursor tracks it.
Source code in xnano/components/text.py
compose
¶
compose(
ctx: ComponentRenderContext[Any],
) -> TextBlock | Native | Panel | None
Compose interface-neutral content for this Text.
Parameters:
-
ctx(ComponentRenderContext[Any]) –Render-time scope for this paint.
Returns:
-
TextBlock | Native | Panel | None–A
TextBlock,Nativeeditor payload, or nested content. -
TextBlock | Native | Panel | None–When
fillis set the block is wrapped in a background -
TextBlock | Native | Panel | None–Panelso the color spans the full slot.
Source code in xnano/components/text.py
compose_extra_small
¶
compose_extra_small(
ctx: ComponentRenderContext[StateT],
) -> Content | None
Compose content when the viewport is extra small (< 40 cols).
Optional responsive counterpart to :meth:compose. When
overridden, it is used instead of compose while the window
is in this size tier. Overriding any compose_* variant opts the
component into breakpoint dispatch; a component that overrides none
pays no per-frame cost.
Source code in xnano/components/component.py
compose_small
¶
compose_small(
ctx: ComponentRenderContext[StateT],
) -> Content | None
Compose content when the viewport is small (40–79 cols).
See :meth:compose_extra_small.
compose_medium
¶
compose_medium(
ctx: ComponentRenderContext[StateT],
) -> Content | None
Compose content when the viewport is medium (80–119 cols).
See :meth:compose_extra_small.
compose_large
¶
compose_large(
ctx: ComponentRenderContext[StateT],
) -> Content | None
Compose content when the viewport is large (120–159 cols).
See :meth:compose_extra_small.
compose_extra_large
¶
compose_extra_large(
ctx: ComponentRenderContext[StateT],
) -> Content | None
Compose content when the viewport is extra large (>= 160 cols).
See :meth:compose_extra_small.
Source code in xnano/components/component.py
handle_keyboard
¶
handle_keyboard(keyboard: 'KeyboardEventData') -> bool
Edit this text when it has focus.
Passthrough bindings remain available to hooks. Read-only inputs reject
edits, and max_length limits inserted content.
Parameters:
-
keyboard('KeyboardEventData') –The keyboard event payload.
Returns:
-
bool–Truewhen the key was consumed as text editing.
Source code in xnano/components/text.py
handle_paste
¶
Insert pasted text at the caret of a multi-line editor.
Parameters:
-
text(str) –The pasted clipboard text.
Returns:
-
bool–Truewhen the paste was consumed by the native editor.
Source code in xnano/components/text.py
get_terminal_node
¶
get_terminal_node(
ctx: ComponentRenderContext[Any],
) -> TextBlock | Native | Panel | None
Return composed content for terminal compatibility.
Parameters:
-
ctx(ComponentRenderContext[Any]) –Render-time scope for this paint.
Returns: