From 18fa2810c48fc5bf98de004d889e8fc5fce07e53 Mon Sep 17 00:00:00 2001 From: thislight Date: Sat, 23 Nov 2024 00:01:45 +0800 Subject: [PATCH] MediaAttachmentGrid: use new ~platform/Masonry * Masonry is a component provides limited masonry layout support --- .env | 3 +- bun.lockb | Bin 298355 -> 301673 bytes package.json | 2 + src/overrides.d.ts | 4 + src/platform/Masonry.css | 16 ++ src/platform/Masonry.tsx | 158 ++++++++++++++++++++ src/timelines/toots/MediaAttachmentGrid.css | 16 +- src/timelines/toots/MediaAttachmentGrid.tsx | 145 +++++++++--------- 8 files changed, 266 insertions(+), 78 deletions(-) create mode 100644 src/platform/Masonry.css create mode 100644 src/platform/Masonry.tsx diff --git a/.env b/.env index ec2fda9..b5ff8ea 100644 --- a/.env +++ b/.env @@ -1,4 +1,5 @@ DEV_SERVER_HTTPS_CERT_BASE= DEV_SERVER_HTTPS_CERT_PASS= DEV_LOCATOR_EDITOR=vscode -VITE_DEVTOOLS_OVERLAY=true \ No newline at end of file +VITE_DEVTOOLS_OVERLAY=true +VITE_PLATFROM_MASONRY_ALWAYS_COMPAT= \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 0536eb9355b396ff97bbefe75de8a0950a2a4f34..0645c92b80358a366bc2a50d54c803ad3054f6c8 100755 GIT binary patch delta 58850 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 WAJ7jU($BYWQ=t1M&$D<{_5T2}JL{GJ delta 57893 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 ZHoMzp$?tjYo^e!mKDPVqblcL({{yd}JVyWk diff --git a/package.json b/package.json index 4d9e37a..219b2e0 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@solid-devtools/overlay": "^0.30.1", "@suid/vite-plugin": "^0.3.1", "@types/hammerjs": "^2.0.46", + "@types/masonry-layout": "^4.2.8", "@vite-pwa/assets-generator": "^0.2.6", "postcss": "^8.4.49", "prettier": "^3.3.3", @@ -49,6 +50,7 @@ "fast-average-color": "^9.4.0", "hammerjs": "^2.0.8", "iso-639-1": "^3.1.3", + "masonry-layout": "^4.2.2", "masto": "^6.10.1", "nanostores": "^0.11.3", "normalize.css": "^8.0.1", diff --git a/src/overrides.d.ts b/src/overrides.d.ts index 870c3fa..e8db98c 100644 --- a/src/overrides.d.ts +++ b/src/overrides.d.ts @@ -11,6 +11,10 @@ interface ImportMetaEnv { * Attach the overlay (in the dev mode) if it's `"true"`. */ readonly VITE_DEVTOOLS_OVERLAY?: string; + /** + * Always use compatible version of Masonry. + */ + readonly VITE_PLATFROM_MASONRY_ALWAYS_COMPAT?: string } interface ImportMeta { diff --git a/src/platform/Masonry.css b/src/platform/Masonry.css new file mode 100644 index 0000000..ed6264f --- /dev/null +++ b/src/platform/Masonry.css @@ -0,0 +1,16 @@ +.CompatMasonry>* { + margin-bottom: var(--Masonry-row-gap); +} + +@supports (grid-template-rows: masonry) { + .NativeMasonry { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(44px, min-content)); + grid-template-rows: masonry; + + &:has(> :last-child:nth-child(2n)) { + grid-template-columns: repeat(2, minmax(auto, min-content)); + } + } +} + diff --git a/src/platform/Masonry.tsx b/src/platform/Masonry.tsx new file mode 100644 index 0000000..7071cd8 --- /dev/null +++ b/src/platform/Masonry.tsx @@ -0,0 +1,158 @@ +import { + type Component, + type JSX, + splitProps, + type Ref, + createRenderEffect, + onCleanup, + children, + createEffect, + createSignal, + onMount, +} from "solid-js"; +import { Dynamic, type DynamicProps } from "solid-js/web"; +import MasonryLayout from "masonry-layout"; +import { createElementSize } from "@solid-primitives/resize-observer"; +import "./Masonry.css"; + +type MasonryContainer = + | Exclude + | Component<{ + ref?: Ref; + class?: string; + children?: JSX.Element; + }>; + +type ElementOf = + T extends Exclude + ? JSX.IntrinsicElements[T] extends { ref?: Ref } + ? E + : never + : T extends Component<{ ref?: Ref }> + ? E + : never; + +function forwardRef(value: T, ref?: Ref) { + if (!ref) return; + (ref as (value: T) => void)(value); +} + +function createMasonry(element: Element, options: () => MasonryLayout.Options) { + const layout = new MasonryLayout(element, { + initLayout: false, + }); + + onCleanup(() => layout.destroy?.()); + + const size = createElementSize(element); + + createRenderEffect(() => { + const opts = options(); + layout.option?.(opts); + }); + + createRenderEffect(() => { + const width = size.width; // only tracking width + layout.layout?.(); + }); + + if (import.meta.hot) { + import.meta.hot.on("vite:afterUpdate", () => { + layout.layout?.(); + }); + } + + return layout; +} + +const supportsCSSMasonryLayout = /* @__PURE__ */ CSS.supports( + "grid-template-rows", + "masonry", +); + +console.debug("supports css masonry layout", supportsCSSMasonryLayout); + +const useNativeImpl = import.meta.env.VITE_PLATFROM_MASONRY_ALWAYS_COMPAT + ? false + : supportsCSSMasonryLayout; + +if (import.meta.env.VITE_PLATFROM_MASONRY_ALWAYS_COMPAT) { + console.warn( + "Masonry is in compat mode because VITE_PLATFORM_MASONRY_ALWAYS_COMPAT is enabled", + ); +} + +function MasonryCompat( + oprops: DynamicProps & { class?: string }, +) { + const [props, rest] = splitProps(oprops, ["ref", "children", "class"]); + + const childrenComponents = children(() => props.children); + + return ( + ) => { + forwardRef(element, props.ref as Ref | undefined); + + const [columnGap, setColumnGap] = createSignal(); + + const layout = createMasonry(element, () => { + return { + gutter: columnGap(), + }; + }); + + createEffect(() => { + const computedStyle = window.getComputedStyle(element); + + const rowGap = computedStyle.rowGap; + if (element instanceof HTMLElement) { + element.style.setProperty("--Masonry-row-gap", rowGap); + } + + const colGap = computedStyle.columnGap; + if (colGap) { + setColumnGap(Number(colGap.slice(0, colGap.length - 2))); + } + }); + + createRenderEffect(() => { + childrenComponents(); // just tracks + setTimeout(() => { + layout.reloadItems?.(); + layout.layout?.(); + }, 0); + }); + }} + class={`Masonry CompatMasonry ${props.class || ""}`} + {...rest} + children={childrenComponents} + /> + ); +} + +function MasonryNative( + oprops: DynamicProps & { class?: string }, +) { + const [props, rest] = splitProps(oprops, ["class"]); + return ( + + ); +} + +/** + * Masonry Layout Container. + * + * **Native if possible** This component uses css masonry layout + * and fallback to masonry-layout if not supported. The children + * must have specified width and height. + * + * **Children Changes** As the children changed, reflow will be triggered, + * and there is might be a blink (or transition) for user. If it's not your + * intention, don't remove/add the direct children. Instead wraps them under + * containers and set the width and height on the container. + * + * **CSS compatibility** This component compatible to "gap" "row-gap" + * "column-gap" property. But they are read only once after the element mounted. + */ +export default useNativeImpl ? MasonryNative : MasonryCompat; diff --git a/src/timelines/toots/MediaAttachmentGrid.css b/src/timelines/toots/MediaAttachmentGrid.css index 34b22c9..8fd667a 100644 --- a/src/timelines/toots/MediaAttachmentGrid.css +++ b/src/timelines/toots/MediaAttachmentGrid.css @@ -3,10 +3,10 @@ margin-top: 1em; margin-left: var(--card-pad, 0); margin-right: var(--card-pad, 0); - gap: 4px; contain: layout style; + gap: 4px; - > :where(img, video, .sensitive-placeholder) { + > * { max-height: 35vh; min-height: 40px; min-width: 40px; @@ -22,12 +22,20 @@ &:focus-visible { outline: 8px solid var(--media-color-accent, var(--tutu-color-surface-d)); border-color: var(--media-color-accent, var(--tutu-color-surface-d)); + z-index: calc(var(--tutu-zidx-nav) - 1); } + } + > * > * { + width: 100%; + height: 100%; + } + + > * > :where(img, video) { object-fit: contain; } - >.sensitive-placeholder { + > * >.sensitive-placeholder { display: inline-flex; display: inline flex; align-items: center; @@ -35,6 +43,6 @@ } } -:where(.thread-top, .thread-mid) > .MediaAttachmentGrid { +:where(.thread-top, .thread-mid)>.MediaAttachmentGrid { margin-left: calc(var(--card-pad, 0) + var(--toot-avatar-size, 0) + 8px); } \ No newline at end of file diff --git a/src/timelines/toots/MediaAttachmentGrid.tsx b/src/timelines/toots/MediaAttachmentGrid.tsx index 41c740e..c9d72fc 100644 --- a/src/timelines/toots/MediaAttachmentGrid.tsx +++ b/src/timelines/toots/MediaAttachmentGrid.tsx @@ -23,6 +23,7 @@ import "./MediaAttachmentGrid.css"; import cardStyle from "~material/cards.module.css"; import { Preview } from "@suid/icons-material"; import { IconButton } from "@suid/material"; +import Masonry from "~platform/Masonry"; type ElementSize = { width: number; height: number }; @@ -149,13 +150,13 @@ const MediaAttachmentGrid: Component<{ } }; return ( -
@@ -164,81 +165,79 @@ const MediaAttachmentGrid: Component<{ const style = createMemo(() => itemStyle(item())); return ( - - -
- + + +
- - -
-
- - {item().description - - - - - - - - -
+ + + +
+
+ + {item().description + + + + + + + + +
+ ); }}
-
+ ); };