{% macro includeJs(fieldId, fieldType = "CodeEditor", monacoOptions = {}, codeEditorOptions = {}) %}
    {% set codeEditorOptions =  {
        singleLineEditor: false,
        wrapperClass: '',
        placeholderText: '',
        displayLanguageIcon: true,
    } | merge(codeEditorOptions) %}
    {% set monacoOptions =  {
        ariaLabel: 'Code Editor field.'|t('codeeditor'),
    } | merge(monacoOptions) %}
    {% set monacoOptions = monacoOptions|merge({
        ariaLabel: (monacoOptions.ariaLabel ?? '' ~ 'Code Editor field.'|t('codeeditor'))|trim,
    }) %}
    {# @var \craft\web\AssetBundle bundle #}
    {% set bundle = view.registerAssetBundle("nystudio107\\codeeditor\\assetbundles\\codeeditor\\CodeEditorAsset") %}
    {% css %}
        @font-face {
        font-family: "codicon-override";
        src: url("{{ bundle.baseUrl }}/fonts/codicon.ttf") format("truetype");
        }
    {% endcss %}
    {% js at head %}
        window.codeEditorBaseAssetsUrl = "{{ bundle.baseUrl }}/";
    {% endjs %}
    {% js %}
        makeMonacoEditor("{{ (fieldId)|namespaceInputId }}", "{{ fieldType }}", '{{ monacoOptions | json_encode | e('js') }}', '{{ codeEditorOptions | json_encode | e('js') }}', "{{ alias('@codeEditorEndpointUrl') }}");
    {% endjs %}
{% endmacro %}

{% macro textareaField(config, fieldType = "CodeEditor", monacoOptions = {}, codeEditorOptions = {}) %}
    {% import "_includes/forms" as forms %}
    {% set config = config|merge({id: config.id ?? "code-editor#{random()}"}) %}
    {{ forms.textareaField(config) }}
    {% set codeEditorOptions =  {
        placeholderText: config.placeholder ?? '',
    } | merge(codeEditorOptions) %}
    {{ _self.includeJs(config.id, fieldType, monacoOptions, codeEditorOptions) }}
{% endmacro %}

{% macro textarea(config, fieldType = "CodeEditor", monacoOptions = {}, codeEditorOptions = {}) %}
    {% import "_includes/forms" as forms %}
    {% set config = config|merge({id: config.id ?? "code-editor#{random()}"}) %}
    {{ forms.textarea(config) }}
    {% set codeEditorOptions =  {
        placeholderText: config.placeholder ?? '',
    } | merge(codeEditorOptions) %}
    {{ _self.includeJs(config.id, fieldType, monacoOptions, codeEditorOptions) }}
{% endmacro %}

{% macro textField(config, fieldType = "CodeEditor", monacoOptions = {}, codeEditorOptions = {}) %}
    {% import "_includes/forms" as forms %}
    {% set config = config|merge({id: config.id ?? "code-editor#{random()}"}) %}
    {{ forms.textField(config) }}
    {% set codeEditorOptions =  {
        singleLineEditor: true,
        placeholderText: config.placeholder ?? '',
    } | merge(codeEditorOptions) %}
    {{ _self.includeJs(config.id, fieldType, monacoOptions, codeEditorOptions) }}
{% endmacro %}

{% macro text(config, fieldType = "CodeEditor", monacoOptions = {}, codeEditorOptions = {}) %}
    {% import "_includes/forms" as forms %}
    {% set config = config|merge({id: config.id ?? "code-editor#{random()}"}) %}
    {{ forms.text(config) }}
    {% set codeEditorOptions =  {
        singleLineEditor: true,
        placeholderText: config.placeholder ?? '',
    } | merge(codeEditorOptions) %}
    {{ _self.includeJs(config.id, fieldType, monacoOptions, codeEditorOptions) }}
{% endmacro %}
