force focus border for TemplateEditor

This commit is contained in:
Diego Imbert
2025-09-19 11:44:47 +02:00
parent 22999e53fd
commit a95c566ee3
2 changed files with 29 additions and 11 deletions
@@ -26,6 +26,7 @@
import EditorTheme from './EditorTheme.svelte'
import FakeMonacoPlaceHolder from './FakeMonacoPlaceHolder.svelte'
import { setMonacoJsonOptions } from './monacoLanguagesOptions'
import { inputBorderClass } from './text_input/TextInput.svelte'
export const conf = {
wordPattern:
@@ -505,10 +506,12 @@
editor.onDidFocusEditorText(() => {
dispatch('focus')
isFocus = true
})
editor.onDidBlurEditorText(() => {
dispatch('blur')
isFocus = false
updateCode()
})
@@ -604,6 +607,7 @@
editor?.focus()
}
let isFocus = false
let mounted = false
let loadTimeout: number | undefined = undefined
onMount(async () => {
@@ -661,16 +665,14 @@
{code}
lineNumbersWidth={14}
lineNumbersOffset={-20}
class="border template nonmain-editor rounded min-h-4 bg-surface-secondary !py-[8px] mx-0.5 overflow-clip"
class="template nonmain-editor rounded min-h-4 bg-surface-secondary !py-[8px] mx-0.5 overflow-clip"
/>
{/if}
<div
bind:this={divEl}
style="height: 18px; padding-left: 8px;"
class="{$$props.class ??
''} border template nonmain-editor rounded min-h-4 mx-0.5 overflow-clip {!editor
? 'hidden'
: ''}"
class="{inputBorderClass({ forceFocus: isFocus })} {$$props.class ??
''} template nonmain-editor rounded min-h-4 mx-0.5 overflow-clip {!editor ? 'hidden' : ''}"
bind:clientWidth={width}
></div>
@@ -1,3 +1,23 @@
<script module lang="ts">
export function inputBorderClass({
error,
forceFocus
}: {
error?: boolean
forceFocus?: boolean
} = {}) {
return twMerge(
'transition-colors border',
forceFocus
? '!border-nord-900 dark:!border-nord-900'
: '!border-transparent focus:!border-nord-900 dark:focus:!border-nord-900 hover:!border-nord-400 dark:hover:!border-nord-300',
error
? '!border-red-300 focus:!border-red-400 hover:!border-red-500 dark:!border-red-400/40 dark:hover:!border-red-600/40'
: '!border-transparent'
)
}
</script>
<script lang="ts">
import type { HTMLInputAttributes } from 'svelte/elements'
import { twMerge } from 'tailwind-merge'
@@ -16,15 +36,11 @@
{...inputProps}
class={twMerge(
// TODO Make tailwind classes for every color
'!bg-surface-secondary !border-transparent !shadow-none !py-2 !px-4',
'!bg-surface-secondary !shadow-none !py-2 !px-4',
'focus:!ring-0',
'[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none',
'!rounded-md',
'transition-colors',
'focus:!border-nord-900 dark:focus:!border-nord-900 hover:!border-nord-400 dark:hover:!border-nord-300',
error
? '!border-red-300 focus:!border-red-400 hover:!border-red-500 dark:!border-red-400/40 dark:hover:!border-red-600/40'
: '!border-transparent',
inputBorderClass({ error: !!error }),
className
)}
bind:value