2024-06-23 18:33:22 +00:00
|
|
|
<div wire:key="{{ rand() }}" class="coolify-monaco-editor flex-1">
|
2024-06-24 09:21:39 +00:00
|
|
|
<div x-ref="monacoRef" x-data="{
|
2024-06-23 18:33:22 +00:00
|
|
|
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() {
|
2024-06-24 09:21:39 +00:00
|
|
|
document.getElementById(this.monacoId).dispatchEvent(new CustomEvent('monaco-editor-focused', { detail: { monacoId: this.monacoId } }));
|
2024-06-23 18:33:22 +00:00
|
|
|
},
|
|
|
|
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);
|
|
|
|
}
|
2024-06-24 09:21:39 +00:00
|
|
|
}" x-modelable="monacoContent">
|
|
|
|
<div x-cloak x-init="if (typeof _amdLoaderGlobal == 'undefined') {
|
2024-06-23 18:33:22 +00:00
|
|
|
monacoEditorAddLoaderScriptToHead();
|
|
|
|
}
|
2024-06-24 09:21:39 +00:00
|
|
|
checkTheme();
|
2024-06-23 18:33:22 +00:00
|
|
|
let monacoLoaderInterval = setInterval(() => {
|
2024-06-24 09:21:39 +00:00
|
|
|
if (typeof _amdLoaderGlobal !== 'undefined') {
|
|
|
|
require.config({ paths: { 'vs': 'https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.39.0/min/vs' } });
|
2024-06-23 18:33:22 +00:00
|
|
|
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', {
|
2024-06-24 09:21:39 +00:00
|
|
|
'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'
|
2024-06-23 18:33:22 +00:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
const editor = monaco.editor.create($refs.monacoEditorElement, {
|
|
|
|
value: monacoContent,
|
2024-06-24 09:21:39 +00:00
|
|
|
theme: editorTheme,
|
|
|
|
wordWrap: 'on',
|
|
|
|
readOnly: '{{ $readonly ?? false }}',
|
|
|
|
minimap: { enabled: false },
|
2024-06-23 18:33:22 +00:00
|
|
|
fontSize: monacoFontSize,
|
|
|
|
lineNumbersMinChars: 3,
|
|
|
|
automaticLayout: true,
|
2024-06-24 09:21:39 +00:00
|
|
|
language: '{{ $language }}'
|
2024-06-23 18:33:22 +00:00
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
}
|
2024-06-24 09:21:39 +00:00
|
|
|
}, 5);" :id="monacoId">
|
2024-06-23 18:33:22 +00:00
|
|
|
</div>
|
2024-06-24 09:21:39 +00:00
|
|
|
<div class="relative z-10 w-full h-full">
|
2024-06-23 18:33:22 +00:00
|
|
|
<div x-ref="monacoEditorElement" class="w-full h-96 text-md"></div>
|
|
|
|
<div x-ref="monacoPlaceholderElement" x-show="monacoPlaceholder" @click="monacoEditorFocus()"
|
2024-06-24 09:21:39 +00:00
|
|
|
: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>
|
2024-06-23 18:33:22 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|