438 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			438 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<div wire:key="{{ rand() }}" class="coolify-monaco-editor flex-1">
 | 
						|
    <div x-ref="monacoRef" x-data="{
 | 
						|
        monacoContent: @entangle($id),
 | 
						|
        monacoLanguage: '',
 | 
						|
        monacoPlaceholder: true,
 | 
						|
        monacoPlaceholderText: 'Start typing here',
 | 
						|
        monacoLoader: true,
 | 
						|
        monacoFontSize: '15px',
 | 
						|
        monacoId: $id('monaco-editor'),
 | 
						|
        monacoEditor(editor) {
 | 
						|
            editor.onDidChangeModelContent((e) => {
 | 
						|
                this.monacoContent = editor.getValue();
 | 
						|
                this.updatePlaceholder(editor.getValue());
 | 
						|
            });
 | 
						|
            editor.onDidBlurEditorWidget(() => {
 | 
						|
                this.updatePlaceholder(editor.getValue());
 | 
						|
            });
 | 
						|
            editor.onDidFocusEditorWidget(() => {
 | 
						|
                this.updatePlaceholder(editor.getValue());
 | 
						|
            });
 | 
						|
        },
 | 
						|
        updatePlaceholder(value) {
 | 
						|
            this.monacoPlaceholder = value === '';
 | 
						|
        },
 | 
						|
        monacoEditorFocus() {
 | 
						|
            document.getElementById(this.monacoId).dispatchEvent(new CustomEvent('monaco-editor-focused', { detail: { monacoId: this.monacoId } }));
 | 
						|
        },
 | 
						|
        monacoEditorAddLoaderScriptToHead() {
 | 
						|
            let script = document.createElement('script');
 | 
						|
            script.src = 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.39.0/min/vs/loader.min.js';
 | 
						|
            document.head.appendChild(script);
 | 
						|
        }
 | 
						|
    }" x-modelable="monacoContent">
 | 
						|
        <div x-cloak x-init="if (typeof _amdLoaderGlobal == 'undefined') {
 | 
						|
            monacoEditorAddLoaderScriptToHead();
 | 
						|
        }
 | 
						|
        checkTheme();
 | 
						|
        let monacoLoaderInterval = setInterval(() => {
 | 
						|
            if (typeof _amdLoaderGlobal !== 'undefined') {
 | 
						|
                require.config({ paths: { 'vs': 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.39.0/min/vs' } });
 | 
						|
                let proxy = URL.createObjectURL(new Blob([` self.MonacoEnvironment = { baseUrl: 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.39.0/min' }; importScripts('https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.39.0/min/vs/base/worker/workerMain.min.js');`], { type: 'text/javascript' }));
 | 
						|
                window.MonacoEnvironment = { getWorkerUrl: () => proxy };
 | 
						|
                require(['vs/editor/editor.main'], () => {
 | 
						|
                    monaco.editor.defineTheme('blackboard', {
 | 
						|
                        'base': 'vs-dark',
 | 
						|
                        'inherit': true,
 | 
						|
                        'rules': [{
 | 
						|
                                'background': editorBackground,
 | 
						|
                                'token': ''
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '959da5',
 | 
						|
                                'token': 'comment'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '959da5',
 | 
						|
                                'token': 'punctuation.definition.comment'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '959da5',
 | 
						|
                                'token': 'string.comment'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'constant'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'entity.name.constant'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'variable.other.constant'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'variable.language'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'b392f0',
 | 
						|
                                'token': 'entity'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'b392f0',
 | 
						|
                                'token': 'entity.name'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'f6f8fa',
 | 
						|
                                'token': 'variable.parameter.function'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '7bcc72',
 | 
						|
                                'token': 'entity.name.tag'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'ea4a5a',
 | 
						|
                                'token': 'keyword'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'ea4a5a',
 | 
						|
                                'token': 'storage'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'ea4a5a',
 | 
						|
                                'token': 'storage.type'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'f6f8fa',
 | 
						|
                                'token': 'storage.modifier.package'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'f6f8fa',
 | 
						|
                                'token': 'storage.modifier.import'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'f6f8fa',
 | 
						|
                                'token': 'storage.type.java'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'token': 'string'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'token': 'punctuation.definition.string'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'token': 'string punctuation.section.embedded source'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'support'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'meta.property-name'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'fb8532',
 | 
						|
                                'token': 'variable'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'f6f8fa',
 | 
						|
                                'token': 'variable.other'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'd73a49',
 | 
						|
                                'fontStyle': 'bold italic underline',
 | 
						|
                                'token': 'invalid.broken'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'd73a49',
 | 
						|
                                'fontStyle': 'bold italic underline',
 | 
						|
                                'token': 'invalid.deprecated'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'fafbfc',
 | 
						|
                                'background': 'd73a49',
 | 
						|
                                'fontStyle': 'italic underline',
 | 
						|
                                'token': 'invalid.illegal'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'fafbfc',
 | 
						|
                                'background': 'd73a49',
 | 
						|
                                'fontStyle': 'italic underline',
 | 
						|
                                'token': 'carriage-return'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'd73a49',
 | 
						|
                                'fontStyle': 'bold italic underline',
 | 
						|
                                'token': 'invalid.unimplemented'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'd73a49',
 | 
						|
                                'token': 'message.error'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'f6f8fa',
 | 
						|
                                'token': 'string source'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'string variable'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'token': 'source.regexp'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'token': 'string.regexp'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'token': 'string.regexp.character-class'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'token': 'string.regexp constant.character.escape'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'token': 'string.regexp source.ruby.embedded'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'token': 'string.regexp string.regexp.arbitrary-repitition'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '7bcc72',
 | 
						|
                                'fontStyle': 'bold',
 | 
						|
                                'token': 'string.regexp constant.character.escape'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'support.constant'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'support.variable'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'meta.module-reference'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'fb8532',
 | 
						|
                                'token': 'markup.list'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '0366d6',
 | 
						|
                                'fontStyle': 'bold',
 | 
						|
                                'token': 'markup.heading'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '0366d6',
 | 
						|
                                'fontStyle': 'bold',
 | 
						|
                                'token': 'markup.heading entity.name'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'markup.quote'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'f6f8fa',
 | 
						|
                                'fontStyle': 'italic',
 | 
						|
                                'token': 'markup.italic'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'f6f8fa',
 | 
						|
                                'fontStyle': 'bold',
 | 
						|
                                'token': 'markup.bold'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'markup.raw'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'b31d28',
 | 
						|
                                'background': 'ffeef0',
 | 
						|
                                'token': 'markup.deleted'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'b31d28',
 | 
						|
                                'background': 'ffeef0',
 | 
						|
                                'token': 'meta.diff.header.from-file'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'b31d28',
 | 
						|
                                'background': 'ffeef0',
 | 
						|
                                'token': 'punctuation.definition.deleted'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '176f2c',
 | 
						|
                                'background': 'f0fff4',
 | 
						|
                                'token': 'markup.inserted'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '176f2c',
 | 
						|
                                'background': 'f0fff4',
 | 
						|
                                'token': 'meta.diff.header.to-file'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '176f2c',
 | 
						|
                                'background': 'f0fff4',
 | 
						|
                                'token': 'punctuation.definition.inserted'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'b08800',
 | 
						|
                                'background': 'fffdef',
 | 
						|
                                'token': 'markup.changed'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'b08800',
 | 
						|
                                'background': 'fffdef',
 | 
						|
                                'token': 'punctuation.definition.changed'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '2f363d',
 | 
						|
                                'background': '959da5',
 | 
						|
                                'token': 'markup.ignored'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '2f363d',
 | 
						|
                                'background': '959da5',
 | 
						|
                                'token': 'markup.untracked'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'b392f0',
 | 
						|
                                'fontStyle': 'bold',
 | 
						|
                                'token': 'meta.diff.range'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'c8e1ff',
 | 
						|
                                'token': 'meta.diff.header'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '0366d6',
 | 
						|
                                'fontStyle': 'bold',
 | 
						|
                                'token': 'meta.separator'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '0366d6',
 | 
						|
                                'token': 'meta.output'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'ffeef0',
 | 
						|
                                'token': 'brackethighlighter.tag'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'ffeef0',
 | 
						|
                                'token': 'brackethighlighter.curly'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'ffeef0',
 | 
						|
                                'token': 'brackethighlighter.round'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'ffeef0',
 | 
						|
                                'token': 'brackethighlighter.square'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'ffeef0',
 | 
						|
                                'token': 'brackethighlighter.angle'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'ffeef0',
 | 
						|
                                'token': 'brackethighlighter.quote'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'd73a49',
 | 
						|
                                'token': 'brackethighlighter.unmatched'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'd73a49',
 | 
						|
                                'token': 'sublimelinter.mark.error'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': 'fb8532',
 | 
						|
                                'token': 'sublimelinter.mark.warning'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '6a737d',
 | 
						|
                                'token': 'sublimelinter.gutter-mark'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'fontStyle': 'underline',
 | 
						|
                                'token': 'constant.other.reference.link'
 | 
						|
                            },
 | 
						|
                            {
 | 
						|
                                'foreground': '79b8ff',
 | 
						|
                                'fontStyle': 'underline',
 | 
						|
                                'token': 'string.other.link'
 | 
						|
                            }
 | 
						|
                        ],
 | 
						|
                        'colors': {
 | 
						|
                            'editor.foreground': '#f6f8fa',
 | 
						|
                            'editor.background': editorBackground,
 | 
						|
                            'editor.selectionBackground': '#4c2889',
 | 
						|
                            'editor.inactiveSelectionBackground': '#444d56',
 | 
						|
                            'editor.lineHighlightBackground': '#444d56',
 | 
						|
                            'editorCursor.foreground': '#ffffff',
 | 
						|
                            'editorWhitespace.foreground': '#6a737d',
 | 
						|
                            'editorIndentGuide.background': '#6a737d',
 | 
						|
                            'editorIndentGuide.activeBackground': '#f6f8fa',
 | 
						|
                            'editor.selectionHighlightBorder': '#444d56'
 | 
						|
                        }
 | 
						|
                    });
 | 
						|
 | 
						|
                    const editor = monaco.editor.create($refs.monacoEditorElement, {
 | 
						|
                        value: monacoContent,
 | 
						|
                        theme: editorTheme,
 | 
						|
                        wordWrap: 'on',
 | 
						|
                        readOnly: '{{ $readonly ?? false }}',
 | 
						|
                        minimap: { enabled: false },
 | 
						|
                        fontSize: monacoFontSize,
 | 
						|
                        lineNumbersMinChars: 3,
 | 
						|
                        automaticLayout: true,
 | 
						|
                        language: '{{ $language }}'
 | 
						|
 | 
						|
                    });
 | 
						|
 | 
						|
                    monacoEditor(editor);
 | 
						|
 | 
						|
                    document.getElementById(monacoId).editor = editor;
 | 
						|
                    document.getElementById(monacoId).addEventListener('monaco-editor-focused', (event) => {
 | 
						|
                        editor.focus();
 | 
						|
                    });
 | 
						|
 | 
						|
                    updatePlaceholder(editor.getValue());
 | 
						|
 | 
						|
                    // Watch for changes in monacoContent from Livewire
 | 
						|
                    $watch('monacoContent', value => {
 | 
						|
                        if (editor.getValue() !== value) {
 | 
						|
                            editor.setValue(value);
 | 
						|
                        }
 | 
						|
                    });
 | 
						|
 | 
						|
 | 
						|
                });
 | 
						|
                clearInterval(monacoLoaderInterval);
 | 
						|
                monacoLoader = false;
 | 
						|
 | 
						|
            }
 | 
						|
        }, 5);" :id="monacoId">
 | 
						|
        </div>
 | 
						|
        <div class="relative z-10 w-full h-full">
 | 
						|
            <div x-ref="monacoEditorElement" class="w-full h-96 text-md"></div>
 | 
						|
            <div x-ref="monacoPlaceholderElement" x-show="monacoPlaceholder" @click="monacoEditorFocus()"
 | 
						|
                :style="'font-size: ' + monacoFontSize"
 | 
						|
                class="w-full text-sm font-mono absolute z-50 text-gray-500 ml-14 -translate-x-0.5 mt-0.5 left-0 top-0"
 | 
						|
                x-text="monacoPlaceholderText"></div>
 | 
						|
        </div>
 | 
						|
    </div>
 | 
						|
</div>
 |