dbf-mirador 4.3.2 → 4.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AudioViewer-tRH73pbt.js → AudioViewer-Bw9Dw4zn.js} +3 -3
- package/dist/{AudioViewer-tRH73pbt.js.map → AudioViewer-Bw9Dw4zn.js.map} +1 -1
- package/dist/{CommentSharp-BJ6oQAe3.js → CommentSharp-CqGF7axd.js} +4 -4
- package/dist/{CommentSharp-BJ6oQAe3.js.map → CommentSharp-CqGF7axd.js.map} +1 -1
- package/dist/{FailedImageContext-BhA0TpVp.js → FailedImageContext-yYxY_Y6U.js} +15 -9
- package/dist/FailedImageContext-yYxY_Y6U.js.map +1 -0
- package/dist/{GalleryView-rCx0Q4f3.js → GalleryView-CVBvyOpD.js} +7 -7
- package/dist/{GalleryView-rCx0Q4f3.js.map → GalleryView-CVBvyOpD.js.map} +1 -1
- package/dist/{OpenSeadragonViewer-4nw8qaVM.js → OpenSeadragonViewer-CYMXINoT.js} +317 -296
- package/dist/{OpenSeadragonViewer-4nw8qaVM.js.map → OpenSeadragonViewer-CYMXINoT.js.map} +1 -1
- package/dist/{PluginHook-DWFCXIIp.js → PluginHook-Bs9Qkrjd.js} +2 -2
- package/dist/{PluginHook-DWFCXIIp.js.map → PluginHook-Bs9Qkrjd.js.map} +1 -1
- package/dist/{SelectCollection-BK9ZDkK3.js → SelectCollection-3NmzQDwN.js} +3 -3
- package/dist/{SelectCollection-BK9ZDkK3.js.map → SelectCollection-3NmzQDwN.js.map} +1 -1
- package/dist/{TextViewer-D_1qzQE4.js → TextViewer-CVXiOE35.js} +4 -4
- package/dist/{TextViewer-D_1qzQE4.js.map → TextViewer-CVXiOE35.js.map} +1 -1
- package/dist/{VideoViewer-DzNjgLWE.js → VideoViewer-cPgF9ddg.js} +3 -3
- package/dist/{VideoViewer-DzNjgLWE.js.map → VideoViewer-cPgF9ddg.js.map} +1 -1
- package/dist/{WindowCanvasNavigationControls-D2uLtL_A.js → WindowCanvasNavigationControls-D5yfHP-5.js} +6 -6
- package/dist/{WindowCanvasNavigationControls-D2uLtL_A.js.map → WindowCanvasNavigationControls-D5yfHP-5.js.map} +1 -1
- package/dist/{WindowViewer-uHVYcMsX.js → WindowViewer-CCpOO735.js} +4 -4
- package/dist/{WindowViewer-uHVYcMsX.js.map → WindowViewer-CCpOO735.js.map} +1 -1
- package/dist/{WorkspaceArea-7bydz9m-.js → WorkspaceArea-DklqbMLL.js} +4023 -4002
- package/dist/WorkspaceArea-DklqbMLL.js.map +1 -0
- package/dist/{canvas-2ACcnS9Y.js → canvas-DNE0BtDK.js} +2 -2
- package/dist/{canvas-2ACcnS9Y.js.map → canvas-DNE0BtDK.js.map} +1 -1
- package/dist/{canvases-DTR37lo-.js → canvases-DKeoerqc.js} +256 -256
- package/dist/{canvases-DTR37lo-.js.map → canvases-DKeoerqc.js.map} +1 -1
- package/dist/{getters-B4oepJRC.js → getters-CD0HjudG.js} +2 -2
- package/dist/{getters-B4oepJRC.js.map → getters-CD0HjudG.js.map} +1 -1
- package/dist/{index.module-CgUBfaXx.js → index.module-B1DwyIwz.js} +8 -8
- package/dist/{index.module-CgUBfaXx.js.map → index.module-B1DwyIwz.js.map} +1 -1
- package/dist/mirador.es.js +1793 -1426
- package/dist/mirador.es.js.map +1 -1
- package/dist/mirador.min.js +75 -72
- package/dist/mirador.min.js.map +1 -1
- package/dist/{visuallyHidden-C4mhQkB0.js → visuallyHidden-BKK1-SDh.js} +2 -2
- package/dist/{visuallyHidden-C4mhQkB0.js.map → visuallyHidden-BKK1-SDh.js.map} +1 -1
- package/dist/{window-COQOIAli.js → window-DiDL2pT4.js} +2 -2
- package/dist/{window-COQOIAli.js.map → window-DiDL2pT4.js.map} +1 -1
- package/package.json +1 -1
- package/src/components/AnnotationsOverlay.jsx +36 -3
- package/src/components/CompanionWindow.jsx +40 -3
- package/src/components/MapViewer.jsx +93 -4
- package/src/config/settings.js +1 -1
- package/src/lib/AnnotationItem.js +5 -0
- package/src/lib/AnnotationResource.js +5 -0
- package/src/lib/CanvasAnnotationDisplay.js +52 -14
- package/src/plugins/index.js +2 -0
- package/src/plugins/mapInteractionPlugin.tsx +321 -0
- package/src/plugins/nestedMapPlugin.tsx +152 -0
- package/src/plugins/poiPreviewPlugin.tsx +520 -109
- package/dist/FailedImageContext-BhA0TpVp.js.map +0 -1
- package/dist/WorkspaceArea-7bydz9m-.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { U as e, at as t, dt as n, ft as r, g as i, st as a } from "./getters-
|
|
2
|
-
import { d as o, f as s, mt as c } from "./canvases-
|
|
1
|
+
import { U as e, at as t, dt as n, ft as r, g as i, st as a } from "./getters-CD0HjudG.js";
|
|
2
|
+
import { d as o, f as s, mt as c } from "./canvases-DKeoerqc.js";
|
|
3
3
|
import { Fragment as l } from "react";
|
|
4
4
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
5
5
|
import { styled as f } from "@mui/material/styles";
|
|
@@ -37,4 +37,4 @@ var _ = /* @__PURE__ */ n({ default: () => v }), v = e(a((e, { windowId: t }) =>
|
|
|
37
37
|
//#endregion
|
|
38
38
|
export { _ as n, g as r, v as t };
|
|
39
39
|
|
|
40
|
-
//# sourceMappingURL=AudioViewer-
|
|
40
|
+
//# sourceMappingURL=AudioViewer-Bw9Dw4zn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioViewer-
|
|
1
|
+
{"version":3,"file":"AudioViewer-Bw9Dw4zn.js","names":[],"sources":["../src/components/AudioViewer.jsx","../src/containers/AudioViewer.js"],"sourcesContent":["import { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\n\nconst StyledContainer = styled('div')({\n alignItems: 'center',\n display: 'flex',\n width: '100%',\n});\n\nconst StyledAudio = styled('audio')({\n width: '100%',\n});\n\n/** */\nexport function AudioViewer({ audioOptions = {}, audioResources = [], captions = [] }) {\n return (\n <StyledContainer>\n <StyledAudio {...audioOptions}>\n {audioResources.map((audio) => (\n <Fragment key={audio.id}>\n <source src={audio.id} type={audio.getFormat()} />\n </Fragment>\n ))}\n {captions.map((caption) => (\n <Fragment key={caption.id}>\n <track src={caption.id} label={caption.getDefaultLabel()} srcLang={caption.getProperty('language')} />\n </Fragment>\n ))}\n </StyledAudio>\n </StyledContainer>\n );\n}\n\nAudioViewer.propTypes = {\n audioOptions: PropTypes.object,\n audioResources: PropTypes.arrayOf(PropTypes.object),\n captions: PropTypes.arrayOf(PropTypes.object),\n};\n","import { connect } from 'react-redux';\nimport { compose } from 'redux';\nimport { withPlugins } from '../extend/withPlugins';\nimport { AudioViewer } from '../components/AudioViewer';\nimport { getConfig, getVisibleCanvasAudioResources, getVisibleCanvasCaptions } from '../state/selectors';\n\n/** */\nconst mapStateToProps = (state, { windowId }) => ({\n audioOptions: getConfig(state).audioOptions,\n audioResources: getVisibleCanvasAudioResources(state, { windowId }) || [],\n captions: getVisibleCanvasCaptions(state, { windowId }) || [],\n});\n\nconst enhance = compose(connect(mapStateToProps, null), withPlugins('AudioViewer'));\n\nexport default enhance(AudioViewer);\n"],"mappings":";;;;;;mCAIM,IAAkB,EAAO,KAAK,CAAC,CAAC;CACpC,YAAY;CACZ,SAAS;CACT,OAAO;AACT,CAAC,GAEK,IAAc,EAAO,OAAO,CAAC,CAAC,EAClC,OAAO,OACT,CAAC;AAGD,SAAgB,EAAY,EAAE,kBAAe,CAAC,GAAG,oBAAiB,CAAC,GAAG,cAAW,CAAC,KAAK;CACrF,OACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAa,GAAI;EAAjB,UAAA,CACG,EAAe,KAAK,MACnB,kBAAC,GAAD,EAAA,UACE,kBAAC,UAAD;GAAQ,KAAK,EAAM;GAAI,MAAM,EAAM,UAAU;EAAI,CAAA,EACzC,GAFK,EAAM,EAEX,CACX,GACA,EAAS,KAAK,MACb,kBAAC,GAAD,EAAA,UACE,kBAAC,SAAD;GAAO,KAAK,EAAQ;GAAI,OAAO,EAAQ,gBAAgB;GAAG,SAAS,EAAQ,YAAY,UAAU;EAAI,CAAA,EAC7F,GAFK,EAAQ,EAEb,CACX,CACU;CACE,CAAA,EAAA,CAAA;AAErB;AAEA,EAAY,YAAY;CACtB,cAAc,EAAA,QAAU;CACxB,gBAAgB,EAAA,QAAU,QAAQ,EAAA,QAAU,MAAM;CAClD,UAAU,EAAA,QAAU,QAAQ,EAAA,QAAU,MAAM;AAC9C;;;iDCvBA,IAFgB,EAAQ,GANC,GAAO,EAAE,mBAAgB;CAChD,cAAc,EAAU,CAAK,CAAC,CAAC;CAC/B,gBAAgB,EAA+B,GAAO,EAAE,YAAS,CAAC,KAAK,CAAC;CACxE,UAAU,EAAyB,GAAO,EAAE,YAAS,CAAC,KAAK,CAAC;AAC9D,IAEiD,IAAI,GAAG,EAAY,aAAa,CAElE,CAAA,CAAQ,CAAW"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { U as e, at as t, ct as n, ft as r, g as i, st as a } from "./getters-
|
|
2
|
-
import { B as o, dt as s, mt as c } from "./canvases-
|
|
3
|
-
import { t as l } from "./FailedImageContext-
|
|
1
|
+
import { U as e, at as t, ct as n, ft as r, g as i, st as a } from "./getters-CD0HjudG.js";
|
|
2
|
+
import { B as o, dt as s, mt as c } from "./canvases-DKeoerqc.js";
|
|
3
|
+
import { t as l } from "./FailedImageContext-yYxY_Y6U.js";
|
|
4
4
|
import { t as u } from "./createSvgIcon-Cwt8YPfm.js";
|
|
5
5
|
import * as d from "react";
|
|
6
6
|
import { createContext as f, useContext as p, useEffect as m, useMemo as h, useState as g } from "react";
|
|
@@ -319,4 +319,4 @@ var W = e(a((e) => ({ thumbnailsConfig: c(e).thumbnails })), i("IIIFThumbnail"))
|
|
|
319
319
|
//#endregion
|
|
320
320
|
export { L as a, U as i, G as n, I as o, W as r, P as s, K as t };
|
|
321
321
|
|
|
322
|
-
//# sourceMappingURL=CommentSharp-
|
|
322
|
+
//# sourceMappingURL=CommentSharp-CqGF7axd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommentSharp-BJ6oQAe3.js","names":["React","React2","React3","createSvgIcon","createSvgIcon"],"sources":["../src/hooks/useThumbnailService.js","../node_modules/react-intersection-observer/dist/index.mjs","../src/contexts/LocaleContext.js","../src/components/IIIFResourceLabel.jsx","../src/components/IIIFThumbnail.jsx","../src/containers/IIIFThumbnail.js","../node_modules/@mui/icons-material/esm/SearchSharp.js","../node_modules/@mui/icons-material/esm/CommentSharp.js"],"sourcesContent":["import { useSelector } from 'react-redux';\n\nimport { getThumbnailFactory } from '../state/selectors/thumbnails';\n\n/** */\nexport default function useThumbnailService(maxHeight, maxWidth) {\n return useSelector((state) => getThumbnailFactory(state, maxHeight, maxWidth), [maxHeight, maxWidth]);\n}\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root) return \"0\";\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a2;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n [...(_a2 = elements.get(entry.target)) != null ? _a2 : []].forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"lastInView\");\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n this.lastInView = this.props.initialInView;\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n const previousInView = this.lastInView;\n this.lastInView = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n this.lastInView = props.initialInView;\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n if (this.lastInView === void 0) {\n this.lastInView = this.props.initialInView;\n }\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-expect-error\n trackVisibility,\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a2;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef(onChange);\n const lastInViewRef = React2.useRef(initialInView);\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (lastInViewRef.current === void 0) {\n lastInViewRef.current = initialInView;\n }\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n const previousInView = lastInViewRef.current;\n lastInViewRef.current = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-expect-error\n trackVisibility,\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a2 = state.entry) == null ? void 0 : _a2.target;\n const previousEntryTarget = React2.useRef(void 0);\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n lastInViewRef.current = initialInView;\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\n\n// src/useOnInView.tsx\nimport * as React3 from \"react\";\nvar _a, _b;\nvar useSyncEffect = (_b = (_a = \"useInsertionEffect\" in React3 ? React3.useInsertionEffect : void 0) != null ? _a : React3.useLayoutEffect) != null ? _b : React3.useEffect;\nvar useOnInView = (onIntersectionChange, {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n triggerOnce,\n skip\n} = {}) => {\n const onIntersectionChangeRef = React3.useRef(onIntersectionChange);\n const observedElementRef = React3.useRef(null);\n const observerCleanupRef = React3.useRef(void 0);\n const lastInViewRef = React3.useRef(void 0);\n useSyncEffect(() => {\n onIntersectionChangeRef.current = onIntersectionChange;\n }, [onIntersectionChange]);\n return React3.useCallback(\n (element) => {\n const cleanupExisting = () => {\n if (observerCleanupRef.current) {\n const cleanup = observerCleanupRef.current;\n observerCleanupRef.current = void 0;\n cleanup();\n }\n };\n if (element === observedElementRef.current) {\n return observerCleanupRef.current;\n }\n if (!element || skip) {\n cleanupExisting();\n observedElementRef.current = null;\n lastInViewRef.current = void 0;\n return;\n }\n cleanupExisting();\n observedElementRef.current = element;\n let destroyed = false;\n const destroyObserver = observe(\n element,\n (inView, entry) => {\n const previousInView = lastInViewRef.current;\n lastInViewRef.current = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n onIntersectionChangeRef.current(\n inView,\n entry\n );\n if (triggerOnce && inView) {\n stopObserving();\n }\n },\n {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay\n }\n );\n function stopObserving() {\n if (destroyed) return;\n destroyed = true;\n destroyObserver();\n observedElementRef.current = null;\n observerCleanupRef.current = void 0;\n lastInViewRef.current = void 0;\n }\n observerCleanupRef.current = stopObserving;\n return observerCleanupRef.current;\n },\n [\n Array.isArray(threshold) ? threshold.toString() : threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n triggerOnce,\n skip\n ]\n );\n};\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView,\n useOnInView\n};\n//# sourceMappingURL=index.mjs.map","import { createContext } from 'react';\n\nconst LocaleContext = createContext();\n\nexport default LocaleContext;\n","import { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { getLocale } from '../state/selectors';\nimport LocaleContext from '../contexts/LocaleContext';\n\n/**\n * Render the contextually appropriate label for the resource\n */\nexport function IIIFResourceLabel({ fallback, resource }) {\n const contextLocale = useContext(LocaleContext);\n const fallbackLocale = useSelector((state) => getLocale(state, {}));\n\n if (!resource) return fallback;\n\n const label = resource.getLabel();\n\n if (!label) return fallback;\n\n return label.getValue(contextLocale || fallbackLocale || '') ?? (fallback || resource.id);\n}\n\nIIIFResourceLabel.propTypes = {\n fallback: PropTypes.string,\n resource: PropTypes.object.isRequired,\n};\n","import { useMemo, useEffect, useState, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport { useInView } from 'react-intersection-observer';\nimport { IIIFResourceLabel } from './IIIFResourceLabel';\nimport { useThumbnailService } from '../hooks';\nimport FailedImageContext from '../contexts/FailedImageContext';\n\nconst Root = styled('div', { name: 'IIIFThumbnail', slot: 'root' })({});\n\nconst Label = styled('span', { name: 'IIIFThumbnail', slot: 'label' })(({ theme }) => ({\n ...theme.typography.caption,\n}));\n\nconst Image = styled('img', { name: 'IIIFThumbnail', slot: 'image' })(() => ({\n height: 'auto',\n width: 'auto',\n}));\n\n/**\n * A lazy-loaded image that uses IntersectionObserver to determine when to\n * try to load the image (or even calculate that the image url/height/width are)\n */\nconst LazyLoadedImage = ({\n border = false,\n placeholder,\n style = {},\n thumbnail = null,\n resource,\n maxHeight = null,\n maxWidth = null,\n ...props\n}) => {\n const { ref, inView } = useInView();\n const [loaded, setLoaded] = useState(false);\n const [failed, setFailed] = useState(false);\n const thumbnailService = useThumbnailService(maxHeight, maxWidth);\n const { notifyFailure, fallbackImage } = useContext(FailedImageContext);\n\n /**\n * Handles the intersection (visibility) of a given thumbnail, by requesting\n * the image and then updating the state.\n */\n useEffect(() => {\n if (loaded || !inView) return;\n\n setLoaded(true);\n }, [inView, loaded]);\n\n const image = useMemo(() => {\n if (thumbnail) return thumbnail;\n\n const i = thumbnailService.get(resource);\n\n if (i && i.url) return i;\n\n return undefined;\n }, [resource, thumbnail, thumbnailService]);\n\n const imageStyles = useMemo(() => {\n const styleProps = {\n height: undefined,\n maxHeight: undefined,\n maxWidth: undefined,\n width: undefined,\n };\n\n // If we're using a fallback image due to failure, use object-fit to preserve aspect ratio\n if (failed && fallbackImage) {\n return {\n ...styleProps,\n ...style,\n maxWidth,\n maxHeight,\n objectFit: 'contain',\n };\n }\n\n if (!image) return { ...style, height: maxHeight, width: maxWidth };\n\n const { height: thumbHeight, width: thumbWidth } = image;\n if (thumbHeight && thumbWidth) {\n if ((maxHeight && thumbHeight > maxHeight) || (maxWidth && thumbWidth > maxWidth)) {\n const aspectRatio = thumbWidth / thumbHeight;\n\n if (maxHeight && maxWidth) {\n if (maxWidth / maxHeight < aspectRatio) {\n styleProps.height = Math.round(maxWidth / aspectRatio);\n styleProps.width = maxWidth;\n } else {\n styleProps.height = maxHeight;\n styleProps.width = Math.round(maxHeight * aspectRatio);\n }\n } else if (maxHeight) {\n styleProps.height = maxHeight;\n styleProps.maxWidth = Math.round(maxHeight * aspectRatio);\n } else if (maxWidth) {\n styleProps.width = maxWidth;\n styleProps.maxHeight = Math.round(maxWidth / aspectRatio);\n }\n } else {\n styleProps.width = thumbWidth;\n styleProps.height = thumbHeight;\n }\n } else if (thumbHeight && !thumbWidth) {\n styleProps.height = maxHeight;\n } else if (!thumbHeight && thumbWidth) {\n styleProps.width = maxWidth;\n } else {\n // The thumbnail wasn't retrieved via an Image API service,\n // and its dimensions are not specified in the JSON-LD\n // (note that this may result in a blurry image)\n styleProps.width = maxWidth;\n styleProps.height = maxHeight;\n }\n\n return {\n ...styleProps,\n ...style,\n };\n }, [image, maxWidth, maxHeight, style, failed, fallbackImage]);\n\n const { url: src = placeholder } = (loaded && (thumbnail || image)) || {};\n // Decide final image source: normal, failed fallback, or placeholder\n const finalSrc = failed ? fallbackImage || placeholder : src;\n\n return (\n <Image\n ownerState={{ border }}\n ref={ref}\n alt={failed ? 'Thumbnail image unavailable' : ''}\n role={failed ? undefined : 'presentation'}\n src={finalSrc}\n style={imageStyles}\n onError={() => {\n setFailed(true);\n if (finalSrc) notifyFailure(finalSrc);\n }}\n {...props}\n />\n );\n};\n\nLazyLoadedImage.propTypes = {\n border: PropTypes.bool,\n maxHeight: PropTypes.number,\n maxWidth: PropTypes.number,\n placeholder: PropTypes.string.isRequired,\n resource: PropTypes.object.isRequired,\n style: PropTypes.object,\n thumbnail: PropTypes.shape({\n height: PropTypes.number,\n url: PropTypes.string.isRequired,\n width: PropTypes.number,\n }),\n};\n\nconst defaultPlaceholder =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mMMDQmtBwADgwF/Op8FmAAAAABJRU5ErkJggg==';\n\n/**\n * Uses InteractionObserver to \"lazy\" load canvas thumbnails that are in view.\n */\nexport function IIIFThumbnail({\n border = false,\n children = null,\n imagePlaceholder = defaultPlaceholder,\n label = undefined,\n labelled = false,\n maxHeight = null,\n maxWidth = null,\n resource,\n style = {},\n thumbnail = null,\n}) {\n // eslint-disable-next-line prefer-rest-params\n const ownerState = arguments[0];\n\n return (\n <Root ownerState={ownerState}>\n <LazyLoadedImage\n placeholder={imagePlaceholder}\n thumbnail={thumbnail}\n resource={resource}\n maxHeight={maxHeight}\n maxWidth={maxWidth}\n style={style}\n border={border}\n />\n\n {labelled && <Label ownerState={ownerState}>{label || <IIIFResourceLabel resource={resource} />}</Label>}\n {children}\n </Root>\n );\n}\n\nIIIFThumbnail.propTypes = {\n border: PropTypes.bool,\n children: PropTypes.node,\n imagePlaceholder: PropTypes.string,\n label: PropTypes.string,\n labelled: PropTypes.bool,\n maxHeight: PropTypes.number,\n maxWidth: PropTypes.number,\n resource: PropTypes.object.isRequired,\n style: PropTypes.object,\n thumbnail: PropTypes.shape({\n height: PropTypes.number,\n url: PropTypes.string.isRequired,\n width: PropTypes.number,\n }),\n // eslint-disable-next-line react/no-unused-prop-types\n variant: PropTypes.oneOf(['inside', 'outside']),\n};\n","import { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport { withPlugins } from '../extend/withPlugins';\nimport { getConfig } from '../state/selectors';\nimport { IIIFThumbnail } from '../components/IIIFThumbnail';\n\n/**\n * mapStateToProps - to hook up connect\n * @private\n */\nconst mapStateToProps = (state) => ({\n thumbnailsConfig: getConfig(state).thumbnails,\n});\n\nconst enhance = compose(connect(mapStateToProps), withPlugins('IIIFThumbnail'));\n\nexport default enhance(IIIFThumbnail);\n","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14\"\n}), 'SearchSharp');","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M21.99 2H2v16h16l4 4zM18 14H6v-2h12zm0-3H6V9h12zm0-3H6V6h12z\"\n}), 'CommentSharp');"],"x_google_ignoreList":[1,6,7],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CommentSharp-CqGF7axd.js","names":["React","React2","React3","createSvgIcon","createSvgIcon"],"sources":["../src/hooks/useThumbnailService.js","../node_modules/react-intersection-observer/dist/index.mjs","../src/contexts/LocaleContext.js","../src/components/IIIFResourceLabel.jsx","../src/components/IIIFThumbnail.jsx","../src/containers/IIIFThumbnail.js","../node_modules/@mui/icons-material/esm/SearchSharp.js","../node_modules/@mui/icons-material/esm/CommentSharp.js"],"sourcesContent":["import { useSelector } from 'react-redux';\n\nimport { getThumbnailFactory } from '../state/selectors/thumbnails';\n\n/** */\nexport default function useThumbnailService(maxHeight, maxWidth) {\n return useSelector((state) => getThumbnailFactory(state, maxHeight, maxWidth), [maxHeight, maxWidth]);\n}\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root) return \"0\";\n if (RootIds.has(root)) return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a2;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n [...(_a2 = elements.get(entry.target)) != null ? _a2 : []].forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"lastInView\");\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n this.lastInView = this.props.initialInView;\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n const previousInView = this.lastInView;\n this.lastInView = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n this.lastInView = props.initialInView;\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip) return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n if (this.lastInView === void 0) {\n this.lastInView = this.props.initialInView;\n }\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-expect-error\n trackVisibility,\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a2;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef(onChange);\n const lastInViewRef = React2.useRef(initialInView);\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (lastInViewRef.current === void 0) {\n lastInViewRef.current = initialInView;\n }\n if (skip || !ref) return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n const previousInView = lastInViewRef.current;\n lastInViewRef.current = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n setState({\n inView,\n entry\n });\n if (callback.current) callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-expect-error\n trackVisibility,\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a2 = state.entry) == null ? void 0 : _a2.target;\n const previousEntryTarget = React2.useRef(void 0);\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n lastInViewRef.current = initialInView;\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\n\n// src/useOnInView.tsx\nimport * as React3 from \"react\";\nvar _a, _b;\nvar useSyncEffect = (_b = (_a = \"useInsertionEffect\" in React3 ? React3.useInsertionEffect : void 0) != null ? _a : React3.useLayoutEffect) != null ? _b : React3.useEffect;\nvar useOnInView = (onIntersectionChange, {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n triggerOnce,\n skip\n} = {}) => {\n const onIntersectionChangeRef = React3.useRef(onIntersectionChange);\n const observedElementRef = React3.useRef(null);\n const observerCleanupRef = React3.useRef(void 0);\n const lastInViewRef = React3.useRef(void 0);\n useSyncEffect(() => {\n onIntersectionChangeRef.current = onIntersectionChange;\n }, [onIntersectionChange]);\n return React3.useCallback(\n (element) => {\n const cleanupExisting = () => {\n if (observerCleanupRef.current) {\n const cleanup = observerCleanupRef.current;\n observerCleanupRef.current = void 0;\n cleanup();\n }\n };\n if (element === observedElementRef.current) {\n return observerCleanupRef.current;\n }\n if (!element || skip) {\n cleanupExisting();\n observedElementRef.current = null;\n lastInViewRef.current = void 0;\n return;\n }\n cleanupExisting();\n observedElementRef.current = element;\n let destroyed = false;\n const destroyObserver = observe(\n element,\n (inView, entry) => {\n const previousInView = lastInViewRef.current;\n lastInViewRef.current = inView;\n if (previousInView === void 0 && !inView) {\n return;\n }\n onIntersectionChangeRef.current(\n inView,\n entry\n );\n if (triggerOnce && inView) {\n stopObserving();\n }\n },\n {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay\n }\n );\n function stopObserving() {\n if (destroyed) return;\n destroyed = true;\n destroyObserver();\n observedElementRef.current = null;\n observerCleanupRef.current = void 0;\n lastInViewRef.current = void 0;\n }\n observerCleanupRef.current = stopObserving;\n return observerCleanupRef.current;\n },\n [\n Array.isArray(threshold) ? threshold.toString() : threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n triggerOnce,\n skip\n ]\n );\n};\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView,\n useOnInView\n};\n//# sourceMappingURL=index.mjs.map","import { createContext } from 'react';\n\nconst LocaleContext = createContext();\n\nexport default LocaleContext;\n","import { useContext } from 'react';\nimport { useSelector } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport { getLocale } from '../state/selectors';\nimport LocaleContext from '../contexts/LocaleContext';\n\n/**\n * Render the contextually appropriate label for the resource\n */\nexport function IIIFResourceLabel({ fallback, resource }) {\n const contextLocale = useContext(LocaleContext);\n const fallbackLocale = useSelector((state) => getLocale(state, {}));\n\n if (!resource) return fallback;\n\n const label = resource.getLabel();\n\n if (!label) return fallback;\n\n return label.getValue(contextLocale || fallbackLocale || '') ?? (fallback || resource.id);\n}\n\nIIIFResourceLabel.propTypes = {\n fallback: PropTypes.string,\n resource: PropTypes.object.isRequired,\n};\n","import { useMemo, useEffect, useState, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport { useInView } from 'react-intersection-observer';\nimport { IIIFResourceLabel } from './IIIFResourceLabel';\nimport { useThumbnailService } from '../hooks';\nimport FailedImageContext from '../contexts/FailedImageContext';\n\nconst Root = styled('div', { name: 'IIIFThumbnail', slot: 'root' })({});\n\nconst Label = styled('span', { name: 'IIIFThumbnail', slot: 'label' })(({ theme }) => ({\n ...theme.typography.caption,\n}));\n\nconst Image = styled('img', { name: 'IIIFThumbnail', slot: 'image' })(() => ({\n height: 'auto',\n width: 'auto',\n}));\n\n/**\n * A lazy-loaded image that uses IntersectionObserver to determine when to\n * try to load the image (or even calculate that the image url/height/width are)\n */\nconst LazyLoadedImage = ({\n border = false,\n placeholder,\n style = {},\n thumbnail = null,\n resource,\n maxHeight = null,\n maxWidth = null,\n ...props\n}) => {\n const { ref, inView } = useInView();\n const [loaded, setLoaded] = useState(false);\n const [failed, setFailed] = useState(false);\n const thumbnailService = useThumbnailService(maxHeight, maxWidth);\n const { notifyFailure, fallbackImage } = useContext(FailedImageContext);\n\n /**\n * Handles the intersection (visibility) of a given thumbnail, by requesting\n * the image and then updating the state.\n */\n useEffect(() => {\n if (loaded || !inView) return;\n\n setLoaded(true);\n }, [inView, loaded]);\n\n const image = useMemo(() => {\n if (thumbnail) return thumbnail;\n\n const i = thumbnailService.get(resource);\n\n if (i && i.url) return i;\n\n return undefined;\n }, [resource, thumbnail, thumbnailService]);\n\n const imageStyles = useMemo(() => {\n const styleProps = {\n height: undefined,\n maxHeight: undefined,\n maxWidth: undefined,\n width: undefined,\n };\n\n // If we're using a fallback image due to failure, use object-fit to preserve aspect ratio\n if (failed && fallbackImage) {\n return {\n ...styleProps,\n ...style,\n maxWidth,\n maxHeight,\n objectFit: 'contain',\n };\n }\n\n if (!image) return { ...style, height: maxHeight, width: maxWidth };\n\n const { height: thumbHeight, width: thumbWidth } = image;\n if (thumbHeight && thumbWidth) {\n if ((maxHeight && thumbHeight > maxHeight) || (maxWidth && thumbWidth > maxWidth)) {\n const aspectRatio = thumbWidth / thumbHeight;\n\n if (maxHeight && maxWidth) {\n if (maxWidth / maxHeight < aspectRatio) {\n styleProps.height = Math.round(maxWidth / aspectRatio);\n styleProps.width = maxWidth;\n } else {\n styleProps.height = maxHeight;\n styleProps.width = Math.round(maxHeight * aspectRatio);\n }\n } else if (maxHeight) {\n styleProps.height = maxHeight;\n styleProps.maxWidth = Math.round(maxHeight * aspectRatio);\n } else if (maxWidth) {\n styleProps.width = maxWidth;\n styleProps.maxHeight = Math.round(maxWidth / aspectRatio);\n }\n } else {\n styleProps.width = thumbWidth;\n styleProps.height = thumbHeight;\n }\n } else if (thumbHeight && !thumbWidth) {\n styleProps.height = maxHeight;\n } else if (!thumbHeight && thumbWidth) {\n styleProps.width = maxWidth;\n } else {\n // The thumbnail wasn't retrieved via an Image API service,\n // and its dimensions are not specified in the JSON-LD\n // (note that this may result in a blurry image)\n styleProps.width = maxWidth;\n styleProps.height = maxHeight;\n }\n\n return {\n ...styleProps,\n ...style,\n };\n }, [image, maxWidth, maxHeight, style, failed, fallbackImage]);\n\n const { url: src = placeholder } = (loaded && (thumbnail || image)) || {};\n // Decide final image source: normal, failed fallback, or placeholder\n const finalSrc = failed ? fallbackImage || placeholder : src;\n\n return (\n <Image\n ownerState={{ border }}\n ref={ref}\n alt={failed ? 'Thumbnail image unavailable' : ''}\n role={failed ? undefined : 'presentation'}\n src={finalSrc}\n style={imageStyles}\n onError={() => {\n setFailed(true);\n if (finalSrc) notifyFailure(finalSrc);\n }}\n {...props}\n />\n );\n};\n\nLazyLoadedImage.propTypes = {\n border: PropTypes.bool,\n maxHeight: PropTypes.number,\n maxWidth: PropTypes.number,\n placeholder: PropTypes.string.isRequired,\n resource: PropTypes.object.isRequired,\n style: PropTypes.object,\n thumbnail: PropTypes.shape({\n height: PropTypes.number,\n url: PropTypes.string.isRequired,\n width: PropTypes.number,\n }),\n};\n\nconst defaultPlaceholder =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mMMDQmtBwADgwF/Op8FmAAAAABJRU5ErkJggg==';\n\n/**\n * Uses InteractionObserver to \"lazy\" load canvas thumbnails that are in view.\n */\nexport function IIIFThumbnail({\n border = false,\n children = null,\n imagePlaceholder = defaultPlaceholder,\n label = undefined,\n labelled = false,\n maxHeight = null,\n maxWidth = null,\n resource,\n style = {},\n thumbnail = null,\n}) {\n // eslint-disable-next-line prefer-rest-params\n const ownerState = arguments[0];\n\n return (\n <Root ownerState={ownerState}>\n <LazyLoadedImage\n placeholder={imagePlaceholder}\n thumbnail={thumbnail}\n resource={resource}\n maxHeight={maxHeight}\n maxWidth={maxWidth}\n style={style}\n border={border}\n />\n\n {labelled && <Label ownerState={ownerState}>{label || <IIIFResourceLabel resource={resource} />}</Label>}\n {children}\n </Root>\n );\n}\n\nIIIFThumbnail.propTypes = {\n border: PropTypes.bool,\n children: PropTypes.node,\n imagePlaceholder: PropTypes.string,\n label: PropTypes.string,\n labelled: PropTypes.bool,\n maxHeight: PropTypes.number,\n maxWidth: PropTypes.number,\n resource: PropTypes.object.isRequired,\n style: PropTypes.object,\n thumbnail: PropTypes.shape({\n height: PropTypes.number,\n url: PropTypes.string.isRequired,\n width: PropTypes.number,\n }),\n // eslint-disable-next-line react/no-unused-prop-types\n variant: PropTypes.oneOf(['inside', 'outside']),\n};\n","import { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport { withPlugins } from '../extend/withPlugins';\nimport { getConfig } from '../state/selectors';\nimport { IIIFThumbnail } from '../components/IIIFThumbnail';\n\n/**\n * mapStateToProps - to hook up connect\n * @private\n */\nconst mapStateToProps = (state) => ({\n thumbnailsConfig: getConfig(state).thumbnails,\n});\n\nconst enhance = compose(connect(mapStateToProps), withPlugins('IIIFThumbnail'));\n\nexport default enhance(IIIFThumbnail);\n","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14\"\n}), 'SearchSharp');","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M21.99 2H2v16h16l4 4zM18 14H6v-2h12zm0-3H6V9h12zm0-3H6V6h12z\"\n}), 'CommentSharp');"],"x_google_ignoreList":[1,6,7],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { a as e, d as t, f as n, ft as r, h as i, m as a, rt as o, u as s, ut as c } from "./getters-
|
|
2
|
-
import { G as l,
|
|
1
|
+
import { a as e, d as t, f as n, ft as r, h as i, m as a, rt as o, u as s, ut as c } from "./getters-CD0HjudG.js";
|
|
2
|
+
import { G as l, Ht as u, Wt as d, an as f, mt as p, nn as m, p as h, s as g, t as _ } from "./canvases-DKeoerqc.js";
|
|
3
3
|
import { t as v } from "./action-types-DjIbTE-A.js";
|
|
4
4
|
import { createContext as ee } from "react";
|
|
5
5
|
//#region node_modules/lodash/_baseFilter.js
|
|
6
6
|
var y = /* @__PURE__ */ c(((e, t) => {
|
|
7
|
-
var n =
|
|
7
|
+
var n = m();
|
|
8
8
|
function r(e, t) {
|
|
9
9
|
var r = [];
|
|
10
10
|
return n(e, function(e, n, i) {
|
|
@@ -13,7 +13,7 @@ var y = /* @__PURE__ */ c(((e, t) => {
|
|
|
13
13
|
}
|
|
14
14
|
t.exports = r;
|
|
15
15
|
})), b = /* @__PURE__ */ c(((e, t) => {
|
|
16
|
-
var n = f(), r = y(), i =
|
|
16
|
+
var n = f(), r = y(), i = d(), a = o();
|
|
17
17
|
function s(e, t) {
|
|
18
18
|
return (a(e) ? n : r)(e, i(t, 3));
|
|
19
19
|
}
|
|
@@ -99,6 +99,9 @@ var y = /* @__PURE__ */ c(((e, t) => {
|
|
|
99
99
|
get journeyOrder() {
|
|
100
100
|
return this.resource["dbf:journey"]?.order ?? null;
|
|
101
101
|
}
|
|
102
|
+
get journeyId() {
|
|
103
|
+
return this.resource["dbf:journey"]?.id ?? null;
|
|
104
|
+
}
|
|
102
105
|
}, w = class {
|
|
103
106
|
constructor(e, t) {
|
|
104
107
|
this.json = e, this.target = t;
|
|
@@ -188,6 +191,9 @@ var y = /* @__PURE__ */ c(((e, t) => {
|
|
|
188
191
|
get journeyOrder() {
|
|
189
192
|
return this.resource["dbf:journey"]?.order ?? null;
|
|
190
193
|
}
|
|
194
|
+
get journeyId() {
|
|
195
|
+
return this.resource["dbf:journey"]?.id ?? null;
|
|
196
|
+
}
|
|
191
197
|
}, E = class {
|
|
192
198
|
constructor(e, t) {
|
|
193
199
|
this.json = e, this.target = t;
|
|
@@ -208,7 +214,7 @@ var y = /* @__PURE__ */ c(((e, t) => {
|
|
|
208
214
|
static determineAnnotation(e, t) {
|
|
209
215
|
return e ? e.type === "AnnotationPage" ? new E(e, t) : new w(e, t) : null;
|
|
210
216
|
}
|
|
211
|
-
}, O = (e) => n(e).annotations, k = a([p, (e, { motivations: t }) => t], (e, t) => t || e.annotations.filteredMotivations), ne = a([
|
|
217
|
+
}, O = (e) => n(e).annotations, k = a([p, (e, { motivations: t }) => t], (e, t) => t || e.annotations.filteredMotivations), ne = a([_, O], (e, t) => !t || !e || !t[e.id] ? [] : Object.values(t[e.id]).flat()), A = a([ne], (e) => (0, x.default)(Object.values(e).map((e) => e && D.determineAnnotation(e.json)), (e) => e && e.present())), j = a([(e, { canvasId: t, ...n }) => t ? [t] : h(e, n), O], (e, t) => !t || e.length === 0 ? [] : e.flatMap((e) => t[e] && Object.values(t[e]))), M = a([j], (e) => (0, x.default)(Object.values(e).map((e) => e && D.determineAnnotation(e.json)), (e) => e && e.present())), N = a([A, k], (e, t) => {
|
|
212
218
|
let n = e.flatMap((e) => e.resources);
|
|
213
219
|
return !t || t.length === 0 ? n : n.filter((e) => e.motivations.some((e) => t.includes(e)));
|
|
214
220
|
}), P = a([N], (e) => e.map((e) => ({
|
|
@@ -222,7 +228,7 @@ var y = /* @__PURE__ */ c(((e, t) => {
|
|
|
222
228
|
}), I = a([e], ({ selectedAnnotationId: e }) => e), L = a([M, I], (e, t) => e.map((e) => ({
|
|
223
229
|
id: e["@id"] || e.id,
|
|
224
230
|
resources: e.resources.filter((e) => t === e.id)
|
|
225
|
-
})).filter((e) => e.resources.length > 0)), R =
|
|
231
|
+
})).filter((e) => e.resources.length > 0)), R = u(), z = a([(e, { windowId: t }) => t, (e) => n(e).searches], (e, n) => !e || !n ? t : n[e]), B = a([z, (e, { companionWindowId: t }) => t], (e, t) => {
|
|
226
232
|
if (!(!e || !t)) return e[t];
|
|
227
233
|
}), V = a([B], (e) => e ? Object.values(e.data) : s), H = a([B], (e) => e && e.query), U = a([V], (e) => e.some((e) => e.isFetching)), W = a([B], (e) => {
|
|
228
234
|
if (!(!e || !e.data)) return Object.values(e.data).find((e) => !e.isFetching && e.json && e.json.within)?.json?.within?.total;
|
|
@@ -232,7 +238,7 @@ var y = /* @__PURE__ */ c(((e, t) => {
|
|
|
232
238
|
return t && t.json && t.json.next;
|
|
233
239
|
}), G = a([V], (e) => e.flatMap((e) => !e || !e.json || e.isFetching || !e.json.hits ? s : e.json.hits)), K = a([V], (e) => e && J(e)), q = a([
|
|
234
240
|
G,
|
|
235
|
-
|
|
241
|
+
g,
|
|
236
242
|
K
|
|
237
243
|
], (e, t, n) => {
|
|
238
244
|
if (!t || t.length === 0 || !e || e.length === 0) return s;
|
|
@@ -260,7 +266,7 @@ function Y(e, t) {
|
|
|
260
266
|
let n = t.map((e) => e.id);
|
|
261
267
|
return [].concat(e.resources).sort((e, t) => n.indexOf(e.targetId) - n.indexOf(t.targetId));
|
|
262
268
|
}
|
|
263
|
-
var X = a([K,
|
|
269
|
+
var X = a([K, g], (e, t) => Y(e, t)), Z = a([z], (e) => e ? Object.values(e).map((e) => Object.values(e.data)).map((e) => J(e)).filter((e) => e.resources.length > 0) : s), ie = a([e, B], (e, t) => t && t.selectedContentSearchAnnotationIds || []), Q = a([K, (e, { annotationUri: t }) => t], (e, t) => e.resources.find((e) => e.id === t)), ae = a([Q, l], (e, t) => e && e.resource && e.resource.label ? R.PropertyValue.parse(e.resource.label).getValues(t) : s), oe = a([Z, (e, { annotationId: t }) => t], (e, t) => e.flatMap((e) => e.resources).find((e) => e.id === t)), se = a([oe, (e, { windowId: t }) => (n) => _(e, {
|
|
264
270
|
canvasId: n,
|
|
265
271
|
windowId: t
|
|
266
272
|
})], (e, t) => {
|
|
@@ -336,4 +342,4 @@ var he = ee({
|
|
|
336
342
|
//#endregion
|
|
337
343
|
export { L as A, Y as C, O as D, P as E, C as F, E as M, T as N, M as O, w as P, q as S, N as T, U as _, ue as a, ie as b, de as c, re as d, Q as f, z as g, Z as h, le as i, D as j, I as k, pe as l, K as m, fe as n, ce as o, ae as p, me as r, $ as s, he as t, se as u, W as v, F as w, X as x, H as y };
|
|
338
344
|
|
|
339
|
-
//# sourceMappingURL=FailedImageContext-
|
|
345
|
+
//# sourceMappingURL=FailedImageContext-yYxY_Y6U.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FailedImageContext-yYxY_Y6U.js","names":[],"sources":["../node_modules/lodash/_baseFilter.js","../node_modules/lodash/filter.js","../node_modules/lodash/compact.js","../src/lib/AnnotationResource.js","../src/lib/AnnotationList.js","../src/lib/AnnotationItem.js","../src/lib/AnnotationPage.js","../src/lib/AnnotationFactory.js","../src/state/selectors/annotations.js","../src/state/selectors/searches.js","../src/state/actions/annotation.js","../src/contexts/FailedImageContext.js"],"sourcesContent":["var baseEach = require('./_baseEach');\n\n/**\n * The base implementation of `_.filter` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction baseFilter(collection, predicate) {\n var result = [];\n baseEach(collection, function(value, index, collection) {\n if (predicate(value, index, collection)) {\n result.push(value);\n }\n });\n return result;\n}\n\nmodule.exports = baseFilter;\n","var arrayFilter = require('./_arrayFilter'),\n baseFilter = require('./_baseFilter'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection`, returning an array of all elements\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * **Note:** Unlike `_.remove`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.reject\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * _.filter(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.filter(users, { 'age': 36, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.filter(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.filter(users, 'active');\n * // => objects for ['barney']\n *\n * // Combining several predicates using `_.overEvery` or `_.overSome`.\n * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n * // => objects for ['fred', 'barney']\n */\nfunction filter(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, baseIteratee(predicate, 3));\n}\n\nmodule.exports = filter;\n","/**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `-0`, `0n`, `\"\"`, `undefined`, and `NaN` are falsy.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\nfunction compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = compact;\n","import compact from 'lodash/compact';\nimport { v4 as uuid } from 'uuid';\n\n/** */\nexport default class AnnotationResource {\n /** */\n constructor(resource = {}) {\n this.resource = resource;\n }\n\n /** */\n isOnlyTag() {\n return this.motivations.length === 1 && this.motivations[0] === 'oa:tagging';\n }\n\n /** */\n get id() {\n this._id = this._id || this.resource['@id'] || (this.resources[0] && this.resources[0]['@id']) || uuid();\n return this._id;\n }\n\n /** */\n get targetId() {\n const on = this.on[0];\n switch (typeof on) {\n case 'string':\n return on.replace(/#?xywh=(.*)$/, '');\n case 'object':\n return on.full.replace(/#?xywh=(.*)$/, '');\n default:\n return null;\n }\n }\n\n /**\n * @return {[Array]}\n */\n get motivations() {\n return compact(new Array(this.resource.motivation)).flat();\n }\n\n /** */\n get resources() {\n return compact(new Array(this.resource.resource)).flat();\n }\n\n /** */\n get on() {\n return compact(new Array(this.resource.on)).flat();\n }\n\n /** */\n get tags() {\n if (this.isOnlyTag()) {\n return this.resources.map((r) => r.chars);\n }\n return this.resources.filter((r) => r['@type'] === 'oa:Tag').map((r) => r.chars);\n }\n\n /** */\n get chars() {\n return this.resources\n .filter((r) => r['@type'] !== 'oa:Tag')\n .map((r) => r.chars)\n .join(' ');\n }\n\n /** */\n get selector() {\n const on = this.on[0];\n switch (typeof on) {\n case 'string':\n return on;\n case 'object':\n // For choices, just return the default for now. FIXME: enhance for SVG\n // selectors\n if (on.selector['@type'] === 'oa:Choice') {\n return on.selector.default;\n }\n return on.selector;\n default:\n return null;\n }\n }\n\n /** */\n get svgSelector() {\n const on = this.on[0];\n\n switch (typeof on) {\n case 'string':\n return null;\n case 'object':\n if (on.selector && on.selector.item && on.selector.item['@type'] === 'oa:SvgSelector') {\n return on.selector.item;\n }\n return null;\n default:\n return null;\n }\n }\n\n /** */\n get fragmentSelector() {\n const { selector } = this;\n\n let match;\n\n switch (typeof selector) {\n case 'string':\n match = selector.match(/xywh=(.*)$/);\n break;\n case 'object':\n match = selector.value.match(/xywh=(.*)$/);\n break;\n default:\n return null;\n }\n\n return match && match[1].split(',').map((str) => parseInt(str, 10));\n }\n\n /** */\n get pointSelector() {\n const { selector } = this;\n if (selector && typeof selector === 'object' && selector['@type'] === 'oa:PointSelector') {\n return { x: selector.x, y: selector.y };\n }\n return null;\n }\n\n /** the POI's position within its journey (see mirador-annotation-editor's `dbf:journey`), or null when the POI is not part of a journey */\n get journeyOrder() {\n return this.resource['dbf:journey']?.order ?? null;\n }\n\n /** the id of the journey the POI belongs to (see mirador-annotation-editor's `dbf:journey`), or null when the POI is not part of a journey */\n get journeyId() {\n return this.resource['dbf:journey']?.id ?? null;\n }\n}\n","import AnnotationResource from './AnnotationResource';\n/** */\nexport default class AnnotationList {\n /** */\n constructor(json, target) {\n this.json = json;\n this.target = target;\n }\n\n /** */\n get id() {\n return this.json['@id'];\n }\n\n /** */\n present() {\n return this.resources && this.resources.length > 0;\n }\n\n /** */\n get resources() {\n this._resources =\n this._resources ||\n (() => {\n if (!this.json || !this.json.resources) return [];\n\n return [this.json.resources].flat().map((resource) => new AnnotationResource(resource));\n })();\n return this._resources;\n }\n}\n","import compact from 'lodash/compact';\nimport { v4 as uuid } from 'uuid';\n\n/**\n * A modeled WebAnnotation item\n */\nexport default class AnnotationItem {\n /** */\n constructor(resource = {}) {\n this.resource = resource;\n }\n\n /** */\n isOnlyTag() {\n return this.motivations.length === 1 && this.motivations[0] === 'tagging';\n }\n\n /** */\n get id() {\n this._id = this._id || this.resource.id || uuid();\n return this._id;\n }\n\n /** */\n get targetId() {\n const target = this.target[0];\n switch (typeof target) {\n case 'string':\n return target.replace(/#?xywh=(.*)$/, '');\n case 'object':\n return (target.source && target.source.id) || target.source || target.id;\n default:\n return null;\n }\n }\n\n /**\n * @return {[Array]}\n */\n get motivations() {\n return compact(new Array(this.resource.motivation)).flat();\n }\n\n /** */\n get body() {\n return compact(new Array(this.resource.body)).flat();\n }\n\n /** */\n get resources() {\n return this.body;\n }\n\n /** */\n get tags() {\n if (this.isOnlyTag()) {\n return this.body.map((r) => r.value);\n }\n return this.body.filter((r) => r.purpose === 'tagging').map((r) => r.value);\n }\n\n /** */\n get target() {\n return compact(new Array(this.resource.target)).flat();\n }\n\n /** */\n get chars() {\n if (this.isOnlyTag()) return null;\n return this.body\n .filter((r) => r.purpose !== 'tagging')\n .map((r) => r.value)\n .join(' ');\n }\n\n /** */\n get selector() {\n const target = this.target[0];\n switch (typeof target) {\n case 'string':\n return target;\n case 'object':\n return compact(new Array(target.selector)).flat();\n default:\n return null;\n }\n }\n\n /** */\n get svgSelector() {\n const { selector } = this;\n switch (typeof selector) {\n case 'string':\n return null;\n case 'object':\n return selector.find((s) => s.type && s.type === 'SvgSelector');\n default:\n return null;\n }\n }\n\n /** */\n get fragmentSelector() {\n const { selector } = this;\n\n let match;\n let fragmentSelector;\n\n switch (typeof selector) {\n case 'string':\n match = selector.match(/xywh=(.*)$/);\n break;\n case 'object':\n fragmentSelector = selector.find((s) => s.type && s.type === 'FragmentSelector');\n match = fragmentSelector && fragmentSelector.value.match(/xywh=(.*)$/);\n break;\n default:\n return null;\n }\n\n return match && match[1].split(',').map((str) => parseInt(str, 10));\n }\n\n /** */\n get pointSelector() {\n const { selector } = this;\n switch (typeof selector) {\n case 'string':\n return null;\n case 'object':\n return selector.find((s) => s.type && s.type === 'PointSelector');\n default:\n return null;\n }\n }\n\n /** the POI's position within its journey (see mirador-annotation-editor's `dbf:journey`), or null when the POI is not part of a journey */\n get journeyOrder() {\n return this.resource['dbf:journey']?.order ?? null;\n }\n\n /** the id of the journey the POI belongs to (see mirador-annotation-editor's `dbf:journey`), or null when the POI is not part of a journey */\n get journeyId() {\n return this.resource['dbf:journey']?.id ?? null;\n }\n}\n","import AnnotationItem from './AnnotationItem';\n/**\n * Annotation representation for IIIF Presentation v3\n * https://iiif.io/api/presentation/3.0/#55-annotation-page\n */\nexport default class AnnotationPage {\n /** */\n constructor(json, target) {\n this.json = json;\n this.target = target;\n }\n\n /** */\n get id() {\n return this.json.id;\n }\n\n /** */\n present() {\n return this.items && this.items.length > 0;\n }\n\n /** */\n get items() {\n this._items =\n this._items ||\n (() => {\n if (!this.json || !this.json.items) return [];\n\n return [this.json.items].flat().map((resource) => new AnnotationItem(resource));\n })();\n return this._items;\n }\n\n /**\n * Alias to items for compatibility for right now.\n */\n get resources() {\n return this.items;\n }\n}\n","import AnnotationList from './AnnotationList';\nimport AnnotationPage from './AnnotationPage';\n\n/**\n * Used to determine the type of Annotation supported by a version of the IIIF\n * Presentation API.\n */\nexport default class AnnotationFactory {\n /** */\n static determineAnnotation(json, target) {\n if (!json) {\n return null;\n }\n\n // IIIF Presentation API v3. AnnotationPage\n if (json.type === 'AnnotationPage') {\n return new AnnotationPage(json, target);\n }\n\n // IIIF Presentation API v2. OpenAnnotation and SharedCanvas models\n return new AnnotationList(json, target);\n }\n}\n","import { createSelector } from 'reselect';\nimport filter from 'lodash/filter';\nimport AnnotationFactory from '../../lib/AnnotationFactory';\nimport { miradorSlice } from './utils';\nimport { getCanvas, getVisibleCanvasIds } from './canvases';\nimport { getConfig } from './config';\nimport { getWindow } from './getters';\n\n/**\n * Returns the annotation object from the mirador slice.\n * @param {object} state redux state\n * @returns {object} Annotations from the state\n */\nexport const getAnnotations = (state) => miradorSlice(state).annotations;\n\nconst getMotivations = createSelector(\n [getConfig, (state, { motivations }) => motivations],\n (config, motivations) => motivations || config.annotations.filteredMotivations,\n);\n\nconst getAnnotationsOnCanvas = createSelector([getCanvas, getAnnotations], (canvas, annotations) => {\n if (!annotations || !canvas) return [];\n if (!annotations[canvas.id]) return [];\n\n return Object.values(annotations[canvas.id]).flat();\n});\n\nconst getPresentAnnotationsCanvas = createSelector([getAnnotationsOnCanvas], (annotations) =>\n filter(\n Object.values(annotations).map((annotation) => annotation && AnnotationFactory.determineAnnotation(annotation.json)),\n (annotation) => annotation && annotation.present(),\n ),\n);\n\nconst getAnnotationsOnSelectedCanvases = createSelector(\n [(state, { canvasId, ...otherProps }) => (canvasId ? [canvasId] : getVisibleCanvasIds(state, otherProps)), getAnnotations],\n (canvasIds, annotations) => {\n if (!annotations || canvasIds.length === 0) return [];\n return canvasIds.flatMap((targetId) => annotations[targetId] && Object.values(annotations[targetId]));\n },\n);\n\n/**\n * Returns an array of present annotations given a canvasId.\n * @param {object} state redux state\n * @param {string} canvasId canvasId\n * @returns {Array} An array of present annotations\n */\nexport const getPresentAnnotationsOnSelectedCanvases = createSelector([getAnnotationsOnSelectedCanvases], (annotations) =>\n filter(\n Object.values(annotations).map((annotation) => annotation && AnnotationFactory.determineAnnotation(annotation.json)),\n (annotation) => annotation && annotation.present(),\n ),\n);\n\n/**\n * Returns an array of annotation resources filtered by the given motivation for a particular canvas.\n * @param {Array} annotations\n * @param {Array} motivations\n * @returns {Array}\n */\nexport const getAnnotationResourcesByMotivationForCanvas = createSelector(\n [getPresentAnnotationsCanvas, getMotivations],\n (annotations, motivations) => {\n const resources = annotations.flatMap((annotation) => annotation.resources);\n\n // If motivations is empty, null, or undefined, return everything\n if (!motivations || motivations.length === 0) {\n return resources;\n }\n\n // Otherwise filter by motivations\n return resources.filter((resource) => resource.motivations.some((motivation) => motivations.includes(motivation)));\n },\n);\n\n/**\n * Returns annotation resources for a canvas destructured into their id/content/tags/targetId.\n * @param {object} state\n * @param {object} props\n * @param {string} props.canvasId\n * @param {string} props.windowId\n * @returns {Array} [{ id: 'abc123', content: 'Annotation Content' }, ...]\n */\nexport const getAnnotationResourcesDataForCanvas = createSelector([getAnnotationResourcesByMotivationForCanvas], (resources) =>\n resources.map((resource) => ({\n content: resource.chars,\n id: resource.id,\n tags: resource.tags,\n targetId: resource.targetId,\n })),\n);\n\n/**\n * Returns an array of annotation resources filtered by the given motivation.\n * @param {Array} annotations\n * @param {Array} motivations\n * @returns {Array}\n */\nexport const getAnnotationResourcesByMotivation = createSelector(\n [getPresentAnnotationsOnSelectedCanvases, getMotivations],\n (annotations, motivations) => {\n const resources = annotations.flatMap((annotation) => annotation.resources);\n\n // If motivations is empty, null, or undefined, return everything\n if (!motivations || motivations.length === 0) {\n return resources;\n }\n\n // Otherwise filter by motivations\n return resources.filter((resource) => resource.motivations.some((motivation) => motivations.includes(motivation)));\n },\n);\n\n/**\n * Returns the selected annotations IDs.\n * @param {object} state\n * @param {string} windowId\n * @param {Array} targetIds\n * @returns {Array}\n */\nexport const getSelectedAnnotationId = createSelector([getWindow], ({ selectedAnnotationId }) => selectedAnnotationId);\n\n/**\n * Returns annotations on selected canvases.\n * @param {object} state\n * @returns {Array}\n */\nexport const getSelectedAnnotationsOnCanvases = createSelector(\n [getPresentAnnotationsOnSelectedCanvases, getSelectedAnnotationId],\n (canvasAnnotations, selectedAnnotationId) =>\n canvasAnnotations\n .map((annotation) => ({\n id: annotation['@id'] || annotation.id,\n resources: annotation.resources.filter((r) => selectedAnnotationId === r.id),\n }))\n .filter((val) => val.resources.length > 0),\n);\n","import { createSelector } from 'reselect';\nimport { PropertyValue } from 'manifesto.js';\nimport AnnotationList from '../../lib/AnnotationList';\nimport { getCanvas, getCanvases } from './canvases';\nimport { getWindow } from './getters';\nimport { getManifestLocale } from './manifests';\nimport { miradorSlice, EMPTY_ARRAY, EMPTY_OBJECT } from './utils';\n\n/**\n * Get searches from state.\n */\nconst getSearches = (state) => miradorSlice(state).searches;\n\n/**\n * Returns the search result for a specific window.\n * @param {object} state\n * @param {string} windowId\n * @returns {object}\n */\nexport const getSearchForWindow = createSelector([(state, { windowId }) => windowId, getSearches], (windowId, searches) => {\n if (!windowId || !searches) return EMPTY_OBJECT;\n\n return searches[windowId];\n});\n\n/**\n * Returns the search result for a specific companion window.\n * @param {object} state\n * @param {string} companionWindowId\n * @returns {object|undefined}\n */\nconst getSearchForCompanionWindow = createSelector(\n [getSearchForWindow, (state, { companionWindowId }) => companionWindowId],\n (results, companionWindowId) => {\n if (!results || !companionWindowId) return undefined;\n return results[companionWindowId];\n },\n);\n\n/**\n * Returns an array of search responses for a specific companion window.\n * @param {object} state\n * @returns {Array}\n */\nconst getSearchResponsesForCompanionWindow = createSelector([getSearchForCompanionWindow], (results) => {\n if (!results) return EMPTY_ARRAY;\n return Object.values(results.data);\n});\n\n/**\n * Returns the search query for a specific companion window.\n * @param {object} state\n * @param {string} windowId\n * @returns {string|undefined}\n */\nexport const getSearchQuery = createSelector([getSearchForCompanionWindow], (results) => results && results.query);\n\n/**\n * Returns if search response for a companion window is fetching.\n * @param {object} state\n * @returns {boolean}\n */\nexport const getSearchIsFetching = createSelector([getSearchResponsesForCompanionWindow], (results) =>\n results.some((result) => result.isFetching),\n);\n\n/**\n * Returns the total number of search results for a companion window.\n * @param {object} state\n * @param {string} windowId\n * @returns {number|undefined}\n */\nexport const getSearchNumTotal = createSelector([getSearchForCompanionWindow], (results) => {\n if (!results || !results.data) return undefined;\n\n const resultWithWithin = Object.values(results.data).find((result) => !result.isFetching && result.json && result.json.within);\n return resultWithWithin?.json?.within?.total;\n});\n\n/**\n * Returns the Id of the next search.\n * @param {object} state\n * @param {string} windowId\n * @returns {number|undefined}\n */\nexport const getNextSearchId = createSelector([getSearchForCompanionWindow], (results) => {\n if (!results || !results.data) return undefined;\n\n const resultWithAnUnresolvedNext = Object.values(results.data).find(\n (result) => !result.isFetching && result.json && result.json.next && !results.data[result.json.next],\n );\n\n return resultWithAnUnresolvedNext && resultWithAnUnresolvedNext.json && resultWithAnUnresolvedNext.json.next;\n});\n\nconst getSearchHitsForCompanionWindow = createSelector([getSearchResponsesForCompanionWindow], (results) =>\n results.flatMap((result) => {\n if (!result || !result.json || result.isFetching || !result.json.hits) return EMPTY_ARRAY;\n\n return result.json.hits;\n }),\n);\n\nexport const getSearchAnnotationsForCompanionWindow = createSelector(\n [getSearchResponsesForCompanionWindow],\n (results) => results && searchResultsToAnnotation(results),\n);\n\n/**\n * Returns sorted search hits based on canvas order.\n * @param {object} state\n * @param {string} manifestId\n * @returns {Array}\n */\nexport const getSortedSearchHitsForCompanionWindow = createSelector(\n [getSearchHitsForCompanionWindow, getCanvases, getSearchAnnotationsForCompanionWindow],\n (searchHits, canvases, annotation) => {\n if (!canvases || canvases.length === 0) return EMPTY_ARRAY;\n if (!searchHits || searchHits.length === 0) return EMPTY_ARRAY;\n const canvasIds = canvases.map((canvas) => canvas.id);\n\n return [].concat(searchHits).sort((a, b) => {\n const hitA = annotation.resources.find((r) => r.id === a.annotations[0]);\n const hitB = annotation.resources.find((r) => r.id === b.annotations[0]);\n return canvasIds.indexOf(hitA.targetId) - canvasIds.indexOf(hitB.targetId);\n });\n },\n);\n\n/** convert search results to an annotation */\nconst searchResultsToAnnotation = (results) => {\n const annotations = results\n .map((result) => {\n if (!result || !result.json || result.isFetching || !result.json.resources) return undefined;\n const anno = new AnnotationList(result.json);\n return {\n id: anno.id,\n resources: anno.resources,\n };\n })\n .filter(Boolean);\n\n return {\n id: (annotations.find((a) => a.id) || {}).id,\n resources: annotations.flatMap((a) => a.resources),\n };\n};\n\n/**\n * Sorts search annotations based on canvas order.\n * @returns {Array}\n */\nexport function sortSearchAnnotationsByCanvasOrder(searchAnnotations, canvases) {\n if (!searchAnnotations || !searchAnnotations.resources || searchAnnotations.length === 0) return EMPTY_ARRAY;\n if (!canvases || canvases.length === 0) return EMPTY_ARRAY;\n const canvasIds = canvases.map((canvas) => canvas.id);\n\n return []\n .concat(searchAnnotations.resources)\n .sort((annoA, annoB) => canvasIds.indexOf(annoA.targetId) - canvasIds.indexOf(annoB.targetId));\n}\n\n/**\n * Returns sorted search annotations for companion window.\n * @param {object} state\n * @param {string} companionWindowId\n * @returns {Array}\n */\nexport const getSortedSearchAnnotationsForCompanionWindow = createSelector(\n [getSearchAnnotationsForCompanionWindow, getCanvases],\n (searchAnnotations, canvases) => sortSearchAnnotationsByCanvasOrder(searchAnnotations, canvases),\n);\n\n/**\n * Returns sorted search annotations for window.\n * @param {object} state\n * @param {string} windowId\n * @returns {Array}\n */\nexport const getSearchAnnotationsForWindow = createSelector([getSearchForWindow], (results) => {\n if (!results) return EMPTY_ARRAY;\n const data = Object.values(results).map((r) => Object.values(r.data));\n\n return data.map((d) => searchResultsToAnnotation(d)).filter((a) => a.resources.length > 0);\n});\n\n/**\n * Returns ids of selected content search annotations.\n * @param {object} state\n * @param {string} windowId\n * @returns {Array}\n */\nexport const getSelectedContentSearchAnnotationIds = createSelector(\n [getWindow, getSearchForCompanionWindow],\n (window, search) => (search && search.selectedContentSearchAnnotationIds) || [],\n);\n\n/**\n * Returns resource annotations for search hit.\n * @param {object} state\n * @param {string} windowId\n * @returns {Array}\n */\nexport const getResourceAnnotationForSearchHit = createSelector(\n [getSearchAnnotationsForCompanionWindow, (state, { annotationUri }) => annotationUri],\n (annotation, annotationUri) => annotation.resources.find((r) => r.id === annotationUri),\n);\n\n/**\n * Returns annotation label.\n * @param {object} state\n * @param {string} windowId\n * @returns {Array}\n */\nexport const getResourceAnnotationLabel = createSelector(\n [getResourceAnnotationForSearchHit, getManifestLocale],\n (resourceAnnotation, locale) => {\n if (!(resourceAnnotation && resourceAnnotation.resource && resourceAnnotation.resource.label)) return EMPTY_ARRAY;\n\n return PropertyValue.parse(resourceAnnotation.resource.label).getValues(locale);\n },\n);\n\nconst getAnnotationById = createSelector(\n [getSearchAnnotationsForWindow, (state, { annotationId }) => annotationId],\n (annotations, annotationId) => {\n const resourceAnnotations = annotations.flatMap((a) => a.resources);\n return resourceAnnotations.find((r) => r.id === annotationId);\n },\n);\n\n/**\n * Returns annotation label.\n * @param {object} state\n * @param {string} windowId\n * @returns {Array}\n */\nexport const getCanvasForAnnotation = createSelector(\n [\n getAnnotationById,\n (state, { windowId }) =>\n (canvasId) =>\n getCanvas(state, { canvasId, windowId }),\n ],\n (annotation, getCanvasById) => {\n const canvasId = annotation && annotation.targetId;\n return canvasId && getCanvasById(canvasId);\n },\n);\n","import ActionTypes from './action-types';\n\n/**\n * Request annotations on a canvas\n *\n * NOTE: there is no corresponding reducer; the expected API is sagas will\n * pick this action up and act on it accordingly.\n */\nexport function requestCanvasAnnotations(windowId, canvasId) {\n return {\n canvasId,\n type: ActionTypes.REQUEST_CANVAS_ANNOTATIONS,\n windowId,\n };\n}\n\n/**\n * requestAnnotation - action creator\n *\n * @param {String} targetId\n * @param {String} annotationId\n * @memberof ActionCreators\n */\nexport function requestAnnotation(targetId, annotationId) {\n return {\n annotationId,\n targetId,\n type: ActionTypes.REQUEST_ANNOTATION,\n };\n}\n\n/**\n * receiveAnnotation - action creator\n *\n * @param {String} targetId\n * @param {String} annotationId\n * @param {Object} annotationJson\n * @memberof ActionCreators\n */\nexport function receiveAnnotation(targetId, annotationId, annotationJson) {\n return {\n annotationId,\n annotationJson,\n targetId,\n type: ActionTypes.RECEIVE_ANNOTATION,\n };\n}\n\n/**\n * receiveAnnotationFailure - action creator\n *\n * @param {String} targetId\n * @param {String} annotationId\n * @param {String} error\n * @memberof ActionCreators\n */\nexport function receiveAnnotationFailure(targetId, annotationId, error) {\n return {\n annotationId,\n error,\n targetId,\n type: ActionTypes.RECEIVE_ANNOTATION_FAILURE,\n };\n}\n\n/**\n * selectAnnotation - action creator\n *\n * @param {String} windowId\n * @param {String} targetId\n * @param {String} annotationId\n * @memberof ActionCreators\n */\nexport function selectAnnotation(windowId, annotationId) {\n return {\n annotationId,\n type: ActionTypes.SELECT_ANNOTATION,\n windowId,\n };\n}\n\n/**\n * deselectAnnotation - action creator\n *\n * @param {String} windowId\n * @param {String} targetId\n * @param {String} annotationId\n * @memberof ActionCreators\n */\nexport function deselectAnnotation(windowId, annotationId) {\n return {\n annotationId,\n type: ActionTypes.DESELECT_ANNOTATION,\n windowId,\n };\n}\n\n/**\n * toggleAnnotationDisplay - action creator\n *\n * @param {String} windowId\n * @memberof ActionCreators\n */\nexport function toggleAnnotationDisplay(windowId) {\n return {\n type: ActionTypes.TOGGLE_ANNOTATION_DISPLAY,\n windowId,\n };\n}\n\n/**\n * toggleAnnotationDisplay - action creator\n *\n * @param {String} windowId\n * @memberof ActionCreators\n */\nexport function hoverAnnotation(windowId, annotationIds) {\n return {\n annotationIds,\n type: ActionTypes.HOVER_ANNOTATION,\n windowId,\n };\n}\n","import { createContext } from 'react';\n\nconst FailedImageContext = createContext({\n fallbackImage: '',\n hasFailed: false,\n notifyFailure: () => {},\n});\nexport default FailedImageContext;\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { U as e, at as t, dt as n, ft as r, g as i, st as a } from "./getters-
|
|
2
|
-
import { At as o, I as s, c, mt as l, s as u } from "./canvases-
|
|
3
|
-
import { O as d, h as f, s as p } from "./FailedImageContext-
|
|
4
|
-
import { l as m } from "./window-
|
|
5
|
-
import { t as h } from "./canvas-
|
|
6
|
-
import { n as g, r as _, s as v, t as y } from "./CommentSharp-
|
|
1
|
+
import { U as e, at as t, dt as n, ft as r, g as i, st as a } from "./getters-CD0HjudG.js";
|
|
2
|
+
import { At as o, I as s, c, mt as l, s as u } from "./canvases-DKeoerqc.js";
|
|
3
|
+
import { O as d, h as f, s as p } from "./FailedImageContext-yYxY_Y6U.js";
|
|
4
|
+
import { l as m } from "./window-DiDL2pT4.js";
|
|
5
|
+
import { t as h } from "./canvas-DNE0BtDK.js";
|
|
6
|
+
import { n as g, r as _, s as v, t as y } from "./CommentSharp-CqGF7axd.js";
|
|
7
7
|
import { useEffect as b, useRef as x, useState as S } from "react";
|
|
8
8
|
import { jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
9
9
|
import T from "@mui/material/Paper";
|
|
@@ -173,4 +173,4 @@ var I = /* @__PURE__ */ n({ default: () => L }), L = e(a((e, { windowId: t }) =>
|
|
|
173
173
|
//#endregion
|
|
174
174
|
export { M as a, N as i, I as n, F as r, L as t };
|
|
175
175
|
|
|
176
|
-
//# sourceMappingURL=GalleryView-
|
|
176
|
+
//# sourceMappingURL=GalleryView-CVBvyOpD.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GalleryView-rCx0Q4f3.js","names":[],"sources":["../src/components/GalleryViewThumbnail.jsx","../src/containers/GalleryViewThumbnail.js","../src/components/GalleryView.jsx","../src/containers/GalleryView.js"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport Chip from '@mui/material/Chip';\nimport AnnotationIcon from '@mui/icons-material/CommentSharp';\nimport SearchIcon from '@mui/icons-material/SearchSharp';\nimport { InView } from 'react-intersection-observer';\nimport IIIFThumbnail from '../containers/IIIFThumbnail';\n\nconst Root = styled('div', { name: 'GalleryView', slot: 'thumbnail' })(({ ownerState, theme }) => ({\n '&:focus': {\n outline: 'none',\n },\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n border: '2px solid transparent',\n ...(ownerState.selected && {\n borderColor: theme.palette.primary.main,\n }),\n ...(!ownerState.selected &&\n ownerState.searchAnnotationsCount > 0 && {\n borderColor: theme.palette.action.selected,\n }),\n cursor: 'pointer',\n display: 'inline-block',\n margin: theme.spacing(1, 0.5),\n maxHeight: ownerState.config.height + 45,\n minWidth: '60px',\n overflow: 'hidden',\n padding: theme.spacing(0.5),\n position: 'relative',\n width: 'min-content',\n}));\n\nconst StyledChipsContainer = styled('div', { name: 'GalleryView', slot: 'chipArea' })(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.25),\n position: 'absolute',\n right: 0,\n top: 0,\n}));\n\nconst AnnotationChip = styled(Chip, { name: 'GalleryView', slot: 'chip' })(({ theme }) => ({\n backgroundColor: theme.palette.annotations.chipBackground,\n opacity: 0.875,\n textAlign: 'right',\n}));\n\n/**\n * Represents a WindowViewer in the mirador workspace. Responsible for mounting\n * OSD and Navigation\n */\nexport function GalleryViewThumbnail({\n canvas,\n selected = false,\n setCanvas,\n focusOnCanvas,\n annotationsCount = undefined,\n requestCanvasAnnotations = () => {},\n searchAnnotationsCount = 0,\n config = { height: 100, width: null },\n}) {\n const myRef = useRef();\n const [requestedAnnotations, setRequestedAnnotations] = useState(false);\n\n useEffect(() => {\n if (selected) {\n myRef.current?.scrollIntoView({ block: 'nearest' });\n }\n }, [selected]);\n\n /** @private */\n const handleSelect = () => {\n if (selected) {\n focusOnCanvas();\n } else {\n setCanvas(canvas.id);\n }\n };\n\n /** @private */\n const handleKey = (event) => {\n const keys = {\n enter: 'Enter',\n space: ' ',\n };\n\n const chars = {\n enter: 13,\n space: 32,\n };\n\n const enterOrSpace =\n event.key === keys.enter || event.which === chars.enter || event.key === keys.space || event.which === chars.space;\n\n if (enterOrSpace) {\n focusOnCanvas();\n } else {\n setCanvas(canvas.id);\n }\n };\n\n /** */\n const handleIntersection = (_inView, { isIntersecting }) => {\n if (!isIntersecting || annotationsCount === undefined || annotationsCount > 0 || requestedAnnotations) return;\n\n setRequestedAnnotations(true);\n requestCanvasAnnotations();\n };\n\n const ownerState = {\n annotationsCount,\n canvas,\n config,\n searchAnnotationsCount,\n selected,\n };\n\n return (\n <InView onChange={handleIntersection}>\n <Root\n ownerState={ownerState}\n key={canvas.id || canvas.index}\n className={selected ? 'selected' : ''}\n onClick={handleSelect}\n onKeyUp={handleKey}\n ref={myRef}\n role=\"button\"\n tabIndex={0}\n >\n <IIIFThumbnail resource={canvas} labelled variant=\"outside\" maxHeight={config.height} maxWidth={config.width}>\n <StyledChipsContainer>\n {searchAnnotationsCount > 0 && (\n <AnnotationChip icon={<SearchIcon fontSize=\"small\" />} label={searchAnnotationsCount} size=\"small\" />\n )}\n {annotationsCount > 0 && (\n <AnnotationChip icon={<AnnotationIcon fontSize=\"small\" />} label={annotationsCount} size=\"small\" />\n )}\n </StyledChipsContainer>\n </IIIFThumbnail>\n </Root>\n </InView>\n );\n}\n\nGalleryViewThumbnail.propTypes = {\n annotationsCount: PropTypes.number,\n canvas: PropTypes.object.isRequired,\n config: PropTypes.shape({\n height: PropTypes.number,\n width: PropTypes.number,\n }),\n focusOnCanvas: PropTypes.func.isRequired,\n requestCanvasAnnotations: PropTypes.func,\n searchAnnotationsCount: PropTypes.number,\n selected: PropTypes.bool,\n setCanvas: PropTypes.func.isRequired,\n};\n","import { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport * as actions from '../state/actions';\nimport { GalleryViewThumbnail } from '../components/GalleryViewThumbnail';\nimport {\n getSearchAnnotationsForWindow,\n getCurrentCanvas,\n getConfig,\n getPresentAnnotationsOnSelectedCanvases,\n getCompanionWindowsForContent,\n} from '../state/selectors';\n\n/** */\nconst mapStateToProps = (state, { canvas, windowId }) => {\n const currentCanvas = getCurrentCanvas(state, { windowId });\n const searchAnnotations = getSearchAnnotationsForWindow(state, { windowId });\n\n const canvasAnnotations = searchAnnotations.flatMap((a) => a.resources).filter((a) => a.targetId === canvas.id);\n\n const hasOpenAnnotationsWindow = getCompanionWindowsForContent(state, { content: 'annotations', windowId }).length > 0;\n\n return {\n annotationsCount: (() => {\n if (!hasOpenAnnotationsWindow) return undefined;\n const annotations = getPresentAnnotationsOnSelectedCanvases(state, { canvasId: canvas.id });\n\n return annotations.reduce((v, a) => v + a.resources.filter((r) => r.targetId === canvas.id).length, 0);\n })(),\n config: getConfig(state).galleryView,\n searchAnnotationsCount: canvasAnnotations.length,\n selected: currentCanvas && currentCanvas.id === canvas.id,\n };\n};\n\n/**\n * mapDispatchToProps - used to hook up connect to action creators\n * @memberof WindowViewer\n * @private\n */\nconst mapDispatchToProps = (dispatch, { canvas, id, windowId }) => ({\n focusOnCanvas: () => dispatch(actions.setWindowViewType(windowId, 'single')),\n requestCanvasAnnotations: () => dispatch(actions.requestCanvasAnnotations(windowId, canvas.id)),\n setCanvas: (...args) => dispatch(actions.setCanvas(windowId, ...args)),\n});\n\nconst enhance = compose(\n connect(mapStateToProps, mapDispatchToProps),\n // further HOC go here\n);\n\nexport default enhance(GalleryViewThumbnail);\n","import PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport Paper from '@mui/material/Paper';\nimport GalleryViewThumbnail from '../containers/GalleryViewThumbnail';\n\nconst Root = styled(Paper, { name: 'GalleryView', slot: 'root' })(({ theme }) => ({\n alignItems: 'flex-start',\n alignContent: 'flex-start',\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n overflowX: 'hidden',\n overflowY: 'scroll',\n padding: '50px 0 50px 20px',\n width: '100%',\n}));\n\n/**\n * Renders a GalleryView overview of the manifest.\n */\nexport function GalleryView({ canvases, viewingDirection = '', windowId }) {\n const htmlDir = viewingDirection === 'right-to-left' ? 'rtl' : 'ltr';\n return (\n <Root component=\"section\" aria-label=\"gallery section\" dir={htmlDir} square elevation={0} id={`${windowId}-gallery`}>\n {canvases.map((canvas) => (\n <GalleryViewThumbnail key={canvas.id} windowId={windowId} canvas={canvas} />\n ))}\n </Root>\n );\n}\n\nGalleryView.propTypes = {\n canvases: PropTypes.array.isRequired,\n viewingDirection: PropTypes.string,\n windowId: PropTypes.string.isRequired,\n};\n","import { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport { withPlugins } from '../extend/withPlugins';\nimport { GalleryView } from '../components/GalleryView';\nimport { getCanvases, getSequenceViewingDirection } from '../state/selectors';\n\n/**\n * mapStateToProps - to hook up connect\n * @memberof WindowViewer\n * @private\n */\nconst mapStateToProps = (state, { windowId }) => ({\n canvases: getCanvases(state, { windowId }),\n viewingDirection: getSequenceViewingDirection(state, { windowId }),\n});\n\nconst enhance = compose(\n connect(mapStateToProps),\n withPlugins('GalleryView'),\n // further HOC go here\n);\n\nexport default enhance(GalleryView);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GalleryView-CVBvyOpD.js","names":[],"sources":["../src/components/GalleryViewThumbnail.jsx","../src/containers/GalleryViewThumbnail.js","../src/components/GalleryView.jsx","../src/containers/GalleryView.js"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport Chip from '@mui/material/Chip';\nimport AnnotationIcon from '@mui/icons-material/CommentSharp';\nimport SearchIcon from '@mui/icons-material/SearchSharp';\nimport { InView } from 'react-intersection-observer';\nimport IIIFThumbnail from '../containers/IIIFThumbnail';\n\nconst Root = styled('div', { name: 'GalleryView', slot: 'thumbnail' })(({ ownerState, theme }) => ({\n '&:focus': {\n outline: 'none',\n },\n '&:hover': {\n backgroundColor: theme.palette.action.hover,\n },\n border: '2px solid transparent',\n ...(ownerState.selected && {\n borderColor: theme.palette.primary.main,\n }),\n ...(!ownerState.selected &&\n ownerState.searchAnnotationsCount > 0 && {\n borderColor: theme.palette.action.selected,\n }),\n cursor: 'pointer',\n display: 'inline-block',\n margin: theme.spacing(1, 0.5),\n maxHeight: ownerState.config.height + 45,\n minWidth: '60px',\n overflow: 'hidden',\n padding: theme.spacing(0.5),\n position: 'relative',\n width: 'min-content',\n}));\n\nconst StyledChipsContainer = styled('div', { name: 'GalleryView', slot: 'chipArea' })(({ theme }) => ({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(0.25),\n position: 'absolute',\n right: 0,\n top: 0,\n}));\n\nconst AnnotationChip = styled(Chip, { name: 'GalleryView', slot: 'chip' })(({ theme }) => ({\n backgroundColor: theme.palette.annotations.chipBackground,\n opacity: 0.875,\n textAlign: 'right',\n}));\n\n/**\n * Represents a WindowViewer in the mirador workspace. Responsible for mounting\n * OSD and Navigation\n */\nexport function GalleryViewThumbnail({\n canvas,\n selected = false,\n setCanvas,\n focusOnCanvas,\n annotationsCount = undefined,\n requestCanvasAnnotations = () => {},\n searchAnnotationsCount = 0,\n config = { height: 100, width: null },\n}) {\n const myRef = useRef();\n const [requestedAnnotations, setRequestedAnnotations] = useState(false);\n\n useEffect(() => {\n if (selected) {\n myRef.current?.scrollIntoView({ block: 'nearest' });\n }\n }, [selected]);\n\n /** @private */\n const handleSelect = () => {\n if (selected) {\n focusOnCanvas();\n } else {\n setCanvas(canvas.id);\n }\n };\n\n /** @private */\n const handleKey = (event) => {\n const keys = {\n enter: 'Enter',\n space: ' ',\n };\n\n const chars = {\n enter: 13,\n space: 32,\n };\n\n const enterOrSpace =\n event.key === keys.enter || event.which === chars.enter || event.key === keys.space || event.which === chars.space;\n\n if (enterOrSpace) {\n focusOnCanvas();\n } else {\n setCanvas(canvas.id);\n }\n };\n\n /** */\n const handleIntersection = (_inView, { isIntersecting }) => {\n if (!isIntersecting || annotationsCount === undefined || annotationsCount > 0 || requestedAnnotations) return;\n\n setRequestedAnnotations(true);\n requestCanvasAnnotations();\n };\n\n const ownerState = {\n annotationsCount,\n canvas,\n config,\n searchAnnotationsCount,\n selected,\n };\n\n return (\n <InView onChange={handleIntersection}>\n <Root\n ownerState={ownerState}\n key={canvas.id || canvas.index}\n className={selected ? 'selected' : ''}\n onClick={handleSelect}\n onKeyUp={handleKey}\n ref={myRef}\n role=\"button\"\n tabIndex={0}\n >\n <IIIFThumbnail resource={canvas} labelled variant=\"outside\" maxHeight={config.height} maxWidth={config.width}>\n <StyledChipsContainer>\n {searchAnnotationsCount > 0 && (\n <AnnotationChip icon={<SearchIcon fontSize=\"small\" />} label={searchAnnotationsCount} size=\"small\" />\n )}\n {annotationsCount > 0 && (\n <AnnotationChip icon={<AnnotationIcon fontSize=\"small\" />} label={annotationsCount} size=\"small\" />\n )}\n </StyledChipsContainer>\n </IIIFThumbnail>\n </Root>\n </InView>\n );\n}\n\nGalleryViewThumbnail.propTypes = {\n annotationsCount: PropTypes.number,\n canvas: PropTypes.object.isRequired,\n config: PropTypes.shape({\n height: PropTypes.number,\n width: PropTypes.number,\n }),\n focusOnCanvas: PropTypes.func.isRequired,\n requestCanvasAnnotations: PropTypes.func,\n searchAnnotationsCount: PropTypes.number,\n selected: PropTypes.bool,\n setCanvas: PropTypes.func.isRequired,\n};\n","import { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport * as actions from '../state/actions';\nimport { GalleryViewThumbnail } from '../components/GalleryViewThumbnail';\nimport {\n getSearchAnnotationsForWindow,\n getCurrentCanvas,\n getConfig,\n getPresentAnnotationsOnSelectedCanvases,\n getCompanionWindowsForContent,\n} from '../state/selectors';\n\n/** */\nconst mapStateToProps = (state, { canvas, windowId }) => {\n const currentCanvas = getCurrentCanvas(state, { windowId });\n const searchAnnotations = getSearchAnnotationsForWindow(state, { windowId });\n\n const canvasAnnotations = searchAnnotations.flatMap((a) => a.resources).filter((a) => a.targetId === canvas.id);\n\n const hasOpenAnnotationsWindow = getCompanionWindowsForContent(state, { content: 'annotations', windowId }).length > 0;\n\n return {\n annotationsCount: (() => {\n if (!hasOpenAnnotationsWindow) return undefined;\n const annotations = getPresentAnnotationsOnSelectedCanvases(state, { canvasId: canvas.id });\n\n return annotations.reduce((v, a) => v + a.resources.filter((r) => r.targetId === canvas.id).length, 0);\n })(),\n config: getConfig(state).galleryView,\n searchAnnotationsCount: canvasAnnotations.length,\n selected: currentCanvas && currentCanvas.id === canvas.id,\n };\n};\n\n/**\n * mapDispatchToProps - used to hook up connect to action creators\n * @memberof WindowViewer\n * @private\n */\nconst mapDispatchToProps = (dispatch, { canvas, id, windowId }) => ({\n focusOnCanvas: () => dispatch(actions.setWindowViewType(windowId, 'single')),\n requestCanvasAnnotations: () => dispatch(actions.requestCanvasAnnotations(windowId, canvas.id)),\n setCanvas: (...args) => dispatch(actions.setCanvas(windowId, ...args)),\n});\n\nconst enhance = compose(\n connect(mapStateToProps, mapDispatchToProps),\n // further HOC go here\n);\n\nexport default enhance(GalleryViewThumbnail);\n","import PropTypes from 'prop-types';\nimport { styled } from '@mui/material/styles';\nimport Paper from '@mui/material/Paper';\nimport GalleryViewThumbnail from '../containers/GalleryViewThumbnail';\n\nconst Root = styled(Paper, { name: 'GalleryView', slot: 'root' })(({ theme }) => ({\n alignItems: 'flex-start',\n alignContent: 'flex-start',\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n overflowX: 'hidden',\n overflowY: 'scroll',\n padding: '50px 0 50px 20px',\n width: '100%',\n}));\n\n/**\n * Renders a GalleryView overview of the manifest.\n */\nexport function GalleryView({ canvases, viewingDirection = '', windowId }) {\n const htmlDir = viewingDirection === 'right-to-left' ? 'rtl' : 'ltr';\n return (\n <Root component=\"section\" aria-label=\"gallery section\" dir={htmlDir} square elevation={0} id={`${windowId}-gallery`}>\n {canvases.map((canvas) => (\n <GalleryViewThumbnail key={canvas.id} windowId={windowId} canvas={canvas} />\n ))}\n </Root>\n );\n}\n\nGalleryView.propTypes = {\n canvases: PropTypes.array.isRequired,\n viewingDirection: PropTypes.string,\n windowId: PropTypes.string.isRequired,\n};\n","import { compose } from 'redux';\nimport { connect } from 'react-redux';\nimport { withPlugins } from '../extend/withPlugins';\nimport { GalleryView } from '../components/GalleryView';\nimport { getCanvases, getSequenceViewingDirection } from '../state/selectors';\n\n/**\n * mapStateToProps - to hook up connect\n * @memberof WindowViewer\n * @private\n */\nconst mapStateToProps = (state, { windowId }) => ({\n canvases: getCanvases(state, { windowId }),\n viewingDirection: getSequenceViewingDirection(state, { windowId }),\n});\n\nconst enhance = compose(\n connect(mapStateToProps),\n withPlugins('GalleryView'),\n // further HOC go here\n);\n\nexport default enhance(GalleryView);\n"],"mappings":"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"}
|