mirror of
https://code.castopod.org/adaures/castopod
synced 2025-05-12 09:15:47 +00:00
77 lines
4.5 KiB
PHP
77 lines
4.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Views\Components\Forms;
|
|
|
|
use ViewComponents\Component;
|
|
|
|
class MarkdownEditor extends Component
|
|
{
|
|
public function render(): string
|
|
{
|
|
$editorClass = 'w-full flex flex-col bg-white border border-gray-500 focus-within:ring-1 focus-within:ring-blue-600';
|
|
if ($this->attributes['class'] !== '') {
|
|
$editorClass .= ' ' . $this->attributes['class'];
|
|
unset($this->attributes['class']);
|
|
}
|
|
|
|
$this->attributes['class'] = 'border-none outline-none focus:border-none focus:outline-none w-full h-full';
|
|
|
|
return '<div class="' . $editorClass . '">' .
|
|
'<header class="sticky top-0 z-20 flex flex-wrap justify-between bg-white border-b border-gray-500">' .
|
|
'<markdown-write-preview for="' . $this->attributes['id'] . '" class="relative inline-flex h-8">' .
|
|
'<button type="button" slot="write" class="px-2 font-semibold focus:outline-none focus:ring-inset focus:ring-2 focus:ring-pine-600">' . lang(
|
|
'Common.forms.editor.write'
|
|
) . '</button>' .
|
|
'<button type="button" slot="preview" class="px-2 focus:outline-none focus:ring-inset focus:ring-2 focus:ring-pine-600">' . lang(
|
|
'Common.forms.editor.preview'
|
|
) . '</button>' .
|
|
'</markdown-write-preview>' .
|
|
'<markdown-toolbar for="' . $this->attributes['id'] . '" class="flex gap-4 px-2 py-1">' .
|
|
'<div class="inline-flex text-2xl gap-x-1">' .
|
|
'<md-header class="opacity-50 hover:opacity-100 focus:outline-none focus:ring-2 focus:opacity-100 focus:ring-pine-600">' . icon(
|
|
'heading'
|
|
) . '</md-header>' .
|
|
'<md-bold class="opacity-50 hover:opacity-100 focus:outline-none focus:ring-2 focus:opacity-100 focus:ring-pine-600">' . icon(
|
|
'bold'
|
|
) . '</md-bold>' .
|
|
'<md-italic class="opacity-50 hover:opacity-100 focus:outline-none focus:ring-2 focus:opacity-100 focus:ring-pine-600">' . icon(
|
|
'italic'
|
|
) . '</md-italic>' .
|
|
'</div>' .
|
|
'<div class="inline-flex text-2xl gap-x-1">' .
|
|
'<md-unordered-list class="opacity-50 hover:opacity-100 focus:outline-none focus:ring-2 focus:opacity-100 focus:ring-pine-600">' . icon(
|
|
'list-unordered'
|
|
) . '</md-unordered-list>' .
|
|
'<md-ordered-list class="opacity-50 hover:opacity-100 focus:outline-none focus:ring-2 focus:opacity-100 focus:ring-pine-600">' . icon(
|
|
'list-ordered'
|
|
) . '</md-ordered-list>' .
|
|
'</div>' .
|
|
'<div class="inline-flex text-2xl gap-x-1">' .
|
|
'<md-quote class="opacity-50 hover:opacity-100 focus:outline-none focus:ring-2 focus:opacity-100 focus:ring-pine-600">' . icon(
|
|
'quote'
|
|
) . '</md-quote>' .
|
|
'<md-link class="opacity-50 hover:opacity-100 focus:outline-none focus:ring-2 focus:opacity-100 focus:ring-pine-600">' . icon(
|
|
'link'
|
|
) . '</md-link>' .
|
|
'<md-image class="opacity-50 hover:opacity-100 focus:outline-none focus:ring-2 focus:opacity-100 focus:ring-pine-600">' . icon(
|
|
'image-add'
|
|
) . '</md-image>' .
|
|
'</div>' .
|
|
'</markdown-toolbar>' .
|
|
'</header>' .
|
|
'<div class="relative">' .
|
|
form_textarea($this->attributes, $this->slot) .
|
|
'<markdown-preview for="' . $this->attributes['id'] . '" class="absolute top-0 left-0 hidden w-full h-full p-2 overflow-y-auto prose bg-gray-50" showClass="bg-white"></markdown-preview>' .
|
|
'</div>' .
|
|
'<footer class="flex px-2 py-1 bg-gray-100 border-t">' .
|
|
'<a href="https://commonmark.org/help/" class="inline-flex items-center text-xs font-semibold text-gray-500 hover:text-gray-700" target="_blank" rel="noopener noreferrer">' . icon(
|
|
'markdown',
|
|
'mr-1 text-lg text-gray-400'
|
|
) . lang('Common.forms.editor.help') . '</a>' .
|
|
'</footer>' .
|
|
'</div>';
|
|
}
|
|
}
|