Skip to content

Commit ea233a6

Browse files
committed
✨ Improve dialog item reactivity
1 parent 7848599 commit ea233a6

File tree

4 files changed

+33
-52
lines changed

4 files changed

+33
-52
lines changed

src/components/customCodeJar.svelte

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
44
export let value: string
55
export let placeholder: string | undefined = undefined
6+
export let style: string | undefined = undefined
67
export let syntax: string | undefined = undefined
78
89
let codeJarElement: HTMLPreElement | undefined
@@ -26,12 +27,13 @@
2627
}
2728
}
2829
29-
const forceNoWrap = () => {
30+
const forceNoWrap = (_?: HTMLElement) => {
3031
if (!codeJarElement) return
3132
codeJarElement.style.overflowWrap = 'unset'
3233
codeJarElement.style.whiteSpace = 'pre'
3334
}
3435
36+
$: codeJarElement && forceNoWrap()
3537
$: value !== undefined && forceNoWrap()
3638
</script>
3739

@@ -45,7 +47,7 @@
4547
preserveIdent
4648
history
4749
class={'language-' + (syntax ?? 'plaintext')}
48-
style="
50+
style={`
4951
font-family: var(--font-code);
5052
font-size: 14px;
5153
padding: 3px 6px;
@@ -61,8 +63,9 @@
6163
border: 1px solid var(--color-border);
6264
border-radius: 0;
6365
text-shadow: 0px 1px rgba(0, 0, 0, 0.3);
64-
"
66+
` + style}
6567
/>
68+
<div use:forceNoWrap />
6669
{#if placeholder && (!value || value.length === 0)}
6770
<div class="placeholder">{placeholder}</div>
6871
{/if}

src/components/dialogItems/codeInput.svelte

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script lang="ts">
2-
import { CodeJar } from '@novacbn/svelte-codejar'
32
import { onDestroy } from 'svelte'
43
import { Valuable } from '../../util/stores'
4+
import CustomCodeJar from '../customCodeJar.svelte'
55
import BaseDialogItem from './baseDialogItem.svelte'
66
77
export let label: string
@@ -18,25 +18,12 @@
1818
let warningText = ''
1919
let errorText = ''
2020
21-
function highlight(code: string, syntax?: string) {
22-
if (!syntax) return code
23-
return Prism.highlight(code, Prism.languages[syntax], syntax)
24-
}
25-
26-
function forceNoWrap() {
27-
if (!codeJarElement) return
28-
codeJarElement.style.overflowWrap = 'unset'
29-
codeJarElement.style.whiteSpace = 'pre'
30-
}
31-
3221
function onValueChange() {
3322
if (valueChecker) {
3423
const result = valueChecker($value)
3524
result.type === 'error' ? (errorText = result.message) : (errorText = '')
3625
result.type === 'warning' ? (warningText = result.message) : (warningText = '')
3726
}
38-
39-
forceNoWrap()
4027
}
4128
4229
const unsub = value.subscribe(() => {
@@ -73,34 +60,12 @@
7360
<label class="name_space_left" for={id}>{label}</label>
7461

7562
<div class="content codejar-container" on:keydown={onKeydown}>
76-
<CodeJar
77-
bind:element={codeJarElement}
63+
<CustomCodeJar
7864
{syntax}
79-
{highlight}
8065
bind:value={$value}
81-
on:change={() => forceNoWrap()}
82-
preserveIdent
83-
history
84-
class={'language-' + (syntax ?? 'plaintext')}
85-
style="
86-
font-family: var(--font-code);
87-
font-size: 14px;
88-
padding: 3px 6px;
89-
max-height: 20em;
90-
height: fit-content;
91-
padding-bottom: 1rem;
92-
width: 100%;
93-
outline: none;
94-
overflow-wrap: unset;
95-
overflow-y: scroll;
96-
white-space: pre;
97-
margin: 8px;
98-
margin-bottom: 0px;
99-
{errorText
66+
style={errorText
10067
? 'border: 1px solid var(--color-error); border-bottom: none; border-radius: 0.3em 0.3em 0 0;'
10168
: 'border: 1px solid var(--color-border);'}
102-
text-shadow: 0px 1px rgba(0, 0, 0, 0.3);
103-
"
10469
/>
10570
{#if errorText || warningText}
10671
<textarea readonly rows={errorText.split('\n').length + 1}

src/components/dialogItems/colorPicker.svelte

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,38 @@
66
77
export let label: string
88
export let tooltip = ''
9+
export let defaultValue = '#ffffff'
910
export let value: Valuable<string>
1011
1112
let colorPicker = new ColorPicker(`${PACKAGE.name}:${label}-color_picker`, {
1213
onChange() {
1314
const color = colorPicker.get() as tinycolor.Instance
14-
value.set(color.toHexString())
15+
$value = color.toHexString()
1516
},
1617
})
17-
let colorPickerMount: HTMLDivElement
1818
19-
function onLoad(el: HTMLDivElement) {
19+
function mountColorPicker(el: HTMLDivElement) {
2020
colorPicker.toElement(el)
21-
colorPicker.set(value.get())
21+
colorPicker.set($value)
2222
}
2323
2424
function onReset() {
25-
value.set('#ffffff')
25+
$value = defaultValue
2626
}
2727
28+
const unsub = value.subscribe(v => {
29+
colorPicker.set(v)
30+
})
31+
2832
onDestroy(() => {
33+
unsub()
2934
colorPicker.delete()
3035
})
3136
</script>
3237

3338
<BaseDialogItem {label} {tooltip} {onReset} let:id>
3439
<div class="dialog_bar form_bar">
3540
<label class="name_space_left" for={id}>{label}</label>
36-
<div bind:this={colorPickerMount} use:onLoad />
41+
<div use:mountColorPicker />
3742
</div>
3843
</BaseDialogItem>

src/components/dialogItems/select.svelte

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
<script lang="ts">
2+
import { onDestroy } from 'svelte'
23
import { Valuable } from '../../util/stores'
34
import BaseDialogItem from './baseDialogItem.svelte'
45
@@ -8,8 +9,6 @@
89
export let defaultOption: string
910
export let value: Valuable<string>
1011
11-
let container: HTMLDivElement
12-
1312
if (!(value.get() || options[value.get()])) value.set(defaultOption)
1413
1514
const SELECT_ELEMENT = new Interface.CustomElements.SelectInput('dialog-select', {
@@ -32,13 +31,22 @@
3231
}
3332
}
3433
35-
requestAnimationFrame(() => {
36-
container.appendChild(SELECT_ELEMENT.node)
34+
const unsub = value.subscribe(v => {
35+
SELECT_ELEMENT.set(v)
36+
})
37+
38+
onDestroy(() => {
39+
unsub()
40+
SELECT_ELEMENT.node.remove()
3741
})
42+
43+
const mountSelect = (node: HTMLDivElement) => {
44+
node.appendChild(SELECT_ELEMENT.node)
45+
}
3846
</script>
3947

4048
<BaseDialogItem {label} {tooltip} {onReset} let:id>
41-
<div bind:this={container} class="dialog_bar form_bar">
49+
<div class="dialog_bar form_bar" use:mountSelect>
4250
<label class="name_space_left" for={id}>{label}</label>
4351
</div>
4452
</BaseDialogItem>

0 commit comments

Comments
 (0)