@manifest-editor/shell 2.0.1-next.0.ede7d58 → 2.0.2-next.0.c4a41fe
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/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +31 -31
- package/dist/index.d.cts +46 -45
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +25 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["DEFAULT_CONFIG: Config","resolvedConfig: Config","config","Container","Header","IconButton","CloseIcon: React.FC<{\n inline?: boolean;\n height?: number;\n className?: string;\n}>","VaultProvider","ManifestContext","CollectionContext","map: Record<string, PreviewHandler>","providesMap: Record<string, string>","providesMap","context: any","handlers: PreviewHandler[]","PreviewProvider","context: PreviewContext","DownloadButton","config","AppHeader","Header","Container","ManifestEditorLogo","AtlasStoreReactContext","IIIFVault","e: any","responseData: ManifestNormalized | undefined","BackIcon: React.FC<{ style?: any }>","PaddedSidebarContainer","ErrorMessage","ReactVaultContext","ErrorBoundary","Vault","toDispatch: any","Vault","VaultProvider","create","Creator","RenderCreator","options: CreatorOptions","err: any","ErrorMessage","Spinner","EmptyState","ActionButton","Suspense","ModalBackSlot","IconButton","GridIcon","CreatorGrid","baseCreator: LayoutPanel","defaultState: EditingStackState","EditorInstance","defaultState","create","sortKeys: string[]","sortKeyFallbacks: Record<string, EditorDefinition>","ResourceReactContext","resourceConfig: EditorConfig","resource","SidebarTabs","baseEditor: LayoutPanel","Tabs","TabList","Tab","TabPanel","ThemeProvider","Sidebar","SidebarHeader","SidebarContent","Form","ActionButton","seenIds: string[]","sectionMap: Record<string, ContextMenuItem[]>","emptySections: ContextMenuItem[]","returnSections: Array<{ sectionTitle?: string; items: Array<ContextMenuItem> }>","$","noop","onKeyDown: KeyboardEventHandler<HTMLDivElement>","AccordionItem","onScroll: UIEventHandler<HTMLDivElement>","getValue","HandleControls","Tooltip","TooltipTrigger","DefaultTooltipContent","IconHandle","ResetIcon","ResizeHandle","$","CenterPanel","LeftPanel","PanelSideMenu","Layout","ReactVaultContext","Fragment","L.PanelContainer","L.PanelContent","L.PanelMenu","Modal","ErrorBoundary","L.OuterWrapper","L.Header","L.Main","M.Container","M.CenterPanel","M.MobileBar","M.LeftBarButton","M.DrawerContainer","M.DrawerButton","M.PreviewBarButton","M.DrawerBody","M.LeftPanel","M.Lightbox","PanelSideMenu","Transition","L.LeftPanel","L.CenterPanel","L.RightPanel","L.Footer","Component","LayoutProvider","actions","state","toEdit: EditableResource","create","previewConfigs: PreviewConfiguration[]","ImageServiceLoader","ImageServiceLoaderContext","ThemeProvider","AtlasStoreProvider","tempGlobalState: Record<string, Record<string, Task>>","res: (value: any) => void","rej: (reason?: any) => void","analyse","Component","onCopy","onPaste","e"],"sources":["../../../node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js","../src/ConfigContext/ConfigContext.tsx","../src/AppContext/AppContext.tsx","../src/AppContext/MultiAppContext.tsx","../src/AppHeader/AppHeader.styles.ts","../../ui/icons/CloseIcon.tsx","../../ui/icons/DownIcon.tsx","../src/AppResourceProvider/AppResourceProvider.tsx","../src/PreviewContext/previews/ExternalManifestUrlPreview.ts","../src/PreviewContext/previews/IIIFPreviewService.ts","../src/PreviewContext/PreviewContext.hooks.ts","../src/PreviewContext/PreviewContext.reducer.ts","../src/PreviewContext/PreviewContext.tsx","../../ui/atoms/Button.tsx","../src/PreviewButton/PreviewButton.styles.ts","../src/PreviewButton/PreviewButton.tsx","../src/AppHeader/AppHeader.tsx","../src/AppMenu/AppMenuContext.tsx","../src/AtlasStore/AtlasStoreProvider.tsx","../src/AtlasStore/polygon-to-bounding-box.ts","../src/analysis.ts","../src/helpers.ts","../src/highlighted-image-resources.ts","../../ui/icons/StarIcon.tsx","../../ui/icons/BackIcon.tsx","../src/Layout/Layout.context.tsx","../src/Layout/components/PanelError.tsx","../src/Layout/Layout.helpers.ts","../../ui/atoms/Dropdown.tsx","../src/Layout/components/ModularPanel.tsx","../src/PreviewVault/create-preview-vault.ts","../src/PreviewVault/PreviewVault.tsx","../src/BaseCreator/BaseCreator.hooks.tsx","../src/BaseCreator/BaseCreator.tsx","../src/BaseCreator/index.tsx","../src/EditingStack/EditingStack.reducer.ts","../src/EditingStack/EditingStack.tsx","../src/BaseEditor/BaseEditor.tsx","../src/BaseEditor/index.tsx","../src/ShellContext/default-theme.ts","../src/BaseCreator/BaseAnnotationCreator.tsx","../src/hooks/use-decay-state.ts","../src/ConfigContext/ConfigEditor.tsx","../src/ContextMenu/ContextMenuContext.tsx","../../ui/ui/CenterPanelContainer/CenterPanelContainer.module.css","../../ui/ui/CenterPanelContainer/CenterPanelContainer.tsx","../../ui/atoms/Accordion.tsx","../../ui/icons/DownloadIcon.tsx","../../ui/atoms/ButtonRow.tsx","../src/ExportPanel/ExportPanel.tsx","../src/hooks/use-event.tsx","../src/hooks/use-match-media.ts","../src/hooks/use-save-vault.ts","../src/hooks/use-svg-tools.tsx","../src/hooks/use-annotation-creator-state.ts","../src/Layout/components/HandleControls.tsx","../../ui/madoc/components/icons/Spinner.tsx","../../ui/ui/GhostBlocks/GhostBlocks.module.css","../../ui/ui/GhostBlocks/GhostBlocks.tsx","../../ui/madoc/use-event-handler.ts","../src/Layout/components/use-resize-layouts.tsx","../src/Layout/Layout.mobile.tsx","../src/Layout/Layout.styles.ts","../src/Layout/Layout.tsx","../src/Layout/Layout.hooks.ts","../src/Layout/Layout.reducer.ts","../src/ResourceEditingContext/ResourceEditingContext.tsx","../../ui/atoms/ErrorBoundary.tsx","../src/Layout/Layout.context-internal.tsx","../src/ShellContext/ShellContext.tsx","../src/TaskBridge/TaskBridge.tsx","../src/Universal/UniversalCopyPaste.tsx"],"sourcesContent":["var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n if (isProduction) {\n throw new Error(prefix);\n }\n var provided = typeof message === 'function' ? message() : message;\n var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n throw new Error(value);\n}\n\nexport { invariant as default };\n","import type { Collection } from \"@iiif/presentation-3\";\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport type { PreviewConfiguration } from \"../PreviewContext/PreviewContext.types\";\n\nexport interface Config {\n // Previous configuration.\n previews: PreviewConfiguration[];\n behaviorPresets: string[];\n newTemplates: Collection | null;\n\n defaultPreview: string | null;\n\n editorConfig: {\n All?: EditorConfig;\n Manifest?: EditorConfig;\n Canvas?: EditorConfig;\n Annotation?: EditorConfig;\n AnnotationPage?: EditorConfig;\n AnnotationCollection?: EditorConfig;\n Range?: EditorConfig;\n Collection?: EditorConfig;\n ContentResource?: EditorConfig;\n // Collection inside collection.\n EmbeddedCollection?: EditorConfig;\n };\n\n editorFeatureFlags: {\n enableMultiImageCanvases?: boolean;\n enableMultiMediaCanvases?: boolean;\n rememberCanvasId?: boolean;\n rememberLeftPanelId?: boolean;\n annotationPopups?: boolean;\n manifestGridOptions?: boolean;\n };\n\n // Internationalisation options\n i18n: {\n defaultLanguage: string;\n availableLanguages: string[];\n advancedLanguageMode: boolean;\n textGranularityEnabled?: boolean;\n };\n\n // Options when exporting from Vault.\n export: {\n baseIdentifier: string | null;\n version: 3 | 2;\n };\n\n uploadBackends: Array<UploadBackendConfig>;\n}\n\nexport interface EditorConfig {\n singleTab?: string;\n fields?: string[];\n hideTabs?: string[];\n onlyTabs?: string[];\n}\n\nexport interface UploadBackendConfig {\n id: string;\n label: string;\n resourceTypes: string[];\n canUpload?: () => Promise<boolean>;\n upload: (resource: File) => Promise<{ id: string; type: string }> | null;\n}\n\nconst DEFAULT_CONFIG: Config = {\n previews: [],\n behaviorPresets: [\n \"auto-advance\",\n \"no-auto-advance\",\n \"repeat\",\n \"no-repeat\",\n \"unordered\",\n \"individuals\",\n \"continuous\",\n \"paged\",\n \"non-paged\",\n \"facing-pages\",\n \"multi-part\",\n \"together\",\n \"sequence\",\n \"thumbnail-nav\",\n \"no-nav\",\n \"hidden\",\n ],\n defaultPreview: null,\n editorConfig: {},\n newTemplates: null,\n i18n: {\n advancedLanguageMode: false,\n availableLanguages: [\"en\", \"cy\", \"nl\", \"fr\"],\n defaultLanguage: \"en\",\n },\n editorFeatureFlags: {\n enableMultiImageCanvases: true,\n enableMultiMediaCanvases: true,\n annotationPopups: false,\n rememberCanvasId: true,\n manifestGridOptions: false,\n rememberLeftPanelId: false,\n },\n uploadBackends: [],\n export: {\n baseIdentifier: null,\n version: 3,\n },\n};\n\nexport const ConfigReactContext = createContext<Config>(DEFAULT_CONFIG);\nexport const SaveConfigReactContext = createContext<\n (config: Partial<Config>) => void\n>(() => {});\n\nexport function useConfig() {\n return useContext(ConfigReactContext);\n}\n\nexport function useSaveConfig() {\n return useContext(SaveConfigReactContext);\n}\n\nexport function ConfigProvider({\n children,\n config,\n saveConfig,\n}: {\n children: ReactNode;\n config?: Partial<Config>;\n saveConfig?: (config: Partial<Config>) => void;\n}) {\n const [runtimeConfig, setRuntimeConfig] = useState<Partial<Config> | null>(\n null,\n );\n const resolvedConfig: Config = useMemo(\n () => ({\n ...DEFAULT_CONFIG,\n ...(config || {}),\n ...(runtimeConfig || {}),\n editorFeatureFlags: {\n ...DEFAULT_CONFIG.editorFeatureFlags,\n ...(config?.editorFeatureFlags || {}),\n ...runtimeConfig?.editorFeatureFlags,\n },\n }),\n [config, runtimeConfig],\n );\n\n const memoSaveConfig = useCallback(\n (config: Partial<Config>) => {\n setRuntimeConfig(config);\n if (saveConfig) {\n saveConfig(config);\n }\n },\n [config],\n );\n\n return (\n <SaveConfigReactContext.Provider value={memoSaveConfig}>\n <ConfigReactContext.Provider value={resolvedConfig}>\n {children}\n </ConfigReactContext.Provider>\n </SaveConfigReactContext.Provider>\n );\n}\n","import type { CreatorDefinition } from \"@manifest-editor/creator-api\";\nimport { useLocalStorage } from \"../hooks/use-local-storage\";\nimport { createContext, type ReactNode, type SetStateAction, useCallback, useContext, useEffect, useMemo } from \"react\";\nimport invariant from \"tiny-invariant\";\nimport { type Config, ConfigProvider } from \"../ConfigContext/ConfigContext\";\nimport type {\n AnnotationPanel,\n BackgroundPanel,\n CanvasEditorDefinition,\n EditorDefinition,\n LayoutPanel,\n LayoutProps,\n} from \"../Layout/Layout.types\";\n\nexport type AppContext = {\n instanceId: string;\n appId: string;\n args?: any;\n};\n\nexport type LoadedApp = Partial<LayoutProps> & {\n config?: Partial<Config>;\n default: {\n id: string;\n title: string;\n type?: \"manifest\" | \"launcher\";\n project?: boolean;\n projectType?: \"Manifest\" | \"Collection\";\n dev?: boolean;\n desktop?: boolean;\n web?: boolean;\n drafts?: boolean;\n };\n};\n\nexport type MappedApp = {\n metadata: LoadedApp[\"default\"];\n layout: LayoutProps;\n config?: Partial<Config>;\n};\n\nexport interface AppExtension {\n config?: Partial<Config>;\n leftPanels?: LayoutPanel[];\n centerPanels?: LayoutPanel[];\n rightPanels?: LayoutPanel[];\n modalPanels?: LayoutPanel[];\n editors?: EditorDefinition[];\n creators?: CreatorDefinition[];\n canvasEditors?: CanvasEditorDefinition[];\n annotations?: AnnotationPanel[];\n background?: BackgroundPanel[];\n // Config.\n leftPanelIds?: string[];\n\n // Side-effects.\n disableSideEffects?: string[];\n}\n\nexport type AppState = { state: null | any; setState: SetStateAction<any> };\n\nexport const PrimeAppReactContext = createContext<MappedApp | null>(null);\nexport const AppReactContext = createContext<AppContext | null>(null);\nexport const AppStateReactContext = createContext<{\n state: null | any;\n setState: SetStateAction<any>;\n}>({\n state: null,\n setState: () => {\n // no-op\n },\n});\n\nexport function useAppInstance() {\n const ctx = useContext(AppReactContext);\n invariant(ctx, \"Hook useAppInstance must be used inside <AppProvider />\");\n\n return ctx;\n}\n\nexport function useApp() {\n const app = useContext(PrimeAppReactContext);\n\n invariant(app, \"Hook useApp must be used inside <AppProvider />\");\n\n return app;\n}\n\nexport function useAppState<S = any>() {\n return useContext(AppStateReactContext);\n}\n\nfunction AppStateProvider(props: {\n instanceId: string;\n appId: string;\n initialState?: any;\n args?: any;\n children: ReactNode;\n}) {\n const [state, _setState, stateRef] = useLocalStorage(\n `app-state/${props.appId}/${props.instanceId}`,\n props.initialState || {},\n );\n\n const setState = useCallback((partial: any) => {\n const existing = stateRef.current ? JSON.parse(stateRef.current || \"{}\") : {};\n const partialState = (typeof partial === \"function\" ? partial(existing) : partial) || {};\n\n _setState({\n ...existing,\n ...partialState,\n });\n }, []);\n\n useEffect(() => {\n if (props.args) {\n setState(props.args);\n }\n }, [props.appId]);\n\n const ctx = useMemo(() => ({ state: state || {}, setState }), [setState, state]);\n\n return <AppStateReactContext.Provider value={ctx}>{props.children}</AppStateReactContext.Provider>;\n}\n\nexport function AppProvider({\n instanceId,\n appId,\n args,\n definition,\n children,\n initialState,\n}: {\n initialState?: any;\n instanceId: string;\n appId: string;\n args?: any;\n definition: MappedApp;\n children: ReactNode;\n}) {\n const ctx = useMemo(() => ({ instanceId, appId, args }), [instanceId, appId, args]);\n const _initialState = useMemo(() => initialState || {}, [instanceId]);\n\n // Current App is now put in the \"Prime\" context.\n return (\n <ConfigProvider config={definition.config || {}}>\n <PrimeAppReactContext.Provider value={definition}>\n <AppReactContext.Provider value={ctx}>\n <AppStateProvider instanceId={ctx.instanceId} appId={ctx.appId} args={ctx.args} initialState={_initialState}>\n {children}\n </AppStateProvider>\n </AppReactContext.Provider>\n </PrimeAppReactContext.Provider>\n </ConfigProvider>\n );\n}\n","import { createContext, ReactNode, useContext, useMemo } from \"react\";\nimport invariant from \"tiny-invariant\";\nimport { useOptionalLocalStorage } from \"@manifest-editor/components\";\nimport { AppProvider } from \"./AppContext\";\n\ntype MappedApp = any;\n\nexport type MultiAppContext = {\n apps: Record<string, MappedApp>;\n currentApp: { id: string; args?: any };\n initialApp: { id: string; args?: any };\n changeApp: (app: { id: string; args?: any }) => void;\n changeProjectType: (type: \"Manifest\" | \"Collection\") => void;\n};\n\nconst MultiAppContext = createContext<MultiAppContext | null>(null);\n\nexport function useApps() {\n const ctx = useContext(MultiAppContext);\n\n invariant(ctx, \"Hook useApps must be used inside <MultiAppProvider />\");\n\n return ctx;\n}\n\nfunction useCurrentApp(\n initialApp?: { id: string; args?: any },\n enableLocalStorage = false,\n) {\n const [currentApp, changeApp] = useOptionalLocalStorage(\n \"SelectedApplication\",\n initialApp || { id: \"splash\" },\n !enableLocalStorage,\n );\n\n return [currentApp, changeApp] as const;\n}\n\nexport function MultiAppProvider({\n apps,\n initialApp,\n saveCurrentApp = true,\n instanceId,\n children,\n config = {},\n}: {\n apps: Record<string, MappedApp>;\n initialApp?: MultiAppContext[\"currentApp\"];\n saveCurrentApp?: boolean;\n instanceId: string;\n children: ReactNode;\n config?: {\n defaultApp?: string;\n manifestApp?: string;\n collectionApp?: string;\n };\n}) {\n const {\n defaultApp = \"splash\",\n collectionApp = \"collection-editor\",\n manifestApp = \"manifest-editor\",\n } = config;\n const [currentApp, changeApp] = useCurrentApp(initialApp, saveCurrentApp);\n\n const changeProjectType = (type: \"Manifest\" | \"Collection\") => {\n if (type === \"Manifest\") {\n changeApp({ id: manifestApp });\n }\n if (type === \"Collection\") {\n changeApp({ id: collectionApp });\n }\n };\n\n const ctx = useMemo<MultiAppContext>(\n () => ({\n currentApp: currentApp || { id: defaultApp },\n initialApp: initialApp || { id: defaultApp },\n apps,\n changeApp,\n changeProjectType,\n }),\n [initialApp, apps, currentApp],\n );\n\n const currentFullApp = apps[ctx.currentApp.id];\n if (!currentApp || !currentFullApp) {\n return null;\n }\n\n // Current App is now put in the \"Prime\" context.\n return (\n <AppProvider\n appId={currentApp.id}\n definition={currentFullApp}\n instanceId={currentApp.id + instanceId}\n args={currentApp.args}\n >\n <MultiAppContext.Provider value={ctx}>\n {children}\n </MultiAppContext.Provider>\n </AppProvider>\n );\n}\n","import styled from \"styled-components\";\nimport { SmallButton } from \"@manifest-editor/ui/atoms/Button\";\n\nexport const Container = styled.div`\n display: flex;\n align-items: center;\n height: 3em;\n padding: 0.5em;\n`;\n\nexport const Header = styled.div`\n display: flex;\n padding: 0.25em;\n flex-direction: column;\n`;\n\nexport const IconButton = styled.button`\n height: 1.75em;\n width: 1.75em;\n background: #e9e9e9;\n border-radius: 3px;\n display: flex;\n text-align: center;\n align-items: center;\n font-size: 1.1em;\n border: none;\n justify-content: center;\n\n &:focus {\n background: #e94581;\n color: #fff;\n svg {\n fill: #fff;\n }\n }\n`;\n\nexport const Spacer = styled.div`\n flex: 1;\n`;\n\nexport const Logo = styled.div`\n color: #6e6e6e;\n display: flex;\n align-items: center;\n margin-left: 1em;\n font-weight: bold;\n text-rendering: geometricPrecision;\n letter-spacing: -0.5px;\n user-select: none;\n cursor: pointer;\n margin-right: 0.5em;\n`;\n\nexport const ProjectPreview = styled.div`\n margin: 0 auto;\n padding: 3px;\n background: #f4f4f4;\n border: 1px solid #e0e0e0;\n border-radius: 5px;\n width: 26em;\n display: flex;\n flex-direction: row;\n\n @media (max-width: 450px) {\n display: none;\n }\n`;\n\nexport const ContextButton = styled.button`\n background: #e7fff4;\n border: 1px solid #c5e3cd;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n border-radius: 4px;\n color: #666666;\n padding: 0.35em 0.7em;\n letter-spacing: -0.42px;\n`;\n","export const CloseIcon: React.FC<{\n inline?: boolean;\n height?: number;\n className?: string;\n}> = ({ height = 16 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" height={height} viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n","import { SVGProps } from \"react\";\n\nexport const DownIcon = ({ rotate = 0, ...props }: SVGProps<SVGSVGElement>) => (\n <svg\n version=\"1.2\"\n xmlns=\"http://www.w3.org/2000/svg\"\n overflow=\"visible\"\n preserveAspectRatio=\"none\"\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n style={{\n fill: \"rgba(0, 0, 0, 0.6)\",\n transform: `rotate(${rotate}deg)`,\n transition: \"transform 0.2s\",\n }}\n {...props}\n >\n <path\n d=\"M8.12 9.29 12 13.17l3.88-3.88a.996.996 0 1 1 1.41 1.41l-4.59 4.59a.996.996 0 0 1-1.41 0L6.7 10.7a.996.996 0 0 1 0-1.41c.39-.38 1.03-.39 1.42 0z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import { createContext, useContext } from \"react\";\nimport { CollectionContext, ManifestContext, VaultProvider, useExistingVault } from \"react-iiif-vault\";\nimport invariant from \"tiny-invariant\";\n\nexport interface Resource {\n id: string;\n type: string;\n}\n\nconst AppResourceReactProvider = createContext<Resource | null>(null);\nconst AppResourceInstanceReactProvider = createContext<string | null>(null);\n\nexport function useAppResourceInstance() {\n const ctx = useContext(AppResourceInstanceReactProvider);\n const resource = useContext(AppResourceReactProvider);\n\n const instanceId = ctx || resource?.id;\n\n invariant(instanceId, \"useResourceInstance can only be called from inside <ResourceProvider />\");\n\n return instanceId;\n}\n\nexport function useAppResource() {\n const ctx = useContext(AppResourceReactProvider);\n\n invariant(ctx, \"useResource can only be called from inside <ResourceProvider />\");\n\n return ctx;\n}\n\nexport function AppResourceInstanceProvider({ id, children }: { id?: string; children: React.ReactNode }) {\n if (!id) {\n return children;\n }\n return <AppResourceInstanceReactProvider.Provider value={id}>{children}</AppResourceInstanceReactProvider.Provider>;\n}\n\nexport function AppResourceProvider({ resource, children }: { resource?: Resource; children: React.ReactNode }) {\n const vault = useExistingVault();\n\n let inner = children;\n\n if (resource && resource.type === \"Manifest\") {\n inner = (\n <VaultProvider vault={vault || undefined}>\n <ManifestContext manifest={resource.id || \"\"}>{children}</ManifestContext>\n </VaultProvider>\n );\n }\n\n if (resource && resource.type === \"Collection\") {\n inner = (\n <VaultProvider vault={vault || undefined}>\n <CollectionContext collection={resource.id || \"\"}>{children}</CollectionContext>\n </VaultProvider>\n );\n }\n\n return <AppResourceReactProvider.Provider value={resource as any}>{inner}</AppResourceReactProvider.Provider>;\n}\n","import type { Vault } from \"@iiif/helpers/vault\";\nimport type { Preview, PreviewHandler } from \"../PreviewContext.types\";\n\nexport class ExternalManifestUrlPreview implements PreviewHandler {\n id: string;\n label: string;\n type = \"external-manifest-preview\";\n focusable = true;\n\n private readonly serviceUrl: string;\n private readonly windows: Record<string, { location: string; window: Window | null }> = {};\n\n constructor({ id, config, label }: { id: string; type?: string; label: string; config: { url: string } }) {\n this.id = id;\n this.label = label;\n this.serviceUrl = config.url;\n }\n\n isPreviewValid(instanceId: string): boolean {\n const current = this.windows[instanceId];\n if (current && current.window && !current.window.closed) {\n return true;\n }\n\n return false;\n }\n\n getRequires(): string[] {\n return [\"readOnlyManifest\"];\n }\n\n getProvides(): string[] {\n return [];\n }\n\n async createPreview(\n instanceId: string,\n resource: { id: string; type: string },\n vault: Vault,\n ctx: { readOnlyManifest: string },\n ): Promise<Preview> {\n // @todo change this to be a template, with more features.\n const location = `${this.serviceUrl}`\n .replace(/\\{manifestId}/, ctx.readOnlyManifest)\n .replace(/\\{time}/, `${Date.now()}`);\n const opened = window.open(location, this.id);\n\n this.windows[instanceId] = { location, window: opened };\n\n return {\n id: this.id,\n type: \"external-manifest-preview\",\n data: { url: location },\n };\n }\n\n async focus(instanceId: string) {\n const found = this.windows[instanceId];\n\n if (found && found.window) {\n found.window.focus();\n }\n }\n\n async updatePreview(\n instanceId: string,\n resource: { id: string; type: string },\n vault: Vault,\n ctx: { readOnlyManifest: string },\n ): Promise<Preview | null> {\n const found = this.windows[instanceId];\n\n if (found) {\n try {\n found.window?.close();\n } catch {}\n }\n\n return this.createPreview(instanceId, resource, vault, ctx);\n }\n\n async deletePreview(id: string): Promise<void> {\n const found = this.windows[id];\n if (found && found.window) {\n found.window.close();\n delete this.windows[id];\n }\n }\n}\n","import { Vault } from \"@iiif/helpers/vault\";\nimport { Preview, PreviewConfiguration, PreviewHandler } from \"../PreviewContext.types\";\nimport invariant from \"tiny-invariant\";\n\ntype IIIFPreviewResponse = {\n location: string;\n updateLocation?: string;\n deleteLocation?: string;\n expirationTtl: number;\n};\n\nexport class IIIFPreviewService implements PreviewHandler {\n id: string;\n label: string;\n type = \"iiif-preview-service\";\n focusable = false;\n\n private readonly serviceUrl: string;\n private readonly cache: Record<string, IIIFPreviewResponse & { time: number }> = {};\n\n constructor({ id, config, label }: PreviewConfiguration<{ url: string }>) {\n this.id = id;\n this.label = label;\n this.serviceUrl = config.url;\n }\n\n getRequires(): string[] {\n return [];\n }\n\n getProvides(): string[] {\n return [\"readOnlyManifest\"];\n }\n\n async isPreviewValid(instanceId: string, instance: Preview): Promise<boolean> {\n if (!!this.cache[instanceId]) {\n return true;\n }\n\n if (!instance || !instance.data || !instance.data.readOnlyManifest) {\n return false;\n }\n\n const urlToCheck = instance.data.readOnlyManifest;\n try {\n const resp = await fetch(urlToCheck, {\n cache: \"no-cache\",\n });\n return resp.ok;\n } catch (e) {\n return false;\n }\n }\n\n async createPreview(instanceId: string, resource: { id: string; type: string }, vault: Vault): Promise<Preview> {\n const manifest = vault.toPresentation3(resource as any);\n const response = await fetch(this.serviceUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: \"*\",\n },\n body: JSON.stringify(manifest),\n });\n\n invariant(response.ok, \"Unknown error creating preview\");\n\n const json = await response.json();\n\n invariant(json.location, \"Missing IIIF location while creating preview\");\n\n this.cache[instanceId] = { ...json, time: Date.now() };\n\n return {\n id: this.id,\n type: \"external-manifest-preview\",\n data: {\n readOnlyManifest: `${json.location}/${Date.now()}`,\n },\n };\n }\n\n async focus() {\n // no op.\n }\n\n async updatePreview(instanceId: string, resource: { id: string; type: string }, vault: Vault): Promise<Preview> {\n const cached = this.cache[instanceId];\n if (!cached || Date.now() > cached.expirationTtl + cached.time || !cached.updateLocation) {\n return this.createPreview(instanceId, resource, vault);\n }\n\n const updateUrl = cached.updateLocation;\n const manifest = vault.toPresentation3(resource as any);\n\n const response = await fetch(updateUrl, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: \"*\",\n },\n body: JSON.stringify(manifest),\n });\n\n invariant(response.ok, \"Unknown error updating preview\");\n\n const json = await response.json();\n\n invariant(json.location);\n\n if (json.updateLocation) {\n cached.updateLocation = json.updateLocation;\n }\n\n const readOnlyManifest = `${json.location}/${Date.now()}`;\n\n // Make a fetch, fill the cache (preview may not)\n await fetch(readOnlyManifest, {\n cache: \"no-cache\",\n });\n\n return {\n id: this.id,\n type: \"external-manifest-preview\",\n data: {\n readOnlyManifest: `${json.location}/${Date.now()}`,\n },\n };\n }\n\n async deletePreview(id: string): Promise<void> {\n const cached = this.cache[id];\n if (cached && cached.deleteLocation) {\n try {\n await fetch(cached.deleteLocation, {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: \"*\",\n },\n });\n } catch (e) {\n // no-op, we tried.\n }\n }\n }\n}\n","import { type Dispatch, useMemo } from \"react\";\nimport { useVault } from \"react-iiif-vault\";\nimport invariant from \"tiny-invariant\";\nimport { useAppResource, useAppResourceInstance } from \"../AppResourceProvider/AppResourceProvider\";\nimport type {\n Preview,\n PreviewActions,\n PreviewActionsType,\n PreviewConfiguration,\n PreviewHandler,\n PreviewState,\n} from \"./PreviewContext.types\";\nimport { ExternalManifestUrlPreview } from \"./previews/ExternalManifestUrlPreview\";\nimport { IIIFPreviewService } from \"./previews/IIIFPreviewService\";\n\nexport function usePreviewActions(\n state: PreviewState,\n dispatch: Dispatch<PreviewActionsType>,\n handlers: PreviewHandler[],\n previews: Preview[],\n setPreviews: (previews: Preview[] | ((prev: Preview[]) => Preview[])) => void,\n): PreviewActions {\n const resource = useAppResource();\n const instanceId = useAppResourceInstance();\n const vault = useVault();\n\n const previewActions = useMemo(\n () => ({\n setPreview: (preview: Preview) => {\n if (!preview) return;\n setPreviews((prev) => [...prev.filter((item) => item.id !== preview.id), preview]);\n },\n removePreview: (id: string) => {\n setPreviews((prev) => prev.filter((p) => p.id !== id));\n },\n }),\n [setPreviews, instanceId],\n );\n //\n const [handlerMap, providesMap] = useMemo(() => {\n const map: Record<string, PreviewHandler> = {};\n const providesMap: Record<string, string> = {};\n for (const handler of handlers) {\n map[handler.id] = handler;\n const provides = handler.getProvides();\n if (provides.length) {\n for (const singleProvides of provides) {\n if (!providesMap[singleProvides]) {\n providesMap[singleProvides] = handler.id;\n }\n }\n }\n }\n return [map, providesMap] as const;\n }, [handlers]);\n\n async function updatePreviews() {\n const selected = state.selected;\n const selectedPreview = previews.find((p) => p.id === selected);\n if (previews && previews.length && selectedPreview) {\n const selectedHandler = handlerMap[selectedPreview.id]!;\n const requires = selectedHandler.getRequires();\n // Build context.\n const context: any = {};\n for (const preview of previews) {\n const fullPreview = handlerMap[preview.id];\n if (fullPreview) {\n const provides = fullPreview.getProvides();\n for (const provide of provides) {\n if (requires.indexOf(provide) !== -1) {\n const newPreview = await fullPreview.updatePreview(instanceId, resource, vault, context);\n if (newPreview) {\n previewActions.setPreview(newPreview);\n dispatch({ type: \"activatePreview\", payload: newPreview.id });\n Object.assign(context, newPreview.data || {});\n }\n }\n }\n }\n }\n\n // Select\n const handler = handlerMap[selectedPreview.id];\n if (handler) {\n const newPreview = await handler.updatePreview(instanceId, resource, vault, context);\n if (newPreview) {\n previewActions.setPreview(newPreview);\n } else {\n previewActions.removePreview(selectedPreview.id);\n await handler.deletePreview(instanceId);\n }\n }\n }\n }\n\n async function selectPreview(id: string) {\n const selectedHandler = handlerMap[id];\n if (selectedHandler && instanceId) {\n dispatch({ type: \"selectPreview\", payload: id });\n await activatePreview(id);\n }\n }\n\n // Be able to generate a preview link on demand from the iiif-preview-service, if available.\n async function getPreviewLink(): Promise<null | string> {\n const handlerId = providesMap[\"readOnlyManifest\"];\n const previewService = handlerId ? handlerMap[handlerId] : null;\n\n if (previewService && instanceId) {\n const existing = previews.find((p) => p.type === \"iiif-preview-service\");\n if (!existing || !(await previewService.isPreviewValid(instanceId, existing))) {\n const preview = await previewService.createPreview(instanceId, resource, vault, {});\n if (preview) {\n return preview.data.readOnlyManifest;\n }\n }\n }\n return null;\n }\n\n function deletePreview(id: string) {\n const selectedHandler = handlerMap[id];\n if (selectedHandler && instanceId) {\n previewActions.removePreview(id);\n selectedHandler.deletePreview(instanceId).then(() => {\n dispatch({ type: \"deletePreview\", payload: id });\n });\n }\n }\n\n async function focusPreview(id: string) {\n const selectedHandler = handlerMap[id];\n if (handlerMap[id] && instanceId && selectedHandler) {\n await selectedHandler.focus(instanceId);\n dispatch({ type: \"focusPreview\", payload: id });\n }\n }\n\n async function activatePreview(id: string) {\n const selectedHandler = handlerMap[id];\n if (selectedHandler && instanceId) {\n const existingPreview = previews.find((p) => p.id === id);\n if (!existingPreview || !selectedHandler.isPreviewValid(instanceId, existingPreview)) {\n const context: any = {};\n const requires = selectedHandler.getRequires();\n // @todo this could be recursive, but not doing that yet.\n for (const requirement of requires) {\n const handlerId = providesMap[requirement];\n const handler = handlerId ? handlerMap[handlerId] : null;\n\n invariant(handler, `Missing handler for Preview requirement \"${requirement}\"`);\n const existing = previews.find((p) => p.id === handlerId);\n const existingIsActive = state.active.find((a) => a === handlerId);\n\n const alwaysCreate = true as boolean;\n\n if (alwaysCreate || !existing || !(await handler.isPreviewValid(instanceId, existing))) {\n const contextualPreview = await handler.createPreview(instanceId, resource, vault, context);\n Object.assign(context, contextualPreview?.data || {});\n previewActions.setPreview(contextualPreview);\n dispatch({\n type: \"activatePreview\",\n payload: contextualPreview.id,\n });\n } else {\n Object.assign(context, existing?.data || {});\n dispatch({ type: \"activatePreview\", payload: existing.id });\n }\n }\n const created = await selectedHandler.createPreview(instanceId, resource, vault, context);\n if (created) {\n previewActions.setPreview(created);\n dispatch({ type: \"activatePreview\", payload: created.id });\n }\n }\n }\n }\n\n return useMemo(\n () => ({\n selectPreview,\n deletePreview,\n focusPreview,\n activatePreview,\n updatePreviews,\n getPreviewLink,\n }),\n // Dispatch has a stable identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [handlerMap, instanceId, vault, state.selected, state.active, previews],\n );\n}\n\nexport function usePreviewHandlers(configs: PreviewConfiguration[]): PreviewHandler[] {\n // @todo in the future the available classes could come from somewhere else and not hardcoded.\n return useMemo(() => {\n const handlers: PreviewHandler[] = [];\n\n for (const config of configs) {\n switch (config.type) {\n case \"iiif-preview-service\":\n handlers.push(new IIIFPreviewService(config));\n break;\n case \"external-manifest-preview\":\n handlers.push(new ExternalManifestUrlPreview(config));\n break;\n }\n }\n return handlers;\n\n // @todo if these ever become configurable, remove this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n","import { Draft, produce } from \"immer\";\nimport { PreviewActionsType, PreviewContext, PreviewState } from \"./PreviewContext.types\";\n\nexport const previewContextReducer = produce(function reducer(state: Draft<PreviewState>, action: PreviewActionsType) {\n switch (action.type) {\n case \"focusPreview\": {\n break;\n }\n\n case \"deletePreview\": {\n if (state.selected === action.payload) {\n state.selected = null;\n }\n state.active = state.active.filter((p) => p !== action.payload);\n break;\n }\n\n case \"activatePreview\": {\n if (state.active.indexOf(action.payload) === -1) {\n state.active.push(action.payload);\n }\n break;\n }\n\n case \"selectPreview\": {\n state.selected = action.payload;\n if (state.active.indexOf(action.payload) === -1) {\n state.active.push(action.payload);\n }\n break;\n }\n }\n});\n\nexport function getDefaultPreviewState(): PreviewState {\n return {\n active: [],\n selected: null,\n };\n}\n","import { createContext, memo, ReactNode, useContext, useEffect, useMemo, useReducer } from \"react\";\nimport { Preview, PreviewConfiguration, PreviewContext } from \"./PreviewContext.types\";\nimport invariant from \"tiny-invariant\";\nimport { usePreviewActions, usePreviewHandlers } from \"./PreviewContext.hooks\";\nimport { getDefaultPreviewState, previewContextReducer } from \"./PreviewContext.reducer\";\nimport { useAppResourceInstance } from \"../AppResourceProvider/AppResourceProvider\";\nimport { useLocalStorage } from \"../hooks/use-local-storage\";\n\nconst PreviewReactContext = createContext<PreviewContext | null>(null);\nconst AvailablePreviewReactContext = createContext<Preview[]>([] as Preview[]);\n\nexport const PreviewProvider = memo(function PreviewProvider({\n children,\n configs = [],\n}: {\n previews: Preview[];\n children: ReactNode;\n configs: PreviewConfiguration[];\n}) {\n const instanceId = useAppResourceInstance();\n const handlers = usePreviewHandlers(configs); \n const [previews, setPreviews] = useLocalStorage<Preview[]>(`preview-${instanceId}`, []);\n\n const [state, dispatch] = useReducer(previewContextReducer, undefined, getDefaultPreviewState);\n const actions = usePreviewActions(state, dispatch, handlers, previews, setPreviews);\n const context: PreviewContext = useMemo(\n () => ({ configs, actions, handlers, ...state }),\n [actions, configs, handlers, state]\n );\n\n useEffect(() => {\n for (const preview of previews) {\n if (!state.active.includes(preview.id)) {\n const handler = handlers.find((h) => h.id === preview.id);\n if (handler) {\n Promise.resolve(handler.isPreviewValid(instanceId, preview)).then((valid) => {\n if (valid) {\n dispatch({ type: \"activatePreview\", payload: preview.id });\n } else {\n setPreviews((prev) => prev.filter((p) => p.id !== preview.id));\n }\n });\n }\n }\n }\n }, [instanceId]);\n\n return (\n <AvailablePreviewReactContext.Provider value={previews}>\n <PreviewReactContext.Provider value={context}>{children}</PreviewReactContext.Provider>\n </AvailablePreviewReactContext.Provider>\n );\n});\n\nexport function usePreviews() {\n return useContext(AvailablePreviewReactContext);\n}\n\nexport function usePreviewContext() {\n const ctx = useContext(PreviewReactContext);\n\n invariant(ctx, \"usePreviewContext() can only be called from inside <PreviewProvider />\");\n\n return ctx;\n}\n","import styled from \"styled-components\";\n\nexport const ButtonReset = styled.button`\n border: none;\n outline: none;\n background-color: transparent;\n margin: 0;\n padding: 0;\n font-size: inherit;\n color: inherit;\n cursor: pointer;\n &:hover {\n color: inherit;\n }\n`;\n\nexport const Button = styled.button<{ $active?: boolean }>`\n padding: 0.5rem 1rem;\n color: ${(props: any) => props.theme.color.main || \"none\"};\n background-color: ${(props: any) => props.theme.color.white || \"white\"};\n border-radius: inherit;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 0.85em;\n :disabled {\n opacity: 0.65;\n cursor: not-allowed;\n }\n\n &:hover {\n background: #eee;\n }\n`;\n\nexport const SmallButton = styled(Button as any)`\n padding: 0.25em ${(props: any) => props.theme.padding.xs || \"0.4em\"};\n height: unset;\n background: none;\n`;\n\nexport const SecondaryButton = styled(Button as any)`\n {\n padding: 0 ${(props: any) => props.theme.padding.medium || \"1rem\"};\n color: ${(props: any) => props.theme.color.main || \"#B84C74;\"};\n background-color: ${(props: any) => props.theme.color.white || \"white\"};\n border: 1px solid ${(props: any) => props.theme.color.main || \"#B84C74;\"};\n border-radius: 0.25rem;\n cursor: pointer;\n height: 2rem;\n display: flex;\n align-items: center;\n white-space: nowrap;\n font-size: 0.75rem;\n\n :disabled {\n opacity: 0.65;\n cursor: not-allowed;\n }\n }\n`;\n\nexport const CalltoButton = styled(Button as any)`\n padding: 0 ${(props: any) => props.theme.padding.medium || \"1rem\"};\n color: ${(props: any) => props.theme.color.white || \"white\"};\n background-color: ${(props: any) => props.theme.color.main || \"#B84C74;\"};\n border: 1px solid #eee;\n border-radius: 0.25rem;\n cursor: pointer;\n justify-content: center;\n display: flex;\n align-items: center;\n &:hover {\n background-color: ${(props: any) => props.theme.color.mainHover || \"#B84C74;\"};\n }\n`;\n\nexport const ButtonGroup = styled.div<{ $right?: boolean }>`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: ${(props) => (props.$right ? \"flex-end\" : \"flex-start\")};\n`;\n","import styled, { css } from \"styled-components\";\nimport { ButtonReset } from \"@manifest-editor/ui/atoms/Button\";\n\nexport const ButtonContainer = styled.div`\n display: flex;\n position: relative;\n width: 10em;\n`;\n\nconst variation = {\n light: {\n bg: { normal: \"#fff\", hover: \"#f8f5fe\", active: \"#f8f5fe\" },\n border: { main: \"\", divider: \"\" },\n color: \"\",\n },\n salmon: {\n bg: { normal: \"#B84C74\", hover: \"#892C4E\", active: \"#892C4E\" },\n border: { main: \"#B84C74\", divider: \"#e37266\" },\n color: \"\",\n },\n};\n\nexport const ButtonMain = styled(ButtonReset as any)`\n flex: 1;\n padding: 0.5em 0.8em;\n background: #b84c74;\n color: #fff;\n border-top-left-radius: 5px;\n font-size: 0.875em;\n border-bottom-left-radius: 5px;\n border: 1px solid #b84c74;\n border-right-width: 0;\n\n &:hover {\n color: #fff;\n background: #892c4e;\n border-color: #892c4e;\n }\n\n &:active {\n background: #892c4e;\n box-shadow: inset 0 2px 8px 0 rgba(0, 0, 0, 0.15);\n }\n`;\n\nexport const ButtonChange = styled(ButtonReset as any)<{ $open: boolean }>`\n background: #b84c74;\n border-top-right-radius: 5px;\n border-bottom-right-radius: 5px;\n border: 1px solid #b84c74;\n border-left: 1px solid #fff;\n padding: 0.4em;\n color: #fff;\n svg {\n fill: currentColor;\n }\n &:hover {\n color: #fff;\n background: #892c4e;\n }\n\n &:active {\n background: #892c4e;\n box-shadow: inset 0 2px 8px 0 rgba(0, 0, 0, 0.15);\n }\n\n ${(props) =>\n props.$open &&\n css`\n background: #892c4e;\n box-shadow: inset 0 2px 8px 0 rgba(0, 0, 0, 0.15);\n `}\n`;\n\nexport const MenuContainer = styled.div<{ $open: boolean }>`\n position: absolute;\n opacity: 0;\n top: 100%;\n margin-top: 0.3em;\n border-radius: 3px;\n left: -50%;\n width: 150%;\n pointer-events: none;\n box-shadow:\n 0 4px 15px 0 rgba(0, 0, 0, 0.18),\n 0 0px 0px 1px rgba(0, 0, 0, 0.15),\n inset 0 0 0 1px rgba(255, 255, 255, 0.2);\n background: #fff;\n overflow: hidden;\n\n ${(props) =>\n props.$open &&\n css`\n opacity: 1;\n pointer-events: visible;\n `}\n`;\n\nexport const MenuItem = styled.div`\n display: flex;\n background: #fff;\n padding: 0.4em;\n align-items: center;\n\n &:hover {\n background: #f9f9f9;\n }\n`;\n\nconst statusMap = {\n available: \"#ddd\",\n configured: \"#e37266\",\n active: \"#4cb235\",\n};\n\nexport const MenuItemStatus = styled.div<{ $status: \"available\" | \"configured\" | \"active\" }>`\n margin: 0.2em 0.5em;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: ${(props) => statusMap[props.$status]};\n`;\n\nexport const MenuItemLabel = styled.div`\n flex: 1;\n font-size: 0.925em;\n padding: 0.2em;\n text-overflow: ellipsis;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n`;\n\nexport const MenuItemClose = styled.div`\n background: #f9f9f9;\n font-size: 0.8em;\n`;\n\nexport const ButtonEmpty = styled.div`\n color: #999;\n font-size: 0.8em;\n padding: 0.6em 0.8em;\n border: 2px dashed #f9f9f9;\n border-radius: 5px;\n user-select: none;\n cursor: not-allowed;\n`;\n","import { DownloadButton } from \"@manifest-editor/components\";\nimport { CloseIcon } from \"@manifest-editor/ui/icons/CloseIcon\";\nimport { DownIcon } from \"@manifest-editor/ui/icons/DownIcon\";\nimport useDropdownMenu from \"react-accessible-dropdown-menu-hook\";\nimport { useVault } from \"react-iiif-vault\";\nimport { useAppResource } from \"../AppResourceProvider/AppResourceProvider\";\nimport { useConfig } from \"../ConfigContext/ConfigContext\";\nimport { usePreviewContext } from \"../PreviewContext/PreviewContext\";\nimport {\n ButtonChange,\n ButtonContainer,\n ButtonEmpty,\n ButtonMain,\n MenuContainer,\n MenuItem,\n MenuItemClose,\n MenuItemLabel,\n MenuItemStatus,\n} from \"./PreviewButton.styles\";\n\nexport function PreviewButton({ downloadEnabled, fileName }: { downloadEnabled?: boolean; fileName?: string }) {\n const { active, configs, actions, selected } = usePreviewContext();\n const vault = useVault();\n const config = useConfig();\n const resource = useAppResource();\n const configsToShow = configs.filter((c) => c.type === \"external-manifest-preview\");\n const { isOpen, buttonProps, itemProps } = useDropdownMenu(configsToShow.length);\n\n if (configsToShow.length === 0) {\n return <ButtonEmpty>Preview not available</ButtonEmpty>;\n }\n\n return (\n <>\n {downloadEnabled ? (\n <div className=\"mr-4\">\n <DownloadButton\n fileName={fileName || \"manifest.json\"}\n label=\"Download manifest\"\n getData={() => {\n if (config.export && config.export.version === 2) {\n return JSON.stringify(vault.toPresentation2(resource as any), null, 2);\n }\n return JSON.stringify(vault.toPresentation3(resource as any), null, 2);\n }}\n />\n </div>\n ) : null}\n <ButtonContainer>\n <ButtonMain\n onClick={() => {\n if (!selected) {\n const defaultPreviewId = config.defaultPreview;\n if (defaultPreviewId) {\n const found = configs.find((c) => c.id === defaultPreviewId);\n if (found) {\n actions.selectPreview(found.id);\n return;\n }\n }\n\n actions.selectPreview(configs[0]!.id);\n }\n actions.updatePreviews();\n }}\n >\n Preview\n </ButtonMain>\n <ButtonChange $open={isOpen} {...buttonProps}>\n <DownIcon />\n </ButtonChange>\n\n <MenuContainer $open={isOpen}>\n {configsToShow.map((config, key) => {\n const inactive = active.indexOf(config.id) === -1;\n return (\n <MenuItem key={config.id} {...(itemProps[key] as any)}>\n <MenuItemStatus $status={inactive ? \"available\" : config.id === selected ? \"active\" : \"configured\"} />\n <MenuItemLabel\n onClick={() => {\n actions.selectPreview(config.id);\n }}\n >\n {config.label}\n </MenuItemLabel>\n {!inactive ? (\n <MenuItemClose onClick={() => actions.deletePreview(config.id)}>\n <CloseIcon />\n </MenuItemClose>\n ) : null}\n </MenuItem>\n );\n })}\n </MenuContainer>\n </ButtonContainer>\n </>\n );\n}\n","import { Logo, Container, Header } from \"./AppHeader.styles\";\nimport { PreviewButton } from \"../PreviewButton/PreviewButton\";\nimport { ManifestEditorLogo } from \"@manifest-editor/components\";\n\nimport { memo } from \"react\";\nimport { useLocalStorage } from \"../hooks/use-local-storage\";\n\ninterface AppHeaderProps {\n onClickLogo?: () => void;\n}\n\nexport const AppHeader = memo(function AppHeader(props: AppHeaderProps) {\n const [isMenuHidden] = useLocalStorage(\"menu-hidden\");\n\n return (\n <Header>\n <Container>\n <Logo onClick={props.onClickLogo}>\n <ManifestEditorLogo />\n </Logo>\n\n <PreviewButton />\n\n {/*<IconButton>•</IconButton>*/}\n </Container>\n {/* {!isMenuHidden ? <ShellOptions /> : null} */}\n </Header>\n );\n});\n","import { createContext, useContext } from \"react\";\n\ntype MenuItem = {\n label: string;\n onClick?: () => void;\n active?: boolean;\n};\n\ninterface AppMenuContext {\n file: {\n new: MenuItem;\n edit: MenuItem;\n open: MenuItem;\n\n newOptions: MenuItem[];\n openOptions: MenuItem[];\n };\n}\n\nconst ReactAppMenuContext = createContext<AppMenuContext | null>(null);\n\nexport function useAppMenu() {\n const ctx = useContext(ReactAppMenuContext);\n\n if (!ctx) {\n return null;\n }\n\n return ctx;\n}\n\nexport function useAppMenuItem<\n Key extends keyof AppMenuContext,\n Name extends keyof AppMenuContext[Key],\n Return extends AppMenuContext[Key][Name],\n>(menu: Key, name: Name): Return | null {\n const ctx = useAppMenu();\n\n if (!ctx) {\n return null;\n }\n\n return ctx[menu][name] as Return;\n}\n\nexport function AppMenuProvider({ children, menu }: { children: React.ReactNode; menu: AppMenuContext }) {\n return <ReactAppMenuContext.Provider value={menu}>{children}</ReactAppMenuContext.Provider>;\n}\n","import { useContext } from \"react\";\nimport { type AtlasStore, AtlasStoreProvider, AtlasStoreReactContext } from \"react-iiif-vault\";\nimport type { StoreApi } from \"zustand\";\n\nexport { AtlasStoreProvider, AtlasStoreReactContext };\n\nexport function useAtlasStore() {\n return useContext(AtlasStoreReactContext) as StoreApi<AtlasStore>;\n}\n","import type { InputShape } from \"polygon-editor\";\n\nexport function polygonToBoundingBox(polygon: InputShape | null) {\n if (!polygon) {\n return null;\n }\n if (polygon.points.length > 2) {\n const x1 = Math.min(...polygon.points.map((p) => p[0]));\n const y1 = Math.min(...polygon.points.map((p) => p[1]));\n const x2 = Math.max(0, ...polygon.points.map((p) => p[0]));\n const y2 = Math.max(0, ...polygon.points.map((p) => p[1]));\n return {\n x: x1,\n y: y1,\n width: x2 - x1,\n height: y2 - y1,\n };\n }\n return null;\n}\n","import { getValue } from \"@iiif/helpers\";\nimport * as IIIFVault from \"@iiif/helpers/vault\";\n\n// This is from the ts version\n// Create an image in the DOM to measure height and width\nconst getImage = async (src: string): Promise<HTMLImageElement> => {\n return new Promise((resolve, reject) => {\n const $img = document.createElement(\"img\");\n $img.onload = () => resolve($img);\n $img.onerror = () => reject();\n $img.src = src;\n if ($img.complete) {\n resolve($img); // cached.\n }\n });\n};\n\nconst getAudioVideo = async (src: string) => {\n return new Promise<HTMLVideoElement>((resolve, reject) => {\n // Video tag accepts both.\n const $media = document.createElement(\"video\");\n $media.onloadedmetadata = () => resolve($media);\n $media.onerror = () => reject();\n $media.preload = \"metadata\";\n $media.src = src;\n });\n};\n\n// use the hints from the user (if any), plus defaults, to get the order\n// in which to try various analysis\nfunction makeTryList(suppliedExpectedTypes: string[]) {\n const defaults = [\"Image\", \"ImageService\", \"ManifestOrCollection\", \"ContentState\"];\n let tryList: string[] = [];\n if (!suppliedExpectedTypes || suppliedExpectedTypes.length === 0) {\n tryList = defaults;\n }\n mergeList(suppliedExpectedTypes, tryList);\n mergeList(defaults, tryList);\n return tryList;\n}\n\nfunction mergeList(inputList: string[], outputList: string[]) {\n inputList.map((t: string) => {\n if (t === \"Image\" && !outputList.includes(\"Image\")) {\n outputList.push(\"Image\");\n }\n if (t === \"ImageService\" && !outputList.includes(\"ImageService\")) {\n outputList.push(\"ImageService\");\n }\n if (t === \"Manifest\" && !outputList.includes(\"ManifestOrCollection\")) {\n outputList.push(\"ManifestOrCollection\");\n }\n if (t === \"Collection\" && !outputList.includes(\"ManifestOrCollection\")) {\n outputList.push(\"ManifestOrCollection\");\n }\n if (t === \"ManifestOrCollection\" && !outputList.includes(\"ManifestOrCollection\")) {\n outputList.push(\"ManifestOrCollection\");\n }\n if (t === \"ContentState\" && !outputList.includes(\"ContentState\")) {\n outputList.push(\"ContentState\");\n }\n });\n}\n\nexport async function detectMedia() {\n //\n}\n\nexport async function analyse(url: string, ...expectedTypes: string[]) {\n // const tryList = makeTryList(expectedTypes);\n\n if (!url) {\n return;\n }\n\n // 2 new options:\n // - Audio\n // - Video\n // Only support them if they end in mp3 or mp4\n if (url.endsWith(\".mp3\") || url.endsWith(\".mp4\") || url.endsWith(\".m4a\") || url.endsWith(\".m4v\")) {\n try {\n const av = await getAudioVideo(url);\n if (av) {\n const isAudio = av.videoWidth === 0;\n return {\n id: url,\n type: av.videoWidth === 0 ? \"Sound\" : \"Video\",\n width: av.videoWidth || undefined, // naturalWidth\n height: av.videoHeight || undefined, // naturalHeight\n duration: av.duration,\n format: isAudio ? \"audio/mp4\" : \"video/mp4\",\n };\n }\n } catch (e) {\n // fall through..\n }\n }\n\n // This doesn't use the tryList order yet.\n // One advantage of doing a fetch first _even if we expect an image_ is that\n // we might capture the content type, if the image is CORS-enabled.\n let response = null;\n try {\n // Try head request, if that works...\n await fetch(url, { method: \"HEAD\" });\n\n // then fetch the full resource.\n response = await fetch(url);\n } catch {\n // can handle the error better, but maybe CORS error happened so:\n return handleNonFetchableUrl(url);\n }\n\n if (!response.ok) {\n response = await fetch(url + \"/info.json\");\n if (!response.ok) {\n return handleNonFetchableUrl(url);\n }\n }\n\n // but... it might have been a CORS-enabled image, or an image from an image service.\n // In this scenario we can capture the content type right here.\n const contentTypeHeader = response.headers.get(\"Content-Type\");\n if (contentTypeHeader?.includes(\"image/\")) {\n return handleNonFetchableUrl(url, contentTypeHeader);\n }\n\n // OK, it's probably NOT an image, and we have an OK response, so can we get JSON from it?\n let data = null;\n try {\n data = await response.json();\n } catch {\n return null;\n }\n\n return await analyseJson(data, url);\n}\n\nfunction asImageService(data: any) {\n if (data.protocol && data.protocol === \"http://iiif.io/api/image\") {\n if (!data.type) {\n data.type = \"ImageService\";\n }\n // NB this will be ImageService3 if it's a v3 img service\n return data;\n }\n return null;\n}\n\nexport async function analyseJson(data: any, url: string) {\n // Is it an image service?\n const testImageService = asImageService(data);\n if (testImageService) {\n return testImageService;\n }\n\n // does it have an ID?\n const dataId = data.id || data[\"@id\"];\n if (!dataId) {\n return null;\n }\n const vault = new IIIFVault.Vault();\n const vaultData = await vault.load(url, data); // we could use dataId here, but just in case it's wrong...\n if (!vaultData) {\n return;\n }\n // @ts-ignore\n if ((vaultData && vaultData?.type === \"Manifest\") || vaultData?.type === \"Collection\") {\n return {\n id: url,\n // @ts-ignore\n type: vaultData.type,\n // @ts-ignore\n label: getValue(vaultData.label),\n };\n }\n}\n\nasync function handleNonFetchableUrl(url: string, capturedContentType?: string) {\n // it *is* an image... but is it an image from an image service?\n // In its current form this should be tried before any fetch happens\n // that is, does it match:\n // http<s>://<any.org>/<any-prefix>/region/size/rotation/format.quality ?\n // This should really call Stephen's IIIF Image API parser, and if it's a success, we know it's\n // probably an image service\n // https://github.com/atlas-viewer/iiif-image-api\n // https://github.com/atlas-viewer/iiif-image-api/blob/main/src/utility/parse-image-service-request.ts\n const parts = url.split(\"/\");\n if (parts.length >= 8) {\n // might be an image service\n const iiifParts = parts.slice(-4);\n // need to do more than this but the parser can do the hard work\n if (iiifParts[3]!.split(\".\").length === 2) {\n // This is not reliable! parse it properly!\n if (iiifParts[2]![0] === \"!\" || iiifParts[2] === iiifParts[2]) {\n // rotation param is numeric\n // this is worth trying as an image service\n const serviceUrl = parts.slice(0, parts.length - 4).join(\"/\") + \"/info.json\";\n // assume this is a low cost thing to try\n const imgService = await getImageService(serviceUrl);\n if (imgService && imgService?.type && imgService?.type?.startsWith(\"ImageService\")) {\n return imgService;\n }\n }\n }\n }\n\n // OK we didn't find an image service behind that image URL. So now it's time to use the DOM.\n\n try {\n const image = (await getImage(url)) as any;\n const data = {\n id: url,\n type: \"Image\",\n width: image.width, // naturalWidth\n height: image.height, // naturalHeight\n format: await getFormat(url, capturedContentType),\n };\n return data;\n } catch {}\n\n return null;\n}\n\nasync function getImageService(url: string) {\n try {\n const response = await fetch(url);\n if (response.ok) {\n const data = await response.json();\n return await analyseJson(data, url);\n }\n return null;\n } catch (e: any) {\n console.log(e);\n return null;\n }\n}\n\nexport async function getFormat(url: string, capturedContentType?: string) {\n if (capturedContentType) {\n // we managed to learn this earlier, the image had CORS\n return capturedContentType;\n }\n try {\n // a HEAD request doesn't have CORS issues... well it didn't used to...\n const response = await fetch(url, { method: \"HEAD\", mode: \"no-cors\" });\n const ct = response.headers.get(\"Content-type\");\n if (ct) {\n return ct;\n }\n } catch (e) {\n // ignore.\n }\n\n // if the above still fails, we could fall back to guessing\n // content-type from the URL (.jpg etc).\n const test = url.toLowerCase();\n if (test.endsWith(\"jpg\") || test.endsWith(\"jpeg\")) {\n return \"image/jpeg\";\n }\n if (test.endsWith(\"png\")) {\n return \"image/png\";\n }\n // Just a default.\n return \"image/jpeg\";\n}\n\nexport async function getImageDimensions(url: string) {\n try {\n const image = await getImage(url);\n if (image) {\n return {\n width: image.naturalWidth || image.width,\n height: image.naturalHeight || image.height,\n };\n }\n } catch (e) {\n return null;\n }\n return null;\n}\n","import { toRef } from \"@iiif/parser\";\nimport type { ManifestNormalized } from \"@iiif/presentation-3-normalized\";\nimport type { AppExtension, MappedApp } from \"./AppContext/AppContext\";\n\nexport async function getManifestNomalized(\n id: string,\n): Promise<ManifestNormalized | undefined> {\n let responseData: ManifestNormalized | undefined;\n try {\n await fetch(id)\n .then((response) => {\n return response.json().catch((err) => {\n console.error(`'${err}' happened!`);\n });\n })\n .then((data) => {\n responseData = { ...data };\n });\n } catch (error) {\n console.log(error);\n }\n return responseData;\n}\n\nexport function createActionIdentity(\n type: string,\n property: string,\n parent: any,\n) {\n return `create_${type}_${property}_${toRef(parent)?.type || \"unknown\"}`;\n}\n\nexport function createDownload(\n data: any,\n fileName: string,\n fileType = \"text/json\",\n) {\n // Create a blob with the data we want to download as a file\n const blob =\n data instanceof Blob ? data : new Blob([data], { type: fileType });\n // Create an anchor element and dispatch a click event on it\n // to trigger a download\n const a = document.createElement(\"a\");\n a.download = fileName;\n a.href = window.URL.createObjectURL(blob);\n const clickEvt = new MouseEvent(\"click\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n a.dispatchEvent(clickEvt);\n a.remove();\n}\n\nexport async function copyToClipboard(json: string | any) {\n return navigator.clipboard.writeText(\n typeof json === \"string\" ? json : JSON.stringify(json, null, 2),\n );\n}\n\nexport function randomId() {\n return `${Math.random().toString(36).substr(2)}-${Date.now().toString(36)}`;\n}\n\nexport function mapApp(\n input: any,\n map?: (app: MappedApp) => MappedApp,\n): MappedApp {\n const { default: metadata, config, ...props } = input;\n const app = {\n metadata: metadata as any,\n layout: {\n leftPanels: [],\n rightPanels: [],\n centerPanels: [],\n ...(props as any),\n },\n config,\n };\n\n return map ? map(app) : app;\n}\n\nexport function extendApp(\n app: MappedApp,\n metadata: MappedApp[\"metadata\"],\n extensions: AppExtension,\n): MappedApp {\n return {\n ...app,\n metadata,\n config: {\n ...(app.config || {}),\n ...(extensions.config || {}),\n },\n layout: {\n ...app.layout,\n leftPanels: [\n ...(app.layout.leftPanels || []).filter((panel) => {\n if (extensions?.leftPanelIds) {\n return extensions.leftPanelIds.includes(panel.id);\n }\n return true;\n }),\n ...(extensions?.leftPanels || []),\n ],\n annotations: [\n ...(extensions?.annotations || []),\n ...(app.layout.annotations || []),\n ],\n canvasEditors: [\n ...(extensions?.canvasEditors || []),\n ...(app.layout.canvasEditors || []),\n ],\n creators: [\n ...(extensions?.creators || []),\n ...(app.layout.creators || []),\n ],\n background: [\n ...(app.layout?.background || []),\n ...(extensions?.background || []),\n ],\n editors: [\n //\n ...(extensions?.editors || []),\n ...(app.layout.editors || []),\n ],\n rightPanels: [\n ...(app.layout.rightPanels || []),\n ...(extensions?.rightPanels || []),\n ],\n centerPanels: [\n ...(app.layout.centerPanels || []),\n ...(extensions?.centerPanels || []),\n ],\n modals: [\n ...(app.layout.modals || []),\n ...(extensions?.modalPanels || []),\n ],\n },\n };\n}\n","import { create } from \"zustand\";\nimport { useEffect, useMemo } from \"react\";\nimport { randomId } from \"./helpers\";\n\ntype Projection = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\ninterface HighlightedImageResources {\n regions: Record<string, Projection | null>;\n resources: string[];\n setRegion: (id: string, region?: Projection | null) => void;\n setHighlight: (id: string | string[]) => void;\n highlight: (id: string) => void;\n clearHighlight: (id: string) => void;\n}\n\nexport const useHighlightedImageResource = create<HighlightedImageResources>((set) => ({\n regions: {},\n resources: [],\n setRegion: (id, region) => {\n set((ex) => ({ ...ex.regions, regions: { [id]: region || null } }));\n },\n setHighlight: (id: string | string[]) => {\n set({ resources: Array.isArray(id) ? id : [id] });\n },\n highlight: (id) => {\n set((s) => {\n if (s.resources.indexOf(id) !== -1) {\n return s;\n }\n return { resources: [...s.resources, id] };\n });\n },\n clearHighlight: (id) => {\n set((s) => ({ resources: s.resources.filter((item) => item !== id) }));\n },\n}));\n\nexport function useTemporaryHighlight(newValue?: Projection | null) {\n const id = useMemo(() => randomId(), []);\n const value = useHighlightedImageResource((s) => s.regions[id]);\n const setRegion = useHighlightedImageResource((s) => s.setRegion);\n\n useEffect(() => {\n if (value && newValue) {\n if (\n value !== newValue &&\n (value.x !== newValue.x ||\n value.y !== newValue.y ||\n value.width !== newValue.width ||\n value.height !== newValue.height)\n ) {\n setRegion(id, newValue || null);\n }\n } else {\n setRegion(id, newValue || null);\n }\n }, [value]);\n\n useEffect(() => {\n return () => setRegion(id, null);\n }, []);\n}\n\nexport function useHoverHighlightImageResource(id?: string) {\n const highlight = useHighlightedImageResource((s) => s.highlight);\n const clear = useHighlightedImageResource((s) => s.clearHighlight);\n\n useEffect(() => {\n return () => {\n if (id) {\n clear(id);\n }\n };\n }, [clear, id]);\n\n return useMemo(() => {\n return {\n onMouseEnter() {\n if (id) {\n highlight(id);\n }\n },\n onMouseLeave() {\n if (id) {\n clear(id);\n }\n },\n };\n }, [id, highlight, clear]);\n}\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\n\nexport const StarIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","export const BackIcon: React.FC<{ style?: any }> = ({ style }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1rem\" viewBox=\"0 0 24 24\" width=\"1rem\" fill=\"#000000\" style={style}>\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\" />\n </svg>\n);\n","import { createContext, useContext, useMemo } from \"react\";\nimport { LayoutActions, LayoutProviderProps, LayoutState } from \"./Layout.types\";\nimport { useApp } from \"../AppContext/AppContext\";\n\nexport const LayoutActionsReactContext = createContext<LayoutActions>(null as any);\nexport const LayoutStateReactContext = createContext<LayoutState>(null as any);\n\nexport function useLayoutState() {\n return useContext(LayoutStateReactContext);\n}\n\nexport function useLayoutActions() {\n return useContext(LayoutActionsReactContext);\n}\n\nexport function useAvailableLayouts() {\n const app = useApp();\n return app.layout;\n}\n\nexport function useLayoutProvider(): LayoutProviderProps & {\n loading?: true;\n actions: LayoutActions;\n state: LayoutState;\n} {\n const app = useApp();\n const layout = app.layout;\n const actions = useContext(LayoutActionsReactContext);\n const state = useContext(LayoutStateReactContext);\n\n return useMemo(() => {\n return { actions, state, ...layout };\n\n // The actions have a fully stable identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [app, state]);\n}\n","import { ErrorMessage, PaddedSidebarContainer } from \"@manifest-editor/components\";\nimport { Button, CalltoButton } from \"@manifest-editor/ui/atoms/Button\";\nimport { ExperimentalMessage } from \"@manifest-editor/ui/madoc/components/callouts/ExperimentalMessage\";\nimport { WarningMessage } from \"@manifest-editor/ui/madoc/components/callouts/WarningMessage\";\nimport { ExperimentalIcon } from \"@manifest-editor/ui/madoc/components/icons/ExperimentalIcon\";\n// import { LimitationError } from \"../../../helpers/limitation\";\n// import { FixMeError } from \"@/helpers/fix-me\";\nimport { useState } from \"react\";\n\nexport function PanelError(props: { error: Error; resetErrorBoundary: () => void }) {\n const error = props.error.toString();\n const [isFixing, setIsFixing] = useState(false);\n\n // @todo come back to.\n // if (props.error instanceof FixMeError) {\n // const errorObject = props.error;\n\n // return (\n // <PaddedSidebarContainer>\n // <WarningMessage $banner>\n // <ExperimentalIcon style={{ fontSize: \"2.2em\", margin: \"0 0.3em 0 0\" }} />\n // <div>\n // <h4 style={{ margin: 0 }}>There is a fixable error</h4>\n // <p>{errorObject.message}</p>\n // <Button\n // disabled={isFixing}\n // onClick={async () => {\n // setIsFixing(true);\n // await errorObject.fix();\n // props.resetErrorBoundary();\n // setIsFixing(false);\n // }}\n // >\n // Fix error\n // </Button>\n // </div>\n // </WarningMessage>\n // </PaddedSidebarContainer>\n // );\n // }\n\n // @todo come back to.\n // if (props.error instanceof LimitationError) {\n // error = props.error.message;\n\n // return (\n // <PaddedSidebarContainer>\n // <ExperimentalMessage $banner>\n // <ExperimentalIcon style={{ fontSize: \"2.2em\", margin: \"0 0.3em 0 0\" }} />\n // <div>\n // <h4 style={{ margin: 0 }}>The manifest editor is still in development</h4>\n // <p>{error}</p>\n // </div>\n // </ExperimentalMessage>\n // </PaddedSidebarContainer>\n // );\n // }\n\n return (\n <PaddedSidebarContainer>\n <ErrorMessage className=\"mb-2\">{error}</ErrorMessage>\n <CalltoButton onClick={props.resetErrorBoundary}>Try again</CalltoButton>\n </PaddedSidebarContainer>\n );\n}\n","import { PinnablePanelState } from \"./Layout.types\";\nimport { createElement, ReactNode } from \"react\";\n\nexport function isPinnableState(t: unknown): t is PinnablePanelState {\n return t && (t as any).pinnable;\n}\n\nexport function panelSizing({\n initial,\n\n fallback,\n options = {},\n}: {\n initial?: number;\n fallback: number;\n options?: { minWidth?: number; maxWidth?: number };\n}) {\n // panel min width\n // panel max width\n // default width\n // fallback width\n return Math.max(options.minWidth || 0, Math.min(options.maxWidth || Infinity, initial || fallback));\n}\n\nexport function renderHelper(htmlOrReact: string | ReactNode): ReactNode {\n if (typeof htmlOrReact === \"string\") {\n return createElement(\"div\", { dangerouslySetInnerHTML: { __html: htmlOrReact } });\n }\n return htmlOrReact;\n}\n","import styled, { css } from \"styled-components\";\nimport { Button } from \"./Button\";\n\nexport const Dropdown = styled.div`\n position: relative;\n display: inline-block;\n`;\n\nexport const DropdownContent = styled.div`\n display: flex;\n flex-direction: column;\n position: absolute;\n background-color: ${(props: any) => props.theme.color.white || \"white\"};\n color: ${(props: any) => props.theme.color.black || \" black\"};\n font-size: 0.75rem;\n min-width: 160px;\n box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);\n z-index: 150;\n button {\n &:hover {\n background-color: ${(props: any) => props.theme.color.lightgrey || \"lightgrey\"};\n }\n }\n`;\n\nexport const DropdownItem = styled.button<{ $active?: boolean }>`\n padding: 0 ${(props: any) => props.theme.padding.small || \"0.5rem\"};\n color: ${(props: any) => props.theme.color.main || \"none\"};\n background-color: ${(props: any) => props.theme.color.white || \"white\"};\n border-radius: 0;\n border: none;\n cursor: pointer;\n display: flex;\n padding: 0.65em 1em;\n align-items: center;\n :disabled {\n opacity: 0.65;\n cursor: not-allowed;\n }\n\n &:hover {\n background-color: ${(props: any) => props.theme.color.lightgrey || \"lightgrey\"};\n }\n\n ${(props) =>\n props.$active &&\n css`\n background: #b84c74;\n color: #fff;\n &:hover {\n background: #b84c74;\n color: #fff;\n }\n `}\n`;\n\nexport const DropdownMenu = styled.div<{ $open?: boolean; $center?: boolean }>`\n display: none;\n flex-direction: column;\n position: absolute;\n background: #fff;\n color: ${(props: any) => props.theme.color.black || \" black\"};\n font-size: 0.75rem;\n min-width: 190px;\n top: calc(100% + 0.5em);\n box-shadow:\n 0 4px 15px 0 rgba(0, 0, 0, 0.18),\n 0 0px 0px 1px rgba(0, 0, 0, 0.15),\n inset 0 0 0 1px rgba(255, 255, 255, 0.2);\n border-radius: 3px;\n z-index: 150;\n overflow: hidden;\n padding-bottom: 3px;\n\n ${Button} {\n &:hover {\n background-color: ${(props: any) => props.theme.color.lightgrey || \"lightgrey\"};\n }\n }\n\n ${(props) =>\n props.$open &&\n css`\n display: flex;\n `}\n`;\n\nexport const DropdownLabel = styled.div`\n color: #999;\n text-transform: uppercase;\n font-weight: 600;\n padding: 0.7em;\n font-size: 0.875em;\n`;\n\nexport const DropdownDivider = styled.div`\n height: 1px;\n margin: 0 0.5em;\n background: #eee;\n`;\n","import { TransitionStatus } from \"react-transition-group\";\nimport { LayoutPanel, PanelActions, PanelState, PinnablePanelActions, PinnablePanelState } from \"../Layout.types\";\nimport styled, { css } from \"styled-components\";\nimport { StarIcon } from \"@manifest-editor/ui/icons/StarIcon\";\nimport { CloseIcon } from \"@manifest-editor/ui/icons/CloseIcon\";\nimport { BackIcon } from \"@manifest-editor/ui/icons/BackIcon\";\nimport { useLayoutProvider } from \"../Layout.context\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { PanelError } from \"./PanelError\";\nimport { renderHelper } from \"../Layout.helpers\";\nimport { ReactVaultContext } from \"react-iiif-vault\";\nimport {\n DropdownDivider,\n DropdownLabel,\n DropdownMenu,\n Dropdown,\n DropdownItem,\n} from \"@manifest-editor/ui/atoms/Dropdown\";\nimport useDropdownMenu from \"react-accessible-dropdown-menu-hook\";\nimport { useAppState } from \"../../AppContext/AppContext\";\n\nconst OverrideScrollbar = 'OverrideScrollbar';\n\ninterface ModularPanelProps {\n panel?: LayoutPanel;\n isLeft?: boolean;\n state: PinnablePanelState | PanelState;\n actions: PanelActions;\n pinActions?: PinnablePanelActions;\n transition?: TransitionStatus;\n noHeader?: boolean;\n close?: () => void;\n available?: LayoutPanel[];\n style?: any;\n}\n\nconst LayoutTitleReactContext = createContext<(title: string) => void>(null as any);\n\nexport function useSetCustomTitle() {\n return useContext(LayoutTitleReactContext);\n}\n\nconst ModularPanelWrapper = styled.div<{ $floating?: boolean; $state?: TransitionStatus; $flipped?: boolean }>`\n display: flex;\n flex-direction: column;\n position: relative;\n height: 100%;\n overflow: hidden;\n transition: transform 300ms;\n\n &[data-header=\"false\"] {\n border-top: 1px solid #e4e7f0;\n }\n\n &[data-floating=\"true\"] {\n margin: 10px;\n border-radius: 5px;\n overflow: hidden;\n background: #fff;\n }\n\n &[data-state=\"entering\"],\n &[data-state=\"entered\"] {\n transform: translateX(0);\n }\n\n &[data-state=\"exiting\"],\n &[data-state=\"exited\"] {\n transform: translateX(100%);\n }\n\n &[data-state=\"exiting\"][data-flipped=\"true\"],\n &[data-state=\"exited\"][data-flipped=\"true\"] {\n transform: translateX(0);\n }\n\n &[data-state=\"exiting\"][data-flipped=\"false\"],\n &[data-state=\"exited\"][data-flipped=\"false\"] {\n transform: translateX(100%);\n }\n\n &[data-state=\"entering\"][data-flipped=\"true\"],\n &[data-state=\"entered\"][data-flipped=\"true\"] {\n transform: translateX(0);\n }\n\n &[data-state=\"entering\"][data-flipped=\"false\"],\n &[data-state=\"entered\"][data-flipped=\"false\"] {\n transform: translateX(100%);\n }\n\n &[data-state=\"unmounted\"] {\n transform: translateX(100%);\n }\n`;\n\nexport const ModularPanelHeader = styled.div<{ $tabs?: boolean; $error?: boolean }>`\n background: #fff;\n display: flex;\n height: 2.8em;\n align-items: center;\n z-index: 2;\n\n &[data-tabs=\"true\"] {\n box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.17);\n }\n\n &[data-tabs=\"false\"] {\n box-shadow:\n inset 0 -1px 0 0 rgba(0, 0, 0, 0.17),\n inset 0 1px 0 0 rgba(0, 0, 0, 0.17);\n }\n\n &[data-error=\"true\"] {\n color: #b61717;\n background: #ffc2d2;\n box-shadow: inset 0 -5px 10px 0 rgba(255, 255, 255, 0.5);\n }\n`;\n\nexport const ModulePanelButton = styled.button`\n border: none;\n background: transparent;\n padding: 0 0.4em;\n margin: 0.3em;\n border-radius: 3px;\n &:hover {\n background: #eee;\n }\n svg {\n font-size: 1.2em;\n }\n`;\n\nconst ModulePanelSpacer = styled.div`\n flex: 1 1 0px;\n`;\n\nconst ModularPanelLabel = styled.div`\n font-size: 0.875em;\n flex: 1 1 0px;\n padding-left: 1em;\n text-align: center;\n align-self: center;\n`;\n\nconst ModularPanelContent = styled.div`\n flex: 1 1 0px;\n display: flex;\n\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n\n > * {\n min-width: 0;\n }\n`;\n\nexport function ModularPanel({\n panel,\n state,\n actions,\n isLeft,\n pinActions = actions as any,\n transition,\n close,\n available = [],\n style,\n noHeader,\n}: ModularPanelProps) {\n const vault = useContext(ReactVaultContext) || null;\n const [didError, setDidError] = useState(false);\n const appState = useAppState();\n const layout = useLayoutProvider();\n const { tabs, pinnable, hideHeader } = panel?.options || {};\n const resetKeys = [appState.state.canvasId, panel?.id];\n const switchablePanels = useMemo(() => {\n return (available || []).filter((p) => !p.requiresState);\n }, [available]);\n const { itemProps, isOpen, setIsOpen } = useDropdownMenu(switchablePanels.length);\n const [customTitle, setCustomTitle] = useState(\"\");\n const setCustomTitleRef = useRef<(title: string) => void | undefined>();\n\n useEffect(() => setDidError(false), resetKeys);\n\n useEffect(() => setCustomTitle(\"\"), [panel]);\n\n useEffect(() => {\n setCustomTitleRef.current = setCustomTitle;\n return () => {\n setCustomTitleRef.current = undefined;\n };\n }, []);\n\n const _setCustomTitle = useCallback((title: string) => {\n if (setCustomTitleRef.current) {\n setCustomTitleRef.current(title);\n }\n }, []);\n\n const backAction = useCallback(\n (e?: React.MouseEvent) => {\n const originalCallback = panel\n ? state.stack.length\n ? actions.popStack\n : panel.backAction\n ? () => panel && panel.backAction && panel.backAction(state, { ...layout, current: actions }, appState)\n : null\n : null;\n\n if (e && (!originalCallback || e.metaKey) && switchablePanels.length) {\n e.preventDefault();\n setIsOpen(true);\n } else {\n originalCallback && originalCallback();\n }\n },\n [actions, appState, layout, panel, setIsOpen, state, switchablePanels.length]\n );\n\n const menuHandler = (newPanel: LayoutPanel) => {\n actions.change({\n id: newPanel.id,\n state: newPanel.defaultState,\n stacked: !!(state.stack.length || panel?.backAction),\n });\n };\n\n if (!panel || !state.current) {\n return null;\n }\n\n const backButton =\n panel.backAction || state.stack.length ? (\n <ModulePanelButton onClick={backAction}>\n <BackIcon />\n </ModulePanelButton>\n ) : null;\n\n const closeButton = (\n <ModulePanelButton onClick={close || actions.close}>\n <CloseIcon />\n </ModulePanelButton>\n );\n\n return (\n <LayoutTitleReactContext.Provider value={_setCustomTitle}>\n <ModularPanelWrapper data-state={transition} data-flipped={isLeft} style={style} data-header={!noHeader}>\n {noHeader ? null : (\n <ModularPanelHeader data-tabs={!!tabs} data-error={didError}>\n <Dropdown style={{ display: \"flex\", height: \"100%\" }}>\n {panel.renderBackAction ? panel.renderBackAction({ backAction, fallback: backButton }) : backButton}\n {switchablePanels.length ? (\n <DropdownMenu $open={isOpen} style={{ left: \"0.5em\" }}>\n <DropdownLabel>All panels</DropdownLabel>\n <DropdownDivider />\n {switchablePanels.map((newPanel, i) => (\n <DropdownItem\n key={i}\n {...(itemProps as any)[i]}\n onClick={() => menuHandler(newPanel)}\n $active={panel.id === newPanel.id}\n >\n {newPanel.label}\n </DropdownItem>\n ))}\n </DropdownMenu>\n ) : null}\n </Dropdown>\n\n {customTitle ? (\n <ModularPanelLabel>{customTitle}</ModularPanelLabel>\n ) : hideHeader ? (\n <ModulePanelSpacer />\n ) : (\n <ModularPanelLabel>{panel.label}</ModularPanelLabel>\n )}\n {pinnable ? (\n (state as PinnablePanelState).pinned ? (\n <ModulePanelButton onClick={pinActions.unpin}>\n <StarIcon fill=\"orange\" />\n </ModulePanelButton>\n ) : (\n <ModulePanelButton onClick={() => pinActions.pin({ id: panel.id, state: state.state })}>\n <StarIcon fill=\"#ddd\" />\n </ModulePanelButton>\n )\n ) : null}\n {panel.renderCloseAction\n ? panel.renderCloseAction({ closeAction: close || actions.close, fallback: closeButton })\n : closeButton}\n </ModularPanelHeader>\n )}\n <ModularPanelContent className={OverrideScrollbar}>\n <ErrorBoundary\n // onResetKeysChange={() => setDidError(false)}\n onError={() => setDidError(true)}\n FallbackComponent={PanelError}\n resetKeys={resetKeys}\n onReset={() => setDidError(false)}\n >\n {renderHelper(\n panel.render(\n state.state || panel.defaultState || {},\n { ...layout, current: actions, vault: vault as any, transition },\n appState\n )\n )}\n </ErrorBoundary>\n </ModularPanelContent>\n </ModularPanelWrapper>\n </LayoutTitleReactContext.Provider>\n );\n}\n","import { Vault } from \"@iiif/helpers/vault\";\nimport {\n addReference,\n batchActions,\n modifyEntityField,\n reorderEntityField,\n requestResource,\n} from \"@iiif/helpers/vault/actions\";\nimport { actionListFromResource } from \"@iiif/helpers/vault/utility\";\n\nexport function createPreviewVault(homepageCollectionId = \"vault://homepage-collection.json\") {\n const vault = new Vault();\n\n // 1st - ensure that our \"default\" collection exists OR import one.\n const previewCollection = window.localStorage.getItem(\"preview-vault-collection\");\n let didImport = false;\n if (previewCollection) {\n try {\n const previewState = JSON.parse(previewCollection);\n if (previewState.id && previewState.id === homepageCollectionId) {\n vault.dispatch(requestResource({ id: previewState.id }));\n const toDispatch: any = actionListFromResource(previewState.id, previewState);\n vault.dispatch(batchActions({ actions: toDispatch }));\n didImport = true;\n }\n } catch (e) {\n //\n }\n }\n\n if (!didImport) {\n const toDispatch: any = actionListFromResource(homepageCollectionId, {\n \"@context\": \"http://iiif.io/api/presentation/3/context.json\",\n id: homepageCollectionId,\n type: \"Collection\",\n label: { en: [\"Recent items\"] },\n items: [],\n });\n vault.dispatch(requestResource({ id: homepageCollectionId }));\n vault.dispatch(batchActions({ actions: toDispatch }));\n }\n\n const clearHistory = () => {\n vault.dispatch(modifyEntityField({ id: homepageCollectionId, type: \"Collection\", key: \"items\", value: [] }));\n window.localStorage.setItem(\n \"preview-vault-collection\",\n JSON.stringify(vault.toPresentation3({ id: homepageCollectionId, type: \"Collection\" }))\n );\n };\n\n const addHistory = (id: string, type: string) => {\n const state = vault.getState();\n if (id && type && (type === \"Collection\" || type === \"Manifest\")) {\n const existingCollection = state.iiif.entities.Collection[homepageCollectionId];\n // This shouldn't happen... but it could.\n if (existingCollection) {\n const alreadyExists = existingCollection.items.findIndex((t) => t.id === id);\n if (alreadyExists === -1) {\n vault.dispatch(\n addReference({\n id: homepageCollectionId,\n type: \"Collection\",\n reference: { id, type },\n key: \"items\",\n index: 0,\n })\n );\n } else {\n vault.dispatch(\n reorderEntityField({\n id: homepageCollectionId,\n type: \"Collection\",\n key: \"items\",\n startIndex: alreadyExists,\n endIndex: 0,\n })\n );\n }\n\n window.localStorage.setItem(\n \"preview-vault-collection\",\n JSON.stringify(vault.toPresentation3({ id: homepageCollectionId, type: \"Collection\" }))\n );\n }\n }\n };\n\n const unsubscribe2 = vault.on(\"after:@iiif/REMOVE_REFERENCE\", (ctx) => {\n if (ctx.action.payload.id === homepageCollectionId) {\n window.localStorage.setItem(\n \"preview-vault-collection\",\n JSON.stringify(vault.toPresentation3({ id: homepageCollectionId, type: \"Collection\" }))\n );\n }\n });\n\n const unsubscribe = () => {\n // This isn't working, because React.\n // unsubscribe1();\n // unsubscribe2();\n };\n\n return { vault, unsubscribe, addHistory, clearHistory } as const;\n}\n","import { createContext, useContext, useEffect, useMemo } from \"react\";\nimport { Vault } from \"@iiif/helpers/vault\";\nimport { VaultProvider } from \"react-iiif-vault\";\nimport { createPreviewVault } from \"./create-preview-vault\";\n\nexport function usePreviewVault() {\n return useContext(PreviewVaultReactContext);\n}\n\nconst PreviewVaultReactContext = createContext<Vault>(new Vault());\n\nconst PreviewVaultAddHistory = createContext({\n addHistory: (id: string, type: string) => {},\n clearHistory: () => {},\n});\n\nexport const HOMEPAGE_COLLECTION = \"manifest-editor://homepage-collection.json\";\n\nexport function usePreviewHistory() {\n return useContext(PreviewVaultAddHistory);\n}\n\nexport function PreviewVaultContext(props: { children: any }) {\n const { vault, unsubscribe, addHistory, clearHistory } = useMemo(() => {\n return createPreviewVault(HOMEPAGE_COLLECTION);\n }, []);\n\n useEffect(() => {\n return unsubscribe;\n }, []);\n\n return (\n <PreviewVaultAddHistory.Provider value={{ addHistory, clearHistory }}>\n <PreviewVaultReactContext.Provider value={vault}>{props.children}</PreviewVaultReactContext.Provider>\n </PreviewVaultAddHistory.Provider>\n );\n}\n\nexport function PreviewVaultBoundary({ children }: { children: any }) {\n const vault = usePreviewVault();\n\n return <VaultProvider vault={vault}>{children}</VaultProvider>;\n}\n","import { toRef } from \"@iiif/parser\";\nimport type { Reference } from \"@iiif/presentation-3\";\nimport { Creator, matchBasedOnResource } from \"@manifest-editor/creator-api\";\nimport { useCallback, useMemo } from \"react\";\nimport { useVault } from \"react-iiif-vault\";\nimport { useApp } from \"../AppContext/AppContext\";\nimport { createActionIdentity } from \"../helpers\";\nimport { useLayoutActions } from \"../Layout/Layout.context\";\nimport { usePreviewVault } from \"../PreviewVault/PreviewVault\";\n\nexport function useCreator(\n parent: any,\n property: string,\n type: string,\n target?: Reference,\n options?: { isPainting?: boolean; onlyReference?: boolean },\n) {\n const vault = useVault();\n const app = useApp();\n const { create, edit } = useLayoutActions();\n const supported = useMemo(\n () => matchBasedOnResource({ type, parent, index: 0, property }, app.layout.creators || [], { vault }),\n [parent, property, app.layout.creators, type, vault],\n );\n const canCreate = parent && supported.length !== 0;\n\n const wrappedCreate = useCallback(\n (index?: number, initialData?: any) => {\n if (parent) {\n return create({\n type,\n parent: toRef(parent),\n property,\n index,\n target,\n initialData,\n ...(options || {}),\n });\n }\n },\n [create, parent, property, type, options, target],\n );\n\n const wrappedFilteredCreate = useCallback(\n (filter: string, index?: number, initialData?: any) => {\n if (parent) {\n return create({\n type,\n filter,\n parent: toRef(parent),\n property,\n index,\n target,\n initialData,\n ...(options || {}),\n });\n }\n },\n [create, parent, property, type, options, target],\n );\n\n const wrappedEdit = useCallback(\n (resource: any, index?: number) => {\n edit(resource, parent ? { parent: toRef(parent), property, index } : undefined);\n },\n [edit, parent, property],\n );\n\n const wrappedCreator = useCallback(\n (initialCreator: string, initialData?: any) => {\n if (parent) {\n return create({\n type,\n initialCreator,\n parent: toRef(parent),\n property,\n target,\n initialData,\n ...(options || {}),\n });\n }\n },\n [type, property, parent, target, create, options],\n );\n\n const buttonProps = useMemo(() => {\n return {\n \"data-action-id\": createActionIdentity(type, property, parent),\n };\n }, [type, property, parent]);\n\n return [\n canCreate,\n {\n create: wrappedCreate,\n edit: wrappedEdit,\n createFiltered: wrappedFilteredCreate,\n creator: wrappedCreator,\n buttonProps,\n },\n ] as const;\n}\n\nexport function useInlineCreator() {\n const vault = useVault();\n const previewVault = usePreviewVault();\n const app = useApp();\n return useMemo(() => {\n return new Creator(vault, app.layout.creators || [], previewVault);\n }, [app.layout.creators, vault]);\n}\n","import { toRef } from \"@iiif/parser\";\nimport {\n ActionButton,\n BackIcon,\n CreatorGrid,\n EmptyState,\n ErrorMessage,\n GridIcon,\n IconButton,\n ModalBackSlot,\n Spinner,\n} from \"@manifest-editor/components\";\nimport {\n type CreatableResource,\n type CreatorDefinition,\n type CreatorOptions,\n matchBasedOnResource,\n} from \"@manifest-editor/creator-api\";\nimport { Button } from \"@manifest-editor/ui/atoms/Button\";\nimport { memo, Suspense, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useVault } from \"react-iiif-vault\";\nimport { useApp } from \"../AppContext/AppContext\";\nimport { useTemporaryHighlight } from \"../highlighted-image-resources\";\nimport { ModulePanelButton, useSetCustomTitle } from \"../Layout/components/ModularPanel\";\nimport { useLayoutActions } from \"../Layout/Layout.context\";\nimport { useInlineCreator } from \"./BaseCreator.hooks\";\n\ninterface BaseCreatorProps {\n resource: CreatableResource;\n}\n\nexport const RenderCreator = memo(function RenderCreator(props: {\n resource: CreatableResource;\n creator: CreatorDefinition;\n onCreate?: () => void;\n skipEditingOnCreate?: boolean;\n}) {\n const vault = useVault();\n const { edit, modal } = useLayoutActions();\n const [isCreating, setIsCreating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const creator = useInlineCreator();\n const isCreatingRef = useRef(false);\n\n const canvasSelector = props.resource.initialData?.selector;\n useTemporaryHighlight(canvasSelector);\n\n const options: CreatorOptions = {\n targetType: props.resource.type,\n parent: props.resource.parent\n ? {\n property: props.resource.property as string,\n atIndex: props.resource.index,\n resource: props.resource.parent,\n }\n : undefined,\n target: props.resource.target,\n initialData: props.resource.initialData,\n };\n\n const runCreate = (payload: any) => {\n try {\n if (isCreating || isCreatingRef.current) return;\n setIsCreating(true);\n isCreatingRef.current = true;\n creator\n .create(props.creator.id, payload, options)\n .catch((err) => {\n setError(err?.message || \"Unknown error\");\n return null;\n })\n .then(async (ref) => {\n props.onCreate?.();\n if (props.skipEditingOnCreate) return;\n if (!ref) return;\n const singleRef = Array.isArray(ref) ? ref[0] : ref;\n setIsCreating(false);\n modal.popStack();\n modal.close();\n // Ref might be an array?\n if (singleRef) {\n edit(singleRef!, {\n parent: toRef(props.resource.parent),\n property: props.resource.property,\n index: props.resource.index,\n });\n }\n });\n } catch (err: any) {\n setError(err?.message || \"Unknown error\");\n }\n };\n\n const validate = async () => {\n return true;\n };\n\n useEffect(() => {\n if (props.resource.initialData?.showEmptyForm) {\n return;\n }\n\n if (!props.creator.render && !isCreating) {\n runCreate({});\n }\n }, [props.creator]);\n\n if (error) {\n return (\n <div className=\"flex flex-col items-center p-4\">\n <ErrorMessage>{error}</ErrorMessage>\n </div>\n );\n }\n\n const spinner = (\n <div className=\"flex flex-col items-center py-8\">\n <div className=\"flex gap-2 items-center\">\n <Spinner /> <span>Loading</span>\n </div>\n </div>\n );\n\n if (isCreating) {\n return spinner;\n }\n\n if (!props.creator.render) {\n return (\n <>\n <EmptyState>No options available</EmptyState>\n <ActionButton primary onPress={() => runCreate({})}>\n {props.creator.actionButton || \"Create\"}\n </ActionButton>\n </>\n );\n }\n\n return (\n <>\n <Suspense fallback={spinner}>\n {props.creator.render({\n vault,\n runCreate,\n validate,\n options,\n })}\n </Suspense>\n </>\n );\n});\n\nexport function BaseCreator(props: BaseCreatorProps) {\n const app = useApp();\n const vault = useVault();\n const [currentId, setCurrentId] = useState(props.resource.initialCreator || \"\");\n const set = useSetCustomTitle();\n const supported = useMemo(\n () =>\n matchBasedOnResource(props.resource, app.layout.creators || [], {\n vault,\n }),\n [props.resource, app.layout.creators, vault],\n );\n if (supported.length === 1 && !currentId) {\n setCurrentId(supported[0]!.id);\n }\n\n const current = supported.find((t) => t.id === currentId);\n\n useEffect(() => {\n if (current) {\n set?.(current.label);\n }\n });\n\n if (supported.length === 0) {\n return <EmptyState>Not currently supported</EmptyState>;\n }\n\n const backButton = (\n <ModalBackSlot>\n <IconButton\n root={document.getElementById(\"headlessui-portal-root\") || undefined}\n label=\"Back to Add content options\"\n className=\"group\"\n placement=\"right\"\n onPress={() => setCurrentId(\"\")}\n >\n <GridIcon className=\"text-2xl opacity-50 group-hover:opacity-70\" />\n </IconButton>\n </ModalBackSlot>\n );\n\n if (current) {\n const shouldHideModal = current.hiddenModal;\n\n if (shouldHideModal) {\n return (\n <>\n {backButton}\n <RenderCreator creator={current} resource={props.resource} />\n </>\n );\n }\n\n return (\n <div>\n {backButton}\n <div className={\"p-2 py-6\"}>\n <RenderCreator creator={current} resource={props.resource} />\n </div>\n </div>\n );\n }\n\n return (\n <CreatorGrid\n label=\"Select a type\"\n items={supported.map((item) => ({\n id: item.id,\n title: item.label,\n description: item.summary || \"\",\n icon: item.icon,\n onClick: () => setCurrentId(item.id),\n }))}\n />\n );\n}\n","import type { CreatableResource } from \"@manifest-editor/creator-api\";\nimport type { LayoutPanel } from \"../Layout/Layout.types\";\nimport { BaseCreator } from \"./BaseCreator\";\n\nexport const baseCreator: LayoutPanel = {\n id: \"@manifest-editor/creator\",\n label: \"Add content\",\n options: { hideHeader: true, tabs: false },\n render(state: CreatableResource) {\n return <BaseCreator resource={state} />;\n },\n};\n","import { toRef } from \"@iiif/parser\";\nimport type {\n EditingStackActionCreators,\n EditingStackState,\n} from \"./EditingStack.types\";\n\nexport function editingStackReducer(\n state: EditingStackState,\n action: EditingStackActionCreators,\n): EditingStackState {\n switch (action.type) {\n case \"setStack\": {\n return {\n ...state,\n stack: action.payload.resources,\n current: action.payload.resources[0] || null,\n };\n }\n\n case \"edit\": {\n let reset = action.payload.reset;\n if (\n action.payload.resource?.resource.source?.type === \"Manifest\" ||\n action.payload.resource?.resource.source?.type === \"Canvas\"\n ) {\n reset = true;\n }\n\n if (\n state.current?.resource.source.id ===\n action.payload.resource?.resource.source.id\n ) {\n return {\n ...state,\n current: action.payload.resource,\n };\n }\n\n return {\n ...state,\n current: action.payload.resource,\n stack: reset\n ? []\n : state.current\n ? [state.current, ...state.stack]\n : state.stack,\n };\n }\n case \"syncRemoval\": {\n const item = toRef(action.payload.resource.resource);\n if (!item) {\n return state;\n }\n const found = state.stack.find((r) => toRef(r.resource)?.id === item.id);\n\n if (!found) {\n return state;\n }\n\n const newCurrent =\n state.current?.resource.id === item.id ? null : state.current;\n const newStack = filterStack(\n state.stack.filter((r) => toRef(r.resource)?.id !== item.id),\n newCurrent,\n );\n\n return {\n ...state,\n stack: newStack,\n current: newCurrent,\n };\n }\n case \"updateCurrent\": {\n return {\n ...state,\n current: action.payload.resource,\n };\n }\n\n case \"back\": {\n const newCurrent = state.stack[0];\n return {\n ...state,\n stack: state.stack.slice(1),\n current: newCurrent || null,\n };\n }\n\n case \"close\": {\n return {\n ...state,\n stack: [], // @todo maybe not right?\n current: null,\n };\n }\n\n case \"create\": {\n if (action.payload.resource === null) {\n return { ...state, create: null };\n }\n\n return {\n ...state,\n create: action.payload as any,\n };\n }\n }\n\n return state;\n}\n\nfunction filterStack(\n newStackWithDuplicates: EditingStackState[\"stack\"],\n current: EditingStackState[\"current\"],\n): EditingStackState[\"stack\"] {\n const newStack = [];\n let prev = null;\n for (const stackItem of newStackWithDuplicates) {\n if (prev?.resource.id === stackItem.resource.id) {\n continue;\n }\n newStack.push(stackItem);\n prev = stackItem;\n }\n\n if (prev && prev.resource.id === current?.resource.id) {\n return newStack.slice(0, newStack.length - 1);\n }\n\n return newStack;\n}\n","import { toRef } from \"@iiif/parser\";\nimport type { Reference, SpecificResource } from \"@iiif/presentation-3\";\nimport { EditorInstance } from \"@manifest-editor/editor-api\";\nimport { createContext, useCallback, useContext, useEffect, useMemo, useReducer } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { useResourceContext, useVault } from \"react-iiif-vault\";\nimport invariant from \"tiny-invariant\";\nimport { useAppInstance } from \"../AppContext/AppContext\";\nimport { editingStackReducer } from \"./EditingStack.reducer\";\nimport type { EditableResource, EditingStackActions, EditingStackState } from \"./EditingStack.types\";\n\nconst defaultState: EditingStackState = { stack: [], current: null, create: null };\nexport const EditingStackContext = createContext<EditingStackState>(defaultState);\nconst EditingStackActionsContext = createContext<EditingStackActions>({\n edit() {},\n close() {},\n back() {},\n setStack() {},\n updateCurrent() {},\n create() {\n return () => {};\n },\n});\n\nexport function useEditingStack() {\n return useContext(EditingStackActionsContext);\n}\n\nexport function useEditingResource() {\n return useContext(EditingStackContext).current;\n}\n\nexport function useEditingResourceStack() {\n return useContext(EditingStackContext).stack;\n}\n\nexport function useCreatingResource() {\n return useContext(EditingStackContext).create;\n}\n\nexport function useManifestEditor() {\n const { manifest } = useResourceContext();\n const vault = useVault();\n const [key, invalidate] = useReducer((i: number) => i + 1, 0);\n\n invariant(manifest, \"Manifest not found\");\n\n const editor = useMemo(() => {\n return new EditorInstance({\n reference: { id: manifest, type: \"Manifest\" },\n vault,\n });\n }, [manifest, vault]);\n\n useEffect(() => {\n return editor.observe.start(invalidate);\n }, [editor]);\n\n editor.observe.key = `${key}`;\n editor.observe.reset();\n\n return editor;\n}\n\nexport function useCollectionEditor() {\n const { collection } = useResourceContext();\n const vault = useVault();\n const [key, invalidate] = useReducer((i: number) => i + 1, 0);\n\n invariant(collection, \"Collection not found\");\n\n const editor = useMemo(() => {\n return new EditorInstance({\n reference: { id: collection, type: \"Collection\" },\n vault,\n });\n }, [collection, vault]);\n\n useEffect(() => {\n return editor.observe.start(invalidate);\n }, [editor]);\n\n editor.observe.key = `${key}`;\n editor.observe.reset();\n\n return editor;\n}\n\nexport function useGenericEditor(\n ref: Reference<any> | SpecificResource | undefined,\n ctx: { parent?: Reference; parentProperty?: string; index?: number; allowNull?: boolean } = {},\n) {\n const vault = useVault();\n const [key, invalidate] = useReducer((i: number) => i + 1, 0);\n\n !ctx.allowNull && invariant(ref, \"Resource not found\");\n\n const editor = useMemo(() => {\n if (ctx.allowNull && !ref) {\n return null as any as EditorInstance<{}>;\n }\n\n return new EditorInstance({\n reference: toRef(ref) as any,\n vault,\n context: { resource: ref!, parent: ctx.parent, index: ctx.index, parentProperty: ctx.parentProperty },\n });\n }, [ref, vault]);\n\n useEffect(() => {\n return editor?.observe.start(invalidate);\n }, [editor]);\n\n if (editor) {\n editor.observe.key = `${key}`;\n editor.observe.reset();\n }\n\n return editor!;\n}\n\nexport function useAnnotationPageEditor() {\n const { annotationPage } = useResourceContext();\n\n invariant(annotationPage, \"Annotation page not found\");\n\n return useGenericEditor({ id: annotationPage, type: \"AnnotationPage\" });\n}\n\nexport function useEditor() {\n const resource = useEditingResource();\n const vault = useVault();\n const [key, invalidate] = useReducer((i: number) => i + 1, 0);\n\n invariant(resource, \"No resource selected\");\n\n const editor = useMemo(() => {\n return new EditorInstance({\n reference: resource.resource.source || resource.resource,\n vault,\n });\n }, [resource, vault]);\n\n useEffect(() => {\n return editor.observe.start(invalidate);\n }, [editor]);\n\n editor.observe.key = `${key}`;\n editor.observe.reset();\n\n return editor;\n}\n\nfunction useInternalEditingStackActions(defaultState: EditingStackState) {\n const vault = useVault();\n const [state, _dispatch] = useReducer(editingStackReducer, defaultState);\n\n const dispatch = useCallback((action: any) => {\n _dispatch(action);\n // (() => flushSync(() => _dispatch(action)))();\n }, []);\n\n useEffect(() => {\n return vault.on(\"@iiif/REMOVE_REFERENCE\", (payload: any) => {\n const action = payload.action;\n const parent = { id: action.payload.id, type: action.payload.type };\n const resource = action.payload.reference;\n _dispatch({ type: \"syncRemoval\", payload: { resource: { parent, resource } } });\n });\n }, [vault]);\n\n const edit = useCallback(\n (resource: EditableResource, reset = false) => dispatch({ type: \"edit\", payload: { resource, reset } }),\n [],\n );\n\n const setStack = useCallback(\n (resources: EditableResource[]) => dispatch({ type: \"setStack\", payload: { resources } }),\n [],\n );\n\n const updateCurrent = useCallback(\n (resource: EditableResource) => dispatch({ type: \"updateCurrent\", payload: { resource } }),\n [],\n );\n\n const close = useCallback(() => dispatch({ type: \"close\" }), []);\n\n const back = useCallback(() => dispatch({ type: \"back\" }), []);\n\n const create = useCallback<EditingStackActions[\"create\"]>((resource, options) => {\n dispatch({ type: \"create\", payload: { resource, options } });\n\n // Returns function when complete.\n return () => {\n dispatch({ type: \"create\", payload: { resource: null } });\n };\n }, []);\n\n const actions: EditingStackActions = useMemo(() => {\n return { edit, updateCurrent, close, back, create, setStack };\n }, []);\n\n return [state, actions] as const;\n}\n\nexport function EditingStack(props: {\n children?: any;\n initialState?: EditingStackState;\n editing?: { id: string; type: string };\n}) {\n const { instanceId } = useAppInstance();\n const [state, actions] = useInternalEditingStackActions(props.initialState || defaultState);\n\n return (\n <EditingStackActionsContext.Provider value={actions} key={instanceId}>\n <EditingStackContext.Provider value={state}>{props.children}</EditingStackContext.Provider>\n </EditingStackActionsContext.Provider>\n );\n}\n\nexport function InlineEditingStack({\n resource,\n children,\n}: {\n resource: { id: string; type: string };\n children?: React.ReactNode;\n}) {\n const { instanceId } = useAppInstance();\n const initialState = useMemo(() => {\n return {\n create: null,\n stack: [],\n current: {\n resource: {\n type: \"SpecificResource\",\n source: {\n id: resource.id,\n type: resource.type,\n },\n },\n },\n } as EditingStackState;\n }, []);\n const [state, actions] = useInternalEditingStackActions(initialState);\n\n return (\n <EditingStackActionsContext.Provider value={actions} key={instanceId}>\n <EditingStackContext.Provider value={state}>{children}</EditingStackContext.Provider>\n </EditingStackActionsContext.Provider>\n );\n}\n","import type { Vault } from \"@iiif/helpers\";\nimport { SidebarTabs } from \"@manifest-editor/components\";\nimport { BackIcon } from \"@manifest-editor/ui/icons/BackIcon\";\nimport { CloseIcon } from \"@manifest-editor/ui/icons/CloseIcon\";\nimport { type ReactNode, useContext, useEffect, useMemo } from \"react\";\nimport { ResourceReactContext, useVault } from \"react-iiif-vault\";\nimport { useApp } from \"../AppContext/AppContext\";\nimport { useAppResource } from \"../AppResourceProvider/AppResourceProvider\";\nimport { type EditorConfig, useConfig } from \"../ConfigContext/ConfigContext\";\nimport { useEditingResource, useEditingResourceStack, useEditingStack } from \"../EditingStack/EditingStack\";\nimport type { EditableResource } from \"../EditingStack/EditingStack.types\";\nimport { useLayoutActions } from \"../Layout/Layout.context\";\nimport type { EditorDefinition, ResourceDefinition } from \"../Layout/Layout.types\";\nimport { ModulePanelButton, useSetCustomTitle } from \"../Layout/components/ModularPanel\";\n\nexport function BaseEditorBackButton({ fallback, backAction }: any) {\n const stack = useEditingResourceStack();\n const { back } = useEditingStack();\n\n if (stack.length) {\n return (\n <ModulePanelButton onClick={back}>\n <BackIcon />\n </ModulePanelButton>\n );\n }\n\n return fallback;\n}\n\nexport function BaseEditorCloseButton({ closeAction, fallback }: any) {\n const stack = useEditingResourceStack();\n const current = useEditingResource();\n\n if (current || stack.length) {\n return (\n <ModulePanelButton\n onClick={() => {\n closeAction();\n }}\n >\n <CloseIcon />\n </ModulePanelButton>\n );\n }\n\n return fallback;\n}\n\nexport function editBasedOnResource(\n resource: EditableResource,\n list: ResourceDefinition[],\n options: { edit?: boolean; vault: Vault },\n config: EditorConfig,\n): ResourceDefinition | null {\n const filteredList = list.filter((l) => l.resourceType === resource.resource.source.type);\n\n if (filteredList.length === 0) {\n return null;\n }\n\n for (const item of filteredList) {\n // Check for a match in order.\n const sortKeys: string[] = [];\n const sortKeyFallbacks: Record<string, EditorDefinition> = {};\n // 1. Filter out the\n const editors = (item.editors || []).filter((editor) => {\n if (config.hideTabs && config.hideTabs.includes(editor.id)) {\n return false;\n }\n if (config.onlyTabs && !config.onlyTabs.includes(editor.id)) {\n return false;\n }\n if (editor.supports.sortKey) {\n if (sortKeys.includes(editor.supports.sortKey)) {\n return false;\n }\n if (editor.supports.sortFallback) {\n sortKeyFallbacks[editor.supports.sortKey] = editor;\n }\n }\n\n // Does this editor support the input resource.\n if (options.edit && !editor.supports.edit) {\n return false;\n }\n\n if (editor.supports.custom ? editor.supports.custom(resource, options.vault) === false : false) {\n return false;\n }\n\n // @todo more logic here, including \"custom\" supports check.\n\n if (editor.supports.sortKey) {\n sortKeys.push(editor.supports.sortKey);\n }\n\n return true;\n });\n\n const missingKeys = Object.keys(sortKeyFallbacks);\n for (const missingKey of missingKeys) {\n if (\n !sortKeys.includes(missingKey) &&\n sortKeyFallbacks[missingKey] &&\n !editors.includes(sortKeyFallbacks[missingKey]!)\n ) {\n editors.push(sortKeyFallbacks[missingKey]!);\n }\n }\n\n if (editors.length) {\n return {\n ...item,\n editors,\n };\n }\n }\n\n return null;\n}\n\nexport function BaseEditor({ currentTab = undefined }: { currentTab?: string }) {\n const resource = useEditingResource();\n const currentResourceContext = useContext(ResourceReactContext);\n const app = useApp();\n const rootResource = useAppResource();\n const vault = useVault();\n const { change } = useLayoutActions();\n const set = useSetCustomTitle();\n const { editorConfig } = useConfig();\n const resourceId = resource?.resource.source?.id;\n let resourceType = resource?.resource.source?.type;\n // Could use this is for later.\n const isNested = resourceId !== rootResource.id;\n if (resourceId && isNested && rootResource.type === \"Collection\" && resourceType === \"Collection\") {\n resourceType = \"EmbeddedCollection\";\n }\n\n const resourceConfig: EditorConfig = (resourceType ? (editorConfig as any)[resourceType] : editorConfig.All) || {};\n\n const newResourceContext = useMemo(() => {\n const newCtx = { ...currentResourceContext };\n const id = resource?.resource.source.id;\n const type = resource?.resource.source.type;\n const mapping = {\n Collection: \"collection\",\n Manifest: \"manifest\",\n Range: \"range\",\n Canvas: \"canvas\",\n Annotation: \"annotation\",\n AnnotationPage: \"annotationPage\",\n };\n\n if (type && (mapping as any)[type]) {\n (newCtx as any)[(mapping as any)[type]] = id;\n }\n return newCtx;\n }, [resource, currentResourceContext]);\n\n function wrap(children: ReactNode) {\n if (!resource) {\n return children;\n }\n\n return <ResourceReactContext.Provider value={newResourceContext}>{children}</ResourceReactContext.Provider>;\n }\n\n const match = useMemo(() => {\n if (!resource) {\n return null;\n }\n\n const editors = app.layout.editors || [];\n const resources = app.layout.resources || [];\n const mappedResources: ResourceDefinition[] = resources.map((resource: string | ResourceDefinition) => {\n if (typeof resource === \"string\") {\n return {\n id: \"@default/\" + resource,\n label: resource,\n resourceType: resource,\n auto: true,\n editors: editors.filter((e: any) => e.supports.resourceTypes.includes(resource)),\n };\n }\n return resource;\n });\n\n return editBasedOnResource(resource, mappedResources, { edit: true, vault }, resourceConfig);\n }, [resource, app]);\n\n useEffect(() => {\n set(match?.label || \"\");\n }, [match]);\n\n useEffect(() => {\n const availableKeys = match?.editors.map((editor) => editor.id) || [];\n const currentKey = availableKeys.find((key) => key === currentTab);\n if (!currentKey) {\n change(\"@manifest-editor/editor\", { currentTab: availableKeys[0] });\n }\n }, [match?.editors, currentTab, change]);\n\n // Problems to solve:\n // - Subscribing to updates to the reference\n // - Keeping track of changes to the item, by checking it's index\n // - If the items change - ensure we have the same index by doing an equality check on the reference?\n\n if (!resource || !match) {\n return null;\n }\n\n if (resourceConfig.singleTab) {\n const first = (match?.editors || []).find((editor) => editor.id === resourceConfig.singleTab);\n if (first) {\n return wrap(\n <div key={resource.resource.source?.id} className=\"w-full\">\n {first.component(resourceConfig)}\n </div>,\n );\n }\n }\n\n return wrap(\n <SidebarTabs\n isNested={isNested}\n rootResource={rootResource}\n key={resource.resource.source?.id}\n menuId={resource.resource.source.id}\n menu={(match?.editors || []).map((editor, key) => {\n return {\n id: editor.id,\n label: editor.label,\n renderComponent: () => editor.component(resourceConfig),\n };\n })}\n selectedKey={currentTab}\n onSelectionChange={(p: any) => {\n change(\"@manifest-editor/editor\", { currentTab: p });\n }}\n />,\n );\n}\n","import type { LayoutPanel } from \"../Layout/Layout.types\";\nimport {\n BaseEditor,\n BaseEditorBackButton,\n BaseEditorCloseButton,\n} from \"./BaseEditor\";\n\nexport const baseEditor: LayoutPanel = {\n id: \"@manifest-editor/editor\",\n label: \"Editor\",\n options: { hideHeader: true, tabs: true, minWidth: 400 },\n renderBackAction: ({ backAction, fallback }) => (\n <BaseEditorBackButton backAction={backAction} fallback={fallback} />\n ),\n renderCloseAction: ({ closeAction, fallback }) => (\n <BaseEditorCloseButton closeAction={closeAction} fallback={fallback} />\n ),\n render({ currentTab }) {\n return <BaseEditor currentTab={currentTab} />;\n },\n};\n","export const defaultTheme = {\n color: {\n main: \"#B84C74\",\n mainHover: \"#4a89ff\",\n logoPink: \"#E94581\",\n white: \"white\",\n grey: \"grey\",\n black: \"black\",\n lightgrey: \"#F8F9FA\",\n mediumgrey: \"#dddddd\",\n danger: \"#a90e21\",\n warning: \"#e38627\",\n lightdanger: \"#ffeaea\",\n lightsuccess: \"#c5e8c5\",\n success: \"#6ccd55\",\n greyOverlay: \"rgba(0, 0, 0, 0.2)\",\n highlight: \"#faeed7\",\n },\n iiifColor: {\n manifest: \"rgba(0, 0, 0, 0.2)\",\n canvas: \"rgba(255, 222, 219, 0.8)\",\n service: \"rgba(13, 110, 253, 0.8)\",\n annotation: \"rgba(247, 226, 173, 0.8)\",\n contentResource: \"rgba(207, 247, 255, 0.8)\",\n ranges: \"rgba(144, 213, 157, 0.8)\",\n },\n padding: {\n xs: \"0.25rem\",\n small: \"0.5rem\",\n medium: \"1rem\",\n large: \"2rem\",\n },\n device: {\n mobile: \"375px\",\n tablet: \"768px\",\n laptop: \"992px\",\n desktop: \"1200px\",\n },\n shadows: {\n standard: \"rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.05) 0px 5px 15px 0px\",\n bottom: \"rgba(0, 0, 0, 0.1) 0px 4px 2px -2px\",\n },\n};\n","import { useVault } from \"react-iiif-vault\";\nimport { useMemo } from \"react\";\nimport {\n type CreatableResource,\n matchBasedOnResource,\n} from \"@manifest-editor/creator-api\";\nimport { useApp } from \"../AppContext/AppContext\";\nimport { Tab, TabList, TabPanel, Tabs } from \"@manifest-editor/components\";\nimport { RenderCreator } from \"./BaseCreator\";\nimport { ThemeProvider } from \"styled-components\";\nimport { defaultTheme } from \"../ShellContext/default-theme\";\n\ninterface BaseAnnotationCreatorProps {\n resource: CreatableResource;\n onCreate: () => void;\n}\n\nexport function BaseAnnotationCreator(props: BaseAnnotationCreatorProps) {\n const {} = props;\n const vault = useVault();\n const app = useApp();\n const supported = useMemo(\n () =>\n matchBasedOnResource(props.resource, app.layout.creators || [], {\n vault,\n }),\n [props.resource, app.layout.creators, vault],\n );\n\n if (supported.length === 0) {\n return <div>No supported creators found</div>;\n }\n\n return (\n <div>\n <Tabs className=\"w-full flex-1 overflow-hidden flex flex-col\">\n <TabList\n className=\"flex-1 overflow-hidden w-full flex text-sm whitespace-nowrap\"\n items={supported}\n >\n {(item) => <Tab id={item.id}>{item.label}</Tab>}\n </TabList>\n {supported.map((item) => {\n return (\n <TabPanel key={item.id} id={item.id} className=\"p-2\">\n <ThemeProvider theme={defaultTheme}>\n <RenderCreator\n creator={item}\n resource={props.resource}\n onCreate={props.onCreate}\n skipEditingOnCreate\n />\n </ThemeProvider>\n </TabPanel>\n );\n })}\n </Tabs>\n </div>\n );\n}\n","import { useMemo, useRef, useState } from \"react\";\n\nexport function useDecayState(time: number) {\n const [active, _setActive] = useState(false);\n const lastTimeout = useRef<any>();\n const focusCount = useRef<any>(0);\n\n function clear(existing?: boolean) {\n focusCount.current--;\n\n if (existing && focusCount.current !== 0) {\n return;\n }\n\n if (lastTimeout.current) {\n clearTimeout(lastTimeout.current);\n lastTimeout.current = 0;\n }\n lastTimeout.current = setTimeout(() => {\n _setActive(false);\n }, time);\n }\n\n function set() {\n focusCount.current++;\n if (lastTimeout.current) {\n clearTimeout(lastTimeout.current);\n }\n _setActive(true);\n }\n\n return useMemo(() => [active, { set, clear }] as const, [active]);\n}\n","import { ActionButton, Form, Sidebar, SidebarContent, SidebarHeader } from \"@manifest-editor/components\";\nimport { useAppResource } from \"../AppResourceProvider/AppResourceProvider\";\nimport { useDecayState } from \"../hooks/use-decay-state\";\nimport { usePreviewContext, usePreviews } from \"../PreviewContext/PreviewContext\";\nimport { type Config, useConfig, useSaveConfig } from \"./ConfigContext\";\n\nexport function ConfigEditor() {\n const previews = usePreviewContext();\n const resource = useAppResource();\n const config = useConfig();\n const setConfig = useSaveConfig();\n const [isSaved, saveState] = useDecayState(2000);\n\n function onSubmit(e: React.FormEvent) {\n e.preventDefault();\n const formValues = new FormData(e.target as HTMLFormElement);\n\n const newConfig: Partial<Config> = {\n defaultPreview: formValues.get(\"defaultPreview\") as string,\n i18n: {\n ...(config.i18n || ({} as any)),\n advancedLanguageMode: formValues.get(\"advancedLanguageMode\") === \"on\",\n availableLanguages: ((formValues.get(\"availableLanguages\") as string) || \"\")\n .split(\",\")\n .map((t: string) => t.trim()),\n defaultLanguage: formValues.get(\"defaultLanguage\") as string,\n },\n export: {\n ...(config.export || ({} as any)),\n version: formValues.get(\"isVersion2\") === \"on\" ? 2 : 3,\n baseIdentifier: (formValues.get(\"base\") as string) || null,\n },\n editorFeatureFlags: {\n ...(config.editorFeatureFlags || ({} as any)),\n rememberCanvasId: formValues.get(\"rememberCanvasId\") === \"on\",\n rememberLeftPanelId: formValues.get(\"rememberLeftPanelId\") === \"on\",\n annotationPopups: formValues.get(\"annotationPopups\") === \"on\",\n manifestGridOptions: formValues.get(\"manifestGridOptions\") === \"on\",\n enableMultiImageCanvases: formValues.get(\"enableMultiImageCanvases\") === \"on\",\n enableMultiMediaCanvases: formValues.get(\"enableMultiMediaCanvases\") === \"on\",\n },\n };\n\n setConfig(newConfig);\n saveState.set();\n saveState.clear();\n }\n\n return (\n <Sidebar>\n <SidebarHeader title=\"Workspace configuration\" />\n {isSaved ? <div className=\"bg-me-primary-500 text-white p-3 text-sm\">Changes saved</div> : null}\n <SidebarContent className=\"p-4\">\n <Form.Form onSubmit={onSubmit} className=\"flex flex-col gap-3\">\n <Form.InputContainer>\n <Form.Label htmlFor=\"defaultLanguage\">Default Language</Form.Label>\n <Form.Input\n type=\"text\"\n name=\"defaultLanguage\"\n id=\"defaultLanguage\"\n defaultValue={config.i18n?.defaultLanguage || \"\"}\n />\n </Form.InputContainer>\n\n <Form.InputContainer>\n <Form.Label htmlFor=\"availableLanguages\">Available Languages</Form.Label>\n <Form.Input\n type=\"text\"\n name=\"availableLanguages\"\n id=\"availableLanguages\"\n defaultValue={(config.i18n?.availableLanguages || []).join(\", \")}\n />\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"advancedLanguageMode\"\n id=\"advancedLanguageMode\"\n defaultChecked={config.i18n?.advancedLanguageMode || false}\n />\n <Form.Label htmlFor=\"advancedLanguageMode\">Advanced Language Mode</Form.Label>\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"textGranularityEnabled\"\n id=\"textGranularityEnabled\"\n defaultChecked={config.i18n?.textGranularityEnabled || false}\n />\n <Form.Label htmlFor=\"textGranularityEnabled\">Enable text granularity</Form.Label>\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"rememberCanvasId\"\n id=\"rememberCanvasId\"\n defaultChecked={config.editorFeatureFlags?.rememberCanvasId || false}\n />\n <Form.Label htmlFor=\"rememberCanvasId\">Remember Canvas ID</Form.Label>\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"rememberLeftPanelId\"\n id=\"rememberLeftPanelId\"\n defaultChecked={config.editorFeatureFlags?.rememberLeftPanelId || false}\n />\n <Form.Label htmlFor=\"rememberLeftPanelId\">Remember Left panel</Form.Label>\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"manifestGridOptions\"\n id=\"manifestGridOptions\"\n defaultChecked={config.editorFeatureFlags?.manifestGridOptions || false}\n />\n <Form.Label htmlFor=\"manifestGridOptions\">Manifest Grid Options</Form.Label>\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"isVersion2\"\n id=\"isVersion2\"\n defaultChecked={config.export?.version === 2}\n />\n <Form.Label htmlFor=\"isVersion2\">Export Presentation 2 {resource.type}s</Form.Label>\n </Form.InputContainer>\n\n {/* <Form.InputContainer>\n <Form.Label htmlFor=\"base\">Base Identifier</Form.Label>\n <Form.Input\n type=\"text\"\n name=\"base\"\n id=\"base\"\n autoComplete=\"none\"\n defaultValue={config.export?.baseIdentifier || \"\"}\n />\n </Form.InputContainer> */}\n\n <Form.InputContainer>\n <Form.Label htmlFor=\"defaultPreview\">Default preview</Form.Label>\n <div>\n {previews.configs.map((preview, key) => {\n if (preview.type === \"iiif-preview-service\") {\n return null;\n }\n return (\n <Form.InputContainer key={preview.id} horizontal>\n <Form.Input\n type=\"radio\"\n id={preview.id}\n name=\"defaultPreview\"\n value={preview.id}\n defaultChecked={!config.defaultPreview ? key === 0 : config.defaultPreview === preview.id}\n />\n <label htmlFor={preview.id}>{preview.label}</label>\n </Form.InputContainer>\n );\n })}\n </div>\n </Form.InputContainer>\n {resource.type === \"Manifest\" ? (\n <a\n className=\"text-sm text-me-primary-500 hover:underline hover:text-me-primary-600\"\n href={\n window.location.pathname.includes(\"/exhibition\")\n ? window.location.pathname.replace(\"/exhibition\", \"\") || \"/\"\n : `${window.location.pathname}/exhibition`\n }\n >\n {window.location.pathname.includes(\"/exhibition\")\n ? \"Return to Manifest Editor\"\n : \"Go to Exhibition Editor\"}\n </a>\n ) : null}\n\n <div className=\"mt-5\">\n <ActionButton type=\"submit\">{\"Save changes\"}</ActionButton>\n </div>\n </Form.Form>\n </SidebarContent>\n </Sidebar>\n );\n}\n","import { createContext, useContext, useEffect, useMemo } from \"react\";\nimport { createStore, type StoreApi, useStore } from \"zustand\";\nimport { randomId } from \"../helpers\";\n\nexport type ContextMenuItem = {\n id: string;\n label: string;\n onAction: (options: { position: { x: number; y: number }; resource: { id: string; type: string } }) => void;\n disabled?: boolean;\n enabled?: boolean;\n enabledFunction?: (options: { resource: { id: string; type: string } }) => boolean;\n order?: number;\n};\n\nexport type ContextMenuRequest = {\n resource?: { id?: string; type: string };\n sectionTitle?: string;\n items: Array<ContextMenuItem>;\n};\n\ntype ContextMenuStore = {\n specificMenus: Record<\n string,\n {\n menus: Record<\n string,\n | {\n sectionTitle?: string;\n items: Array<ContextMenuItem>;\n }\n | undefined\n >;\n }\n >;\n\n resourceMenus: Record<\n string,\n {\n menus: Record<\n string,\n | {\n sectionTitle?: string;\n items: Array<ContextMenuItem>;\n }\n | undefined\n >;\n }\n >;\n\n hookMenuItem(req: ContextMenuRequest): () => void;\n};\n\nfunction createContextMenuStore() {\n return createStore<ContextMenuStore>((set, get) => ({\n specificMenus: {},\n resourceMenus: {},\n hookMenuItem(req: ContextMenuRequest) {\n const requestId = randomId();\n const resourceId = req.resource?.id || \"\";\n const resourceType = req.resource?.type;\n if (!resourceType) return () => {};\n\n if (resourceId) {\n set((prev) => {\n return {\n specificMenus: {\n ...prev.specificMenus,\n [resourceId]: {\n ...(prev.specificMenus[resourceId] || {}),\n menus: {\n ...(prev.specificMenus[resourceId]?.menus || {}),\n [requestId]: {\n sectionTitle: req.sectionTitle,\n items: req.items,\n },\n },\n },\n },\n };\n });\n\n return () => {\n set((prev) => {\n return {\n specificMenus: {\n ...prev.specificMenus,\n [resourceId]: {\n ...(prev.specificMenus[resourceId] || {}),\n menus: {\n ...(prev.specificMenus[resourceId]?.menus || {}),\n [requestId]: undefined,\n },\n },\n },\n };\n });\n };\n }\n set((prev) => {\n return {\n resourceMenus: {\n ...prev.resourceMenus,\n [resourceType]: {\n ...(prev.resourceMenus[resourceType] || {}),\n menus: {\n ...(prev.resourceMenus[resourceType]?.menus || {}),\n [requestId]: {\n sectionTitle: req.sectionTitle,\n items: req.items,\n },\n },\n },\n },\n };\n });\n\n return () => {\n set((prev) => {\n return {\n resourceMenus: {\n ...prev.resourceMenus,\n [resourceType]: {\n ...(prev.resourceMenus[resourceType] || {}),\n menus: {\n ...(prev.resourceMenus[resourceType]?.menus || {}),\n [requestId]: undefined,\n },\n },\n },\n };\n });\n };\n },\n }));\n}\n\nexport const ContextMenuReactContext = createContext<StoreApi<ContextMenuStore> | null>(null);\n\nexport function ContextMenuProvider({ children }: { children: React.ReactNode }) {\n const store = useMemo(() => {\n return createContextMenuStore();\n }, []);\n\n return <ContextMenuReactContext.Provider value={store}>{children}</ContextMenuReactContext.Provider>;\n}\n\nfunction useContextMenuStore() {\n const ctx = useContext(ContextMenuReactContext);\n if (!ctx) {\n throw new Error(\"useContextMenuStore must be used within a ContextMenuProvider\");\n }\n return ctx;\n}\n\nexport function useResourceContextMenuItems(req: { id?: string; type: string }) {\n const store = useContextMenuStore();\n const resourceMenus = useStore(store, (s) => s.resourceMenus);\n const specificMenus = useStore(store, (s) => s.specificMenus);\n\n return useMemo(() => {\n const specificRequests = specificMenus[req.id || \"\"]?.menus || {};\n const resourceRequests = resourceMenus[req.type]?.menus || {};\n\n const specificItems = Object.values(specificRequests).flat();\n const resourceItems = Object.values(resourceRequests).flat();\n\n const items = [...resourceItems, ...specificItems].filter((t) => typeof t !== \"undefined\");\n const seenIds: string[] = [];\n const returnSections = [];\n\n for (const section of items) {\n const sectionItems = [];\n for (const sectionItem of section.items || []) {\n if (sectionItem.id && seenIds.includes(sectionItem.id)) continue;\n seenIds.push(sectionItem.id);\n sectionItems.push(sectionItem);\n }\n if (sectionItems.length) {\n returnSections.push({\n ...section,\n items: sectionItems,\n });\n }\n }\n\n return mergeSectionsWithTheSameTitle(returnSections);\n }, [specificMenus, resourceMenus, req.id, req.type]);\n}\n\nfunction mergeSectionsWithTheSameTitle(sections: Array<{ sectionTitle?: string; items: Array<ContextMenuItem> }>) {\n const sectionMap: Record<string, ContextMenuItem[]> = {};\n const emptySections: ContextMenuItem[] = [];\n\n sections.forEach((section) => {\n if (!section) return;\n const title = section.sectionTitle;\n if (!title) {\n emptySections.push(...(section.items || []));\n return;\n }\n if (!sectionMap[title]) {\n sectionMap[title] = [];\n }\n sectionMap[title].push(...section.items);\n });\n\n const returnSections: Array<{ sectionTitle?: string; items: Array<ContextMenuItem> }> = Object.entries(\n sectionMap,\n ).map(([title, items]) => ({\n sectionTitle: title,\n items,\n }));\n\n if (emptySections.length) {\n returnSections.push({ items: emptySections });\n }\n\n return returnSections;\n}\n\nexport function useCustomContextMenu(req: ContextMenuRequest, deps: any[] = []) {\n const store = useContextMenuStore();\n const hookMenuItem = useStore(store, (s) => s.hookMenuItem);\n\n useEffect(() => {\n return hookMenuItem(req);\n }, [hookMenuItem, req.resource?.id, req.resource?.type, ...deps]);\n}\n",".CenterPanelContainer {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n background: #fff;\n margin: 1.2rem;\n padding: 1em;\n border-radius: 10px;\n box-shadow:\n 0 4px 15px 0 rgba(0, 0, 0, 0.18),\n 0 0px 0px 1px rgba(0, 0, 0, 0.15),\n inset 0 0 0 1px rgba(255, 255, 255, 0.2);\n}\n\n.CenterPanelHeader {\n height: 3em;\n display: flex;\n align-items: center;\n margin-bottom: 1em;\n}\n\n.CenterPanelClose {\n margin-left: auto;\n align-self: center;\n}\n\n.CenterPanelTitle {\n margin: 0;\n}\n","import { ReactNode } from \"react\";\nimport $ from \"./CenterPanelContainer.module.css\";\nimport { Button } from \"../../atoms/Button\";\nimport { CloseIcon } from \"../../icons/CloseIcon\";\n\ninterface CenterPanelContainerProps {\n close?: () => void;\n title?: string;\n children: ReactNode;\n}\n\nexport function CenterPanelContainer(props: CenterPanelContainerProps) {\n return (\n <div className={$.CenterPanelContainer}>\n {props.title || props.close ? (\n <div className={$.CenterPanelHeader}>\n {props.title ? <h2 className={$.CenterPanelTitle}>{props.title}</h2> : null}\n {props.close ? (\n <Button className={$.CenterPanelClose} onClick={props.close}>\n <CloseIcon />\n </Button>\n ) : null}\n </div>\n ) : null}\n {props.children}\n </div>\n );\n}\n","import styled from \"styled-components\";\nimport {\n createRef,\n forwardRef,\n KeyboardEventHandler,\n ReactNode,\n RefObject,\n UIEventHandler,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { DownIcon } from \"../icons/DownIcon\";\n\nexport const AccordionContainer = styled.div`\n flex: 1;\n display: flex;\n width: 100%;\n flex-direction: column;\n position: relative;\n`;\n\nconst ItemRow = styled.div`\n background: #fff;\n position: relative;\n border-bottom: 1px solid #d0d0d0;\n border-top: 1px solid #d0d0d0;\n\n & ~ & {\n border-top: none;\n }\n\n &[data-large=\"true\"] {\n background: #f7f7f7;\n border: none;\n margin-bottom: 1em;\n //display: flex;\n //flex-direction: column;\n //justify-content: center;\n }\n`;\n\nconst ItemDescription = styled.p`\n font-size: 0.9em;\n color: #777;\n font-weight: 400;\n`;\n\nconst ItemLabel = styled.button`\n color: inherit;\n text-rendering: geometricPrecision;\n border: none;\n text-align: left;\n background: transparent;\n font: inherit;\n text-transform: uppercase;\n padding: 0.6em 1.2em;\n flex: 1;\n font-size: 0.8em;\n font-weight: 600;\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n overflow: hidden;\n\n &:focus {\n outline: none;\n }\n\n p {\n display: none;\n }\n\n [data-large=\"true\"] & {\n //padding: 1.5em;\n padding: 0.85em 1.25em;\n display: block;\n text-transform: initial;\n font-size: 1em;\n margin-bottom: 0;\n color: #000;\n\n p {\n display: block;\n color: #999;\n font-size: 0.9em;\n margin: 0;\n margin-top: 0.5em;\n }\n }\n`;\n\nconst ItemCollapse = styled.div`\n font-size: 1.4em;\n padding-right: 0.3em;\n display: flex;\n align-items: center;\n\n [data-large=\"true\"] & {\n font-size: 2em;\n }\n`;\n\nconst ItemIcon = styled.div`\n width: 2em;\n align-items: center;\n //padding-top: 0.5em;\n display: flex;\n justify-content: center;\n margin-left: 1.5em;\n svg {\n width: 1.75em;\n height: 1.75em;\n fill: #999;\n color: #999;\n }\n`;\n\nconst ItemBodyInner = styled.div<{ $full?: boolean }>`\n min-height: 0;\n overflow: visible;\n display: flex;\n`;\n\nconst ItemBodyPadding = styled.div<{ $full?: boolean; $max?: boolean }>`\n min-height: 0;\n overflow: visible;\n flex: 1;\n padding: 1em 1em 1.5em;\n\n &[data-full=\"true\"] {\n margin: 0;\n }\n\n &[data-max-height=\"true\"] {\n overflow-y: auto;\n }\n`;\n\nconst ItemBody = styled.section<{\n $initial?: boolean;\n $scrolled?: boolean;\n}>`\n display: grid;\n grid-template-rows: 0fr;\n overflow: hidden;\n opacity: 0;\n visibility: hidden;\n\n [data-open=\"true\"] & {\n opacity: 1;\n grid-template-rows: 1fr;\n visibility: visible;\n &[data-overflow=\"true\"] {\n overflow: visible;\n }\n }\n\n transition:\n all 0.4s,\n visibility 0.8s;\n\n &[data-has-icon=\"true\"] {\n padding-left: 4em;\n }\n\n box-shadow: inset 0px 2px 0px 0 rgba(0, 0, 0, 0);\n &[data-scrolled=\"true\"] {\n box-shadow: inset 0px 2px 0px 0 rgba(0, 0, 0, 0.1);\n }\n`;\n\nconst ItemHeading = styled.div<{ $open?: boolean }>`\n position: sticky;\n display: flex;\n top: 0;\n background: #fff;\n min-width: 0;\n width: 100%;\n color: #757575;\n z-index: 1;\n &:hover {\n color: #333;\n }\n\n [data-large=\"true\"] & {\n border: 1px solid #d0d0d0;\n &:after {\n display: none;\n }\n }\n\n [data-large=\"true\"]:focus-within & {\n border-color: #3579f6;\n }\n\n [data-open=\"true\"] & {\n color: #333;\n &:after {\n content: \"\";\n height: 1px;\n background: #eee;\n position: absolute;\n top: 100%;\n left: 0.5em;\n right: 0.5em;\n }\n }\n`;\n\ninterface AccordionItemProps {\n label: string | ReactNode;\n description?: string | ReactNode;\n icon?: ReactNode;\n children: ReactNode;\n initialOpen?: boolean;\n maxHeight?: number | false;\n fullWidth?: boolean;\n overflow?: boolean;\n onChange?: (value: boolean) => void;\n large?: boolean;\n}\n\nexport interface AccordionItemRef {\n open(): void;\n close(): void;\n toggle(): void;\n focus(): void;\n button?: RefObject<HTMLButtonElement>;\n}\n\nconst noop = (() => void 0) as any;\n\nlet keyIdIndex = 0;\nfunction useId() {\n return useMemo(() => keyIdIndex++, []);\n}\n\nexport function useAccordionItems(itemsLength: number, singleMode = false) {\n const [elRefs, setElRefs] = useState<RefObject<AccordionItemRef>[]>([]);\n const current = useRef(-1);\n\n const onKeyDown: KeyboardEventHandler<HTMLDivElement> = (e) => {\n const currentEl = document.activeElement;\n const currentIndex = elRefs.findIndex((r) => r.current?.button?.current === currentEl);\n if (currentIndex === -1) {\n return;\n }\n\n switch (e.code) {\n case \"Home\": {\n const next = 0;\n if (elRefs[next]) {\n elRefs[next].current?.focus();\n }\n break;\n }\n case \"End\": {\n const next = itemsLength - 1;\n if (elRefs[next]) {\n elRefs[next]!.current?.focus();\n }\n break;\n }\n\n case \"ArrowDown\": {\n if (currentIndex !== itemsLength - 1) {\n const next = currentIndex + 1;\n if (elRefs[next]) {\n elRefs[next]!.current?.focus();\n }\n }\n break;\n }\n // Focus previous\n case \"ArrowUp\": {\n if (currentIndex !== 0) {\n const next = currentIndex - 1;\n if (elRefs[next]) {\n elRefs[next]!.current?.focus();\n }\n }\n break;\n }\n // Focus next\n case \"ArrowLeft\": {\n // Close current\n const el = elRefs[currentIndex];\n if (el && el.current) {\n el.current.close();\n }\n break;\n }\n // Open current\n case \"ArrowRight\": {\n // Close current\n const el = elRefs[currentIndex];\n if (el && el.current) {\n el.current.open();\n }\n break;\n }\n }\n };\n\n const onChange = (key: number, isOpen: boolean) => {\n if (singleMode && isOpen && key !== current.current) {\n current.current = key;\n for (let i = 0; i < elRefs.length; i++) {\n const ref = elRefs[i];\n if (i === key) {\n continue;\n }\n ref!.current?.close();\n }\n }\n };\n\n useEffect(() => {\n // add or remove refs\n setElRefs((elRefs_) =>\n Array(itemsLength)\n .fill(0)\n .map((_, i) => elRefs_[i] || createRef())\n );\n }, [itemsLength]);\n\n const getItemProps = (key: number) => {\n return {\n ref: elRefs[key],\n onChange: (isOpen: boolean) => onChange(key, isOpen),\n };\n };\n\n const open = (key: number) => {\n const el = elRefs[key];\n if (el && el.current) {\n el.current.open();\n }\n };\n\n const close = (key: number) => {\n const el = elRefs[key];\n if (el && el.current) {\n el.current.close();\n }\n };\n\n const toggle = (key: number) => {\n const el = elRefs[key];\n if (el && el.current) {\n el.current.toggle();\n }\n };\n\n const focus = (key: number) => {\n const el = elRefs[key];\n if (el && el.current) {\n el.current.focus();\n }\n };\n\n const openAll = () => {\n for (let i = 0; i < elRefs.length; i++) {\n const ref = elRefs[i]!;\n ref.current?.open();\n }\n };\n\n const closeAll = () => {\n for (let i = 0; i < elRefs.length; i++) {\n const ref = elRefs[i]!;\n ref.current?.close();\n }\n };\n\n return {\n open,\n close,\n toggle,\n focus,\n openAll,\n closeAll,\n onKeyDown,\n getItemProps,\n };\n}\n\nexport const AccordionItem = forwardRef<AccordionItemRef, AccordionItemProps>(function AccordionItem(props, ref) {\n const content = useRef<HTMLDivElement>(null);\n const btn = useRef<HTMLButtonElement>(null);\n const id = useId();\n\n const [open, setIsOpen] = useState<boolean>(props.initialOpen || false);\n const onChange = props.onChange || noop;\n const toggle = () => {\n onChange(!open);\n setIsOpen((o) => !o);\n };\n const maxHeight = props.maxHeight;\n const [scrolled, setScrolled] = useState(false);\n\n useImperativeHandle(ref, () => ({\n open() {\n onChange(true);\n setIsOpen(true);\n },\n close() {\n onChange(false);\n setIsOpen(false);\n },\n toggle() {\n toggle();\n },\n focus() {\n if (btn.current) {\n btn.current.focus();\n }\n },\n button: btn,\n }));\n\n const onScroll: UIEventHandler<HTMLDivElement> = (e) => {\n if ((e.target as HTMLDivElement).scrollTop > 0) {\n setScrolled(true);\n } else {\n setScrolled(false);\n }\n };\n\n return (\n <ItemRow data-large={props.large} data-open={open}>\n <ItemHeading data-open={open}>\n {props.icon ? <ItemIcon onClick={toggle}>{props.icon}</ItemIcon> : null}\n <ItemLabel ref={btn} onClick={toggle} aria-expanded={open} aria-controls={`accordion-${id}`}>\n {props.label}\n {props.description ? <ItemDescription>{props.description}</ItemDescription> : null}\n </ItemLabel>\n <ItemCollapse onClick={toggle}>\n <DownIcon width=\"1em\" height=\"1em\" rotate={open ? 0 : 180} />\n </ItemCollapse>\n </ItemHeading>\n <ItemBody\n aria-labelledby={`accordion-${id}`}\n aria-hidden={!open}\n data-overflow={!!props.overflow}\n data-has-icon={!!props.icon}\n onScroll={onScroll}\n ref={content}\n $initial={!open}\n data-scrolled={scrolled}\n hidden={!open}\n >\n <ItemBodyInner>\n <ItemBodyPadding\n data-max-height={!!maxHeight}\n data-full={props.fullWidth}\n style={{ maxHeight: maxHeight || undefined }}\n >\n {props.children}\n </ItemBodyPadding>\n </ItemBodyInner>\n </ItemBody>\n </ItemRow>\n );\n});\n\ninterface AccordionProps {\n singleMode?: boolean;\n items: Array<AccordionItemProps>;\n maxHeight?: number | false;\n overflow?: boolean;\n}\n\nexport function Accordion(props: AccordionProps) {\n const { getItemProps, onKeyDown } = useAccordionItems(props.items.length, props.singleMode);\n\n return (\n <AccordionContainer onKeyDown={onKeyDown}>\n {props.items.map((item, key) => (\n <AccordionItem overflow={props.overflow} maxHeight={props.maxHeight} key={key} {...item} {...getItemProps(key)}>\n {item.children}\n </AccordionItem>\n ))}\n </AccordionContainer>\n );\n}\n","export function DownloadIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M220-160q-24 0-42-18t-18-42v-143h60v143h520v-143h60v143q0 24-18 42t-42 18H220Zm260-153L287-506l43-43 120 120v-371h60v371l120-120 43 43-193 193Z\" />\n </svg>\n );\n}\n","import styled from \"styled-components\";\n\nexport const ButtonRow = styled.div`\n padding: 0.3em;\n\n display: flex;\n background: #e4e7ef;\n border-radius: 3px;\n margin: 0.3em 0;\n gap: 0.3em;\n\n button,\n a {\n //\n\n & ~ & {\n margin-left: 0.3em;\n }\n }\n\n &[data-sticky=\"true\"] {\n position: sticky;\n bottom: 0;\n }\n`;\n","import { Button } from \"@manifest-editor/ui/atoms/Button\";\nimport { useMemo } from \"react\";\nimport { useManifest, useVault } from \"react-iiif-vault\";\nimport { useLayoutActions } from \"../Layout/Layout.context\";\nimport { CenterPanelContainer } from \"@manifest-editor/ui/CenterPanelContainer\";\nimport { Accordion } from \"@manifest-editor/ui/atoms/Accordion\";\nimport { copyToClipboard, createDownload } from \"../helpers\";\nimport { DownloadIcon } from \"@manifest-editor/ui/icons/DownloadIcon\";\nimport { ButtonRow } from \"@manifest-editor/ui/atoms/ButtonRow\";\n\nexport interface ExportPanelProps {\n // We could limit versions / download options etc.\n initialVersion?: 2 | 3;\n versions?: Array<2 | 3>;\n}\n\nexport function ExportPanel(props: ExportPanelProps) {\n const manifest = useManifest();\n const vault = useVault();\n const actions = useLayoutActions();\n\n const version3 = useMemo(() => {\n return JSON.stringify(vault.toPresentation3(manifest as any), null, 2);\n }, [manifest, vault]);\n\n const version2 = useMemo(() => {\n return JSON.stringify(vault.toPresentation2(manifest as any), null, 2);\n }, [manifest, vault]);\n\n return (\n <CenterPanelContainer title=\"Export manifest\" close={actions.centerPanel.popStack}>\n <div style={{ flex: 1, overflowY: \"auto\" }}>\n <Accordion\n items={[\n {\n label: \"Presentation 3\",\n description: 'Download this version by clicking the \"Download\" button.',\n maxHeight: 400,\n large: true,\n initialOpen: true,\n overflow: true,\n icon: (\n <Button onClick={() => createDownload(version3, \"manifest.json\")}>\n <DownloadIcon />\n </Button>\n ),\n children: (\n <div style={{ maxWidth: \"100%\" }}>\n <pre style={{ whiteSpace: \"pre-wrap\" }}>\n {JSON.stringify(vault.toPresentation3(manifest as any), null, 2)}\n </pre>\n <ButtonRow data-sticky=\"true\">\n <Button onClick={() => copyToClipboard(version3)}>Copy to clipboard</Button>\n <Button onClick={() => createDownload(version3, \"manifest.json\")}>Download</Button>\n </ButtonRow>\n </div>\n ),\n },\n {\n label: \"Presentation 2\",\n description: 'Download this version by clicking the \"Download\" button.',\n maxHeight: 400,\n large: true,\n icon: (\n <Button onClick={() => createDownload(version2, \"manifest.json\")}>\n <DownloadIcon />\n </Button>\n ),\n children: (\n <div style={{ maxWidth: \"100%\" }}>\n <pre style={{ whiteSpace: \"pre-wrap\" }}>\n {JSON.stringify(vault.toPresentation2(manifest as any), null, 2)}\n </pre>\n <ButtonRow data-sticky=\"true\">\n <Button onClick={() => copyToClipboard(version2)}>Copy to clipboard</Button>\n <Button onClick={() => createDownload(version2, \"manifest.json\")}>Download</Button>\n </ButtonRow>\n </div>\n ),\n },\n ]}\n />\n </div>\n </CenterPanelContainer>\n );\n}\n","import type { Emitter } from \"mitt\";\nimport mitt from \"mitt\";\nimport { createContext, useContext, useEffect } from \"react\";\n\nconst events = mitt();\n\nexport const ReactEmitterContext = createContext<Emitter<any>>(events);\n\nexport function EventEmitterProvider({\n children,\n emitter,\n}: { children: React.ReactNode; emitter: Emitter<any> }) {\n return (\n <ReactEmitterContext.Provider value={emitter}>\n {children}\n </ReactEmitterContext.Provider>\n );\n}\n\nexport function useEmitter<\n Event extends Record<string | symbol, unknown>,\n>(): Emitter<Event> {\n return useContext(ReactEmitterContext);\n}\n\nexport function useEvent<\n Event extends Record<string | symbol, unknown>,\n Key extends keyof Event,\n>(key: Key, listener: (data: Event[Key]) => void, deps: any[] = []) {\n const emitter = useContext(ReactEmitterContext);\n useEffect(() => {\n const handler = (data: Event[Key]) => {\n listener(data);\n };\n emitter.on(key as any, handler);\n return () => {\n emitter.off(key as any, handler);\n };\n }, [emitter, key, ...deps]);\n}\n","// MIT License\n//\n// Copyright (c) 2020 Jepser Bernardino\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n//\n// Source: https://github.com/jepser/use-match-media\n\nimport { useState, useLayoutEffect } from \"react\";\n\ntype IMediaQuery = Array<string>;\n\ntype IMatchedMedia = Array<boolean>;\n\nexport function useMatchMedia(queries: IMediaQuery, defaultValues: IMatchedMedia = []): IMatchedMedia {\n const initialValues = defaultValues.length ? defaultValues : Array(queries.length).fill(false);\n\n if (typeof window === \"undefined\") return initialValues;\n\n const mediaQueryLists = queries.map((q) => window.matchMedia(q));\n const getValue = (): IMatchedMedia => {\n // Return the value for the given queries\n const matchedQueries = mediaQueryLists.map((mql) => mql.matches);\n\n return matchedQueries;\n };\n\n // State and setter for matched value\n const [value, setValue] = useState(getValue);\n\n useLayoutEffect(() => {\n // Event listener callback\n // Note: By defining getValue outside of useEffect we ensure that it has ...\n // ... current values of hook args (as this hook only runs on mount/dismount).\n const handler = (): void => setValue(getValue);\n // Set a listener for each media query with above handler as callback.\n mediaQueryLists.forEach((mql) => mql.addListener(handler));\n // Remove listeners on cleanup\n return (): void => mediaQueryLists.forEach((mql) => mql.removeListener(handler));\n }, []);\n\n return value;\n}\n","import { Vault } from \"@iiif/helpers\";\nimport { useEffect } from \"react\";\nimport { useDebounce } from \"tiny-use-debounce\";\n\nexport function useSaveVault(vault: Vault, saveChanges: () => void, saveInterval: number, enabled = true) {\n const debounceSaveChanges = useDebounce(saveChanges, saveInterval);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return () => void 0;\n }\n window.addEventListener(\"beforeunload\", saveChanges, false);\n\n return () => {\n saveChanges();\n window.removeEventListener(\"beforeunload\", saveChanges);\n };\n }, [saveChanges]);\n\n useEffect(() => {\n if (vault && enabled) {\n return vault.subscribe(debounceSaveChanges, true);\n }\n }, [debounceSaveChanges, vault, enabled]);\n}\n","import { useMemo } from \"react\";\nimport { useAtlasStore } from \"react-iiif-vault\";\nimport { useStore } from \"zustand\";\n\nexport function useSvgTools() {\n const store = useAtlasStore();\n const switchTool = useStore(store, (s) => s.switchTool);\n const currentTool = useStore(store, (s) => s.polygonState.currentTool);\n const selectedStamp = useStore(store, (s) => s.polygonState.selectedStamp);\n const showBoundingBox = useStore(store, (s) => s.polygonState.showBoundingBox);\n\n return useMemo(\n () => ({\n currentTool,\n selectedStamp,\n // Draw tool.\n draw: {\n active: currentTool === \"pencil\",\n enable: switchTool.draw,\n },\n\n // Polygon.\n polygon: {\n active: currentTool === \"pen\",\n enable: switchTool.pen,\n },\n\n // Line\n line: {\n active: currentTool === \"line\",\n enable: switchTool.line,\n },\n\n // Line box.\n lineBox: {\n active: currentTool === \"lineBox\",\n enable: switchTool.lineBox,\n },\n\n // Square.\n square: {\n active: currentTool === \"box\",\n enable: switchTool.box,\n },\n\n // Triangle.\n triangle: {\n active: selectedStamp?.id === \"triangle\",\n enable: switchTool.triangle,\n },\n\n // Hexagon.\n hexagon: {\n active: selectedStamp?.id === \"hexagon\",\n enable: switchTool.hexagon,\n },\n\n // Circle\n circle: {\n active: selectedStamp?.id === \"circle\",\n enable: switchTool.circle,\n },\n\n // Delete\n remove: {\n active: showBoundingBox,\n enable: switchTool.remove,\n },\n }),\n [showBoundingBox, selectedStamp, currentTool, switchTool],\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { useCurrentAnnotationMetadata } from \"react-iiif-vault\";\n\nexport function useAnnotationCreatorState<Type = any>({ key, initialValue, requestId, getInitialValue }: {\n key: string,\n initialValue?: Type,\n requestId?: string;\n getInitialValue?: (metadata: any) => (Type | null)\n}) {\n const [metadata, setMetadata] = useCurrentAnnotationMetadata({ requestId });\n const [reactState, reactSetState] = useState<Type>(getInitialValue && getInitialValue(metadata) || (metadata[key] || initialValue));\n\n const setState = useCallback((newValue: Type) => {\n setMetadata({ [key]: newValue });\n reactSetState(newValue);\n }, []);\n\n return [\n reactState,\n setState,\n ] as const;\n}\n","import { useState } from \"react\";\nimport {\n DefaultTooltipContent,\n IconHandle,\n ResetIcon,\n ResizeHandle,\n Tooltip,\n TooltipTrigger,\n} from \"@manifest-editor/components\";\nimport { ButtonReset } from \"@manifest-editor/ui/atoms/Button\";\nimport { CloseIcon } from \"@manifest-editor/ui/icons/CloseIcon\";\nimport { DownIcon } from \"@manifest-editor/ui/icons/DownIcon\";\nimport { forwardRef } from \"react\";\nimport type { TransitionStatus } from \"react-transition-group\";\nimport styled, { css } from \"styled-components\";\nimport type { PanelActions } from \"../Layout.types\";\n\nexport const HandleContainer = styled.div`\n position: relative;\n width: 1px;\n background: rgba(0, 0, 0, 0.2);\n z-index: 50;\n`;\n\nconst HandleControl = styled(ButtonReset)`\n transition:\n opacity 300ms,\n transform 300ms;\n margin-block-start: 0.2em;\n margin-block-end: 0.2em;\n user-select: none;\n opacity: 0;\n transform: scaleY(70%);\n &:focus {\n outline: 2px solid salmon;\n }\n`;\n\nconst IconControl = styled(HandleControl)`\n background: #fff;\n width: 30px;\n height: 30px;\n border-radius: 50%;\n display: flex;\n justify-content: center;\n align-items: center;\n box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);\n cursor: default;\n\n svg {\n fill: #9999;\n }\n`;\n\nconst OpenControl = styled(HandleControl)<{ $dir: \"left\" | \"right\" }>`\n position: relative;\n display: flex;\n opacity: 1;\n background: #fff;\n height: 55px;\n pointer-events: visible;\n width: 21px;\n margin-bottom: auto;\n margin-top: 4.5em;\n cursor: pointer;\n border-radius: ${(props) => (props.$dir === \"right\" ? \"5px 0 0 5px\" : \"0 5px 5px 0\")};\n\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2);\n transform: scaleX(100%);\n transform-origin: ${(props) => (props.$dir === \"right\" ? \"right\" : \"left\")};\n\n &:hover {\n background: #f9f9f9;\n transform: scaleX(125%);\n }\n\n svg {\n font-size: 1.5em;\n }\n`;\n\nconst InnerHandleContainer = styled.div<{ $open: boolean; $dir: \"left\" | \"right\" }>`\n background: rgba(0, 0, 0, 0);\n position: absolute;\n width: 16px;\n left: ${(props) => (props.$dir === \"left\" ? 0 : \"1px\")};\n top: 0;\n bottom: 0;\n z-index: 50; // This will always be quite high.\n transition:\n background-color 300ms,\n transform 300ms;\n transform: scaleX(70%);\n\n cursor: ${(props) => (props.$open ? \"col-resize\" : \"pointer\")};\n\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n &:hover {\n transform: scaleX(100%);\n background: rgba(0, 0, 0, 0.1);\n ${HandleControl} {\n transform: scaleX(100%);\n opacity: 1;\n }\n }\n`;\n\nconst UnscaledContainer = styled.div<{ $open: boolean; $dir: \"left\" | \"right\" }>`\n background: rgba(0, 0, 0, 0);\n position: absolute;\n pointer-events: none;\n width: 16px;\n left: ${(props) => (props.$dir === \"left\" ? 0 : \"-16px\")};\n top: 0;\n bottom: 0;\n z-index: 51; // This will always be quite high.\n`;\n\nexport const HandleControls = forwardRef<\n HTMLDivElement,\n {\n dir: \"left\" | \"right\";\n open: boolean;\n actions: PanelActions;\n transition?: TransitionStatus;\n reset?: () => void;\n }\n>(function HandleControls({ dir, open, actions, reset }, ref) {\n const [showDragTooltip, setShowDragToolTip] = useState(true);\n const dragTooltipMt = \"mt-[calc(50vh+8px)]\";\n const dragTooltipClasses = dir === \"left\" ? `${dragTooltipMt} ml-[13px]` : `${dragTooltipMt} ml-[3px]`;\n return (\n <HandleContainer onClick={() => actions.open()}>\n <UnscaledContainer $open={open} $dir={dir} className=\"group\">\n {!open ? (\n <Tooltip placement={dir === \"left\" ? \"right\" : \"left\"}>\n <TooltipTrigger as={OpenControl} $dir={dir} onClick={(e) => actions.open()}>\n <DownIcon className=\"text-2xl\" rotate={dir === \"right\" ? 90 : 270} />\n </TooltipTrigger>\n <DefaultTooltipContent>Open</DefaultTooltipContent>\n </Tooltip>\n ) : null}\n </UnscaledContainer>\n <Tooltip placement={dir === \"left\" ? \"right\" : \"left\"}>\n <TooltipTrigger aria-label=\"Resize panel\" asChild>\n <div>\n <InnerHandleContainer ref={ref} $open={open} $dir={dir} className=\"group\">\n {open ? (\n <Tooltip placement={dir === \"left\" ? \"right\" : \"left\"}>\n <TooltipTrigger as={IconHandle} onPress={() => actions.close()}>\n <div\n onMouseOut={() => {\n setShowDragToolTip(true);\n }}\n onMouseOver={() => {\n setShowDragToolTip(false);\n }}\n >\n <CloseIcon />\n </div>\n </TooltipTrigger>\n <DefaultTooltipContent>Close</DefaultTooltipContent>\n </Tooltip>\n ) : null}\n {reset && open ? (\n <Tooltip placement={dir === \"left\" ? \"right\" : \"left\"}>\n <TooltipTrigger as={IconHandle} onPress={() => reset()}>\n <div\n onMouseOut={() => {\n setShowDragToolTip(true);\n }}\n onMouseOver={() => {\n setShowDragToolTip(false);\n }}\n >\n <ResetIcon />\n </div>\n </TooltipTrigger>\n <DefaultTooltipContent>Reset</DefaultTooltipContent>\n </Tooltip>\n ) : null}\n {open ? (\n <Tooltip placement={dir === \"left\" ? \"right\" : \"left\"}>\n <TooltipTrigger asChild aria-label=\"Resize panel\">\n <div\n onMouseOut={() => {\n setShowDragToolTip(true);\n }}\n onMouseOver={() => {\n setShowDragToolTip(false);\n }}\n >\n <ResizeHandle aria-label=\"Resize panel\" />\n </div>\n </TooltipTrigger>\n <DefaultTooltipContent>Resize panel</DefaultTooltipContent>\n </Tooltip>\n ) : null}\n </InnerHandleContainer>\n </div>\n </TooltipTrigger>\n {showDragTooltip && <DefaultTooltipContent className={dragTooltipClasses}>Resize panel</DefaultTooltipContent>}\n </Tooltip>\n </HandleContainer>\n );\n});\n","import type * as React from \"react\";\n\nexport function Spinner(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 42 42\"\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"currentColor\"\n {...props}\n >\n <g transform=\"translate(2 2)\" strokeWidth={5} fill=\"none\" fillRule=\"evenodd\">\n <circle strokeOpacity={0.5} cx={18} cy={18} r={18} />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </svg>\n );\n}\n",".ghostLoadingBlock[data-header=\"true\"] {\n box-shadow:\n inset 0 -1px 0 0 rgba(0, 0, 0, 0.17),\n inset 0 1px 0 0 rgba(0, 0, 0, 0.17);\n}\n\n.ghostLoadingBlock {\n display: block;\n width: 100%;\n height: 2.8em;\n margin-bottom: 1em;\n background-color: #e4e7f0;\n animation: ghost-loading 2s infinite ease-in-out;\n}\n\n@keyframes ghost-loading {\n 0% {\n opacity: 0.4;\n }\n 50% {\n opacity: 0.8;\n }\n 100% {\n opacity: 0.4;\n }\n}\n\n.ghostBlockList {\n padding: 1em;\n display: flex;\n flex-direction: column;\n}\n","import $ from \"./GhostBlocks.module.css\";\nexport function GhostBlocks() {\n return (\n <>\n <div data-header=\"true\" className={$.ghostLoadingBlock} />\n <div className={$.ghostBlockList}>\n <div className={$.ghostLoadingBlock} />\n <div className={$.ghostLoadingBlock} />\n <div className={$.ghostLoadingBlock} />\n <div className={$.ghostLoadingBlock} />\n </div>\n </>\n );\n}\n","import { useLayoutEffect } from \"react\";\n\nexport function useEventHandler(ref: any, name: string, callback: (e: any) => void, deps: any[] = []) {\n useLayoutEffect(() => {\n const current = ref.current;\n if (current) {\n current.addEventListener(name, callback);\n\n return () => {\n current.removeEventListener(name, callback);\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, ...deps]);\n}\n","import { useEventHandler } from \"@manifest-editor/ui/madoc/use-event-handler\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useLocalStorage } from \"../../hooks/use-local-storage\";\nimport { panelSizing } from \"../Layout.helpers\";\n\nfunction distance(x1: number, y1: number, x2: number, y2: number) {\n return Math.sqrt(Math.abs(x2 - x1) ** 2 + Math.abs(y2 - y1) ** 2);\n}\n\nfunction getMaxWidthPct(container: number, defaultMaxWidthPct: number, maxWidthPct?: number, maxWidthPixel?: number) {\n if (maxWidthPct) {\n return maxWidthPct;\n }\n\n if (maxWidthPixel) {\n return maxWidthPixel / container;\n }\n\n return defaultMaxWidthPct;\n}\n\nexport function useResizeLayout(\n name: string,\n options: {\n left?: boolean;\n widthA?: any;\n marginLeft?: number;\n widthB?: any;\n maxWidthPx?: number;\n maxWidthPct?: number;\n minWidthPx?: number;\n minWidthPct?: number;\n onDragEnd?: () => void;\n loading?: boolean;\n } = {},\n) {\n const container = useRef<HTMLDivElement | null>(null);\n const resizableDiv = useRef<HTMLDivElement | null>(null);\n const otherDiv = useRef<HTMLDivElement | null>(null);\n const resizer = useRef<HTMLDivElement | null>(null);\n const newPct = useRef(0.5);\n const [isDragging, setIsDragging] = useState(false);\n const isEventDragging = useRef(false);\n const isEventTimeout = useRef<number>(0);\n const startPos = useRef({ x: 0, y: 0 });\n const [{ widthA, widthB }, setWidths] = useLocalStorage(`resize-layout/${name}`, {\n widthA: \"auto\",\n widthB: `${panelSizing({\n initial: options.widthA,\n fallback: 320,\n options: { minWidth: options.minWidthPx, maxWidth: options.maxWidthPx },\n })}px`,\n });\n const { loading = false } = options;\n\n useEventHandler(\n resizer,\n \"mousedown\",\n (e) => {\n startPos.current.x = e.pageX;\n startPos.current.y = e.pageY;\n\n if (isEventTimeout.current) {\n clearTimeout(isEventTimeout.current);\n isEventTimeout.current = 0;\n }\n isEventTimeout.current = setTimeout(() => {\n setIsDragging(true);\n isEventDragging.current = true;\n }, 350) as any;\n },\n [loading],\n );\n\n useEventHandler(\n { current: typeof window !== \"undefined\" ? window : undefined },\n \"mouseup\",\n () => {\n const current = container.current;\n if (current && isEventDragging.current) {\n const { x, width } = current.getBoundingClientRect();\n\n const ml = options.marginLeft || 0;\n const maxWidthPct = getMaxWidthPct(width, 0.8, options.maxWidthPct, options.maxWidthPx) * width;\n const minWidthPct = getMaxWidthPct(width, 0.2, options.minWidthPct, options.minWidthPx) * width;\n\n if (options.left) {\n const newWidthB = (newPct.current * width) - ml;\n\n setWidths({\n widthA: `${((1 - newPct.current) * width) - ml}`,\n widthB: `${newWidthB > maxWidthPct ? maxWidthPct : newWidthB < minWidthPct ? minWidthPct : newWidthB}px`,\n });\n } else {\n const newWidthA = 1 - (newPct.current * width) - ml;\n\n setWidths({\n widthA: `${newWidthA > maxWidthPct ? maxWidthPct : newWidthA < minWidthPct ? minWidthPct : newWidthA}px`,\n widthB: `${(newPct.current * width) - ml}px`,\n });\n }\n\n setIsDragging(false);\n isEventDragging.current = false;\n if (options.onDragEnd) {\n options.onDragEnd();\n }\n }\n\n clearTimeout(isEventTimeout.current);\n isEventTimeout.current = 0;\n },\n [loading],\n );\n\n useEventHandler(\n container,\n \"mousemove\",\n (e) => {\n if (!isEventDragging.current && isEventTimeout.current) {\n if (distance(startPos.current.x, startPos.current.y, e.pageX, e.pageY) > 20) {\n setIsDragging(true);\n isEventDragging.current = true;\n clearTimeout(isEventTimeout.current);\n isEventTimeout.current = 0;\n }\n }\n\n if (isEventDragging.current && resizableDiv.current) {\n const current = container.current;\n if (current) {\n const { x, width } = current.getBoundingClientRect();\n\n const ml = options.marginLeft || 0;\n const isLeft = options.left || false;\n\n const maxWidthPct = getMaxWidthPct(width, 0.8, options.maxWidthPct, options.maxWidthPx);\n const minWidthPct = getMaxWidthPct(width, 0.2, options.minWidthPct, options.minWidthPx);\n\n newPct.current = (width + x - e.pageX - 5) / width;\n if (isLeft) {\n newPct.current = 1 - newPct.current;\n }\n newPct.current = newPct.current < minWidthPct ? minWidthPct : newPct.current;\n newPct.current = newPct.current > maxWidthPct ? maxWidthPct : newPct.current;\n\n resizableDiv.current.style.width = `${(newPct.current * width) - ml}px`;\n }\n }\n },\n [isDragging, loading],\n );\n\n return {\n refs: {\n container,\n resizer,\n resizableDiv,\n otherDiv,\n },\n setWidths,\n isDragging,\n widthA,\n widthB,\n };\n}\n","import styled, { css } from \"styled-components\";\nimport { ModularPanelHeader } from \"../Layout/components/ModularPanel\";\n\nexport const Container = styled.div`\n position: relative;\n display: flex;\n flex: 1;\n overflow: hidden;\n flex-direction: column;\n`;\n\nexport const CenterPanel = styled.div`\n flex: 1;\n position: relative;\n z-index: 7;\n`;\n\nexport const MobileBar = styled.div`\n display: flex;\n justify-content: space-around;\n width: 100%;\n background: #fff;\n border-top: 1px solid #cbcbcb;\n padding: 0.5em;\n height: 3.4rem;\n`;\n\nexport const LeftBarButton = styled.button`\n //background: red;\n padding: 0.5em 1em;\n width: 32%;\n\n border-radius: 5px;\n border: none;\n background: #ffffff;\n`;\n\nexport const PreviewBarButton = styled.button`\n padding: 0.5em 1em;\n width: 32%;\n\n border-radius: 5px;\n\n background: #5e59c2;\n border: 1px solid rgba(0, 0, 0, 0.21);\n color: #ffffff;\n`;\n\nexport const DrawerContainer = styled.div`\n position: relative;\n width: 32%;\n margin: 0 0.75em;\n z-index: 9;\n`;\n\nexport const DrawerButton = styled.button`\n padding: 0.4em 1em 0.65em;\n position: absolute;\n width: 100%;\n bottom: 1em;\n background: #ffffff;\n box-shadow: 0 3px 18px 0 rgba(0, 0, 0, 0.04);\n border-radius: 5px;\n border: 1px solid #979797;\n letter-spacing: -0.46px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n svg {\n display: block;\n margin: auto;\n font-size: 1.8em;\n }\n`;\n\nexport const DrawerBody = styled.div<{ $open?: boolean }>`\n background: #fff;\n display: flex;\n position: absolute;\n transform: translateY(100%);\n overflow-y: auto;\n left: 0;\n right: 0;\n top: 7em;\n z-index: 10;\n box-shadow:\n 0 -5px 15px 0 rgba(0, 0, 0, 0),\n 0 -3px 5px 0 rgba(0, 0, 0, 0);\n bottom: 0;\n transition:\n 0.3s transform ease-in-out,\n 0.3s box-shadow;\n ${(props) =>\n props.$open &&\n css`\n box-shadow:\n 0 -5px 15px 0 rgba(0, 0, 0, 0.1),\n 0 -3px 5px 0 rgba(0, 0, 0, 0.1);\n transform: translateY(0);\n `}\n\n ${ModularPanelHeader} {\n box-shadow: none;\n padding-left: 0.5em;\n padding-right: 0.5em;\n font-size: 1.1em;\n }\n`;\n\nexport const LeftPanel = styled.div<{ $open?: boolean }>`\n position: absolute;\n transform: translateX(-100%);\n background: #fff;\n left: 0;\n top: 0;\n bottom: 0;\n z-index: 10;\n overflow-y: auto;\n transition: 0.5s transform;\n ${(props) =>\n props.$open &&\n css`\n transform: translateX(0);\n `}\n`;\n\nexport const Lightbox = styled.div<{ $open?: boolean }>`\n background: rgba(0, 0, 0, 0.4);\n pointer-events: none;\n position: absolute;\n z-index: 8;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n opacity: 0;\n transition: opacity 0.5s;\n\n ${(props) =>\n props.$open &&\n css`\n pointer-events: visible;\n opacity: 1;\n `}\n`;\n","import styled, { css, keyframes } from \"styled-components\";\nimport { MenuPositions } from \"./Layout.types\";\nimport { TransitionStatus } from \"react-transition-group\";\n\nexport const OuterWrapper = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n\n max-width: 100%;\n min-width: 0;\n overflow: hidden;\n`;\n\nexport const Header = styled.header`\n //box-shadow: 0 3px 2px 0 rgba(0, 0, 0, 0.04), 0 1px 0 0 rgba(0, 0, 0, 0.17);\n z-index: 200;\n`;\n\nexport const Footer = styled.div`\n background: #fff;\n`;\n\nexport const Main = styled.div`\n display: flex;\n flex: 1 1 0;\n min-height: 0;\n`;\n\nexport const LeftPanel = styled.div<{ $state?: TransitionStatus; $width: string; $motion?: boolean }>`\n background: #fff;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n max-width: 720px;\n align-items: flex-end;\n\n ${(props) =>\n props.$motion\n ? css`\n transition: max-width 400ms;\n `\n : \"\"}\n\n ${(props) => {\n switch (props.$state) {\n case \"entering\":\n return css`\n max-width: ${props.$width};\n `;\n case \"exiting\":\n return css`\n max-width: 0;\n `;\n case \"unmounted\":\n case \"exited\":\n return css`\n max-width: 0;\n `;\n }\n }}\n`;\n\nexport const CenterPanel = styled.div`\n flex: 1 1 0;\n background: #e3e7f0;\n // background: #efefef;\n // box-shadow:\n // inset 0 3px 2px 0 rgba(0, 0, 0, 0.04),\n // inset 0 1px 0 0 rgba(0, 0, 0, 0.14);\n padding-top: 1px;\n // background: linear-gradient(0deg, rgba(251, 242, 237, 1) 0%, rgba(240, 229, 245, 1) 50%, rgba(236, 245, 255, 1) 100%);\n\n min-width: 320px;\n display: flex;\n\n min-height: 0;\n overflow: hidden;\n\n > * {\n min-width: 0;\n }\n`;\n\nexport const RightPanel = styled.div<{ $state?: TransitionStatus; $width: string; $motion?: boolean }>`\n background: #fff;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n max-width: 720px;\n\n ${(props) => (props.$motion ? \"transition: max-width 400ms;\" : \"\")}\n\n ${(props) => {\n switch (props.$state) {\n case \"entering\":\n return css`\n max-width: ${props.$width};\n `;\n case \"exiting\":\n return css`\n max-width: 0;\n `;\n case \"unmounted\":\n case \"exited\":\n return css`\n max-width: 0;\n `;\n }\n }}\n`;\n\nexport const PanelContainer = styled.div<{ $menu?: MenuPositions }>`\n display: flex;\n flex: 1;\n height: 100%;\n min-width: 50px;\n transition: min-width 400ms;\n overflow: hidden;\n\n ${(props) => {\n switch (props.$menu) {\n case \"top\":\n return css`\n flex-direction: column;\n ${PanelMenu} {\n flex-direction: column;\n }\n `;\n case \"left\":\n return css`\n flex-direction: row;\n ${PanelMenu} {\n flex-direction: row;\n }\n `;\n default:\n case \"bottom\":\n return css`\n flex-direction: column-reverse;\n ${PanelMenu} {\n flex-direction: column;\n }\n `;\n case \"right\":\n return css`\n flex-direction: row-reverse;\n ${PanelMenu} {\n flex-direction: row;\n }\n `;\n }\n }}\n`;\n\nexport const PanelSideMenu = styled.div`\n background: #fff;\n border-top: 1px solid #e3e7f0;\n border-right: 1px solid #e3e7f0;\n display: flex;\n flex-direction: column;\n width: 3em;\n /* width: 3.35em;\n padding: 0.3em;\n gap: 0.3em; */\n`;\n\nexport const PanelSideMenuItem = styled.button`\n cursor: pointer;\n aspect-ratio: 1;\n width: 3em;\n height: 3em;\n display: flex;\n justify-content: center;\n align-items: center;\n &:hover {\n background: #fff6f9;\n }\n\n &:hover svg {\n color: #000;\n }\n\n &[data-selected=\"true\"] {\n background: #b84c74;\n svg {\n color: #ffffff;\n }\n }\n\n & svg {\n font-size: 1.5em;\n color: #999;\n }\n`;\n\nexport const PanelMenu = styled.div<{ $position: \"bottom\" | \"top\" | \"left\" | \"right\"; $open: boolean }>`\n display: flex;\n box-shadow:\n 0 -3px 2px 0 rgba(0, 0, 0, 0.04),\n 0 -1px 0 0 rgba(0, 0, 0, 0.17);\n\n ${(props) =>\n !props.$open && (props.$position === \"top\" || props.$position === \"bottom\")\n ? css`\n display: none;\n `\n : \"\"}\n`;\n\nexport const PanelContent = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n`;\n","import { Modal, PanelSideMenu } from \"@manifest-editor/components\";\n// import { LayoutProps } from \"./Layout.types\";\nimport { DownIcon } from \"@manifest-editor/ui/icons/DownIcon\";\nimport { StarIcon } from \"@manifest-editor/ui/icons/StarIcon\";\nimport { Spinner } from \"@manifest-editor/ui/madoc/components/icons/Spinner\";\nimport { GhostBlocks } from \"@manifest-editor/ui/ui/GhostBlocks/GhostBlocks\";\nimport { Fragment, memo, useContext, useLayoutEffect, useMemo, useRef } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { ReactVaultContext } from \"react-iiif-vault\";\nimport { Transition, type TransitionStatus } from \"react-transition-group\";\nimport equal from \"shallowequal\";\nimport { useAppState } from \"../AppContext/AppContext\";\nimport { useMatchMedia } from \"../hooks/use-match-media\";\nimport { HandleControls } from \"./components/HandleControls\";\nimport { ModularPanel } from \"./components/ModularPanel\";\nimport { PanelError } from \"./components/PanelError\";\nimport { useResizeLayout } from \"./components/use-resize-layouts\";\nimport { useLayoutProvider } from \"./Layout.context\";\nimport { panelSizing, renderHelper } from \"./Layout.helpers\";\nimport * as M from \"./Layout.mobile\";\nimport * as L from \"./Layout.styles\";\n\ninterface LayoutProps {\n header?: React.ReactNode;\n footer?: React.ReactNode;\n menu?: React.ReactNode;\n leftPanelMenu?: React.ReactNode;\n rightPanelMenu?: React.ReactNode;\n centerPanelMenu?: React.ReactNode;\n leftPanelMenuPosition?: \"top\" | \"bottom\";\n rightPanelMenuPosition?: \"top\" | \"bottom\";\n hideHeader?: boolean;\n isLoading?: boolean;\n className?: string;\n centerPanelMenuPosition?: \"top\" | \"bottom\";\n disableSideEffects?: string[];\n}\n\nexport const Layout = memo(function Layout(props: LayoutProps) {\n const appState = useAppState();\n const layout = useLayoutProvider();\n const { vault: _vault } = useContext(ReactVaultContext);\n const vault = _vault || undefined;\n const leftPanelRef = useRef<HTMLDivElement | null>(null);\n const rightPanelRef = useRef<HTMLDivElement | null>(null);\n const { loading, state, leftPanels, centerPanels, rightPanels, modals = [], actions } = layout;\n const leftPanel = leftPanels.find((panel) => panel.id === state.leftPanel.current);\n const rightPanel = rightPanels.find((panel) => panel.id === state.rightPanel.current);\n const centerPanel = centerPanels.find((panel) => panel.id === state.centerPanel.current);\n const modalToRender = modals.find((panel) => panel.id === state.modal.current);\n const enableMotion = true;\n const pinnedRightPanel = state.pinnedRightPanel.pinned\n ? rightPanels.find((panel) => panel.id === state.pinnedRightPanel.current)\n : undefined;\n const [mobile] = useMatchMedia([\"(max-width: 1020px)\"]);\n\n const isLoading = props.isLoading || false;\n const backgroundItems = useMemo(() => {\n return (layout.background || []).map((bg, key) => {\n return <Fragment key={key}>{bg.render()}</Fragment>;\n });\n }, [layout.background]);\n\n // Resizers\n const leftPanelResizer = useResizeLayout(`left-panel/${leftPanel?.id}`, {\n left: true,\n marginLeft: 60,\n minWidthPx: leftPanel?.options?.minWidth || 200,\n maxWidthPx: leftPanel?.options?.maxWidth || 720,\n loading,\n });\n const rightPanelResizer = useResizeLayout(`right-panel/${rightPanel?.id}`, {\n left: false,\n minWidthPx: rightPanel?.options?.minWidth || 320,\n maxWidthPx: rightPanel?.options?.maxWidth || 720,\n loading,\n });\n\n // Pinned state\n const showRightPanel =\n rightPanel &&\n (pinnedRightPanel?.id !== rightPanel.id || !equal(state.pinnedRightPanel.state, state.rightPanel.state));\n const resetLeftPanel =\n leftPanelResizer.widthB !== \"auto\"\n ? () =>\n leftPanelResizer.setWidths({\n widthA: \"auto\",\n widthB: panelSizing({\n options: leftPanel?.options,\n fallback: 320,\n }),\n } as any)\n : undefined;\n const resetRightPanel =\n rightPanelResizer.widthB !== \"auto\"\n ? () =>\n rightPanelResizer.setWidths({\n widthA: \"auto\",\n widthB: panelSizing({\n options: rightPanel?.options,\n fallback: 320,\n }),\n } as any)\n : undefined;\n\n // Remove dynamic layouts for now.\n // useEffect(() => {\n // // @todo to enable dynamic layouts, we need this effect to run IF the props change.\n // actions.setAvailable(props);\n // props.rightPanels.length && actions.rightPanel.change({ id: props.rightPanels[0]!.id });\n // props.leftPanels.length && actions.leftPanel.change({ id: props.leftPanels[0]!.id });\n // props.centerPanels.length && actions.centerPanel.change({ id: props.centerPanels[0]!.id });\n\n // // actions are stable.\n // // eslint-disable-next-line react-hooks/exhaustive-deps\n // }, []);\n\n useLayoutEffect(() => {\n if (mobile && state.leftPanel.open && state.rightPanel.open) {\n actions.leftPanel.close();\n actions.rightPanel.close();\n }\n }, [mobile]);\n\n useLayoutEffect(() => {\n if (centerPanel && centerPanel.onMount) {\n return centerPanel.onMount(\n state.centerPanel.state || centerPanel.defaultState || {},\n { ...layout, current: actions.centerPanel, vault: vault as any },\n appState,\n );\n }\n }, [state.centerPanel.current]);\n\n useLayoutEffect(() => {\n // @todo to enable dynamic layouts, we need this effect to run IF the props change.\n // actions.setAvailable(props);\n rightPanels.length && actions.rightPanel.change({ id: rightPanels[0]!.id });\n leftPanels.length && actions.leftPanel.change({ id: leftPanels[0]!.id });\n centerPanels.length && actions.centerPanel.change({ id: centerPanels[0]!.id });\n\n // actions are stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (loading) {\n // It will render as soon as possible, downside of hoisting the layout provider\n // Unlikely this will be hit because of flushSync, but best to check.\n return null;\n }\n\n // Build our panels here.\n\n const renderLeftPanel = (transition?: TransitionStatus) => (\n <L.PanelContainer\n $menu={props.leftPanelMenuPosition || \"bottom\"}\n ref={leftPanelResizer.refs.resizableDiv}\n className={[\"manifest-editor\", transition && enableMotion ? `transition transition-${transition}` : \"\"].join(\" \")}\n style={{\n width: state.leftPanel.open || transition !== \"exited\" ? leftPanelResizer.widthB : undefined,\n minWidth: leftPanel?.options?.minWidth,\n }}\n >\n {isLoading ? (\n <L.PanelContent>\n <GhostBlocks />\n </L.PanelContent>\n ) : (\n <>\n {props.leftPanelMenu ? (\n <L.PanelMenu\n $open={state.leftPanel.open && transition !== \"exited\"}\n $position={props.leftPanelMenuPosition || \"bottom\"}\n >\n {props.leftPanelMenu}\n </L.PanelMenu>\n ) : null}\n <L.PanelContent>\n {state.leftPanel.open || transition !== \"exited\" ? (\n <>\n {leftPanel ? (\n <ModularPanel\n isLeft\n noHeader\n transition={transition}\n panel={leftPanel}\n state={state.leftPanel}\n actions={actions.leftPanel}\n />\n ) : null}\n </>\n ) : null}\n </L.PanelContent>\n </>\n )}\n </L.PanelContainer>\n );\n\n const renderModal = () => {\n if (!modalToRender || state.modal.open === false) {\n return null;\n }\n\n return (\n <Modal title={modalToRender.label} onClose={() => actions.modal.close()}>\n {renderHelper(\n modalToRender.render(\n state.modal.state || modalToRender.defaultState || {},\n { ...layout, current: actions.modal, vault: vault },\n appState,\n ),\n )}\n </Modal>\n );\n };\n\n const renderCenterPanel = () => (\n <L.PanelContainer $menu={props.centerPanelMenuPosition || \"top\"}>\n {props.centerPanelMenu ? (\n <L.PanelMenu $open={state.centerPanel.open} $position={props.centerPanelMenuPosition || \"top\"}>\n {props.centerPanelMenu}\n </L.PanelMenu>\n ) : null}\n <L.PanelContent>\n <ErrorBoundary resetKeys={[centerPanel?.id]} FallbackComponent={PanelError}>\n {isLoading ? (\n <div\n style={{\n display: \"flex\",\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <Spinner stroke=\"rgba(0,0,0,.3)\" fontSize={\"2em\"} />\n </div>\n ) : state.centerPanel.open ? (\n centerPanel ? (\n renderHelper(\n centerPanel.render(\n state.centerPanel.state || centerPanel.defaultState || {},\n { ...layout, current: actions.centerPanel, vault: vault },\n appState,\n ),\n )\n ) : null\n ) : null}\n </ErrorBoundary>\n </L.PanelContent>\n </L.PanelContainer>\n );\n\n const renderRightPanel = (transition?: TransitionStatus) => (\n <L.PanelContainer\n $menu={props.rightPanelMenuPosition || \"bottom\"}\n ref={rightPanelResizer.refs.resizableDiv}\n className={transition && enableMotion ? `transition transition-${transition}` : \"\"}\n style={{\n width: state.rightPanel.open || transition !== \"exited\" ? rightPanelResizer.widthB : undefined,\n minWidth: rightPanel?.options?.minWidth,\n }}\n >\n {isLoading ? (\n <L.PanelContent>\n <GhostBlocks />\n </L.PanelContent>\n ) : (\n <>\n {props.rightPanelMenu ? (\n <L.PanelMenu $open={state.rightPanel.open} $position={props.rightPanelMenuPosition || \"bottom\"}>\n {props.rightPanelMenu}\n </L.PanelMenu>\n ) : null}\n <L.PanelContent>\n {state.rightPanel.open || transition !== \"exited\" ? (\n <>\n {showRightPanel ? (\n <ModularPanel\n panel={rightPanel}\n state={state.rightPanel}\n actions={actions.rightPanel}\n pinActions={actions.pinnedRightPanel}\n available={rightPanels}\n />\n ) : null}\n\n {pinnedRightPanel ? (\n <ModularPanel\n panel={pinnedRightPanel}\n state={state.pinnedRightPanel}\n actions={actions.pinnedRightPanel}\n close={actions.rightPanel.close}\n />\n ) : null}\n </>\n ) : null}\n </L.PanelContent>\n </>\n )}\n </L.PanelContainer>\n );\n\n if (mobile) {\n return (\n <L.OuterWrapper>\n {props.hideHeader ? null : (\n <L.Header>\n {props.header || null}\n {props.menu ? <menu>{props.menu}</menu> : null}\n </L.Header>\n )}\n <L.Main>\n <M.Container>\n <M.CenterPanel>{renderCenterPanel()}</M.CenterPanel>\n <M.MobileBar>\n {leftPanels.length > 0 ? (\n <M.LeftBarButton onClick={actions.leftPanel.toggle}>{leftPanel?.label}</M.LeftBarButton>\n ) : null}\n {rightPanels.length > 0 ? (\n <M.DrawerContainer>\n <M.DrawerButton onClick={actions.rightPanel.toggle}>\n <DownIcon rotate={180} />\n {rightPanel?.label}\n </M.DrawerButton>\n </M.DrawerContainer>\n ) : null}\n <M.PreviewBarButton>Preview</M.PreviewBarButton>\n </M.MobileBar>\n {rightPanels.length > 0 ? (\n <M.DrawerBody $open={state.rightPanel.open}>{renderRightPanel()}</M.DrawerBody>\n ) : null}\n {leftPanels.length > 0 ? <M.LeftPanel $open={state.leftPanel.open}>{renderLeftPanel()}</M.LeftPanel> : null}\n {leftPanels.length > 0 || rightPanels.length > 0 ? (\n <M.Lightbox\n $open={state.leftPanel.open || state.rightPanel.open}\n onClick={() => {\n actions.leftPanel.close();\n actions.rightPanel.close();\n }}\n />\n ) : null}\n </M.Container>\n </L.Main>\n </L.OuterWrapper>\n );\n }\n\n // This is a big ol' work in progress.\n return (\n <L.OuterWrapper className={`manifest-editor ${props.className}`}>\n {props.hideHeader ? null : (\n <L.Header>\n {props.header || null}\n {props.menu ? <menu>{props.menu}</menu> : null}\n </L.Header>\n )}\n <L.Main\n ref={(div) => {\n leftPanelResizer.refs.container.current = div;\n rightPanelResizer.refs.container.current = div;\n }}\n >\n {leftPanels.length > 0 ? (\n <PanelSideMenu\n current={state.leftPanel.current}\n items={leftPanels.map((panel) => ({\n id: panel.id,\n label: panel.label,\n icon: panel.icon,\n divide: panel.divide,\n onClick: () => {\n if (state.leftPanel.current === panel.id) {\n actions.leftPanel.toggle();\n } else {\n actions.leftPanel.change({ id: panel.id });\n }\n },\n }))}\n open={state.leftPanel.open}\n />\n ) : null}\n\n {leftPanels.length > 0 ? (\n <Transition\n nodeRef={leftPanelRef}\n in={state.leftPanel.open}\n timeout={enableMotion ? 400 : 0}\n unmountOnExit={false}\n >\n {(transition) => (\n <>\n <L.LeftPanel\n ref={leftPanelRef}\n $width={leftPanelResizer.widthB}\n $state={transition}\n $motion={enableMotion}\n >\n {renderLeftPanel(transition)}\n </L.LeftPanel>\n <HandleControls\n ref={leftPanelResizer.refs.resizer}\n reset={resetLeftPanel}\n dir=\"left\"\n transition={transition}\n open={state.leftPanel.open || transition !== \"exited\"}\n actions={actions.leftPanel}\n />\n </>\n )}\n </Transition>\n ) : null}\n <L.CenterPanel>{renderCenterPanel()}</L.CenterPanel>\n {rightPanels.length > 0 ? (\n <Transition\n nodeRef={rightPanelRef}\n in={state.rightPanel.open}\n timeout={enableMotion ? 400 : 0}\n unmountOnExit={false}\n >\n {(transition) => (\n <>\n <HandleControls\n ref={rightPanelResizer.refs.resizer}\n dir=\"right\"\n reset={resetRightPanel}\n open={state.rightPanel.open}\n actions={actions.rightPanel}\n />\n <L.RightPanel\n ref={rightPanelRef}\n $width={rightPanelResizer.widthB}\n $state={transition}\n $motion={enableMotion}\n >\n {renderRightPanel(transition)}\n </L.RightPanel>\n </>\n )}\n </Transition>\n ) : null}\n </L.Main>\n <L.Footer>{props.footer || null}</L.Footer>\n\n <div className=\"hidden\">{backgroundItems}</div>\n\n <>{renderModal()}</>\n </L.OuterWrapper>\n );\n});\n","import { LayoutState, PanelActions, PanelActionType, PinnablePanelActions } from \"./Layout.types\";\nimport { Dispatch, useMemo } from \"react\";\nexport function usePanelActions(\n panel: keyof LayoutState,\n dispatch: Dispatch<PanelActionType>\n): PanelActions | PinnablePanelActions {\n function popStack() {\n dispatch({ type: \"popStack\", panel, payload: undefined });\n }\n function change(payload: { id: string; state?: any; stacked?: boolean }) {\n // flushSync(() => {\n dispatch({ type: \"change\", panel, payload });\n // });\n }\n function open(payload?: { id: string; state?: any; stacked?: boolean }) {\n // flushSync(() => {\n dispatch({ type: \"open\", panel, payload });\n // });\n }\n function close() {\n dispatch({ type: \"close\", panel, payload: undefined });\n }\n function toggle() {\n dispatch({ type: \"toggle\", panel, payload: undefined });\n }\n function minimise() {\n dispatch({ type: \"minimise\", panel, payload: undefined });\n }\n function maximise(payload?: { id: string; state?: any }) {\n dispatch({ type: \"maximise\", panel, payload });\n }\n function setCustomWidth(payload: number) {\n dispatch({ type: \"setCustomWidth\", panel, payload });\n }\n function resetSize() {\n dispatch({ type: \"resetSize\", panel, payload: undefined });\n }\n function pin(payload: { id: string; state?: any }) {\n dispatch({ type: \"pin\", panel, payload });\n }\n function unpin() {\n dispatch({ type: \"unpin\", panel, payload: undefined });\n }\n\n return useMemo(\n () => ({\n popStack,\n change,\n open,\n close,\n toggle,\n minimise,\n maximise,\n setCustomWidth,\n resetSize,\n pin,\n unpin,\n }),\n // Dispatch is stable here.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n}\n","import { produce, Draft, original } from \"immer\";\nimport { LayoutState, PanelActionType, PanelState, PinnablePanelState } from \"./Layout.types\";\nimport { isPinnableState } from \"./Layout.helpers\";\n\nfunction pushStack<T>(\n state: Draft<PinnablePanelState | PanelState>,\n action: T extends { payload: { stacked?: boolean; unique?: boolean } } ? T : never\n) {\n if (action.payload && action.payload.stacked) {\n if (state.current) {\n const latest = state.stack[state.stack.length - 1];\n if (latest && latest.id === state.current) {\n return;\n }\n\n if (action.payload.unique) {\n state.stack = state.stack.filter((i) => i.id !== state.current);\n }\n\n state.stack.push({\n id: state.current,\n state: state.state ? { ...original(state.state) } : {},\n });\n }\n } else {\n state.stack = [];\n }\n}\n\nfunction panelReducer(state: Draft<PinnablePanelState | PanelState>, action: PanelActionType) {\n switch (action.type) {\n case \"popStack\": {\n if (state.stack.length) {\n const latest = state.stack[state.stack.length - 1];\n if (latest) {\n state.current = latest.id;\n state.state = latest.state;\n }\n state.stack = state.stack.slice(0, -1);\n }\n break;\n }\n\n case \"change\": {\n if (action.payload.id !== state.current) {\n pushStack(state, action);\n }\n state.state = action.payload.state;\n state.current = action.payload.id;\n break;\n }\n case \"close\": {\n state.open = false;\n break;\n }\n case \"open\": {\n state.open = true;\n if (action.payload) {\n if (action.payload.id !== state.current) {\n pushStack<any>(state, action);\n }\n state.state = action.payload.state;\n state.current = action.payload.id;\n }\n break;\n }\n case \"toggle\": {\n state.open = !state.open;\n break;\n }\n case \"maximise\": {\n state.minimised = false;\n if (action.payload) {\n state.state = action.payload.state;\n state.current = action.payload.id;\n }\n break;\n }\n case \"minimise\": {\n state.minimised = true;\n break;\n }\n case \"setCustomWidth\": {\n state.customWidth = action.payload;\n break;\n }\n case \"resetSize\": {\n state.customWidth = undefined;\n }\n }\n\n if (isPinnableState(state)) {\n switch (action.type) {\n case \"pin\": {\n state.pinned = true;\n state.state = action.payload.state;\n state.current = action.payload.id;\n break;\n }\n case \"unpin\": {\n state.pinned = false;\n state.state = undefined;\n break;\n }\n }\n }\n}\n\nexport const layoutReducer = produce<LayoutState, [PanelActionType]>((state, action: PanelActionType) => {\n switch (action.panel) {\n case \"centerPanel\": {\n panelReducer(state.centerPanel, action);\n break;\n }\n case \"leftPanel\": {\n panelReducer(state.leftPanel, action);\n break;\n }\n case \"rightPanel\": {\n panelReducer(state.rightPanel, action);\n break;\n }\n case \"modal\": {\n panelReducer(state.modal, action);\n break;\n }\n case \"pinnedRightPanel\": {\n panelReducer(state.pinnedRightPanel, action);\n break;\n }\n }\n});\n\nexport function getDefaultPanelState(): PanelState {\n return {\n customWidth: undefined,\n minimised: false,\n open: true,\n current: null,\n state: null,\n stack: [],\n };\n}\n\nexport function getDefaultLayoutState(): LayoutState {\n return {\n leftPanel: getDefaultPanelState(),\n centerPanel: getDefaultPanelState(),\n rightPanel: getDefaultPanelState(),\n modal: getDefaultPanelState(),\n pinnedRightPanel: {\n ...getDefaultPanelState(),\n pinnable: true,\n pinned: false,\n },\n };\n}\n","import type { Reference } from \"@iiif/presentation-3\";\nimport { createContext, type ReactNode, useContext, useMemo } from \"react\";\nimport invariant from \"tiny-invariant\";\nimport { useVault, useVaultSelector } from \"react-iiif-vault\";\n\ninterface ResourceEditingContext {\n resource: Reference<any> | null;\n}\n\nexport const ResourceEditingReactContext =\n createContext<ResourceEditingContext>({\n resource: null,\n });\n\nexport function useEditingContext() {\n return useContext(ResourceEditingReactContext);\n}\n\n/**\n * useResource\n *\n * Only use this if you KNOW that there is a resource (e.g. in a panel)\n */\nexport function useResource<T = Record<string, never>>(): T & Reference<any> {\n const vault = useVault();\n const { resource } = useEditingContext();\n\n invariant(resource, \"Nothing selected\");\n\n const { id, type } = resource;\n\n const fullResource = useVaultSelector(() => {\n return vault.get({ id, type });\n }, [id, type]);\n\n return fullResource as T & Reference<any>;\n}\n\n/**\n * useOptionalResource\n *\n * Use in components where you don't know if something is editing. (e.g. canvas listing)\n */\nexport function useOptionalResource() {\n const { resource } = useEditingContext();\n\n return resource;\n}\n\nexport function ResourceEditingProvider({\n resource,\n children,\n}: {\n resource: { id: string; type: string } | null | undefined;\n children: ReactNode;\n}) {\n const { id, type } = resource || {};\n\n return (\n <ResourceEditingReactContext.Provider\n value={useMemo(\n () => ({\n // Current resource.\n resource: id && type ? { id, type } : null,\n }),\n [id, type],\n )}\n >\n {children}\n </ResourceEditingReactContext.Provider>\n );\n}\n","import React, { Component, ErrorInfo, ReactNode } from \"react\";\n\ninterface Props {\n children: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n public state: State = {\n hasError: false,\n };\n\n public static getDerivedStateFromError(_: Error): State {\n console.error(_);\n // Update state so the next render will show the fallback UI.\n return { hasError: true };\n }\n\n public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"Uncaught error:\", error, errorInfo);\n }\n\n public render() {\n if (this.state.hasError) {\n return <h1>Sorry.. there was an error</h1>;\n }\n\n return this.props.children;\n }\n}\n","import { isSpecificResource } from \"@iiif/parser\";\nimport type { Reference, SpecificResource } from \"@iiif/presentation-3\";\nimport type { CreatableResource } from \"@manifest-editor/creator-api\";\nimport { type ReactNode, memo, useMemo, useReducer } from \"react\";\nimport invariant from \"tiny-invariant\";\nimport { useApp } from \"../AppContext/AppContext\";\nimport { useEditingStack } from \"../EditingStack/EditingStack\";\nimport type { EditableResource } from \"../EditingStack/EditingStack.types\";\nimport { LayoutActionsReactContext, LayoutStateReactContext } from \"./Layout.context\";\nimport { usePanelActions } from \"./Layout.hooks\";\nimport { getDefaultLayoutState, layoutReducer } from \"./Layout.reducer\";\nimport type { PinnablePanelActions } from \"./Layout.types\";\nimport { useEmitter } from \"../hooks/use-event\";\n\nfunction parse(args: string | { id: string; state?: any; stacked?: boolean }, _state?: any): any {\n if (typeof args === \"string\") {\n return { id: args, state: _state };\n }\n return args;\n}\n\nexport const LayoutProvider = memo(function LayoutProvider(props: { children: ReactNode }) {\n const app = useApp();\n const emitter = useEmitter();\n const available = app.layout;\n\n const [state, dispatch] = useReducer(layoutReducer, undefined, getDefaultLayoutState);\n const actions = {\n centerPanel: usePanelActions(\"centerPanel\", dispatch),\n leftPanel: usePanelActions(\"leftPanel\", dispatch),\n rightPanel: usePanelActions(\"rightPanel\", dispatch),\n pinnedRightPanel: usePanelActions(\"pinnedRightPanel\", dispatch) as PinnablePanelActions,\n modal: usePanelActions(\"modal\", dispatch),\n editingStack: useEditingStack(),\n };\n\n function find(id: any) {\n const right = available.rightPanels.find((r) => r.id === id);\n if (right) {\n return [right, actions.rightPanel, actions.pinnedRightPanel] as const;\n }\n\n const center = available.centerPanels.find((r) => r.id === id);\n if (center) {\n return [center, actions.centerPanel] as const;\n }\n\n const left = available.leftPanels.find((r) => r.id === id);\n if (left) {\n return [left, actions.leftPanel] as const;\n }\n\n invariant(false, `Was not able to find panel with id \"${id}\"`);\n }\n\n function open(args: string | { id: string; state?: any; stacked?: boolean }, _state?: any): void {\n const { id, state, stacked } = parse(args, _state);\n const [found, actions, pinnable] = find(id);\n\n if (pinnable && found.options?.openPinned) {\n pinnable.pin({\n id,\n state: { ...(found.defaultState || {}), ...(state || {}) },\n });\n } else {\n const openData = {\n id,\n state: { ...(found.defaultState || {}), ...(state || {}) },\n stacked,\n };\n\n emitter.emit(\"layout.open\", openData);\n actions.open(openData);\n }\n }\n\n function stack(args: string | { id: string; state?: any }, _state?: any): void {\n const { id, state } = parse(args, _state);\n const [found, actions] = find(id);\n\n const openData = {\n id,\n state: { ...(found.defaultState || {}), ...(state || {}) },\n stacked: true,\n };\n\n emitter.emit(\"layout.open\", openData);\n actions.open(openData);\n }\n\n function change(args: string | { id: string; state?: any; stacked?: boolean }, _state?: any): void {\n const { id, state, stacked } = parse(args, _state);\n const [found, actions] = find(id);\n const changeData = {\n id,\n state: { ...(found.defaultState || {}), ...(state || {}) },\n stacked,\n };\n\n emitter.emit(\"layout.change\", changeData);\n actions.change(changeData);\n }\n\n function close(args: string | { id: string; state?: any }, _state?: any): void {\n const { id } = parse(args, _state);\n const [, actions] = find(id);\n\n emitter.emit(\"layout.close\", { id });\n actions.close();\n }\n\n function toggle(args: string | { id: string; state?: any }, _state?: any): void {\n const { id } = parse(args, _state);\n const [, actions] = find(id);\n\n emitter.emit(\"layout.toggle\", { id });\n actions.toggle();\n }\n\n function edit(\n resource: Reference | SpecificResource,\n context: Omit<EditableResource, \"resource\"> = {},\n {\n reset,\n property,\n stacked,\n forceOpen,\n }: {\n reset?: boolean;\n property?: string;\n stacked?: boolean | undefined;\n forceOpen?: boolean;\n } = {}\n ) {\n const toEdit: EditableResource = {\n resource: isSpecificResource(resource)\n ? resource\n : {\n type: \"SpecificResource\",\n source: resource,\n },\n ...context,\n };\n\n emitter.emit(\"layout.edit\", toEdit);\n actions.editingStack.edit(toEdit, reset);\n\n if (available.rightPanels.find((e) => e.id === \"@manifest-editor/editor\")) {\n if (forceOpen) {\n actions.rightPanel.open({\n id: \"@manifest-editor/editor\",\n stacked: stacked !== false,\n state: { property },\n unique: true,\n });\n } else {\n actions.rightPanel.change({\n id: \"@manifest-editor/editor\",\n stacked: stacked !== false,\n state: { property },\n unique: true,\n });\n }\n }\n }\n\n function create(resource: CreatableResource) {\n actions.editingStack.create(resource, {});\n emitter.emit(\"layout.create\", resource);\n if (available.modals?.find((e) => e.id === \"@manifest-editor/creator\")) {\n actions.modal.open({\n id: \"@manifest-editor/creator\",\n stacked: true,\n unique: true,\n state: resource,\n });\n } else if (available.rightPanels.find((e) => e.id === \"@manifest-editor/creator\")) {\n actions.rightPanel.open({\n id: \"@manifest-editor/creator\",\n stacked: true,\n unique: true,\n state: resource,\n });\n }\n }\n\n const otherActions = {\n open,\n change,\n close,\n toggle,\n stack,\n edit,\n create,\n };\n\n return (\n <LayoutActionsReactContext.Provider\n // biome-ignore lint/correctness/useExhaustiveDependencies: actions do not change\n value={useMemo(() => ({ ...actions, ...otherActions }), [available])}\n >\n <LayoutStateReactContext.Provider value={state}>{props.children}</LayoutStateReactContext.Provider>\n </LayoutActionsReactContext.Provider>\n );\n});\n","import { ImageServiceLoader } from \"@atlas-viewer/iiif-image-api\";\nimport { ErrorBoundary } from \"@manifest-editor/ui/atoms/ErrorBoundary\";\nimport { type ReactNode, useMemo } from \"react\";\nimport {\n AtlasStoreProvider,\n ImageServiceLoaderContext,\n} from \"react-iiif-vault\";\nimport { ThemeProvider } from \"styled-components\";\nimport {\n AppResourceProvider,\n type Resource,\n} from \"../AppResourceProvider/AppResourceProvider\";\nimport {\n type Config,\n ConfigProvider,\n useConfig,\n} from \"../ConfigContext/ConfigContext\";\nimport { ContextMenuProvider } from \"../ContextMenu/ContextMenuContext\";\nimport { EditingStack } from \"../EditingStack/EditingStack\";\nimport { LayoutProvider } from \"../Layout/Layout.context-internal\";\nimport { PreviewProvider } from \"../PreviewContext/PreviewContext\";\nimport type {\n Preview,\n PreviewConfiguration,\n} from \"../PreviewContext/PreviewContext.types\";\nimport { PreviewVaultContext } from \"../PreviewVault/PreviewVault\";\nimport { defaultTheme } from \"./default-theme\";\n\nconst previewConfigs: PreviewConfiguration[] = [\n {\n id: \"universal-viewer\",\n config: {\n url: \"https://universalviewer.dev/#?iiifManifestId={manifestId}\",\n },\n type: \"external-manifest-preview\",\n label: \"Universal viewer\",\n },\n {\n id: \"mirador-3\",\n type: \"external-manifest-preview\",\n label: \"Mirador 3\",\n config: {\n url: \"https://tomcrane.github.io/scratch/mirador3/?iiif-content={manifestId}\",\n },\n },\n {\n id: \"annona\",\n type: \"external-manifest-preview\",\n label: \"Annona\",\n config: {\n url: \"https://ncsu-libraries.github.io/annona/tools/#/display?url={manifestId}&viewtype=iiif-storyboard&settings=%7B%22fullpage%22%3Atrue%7D\",\n },\n },\n {\n id: \"iiif-preview\",\n config: { url: \"https://iiif-preview.digirati.services/store\" },\n type: \"iiif-preview-service\",\n label: \"IIIF Preview\",\n },\n];\n\nconst imageServiceLoader = new ImageServiceLoader({\n approximateServices: true,\n verificationsRequired: 8,\n enableFetching: true,\n});\n\nexport function ShellProvider({\n config,\n saveConfig,\n children,\n theme,\n previews,\n resource,\n editing,\n}: {\n resource: Resource;\n config?: Partial<Config>;\n saveConfig?: (config: Partial<Config>) => void;\n children: ReactNode;\n theme?: any;\n previews?: Preview[];\n editing?: { id: string; type: string };\n}) {\n const existingConfig = useConfig();\n const mergedConfig = useMemo(() => {\n return {\n ...existingConfig,\n ...config,\n previews: config?.previews || existingConfig.previews || previewConfigs,\n };\n }, [existingConfig, config]);\n\n return (\n <ErrorBoundary>\n <ImageServiceLoaderContext.Provider value={imageServiceLoader}>\n <AppResourceProvider resource={resource}>\n <PreviewVaultContext>\n <ThemeProvider theme={theme || defaultTheme}>\n <ConfigProvider config={mergedConfig} saveConfig={saveConfig}>\n <EditingStack>\n <LayoutProvider>\n <ContextMenuProvider>\n {/* @todo swap these out for (config?.previews || []) */}\n <PreviewProvider\n previews={previews || []}\n configs={mergedConfig.previews}\n >\n <AtlasStoreProvider>{children}</AtlasStoreProvider>\n </PreviewProvider>\n </ContextMenuProvider>\n </LayoutProvider>\n </EditingStack>\n </ConfigProvider>\n </ThemeProvider>\n </PreviewVaultContext>\n </AppResourceProvider>\n </ImageServiceLoaderContext.Provider>\n </ErrorBoundary>\n );\n}\n","// TaskBridge.\nimport mitt, { Emitter } from \"mitt\";\nimport { createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useReducer } from \"react\";\n\ninterface Task<Req = any, Res = any> {\n name: string;\n status: \"idle\" | \"running\" | \"complete\" | \"error\";\n emitter: Emitter<any>;\n promise: Promise<any>;\n abort: AbortController;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n error?: string;\n request?: Req;\n response?: Res;\n}\n\nconst tempGlobalState: Record<string, Record<string, Task>> = {};\n\nconst DispatchReactContext = createContext<string>(\"global\");\n\nfunction useCurrentDispatchId() {\n return useContext(DispatchReactContext);\n}\n\nfunction createDeferred() {\n let res: (value: any) => void = undefined as any;\n let rej: (reason?: any) => void = undefined as any;\n const promise = new Promise((resolve, reject) => {\n res = resolve;\n rej = reject;\n });\n\n return { promise, resolve: res, reject: rej };\n}\n\nexport function useTask(name: string) {\n const id = useCurrentDispatchId();\n const [, invalidate] = useReducer((r) => r + 1, 0);\n const task = useMemo(() => {\n if (!tempGlobalState[id]) {\n tempGlobalState[id] = {};\n }\n if (!tempGlobalState[id]![name]) {\n tempGlobalState[id]![name] = {\n name,\n emitter: mitt(),\n status: \"idle\",\n promise: Promise.resolve(),\n abort: new AbortController(),\n reject: () => void 0,\n resolve: () => void 0,\n };\n }\n\n return tempGlobalState[id]![name]!;\n }, [id, name]);\n\n useTaskEvent(task, \"abort\", invalidate);\n useTaskEvent(task, \"error\", invalidate);\n useTaskEvent(task, \"complete\", invalidate);\n useTaskEvent(task, \"running\", invalidate);\n\n return task;\n}\n\nexport function useTaskEvent<Req = any, Res = any>(\n task: Task<Req, Res>,\n name: string,\n _cb: (task: Task<Req, Res>) => any\n) {\n const cb = useCallback(() => _cb(task), [_cb]);\n useEffect(() => {\n const em = task.emitter;\n em.on(name, cb);\n return () => em.off(name, cb);\n }, [name, cb, task.emitter]);\n}\n\nconst noop = () => void 0;\n\nexport function useTaskDispatch<Req = any, Res = any>(\n name: string,\n onComplete?: (task: Task<Req, Res>) => void | Promise<void>\n) {\n const taskDetails = useTask(name);\n\n useTaskEvent(taskDetails, \"complete\", onComplete ? onComplete : noop);\n\n const runTask = (request?: any) => {\n // Abort running tasks.\n if (taskDetails.status === \"running\") {\n taskDetails.abort.abort();\n taskDetails.emitter.emit(\"abort\");\n }\n\n // Error clearing.\n if (taskDetails.error) {\n taskDetails.error = \"\";\n }\n\n // Creating new task.\n const d = createDeferred();\n d.promise.then(() => taskDetails.emitter.emit(\"complete\")).catch(() => taskDetails.emitter.emit(\"error\"));\n taskDetails.status = \"running\";\n taskDetails.request = request;\n taskDetails.promise = d.promise;\n taskDetails.resolve = d.resolve;\n taskDetails.reject = d.reject;\n taskDetails.emitter.emit(\"running\");\n };\n\n return [runTask, taskDetails] as const;\n}\n\nexport function useTaskRunner<Req = any, Res = any>(\n name: string,\n onRun: (task: Task<Req, Res>) => void | Promise<void>\n) {\n const taskDetails = useTask(name);\n\n useTaskEvent(taskDetails, \"running\", onRun);\n\n const completeTask = (response?: any) => {\n if (taskDetails.status === \"running\") {\n taskDetails.response = response;\n taskDetails.status = \"complete\";\n taskDetails.resolve();\n }\n //\n };\n\n const rejectTask = (reason?: any, error?: any) => {\n if (taskDetails.status === \"running\") {\n taskDetails.error = error || reason;\n taskDetails.status = \"error\";\n taskDetails.reject(reason);\n }\n };\n\n return [completeTask, taskDetails, rejectTask] as const;\n}\n\nexport function TaskBridge({ children }: { children?: ReactNode }) {\n return (\n <DispatchReactContext.Provider value={useMemo(() => `id-${Date.now()}`, [])}>\n {children}\n </DispatchReactContext.Provider>\n );\n}\n","import { HTMLAttributes, useCallback, useMemo } from \"react\";\nimport { UniversalCopyPasteProps } from \"./UniversalCopyPaste.types\";\n\n// @todo\nfunction analyse(t: any) {\n return false;\n}\n\nexport function UniversalCopyTarget<T>({\n as,\n reference: _ref,\n onReference,\n onLink,\n onAnalysis,\n onDropReference: _onDropReference,\n onDropLink: _onDropLink,\n onDropAnalysis: _onDropAnalysis,\n onPasteReference: _onPasteReference,\n onPasteLink: _onPasteLink,\n onPasteAnalysis: _onPasteAnalysis,\n ...props\n}: Partial<HTMLAttributes<HTMLElement>> & UniversalCopyPasteProps<T> & T) {\n // const vault = useVault();\n const Component = (as || \"div\") as any;\n\n const onDropReference = _onDropReference || onReference;\n const onDropLink = _onDropLink || onLink;\n const onDropAnalysis = _onDropAnalysis || onAnalysis;\n const onPasteReference = _onPasteReference || onReference;\n const onPasteLink = _onPasteLink || onLink;\n const onPasteAnalysis = _onPasteAnalysis || onAnalysis;\n\n const reference = useMemo(() => {\n return _ref;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_ref?.id, _ref?.type]);\n\n const onCopy = useCallback(\n function onCopy(e: ClipboardEvent) {\n if (e.defaultPrevented) {\n return;\n }\n e.preventDefault();\n if (e.clipboardData) {\n if (reference && reference.id && reference.type) {\n // const full = vault.get(reference);\n // if (full) {\n // e.clipboardData.setData(\"application/json\", JSON.stringify(vault.toPresentation3(vault.get(reference))));\n // }\n\n e.clipboardData.setData(\n \"application/json+vault\",\n JSON.stringify({\n id: reference.id,\n type: reference.type,\n })\n );\n }\n }\n },\n [reference]\n );\n\n const onPaste = useCallback(async function onPaste(e: ClipboardEvent) {\n if (e.defaultPrevented) {\n return;\n }\n e.preventDefault();\n if (e.clipboardData) {\n if (props.onLoading) {\n props.onLoading();\n }\n\n if (onPasteReference) {\n const data = e.clipboardData.getData(\"application/json+vault\");\n if (data) {\n try {\n const dataAsJson = JSON.parse(data);\n if (dataAsJson && dataAsJson.id && dataAsJson.type) {\n onPasteReference(dataAsJson);\n }\n } catch (e) {\n // ignore.\n }\n }\n }\n\n if (onPasteLink || onPasteAnalysis) {\n const data = e.clipboardData.getData(\"text\");\n if (data.startsWith(\"http\")) {\n const allLinks = data.split(\"\\n\");\n for (const link of allLinks) {\n if (onPasteAnalysis) {\n try {\n const result = await analyse(link);\n if (result) {\n onPasteAnalysis(result);\n continue;\n }\n } catch (e) {\n // let it fallback to onPasteLink\n }\n }\n if (onPasteLink) {\n onPasteLink(link);\n }\n }\n }\n }\n if (props.onComplete) {\n props.onComplete();\n }\n }\n }, []);\n\n // @todo not working..\n const onDragStart = useCallback(function onPaste(e: DragEvent) {\n if (e.defaultPrevented) {\n return;\n }\n e.preventDefault();\n if (e.dataTransfer && props.draggable) {\n e.dataTransfer.effectAllowed = \"all\";\n\n if (reference && reference.id && reference.type) {\n e.dataTransfer.setData(\n \"application/json+vault\",\n JSON.stringify({\n id: reference.id,\n type: reference.type,\n })\n );\n }\n }\n }, []);\n\n const onDrop = useCallback(async function onDrop(e: DragEvent) {\n e.preventDefault();\n if (e.dataTransfer) {\n if (onDropReference) {\n const data = e.dataTransfer.getData(\"application/json+vault\");\n if (data) {\n try {\n const dataAsJson = JSON.parse(data);\n if (dataAsJson && dataAsJson.id && dataAsJson.type) {\n onDropReference(dataAsJson, e);\n }\n } catch (e) {\n // ignore.\n return;\n }\n }\n }\n const json = e.dataTransfer.getData(\"application/json\");\n if (json) {\n const parsed = JSON.parse(json);\n // @todo this could be raw JSON or a Content State.\n return;\n }\n const link = e.dataTransfer.getData(\"text/plain\");\n if (link) {\n // console.log(\"link\", link);\n return;\n }\n }\n }, []);\n\n const onDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = \"copy\";\n }\n }, []);\n\n return (\n <Component\n onCopy={onCopy}\n onPaste={onPaste}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onDragStart={onDragStart}\n tabIndex={-1}\n {...props}\n />\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["DEFAULT_CONFIG: Config","resolvedConfig: Config","config","Container","Header","IconButton","CloseIcon: React.FC<{\n inline?: boolean;\n height?: number;\n className?: string;\n}>","VaultProvider","ManifestContext","CollectionContext","map: Record<string, PreviewHandler>","providesMap: Record<string, string>","providesMap","context: any","handlers: PreviewHandler[]","PreviewProvider","context: PreviewContext","DownloadButton","config","AppHeader","Header","Container","ManifestEditorLogo","AtlasStoreReactContext","IIIFVault","e: any","responseData: ManifestNormalized | undefined","BackIcon: React.FC<{ style?: any }>","PaddedSidebarContainer","ErrorMessage","ReactVaultContext","ErrorBoundary","Vault","toDispatch: any","Vault","VaultProvider","create","Creator","RenderCreator","options: CreatorOptions","err: any","ErrorMessage","Spinner","EmptyState","ActionButton","Suspense","ModalBackSlot","IconButton","GridIcon","CreatorGrid","baseCreator: LayoutPanel","defaultState: EditingStackState","EditorInstance","defaultState","create","sortKeys: string[]","sortKeyFallbacks: Record<string, EditorDefinition>","ResourceReactContext","resourceConfig: EditorConfig","resource","SidebarTabs","baseEditor: LayoutPanel","Tabs","TabList","Tab","TabPanel","ThemeProvider","Sidebar","SidebarHeader","SidebarContent","Form","ActionButton","seenIds: string[]","sectionMap: Record<string, ContextMenuItem[]>","emptySections: ContextMenuItem[]","returnSections: Array<{ sectionTitle?: string; items: Array<ContextMenuItem> }>","$","noop","onKeyDown: KeyboardEventHandler<HTMLDivElement>","AccordionItem","onScroll: UIEventHandler<HTMLDivElement>","getValue","HandleControls","Tooltip","TooltipTrigger","DefaultTooltipContent","IconHandle","ResetIcon","ResizeHandle","$","CenterPanel","LeftPanel","PanelSideMenu","Layout","ReactVaultContext","Fragment","L.PanelContainer","L.PanelContent","L.PanelMenu","Modal","ErrorBoundary","L.OuterWrapper","L.Header","L.Main","M.Container","M.CenterPanel","M.MobileBar","M.LeftBarButton","M.DrawerContainer","M.DrawerButton","M.PreviewBarButton","M.DrawerBody","M.LeftPanel","M.Lightbox","PanelSideMenu","Transition","L.LeftPanel","L.CenterPanel","L.RightPanel","L.Footer","Component","LayoutProvider","actions","state","toEdit: EditableResource","create","previewConfigs: PreviewConfiguration[]","ImageServiceLoader","ImageServiceLoaderContext","ThemeProvider","AtlasStoreProvider","tempGlobalState: Record<string, Record<string, Task>>","res: (value: any) => void","rej: (reason?: any) => void","analyse","Component","onCopy","onPaste","e"],"sources":["../../../node_modules/.pnpm/tiny-invariant@1.3.3/node_modules/tiny-invariant/dist/esm/tiny-invariant.js","../src/ConfigContext/ConfigContext.tsx","../src/AppContext/AppContext.tsx","../src/AppContext/MultiAppContext.tsx","../src/AppHeader/AppHeader.styles.ts","../../ui/icons/CloseIcon.tsx","../../ui/icons/DownIcon.tsx","../src/AppResourceProvider/AppResourceProvider.tsx","../src/PreviewContext/previews/ExternalManifestUrlPreview.ts","../src/PreviewContext/previews/IIIFPreviewService.ts","../src/PreviewContext/PreviewContext.hooks.ts","../src/PreviewContext/PreviewContext.reducer.ts","../src/PreviewContext/PreviewContext.tsx","../../ui/atoms/Button.tsx","../src/PreviewButton/PreviewButton.styles.ts","../src/PreviewButton/PreviewButton.tsx","../src/AppHeader/AppHeader.tsx","../src/AppMenu/AppMenuContext.tsx","../src/AtlasStore/AtlasStoreProvider.tsx","../src/AtlasStore/polygon-to-bounding-box.ts","../src/analysis.ts","../src/helpers.ts","../src/highlighted-image-resources.ts","../../ui/icons/StarIcon.tsx","../../ui/icons/BackIcon.tsx","../src/Layout/Layout.context.tsx","../src/Layout/components/PanelError.tsx","../src/Layout/Layout.helpers.ts","../../ui/atoms/Dropdown.tsx","../src/Layout/components/ModularPanel.tsx","../src/PreviewVault/create-preview-vault.ts","../src/PreviewVault/PreviewVault.tsx","../src/BaseCreator/BaseCreator.hooks.tsx","../src/BaseCreator/BaseCreator.tsx","../src/BaseCreator/index.tsx","../src/EditingStack/EditingStack.reducer.ts","../src/EditingStack/EditingStack.tsx","../src/BaseEditor/BaseEditor.tsx","../src/BaseEditor/index.tsx","../src/ShellContext/default-theme.ts","../src/BaseCreator/BaseAnnotationCreator.tsx","../src/hooks/use-decay-state.ts","../src/ConfigContext/ConfigEditor.tsx","../src/ContextMenu/ContextMenuContext.tsx","../../ui/ui/CenterPanelContainer/CenterPanelContainer.module.css","../../ui/ui/CenterPanelContainer/CenterPanelContainer.tsx","../../ui/atoms/Accordion.tsx","../../ui/icons/DownloadIcon.tsx","../../ui/atoms/ButtonRow.tsx","../src/ExportPanel/ExportPanel.tsx","../src/hooks/use-event.tsx","../src/hooks/use-match-media.ts","../src/hooks/use-save-vault.ts","../src/hooks/use-svg-tools.tsx","../src/hooks/use-annotation-creator-state.ts","../src/Layout/components/HandleControls.tsx","../../ui/madoc/components/icons/Spinner.tsx","../../ui/ui/GhostBlocks/GhostBlocks.module.css","../../ui/ui/GhostBlocks/GhostBlocks.tsx","../../ui/madoc/use-event-handler.ts","../src/Layout/components/use-resize-layouts.tsx","../src/Layout/Layout.mobile.tsx","../src/Layout/Layout.styles.ts","../src/Layout/Layout.tsx","../src/Layout/Layout.hooks.ts","../src/Layout/Layout.reducer.ts","../src/ResourceEditingContext/ResourceEditingContext.tsx","../../ui/atoms/ErrorBoundary.tsx","../src/Layout/Layout.context-internal.tsx","../src/ShellContext/ShellContext.tsx","../src/TaskBridge/TaskBridge.tsx","../src/Universal/UniversalCopyPaste.tsx"],"sourcesContent":["var isProduction = process.env.NODE_ENV === 'production';\nvar prefix = 'Invariant failed';\nfunction invariant(condition, message) {\n if (condition) {\n return;\n }\n if (isProduction) {\n throw new Error(prefix);\n }\n var provided = typeof message === 'function' ? message() : message;\n var value = provided ? \"\".concat(prefix, \": \").concat(provided) : prefix;\n throw new Error(value);\n}\n\nexport { invariant as default };\n","import type { Collection } from \"@iiif/presentation-3\";\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport type { PreviewConfiguration } from \"../PreviewContext/PreviewContext.types\";\n\nexport interface Config {\n // Previous configuration.\n previews: PreviewConfiguration[];\n behaviorPresets: string[];\n newTemplates: Collection | null;\n\n defaultPreview: string | null;\n\n editorConfig: {\n All?: EditorConfig;\n Manifest?: EditorConfig;\n Canvas?: EditorConfig;\n Annotation?: EditorConfig;\n AnnotationPage?: EditorConfig;\n AnnotationCollection?: EditorConfig;\n Range?: EditorConfig;\n Collection?: EditorConfig;\n ContentResource?: EditorConfig;\n // Collection inside collection.\n EmbeddedCollection?: EditorConfig;\n };\n\n editorFeatureFlags: {\n enableMultiImageCanvases?: boolean;\n enableMultiMediaCanvases?: boolean;\n rememberCanvasId?: boolean;\n rememberLeftPanelId?: boolean;\n annotationPopups?: boolean;\n manifestGridOptions?: boolean;\n };\n\n // Internationalisation options\n i18n: {\n defaultLanguage: string;\n availableLanguages: string[];\n advancedLanguageMode: boolean;\n textGranularityEnabled?: boolean;\n };\n\n // Options when exporting from Vault.\n export: {\n baseIdentifier: string | null;\n version: 3 | 2;\n };\n\n uploadBackends: Array<UploadBackendConfig>;\n}\n\nexport interface EditorConfig {\n singleTab?: string;\n fields?: string[];\n hideTabs?: string[];\n onlyTabs?: string[];\n}\n\nexport interface UploadBackendConfig {\n id: string;\n label: string;\n resourceTypes: string[];\n canUpload?: () => Promise<boolean>;\n upload: (resource: File) => Promise<{ id: string; type: string }> | null;\n}\n\nconst DEFAULT_CONFIG: Config = {\n previews: [],\n behaviorPresets: [\n \"auto-advance\",\n \"no-auto-advance\",\n \"repeat\",\n \"no-repeat\",\n \"unordered\",\n \"individuals\",\n \"continuous\",\n \"paged\",\n \"non-paged\",\n \"facing-pages\",\n \"multi-part\",\n \"together\",\n \"sequence\",\n \"thumbnail-nav\",\n \"no-nav\",\n \"hidden\",\n ],\n defaultPreview: null,\n editorConfig: {},\n newTemplates: null,\n i18n: {\n advancedLanguageMode: false,\n availableLanguages: [\"en\", \"cy\", \"nl\", \"fr\"],\n defaultLanguage: \"en\",\n },\n editorFeatureFlags: {\n enableMultiImageCanvases: true,\n enableMultiMediaCanvases: true,\n annotationPopups: false,\n rememberCanvasId: true,\n manifestGridOptions: false,\n rememberLeftPanelId: false,\n },\n uploadBackends: [],\n export: {\n baseIdentifier: null,\n version: 3,\n },\n};\n\nexport const ConfigReactContext = createContext<Config>(DEFAULT_CONFIG);\nexport const SaveConfigReactContext = createContext<\n (config: Partial<Config>) => void\n>(() => {});\n\nexport function useConfig() {\n return useContext(ConfigReactContext);\n}\n\nexport function useSaveConfig() {\n return useContext(SaveConfigReactContext);\n}\n\nexport function ConfigProvider({\n children,\n config,\n saveConfig,\n}: {\n children: ReactNode;\n config?: Partial<Config>;\n saveConfig?: (config: Partial<Config>) => void;\n}) {\n const [runtimeConfig, setRuntimeConfig] = useState<Partial<Config> | null>(\n null,\n );\n const resolvedConfig: Config = useMemo(\n () => ({\n ...DEFAULT_CONFIG,\n ...(config || {}),\n ...(runtimeConfig || {}),\n editorFeatureFlags: {\n ...DEFAULT_CONFIG.editorFeatureFlags,\n ...(config?.editorFeatureFlags || {}),\n ...runtimeConfig?.editorFeatureFlags,\n },\n }),\n [config, runtimeConfig],\n );\n\n const memoSaveConfig = useCallback(\n (config: Partial<Config>) => {\n setRuntimeConfig(config);\n if (saveConfig) {\n saveConfig(config);\n }\n },\n [config],\n );\n\n return (\n <SaveConfigReactContext.Provider value={memoSaveConfig}>\n <ConfigReactContext.Provider value={resolvedConfig}>\n {children}\n </ConfigReactContext.Provider>\n </SaveConfigReactContext.Provider>\n );\n}\n","import type { CreatorDefinition } from \"@manifest-editor/creator-api\";\nimport { useLocalStorage } from \"../hooks/use-local-storage\";\nimport { createContext, type ReactNode, type SetStateAction, useCallback, useContext, useEffect, useMemo } from \"react\";\nimport invariant from \"tiny-invariant\";\nimport { type Config, ConfigProvider } from \"../ConfigContext/ConfigContext\";\nimport type {\n AnnotationPanel,\n BackgroundPanel,\n CanvasEditorDefinition,\n EditorDefinition,\n LayoutPanel,\n LayoutProps,\n} from \"../Layout/Layout.types\";\n\nexport type AppContext = {\n instanceId: string;\n appId: string;\n args?: any;\n};\n\nexport type LoadedApp = Partial<LayoutProps> & {\n config?: Partial<Config>;\n default: {\n id: string;\n title: string;\n type?: \"manifest\" | \"launcher\";\n project?: boolean;\n projectType?: \"Manifest\" | \"Collection\";\n dev?: boolean;\n desktop?: boolean;\n web?: boolean;\n drafts?: boolean;\n };\n};\n\nexport type MappedApp = {\n metadata: LoadedApp[\"default\"];\n layout: LayoutProps;\n config?: Partial<Config>;\n};\n\nexport interface AppExtension {\n config?: Partial<Config>;\n leftPanels?: LayoutPanel[];\n centerPanels?: LayoutPanel[];\n rightPanels?: LayoutPanel[];\n modalPanels?: LayoutPanel[];\n editors?: EditorDefinition[];\n creators?: CreatorDefinition[];\n canvasEditors?: CanvasEditorDefinition[];\n annotations?: AnnotationPanel[];\n background?: BackgroundPanel[];\n // Config.\n leftPanelIds?: string[];\n\n // Side-effects.\n disableSideEffects?: string[];\n}\n\nexport type AppState = { state: null | any; setState: SetStateAction<any> };\n\nexport const PrimeAppReactContext = createContext<MappedApp | null>(null);\nexport const AppReactContext = createContext<AppContext | null>(null);\nexport const AppStateReactContext = createContext<{\n state: null | any;\n setState: SetStateAction<any>;\n}>({\n state: null,\n setState: () => {\n // no-op\n },\n});\n\nexport function useAppInstance() {\n const ctx = useContext(AppReactContext);\n invariant(ctx, \"Hook useAppInstance must be used inside <AppProvider />\");\n\n return ctx;\n}\n\nexport function useApp() {\n const app = useContext(PrimeAppReactContext);\n\n invariant(app, \"Hook useApp must be used inside <AppProvider />\");\n\n return app;\n}\n\nexport function useAppState<S = any>() {\n return useContext(AppStateReactContext);\n}\n\nfunction AppStateProvider(props: {\n instanceId: string;\n appId: string;\n initialState?: any;\n args?: any;\n children: ReactNode;\n}) {\n const [state, _setState, stateRef] = useLocalStorage(\n `app-state/${props.appId}/${props.instanceId}`,\n props.initialState || {},\n );\n\n const setState = useCallback((partial: any) => {\n const existing = stateRef.current ? JSON.parse(stateRef.current || \"{}\") : {};\n const partialState = (typeof partial === \"function\" ? partial(existing) : partial) || {};\n\n _setState({\n ...existing,\n ...partialState,\n });\n }, []);\n\n useEffect(() => {\n if (props.args) {\n setState(props.args);\n }\n }, [props.appId]);\n\n const ctx = useMemo(() => ({ state: state || {}, setState }), [setState, state]);\n\n return <AppStateReactContext.Provider value={ctx}>{props.children}</AppStateReactContext.Provider>;\n}\n\nexport function AppProvider({\n instanceId,\n appId,\n args,\n definition,\n children,\n initialState,\n}: {\n initialState?: any;\n instanceId: string;\n appId: string;\n args?: any;\n definition: MappedApp;\n children: ReactNode;\n}) {\n const ctx = useMemo(() => ({ instanceId, appId, args }), [instanceId, appId, args]);\n const _initialState = useMemo(() => initialState || {}, [instanceId]);\n\n // Current App is now put in the \"Prime\" context.\n return (\n <ConfigProvider config={definition.config || {}}>\n <PrimeAppReactContext.Provider value={definition}>\n <AppReactContext.Provider value={ctx}>\n <AppStateProvider instanceId={ctx.instanceId} appId={ctx.appId} args={ctx.args} initialState={_initialState}>\n {children}\n </AppStateProvider>\n </AppReactContext.Provider>\n </PrimeAppReactContext.Provider>\n </ConfigProvider>\n );\n}\n","import { createContext, ReactNode, useContext, useMemo } from \"react\";\nimport invariant from \"tiny-invariant\";\nimport { useOptionalLocalStorage } from \"@manifest-editor/components\";\nimport { AppProvider } from \"./AppContext\";\n\ntype MappedApp = any;\n\nexport type MultiAppContext = {\n apps: Record<string, MappedApp>;\n currentApp: { id: string; args?: any };\n initialApp: { id: string; args?: any };\n changeApp: (app: { id: string; args?: any }) => void;\n changeProjectType: (type: \"Manifest\" | \"Collection\") => void;\n};\n\nconst MultiAppContext = createContext<MultiAppContext | null>(null);\n\nexport function useApps() {\n const ctx = useContext(MultiAppContext);\n\n invariant(ctx, \"Hook useApps must be used inside <MultiAppProvider />\");\n\n return ctx;\n}\n\nfunction useCurrentApp(\n initialApp?: { id: string; args?: any },\n enableLocalStorage = false,\n) {\n const [currentApp, changeApp] = useOptionalLocalStorage(\n \"SelectedApplication\",\n initialApp || { id: \"splash\" },\n !enableLocalStorage,\n );\n\n return [currentApp, changeApp] as const;\n}\n\nexport function MultiAppProvider({\n apps,\n initialApp,\n saveCurrentApp = true,\n instanceId,\n children,\n config = {},\n}: {\n apps: Record<string, MappedApp>;\n initialApp?: MultiAppContext[\"currentApp\"];\n saveCurrentApp?: boolean;\n instanceId: string;\n children: ReactNode;\n config?: {\n defaultApp?: string;\n manifestApp?: string;\n collectionApp?: string;\n };\n}) {\n const {\n defaultApp = \"splash\",\n collectionApp = \"collection-editor\",\n manifestApp = \"manifest-editor\",\n } = config;\n const [currentApp, changeApp] = useCurrentApp(initialApp, saveCurrentApp);\n\n const changeProjectType = (type: \"Manifest\" | \"Collection\") => {\n if (type === \"Manifest\") {\n changeApp({ id: manifestApp });\n }\n if (type === \"Collection\") {\n changeApp({ id: collectionApp });\n }\n };\n\n const ctx = useMemo<MultiAppContext>(\n () => ({\n currentApp: currentApp || { id: defaultApp },\n initialApp: initialApp || { id: defaultApp },\n apps,\n changeApp,\n changeProjectType,\n }),\n [initialApp, apps, currentApp],\n );\n\n const currentFullApp = apps[ctx.currentApp.id];\n if (!currentApp || !currentFullApp) {\n return null;\n }\n\n // Current App is now put in the \"Prime\" context.\n return (\n <AppProvider\n appId={currentApp.id}\n definition={currentFullApp}\n instanceId={currentApp.id + instanceId}\n args={currentApp.args}\n >\n <MultiAppContext.Provider value={ctx}>\n {children}\n </MultiAppContext.Provider>\n </AppProvider>\n );\n}\n","import styled from \"styled-components\";\nimport { SmallButton } from \"@manifest-editor/ui/atoms/Button\";\n\nexport const Container = styled.div`\n display: flex;\n align-items: center;\n height: 3em;\n padding: 0.5em;\n`;\n\nexport const Header = styled.div`\n display: flex;\n padding: 0.25em;\n flex-direction: column;\n`;\n\nexport const IconButton = styled.button`\n height: 1.75em;\n width: 1.75em;\n background: #e9e9e9;\n border-radius: 3px;\n display: flex;\n text-align: center;\n align-items: center;\n font-size: 1.1em;\n border: none;\n justify-content: center;\n\n &:focus {\n background: #e94581;\n color: #fff;\n svg {\n fill: #fff;\n }\n }\n`;\n\nexport const Spacer = styled.div`\n flex: 1;\n`;\n\nexport const Logo = styled.div`\n color: #6e6e6e;\n display: flex;\n align-items: center;\n margin-left: 1em;\n font-weight: bold;\n text-rendering: geometricPrecision;\n letter-spacing: -0.5px;\n user-select: none;\n cursor: pointer;\n margin-right: 0.5em;\n`;\n\nexport const ProjectPreview = styled.div`\n margin: 0 auto;\n padding: 3px;\n background: #f4f4f4;\n border: 1px solid #e0e0e0;\n border-radius: 5px;\n width: 26em;\n display: flex;\n flex-direction: row;\n\n @media (max-width: 450px) {\n display: none;\n }\n`;\n\nexport const ContextButton = styled.button`\n background: #e7fff4;\n border: 1px solid #c5e3cd;\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n border-radius: 4px;\n color: #666666;\n padding: 0.35em 0.7em;\n letter-spacing: -0.42px;\n`;\n","export const CloseIcon: React.FC<{\n inline?: boolean;\n height?: number;\n className?: string;\n}> = ({ height = 16 }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" height={height} viewBox=\"0 0 24 24\" width=\"24px\" fill=\"currentColor\">\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n","import { SVGProps } from \"react\";\n\nexport const DownIcon = ({ rotate = 0, ...props }: SVGProps<SVGSVGElement>) => (\n <svg\n version=\"1.2\"\n xmlns=\"http://www.w3.org/2000/svg\"\n overflow=\"visible\"\n preserveAspectRatio=\"none\"\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n style={{\n fill: \"rgba(0, 0, 0, 0.6)\",\n transform: `rotate(${rotate}deg)`,\n transition: \"transform 0.2s\",\n }}\n {...props}\n >\n <path\n d=\"M8.12 9.29 12 13.17l3.88-3.88a.996.996 0 1 1 1.41 1.41l-4.59 4.59a.996.996 0 0 1-1.41 0L6.7 10.7a.996.996 0 0 1 0-1.41c.39-.38 1.03-.39 1.42 0z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import { createContext, useContext } from \"react\";\nimport { CollectionContext, ManifestContext, VaultProvider, useExistingVault } from \"react-iiif-vault\";\nimport invariant from \"tiny-invariant\";\n\nexport interface Resource {\n id: string;\n type: string;\n}\n\nconst AppResourceReactProvider = createContext<Resource | null>(null);\nconst AppResourceInstanceReactProvider = createContext<string | null>(null);\n\nexport function useAppResourceInstance() {\n const ctx = useContext(AppResourceInstanceReactProvider);\n const resource = useContext(AppResourceReactProvider);\n\n const instanceId = ctx || resource?.id;\n\n invariant(instanceId, \"useResourceInstance can only be called from inside <ResourceProvider />\");\n\n return instanceId;\n}\n\nexport function useAppResource() {\n const ctx = useContext(AppResourceReactProvider);\n\n invariant(ctx, \"useResource can only be called from inside <ResourceProvider />\");\n\n return ctx;\n}\n\nexport function AppResourceInstanceProvider({ id, children }: { id?: string; children: React.ReactNode }) {\n if (!id) {\n return children;\n }\n return <AppResourceInstanceReactProvider.Provider value={id}>{children}</AppResourceInstanceReactProvider.Provider>;\n}\n\nexport function AppResourceProvider({ resource, children }: { resource?: Resource; children: React.ReactNode }) {\n const vault = useExistingVault();\n\n let inner = children;\n\n if (resource && resource.type === \"Manifest\") {\n inner = (\n <VaultProvider vault={vault || undefined}>\n <ManifestContext manifest={resource.id || \"\"}>{children}</ManifestContext>\n </VaultProvider>\n );\n }\n\n if (resource && resource.type === \"Collection\") {\n inner = (\n <VaultProvider vault={vault || undefined}>\n <CollectionContext collection={resource.id || \"\"}>{children}</CollectionContext>\n </VaultProvider>\n );\n }\n\n return <AppResourceReactProvider.Provider value={resource as any}>{inner}</AppResourceReactProvider.Provider>;\n}\n","import type { Vault } from \"@iiif/helpers/vault\";\nimport type { Preview, PreviewHandler } from \"../PreviewContext.types\";\n\nexport class ExternalManifestUrlPreview implements PreviewHandler {\n id: string;\n label: string;\n type = \"external-manifest-preview\";\n focusable = true;\n\n private readonly serviceUrl: string;\n private readonly windows: Record<string, { location: string; window: Window | null }> = {};\n\n constructor({ id, config, label }: { id: string; type?: string; label: string; config: { url: string } }) {\n this.id = id;\n this.label = label;\n this.serviceUrl = config.url;\n }\n\n isPreviewValid(instanceId: string): boolean {\n const current = this.windows[instanceId];\n if (current && current.window && !current.window.closed) {\n return true;\n }\n\n return false;\n }\n\n getRequires(): string[] {\n return [\"readOnlyManifest\"];\n }\n\n getProvides(): string[] {\n return [];\n }\n\n async createPreview(\n instanceId: string,\n resource: { id: string; type: string },\n vault: Vault,\n ctx: { readOnlyManifest: string },\n ): Promise<Preview> {\n // @todo change this to be a template, with more features.\n const location = `${this.serviceUrl}`\n .replace(/\\{manifestId}/, ctx.readOnlyManifest)\n .replace(/\\{time}/, `${Date.now()}`);\n const opened = window.open(location, this.id);\n\n this.windows[instanceId] = { location, window: opened };\n\n return {\n id: this.id,\n type: \"external-manifest-preview\",\n data: { url: location },\n };\n }\n\n async focus(instanceId: string) {\n const found = this.windows[instanceId];\n\n if (found && found.window) {\n found.window.focus();\n }\n }\n\n async updatePreview(\n instanceId: string,\n resource: { id: string; type: string },\n vault: Vault,\n ctx: { readOnlyManifest: string },\n ): Promise<Preview | null> {\n const found = this.windows[instanceId];\n\n if (found) {\n try {\n found.window?.close();\n } catch {}\n }\n\n return this.createPreview(instanceId, resource, vault, ctx);\n }\n\n async deletePreview(id: string): Promise<void> {\n const found = this.windows[id];\n if (found && found.window) {\n found.window.close();\n delete this.windows[id];\n }\n }\n}\n","import { Vault } from \"@iiif/helpers/vault\";\nimport { Preview, PreviewConfiguration, PreviewHandler } from \"../PreviewContext.types\";\nimport invariant from \"tiny-invariant\";\n\ntype IIIFPreviewResponse = {\n location: string;\n updateLocation?: string;\n deleteLocation?: string;\n expirationTtl: number;\n};\n\nexport class IIIFPreviewService implements PreviewHandler {\n id: string;\n label: string;\n type = \"iiif-preview-service\";\n focusable = false;\n\n private readonly serviceUrl: string;\n private readonly cache: Record<string, IIIFPreviewResponse & { time: number }> = {};\n\n constructor({ id, config, label }: PreviewConfiguration<{ url: string }>) {\n this.id = id;\n this.label = label;\n this.serviceUrl = config.url;\n }\n\n getRequires(): string[] {\n return [];\n }\n\n getProvides(): string[] {\n return [\"readOnlyManifest\"];\n }\n\n async isPreviewValid(instanceId: string, instance: Preview): Promise<boolean> {\n if (!!this.cache[instanceId]) {\n return true;\n }\n\n if (!instance || !instance.data || !instance.data.readOnlyManifest) {\n return false;\n }\n\n const urlToCheck = instance.data.readOnlyManifest;\n try {\n const resp = await fetch(urlToCheck, {\n cache: \"no-cache\",\n });\n return resp.ok;\n } catch (e) {\n return false;\n }\n }\n\n async createPreview(instanceId: string, resource: { id: string; type: string }, vault: Vault): Promise<Preview> {\n const manifest = vault.toPresentation3(resource as any);\n const response = await fetch(this.serviceUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: \"*\",\n },\n body: JSON.stringify(manifest),\n });\n\n invariant(response.ok, \"Unknown error creating preview\");\n\n const json = await response.json();\n\n invariant(json.location, \"Missing IIIF location while creating preview\");\n\n this.cache[instanceId] = { ...json, time: Date.now() };\n\n return {\n id: this.id,\n type: \"external-manifest-preview\",\n data: {\n readOnlyManifest: `${json.location}/${Date.now()}`,\n },\n };\n }\n\n async focus() {\n // no op.\n }\n\n async updatePreview(instanceId: string, resource: { id: string; type: string }, vault: Vault): Promise<Preview> {\n const cached = this.cache[instanceId];\n if (!cached || Date.now() > cached.expirationTtl + cached.time || !cached.updateLocation) {\n return this.createPreview(instanceId, resource, vault);\n }\n\n const updateUrl = cached.updateLocation;\n const manifest = vault.toPresentation3(resource as any);\n\n const response = await fetch(updateUrl, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: \"*\",\n },\n body: JSON.stringify(manifest),\n });\n\n invariant(response.ok, \"Unknown error updating preview\");\n\n const json = await response.json();\n\n invariant(json.location);\n\n if (json.updateLocation) {\n cached.updateLocation = json.updateLocation;\n }\n\n const readOnlyManifest = `${json.location}/${Date.now()}`;\n\n // Make a fetch, fill the cache (preview may not)\n await fetch(readOnlyManifest, {\n cache: \"no-cache\",\n });\n\n return {\n id: this.id,\n type: \"external-manifest-preview\",\n data: {\n readOnlyManifest: `${json.location}/${Date.now()}`,\n },\n };\n }\n\n async deletePreview(id: string): Promise<void> {\n const cached = this.cache[id];\n if (cached && cached.deleteLocation) {\n try {\n await fetch(cached.deleteLocation, {\n method: \"DELETE\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: \"*\",\n },\n });\n } catch (e) {\n // no-op, we tried.\n }\n }\n }\n}\n","import { type Dispatch, useMemo } from \"react\";\nimport { useVault } from \"react-iiif-vault\";\nimport invariant from \"tiny-invariant\";\nimport { useAppResource, useAppResourceInstance } from \"../AppResourceProvider/AppResourceProvider\";\nimport type {\n Preview,\n PreviewActions,\n PreviewActionsType,\n PreviewConfiguration,\n PreviewHandler,\n PreviewState,\n} from \"./PreviewContext.types\";\nimport { ExternalManifestUrlPreview } from \"./previews/ExternalManifestUrlPreview\";\nimport { IIIFPreviewService } from \"./previews/IIIFPreviewService\";\n\nexport function usePreviewActions(\n state: PreviewState,\n dispatch: Dispatch<PreviewActionsType>,\n handlers: PreviewHandler[],\n previews: Preview[],\n setPreviews: (previews: Preview[] | ((prev: Preview[]) => Preview[])) => void,\n): PreviewActions {\n const resource = useAppResource();\n const instanceId = useAppResourceInstance();\n const vault = useVault();\n\n const previewActions = useMemo(\n () => ({\n setPreview: (preview: Preview) => {\n if (!preview) return;\n setPreviews((prev) => [...prev.filter((item) => item.id !== preview.id), preview]);\n },\n removePreview: (id: string) => {\n setPreviews((prev) => prev.filter((p) => p.id !== id));\n },\n }),\n [setPreviews, instanceId],\n );\n //\n const [handlerMap, providesMap] = useMemo(() => {\n const map: Record<string, PreviewHandler> = {};\n const providesMap: Record<string, string> = {};\n for (const handler of handlers) {\n map[handler.id] = handler;\n const provides = handler.getProvides();\n if (provides.length) {\n for (const singleProvides of provides) {\n if (!providesMap[singleProvides]) {\n providesMap[singleProvides] = handler.id;\n }\n }\n }\n }\n return [map, providesMap] as const;\n }, [handlers]);\n\n async function updatePreviews() {\n const selected = state.selected;\n const selectedPreview = previews.find((p) => p.id === selected);\n if (previews && previews.length && selectedPreview) {\n const selectedHandler = handlerMap[selectedPreview.id]!;\n const requires = selectedHandler.getRequires();\n // Build context.\n const context: any = {};\n for (const preview of previews) {\n const fullPreview = handlerMap[preview.id];\n if (fullPreview) {\n const provides = fullPreview.getProvides();\n for (const provide of provides) {\n if (requires.indexOf(provide) !== -1) {\n const newPreview = await fullPreview.updatePreview(instanceId, resource, vault, context);\n if (newPreview) {\n previewActions.setPreview(newPreview);\n dispatch({ type: \"activatePreview\", payload: newPreview.id });\n Object.assign(context, newPreview.data || {});\n }\n }\n }\n }\n }\n\n // Select\n const handler = handlerMap[selectedPreview.id];\n if (handler) {\n const newPreview = await handler.updatePreview(instanceId, resource, vault, context);\n if (newPreview) {\n previewActions.setPreview(newPreview);\n } else {\n previewActions.removePreview(selectedPreview.id);\n await handler.deletePreview(instanceId);\n }\n }\n }\n }\n\n async function selectPreview(id: string) {\n const selectedHandler = handlerMap[id];\n if (selectedHandler && instanceId) {\n dispatch({ type: \"selectPreview\", payload: id });\n await activatePreview(id);\n }\n }\n\n // Be able to generate a preview link on demand from the iiif-preview-service, if available.\n async function getPreviewLink(): Promise<null | string> {\n const handlerId = providesMap[\"readOnlyManifest\"];\n const previewService = handlerId ? handlerMap[handlerId] : null;\n\n if (previewService && instanceId) {\n const existing = previews.find((p) => p.type === \"iiif-preview-service\");\n if (!existing || !(await previewService.isPreviewValid(instanceId, existing))) {\n const preview = await previewService.createPreview(instanceId, resource, vault, {});\n if (preview) {\n return preview.data.readOnlyManifest;\n }\n }\n }\n return null;\n }\n\n function deletePreview(id: string) {\n const selectedHandler = handlerMap[id];\n if (selectedHandler && instanceId) {\n previewActions.removePreview(id);\n selectedHandler.deletePreview(instanceId).then(() => {\n dispatch({ type: \"deletePreview\", payload: id });\n });\n }\n }\n\n async function focusPreview(id: string) {\n const selectedHandler = handlerMap[id];\n if (handlerMap[id] && instanceId && selectedHandler) {\n await selectedHandler.focus(instanceId);\n dispatch({ type: \"focusPreview\", payload: id });\n }\n }\n\n async function activatePreview(id: string) {\n const selectedHandler = handlerMap[id];\n if (selectedHandler && instanceId) {\n const existingPreview = previews.find((p) => p.id === id);\n if (!existingPreview || !selectedHandler.isPreviewValid(instanceId, existingPreview)) {\n const context: any = {};\n const requires = selectedHandler.getRequires();\n // @todo this could be recursive, but not doing that yet.\n for (const requirement of requires) {\n const handlerId = providesMap[requirement];\n const handler = handlerId ? handlerMap[handlerId] : null;\n\n invariant(handler, `Missing handler for Preview requirement \"${requirement}\"`);\n const existing = previews.find((p) => p.id === handlerId);\n const existingIsActive = state.active.find((a) => a === handlerId);\n\n const alwaysCreate = true as boolean;\n\n if (alwaysCreate || !existing || !(await handler.isPreviewValid(instanceId, existing))) {\n const contextualPreview = await handler.createPreview(instanceId, resource, vault, context);\n Object.assign(context, contextualPreview?.data || {});\n previewActions.setPreview(contextualPreview);\n dispatch({\n type: \"activatePreview\",\n payload: contextualPreview.id,\n });\n } else {\n Object.assign(context, existing?.data || {});\n dispatch({ type: \"activatePreview\", payload: existing.id });\n }\n }\n const created = await selectedHandler.createPreview(instanceId, resource, vault, context);\n if (created) {\n previewActions.setPreview(created);\n dispatch({ type: \"activatePreview\", payload: created.id });\n }\n }\n }\n }\n\n return useMemo(\n () => ({\n selectPreview,\n deletePreview,\n focusPreview,\n activatePreview,\n updatePreviews,\n getPreviewLink,\n }),\n // Dispatch has a stable identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [handlerMap, instanceId, vault, state.selected, state.active, previews],\n );\n}\n\nexport function usePreviewHandlers(configs: PreviewConfiguration[]): PreviewHandler[] {\n // @todo in the future the available classes could come from somewhere else and not hardcoded.\n return useMemo(() => {\n const handlers: PreviewHandler[] = [];\n\n for (const config of configs) {\n switch (config.type) {\n case \"iiif-preview-service\":\n handlers.push(new IIIFPreviewService(config));\n break;\n case \"external-manifest-preview\":\n handlers.push(new ExternalManifestUrlPreview(config));\n break;\n }\n }\n return handlers;\n\n // @todo if these ever become configurable, remove this.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n}\n","import { Draft, produce } from \"immer\";\nimport { PreviewActionsType, PreviewContext, PreviewState } from \"./PreviewContext.types\";\n\nexport const previewContextReducer = produce(function reducer(state: Draft<PreviewState>, action: PreviewActionsType) {\n switch (action.type) {\n case \"focusPreview\": {\n break;\n }\n\n case \"deletePreview\": {\n if (state.selected === action.payload) {\n state.selected = null;\n }\n state.active = state.active.filter((p) => p !== action.payload);\n break;\n }\n\n case \"activatePreview\": {\n if (state.active.indexOf(action.payload) === -1) {\n state.active.push(action.payload);\n }\n break;\n }\n\n case \"selectPreview\": {\n state.selected = action.payload;\n if (state.active.indexOf(action.payload) === -1) {\n state.active.push(action.payload);\n }\n break;\n }\n }\n});\n\nexport function getDefaultPreviewState(): PreviewState {\n return {\n active: [],\n selected: null,\n };\n}\n","import { createContext, memo, ReactNode, useContext, useEffect, useMemo, useReducer } from \"react\";\nimport { Preview, PreviewConfiguration, PreviewContext } from \"./PreviewContext.types\";\nimport invariant from \"tiny-invariant\";\nimport { usePreviewActions, usePreviewHandlers } from \"./PreviewContext.hooks\";\nimport { getDefaultPreviewState, previewContextReducer } from \"./PreviewContext.reducer\";\nimport { useAppResourceInstance } from \"../AppResourceProvider/AppResourceProvider\";\nimport { useLocalStorage } from \"../hooks/use-local-storage\";\n\nconst PreviewReactContext = createContext<PreviewContext | null>(null);\nconst AvailablePreviewReactContext = createContext<Preview[]>([] as Preview[]);\n\nexport const PreviewProvider = memo(function PreviewProvider({\n children,\n configs = [],\n}: {\n previews: Preview[];\n children: ReactNode;\n configs: PreviewConfiguration[];\n}) {\n const instanceId = useAppResourceInstance();\n const handlers = usePreviewHandlers(configs); \n const [previews, setPreviews] = useLocalStorage<Preview[]>(`preview-${instanceId}`, []);\n\n const [state, dispatch] = useReducer(previewContextReducer, undefined, getDefaultPreviewState);\n const actions = usePreviewActions(state, dispatch, handlers, previews, setPreviews);\n const context: PreviewContext = useMemo(\n () => ({ configs, actions, handlers, ...state }),\n [actions, configs, handlers, state]\n );\n\n useEffect(() => {\n for (const preview of previews) {\n if (!state.active.includes(preview.id)) {\n const handler = handlers.find((h) => h.id === preview.id);\n if (handler) {\n Promise.resolve(handler.isPreviewValid(instanceId, preview)).then((valid) => {\n if (valid) {\n dispatch({ type: \"activatePreview\", payload: preview.id });\n } else {\n setPreviews((prev) => prev.filter((p) => p.id !== preview.id));\n }\n });\n }\n }\n }\n }, [instanceId]);\n\n return (\n <AvailablePreviewReactContext.Provider value={previews}>\n <PreviewReactContext.Provider value={context}>{children}</PreviewReactContext.Provider>\n </AvailablePreviewReactContext.Provider>\n );\n});\n\nexport function usePreviews() {\n return useContext(AvailablePreviewReactContext);\n}\n\nexport function usePreviewContext() {\n const ctx = useContext(PreviewReactContext);\n\n invariant(ctx, \"usePreviewContext() can only be called from inside <PreviewProvider />\");\n\n return ctx;\n}\n","import styled from \"styled-components\";\n\nexport const ButtonReset = styled.button`\n border: none;\n outline: none;\n background-color: transparent;\n margin: 0;\n padding: 0;\n font-size: inherit;\n color: inherit;\n cursor: pointer;\n &:hover {\n color: inherit;\n }\n`;\n\nexport const Button = styled.button<{ $active?: boolean }>`\n padding: 0.5rem 1rem;\n color: ${(props: any) => props.theme.color.main || \"none\"};\n background-color: ${(props: any) => props.theme.color.white || \"white\"};\n border-radius: inherit;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 0.85em;\n :disabled {\n opacity: 0.65;\n cursor: not-allowed;\n }\n\n &:hover {\n background: #eee;\n }\n`;\n\nexport const SmallButton = styled(Button as any)`\n padding: 0.25em ${(props: any) => props.theme.padding.xs || \"0.4em\"};\n height: unset;\n background: none;\n`;\n\nexport const SecondaryButton = styled(Button as any)`\n {\n padding: 0 ${(props: any) => props.theme.padding.medium || \"1rem\"};\n color: ${(props: any) => props.theme.color.main || \"#B84C74;\"};\n background-color: ${(props: any) => props.theme.color.white || \"white\"};\n border: 1px solid ${(props: any) => props.theme.color.main || \"#B84C74;\"};\n border-radius: 0.25rem;\n cursor: pointer;\n height: 2rem;\n display: flex;\n align-items: center;\n white-space: nowrap;\n font-size: 0.75rem;\n\n :disabled {\n opacity: 0.65;\n cursor: not-allowed;\n }\n }\n`;\n\nexport const CalltoButton = styled(Button as any)`\n padding: 0 ${(props: any) => props.theme.padding.medium || \"1rem\"};\n color: ${(props: any) => props.theme.color.white || \"white\"};\n background-color: ${(props: any) => props.theme.color.main || \"#B84C74;\"};\n border: 1px solid #eee;\n border-radius: 0.25rem;\n cursor: pointer;\n justify-content: center;\n display: flex;\n align-items: center;\n &:hover {\n background-color: ${(props: any) => props.theme.color.mainHover || \"#B84C74;\"};\n }\n`;\n\nexport const ButtonGroup = styled.div<{ $right?: boolean }>`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: ${(props) => (props.$right ? \"flex-end\" : \"flex-start\")};\n`;\n","import styled, { css } from \"styled-components\";\nimport { ButtonReset } from \"@manifest-editor/ui/atoms/Button\";\n\nexport const ButtonContainer = styled.div`\n display: flex;\n position: relative;\n width: 10em;\n`;\n\nconst variation = {\n light: {\n bg: { normal: \"#fff\", hover: \"#f8f5fe\", active: \"#f8f5fe\" },\n border: { main: \"\", divider: \"\" },\n color: \"\",\n },\n salmon: {\n bg: { normal: \"#B84C74\", hover: \"#892C4E\", active: \"#892C4E\" },\n border: { main: \"#B84C74\", divider: \"#e37266\" },\n color: \"\",\n },\n};\n\nexport const ButtonMain = styled(ButtonReset as any)`\n flex: 1;\n padding: 0.5em 0.8em;\n background: #b84c74;\n color: #fff;\n border-top-left-radius: 5px;\n font-size: 0.875em;\n border-bottom-left-radius: 5px;\n border: 1px solid #b84c74;\n border-right-width: 0;\n\n &:hover {\n color: #fff;\n background: #892c4e;\n border-color: #892c4e;\n }\n\n &:active {\n background: #892c4e;\n box-shadow: inset 0 2px 8px 0 rgba(0, 0, 0, 0.15);\n }\n`;\n\nexport const ButtonChange = styled(ButtonReset as any)<{ $open: boolean }>`\n background: #b84c74;\n border-top-right-radius: 5px;\n border-bottom-right-radius: 5px;\n border: 1px solid #b84c74;\n border-left: 1px solid #fff;\n padding: 0.4em;\n color: #fff;\n svg {\n fill: currentColor;\n }\n &:hover {\n color: #fff;\n background: #892c4e;\n }\n\n &:active {\n background: #892c4e;\n box-shadow: inset 0 2px 8px 0 rgba(0, 0, 0, 0.15);\n }\n\n ${(props) =>\n props.$open &&\n css`\n background: #892c4e;\n box-shadow: inset 0 2px 8px 0 rgba(0, 0, 0, 0.15);\n `}\n`;\n\nexport const MenuContainer = styled.div<{ $open: boolean }>`\n position: absolute;\n opacity: 0;\n top: 100%;\n margin-top: 0.3em;\n border-radius: 3px;\n left: -50%;\n width: 150%;\n pointer-events: none;\n box-shadow:\n 0 4px 15px 0 rgba(0, 0, 0, 0.18),\n 0 0px 0px 1px rgba(0, 0, 0, 0.15),\n inset 0 0 0 1px rgba(255, 255, 255, 0.2);\n background: #fff;\n overflow: hidden;\n\n ${(props) =>\n props.$open &&\n css`\n opacity: 1;\n pointer-events: visible;\n `}\n`;\n\nexport const MenuItem = styled.div`\n display: flex;\n background: #fff;\n padding: 0.4em;\n align-items: center;\n\n &:hover {\n background: #f9f9f9;\n }\n`;\n\nconst statusMap = {\n available: \"#ddd\",\n configured: \"#e37266\",\n active: \"#4cb235\",\n};\n\nexport const MenuItemStatus = styled.div<{ $status: \"available\" | \"configured\" | \"active\" }>`\n margin: 0.2em 0.5em;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background-color: ${(props) => statusMap[props.$status]};\n`;\n\nexport const MenuItemLabel = styled.div`\n flex: 1;\n font-size: 0.925em;\n padding: 0.2em;\n text-overflow: ellipsis;\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n`;\n\nexport const MenuItemClose = styled.div`\n background: #f9f9f9;\n font-size: 0.8em;\n`;\n\nexport const ButtonEmpty = styled.div`\n color: #999;\n font-size: 0.8em;\n padding: 0.6em 0.8em;\n border: 2px dashed #f9f9f9;\n border-radius: 5px;\n user-select: none;\n cursor: not-allowed;\n`;\n","import { DownloadButton } from \"@manifest-editor/components\";\nimport { CloseIcon } from \"@manifest-editor/ui/icons/CloseIcon\";\nimport { DownIcon } from \"@manifest-editor/ui/icons/DownIcon\";\nimport useDropdownMenu from \"react-accessible-dropdown-menu-hook\";\nimport { useVault } from \"react-iiif-vault\";\nimport { useAppResource } from \"../AppResourceProvider/AppResourceProvider\";\nimport { useConfig } from \"../ConfigContext/ConfigContext\";\nimport { usePreviewContext } from \"../PreviewContext/PreviewContext\";\nimport {\n ButtonChange,\n ButtonContainer,\n ButtonEmpty,\n ButtonMain,\n MenuContainer,\n MenuItem,\n MenuItemClose,\n MenuItemLabel,\n MenuItemStatus,\n} from \"./PreviewButton.styles\";\n\nexport function PreviewButton({ downloadEnabled, fileName }: { downloadEnabled?: boolean; fileName?: string }) {\n const { active, configs, actions, selected } = usePreviewContext();\n const vault = useVault();\n const config = useConfig();\n const resource = useAppResource();\n const configsToShow = configs.filter((c) => c.type === \"external-manifest-preview\");\n const { isOpen, buttonProps, itemProps } = useDropdownMenu(configsToShow.length);\n\n if (configsToShow.length === 0) {\n return <ButtonEmpty>Preview not available</ButtonEmpty>;\n }\n\n return (\n <>\n {downloadEnabled ? (\n <div className=\"mr-4\">\n <DownloadButton\n fileName={fileName || \"manifest.json\"}\n label=\"Download manifest\"\n getData={() => {\n if (config.export && config.export.version === 2) {\n return JSON.stringify(vault.toPresentation2(resource as any), null, 2);\n }\n return JSON.stringify(vault.toPresentation3(resource as any), null, 2);\n }}\n />\n </div>\n ) : null}\n <ButtonContainer>\n <ButtonMain\n onClick={() => {\n if (!selected) {\n const defaultPreviewId = config.defaultPreview;\n if (defaultPreviewId) {\n const found = configs.find((c) => c.id === defaultPreviewId);\n if (found) {\n actions.selectPreview(found.id);\n return;\n }\n }\n\n actions.selectPreview(configs[0]!.id);\n }\n actions.updatePreviews();\n }}\n >\n Preview\n </ButtonMain>\n <ButtonChange $open={isOpen} {...buttonProps}>\n <DownIcon />\n </ButtonChange>\n\n <MenuContainer $open={isOpen}>\n {configsToShow.map((config, key) => {\n const inactive = active.indexOf(config.id) === -1;\n return (\n <MenuItem key={config.id} {...(itemProps[key] as any)}>\n <MenuItemStatus $status={inactive ? \"available\" : config.id === selected ? \"active\" : \"configured\"} />\n <MenuItemLabel\n onClick={() => {\n actions.selectPreview(config.id);\n }}\n >\n {config.label}\n </MenuItemLabel>\n {!inactive ? (\n <MenuItemClose onClick={() => actions.deletePreview(config.id)}>\n <CloseIcon />\n </MenuItemClose>\n ) : null}\n </MenuItem>\n );\n })}\n </MenuContainer>\n </ButtonContainer>\n </>\n );\n}\n","import { Logo, Container, Header } from \"./AppHeader.styles\";\nimport { PreviewButton } from \"../PreviewButton/PreviewButton\";\nimport { ManifestEditorLogo } from \"@manifest-editor/components\";\n\nimport { memo } from \"react\";\nimport { useLocalStorage } from \"../hooks/use-local-storage\";\n\ninterface AppHeaderProps {\n onClickLogo?: () => void;\n}\n\nexport const AppHeader = memo(function AppHeader(props: AppHeaderProps) {\n const [isMenuHidden] = useLocalStorage(\"menu-hidden\");\n\n return (\n <Header>\n <Container>\n <Logo onClick={props.onClickLogo}>\n <ManifestEditorLogo />\n </Logo>\n\n <PreviewButton />\n\n {/*<IconButton>•</IconButton>*/}\n </Container>\n {/* {!isMenuHidden ? <ShellOptions /> : null} */}\n </Header>\n );\n});\n","import { createContext, useContext } from \"react\";\n\ntype MenuItem = {\n label: string;\n onClick?: () => void;\n active?: boolean;\n};\n\ninterface AppMenuContext {\n file: {\n new: MenuItem;\n edit: MenuItem;\n open: MenuItem;\n\n newOptions: MenuItem[];\n openOptions: MenuItem[];\n };\n}\n\nconst ReactAppMenuContext = createContext<AppMenuContext | null>(null);\n\nexport function useAppMenu() {\n const ctx = useContext(ReactAppMenuContext);\n\n if (!ctx) {\n return null;\n }\n\n return ctx;\n}\n\nexport function useAppMenuItem<\n Key extends keyof AppMenuContext,\n Name extends keyof AppMenuContext[Key],\n Return extends AppMenuContext[Key][Name],\n>(menu: Key, name: Name): Return | null {\n const ctx = useAppMenu();\n\n if (!ctx) {\n return null;\n }\n\n return ctx[menu][name] as Return;\n}\n\nexport function AppMenuProvider({ children, menu }: { children: React.ReactNode; menu: AppMenuContext }) {\n return <ReactAppMenuContext.Provider value={menu}>{children}</ReactAppMenuContext.Provider>;\n}\n","import { useContext } from \"react\";\nimport { type AtlasStore, AtlasStoreProvider, AtlasStoreReactContext } from \"react-iiif-vault\";\nimport type { StoreApi } from \"zustand\";\n\nexport { AtlasStoreProvider, AtlasStoreReactContext };\n\nexport function useAtlasStore() {\n return useContext(AtlasStoreReactContext) as StoreApi<AtlasStore>;\n}\n","import type { InputShape } from \"polygon-editor\";\n\nexport function polygonToBoundingBox(polygon: InputShape | null) {\n if (!polygon) {\n return null;\n }\n if (polygon.points.length > 2) {\n const x1 = Math.min(...polygon.points.map((p) => p[0]));\n const y1 = Math.min(...polygon.points.map((p) => p[1]));\n const x2 = Math.max(0, ...polygon.points.map((p) => p[0]));\n const y2 = Math.max(0, ...polygon.points.map((p) => p[1]));\n return {\n x: x1,\n y: y1,\n width: x2 - x1,\n height: y2 - y1,\n };\n }\n return null;\n}\n","import { getValue } from \"@iiif/helpers\";\nimport * as IIIFVault from \"@iiif/helpers/vault\";\n\n// This is from the ts version\n// Create an image in the DOM to measure height and width\nconst getImage = async (src: string): Promise<HTMLImageElement> => {\n return new Promise((resolve, reject) => {\n const $img = document.createElement(\"img\");\n $img.onload = () => resolve($img);\n $img.onerror = () => reject();\n $img.src = src;\n if ($img.complete) {\n resolve($img); // cached.\n }\n });\n};\n\nconst getAudioVideo = async (src: string) => {\n return new Promise<HTMLVideoElement>((resolve, reject) => {\n // Video tag accepts both.\n const $media = document.createElement(\"video\");\n $media.onloadedmetadata = () => resolve($media);\n $media.onerror = () => reject();\n $media.preload = \"metadata\";\n $media.src = src;\n });\n};\n\n// use the hints from the user (if any), plus defaults, to get the order\n// in which to try various analysis\nfunction makeTryList(suppliedExpectedTypes: string[]) {\n const defaults = [\"Image\", \"ImageService\", \"ManifestOrCollection\", \"ContentState\"];\n let tryList: string[] = [];\n if (!suppliedExpectedTypes || suppliedExpectedTypes.length === 0) {\n tryList = defaults;\n }\n mergeList(suppliedExpectedTypes, tryList);\n mergeList(defaults, tryList);\n return tryList;\n}\n\nfunction mergeList(inputList: string[], outputList: string[]) {\n inputList.map((t: string) => {\n if (t === \"Image\" && !outputList.includes(\"Image\")) {\n outputList.push(\"Image\");\n }\n if (t === \"ImageService\" && !outputList.includes(\"ImageService\")) {\n outputList.push(\"ImageService\");\n }\n if (t === \"Manifest\" && !outputList.includes(\"ManifestOrCollection\")) {\n outputList.push(\"ManifestOrCollection\");\n }\n if (t === \"Collection\" && !outputList.includes(\"ManifestOrCollection\")) {\n outputList.push(\"ManifestOrCollection\");\n }\n if (t === \"ManifestOrCollection\" && !outputList.includes(\"ManifestOrCollection\")) {\n outputList.push(\"ManifestOrCollection\");\n }\n if (t === \"ContentState\" && !outputList.includes(\"ContentState\")) {\n outputList.push(\"ContentState\");\n }\n });\n}\n\nexport async function detectMedia() {\n //\n}\n\nexport async function analyse(url: string, ...expectedTypes: string[]) {\n // const tryList = makeTryList(expectedTypes);\n\n if (!url) {\n return;\n }\n\n // 2 new options:\n // - Audio\n // - Video\n // Only support them if they end in mp3 or mp4\n if (url.endsWith(\".mp3\") || url.endsWith(\".mp4\") || url.endsWith(\".m4a\") || url.endsWith(\".m4v\")) {\n try {\n const av = await getAudioVideo(url);\n if (av) {\n const isAudio = av.videoWidth === 0;\n return {\n id: url,\n type: av.videoWidth === 0 ? \"Sound\" : \"Video\",\n width: av.videoWidth || undefined, // naturalWidth\n height: av.videoHeight || undefined, // naturalHeight\n duration: av.duration,\n format: isAudio ? \"audio/mp4\" : \"video/mp4\",\n };\n }\n } catch (e) {\n // fall through..\n }\n }\n\n // This doesn't use the tryList order yet.\n // One advantage of doing a fetch first _even if we expect an image_ is that\n // we might capture the content type, if the image is CORS-enabled.\n let response = null;\n try {\n // Try head request, if that works...\n await fetch(url, { method: \"HEAD\" });\n\n // then fetch the full resource.\n response = await fetch(url);\n } catch {\n // can handle the error better, but maybe CORS error happened so:\n return handleNonFetchableUrl(url);\n }\n\n if (!response.ok) {\n response = await fetch(url + \"/info.json\");\n if (!response.ok) {\n return handleNonFetchableUrl(url);\n }\n }\n\n // but... it might have been a CORS-enabled image, or an image from an image service.\n // In this scenario we can capture the content type right here.\n const contentTypeHeader = response.headers.get(\"Content-Type\");\n if (contentTypeHeader?.includes(\"image/\")) {\n return handleNonFetchableUrl(url, contentTypeHeader);\n }\n\n // OK, it's probably NOT an image, and we have an OK response, so can we get JSON from it?\n let data = null;\n try {\n data = await response.json();\n } catch {\n return null;\n }\n\n return await analyseJson(data, url);\n}\n\nfunction asImageService(data: any) {\n if (data.protocol && data.protocol === \"http://iiif.io/api/image\") {\n if (!data.type) {\n data.type = \"ImageService\";\n }\n // NB this will be ImageService3 if it's a v3 img service\n return data;\n }\n return null;\n}\n\nexport async function analyseJson(data: any, url: string) {\n // Is it an image service?\n const testImageService = asImageService(data);\n if (testImageService) {\n return testImageService;\n }\n\n // does it have an ID?\n const dataId = data.id || data[\"@id\"];\n if (!dataId) {\n return null;\n }\n const vault = new IIIFVault.Vault();\n const vaultData = await vault.load(url, data); // we could use dataId here, but just in case it's wrong...\n if (!vaultData) {\n return;\n }\n // @ts-ignore\n if ((vaultData && vaultData?.type === \"Manifest\") || vaultData?.type === \"Collection\") {\n return {\n id: url,\n // @ts-ignore\n type: vaultData.type,\n // @ts-ignore\n label: getValue(vaultData.label),\n };\n }\n}\n\nasync function handleNonFetchableUrl(url: string, capturedContentType?: string) {\n // it *is* an image... but is it an image from an image service?\n // In its current form this should be tried before any fetch happens\n // that is, does it match:\n // http<s>://<any.org>/<any-prefix>/region/size/rotation/format.quality ?\n // This should really call Stephen's IIIF Image API parser, and if it's a success, we know it's\n // probably an image service\n // https://github.com/atlas-viewer/iiif-image-api\n // https://github.com/atlas-viewer/iiif-image-api/blob/main/src/utility/parse-image-service-request.ts\n const parts = url.split(\"/\");\n if (parts.length >= 8) {\n // might be an image service\n const iiifParts = parts.slice(-4);\n // need to do more than this but the parser can do the hard work\n if (iiifParts[3]!.split(\".\").length === 2) {\n // This is not reliable! parse it properly!\n if (iiifParts[2]![0] === \"!\" || iiifParts[2] === iiifParts[2]) {\n // rotation param is numeric\n // this is worth trying as an image service\n const serviceUrl = parts.slice(0, parts.length - 4).join(\"/\") + \"/info.json\";\n // assume this is a low cost thing to try\n const imgService = await getImageService(serviceUrl);\n if (imgService && imgService?.type && imgService?.type?.startsWith(\"ImageService\")) {\n return imgService;\n }\n }\n }\n }\n\n // OK we didn't find an image service behind that image URL. So now it's time to use the DOM.\n\n try {\n const image = (await getImage(url)) as any;\n const data = {\n id: url,\n type: \"Image\",\n width: image.width, // naturalWidth\n height: image.height, // naturalHeight\n format: await getFormat(url, capturedContentType),\n };\n return data;\n } catch {}\n\n return null;\n}\n\nasync function getImageService(url: string) {\n try {\n const response = await fetch(url);\n if (response.ok) {\n const data = await response.json();\n return await analyseJson(data, url);\n }\n return null;\n } catch (e: any) {\n console.log(e);\n return null;\n }\n}\n\nexport async function getFormat(url: string, capturedContentType?: string) {\n if (capturedContentType) {\n // we managed to learn this earlier, the image had CORS\n return capturedContentType;\n }\n try {\n // a HEAD request doesn't have CORS issues... well it didn't used to...\n const response = await fetch(url, { method: \"HEAD\", mode: \"no-cors\" });\n const ct = response.headers.get(\"Content-type\");\n if (ct) {\n return ct;\n }\n } catch (e) {\n // ignore.\n }\n\n // if the above still fails, we could fall back to guessing\n // content-type from the URL (.jpg etc).\n const test = url.toLowerCase();\n if (test.endsWith(\"jpg\") || test.endsWith(\"jpeg\")) {\n return \"image/jpeg\";\n }\n if (test.endsWith(\"png\")) {\n return \"image/png\";\n }\n // Just a default.\n return \"image/jpeg\";\n}\n\nexport async function getImageDimensions(url: string) {\n try {\n const image = await getImage(url);\n if (image) {\n return {\n width: image.naturalWidth || image.width,\n height: image.naturalHeight || image.height,\n };\n }\n } catch (e) {\n return null;\n }\n return null;\n}\n","import { toRef } from \"@iiif/parser\";\nimport type { ManifestNormalized } from \"@iiif/presentation-3-normalized\";\nimport type { AppExtension, MappedApp } from \"./AppContext/AppContext\";\n\nexport async function getManifestNomalized(\n id: string,\n): Promise<ManifestNormalized | undefined> {\n let responseData: ManifestNormalized | undefined;\n try {\n await fetch(id)\n .then((response) => {\n return response.json().catch((err) => {\n console.error(`'${err}' happened!`);\n });\n })\n .then((data) => {\n responseData = { ...data };\n });\n } catch (error) {\n console.log(error);\n }\n return responseData;\n}\n\nexport function createActionIdentity(\n type: string,\n property: string,\n parent: any,\n) {\n return `create_${type}_${property}_${toRef(parent)?.type || \"unknown\"}`;\n}\n\nexport function createDownload(\n data: any,\n fileName: string,\n fileType = \"text/json\",\n) {\n // Create a blob with the data we want to download as a file\n const blob =\n data instanceof Blob ? data : new Blob([data], { type: fileType });\n // Create an anchor element and dispatch a click event on it\n // to trigger a download\n const a = document.createElement(\"a\");\n a.download = fileName;\n a.href = window.URL.createObjectURL(blob);\n const clickEvt = new MouseEvent(\"click\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n a.dispatchEvent(clickEvt);\n a.remove();\n}\n\nexport async function copyToClipboard(json: string | any) {\n return navigator.clipboard.writeText(\n typeof json === \"string\" ? json : JSON.stringify(json, null, 2),\n );\n}\n\nexport function randomId() {\n return `${Math.random().toString(36).substr(2)}-${Date.now().toString(36)}`;\n}\n\nexport function mapApp(\n input: any,\n map?: (app: MappedApp) => MappedApp,\n): MappedApp {\n const { default: metadata, config, ...props } = input;\n const app = {\n metadata: metadata as any,\n layout: {\n leftPanels: [],\n rightPanels: [],\n centerPanels: [],\n ...(props as any),\n },\n config,\n };\n\n return map ? map(app) : app;\n}\n\nexport function extendApp(\n app: MappedApp,\n metadata: MappedApp[\"metadata\"],\n extensions: AppExtension,\n): MappedApp {\n return {\n ...app,\n metadata,\n config: {\n ...(app.config || {}),\n ...(extensions.config || {}),\n },\n layout: {\n ...app.layout,\n leftPanels: [\n ...(app.layout.leftPanels || []).filter((panel) => {\n if (extensions?.leftPanelIds) {\n return extensions.leftPanelIds.includes(panel.id);\n }\n return true;\n }),\n ...(extensions?.leftPanels || []),\n ],\n annotations: [\n ...(extensions?.annotations || []),\n ...(app.layout.annotations || []),\n ],\n canvasEditors: [\n ...(extensions?.canvasEditors || []),\n ...(app.layout.canvasEditors || []),\n ],\n creators: [\n ...(extensions?.creators || []),\n ...(app.layout.creators || []),\n ],\n background: [\n ...(app.layout?.background || []),\n ...(extensions?.background || []),\n ],\n editors: [\n //\n ...(extensions?.editors || []),\n ...(app.layout.editors || []),\n ],\n rightPanels: [\n ...(app.layout.rightPanels || []),\n ...(extensions?.rightPanels || []),\n ],\n centerPanels: [\n ...(app.layout.centerPanels || []),\n ...(extensions?.centerPanels || []),\n ],\n modals: [\n ...(app.layout.modals || []),\n ...(extensions?.modalPanels || []),\n ],\n },\n };\n}\n","import { create } from \"zustand\";\nimport { useEffect, useMemo } from \"react\";\nimport { randomId } from \"./helpers\";\n\ntype Projection = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\ninterface HighlightedImageResources {\n regions: Record<string, Projection | null>;\n resources: string[];\n setRegion: (id: string, region?: Projection | null) => void;\n setHighlight: (id: string | string[]) => void;\n highlight: (id: string) => void;\n clearHighlight: (id: string) => void;\n}\n\nexport const useHighlightedImageResource = create<HighlightedImageResources>((set) => ({\n regions: {},\n resources: [],\n setRegion: (id, region) => {\n set((ex) => ({ ...ex.regions, regions: { [id]: region || null } }));\n },\n setHighlight: (id: string | string[]) => {\n set({ resources: Array.isArray(id) ? id : [id] });\n },\n highlight: (id) => {\n set((s) => {\n if (s.resources.indexOf(id) !== -1) {\n return s;\n }\n return { resources: [...s.resources, id] };\n });\n },\n clearHighlight: (id) => {\n set((s) => ({ resources: s.resources.filter((item) => item !== id) }));\n },\n}));\n\nexport function useTemporaryHighlight(newValue?: Projection | null) {\n const id = useMemo(() => randomId(), []);\n const value = useHighlightedImageResource((s) => s.regions[id]);\n const setRegion = useHighlightedImageResource((s) => s.setRegion);\n\n useEffect(() => {\n if (value && newValue) {\n if (\n value !== newValue &&\n (value.x !== newValue.x ||\n value.y !== newValue.y ||\n value.width !== newValue.width ||\n value.height !== newValue.height)\n ) {\n setRegion(id, newValue || null);\n }\n } else {\n setRegion(id, newValue || null);\n }\n }, [value]);\n\n useEffect(() => {\n return () => setRegion(id, null);\n }, []);\n}\n\nexport function useHoverHighlightImageResource(id?: string) {\n const highlight = useHighlightedImageResource((s) => s.highlight);\n const clear = useHighlightedImageResource((s) => s.clearHighlight);\n\n useEffect(() => {\n return () => {\n if (id) {\n clear(id);\n }\n };\n }, [clear, id]);\n\n return useMemo(() => {\n return {\n onMouseEnter() {\n if (id) {\n highlight(id);\n }\n },\n onMouseLeave() {\n if (id) {\n clear(id);\n }\n },\n };\n }, [id, highlight, clear]);\n}\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\n\nexport const StarIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path\n d=\"M12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","export const BackIcon: React.FC<{ style?: any }> = ({ style }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1rem\" viewBox=\"0 0 24 24\" width=\"1rem\" fill=\"#000000\" style={style}>\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\" />\n </svg>\n);\n","import { createContext, useContext, useMemo } from \"react\";\nimport { LayoutActions, LayoutProviderProps, LayoutState } from \"./Layout.types\";\nimport { useApp } from \"../AppContext/AppContext\";\n\nexport const LayoutActionsReactContext = createContext<LayoutActions>(null as any);\nexport const LayoutStateReactContext = createContext<LayoutState>(null as any);\n\nexport function useLayoutState() {\n return useContext(LayoutStateReactContext);\n}\n\nexport function useLayoutActions() {\n return useContext(LayoutActionsReactContext);\n}\n\nexport function useAvailableLayouts() {\n const app = useApp();\n return app.layout;\n}\n\nexport function useLayoutProvider(): LayoutProviderProps & {\n loading?: true;\n actions: LayoutActions;\n state: LayoutState;\n} {\n const app = useApp();\n const layout = app.layout;\n const actions = useContext(LayoutActionsReactContext);\n const state = useContext(LayoutStateReactContext);\n\n return useMemo(() => {\n return { actions, state, ...layout };\n\n // The actions have a fully stable identity.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [app, state]);\n}\n","import { ErrorMessage, PaddedSidebarContainer } from \"@manifest-editor/components\";\nimport { Button, CalltoButton } from \"@manifest-editor/ui/atoms/Button\";\nimport { ExperimentalMessage } from \"@manifest-editor/ui/madoc/components/callouts/ExperimentalMessage\";\nimport { WarningMessage } from \"@manifest-editor/ui/madoc/components/callouts/WarningMessage\";\nimport { ExperimentalIcon } from \"@manifest-editor/ui/madoc/components/icons/ExperimentalIcon\";\n// import { LimitationError } from \"../../../helpers/limitation\";\n// import { FixMeError } from \"@/helpers/fix-me\";\nimport { useState } from \"react\";\n\nexport function PanelError(props: { error: Error; resetErrorBoundary: () => void }) {\n const error = props.error.toString();\n const [isFixing, setIsFixing] = useState(false);\n\n // @todo come back to.\n // if (props.error instanceof FixMeError) {\n // const errorObject = props.error;\n\n // return (\n // <PaddedSidebarContainer>\n // <WarningMessage $banner>\n // <ExperimentalIcon style={{ fontSize: \"2.2em\", margin: \"0 0.3em 0 0\" }} />\n // <div>\n // <h4 style={{ margin: 0 }}>There is a fixable error</h4>\n // <p>{errorObject.message}</p>\n // <Button\n // disabled={isFixing}\n // onClick={async () => {\n // setIsFixing(true);\n // await errorObject.fix();\n // props.resetErrorBoundary();\n // setIsFixing(false);\n // }}\n // >\n // Fix error\n // </Button>\n // </div>\n // </WarningMessage>\n // </PaddedSidebarContainer>\n // );\n // }\n\n // @todo come back to.\n // if (props.error instanceof LimitationError) {\n // error = props.error.message;\n\n // return (\n // <PaddedSidebarContainer>\n // <ExperimentalMessage $banner>\n // <ExperimentalIcon style={{ fontSize: \"2.2em\", margin: \"0 0.3em 0 0\" }} />\n // <div>\n // <h4 style={{ margin: 0 }}>The manifest editor is still in development</h4>\n // <p>{error}</p>\n // </div>\n // </ExperimentalMessage>\n // </PaddedSidebarContainer>\n // );\n // }\n\n return (\n <PaddedSidebarContainer>\n <ErrorMessage className=\"mb-2\">{error}</ErrorMessage>\n <CalltoButton onClick={props.resetErrorBoundary}>Try again</CalltoButton>\n </PaddedSidebarContainer>\n );\n}\n","import { PinnablePanelState } from \"./Layout.types\";\nimport { createElement, ReactNode } from \"react\";\n\nexport function isPinnableState(t: unknown): t is PinnablePanelState {\n return t && (t as any).pinnable;\n}\n\nexport function panelSizing({\n initial,\n\n fallback,\n options = {},\n}: {\n initial?: number;\n fallback: number;\n options?: { minWidth?: number; maxWidth?: number };\n}) {\n // panel min width\n // panel max width\n // default width\n // fallback width\n return Math.max(options.minWidth || 0, Math.min(options.maxWidth || Infinity, initial || fallback));\n}\n\nexport function renderHelper(htmlOrReact: string | ReactNode): ReactNode {\n if (typeof htmlOrReact === \"string\") {\n return createElement(\"div\", { dangerouslySetInnerHTML: { __html: htmlOrReact } });\n }\n return htmlOrReact;\n}\n","import styled, { css } from \"styled-components\";\nimport { Button } from \"./Button\";\n\nexport const Dropdown = styled.div`\n position: relative;\n display: inline-block;\n`;\n\nexport const DropdownContent = styled.div`\n display: flex;\n flex-direction: column;\n position: absolute;\n background-color: ${(props: any) => props.theme.color.white || \"white\"};\n color: ${(props: any) => props.theme.color.black || \" black\"};\n font-size: 0.75rem;\n min-width: 160px;\n box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);\n z-index: 150;\n button {\n &:hover {\n background-color: ${(props: any) => props.theme.color.lightgrey || \"lightgrey\"};\n }\n }\n`;\n\nexport const DropdownItem = styled.button<{ $active?: boolean }>`\n padding: 0 ${(props: any) => props.theme.padding.small || \"0.5rem\"};\n color: ${(props: any) => props.theme.color.main || \"none\"};\n background-color: ${(props: any) => props.theme.color.white || \"white\"};\n border-radius: 0;\n border: none;\n cursor: pointer;\n display: flex;\n padding: 0.65em 1em;\n align-items: center;\n :disabled {\n opacity: 0.65;\n cursor: not-allowed;\n }\n\n &:hover {\n background-color: ${(props: any) => props.theme.color.lightgrey || \"lightgrey\"};\n }\n\n ${(props) =>\n props.$active &&\n css`\n background: #b84c74;\n color: #fff;\n &:hover {\n background: #b84c74;\n color: #fff;\n }\n `}\n`;\n\nexport const DropdownMenu = styled.div<{ $open?: boolean; $center?: boolean }>`\n display: none;\n flex-direction: column;\n position: absolute;\n background: #fff;\n color: ${(props: any) => props.theme.color.black || \" black\"};\n font-size: 0.75rem;\n min-width: 190px;\n top: calc(100% + 0.5em);\n box-shadow:\n 0 4px 15px 0 rgba(0, 0, 0, 0.18),\n 0 0px 0px 1px rgba(0, 0, 0, 0.15),\n inset 0 0 0 1px rgba(255, 255, 255, 0.2);\n border-radius: 3px;\n z-index: 150;\n overflow: hidden;\n padding-bottom: 3px;\n\n ${Button} {\n &:hover {\n background-color: ${(props: any) => props.theme.color.lightgrey || \"lightgrey\"};\n }\n }\n\n ${(props) =>\n props.$open &&\n css`\n display: flex;\n `}\n`;\n\nexport const DropdownLabel = styled.div`\n color: #999;\n text-transform: uppercase;\n font-weight: 600;\n padding: 0.7em;\n font-size: 0.875em;\n`;\n\nexport const DropdownDivider = styled.div`\n height: 1px;\n margin: 0 0.5em;\n background: #eee;\n`;\n","import { TransitionStatus } from \"react-transition-group\";\nimport { LayoutPanel, PanelActions, PanelState, PinnablePanelActions, PinnablePanelState } from \"../Layout.types\";\nimport styled, { css } from \"styled-components\";\nimport { StarIcon } from \"@manifest-editor/ui/icons/StarIcon\";\nimport { CloseIcon } from \"@manifest-editor/ui/icons/CloseIcon\";\nimport { BackIcon } from \"@manifest-editor/ui/icons/BackIcon\";\nimport { useLayoutProvider } from \"../Layout.context\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { PanelError } from \"./PanelError\";\nimport { renderHelper } from \"../Layout.helpers\";\nimport { ReactVaultContext } from \"react-iiif-vault\";\nimport {\n DropdownDivider,\n DropdownLabel,\n DropdownMenu,\n Dropdown,\n DropdownItem,\n} from \"@manifest-editor/ui/atoms/Dropdown\";\nimport useDropdownMenu from \"react-accessible-dropdown-menu-hook\";\nimport { useAppState } from \"../../AppContext/AppContext\";\n\nconst OverrideScrollbar = 'OverrideScrollbar';\n\ninterface ModularPanelProps {\n panel?: LayoutPanel;\n isLeft?: boolean;\n state: PinnablePanelState | PanelState;\n actions: PanelActions;\n pinActions?: PinnablePanelActions;\n transition?: TransitionStatus;\n noHeader?: boolean;\n close?: () => void;\n available?: LayoutPanel[];\n style?: any;\n}\n\nconst LayoutTitleReactContext = createContext<(title: string) => void>(null as any);\n\nexport function useSetCustomTitle() {\n return useContext(LayoutTitleReactContext);\n}\n\nconst ModularPanelWrapper = styled.div<{ $floating?: boolean; $state?: TransitionStatus; $flipped?: boolean }>`\n display: flex;\n flex-direction: column;\n position: relative;\n height: 100%;\n overflow: hidden;\n transition: transform 300ms;\n\n &[data-header=\"false\"] {\n border-top: 1px solid #e4e7f0;\n }\n\n &[data-floating=\"true\"] {\n margin: 10px;\n border-radius: 5px;\n overflow: hidden;\n background: #fff;\n }\n\n &[data-state=\"entering\"],\n &[data-state=\"entered\"] {\n transform: translateX(0);\n }\n\n &[data-state=\"exiting\"],\n &[data-state=\"exited\"] {\n transform: translateX(100%);\n }\n\n &[data-state=\"exiting\"][data-flipped=\"true\"],\n &[data-state=\"exited\"][data-flipped=\"true\"] {\n transform: translateX(0);\n }\n\n &[data-state=\"exiting\"][data-flipped=\"false\"],\n &[data-state=\"exited\"][data-flipped=\"false\"] {\n transform: translateX(100%);\n }\n\n &[data-state=\"entering\"][data-flipped=\"true\"],\n &[data-state=\"entered\"][data-flipped=\"true\"] {\n transform: translateX(0);\n }\n\n &[data-state=\"entering\"][data-flipped=\"false\"],\n &[data-state=\"entered\"][data-flipped=\"false\"] {\n transform: translateX(100%);\n }\n\n &[data-state=\"unmounted\"] {\n transform: translateX(100%);\n }\n`;\n\nexport const ModularPanelHeader = styled.div<{ $tabs?: boolean; $error?: boolean }>`\n background: #fff;\n display: flex;\n height: 2.8em;\n align-items: center;\n z-index: 2;\n\n &[data-tabs=\"true\"] {\n box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.17);\n }\n\n &[data-tabs=\"false\"] {\n box-shadow:\n inset 0 -1px 0 0 rgba(0, 0, 0, 0.17),\n inset 0 1px 0 0 rgba(0, 0, 0, 0.17);\n }\n\n &[data-error=\"true\"] {\n color: #b61717;\n background: #ffc2d2;\n box-shadow: inset 0 -5px 10px 0 rgba(255, 255, 255, 0.5);\n }\n`;\n\nexport const ModulePanelButton = styled.button`\n border: none;\n background: transparent;\n padding: 0 0.4em;\n margin: 0.3em;\n border-radius: 3px;\n &:hover {\n background: #eee;\n }\n svg {\n font-size: 1.2em;\n }\n`;\n\nconst ModulePanelSpacer = styled.div`\n flex: 1 1 0px;\n`;\n\nconst ModularPanelLabel = styled.div`\n font-size: 0.875em;\n flex: 1 1 0px;\n padding-left: 1em;\n text-align: center;\n align-self: center;\n`;\n\nconst ModularPanelContent = styled.div`\n flex: 1 1 0px;\n display: flex;\n\n min-height: 0;\n overflow-y: auto;\n overflow-x: hidden;\n\n > * {\n min-width: 0;\n }\n`;\n\nexport function ModularPanel({\n panel,\n state,\n actions,\n isLeft,\n pinActions = actions as any,\n transition,\n close,\n available = [],\n style,\n noHeader,\n}: ModularPanelProps) {\n const vault = useContext(ReactVaultContext) || null;\n const [didError, setDidError] = useState(false);\n const appState = useAppState();\n const layout = useLayoutProvider();\n const { tabs, pinnable, hideHeader } = panel?.options || {};\n const resetKeys = [appState.state.canvasId, panel?.id];\n const switchablePanels = useMemo(() => {\n return (available || []).filter((p) => !p.requiresState);\n }, [available]);\n const { itemProps, isOpen, setIsOpen } = useDropdownMenu(switchablePanels.length);\n const [customTitle, setCustomTitle] = useState(\"\");\n const setCustomTitleRef = useRef<(title: string) => void | undefined>();\n\n useEffect(() => setDidError(false), resetKeys);\n\n useEffect(() => setCustomTitle(\"\"), [panel]);\n\n useEffect(() => {\n setCustomTitleRef.current = setCustomTitle;\n return () => {\n setCustomTitleRef.current = undefined;\n };\n }, []);\n\n const _setCustomTitle = useCallback((title: string) => {\n if (setCustomTitleRef.current) {\n setCustomTitleRef.current(title);\n }\n }, []);\n\n const backAction = useCallback(\n (e?: React.MouseEvent) => {\n const originalCallback = panel\n ? state.stack.length\n ? actions.popStack\n : panel.backAction\n ? () => panel && panel.backAction && panel.backAction(state, { ...layout, current: actions }, appState)\n : null\n : null;\n\n if (e && (!originalCallback || e.metaKey) && switchablePanels.length) {\n e.preventDefault();\n setIsOpen(true);\n } else {\n originalCallback && originalCallback();\n }\n },\n [actions, appState, layout, panel, setIsOpen, state, switchablePanels.length]\n );\n\n const menuHandler = (newPanel: LayoutPanel) => {\n actions.change({\n id: newPanel.id,\n state: newPanel.defaultState,\n stacked: !!(state.stack.length || panel?.backAction),\n });\n };\n\n if (!panel || !state.current) {\n return null;\n }\n\n const backButton =\n panel.backAction || state.stack.length ? (\n <ModulePanelButton onClick={backAction}>\n <BackIcon />\n </ModulePanelButton>\n ) : null;\n\n const closeButton = (\n <ModulePanelButton onClick={close || actions.close}>\n <CloseIcon />\n </ModulePanelButton>\n );\n\n return (\n <LayoutTitleReactContext.Provider value={_setCustomTitle}>\n <ModularPanelWrapper data-state={transition} data-flipped={isLeft} style={style} data-header={!noHeader}>\n {noHeader ? null : (\n <ModularPanelHeader data-tabs={!!tabs} data-error={didError}>\n <Dropdown style={{ display: \"flex\", height: \"100%\" }}>\n {panel.renderBackAction ? panel.renderBackAction({ backAction, fallback: backButton }) : backButton}\n {switchablePanels.length ? (\n <DropdownMenu $open={isOpen} style={{ left: \"0.5em\" }}>\n <DropdownLabel>All panels</DropdownLabel>\n <DropdownDivider />\n {switchablePanels.map((newPanel, i) => (\n <DropdownItem\n key={i}\n {...(itemProps as any)[i]}\n onClick={() => menuHandler(newPanel)}\n $active={panel.id === newPanel.id}\n >\n {newPanel.label}\n </DropdownItem>\n ))}\n </DropdownMenu>\n ) : null}\n </Dropdown>\n\n {customTitle ? (\n <ModularPanelLabel>{customTitle}</ModularPanelLabel>\n ) : hideHeader ? (\n <ModulePanelSpacer />\n ) : (\n <ModularPanelLabel>{panel.label}</ModularPanelLabel>\n )}\n {pinnable ? (\n (state as PinnablePanelState).pinned ? (\n <ModulePanelButton onClick={pinActions.unpin}>\n <StarIcon fill=\"orange\" />\n </ModulePanelButton>\n ) : (\n <ModulePanelButton onClick={() => pinActions.pin({ id: panel.id, state: state.state })}>\n <StarIcon fill=\"#ddd\" />\n </ModulePanelButton>\n )\n ) : null}\n {panel.renderCloseAction\n ? panel.renderCloseAction({ closeAction: close || actions.close, fallback: closeButton })\n : closeButton}\n </ModularPanelHeader>\n )}\n <ModularPanelContent className={OverrideScrollbar}>\n <ErrorBoundary\n // onResetKeysChange={() => setDidError(false)}\n onError={() => setDidError(true)}\n FallbackComponent={PanelError}\n resetKeys={resetKeys}\n onReset={() => setDidError(false)}\n >\n {renderHelper(\n panel.render(\n state.state || panel.defaultState || {},\n { ...layout, current: actions, vault: vault as any, transition },\n appState\n )\n )}\n </ErrorBoundary>\n </ModularPanelContent>\n </ModularPanelWrapper>\n </LayoutTitleReactContext.Provider>\n );\n}\n","import { Vault } from \"@iiif/helpers/vault\";\nimport {\n addReference,\n batchActions,\n modifyEntityField,\n reorderEntityField,\n requestResource,\n} from \"@iiif/helpers/vault/actions\";\nimport { actionListFromResource } from \"@iiif/helpers/vault/utility\";\n\nexport function createPreviewVault(homepageCollectionId = \"vault://homepage-collection.json\") {\n const vault = new Vault();\n\n // 1st - ensure that our \"default\" collection exists OR import one.\n const previewCollection = window.localStorage.getItem(\"preview-vault-collection\");\n let didImport = false;\n if (previewCollection) {\n try {\n const previewState = JSON.parse(previewCollection);\n if (previewState.id && previewState.id === homepageCollectionId) {\n vault.dispatch(requestResource({ id: previewState.id }));\n const toDispatch: any = actionListFromResource(previewState.id, previewState);\n vault.dispatch(batchActions({ actions: toDispatch }));\n didImport = true;\n }\n } catch (e) {\n //\n }\n }\n\n if (!didImport) {\n const toDispatch: any = actionListFromResource(homepageCollectionId, {\n \"@context\": \"http://iiif.io/api/presentation/3/context.json\",\n id: homepageCollectionId,\n type: \"Collection\",\n label: { en: [\"Recent items\"] },\n items: [],\n });\n vault.dispatch(requestResource({ id: homepageCollectionId }));\n vault.dispatch(batchActions({ actions: toDispatch }));\n }\n\n const clearHistory = () => {\n vault.dispatch(modifyEntityField({ id: homepageCollectionId, type: \"Collection\", key: \"items\", value: [] }));\n window.localStorage.setItem(\n \"preview-vault-collection\",\n JSON.stringify(vault.toPresentation3({ id: homepageCollectionId, type: \"Collection\" }))\n );\n };\n\n const addHistory = (id: string, type: string) => {\n const state = vault.getState();\n if (id && type && (type === \"Collection\" || type === \"Manifest\")) {\n const existingCollection = state.iiif.entities.Collection[homepageCollectionId];\n // This shouldn't happen... but it could.\n if (existingCollection) {\n const alreadyExists = existingCollection.items.findIndex((t) => t.id === id);\n if (alreadyExists === -1) {\n vault.dispatch(\n addReference({\n id: homepageCollectionId,\n type: \"Collection\",\n reference: { id, type },\n key: \"items\",\n index: 0,\n })\n );\n } else {\n vault.dispatch(\n reorderEntityField({\n id: homepageCollectionId,\n type: \"Collection\",\n key: \"items\",\n startIndex: alreadyExists,\n endIndex: 0,\n })\n );\n }\n\n window.localStorage.setItem(\n \"preview-vault-collection\",\n JSON.stringify(vault.toPresentation3({ id: homepageCollectionId, type: \"Collection\" }))\n );\n }\n }\n };\n\n const unsubscribe2 = vault.on(\"after:@iiif/REMOVE_REFERENCE\", (ctx) => {\n if (ctx.action.payload.id === homepageCollectionId) {\n window.localStorage.setItem(\n \"preview-vault-collection\",\n JSON.stringify(vault.toPresentation3({ id: homepageCollectionId, type: \"Collection\" }))\n );\n }\n });\n\n const unsubscribe = () => {\n // This isn't working, because React.\n // unsubscribe1();\n // unsubscribe2();\n };\n\n return { vault, unsubscribe, addHistory, clearHistory } as const;\n}\n","import { createContext, useContext, useEffect, useMemo } from \"react\";\nimport { Vault } from \"@iiif/helpers/vault\";\nimport { VaultProvider } from \"react-iiif-vault\";\nimport { createPreviewVault } from \"./create-preview-vault\";\n\nexport function usePreviewVault() {\n return useContext(PreviewVaultReactContext);\n}\n\nconst PreviewVaultReactContext = createContext<Vault>(new Vault());\n\nconst PreviewVaultAddHistory = createContext({\n addHistory: (id: string, type: string) => {},\n clearHistory: () => {},\n});\n\nexport const HOMEPAGE_COLLECTION = \"manifest-editor://homepage-collection.json\";\n\nexport function usePreviewHistory() {\n return useContext(PreviewVaultAddHistory);\n}\n\nexport function PreviewVaultContext(props: { children: any }) {\n const { vault, unsubscribe, addHistory, clearHistory } = useMemo(() => {\n return createPreviewVault(HOMEPAGE_COLLECTION);\n }, []);\n\n useEffect(() => {\n return unsubscribe;\n }, []);\n\n return (\n <PreviewVaultAddHistory.Provider value={{ addHistory, clearHistory }}>\n <PreviewVaultReactContext.Provider value={vault}>{props.children}</PreviewVaultReactContext.Provider>\n </PreviewVaultAddHistory.Provider>\n );\n}\n\nexport function PreviewVaultBoundary({ children }: { children: any }) {\n const vault = usePreviewVault();\n\n return <VaultProvider vault={vault}>{children}</VaultProvider>;\n}\n","import { toRef } from \"@iiif/parser\";\nimport type { Reference } from \"@iiif/presentation-3\";\nimport { Creator, matchBasedOnResource } from \"@manifest-editor/creator-api\";\nimport { useCallback, useMemo } from \"react\";\nimport { useVault } from \"react-iiif-vault\";\nimport { useApp } from \"../AppContext/AppContext\";\nimport { createActionIdentity } from \"../helpers\";\nimport { useLayoutActions } from \"../Layout/Layout.context\";\nimport { usePreviewVault } from \"../PreviewVault/PreviewVault\";\n\nexport function useCreator(\n parent: any,\n property: string,\n type: string,\n target?: Reference,\n options?: { isPainting?: boolean; onlyReference?: boolean },\n) {\n const vault = useVault();\n const app = useApp();\n const { create, edit } = useLayoutActions();\n const supported = useMemo(\n () => matchBasedOnResource({ type, parent, index: 0, property }, app.layout.creators || [], { vault }),\n [parent, property, app.layout.creators, type, vault],\n );\n const canCreate = parent && supported.length !== 0;\n\n const wrappedCreate = useCallback(\n (index?: number, initialData?: any) => {\n if (parent) {\n return create({\n type,\n parent: toRef(parent),\n property,\n index,\n target,\n initialData,\n ...(options || {}),\n });\n }\n },\n [create, parent, property, type, options, target],\n );\n\n const wrappedFilteredCreate = useCallback(\n (filter: string, index?: number, initialData?: any) => {\n if (parent) {\n return create({\n type,\n filter,\n parent: toRef(parent),\n property,\n index,\n target,\n initialData,\n ...(options || {}),\n });\n }\n },\n [create, parent, property, type, options, target],\n );\n\n const wrappedEdit = useCallback(\n (resource: any, index?: number) => {\n edit(resource, parent ? { parent: toRef(parent), property, index } : undefined);\n },\n [edit, parent, property],\n );\n\n const wrappedCreator = useCallback(\n (initialCreator: string, initialData?: any) => {\n if (parent) {\n return create({\n type,\n initialCreator,\n parent: toRef(parent),\n property,\n target,\n initialData,\n ...(options || {}),\n });\n }\n },\n [type, property, parent, target, create, options],\n );\n\n const buttonProps = useMemo(() => {\n return {\n \"data-action-id\": createActionIdentity(type, property, parent),\n };\n }, [type, property, parent]);\n\n return [\n canCreate,\n {\n create: wrappedCreate,\n edit: wrappedEdit,\n createFiltered: wrappedFilteredCreate,\n creator: wrappedCreator,\n buttonProps,\n },\n ] as const;\n}\n\nexport function useInlineCreator() {\n const vault = useVault();\n const previewVault = usePreviewVault();\n const app = useApp();\n return useMemo(() => {\n return new Creator(vault, app.layout.creators || [], previewVault);\n }, [app.layout.creators, vault]);\n}\n","import { toRef } from \"@iiif/parser\";\nimport {\n ActionButton,\n BackIcon,\n CreatorGrid,\n EmptyState,\n ErrorMessage,\n GridIcon,\n IconButton,\n ModalBackSlot,\n Spinner,\n} from \"@manifest-editor/components\";\nimport {\n type CreatableResource,\n type CreatorDefinition,\n type CreatorOptions,\n matchBasedOnResource,\n} from \"@manifest-editor/creator-api\";\nimport { Button } from \"@manifest-editor/ui/atoms/Button\";\nimport { memo, Suspense, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useVault } from \"react-iiif-vault\";\nimport { useApp } from \"../AppContext/AppContext\";\nimport { useTemporaryHighlight } from \"../highlighted-image-resources\";\nimport { ModulePanelButton, useSetCustomTitle } from \"../Layout/components/ModularPanel\";\nimport { useLayoutActions } from \"../Layout/Layout.context\";\nimport { useInlineCreator } from \"./BaseCreator.hooks\";\n\ninterface BaseCreatorProps {\n resource: CreatableResource;\n}\n\nexport const RenderCreator = memo(function RenderCreator(props: {\n resource: CreatableResource;\n creator: CreatorDefinition;\n onCreate?: () => void;\n skipEditingOnCreate?: boolean;\n}) {\n const vault = useVault();\n const { edit, modal } = useLayoutActions();\n const [isCreating, setIsCreating] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const creator = useInlineCreator();\n const isCreatingRef = useRef(false);\n\n const canvasSelector = props.resource.initialData?.selector;\n useTemporaryHighlight(canvasSelector);\n\n const options: CreatorOptions = {\n targetType: props.resource.type,\n parent: props.resource.parent\n ? {\n property: props.resource.property as string,\n atIndex: props.resource.index,\n resource: props.resource.parent,\n }\n : undefined,\n target: props.resource.target,\n initialData: props.resource.initialData,\n };\n\n const runCreate = (payload: any) => {\n try {\n if (isCreating || isCreatingRef.current) return;\n setIsCreating(true);\n isCreatingRef.current = true;\n creator\n .create(props.creator.id, payload, options)\n .catch((err) => {\n setError(err?.message || \"Unknown error\");\n return null;\n })\n .then(async (ref) => {\n props.onCreate?.();\n if (props.skipEditingOnCreate) return;\n if (!ref) return;\n const singleRef = Array.isArray(ref) ? ref[0] : ref;\n setIsCreating(false);\n modal.popStack();\n modal.close();\n // Ref might be an array?\n if (singleRef) {\n edit(singleRef!, {\n parent: toRef(props.resource.parent),\n property: props.resource.property,\n index: props.resource.index,\n });\n }\n });\n } catch (err: any) {\n setError(err?.message || \"Unknown error\");\n }\n };\n\n const validate = async () => {\n return true;\n };\n\n useEffect(() => {\n if (props.resource.initialData?.showEmptyForm) {\n return;\n }\n\n if (!props.creator.render && !isCreating) {\n runCreate({});\n }\n }, [props.creator]);\n\n if (error) {\n return (\n <div className=\"flex flex-col items-center p-4\">\n <ErrorMessage>{error}</ErrorMessage>\n </div>\n );\n }\n\n const spinner = (\n <div className=\"flex flex-col items-center py-8\">\n <div className=\"flex gap-2 items-center\">\n <Spinner /> <span>Loading</span>\n </div>\n </div>\n );\n\n if (isCreating) {\n return spinner;\n }\n\n if (!props.creator.render) {\n return (\n <>\n <EmptyState>No options available</EmptyState>\n <ActionButton primary onPress={() => runCreate({})}>\n {props.creator.actionButton || \"Create\"}\n </ActionButton>\n </>\n );\n }\n\n return (\n <>\n <Suspense fallback={spinner}>\n {props.creator.render({\n vault,\n runCreate,\n validate,\n options,\n })}\n </Suspense>\n </>\n );\n});\n\nexport function BaseCreator(props: BaseCreatorProps) {\n const app = useApp();\n const vault = useVault();\n const [currentId, setCurrentId] = useState(props.resource.initialCreator || \"\");\n const set = useSetCustomTitle();\n const supported = useMemo(\n () =>\n matchBasedOnResource(props.resource, app.layout.creators || [], {\n vault,\n }),\n [props.resource, app.layout.creators, vault],\n );\n if (supported.length === 1 && !currentId) {\n setCurrentId(supported[0]!.id);\n }\n\n const current = supported.find((t) => t.id === currentId);\n\n useEffect(() => {\n if (current) {\n set?.(current.label);\n }\n });\n\n if (supported.length === 0) {\n return <EmptyState>Not currently supported</EmptyState>;\n }\n\n const backButton = (\n <ModalBackSlot>\n <IconButton\n root={document.getElementById(\"headlessui-portal-root\") || undefined}\n label=\"Back to Add content options\"\n className=\"group\"\n placement=\"right\"\n onPress={() => setCurrentId(\"\")}\n >\n <GridIcon className=\"text-2xl opacity-50 group-hover:opacity-70\" />\n </IconButton>\n </ModalBackSlot>\n );\n\n if (current) {\n const shouldHideModal = current.hiddenModal;\n\n if (shouldHideModal) {\n return (\n <>\n {backButton}\n <RenderCreator creator={current} resource={props.resource} />\n </>\n );\n }\n\n return (\n <div>\n {backButton}\n <div className={\"p-2 py-6\"}>\n <RenderCreator creator={current} resource={props.resource} />\n </div>\n </div>\n );\n }\n\n return (\n <CreatorGrid\n label=\"Select a type\"\n items={supported.map((item) => ({\n id: item.id,\n title: item.label,\n description: item.summary || \"\",\n icon: item.icon,\n onClick: () => setCurrentId(item.id),\n }))}\n />\n );\n}\n","import type { CreatableResource } from \"@manifest-editor/creator-api\";\nimport type { LayoutPanel } from \"../Layout/Layout.types\";\nimport { BaseCreator } from \"./BaseCreator\";\n\nexport const baseCreator: LayoutPanel = {\n id: \"@manifest-editor/creator\",\n label: \"Add content\",\n options: { hideHeader: true, tabs: false },\n render(state: CreatableResource) {\n return <BaseCreator resource={state} />;\n },\n};\n","import { toRef } from \"@iiif/parser\";\nimport type {\n EditingStackActionCreators,\n EditingStackState,\n} from \"./EditingStack.types\";\n\nexport function editingStackReducer(\n state: EditingStackState,\n action: EditingStackActionCreators,\n): EditingStackState {\n switch (action.type) {\n case \"setStack\": {\n return {\n ...state,\n stack: action.payload.resources,\n current: action.payload.resources[0] || null,\n };\n }\n\n case \"edit\": {\n let reset = action.payload.reset;\n if (\n action.payload.resource?.resource.source?.type === \"Manifest\" ||\n action.payload.resource?.resource.source?.type === \"Canvas\"\n ) {\n reset = true;\n }\n\n if (\n state.current?.resource.source.id ===\n action.payload.resource?.resource.source.id\n ) {\n return {\n ...state,\n current: action.payload.resource,\n };\n }\n\n return {\n ...state,\n current: action.payload.resource,\n stack: reset\n ? []\n : state.current\n ? [state.current, ...state.stack]\n : state.stack,\n };\n }\n case \"syncRemoval\": {\n const item = toRef(action.payload.resource.resource);\n if (!item) {\n return state;\n }\n const found = state.stack.find((r) => toRef(r.resource)?.id === item.id);\n\n if (!found) {\n return state;\n }\n\n const newCurrent =\n state.current?.resource.id === item.id ? null : state.current;\n const newStack = filterStack(\n state.stack.filter((r) => toRef(r.resource)?.id !== item.id),\n newCurrent,\n );\n\n return {\n ...state,\n stack: newStack,\n current: newCurrent,\n };\n }\n case \"updateCurrent\": {\n return {\n ...state,\n current: action.payload.resource,\n };\n }\n\n case \"back\": {\n const newCurrent = state.stack[0];\n return {\n ...state,\n stack: state.stack.slice(1),\n current: newCurrent || null,\n };\n }\n\n case \"close\": {\n return {\n ...state,\n stack: [], // @todo maybe not right?\n current: null,\n };\n }\n\n case \"create\": {\n if (action.payload.resource === null) {\n return { ...state, create: null };\n }\n\n return {\n ...state,\n create: action.payload as any,\n };\n }\n }\n\n return state;\n}\n\nfunction filterStack(\n newStackWithDuplicates: EditingStackState[\"stack\"],\n current: EditingStackState[\"current\"],\n): EditingStackState[\"stack\"] {\n const newStack = [];\n let prev = null;\n for (const stackItem of newStackWithDuplicates) {\n if (prev?.resource.id === stackItem.resource.id) {\n continue;\n }\n newStack.push(stackItem);\n prev = stackItem;\n }\n\n if (prev && prev.resource.id === current?.resource.id) {\n return newStack.slice(0, newStack.length - 1);\n }\n\n return newStack;\n}\n","import { toRef } from \"@iiif/parser\";\nimport type { Reference, SpecificResource } from \"@iiif/presentation-3\";\nimport { EditorInstance } from \"@manifest-editor/editor-api\";\nimport { createContext, useCallback, useContext, useEffect, useMemo, useReducer } from \"react\";\nimport { flushSync } from \"react-dom\";\nimport { useResourceContext, useVault } from \"react-iiif-vault\";\nimport invariant from \"tiny-invariant\";\nimport { useAppInstance } from \"../AppContext/AppContext\";\nimport { editingStackReducer } from \"./EditingStack.reducer\";\nimport type { EditableResource, EditingStackActions, EditingStackState } from \"./EditingStack.types\";\n\nconst defaultState: EditingStackState = { stack: [], current: null, create: null };\nexport const EditingStackContext = createContext<EditingStackState>(defaultState);\nconst EditingStackActionsContext = createContext<EditingStackActions>({\n edit() {},\n close() {},\n back() {},\n setStack() {},\n updateCurrent() {},\n create() {\n return () => {};\n },\n});\n\nexport function useEditingStack() {\n return useContext(EditingStackActionsContext);\n}\n\nexport function useEditingResource() {\n return useContext(EditingStackContext).current;\n}\n\nexport function useEditingResourceStack() {\n return useContext(EditingStackContext).stack;\n}\n\nexport function useCreatingResource() {\n return useContext(EditingStackContext).create;\n}\n\nexport function useManifestEditor() {\n const { manifest } = useResourceContext();\n const vault = useVault();\n const [key, invalidate] = useReducer((i: number) => i + 1, 0);\n\n invariant(manifest, \"Manifest not found\");\n\n const editor = useMemo(() => {\n return new EditorInstance({\n reference: { id: manifest, type: \"Manifest\" },\n vault,\n });\n }, [manifest, vault]);\n\n useEffect(() => {\n return editor.observe.start(invalidate);\n }, [editor]);\n\n editor.observe.key = `${key}`;\n editor.observe.reset();\n\n return editor;\n}\n\nexport function useCollectionEditor() {\n const { collection } = useResourceContext();\n const vault = useVault();\n const [key, invalidate] = useReducer((i: number) => i + 1, 0);\n\n invariant(collection, \"Collection not found\");\n\n const editor = useMemo(() => {\n return new EditorInstance({\n reference: { id: collection, type: \"Collection\" },\n vault,\n });\n }, [collection, vault]);\n\n useEffect(() => {\n return editor.observe.start(invalidate);\n }, [editor]);\n\n editor.observe.key = `${key}`;\n editor.observe.reset();\n\n return editor;\n}\n\nexport function useGenericEditor(\n ref: Reference<any> | SpecificResource | undefined,\n ctx: { parent?: Reference; parentProperty?: string; index?: number; allowNull?: boolean } = {},\n) {\n const vault = useVault();\n const [key, invalidate] = useReducer((i: number) => i + 1, 0);\n\n !ctx.allowNull && invariant(ref, \"Resource not found\");\n\n const editor = useMemo(() => {\n if (ctx.allowNull && !ref) {\n return null as any as EditorInstance<{}>;\n }\n\n return new EditorInstance({\n reference: toRef(ref) as any,\n vault,\n context: { resource: ref!, parent: ctx.parent, index: ctx.index, parentProperty: ctx.parentProperty },\n });\n }, [ref, vault]);\n\n useEffect(() => {\n return editor?.observe.start(invalidate);\n }, [editor]);\n\n if (editor) {\n editor.observe.key = `${key}`;\n editor.observe.reset();\n }\n\n return editor!;\n}\n\nexport function useAnnotationPageEditor() {\n const { annotationPage } = useResourceContext();\n\n invariant(annotationPage, \"Annotation page not found\");\n\n return useGenericEditor({ id: annotationPage, type: \"AnnotationPage\" });\n}\n\nexport function useEditor() {\n const resource = useEditingResource();\n const vault = useVault();\n const [key, invalidate] = useReducer((i: number) => i + 1, 0);\n\n invariant(resource, \"No resource selected\");\n\n const editor = useMemo(() => {\n return new EditorInstance({\n reference: resource.resource.source || resource.resource,\n vault,\n });\n }, [resource, vault]);\n\n useEffect(() => {\n return editor.observe.start(invalidate);\n }, [editor]);\n\n editor.observe.key = `${key}`;\n editor.observe.reset();\n\n return editor;\n}\n\nfunction useInternalEditingStackActions(defaultState: EditingStackState) {\n const vault = useVault();\n const [state, _dispatch] = useReducer(editingStackReducer, defaultState);\n\n const dispatch = useCallback((action: any) => {\n _dispatch(action);\n // (() => flushSync(() => _dispatch(action)))();\n }, []);\n\n useEffect(() => {\n return vault.on(\"@iiif/REMOVE_REFERENCE\", (payload: any) => {\n const action = payload.action;\n const parent = { id: action.payload.id, type: action.payload.type };\n const resource = action.payload.reference;\n _dispatch({ type: \"syncRemoval\", payload: { resource: { parent, resource } } });\n });\n }, [vault]);\n\n const edit = useCallback(\n (resource: EditableResource, reset = false) => dispatch({ type: \"edit\", payload: { resource, reset } }),\n [],\n );\n\n const setStack = useCallback(\n (resources: EditableResource[]) => dispatch({ type: \"setStack\", payload: { resources } }),\n [],\n );\n\n const updateCurrent = useCallback(\n (resource: EditableResource) => dispatch({ type: \"updateCurrent\", payload: { resource } }),\n [],\n );\n\n const close = useCallback(() => dispatch({ type: \"close\" }), []);\n\n const back = useCallback(() => dispatch({ type: \"back\" }), []);\n\n const create = useCallback<EditingStackActions[\"create\"]>((resource, options) => {\n dispatch({ type: \"create\", payload: { resource, options } });\n\n // Returns function when complete.\n return () => {\n dispatch({ type: \"create\", payload: { resource: null } });\n };\n }, []);\n\n const actions: EditingStackActions = useMemo(() => {\n return { edit, updateCurrent, close, back, create, setStack };\n }, []);\n\n return [state, actions] as const;\n}\n\nexport function EditingStack(props: {\n children?: any;\n initialState?: EditingStackState;\n editing?: { id: string; type: string };\n}) {\n const { instanceId } = useAppInstance();\n const [state, actions] = useInternalEditingStackActions(props.initialState || defaultState);\n\n return (\n <EditingStackActionsContext.Provider value={actions} key={instanceId}>\n <EditingStackContext.Provider value={state}>{props.children}</EditingStackContext.Provider>\n </EditingStackActionsContext.Provider>\n );\n}\n\nexport function InlineEditingStack({\n resource,\n children,\n}: {\n resource: { id: string; type: string };\n children?: React.ReactNode;\n}) {\n const { instanceId } = useAppInstance();\n const initialState = useMemo(() => {\n return {\n create: null,\n stack: [],\n current: {\n resource: {\n type: \"SpecificResource\",\n source: {\n id: resource.id,\n type: resource.type,\n },\n },\n },\n } as EditingStackState;\n }, []);\n const [state, actions] = useInternalEditingStackActions(initialState);\n\n return (\n <EditingStackActionsContext.Provider value={actions} key={instanceId}>\n <EditingStackContext.Provider value={state}>{children}</EditingStackContext.Provider>\n </EditingStackActionsContext.Provider>\n );\n}\n","import type { Vault } from \"@iiif/helpers\";\nimport { SidebarTabs } from \"@manifest-editor/components\";\nimport { BackIcon } from \"@manifest-editor/ui/icons/BackIcon\";\nimport { CloseIcon } from \"@manifest-editor/ui/icons/CloseIcon\";\nimport { type ReactNode, useContext, useEffect, useMemo } from \"react\";\nimport { ResourceReactContext, useVault } from \"react-iiif-vault\";\nimport { useApp } from \"../AppContext/AppContext\";\nimport { useAppResource } from \"../AppResourceProvider/AppResourceProvider\";\nimport { type EditorConfig, useConfig } from \"../ConfigContext/ConfigContext\";\nimport { useEditingResource, useEditingResourceStack, useEditingStack } from \"../EditingStack/EditingStack\";\nimport type { EditableResource } from \"../EditingStack/EditingStack.types\";\nimport { useLayoutActions } from \"../Layout/Layout.context\";\nimport type { EditorDefinition, ResourceDefinition } from \"../Layout/Layout.types\";\nimport { ModulePanelButton, useSetCustomTitle } from \"../Layout/components/ModularPanel\";\n\nexport function BaseEditorBackButton({ fallback, backAction }: any) {\n const stack = useEditingResourceStack();\n const { back } = useEditingStack();\n\n if (stack.length) {\n return (\n <ModulePanelButton onClick={back}>\n <BackIcon />\n </ModulePanelButton>\n );\n }\n\n return fallback;\n}\n\nexport function BaseEditorCloseButton({ closeAction, fallback }: any) {\n const stack = useEditingResourceStack();\n const current = useEditingResource();\n\n if (current || stack.length) {\n return (\n <ModulePanelButton\n onClick={() => {\n closeAction();\n }}\n >\n <CloseIcon />\n </ModulePanelButton>\n );\n }\n\n return fallback;\n}\n\nexport function editBasedOnResource(\n resource: EditableResource,\n list: ResourceDefinition[],\n options: { edit?: boolean; vault: Vault },\n config: EditorConfig,\n): ResourceDefinition | null {\n const filteredList = list.filter((l) => l.resourceType === resource.resource.source.type);\n\n if (filteredList.length === 0) {\n return null;\n }\n\n for (const item of filteredList) {\n // Check for a match in order.\n const sortKeys: string[] = [];\n const sortKeyFallbacks: Record<string, EditorDefinition> = {};\n // 1. Filter out the\n const editors = (item.editors || []).filter((editor) => {\n if (config.hideTabs && config.hideTabs.includes(editor.id)) {\n return false;\n }\n if (config.onlyTabs && !config.onlyTabs.includes(editor.id)) {\n return false;\n }\n if (editor.supports.sortKey) {\n if (sortKeys.includes(editor.supports.sortKey)) {\n return false;\n }\n if (editor.supports.sortFallback) {\n sortKeyFallbacks[editor.supports.sortKey] = editor;\n }\n }\n\n // Does this editor support the input resource.\n if (options.edit && !editor.supports.edit) {\n return false;\n }\n\n if (editor.supports.custom ? editor.supports.custom(resource, options.vault) === false : false) {\n return false;\n }\n\n // @todo more logic here, including \"custom\" supports check.\n\n if (editor.supports.sortKey) {\n sortKeys.push(editor.supports.sortKey);\n }\n\n return true;\n });\n\n const missingKeys = Object.keys(sortKeyFallbacks);\n for (const missingKey of missingKeys) {\n if (\n !sortKeys.includes(missingKey) &&\n sortKeyFallbacks[missingKey] &&\n !editors.includes(sortKeyFallbacks[missingKey]!)\n ) {\n editors.push(sortKeyFallbacks[missingKey]!);\n }\n }\n\n if (editors.length) {\n return {\n ...item,\n editors,\n };\n }\n }\n\n return null;\n}\n\nexport function BaseEditor({ currentTab = undefined }: { currentTab?: string }) {\n const resource = useEditingResource();\n const currentResourceContext = useContext(ResourceReactContext);\n const app = useApp();\n const rootResource = useAppResource();\n const vault = useVault();\n const { change } = useLayoutActions();\n const set = useSetCustomTitle();\n const { editorConfig } = useConfig();\n const resourceId = resource?.resource.source?.id;\n let resourceType = resource?.resource.source?.type;\n // Could use this is for later.\n const isNested = resourceId !== rootResource.id;\n if (resourceId && isNested && rootResource.type === \"Collection\" && resourceType === \"Collection\") {\n resourceType = \"EmbeddedCollection\";\n }\n\n const resourceConfig: EditorConfig = (resourceType ? (editorConfig as any)[resourceType] : editorConfig.All) || {};\n\n const newResourceContext = useMemo(() => {\n const newCtx = { ...currentResourceContext };\n const id = resource?.resource.source.id;\n const type = resource?.resource.source.type;\n const mapping = {\n Collection: \"collection\",\n Manifest: \"manifest\",\n Range: \"range\",\n Canvas: \"canvas\",\n Annotation: \"annotation\",\n AnnotationPage: \"annotationPage\",\n };\n\n if (type && (mapping as any)[type]) {\n (newCtx as any)[(mapping as any)[type]] = id;\n }\n return newCtx;\n }, [resource, currentResourceContext]);\n\n function wrap(children: ReactNode) {\n if (!resource) {\n return children;\n }\n\n return <ResourceReactContext.Provider value={newResourceContext}>{children}</ResourceReactContext.Provider>;\n }\n\n const match = useMemo(() => {\n if (!resource) {\n return null;\n }\n\n const editors = app.layout.editors || [];\n const resources = app.layout.resources || [];\n const mappedResources: ResourceDefinition[] = resources.map((resource: string | ResourceDefinition) => {\n if (typeof resource === \"string\") {\n return {\n id: \"@default/\" + resource,\n label: resource,\n resourceType: resource,\n auto: true,\n editors: editors.filter((e: any) => e.supports.resourceTypes.includes(resource)),\n };\n }\n return resource;\n });\n\n return editBasedOnResource(resource, mappedResources, { edit: true, vault }, resourceConfig);\n }, [resource, app]);\n\n useEffect(() => {\n set(match?.label || \"\");\n }, [match]);\n\n useEffect(() => {\n const availableKeys = match?.editors.map((editor) => editor.id) || [];\n const currentKey = availableKeys.find((key) => key === currentTab);\n if (!currentKey) {\n change(\"@manifest-editor/editor\", { currentTab: availableKeys[0] });\n }\n }, [match?.editors, currentTab, change]);\n\n // Problems to solve:\n // - Subscribing to updates to the reference\n // - Keeping track of changes to the item, by checking it's index\n // - If the items change - ensure we have the same index by doing an equality check on the reference?\n\n if (!resource || !match) {\n return null;\n }\n\n if (resourceConfig.singleTab) {\n const first = (match?.editors || []).find((editor) => editor.id === resourceConfig.singleTab);\n if (first) {\n return wrap(\n <div key={resource.resource.source?.id} className=\"w-full\">\n {first.component(resourceConfig)}\n </div>,\n );\n }\n }\n\n return wrap(\n <SidebarTabs\n isNested={isNested}\n rootResource={rootResource}\n key={resource.resource.source?.id}\n menuId={resource.resource.source.id}\n menu={(match?.editors || []).map((editor, key) => {\n return {\n id: editor.id,\n label: editor.label,\n renderComponent: () => editor.component(resourceConfig),\n };\n })}\n selectedKey={currentTab}\n onSelectionChange={(p: any) => {\n change(\"@manifest-editor/editor\", { currentTab: p });\n }}\n />,\n );\n}\n","import type { LayoutPanel } from \"../Layout/Layout.types\";\nimport {\n BaseEditor,\n BaseEditorBackButton,\n BaseEditorCloseButton,\n} from \"./BaseEditor\";\n\nexport const baseEditor: LayoutPanel = {\n id: \"@manifest-editor/editor\",\n label: \"Editor\",\n options: { hideHeader: true, tabs: true, minWidth: 400 },\n renderBackAction: ({ backAction, fallback }) => (\n <BaseEditorBackButton backAction={backAction} fallback={fallback} />\n ),\n renderCloseAction: ({ closeAction, fallback }) => (\n <BaseEditorCloseButton closeAction={closeAction} fallback={fallback} />\n ),\n render({ currentTab }) {\n return <BaseEditor currentTab={currentTab} />;\n },\n};\n","export const defaultTheme = {\n color: {\n main: \"#B84C74\",\n mainHover: \"#4a89ff\",\n logoPink: \"#E94581\",\n white: \"white\",\n grey: \"grey\",\n black: \"black\",\n lightgrey: \"#F8F9FA\",\n mediumgrey: \"#dddddd\",\n danger: \"#a90e21\",\n warning: \"#e38627\",\n lightdanger: \"#ffeaea\",\n lightsuccess: \"#c5e8c5\",\n success: \"#6ccd55\",\n greyOverlay: \"rgba(0, 0, 0, 0.2)\",\n highlight: \"#faeed7\",\n },\n iiifColor: {\n manifest: \"rgba(0, 0, 0, 0.2)\",\n canvas: \"rgba(255, 222, 219, 0.8)\",\n service: \"rgba(13, 110, 253, 0.8)\",\n annotation: \"rgba(247, 226, 173, 0.8)\",\n contentResource: \"rgba(207, 247, 255, 0.8)\",\n ranges: \"rgba(144, 213, 157, 0.8)\",\n },\n padding: {\n xs: \"0.25rem\",\n small: \"0.5rem\",\n medium: \"1rem\",\n large: \"2rem\",\n },\n device: {\n mobile: \"375px\",\n tablet: \"768px\",\n laptop: \"992px\",\n desktop: \"1200px\",\n },\n shadows: {\n standard: \"rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.05) 0px 5px 15px 0px\",\n bottom: \"rgba(0, 0, 0, 0.1) 0px 4px 2px -2px\",\n },\n};\n","import { useVault } from \"react-iiif-vault\";\nimport { useMemo } from \"react\";\nimport {\n type CreatableResource,\n matchBasedOnResource,\n} from \"@manifest-editor/creator-api\";\nimport { useApp } from \"../AppContext/AppContext\";\nimport { Tab, TabList, TabPanel, Tabs } from \"@manifest-editor/components\";\nimport { RenderCreator } from \"./BaseCreator\";\nimport { ThemeProvider } from \"styled-components\";\nimport { defaultTheme } from \"../ShellContext/default-theme\";\n\ninterface BaseAnnotationCreatorProps {\n resource: CreatableResource;\n onCreate: () => void;\n}\n\nexport function BaseAnnotationCreator(props: BaseAnnotationCreatorProps) {\n const {} = props;\n const vault = useVault();\n const app = useApp();\n const supported = useMemo(\n () =>\n matchBasedOnResource(props.resource, app.layout.creators || [], {\n vault,\n }),\n [props.resource, app.layout.creators, vault],\n );\n\n if (supported.length === 0) {\n return <div>No supported creators found</div>;\n }\n\n return (\n <div>\n <Tabs className=\"w-full flex-1 overflow-hidden flex flex-col\">\n <TabList\n className=\"flex-1 overflow-hidden w-full flex text-sm whitespace-nowrap\"\n items={supported}\n >\n {(item) => <Tab id={item.id}>{item.label}</Tab>}\n </TabList>\n {supported.map((item) => {\n return (\n <TabPanel key={item.id} id={item.id} className=\"p-2\">\n <ThemeProvider theme={defaultTheme}>\n <RenderCreator\n creator={item}\n resource={props.resource}\n onCreate={props.onCreate}\n skipEditingOnCreate\n />\n </ThemeProvider>\n </TabPanel>\n );\n })}\n </Tabs>\n </div>\n );\n}\n","import { useMemo, useRef, useState } from \"react\";\n\nexport function useDecayState(time: number) {\n const [active, _setActive] = useState(false);\n const lastTimeout = useRef<any>();\n const focusCount = useRef<any>(0);\n\n function clear(existing?: boolean) {\n focusCount.current--;\n\n if (existing && focusCount.current !== 0) {\n return;\n }\n\n if (lastTimeout.current) {\n clearTimeout(lastTimeout.current);\n lastTimeout.current = 0;\n }\n lastTimeout.current = setTimeout(() => {\n _setActive(false);\n }, time);\n }\n\n function set() {\n focusCount.current++;\n if (lastTimeout.current) {\n clearTimeout(lastTimeout.current);\n }\n _setActive(true);\n }\n\n return useMemo(() => [active, { set, clear }] as const, [active]);\n}\n","import { ActionButton, Form, Sidebar, SidebarContent, SidebarHeader } from \"@manifest-editor/components\";\nimport { useAppResource } from \"../AppResourceProvider/AppResourceProvider\";\nimport { useDecayState } from \"../hooks/use-decay-state\";\nimport { usePreviewContext, usePreviews } from \"../PreviewContext/PreviewContext\";\nimport { type Config, useConfig, useSaveConfig } from \"./ConfigContext\";\n\nexport function ConfigEditor() {\n const previews = usePreviewContext();\n const resource = useAppResource();\n const config = useConfig();\n const setConfig = useSaveConfig();\n const [isSaved, saveState] = useDecayState(2000);\n\n function onSubmit(e: React.FormEvent) {\n e.preventDefault();\n const formValues = new FormData(e.target as HTMLFormElement);\n\n const newConfig: Partial<Config> = {\n defaultPreview: formValues.get(\"defaultPreview\") as string,\n i18n: {\n ...(config.i18n || ({} as any)),\n advancedLanguageMode: formValues.get(\"advancedLanguageMode\") === \"on\",\n availableLanguages: ((formValues.get(\"availableLanguages\") as string) || \"\")\n .split(\",\")\n .map((t: string) => t.trim()),\n defaultLanguage: formValues.get(\"defaultLanguage\") as string,\n },\n export: {\n ...(config.export || ({} as any)),\n version: formValues.get(\"isVersion2\") === \"on\" ? 2 : 3,\n baseIdentifier: (formValues.get(\"base\") as string) || null,\n },\n editorFeatureFlags: {\n ...(config.editorFeatureFlags || ({} as any)),\n rememberCanvasId: formValues.get(\"rememberCanvasId\") === \"on\",\n rememberLeftPanelId: formValues.get(\"rememberLeftPanelId\") === \"on\",\n annotationPopups: formValues.get(\"annotationPopups\") === \"on\",\n manifestGridOptions: formValues.get(\"manifestGridOptions\") === \"on\",\n enableMultiImageCanvases: formValues.get(\"enableMultiImageCanvases\") === \"on\",\n enableMultiMediaCanvases: formValues.get(\"enableMultiMediaCanvases\") === \"on\",\n },\n };\n\n setConfig(newConfig);\n saveState.set();\n saveState.clear();\n }\n\n return (\n <Sidebar>\n <SidebarHeader title=\"Workspace configuration\" />\n {isSaved ? <div className=\"bg-me-primary-500 text-white p-3 text-sm\">Changes saved</div> : null}\n <SidebarContent className=\"p-4\">\n <Form.Form onSubmit={onSubmit} className=\"flex flex-col gap-3\">\n <Form.InputContainer>\n <Form.Label htmlFor=\"defaultLanguage\">Default Language</Form.Label>\n <Form.Input\n type=\"text\"\n name=\"defaultLanguage\"\n id=\"defaultLanguage\"\n defaultValue={config.i18n?.defaultLanguage || \"\"}\n />\n </Form.InputContainer>\n\n <Form.InputContainer>\n <Form.Label htmlFor=\"availableLanguages\">Available Languages</Form.Label>\n <Form.Input\n type=\"text\"\n name=\"availableLanguages\"\n id=\"availableLanguages\"\n defaultValue={(config.i18n?.availableLanguages || []).join(\", \")}\n />\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"advancedLanguageMode\"\n id=\"advancedLanguageMode\"\n defaultChecked={config.i18n?.advancedLanguageMode || false}\n />\n <Form.Label htmlFor=\"advancedLanguageMode\">Advanced Language Mode</Form.Label>\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"textGranularityEnabled\"\n id=\"textGranularityEnabled\"\n defaultChecked={config.i18n?.textGranularityEnabled || false}\n />\n <Form.Label htmlFor=\"textGranularityEnabled\">Enable text granularity</Form.Label>\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"rememberCanvasId\"\n id=\"rememberCanvasId\"\n defaultChecked={config.editorFeatureFlags?.rememberCanvasId || false}\n />\n <Form.Label htmlFor=\"rememberCanvasId\">Remember Canvas ID</Form.Label>\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"rememberLeftPanelId\"\n id=\"rememberLeftPanelId\"\n defaultChecked={config.editorFeatureFlags?.rememberLeftPanelId || false}\n />\n <Form.Label htmlFor=\"rememberLeftPanelId\">Remember Left panel</Form.Label>\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"manifestGridOptions\"\n id=\"manifestGridOptions\"\n defaultChecked={config.editorFeatureFlags?.manifestGridOptions || false}\n />\n <Form.Label htmlFor=\"manifestGridOptions\">Manifest Grid Options</Form.Label>\n </Form.InputContainer>\n\n <Form.InputContainer horizontal className=\"my-3\">\n <Form.Input\n type=\"checkbox\"\n name=\"isVersion2\"\n id=\"isVersion2\"\n defaultChecked={config.export?.version === 2}\n />\n <Form.Label htmlFor=\"isVersion2\">Export Presentation 2 {resource.type}s</Form.Label>\n </Form.InputContainer>\n\n {/* <Form.InputContainer>\n <Form.Label htmlFor=\"base\">Base Identifier</Form.Label>\n <Form.Input\n type=\"text\"\n name=\"base\"\n id=\"base\"\n autoComplete=\"none\"\n defaultValue={config.export?.baseIdentifier || \"\"}\n />\n </Form.InputContainer> */}\n\n <Form.InputContainer>\n <Form.Label htmlFor=\"defaultPreview\">Default preview</Form.Label>\n <div>\n {previews.configs.map((preview, key) => {\n if (preview.type === \"iiif-preview-service\") {\n return null;\n }\n return (\n <Form.InputContainer key={preview.id} horizontal>\n <Form.Input\n type=\"radio\"\n id={preview.id}\n name=\"defaultPreview\"\n value={preview.id}\n defaultChecked={!config.defaultPreview ? key === 0 : config.defaultPreview === preview.id}\n />\n <label htmlFor={preview.id}>{preview.label}</label>\n </Form.InputContainer>\n );\n })}\n </div>\n </Form.InputContainer>\n {resource.type === \"Manifest\" ? (\n <a\n className=\"text-sm text-me-primary-500 hover:underline hover:text-me-primary-600\"\n href={\n window.location.pathname.includes(\"/exhibition\")\n ? window.location.pathname.replace(\"/exhibition\", \"\") || \"/\"\n : `${window.location.pathname}/exhibition`\n }\n >\n {window.location.pathname.includes(\"/exhibition\")\n ? \"Return to Manifest Editor\"\n : \"Go to Exhibition Editor\"}\n </a>\n ) : null}\n\n <div className=\"mt-5\">\n <ActionButton type=\"submit\">{\"Save changes\"}</ActionButton>\n </div>\n </Form.Form>\n </SidebarContent>\n </Sidebar>\n );\n}\n","import { createContext, useContext, useEffect, useMemo } from \"react\";\nimport { createStore, type StoreApi, useStore } from \"zustand\";\nimport { randomId } from \"../helpers\";\n\nexport type ContextMenuItem = {\n id: string;\n label: string;\n onAction: (options: { position: { x: number; y: number }; resource: { id: string; type: string } }) => void;\n disabled?: boolean;\n enabled?: boolean;\n enabledFunction?: (options: { resource: { id: string; type: string } }) => boolean;\n order?: number;\n};\n\nexport type ContextMenuRequest = {\n resource?: { id?: string; type: string };\n sectionTitle?: string;\n items: Array<ContextMenuItem>;\n};\n\ntype ContextMenuStore = {\n specificMenus: Record<\n string,\n {\n menus: Record<\n string,\n | {\n sectionTitle?: string;\n items: Array<ContextMenuItem>;\n }\n | undefined\n >;\n }\n >;\n\n resourceMenus: Record<\n string,\n {\n menus: Record<\n string,\n | {\n sectionTitle?: string;\n items: Array<ContextMenuItem>;\n }\n | undefined\n >;\n }\n >;\n\n hookMenuItem(req: ContextMenuRequest): () => void;\n};\n\nfunction createContextMenuStore() {\n return createStore<ContextMenuStore>((set, get) => ({\n specificMenus: {},\n resourceMenus: {},\n hookMenuItem(req: ContextMenuRequest) {\n const requestId = randomId();\n const resourceId = req.resource?.id || \"\";\n const resourceType = req.resource?.type;\n if (!resourceType) return () => {};\n\n if (resourceId) {\n set((prev) => {\n return {\n specificMenus: {\n ...prev.specificMenus,\n [resourceId]: {\n ...(prev.specificMenus[resourceId] || {}),\n menus: {\n ...(prev.specificMenus[resourceId]?.menus || {}),\n [requestId]: {\n sectionTitle: req.sectionTitle,\n items: req.items,\n },\n },\n },\n },\n };\n });\n\n return () => {\n set((prev) => {\n return {\n specificMenus: {\n ...prev.specificMenus,\n [resourceId]: {\n ...(prev.specificMenus[resourceId] || {}),\n menus: {\n ...(prev.specificMenus[resourceId]?.menus || {}),\n [requestId]: undefined,\n },\n },\n },\n };\n });\n };\n }\n set((prev) => {\n return {\n resourceMenus: {\n ...prev.resourceMenus,\n [resourceType]: {\n ...(prev.resourceMenus[resourceType] || {}),\n menus: {\n ...(prev.resourceMenus[resourceType]?.menus || {}),\n [requestId]: {\n sectionTitle: req.sectionTitle,\n items: req.items,\n },\n },\n },\n },\n };\n });\n\n return () => {\n set((prev) => {\n return {\n resourceMenus: {\n ...prev.resourceMenus,\n [resourceType]: {\n ...(prev.resourceMenus[resourceType] || {}),\n menus: {\n ...(prev.resourceMenus[resourceType]?.menus || {}),\n [requestId]: undefined,\n },\n },\n },\n };\n });\n };\n },\n }));\n}\n\nexport const ContextMenuReactContext = createContext<StoreApi<ContextMenuStore> | null>(null);\n\nexport function ContextMenuProvider({ children }: { children: React.ReactNode }) {\n const store = useMemo(() => {\n return createContextMenuStore();\n }, []);\n\n return <ContextMenuReactContext.Provider value={store}>{children}</ContextMenuReactContext.Provider>;\n}\n\nfunction useContextMenuStore() {\n const ctx = useContext(ContextMenuReactContext);\n if (!ctx) {\n throw new Error(\"useContextMenuStore must be used within a ContextMenuProvider\");\n }\n return ctx;\n}\n\nexport function useResourceContextMenuItems(req: { id?: string; type: string }) {\n const store = useContextMenuStore();\n const resourceMenus = useStore(store, (s) => s.resourceMenus);\n const specificMenus = useStore(store, (s) => s.specificMenus);\n\n return useMemo(() => {\n const specificRequests = specificMenus[req.id || \"\"]?.menus || {};\n const resourceRequests = resourceMenus[req.type]?.menus || {};\n\n const specificItems = Object.values(specificRequests).flat();\n const resourceItems = Object.values(resourceRequests).flat();\n\n const items = [...resourceItems, ...specificItems].filter((t) => typeof t !== \"undefined\");\n const seenIds: string[] = [];\n const returnSections = [];\n\n for (const section of items) {\n const sectionItems = [];\n for (const sectionItem of section.items || []) {\n if (sectionItem.id && seenIds.includes(sectionItem.id)) continue;\n seenIds.push(sectionItem.id);\n sectionItems.push(sectionItem);\n }\n if (sectionItems.length) {\n returnSections.push({\n ...section,\n items: sectionItems,\n });\n }\n }\n\n return mergeSectionsWithTheSameTitle(returnSections);\n }, [specificMenus, resourceMenus, req.id, req.type]);\n}\n\nfunction mergeSectionsWithTheSameTitle(sections: Array<{ sectionTitle?: string; items: Array<ContextMenuItem> }>) {\n const sectionMap: Record<string, ContextMenuItem[]> = {};\n const emptySections: ContextMenuItem[] = [];\n\n sections.forEach((section) => {\n if (!section) return;\n const title = section.sectionTitle;\n if (!title) {\n emptySections.push(...(section.items || []));\n return;\n }\n if (!sectionMap[title]) {\n sectionMap[title] = [];\n }\n sectionMap[title].push(...section.items);\n });\n\n const returnSections: Array<{ sectionTitle?: string; items: Array<ContextMenuItem> }> = Object.entries(\n sectionMap,\n ).map(([title, items]) => ({\n sectionTitle: title,\n items,\n }));\n\n if (emptySections.length) {\n returnSections.push({ items: emptySections });\n }\n\n return returnSections;\n}\n\nexport function useCustomContextMenu(req: ContextMenuRequest, deps: any[] = []) {\n const store = useContextMenuStore();\n const hookMenuItem = useStore(store, (s) => s.hookMenuItem);\n\n useEffect(() => {\n return hookMenuItem(req);\n }, [hookMenuItem, req.resource?.id, req.resource?.type, ...deps]);\n}\n",".CenterPanelContainer {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n background: #fff;\n margin: 1.2rem;\n padding: 1em;\n border-radius: 10px;\n box-shadow:\n 0 4px 15px 0 rgba(0, 0, 0, 0.18),\n 0 0px 0px 1px rgba(0, 0, 0, 0.15),\n inset 0 0 0 1px rgba(255, 255, 255, 0.2);\n}\n\n.CenterPanelHeader {\n height: 3em;\n display: flex;\n align-items: center;\n margin-bottom: 1em;\n}\n\n.CenterPanelClose {\n margin-left: auto;\n align-self: center;\n}\n\n.CenterPanelTitle {\n margin: 0;\n}\n","import { ReactNode } from \"react\";\nimport $ from \"./CenterPanelContainer.module.css\";\nimport { Button } from \"../../atoms/Button\";\nimport { CloseIcon } from \"../../icons/CloseIcon\";\n\ninterface CenterPanelContainerProps {\n close?: () => void;\n title?: string;\n children: ReactNode;\n}\n\nexport function CenterPanelContainer(props: CenterPanelContainerProps) {\n return (\n <div className={$.CenterPanelContainer}>\n {props.title || props.close ? (\n <div className={$.CenterPanelHeader}>\n {props.title ? <h2 className={$.CenterPanelTitle}>{props.title}</h2> : null}\n {props.close ? (\n <Button className={$.CenterPanelClose} onClick={props.close}>\n <CloseIcon />\n </Button>\n ) : null}\n </div>\n ) : null}\n {props.children}\n </div>\n );\n}\n","import styled from \"styled-components\";\nimport {\n createRef,\n forwardRef,\n KeyboardEventHandler,\n ReactNode,\n RefObject,\n UIEventHandler,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { DownIcon } from \"../icons/DownIcon\";\n\nexport const AccordionContainer = styled.div`\n flex: 1;\n display: flex;\n width: 100%;\n flex-direction: column;\n position: relative;\n`;\n\nconst ItemRow = styled.div`\n background: #fff;\n position: relative;\n border-bottom: 1px solid #d0d0d0;\n border-top: 1px solid #d0d0d0;\n\n & ~ & {\n border-top: none;\n }\n\n &[data-large=\"true\"] {\n background: #f7f7f7;\n border: none;\n margin-bottom: 1em;\n //display: flex;\n //flex-direction: column;\n //justify-content: center;\n }\n`;\n\nconst ItemDescription = styled.p`\n font-size: 0.9em;\n color: #777;\n font-weight: 400;\n`;\n\nconst ItemLabel = styled.button`\n color: inherit;\n text-rendering: geometricPrecision;\n border: none;\n text-align: left;\n background: transparent;\n font: inherit;\n text-transform: uppercase;\n padding: 0.6em 1.2em;\n flex: 1;\n font-size: 0.8em;\n font-weight: 600;\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 0;\n overflow: hidden;\n\n &:focus {\n outline: none;\n }\n\n p {\n display: none;\n }\n\n [data-large=\"true\"] & {\n //padding: 1.5em;\n padding: 0.85em 1.25em;\n display: block;\n text-transform: initial;\n font-size: 1em;\n margin-bottom: 0;\n color: #000;\n\n p {\n display: block;\n color: #999;\n font-size: 0.9em;\n margin: 0;\n margin-top: 0.5em;\n }\n }\n`;\n\nconst ItemCollapse = styled.div`\n font-size: 1.4em;\n padding-right: 0.3em;\n display: flex;\n align-items: center;\n\n [data-large=\"true\"] & {\n font-size: 2em;\n }\n`;\n\nconst ItemIcon = styled.div`\n width: 2em;\n align-items: center;\n //padding-top: 0.5em;\n display: flex;\n justify-content: center;\n margin-left: 1.5em;\n svg {\n width: 1.75em;\n height: 1.75em;\n fill: #999;\n color: #999;\n }\n`;\n\nconst ItemBodyInner = styled.div<{ $full?: boolean }>`\n min-height: 0;\n overflow: visible;\n display: flex;\n`;\n\nconst ItemBodyPadding = styled.div<{ $full?: boolean; $max?: boolean }>`\n min-height: 0;\n overflow: visible;\n flex: 1;\n padding: 1em 1em 1.5em;\n\n &[data-full=\"true\"] {\n margin: 0;\n }\n\n &[data-max-height=\"true\"] {\n overflow-y: auto;\n }\n`;\n\nconst ItemBody = styled.section<{\n $initial?: boolean;\n $scrolled?: boolean;\n}>`\n display: grid;\n grid-template-rows: 0fr;\n overflow: hidden;\n opacity: 0;\n visibility: hidden;\n\n [data-open=\"true\"] & {\n opacity: 1;\n grid-template-rows: 1fr;\n visibility: visible;\n &[data-overflow=\"true\"] {\n overflow: visible;\n }\n }\n\n transition:\n all 0.4s,\n visibility 0.8s;\n\n &[data-has-icon=\"true\"] {\n padding-left: 4em;\n }\n\n box-shadow: inset 0px 2px 0px 0 rgba(0, 0, 0, 0);\n &[data-scrolled=\"true\"] {\n box-shadow: inset 0px 2px 0px 0 rgba(0, 0, 0, 0.1);\n }\n`;\n\nconst ItemHeading = styled.div<{ $open?: boolean }>`\n position: sticky;\n display: flex;\n top: 0;\n background: #fff;\n min-width: 0;\n width: 100%;\n color: #757575;\n z-index: 1;\n &:hover {\n color: #333;\n }\n\n [data-large=\"true\"] & {\n border: 1px solid #d0d0d0;\n &:after {\n display: none;\n }\n }\n\n [data-large=\"true\"]:focus-within & {\n border-color: #3579f6;\n }\n\n [data-open=\"true\"] & {\n color: #333;\n &:after {\n content: \"\";\n height: 1px;\n background: #eee;\n position: absolute;\n top: 100%;\n left: 0.5em;\n right: 0.5em;\n }\n }\n`;\n\ninterface AccordionItemProps {\n label: string | ReactNode;\n description?: string | ReactNode;\n icon?: ReactNode;\n children: ReactNode;\n initialOpen?: boolean;\n maxHeight?: number | false;\n fullWidth?: boolean;\n overflow?: boolean;\n onChange?: (value: boolean) => void;\n large?: boolean;\n}\n\nexport interface AccordionItemRef {\n open(): void;\n close(): void;\n toggle(): void;\n focus(): void;\n button?: RefObject<HTMLButtonElement>;\n}\n\nconst noop = (() => void 0) as any;\n\nlet keyIdIndex = 0;\nfunction useId() {\n return useMemo(() => keyIdIndex++, []);\n}\n\nexport function useAccordionItems(itemsLength: number, singleMode = false) {\n const [elRefs, setElRefs] = useState<RefObject<AccordionItemRef>[]>([]);\n const current = useRef(-1);\n\n const onKeyDown: KeyboardEventHandler<HTMLDivElement> = (e) => {\n const currentEl = document.activeElement;\n const currentIndex = elRefs.findIndex((r) => r.current?.button?.current === currentEl);\n if (currentIndex === -1) {\n return;\n }\n\n switch (e.code) {\n case \"Home\": {\n const next = 0;\n if (elRefs[next]) {\n elRefs[next].current?.focus();\n }\n break;\n }\n case \"End\": {\n const next = itemsLength - 1;\n if (elRefs[next]) {\n elRefs[next]!.current?.focus();\n }\n break;\n }\n\n case \"ArrowDown\": {\n if (currentIndex !== itemsLength - 1) {\n const next = currentIndex + 1;\n if (elRefs[next]) {\n elRefs[next]!.current?.focus();\n }\n }\n break;\n }\n // Focus previous\n case \"ArrowUp\": {\n if (currentIndex !== 0) {\n const next = currentIndex - 1;\n if (elRefs[next]) {\n elRefs[next]!.current?.focus();\n }\n }\n break;\n }\n // Focus next\n case \"ArrowLeft\": {\n // Close current\n const el = elRefs[currentIndex];\n if (el && el.current) {\n el.current.close();\n }\n break;\n }\n // Open current\n case \"ArrowRight\": {\n // Close current\n const el = elRefs[currentIndex];\n if (el && el.current) {\n el.current.open();\n }\n break;\n }\n }\n };\n\n const onChange = (key: number, isOpen: boolean) => {\n if (singleMode && isOpen && key !== current.current) {\n current.current = key;\n for (let i = 0; i < elRefs.length; i++) {\n const ref = elRefs[i];\n if (i === key) {\n continue;\n }\n ref!.current?.close();\n }\n }\n };\n\n useEffect(() => {\n // add or remove refs\n setElRefs((elRefs_) =>\n Array(itemsLength)\n .fill(0)\n .map((_, i) => elRefs_[i] || createRef())\n );\n }, [itemsLength]);\n\n const getItemProps = (key: number) => {\n return {\n ref: elRefs[key],\n onChange: (isOpen: boolean) => onChange(key, isOpen),\n };\n };\n\n const open = (key: number) => {\n const el = elRefs[key];\n if (el && el.current) {\n el.current.open();\n }\n };\n\n const close = (key: number) => {\n const el = elRefs[key];\n if (el && el.current) {\n el.current.close();\n }\n };\n\n const toggle = (key: number) => {\n const el = elRefs[key];\n if (el && el.current) {\n el.current.toggle();\n }\n };\n\n const focus = (key: number) => {\n const el = elRefs[key];\n if (el && el.current) {\n el.current.focus();\n }\n };\n\n const openAll = () => {\n for (let i = 0; i < elRefs.length; i++) {\n const ref = elRefs[i]!;\n ref.current?.open();\n }\n };\n\n const closeAll = () => {\n for (let i = 0; i < elRefs.length; i++) {\n const ref = elRefs[i]!;\n ref.current?.close();\n }\n };\n\n return {\n open,\n close,\n toggle,\n focus,\n openAll,\n closeAll,\n onKeyDown,\n getItemProps,\n };\n}\n\nexport const AccordionItem = forwardRef<AccordionItemRef, AccordionItemProps>(function AccordionItem(props, ref) {\n const content = useRef<HTMLDivElement>(null);\n const btn = useRef<HTMLButtonElement>(null);\n const id = useId();\n\n const [open, setIsOpen] = useState<boolean>(props.initialOpen || false);\n const onChange = props.onChange || noop;\n const toggle = () => {\n onChange(!open);\n setIsOpen((o) => !o);\n };\n const maxHeight = props.maxHeight;\n const [scrolled, setScrolled] = useState(false);\n\n useImperativeHandle(ref, () => ({\n open() {\n onChange(true);\n setIsOpen(true);\n },\n close() {\n onChange(false);\n setIsOpen(false);\n },\n toggle() {\n toggle();\n },\n focus() {\n if (btn.current) {\n btn.current.focus();\n }\n },\n button: btn,\n }));\n\n const onScroll: UIEventHandler<HTMLDivElement> = (e) => {\n if ((e.target as HTMLDivElement).scrollTop > 0) {\n setScrolled(true);\n } else {\n setScrolled(false);\n }\n };\n\n return (\n <ItemRow data-large={props.large} data-open={open}>\n <ItemHeading data-open={open}>\n {props.icon ? <ItemIcon onClick={toggle}>{props.icon}</ItemIcon> : null}\n <ItemLabel ref={btn} onClick={toggle} aria-expanded={open} aria-controls={`accordion-${id}`}>\n {props.label}\n {props.description ? <ItemDescription>{props.description}</ItemDescription> : null}\n </ItemLabel>\n <ItemCollapse onClick={toggle}>\n <DownIcon width=\"1em\" height=\"1em\" rotate={open ? 0 : 180} />\n </ItemCollapse>\n </ItemHeading>\n <ItemBody\n aria-labelledby={`accordion-${id}`}\n aria-hidden={!open}\n data-overflow={!!props.overflow}\n data-has-icon={!!props.icon}\n onScroll={onScroll}\n ref={content}\n $initial={!open}\n data-scrolled={scrolled}\n hidden={!open}\n >\n <ItemBodyInner>\n <ItemBodyPadding\n data-max-height={!!maxHeight}\n data-full={props.fullWidth}\n style={{ maxHeight: maxHeight || undefined }}\n >\n {props.children}\n </ItemBodyPadding>\n </ItemBodyInner>\n </ItemBody>\n </ItemRow>\n );\n});\n\ninterface AccordionProps {\n singleMode?: boolean;\n items: Array<AccordionItemProps>;\n maxHeight?: number | false;\n overflow?: boolean;\n}\n\nexport function Accordion(props: AccordionProps) {\n const { getItemProps, onKeyDown } = useAccordionItems(props.items.length, props.singleMode);\n\n return (\n <AccordionContainer onKeyDown={onKeyDown}>\n {props.items.map((item, key) => (\n <AccordionItem overflow={props.overflow} maxHeight={props.maxHeight} key={key} {...item} {...getItemProps(key)}>\n {item.children}\n </AccordionItem>\n ))}\n </AccordionContainer>\n );\n}\n","export function DownloadIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"48\" viewBox=\"0 -960 960 960\" width=\"48\">\n <path d=\"M220-160q-24 0-42-18t-18-42v-143h60v143h520v-143h60v143q0 24-18 42t-42 18H220Zm260-153L287-506l43-43 120 120v-371h60v371l120-120 43 43-193 193Z\" />\n </svg>\n );\n}\n","import styled from \"styled-components\";\n\nexport const ButtonRow = styled.div`\n padding: 0.3em;\n\n display: flex;\n background: #e4e7ef;\n border-radius: 3px;\n margin: 0.3em 0;\n gap: 0.3em;\n\n button,\n a {\n //\n\n & ~ & {\n margin-left: 0.3em;\n }\n }\n\n &[data-sticky=\"true\"] {\n position: sticky;\n bottom: 0;\n }\n`;\n","import { Button } from \"@manifest-editor/ui/atoms/Button\";\nimport { useMemo } from \"react\";\nimport { useManifest, useVault } from \"react-iiif-vault\";\nimport { useLayoutActions } from \"../Layout/Layout.context\";\nimport { CenterPanelContainer } from \"@manifest-editor/ui/CenterPanelContainer\";\nimport { Accordion } from \"@manifest-editor/ui/atoms/Accordion\";\nimport { copyToClipboard, createDownload } from \"../helpers\";\nimport { DownloadIcon } from \"@manifest-editor/ui/icons/DownloadIcon\";\nimport { ButtonRow } from \"@manifest-editor/ui/atoms/ButtonRow\";\n\nexport interface ExportPanelProps {\n // We could limit versions / download options etc.\n initialVersion?: 2 | 3;\n versions?: Array<2 | 3>;\n}\n\nexport function ExportPanel(props: ExportPanelProps) {\n const manifest = useManifest();\n const vault = useVault();\n const actions = useLayoutActions();\n\n const version3 = useMemo(() => {\n return JSON.stringify(vault.toPresentation3(manifest as any), null, 2);\n }, [manifest, vault]);\n\n const version2 = useMemo(() => {\n return JSON.stringify(vault.toPresentation2(manifest as any), null, 2);\n }, [manifest, vault]);\n\n return (\n <CenterPanelContainer title=\"Export manifest\" close={actions.centerPanel.popStack}>\n <div style={{ flex: 1, overflowY: \"auto\" }}>\n <Accordion\n items={[\n {\n label: \"Presentation 3\",\n description: 'Download this version by clicking the \"Download\" button.',\n maxHeight: 400,\n large: true,\n initialOpen: true,\n overflow: true,\n icon: (\n <Button onClick={() => createDownload(version3, \"manifest.json\")}>\n <DownloadIcon />\n </Button>\n ),\n children: (\n <div style={{ maxWidth: \"100%\" }}>\n <pre style={{ whiteSpace: \"pre-wrap\" }}>\n {JSON.stringify(vault.toPresentation3(manifest as any), null, 2)}\n </pre>\n <ButtonRow data-sticky=\"true\">\n <Button onClick={() => copyToClipboard(version3)}>Copy to clipboard</Button>\n <Button onClick={() => createDownload(version3, \"manifest.json\")}>Download</Button>\n </ButtonRow>\n </div>\n ),\n },\n {\n label: \"Presentation 2\",\n description: 'Download this version by clicking the \"Download\" button.',\n maxHeight: 400,\n large: true,\n icon: (\n <Button onClick={() => createDownload(version2, \"manifest.json\")}>\n <DownloadIcon />\n </Button>\n ),\n children: (\n <div style={{ maxWidth: \"100%\" }}>\n <pre style={{ whiteSpace: \"pre-wrap\" }}>\n {JSON.stringify(vault.toPresentation2(manifest as any), null, 2)}\n </pre>\n <ButtonRow data-sticky=\"true\">\n <Button onClick={() => copyToClipboard(version2)}>Copy to clipboard</Button>\n <Button onClick={() => createDownload(version2, \"manifest.json\")}>Download</Button>\n </ButtonRow>\n </div>\n ),\n },\n ]}\n />\n </div>\n </CenterPanelContainer>\n );\n}\n","import type { Emitter } from \"mitt\";\nimport mitt from \"mitt\";\nimport { createContext, useContext, useEffect } from \"react\";\n\nconst events = mitt();\n\nexport const ReactEmitterContext = createContext<Emitter<any>>(events);\n\nexport function EventEmitterProvider({\n children,\n emitter,\n}: { children: React.ReactNode; emitter: Emitter<any> }) {\n return (\n <ReactEmitterContext.Provider value={emitter}>\n {children}\n </ReactEmitterContext.Provider>\n );\n}\n\nexport function useEmitter<\n Event extends Record<string | symbol, unknown>,\n>(): Emitter<Event> {\n return useContext(ReactEmitterContext);\n}\n\nexport function useEvent<\n Event extends Record<string | symbol, unknown>,\n Key extends keyof Event,\n>(key: Key, listener: (data: Event[Key]) => void, deps: any[] = []) {\n const emitter = useContext(ReactEmitterContext);\n useEffect(() => {\n const handler = (data: Event[Key]) => {\n listener(data);\n };\n emitter.on(key as any, handler);\n return () => {\n emitter.off(key as any, handler);\n };\n }, [emitter, key, ...deps]);\n}\n","// MIT License\n//\n// Copyright (c) 2020 Jepser Bernardino\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n//\n// Source: https://github.com/jepser/use-match-media\n\nimport { useState, useLayoutEffect } from \"react\";\n\ntype IMediaQuery = Array<string>;\n\ntype IMatchedMedia = Array<boolean>;\n\nexport function useMatchMedia(queries: IMediaQuery, defaultValues: IMatchedMedia = []): IMatchedMedia {\n const initialValues = defaultValues.length ? defaultValues : Array(queries.length).fill(false);\n\n if (typeof window === \"undefined\") return initialValues;\n\n const mediaQueryLists = queries.map((q) => window.matchMedia(q));\n const getValue = (): IMatchedMedia => {\n // Return the value for the given queries\n const matchedQueries = mediaQueryLists.map((mql) => mql.matches);\n\n return matchedQueries;\n };\n\n // State and setter for matched value\n const [value, setValue] = useState(getValue);\n\n useLayoutEffect(() => {\n // Event listener callback\n // Note: By defining getValue outside of useEffect we ensure that it has ...\n // ... current values of hook args (as this hook only runs on mount/dismount).\n const handler = (): void => setValue(getValue);\n // Set a listener for each media query with above handler as callback.\n mediaQueryLists.forEach((mql) => mql.addListener(handler));\n // Remove listeners on cleanup\n return (): void => mediaQueryLists.forEach((mql) => mql.removeListener(handler));\n }, []);\n\n return value;\n}\n","import { Vault } from \"@iiif/helpers\";\nimport { useEffect } from \"react\";\nimport { useDebounce } from \"tiny-use-debounce\";\n\nexport function useSaveVault(vault: Vault, saveChanges: () => void, saveInterval: number, enabled = true) {\n const debounceSaveChanges = useDebounce(saveChanges, saveInterval);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return () => void 0;\n }\n window.addEventListener(\"beforeunload\", saveChanges, false);\n\n return () => {\n saveChanges();\n window.removeEventListener(\"beforeunload\", saveChanges);\n };\n }, [saveChanges]);\n\n useEffect(() => {\n if (vault && enabled) {\n return vault.subscribe(debounceSaveChanges, true);\n }\n }, [debounceSaveChanges, vault, enabled]);\n}\n","import { useMemo } from \"react\";\nimport { useAtlasStore } from \"react-iiif-vault\";\nimport { useStore } from \"zustand\";\n\nexport function useSvgTools() {\n const store = useAtlasStore();\n const switchTool = useStore(store, (s) => s.switchTool);\n const currentTool = useStore(store, (s) => s.polygonState.currentTool);\n const selectedStamp = useStore(store, (s) => s.polygonState.selectedStamp);\n const showBoundingBox = useStore(store, (s) => s.polygonState.showBoundingBox);\n\n return useMemo(\n () => ({\n currentTool,\n selectedStamp,\n // Draw tool.\n draw: {\n active: currentTool === \"pencil\",\n enable: switchTool.draw,\n },\n\n // Polygon.\n polygon: {\n active: currentTool === \"pen\",\n enable: switchTool.pen,\n },\n\n // Line\n line: {\n active: currentTool === \"line\",\n enable: switchTool.line,\n },\n\n // Line box.\n lineBox: {\n active: currentTool === \"lineBox\",\n enable: switchTool.lineBox,\n },\n\n // Square.\n square: {\n active: currentTool === \"box\",\n enable: switchTool.box,\n },\n\n // Triangle.\n triangle: {\n active: selectedStamp?.id === \"triangle\",\n enable: switchTool.triangle,\n },\n\n // Hexagon.\n hexagon: {\n active: selectedStamp?.id === \"hexagon\",\n enable: switchTool.hexagon,\n },\n\n // Circle\n circle: {\n active: selectedStamp?.id === \"circle\",\n enable: switchTool.circle,\n },\n\n // Delete\n remove: {\n active: showBoundingBox,\n enable: switchTool.remove,\n },\n }),\n [showBoundingBox, selectedStamp, currentTool, switchTool],\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { useCurrentAnnotationMetadata } from \"react-iiif-vault\";\n\nexport function useAnnotationCreatorState<Type = any>({ key, initialValue, requestId, getInitialValue }: {\n key: string,\n initialValue?: Type,\n requestId?: string;\n getInitialValue?: (metadata: any) => (Type | null)\n}) {\n const [metadata, setMetadata] = useCurrentAnnotationMetadata({ requestId });\n const [reactState, reactSetState] = useState<Type>(getInitialValue && getInitialValue(metadata) || (metadata[key] || initialValue));\n\n const setState = useCallback((newValue: Type) => {\n setMetadata({ [key]: newValue });\n reactSetState(newValue);\n }, []);\n\n return [\n reactState,\n setState,\n ] as const;\n}\n","import { useState } from \"react\";\nimport {\n DefaultTooltipContent,\n IconHandle,\n ResetIcon,\n ResizeHandle,\n Tooltip,\n TooltipTrigger,\n} from \"@manifest-editor/components\";\nimport { ButtonReset } from \"@manifest-editor/ui/atoms/Button\";\nimport { CloseIcon } from \"@manifest-editor/ui/icons/CloseIcon\";\nimport { DownIcon } from \"@manifest-editor/ui/icons/DownIcon\";\nimport { forwardRef } from \"react\";\nimport type { TransitionStatus } from \"react-transition-group\";\nimport styled, { css } from \"styled-components\";\nimport type { PanelActions } from \"../Layout.types\";\n\nexport const HandleContainer = styled.div`\n position: relative;\n width: 1px;\n background: rgba(0, 0, 0, 0.2);\n z-index: 50;\n`;\n\nconst HandleControl = styled(ButtonReset)`\n transition:\n opacity 300ms,\n transform 300ms;\n margin-block-start: 0.2em;\n margin-block-end: 0.2em;\n user-select: none;\n opacity: 0;\n transform: scaleY(70%);\n &:focus {\n outline: 2px solid salmon;\n }\n`;\n\nconst IconControl = styled(HandleControl)`\n background: #fff;\n width: 30px;\n height: 30px;\n border-radius: 50%;\n display: flex;\n justify-content: center;\n align-items: center;\n box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);\n cursor: default;\n\n svg {\n fill: #9999;\n }\n`;\n\nconst OpenControl = styled(HandleControl)<{ $dir: \"left\" | \"right\" }>`\n position: relative;\n display: flex;\n opacity: 1;\n background: #fff;\n height: 55px;\n pointer-events: visible;\n width: 21px;\n margin-bottom: auto;\n margin-top: 4.5em;\n cursor: pointer;\n border-radius: ${(props) => (props.$dir === \"right\" ? \"5px 0 0 5px\" : \"0 5px 5px 0\")};\n\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.2);\n transform: scaleX(100%);\n transform-origin: ${(props) => (props.$dir === \"right\" ? \"right\" : \"left\")};\n\n &:hover {\n background: #f9f9f9;\n transform: scaleX(125%);\n }\n\n svg {\n font-size: 1.5em;\n }\n`;\n\nconst InnerHandleContainer = styled.div<{ $open: boolean; $dir: \"left\" | \"right\" }>`\n background: rgba(0, 0, 0, 0);\n position: absolute;\n width: 16px;\n left: ${(props) => (props.$dir === \"left\" ? 0 : \"1px\")};\n top: 0;\n bottom: 0;\n z-index: 50; // This will always be quite high.\n transition:\n background-color 300ms,\n transform 300ms;\n transform: scaleX(70%);\n\n cursor: ${(props) => (props.$open ? \"col-resize\" : \"pointer\")};\n\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n &:hover {\n transform: scaleX(100%);\n background: rgba(0, 0, 0, 0.1);\n ${HandleControl} {\n transform: scaleX(100%);\n opacity: 1;\n }\n }\n`;\n\nconst UnscaledContainer = styled.div<{ $open: boolean; $dir: \"left\" | \"right\" }>`\n background: rgba(0, 0, 0, 0);\n position: absolute;\n pointer-events: none;\n width: 16px;\n left: ${(props) => (props.$dir === \"left\" ? 0 : \"-16px\")};\n top: 0;\n bottom: 0;\n z-index: 51; // This will always be quite high.\n`;\n\nexport const HandleControls = forwardRef<\n HTMLDivElement,\n {\n dir: \"left\" | \"right\";\n open: boolean;\n actions: PanelActions;\n transition?: TransitionStatus;\n reset?: () => void;\n }\n>(function HandleControls({ dir, open, actions, reset }, ref) {\n const [showDragTooltip, setShowDragToolTip] = useState(true);\n const dragTooltipMt = \"mt-[calc(50vh+8px)]\";\n const dragTooltipClasses = dir === \"left\" ? `${dragTooltipMt} ml-[13px]` : `${dragTooltipMt} ml-[3px]`;\n return (\n <HandleContainer onClick={() => actions.open()}>\n <UnscaledContainer $open={open} $dir={dir} className=\"group\">\n {!open ? (\n <Tooltip placement={dir === \"left\" ? \"right\" : \"left\"}>\n <TooltipTrigger as={OpenControl} $dir={dir} onClick={(e) => actions.open()}>\n <DownIcon className=\"text-2xl\" rotate={dir === \"right\" ? 90 : 270} />\n </TooltipTrigger>\n <DefaultTooltipContent>Open</DefaultTooltipContent>\n </Tooltip>\n ) : null}\n </UnscaledContainer>\n <Tooltip placement={dir === \"left\" ? \"right\" : \"left\"}>\n <TooltipTrigger aria-label=\"Resize panel\" asChild>\n <div>\n <InnerHandleContainer ref={ref} $open={open} $dir={dir} className=\"group\">\n {open ? (\n <Tooltip placement={dir === \"left\" ? \"right\" : \"left\"}>\n <TooltipTrigger as={IconHandle} onPress={() => actions.close()}>\n <div\n onMouseOut={() => {\n setShowDragToolTip(true);\n }}\n onMouseOver={() => {\n setShowDragToolTip(false);\n }}\n >\n <CloseIcon />\n </div>\n </TooltipTrigger>\n <DefaultTooltipContent>Close</DefaultTooltipContent>\n </Tooltip>\n ) : null}\n {reset && open ? (\n <Tooltip placement={dir === \"left\" ? \"right\" : \"left\"}>\n <TooltipTrigger as={IconHandle} onPress={() => reset()}>\n <div\n onMouseOut={() => {\n setShowDragToolTip(true);\n }}\n onMouseOver={() => {\n setShowDragToolTip(false);\n }}\n >\n <ResetIcon />\n </div>\n </TooltipTrigger>\n <DefaultTooltipContent>Reset</DefaultTooltipContent>\n </Tooltip>\n ) : null}\n {open ? (\n <Tooltip placement={dir === \"left\" ? \"right\" : \"left\"}>\n <TooltipTrigger asChild aria-label=\"Resize panel\">\n <div\n onMouseOut={() => {\n setShowDragToolTip(true);\n }}\n onMouseOver={() => {\n setShowDragToolTip(false);\n }}\n >\n <ResizeHandle aria-label=\"Resize panel\" />\n </div>\n </TooltipTrigger>\n <DefaultTooltipContent>Resize panel</DefaultTooltipContent>\n </Tooltip>\n ) : null}\n </InnerHandleContainer>\n </div>\n </TooltipTrigger>\n {showDragTooltip && <DefaultTooltipContent className={dragTooltipClasses}>Resize panel</DefaultTooltipContent>}\n </Tooltip>\n </HandleContainer>\n );\n});\n","import type * as React from \"react\";\n\nexport function Spinner(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 42 42\"\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"currentColor\"\n {...props}\n >\n <g transform=\"translate(2 2)\" strokeWidth={5} fill=\"none\" fillRule=\"evenodd\">\n <circle strokeOpacity={0.5} cx={18} cy={18} r={18} />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </svg>\n );\n}\n",".ghostLoadingBlock[data-header=\"true\"] {\n box-shadow:\n inset 0 -1px 0 0 rgba(0, 0, 0, 0.17),\n inset 0 1px 0 0 rgba(0, 0, 0, 0.17);\n}\n\n.ghostLoadingBlock {\n display: block;\n width: 100%;\n height: 2.8em;\n margin-bottom: 1em;\n background-color: #e4e7f0;\n animation: ghost-loading 2s infinite ease-in-out;\n}\n\n@keyframes ghost-loading {\n 0% {\n opacity: 0.4;\n }\n 50% {\n opacity: 0.8;\n }\n 100% {\n opacity: 0.4;\n }\n}\n\n.ghostBlockList {\n padding: 1em;\n display: flex;\n flex-direction: column;\n}\n","import $ from \"./GhostBlocks.module.css\";\nexport function GhostBlocks() {\n return (\n <>\n <div data-header=\"true\" className={$.ghostLoadingBlock} />\n <div className={$.ghostBlockList}>\n <div className={$.ghostLoadingBlock} />\n <div className={$.ghostLoadingBlock} />\n <div className={$.ghostLoadingBlock} />\n <div className={$.ghostLoadingBlock} />\n </div>\n </>\n );\n}\n","import { useLayoutEffect } from \"react\";\n\nexport function useEventHandler(ref: any, name: string, callback: (e: any) => void, deps: any[] = []) {\n useLayoutEffect(() => {\n const current = ref.current;\n if (current) {\n current.addEventListener(name, callback);\n\n return () => {\n current.removeEventListener(name, callback);\n };\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [name, ...deps]);\n}\n","import { useEventHandler } from \"@manifest-editor/ui/madoc/use-event-handler\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useLocalStorage } from \"../../hooks/use-local-storage\";\nimport { panelSizing } from \"../Layout.helpers\";\n\nfunction distance(x1: number, y1: number, x2: number, y2: number) {\n return Math.sqrt(Math.abs(x2 - x1) ** 2 + Math.abs(y2 - y1) ** 2);\n}\n\nfunction getMaxWidthPct(container: number, defaultMaxWidthPct: number, maxWidthPct?: number, maxWidthPixel?: number) {\n if (maxWidthPct) {\n return maxWidthPct;\n }\n\n if (maxWidthPixel) {\n return maxWidthPixel / container;\n }\n\n return defaultMaxWidthPct;\n}\n\nexport function useResizeLayout(\n name: string,\n options: {\n left?: boolean;\n widthA?: any;\n marginLeft?: number;\n widthB?: any;\n maxWidthPx?: number;\n maxWidthPct?: number;\n minWidthPx?: number;\n minWidthPct?: number;\n onDragEnd?: () => void;\n loading?: boolean;\n } = {},\n) {\n const container = useRef<HTMLDivElement | null>(null);\n const resizableDiv = useRef<HTMLDivElement | null>(null);\n const otherDiv = useRef<HTMLDivElement | null>(null);\n const resizer = useRef<HTMLDivElement | null>(null);\n const newPct = useRef(0.5);\n const [isDragging, setIsDragging] = useState(false);\n const isEventDragging = useRef(false);\n const isEventTimeout = useRef<number>(0);\n const startPos = useRef({ x: 0, y: 0 });\n const [{ widthA, widthB }, setWidths] = useLocalStorage(`resize-layout/${name}`, {\n widthA: \"auto\",\n widthB: `${panelSizing({\n initial: options.widthA,\n fallback: 320,\n options: { minWidth: options.minWidthPx, maxWidth: options.maxWidthPx },\n })}px`,\n });\n const { loading = false } = options;\n\n useEventHandler(\n resizer,\n \"mousedown\",\n (e) => {\n startPos.current.x = e.pageX;\n startPos.current.y = e.pageY;\n\n if (isEventTimeout.current) {\n clearTimeout(isEventTimeout.current);\n isEventTimeout.current = 0;\n }\n isEventTimeout.current = setTimeout(() => {\n setIsDragging(true);\n isEventDragging.current = true;\n }, 350) as any;\n },\n [loading],\n );\n\n useEventHandler(\n { current: typeof window !== \"undefined\" ? window : undefined },\n \"mouseup\",\n () => {\n const current = container.current;\n if (current && isEventDragging.current) {\n const { x, width } = current.getBoundingClientRect();\n\n const ml = options.marginLeft || 0;\n const maxWidthPct = getMaxWidthPct(width, 0.8, options.maxWidthPct, options.maxWidthPx) * width;\n const minWidthPct = getMaxWidthPct(width, 0.2, options.minWidthPct, options.minWidthPx) * width;\n\n if (options.left) {\n const newWidthB = (newPct.current * width) - ml;\n\n setWidths({\n widthA: `${((1 - newPct.current) * width) - ml}`,\n widthB: `${newWidthB > maxWidthPct ? maxWidthPct : newWidthB < minWidthPct ? minWidthPct : newWidthB}px`,\n });\n } else {\n const newWidthA = 1 - (newPct.current * width) - ml;\n\n setWidths({\n widthA: `${newWidthA > maxWidthPct ? maxWidthPct : newWidthA < minWidthPct ? minWidthPct : newWidthA}px`,\n widthB: `${(newPct.current * width) - ml}px`,\n });\n }\n\n setIsDragging(false);\n isEventDragging.current = false;\n if (options.onDragEnd) {\n options.onDragEnd();\n }\n }\n\n clearTimeout(isEventTimeout.current);\n isEventTimeout.current = 0;\n },\n [loading],\n );\n\n useEventHandler(\n container,\n \"mousemove\",\n (e) => {\n if (!isEventDragging.current && isEventTimeout.current) {\n if (distance(startPos.current.x, startPos.current.y, e.pageX, e.pageY) > 20) {\n setIsDragging(true);\n isEventDragging.current = true;\n clearTimeout(isEventTimeout.current);\n isEventTimeout.current = 0;\n }\n }\n\n if (isEventDragging.current && resizableDiv.current) {\n const current = container.current;\n if (current) {\n const { x, width } = current.getBoundingClientRect();\n\n const ml = options.marginLeft || 0;\n const isLeft = options.left || false;\n\n const maxWidthPct = getMaxWidthPct(width, 0.8, options.maxWidthPct, options.maxWidthPx);\n const minWidthPct = getMaxWidthPct(width, 0.2, options.minWidthPct, options.minWidthPx);\n\n newPct.current = (width + x - e.pageX - 5) / width;\n if (isLeft) {\n newPct.current = 1 - newPct.current;\n }\n newPct.current = newPct.current < minWidthPct ? minWidthPct : newPct.current;\n newPct.current = newPct.current > maxWidthPct ? maxWidthPct : newPct.current;\n\n resizableDiv.current.style.width = `${(newPct.current * width) - ml}px`;\n }\n }\n },\n [isDragging, loading],\n );\n\n return {\n refs: {\n container,\n resizer,\n resizableDiv,\n otherDiv,\n },\n setWidths,\n isDragging,\n widthA,\n widthB,\n };\n}\n","import styled, { css } from \"styled-components\";\nimport { ModularPanelHeader } from \"../Layout/components/ModularPanel\";\n\nexport const Container = styled.div`\n position: relative;\n display: flex;\n flex: 1;\n overflow: hidden;\n flex-direction: column;\n`;\n\nexport const CenterPanel = styled.div`\n flex: 1;\n position: relative;\n z-index: 7;\n`;\n\nexport const MobileBar = styled.div`\n display: flex;\n justify-content: space-around;\n width: 100%;\n background: #fff;\n border-top: 1px solid #cbcbcb;\n padding: 0.5em;\n height: 3.4rem;\n`;\n\nexport const LeftBarButton = styled.button`\n //background: red;\n padding: 0.5em 1em;\n width: 32%;\n\n border-radius: 5px;\n border: none;\n background: #ffffff;\n`;\n\nexport const PreviewBarButton = styled.button`\n padding: 0.5em 1em;\n width: 32%;\n\n border-radius: 5px;\n\n background: #5e59c2;\n border: 1px solid rgba(0, 0, 0, 0.21);\n color: #ffffff;\n`;\n\nexport const DrawerContainer = styled.div`\n position: relative;\n width: 32%;\n margin: 0 0.75em;\n z-index: 9;\n`;\n\nexport const DrawerButton = styled.button`\n padding: 0.4em 1em 0.65em;\n position: absolute;\n width: 100%;\n bottom: 1em;\n background: #ffffff;\n box-shadow: 0 3px 18px 0 rgba(0, 0, 0, 0.04);\n border-radius: 5px;\n border: 1px solid #979797;\n letter-spacing: -0.46px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n svg {\n display: block;\n margin: auto;\n font-size: 1.8em;\n }\n`;\n\nexport const DrawerBody = styled.div<{ $open?: boolean }>`\n background: #fff;\n display: flex;\n position: absolute;\n transform: translateY(100%);\n overflow-y: auto;\n left: 0;\n right: 0;\n top: 7em;\n z-index: 10;\n box-shadow:\n 0 -5px 15px 0 rgba(0, 0, 0, 0),\n 0 -3px 5px 0 rgba(0, 0, 0, 0);\n bottom: 0;\n transition:\n 0.3s transform ease-in-out,\n 0.3s box-shadow;\n ${(props) =>\n props.$open &&\n css`\n box-shadow:\n 0 -5px 15px 0 rgba(0, 0, 0, 0.1),\n 0 -3px 5px 0 rgba(0, 0, 0, 0.1);\n transform: translateY(0);\n `}\n\n ${ModularPanelHeader} {\n box-shadow: none;\n padding-left: 0.5em;\n padding-right: 0.5em;\n font-size: 1.1em;\n }\n`;\n\nexport const LeftPanel = styled.div<{ $open?: boolean }>`\n position: absolute;\n transform: translateX(-100%);\n background: #fff;\n left: 0;\n top: 0;\n bottom: 0;\n z-index: 10;\n overflow-y: auto;\n transition: 0.5s transform;\n ${(props) =>\n props.$open &&\n css`\n transform: translateX(0);\n `}\n`;\n\nexport const Lightbox = styled.div<{ $open?: boolean }>`\n background: rgba(0, 0, 0, 0.4);\n pointer-events: none;\n position: absolute;\n z-index: 8;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n opacity: 0;\n transition: opacity 0.5s;\n\n ${(props) =>\n props.$open &&\n css`\n pointer-events: visible;\n opacity: 1;\n `}\n`;\n","import styled, { css, keyframes } from \"styled-components\";\nimport { MenuPositions } from \"./Layout.types\";\nimport { TransitionStatus } from \"react-transition-group\";\n\nexport const OuterWrapper = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n\n max-width: 100%;\n min-width: 0;\n overflow: hidden;\n`;\n\nexport const Header = styled.header`\n //box-shadow: 0 3px 2px 0 rgba(0, 0, 0, 0.04), 0 1px 0 0 rgba(0, 0, 0, 0.17);\n z-index: 200;\n`;\n\nexport const Footer = styled.div`\n background: #fff;\n`;\n\nexport const Main = styled.div`\n display: flex;\n flex: 1 1 0;\n min-height: 0;\n`;\n\nexport const LeftPanel = styled.div<{ $state?: TransitionStatus; $width: string; $motion?: boolean }>`\n background: #fff;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n max-width: 720px;\n align-items: flex-end;\n\n ${(props) =>\n props.$motion\n ? css`\n transition: max-width 400ms;\n `\n : \"\"}\n\n ${(props) => {\n switch (props.$state) {\n case \"entering\":\n return css`\n max-width: ${props.$width};\n `;\n case \"exiting\":\n return css`\n max-width: 0;\n `;\n case \"unmounted\":\n case \"exited\":\n return css`\n max-width: 0;\n `;\n }\n }}\n`;\n\nexport const CenterPanel = styled.div`\n flex: 1 1 0;\n background: #e3e7f0;\n // background: #efefef;\n // box-shadow:\n // inset 0 3px 2px 0 rgba(0, 0, 0, 0.04),\n // inset 0 1px 0 0 rgba(0, 0, 0, 0.14);\n padding-top: 1px;\n // background: linear-gradient(0deg, rgba(251, 242, 237, 1) 0%, rgba(240, 229, 245, 1) 50%, rgba(236, 245, 255, 1) 100%);\n\n min-width: 320px;\n display: flex;\n\n min-height: 0;\n overflow: hidden;\n\n > * {\n min-width: 0;\n }\n`;\n\nexport const RightPanel = styled.div<{ $state?: TransitionStatus; $width: string; $motion?: boolean }>`\n background: #fff;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n max-width: 720px;\n\n ${(props) => (props.$motion ? \"transition: max-width 400ms;\" : \"\")}\n\n ${(props) => {\n switch (props.$state) {\n case \"entering\":\n return css`\n max-width: ${props.$width};\n `;\n case \"exiting\":\n return css`\n max-width: 0;\n `;\n case \"unmounted\":\n case \"exited\":\n return css`\n max-width: 0;\n `;\n }\n }}\n`;\n\nexport const PanelContainer = styled.div<{ $menu?: MenuPositions }>`\n display: flex;\n flex: 1;\n height: 100%;\n min-width: 50px;\n transition: min-width 400ms;\n overflow: hidden;\n\n ${(props) => {\n switch (props.$menu) {\n case \"top\":\n return css`\n flex-direction: column;\n ${PanelMenu} {\n flex-direction: column;\n }\n `;\n case \"left\":\n return css`\n flex-direction: row;\n ${PanelMenu} {\n flex-direction: row;\n }\n `;\n default:\n case \"bottom\":\n return css`\n flex-direction: column-reverse;\n ${PanelMenu} {\n flex-direction: column;\n }\n `;\n case \"right\":\n return css`\n flex-direction: row-reverse;\n ${PanelMenu} {\n flex-direction: row;\n }\n `;\n }\n }}\n`;\n\nexport const PanelSideMenu = styled.div`\n background: #fff;\n border-top: 1px solid #e3e7f0;\n border-right: 1px solid #e3e7f0;\n display: flex;\n flex-direction: column;\n width: 3em;\n /* width: 3.35em;\n padding: 0.3em;\n gap: 0.3em; */\n`;\n\nexport const PanelSideMenuItem = styled.button`\n cursor: pointer;\n aspect-ratio: 1;\n width: 3em;\n height: 3em;\n display: flex;\n justify-content: center;\n align-items: center;\n &:hover {\n background: #fff6f9;\n }\n\n &:hover svg {\n color: #000;\n }\n\n &[data-selected=\"true\"] {\n background: #b84c74;\n svg {\n color: #ffffff;\n }\n }\n\n & svg {\n font-size: 1.5em;\n color: #999;\n }\n`;\n\nexport const PanelMenu = styled.div<{ $position: \"bottom\" | \"top\" | \"left\" | \"right\"; $open: boolean }>`\n display: flex;\n box-shadow:\n 0 -3px 2px 0 rgba(0, 0, 0, 0.04),\n 0 -1px 0 0 rgba(0, 0, 0, 0.17);\n\n ${(props) =>\n !props.$open && (props.$position === \"top\" || props.$position === \"bottom\")\n ? css`\n display: none;\n `\n : \"\"}\n`;\n\nexport const PanelContent = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n`;\n","import { Modal, PanelSideMenu } from \"@manifest-editor/components\";\n// import { LayoutProps } from \"./Layout.types\";\nimport { DownIcon } from \"@manifest-editor/ui/icons/DownIcon\";\nimport { StarIcon } from \"@manifest-editor/ui/icons/StarIcon\";\nimport { Spinner } from \"@manifest-editor/ui/madoc/components/icons/Spinner\";\nimport { GhostBlocks } from \"@manifest-editor/ui/ui/GhostBlocks/GhostBlocks\";\nimport { Fragment, memo, useContext, useLayoutEffect, useMemo, useRef } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { ReactVaultContext } from \"react-iiif-vault\";\nimport { Transition, type TransitionStatus } from \"react-transition-group\";\nimport equal from \"shallowequal\";\nimport { useAppState } from \"../AppContext/AppContext\";\nimport { useMatchMedia } from \"../hooks/use-match-media\";\nimport { HandleControls } from \"./components/HandleControls\";\nimport { ModularPanel } from \"./components/ModularPanel\";\nimport { PanelError } from \"./components/PanelError\";\nimport { useResizeLayout } from \"./components/use-resize-layouts\";\nimport { useLayoutProvider } from \"./Layout.context\";\nimport { panelSizing, renderHelper } from \"./Layout.helpers\";\nimport * as M from \"./Layout.mobile\";\nimport * as L from \"./Layout.styles\";\n\ninterface LayoutProps {\n header?: React.ReactNode;\n footer?: React.ReactNode;\n menu?: React.ReactNode;\n leftPanelMenu?: React.ReactNode;\n rightPanelMenu?: React.ReactNode;\n centerPanelMenu?: React.ReactNode;\n leftPanelMenuPosition?: \"top\" | \"bottom\";\n rightPanelMenuPosition?: \"top\" | \"bottom\";\n hideHeader?: boolean;\n isLoading?: boolean;\n className?: string;\n htmlId?: string;\n centerPanelMenuPosition?: \"top\" | \"bottom\";\n disableSideEffects?: string[];\n}\n\nexport const Layout = memo(function Layout(props: LayoutProps) {\n const appState = useAppState();\n const layout = useLayoutProvider();\n const { vault: _vault } = useContext(ReactVaultContext);\n const vault = _vault || undefined;\n const leftPanelRef = useRef<HTMLDivElement | null>(null);\n const rightPanelRef = useRef<HTMLDivElement | null>(null);\n const { loading, state, leftPanels, centerPanels, rightPanels, modals = [], actions } = layout;\n const leftPanel = leftPanels.find((panel) => panel.id === state.leftPanel.current);\n const rightPanel = rightPanels.find((panel) => panel.id === state.rightPanel.current);\n const centerPanel = centerPanels.find((panel) => panel.id === state.centerPanel.current);\n const modalToRender = modals.find((panel) => panel.id === state.modal.current);\n const enableMotion = true;\n const pinnedRightPanel = state.pinnedRightPanel.pinned\n ? rightPanels.find((panel) => panel.id === state.pinnedRightPanel.current)\n : undefined;\n const [mobile] = useMatchMedia([\"(max-width: 1020px)\"]);\n\n const isLoading = props.isLoading || false;\n const backgroundItems = useMemo(() => {\n return (layout.background || []).map((bg, key) => {\n return <Fragment key={key}>{bg.render()}</Fragment>;\n });\n }, [layout.background]);\n\n // Resizers\n const leftPanelResizer = useResizeLayout(`left-panel/${leftPanel?.id}`, {\n left: true,\n marginLeft: 60,\n minWidthPx: leftPanel?.options?.minWidth || 200,\n maxWidthPx: leftPanel?.options?.maxWidth || 720,\n loading,\n });\n const rightPanelResizer = useResizeLayout(`right-panel/${rightPanel?.id}`, {\n left: false,\n minWidthPx: rightPanel?.options?.minWidth || 320,\n maxWidthPx: rightPanel?.options?.maxWidth || 720,\n loading,\n });\n\n // Pinned state\n const showRightPanel =\n rightPanel &&\n (pinnedRightPanel?.id !== rightPanel.id || !equal(state.pinnedRightPanel.state, state.rightPanel.state));\n const resetLeftPanel =\n leftPanelResizer.widthB !== \"auto\"\n ? () =>\n leftPanelResizer.setWidths({\n widthA: \"auto\",\n widthB: panelSizing({\n options: leftPanel?.options,\n fallback: 320,\n }),\n } as any)\n : undefined;\n const resetRightPanel =\n rightPanelResizer.widthB !== \"auto\"\n ? () =>\n rightPanelResizer.setWidths({\n widthA: \"auto\",\n widthB: panelSizing({\n options: rightPanel?.options,\n fallback: 320,\n }),\n } as any)\n : undefined;\n\n // Remove dynamic layouts for now.\n // useEffect(() => {\n // // @todo to enable dynamic layouts, we need this effect to run IF the props change.\n // actions.setAvailable(props);\n // props.rightPanels.length && actions.rightPanel.change({ id: props.rightPanels[0]!.id });\n // props.leftPanels.length && actions.leftPanel.change({ id: props.leftPanels[0]!.id });\n // props.centerPanels.length && actions.centerPanel.change({ id: props.centerPanels[0]!.id });\n\n // // actions are stable.\n // // eslint-disable-next-line react-hooks/exhaustive-deps\n // }, []);\n\n useLayoutEffect(() => {\n if (mobile && state.leftPanel.open && state.rightPanel.open) {\n actions.leftPanel.close();\n actions.rightPanel.close();\n }\n }, [mobile]);\n\n useLayoutEffect(() => {\n if (centerPanel && centerPanel.onMount) {\n return centerPanel.onMount(\n state.centerPanel.state || centerPanel.defaultState || {},\n { ...layout, current: actions.centerPanel, vault: vault as any },\n appState,\n );\n }\n }, [state.centerPanel.current]);\n\n useLayoutEffect(() => {\n // @todo to enable dynamic layouts, we need this effect to run IF the props change.\n // actions.setAvailable(props);\n rightPanels.length && actions.rightPanel.change({ id: rightPanels[0]!.id });\n leftPanels.length && actions.leftPanel.change({ id: leftPanels[0]!.id });\n centerPanels.length && actions.centerPanel.change({ id: centerPanels[0]!.id });\n\n // actions are stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (loading) {\n // It will render as soon as possible, downside of hoisting the layout provider\n // Unlikely this will be hit because of flushSync, but best to check.\n return null;\n }\n\n // Build our panels here.\n\n const renderLeftPanel = (transition?: TransitionStatus) => (\n <L.PanelContainer\n $menu={props.leftPanelMenuPosition || \"bottom\"}\n ref={leftPanelResizer.refs.resizableDiv}\n className={[\"manifest-editor\", transition && enableMotion ? `transition transition-${transition}` : \"\"].join(\" \")}\n style={{\n width: state.leftPanel.open || transition !== \"exited\" ? leftPanelResizer.widthB : undefined,\n minWidth: leftPanel?.options?.minWidth,\n }}\n >\n {isLoading ? (\n <L.PanelContent>\n <GhostBlocks />\n </L.PanelContent>\n ) : (\n <>\n {props.leftPanelMenu ? (\n <L.PanelMenu\n $open={state.leftPanel.open && transition !== \"exited\"}\n $position={props.leftPanelMenuPosition || \"bottom\"}\n >\n {props.leftPanelMenu}\n </L.PanelMenu>\n ) : null}\n <L.PanelContent>\n {state.leftPanel.open || transition !== \"exited\" ? (\n <>\n {leftPanel ? (\n <ModularPanel\n isLeft\n noHeader\n transition={transition}\n panel={leftPanel}\n state={state.leftPanel}\n actions={actions.leftPanel}\n />\n ) : null}\n </>\n ) : null}\n </L.PanelContent>\n </>\n )}\n </L.PanelContainer>\n );\n\n const renderModal = () => {\n if (!modalToRender || state.modal.open === false) {\n return null;\n }\n\n return (\n <Modal title={modalToRender.label} onClose={() => actions.modal.close()}>\n {renderHelper(\n modalToRender.render(\n state.modal.state || modalToRender.defaultState || {},\n { ...layout, current: actions.modal, vault: vault },\n appState,\n ),\n )}\n </Modal>\n );\n };\n\n const renderCenterPanel = () => (\n <L.PanelContainer $menu={props.centerPanelMenuPosition || \"top\"}>\n {props.centerPanelMenu ? (\n <L.PanelMenu $open={state.centerPanel.open} $position={props.centerPanelMenuPosition || \"top\"}>\n {props.centerPanelMenu}\n </L.PanelMenu>\n ) : null}\n <L.PanelContent>\n <ErrorBoundary resetKeys={[centerPanel?.id]} FallbackComponent={PanelError}>\n {isLoading ? (\n <div\n style={{\n display: \"flex\",\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <Spinner stroke=\"rgba(0,0,0,.3)\" fontSize={\"2em\"} />\n </div>\n ) : state.centerPanel.open ? (\n centerPanel ? (\n renderHelper(\n centerPanel.render(\n state.centerPanel.state || centerPanel.defaultState || {},\n { ...layout, current: actions.centerPanel, vault: vault },\n appState,\n ),\n )\n ) : null\n ) : null}\n </ErrorBoundary>\n </L.PanelContent>\n </L.PanelContainer>\n );\n\n const renderRightPanel = (transition?: TransitionStatus) => (\n <L.PanelContainer\n $menu={props.rightPanelMenuPosition || \"bottom\"}\n ref={rightPanelResizer.refs.resizableDiv}\n className={transition && enableMotion ? `transition transition-${transition}` : \"\"}\n style={{\n width: state.rightPanel.open || transition !== \"exited\" ? rightPanelResizer.widthB : undefined,\n minWidth: rightPanel?.options?.minWidth,\n }}\n >\n {isLoading ? (\n <L.PanelContent>\n <GhostBlocks />\n </L.PanelContent>\n ) : (\n <>\n {props.rightPanelMenu ? (\n <L.PanelMenu $open={state.rightPanel.open} $position={props.rightPanelMenuPosition || \"bottom\"}>\n {props.rightPanelMenu}\n </L.PanelMenu>\n ) : null}\n <L.PanelContent>\n {state.rightPanel.open || transition !== \"exited\" ? (\n <>\n {showRightPanel ? (\n <ModularPanel\n panel={rightPanel}\n state={state.rightPanel}\n actions={actions.rightPanel}\n pinActions={actions.pinnedRightPanel}\n available={rightPanels}\n />\n ) : null}\n\n {pinnedRightPanel ? (\n <ModularPanel\n panel={pinnedRightPanel}\n state={state.pinnedRightPanel}\n actions={actions.pinnedRightPanel}\n close={actions.rightPanel.close}\n />\n ) : null}\n </>\n ) : null}\n </L.PanelContent>\n </>\n )}\n </L.PanelContainer>\n );\n\n if (mobile) {\n return (\n <L.OuterWrapper>\n {props.hideHeader ? null : (\n <L.Header>\n {props.header || null}\n {props.menu ? <menu>{props.menu}</menu> : null}\n </L.Header>\n )}\n <L.Main>\n <M.Container>\n <M.CenterPanel>{renderCenterPanel()}</M.CenterPanel>\n <M.MobileBar>\n {leftPanels.length > 0 ? (\n <M.LeftBarButton onClick={actions.leftPanel.toggle}>{leftPanel?.label}</M.LeftBarButton>\n ) : null}\n {rightPanels.length > 0 ? (\n <M.DrawerContainer>\n <M.DrawerButton onClick={actions.rightPanel.toggle}>\n <DownIcon rotate={180} />\n {rightPanel?.label}\n </M.DrawerButton>\n </M.DrawerContainer>\n ) : null}\n <M.PreviewBarButton>Preview</M.PreviewBarButton>\n </M.MobileBar>\n {rightPanels.length > 0 ? (\n <M.DrawerBody $open={state.rightPanel.open}>{renderRightPanel()}</M.DrawerBody>\n ) : null}\n {leftPanels.length > 0 ? <M.LeftPanel $open={state.leftPanel.open}>{renderLeftPanel()}</M.LeftPanel> : null}\n {leftPanels.length > 0 || rightPanels.length > 0 ? (\n <M.Lightbox\n $open={state.leftPanel.open || state.rightPanel.open}\n onClick={() => {\n actions.leftPanel.close();\n actions.rightPanel.close();\n }}\n />\n ) : null}\n </M.Container>\n </L.Main>\n </L.OuterWrapper>\n );\n }\n\n // This is a big ol' work in progress.\n return (\n <L.OuterWrapper\n id={props.htmlId || \"manifest-editor-container\"}\n className={`manifest-editor ${props.className || \"\"}`}\n >\n {props.hideHeader ? null : (\n <L.Header>\n {props.header || null}\n {props.menu ? <menu>{props.menu}</menu> : null}\n </L.Header>\n )}\n <L.Main\n ref={(div) => {\n leftPanelResizer.refs.container.current = div;\n rightPanelResizer.refs.container.current = div;\n }}\n >\n {leftPanels.length > 0 ? (\n <PanelSideMenu\n current={state.leftPanel.current}\n items={leftPanels.map((panel) => ({\n id: panel.id,\n label: panel.label,\n icon: panel.icon,\n divide: panel.divide,\n onClick: () => {\n if (state.leftPanel.current === panel.id) {\n actions.leftPanel.toggle();\n } else {\n actions.leftPanel.change({ id: panel.id });\n }\n },\n }))}\n open={state.leftPanel.open}\n />\n ) : null}\n\n {leftPanels.length > 0 ? (\n <Transition\n nodeRef={leftPanelRef}\n in={state.leftPanel.open}\n timeout={enableMotion ? 400 : 0}\n unmountOnExit={false}\n >\n {(transition) => (\n <>\n <L.LeftPanel\n ref={leftPanelRef}\n $width={leftPanelResizer.widthB}\n $state={transition}\n $motion={enableMotion}\n >\n {renderLeftPanel(transition)}\n </L.LeftPanel>\n <HandleControls\n ref={leftPanelResizer.refs.resizer}\n reset={resetLeftPanel}\n dir=\"left\"\n transition={transition}\n open={state.leftPanel.open || transition !== \"exited\"}\n actions={actions.leftPanel}\n />\n </>\n )}\n </Transition>\n ) : null}\n <L.CenterPanel>{renderCenterPanel()}</L.CenterPanel>\n {rightPanels.length > 0 ? (\n <Transition\n nodeRef={rightPanelRef}\n in={state.rightPanel.open}\n timeout={enableMotion ? 400 : 0}\n unmountOnExit={false}\n >\n {(transition) => (\n <>\n <HandleControls\n ref={rightPanelResizer.refs.resizer}\n dir=\"right\"\n reset={resetRightPanel}\n open={state.rightPanel.open}\n actions={actions.rightPanel}\n />\n <L.RightPanel\n ref={rightPanelRef}\n $width={rightPanelResizer.widthB}\n $state={transition}\n $motion={enableMotion}\n >\n {renderRightPanel(transition)}\n </L.RightPanel>\n </>\n )}\n </Transition>\n ) : null}\n </L.Main>\n <L.Footer>{props.footer || null}</L.Footer>\n\n <div className=\"hidden\">{backgroundItems}</div>\n\n <>{renderModal()}</>\n </L.OuterWrapper>\n );\n});\n","import { LayoutState, PanelActions, PanelActionType, PinnablePanelActions } from \"./Layout.types\";\nimport { Dispatch, useMemo } from \"react\";\nexport function usePanelActions(\n panel: keyof LayoutState,\n dispatch: Dispatch<PanelActionType>\n): PanelActions | PinnablePanelActions {\n function popStack() {\n dispatch({ type: \"popStack\", panel, payload: undefined });\n }\n function change(payload: { id: string; state?: any; stacked?: boolean }) {\n // flushSync(() => {\n dispatch({ type: \"change\", panel, payload });\n // });\n }\n function open(payload?: { id: string; state?: any; stacked?: boolean }) {\n // flushSync(() => {\n dispatch({ type: \"open\", panel, payload });\n // });\n }\n function close() {\n dispatch({ type: \"close\", panel, payload: undefined });\n }\n function toggle() {\n dispatch({ type: \"toggle\", panel, payload: undefined });\n }\n function minimise() {\n dispatch({ type: \"minimise\", panel, payload: undefined });\n }\n function maximise(payload?: { id: string; state?: any }) {\n dispatch({ type: \"maximise\", panel, payload });\n }\n function setCustomWidth(payload: number) {\n dispatch({ type: \"setCustomWidth\", panel, payload });\n }\n function resetSize() {\n dispatch({ type: \"resetSize\", panel, payload: undefined });\n }\n function pin(payload: { id: string; state?: any }) {\n dispatch({ type: \"pin\", panel, payload });\n }\n function unpin() {\n dispatch({ type: \"unpin\", panel, payload: undefined });\n }\n\n return useMemo(\n () => ({\n popStack,\n change,\n open,\n close,\n toggle,\n minimise,\n maximise,\n setCustomWidth,\n resetSize,\n pin,\n unpin,\n }),\n // Dispatch is stable here.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n}\n","import { produce, Draft, original } from \"immer\";\nimport { LayoutState, PanelActionType, PanelState, PinnablePanelState } from \"./Layout.types\";\nimport { isPinnableState } from \"./Layout.helpers\";\n\nfunction pushStack<T>(\n state: Draft<PinnablePanelState | PanelState>,\n action: T extends { payload: { stacked?: boolean; unique?: boolean } } ? T : never\n) {\n if (action.payload && action.payload.stacked) {\n if (state.current) {\n const latest = state.stack[state.stack.length - 1];\n if (latest && latest.id === state.current) {\n return;\n }\n\n if (action.payload.unique) {\n state.stack = state.stack.filter((i) => i.id !== state.current);\n }\n\n state.stack.push({\n id: state.current,\n state: state.state ? { ...original(state.state) } : {},\n });\n }\n } else {\n state.stack = [];\n }\n}\n\nfunction panelReducer(state: Draft<PinnablePanelState | PanelState>, action: PanelActionType) {\n switch (action.type) {\n case \"popStack\": {\n if (state.stack.length) {\n const latest = state.stack[state.stack.length - 1];\n if (latest) {\n state.current = latest.id;\n state.state = latest.state;\n }\n state.stack = state.stack.slice(0, -1);\n }\n break;\n }\n\n case \"change\": {\n if (action.payload.id !== state.current) {\n pushStack(state, action);\n }\n state.state = action.payload.state;\n state.current = action.payload.id;\n break;\n }\n case \"close\": {\n state.open = false;\n break;\n }\n case \"open\": {\n state.open = true;\n if (action.payload) {\n if (action.payload.id !== state.current) {\n pushStack<any>(state, action);\n }\n state.state = action.payload.state;\n state.current = action.payload.id;\n }\n break;\n }\n case \"toggle\": {\n state.open = !state.open;\n break;\n }\n case \"maximise\": {\n state.minimised = false;\n if (action.payload) {\n state.state = action.payload.state;\n state.current = action.payload.id;\n }\n break;\n }\n case \"minimise\": {\n state.minimised = true;\n break;\n }\n case \"setCustomWidth\": {\n state.customWidth = action.payload;\n break;\n }\n case \"resetSize\": {\n state.customWidth = undefined;\n }\n }\n\n if (isPinnableState(state)) {\n switch (action.type) {\n case \"pin\": {\n state.pinned = true;\n state.state = action.payload.state;\n state.current = action.payload.id;\n break;\n }\n case \"unpin\": {\n state.pinned = false;\n state.state = undefined;\n break;\n }\n }\n }\n}\n\nexport const layoutReducer = produce<LayoutState, [PanelActionType]>((state, action: PanelActionType) => {\n switch (action.panel) {\n case \"centerPanel\": {\n panelReducer(state.centerPanel, action);\n break;\n }\n case \"leftPanel\": {\n panelReducer(state.leftPanel, action);\n break;\n }\n case \"rightPanel\": {\n panelReducer(state.rightPanel, action);\n break;\n }\n case \"modal\": {\n panelReducer(state.modal, action);\n break;\n }\n case \"pinnedRightPanel\": {\n panelReducer(state.pinnedRightPanel, action);\n break;\n }\n }\n});\n\nexport function getDefaultPanelState(): PanelState {\n return {\n customWidth: undefined,\n minimised: false,\n open: true,\n current: null,\n state: null,\n stack: [],\n };\n}\n\nexport function getDefaultLayoutState(): LayoutState {\n return {\n leftPanel: getDefaultPanelState(),\n centerPanel: getDefaultPanelState(),\n rightPanel: getDefaultPanelState(),\n modal: getDefaultPanelState(),\n pinnedRightPanel: {\n ...getDefaultPanelState(),\n pinnable: true,\n pinned: false,\n },\n };\n}\n","import type { Reference } from \"@iiif/presentation-3\";\nimport { createContext, type ReactNode, useContext, useMemo } from \"react\";\nimport invariant from \"tiny-invariant\";\nimport { useVault, useVaultSelector } from \"react-iiif-vault\";\n\ninterface ResourceEditingContext {\n resource: Reference<any> | null;\n}\n\nexport const ResourceEditingReactContext =\n createContext<ResourceEditingContext>({\n resource: null,\n });\n\nexport function useEditingContext() {\n return useContext(ResourceEditingReactContext);\n}\n\n/**\n * useResource\n *\n * Only use this if you KNOW that there is a resource (e.g. in a panel)\n */\nexport function useResource<T = Record<string, never>>(): T & Reference<any> {\n const vault = useVault();\n const { resource } = useEditingContext();\n\n invariant(resource, \"Nothing selected\");\n\n const { id, type } = resource;\n\n const fullResource = useVaultSelector(() => {\n return vault.get({ id, type });\n }, [id, type]);\n\n return fullResource as T & Reference<any>;\n}\n\n/**\n * useOptionalResource\n *\n * Use in components where you don't know if something is editing. (e.g. canvas listing)\n */\nexport function useOptionalResource() {\n const { resource } = useEditingContext();\n\n return resource;\n}\n\nexport function ResourceEditingProvider({\n resource,\n children,\n}: {\n resource: { id: string; type: string } | null | undefined;\n children: ReactNode;\n}) {\n const { id, type } = resource || {};\n\n return (\n <ResourceEditingReactContext.Provider\n value={useMemo(\n () => ({\n // Current resource.\n resource: id && type ? { id, type } : null,\n }),\n [id, type],\n )}\n >\n {children}\n </ResourceEditingReactContext.Provider>\n );\n}\n","import React, { Component, ErrorInfo, ReactNode } from \"react\";\n\ninterface Props {\n children: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n public state: State = {\n hasError: false,\n };\n\n public static getDerivedStateFromError(_: Error): State {\n console.error(_);\n // Update state so the next render will show the fallback UI.\n return { hasError: true };\n }\n\n public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"Uncaught error:\", error, errorInfo);\n }\n\n public render() {\n if (this.state.hasError) {\n return <h1>Sorry.. there was an error</h1>;\n }\n\n return this.props.children;\n }\n}\n","import { isSpecificResource } from \"@iiif/parser\";\nimport type { Reference, SpecificResource } from \"@iiif/presentation-3\";\nimport type { CreatableResource } from \"@manifest-editor/creator-api\";\nimport { type ReactNode, memo, useMemo, useReducer } from \"react\";\nimport invariant from \"tiny-invariant\";\nimport { useApp } from \"../AppContext/AppContext\";\nimport { useEditingStack } from \"../EditingStack/EditingStack\";\nimport type { EditableResource } from \"../EditingStack/EditingStack.types\";\nimport { LayoutActionsReactContext, LayoutStateReactContext } from \"./Layout.context\";\nimport { usePanelActions } from \"./Layout.hooks\";\nimport { getDefaultLayoutState, layoutReducer } from \"./Layout.reducer\";\nimport type { PinnablePanelActions } from \"./Layout.types\";\nimport { useEmitter } from \"../hooks/use-event\";\n\nfunction parse(args: string | { id: string; state?: any; stacked?: boolean }, _state?: any): any {\n if (typeof args === \"string\") {\n return { id: args, state: _state };\n }\n return args;\n}\n\nexport const LayoutProvider = memo(function LayoutProvider(props: { children: ReactNode }) {\n const app = useApp();\n const emitter = useEmitter();\n const available = app.layout;\n\n const [state, dispatch] = useReducer(layoutReducer, undefined, getDefaultLayoutState);\n const actions = {\n centerPanel: usePanelActions(\"centerPanel\", dispatch),\n leftPanel: usePanelActions(\"leftPanel\", dispatch),\n rightPanel: usePanelActions(\"rightPanel\", dispatch),\n pinnedRightPanel: usePanelActions(\"pinnedRightPanel\", dispatch) as PinnablePanelActions,\n modal: usePanelActions(\"modal\", dispatch),\n editingStack: useEditingStack(),\n };\n\n function find(id: any) {\n const right = available.rightPanels.find((r) => r.id === id);\n if (right) {\n return [right, actions.rightPanel, actions.pinnedRightPanel] as const;\n }\n\n const center = available.centerPanels.find((r) => r.id === id);\n if (center) {\n return [center, actions.centerPanel] as const;\n }\n\n const left = available.leftPanels.find((r) => r.id === id);\n if (left) {\n return [left, actions.leftPanel] as const;\n }\n\n invariant(false, `Was not able to find panel with id \"${id}\"`);\n }\n\n function open(args: string | { id: string; state?: any; stacked?: boolean }, _state?: any): void {\n const { id, state, stacked } = parse(args, _state);\n const [found, actions, pinnable] = find(id);\n\n if (pinnable && found.options?.openPinned) {\n pinnable.pin({\n id,\n state: { ...(found.defaultState || {}), ...(state || {}) },\n });\n } else {\n const openData = {\n id,\n state: { ...(found.defaultState || {}), ...(state || {}) },\n stacked,\n };\n\n emitter.emit(\"layout.open\", openData);\n actions.open(openData);\n }\n }\n\n function stack(args: string | { id: string; state?: any }, _state?: any): void {\n const { id, state } = parse(args, _state);\n const [found, actions] = find(id);\n\n const openData = {\n id,\n state: { ...(found.defaultState || {}), ...(state || {}) },\n stacked: true,\n };\n\n emitter.emit(\"layout.open\", openData);\n actions.open(openData);\n }\n\n function change(args: string | { id: string; state?: any; stacked?: boolean }, _state?: any): void {\n const { id, state, stacked } = parse(args, _state);\n const [found, actions] = find(id);\n const changeData = {\n id,\n state: { ...(found.defaultState || {}), ...(state || {}) },\n stacked,\n };\n\n emitter.emit(\"layout.change\", changeData);\n actions.change(changeData);\n }\n\n function close(args: string | { id: string; state?: any }, _state?: any): void {\n const { id } = parse(args, _state);\n const [, actions] = find(id);\n\n emitter.emit(\"layout.close\", { id });\n actions.close();\n }\n\n function toggle(args: string | { id: string; state?: any }, _state?: any): void {\n const { id } = parse(args, _state);\n const [, actions] = find(id);\n\n emitter.emit(\"layout.toggle\", { id });\n actions.toggle();\n }\n\n function edit(\n resource: Reference | SpecificResource,\n context: Omit<EditableResource, \"resource\"> = {},\n {\n reset,\n property,\n stacked,\n forceOpen,\n }: {\n reset?: boolean;\n property?: string;\n stacked?: boolean | undefined;\n forceOpen?: boolean;\n } = {}\n ) {\n const toEdit: EditableResource = {\n resource: isSpecificResource(resource)\n ? resource\n : {\n type: \"SpecificResource\",\n source: resource,\n },\n ...context,\n };\n\n emitter.emit(\"layout.edit\", toEdit);\n actions.editingStack.edit(toEdit, reset);\n\n if (available.rightPanels.find((e) => e.id === \"@manifest-editor/editor\")) {\n if (forceOpen) {\n actions.rightPanel.open({\n id: \"@manifest-editor/editor\",\n stacked: stacked !== false,\n state: { property },\n unique: true,\n });\n } else {\n actions.rightPanel.change({\n id: \"@manifest-editor/editor\",\n stacked: stacked !== false,\n state: { property },\n unique: true,\n });\n }\n }\n }\n\n function create(resource: CreatableResource) {\n actions.editingStack.create(resource, {});\n emitter.emit(\"layout.create\", resource);\n if (available.modals?.find((e) => e.id === \"@manifest-editor/creator\")) {\n actions.modal.open({\n id: \"@manifest-editor/creator\",\n stacked: true,\n unique: true,\n state: resource,\n });\n } else if (available.rightPanels.find((e) => e.id === \"@manifest-editor/creator\")) {\n actions.rightPanel.open({\n id: \"@manifest-editor/creator\",\n stacked: true,\n unique: true,\n state: resource,\n });\n }\n }\n\n const otherActions = {\n open,\n change,\n close,\n toggle,\n stack,\n edit,\n create,\n };\n\n return (\n <LayoutActionsReactContext.Provider\n // biome-ignore lint/correctness/useExhaustiveDependencies: actions do not change\n value={useMemo(() => ({ ...actions, ...otherActions }), [available])}\n >\n <LayoutStateReactContext.Provider value={state}>{props.children}</LayoutStateReactContext.Provider>\n </LayoutActionsReactContext.Provider>\n );\n});\n","import { ImageServiceLoader } from \"@atlas-viewer/iiif-image-api\";\nimport { ErrorBoundary } from \"@manifest-editor/ui/atoms/ErrorBoundary\";\nimport { type ReactNode, useMemo } from \"react\";\nimport {\n AtlasStoreProvider,\n ImageServiceLoaderContext,\n} from \"react-iiif-vault\";\nimport { ThemeProvider } from \"styled-components\";\nimport {\n AppResourceProvider,\n type Resource,\n} from \"../AppResourceProvider/AppResourceProvider\";\nimport {\n type Config,\n ConfigProvider,\n useConfig,\n} from \"../ConfigContext/ConfigContext\";\nimport { ContextMenuProvider } from \"../ContextMenu/ContextMenuContext\";\nimport { EditingStack } from \"../EditingStack/EditingStack\";\nimport { LayoutProvider } from \"../Layout/Layout.context-internal\";\nimport { PreviewProvider } from \"../PreviewContext/PreviewContext\";\nimport type {\n Preview,\n PreviewConfiguration,\n} from \"../PreviewContext/PreviewContext.types\";\nimport { PreviewVaultContext } from \"../PreviewVault/PreviewVault\";\nimport { defaultTheme } from \"./default-theme\";\n\nconst previewConfigs: PreviewConfiguration[] = [\n {\n id: \"universal-viewer\",\n config: {\n url: \"https://universalviewer.dev/#?iiifManifestId={manifestId}\",\n },\n type: \"external-manifest-preview\",\n label: \"Universal viewer\",\n },\n {\n id: \"mirador-3\",\n type: \"external-manifest-preview\",\n label: \"Mirador 3\",\n config: {\n url: \"https://tomcrane.github.io/scratch/mirador3/?iiif-content={manifestId}\",\n },\n },\n {\n id: \"annona\",\n type: \"external-manifest-preview\",\n label: \"Annona\",\n config: {\n url: \"https://ncsu-libraries.github.io/annona/tools/#/display?url={manifestId}&viewtype=iiif-storyboard&settings=%7B%22fullpage%22%3Atrue%7D\",\n },\n },\n {\n id: \"iiif-preview\",\n config: { url: \"https://iiif-preview.digirati.services/store\" },\n type: \"iiif-preview-service\",\n label: \"IIIF Preview\",\n },\n];\n\nconst imageServiceLoader = new ImageServiceLoader({\n approximateServices: true,\n verificationsRequired: 8,\n enableFetching: true,\n});\n\nexport function ShellProvider({\n config,\n saveConfig,\n children,\n theme,\n previews,\n resource,\n editing,\n}: {\n resource: Resource;\n config?: Partial<Config>;\n saveConfig?: (config: Partial<Config>) => void;\n children: ReactNode;\n theme?: any;\n previews?: Preview[];\n editing?: { id: string; type: string };\n}) {\n const existingConfig = useConfig();\n const mergedConfig = useMemo(() => {\n return {\n ...existingConfig,\n ...config,\n previews: config?.previews || existingConfig.previews || previewConfigs,\n };\n }, [existingConfig, config]);\n\n return (\n <ErrorBoundary>\n <ImageServiceLoaderContext.Provider value={imageServiceLoader}>\n <AppResourceProvider resource={resource}>\n <PreviewVaultContext>\n <ThemeProvider theme={theme || defaultTheme}>\n <ConfigProvider config={mergedConfig} saveConfig={saveConfig}>\n <EditingStack>\n <LayoutProvider>\n <ContextMenuProvider>\n {/* @todo swap these out for (config?.previews || []) */}\n <PreviewProvider\n previews={previews || []}\n configs={mergedConfig.previews}\n >\n <AtlasStoreProvider>{children}</AtlasStoreProvider>\n </PreviewProvider>\n </ContextMenuProvider>\n </LayoutProvider>\n </EditingStack>\n </ConfigProvider>\n </ThemeProvider>\n </PreviewVaultContext>\n </AppResourceProvider>\n </ImageServiceLoaderContext.Provider>\n </ErrorBoundary>\n );\n}\n","// TaskBridge.\nimport mitt, { Emitter } from \"mitt\";\nimport { createContext, ReactNode, useCallback, useContext, useEffect, useMemo, useReducer } from \"react\";\n\ninterface Task<Req = any, Res = any> {\n name: string;\n status: \"idle\" | \"running\" | \"complete\" | \"error\";\n emitter: Emitter<any>;\n promise: Promise<any>;\n abort: AbortController;\n resolve: (value?: any) => void;\n reject: (reason?: any) => void;\n error?: string;\n request?: Req;\n response?: Res;\n}\n\nconst tempGlobalState: Record<string, Record<string, Task>> = {};\n\nconst DispatchReactContext = createContext<string>(\"global\");\n\nfunction useCurrentDispatchId() {\n return useContext(DispatchReactContext);\n}\n\nfunction createDeferred() {\n let res: (value: any) => void = undefined as any;\n let rej: (reason?: any) => void = undefined as any;\n const promise = new Promise((resolve, reject) => {\n res = resolve;\n rej = reject;\n });\n\n return { promise, resolve: res, reject: rej };\n}\n\nexport function useTask(name: string) {\n const id = useCurrentDispatchId();\n const [, invalidate] = useReducer((r) => r + 1, 0);\n const task = useMemo(() => {\n if (!tempGlobalState[id]) {\n tempGlobalState[id] = {};\n }\n if (!tempGlobalState[id]![name]) {\n tempGlobalState[id]![name] = {\n name,\n emitter: mitt(),\n status: \"idle\",\n promise: Promise.resolve(),\n abort: new AbortController(),\n reject: () => void 0,\n resolve: () => void 0,\n };\n }\n\n return tempGlobalState[id]![name]!;\n }, [id, name]);\n\n useTaskEvent(task, \"abort\", invalidate);\n useTaskEvent(task, \"error\", invalidate);\n useTaskEvent(task, \"complete\", invalidate);\n useTaskEvent(task, \"running\", invalidate);\n\n return task;\n}\n\nexport function useTaskEvent<Req = any, Res = any>(\n task: Task<Req, Res>,\n name: string,\n _cb: (task: Task<Req, Res>) => any\n) {\n const cb = useCallback(() => _cb(task), [_cb]);\n useEffect(() => {\n const em = task.emitter;\n em.on(name, cb);\n return () => em.off(name, cb);\n }, [name, cb, task.emitter]);\n}\n\nconst noop = () => void 0;\n\nexport function useTaskDispatch<Req = any, Res = any>(\n name: string,\n onComplete?: (task: Task<Req, Res>) => void | Promise<void>\n) {\n const taskDetails = useTask(name);\n\n useTaskEvent(taskDetails, \"complete\", onComplete ? onComplete : noop);\n\n const runTask = (request?: any) => {\n // Abort running tasks.\n if (taskDetails.status === \"running\") {\n taskDetails.abort.abort();\n taskDetails.emitter.emit(\"abort\");\n }\n\n // Error clearing.\n if (taskDetails.error) {\n taskDetails.error = \"\";\n }\n\n // Creating new task.\n const d = createDeferred();\n d.promise.then(() => taskDetails.emitter.emit(\"complete\")).catch(() => taskDetails.emitter.emit(\"error\"));\n taskDetails.status = \"running\";\n taskDetails.request = request;\n taskDetails.promise = d.promise;\n taskDetails.resolve = d.resolve;\n taskDetails.reject = d.reject;\n taskDetails.emitter.emit(\"running\");\n };\n\n return [runTask, taskDetails] as const;\n}\n\nexport function useTaskRunner<Req = any, Res = any>(\n name: string,\n onRun: (task: Task<Req, Res>) => void | Promise<void>\n) {\n const taskDetails = useTask(name);\n\n useTaskEvent(taskDetails, \"running\", onRun);\n\n const completeTask = (response?: any) => {\n if (taskDetails.status === \"running\") {\n taskDetails.response = response;\n taskDetails.status = \"complete\";\n taskDetails.resolve();\n }\n //\n };\n\n const rejectTask = (reason?: any, error?: any) => {\n if (taskDetails.status === \"running\") {\n taskDetails.error = error || reason;\n taskDetails.status = \"error\";\n taskDetails.reject(reason);\n }\n };\n\n return [completeTask, taskDetails, rejectTask] as const;\n}\n\nexport function TaskBridge({ children }: { children?: ReactNode }) {\n return (\n <DispatchReactContext.Provider value={useMemo(() => `id-${Date.now()}`, [])}>\n {children}\n </DispatchReactContext.Provider>\n );\n}\n","import { HTMLAttributes, useCallback, useMemo } from \"react\";\nimport { UniversalCopyPasteProps } from \"./UniversalCopyPaste.types\";\n\n// @todo\nfunction analyse(t: any) {\n return false;\n}\n\nexport function UniversalCopyTarget<T>({\n as,\n reference: _ref,\n onReference,\n onLink,\n onAnalysis,\n onDropReference: _onDropReference,\n onDropLink: _onDropLink,\n onDropAnalysis: _onDropAnalysis,\n onPasteReference: _onPasteReference,\n onPasteLink: _onPasteLink,\n onPasteAnalysis: _onPasteAnalysis,\n ...props\n}: Partial<HTMLAttributes<HTMLElement>> & UniversalCopyPasteProps<T> & T) {\n // const vault = useVault();\n const Component = (as || \"div\") as any;\n\n const onDropReference = _onDropReference || onReference;\n const onDropLink = _onDropLink || onLink;\n const onDropAnalysis = _onDropAnalysis || onAnalysis;\n const onPasteReference = _onPasteReference || onReference;\n const onPasteLink = _onPasteLink || onLink;\n const onPasteAnalysis = _onPasteAnalysis || onAnalysis;\n\n const reference = useMemo(() => {\n return _ref;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [_ref?.id, _ref?.type]);\n\n const onCopy = useCallback(\n function onCopy(e: ClipboardEvent) {\n if (e.defaultPrevented) {\n return;\n }\n e.preventDefault();\n if (e.clipboardData) {\n if (reference && reference.id && reference.type) {\n // const full = vault.get(reference);\n // if (full) {\n // e.clipboardData.setData(\"application/json\", JSON.stringify(vault.toPresentation3(vault.get(reference))));\n // }\n\n e.clipboardData.setData(\n \"application/json+vault\",\n JSON.stringify({\n id: reference.id,\n type: reference.type,\n })\n );\n }\n }\n },\n [reference]\n );\n\n const onPaste = useCallback(async function onPaste(e: ClipboardEvent) {\n if (e.defaultPrevented) {\n return;\n }\n e.preventDefault();\n if (e.clipboardData) {\n if (props.onLoading) {\n props.onLoading();\n }\n\n if (onPasteReference) {\n const data = e.clipboardData.getData(\"application/json+vault\");\n if (data) {\n try {\n const dataAsJson = JSON.parse(data);\n if (dataAsJson && dataAsJson.id && dataAsJson.type) {\n onPasteReference(dataAsJson);\n }\n } catch (e) {\n // ignore.\n }\n }\n }\n\n if (onPasteLink || onPasteAnalysis) {\n const data = e.clipboardData.getData(\"text\");\n if (data.startsWith(\"http\")) {\n const allLinks = data.split(\"\\n\");\n for (const link of allLinks) {\n if (onPasteAnalysis) {\n try {\n const result = await analyse(link);\n if (result) {\n onPasteAnalysis(result);\n continue;\n }\n } catch (e) {\n // let it fallback to onPasteLink\n }\n }\n if (onPasteLink) {\n onPasteLink(link);\n }\n }\n }\n }\n if (props.onComplete) {\n props.onComplete();\n }\n }\n }, []);\n\n // @todo not working..\n const onDragStart = useCallback(function onPaste(e: DragEvent) {\n if (e.defaultPrevented) {\n return;\n }\n e.preventDefault();\n if (e.dataTransfer && props.draggable) {\n e.dataTransfer.effectAllowed = \"all\";\n\n if (reference && reference.id && reference.type) {\n e.dataTransfer.setData(\n \"application/json+vault\",\n JSON.stringify({\n id: reference.id,\n type: reference.type,\n })\n );\n }\n }\n }, []);\n\n const onDrop = useCallback(async function onDrop(e: DragEvent) {\n e.preventDefault();\n if (e.dataTransfer) {\n if (onDropReference) {\n const data = e.dataTransfer.getData(\"application/json+vault\");\n if (data) {\n try {\n const dataAsJson = JSON.parse(data);\n if (dataAsJson && dataAsJson.id && dataAsJson.type) {\n onDropReference(dataAsJson, e);\n }\n } catch (e) {\n // ignore.\n return;\n }\n }\n }\n const json = e.dataTransfer.getData(\"application/json\");\n if (json) {\n const parsed = JSON.parse(json);\n // @todo this could be raw JSON or a Content State.\n return;\n }\n const link = e.dataTransfer.getData(\"text/plain\");\n if (link) {\n // console.log(\"link\", link);\n return;\n }\n }\n }, []);\n\n const onDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n if (e.dataTransfer) {\n e.dataTransfer.dropEffect = \"copy\";\n }\n }, []);\n\n return (\n <Component\n onCopy={onCopy}\n onPaste={onPaste}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onDragStart={onDragStart}\n tabIndex={-1}\n {...props}\n />\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
|