diff --git a/src/components/GalleryImage/GalleryImage.js b/src/components/GalleryImage/GalleryImage.js index 6af6433..ab4ee5e 100644 --- a/src/components/GalleryImage/GalleryImage.js +++ b/src/components/GalleryImage/GalleryImage.js @@ -65,7 +65,10 @@ const GalleryImage = ({ data, location: { state } }) => { useEffect(() => { requestAnimationFrame(() => { - window.scrollTo(0, 180); + window.scrollTo({ + top: 180, + behavior: 'smooth' + }); }); }, [image.base]); diff --git a/src/components/MasonryGallery.tsx b/src/components/MasonryGallery.tsx index 20dfb3e..d4a6b09 100644 --- a/src/components/MasonryGallery.tsx +++ b/src/components/MasonryGallery.tsx @@ -23,7 +23,7 @@ interface MasonryGalleryProps { [breakpoint: string]: number; }; debugHue?: boolean; - dataFn?: (image: GalleryImage) => (string | null); + dataFn?: (image: GalleryImage) => string[] | null; linkState?: object; showPalette?: boolean; singleRow?: boolean; @@ -72,7 +72,7 @@ const MasonryGallery = ({ // does adding current image to our row get us closer to our target aspect ratio? if (currentDiff > diffIfImageIsAddedToCurrentRow) { currentRow.aspect += currentAspect; - currentRow.images += 1 + currentRow.images += 1; // _rows.push(currentRow); continue; } @@ -85,8 +85,8 @@ const MasonryGallery = ({ _rows.push({ aspect: currentAspect, images: 1, - startIndex: currentRow.startIndex + currentRow.images - }) + startIndex: currentRow.startIndex + currentRow.images, + }); } return R.indexBy(R.prop("startIndex"), _rows); @@ -159,9 +159,15 @@ const MasonryGallery = ({ }} to={`/photogallery/${image.base}/`} > - {data && - {data} - } + {data && ( +
+ {data.map((dataString) => ( + + {dataString} + + ))} +
+ )} {img && (
+ {props.children} + + ); +} \ No newline at end of file diff --git a/src/gatsby-types.d.ts b/src/gatsby-types.d.ts index 6339c77..e2d2cc4 100644 --- a/src/gatsby-types.d.ts +++ b/src/gatsby-types.d.ts @@ -1532,6 +1532,7 @@ type Query = { readonly allSiteFunction: SiteFunctionConnection; readonly allSitePage: SitePageConnection; readonly allSitePlugin: SitePluginConnection; + readonly allStaticImage: StaticImageConnection; readonly directory: Maybe; readonly file: Maybe; readonly imageSharp: Maybe; @@ -1540,6 +1541,7 @@ type Query = { readonly siteFunction: Maybe; readonly sitePage: Maybe; readonly sitePlugin: Maybe; + readonly staticImage: Maybe; }; @@ -1607,6 +1609,14 @@ type Query_allSitePluginArgs = { }; +type Query_allStaticImageArgs = { + filter: InputMaybe; + limit: InputMaybe; + skip: InputMaybe; + sort: InputMaybe>>; +}; + + type Query_directoryArgs = { absolutePath: InputMaybe; accessTime: InputMaybe; @@ -1776,6 +1786,46 @@ type Query_sitePluginArgs = { version: InputMaybe; }; + +type Query_staticImageArgs = { + absolutePath: InputMaybe; + accessTime: InputMaybe; + atime: InputMaybe; + atimeMs: InputMaybe; + base: InputMaybe; + birthTime: InputMaybe; + birthtime: InputMaybe; + birthtimeMs: InputMaybe; + blksize: InputMaybe; + blocks: InputMaybe; + changeTime: InputMaybe; + children: InputMaybe; + ctime: InputMaybe; + ctimeMs: InputMaybe; + dev: InputMaybe; + dir: InputMaybe; + ext: InputMaybe; + extension: InputMaybe; + id: InputMaybe; + ino: InputMaybe; + internal: InputMaybe; + mode: InputMaybe; + modifiedTime: InputMaybe; + mtime: InputMaybe; + mtimeMs: InputMaybe; + name: InputMaybe; + nlink: InputMaybe; + parent: InputMaybe; + prettySize: InputMaybe; + rdev: InputMaybe; + relativeDirectory: InputMaybe; + relativePath: InputMaybe; + root: InputMaybe; + size: InputMaybe; + sourceInstanceName: InputMaybe; + uid: InputMaybe; +}; + type Site = Node & { readonly buildTime: Maybe; readonly children: ReadonlyArray; @@ -2542,6 +2592,312 @@ type SortOrderEnum = | 'ASC' | 'DESC'; +type StaticImage = Node & { + readonly absolutePath: Maybe; + readonly accessTime: Maybe; + readonly atime: Maybe; + readonly atimeMs: Maybe; + readonly base: Maybe; + readonly birthTime: Maybe; + readonly birthtime: Maybe; + readonly birthtimeMs: Maybe; + readonly blksize: Maybe; + readonly blocks: Maybe; + readonly changeTime: Maybe; + readonly children: ReadonlyArray; + readonly ctime: Maybe; + readonly ctimeMs: Maybe; + readonly dev: Maybe; + readonly dir: Maybe; + readonly ext: Maybe; + readonly extension: Maybe; + readonly id: Scalars['ID']; + readonly ino: Maybe; + readonly internal: Internal; + readonly mode: Maybe; + readonly modifiedTime: Maybe; + readonly mtime: Maybe; + readonly mtimeMs: Maybe; + readonly name: Maybe; + readonly nlink: Maybe; + readonly parent: Maybe; + readonly prettySize: Maybe; + readonly rdev: Maybe; + readonly relativeDirectory: Maybe; + readonly relativePath: Maybe; + readonly root: Maybe; + readonly size: Maybe; + readonly sourceInstanceName: Maybe; + readonly uid: Maybe; +}; + + +type StaticImage_accessTimeArgs = { + difference: InputMaybe; + formatString: InputMaybe; + fromNow: InputMaybe; + locale: InputMaybe; +}; + + +type StaticImage_atimeArgs = { + difference: InputMaybe; + formatString: InputMaybe; + fromNow: InputMaybe; + locale: InputMaybe; +}; + + +type StaticImage_birthTimeArgs = { + difference: InputMaybe; + formatString: InputMaybe; + fromNow: InputMaybe; + locale: InputMaybe; +}; + + +type StaticImage_birthtimeArgs = { + difference: InputMaybe; + formatString: InputMaybe; + fromNow: InputMaybe; + locale: InputMaybe; +}; + + +type StaticImage_changeTimeArgs = { + difference: InputMaybe; + formatString: InputMaybe; + fromNow: InputMaybe; + locale: InputMaybe; +}; + + +type StaticImage_ctimeArgs = { + difference: InputMaybe; + formatString: InputMaybe; + fromNow: InputMaybe; + locale: InputMaybe; +}; + + +type StaticImage_modifiedTimeArgs = { + difference: InputMaybe; + formatString: InputMaybe; + fromNow: InputMaybe; + locale: InputMaybe; +}; + + +type StaticImage_mtimeArgs = { + difference: InputMaybe; + formatString: InputMaybe; + fromNow: InputMaybe; + locale: InputMaybe; +}; + +type StaticImageConnection = { + readonly distinct: ReadonlyArray; + readonly edges: ReadonlyArray; + readonly group: ReadonlyArray; + readonly max: Maybe; + readonly min: Maybe; + readonly nodes: ReadonlyArray; + readonly pageInfo: PageInfo; + readonly sum: Maybe; + readonly totalCount: Scalars['Int']; +}; + + +type StaticImageConnection_distinctArgs = { + field: StaticImageFieldSelector; +}; + + +type StaticImageConnection_groupArgs = { + field: StaticImageFieldSelector; + limit: InputMaybe; + skip: InputMaybe; +}; + + +type StaticImageConnection_maxArgs = { + field: StaticImageFieldSelector; +}; + + +type StaticImageConnection_minArgs = { + field: StaticImageFieldSelector; +}; + + +type StaticImageConnection_sumArgs = { + field: StaticImageFieldSelector; +}; + +type StaticImageEdge = { + readonly next: Maybe; + readonly node: StaticImage; + readonly previous: Maybe; +}; + +type StaticImageFieldSelector = { + readonly absolutePath: InputMaybe; + readonly accessTime: InputMaybe; + readonly atime: InputMaybe; + readonly atimeMs: InputMaybe; + readonly base: InputMaybe; + readonly birthTime: InputMaybe; + readonly birthtime: InputMaybe; + readonly birthtimeMs: InputMaybe; + readonly blksize: InputMaybe; + readonly blocks: InputMaybe; + readonly changeTime: InputMaybe; + readonly children: InputMaybe; + readonly ctime: InputMaybe; + readonly ctimeMs: InputMaybe; + readonly dev: InputMaybe; + readonly dir: InputMaybe; + readonly ext: InputMaybe; + readonly extension: InputMaybe; + readonly id: InputMaybe; + readonly ino: InputMaybe; + readonly internal: InputMaybe; + readonly mode: InputMaybe; + readonly modifiedTime: InputMaybe; + readonly mtime: InputMaybe; + readonly mtimeMs: InputMaybe; + readonly name: InputMaybe; + readonly nlink: InputMaybe; + readonly parent: InputMaybe; + readonly prettySize: InputMaybe; + readonly rdev: InputMaybe; + readonly relativeDirectory: InputMaybe; + readonly relativePath: InputMaybe; + readonly root: InputMaybe; + readonly size: InputMaybe; + readonly sourceInstanceName: InputMaybe; + readonly uid: InputMaybe; +}; + +type StaticImageFilterInput = { + readonly absolutePath: InputMaybe; + readonly accessTime: InputMaybe; + readonly atime: InputMaybe; + readonly atimeMs: InputMaybe; + readonly base: InputMaybe; + readonly birthTime: InputMaybe; + readonly birthtime: InputMaybe; + readonly birthtimeMs: InputMaybe; + readonly blksize: InputMaybe; + readonly blocks: InputMaybe; + readonly changeTime: InputMaybe; + readonly children: InputMaybe; + readonly ctime: InputMaybe; + readonly ctimeMs: InputMaybe; + readonly dev: InputMaybe; + readonly dir: InputMaybe; + readonly ext: InputMaybe; + readonly extension: InputMaybe; + readonly id: InputMaybe; + readonly ino: InputMaybe; + readonly internal: InputMaybe; + readonly mode: InputMaybe; + readonly modifiedTime: InputMaybe; + readonly mtime: InputMaybe; + readonly mtimeMs: InputMaybe; + readonly name: InputMaybe; + readonly nlink: InputMaybe; + readonly parent: InputMaybe; + readonly prettySize: InputMaybe; + readonly rdev: InputMaybe; + readonly relativeDirectory: InputMaybe; + readonly relativePath: InputMaybe; + readonly root: InputMaybe; + readonly size: InputMaybe; + readonly sourceInstanceName: InputMaybe; + readonly uid: InputMaybe; +}; + +type StaticImageGroupConnection = { + readonly distinct: ReadonlyArray; + readonly edges: ReadonlyArray; + readonly field: Scalars['String']; + readonly fieldValue: Maybe; + readonly group: ReadonlyArray; + readonly max: Maybe; + readonly min: Maybe; + readonly nodes: ReadonlyArray; + readonly pageInfo: PageInfo; + readonly sum: Maybe; + readonly totalCount: Scalars['Int']; +}; + + +type StaticImageGroupConnection_distinctArgs = { + field: StaticImageFieldSelector; +}; + + +type StaticImageGroupConnection_groupArgs = { + field: StaticImageFieldSelector; + limit: InputMaybe; + skip: InputMaybe; +}; + + +type StaticImageGroupConnection_maxArgs = { + field: StaticImageFieldSelector; +}; + + +type StaticImageGroupConnection_minArgs = { + field: StaticImageFieldSelector; +}; + + +type StaticImageGroupConnection_sumArgs = { + field: StaticImageFieldSelector; +}; + +type StaticImageSortInput = { + readonly absolutePath: InputMaybe; + readonly accessTime: InputMaybe; + readonly atime: InputMaybe; + readonly atimeMs: InputMaybe; + readonly base: InputMaybe; + readonly birthTime: InputMaybe; + readonly birthtime: InputMaybe; + readonly birthtimeMs: InputMaybe; + readonly blksize: InputMaybe; + readonly blocks: InputMaybe; + readonly changeTime: InputMaybe; + readonly children: InputMaybe; + readonly ctime: InputMaybe; + readonly ctimeMs: InputMaybe; + readonly dev: InputMaybe; + readonly dir: InputMaybe; + readonly ext: InputMaybe; + readonly extension: InputMaybe; + readonly id: InputMaybe; + readonly ino: InputMaybe; + readonly internal: InputMaybe; + readonly mode: InputMaybe; + readonly modifiedTime: InputMaybe; + readonly mtime: InputMaybe; + readonly mtimeMs: InputMaybe; + readonly name: InputMaybe; + readonly nlink: InputMaybe; + readonly parent: InputMaybe; + readonly prettySize: InputMaybe; + readonly rdev: InputMaybe; + readonly relativeDirectory: InputMaybe; + readonly relativePath: InputMaybe; + readonly root: InputMaybe; + readonly size: InputMaybe; + readonly sourceInstanceName: InputMaybe; + readonly uid: InputMaybe; +}; + type StringQueryOperatorInput = { readonly eq: InputMaybe; readonly glob: InputMaybe; diff --git a/src/pages/photogallery.tsx b/src/pages/photogallery.tsx index 6d7fa1e..c9fb21a 100644 --- a/src/pages/photogallery.tsx +++ b/src/pages/photogallery.tsx @@ -17,6 +17,7 @@ import Nav from "../components/Nav"; import { Item, Select } from "../components/Select"; import { Switch } from "../components/Switch"; import ColorPalette from "@spectrum-icons/workflow/ColorPalette"; +import { ToggleButton } from "../components/ToggleButton"; const SORT_KEYS = { hue: ["fields", "imageMeta", "vibrantHue"], @@ -80,26 +81,23 @@ const GalleryPage = ({ getGalleryPageUrl( { sortKey: newSortKey, keyword: filterKeyword, showDebug }, hash - ), - { replace: true } + ) + // { replace: true } ); }, [filterKeyword, hash, showDebug] ); - const removeHash = React.useCallback( - () => { - if (!hash.length) { - return; - } - navigate( - getGalleryPageUrl({ sortKey, keyword: filterKeyword, showDebug }, ""), - // { replace: false } - ); - window.removeEventListener("scroll", removeHash); - }, - [hash, sortKey, filterKeyword, showDebug] - ); + const removeHash = React.useCallback(() => { + if (!hash.length) { + return; + } + navigate( + getGalleryPageUrl({ sortKey, keyword: filterKeyword, showDebug }, ""), + { replace: true } + ); + window.removeEventListener("scroll", removeHash); + }, [hash, sortKey, filterKeyword, showDebug]); React.useEffect(() => { // window.addEventListener("scroll", removeHash); @@ -123,15 +121,13 @@ const GalleryPage = ({ console.log("scrolling into view manually", el.offsetTop); el.scrollIntoView({ block: hash.startsWith("all") ? "start" : "center", + behavior: "smooth", }); setTimeout(() => { window.addEventListener("scroll", removeHash); - }, 100) + }, 100); }); - }, [ - hash, - removeHash - ]); + }, [hash, removeHash]); const images: GalleryImage[] = React.useMemo(() => { const sort = @@ -173,24 +169,44 @@ const GalleryPage = ({ ); }, [data]); + const [dbgTags, setDbgTags] = React.useState(false); + const [dbgSortKey, setDbgSortKey] = React.useState(false); + const [dbgName, setDbgName] = React.useState(false); const dataFn = React.useCallback( - (image: GalleryImage): string | null => { + (image: GalleryImage): string[] | null => { if (!showDebug) { return null; } - if (sortKey === "rating") { - return `[${R.pathOr(null, SORT_KEYS.rating, image)}] ${image.base}`; + let data: string[] = []; + if (dbgName) { + data.push(image.base); } - if (sortKey === "datePublished") { - const date = R.pathOr(null, SORT_KEYS.datePublished, image); - if (!date) { - return null; + if (dbgSortKey) { + switch (sortKey) { + case "hue": + case "rating": { + data.push(`[${R.pathOr(null, SORT_KEYS[sortKey], image)}]`); + break; + } + case "date": + case "datePublished": { + const date = R.pathOr(null, SORT_KEYS[sortKey], image); + if (date) { + data.push(`[${new Date(date).toLocaleString()}]`); + } + break; + } } - return new Date(date).toLocaleString(); } - return null; + if (dbgTags) { + const keywords = image.fields?.imageMeta?.meta?.Keywords?.join(',') + if (keywords) { + data.push(keywords); + } + } + return data; }, - [showDebug, sortKey] + [showDebug, sortKey, dbgName, dbgSortKey, dbgTags] ); return ( @@ -283,7 +299,20 @@ const GalleryPage = ({ onPick={onKeywordPick} value={filterKeyword} /> -
+
+ {showDebug && ( +
+ + name + + + sort key + + + tags + +
+ )}