Spaces:
Runtime error
Runtime error
Ron Au
commited on
Commit
·
2cfd477
1
Parent(s):
d400a31
feat(ui): Scroll notes into view on first time
Browse files
source/ui/src/lib/Notes.svelte
CHANGED
|
@@ -4,6 +4,8 @@ import { fade } from 'svelte/transition';
|
|
| 4 |
import { audioBlob, notesImage, style } from './stores';
|
| 5 |
import { styles } from './config.json';
|
| 6 |
|
|
|
|
|
|
|
| 7 |
let currentTime: number;
|
| 8 |
let duration: number;
|
| 9 |
let paused = true;
|
|
@@ -29,6 +31,8 @@ onMount(() => {
|
|
| 29 |
currentTime = 0;
|
| 30 |
});
|
| 31 |
}
|
|
|
|
|
|
|
| 32 |
});
|
| 33 |
|
| 34 |
afterUpdate((): void => {
|
|
@@ -57,46 +61,44 @@ const touchMove = (event: TouchEvent): void => {
|
|
| 57 |
currentTime = (duration * (event.touches[0].clientX - left)) / (right - left);
|
| 58 |
};
|
| 59 |
|
| 60 |
-
const keyDown = (
|
| 61 |
-
|
| 62 |
|
| 63 |
-
if (
|
| 64 |
paused = !paused;
|
| 65 |
}
|
| 66 |
-
if (
|
| 67 |
currentTime = currentTime >= 1 ? currentTime - 1 : 0;
|
| 68 |
}
|
| 69 |
-
if (
|
| 70 |
currentTime = currentTime <= duration - 1 ? currentTime + 1 : duration;
|
| 71 |
}
|
| 72 |
};
|
| 73 |
</script>
|
| 74 |
|
| 75 |
-
{
|
| 76 |
-
<
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
</section>
|
| 99 |
-
{/if}
|
| 100 |
|
| 101 |
<style>
|
| 102 |
section {
|
|
|
|
| 4 |
import { audioBlob, notesImage, style } from './stores';
|
| 5 |
import { styles } from './config.json';
|
| 6 |
|
| 7 |
+
let section: HTMLElement;
|
| 8 |
+
|
| 9 |
let currentTime: number;
|
| 10 |
let duration: number;
|
| 11 |
let paused = true;
|
|
|
|
| 31 |
currentTime = 0;
|
| 32 |
});
|
| 33 |
}
|
| 34 |
+
|
| 35 |
+
section.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
| 36 |
});
|
| 37 |
|
| 38 |
afterUpdate((): void => {
|
|
|
|
| 61 |
currentTime = (duration * (event.touches[0].clientX - left)) / (right - left);
|
| 62 |
};
|
| 63 |
|
| 64 |
+
const keyDown = (event: KeyboardEvent): void => {
|
| 65 |
+
event.preventDefault();
|
| 66 |
|
| 67 |
+
if (event.code === 'Space') {
|
| 68 |
paused = !paused;
|
| 69 |
}
|
| 70 |
+
if (event.code === 'ArrowLeft') {
|
| 71 |
currentTime = currentTime >= 1 ? currentTime - 1 : 0;
|
| 72 |
}
|
| 73 |
+
if (event.code === 'ArrowRight') {
|
| 74 |
currentTime = currentTime <= duration - 1 ? currentTime + 1 : duration;
|
| 75 |
}
|
| 76 |
};
|
| 77 |
</script>
|
| 78 |
|
| 79 |
+
<section bind:this={section} transition:fade>
|
| 80 |
+
<img class="notes" src={$notesImage} alt="" bind:this={visualisation} />
|
| 81 |
+
<div
|
| 82 |
+
bind:this={player}
|
| 83 |
+
class="player"
|
| 84 |
+
style:width={imageWidth + 'px'}
|
| 85 |
+
style:height={imageHeight + 'px'}
|
| 86 |
+
on:mousemove={mouseMove}
|
| 87 |
+
on:touchmove|preventDefault={touchMove}
|
| 88 |
+
on:keydown={keyDown}
|
| 89 |
+
on:click={() => (paused = !paused)}
|
| 90 |
+
tabindex="0"
|
| 91 |
+
>
|
| 92 |
+
<audio bind:currentTime bind:duration bind:paused src={$audioBlob} />
|
| 93 |
+
<div class="handle" style:transform="translate({imageWidth * (currentTime / duration)}px, -2%)" />
|
| 94 |
+
{#if paused}
|
| 95 |
+
<img class="play-button" src="static/play.svg" alt="Play button" draggable="false" transition:fade />
|
| 96 |
+
{/if}
|
| 97 |
+
</div>
|
| 98 |
+
<a href={$audioBlob} download={`${styles[$style]} Composition - AI Guru ft. Hugging Face.wav`} class="download"
|
| 99 |
+
>Download</a
|
| 100 |
+
>
|
| 101 |
+
</section>
|
|
|
|
|
|
|
| 102 |
|
| 103 |
<style>
|
| 104 |
section {
|
source/ui/src/routes/index.svelte
CHANGED
|
@@ -5,6 +5,7 @@ import TemperatureOptions from '$lib/TemperatureOptions.svelte';
|
|
| 5 |
import ComposeButton from '$lib/ComposeButton.svelte';
|
| 6 |
import Notes from '$lib/Notes.svelte';
|
| 7 |
import Tokens from '$lib/Tokens.svelte';
|
|
|
|
| 8 |
</script>
|
| 9 |
|
| 10 |
<main>
|
|
@@ -25,8 +26,10 @@ import Tokens from '$lib/Tokens.svelte';
|
|
| 25 |
<TemperatureOptions />
|
| 26 |
</section>
|
| 27 |
<ComposeButton />
|
| 28 |
-
|
| 29 |
-
|
|
|
|
|
|
|
| 30 |
</main>
|
| 31 |
|
| 32 |
<style>
|
|
|
|
| 5 |
import ComposeButton from '$lib/ComposeButton.svelte';
|
| 6 |
import Notes from '$lib/Notes.svelte';
|
| 7 |
import Tokens from '$lib/Tokens.svelte';
|
| 8 |
+
import { audioBlob } from '$lib/stores';
|
| 9 |
</script>
|
| 10 |
|
| 11 |
<main>
|
|
|
|
| 26 |
<TemperatureOptions />
|
| 27 |
</section>
|
| 28 |
<ComposeButton />
|
| 29 |
+
{#if $audioBlob}
|
| 30 |
+
<Notes />
|
| 31 |
+
<Tokens />
|
| 32 |
+
{/if}
|
| 33 |
</main>
|
| 34 |
|
| 35 |
<style>
|