PHP port of erikgeiser/promptkit — interactive line-editing prompt library for terminal UIs.
- TextPrompt — single-line input with validation, auto-completion, hidden/password mode, char limit, default value
- SelectionPrompt — filtered list with cursor navigation and pagination
- MultiSelectPrompt — filtered multi-choice with min/max enforcement and FIFO rollover at the cap
- ConfirmationPrompt — yes/no with customizable labels, decoupled select-vs-submit
- TextareaPrompt — multi-line text input with line/column cursor and optional max-line cap
- Pure renderer — every method returns a new immutable instance;
view()returns ANSI strings,value()returns the data
composer require sugarcraft/sugar-readlineuse SugarCraft\Readline\{Key, TextPrompt};
$p = TextPrompt::new('Enter your name: ')
->withDefault('Anonymous')
->withCompletions(['Alice', 'Bob', 'Carol']);
$p = $p->handleChar('A')->handleChar('l')->handleKey(Key::Tab)->submit();
echo $p->value(); // 'Alice'use SugarCraft\Readline\SelectionPrompt;
$p = SelectionPrompt::new('Choose a fruit:', ['Apple', 'Banana', 'Cherry', 'Date'])
->withFilter('an'); // Banana matches
echo $p->selectedValue(); // 'Banana'use SugarCraft\Readline\{Key, MultiSelectPrompt};
$p = MultiSelectPrompt::new('Pick:', ['A', 'B', 'C'])
->withMinSelections(1)
->handleKey(Key::Space) // mark A
->handleKey(Key::Down)
->handleKey(Key::Space) // mark B
->handleKey(Key::Enter); // submit (min satisfied)
print_r($p->selectedValues()); // ['A', 'B']use SugarCraft\Readline\{ConfirmationPrompt, Key};
$p = ConfirmationPrompt::new('Delete file?')
->handleKey('n') // selects No (does not auto-submit)
->handleKey(Key::Left) // changes mind back to Yes
->submit();
echo $p->result() ? 'yes' : 'no'; // 'yes'The SugarCraft\Readline\Key class exposes symbolic constants for every supported key.
Key::Left/Key::Right— move cursor (text input)Key::Up/Key::Down— navigate selection list / change line in textareaKey::PageUp/Key::PageDown— page through long listsKey::Home/Key::End— jump within the current line / listKey::Enter— submit text or select current choiceKey::Space— toggle mark in multi-selectKey::Tab— auto-complete or toggle confirmation valueKey::Backspace/Key::Delete— delete charactersKey::CtrlU/Key::CtrlK— delete to start / end of lineKey::Escape/Key::CtrlC— abort
Each prompt is a state machine with three states: pending, submitted, aborted.
submit()finalises the prompt; forMultiSelectPromptit only succeeds whencanSubmit()is true.abort()(or feedingKey::Escape/Key::CtrlC) discards the prompt;value()/selectedValues()then return empty.isSubmitted()/isAborted()report status;currentValue()(Confirmation) andselectedValue()(Selection) reflect the current cursor regardless of submission state.