I think I kinda like this new view transition API 😍

This commit is contained in:
Chris Kruining 2024-11-05 16:16:13 +01:00
parent 6e41abdf46
commit dc30ebb35e
No known key found for this signature in database
GPG key ID: EB894A3560CCCAD2
2 changed files with 75 additions and 9 deletions

View file

@ -1,10 +1,9 @@
import { Link, Title } from "@solidjs/meta"; import { Link, Title } from "@solidjs/meta";
import { createEffect, createMemo, createSignal, ParentProps, Show } from "solid-js"; import { Component, createMemo, createSignal, ErrorBoundary, ParentProps, Show } from "solid-js";
import { BsTranslate } from "solid-icons/bs"; import { BsTranslate } from "solid-icons/bs";
import { FilesProvider } from "~/features/file"; import { FilesProvider } from "~/features/file";
import { CommandPalette, CommandPaletteApi, Menu, MenuProvider } from "~/features/menu"; import { CommandPalette, CommandPaletteApi, Menu, MenuProvider } from "~/features/menu";
import { isServer } from "solid-js/web"; import { A, createAsync, useBeforeLeave } from "@solidjs/router";
import { A, createAsync } from "@solidjs/router";
import { createCommand, Modifier } from "~/features/command"; import { createCommand, Modifier } from "~/features/command";
import { ColorScheme, ColorSchemePicker, getColorScheme } from "~/components/colorschemepicker"; import { ColorScheme, ColorSchemePicker, getColorScheme } from "~/components/colorschemepicker";
import css from "./editor.module.css"; import css from "./editor.module.css";
@ -20,13 +19,24 @@ export default function Editor(props: ParentProps) {
[ColorScheme.Dark]: '#333', [ColorScheme.Dark]: '#333',
}[ColorScheme[storedColorScheme()]])); }[ColorScheme[storedColorScheme()]]));
const supported = isServer || typeof window.showDirectoryPicker === 'function';
const commands = [ const commands = [
createCommand('open command palette', () => { createCommand('open command palette', () => {
commandPalette()?.show(); commandPalette()?.show();
}, { key: 'p', modifier: Modifier.Control | Modifier.Shift }), }, { key: 'p', modifier: Modifier.Control | Modifier.Shift }),
]; ];
const transition = (done: () => void) => {
if (!document.startViewTransition) { return done() }
const transition = document.startViewTransition(done)
}
useBeforeLeave((e) => {
e.preventDefault()
transition(() => { e.retry(true) })
});
return <MenuProvider commands={commands}> return <MenuProvider commands={commands}>
<Title>Calque</Title> <Title>Calque</Title>
@ -53,13 +63,19 @@ export default function Editor(props: ParentProps) {
</section> </section>
</nav> </nav>
<Show when={supported} fallback={<span>too bad, so sad. Your browser does not support the File Access API</span>}> <section>
<FilesProvider> <ErrorBoundary fallback={err => <ErrorComp error={err.message} />}>
{props.children} <FilesProvider>
</FilesProvider> {props.children}
</Show> </FilesProvider>
</ErrorBoundary>
</section>
</main> </main>
<CommandPalette api={setCommandPalette} /> <CommandPalette api={setCommandPalette} />
</MenuProvider> </MenuProvider>
} }
const ErrorComp: Component<{ error: string }> = (props) => {
return <div class={css.error}>{props.error}</div>
};

View file

@ -7,6 +7,7 @@
background-color: var(--surface-1); background-color: var(--surface-1);
.menu { .menu {
view-transition-name: menu;
display: grid; display: grid;
grid-template-columns: auto minmax(0, 1fr) auto; grid-template-columns: auto minmax(0, 1fr) auto;
grid-auto-flow: column; grid-auto-flow: column;
@ -48,4 +49,53 @@
align-content: center; align-content: center;
} }
} }
& > section {
view-transition-name: content;
}
}
.error {
display: grid;
place-content: center;
background-color: color(from var(--fail) xyz x y z / .3);
color: var(--text-2);
border: 1px solid var(--fail);
border-radius: var(--radii-m);
margin: var(--padding-l);
}
@keyframes slide-left {
from {
translate: 0% 0;
}
to {
translate: -100% 0;
}
}
@keyframes slide-right {
from {
translate: 100% 0;
}
to {
translate: 0% 0;
}
}
/* ::view-transition-old(menu),
::view-transition-new(menu) {
z-index: 1;
} */
::view-transition-old(content) {
animation-name: slide-left;
}
::view-transition-new(content) {
animation-name: slide-right;
} }