| 
<?php
 /*
 * This file is part of Chevere.
 *
 * (c) Rodolfo Berrios <[email protected]>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
 
 declare(strict_types=1);
 
 namespace Chevere\VarDump\Outputs;
 
 use Chevere\VarDump\Interfaces\FormatInterface;
 
 class HtmlOutput extends Output
 {
 public const CSS = <<<CSS
 @media (prefers-color-scheme: light) {
 :root {
 --textColor: #24292f;
 --backgroundColor: #f2f5f8;
 --inlineColor: #c4c5c7;
 }
 }
 @media (prefers-color-scheme: dark) {
 :root {
 --textColor: #ecf0f1;
 --backgroundColor: #132537;
 --inlineColor: #323e4a;
 }
 }
 html.chv-dump {
 background: var(--backgroundColor);
 }
 pre.chv-dump {
 font-size: 14px;
 font-family: 'Fira Code Retina', 'Operator Mono', Inconsolata, Menlo, Monaco, Consolas, monospace;
 line-height: normal;
 color: var(--textColor);
 padding: 1.25em;
 margin: 0.8em 0;
 word-break: break-word;
 white-space: pre-wrap;
 background: var(--backgroundColor);
 display: block;
 text-align: left;
 border: none;
 border-radius: 0.2857em;
 }
 .chv-dump-hr {
 opacity: 0.25;
 }
 .chv-dump-inline {
 border-left: 1px solid var(--inlineColor);
 
 }
 .chv-dump-details {
 line-height: normal;
 display: block;
 margin-top: -1.242857em;
 }
 * > .chv-dump-details:not(:last-child) {
 margin-bottom: -1.242857em;
 }
 .chv-dump-summary {
 height: 1.242857em;
 margin-left: -0.8em;
 position: relative;
 }
 .chv-dump-summary:hover {
 background: rgba(255, 255, 255, 0.1);
 }
 .chv-dump-summary::-webkit-details-marker {
 margin-top: 0.3em;
 }
 .chv-dump-float {
 color: #ff8700;
 }
 .chv-dump-int {
 color: #ff8700;
 }
 .chv-dump-string {
 color: #ff8700;
 }
 .chv-dump-bool {
 color: #ff8700;
 }
 .chv-dump-null {
 color: #ff8700;
 }
 .chv-dump-object {
 color: #fabb00;
 }
 .chv-dump-array {
 color: #27ae60;
 }
 .chv-dump-resource {
 color: #ff5f5f;
 }
 .chv-dump-file {
 color: #87afff;
 }
 .chv-dump-class {
 color: #fabb00;
 }
 .chv-dump-operator {
 color: #6c6c6c;
 }
 .chv-dump-function {
 color: #00afff;
 }
 .chv-dump-variable {
 color: #00afff;
 }
 .chv-dump-modifier {
 color: #d75fd7;
 }
 .chv-dump-emphasis {
 color: rgb(108 108 108 / 65%);
 }
 CSS;
 
 protected bool $hasHeader = false;
 
 protected static bool $isStyleWritten = false;
 
 public function finalize(): void
 {
 $this->writer()->write('</pre>');
 if ($this->hasHeader) {
 $this->writer()->write('</body></html>');
 }
 }
 
 public function prepare(): void
 {
 // @infection-ignore-all
 if (! headers_sent() || headers_list() === []) {
 $this->hasHeader = true;
 $this->writer()->write(
 '<html class="chv-dump"><head><meta charset="UTF-8"></head><body>'
 );
 }
 if (! self::$isStyleWritten) {
 $this->writer()->write(
 '<style>' . preg_replace('/\s+/', ' ', self::CSS) . '</style>'
 );
 self::$isStyleWritten = true;
 }
 $this->writer()->write(
 '<pre class="chv-dump">'
 . $this->caller()
 . '<hr class="chv-dump-hr">'
 );
 }
 
 public function writeCallerFile(FormatInterface $format): void
 {
 $highlight = $this->getCallerFile($format);
 $this->writer()->write(
 <<<HTML
 {$highlight}
 
 HTML
 );
 }
 
 public function isStyleWritten(): bool
 {
 return self::$isStyleWritten;
 }
 }
 
 |