121 lines
3.9 KiB
PHP
121 lines
3.9 KiB
PHP
<?php
|
|
|
|
namespace Laravel\Prompts\Concerns;
|
|
|
|
use InvalidArgumentException;
|
|
use Laravel\Prompts\Clear;
|
|
use Laravel\Prompts\ConfirmPrompt;
|
|
use Laravel\Prompts\MultiSearchPrompt;
|
|
use Laravel\Prompts\MultiSelectPrompt;
|
|
use Laravel\Prompts\Note;
|
|
use Laravel\Prompts\PasswordPrompt;
|
|
use Laravel\Prompts\PausePrompt;
|
|
use Laravel\Prompts\Progress;
|
|
use Laravel\Prompts\SearchPrompt;
|
|
use Laravel\Prompts\SelectPrompt;
|
|
use Laravel\Prompts\Spinner;
|
|
use Laravel\Prompts\SuggestPrompt;
|
|
use Laravel\Prompts\Table;
|
|
use Laravel\Prompts\TextareaPrompt;
|
|
use Laravel\Prompts\TextPrompt;
|
|
use Laravel\Prompts\Themes\Default\ClearRenderer;
|
|
use Laravel\Prompts\Themes\Default\ConfirmPromptRenderer;
|
|
use Laravel\Prompts\Themes\Default\MultiSearchPromptRenderer;
|
|
use Laravel\Prompts\Themes\Default\MultiSelectPromptRenderer;
|
|
use Laravel\Prompts\Themes\Default\NoteRenderer;
|
|
use Laravel\Prompts\Themes\Default\PasswordPromptRenderer;
|
|
use Laravel\Prompts\Themes\Default\PausePromptRenderer;
|
|
use Laravel\Prompts\Themes\Default\ProgressRenderer;
|
|
use Laravel\Prompts\Themes\Default\SearchPromptRenderer;
|
|
use Laravel\Prompts\Themes\Default\SelectPromptRenderer;
|
|
use Laravel\Prompts\Themes\Default\SpinnerRenderer;
|
|
use Laravel\Prompts\Themes\Default\SuggestPromptRenderer;
|
|
use Laravel\Prompts\Themes\Default\TableRenderer;
|
|
use Laravel\Prompts\Themes\Default\TextareaPromptRenderer;
|
|
use Laravel\Prompts\Themes\Default\TextPromptRenderer;
|
|
|
|
trait Themes
|
|
{
|
|
/**
|
|
* The name of the active theme.
|
|
*/
|
|
protected static string $theme = 'default';
|
|
|
|
/**
|
|
* The available themes.
|
|
*
|
|
* @var array<string, array<class-string<\Laravel\Prompts\Prompt>, class-string<object&callable>>>
|
|
*/
|
|
protected static array $themes = [
|
|
'default' => [
|
|
TextPrompt::class => TextPromptRenderer::class,
|
|
TextareaPrompt::class => TextareaPromptRenderer::class,
|
|
PasswordPrompt::class => PasswordPromptRenderer::class,
|
|
SelectPrompt::class => SelectPromptRenderer::class,
|
|
MultiSelectPrompt::class => MultiSelectPromptRenderer::class,
|
|
ConfirmPrompt::class => ConfirmPromptRenderer::class,
|
|
PausePrompt::class => PausePromptRenderer::class,
|
|
SearchPrompt::class => SearchPromptRenderer::class,
|
|
MultiSearchPrompt::class => MultiSearchPromptRenderer::class,
|
|
SuggestPrompt::class => SuggestPromptRenderer::class,
|
|
Spinner::class => SpinnerRenderer::class,
|
|
Note::class => NoteRenderer::class,
|
|
Table::class => TableRenderer::class,
|
|
Progress::class => ProgressRenderer::class,
|
|
Clear::class => ClearRenderer::class,
|
|
],
|
|
];
|
|
|
|
/**
|
|
* Get or set the active theme.
|
|
*
|
|
* @throws \InvalidArgumentException
|
|
*/
|
|
public static function theme(?string $name = null): string
|
|
{
|
|
if ($name === null) {
|
|
return static::$theme;
|
|
}
|
|
|
|
if (! isset(static::$themes[$name])) {
|
|
throw new InvalidArgumentException("Prompt theme [{$name}] not found.");
|
|
}
|
|
|
|
return static::$theme = $name;
|
|
}
|
|
|
|
/**
|
|
* Add a new theme.
|
|
*
|
|
* @param array<class-string<\Laravel\Prompts\Prompt>, class-string<object&callable>> $renderers
|
|
*/
|
|
public static function addTheme(string $name, array $renderers): void
|
|
{
|
|
if ($name === 'default') {
|
|
throw new InvalidArgumentException('The default theme cannot be overridden.');
|
|
}
|
|
|
|
static::$themes[$name] = $renderers;
|
|
}
|
|
|
|
/**
|
|
* Get the renderer for the current prompt.
|
|
*/
|
|
protected function getRenderer(): callable
|
|
{
|
|
$class = get_class($this);
|
|
|
|
return new (static::$themes[static::$theme][$class] ?? static::$themes['default'][$class])($this);
|
|
}
|
|
|
|
/**
|
|
* Render the prompt using the active theme.
|
|
*/
|
|
protected function renderTheme(): string
|
|
{
|
|
$renderer = $this->getRenderer();
|
|
|
|
return $renderer($this);
|
|
}
|
|
}
|