Skip to content

Commit 5bb226e

Browse files
committed
simplify everything
1 parent 5a635e6 commit 5bb226e

File tree

3 files changed

+37
-63
lines changed

3 files changed

+37
-63
lines changed

packages/editor/src/lib/Workspace.svelte.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ export class Workspace {
206206
if (is_file(item)) {
207207
this.#select(item);
208208
this.#onreset?.(this.#files);
209+
210+
this.modified[item.name] = true;
209211
}
210212

211213
return item;
@@ -320,6 +322,11 @@ export class Workspace {
320322
this.#select(new_item as File);
321323
}
322324

325+
if (this.modified[previous.name]) {
326+
delete this.modified[previous.name];
327+
this.modified[name] = true;
328+
}
329+
323330
this.#onreset?.(this.#files);
324331
}
325332

packages/editor/src/lib/codemirror.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
height: 100%;
99

1010
&.cm-focused {
11+
outline: none;
12+
1113
.cm-cursor {
1214
border-left-color: var(--sk-fg-3);
1315
}

packages/repl/src/lib/Input/ComponentSelector.svelte

Lines changed: 28 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
<script lang="ts">
2-
import { forcefocus } from '@sveltejs/site-kit/actions';
3-
import { tick } from 'svelte';
42
import RunesInfo from './RunesInfo.svelte';
53
import Migrate from './Migrate.svelte';
64
import type { Workspace, File } from 'editor';
@@ -14,39 +12,18 @@
1412
1513
let { runes, onchange, workspace, can_migrate }: Props = $props();
1614
17-
let editing_name: string | null = $state(null);
18-
let input_value = $state('');
15+
let input_value = $state(workspace.current.name);
1916
20-
function select_file(filename: string) {
21-
if (workspace.current.name !== filename) {
22-
editing_name = null;
23-
workspace.select(filename);
24-
}
25-
}
26-
27-
function edit_tab(file: File) {
28-
if (workspace.current.name === file.name) {
29-
editing_name = file.name;
30-
input_value = file.name;
31-
}
32-
}
33-
34-
async function close_edit() {
35-
if (input_value === editing_name) {
17+
async function close_edit(file: File) {
18+
if (input_value === file.name) {
3619
// nothing to do
37-
editing_name = null;
3820
return;
3921
}
4022
41-
const edited_file = (workspace.files as File[]).find((val) => val.name === editing_name);
42-
if (!edited_file) return; // TODO can this happen?
23+
const deconflicted = deconflict(input_value, file);
4324
44-
const deconflicted = deconflict(input_value, edited_file);
45-
46-
workspace.rename(edited_file, deconflicted);
25+
workspace.rename(file, deconflicted);
4726
workspace.focus();
48-
49-
editing_name = null;
5027
}
5128
5229
function deconflict(name: string, file?: File) {
@@ -81,9 +58,7 @@
8158
text: true
8259
});
8360
84-
editing_name = file.name;
8561
input_value = file.name;
86-
8762
onchange();
8863
}
8964
@@ -97,16 +72,18 @@
9772
<div class="file-tabs">
9873
{#each workspace.files as File[] as file, index (file.name)}
9974
<div
100-
id={file.name}
10175
class="button"
10276
role="button"
10377
tabindex="0"
104-
class:active={file.name === workspace.current.name}
105-
class:draggable={file.name !== editing_name && index !== 0}
78+
class:active={file === workspace.current}
79+
class:draggable={file !== workspace.current && index !== 0}
10680
class:drag-over={file === dragover}
107-
onclick={() => select_file(file.name)}
108-
onkeyup={(e) => e.key === ' ' && select_file(file.name)}
109-
draggable={file.name !== editing_name}
81+
onclick={() => {
82+
workspace.select(file.name);
83+
input_value = file.name;
84+
}}
85+
onkeyup={(e) => e.key === ' ' && workspace.select(file.name)}
86+
draggable={file !== workspace.current}
11087
ondragstart={() => (dragging = file)}
11188
ondragover={(e) => (e.preventDefault(), (dragover = file))}
11289
ondragleave={(e) => (e.preventDefault(), (dragover = null))}
@@ -120,42 +97,30 @@
12097
>
12198
<i class="drag-handle"></i>
12299

123-
{#if file.name === 'App.svelte'}
124-
<div class="uneditable">
125-
App.svelte{#if workspace.modified[file.name]}*{/if}
126-
</div>
127-
{:else if file.name === editing_name}
128-
<span class="input-sizer">
129-
<span style="color: transparent">{input_value}</span>
130-
</span>
100+
<span class:editable={file.name !== 'App.svelte'}>
101+
{(file === workspace.current && file.name !== 'App.svelte' ? input_value : file.name) +
102+
(workspace.modified[file.name] ? '*' : '')}
103+
</span>
131104

105+
{#if file === workspace.current && file.name !== 'App.svelte'}
132106
<!-- svelte-ignore a11y_autofocus -->
133107
<input
134-
use:forcefocus
135108
spellcheck={false}
136109
bind:value={input_value}
137110
onfocus={async (event) => {
138111
const input = event.currentTarget;
139-
await tick();
140-
input.select();
112+
setTimeout(() => {
113+
input.select();
114+
});
141115
}}
142-
onblur={close_edit}
116+
onblur={() => close_edit(file)}
143117
onkeydown={(e) => {
144118
if (e.key === 'Enter') {
145119
e.preventDefault();
146120
e.currentTarget.blur();
147121
}
148122
}}
149123
/>
150-
{:else}
151-
<div
152-
class="editable"
153-
title="edit component name"
154-
onclick={() => edit_tab(file)}
155-
onkeyup={(e) => e.key === ' ' && edit_tab(file)}
156-
>
157-
{file.name}{#if workspace.modified[file.name]}*{/if}
158-
</div>
159124

160125
<span
161126
class="remove"
@@ -264,9 +229,9 @@
264229
position: absolute;
265230
width: 100%;
266231
border: none;
267-
color: var(--sk-fg-accent);
268232
outline: none;
269-
background-color: transparent;
233+
background-color: inherit;
234+
color: inherit;
270235
top: 0;
271236
left: 0;
272237
height: 100%;
@@ -275,12 +240,12 @@
275240
justify-content: center;
276241
font-family: var(--sk-font-family-ui);
277242
font: var(--sk-font-ui-small); /* TODO can we just inherit */
278-
padding: 0 1rem 1px 2em;
243+
padding: 0 1rem 0 2em;
279244
box-sizing: border-box;
280-
}
281245
282-
.duplicate {
283-
color: var(--sk-fg-accent);
246+
&:focus {
247+
color: var(--sk-fg-accent);
248+
}
284249
}
285250
286251
.remove {

0 commit comments

Comments
 (0)