Вход Регистрация
Файл: vendor/laravel/prompts/src/Stream.php
Строк: 125
<?php

namespace LaravelPrompts;

use 
LaravelPromptsThemesDefaultConcernsInteractsWithStrings;

class 
Stream extends Prompt
{
    use 
InteractsWithStrings;

    protected 
int $minWidth 0;

    protected 
string $message '';

    
/** @var array<int, string> */
    
protected array $currentlyFading = [];

    protected 
int $maxWidth 0;

    
/** @var array<int, Closure(string): string> */
    
protected array $fadingOutColors = [];

    
/**
     * Create a new Stream instance.
     */
    
public function __construct()
    {
        
$this->maxWidth = static::terminal()->cols() - 20;
        
$this->hideCursor();
        
$this->fadingOutColors $this->fadeOut();
    }

    public function 
append(string $message): self
    
{
        
$this->currentlyFading[] = $message;

        while (
count($this->currentlyFading) > count($this->fadingOutColors)) {
            
$this->message .= array_shift($this->currentlyFading);
        }

        
$this->render();

        return 
$this;
    }

    public function 
close(): void
    
{
        try {
            while (
count($this->currentlyFading) > 0) {
                
$this->message .= array_shift($this->currentlyFading);
                
$this->render();
                
usleep(25_000);
            }
        } finally {
            
$this->showCursor();
        }
    }

    
/** @return array<int, string> */
    
public function lines(): array
    {
        
$toFadeIn = [];

        foreach (
$this->currentlyFading as $index => $message) {
            
$toFadeIn[] = $this->fadingOutColors[$index]($message);
        }

        
$lines explode(PHP_EOL$this->message.implode(''$toFadeIn));
        
$finalLines = [];

        foreach (
$lines as $line) {
            
$finalLines array_merge(
                
$finalLines,
                
$this->ansiWordwrap($line$this->maxWidth),
            );
        }

        return 
$finalLines;
    }

    public function 
prompt(): mixed
    
{
        throw new 
RuntimeException('Stream cannot be prompted');
    }

    
/**
     * Get the value of the prompt.
     */
    
public function value(): string
    
{
        return 
$this->message.implode(''$this->currentlyFading);
    }

    
/**
     * Get an array of closures that progressively fade text from full color to nearly invisible.
     *
     * @return array<int, Closure(string): string>
     */
    
protected function fadeOut(int $steps 10): array
    {
        if (! static::
terminal()->supportsTrueColor()) {
            return [
                
fn (string $text) => $text,
                
fn (string $text) => $this->dim($text),
            ];
        }

        
$fg = static::terminal()->foregroundColor();
        
$bg = static::terminal()->backgroundColor();

        return 
array_map(
            function (
int $step) use ($fg$bg$steps) {
                
$factor - ($step $steps);
                
$r = (int) ($bg[0] + ($fg[0] - $bg[0]) * $factor);
                
$g = (int) ($bg[1] + ($fg[1] - $bg[1]) * $factor);
                
$b = (int) ($bg[2] + ($fg[2] - $bg[2]) * $factor);

                return 
fn (string $text) => "e[38;2;{$r};{$g};{$b}m{$text}e[0m";
            },
            
range(0$steps 1),
        );
    }
}
Онлайн: 1
Реклама