From db29d5dcc0d483cace222231ba0755fa0e212cd9 Mon Sep 17 00:00:00 2001 From: thislight Date: Mon, 12 Aug 2024 17:25:03 +0800 Subject: [PATCH] BottomSheet: first attempt for animation --- bun.lockb | Bin 235946 -> 236309 bytes index.html | 1 + package.json | 3 +- src/App.tsx | 4 +- src/material/BottomSheet.module.css | 5 +++ src/material/BottomSheet.tsx | 65 +++++++++++++++++++++++++++- src/platform/anim.ts | 42 ++++++++++++++++-- src/platform/host.ts | 12 +++++ src/platform/polyfills.ts | 8 ++++ src/timelines/Home.tsx | 50 ++++++++++++++++++--- src/timelines/MediaViewer.tsx | 4 -- src/timelines/TootBottomSheet.tsx | 18 +++++++- src/timelines/TootThread.tsx | 4 +- 13 files changed, 196 insertions(+), 20 deletions(-) create mode 100644 src/platform/host.ts create mode 100644 src/platform/polyfills.ts diff --git a/bun.lockb b/bun.lockb index be11679add9a734b762efc04028879c2d2e61fad..85207b1f00320ff6a328b0386731c22f601daf23 100755 GIT binary patch delta 41839 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 Tutu + diff --git a/package.json b/package.json index 54e32ca..e0b0a54 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "nanostores": "^0.9.5", "solid-js": "^1.8.18", "solid-styled": "^0.11.1", - "stacktrace-js": "^2.0.2" + "stacktrace-js": "^2.0.2", + "web-animations-js": "^2.3.2" }, "packageManager": "bun@1.1.21" } diff --git a/src/App.tsx b/src/App.tsx index 1522795..c3573a5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -22,6 +22,7 @@ const AccountMastodonOAuth2Callback = lazy( ); const TimelineHome = lazy(() => import("./timelines/Home.js")); const Settings = lazy(() => import("./settings/Settings.js")); +const TootBottomSheet = lazy(() => import("./timelines/TootBottomSheet.js")); const Routing: Component = () => { return ( @@ -29,6 +30,7 @@ const Routing: Component = () => { + @@ -53,7 +55,7 @@ const App: Component = () => { ); }); -const UnexpectedError = lazy(() => import("./UnexpectedError.js")) + const UnexpectedError = lazy(() => import("./UnexpectedError.js")); return ( ) { + return { + top: `${top}px`, + left: `${left}px`, + height: `${height}px`, + width: `${width}px`, + }; +} + +const MOVE_SPEED = 1400; // 1400px/s, bottom sheet is big and a bit heavier than small papers + const BottomSheet: ParentComponent = (props) => { let element: HTMLDialogElement; + let animation: Animation | undefined; + const hero = useHeroSignal(HERO); createEffect(() => { if (props.open) { if (!element.open) { element.showModal(); + animateOpen(); } } else { if (element.open) { + if (animation) { + animation.cancel(); + } element.close(); } } }); + const animateOpen = () => { + // Do hero animation + const startRect = hero(); + console.debug("capture hero source", startRect); + if (!startRect) return; + const endRect = element.getBoundingClientRect(); + const easing = "ease-in-out"; + console.debug("easing", easing); + element.classList.add(styles.animated); + const distance = Math.sqrt( + Math.pow(Math.abs(startRect.top - endRect.top), 2) + + Math.pow(Math.abs(startRect.left - startRect.top), 2), + ); + const duration = (distance / MOVE_SPEED) * 1000; + animation = element.animate( + [composeAnimationFrame(startRect), composeAnimationFrame(endRect)], + { easing, duration }, + ); + const onAnimationEnd = () => { + element.classList.remove(styles.animated); + animation = undefined; + }; + animation.addEventListener("finish", onAnimationEnd); + animation.addEventListener("cancel", onAnimationEnd); + }; + + onCleanup(() => { + if (animation) { + animation.cancel(); + } + }); + return ( {props.children} diff --git a/src/platform/anim.ts b/src/platform/anim.ts index 75446ef..8fbcf29 100644 --- a/src/platform/anim.ts +++ b/src/platform/anim.ts @@ -1,13 +1,47 @@ -import { createContext, useContext, type Accessor } from "solid-js"; +import { + createContext, + createRenderEffect, + createSignal, + untrack, + useContext, + type Accessor, + type Signal, +} from "solid-js"; export type HeroSource = { - [key: string | symbol | number]: HTMLElement | undefined; + [key: string | symbol | number]: DOMRect | undefined; }; -const HeroSourceContext = createContext>(() => ({})); +const HeroSourceContext = createContext>(undefined); export const HeroSourceProvider = HeroSourceContext.Provider; -export function useHeroSource() { +function useHeroSource() { return useContext(HeroSourceContext); } + +export function useHeroSignal( + key: string | symbol | number, +): Accessor { + const source = useHeroSource(); + if (source) { + const [get, set] = createSignal(); + + createRenderEffect(() => { + const value = source[0](); + console.debug("value", value); + if (value[key]) { + set(value[key]); + source[1]((x) => { + const cpy = Object.assign({}, x); + delete cpy[key]; + return cpy; + }); + } + }); + + return get; + } else { + return () => undefined; + } +} diff --git a/src/platform/host.ts b/src/platform/host.ts new file mode 100644 index 0000000..f1a2e27 --- /dev/null +++ b/src/platform/host.ts @@ -0,0 +1,12 @@ +export function isiOS() { + return [ + 'iPad Simulator', + 'iPhone Simulator', + 'iPod Simulator', + 'iPad', + 'iPhone', + 'iPod' + ].includes(navigator.platform) + // iPad on iOS 13 detection + || (navigator.userAgent.includes("Mac") && "ontouchend" in document) +} \ No newline at end of file diff --git a/src/platform/polyfills.ts b/src/platform/polyfills.ts new file mode 100644 index 0000000..6897af7 --- /dev/null +++ b/src/platform/polyfills.ts @@ -0,0 +1,8 @@ +//! This module has side effect. +//! It recommended to include the module by