@manifest-editor/exhibition-preset 2.1.0 → 2.2.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["useCanvas","useAtlasStore","useStore","useLayoutState","AnnotationPageContext","ViewerAnnotationPage","useManifest","useVault","useState","useRef","useLayoutActions","useMemo","Button","EditTextIcon","EditorHooksProvider","DelftExhibition","useApp","useManifest","usePresetTemplateSelection","create","getYouTubeId","ExhibitionPreviewPanel","useVault","useAppResource","useManifest","useInStack","useRef","useState","useVaultSelector","useMemo","useCallback","createIframeVaultBridge","twMerge","usePreviewWindow","useManifest","ExhibitionPreviewPanel","useManifest","useLayoutActions","Button","LocaleString","useCanvas","useCanvas","useEditingResource","useInlineCreator","useCreator","useEditor","useVault","useMemo","LinkingPropertyList","createAppActions","useState","InputContainer","ActionButton","AddIcon","getLanguageMapText","resolveResource","createImageServiceRequest","imageServiceRequestToString","useApp","useState","useLocalStorage","Sidebar","SidebarContent","useInStack","useCanvas","useEditor","useVault","useManifest","useVaultSelector","isImageCanvas","InputContainer","DimensionsTriplet","BehaviorEditor","SimpleFieldLabel","twMerge","LazyThumbnail","Button","getInternationalStringText","editorialTextRegionId","useCanvas","useVault","useInStack","useRef","useState","useVaultSelector","twMerge","getLanguageMapText","AnnotationContext","HTMLAnnotationBodyRender","LocaleString","forwardRef","useCanvas","useCanvasRenderingStrategy","useInStack","getInternationalStringText","LocaleString","twMerge","LazyThumbnail","useLayoutActions","useManifestEditor","useCreator","CanvasContext","escapeHtml","stripHtml","useLayoutActions","useManifestEditor","useCreator","CanvasContext","useManifest","LocaleString","useCanvas","useInStack","useState","useId","useVaultSelector","twMerge","LazyThumbnail","getInternationalStringText","useSortable","CSS","AppDropdown","Button","MoreMenu","useManifest","useManifestEditor","useEditingStack","useInStack","useLayoutActions","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","useCreator","useCallback","CanvasContext","createAppActions","DndContext","closestCenter","restrictToParentElement","SortableContext","rectSortingStrategy","verticalListSortingStrategy","useManifestEditor","useInStack","useEditingStack","useCreator","useToggleList","Sidebar","SidebarHeader","CanvasListingIcon","SidebarContent","CanvasListView","ActionButton","useManifest","useManifest","useVault","useOpenPresetOnboarding","Sidebar","SidebarContent","Button","InputContainer","InputLabel","Input","useState","toHexColor","useMemo","useManifest","useLayoutState","useLayoutActions","useState","useRef","useLocalStorage","useInStack","CanvasContext","useCanvas","LocaleString","ModeButton","ExhibitionPreviewPanel","CanvasPanelEditor","Button","twMerge","useState","useRef","twMerge","useCanvas","useVaultSelector","useConfig","useLocalStorage","LocaleString","ExhibitionPreviewPanel","Button","useInlineCreator","useVault","importEntities","addMappings","ActionButton","AnnotationContext","useAnnotation","useGenericEditor","useCallback","useMemo","HTMLEditor","useLayoutActions","useCanvas","useVaultSelector","useRef","useGenericEditor","LazyThumbnail","LocaleString","ActionButton","defineCreator","iiifBrowserCreator","creatorHelper","defineCreator","imageServiceCreator","creatorHelper","defineCreator","EmptyCanvasIcon","emptyCanvas","emptyAnnotationPage","defineCreator","imageUrlCreator","creatorHelper","Button","usePreviewContext","useVault","useConfig","useAppResource","useLayoutActions","useOpenPresetOnboarding","usePresetTemplateSelection","DownloadButton","ButtonContainer","ButtonMain","MenuTrigger","ButtonChange","Popover","MenuContainer","Menu","MenuItem","MenuItemLabel","MenuItemStatus","OnboardingTour","defineCreator","emptyAnnotation","emptyCanvas","defineCreator","videoAnnotation","creatorHelper","defineCreator","youTubeBodyCreator","getYouTubeId","createYoutubeBodyResource","emptyCanvas","getValue","useEditor","ActionButton","InputContainer","InputLabel","Input","useCanvas","useVault","useVaultSelector","useGenericEditor","Button","targetWholeCanvas","Sidebar","SidebarContent","useCanvas","ResourceEditingProvider","LanguageMapEditor","useEditor","InputContainer","InputLabel","InputFieldset","LanguageFieldEditor","useVault","useMemo","TiptapLanguageFieldEditor","Sidebar","SidebarContent","useCanvas","useVault","useManifestEditor","useEditingResource","useEditor","useCreator","useVaultSelector","ResourceEditingProvider","InputContainer","AnnotationPageContext","PaintingAnnotationList","LanguageMapEditor","useLayoutActions","useRef","useState","getLanguageMapText","ArrowRightIcon","isImageService","importEntities","addMappings","canonicalServiceUrl","createImageServiceRequest","imageServiceRequestToString","parseImageServiceRequest","useVault","useEditor","useCanvas","useRef","useState","ActionButton","MediaEditor","useCallback","Modal","useMemo","Vault","VaultProvider","AtlasStoreReactContext","CanvasPanel","useRequestAnnotation","HTMLPortal","useCurrentAnnotationActions","useState","useRef","HTMLEditor","useAtlasStore","useStore","useCurrentAnnotationMetadata","useCurrentAnnotationActions","TargetIcon","ActionButton","DeleteIcon","useAnnotation","useGenericEditor","DialogTrigger","Button","Popover","Dialog","useVault","useCanvas","DialogTrigger","Button","Popover","Dialog","useAnnotation","useVault","useRef","useAnnotationEditor","useState","ActionButton","EditTextIcon","DeleteIcon","useAnnotationPage","useGenericEditor","useAnnotation","useCanvas","useVault","useLayoutActions","useState","useRef","ActionButton","EditTextIcon","DeleteIcon","useAnnotationInfo","useMemo","ResourceEditingProvider","AnnotationContext","useAnnotationPage","useGenericEditor","AnnotationContext","ReorderList","useCanvas","Sidebar","SidebarContent","useInlineCreator","Button","useEditor","useState","useApp","ActionButton","ResourceEditingProvider","AnnotationPageContext","PromptToAddPaintingAnnotations","useRequestAnnotation","useEditor","InputContainer","InputLabel","Input","useLocalStorage","useCanvas","useVault","useManifest","useEditor","Sidebar","SidebarContent","ResourceEditingProvider","SimpleFieldLabel","LanguageMapEditor","InputContainer","DimensionsTriplet","BehaviorEditor","useCanvas","useCreator","useVaultSelector","useVault","useAnnotationThumbnail","Button","getInternationalStringText","resolveContentResource","useLocalStorage","useCanvas","useVault","useMemo","useState","Sidebar","SidebarContent","Button","ResourceEditingProvider","LanguageMapEditor","extendApp","mapApp","ManifestPreset","useCanvas","useManifest","useLayoutActions","useLayoutState","useCurrentAnnotationRequest","useAnnotationEditing","useState","CanvasPanelEditor","LocaleString","CanvasContext","Button","useManifestEditor","useCreator","useInStack","useEditingStack","useLayoutActions","ActionButton","CanvasContext","SidebarContent","useCanvas","Button","useManifest","useVault","useInlineCreator","useState","useRef","useVaultSelector","twMerge","ExhibitionPreviewPanel","ResourceEditingProvider","AnnotationPageContext","importEntities","addMappings","LocaleString","extendApp","mapApp","ManifestPreset","extendApp","mapApp","ManifestPreset"],"sources":["../src/annotations/TourStepAnnotations.tsx","../src/theme/theme-service.ts","../src/center-panels/ExhibitionCenterPanel.tsx","../src/helpers/exhibition-preview-url-helper.ts","../src/helpers/exhibition-template.ts","../src/slideshow-content-positioning.ts","../src/components/preview-structure.ts","../src/components/ExhibitionPreviewPanel.tsx","../src/helpers/exhibition-preview-state.ts","../src/icons/PreviewIcon.tsx","../src/center-panels/ExhibitionRemotePreviewPanel.tsx","../src/components/ExhibitionContainer.tsx","../src/helpers.ts","../src/components/AspectRatioWarning.tsx","../src/components/FloatingPositionPicker.tsx","../src/right-panels/ExhibitionThumbnailEditor.tsx","../src/right-panels/slide-behavior-transforms.ts","../src/right-panels/SlideBehaviours.tsx","../src/tour-behaviors.ts","../src/components/SlideshowSlidePreview.tsx","../src/components/ExhibitionItem.tsx","../src/components/ExhibitionGrid.tsx","../src/right-panels/summary-html.ts","../src/components/tour-step-html.ts","../src/components/ExhibitionPreviewList.tsx","../src/helpers/slide-selection.ts","../src/icons/ResizeHandleIcon.tsx","../src/components/SortableExhibitionItem.tsx","../src/components/SortableExhibitionGrid.tsx","../src/right-panels/opening-splash.ts","../src/left-panels/ExhibitionGrid.tsx","../src/left-panels/ExhibitionOverview.tsx","../../../packages/ui/icons/DownIcon.tsx","../src/exhibition-templates.ts","../src/left-panels/ExhibitionTheme.tsx","../src/background-panel.tsx","../src/canvas-editors/image-block-editor.tsx","../src/canvas-editors/info-block-editor.tsx","../src/canvas-editors/youtube-editor.tsx","../src/creators/image-browser-slide-creator.tsx","../src/creators/image-service-slide-creator.tsx","../src/creators/image-slide-creator.tsx","../src/creators/image-url-slide.tsx","../src/exhibition-onboarding.tsx","../src/creators/info-box-creator.tsx","../src/creators/video-slide-creator.tsx","../src/creators/youtube-slide-creator.tsx","../src/components/exhibition-item-defaults.ts","../src/components/ExhibitionItemConversion.tsx","../src/components/CanvasBackgroundColorField.tsx","../src/components/single-image-rescale.ts","../src/components/RescaleSingleImagePrompt.tsx","../src/right-panels/ExhibitionSummaryEditor.tsx","../src/right-panels/ExhibitionCanvasEditor.tsx","../src/image-crop.ts","../src/right-panels/ExhibitionImageCropEditor.tsx","../src/icons/CheckIcon.tsx","../src/components/TourStepHtmlForm.tsx","../src/components/PendingTourStepAnnotation.tsx","../src/components/TourStepBorderPicker.tsx","../src/components/TourStepSideControl.tsx","../src/components/TourNormalAnnotationEditor.tsx","../src/components/TourPaintingAnnotationEditor.tsx","../src/components/TourAnnotationEditor.tsx","../src/components/TourAnnotationPageEditor.tsx","../src/tour-step-target.ts","../src/right-panels/ExhibitionTourSteps.tsx","../src/right-panels/SlideshowDurationField.tsx","../src/right-panels/InfoBoxPanel.tsx","../src/right-panels/SlideshowContentPanel.tsx","../src/right-panels/ExhibitionWorkbenchEditor.tsx","../src/icons/PresetIcon.tsx","../src/presets/scrolling-preset.ts","../src/canvas-editors/slideshow-canvas-editor.tsx","../../../packages/ui/icons/MoveIcon.tsx","../../../packages/ui/icons/SlideshowIcon.tsx","../src/center-panels/SlideshowCenterPanel.tsx","../src/presets/slideshow-preset.ts","../src/index.tsx"],"sourcesContent":["import { ViewerAnnotationPage } from \"@manifest-editor/editors\";\nimport { type AnnotationPanel, useAtlasStore, useLayoutState } from \"@manifest-editor/shell\";\nimport { AnnotationPageContext, useCanvas } from \"react-iiif-vault\";\nimport { useStore } from \"zustand\";\n\nexport const tourStepAnnotations: AnnotationPanel = {\n id: \"@exhibition/tour-step-annotations\",\n label: \"Tour steps\",\n render: () => <TourStepAnnotations />,\n};\n\nconst tourStepStyle = {\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\n \":hover\": {\n borderColor: \"#4B67E1\",\n backgroundColor: \"rgba(255, 255, 255, 0.2)\",\n },\n};\n\nfunction TourStepAnnotations() {\n const canvas = useCanvas();\n const store = useAtlasStore();\n const toolEnabled = useStore(store, (s) => s.tool.enabled);\n const { rightPanel } = useLayoutState();\n const isRightPanel = rightPanel.current === \"@manifest-editor/editor\";\n const isTour = isRightPanel && rightPanel.state?.currentTab?.startsWith(\"@exhibition/tour-steps\");\n const firstAnnotationPage = canvas?.annotations[0];\n\n if (!isTour || !canvas || toolEnabled || !firstAnnotationPage) {\n return null;\n }\n\n return (\n <>\n <AnnotationPageContext annotationPage={firstAnnotationPage.id}>\n <ViewerAnnotationPage showAnnotationNumber style={tourStepStyle} />\n </AnnotationPageContext>\n </>\n );\n}\n","export const EXHIBITION_THEME_SERVICE_PROFILE =\n \"https://exhibitionviewer.org/iiif/theme-service\";\nexport const EXHIBITION_THEME_SERVICE_LABEL = {\n en: [\"Exhibition viewer theme\"],\n};\n\nexport type ExhibitionThemePreset = \"delft\" | \"minimal\" | \"gallery\";\nexport type FloatingPosition =\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\"\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\";\nexport type TitleTransform = \"uppercase\" | \"none\" | \"capitalize\";\nexport type TableOfContentsPlacement = \"header\" | \"footer\";\n\nexport interface SharedThemeConfig {\n fontSans: string;\n fontMono: string;\n titleTransform: TitleTransform;\n}\n\nexport interface DelftThemeTokens {\n backgroundPrimary: string;\n backgroundSecondary: string;\n backgroundOverlay: string;\n textPrimary: string;\n textSecondary: string;\n imageCaption: string;\n annotationSelected: string;\n controlBar: string;\n controlBarBorder: string;\n controlHover: string;\n progressBar: string;\n closeBackground: string;\n closeBackgroundHover: string;\n closeText: string;\n titleCard: string;\n titleCardText: string;\n infoBlock: string;\n infoBlockText: string;\n viewerBackground: string;\n}\n\nexport interface ScrollThemeTokens {\n titleBackground: string;\n titleColor: string;\n annotationBackground: string;\n annotationColor: string;\n annotationRadius: string;\n annotationMaxWidth: string;\n infoBlockBackground: string;\n infoBlockColor: string;\n}\n\nexport interface DelftExhibitionThemeOptions {\n cutCorners: boolean;\n fullTitleBar: boolean;\n fullWidthGrid: boolean;\n hideTableOfContents: boolean;\n tableOfContentsPlacement: TableOfContentsPlacement;\n showProgressBar: boolean;\n showProgressTableOfContents: boolean;\n showNavigationControls: boolean;\n disablePresentation: boolean;\n hideTitle: boolean;\n hideTitleCard: boolean;\n alternativeImageMode: boolean;\n transitionScale: boolean;\n imageInfoIcon: boolean;\n coverImages: boolean;\n ignoreCanvasBackgrounds: boolean;\n}\n\nexport interface DelftPresentationThemeOptions {\n cutCorners: boolean;\n isFloating: boolean;\n floatingPosition: FloatingPosition;\n labelOnlyFloating: boolean;\n ignoreCanvasBackgrounds: boolean;\n}\n\nexport interface DelftSlideshowThemeOptions {\n alternativeImageMode: boolean;\n transitionScale: boolean;\n imageInfoIcon: boolean;\n coverImages: boolean;\n ignoreCanvasBackgrounds: boolean;\n}\n\nexport interface ScrollThemeConfigOptions {\n showTitleBlock: boolean;\n showTableOfContents: boolean;\n tableOfContentsPlacement: TableOfContentsPlacement;\n showProgressBar: boolean;\n showProgressTableOfContents: boolean;\n showScrollToTop: boolean;\n showNavigationControls: boolean;\n ignoreCanvasBackgrounds: boolean;\n titleBlock: {\n fullHeight: boolean;\n };\n}\n\nexport interface ExhibitionThemeConfig {\n version: 1;\n preset: ExhibitionThemePreset;\n shared: SharedThemeConfig;\n delft: {\n tokens: DelftThemeTokens;\n exhibition: DelftExhibitionThemeOptions;\n presentation: DelftPresentationThemeOptions;\n slideshow: DelftSlideshowThemeOptions;\n };\n scroll: {\n tokens: ScrollThemeTokens;\n options: ScrollThemeConfigOptions;\n };\n}\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends Array<infer U>\n ? U[]\n : T[K] extends object\n ? DeepPartial<T[K]>\n : T[K];\n};\n\nconst DEFAULT_SHARED: SharedThemeConfig = {\n fontSans: '\"Tahoma\", \"Fira Sans\", sans-serif',\n fontMono: '\"Fira Mono\", monospace',\n titleTransform: \"uppercase\",\n};\n\nconst DEFAULT_DELFT_TOKENS: DelftThemeTokens = {\n backgroundPrimary: \"#e5e7eb\",\n backgroundSecondary: \"#fff\",\n backgroundOverlay: \"rgba(0, 0, 0, 0.3)\",\n textPrimary: \"#fff\",\n textSecondary: \"#000\",\n imageCaption: \"#fff\",\n annotationSelected: \"#facc15\",\n controlBar: \"#6d6e70\",\n controlBarBorder: \"#5a5b5d\",\n controlHover: \"rgba(0, 0, 0, 0.1)\",\n progressBar: \"#fff\",\n closeBackground: \"#000\",\n closeBackgroundHover: \"#373737\",\n closeText: \"#fff\",\n titleCard: \"#facc15\",\n titleCardText: \"#000\",\n infoBlock: \"#000\",\n infoBlockText: \"#fff\",\n viewerBackground: \"#373737\",\n};\n\nconst MINIMAL_DELFT_TOKENS: DelftThemeTokens = {\n ...DEFAULT_DELFT_TOKENS,\n backgroundPrimary: \"#fff\",\n backgroundSecondary: \"#fff\",\n textPrimary: \"#000\",\n textSecondary: \"#000\",\n imageCaption: \"#000\",\n annotationSelected: \"#303f9f\",\n controlBar: \"#f9f9f9\",\n controlBarBorder: \"#000\",\n closeBackground: \"#fff\",\n closeBackgroundHover: \"#eee\",\n closeText: \"#000\",\n progressBar: \"#000000\",\n titleCard: \"#fff\",\n titleCardText: \"#000\",\n infoBlock: \"#fff\",\n infoBlockText: \"#000\",\n viewerBackground: \"#e9e9e9\",\n};\n\nconst DEFAULT_SCROLL_TOKENS: ScrollThemeTokens = {\n titleBackground: \"#fff\",\n titleColor: \"#444\",\n annotationBackground: \"#fff\",\n annotationColor: \"#333\",\n annotationRadius: \"0px\",\n annotationMaxWidth: \"30em\",\n infoBlockBackground: \"#fff\",\n infoBlockColor: \"#444\",\n};\n\nconst DEFAULT_EXHIBITION_OPTIONS: DelftExhibitionThemeOptions = {\n cutCorners: true,\n fullTitleBar: false,\n fullWidthGrid: false,\n hideTableOfContents: false,\n tableOfContentsPlacement: \"footer\",\n showProgressBar: true,\n showProgressTableOfContents: true,\n showNavigationControls: true,\n disablePresentation: false,\n hideTitle: false,\n hideTitleCard: false,\n alternativeImageMode: true,\n transitionScale: false,\n imageInfoIcon: false,\n coverImages: false,\n ignoreCanvasBackgrounds: false,\n};\n\nconst DEFAULT_PRESENTATION_OPTIONS: DelftPresentationThemeOptions = {\n cutCorners: false,\n isFloating: false,\n floatingPosition: \"bottom-left\",\n labelOnlyFloating: true,\n ignoreCanvasBackgrounds: false,\n};\n\nconst DEFAULT_SLIDESHOW_OPTIONS: DelftSlideshowThemeOptions = {\n alternativeImageMode: true,\n transitionScale: false,\n imageInfoIcon: false,\n coverImages: false,\n ignoreCanvasBackgrounds: false,\n};\n\nconst DEFAULT_SCROLL_OPTIONS: ScrollThemeConfigOptions = {\n showTitleBlock: true,\n showTableOfContents: false,\n tableOfContentsPlacement: \"header\",\n showProgressBar: true,\n showProgressTableOfContents: true,\n showScrollToTop: true,\n showNavigationControls: true,\n ignoreCanvasBackgrounds: false,\n titleBlock: {\n fullHeight: true,\n },\n};\n\nconst DEFAULT_DELFT_THEME: ExhibitionThemeConfig = {\n version: 1,\n preset: \"delft\",\n shared: DEFAULT_SHARED,\n delft: {\n tokens: DEFAULT_DELFT_TOKENS,\n exhibition: DEFAULT_EXHIBITION_OPTIONS,\n presentation: DEFAULT_PRESENTATION_OPTIONS,\n slideshow: DEFAULT_SLIDESHOW_OPTIONS,\n },\n scroll: {\n tokens: DEFAULT_SCROLL_TOKENS,\n options: DEFAULT_SCROLL_OPTIONS,\n },\n};\n\nconst MINIMAL_THEME: ExhibitionThemeConfig = {\n ...DEFAULT_DELFT_THEME,\n preset: \"minimal\",\n shared: {\n ...DEFAULT_SHARED,\n titleTransform: \"none\",\n },\n delft: {\n ...DEFAULT_DELFT_THEME.delft,\n tokens: MINIMAL_DELFT_TOKENS,\n },\n};\n\nconst GALLERY_THEME: ExhibitionThemeConfig = {\n version: 1,\n preset: \"gallery\",\n shared: {\n fontSans: '\"Gill Sans\", \"Trebuchet MS\", sans-serif',\n fontMono: '\"Courier Prime\", \"Courier New\", monospace',\n titleTransform: \"capitalize\",\n },\n delft: {\n tokens: {\n ...DEFAULT_DELFT_TOKENS,\n backgroundPrimary: \"#f3ecdf\",\n backgroundSecondary: \"#fff8ee\",\n backgroundOverlay: \"rgba(20, 26, 32, 0.45)\",\n textPrimary: \"#fff8ee\",\n textSecondary: \"#2b2118\",\n imageCaption: \"#f8efe1\",\n annotationSelected: \"#f08c2e\",\n controlBar: \"#1f3a5f\",\n controlBarBorder: \"#162b47\",\n controlHover: \"rgba(255, 255, 255, 0.14)\",\n progressBar: \"#f4a261\",\n closeBackground: \"#1f3a5f\",\n closeBackgroundHover: \"#335c8a\",\n closeText: \"#fff8ee\",\n titleCard: \"#c7522a\",\n titleCardText: \"#fff8ee\",\n infoBlock: \"#22313f\",\n infoBlockText: \"#f8efe1\",\n viewerBackground: \"#30414d\",\n },\n exhibition: {\n ...DEFAULT_EXHIBITION_OPTIONS,\n cutCorners: false,\n fullTitleBar: true,\n fullWidthGrid: true,\n alternativeImageMode: false,\n transitionScale: true,\n imageInfoIcon: true,\n coverImages: true,\n },\n presentation: {\n ...DEFAULT_PRESENTATION_OPTIONS,\n isFloating: true,\n floatingPosition: \"bottom-right\",\n },\n slideshow: {\n ...DEFAULT_SLIDESHOW_OPTIONS,\n alternativeImageMode: false,\n transitionScale: true,\n imageInfoIcon: true,\n coverImages: true,\n },\n },\n scroll: {\n tokens: {\n ...DEFAULT_SCROLL_TOKENS,\n titleBackground: \"#f8efe1\",\n titleColor: \"#2a2119\",\n annotationBackground: \"#22313f\",\n annotationColor: \"#f8efe1\",\n annotationRadius: \"18px\",\n annotationMaxWidth: \"34em\",\n infoBlockBackground: \"#fff8ee\",\n infoBlockColor: \"#2a2119\",\n },\n options: {\n ...DEFAULT_SCROLL_OPTIONS,\n showTableOfContents: true,\n tableOfContentsPlacement: \"header\",\n titleBlock: {\n fullHeight: false,\n },\n },\n },\n};\n\nconst PRESET_THEMES: Record<ExhibitionThemePreset, ExhibitionThemeConfig> = {\n delft: DEFAULT_DELFT_THEME,\n minimal: MINIMAL_THEME,\n gallery: GALLERY_THEME,\n};\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction mergeDeep<T>(base: T, overrides?: DeepPartial<T>): T {\n if (!overrides) {\n return clone(base);\n }\n\n const result = clone(base) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(overrides)) {\n if (typeof value === \"undefined\") {\n continue;\n }\n\n const current = result[key];\n if (isPlainObject(current) && isPlainObject(value)) {\n result[key] = mergeDeep(current, value as DeepPartial<typeof current>);\n continue;\n }\n\n result[key] = value as unknown;\n }\n\n return result as T;\n}\n\nfunction isThemePreset(value: unknown): value is ExhibitionThemePreset {\n return typeof value === \"string\" && value in PRESET_THEMES;\n}\n\nexport function getThemePreset(\n preset: ExhibitionThemePreset = \"delft\",\n): ExhibitionThemeConfig {\n return clone(PRESET_THEMES[preset] || DEFAULT_DELFT_THEME);\n}\n\nexport function resolveThemeConfig(\n theme?: DeepPartial<ExhibitionThemeConfig> | null,\n): ExhibitionThemeConfig {\n const preset = isThemePreset(theme?.preset) ? theme.preset : \"delft\";\n const base = getThemePreset(preset);\n const merged = mergeDeep(base, theme || {});\n merged.version = 1;\n merged.preset = preset;\n return merged;\n}\n\nexport function getThemeServiceId(manifestId: string) {\n return `${manifestId}#exhibition-viewer-theme`;\n}\n\nexport function createThemeService(\n manifestId: string,\n theme?: DeepPartial<ExhibitionThemeConfig>,\n) {\n return {\n id: getThemeServiceId(manifestId),\n type: \"Service\",\n profile: EXHIBITION_THEME_SERVICE_PROFILE,\n label: EXHIBITION_THEME_SERVICE_LABEL,\n theme: resolveThemeConfig(theme),\n };\n}\n\nexport function getThemeServiceDetails(services?: Array<any>) {\n if (!services?.length) {\n return null;\n }\n\n const index = services.findIndex((service) => {\n return (\n service?.profile === EXHIBITION_THEME_SERVICE_PROFILE || service?.theme\n );\n });\n\n if (index === -1) {\n return null;\n }\n\n return {\n index,\n service: services[index],\n };\n}\n\nexport function getThemeConfigFromServices(services?: Array<any>) {\n return getThemeServiceDetails(services)?.service?.theme as\n | DeepPartial<ExhibitionThemeConfig>\n | undefined;\n}\n\nexport function replaceThemeService(\n services: Array<any> | undefined,\n nextThemeService: ReturnType<typeof createThemeService> | null,\n) {\n const nextServices = [...(services || [])];\n const existing = getThemeServiceDetails(nextServices);\n\n if (existing) {\n if (nextThemeService) {\n nextServices[existing.index] = nextThemeService;\n return nextServices;\n }\n\n nextServices.splice(existing.index, 1);\n return nextServices;\n }\n\n if (nextThemeService) {\n nextServices.push(nextThemeService);\n }\n\n return nextServices;\n}\n\nexport function getThemeCssVariables(theme: ExhibitionThemeConfig) {\n return {\n \"--f-font\": theme.shared.fontSans,\n \"--f-mono-font\": theme.shared.fontMono,\n \"--delft-title-transform\": theme.shared.titleTransform,\n \"--delft-bg-primary\": theme.delft.tokens.backgroundPrimary,\n \"--delft-bg-secondary\": theme.delft.tokens.backgroundSecondary,\n \"--delft-bg-overlay\": theme.delft.tokens.backgroundOverlay,\n \"--delft-text-primary\": theme.delft.tokens.textPrimary,\n \"--delft-text-secondary\": theme.delft.tokens.textSecondary,\n \"--delft-image-caption\": theme.delft.tokens.imageCaption,\n \"--delft-annotation-selected\": theme.delft.tokens.annotationSelected,\n \"--delft-control-bar\": theme.delft.tokens.controlBar,\n \"--delft-control-bar-border\": theme.delft.tokens.controlBarBorder,\n \"--delft-control-hover\": theme.delft.tokens.controlHover,\n \"--delft-progress-bar\": theme.delft.tokens.progressBar,\n \"--delft-close-background\": theme.delft.tokens.closeBackground,\n \"--delft-close-background-hover\": theme.delft.tokens.closeBackgroundHover,\n \"--delft-close-text\": theme.delft.tokens.closeText,\n \"--delft-title-card\": theme.delft.tokens.titleCard,\n \"--delft-title-card-text\": theme.delft.tokens.titleCardText,\n \"--delft-info-block\": theme.delft.tokens.infoBlock,\n \"--delft-info-block-text\": theme.delft.tokens.infoBlockText,\n \"--delft-viewer-background\": theme.delft.tokens.viewerBackground,\n \"--exv-scroll-title-background\": theme.scroll.tokens.titleBackground,\n \"--exv-scroll-title-color\": theme.scroll.tokens.titleColor,\n \"--exv-scroll-annotation-background\":\n theme.scroll.tokens.annotationBackground,\n \"--exv-scroll-annotation-color\": theme.scroll.tokens.annotationColor,\n \"--exv-scroll-annotation-radius\": theme.scroll.tokens.annotationRadius,\n \"--exv-scroll-annotation-max-width\": theme.scroll.tokens.annotationMaxWidth,\n \"--exv-scroll-info-block-background\":\n theme.scroll.tokens.infoBlockBackground,\n \"--exv-scroll-info-block-color\": theme.scroll.tokens.infoBlockColor,\n };\n}\n","import { EditTextIcon } from \"@manifest-editor/components\";\nimport { CanvasPanelEditor, CanvasPanelViewer } from \"@manifest-editor/editors\";\nimport {\n EditingStackContext,\n InlineEditingStack,\n type LayoutPanel,\n useLayoutActions,\n usePanelActions,\n} from \"@manifest-editor/shell\";\nimport { DelftExhibition } from \"exhibition-viewer\";\nimport { type EditorHooks, EditorHooksProvider } from \"exhibition-viewer/library\";\nimport {\n type CSSProperties,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Button } from \"react-aria-components\";\nimport { CanvasContext, useManifest, useVault } from \"react-iiif-vault\";\nimport {\n getThemeConfigFromServices,\n getThemeCssVariables,\n resolveThemeConfig,\n} from \"../theme/theme-service\";\n\nexport const exhibitionCenterPanel: LayoutPanel = {\n id: \"@exhibitions/center-panel\", // We are overriding the default canvas listing panel\n label: \"Exhibition editor\",\n icon: null,\n render: () => <ExhibitionCenterPanel />,\n options: {\n minWidth: 350,\n maxWidth: 350,\n },\n};\n\nfunction ExhibitionCenterPanel() {\n const manifest = useManifest();\n const vault = useVault();\n const [scale, setScale] = useState(0.8);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const { edit, leftPanel } = useLayoutActions();\n const resolvedTheme = useMemo(() => {\n if (!manifest) {\n return null;\n }\n\n return resolveThemeConfig(\n getThemeConfigFromServices(\n (manifest as any).service || (manifest as any).services,\n ),\n );\n }, [manifest]);\n\n const hooks = useMemo(() => {\n return {\n localeStringEditor: (props) => {\n return (\n <span className=\"inline-flex items-center hover:ring-4 hover:ring-me-primary-500\">\n {props.original}\n <Button className=\"py-1 px-2 inline-block\" onPress={() => edit(props.resource)}>\n <EditTextIcon className=\"text-xl\" />\n </Button>\n </span>\n );\n },\n canvasPreviewEditor: (props) => {\n return (\n <div className=\"w-full h-full flex-1 flex relative\">\n {props.original}\n <button\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n edit((props as any).resource);\n leftPanel.open({ id: \"canvas-listing\" });\n }}\n className=\"absolute top-5 right-5 bg-white text-black p-2 rounded z-40\"\n >\n EDIT\n </button>\n </div>\n );\n },\n } satisfies EditorHooks;\n }, []);\n\n useEffect(() => {\n for (const canvasRef of manifest?.items || []) {\n const canvas = vault.get(canvasRef as any) as any;\n if (canvas && !Array.isArray(canvas.items)) {\n vault.modifyEntityField(canvas, \"items\", []);\n }\n\n for (const pageRef of [\n ...(canvas?.items || []),\n ...(canvas?.annotations || []),\n ]) {\n const page = vault.get(pageRef as any) as any;\n if (page && !Array.isArray(page.items)) {\n vault.modifyEntityField(page, \"items\", []);\n }\n }\n }\n }, [manifest, vault]);\n\n useLayoutEffect(() => {\n if (wrapperRef.current) {\n const wrapperWidth = wrapperRef.current.offsetWidth;\n const initialScale = wrapperWidth / 1200;\n setScale(Math.max(1, initialScale));\n }\n }, []);\n\n if (!manifest) return null;\n\n return (\n <div\n ref={wrapperRef}\n className=\"overflow-y-auto delft-exhibition exhibition-viewer\"\n style={\n resolvedTheme\n ? (getThemeCssVariables(resolvedTheme) as CSSProperties)\n : undefined\n }\n >\n <EditorHooksProvider hooks={hooks}>\n <DelftExhibition\n key={scale}\n skipLoadManifest\n customVault={vault}\n manifest={manifest.id}\n options={{\n ...(resolvedTheme?.delft.exhibition || {}),\n disablePresentation: true,\n hideTableOfContents: true,\n hideTitle: true,\n }}\n />\n </EditorHooksProvider>\n </div>\n );\n}\n","import type { DelftExhibitionProps, DelftPresentationProps } from \"exhibition-viewer/library\";\n\nexport type PresetUrlSearchParamsPreset = \"delft\" | \"exhibition\" | \"minimal\" | \"presentation\" | \"scroll\" | \"slideshow\";\ntype TableOfContentsPlacement = \"header\" | \"footer\";\ntype FloatingPosition = \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport type PresetUrlSearchParamsByPreset = {\n delft: DelftPresetUrlSearchParamsOptions;\n exhibition: DelftPresetUrlSearchParamsOptions;\n minimal: MinimalPresetUrlSearchParamsOptions;\n presentation: PresentationPresetUrlSearchParamsOptions;\n scroll: ScrollPresetUrlSearchParamsOptions;\n slideshow: SlideshowPresetUrlSearchParamsOptions;\n};\n\nexport type PresetUrlSearchParamsOptions<T extends PresetUrlSearchParamsPreset = PresetUrlSearchParamsPreset> =\n PresetUrlSearchParamsByPreset[T];\n\ntype SharedPresetUrlSearchParamsOptions = {\n manifest: string;\n canvas?: string;\n};\n\nexport type DelftPresetUrlSearchParamsOptions = SharedPresetUrlSearchParamsOptions &\n Pick<NonNullable<DelftExhibitionProps[\"options\"]>, \"cutCorners\" | \"fullTitleBar\"> & {\n hideTableOfContents?: boolean;\n ignoreCanvasBackgrounds?: boolean;\n showNavigationControls?: boolean;\n showProgressBar?: boolean;\n tableOfContentsPlacement?: TableOfContentsPlacement;\n };\n\nexport type MinimalPresetUrlSearchParamsOptions = DelftPresetUrlSearchParamsOptions;\n\nexport type PresentationPresetUrlSearchParamsOptions = SharedPresetUrlSearchParamsOptions &\n Pick<NonNullable<DelftPresentationProps[\"options\"]>, \"cutCorners\" | \"isFloating\"> & {\n floating?: NonNullable<DelftPresentationProps[\"options\"]>[\"isFloating\"];\n floatingPosition?: FloatingPosition;\n ignoreCanvasBackgrounds?: boolean;\n labelOnlyFloating?: boolean;\n };\n\nexport type SlideshowPresetUrlSearchParamsOptions = SharedPresetUrlSearchParamsOptions & {\n minimal?: boolean;\n floating?: NonNullable<DelftPresentationProps[\"options\"]>[\"isFloating\"];\n floatingPosition?: FloatingPosition;\n ignoreCanvasBackgrounds?: boolean;\n labelOnlyFloating?: boolean;\n};\n\nexport type ScrollPresetUrlSearchParamsOptions = SharedPresetUrlSearchParamsOptions & {\n minimal?: boolean;\n manifestEditorPreview?: boolean;\n manifestEditorPreviewOrigin?: string;\n ignoreCanvasBackgrounds?: boolean;\n tableOfContentsPlacement?: TableOfContentsPlacement;\n};\n\nexport function createPresetUrlSearchParams<T extends PresetUrlSearchParamsPreset>(\n preset: T,\n options: PresetUrlSearchParamsOptions<T>,\n): URLSearchParams;\nexport function createPresetUrlSearchParams(\n preset: PresetUrlSearchParamsPreset,\n options: PresetUrlSearchParamsOptions,\n): URLSearchParams {\n const params = new URLSearchParams();\n\n setString(params, \"manifest\", options.manifest);\n setString(params, \"canvas\", options.canvas);\n\n switch (preset) {\n case \"delft\":\n case \"exhibition\": {\n const presetOptions = options as DelftPresetUrlSearchParamsOptions;\n setBoolean(params, \"cut-corners\", presetOptions.cutCorners);\n setBoolean(params, \"full-title-bar\", presetOptions.fullTitleBar);\n setBoolean(params, \"hide-toc\", presetOptions.hideTableOfContents);\n setBoolean(params, \"show-navigation-controls\", presetOptions.showNavigationControls);\n setBoolean(params, \"show-progress-bar\", presetOptions.showProgressBar);\n setString(params, \"toc-placement\", presetOptions.tableOfContentsPlacement);\n setBoolean(params, \"ignore-canvas-backgrounds\", presetOptions.ignoreCanvasBackgrounds);\n break;\n }\n\n case \"minimal\": {\n const presetOptions = options as MinimalPresetUrlSearchParamsOptions;\n params.set(\"minimal\", \"true\");\n setBoolean(params, \"cut-corners\", presetOptions.cutCorners);\n setBoolean(params, \"full-title-bar\", presetOptions.fullTitleBar);\n setString(params, \"toc-placement\", presetOptions.tableOfContentsPlacement);\n setBoolean(params, \"ignore-canvas-backgrounds\", presetOptions.ignoreCanvasBackgrounds);\n break;\n }\n\n case \"presentation\": {\n const presetOptions = options as PresentationPresetUrlSearchParamsOptions;\n params.set(\"type\", \"presentation\");\n setBoolean(params, \"cut-corners\", presetOptions.cutCorners);\n setBoolean(params, \"floating\", presetOptions.floating ?? presetOptions.isFloating);\n setString(params, \"floating-position\", presetOptions.floatingPosition);\n setBoolean(params, \"label-only-floating\", presetOptions.labelOnlyFloating);\n setBoolean(params, \"ignore-canvas-backgrounds\", presetOptions.ignoreCanvasBackgrounds);\n break;\n }\n\n case \"scroll\": {\n const presetOptions = options as ScrollPresetUrlSearchParamsOptions;\n params.set(\"type\", \"scroll\");\n setFlag(params, \"minimal\", presetOptions.minimal);\n setString(params, \"toc-placement\", presetOptions.tableOfContentsPlacement);\n setBoolean(params, \"ignore-canvas-backgrounds\", presetOptions.ignoreCanvasBackgrounds);\n setFlag(params, \"manifest-editor-preview\", presetOptions.manifestEditorPreview);\n setString(params, \"manifest-editor-preview-origin\", presetOptions.manifestEditorPreviewOrigin);\n break;\n }\n\n case \"slideshow\": {\n const presetOptions = options as SlideshowPresetUrlSearchParamsOptions;\n params.set(\"type\", \"slideshow\");\n setFlag(params, \"minimal\", presetOptions.minimal);\n setBoolean(params, \"floating\", presetOptions.floating);\n setString(params, \"floating-position\", presetOptions.floatingPosition);\n setBoolean(params, \"label-only-floating\", presetOptions.labelOnlyFloating);\n setBoolean(params, \"ignore-canvas-backgrounds\", presetOptions.ignoreCanvasBackgrounds);\n break;\n }\n }\n\n return params;\n}\n\nexport function createScrollingPreviewUrl<T extends PresetUrlSearchParamsPreset>(\n preset: T,\n options?: Partial<PresetUrlSearchParamsOptions<T>>,\n previewUrl?: string,\n): URL;\nexport function createScrollingPreviewUrl(\n preset: PresetUrlSearchParamsPreset,\n options?: Partial<PresetUrlSearchParamsOptions>,\n previewUrl?: string,\n): URL {\n const searchParams = createPresetUrlSearchParams(preset, (options || {}) as any);\n const url = new URL(previewUrl || `https://preview.exhibitionviewer.org/preview/${preset}`);\n\n if (!previewUrl && (window.location.hostname === \"localhost\" || window.location.hostname === \"127.0.0.1\") && window.location.port === \"3000\") {\n url.protocol = \"http:\";\n url.host = \"localhost:5174\";\n }\n\n searchParams.forEach((value, key) => { url.searchParams.set(key, value) });\n\n url.searchParams.set(\"manifest-editor-preview\", \"true\");\n url.searchParams.set(\"manifest-editor-preview-origin\", window.location.origin);\n\n return url;\n}\n\nfunction setString(params: URLSearchParams, key: string, value: string | undefined) {\n if (value) {\n params.set(key, value);\n }\n}\n\nfunction setBoolean(params: URLSearchParams, key: string, value: boolean | undefined) {\n if (typeof value === \"boolean\") {\n params.set(key, String(value));\n }\n}\n\nfunction setFlag(params: URLSearchParams, key: string, value: boolean | undefined) {\n if (value) {\n params.set(key, \"true\");\n }\n}\n","import { type PresetTemplateDefinition, useApp, usePresetTemplateSelection } from \"@manifest-editor/shell\";\nimport { useManifest } from \"react-iiif-vault\";\n\nfunction getFallbackTemplateType(appId?: string) {\n if (appId === \"exhibition-slideshow-editor\") return \"slideshow\";\n if (appId === \"exhibition-scrolling-editor\") return \"scroll\";\n return \"fullpage\";\n}\n\nexport function getExhibitionTemplate(templates: PresetTemplateDefinition[], behavior: string[] = []) {\n const templateId = behavior.find((item) => item.startsWith(\"template-\"))?.slice(\"template-\".length);\n return (\n templates.find((template) => template.id === templateId) ||\n templates.find((template) => behavior.includes(template.type)) ||\n null\n );\n}\n\nexport function getExhibitionTemplatePreviews(\n templates: PresetTemplateDefinition[],\n selected: PresetTemplateDefinition | null,\n current: PresetTemplateDefinition | null,\n) {\n if (!selected) return templates;\n return templates.filter((template) => template.type === selected.type || template.id === current?.id);\n}\n\nexport function useExhibitionTemplate() {\n const app = useApp();\n const templates = app.preset?.templates || [];\n const manifest = useManifest();\n const { selectedTemplate } = usePresetTemplateSelection();\n return (\n getExhibitionTemplate(templates, manifest?.behavior as string[]) ||\n selectedTemplate ||\n templates.find((template) => template.type === getFallbackTemplateType(app.metadata.id)) ||\n null\n );\n}\n","import { create } from \"zustand\";\n\nexport interface SlideContentBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface SlideContentLayer {\n annotation: any;\n box: SlideContentBox;\n html: string | null;\n imageUrl: string | null;\n videoUrl: string | null;\n youtubeId: string | null;\n}\n\ninterface SlideshowContentPositioningState {\n selectedAnnotationId: string | null;\n repositioningAnnotationId: string | null;\n selectedTextRegion: string | null;\n repositioningTextRegion: string | null;\n selectedTourStepId: string | null;\n repositioningTourStepId: string | null;\n selectAnnotation: (id: string | null) => void;\n startRepositioning: (id: string) => void;\n stopRepositioning: () => void;\n selectTextRegion: (id: string | null) => void;\n startTextRepositioning: (id: string) => void;\n stopTextRepositioning: () => void;\n selectTourStep: (id: string | null) => void;\n startTourStepRepositioning: (id: string) => void;\n stopTourStepRepositioning: () => void;\n clear: () => void;\n}\n\nexport const useSlideshowContentPositioning =\n create<SlideshowContentPositioningState>((set) => ({\n selectedAnnotationId: null,\n repositioningAnnotationId: null,\n selectedTextRegion: null,\n repositioningTextRegion: null,\n selectedTourStepId: null,\n repositioningTourStepId: null,\n selectAnnotation: (id) =>\n set({\n selectedAnnotationId: id,\n repositioningAnnotationId: null,\n selectedTextRegion: null,\n repositioningTextRegion: null,\n }),\n startRepositioning: (id) =>\n set({\n selectedAnnotationId: id,\n repositioningAnnotationId: id,\n selectedTextRegion: null,\n repositioningTextRegion: null,\n }),\n stopRepositioning: () => set({ repositioningAnnotationId: null }),\n selectTextRegion: (id) =>\n set({\n selectedAnnotationId: null,\n repositioningAnnotationId: null,\n selectedTextRegion: id,\n repositioningTextRegion: null,\n }),\n startTextRepositioning: (id) =>\n set({\n selectedAnnotationId: null,\n repositioningAnnotationId: null,\n selectedTextRegion: id,\n repositioningTextRegion: id,\n }),\n stopTextRepositioning: () => set({ repositioningTextRegion: null }),\n selectTourStep: (id) =>\n set({ selectedTourStepId: id, repositioningTourStepId: null }),\n startTourStepRepositioning: (id) =>\n set({ selectedTourStepId: id, repositioningTourStepId: id }),\n stopTourStepRepositioning: () => set({ repositioningTourStepId: null }),\n clear: () =>\n set({\n selectedAnnotationId: null,\n repositioningAnnotationId: null,\n selectedTextRegion: null,\n repositioningTextRegion: null,\n selectedTourStepId: null,\n repositioningTourStepId: null,\n }),\n }));\n\ninterface SlideshowWorkbenchState {\n requestedTab: string | null;\n showTourSteps: boolean;\n centerPanelMode: \"edit\" | \"preview\";\n requestTab: (tab: string) => void;\n clearRequestedTab: () => void;\n setShowTourSteps: (show: boolean) => void;\n setCenterPanelMode: (mode: \"edit\" | \"preview\") => void;\n}\n\nexport const useSlideshowWorkbenchState = create<SlideshowWorkbenchState>(\n (set) => ({\n requestedTab: null,\n showTourSteps: false,\n centerPanelMode: \"preview\",\n requestTab: (tab) => set({ requestedTab: tab }),\n clearRequestedTab: () => set({ requestedTab: null }),\n setShowTourSteps: (show) => set({ showTourSteps: show }),\n setCenterPanelMode: (mode) => set({ centerPanelMode: mode }),\n }),\n);\n\nexport function createDefaultSlideContentBox(canvas: any): SlideContentBox {\n const width = Number(canvas?.width) || 1920;\n const height = Number(canvas?.height) || 1080;\n const layout = getSlideLayoutRegions(canvas);\n\n if (layout.content) {\n return layout.content;\n }\n\n return {\n x: Math.round(width * 0.1),\n y: Math.round(height * 0.1),\n width: Math.round(width * 0.8),\n height: Math.round(height * 0.8),\n };\n}\n\nexport function createSlideContentTarget(canvas: any, box: SlideContentBox) {\n return {\n type: \"SpecificResource\",\n source: { id: canvas.id, type: \"Canvas\" },\n selector: {\n type: \"FragmentSelector\",\n value: `xywh=${Math.round(box.x)},${Math.round(box.y)},${Math.round(\n box.width,\n )},${Math.round(box.height)}`,\n },\n };\n}\n\nexport function createDefaultSlideContentTarget(canvas: any) {\n return createSlideContentTarget(canvas, createDefaultSlideContentBox(canvas));\n}\n\nexport function getPaintingAnnotations(vault: any, canvas: any) {\n return getPageAnnotations(vault, canvas?.items || []).filter(\n (annotation: any) =>\n (Array.isArray(annotation?.motivation)\n ? annotation.motivation\n : [annotation?.motivation]\n ).includes(\"painting\"),\n );\n}\n\nexport function getTourStepAnnotations(vault: any, canvas: any) {\n return getPageAnnotations(vault, canvas?.annotations || []);\n}\n\nexport function supportsTourSteps(vault: any, canvas: any): boolean {\n if (!canvas) return false;\n\n const behavior = Array.isArray(canvas?.behavior) ? canvas.behavior : [];\n if (behavior.includes(\"info\")) return false;\n\n return !getPaintingAnnotations(vault, canvas).some((annotation: any) => {\n const body = getResolvedAnnotationBody(vault, annotation);\n return Boolean(getVideoUrl(body) || getYouTubeId(body));\n });\n}\n\nfunction getPageAnnotations(vault: any, pageRefs: any[]) {\n const annotations = [];\n\n for (const pageRef of pageRefs) {\n const page = vault.get(\n pageRef as any,\n {\n skipSelfReturn: false,\n } as any,\n ) as any;\n\n for (const annotationRef of page?.items || []) {\n const annotation = vault.get(\n annotationRef as any,\n {\n skipSelfReturn: false,\n } as any,\n ) as any;\n\n if (annotation) {\n annotations.push(annotation);\n }\n }\n }\n\n return annotations;\n}\n\nexport function getSlideContentLayers(\n vault: any,\n canvas: any,\n): SlideContentLayer[] {\n return getPaintingAnnotations(vault, canvas).map((annotation: any) => {\n const body = getResolvedAnnotationBody(vault, annotation);\n\n return {\n annotation,\n box: getAnnotationTargetBox(annotation, canvas),\n html: getHtmlValue(body),\n imageUrl: getImageUrl(vault, body),\n videoUrl: getVideoUrl(body),\n youtubeId: getYouTubeId(body),\n };\n });\n}\n\nexport function getAnnotationTargetBox(\n annotation: any,\n canvas: any,\n): SlideContentBox {\n const width = Number(canvas?.width) || 1920;\n const height = Number(canvas?.height) || 1080;\n const target = annotation?.target;\n\n if (typeof target === \"string\" && target.includes(\"#xywh=\")) {\n const parsed = parseXywh(target.split(\"#xywh=\")[1]);\n if (parsed) return parsed;\n }\n\n const selector = target?.selector;\n const spatialSelector = Array.isArray(selector)\n ? selector.find((item: any) => item?.spatial || item?.points)\n : selector;\n\n if (spatialSelector?.spatial) {\n return spatialSelector.spatial;\n }\n\n if (Array.isArray(spatialSelector?.points)) {\n const points = spatialSelector.points.filter(\n (point: any) => Array.isArray(point) && Number.isFinite(point[0]) && Number.isFinite(point[1]),\n );\n\n if (points.length) {\n const xs = points.map((point: any) => point[0]);\n const ys = points.map((point: any) => point[1]);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n\n return {\n x: minX,\n y: minY,\n width: Math.max(1, Math.max(...xs) - minX),\n height: Math.max(1, Math.max(...ys) - minY),\n };\n }\n }\n\n const value = Array.isArray(selector)\n ? selector.find((item: any) => item?.value?.startsWith?.(\"xywh=\"))?.value\n : selector?.value;\n\n if (typeof value === \"string\" && value.includes(\"xywh=\")) {\n const parsed = parseXywh(value.split(\"xywh=\")[1]);\n if (parsed) return parsed;\n }\n\n return { x: 0, y: 0, width, height };\n}\n\nexport function setAnnotationTargetBox(\n vault: any,\n canvas: any,\n annotationId: string,\n box: SlideContentBox,\n) {\n vault.modifyEntityField(\n { id: annotationId, type: \"Annotation\" },\n \"target\",\n createSlideContentTarget(canvas, constrainSlideContentBox(canvas, box)),\n );\n}\n\nexport function setSlideTextRegionBox(\n vault: any,\n canvas: any,\n box: SlideContentBox,\n) {\n const nextBox = constrainSlideContentBox(canvas, box);\n const behavior = Array.isArray(canvas?.behavior) ? canvas.behavior : [];\n\n vault.modifyEntityField(\n canvas,\n \"behavior\",\n behavior\n .filter((item: string) => !item.startsWith(\"text-xywh=\"))\n .concat(\n `text-xywh=${Math.round(nextBox.x)},${Math.round(\n nextBox.y,\n )},${Math.round(nextBox.width)},${Math.round(nextBox.height)}`,\n ),\n );\n}\n\nexport function getSlideLayoutRegions(canvas: any): {\n content: SlideContentBox | null;\n text: SlideContentBox | null;\n} {\n const width = Number(canvas?.width) || 1920;\n const height = Number(canvas?.height) || 1080;\n const behavior = Array.isArray(canvas?.behavior) ? canvas.behavior : [];\n const customTextRegion = getCustomTextRegion(behavior);\n\n if (behavior.includes(\"right\")) {\n return {\n content: { x: 0, y: 0, width: Math.round((width * 2) / 3), height },\n text: customTextRegion || {\n x: Math.round((width * 2) / 3),\n y: 0,\n width: Math.round(width / 3),\n height,\n },\n };\n }\n\n if (behavior.includes(\"left\")) {\n return {\n content: {\n x: Math.round(width / 3),\n y: 0,\n width: Math.round((width * 2) / 3),\n height,\n },\n text: customTextRegion || {\n x: 0,\n y: 0,\n width: Math.round(width / 3),\n height,\n },\n };\n }\n\n if (behavior.includes(\"bottom\")) {\n return {\n content: { x: 0, y: 0, width, height: Math.round((height * 2) / 3) },\n text: customTextRegion || {\n x: 0,\n y: Math.round((height * 2) / 3),\n width,\n height: Math.round(height / 3),\n },\n };\n }\n\n if (behavior.includes(\"top\")) {\n return {\n content: {\n x: 0,\n y: Math.round(height / 3),\n width,\n height: Math.round((height * 2) / 3),\n },\n text: customTextRegion || {\n x: 0,\n y: 0,\n width,\n height: Math.round(height / 3),\n },\n };\n }\n\n if (behavior.includes(\"info\")) {\n return {\n content: null,\n text: customTextRegion || { x: 0, y: 0, width, height },\n };\n }\n\n if (behavior.includes(\"image\")) {\n return {\n content: { x: 0, y: 0, width, height },\n text: customTextRegion,\n };\n }\n\n return { content: null, text: customTextRegion };\n}\n\nexport function constrainSlideContentBox(\n canvas: any,\n input: SlideContentBox,\n): SlideContentBox {\n const canvasWidth = Number(canvas?.width) || 1920;\n const canvasHeight = Number(canvas?.height) || 1080;\n const width = Math.max(1, Math.min(input.width, canvasWidth));\n const height = Math.max(1, Math.min(input.height, canvasHeight));\n const x = Math.max(0, Math.min(input.x, canvasWidth - width));\n const y = Math.max(0, Math.min(input.y, canvasHeight - height));\n\n return {\n x: Math.round(x),\n y: Math.round(y),\n width: Math.round(width),\n height: Math.round(height),\n };\n}\n\nexport function getResolvedAnnotationBody(vault: any, annotation: any) {\n const body = Array.isArray(annotation?.body)\n ? annotation.body[0]\n : annotation?.body;\n const resolved = body\n ? vault.get(body as any, { skipSelfReturn: false } as any)\n : null;\n\n return resolved?.type === \"SpecificResource\"\n ? resolved.source\n : resolved || body || null;\n}\n\nfunction parseXywh(value?: string): SlideContentBox | null {\n const values = value ? value.split(/[,&]/).slice(0, 4).map(Number) : [];\n\n if (values.length === 4 && values.every((item) => Number.isFinite(item))) {\n const [x, y, width, height] = values as [number, number, number, number];\n return { x, y, width, height };\n }\n\n return null;\n}\n\nfunction getCustomTextRegion(behavior: string[]): SlideContentBox | null {\n const value = behavior\n .find((item) => item.startsWith(\"text-xywh=\"))\n ?.replace(\"text-xywh=\", \"\");\n\n return parseXywh(value);\n}\n\nfunction getImageUrl(vault: any, body: any): string | null {\n const source = getDisplayResource(vault, body);\n\n if (source?.type === \"Choice\") {\n const items = Array.isArray(source.items) ? source.items : [];\n for (const item of items) {\n const url = getImageUrl(vault, item);\n if (url) return url;\n }\n }\n\n if (source?.type === \"Canvas\") {\n const canvas =\n vault.get(\n { id: source.id, type: \"Canvas\" },\n { skipSelfReturn: false } as any,\n ) || source;\n const thumbnail = Array.isArray(canvas.thumbnail)\n ? canvas.thumbnail[0]\n : canvas.thumbnail;\n\n if (thumbnail?.id) {\n return thumbnail.id;\n }\n\n for (const annotation of getPaintingAnnotations(vault, canvas)) {\n const url = getImageUrl(\n vault,\n getResolvedAnnotationBody(vault, annotation),\n );\n if (url) return url;\n }\n }\n\n const service = Array.isArray(source?.service)\n ? source.service[0]\n : source?.service;\n const serviceId = service?.id || service?.[\"@id\"];\n\n if (serviceId) {\n return `${serviceId.replace(/\\/$/, \"\")}/full/1000,/0/default.jpg`;\n }\n\n if (source?.type === \"Image\" && source.id) {\n return source.id;\n }\n\n return null;\n}\n\nfunction getHtmlValue(body: any) {\n const source = body?.type === \"SpecificResource\" ? body.source : body;\n\n if (\n source?.type === \"Text\" ||\n source?.type === \"TextualBody\" ||\n source?.format === \"text/html\" ||\n source?.format === \"text/plain\"\n ) {\n return source.value || \"\";\n }\n\n return null;\n}\n\nfunction getDisplayResource(vault: any, resource: any): any {\n if (resource?.type === \"SpecificResource\") {\n return getDisplayResource(vault, resource.source);\n }\n\n if (resource?.id && resource?.type === \"ContentResource\") {\n return (\n vault.get(\n { id: resource.id, type: \"ContentResource\" },\n { skipSelfReturn: false } as any,\n ) || resource\n );\n }\n\n if (\n resource?.id &&\n !resource.items &&\n !resource.value &&\n !resource.service &&\n !resource.format &&\n !resource.width &&\n !resource.height\n ) {\n return (\n vault.get(resource as any, { skipSelfReturn: false } as any) || resource\n );\n }\n\n return resource;\n}\n\nfunction getVideoUrl(body: any) {\n const source = body?.type === \"SpecificResource\" ? body.source : body;\n return source?.type === \"Video\" && !getYouTubeId(source) ? source.id : null;\n}\n\nfunction getYouTubeId(body: any) {\n const source = body?.type === \"SpecificResource\" ? body.source : body;\n const youtubeService = (source?.service || []).find(\n (service: any) => service?.profile === \"https://www.youtube.com\",\n );\n const id = youtubeService?.id || source?.id || \"\";\n const match = id.match(\n /^.*(?:(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/)|(?:(?:watch)?\\?vi?=|&vi?=))([^#&?]*).*/,\n );\n\n return match ? match[1] : null;\n}\n","import { getPaintingAnnotations } from \"../slideshow-content-positioning\";\n\nexport function getPreviewStructureKey(\n rootResource: { id: string; type: string },\n items: Array<{ id: string; type?: string }> | undefined,\n) {\n return JSON.stringify([\n rootResource.id,\n rootResource.type,\n ...(items || []).map((item) => [item.id, item.type]),\n ]);\n}\n\nexport function getPreviewImageTransformKey(\n vault: any,\n items: Array<{ id: string; type?: string }> | undefined,\n) {\n const transforms = [];\n\n for (const canvasRef of items || []) {\n const canvas = vault.get(canvasRef, { skipSelfReturn: false } as any);\n\n for (const annotation of getPaintingAnnotations(vault, canvas)) {\n const bodies = Array.isArray(annotation.body)\n ? annotation.body\n : annotation.body\n ? [annotation.body]\n : [];\n\n for (const bodyRef of bodies) {\n const body = bodyRef?.id\n ? vault.get(bodyRef, {\n preserveSpecificResources: true,\n skipSelfReturn: false,\n } as any) || bodyRef\n : bodyRef;\n const selectors = Array.isArray(body?.selector)\n ? body.selector\n : body?.selector\n ? [body.selector]\n : [];\n\n for (const selector of selectors) {\n if (\n selector?.type === \"ImageApiSelector\" ||\n selector?.type === \"iiif:ImageApiSelector\"\n ) {\n transforms.push([\n annotation.id,\n selector.region ?? null,\n selector.rotation ?? null,\n ]);\n }\n }\n }\n }\n }\n\n return JSON.stringify(transforms);\n}\n","import { useInStack } from \"@manifest-editor/editors\";\nimport { createIframeVaultBridge, useAppResource, usePreviewWindow } from \"@manifest-editor/shell\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useManifest, useVault, useVaultSelector } from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n createScrollingPreviewUrl,\n type PresetUrlSearchParamsOptions,\n type PresetUrlSearchParamsPreset,\n} from \"../helpers/exhibition-preview-url-helper\";\nimport { useExhibitionTemplate } from \"../helpers/exhibition-template\";\nimport { useSlideshowContentPositioning } from \"../slideshow-content-positioning\";\nimport { getPreviewImageTransformKey, getPreviewStructureKey } from \"./preview-structure\";\n\nexport interface ExhibitionPreviewPanelProps {\n preset: PresetUrlSearchParamsPreset;\n presetOptions?: Partial<PresetUrlSearchParamsOptions>;\n focusSelectedCanvas?: boolean;\n}\n\nconst PREVIEW_CONNECT = \"manifest-editor:iframe-preview:connect\";\nconst PREVIEW_READY = \"manifest-editor:iframe-preview:ready\";\nconst PREVIEW_SELECTION = \"manifest-editor:iframe-preview:selection\";\nconst MOBILE_VIEWPORT_WIDTH = 1024;\nconst MOBILE_PREVIEW_WIDTH = 440;\nconst SCALED_PREVIEW_SIZE = 0.5;\n\nexport function ExhibitionPreviewPanel({\n preset,\n presetOptions,\n focusSelectedCanvas = true,\n}: ExhibitionPreviewPanelProps) {\n const previewWindow = useExhibitionPreviewWindow({ preset, presetOptions, focusSelectedCanvas });\n const vault = useVault();\n const rootResource = useAppResource();\n const manifest = useManifest();\n const template = useExhibitionTemplate();\n const canvas = useInStack(\"Canvas\");\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const cleanupRef = useRef<(() => void) | null>(null);\n const resourceRef = useRef(rootResource);\n const canvasIdRef = useRef<string | null>(null);\n const annotationIdRef = useRef<string | null>(null);\n const [status, setStatus] = useState<\"waiting\" | \"connected\" | \"error\">(\"waiting\");\n const [viewportWidth, setViewportWidth] = useState(0);\n const [useScaledPreview, setUseScaledPreview] = useState(false);\n const [useMobileWidthPreview, setUseMobileWidthPreview] = useState(false);\n const selectedTourStepId = useSlideshowContentPositioning((state) => state.selectedTourStepId);\n const currentCanvasId = focusSelectedCanvas ? canvas?.resource.source.id || manifest?.items?.[0]?.id || null : null;\n const structureKey = getPreviewStructureKey(rootResource, manifest?.items);\n const imageTransformKey = useVaultSelector(\n (_, currentVault) => getPreviewImageTransformKey(currentVault, manifest?.items),\n [structureKey]\n );\n const previousStructureKeyRef = useRef(structureKey);\n const src = useMemo(\n () => createScrollingPreviewUrl(preset, presetOptions, template?.previewUrl).toString(),\n [preset, presetOptions, template?.previewUrl]\n );\n const targetOrigin = useMemo(() => new URL(src).origin, [src]);\n const previewScale = useScaledPreview ? SCALED_PREVIEW_SIZE : 1;\n const iframeViewportWidth = useMobileWidthPreview\n ? MOBILE_PREVIEW_WIDTH\n : viewportWidth\n ? Math.round(viewportWidth / previewScale)\n : 0;\n const isMobileViewport = iframeViewportWidth > 0 && iframeViewportWidth <= MOBILE_VIEWPORT_WIDTH;\n\n resourceRef.current = rootResource;\n canvasIdRef.current = currentCanvasId;\n annotationIdRef.current = selectedTourStepId;\n\n const connectPreview = useCallback(() => {\n const iframe = iframeRef.current;\n if (!iframe?.contentWindow) return;\n\n cleanupRef.current?.();\n setStatus(\"waiting\");\n\n const channel = new MessageChannel();\n cleanupRef.current = createIframeVaultBridge(vault as any, channel.port1);\n\n try {\n iframe.contentWindow.postMessage(\n {\n _type: PREVIEW_CONNECT,\n resource: resourceRef.current,\n canvasId: canvasIdRef.current,\n annotationId: annotationIdRef.current || undefined,\n },\n targetOrigin,\n [channel.port2]\n );\n setStatus(\"connected\");\n } catch {\n cleanupRef.current?.();\n cleanupRef.current = null;\n setStatus(\"error\");\n }\n }, [targetOrigin, vault]);\n\n useEffect(() => {\n function handleReady(event: MessageEvent) {\n if (event.origin !== targetOrigin) return;\n if (event.source !== iframeRef.current?.contentWindow) return;\n if (event.data?._type !== PREVIEW_READY) return;\n connectPreview();\n }\n\n window.addEventListener(\"message\", handleReady);\n return () => {\n window.removeEventListener(\"message\", handleReady);\n cleanupRef.current?.();\n cleanupRef.current = null;\n };\n }, [connectPreview, targetOrigin]);\n\n useEffect(() => {\n const target = iframeRef.current?.contentWindow;\n if (!target || status !== \"connected\") return;\n target.postMessage(\n {\n _type: PREVIEW_SELECTION,\n resource: rootResource,\n canvasId: currentCanvasId,\n annotationId: selectedTourStepId || undefined,\n },\n targetOrigin\n );\n }, [status, rootResource, currentCanvasId, selectedTourStepId, targetOrigin]);\n\n useEffect(() => {\n const structureChanged = previousStructureKeyRef.current !== structureKey;\n previousStructureKeyRef.current = structureKey;\n\n if (structureChanged && status === \"connected\") {\n connectPreview();\n }\n }, [connectPreview, status, structureKey]);\n\n useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n\n const updateWidth = () => {\n setViewportWidth(viewport.getBoundingClientRect().width);\n };\n\n updateWidth();\n const observer = new ResizeObserver(updateWidth);\n observer.observe(viewport);\n\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (!viewportWidth) return;\n\n if (viewportWidth > MOBILE_VIEWPORT_WIDTH) {\n setUseScaledPreview(false);\n return;\n }\n\n setUseMobileWidthPreview(false);\n }, [viewportWidth]);\n\n const setScaledPreview = useCallback((nextValue: boolean) => {\n setUseScaledPreview(nextValue);\n if (nextValue) {\n setUseMobileWidthPreview(false);\n }\n }, []);\n\n const setMobileWidthPreview = useCallback((nextValue: boolean) => {\n setUseMobileWidthPreview(nextValue);\n if (nextValue) {\n setUseScaledPreview(false);\n }\n }, []);\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-zinc-950\">\n {status !== \"connected\" ? (\n <div className=\"border-b border-zinc-800 bg-zinc-900 px-3 py-2 text-sm text-zinc-300\">\n {status === \"error\" ? \"Preview connection failed.\" : \"Connecting to exhibition viewer...\"}\n </div>\n ) : null}\n <PreviewViewportNotice\n iframeViewportWidth={iframeViewportWidth}\n isMobileViewport={isMobileViewport}\n showScaleOption={viewportWidth > 0 && viewportWidth <= MOBILE_VIEWPORT_WIDTH}\n showMobileWidthOption={viewportWidth > MOBILE_VIEWPORT_WIDTH}\n useScaledPreview={useScaledPreview}\n useMobileWidthPreview={useMobileWidthPreview}\n onUseScaledPreviewChange={setScaledPreview}\n onUseMobileWidthPreviewChange={setMobileWidthPreview}\n previewWindow={previewWindow}\n />\n <div\n ref={viewportRef}\n className={twMerge(\n \"flex min-h-0 flex-1 overflow-hidden bg-white\",\n useScaledPreview ? \"justify-start\" : \"justify-center\"\n )}\n >\n <iframe\n key={imageTransformKey}\n ref={iframeRef}\n src={src}\n title=\"Exhibition preview\"\n className={twMerge(\n \"block h-full shrink-0 border-0 bg-white\",\n useMobileWidthPreview ? \"shadow-2xl shadow-black/40\" : \"\"\n )}\n style={{\n width: useMobileWidthPreview\n ? MOBILE_PREVIEW_WIDTH\n : useScaledPreview\n ? `${100 / SCALED_PREVIEW_SIZE}%`\n : \"100%\",\n maxWidth: useMobileWidthPreview ? \"100%\" : undefined,\n height: useScaledPreview ? `${100 / SCALED_PREVIEW_SIZE}%` : \"100%\",\n transform: useScaledPreview ? `scale(${SCALED_PREVIEW_SIZE})` : undefined,\n transformOrigin: \"top left\",\n }}\n onLoad={() => setStatus(\"waiting\")}\n />\n </div>\n </div>\n );\n}\n\nexport function useExhibitionPreviewWindow({\n preset,\n presetOptions,\n focusSelectedCanvas = true,\n}: ExhibitionPreviewPanelProps) {\n const { open, update, focus, isClosed } = usePreviewWindow();\n const rootResource = useAppResource();\n const manifest = useManifest();\n const template = useExhibitionTemplate();\n const canvas = useInStack(\"Canvas\");\n const selectedTourStepId = useSlideshowContentPositioning((state) => state.selectedTourStepId);\n const currentCanvasId = focusSelectedCanvas ? canvas?.resource.source.id || manifest?.items?.[0]?.id || null : null;\n const structureKey = getPreviewStructureKey(rootResource, manifest?.items);\n const imageTransformKey = useVaultSelector(\n (_, currentVault) => getPreviewImageTransformKey(currentVault, manifest?.items),\n [structureKey]\n );\n const url = useMemo(\n () => createScrollingPreviewUrl(preset, presetOptions, template?.previewUrl).toString(),\n [preset, presetOptions, template?.previewUrl]\n );\n const options = useMemo(\n () => ({\n url,\n resource: rootResource,\n canvasId: currentCanvasId,\n annotationId: selectedTourStepId,\n name: \"manifest-editor-exhibition-preview\",\n reloadKey: `${structureKey}:${imageTransformKey}`,\n }),\n [currentCanvasId, imageTransformKey, rootResource, selectedTourStepId, structureKey, url]\n );\n\n useEffect(() => update(options), [options, update]);\n\n return useMemo(\n () => ({\n open: () => open(options),\n focus,\n isClosed,\n }),\n [focus, isClosed, open, options]\n );\n}\n\nfunction PreviewViewportNotice({\n iframeViewportWidth,\n isMobileViewport,\n showScaleOption,\n showMobileWidthOption,\n useScaledPreview,\n useMobileWidthPreview,\n onUseScaledPreviewChange,\n onUseMobileWidthPreviewChange,\n previewWindow,\n}: {\n iframeViewportWidth: number;\n isMobileViewport: boolean;\n showScaleOption: boolean;\n showMobileWidthOption: boolean;\n useScaledPreview: boolean;\n useMobileWidthPreview: boolean;\n onUseScaledPreviewChange: (useScaledPreview: boolean) => void;\n onUseMobileWidthPreviewChange: (useMobileWidthPreview: boolean) => void;\n previewWindow: Pick<ReturnType<typeof useExhibitionPreviewWindow>, \"open\" | \"focus\" | \"isClosed\">;\n}) {\n if (!iframeViewportWidth) {\n return null;\n }\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-3 border-b border-zinc-800/80 bg-zinc-900 px-3 py-2 text-xs text-zinc-200\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span\n className={twMerge(\n \"shrink-0 rounded-full px-2 py-1 font-semibold ring-1 ring-inset\",\n isMobileViewport\n ? \"bg-amber-300/90 text-amber-950 ring-amber-200/50\"\n : \"bg-emerald-300/90 text-emerald-950 ring-emerald-200/50\"\n )}\n >\n {isMobileViewport ? \"Mobile view\" : \"Desktop view\"}\n </span>\n <span className=\"truncate text-zinc-400\">\n Iframe viewport: {iframeViewportWidth}px. Mobile starts at {MOBILE_VIEWPORT_WIDTH}px and below.\n </span>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {showScaleOption ? (\n <PreviewToggle label=\"50% scale\" checked={useScaledPreview} onChange={onUseScaledPreviewChange} />\n ) : null}\n\n {showMobileWidthOption ? (\n <PreviewToggle\n label=\"Mobile width\"\n checked={useMobileWidthPreview}\n onChange={onUseMobileWidthPreviewChange}\n />\n ) : null}\n\n <button\n type=\"button\"\n className=\"shrink-0 rounded-md border border-zinc-700 bg-zinc-950/70 px-2.5 py-1.5 font-semibold text-zinc-200 shadow-sm shadow-black/20 transition-colors hover:border-zinc-600 hover:bg-zinc-950\"\n onClick={previewWindow.isClosed ? previewWindow.open : previewWindow.focus}\n >\n {previewWindow.isClosed ? \"Open in new window\" : \"Focus preview window\"}\n </button>\n </div>\n </div>\n );\n}\n\nfunction PreviewToggle({\n label,\n checked,\n onChange,\n}: {\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n}) {\n return (\n <label className=\"flex shrink-0 cursor-pointer items-center gap-2 rounded-md border border-zinc-800 bg-zinc-950/70 px-2.5 py-1.5 font-semibold text-zinc-200 shadow-sm shadow-black/20 transition-colors hover:border-zinc-700 hover:bg-zinc-950\">\n <span>{label}</span>\n <input\n type=\"checkbox\"\n className=\"peer sr-only\"\n checked={checked}\n onChange={(event) => onChange(event.currentTarget.checked)}\n />\n <span className=\"relative h-5 w-9 rounded-full bg-zinc-700/80 transition-colors after:absolute after:left-0.5 after:top-0.5 after:h-4 after:w-4 after:rounded-full after:bg-zinc-100 after:shadow after:shadow-black/20 after:transition-transform peer-checked:bg-me-primary-500 peer-checked:after:translate-x-4\" />\n </label>\n );\n}\n","import { useExhibitionTemplate } from \"./exhibition-template\";\nimport type { PresetUrlSearchParamsPreset } from \"./exhibition-preview-url-helper\";\n\nexport const exhibitionRemotePreviewPanelId =\n \"@exhibitions/remote-preview-panel\";\n\nexport function useConfiguredExhibitionPreviewPreset() {\n const selectedTemplate = useExhibitionTemplate();\n\n switch (selectedTemplate?.type) {\n case \"slideshow\":\n return \"slideshow\" satisfies PresetUrlSearchParamsPreset;\n case \"scroll\":\n return \"scroll\" satisfies PresetUrlSearchParamsPreset;\n case \"fullpage\":\n default:\n return \"exhibition\" satisfies PresetUrlSearchParamsPreset;\n }\n}\n","import type { SVGProps } from \"react\";\n\nexport function PreviewIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <title>Preview</title>\n <path\n fill=\"currentColor\"\n d=\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5s5 2.24 5 5s-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3s3-1.34 3-3s-1.34-3-3-3\"\n />\n </svg>\n );\n}\n","import type { LayoutPanel } from \"@manifest-editor/shell\";\nimport { useManifest } from \"react-iiif-vault\";\nimport { ExhibitionPreviewPanel } from \"../components/ExhibitionPreviewPanel\";\nimport {\n exhibitionRemotePreviewPanelId,\n useConfiguredExhibitionPreviewPreset,\n} from \"../helpers/exhibition-preview-state\";\nimport type { PresetUrlSearchParamsOptions } from \"../helpers/exhibition-preview-url-helper\";\nimport { PreviewIcon } from \"../icons/PreviewIcon\";\nimport {\n getThemeConfigFromServices,\n resolveThemeConfig,\n} from \"../theme/theme-service\";\n\nexport const exhibitionRemotePreviewPanel: LayoutPanel = {\n id: exhibitionRemotePreviewPanelId,\n label: \"Exhibition preview\",\n icon: <PreviewIcon />,\n render: () => <ExhibitionRemotePreviewPanel />,\n options: {\n minWidth: 350,\n },\n};\n\nfunction ExhibitionRemotePreviewPanel() {\n const previewPreset = useConfiguredExhibitionPreviewPreset();\n const manifest = useManifest();\n const serviceTheme =\n getThemeConfigFromServices((manifest as any)?.service) ||\n getThemeConfigFromServices((manifest as any)?.services);\n const resolvedTheme = resolveThemeConfig(serviceTheme);\n let presetOptions: Partial<PresetUrlSearchParamsOptions>;\n\n if (previewPreset === \"scroll\") {\n presetOptions = {\n ignoreCanvasBackgrounds: resolvedTheme.scroll.options.ignoreCanvasBackgrounds,\n tableOfContentsPlacement: resolvedTheme.scroll.options.tableOfContentsPlacement,\n };\n } else if (previewPreset === \"slideshow\") {\n presetOptions = {\n ignoreCanvasBackgrounds: resolvedTheme.delft.slideshow.ignoreCanvasBackgrounds,\n };\n } else {\n presetOptions = {\n cutCorners: resolvedTheme.delft.exhibition.cutCorners,\n fullTitleBar: resolvedTheme.delft.exhibition.fullTitleBar,\n hideTableOfContents: resolvedTheme.delft.exhibition.hideTableOfContents,\n ignoreCanvasBackgrounds: resolvedTheme.delft.exhibition.ignoreCanvasBackgrounds,\n showNavigationControls: resolvedTheme.delft.exhibition.showNavigationControls,\n showProgressBar: resolvedTheme.delft.exhibition.showProgressBar,\n tableOfContentsPlacement: resolvedTheme.delft.exhibition.tableOfContentsPlacement,\n };\n }\n\n return (\n <ExhibitionPreviewPanel\n preset={previewPreset}\n presetOptions={presetOptions}\n focusSelectedCanvas={false}\n />\n );\n}\n","import { useLayoutActions } from \"@manifest-editor/shell\";\nimport { Button } from \"react-aria-components\";\nimport { LocaleString, useManifest } from \"react-iiif-vault\";\n\nexport function ExhibitionContainer({ children }: { children: React.ReactNode }) {\n const manifest = useManifest();\n const { edit } = useLayoutActions();\n return (\n <div className=\"grid auto-rows-auto grid-cols-12 content-center justify-center gap-2 p-2\">\n <div className=\"col-span-12 row-span-2 text-black flex flex-col items-center justify-center\">\n <Button\n onPress={() =>\n manifest &&\n edit(manifest, undefined, {\n forceOpen: true,\n selectedTab: \"@manifest-editor/descriptive-properties\",\n })\n }\n className=\"col-span-4 row-span-4 text-md text-left text-black hover:bg-slate-100 w-full flex items-center justify-center\"\n >\n <LocaleString className=\"block w-full text-left\">{manifest?.label}</LocaleString>\n </Button>\n </div>\n {children}\n </div>\n );\n}\n","import type { Vault } from \"@iiif/helpers/vault\";\nimport type { CanvasNormalized } from \"@iiif/presentation-3-normalized\";\n\nconst heightMap = {\n \"h-1\": \"lg:min-h-[100px] row-span-1\",\n \"h-2\": \"lg:min-h-[200px] row-span-2\",\n \"h-3\": \"lg:min-h-[300px] row-span-3\",\n \"h-4\": \"lg:min-h-[400px] row-span-4\",\n \"h-5\": \"lg:min-h-[500px] row-span-5\",\n \"h-6\": \"lg:min-h-[600px] row-span-6\",\n \"h-7\": \"lg:min-h-[700px] row-span-7\",\n \"h-8\": \"lg:min-h-[800px] row-span-8\",\n \"h-9\": \"lg:min-h-[900px] row-span-9\",\n \"h-10\": \"lg:min-h-[1000px] row-span-10\",\n \"h-11\": \"lg:min-h-[1100px] row-span-11\",\n \"h-12\": \"lg:min-h-[1200px] row-span-12\",\n};\nconst previewHeightMap = {\n \"h-1\": \"lg:min-h-[25px] row-span-1\",\n \"h-2\": \"lg:min-h-[50px] row-span-2\",\n \"h-3\": \"lg:min-h-[75px] row-span-3\",\n \"h-4\": \"lg:min-h-[100px] row-span-4\",\n \"h-5\": \"lg:min-h-[125px] row-span-5\",\n \"h-6\": \"lg:min-h-[150px] row-span-6\",\n \"h-7\": \"lg:min-h-[175px] row-span-7\",\n \"h-8\": \"lg:min-h-[200px] row-span-8\",\n \"h-9\": \"lg:min-h-[225px] row-span-9\",\n \"h-10\": \"lg:min-h-[250px] row-span-10\",\n \"h-11\": \"lg:min-h-[275px] row-span-11\",\n \"h-12\": \"lg:min-h-[300px] row-span-12\",\n};\n\nconst widthMap = {\n \"w-1\": \"col-span-1\",\n \"w-2\": \"col-span-2\",\n \"w-3\": \"col-span-3\",\n \"w-4\": \"col-span-4\",\n \"w-5\": \"col-span-5\",\n \"w-6\": \"col-span-6\",\n \"w-7\": \"col-span-7\",\n \"w-8\": \"col-span-8\",\n \"w-9\": \"col-span-9\",\n \"w-10\": \"col-span-10\",\n \"w-11\": \"col-span-11\",\n \"w-12\": \"col-span-12\",\n};\n\nexport function getHeightWidthRatio(behavior?: string[]) {\n const { isLeft, isRight, isBottom } = getGridStats(behavior);\n const h = behavior?.find((a) => a.includes(\"h-\")) as keyof typeof heightMap;\n const w = behavior?.find((a) => a.includes(\"w-\")) as keyof typeof widthMap;\n\n if (!h || !w) {\n return { h: 0, w: 0, ratio: 1 };\n }\n\n const ret = {\n h: Number.parseInt(h.split(\"-\")[1]!),\n w: Number.parseInt(w.split(\"-\")[1]!),\n ratio: 1,\n };\n\n // If left or right - the ratio is 2/3s.\n if (isLeft || isRight) {\n ret.w *= 2 / 3;\n }\n if (isBottom) {\n ret.h *= 2 / 3;\n }\n\n if (ret.h && ret.w) {\n ret.ratio = ret.w / ret.h;\n }\n return ret;\n}\n\nexport function getClassName(b?: string[], firstInfo = false, preview = true) {\n if (!b || b.length === 0) {\n b = [\"h-8\", \"w-8\", \"image\"];\n }\n let h = b.find((a) => a.includes(\"h-\")) as keyof typeof heightMap;\n const w = b.find((a) => a.includes(\"w-\")) as keyof typeof widthMap;\n const classNames = [];\n\n if (firstInfo && h === \"h-4\") {\n h = \"h-8\";\n }\n classNames.push(preview ? previewHeightMap[h] : heightMap[h]);\n classNames.push(widthMap[w]);\n return classNames.join(\" \");\n}\n\nexport function getGridStats(behavior?: string[]) {\n const isRight = behavior?.includes(\"right\");\n const isLeft = behavior?.includes(\"left\");\n const isBottom = behavior?.includes(\"bottom\");\n const isTop = behavior?.includes(\"top\");\n const isImage = behavior?.includes(\"image\") || (!isLeft && !isRight && !isBottom && !isTop);\n const isInfo = behavior?.includes(\"info\");\n\n return {\n isRight,\n isLeft,\n isBottom,\n isTop,\n isInfo,\n isImage,\n };\n}\n\nexport function isEditableExhibitionCanvas(resource: { id: string; type: string }, vault: Vault) {\n const full = vault.get(resource);\n\n return full?.type === \"Canvas\";\n}\n\n/**\n * Returns true if the canvas is a textual-content (info-box) canvas.\n * Safe to call from EditorDefinition.supports.custom — won't throw.\n */\nexport function isInfoBoxCanvas(resource: { source?: { id?: string; type?: string } }, vault: Vault): boolean {\n const sourceId = resource.source?.id;\n const sourceType = resource.source?.type;\n if (!sourceId || !sourceType) return false;\n try {\n const canvas = vault.get({ id: sourceId, type: sourceType }) as any;\n const behavior: string[] = canvas?.behavior || [];\n return behavior.includes(\"info\");\n } catch {\n return false;\n }\n}\n\nexport function isVideoCanvas(resource: { source?: { id?: string; type?: string } }, vault: Vault): boolean {\n const sourceId = resource.source?.id;\n const sourceType = resource.source?.type;\n if (!sourceId || !sourceType) return false;\n\n try {\n const canvas = vault.get({ id: sourceId, type: sourceType }) as any;\n const pageRefs = Array.isArray(canvas?.items) ? canvas.items : [];\n\n for (const pageRef of pageRefs) {\n const page = vault.get(pageRef as any, { skipSelfReturn: false } as any) as any;\n const annotations = Array.isArray(page?.items) ? page.items : [];\n\n for (const annotationRef of annotations) {\n const annotation = vault.get(annotationRef as any, { skipSelfReturn: false } as any) as any;\n const body = Array.isArray(annotation?.body) ? annotation.body[0] : annotation?.body;\n const resource = body?.id ? vault.get(body as any, { skipSelfReturn: false } as any) || body : body;\n const source = resource?.type === \"SpecificResource\" ? resource.source : resource;\n const services = Array.isArray(source?.service) ? source.service : source?.service ? [source.service] : [];\n\n if (source?.type === \"Video\" || services.some((service: any) => service?.profile === \"https://www.youtube.com\")) {\n return true;\n }\n }\n }\n } catch {\n return false;\n }\n\n return false;\n}\n\nexport function isExhibitionItem(canvas: CanvasNormalized | undefined) {\n if (!canvas) return false;\n\n const behaviors = canvas.behavior || [];\n if (\n behaviors.includes(\"image\") ||\n behaviors.includes(\"info\") ||\n behaviors.includes(\"splash\")\n ) {\n return true;\n }\n\n for (const behavior of behaviors) {\n if (behavior.startsWith(\"w-\") || behavior.startsWith(\"h-\")) {\n return true;\n }\n }\n\n return false;\n}\n","import { useCanvas } from \"react-iiif-vault\";\nimport invariant from \"tiny-invariant\";\nimport { getHeightWidthRatio } from \"../helpers\";\n\nexport function AspectRatioWarning() {\n const canvas = useCanvas();\n invariant(canvas);\n\n const ratio =\n canvas.width && canvas.height ? canvas.width / canvas.height : 0;\n const target = getHeightWidthRatio(canvas.behavior || []);\n\n if (Math.abs(ratio - target.ratio) < 0.01) return null;\n\n return (\n <div className=\"exhibition-aspect-warning p-2 rounded bg-me-100\">\n <div className=\"font-semibold text-me-700\">Aspect ratio warning</div>\n <div className=\"text-sm text-black/60\">\n The aspect ratio of this canvas is {ratio.toFixed(2)} but the target\n aspect ratio is {target.ratio.toFixed(2)}. Some parts of this image may\n be cropped.\n <div className=\"relative h-32 w-full mt-2\">\n <div\n className=\"bg-[red] left-0 top-0 z-2 opacity-50 max-w-32 max-h-32\"\n style={{ aspectRatio: ratio.toFixed(2) }}\n >\n <div\n className=\"asbolute bg-[white] left-0 top-0 z-1 opacity-50 max-w-32 max-h-32\"\n style={{ aspectRatio: target.ratio }}\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","export type FloatingBehavior =\n | \"float-top-left\"\n | \"float-top\"\n | \"float-top-right\"\n | \"float-left\"\n | \"float-right\"\n | \"float-bottom-left\"\n | \"float-bottom\"\n | \"float-bottom-right\";\n\nexport const floatingBehaviorOptions: Array<{ value: FloatingBehavior; label: string }> = [\n { value: \"float-top-left\", label: \"Top left\" },\n { value: \"float-top\", label: \"Top centre\" },\n { value: \"float-top-right\", label: \"Top right\" },\n { value: \"float-left\", label: \"Centre left\" },\n { value: \"float-right\", label: \"Centre right\" },\n { value: \"float-bottom-left\", label: \"Bottom left\" },\n { value: \"float-bottom\", label: \"Bottom centre\" },\n { value: \"float-bottom-right\", label: \"Bottom right\" },\n];\n\nconst iconPositions: Record<FloatingBehavior, { x: number; y: number }> = {\n \"float-top-left\": { x: 2, y: 2 },\n \"float-top\": { x: 8.5, y: 2 },\n \"float-top-right\": { x: 15, y: 2 },\n \"float-left\": { x: 2, y: 8.5 },\n \"float-right\": { x: 15, y: 8.5 },\n \"float-bottom-left\": { x: 2, y: 15 },\n \"float-bottom\": { x: 8.5, y: 15 },\n \"float-bottom-right\": { x: 15, y: 15 },\n};\n\nexport function FloatingPositionIcon({ position }: { position: \"\" | FloatingBehavior }) {\n return (\n <svg width=\"1.6em\" height=\"1.6em\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.4\" />\n {position ? (\n <rect {...iconPositions[position]} width=\"7\" height=\"7\" rx=\"1.5\" fill=\"currentColor\" />\n ) : (\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" opacity=\"0.7\" />\n )}\n </svg>\n );\n}\n\nexport function FloatingPositionPicker({\n value,\n onChange,\n}: {\n value: \"\" | FloatingBehavior;\n onChange: (value: \"\" | FloatingBehavior) => void;\n}) {\n const options = floatingGridWithCenter();\n\n return (\n <div className=\"grid w-fit grid-cols-3 gap-2\">\n {options.map((option) => {\n const selected = value === option.value;\n return (\n <button\n key={option.value || \"off\"}\n type=\"button\"\n title={option.label}\n aria-pressed={selected}\n className=\"flex min-h-11 items-center justify-center rounded-md border px-3 py-2 transition-colors\"\n style={{\n backgroundColor: selected ? \"var(--exhibition-primary, #b84c74)\" : \"#fff\",\n borderColor: selected ? \"var(--exhibition-primary, #b84c74)\" : \"#dcd5ce\",\n color: selected ? \"#fff\" : \"#332f2c\",\n }}\n onClick={() => onChange(option.value)}\n >\n <FloatingPositionIcon position={option.value} />\n <span className=\"sr-only\">{option.label}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function floatingGridWithCenter(clearLabel = \"No overlay\") {\n return [\n ...floatingBehaviorOptions.slice(0, 4),\n { value: \"\" as const, label: clearLabel },\n ...floatingBehaviorOptions.slice(4),\n ];\n}\n","import { createImageServiceRequest, imageServiceRequestToString } from \"@iiif/parser/image-3\";\nimport type { ImageService } from \"@iiif/presentation-3\";\nimport { ActionButton, AddIcon } from \"@manifest-editor/components\";\nimport { createAppActions, InputContainer, LinkingPropertyList } from \"@manifest-editor/editors\";\nimport { useCreator, useEditingResource, useEditor, useInlineCreator } from \"@manifest-editor/shell\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { useCanvas, useVault } from \"react-iiif-vault\";\nimport { getPaintingAnnotations, getResolvedAnnotationBody } from \"../slideshow-content-positioning\";\n\ntype ThumbnailCandidate = {\n id: string;\n label: string;\n imageId?: string;\n service: ImageService;\n};\n\nexport function ExhibitionThumbnailEditor() {\n const canvas = useCanvas();\n const resource = useEditingResource();\n const thumbnailCreator = useInlineCreator();\n const [canCreateThumbnail, thumbnailActions] = useCreator(resource?.resource.source, \"thumbnail\", \"ContentResource\");\n const { descriptive } = useEditor();\n const { thumbnail } = descriptive;\n const thumbnails = thumbnail.get() || [];\n const vault = useVault();\n const thumbnailCandidates = useMemo(() => (canvas ? getThumbnailCandidates(vault, canvas) : []), [canvas, vault]);\n\n if (!canvas || !resource) {\n return null;\n }\n\n return !thumbnails.length && thumbnailCandidates.length ? (\n <QuickThumbnailFromCanvasImages\n candidates={thumbnailCandidates}\n canCreateThumbnail={canCreateThumbnail}\n onCreateThumbnail={() => thumbnailActions.create()}\n onAddThumbnail={({ service, width, height }) =>\n thumbnailCreator.create(\n \"@manifest-editor/thumbnail-image\",\n { service, width, height },\n thumbnailCreatorParent(canvas),\n )\n }\n />\n ) : (\n <LinkingPropertyList\n containerId={thumbnail.containerId()}\n label=\"Thumbnail\"\n property=\"thumbnail\"\n items={thumbnails}\n singleMode\n reorder={(ctx) => thumbnail.reorder(ctx.startIndex, ctx.endIndex)}\n createActions={createAppActions(thumbnail)}\n creationType=\"ContentResource\"\n emptyLabel=\"No thumbnail\"\n parent={resource.resource}\n />\n );\n}\n\nfunction QuickThumbnailFromCanvasImages({\n candidates,\n canCreateThumbnail,\n onCreateThumbnail,\n onAddThumbnail,\n}: {\n candidates: ThumbnailCandidate[];\n canCreateThumbnail: boolean;\n onCreateThumbnail: () => void;\n onAddThumbnail: (payload: { service: ImageService; width: number; height?: number }) => void;\n}) {\n const [selectedCandidateId, setSelectedCandidateId] = useState<string | null>(null);\n const [selectedSizeValue, setSelectedSizeValue] = useState<string>(\"\");\n const [serviceInfo, setServiceInfo] = useState<Record<string, ImageService | null>>({});\n const selectedCandidate = candidates.find((candidate) => candidate.id === selectedCandidateId) || candidates[0];\n const selectedServiceInfo = selectedCandidate ? serviceInfo[selectedCandidate.id] : undefined;\n const selectedService = selectedCandidate\n ? selectedServiceInfo === null\n ? null\n : selectedServiceInfo || selectedCandidate.service\n : null;\n const sizes = selectedService ? getServiceSizes(selectedService) : [];\n const defaultSize = getClosestThumbnailSize(sizes, 350);\n const selectedSize = sizes.find((size) => sizeToValue(size) === selectedSizeValue) || defaultSize;\n const previewUrl = selectedService && selectedSize ? serviceImageAtSize(selectedService, selectedSize) : null;\n const isFetchingSizes =\n selectedCandidate && !selectedCandidate.service.sizes?.length && !(selectedCandidate.id in serviceInfo);\n\n useEffect(() => {\n if (!selectedCandidateId && candidates[0]) {\n setSelectedCandidateId(candidates[0].id);\n }\n }, [candidates, selectedCandidateId]);\n\n useEffect(() => {\n const missing = candidates.filter((candidate) => {\n const service = candidate.service;\n return !service.sizes?.length && getServiceId(service) && !(candidate.id in serviceInfo);\n });\n\n for (const candidate of missing) {\n const serviceId = getServiceId(candidate.service);\n if (!serviceId) continue;\n\n fetch(getServiceInfoUrl(serviceId))\n .then((response) => (response.ok ? response.json() : null))\n .then((info) => {\n setServiceInfo((current) => ({\n ...current,\n [candidate.id]: info ? { ...candidate.service, ...info } : null,\n }));\n })\n .catch(() => {\n setServiceInfo((current) => ({ ...current, [candidate.id]: null }));\n });\n }\n }, [candidates, serviceInfo]);\n\n useEffect(() => {\n if (defaultSize && !sizes.some((size) => sizeToValue(size) === selectedSizeValue)) {\n setSelectedSizeValue(sizeToValue(defaultSize));\n }\n }, [defaultSize, selectedSizeValue, sizes]);\n\n return (\n <InputContainer $wide>\n <div className=\"rounded-md border border-[#dcd5ce] bg-[#f8f6f3] p-4\">\n <div className=\"text-sm font-semibold text-[#25211f]\">Thumbnail</div>\n <div className=\"mt-1 text-sm text-[#6a625c]\">Use an image service from this canvas to add a thumbnail.</div>\n\n {candidates.length > 1 ? (\n <div className=\"mt-3\">\n <label className=\"text-xs font-semibold uppercase text-[#6a625c]\" htmlFor=\"thumbnail-source-image\">\n Image\n </label>\n <select\n id=\"thumbnail-source-image\"\n className=\"mt-1 w-full rounded-md border border-[#dcd5ce] bg-white px-3 py-2 text-sm\"\n value={selectedCandidate?.id || \"\"}\n onChange={(event) => {\n setSelectedCandidateId(event.currentTarget.value);\n setSelectedSizeValue(\"\");\n }}\n >\n {candidates.map((candidate) => (\n <option key={candidate.id} value={candidate.id}>\n {candidate.label}\n </option>\n ))}\n </select>\n </div>\n ) : null}\n\n {sizes.length ? (\n <>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n {sizes.map((size) => {\n const value = sizeToValue(size);\n const selected = selectedSize ? value === sizeToValue(selectedSize) : false;\n\n return (\n <button\n key={value}\n type=\"button\"\n className=\"rounded-md border px-2 py-1 text-xs font-semibold\"\n style={{\n backgroundColor: selected ? \"#b84c74\" : \"#ffffff\",\n borderColor: selected ? \"#b84c74\" : \"#dcd5ce\",\n color: selected ? \"#ffffff\" : \"#332f2c\",\n }}\n onClick={() => setSelectedSizeValue(value)}\n >\n {size.width}x{size.height}\n </button>\n );\n })}\n </div>\n\n {previewUrl ? (\n <div className=\"mt-3 overflow-hidden rounded-md border border-[#dcd5ce] bg-white\">\n <img src={previewUrl} alt=\"\" className=\"max-h-40 w-full object-contain\" />\n </div>\n ) : null}\n\n <button\n type=\"button\"\n className=\"mt-3 rounded-md px-3 py-2 text-sm font-semibold shadow-sm\"\n style={{\n backgroundColor: \"#b84c74\",\n border: \"1px solid #a13e63\",\n color: \"#ffffff\",\n }}\n disabled={!previewUrl || !selectedSize}\n onClick={() => {\n if (!selectedService || !selectedSize) return;\n onAddThumbnail({\n service: selectedService,\n width: selectedSize.width,\n height: selectedSize.height,\n });\n }}\n >\n Add thumbnail from image\n </button>\n </>\n ) : isFetchingSizes ? (\n <div className=\"mt-3 text-sm text-[#6a625c]\">Finding available sizes...</div>\n ) : (\n <div className=\"mt-3 text-sm text-[#6a625c]\">No fixed thumbnail sizes were found for this image service.</div>\n )}\n {canCreateThumbnail ? (\n <div className=\"mt-4 border-t border-[#dcd5ce] pt-3\">\n <ActionButton onPress={onCreateThumbnail}>\n <AddIcon /> Create thumbnail\n </ActionButton>\n </div>\n ) : null}\n </div>\n </InputContainer>\n );\n}\n\nfunction thumbnailCreatorParent(canvas: any) {\n return {\n parent: {\n property: \"thumbnail\",\n resource: { id: canvas.id, type: \"Canvas\" },\n },\n };\n}\n\nfunction getThumbnailCandidates(vault: any, canvas: any): ThumbnailCandidate[] {\n const candidates: ThumbnailCandidate[] = [];\n const seen = new Set<string>();\n const annotations = getPaintingAnnotations(vault, canvas);\n\n annotations.forEach((annotation: any, index: number) => {\n const body = getResolvedAnnotationBody(vault, annotation);\n const images = collectImageResources(vault, body);\n\n images.forEach((image, imageIndex) => {\n const service = getImageService(image);\n const serviceId = service ? getServiceId(service) : \"\";\n if (!service || !serviceId || seen.has(serviceId)) {\n return;\n }\n\n seen.add(serviceId);\n candidates.push({\n id: `${annotation.id || index}-${image.id || serviceId}-${imageIndex}`,\n label:\n getLanguageMapText(image.label) || getLanguageMapText(annotation.label) || `Image ${candidates.length + 1}`,\n imageId: image.id,\n service,\n });\n });\n });\n\n return candidates;\n}\n\nfunction collectImageResources(vault: any, resource: any): any[] {\n const resolved = resolveResource(vault, resource);\n\n if (!resolved) {\n return [];\n }\n\n if (resolved.type === \"Choice\" && Array.isArray(resolved.items)) {\n return resolved.items.flatMap((item: any) => collectImageResources(vault, item));\n }\n\n if (resolved.type === \"SpecificResource\") {\n return collectImageResources(vault, resolved.source);\n }\n\n if (resolved.type === \"Canvas\") {\n return getPaintingAnnotations(vault, resolved).flatMap((annotation: any) =>\n collectImageResources(vault, getResolvedAnnotationBody(vault, annotation)),\n );\n }\n\n return getImageService(resolved) ? [resolved] : [];\n}\n\nfunction resolveResource(vault: any, resource: any): any {\n if (!resource) return null;\n if (resource.id && !resource.service && !resource.items && !resource.value) {\n return vault.get(resource as any, { skipSelfReturn: false } as any) || resource;\n }\n return resource;\n}\n\nfunction getImageService(resource: any): ImageService | null {\n const services = Array.isArray(resource?.service) ? resource.service : resource?.service ? [resource.service] : [];\n\n return (\n services.find((service: any) => {\n const profile = Array.isArray(service.profile) ? service.profile.join(\" \") : service.profile || \"\";\n const type = service.type || service[\"@type\"] || \"\";\n return type.includes(\"ImageService\") || profile.includes(\"level\") || profile.includes(\"iiif.io/api/image\");\n }) || null\n );\n}\n\nfunction getServiceId(service: ImageService): string {\n return ((service as any).id || (service as any)[\"@id\"] || \"\").replace(/\\/info\\.json$/, \"\");\n}\n\nfunction getServiceInfoUrl(serviceId: string): string {\n return serviceId.endsWith(\"/info.json\") ? serviceId : `${serviceId.replace(/\\/$/, \"\")}/info.json`;\n}\n\nfunction getServiceSizes(service: ImageService): Array<{ width: number; height: number }> {\n const sizes = Array.isArray(service.sizes)\n ? service.sizes\n .filter((size: any) => Number(size.width) && Number(size.height))\n .map((size: any) => ({\n width: Number(size.width),\n height: Number(size.height),\n }))\n : [];\n\n if (sizes.length) {\n return sizes.sort((a, b) => a.width - b.width).slice(0, 8);\n }\n\n const width = Number(service.width);\n const height = Number(service.height);\n if (!width || !height) {\n return [];\n }\n\n return [256, 512, 1024]\n .filter((targetWidth) => targetWidth < width)\n .map((targetWidth) => ({\n width: targetWidth,\n height: Math.round((height / width) * targetWidth),\n }))\n .concat([{ width, height }])\n .slice(0, 4);\n}\n\nfunction sizeToValue(size: { width: number; height?: number }) {\n return `${size.width},${size.height || \"\"}`;\n}\n\nfunction getClosestThumbnailSize(sizes: Array<{ width: number; height: number }>, target: number) {\n return sizes.reduce<(typeof sizes)[number] | undefined>((closest, size) => {\n if (!closest) return size;\n\n const currentDistance = Math.hypot(size.width - target, size.height - target);\n const closestDistance = Math.hypot(closest.width - target, closest.height - target);\n\n return currentDistance < closestDistance ? size : closest;\n }, undefined);\n}\n\nfunction serviceImageAtSize(service: ImageService, size: { width: number; height?: number }) {\n const normalisedService = { ...service } as any;\n if (normalisedService[\"@id\"]) {\n normalisedService.id = normalisedService[\"@id\"];\n }\n if (normalisedService[\"@type\"]) {\n normalisedService.type = normalisedService[\"@type\"];\n }\n\n const request = createImageServiceRequest(normalisedService);\n\n return imageServiceRequestToString({\n identifier: request.identifier,\n server: request.server,\n scheme: request.scheme,\n type: \"image\",\n size: {\n max: false,\n confined: false,\n upscaled: false,\n width: size.width,\n height: size.height,\n },\n format: \"jpg\",\n region: { full: true },\n rotation: { angle: 0 },\n quality: \"default\",\n prefix: request.prefix,\n originalPath: (request as any).originalPath,\n });\n}\n\nfunction getLanguageMapText(value: any): string {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) return value.filter(Boolean).join(\" \");\n\n if (typeof value === \"object\") {\n const values = Object.values(value).flatMap((item) => (Array.isArray(item) ? item : [item]));\n\n return values.filter((item): item is string => typeof item === \"string\").join(\" \");\n }\n\n return \"\";\n}\n","export type LayoutPreset = \"image\" | \"right\" | \"left\" | \"bottom\" | \"top\";\n\nexport const positionBehaviors = new Set([\"left\", \"right\", \"bottom\", \"top\"]);\nexport const layoutBehaviors = new Set([...positionBehaviors, \"image\"]);\nexport const coverBehaviors = new Set([\"cover\", \"image-cover\"]);\n\nfunction replaceBehaviorGroup(behavior: string[], group: Set<string>, replacement: string) {\n const firstIndex = behavior.findIndex((item) => group.has(item));\n const next = behavior.filter((item) => !group.has(item));\n next.splice(firstIndex < 0 ? next.length : firstIndex, 0, replacement);\n return next;\n}\n\nexport function toggleBehaviorGroup(behavior: string[], group: Set<string>, replacement: string, enabled: boolean) {\n const firstIndex = behavior.findIndex((item) => group.has(item));\n const next = behavior.filter((item) => !group.has(item));\n if (enabled) next.splice(firstIndex < 0 ? next.length : firstIndex, 0, replacement);\n return next;\n}\n\nexport function replaceLayoutBehavior(behavior: string[], layoutPreset: LayoutPreset) {\n return replaceBehaviorGroup(behavior, layoutPreset === \"image\" ? layoutBehaviors : positionBehaviors, layoutPreset);\n}\n\nexport function toggleImageBehavior(behavior: string[], enabled: boolean) {\n return toggleBehaviorGroup(behavior, new Set([\"image\"]), \"image\", enabled);\n}\n\nexport function toggleCoverBehavior(behavior: string[], enabled: boolean) {\n return toggleBehaviorGroup(behavior, coverBehaviors, \"cover\", enabled);\n}\n","import { LazyThumbnail, Sidebar, SidebarContent } from \"@manifest-editor/components\";\nimport {\n BehaviorEditor,\n type BehaviorEditorProps,\n DimensionsTriplet,\n getInternationalStringText,\n InputContainer,\n useInStack,\n} from \"@manifest-editor/editors\";\nimport { type EditorDefinition, useApp, useEditor, useLocalStorage } from \"@manifest-editor/shell\";\nimport { useEffect, useState } from \"react\";\nimport { Button } from \"react-aria-components\";\nimport { useCanvas, useManifest, useVault, useVaultSelector } from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\nimport { AspectRatioWarning } from \"../components/AspectRatioWarning\";\nimport {\n FloatingPositionPicker,\n floatingBehaviorOptions,\n type FloatingBehavior,\n} from \"../components/FloatingPositionPicker\";\nimport { isEditableExhibitionCanvas, isInfoBoxCanvas } from \"../helpers\";\nimport { useExhibitionTemplate } from \"../helpers/exhibition-template\";\nimport {\n getPaintingAnnotations,\n getResolvedAnnotationBody,\n getTourStepAnnotations,\n useSlideshowWorkbenchState,\n} from \"../slideshow-content-positioning\";\nimport { ExhibitionThumbnailEditor } from \"./ExhibitionThumbnailEditor\";\nimport {\n coverBehaviors,\n layoutBehaviors,\n type LayoutPreset,\n replaceLayoutBehavior,\n toggleBehaviorGroup,\n} from \"./slide-behavior-transforms\";\n\nexport { replaceLayoutBehavior, toggleCoverBehavior, toggleImageBehavior } from \"./slide-behavior-transforms\";\n\ntype EditingMode = \"simple\" | \"advanced\";\ntype LayoutEditingContext = \"default\" | \"slideshow\";\nexport type ExhibitionTemplateType = \"fullpage\" | \"slideshow\" | \"scroll\";\nexport type { LayoutPreset } from \"./slide-behavior-transforms\";\nexport type DisplayWidth = 12 | 8 | 6 | 4;\nexport type BackdropBehavior = \"\" | \"backdrop-light\" | \"backdrop-dark\";\n\nconst scrollBehaviors = new Set([\"scroll\", \"page-scroll\"]);\nconst scrollDisplayBehaviors = new Set([\n \"splash\",\n \"fixed\",\n \"invert\",\n \"backdrop-light\",\n \"backdrop-dark\",\n \"compact-deck\",\n]);\nexport const layoutPresetOptions: Array<{\n value: LayoutPreset;\n label: string;\n}> = [\n { value: \"image\", label: \"Image only\" },\n { value: \"top\", label: \"Text above image\" },\n { value: \"bottom\", label: \"Text below image\" },\n { value: \"left\", label: \"Text left of image\" },\n { value: \"right\", label: \"Text right of image\" },\n];\nexport const simpleLayoutColours = {\n primary: \"var(--exhibition-primary, #b84c74)\",\n fieldBorder: \"var(--exhibition-field-border, #dcd5ce)\",\n fieldBackground: \"var(--exhibition-field-bg, #f8f6f3)\",\n text: \"var(--exhibition-text, #25211f)\",\n muted: \"var(--exhibition-muted, #6a625c)\",\n buttonBackground: \"var(--exhibition-button-bg, #ffffff)\",\n buttonText: \"var(--exhibition-button-text, #ffffff)\",\n inactiveButtonText: \"var(--exhibition-inactive-button-text, #332f2c)\",\n};\nconst displayWidthOptions: Array<{\n value: DisplayWidth;\n label: string;\n}> = [\n { value: 12, label: \"Full width\" },\n { value: 8, label: \"2/3 width\" },\n { value: 6, label: \"Half width\" },\n { value: 4, label: \"1/3 width\" },\n];\nconst floatingBehaviors = new Set<FloatingBehavior>(floatingBehaviorOptions.map((option) => option.value));\nexport {\n FloatingPositionIcon,\n FloatingPositionPicker,\n floatingBehaviorOptions,\n floatingGridWithCenter,\n type FloatingBehavior,\n} from \"../components/FloatingPositionPicker\";\nconst layoutPanelModeStorageKey = \"exhibition-layout-panel-mode\";\n\nexport function hasScrollBehavior(behavior: string[]) {\n return behavior.some((item) => scrollBehaviors.has(item));\n}\n\nexport function hasCoverBehavior(behavior: string[]) {\n return behavior.some((item) => coverBehaviors.has(item));\n}\n\nexport function resolveExhibitionTemplateType(templateType?: string, appId?: string): ExhibitionTemplateType {\n if (templateType === \"slideshow\" || templateType === \"scroll\" || templateType === \"fullpage\") {\n return templateType;\n }\n if (appId === \"exhibition-slideshow-editor\") return \"slideshow\";\n if (appId === \"exhibition-scrolling-editor\") return \"scroll\";\n return \"fullpage\";\n}\n\nexport function getExhibitionTemplateControls(\n templateType: ExhibitionTemplateType,\n scrollEnabled = false,\n hasTourSteps = true,\n isOpeningCover = false,\n isImageSlide = true\n) {\n const scrollContext = templateType === \"scroll\" || scrollEnabled;\n const showGridSizing = templateType === \"fullpage\" && !scrollEnabled;\n const showFloating = templateType === \"slideshow\" || templateType === \"scroll\";\n const viewerSupportsImageCover = (templateType === \"fullpage\" && !scrollEnabled) || (scrollContext && hasTourSteps);\n\n return {\n showGridSizing: showGridSizing && !isOpeningCover,\n isSlideshow: templateType === \"slideshow\",\n showFloating: !isOpeningCover && (showFloating || scrollEnabled),\n showImageCover: isImageSlide && !isOpeningCover && viewerSupportsImageCover,\n showScrollToggle: !isOpeningCover && templateType === \"fullpage\",\n showScrollDisplay: templateType === \"slideshow\" || templateType === \"scroll\",\n showFixedCover: templateType === \"scroll\",\n showCoverBackdrop: false,\n scrollContext,\n layoutOptions: isOpeningCover\n ? []\n : scrollContext\n ? hasTourSteps\n ? [\n { value: \"left\" as const, label: \"Annotations on left\" },\n { value: \"right\" as const, label: \"Annotations on right\" },\n ]\n : []\n : layoutPresetOptions,\n };\n}\n\nexport function useExhibitionTemplateControls(behavior: string[] = [], hasTourSteps = true) {\n const app = useApp();\n const selectedTemplate = useExhibitionTemplate();\n return getExhibitionTemplateControls(\n resolveExhibitionTemplateType(selectedTemplate?.type, app.metadata.id),\n hasScrollBehavior(behavior),\n hasTourSteps,\n behavior.includes(\"splash\")\n );\n}\n\nexport const customBehaviourEditor: EditorDefinition = {\n component: () => <SlideBehavioursPanel />,\n supports: {\n edit: true,\n resourceTypes: [\"Canvas\"],\n properties: [\"behavior\"],\n custom: ({ resource }, vault) => {\n if (!isEditableExhibitionCanvas(resource as any, vault)) return false;\n // The standalone layout panel is not shown for textual-content (info box) canvases;\n // they get their own layout section inside the workbench editor.\n return !isInfoBoxCanvas(resource as any, vault);\n },\n },\n id: \"slide-behaviors\",\n label: \"Layout\",\n tabs: {\n showTitle: true,\n },\n};\n\nconst floatingConfig: BehaviorEditorProps[\"configs\"][number] = {\n id: \"floating\",\n type: \"choice\",\n label: { en: [\"Floating\"] },\n initialOpen: false,\n addNone: true,\n groupBehavior: \"floating\",\n items: floatingBehaviorOptions.map((option) => ({\n label: { en: [`Float ${option.label.toLowerCase()}`] },\n value: option.value,\n })),\n};\n\nconst sizeConfig: BehaviorEditorProps[\"configs\"][number] = {\n id: \"size\",\n component: (existing, setBehaviors) => <EditSize behaviors={existing} setBehaviors={setBehaviors} />,\n label: { en: [\"Size\"] },\n type: \"custom\",\n initialOpen: true,\n supports: (b) => b.startsWith(\"w-\") || b.startsWith(\"h-\"),\n};\n\nfunction BehaviorFlagCheckboxes({\n behaviors,\n setBehaviors,\n flags,\n}: {\n behaviors: string[];\n setBehaviors: (behaviors: string[]) => void;\n flags: Array<{\n value: string;\n label: string;\n aliases?: string[];\n group?: string[];\n clean?: (behaviors: string[], checked: boolean) => string[];\n }>;\n}) {\n const setFlag = (flag: (typeof flags)[number], checked: boolean) => {\n const blocked = new Set([flag.value, ...(flag.aliases || []), ...(flag.group || [])]);\n const next = toggleBehaviorGroup(behaviors, blocked, flag.value, checked);\n setBehaviors(flag.clean ? flag.clean(next, checked) : next);\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {flags.map((flag) => (\n <SimpleCheckbox\n key={flag.value}\n checked={behaviors.includes(flag.value) || Boolean(flag.aliases?.some((alias) => behaviors.includes(alias)))}\n label={flag.label}\n onChange={(checked) => setFlag(flag, checked)}\n />\n ))}\n </div>\n );\n}\n\nfunction LayoutBehaviorChoices({\n behaviors,\n setBehaviors,\n options,\n}: {\n behaviors: string[];\n setBehaviors: (behaviors: string[]) => void;\n options: Array<{ value: LayoutPreset; label: string }>;\n}) {\n const current = getLayoutPreset(behaviors);\n\n return (\n <div className=\"grid grid-cols-2 gap-2\">\n {options.map((option) => (\n <SimpleOptionButton\n key={option.value}\n selected={current === option.value && (option.value === \"image\" || behaviors.includes(option.value))}\n onClick={() => setBehaviors(replaceLayoutBehavior(behaviors, option.value))}\n >\n {option.label}\n </SimpleOptionButton>\n ))}\n </div>\n );\n}\n\nexport function getAdvancedExhibitionConfigs(\n templateType: ExhibitionTemplateType,\n behavior: string[] = [],\n isCoverCanvas = true,\n hasTourSteps = true,\n isImageSlide = true\n): BehaviorEditorProps[\"configs\"] {\n const controls = getExhibitionTemplateControls(\n templateType,\n hasScrollBehavior(behavior),\n hasTourSteps,\n behavior.includes(\"splash\") && isCoverCanvas,\n isImageSlide\n );\n const showCoverDisplay = controls.showScrollDisplay && isCoverCanvas;\n const configs: BehaviorEditorProps[\"configs\"] = [];\n\n if (controls.layoutOptions.length && !(controls.isSlideshow && hasFloatingBehavior(behavior))) {\n configs.push({\n id: \"layout\",\n type: \"custom\",\n label: { en: [\"Layout\"] },\n initialOpen: true,\n supports: (item) => layoutBehaviors.has(item),\n component: (existing, setBehaviors) => (\n <LayoutBehaviorChoices behaviors={existing} setBehaviors={setBehaviors} options={controls.layoutOptions} />\n ),\n });\n }\n\n if (controls.showScrollToggle) {\n configs.push({\n id: \"scroll\",\n type: \"custom\",\n label: { en: [\"Scrolling section\"] },\n initialOpen: false,\n supports: (b) => scrollBehaviors.has(b),\n component: (existing, setBehaviors) => (\n <BehaviorFlagCheckboxes\n behaviors={existing}\n setBehaviors={setBehaviors}\n flags={[\n {\n value: \"scroll\",\n label: \"Show as a scrolling section\",\n aliases: [\"page-scroll\"],\n clean: (next, checked) => (checked ? next.filter((item) => !isGridBehavior(item)) : next),\n },\n ]}\n />\n ),\n });\n }\n\n if (controls.showImageCover) {\n configs.push({\n id: \"display\",\n type: \"custom\",\n label: { en: [\"Display\"] },\n initialOpen: false,\n supports: (b) => coverBehaviors.has(b),\n component: (existing, setBehaviors) => (\n <BehaviorFlagCheckboxes\n behaviors={existing}\n setBehaviors={setBehaviors}\n flags={[\n {\n value: \"cover\",\n label: \"Crop image to fill its frame\",\n aliases: [\"image-cover\"],\n },\n ]}\n />\n ),\n });\n }\n\n if (showCoverDisplay) {\n configs.push({\n id: \"cover\",\n type: \"custom\",\n label: { en: [\"Cover\"] },\n initialOpen: false,\n supports: (b) => scrollDisplayBehaviors.has(b),\n component: (existing, setBehaviors) => (\n <BehaviorFlagCheckboxes\n behaviors={existing}\n setBehaviors={setBehaviors}\n flags={[\n { value: \"splash\", label: \"Use as opening cover\" },\n ...(controls.showFixedCover ? [{ value: \"fixed\", label: \"Keep image fixed while scrolling\" }] : []),\n { value: \"invert\", label: \"Use light text\" },\n ]}\n />\n ),\n });\n }\n\n if (controls.showFloating) {\n configs.push(floatingConfig);\n }\n if (controls.showGridSizing) {\n configs.push(sizeConfig);\n }\n\n return configs;\n}\n\nexport function RoundGridIcon(props: { index: number } & React.SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n {/* Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE */}\n <path\n fill={props.index === 0 ? \"currentColor\" : \"none\"}\n stroke=\"currentColor\"\n d=\"M5 11h4c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v4c0 1.1.9 2 2 2\"\n />\n <path\n fill={props.index === 1 ? \"currentColor\" : \"none\"}\n stroke=\"currentColor\"\n d=\"M5 21h4c1.1 0 2-.9 2-2v-4c0-1.1-.9-2-2-2H5c-1.1 0-2 .9-2 2v4c0 1.1.9 2 2 2\"\n />\n <path\n fill={props.index === 2 ? \"currentColor\" : \"none\"}\n stroke=\"currentColor\"\n d=\"M13 5v4c0 1.1.9 2 2 2h4c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-4c-1.1 0-2 .9-2 2\"\n />\n <path\n fill={props.index === 3 ? \"currentColor\" : \"none\"}\n stroke=\"currentColor\"\n d=\"M15 21h4c1.1 0 2-.9 2-2v-4c0-1.1-.9-2-2-2h-4c-1.1 0-2 .9-2 2v4c0 1.1.9 2 2 2\"\n />\n </svg>\n );\n}\n\nfunction parseBehaviors(items: string[]) {\n let width = 0;\n let height = 0;\n\n for (const item of items) {\n if (item.startsWith(\"w-\")) {\n width = Number.parseInt(item.slice(2));\n }\n if (item.startsWith(\"h-\")) {\n height = Number.parseInt(item.slice(2));\n }\n }\n\n return {\n width,\n height,\n };\n}\n\nexport function EditSize({\n behaviors,\n setBehaviors,\n}: {\n behaviors: string[];\n setBehaviors: (behaviors: string[]) => void;\n}) {\n const { width, height } = parseBehaviors(behaviors);\n const [hoverPosition, setHoverPosition] = useState({ x: -1, y: -1 });\n\n const setBehavior = (w: number, h: number) => {\n const newBehaviors = behaviors.filter((b) => {\n return !b.startsWith(\"w-\") && !b.startsWith(\"h-\");\n });\n\n newBehaviors.push(`w-${w}`);\n newBehaviors.push(`h-${h}`);\n\n setBehaviors(newBehaviors);\n };\n\n const cells = Array.from({ length: 144 }, (_, i) => {\n const x = i % 12;\n const y = Math.floor(i / 12);\n const hovered = hoverPosition.x >= x && hoverPosition.y >= y;\n const selected = x < width && y < height;\n const hoveredAndSelected = hovered && selected;\n\n let bgClass = \"bg-gray-200\";\n if (hovered) {\n bgClass = \"bg-me-200\";\n }\n if (selected) {\n bgClass = \"bg-me-500\";\n }\n if (hoveredAndSelected) {\n bgClass = \"bg-me-400\";\n }\n\n return (\n // oxlint-disable-next-line jsx-a11y/click-events-have-key-events -- Existing interaction behavior.\n <div\n key={i}\n className={`flex aspect-square rounded cursor-se-resize items-center justify-center ${bgClass}`}\n onClick={() => setBehavior(x + 1, y + 1)}\n onMouseUp={() => setBehavior(x + 1, y + 1)}\n onMouseEnter={() => setHoverPosition({ x, y })}\n />\n );\n });\n\n return (\n <div className=\"grid grid-cols-12 grid-rows-12 gap-1\" onMouseLeave={() => setHoverPosition({ x: -1, y: -1 })}>\n {cells}\n </div>\n );\n}\n\nexport function SlideBehavioursPanel() {\n const [mode, setMode] = useLocalStorage<EditingMode>(layoutPanelModeStorageKey, \"simple\");\n const setCenterPanelMode = useSlideshowWorkbenchState((state) => state.setCenterPanelMode);\n\n useEffect(() => {\n setCenterPanelMode(\"preview\");\n }, [setCenterPanelMode]);\n\n return (\n <Sidebar>\n <SidebarContent className=\"bg-white px-6 pt-5 pb-20\">\n <div className=\"mb-6 flex justify-center\">\n <SimpleAdvancedToggle value={mode} onChange={setMode} />\n </div>\n <SlideBehavioursContent mode={mode} />\n </SidebarContent>\n </Sidebar>\n );\n}\n\nexport function SlideBehavioursContent({\n mode = \"advanced\",\n layoutContext = \"default\",\n}: {\n mode?: EditingMode;\n layoutContext?: LayoutEditingContext;\n}) {\n const canvas = useInStack(\"Canvas\");\n const currentCanvas = useCanvas();\n const editor = useEditor();\n const app = useApp();\n const vault = useVault();\n const manifest = useManifest();\n const selectedTemplate = useExhibitionTemplate();\n const templateType = resolveExhibitionTemplateType(\n selectedTemplate?.type,\n layoutContext === \"slideshow\" ? \"exhibition-slideshow-editor\" : app.metadata.id\n );\n const { width, height } = editor.technical;\n const behavior = editor.technical.behavior.get() || [];\n const hasTourSteps = useVaultSelector(\n (_, vaultInstance) => (currentCanvas ? getTourStepAnnotations(vaultInstance, currentCanvas).length > 0 : false),\n [currentCanvas?.id, currentCanvas?.annotations?.[0]?.id]\n );\n const isImageSlide = Boolean(currentCanvas && isImageCanvas(vault, currentCanvas));\n const isCoverCanvas = Boolean(currentCanvas && manifestFirstCanvasId(manifest) === currentCanvas.id && isImageSlide);\n const controls = getExhibitionTemplateControls(\n templateType,\n hasScrollBehavior(behavior),\n hasTourSteps,\n behavior.includes(\"splash\") && isCoverCanvas,\n isImageSlide\n );\n\n if (!canvas || editor.technical.type !== \"Canvas\") {\n return <div className=\"p-4\">Please select canvas</div>;\n }\n\n if (mode === \"simple\") {\n return (\n <SimpleSlideLayoutEditor\n behavior={editor.technical.behavior.get() || []}\n controls={controls}\n canvasWidth={width.get() || 0}\n canvasHeight={height.get() || 0}\n onChange={(v) => {\n editor.technical.behavior.set(v);\n }}\n />\n );\n }\n\n return (\n <>\n <div className=\"px-2\">\n <InputContainer $wide>\n <DimensionsTriplet\n widthId={width.containerId()}\n width={width.get() || 0}\n changeWidth={(v) => width.set(v)}\n heightId={height.containerId()}\n height={height.get() || 0}\n changeHeight={(v) => height.set(v)}\n />\n <div>\n <AspectRatioWarning />\n </div>\n </InputContainer>\n </div>\n\n <BehaviorEditor\n behavior={editor.technical.behavior.get() || []}\n onChange={(v) => {\n editor.technical.behavior.set(v);\n }}\n configs={getAdvancedExhibitionConfigs(templateType, behavior, isCoverCanvas, hasTourSteps, isImageSlide)}\n />\n\n <ExhibitionThumbnailEditor />\n </>\n );\n}\n\nfunction SimpleSlideLayoutEditor({\n behavior,\n controls,\n canvasWidth,\n canvasHeight,\n onChange,\n}: {\n behavior: string[];\n controls: ReturnType<typeof getExhibitionTemplateControls>;\n canvasWidth: number;\n canvasHeight: number;\n onChange: (newValue: string[]) => void;\n}) {\n const layoutPreset = getLayoutPreset(behavior);\n const displayWidth = controls.showGridSizing ? getDisplayWidth(behavior) : 12;\n const floating = hasFloatingBehavior(behavior);\n const floatingBehavior = getFloatingBehavior(behavior);\n const cover = hasCoverBehavior(behavior);\n const scrollEnabled = hasScrollBehavior(behavior);\n const splash = behavior.includes(\"splash\");\n const fixed = behavior.includes(\"fixed\");\n const invert = behavior.includes(\"invert\");\n const backdrop: BackdropBehavior = behavior.includes(\"backdrop-dark\")\n ? \"backdrop-dark\"\n : behavior.includes(\"backdrop-light\")\n ? \"backdrop-light\"\n : \"\";\n const requestWorkbenchTab = useSlideshowWorkbenchState((state) => state.requestTab);\n const canvas = useCanvas();\n const vault = useVault();\n const manifest = useManifest();\n const selectedWidth = controls.showGridSizing ? displayWidth : 12;\n const previewHeight = getDerivedHeight({\n canvasWidth,\n canvasHeight,\n layoutPreset,\n displayWidth: selectedWidth,\n });\n\n const fitSuggestion =\n controls.showGridSizing && manifest?.items && canvas\n ? computeFitWidth(canvas.id, manifest.items as Array<{ id: string }>, vault)\n : null;\n const isCoverCanvas = Boolean(\n canvas && manifestFirstCanvasId(manifest) === canvas.id && isImageCanvas(vault, canvas)\n );\n\n const applySettings = (next: {\n layoutPreset?: LayoutPreset;\n displayWidth?: DisplayWidth;\n floating?: boolean;\n floatingBehavior?: FloatingBehavior;\n cover?: boolean;\n scrollEnabled?: boolean;\n splash?: boolean;\n fixed?: boolean;\n invert?: boolean;\n backdrop?: BackdropBehavior;\n }) => {\n const nextLayoutPreset = controls.layoutOptions.length ? (next.layoutPreset ?? layoutPreset) : undefined;\n const nextDisplayWidth = controls.showGridSizing ? (next.displayWidth ?? displayWidth) : 12;\n const nextFloating = next.floating ?? floating;\n const nextFloatingBehavior = next.floatingBehavior ?? floatingBehavior;\n const nextCover = next.cover ?? cover;\n const nextScrollEnabled = next.scrollEnabled ?? scrollEnabled;\n const nextSplash = next.splash ?? splash;\n const nextFixed = next.fixed ?? fixed;\n const nextInvert = next.invert ?? invert;\n const nextBackdrop = next.backdrop ?? backdrop;\n onChange(\n buildSimpleLayoutBehaviors({\n behavior,\n layoutPreset: nextLayoutPreset,\n displayWidth: nextDisplayWidth,\n canvasWidth,\n canvasHeight,\n floating: nextFloating,\n floatingBehavior: nextFloatingBehavior,\n cover: nextCover,\n scrollEnabled: nextScrollEnabled,\n splash: nextSplash,\n fixed: controls.showFixedCover && nextFixed,\n invert: nextInvert,\n backdrop: controls.showCoverBackdrop ? nextBackdrop : \"\",\n showGridSizing: controls.showGridSizing && !nextScrollEnabled,\n showFloating: controls.showFloating,\n showImageCover: controls.showImageCover,\n showScrollToggle: controls.showScrollToggle,\n showScrollDisplay: controls.showScrollDisplay && isCoverCanvas,\n })\n );\n\n if (canvas && nextLayoutPreset) {\n injectTextPlaceholders(vault, canvas, nextLayoutPreset);\n }\n };\n\n return (\n <div className=\"flex flex-col gap-7\">\n <SimpleLayoutPreview\n layoutPreset={layoutPreset}\n cover={cover}\n floating={floating}\n width={selectedWidth}\n height={previewHeight}\n showGridSizing={controls.showGridSizing}\n onTextClick={() => requestWorkbenchTab(\"summary\")}\n />\n\n {controls.layoutOptions.length && !(controls.isSlideshow && floating) ? (\n <SimpleField>\n <SimpleFieldLabel>Text placement</SimpleFieldLabel>\n <div className=\"mt-3 grid grid-cols-2 gap-3\">\n {controls.layoutOptions.map((option) => (\n <LayoutPresetCard\n key={option.value}\n preset={option.value}\n label={option.label}\n selected={layoutPreset === option.value}\n onClick={() => applySettings({ layoutPreset: option.value })}\n />\n ))}\n </div>\n </SimpleField>\n ) : null}\n\n {controls.showGridSizing ? (\n <SimpleField>\n <SimpleFieldLabel>Width</SimpleFieldLabel>\n <div className=\"mt-3 grid grid-cols-2 gap-3\">\n {displayWidthOptions.map((option) => (\n <SimpleOptionButton\n key={option.value}\n selected={displayWidth === option.value}\n onClick={() => applySettings({ displayWidth: option.value })}\n >\n {option.label}\n </SimpleOptionButton>\n ))}\n </div>\n </SimpleField>\n ) : null}\n\n {fitSuggestion ? (\n <SimpleField>\n <SimpleFieldLabel>Fit alongside {fitSuggestion.neighbour} slide</SimpleFieldLabel>\n <div className=\"mt-3\">\n <SimpleOptionButton\n selected={displayWidth === fitSuggestion.width}\n onClick={() =>\n applySettings({\n displayWidth: fitSuggestion.width as DisplayWidth,\n })\n }\n >\n w-{fitSuggestion.width} — fills remaining space\n </SimpleOptionButton>\n </div>\n </SimpleField>\n ) : null}\n\n <div className=\"flex flex-col gap-3\">\n {controls.showScrollToggle ? (\n <SimpleCheckbox\n checked={scrollEnabled}\n label=\"Show as a scrolling section\"\n onChange={(checked) => applySettings({ scrollEnabled: checked })}\n />\n ) : null}\n {controls.showFloating ? (\n <SimpleCheckbox\n checked={floating}\n label=\"Overlay text on the image\"\n onChange={(checked) => applySettings({ floating: checked })}\n />\n ) : null}\n {controls.isSlideshow && floating ? (\n <SimpleField>\n <SimpleFieldLabel>Text overlay position</SimpleFieldLabel>\n <div className=\"mt-3\">\n <FloatingPositionPicker\n value={floatingBehavior}\n onChange={(next) => {\n if (next) {\n applySettings({ floatingBehavior: next });\n } else {\n applySettings({ floating: false });\n }\n }}\n />\n </div>\n </SimpleField>\n ) : null}\n {controls.showImageCover ? (\n <SimpleCheckbox\n checked={cover}\n label=\"Crop image to fill its frame\"\n onChange={(checked) => applySettings({ cover: checked })}\n />\n ) : null}\n {controls.showScrollDisplay && isCoverCanvas ? (\n <SimpleField>\n <SimpleFieldLabel>Cover</SimpleFieldLabel>\n <div className=\"mt-3 flex flex-col gap-3\">\n <SimpleCheckbox\n checked={splash}\n label=\"Use as opening cover\"\n onChange={(checked) => applySettings({ splash: checked })}\n />\n {controls.showFixedCover ? (\n <SimpleCheckbox\n checked={fixed}\n label=\"Keep image fixed while scrolling\"\n onChange={(checked) => applySettings({ fixed: checked })}\n />\n ) : null}\n <SimpleCheckbox\n checked={invert}\n label=\"Use light text\"\n onChange={(checked) => applySettings({ invert: checked })}\n />\n {controls.showCoverBackdrop ? (\n <SimpleField>\n <SimpleFieldLabel>Backdrop</SimpleFieldLabel>\n <div className=\"mt-3 grid grid-cols-3 gap-2\">\n {[\n { value: \"\" as const, label: \"Default\" },\n { value: \"backdrop-light\" as const, label: \"Light\" },\n { value: \"backdrop-dark\" as const, label: \"Dark\" },\n ].map((option) => (\n <SimpleOptionButton\n key={option.value || \"default\"}\n selected={backdrop === option.value}\n onClick={() => applySettings({ backdrop: option.value })}\n >\n {option.label}\n </SimpleOptionButton>\n ))}\n </div>\n </SimpleField>\n ) : null}\n </div>\n </SimpleField>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction SimpleLayoutPreview({\n layoutPreset,\n cover,\n floating,\n width,\n height,\n showGridSizing,\n onTextClick,\n}: {\n layoutPreset: LayoutPreset;\n cover: boolean;\n floating: boolean;\n width: DisplayWidth;\n height: number;\n showGridSizing: boolean;\n onTextClick: () => void;\n}) {\n const isBottom = layoutPreset === \"bottom\";\n const isImage = layoutPreset === \"image\";\n const isLeft = layoutPreset === \"left\";\n\n return (\n <div>\n <div\n className=\"relative mx-auto overflow-hidden rounded-md border bg-[#f8f6f3] shadow-sm\"\n style={{\n width: `${Math.max(33, Math.round((width / 12) * 100))}%`,\n aspectRatio: `${width} / ${height}`,\n borderColor: simpleLayoutColours.fieldBorder,\n }}\n >\n <div\n className={twMerge(\n \"flex h-full w-full min-h-0\",\n isLeft ? \"flex-row-reverse\" : isBottom ? \"flex-col\" : \"flex-row\"\n )}\n >\n <div className=\"relative min-h-0 flex-1 overflow-hidden bg-white\">\n <div className=\"absolute inset-0\">\n <LazyThumbnail cover={cover} fade={false} />\n </div>\n </div>\n {isImage ? null : (\n <button\n type=\"button\"\n aria-label=\"Edit slide text\"\n className={twMerge(\n \"flex-shrink-0 border-0 bg-[#25211f] p-3 text-left text-white transition-colors hover:bg-[#332f2c] focus:outline-none focus:ring-2 focus:ring-me-primary-500 focus:ring-offset-2\",\n isBottom ? \"h-1/3 w-full\" : \"h-full w-1/3\"\n )}\n onClick={onTextClick}\n >\n <TextLines tone=\"light\" />\n </button>\n )}\n </div>\n {floating ? (\n <div className=\"absolute right-2 top-2 h-7 w-10 rounded bg-white/90 shadow ring-1 ring-black/10\" />\n ) : null}\n </div>\n {showGridSizing ? (\n <div className=\"mt-2 text-center text-xs\" style={{ color: simpleLayoutColours.muted }}>\n w-{width} h-{height}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function LayoutPresetCard({\n preset,\n label,\n selected,\n onClick,\n}: {\n preset: LayoutPreset;\n label: string;\n selected: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n aria-pressed={selected}\n className=\"flex min-h-[112px] flex-col items-center justify-center gap-3 rounded-md border px-3 py-4 text-center text-sm font-semibold transition-colors\"\n style={{\n backgroundColor: selected ? simpleLayoutColours.primary : simpleLayoutColours.buttonText,\n borderColor: selected ? simpleLayoutColours.primary : simpleLayoutColours.fieldBorder,\n color: selected ? simpleLayoutColours.buttonText : simpleLayoutColours.inactiveButtonText,\n }}\n onClick={onClick}\n >\n <LayoutPresetIcon preset={preset} selected={selected} />\n <span className=\"leading-tight\">{label}</span>\n </button>\n );\n}\n\nfunction LayoutPresetIcon({ preset, selected }: { preset: LayoutPreset; selected: boolean }) {\n const isImage = preset === \"image\";\n const isBottom = preset === \"bottom\";\n const isTop = preset === \"top\";\n const isLeft = preset === \"left\";\n const textClass = selected ? \"bg-white/80\" : \"bg-[#25211f]\";\n const imageClass = selected ? \"bg-white/25 ring-white/70\" : \"bg-[#f8f6f3] ring-[#dcd5ce]\";\n\n return (\n <span\n className={twMerge(\n \"flex h-12 w-16 gap-1 overflow-hidden rounded border p-1\",\n selected ? \"border-white/70 bg-white/15\" : \"border-[#dcd5ce] bg-white\",\n isLeft ? \"flex-row-reverse\" : isBottom ? \"flex-col\" : isTop ? \"flex-col-reverse\" : \"flex-row\"\n )}\n aria-hidden=\"true\"\n >\n <span className={twMerge(\"flex-1 rounded-sm ring-1\", imageClass)} />\n {isImage ? null : (\n <span\n className={twMerge(\n \"flex flex-shrink-0 flex-col justify-center gap-0.5 rounded-sm px-0.5\",\n textClass,\n isBottom || isTop ? \"h-3 w-full\" : \"h-full w-4\"\n )}\n >\n <TextLines compact tone={selected ? \"dark\" : \"light\"} />\n </span>\n )}\n </span>\n );\n}\n\nfunction TextLines({ compact = false, tone = \"light\" }: { compact?: boolean; tone?: \"light\" | \"dark\" }) {\n const lineClass = tone === \"light\" ? \"bg-white/70\" : \"bg-[#8b3f61]/70\";\n\n return (\n <span className={twMerge(\"block space-y-1.5\", compact ? \"space-y-0.5\" : \"mt-1\")} aria-hidden=\"true\">\n <span className={twMerge(\"block rounded\", lineClass, compact ? \"h-0.5 w-full\" : \"h-1.5 w-3/4\")} />\n <span className={twMerge(\"block rounded\", lineClass, compact ? \"h-0.5 w-4/5\" : \"h-1.5 w-full\")} />\n <span className={twMerge(\"block rounded\", lineClass, compact ? \"h-0.5 w-2/3\" : \"h-1.5 w-2/3\")} />\n </span>\n );\n}\n\nexport function SimpleOptionButton({\n selected,\n onClick,\n children,\n title,\n}: {\n selected: boolean;\n onClick: () => void;\n children: React.ReactNode;\n title?: string;\n}) {\n return (\n <button\n type=\"button\"\n title={title}\n aria-pressed={selected}\n className=\"flex min-h-11 items-center justify-center gap-1.5 rounded-md border px-3 py-2 text-sm font-semibold transition-colors\"\n style={{\n backgroundColor: selected ? simpleLayoutColours.primary : simpleLayoutColours.buttonText,\n borderColor: selected ? simpleLayoutColours.primary : simpleLayoutColours.fieldBorder,\n color: selected ? simpleLayoutColours.buttonText : simpleLayoutColours.inactiveButtonText,\n boxShadow: selected ? `0 0 0 2px ${simpleLayoutColours.primary}33` : undefined,\n }}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n\nexport function SimpleCheckbox({\n checked,\n label,\n onChange,\n}: {\n checked: boolean;\n label: string;\n onChange: (checked: boolean) => void;\n}) {\n return (\n <label\n className=\"flex items-center justify-between rounded-md border px-4 py-3 text-sm font-semibold\"\n style={{\n backgroundColor: simpleLayoutColours.fieldBackground,\n borderColor: simpleLayoutColours.fieldBorder,\n color: simpleLayoutColours.text,\n }}\n >\n {label}\n <input\n type=\"checkbox\"\n className=\"h-4 w-4 accent-me-primary-500\"\n checked={checked}\n onChange={(e) => onChange(e.currentTarget.checked)}\n />\n </label>\n );\n}\n\nexport function SimpleAdvancedToggle({\n value,\n onChange,\n}: {\n value: EditingMode;\n onChange: (value: EditingMode) => void;\n}) {\n return (\n <div\n role=\"group\"\n aria-label=\"Editing mode\"\n className=\"grid w-full max-w-[240px] grid-cols-2 rounded-full bg-[#f5eaf0] p-1\"\n >\n {([\"simple\", \"advanced\"] as EditingMode[]).map((option) => {\n const selected = value === option;\n\n return (\n <Button\n key={option}\n aria-pressed={selected}\n className=\"border-none rounded-full bg-transparent px-4 py-2 text-sm font-semibold capitalize transition-colors\"\n style={{\n backgroundColor: selected ? simpleLayoutColours.primary : \"transparent\",\n color: selected ? \"#ffffff\" : \"#8b3f61\",\n boxShadow: selected ? \"0 1px 3px rgba(15, 23, 42, 0.18)\" : \"none\",\n }}\n onPress={() => onChange(option)}\n >\n {option}\n </Button>\n );\n })}\n </div>\n );\n}\n\nexport function SimpleField({ children }: { children: React.ReactNode }) {\n return <div>{children}</div>;\n}\n\nexport function SimpleFieldLabel({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"text-sm font-semibold\" style={{ color: simpleLayoutColours.muted }}>\n {children}\n </div>\n );\n}\n\nexport function getLayoutPreset(behavior: string[]): LayoutPreset {\n if (behavior.includes(\"left\")) return \"left\";\n if (behavior.includes(\"top\")) return \"top\";\n if (behavior.includes(\"bottom\")) return \"bottom\";\n if (behavior.includes(\"right\")) return \"right\";\n if (behavior.includes(\"image\")) return \"image\";\n return \"image\";\n}\n\nexport function buildLayoutPresetBehaviors(\n behavior: string[],\n layoutPreset: LayoutPreset,\n canvasDimensions?: { width: number; height: number }\n) {\n const next = replaceLayoutBehavior(behavior, layoutPreset);\n if (canvasDimensions?.width && canvasDimensions?.height) {\n const { width: parsedWidth } = parseBehaviors(behavior);\n const displayWidth: DisplayWidth = parsedWidth\n ? parsedWidth <= 4\n ? 4\n : parsedWidth <= 6\n ? 6\n : parsedWidth <= 8\n ? 8\n : 12\n : 12;\n const newHeight = getDerivedHeight({\n canvasWidth: canvasDimensions.width,\n canvasHeight: canvasDimensions.height,\n layoutPreset,\n displayWidth,\n });\n // Replace existing h- behavior with recalculated one\n const withoutH = next.filter((item) => !item.startsWith(\"h-\"));\n withoutH.push(`h-${newHeight}`);\n return withoutH;\n }\n return next;\n}\n\nfunction getDisplayWidth(behavior: string[]): DisplayWidth {\n const { width } = parseBehaviors(behavior);\n\n if (!width) return 12;\n if (width <= 4) return 4;\n if (width <= 6) return 6;\n if (width <= 8) return 8;\n return 12;\n}\n\nexport function hasFloatingBehavior(behavior: string[]) {\n return behavior.includes(\"floating\") || behavior.some((item) => floatingBehaviors.has(item as FloatingBehavior));\n}\n\nexport function getFloatingBehavior(behavior: string[]): FloatingBehavior {\n return (\n behavior.find((item): item is FloatingBehavior => floatingBehaviors.has(item as FloatingBehavior)) ||\n \"float-top-right\"\n );\n}\n\nexport function updateFloatingBehavior(behavior: string[], position: \"\" | FloatingBehavior) {\n const next = behavior.filter((item) => item !== \"floating\" && !floatingBehaviors.has(item as FloatingBehavior));\n return position ? [...next, position] : next;\n}\n\nexport function buildSimpleLayoutBehaviors({\n behavior,\n layoutPreset,\n displayWidth,\n canvasWidth,\n canvasHeight,\n floating,\n floatingBehavior,\n cover,\n scrollEnabled,\n splash,\n fixed,\n invert,\n backdrop,\n showGridSizing,\n showFloating,\n showImageCover,\n showScrollToggle,\n showScrollDisplay,\n}: {\n behavior: string[];\n layoutPreset?: LayoutPreset;\n displayWidth: DisplayWidth;\n canvasWidth: number;\n canvasHeight: number;\n floating: boolean;\n floatingBehavior?: FloatingBehavior;\n cover: boolean;\n scrollEnabled: boolean;\n splash: boolean;\n fixed: boolean;\n invert: boolean;\n backdrop: BackdropBehavior;\n showGridSizing: boolean;\n showFloating: boolean;\n showImageCover: boolean;\n showScrollToggle: boolean;\n showScrollDisplay: boolean;\n}) {\n let next = behavior.filter((item) => {\n if ((showGridSizing || scrollEnabled) && isGridBehavior(item)) return false;\n if (showFloating && (item === \"floating\" || floatingBehaviors.has(item as FloatingBehavior))) return false;\n if (showImageCover && coverBehaviors.has(item)) return false;\n if (showScrollToggle && scrollBehaviors.has(item)) return false;\n if (showScrollDisplay && scrollDisplayBehaviors.has(item)) return false;\n return true;\n });\n\n if (layoutPreset) {\n next = replaceLayoutBehavior(next, layoutPreset);\n }\n\n if (showScrollToggle && scrollEnabled) {\n next.push(\"scroll\");\n }\n\n if (showGridSizing) {\n const height = getDerivedHeight({\n canvasWidth,\n canvasHeight,\n layoutPreset: layoutPreset || \"image\",\n displayWidth,\n });\n next.push(`w-${displayWidth}`, `h-${height}`);\n }\n\n if (showFloating && floating) {\n next.push(floatingBehavior || \"float-top-right\");\n }\n\n if (showImageCover && cover) {\n next.push(\"cover\");\n }\n\n if (showScrollDisplay) {\n if (splash) next.push(\"splash\");\n if (fixed) next.push(\"fixed\");\n if (invert) next.push(\"invert\");\n if (backdrop) next.push(backdrop);\n }\n\n return next;\n}\n\nfunction isGridBehavior(item: string) {\n return item.startsWith(\"w-\") || item.startsWith(\"h-\") || item.startsWith(\"start-\");\n}\n\nfunction manifestFirstCanvasId(manifest: any) {\n return manifest?.items?.[0]?.id;\n}\n\nfunction isImageCanvas(vault: any, canvas: any) {\n if (!canvas || canvas.behavior?.includes(\"info\")) return false;\n\n return getPaintingAnnotations(vault, canvas).some((annotation: any) => {\n const body = getResolvedAnnotationBody(vault, annotation);\n const source = body?.type === \"SpecificResource\" ? body.source : body;\n const services = Array.isArray(source?.service) ? source.service : source?.service ? [source.service] : [];\n return source?.type === \"Image\" || services.length > 0;\n });\n}\n\nexport function getDerivedHeight({\n canvasWidth,\n canvasHeight,\n layoutPreset,\n displayWidth,\n}: {\n canvasWidth: number;\n canvasHeight: number;\n layoutPreset: LayoutPreset;\n displayWidth: DisplayWidth;\n}) {\n const ratio = canvasWidth && canvasHeight ? canvasWidth / canvasHeight : 1.5;\n const effectiveWidth = layoutPreset === \"left\" || layoutPreset === \"right\" ? displayWidth * (2 / 3) : displayWidth;\n const textHeightMultiplier = layoutPreset === \"bottom\" ? 3 / 2 : 1;\n const height = Math.round((effectiveWidth / ratio) * textHeightMultiplier);\n\n return Math.max(1, Math.min(12, height));\n}\n\n// ─── Textual-content (info-box) layout editor ───────────────────────────────\n\nexport const textualWidthOptions: Array<{ value: DisplayWidth; label: string }> = [\n { value: 4, label: \"1/3 width\" },\n { value: 6, label: \"Half width\" },\n { value: 8, label: \"2/3 width\" },\n { value: 12, label: \"Full width\" },\n];\n\n/** Returns the w-* value (1-12) parsed from a behavior array, or 0 if absent. */\nexport function getBehaviorWidth(behavior: string[]): number {\n const { width } = parseBehaviors(behavior);\n return width;\n}\n\n/**\n * When there is a gap in the 12-column grid caused by the surrounding canvases,\n * return a suggested width that fills the gap. Returns null if no gap exists or\n * the canvas has no immediate neighbours with known widths.\n *\n * A \"gap\" means that a single neighbouring canvas (prev or next) uses less than\n * the full 12 columns, so this canvas could sit beside it. We only offer the fit\n * value when the gap is non-trivial (i.e. the neighbour width is between 4 and 8\n * and is one of the standard snap values).\n */\nexport function computeFitWidth(\n currentCanvasId: string,\n manifestItems: Array<{ id: string }>,\n vault: ReturnType<typeof useVault>\n): { width: number; neighbour: \"previous\" | \"next\" } | null {\n const idx = manifestItems.findIndex((c) => c.id === currentCanvasId);\n if (idx === -1) return null;\n\n const getWidth = (canvasRef: { id: string } | undefined): number => {\n if (!canvasRef) return 0;\n try {\n const c = vault.get(canvasRef as any) as any;\n return getBehaviorWidth(c?.behavior || []);\n } catch {\n return 0;\n }\n };\n\n const prevWidth = getWidth(manifestItems[idx - 1]);\n const nextWidth = getWidth(manifestItems[idx + 1]);\n\n // Check if the previous canvas leaves a gap (and next slot isn't already filled)\n if (prevWidth > 0 && prevWidth < 12) {\n const gap = 12 - prevWidth;\n if (gap >= 4) {\n return { width: gap as DisplayWidth, neighbour: \"previous\" };\n }\n }\n\n // Check if the next canvas leaves a gap\n if (nextWidth > 0 && nextWidth < 12) {\n const gap = 12 - nextWidth;\n if (gap >= 4) {\n return { width: gap as DisplayWidth, neighbour: \"next\" };\n }\n }\n\n return null;\n}\n\nexport function TextualContentLayoutEditor() {\n const [mode, setMode] = useLocalStorage<EditingMode>(layoutPanelModeStorageKey, \"simple\");\n const canvas = useCanvas();\n const vault = useVault();\n const manifest = useManifest();\n const editor = useEditor();\n const controls = useExhibitionTemplateControls();\n\n if (!canvas || editor.technical.type !== \"Canvas\") {\n return <div className=\"p-4\">Please select canvas</div>;\n }\n\n const behavior = editor.technical.behavior.get() || [];\n const currentWidth = (getBehaviorWidth(behavior) as DisplayWidth) || 12;\n\n const setWidth = (w: DisplayWidth) => {\n const next = behavior.filter((b) => !b.startsWith(\"w-\") && !b.startsWith(\"h-\"));\n // Keep h- if present, otherwise default to h-4 for text boxes\n const existingH = behavior.find((b) => b.startsWith(\"h-\"));\n next.push(`w-${w}`);\n if (!existingH) next.push(\"h-4\");\n editor.technical.behavior.set(next);\n };\n\n const fitSuggestion =\n controls.showGridSizing && manifest?.items && canvas\n ? computeFitWidth(canvas.id, manifest.items as Array<{ id: string }>, vault)\n : null;\n\n return (\n <div className=\"flex flex-col gap-6\">\n <div className=\"flex justify-center\">\n <SimpleAdvancedToggle value={mode} onChange={setMode} />\n </div>\n\n {mode === \"simple\" && controls.showGridSizing ? (\n <>\n <SimpleField>\n <SimpleFieldLabel>Width</SimpleFieldLabel>\n <div className=\"mt-3 grid grid-cols-2 gap-3\">\n {textualWidthOptions.map((option) => (\n <SimpleOptionButton\n key={option.value}\n selected={currentWidth === option.value}\n onClick={() => setWidth(option.value)}\n >\n {option.label}\n </SimpleOptionButton>\n ))}\n </div>\n </SimpleField>\n\n {fitSuggestion ? (\n <SimpleField>\n <SimpleFieldLabel>Fit alongside {fitSuggestion.neighbour} slide</SimpleFieldLabel>\n <div className=\"mt-3\">\n <SimpleOptionButton\n selected={currentWidth === fitSuggestion.width}\n onClick={() => setWidth(fitSuggestion.width as DisplayWidth)}\n >\n w-{fitSuggestion.width} — fills remaining space\n </SimpleOptionButton>\n </div>\n </SimpleField>\n ) : null}\n\n <div className=\"mt-1 text-center text-xs\" style={{ color: simpleLayoutColours.muted }}>\n w-{currentWidth}\n </div>\n </>\n ) : mode === \"advanced\" ? (\n <>\n <div className=\"px-2\">\n <InputContainer $wide>\n <DimensionsTriplet\n widthId={editor.technical.width.containerId()}\n width={editor.technical.width.get() || 0}\n changeWidth={(v) => editor.technical.width.set(v)}\n heightId={editor.technical.height.containerId()}\n height={editor.technical.height.get() || 0}\n changeHeight={(v) => editor.technical.height.set(v)}\n />\n </InputContainer>\n </div>\n\n {controls.showGridSizing ? (\n <BehaviorEditor\n behavior={behavior}\n onChange={(v) => editor.technical.behavior.set(v)}\n configs={[\n {\n id: \"size\",\n component: (existing, setBehaviors) => <EditSize behaviors={existing} setBehaviors={setBehaviors} />,\n label: { en: [\"Size\"] },\n type: \"custom\",\n initialOpen: true,\n supports: (b) => b.startsWith(\"w-\") || b.startsWith(\"h-\"),\n },\n ]}\n />\n ) : null}\n </>\n ) : null}\n </div>\n );\n}\n\nconst TEXT_LAYOUTS = new Set<LayoutPreset>([\"left\", \"right\", \"bottom\", \"top\"]);\n\n/**\n * When switching to a layout that shows an editorial text panel, ensure the\n * canvas has at least a placeholder label and summary so the panel is visible\n * and editable rather than an invisible black rectangle.\n */\nexport function injectTextPlaceholders(vault: ReturnType<typeof useVault>, canvas: any, preset: LayoutPreset) {\n if (!TEXT_LAYOUTS.has(preset)) return;\n\n const existingLabel = getInternationalStringText(canvas.label);\n if (!existingLabel) {\n vault.modifyEntityField(canvas, \"label\", { en: [\"Untitled\"] });\n }\n\n const existingSummary = getInternationalStringText(canvas.summary);\n if (!existingSummary) {\n vault.modifyEntityField(canvas, \"summary\", { en: [\"Add a description for this slide.\"] });\n }\n}\n","export const nonLinearTourBehavior = \"non-linear-tour\";\nexport const tourMarkerPinBehavior = \"tour-marker-pin\";\n","import { HTMLAnnotationBodyRender } from \"@manifest-editor/components\";\nimport { useInStack } from \"@manifest-editor/editors\";\nimport { type PointerEvent as ReactPointerEvent, type RefObject, useEffect, useRef, useState } from \"react\";\nimport { AnnotationContext, LocaleString, useCanvas, useVault, useVaultSelector } from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\nimport { getFloatingBehavior, hasFloatingBehavior } from \"../right-panels/SlideBehaviours\";\nimport {\n getAnnotationTargetBox,\n getSlideContentLayers,\n getSlideLayoutRegions,\n getTourStepAnnotations,\n type SlideContentBox,\n setAnnotationTargetBox,\n setSlideTextRegionBox,\n useSlideshowContentPositioning,\n useSlideshowWorkbenchState,\n} from \"../slideshow-content-positioning\";\nimport { nonLinearTourBehavior, tourMarkerPinBehavior } from \"../tour-behaviors\";\n\nconst editorialTextRegionId = \"editorial-text\";\n\nexport function SlideshowSlidePreview({\n className,\n editable = false,\n mode = \"edit\",\n showTourSteps = false,\n}: {\n className?: string;\n editable?: boolean;\n mode?: \"edit\" | \"preview\";\n showTourSteps?: boolean;\n}) {\n const canvas = useCanvas();\n const vault = useVault();\n const editingAnnotation = useInStack(\"Annotation\");\n const stageRef = useRef<HTMLDivElement | null>(null);\n const [activeTourStepId, setActiveTourStepId] = useState<string | null>(null);\n const requestWorkbenchTab = useSlideshowWorkbenchState((state) => state.requestTab);\n const {\n selectedAnnotationId,\n repositioningAnnotationId,\n selectedTextRegion,\n repositioningTextRegion,\n selectedTourStepId,\n selectAnnotation,\n startRepositioning,\n selectTextRegion,\n selectTourStep,\n } = useSlideshowContentPositioning();\n\n const layers = useVaultSelector(\n (_, vaultInstance) => (canvas ? getSlideContentLayers(vaultInstance, canvas) : []),\n [canvas?.id, canvas?.items?.[0]?.id],\n );\n const tourSteps = useVaultSelector(\n (_, vaultInstance) => (canvas ? getTourStepAnnotations(vaultInstance, canvas) : []),\n [canvas?.id, canvas?.annotations?.[0]?.id],\n );\n const editingAnnotationId = editingAnnotation?.resource.source.id;\n const tourTabActive = mode === \"edit\" && showTourSteps;\n const behavior = Array.isArray(canvas?.behavior) ? canvas.behavior : [];\n const nonLinearTour = behavior.includes(nonLinearTourBehavior);\n const tourMarkerStyle = behavior.includes(tourMarkerPinBehavior) ? \"pin\" : \"circle\";\n const contentEditingActive = mode === \"edit\" && !showTourSteps;\n const activeTourStep = tourSteps.find((annotation: any) => annotation.id === activeTourStepId);\n\n useEffect(() => {\n setActiveTourStepId(null);\n }, [canvas?.id, showTourSteps]);\n\n useEffect(() => {\n if (nonLinearTour && tourTabActive && selectedTourStepId) {\n setActiveTourStepId(selectedTourStepId);\n }\n }, [nonLinearTour, selectedTourStepId, tourTabActive]);\n\n if (!canvas) {\n return null;\n }\n\n const canvasWidth = Number(canvas.width) || 1920;\n const canvasHeight = Number(canvas.height) || 1080;\n const layout = getSlideLayoutRegions(canvas);\n\n return (\n <div\n ref={stageRef}\n className={twMerge(\"relative h-full w-full overflow-hidden\", mode === \"edit\" && \"bg-white\", className)}\n style={{\n aspectRatio: `${canvasWidth} / ${canvasHeight}`,\n }}\n >\n {layers.length ? (\n layers.map((layer) => {\n const editingLayer = editingAnnotationId === layer.annotation.id;\n const selected = editingLayer || selectedAnnotationId === layer.annotation.id;\n const repositioning = repositioningAnnotationId === layer.annotation.id;\n\n return (\n <div\n key={layer.annotation.id}\n className={twMerge(\n \"absolute overflow-hidden\",\n contentEditingActive && selected && \"ring-4 ring-me-primary-500 ring-offset-2 ring-offset-white\",\n (repositioning || editingLayer) && contentEditingActive && \"cursor-move select-none touch-none\",\n )}\n style={{\n left: `${(layer.box.x / canvasWidth) * 100}%`,\n top: `${(layer.box.y / canvasHeight) * 100}%`,\n width: `${(layer.box.width / canvasWidth) * 100}%`,\n height: `${(layer.box.height / canvasHeight) * 100}%`,\n }}\n onPointerDown={\n contentEditingActive && (repositioning || editingLayer)\n ? (event) =>\n startSlideLayerDrag({\n event,\n mode: \"move\",\n canvas,\n annotation: layer.annotation,\n vault,\n startBox: layer.box,\n stage: stageRef.current,\n })\n : contentEditingActive && editable\n ? (event) => {\n selectAnnotation(layer.annotation.id);\n startRepositioning(layer.annotation.id);\n requestWorkbenchTab(\"content\");\n startSlideLayerDrag({\n event,\n mode: \"move\",\n canvas,\n annotation: layer.annotation,\n vault,\n startBox: layer.box,\n stage: stageRef.current,\n });\n }\n : undefined\n }\n >\n <RenderSlideLayer\n layer={layer}\n mode={mode}\n cover={behavior.includes(\"cover\") || behavior.includes(\"image-cover\")}\n />\n {contentEditingActive && (repositioning || editingLayer) ? (\n <div\n className=\"absolute bottom-0 right-0 h-4 w-4 cursor-se-resize rounded-tl bg-me-primary-500\"\n onPointerDown={(event) => {\n event.stopPropagation();\n startSlideLayerDrag({\n event,\n mode: \"resize\",\n canvas,\n annotation: layer.annotation,\n vault,\n startBox: layer.box,\n stage: stageRef.current,\n });\n }}\n />\n ) : null}\n </div>\n );\n })\n ) : (\n <div\n className={twMerge(\n \"flex h-full w-full items-center justify-center text-sm font-semibold\",\n mode === \"preview\" ? \"text-white/70\" : \"bg-white text-slate-600\",\n )}\n >\n {mode === \"preview\" ? \"This slide has no content yet\" : \"Empty slide\"}\n </div>\n )}\n {layout.text ? (\n <SlideTextPanel\n canvas={canvas}\n box={layout.text}\n editable={editable && contentEditingActive}\n mode={mode}\n repositioning={repositioningTextRegion === editorialTextRegionId}\n selected={selectedTextRegion === editorialTextRegionId}\n stage={stageRef}\n onSelect={() => {\n selectTextRegion(editorialTextRegionId);\n requestWorkbenchTab(\"content\");\n }}\n />\n ) : null}\n {tourTabActive\n ? tourSteps.map((annotation: any, index: number) => (\n <TourStepTarget\n key={annotation.id}\n annotation={annotation}\n canvas={canvas}\n index={index}\n active={activeTourStepId === annotation.id}\n markerStyle={tourMarkerStyle}\n nonLinear={nonLinearTour}\n selected={selectedTourStepId === annotation.id}\n onSelect={() => {\n selectTourStep(annotation.id);\n if (nonLinearTour) {\n setActiveTourStepId(annotation.id);\n }\n }}\n />\n ))\n : null}\n {tourTabActive && nonLinearTour && activeTourStep ? (\n <NonLinearTourStepPanel annotation={activeTourStep} onExit={() => setActiveTourStepId(null)} />\n ) : null}\n </div>\n );\n}\n\nfunction TourStepTarget({\n active,\n annotation,\n canvas,\n index,\n markerStyle,\n nonLinear,\n selected,\n onSelect,\n}: {\n active?: boolean;\n annotation: any;\n canvas: any;\n index: number;\n markerStyle: \"circle\" | \"pin\";\n nonLinear: boolean;\n selected: boolean;\n onSelect: () => void;\n}) {\n const box = getAnnotationTargetBox(annotation, canvas);\n const canvasBehavior = Array.isArray(canvas.behavior) ? canvas.behavior : [];\n const annotationBehavior = Array.isArray(annotation.behavior) ? annotation.behavior : [];\n const floating = hasFloatingBehavior(canvasBehavior)\n ? getFloatingBehavior(annotationBehavior.length ? annotationBehavior : canvasBehavior)\n : null;\n const canvasWidth = Number(canvas.width) || 1920;\n const canvasHeight = Number(canvas.height) || 1080;\n const selectedColour = \"#6d5aa8\";\n\n if (nonLinear) {\n return (\n <button\n type=\"button\"\n className={twMerge(\n \"absolute z-30 border-none bg-transparent p-0 transition-transform hover:scale-110 focus:outline-none focus:ring-4 focus:ring-white/80\",\n active && \"z-40 scale-110\",\n )}\n style={{\n left: `${((box.x + box.width / 2) / canvasWidth) * 100}%`,\n top: `${((box.y + box.height / 2) / canvasHeight) * 100}%`,\n transform: \"translate(-50%, -50%)\",\n }}\n onClick={(event) => {\n event.stopPropagation();\n onSelect();\n }}\n >\n <TourStepMarker index={index + 1} style={markerStyle} />\n </button>\n );\n }\n\n return (\n <button\n type=\"button\"\n aria-label={`Select tour step ${index + 1}`}\n className={twMerge(\n \"absolute select-none border-2 border-me-primary-500 bg-me-primary-500/10 touch-none\",\n selected ? \"z-40\" : \"z-30\",\n \"cursor-pointer\",\n selected ? \"border-4\" : \"ring-2 ring-white\",\n )}\n style={{\n left: `${(box.x / canvasWidth) * 100}%`,\n top: `${(box.y / canvasHeight) * 100}%`,\n width: `${(box.width / canvasWidth) * 100}%`,\n height: `${(box.height / canvasHeight) * 100}%`,\n ...(selected\n ? {\n backgroundColor: \"rgba(109, 90, 168, 0.2)\",\n borderColor: selectedColour,\n boxShadow: \"0 0 0 4px rgba(109, 90, 168, 0.22), 0 0 0 8px rgba(109, 90, 168, 0.14)\",\n }\n : {}),\n }}\n onClick={(event) => {\n event.stopPropagation();\n onSelect();\n }}\n >\n <span className=\"absolute left-1 top-1\">\n <TourStepPin index={index + 1} />\n </span>\n <span\n className={twMerge(\n \"absolute rounded px-1.5 py-0.5 text-xs font-semibold text-white\",\n getTourStepBadgePosition(floating),\n !selected && \"bg-me-primary-500\",\n )}\n style={selected ? { backgroundColor: selectedColour } : undefined}\n >\n Step {index + 1}\n </span>\n </button>\n );\n}\n\nfunction TourStepMarker({ index, style }: { index: number; style: \"circle\" | \"pin\" }) {\n return (\n <span\n className={twMerge(\n \"inline-flex items-center justify-center border-2 border-white bg-black text-white shadow-lg ring-1 ring-black/40\",\n style === \"pin\" ? \"h-10 w-10 rounded-full\" : \"h-8 min-w-8 rounded px-2 text-xs font-semibold\",\n )}\n >\n {style === \"pin\" ? <span className=\"h-2.5 w-2.5 rounded-full bg-white\" aria-hidden=\"true\" /> : index}\n <span className=\"sr-only\">Tour step {index}</span>\n </span>\n );\n}\n\nfunction TourStepPin({ index }: { index?: number }) {\n return (\n <span className=\"inline-flex h-10 w-10 items-center justify-center rounded-full border-2 border-white bg-black shadow-lg ring-1 ring-black/40\">\n <span className=\"h-2.5 w-2.5 rounded-full bg-white\" aria-hidden=\"true\" />\n {index ? <span className=\"sr-only\">Tour step {index}</span> : null}\n </span>\n );\n}\n\nfunction NonLinearTourStepPanel({ annotation, onExit }: { annotation: any; onExit: () => void }) {\n const label = getLanguageMapText(annotation.label);\n const summary = getLanguageMapText(annotation.summary);\n\n return (\n <>\n <div className=\"absolute right-4 top-4 z-50\">\n <button\n type=\"button\"\n className=\"rounded bg-white px-4 py-2 text-sm font-semibold text-slate-900 shadow ring-1 ring-black/10\"\n onClick={onExit}\n >\n Exit\n </button>\n </div>\n <div className=\"absolute left-4 top-4 z-50 max-h-[calc(100%-2rem)] w-[min(26rem,calc(100%-2rem))] overflow-y-auto rounded bg-white p-5 text-slate-900 shadow-2xl ring-1 ring-black/10\">\n <div className=\"mb-4 flex items-start justify-between gap-3\">\n <h3 className=\"text-xl font-bold leading-tight\">{label || \"Tour step\"}</h3>\n <button type=\"button\" className=\"text-2xl leading-none text-slate-900\" aria-label=\"Close\" onClick={onExit}>\n x\n </button>\n </div>\n {summary ? <p className=\"mb-4 text-sm leading-relaxed text-slate-700\">{summary}</p> : null}\n <AnnotationContext annotation={annotation.id}>\n <HTMLAnnotationBodyRender className=\"prose prose-sm max-w-none text-slate-800\" locale=\"en\" />\n </AnnotationContext>\n </div>\n </>\n );\n}\n\nfunction getTourStepBadgePosition(floating: ReturnType<typeof getFloatingBehavior> | null) {\n switch (floating) {\n case \"float-top\":\n return \"left-1/2 top-1 -translate-x-1/2\";\n case \"float-top-right\":\n return \"right-1 top-1\";\n case \"float-left\":\n return \"left-1 top-1/2 -translate-y-1/2\";\n case \"float-right\":\n return \"right-1 top-1/2 -translate-y-1/2\";\n case \"float-bottom-left\":\n return \"bottom-1 left-1\";\n case \"float-bottom\":\n return \"bottom-1 left-1/2 -translate-x-1/2\";\n case \"float-bottom-right\":\n return \"bottom-1 right-1\";\n default:\n return \"left-1 top-1\";\n }\n}\n\nfunction SlideTextPanel({\n canvas,\n box,\n editable,\n mode,\n onSelect,\n repositioning,\n selected,\n stage,\n}: {\n canvas: any;\n box: SlideContentBox;\n editable: boolean;\n mode: \"edit\" | \"preview\";\n onSelect: () => void;\n repositioning: boolean;\n selected: boolean;\n stage: RefObject<HTMLDivElement | null>;\n}) {\n const canvasWidth = Number(canvas.width) || 1920;\n const canvasHeight = Number(canvas.height) || 1080;\n const vault = useVault();\n\n return (\n <div\n className={twMerge(\n \"absolute flex flex-col overflow-hidden bg-black text-white\",\n mode === \"preview\" ? \"font-mono\" : \"p-[3%]\",\n editable && selected && \"ring-4 ring-me-primary-500 ring-offset-2\",\n editable && repositioning && \"cursor-move select-none touch-none\",\n )}\n style={{\n left: `${(box.x / canvasWidth) * 100}%`,\n top: `${(box.y / canvasHeight) * 100}%`,\n width: `${(box.width / canvasWidth) * 100}%`,\n height: `${(box.height / canvasHeight) * 100}%`,\n ...(mode === \"preview\"\n ? {\n containerType: \"inline-size\",\n padding: \"3% 4%\",\n }\n : {}),\n }}\n onPointerDown={\n editable\n ? (event) => {\n onSelect();\n if (repositioning) {\n startSlideTextDrag({\n event,\n mode: \"move\",\n canvas,\n vault,\n startBox: box,\n stage: stage.current,\n });\n }\n }\n : undefined\n }\n >\n {mode === \"edit\" ? (\n <>\n <div\n className=\"block cursor-text text-xl font-semibold uppercase leading-tight outline-none focus:ring-2 focus:ring-white/70\"\n contentEditable\n suppressContentEditableWarning\n onBlur={(event) =>\n vault.modifyEntityField(canvas, \"label\", {\n en: [event.currentTarget.textContent || \"\"],\n })\n }\n >\n {getLanguageMapText(canvas.label) || \"Untitled\"}\n </div>\n <div\n className=\"mt-4 block min-h-0 cursor-text overflow-y-auto whitespace-pre-wrap text-sm leading-relaxed opacity-90 outline-none focus:ring-2 focus:ring-white/70\"\n contentEditable\n suppressContentEditableWarning\n onBlur={(event) =>\n vault.modifyEntityField(canvas, \"summary\", {\n en: [event.currentTarget.textContent || \"\"],\n })\n }\n >\n {getLanguageMapText(canvas.summary) || \"Add editorial text\"}\n </div>\n </>\n ) : (\n <>\n <LocaleString\n className=\"block font-semibold uppercase leading-tight\"\n style={{ fontSize: \"clamp(13px, 5cqw, 26px)\" }}\n >\n {canvas.label}\n </LocaleString>\n <LocaleString\n className=\"block min-h-0 overflow-y-auto whitespace-pre-wrap opacity-90 leading-[1.45]\"\n style={{\n fontSize: \"clamp(11px, 3.5cqw, 18px)\",\n marginTop: \"5%\",\n paddingRight: \"2%\",\n }}\n >\n {canvas.summary}\n </LocaleString>\n </>\n )}\n {editable && repositioning ? (\n <div\n className=\"absolute bottom-0 right-0 h-4 w-4 cursor-se-resize rounded-tl bg-me-primary-500\"\n onPointerDown={(event) => {\n event.stopPropagation();\n startSlideTextDrag({\n event,\n mode: \"resize\",\n canvas,\n vault,\n startBox: box,\n stage: stage.current,\n });\n }}\n />\n ) : null}\n </div>\n );\n}\n\nfunction RenderSlideLayer({\n layer,\n mode,\n cover,\n}: {\n layer: ReturnType<typeof getSlideContentLayers>[number];\n mode: \"edit\" | \"preview\";\n cover: boolean;\n}) {\n if (layer.imageUrl) {\n return (\n <img\n src={layer.imageUrl}\n alt=\"\"\n className={twMerge(\"h-full w-full\", cover ? \"object-cover\" : \"object-contain\")}\n />\n );\n }\n\n if (layer.html !== null) {\n if (!layer.html) {\n if (mode === \"preview\") {\n return null;\n }\n\n return (\n <div className=\"h-full w-full overflow-hidden bg-white p-4 text-slate-900\">\n <div className=\"flex h-full items-center justify-center rounded border border-dashed border-slate-300 text-sm font-semibold text-slate-400\">\n Empty text\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"h-full w-full overflow-hidden bg-white p-4 text-slate-900\"\n dangerouslySetInnerHTML={{ __html: layer.html }}\n />\n );\n }\n\n if (layer.youtubeId) {\n return (\n <iframe\n className=\"h-full w-full border-0\"\n title=\"YouTube slide content\"\n src={`https://www.youtube.com/embed/${layer.youtubeId}?modestbranding=1&rel=0`}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\"\n allowFullScreen\n />\n );\n }\n\n if (layer.videoUrl) {\n return (\n <video className=\"h-full w-full bg-black object-contain\" controls>\n <source src={layer.videoUrl} />\n </video>\n );\n }\n\n return (\n <div className=\"flex h-full w-full items-center justify-center rounded bg-slate-100 text-sm font-semibold text-slate-500\">\n Media\n </div>\n );\n}\n\nfunction startSlideLayerDrag({\n event,\n mode,\n canvas,\n annotation,\n vault,\n startBox,\n stage,\n}: {\n event: ReactPointerEvent;\n mode: \"move\" | \"resize\";\n canvas: any;\n annotation: any;\n vault: any;\n startBox: SlideContentBox;\n stage: HTMLDivElement | null;\n}) {\n if (!stage) {\n return;\n }\n\n event.preventDefault();\n const rect = stage.getBoundingClientRect();\n const scaleX = (Number(canvas?.width) || 1920) / rect.width;\n const scaleY = (Number(canvas?.height) || 1080) / rect.height;\n const startX = event.clientX;\n const startY = event.clientY;\n\n const onMove = (moveEvent: globalThis.PointerEvent) => {\n const dx = (moveEvent.clientX - startX) * scaleX;\n const dy = (moveEvent.clientY - startY) * scaleY;\n const nextBox =\n mode === \"move\"\n ? {\n ...startBox,\n x: startBox.x + dx,\n y: startBox.y + dy,\n }\n : {\n ...startBox,\n width: startBox.width + dx,\n height: startBox.height + dy,\n };\n\n setAnnotationTargetBox(vault, canvas, annotation.id, nextBox);\n };\n\n const onEnd = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n}\n\nfunction startSlideTextDrag({\n event,\n mode,\n canvas,\n vault,\n startBox,\n stage,\n}: {\n event: ReactPointerEvent;\n mode: \"move\" | \"resize\";\n canvas: any;\n vault: any;\n startBox: SlideContentBox;\n stage: HTMLDivElement | null;\n}) {\n if (!stage) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const rect = stage.getBoundingClientRect();\n const scaleX = (Number(canvas?.width) || 1920) / rect.width;\n const scaleY = (Number(canvas?.height) || 1080) / rect.height;\n const startX = event.clientX;\n const startY = event.clientY;\n\n const onMove = (moveEvent: globalThis.PointerEvent) => {\n const dx = (moveEvent.clientX - startX) * scaleX;\n const dy = (moveEvent.clientY - startY) * scaleY;\n const nextBox =\n mode === \"move\"\n ? {\n ...startBox,\n x: startBox.x + dx,\n y: startBox.y + dy,\n }\n : {\n ...startBox,\n width: startBox.width + dx,\n height: startBox.height + dy,\n };\n\n setSlideTextRegionBox(vault, canvas, nextBox);\n };\n\n const onEnd = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onEnd);\n window.removeEventListener(\"pointercancel\", onEnd);\n };\n\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onEnd);\n window.addEventListener(\"pointercancel\", onEnd);\n}\n\nfunction getLanguageMapText(value: any): string {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) return value.filter(Boolean).join(\" \");\n\n const firstValue = Object.values(value)[0];\n return Array.isArray(firstValue)\n ? firstValue.filter(Boolean).join(\" \")\n : typeof firstValue === \"string\"\n ? firstValue\n : \"\";\n}\n","import { LazyThumbnail, useCanvasRenderingStrategy } from \"@manifest-editor/components\";\nimport {\n getInternationalStringText,\n useInStack,\n} from \"@manifest-editor/editors\";\nimport { forwardRef } from \"react\";\nimport { LocaleString, useCanvas } from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\nimport { getClassName, getGridStats } from \"../helpers\";\nimport { SlideshowSlidePreview } from \"./SlideshowSlidePreview\";\n\nexport interface ExhibitionItemProps\n extends React.HTMLAttributes<HTMLDivElement> {\n isFirst: boolean;\n onClick: () => void;\n item: { id: string };\n}\n\nexport const ExhibitionItem = forwardRef<HTMLDivElement, ExhibitionItemProps>(\n function ExhibitionItem(\n { isFirst, item, children: divChildren, onClick, ...props },\n ref,\n ) {\n const canvas = useCanvas();\n const strategy = useCanvasRenderingStrategy();\n const behavior = canvas?.behavior || [];\n const currentCanvas = useInStack(\"Canvas\");\n const className = getClassName(canvas?.behavior, isFirst);\n const { isBottom, isImage, isInfo, isLeft } = getGridStats(\n canvas?.behavior,\n );\n\n const isSelected = currentCanvas?.resource.source?.id === canvas?.id;\n const label = getInternationalStringText(canvas?.label, \"Untitled\");\n const isSlideshowItem =\n behavior.includes(\"w-12\") && behavior.includes(\"h-8\");\n\n let children = null;\n if (isSlideshowItem) {\n children = (\n <SlideshowSlidePreview\n className=\"pointer-events-none h-full w-full\"\n mode=\"preview\"\n />\n );\n } else if (isInfo) {\n children = (\n <div className=\"bg-black w-full h-full text-white max-h-40\">\n <div className=\"p-1.5 text-[4px]\">\n {strategy.type === \"textual-content\" ? (\n <LocaleString enableDangerouslySetInnerHTML>\n {strategy.items[0]?.text}\n </LocaleString>\n ) : null}\n </div>\n </div>\n );\n } else {\n children = (\n <div\n className={twMerge(\n \"flex h-full max-h-full min-h-0\",\n isLeft ? \"flex-row-reverse\" : isBottom ? \"flex-col\" : \"flex-row\",\n )}\n >\n <div className=\"flex-1 overflow-hidden relative justify-self-stretch\">\n <div className=\"absolute inset-0 w-full h-full\">\n <LazyThumbnail cover={behavior.includes(\"cover\") || behavior.includes(\"image-cover\")} fade={false} />\n </div>\n </div>\n {isImage ? null : (\n <div\n className={`${isBottom ? \"min-h-3 w-full\" : \"w-1/3\"} flex-shrink-0 self-stretch p-2 text-white bg-black rounded`}\n >\n <div className=\"p-1.5 text-[4px]\">\n <LocaleString className=\"block mb-1 text-[5px]\">\n {canvas?.label}\n </LocaleString>\n <LocaleString>{canvas?.summary}</LocaleString>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n className={twMerge(\n className,\n \"bg-me-gray-700 overflow-hidden hover:ring-2 ring-me-primary-500 relative\",\n isSelected ? \"ring-2 ring-me-primary-500\" : \"\",\n )}\n {...props}\n >\n {children}\n <button\n type=\"button\"\n className=\"absolute inset-0 z-20 cursor-pointer bg-transparent focus:outline focus:outline-2 focus:outline-offset-[-2px] focus:outline-me-primary-500\"\n aria-label={`Edit slide ${label}`}\n onClick={onClick}\n />\n {divChildren}\n </div>\n );\n },\n);\n","import {\n useCreator,\n useLayoutActions,\n useManifestEditor,\n} from \"@manifest-editor/shell\";\nimport { CanvasContext } from \"react-iiif-vault\";\nimport { ExhibitionContainer } from \"./ExhibitionContainer\";\nimport { ExhibitionItem } from \"./ExhibitionItem\";\n\nexport function ExhibitionGrid() {\n const { open } = useLayoutActions();\n const { structural, technical } = useManifestEditor();\n const [, canvasActions] = useCreator(\n { id: technical.id.get(), type: \"Manifest\" },\n \"items\",\n \"Canvas\",\n );\n const items = structural.items.get();\n\n return (\n <ExhibitionContainer>\n {items.map((item, index) => (\n <CanvasContext key={index} canvas={item.id}>\n <ExhibitionItem\n isFirst={index === 0}\n item={item}\n onClick={() => {\n open({ id: \"current-canvas\" });\n canvasActions.edit(item, index);\n }}\n />\n </CanvasContext>\n ))}\n </ExhibitionContainer>\n );\n}\n","import type { InternationalString } from \"@iiif/presentation-3\";\n\nconst allowedTags = new Set([\n \"a\",\n \"blockquote\",\n \"br\",\n \"code\",\n \"em\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"hr\",\n \"i\",\n \"img\",\n \"li\",\n \"ol\",\n \"p\",\n \"pre\",\n \"s\",\n \"span\",\n \"strong\",\n \"u\",\n \"ul\",\n]);\n\nconst allowedAttributes: Record<string, Set<string>> = {\n a: new Set([\"href\", \"rel\", \"target\", \"title\"]),\n img: new Set([\"alt\", \"data-iiif-image\", \"loading\", \"src\", \"title\"]),\n};\n\nexport function normalizeSummaryForHtmlEditor(value: unknown): InternationalString {\n const languageMap = toLanguageMap(value);\n const normalized: InternationalString = {};\n\n for (const [language, values] of Object.entries(languageMap)) {\n const html = values\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => (isHtmlValue(item) ? sanitizeSummaryHtml(item) : textToParagraphHtml(item)))\n .filter(Boolean)\n .join(\"\");\n\n if (html) {\n normalized[language] = [html];\n }\n }\n\n return normalized;\n}\n\nexport function normalizeSummaryForSave(value: InternationalString): InternationalString {\n const normalized: InternationalString = {};\n\n for (const [language, values] of Object.entries(value || {})) {\n const html = (values || [])\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => (isHtmlValue(item) ? sanitizeSummaryHtml(item) : textToParagraphHtml(item)))\n .filter(Boolean)\n .join(\"\");\n\n if (html) {\n normalized[language] = [html];\n }\n }\n\n return normalized;\n}\n\nexport function getLanguageMapHtml(value: unknown): string {\n return Object.values(normalizeSummaryForHtmlEditor(value))\n .flatMap((item) => (Array.isArray(item) ? item : [item]))\n .filter((item): item is string => typeof item === \"string\")\n .join(\"\");\n}\n\nexport function sanitizeSummaryHtml(value: string): string {\n if (typeof document === \"undefined\") {\n return sanitizeSummaryHtmlFallback(value);\n }\n\n const template = document.createElement(\"template\");\n template.innerHTML = value || \"\";\n\n sanitizeNode(template.content);\n\n return template.innerHTML;\n}\n\nfunction sanitizeNode(node: Node) {\n for (const child of Array.from(node.childNodes)) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n const element = child as HTMLElement;\n const tagName = element.tagName.toLowerCase();\n\n if (!allowedTags.has(tagName)) {\n sanitizeNode(element);\n element.replaceWith(...Array.from(element.childNodes));\n continue;\n }\n\n for (const attribute of Array.from(element.attributes)) {\n const name = attribute.name.toLowerCase();\n if (!isAllowedAttribute(tagName, name, attribute.value)) {\n element.removeAttribute(attribute.name);\n }\n }\n\n if (\n tagName === \"a\" &&\n element.getAttribute(\"target\")?.toLowerCase() === \"_blank\"\n ) {\n element.setAttribute(\"rel\", \"noopener noreferrer\");\n }\n }\n\n sanitizeNode(child);\n }\n}\n\nfunction toLanguageMap(value: unknown): Record<string, string[]> {\n if (!value) return {};\n if (typeof value === \"string\") return { none: [value] };\n if (Array.isArray(value)) return { none: value.filter((item): item is string => typeof item === \"string\") };\n\n if (typeof value === \"object\") {\n const entries: Record<string, string[]> = {};\n\n for (const [language, item] of Object.entries(value)) {\n const values = Array.isArray(item) ? item : [item];\n entries[language] = values.filter((entry): entry is string => typeof entry === \"string\");\n }\n\n return entries;\n }\n\n return {};\n}\n\nfunction isHtmlValue(value: string) {\n return value.trimStart().startsWith(\"<\");\n}\n\nfunction textToParagraphHtml(value: string) {\n return value\n .replace(/\\r\\n?/g, \"\\n\")\n .split(/\\n+/)\n .map((paragraph) => paragraph.trim())\n .filter(Boolean)\n .map((paragraph) => `<p>${escapeHtml(paragraph)}</p>`)\n .join(\"\");\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction sanitizeSummaryHtmlFallback(value: string) {\n return (value || \"\")\n .replace(/<script\\b[^<]*(?:(?!<\\/script>)<[^<]*)*<\\/script>/gi, \"\")\n .replace(/<style\\b[^<]*(?:(?!<\\/style>)<[^<]*)*<\\/style>/gi, \"\")\n .replace(\n /<\\s*(\\/?)\\s*([a-z0-9]+)([^>]*)>/gi,\n (_tag, closing: string, rawTagName: string, rawAttributes: string) => {\n const tagName = rawTagName.toLowerCase();\n if (!allowedTags.has(tagName)) return \"\";\n if (closing) return `</${tagName}>`;\n\n const attributes = new Map<string, string>();\n const attributePattern =\n /([^\\s=/>]+)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'=<>`]+)))?/g;\n\n for (const match of rawAttributes.matchAll(attributePattern)) {\n const name = match[1]!.toLowerCase();\n const attributeValue = match[2] ?? match[3] ?? match[4];\n if (\n attributeValue !== undefined &&\n isAllowedAttribute(tagName, name, attributeValue)\n ) {\n attributes.set(name, attributeValue);\n }\n }\n\n if (\n tagName === \"a\" &&\n attributes.get(\"target\")?.toLowerCase() === \"_blank\"\n ) {\n attributes.set(\"rel\", \"noopener noreferrer\");\n }\n\n const serializedAttributes = Array.from(\n attributes,\n ([name, attributeValue]) =>\n ` ${name}=\"${escapeHtmlAttribute(attributeValue)}\"`,\n ).join(\"\");\n const selfClosing = /\\/\\s*$/.test(rawAttributes);\n\n return `<${tagName}${serializedAttributes}${selfClosing ? \" /\" : \"\"}>`;\n },\n );\n}\n\nfunction isAllowedAttribute(tagName: string, name: string, value: string) {\n if (!allowedAttributes[tagName]?.has(name)) return false;\n if (name === \"data-iiif-image\") return value === \"true\";\n\n return !((name === \"href\" || name === \"src\") && hasUnsafeUrl(value));\n}\n\nfunction hasUnsafeUrl(value: string) {\n const firstPathCharacter = value.search(/[/?#]/);\n const possibleScheme = value.slice(\n 0,\n firstPathCharacter === -1 ? undefined : firstPathCharacter,\n );\n if (possibleScheme.includes(\"&\")) return true;\n\n const colonIndex = value.indexOf(\":\");\n if (colonIndex === -1) return false;\n\n const scheme = value\n .slice(0, colonIndex)\n .replace(/[\\u0000-\\u0020]/g, \"\")\n .toLowerCase();\n\n return scheme.includes(\"&\") || scheme === \"javascript\" || scheme === \"data\";\n}\n\nfunction escapeHtmlAttribute(value: string) {\n return value\n .replace(/&(?!(?:#\\d+|#x[\\da-f]+|[a-z][\\w-]*);)/gi, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n","import { sanitizeSummaryHtml } from \"../right-panels/summary-html\";\n\nexport const DEFAULT_TOUR_STEP_SUMMARY = \"<p>Description</p>\";\nexport const DEFAULT_TOUR_STEP_HTML = DEFAULT_TOUR_STEP_SUMMARY;\n\nexport function splitTourStepHtml(value: string | null | undefined) {\n const html = value || \"\";\n\n if (typeof document !== \"undefined\") {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n const firstNode = Array.from(template.content.childNodes).find(\n (node) => node.nodeType === Node.ELEMENT_NODE || (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()),\n );\n\n if (firstNode?.nodeType === Node.ELEMENT_NODE && /^h[1-6]$/i.test((firstNode as HTMLElement).tagName)) {\n const label = firstNode.textContent?.trim() || \"\";\n firstNode.remove();\n return {\n label,\n summary: sanitizeSummaryHtml(template.innerHTML.trim()),\n };\n }\n\n return { label: undefined, summary: sanitizeSummaryHtml(html) };\n }\n\n const match = html.match(/^(?:\\s|<!--[\\s\\S]*?-->)*<h[1-6][^>]*>([\\s\\S]*?)<\\/h[1-6]>\\s*/i);\n if (!match) {\n return { label: undefined, summary: sanitizeSummaryHtml(html) };\n }\n\n return {\n label: decodeHtmlText(stripHtml(match[1] || \"\")).trim(),\n summary: sanitizeSummaryHtml(html.slice(match[0].length).trim()),\n };\n}\n\nexport function joinTourStepHtml(label: string | undefined, summary: string) {\n const cleanLabel = label === undefined ? \"\" : label.trim() ? `<h2>${escapeHtml(label.trim())}</h2>` : \"<h2></h2>\";\n const cleanSummary = sanitizeSummaryHtml(summary || \"\");\n\n return `${cleanLabel}${cleanSummary}`;\n}\n\nfunction stripHtml(value: string) {\n return value.replace(/<[^>]*>/g, \"\");\n}\n\nfunction decodeHtmlText(value: string) {\n const namedEntities: Record<string, string> = {\n amp: \"&\",\n apos: \"'\",\n gt: \">\",\n lt: \"<\",\n nbsp: \"\\u00a0\",\n quot: '\"',\n };\n\n return value.replace(\n /&(?:#(\\d+)|#x([\\da-f]+)|([a-z]+));/gi,\n (entity, decimal: string | undefined, hex: string | undefined, named: string | undefined) => {\n if (named) return namedEntities[named.toLowerCase()] ?? entity;\n\n const codePoint = Number.parseInt(decimal || hex || \"\", decimal ? 10 : 16);\n return codePoint > 0 && codePoint <= 0x10ffff && !(codePoint >= 0xd800 && codePoint <= 0xdfff)\n ? String.fromCodePoint(codePoint)\n : entity;\n },\n );\n}\n\nfunction escapeHtml(value: string) {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n","import { LazyThumbnail } from \"@manifest-editor/components\";\nimport { getInternationalStringText, useInStack } from \"@manifest-editor/editors\";\nimport { useCreator, useLayoutActions, useManifestEditor } from \"@manifest-editor/shell\";\nimport { useId, useState } from \"react\";\nimport { CanvasContext, LocaleString, useCanvas, useManifest, useVaultSelector } from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\nimport { getGridStats } from \"../helpers\";\nimport {\n getAnnotationTargetBox,\n getPaintingAnnotations,\n getTourStepAnnotations,\n getResolvedAnnotationBody,\n useSlideshowContentPositioning,\n useSlideshowWorkbenchState,\n} from \"../slideshow-content-positioning\";\nimport { sanitizeSummaryHtml } from \"../right-panels/summary-html\";\nimport { SlideshowSlidePreview } from \"./SlideshowSlidePreview\";\nimport { splitTourStepHtml } from \"./tour-step-html\";\n\nexport type PreviewMode = \"slideshow\" | \"scroll\";\n\nconst scrollPreviewWidth = 332;\nconst slideshowPreviewHeight = 180;\n\nexport function ExhibitionPreviewList({ mode }: { mode: PreviewMode }) {\n const { open } = useLayoutActions();\n const { structural, technical } = useManifestEditor();\n const [, canvasActions] = useCreator({ id: technical.id.get(), type: \"Manifest\" }, \"items\", \"Canvas\");\n const items = structural.items.get();\n\n return (\n <ExhibitionPreviewListLayout>\n {items.map((item, index) => (\n <CanvasContext key={item.id} canvas={item.id}>\n <ExhibitionPreviewCard\n mode={mode}\n onClick={() => {\n open({ id: \"current-canvas\" });\n canvasActions.edit(item, index);\n }}\n />\n </CanvasContext>\n ))}\n </ExhibitionPreviewListLayout>\n );\n}\n\nexport function ExhibitionPreviewListLayout({ children }: { children: React.ReactNode }) {\n const manifest = useManifest();\n const { edit } = useLayoutActions();\n\n return (\n <div className=\"flex flex-col gap-3 p-2\">\n <button\n type=\"button\"\n onClick={() =>\n manifest &&\n edit(manifest, undefined, {\n forceOpen: true,\n selectedTab: \"@manifest-editor/descriptive-properties\",\n })\n }\n className=\"w-full rounded border border-slate-200 bg-white p-2 text-left text-sm font-semibold text-slate-800 hover:bg-slate-50\"\n >\n <LocaleString>{manifest?.label}</LocaleString>\n </button>\n {children}\n </div>\n );\n}\n\nexport function ExhibitionPreviewCard({ mode, onClick }: { mode: PreviewMode; onClick: () => void }) {\n const canvas = useCanvas();\n const manifest = useManifest();\n const currentCanvas = useInStack(\"Canvas\");\n const selected = currentCanvas?.resource.source?.id === canvas?.id;\n const [showSteps, setShowSteps] = useState(false);\n const stepsId = useId();\n const isInfoBox = (canvas?.behavior || []).includes(\"info\");\n const isScrollInfoBox = mode === \"scroll\" && isInfoBox;\n const isCoverCanvas = useVaultSelector(\n (_, vaultInstance) => Boolean(manifest?.items?.[0]?.id === canvas?.id && canvas && isImageCanvas(vaultInstance, canvas)),\n [manifest?.items?.[0]?.id, canvas?.id, canvas?.items?.[0]?.id],\n );\n const tourSteps = useVaultSelector(\n (_, vaultInstance) => (canvas ? getTourStepAnnotations(vaultInstance, canvas) : []),\n [canvas?.id, canvas?.annotations?.[0]?.id],\n );\n\n if (!canvas) return null;\n\n return (\n <article\n className={twMerge(\n \"overflow-hidden rounded border bg-white shadow-sm\",\n selected ? \"border-me-primary-500 ring-2 ring-me-primary-100\" : \"border-slate-200\",\n )}\n >\n <button type=\"button\" className=\"block w-full text-left\" onClick={onClick}>\n <div className=\"border-b border-slate-100 px-2 py-1.5 text-xs font-semibold text-slate-700\">\n <LocaleString>{canvas.label}</LocaleString>\n </div>\n {isCoverCanvas && canvas.behavior?.includes(\"splash\") ? (\n <ManifestSplashPreview height={mode === \"slideshow\" ? slideshowPreviewHeight : 180} />\n ) : mode === \"slideshow\" ? (\n isInfoBox ? (\n <InfoBoxPreview height={slideshowPreviewHeight} />\n ) : (\n <div style={{ height: slideshowPreviewHeight, backgroundColor: \"#303030\" }}>\n <SlideshowSlidePreview className=\"pointer-events-none h-full w-full\" mode=\"preview\" />\n </div>\n )\n ) : (\n <ScrollPreview />\n )}\n </button>\n {tourSteps.length && !isScrollInfoBox ? (\n <div className=\"border-t border-slate-100\">\n <button\n type=\"button\"\n aria-expanded={showSteps}\n aria-controls={stepsId}\n className=\"flex w-full items-center justify-between px-2 py-1.5 text-xs font-semibold text-slate-600 hover:bg-slate-50\"\n onClick={(event) => {\n event.stopPropagation();\n setShowSteps((open) => !open);\n }}\n >\n <span>{showSteps ? \"Hide steps\" : \"Show steps\"}</span>\n <span>{tourSteps.length}</span>\n </button>\n {showSteps ? (\n <div id={stepsId} className=\"flex flex-col gap-2 border-t border-slate-100 p-2\">\n {tourSteps.map((step: any, index: number) => (\n <TourStepPreview key={step.id || index} annotation={step} canvas={canvas} onClick={onClick} />\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n </article>\n );\n}\n\nfunction ScrollPreview() {\n const canvas = useCanvas();\n const behavior = canvas?.behavior || [];\n const { isInfo } = getGridStats(behavior);\n\n if (!canvas) return null;\n\n const canvasWidth = Number(canvas.width) || 1920;\n const canvasHeight = Number(canvas.height) || 1080;\n const height = Math.max(80, Math.round((scrollPreviewWidth / canvasWidth) * canvasHeight));\n\n if (isInfo) {\n return <InfoBoxPreview />;\n }\n\n return (\n <div className=\"min-h-0\" style={{ height, backgroundColor: \"#303030\" }}>\n <div className=\"relative h-full min-h-0 overflow-hidden\" style={{ backgroundColor: \"#303030\" }}>\n <div className=\"absolute inset-0\">\n <LazyThumbnail cover={behavior.includes(\"cover\") || behavior.includes(\"image-cover\")} fade={false} />\n </div>\n </div>\n </div>\n );\n}\n\nfunction ManifestSplashPreview({ height = 180 }: { height?: number }) {\n const manifest = useManifest();\n const canvas = useCanvas();\n const summary = getInternationalStringText(manifest?.summary, \"\");\n const requiredStatementLabel = getInternationalStringText(manifest?.requiredStatement?.label, \"\");\n const requiredStatementValue = getInternationalStringText(manifest?.requiredStatement?.value, \"\");\n const behavior = canvas?.behavior || [];\n const invert = behavior.includes(\"invert\");\n const overlay = typeof (canvas as any)?.backgroundColor === \"string\" ? (canvas as any).backgroundColor : null;\n\n return (\n <div\n className={twMerge(\"relative overflow-hidden bg-black p-4\", invert ? \"text-white\" : \"text-black\")}\n style={{ height }}\n >\n <div className=\"absolute inset-0\">\n <LazyThumbnail cover fade={false} />\n </div>\n <div className=\"absolute inset-0 z-10 opacity-35\" style={{ background: overlay || \"transparent\" }} />\n <div\n className={twMerge(\n \"relative z-20 flex h-full flex-col justify-end p-3\",\n overlay ? \"\" : invert ? \"bg-black/25 backdrop-blur-sm\" : \"bg-white/25 backdrop-blur-sm\",\n )}\n >\n <LocaleString className=\"block text-base font-semibold leading-tight\">{manifest?.label}</LocaleString>\n {summary ? <div className=\"mt-2 line-clamp-3 text-xs leading-relaxed opacity-75\">{summary}</div> : null}\n {requiredStatementValue ? (\n <div className=\"mt-3 border-t border-current/20 pt-2 text-[11px] leading-snug opacity-75\">\n {requiredStatementLabel ? <div className=\"font-semibold opacity-85\">{requiredStatementLabel}</div> : null}\n <div>{requiredStatementValue}</div>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction InfoBoxPreview({ height }: { height?: number }) {\n const canvas = useCanvas();\n const longSummary = useVaultSelector(\n (_, vaultInstance) => (canvas ? getFirstAnnotationBodyHtml(vaultInstance, canvas.annotations?.[0]) : \"\"),\n [canvas?.id, canvas?.annotations?.[0]?.id],\n );\n\n if (!canvas) return null;\n\n return (\n <div className=\"overflow-y-auto bg-white p-3 text-black\" style={height ? { height } : undefined}>\n <LocaleString className=\"mb-2 block text-sm font-semibold uppercase leading-tight\">{canvas.label}</LocaleString>\n <div\n className=\"prose prose-sm max-w-none text-xs leading-relaxed\"\n dangerouslySetInnerHTML={{\n __html: longSummary || getInternationalStringText(canvas.summary, \"\"),\n }}\n />\n </div>\n );\n}\n\nfunction isImageCanvas(vault: any, canvas: any) {\n if (!canvas || canvas.behavior?.includes(\"info\")) return false;\n\n return getPaintingAnnotations(vault, canvas).some((annotation: any) => {\n const body = getResolvedAnnotationBody(vault, annotation);\n const source = body?.type === \"SpecificResource\" ? body.source : body;\n const services = Array.isArray(source?.service) ? source.service : source?.service ? [source.service] : [];\n return source?.type === \"Image\" || services.length > 0;\n });\n}\n\nfunction TourStepPreview({ annotation, canvas, onClick }: { annotation: any; canvas: any; onClick: () => void }) {\n const { edit } = useLayoutActions();\n const selectTourStep = useSlideshowContentPositioning((state) => state.selectTourStep);\n const stopContentRepositioning = useSlideshowContentPositioning((state) => state.stopRepositioning);\n const stopTextRepositioning = useSlideshowContentPositioning((state) => state.stopTextRepositioning);\n const requestWorkbenchTab = useSlideshowWorkbenchState((state) => state.requestTab);\n const setShowTourSteps = useSlideshowWorkbenchState((state) => state.setShowTourSteps);\n const setCenterPanelMode = useSlideshowWorkbenchState((state) => state.setCenterPanelMode);\n const target = useVaultSelector(\n (_, vaultInstance) => getTourStepThumbnailTarget(vaultInstance, annotation, canvas),\n [annotation?.id, annotation?.target, canvas?.id],\n );\n const text = useVaultSelector(\n (_, vaultInstance) => getTourStepPreviewText(vaultInstance, annotation),\n [annotation?.id, annotation?.body, annotation?.label, annotation?.summary],\n );\n\n return (\n <button\n type=\"button\"\n className=\"flex gap-2 rounded border border-slate-200 bg-white p-1.5 text-left hover:bg-slate-50\"\n onClick={() => {\n onClick();\n edit({ id: canvas.id, type: \"Canvas\" }, undefined, {\n selectedTab: \"@exhibition/tour-steps\",\n forceOpen: true,\n });\n if (annotation?.id) selectTourStep(annotation.id);\n stopContentRepositioning();\n stopTextRepositioning();\n setShowTourSteps(true);\n setCenterPanelMode(\"edit\");\n requestWorkbenchTab(\"tour\");\n }}\n >\n <div className=\"relative h-12 w-16 shrink-0 overflow-hidden rounded bg-slate-100\">\n <LazyThumbnail cover fade={false} region={target.region} singleImage={target.singleImage} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-xs font-semibold text-slate-800\">{text.label}</div>\n <div\n className=\"line-clamp-1 text-xs text-slate-500 [&_*]:m-0 [&_*]:inline\"\n dangerouslySetInnerHTML={{\n __html: text.summary,\n }}\n />\n </div>\n </button>\n );\n}\n\nfunction getTourStepPreviewText(vault: any, annotation: any) {\n const body = getResolvedAnnotationBody(vault, annotation);\n\n if (typeof body?.value === \"string\") {\n const { label, summary } = splitTourStepHtml(body.value);\n return {\n label: label || getInternationalStringText(annotation.label, \"Step\"),\n summary,\n };\n }\n\n return {\n label: getInternationalStringText(annotation.label, \"Step\"),\n summary: sanitizeSummaryHtml(getInternationalStringText(annotation.summary, \"\")),\n };\n}\n\nfunction getTourStepThumbnailTarget(vault: any, annotation: any, canvas: any) {\n const target = annotation?.target;\n const source = typeof target === \"string\" ? null : target?.source;\n const sourceId = typeof source === \"string\" ? source : source?.id || target?.id;\n const sourceType = typeof source === \"string\" ? null : source?.type || target?.type;\n\n if (sourceType === \"Annotation\" && sourceId) {\n const paintingAnnotation = vault.get({ id: sourceId, type: \"Annotation\" }, { skipSelfReturn: false } as any);\n return {\n region: paintingAnnotation ? getAnnotationTargetBox(paintingAnnotation, canvas) : undefined,\n singleImage: true,\n };\n }\n\n const region = getAnnotationTargetBox(annotation, canvas);\n const canvasWidth = Number(canvas?.width) || 1920;\n const canvasHeight = Number(canvas?.height) || 1080;\n const isFullCanvas = region.x === 0 && region.y === 0 && region.width === canvasWidth && region.height === canvasHeight;\n\n return {\n region: isFullCanvas ? undefined : region,\n singleImage: false,\n };\n}\n\nfunction getFirstAnnotationBodyHtml(vault: any, pageRef: any) {\n const page = pageRef ? vault.get(pageRef as any, { skipSelfReturn: false } as any) : null;\n\n for (const annotationRef of page?.items || []) {\n const annotation = vault.get(annotationRef as any, { skipSelfReturn: false } as any) || annotationRef;\n const bodies = Array.isArray(annotation?.body) ? annotation.body : [annotation?.body];\n\n for (const bodyRef of bodies) {\n const body = bodyRef ? vault.get(bodyRef as any, { skipSelfReturn: false } as any) || bodyRef : null;\n if (typeof body?.value === \"string\" && body.value) {\n return body.value;\n }\n }\n }\n\n return \"\";\n}\n","export function getSlideSelectionAfterDeletion(\n items: Array<{ id: string }>,\n selectedId: string | undefined,\n deletedId: string,\n) {\n if (selectedId !== deletedId) return selectedId;\n\n const deletedIndex = items.findIndex((item) => item.id === deletedId);\n if (deletedIndex === -1) return selectedId;\n\n return items[deletedIndex + 1]?.id || items[deletedIndex - 1]?.id;\n}\n","import type { SVGProps } from \"react\";\n\nexport function ResizeHandleIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" height=\"1em\" width=\"1em\" {...props}>\n <title>Rearrange</title>\n <path fill=\"none\" d=\"M0 0h24v24H0z\" />\n <path d=\"M20 9H4v2h16V9zM4 15h16v-2H4v2z\" fill=\"currentColor\" />\n </svg>\n );\n}\n","import { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { MoreMenu } from \"@manifest-editor/components\";\nimport { AppDropdown, type AppDropdownItem } from \"@manifest-editor/editors\";\nimport { Button } from \"react-aria-components\";\nimport { ResizeHandleIcon } from \"../icons/ResizeHandleIcon\";\nimport { ExhibitionItem } from \"./ExhibitionItem\";\nimport { ExhibitionPreviewCard, type PreviewMode } from \"./ExhibitionPreviewList\";\n\nexport function SortableExhibitionItem({\n isFirst,\n onClick,\n item,\n actions,\n mode,\n}: {\n isFirst: boolean;\n onClick: () => void;\n item: { id: string };\n actions?: AppDropdownItem[];\n mode?: PreviewMode;\n}) {\n const { attributes, listeners, setActivatorNodeRef, setNodeRef, transform, transition } = useSortable({\n id: item.id,\n transition: {\n duration: 150,\n easing: \"cubic-bezier(0.25, 1, 0.5, 1)\",\n },\n });\n\n const style = {\n transform: CSS.Translate.toString(transform),\n transition,\n };\n\n const controls = (\n <div\n className=\"absolute right-0.5 top-0.5 z-30 flex items-stretch gap-0.5\"\n onClick={(event) => event.stopPropagation()}\n >\n {actions?.length ? (\n <AppDropdown\n as={Button}\n className=\"bg-white p-1 text-2xl hover:text-me-500 aria-expanded:text-me-600 aria-expanded:bg-me-200 hover:bg-me-100 rounded-sm\"\n aria-label=\"Action menu\"\n items={actions}\n >\n <MoreMenu />\n </AppDropdown>\n ) : null}\n <Button\n ref={setActivatorNodeRef}\n {...attributes}\n {...listeners}\n aria-label=\"Reorder item\"\n className=\"flex h-8 cursor-grab items-center rounded-sm bg-white p-1 text-2xl hover:bg-me-100 hover:text-me-500 focus:outline focus:outline-2 focus:outline-me-primary-500 active:cursor-grabbing\"\n >\n <ResizeHandleIcon aria-hidden=\"true\" />\n </Button>\n </div>\n );\n\n if (mode) {\n return (\n <div ref={setNodeRef} style={style} className=\"relative\">\n <ExhibitionPreviewCard mode={mode} onClick={onClick} />\n {controls}\n </div>\n );\n }\n\n return (\n <ExhibitionItem ref={setNodeRef} style={style} onClick={onClick} isFirst={isFirst} item={item}>\n {controls}\n </ExhibitionItem>\n );\n}\n","import {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport { restrictToParentElement } from \"@dnd-kit/modifiers\";\nimport {\n rectSortingStrategy,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { createAppActions, useInStack } from \"@manifest-editor/editors\";\nimport { useCreator, useEditingStack, useLayoutActions, useManifestEditor } from \"@manifest-editor/shell\";\nimport { useCallback } from \"react\";\nimport { CanvasContext, useManifest } from \"react-iiif-vault\";\nimport { getSlideSelectionAfterDeletion } from \"../helpers/slide-selection\";\nimport { ExhibitionContainer } from \"./ExhibitionContainer\";\nimport { ExhibitionPreviewListLayout, type PreviewMode } from \"./ExhibitionPreviewList\";\nimport { SortableExhibitionItem } from \"./SortableExhibitionItem\";\n\nexport function SortableExhibitionGrid({ mode = \"grid\" }: { mode?: PreviewMode | \"grid\" }) {\n const manifest = useManifest();\n const { structural, technical } = useManifestEditor();\n const editingStack = useEditingStack();\n const editingCanvas = useInStack(\"Canvas\");\n\n const items = structural.items.get();\n const { open } = useLayoutActions();\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 5,\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n );\n const [, canvasActions] = useCreator({ id: technical.id.get(), type: \"Manifest\" }, \"items\", \"Canvas\");\n\n const onDragEnd = useCallback(\n (result: DragEndEvent) => {\n const { active, over } = result;\n if (over && active.id !== over.id) {\n structural.items.reorder(\n items.findIndex((item) => item.id === active.id),\n items.findIndex((item) => item.id === over.id),\n );\n }\n },\n [items, structural.items],\n );\n\n const canvasId = editingCanvas?.resource.source.id;\n function onDeleteCanvas(deletedId: string) {\n if (canvasId !== deletedId) return;\n\n const nextCanvasId = getSlideSelectionAfterDeletion(items, canvasId, deletedId);\n editingStack.close();\n\n if (nextCanvasId) {\n const newCanvases = structural.items.getWithoutTracking();\n const nextIndex = newCanvases.findIndex((item) => item.id === nextCanvasId);\n const nextCanvas = newCanvases[nextIndex];\n if (nextCanvas) canvasActions.edit(nextCanvas, nextIndex);\n }\n }\n\n const sortableItems = items.map((item, idx) => {\n if (!item) return null;\n return (\n <CanvasContext key={item.id} canvas={item.id}>\n <SortableExhibitionItem\n item={item}\n isFirst={idx === 0}\n mode={mode === \"grid\" ? undefined : mode}\n onClick={() => {\n open({ id: \"current-canvas\" });\n canvasActions.edit(item, idx);\n }}\n actions={createAppActions(structural.items, () => onDeleteCanvas(item.id))(item, idx, manifest!)}\n />\n </CanvasContext>\n );\n });\n const layout =\n mode === \"grid\" ? (\n <ExhibitionContainer>{sortableItems}</ExhibitionContainer>\n ) : (\n <ExhibitionPreviewListLayout>{sortableItems}</ExhibitionPreviewListLayout>\n );\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={onDragEnd}\n modifiers={[restrictToParentElement]}\n >\n <SortableContext\n items={items}\n strategy={mode === \"grid\" ? rectSortingStrategy : verticalListSortingStrategy}\n >\n {layout}\n </SortableContext>\n </DndContext>\n );\n}\n","import type { Vault } from \"@iiif/helpers/vault\";\nimport type { EditableResource } from \"@manifest-editor/shell\";\n\ntype CanvasLike = { id: string; behavior?: string[] | null };\ntype ManifestItem = { id: string };\n\nexport function getOpeningSplashCreatorInitialData(items: ManifestItem[]) {\n return items.length === 0 ? { imageSlideBehavior: [\"splash\"] } : undefined;\n}\n\nexport function isOpeningSplashCanvas(\n canvas: CanvasLike | null | undefined,\n items: ManifestItem[] | null | undefined,\n) {\n return Boolean(\n canvas &&\n items?.[0]?.id === canvas.id &&\n canvas.behavior?.includes(\"splash\"),\n );\n}\n\nexport function isOpeningSplashResource(\n resource: EditableResource,\n vault: Vault,\n) {\n const canvas = vault.get(resource.resource) as CanvasLike | undefined;\n const manifest = resource.parent\n ? (vault.get(resource.parent) as { items?: ManifestItem[] } | undefined)\n : undefined;\n\n return isOpeningSplashCanvas(canvas, manifest?.items);\n}\n","import {\n ActionButton,\n Sidebar,\n SidebarContent,\n SidebarHeader,\n} from \"@manifest-editor/components\";\nimport { useInStack, useToggleList } from \"@manifest-editor/editors\";\nimport {\n CanvasListView,\n CanvasListingIcon,\n} from \"@manifest-editor/manifest-preset/components\";\nimport {\n type LayoutPanel,\n useCreator,\n useEditingStack,\n useManifestEditor,\n} from \"@manifest-editor/shell\";\nimport { ExhibitionGrid } from \"../components/ExhibitionGrid\";\nimport { ExhibitionPreviewList } from \"../components/ExhibitionPreviewList\";\nimport { SortableExhibitionGrid } from \"../components/SortableExhibitionGrid\";\nimport { useExhibitionTemplate } from \"../helpers/exhibition-template\";\nimport { getSlideSelectionAfterDeletion } from \"../helpers/slide-selection\";\nimport { getOpeningSplashCreatorInitialData } from \"../right-panels/opening-splash\";\n\nexport const exhibitionGridLeftPanel = createExhibitionGridLeftPanel({\n label: \"Exhibition grid\",\n creatorFilter: \"exhibition-slide\",\n previewMode: \"configured\",\n});\n\nexport const slideshowGridLeftPanel = createExhibitionGridLeftPanel({\n label: \"Slideshow\",\n creatorFilter: \"exhibition-slideshow-slide\",\n previewMode: \"slideshow\",\n});\n\nexport const scrollGridLeftPanel = createExhibitionGridLeftPanel({\n label: \"Scroll\",\n creatorFilter: \"exhibition-slide\",\n previewMode: \"scroll\",\n});\n\ntype PreviewMode = \"configured\" | \"grid\" | \"slideshow\" | \"scroll\";\ntype ResolvedPreviewMode = Exclude<PreviewMode, \"configured\">;\n\nfunction createExhibitionGridLeftPanel({\n label,\n creatorFilter,\n previewMode,\n}: {\n label: string;\n creatorFilter: string;\n previewMode: PreviewMode;\n}): LayoutPanel {\n return {\n id: \"canvas-listing\", // We are overriding the default canvas listing panel\n label,\n icon: <ExhibitionGridIcon />,\n render: () => <ExhibitionGridLeftPanel creatorFilter={creatorFilter} previewMode={previewMode} />,\n options: {\n minWidth: 350,\n maxWidth: 350,\n },\n };\n}\n\nfunction ExhibitionGridLeftPanel({ creatorFilter, previewMode }: { creatorFilter: string; previewMode: PreviewMode }) {\n const { structural, technical } = useManifestEditor();\n const selectedTemplate = useExhibitionTemplate();\n const resolvedPreviewMode = resolvePreviewMode(previewMode, selectedTemplate?.type);\n const resolvedCreatorFilter = resolvedPreviewMode === \"slideshow\" ? \"exhibition-slideshow-slide\" : creatorFilter;\n const manifestId = technical.id.get();\n const manifest = { id: manifestId, type: \"Manifest\" };\n const items = structural.items.get() || [];\n const editingCanvas = useInStack(\"Canvas\");\n const editingStack = useEditingStack();\n const selectedCanvasId = editingCanvas?.resource.source.id;\n const selectedIndex = selectedCanvasId ? items.findIndex((item) => item.id === selectedCanvasId) : -1;\n const insertIndex = selectedIndex >= 0 ? selectedIndex + 1 : undefined;\n const scrollInitialData = resolvedPreviewMode === \"scroll\" ? getOpeningSplashCreatorInitialData(items) : undefined;\n const [canCreateCanvas, canvasActions] = useCreator(\n manifest,\n \"items\",\n \"Canvas\",\n undefined,\n { isPainting: true },\n );\n const [toggled, toggle] = useToggleList();\n const createCanvas = () => canvasActions.createFiltered(resolvedCreatorFilter, insertIndex, scrollInitialData);\n const canvasName = resolvedPreviewMode === \"scroll\" ? \"section\" : \"slide\";\n const onDeleteCanvas = (deletedId: string) => {\n if (selectedCanvasId !== deletedId) return;\n\n const nextCanvasId = getSlideSelectionAfterDeletion(\n items,\n selectedCanvasId,\n deletedId,\n );\n editingStack.close();\n\n if (nextCanvasId) {\n const newItems = structural.items.getWithoutTracking();\n const nextIndex = newItems.findIndex((item) => item.id === nextCanvasId);\n const nextItem = newItems[nextIndex];\n if (nextItem) canvasActions.edit(nextItem, nextIndex);\n }\n };\n\n return (\n <Sidebar>\n <SidebarHeader\n title={\"Exhibition\"}\n actions={[\n {\n icon: toggled.list ? (\n <CanvasListingIcon className=\"text-2xl\" />\n ) : (\n <ExhibitionGridIcon />\n ),\n title: toggled.list ? \"List view\" : \"Grid view\",\n onClick: () => toggle(\"list\"),\n },\n {\n icon: <ListEditIcon />,\n title: `Edit ${canvasName}s`,\n toggled: toggled.editing,\n onClick: () => toggle(\"editing\"),\n },\n {\n icon: <NewSlideIcon />,\n title: `Add new ${canvasName}`,\n disabled: !canCreateCanvas,\n onClick: createCanvas,\n },\n ]}\n />\n <SidebarContent>\n {toggled.editing ? (\n <SortableExhibitionGrid mode={resolvedPreviewMode} />\n ) : toggled.list ? (\n <CanvasListView isEditing={toggled.editing} onDelete={onDeleteCanvas} />\n ) : resolvedPreviewMode === \"slideshow\" || resolvedPreviewMode === \"scroll\" ? (\n <ExhibitionPreviewList mode={resolvedPreviewMode} />\n ) : (\n <ExhibitionGrid />\n )}\n <div className=\"flex justify-center p-4\">\n <ActionButton primary large isDisabled={!canCreateCanvas} onPress={createCanvas}>\n Create new {canvasName}\n </ActionButton>\n </div>\n </SidebarContent>\n </Sidebar>\n );\n}\n\nfunction resolvePreviewMode(previewMode: PreviewMode, templateType?: string): ResolvedPreviewMode {\n if (previewMode !== \"configured\") return previewMode;\n if (templateType === \"slideshow\" || templateType === \"scroll\") return templateType;\n return \"grid\";\n}\n\nfunction ExhibitionGridIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"currentColor\"\n viewBox=\"0 -960 960 960\"\n >\n <title>Exhibition grid</title>\n <path d=\"M600-160v-280h280v280H600ZM440-520v-280h440v280H440ZM80-160v-280h440v280H80Zm0-360v-280h280v280H80Zm440-80h280v-120H520v120ZM160-240h280v-120H160v120Zm520 0h120v-120H680v120ZM160-600h120v-120H160v120Zm360 0Zm-80 240Zm240 0ZM280-600Z\" />\n </svg>\n );\n}\nfunction ListEditIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <title>Edit slides</title>\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path d=\"M14.06 9.02l.92.92L5.92 19H5v-.92l9.06-9.06M17.66 3c-.25 0-.51.1-.7.29l-1.83 1.83 3.75 3.75 1.83-1.83c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.2-.2-.45-.29-.71-.29zm-3.6 3.19L3 17.25V21h3.75L17.81 9.94l-3.75-3.75z\" />\n </svg>\n );\n}\nfunction NewSlideIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"currentColor\"\n viewBox=\"0 -960 960 960\"\n >\n <title>Add new slide</title>\n <path d=\"M160-240v-480 480Zm80-80v-200h360v200H240Zm-80 160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v240h-80v-240H160v480h360v80H160Zm500-320v-100H360v-60h360v160h-60Zm60 400v-120H600v-80h120v-120h80v120h120v80H800v120h-80Z\" />\n </svg>\n );\n}\n","import type { LayoutPanel } from \"@manifest-editor/shell\";\nimport { useManifest } from \"react-iiif-vault\";\nimport { PreviewIcon } from \"../icons/PreviewIcon\";\n\nexport const exhibitionOverviewLeftPanel: LayoutPanel = {\n id: \"@exhibitions/overview-panel\", // We are overriding the default canvas listing panel\n label: \"Preview\",\n icon: <PreviewIcon />,\n render: () => <ExhibitionOverviewPanel />,\n};\n\nexport function ExhibitionOverviewPanel() {\n const manifest = useManifest();\n\n if (!manifest) return null;\n\n return (\n <div>\n Coming soon.\n {/*<DelftExhibition manifest={manifest.id} language=\"en\" viewObjectLinks={[]} />*/}\n </div>\n );\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 type { PresetTemplateDefinition } from \"@manifest-editor/shell\";\n\nconst boolean = (id: string, label: string, defaultValue: boolean) => ({\n id,\n label,\n type: \"boolean\" as const,\n defaultValue,\n});\n\nexport const exhibitionTemplates: PresetTemplateDefinition[] = [\n {\n id: \"exhibition-fullpage\",\n label: \"Delft exhibition\",\n summary: \"A guided exhibition layout with full-page scenes and focused narrative steps.\",\n type: \"fullpage\",\n previewUrl: \"https://preview.exhibitionviewer.org/preview/delft/full-page\",\n thumbnailUrl: \"https://manifest-editor-docs.netlify.app/exhibition-fullpage.png\",\n configuration: [\n boolean(\"delft.exhibition.cutCorners\", \"Cut corners\", true),\n // boolean(\"delft.exhibition.fullTitleBar\", \"Show full title bar\", false),\n // boolean(\"delft.exhibition.fullWidthGrid\", \"Full-width grid\", false),\n boolean(\"delft.exhibition.hideTableOfContents\", \"Hide table of contents\", false),\n boolean(\"delft.exhibition.showNavigationControls\", \"Show navigation controls\", false),\n boolean(\"delft.exhibition.hideTitle\", \"Hide title\", false),\n // boolean(\"delft.exhibition.hideTitleCard\", \"Hide title card\", false),\n // boolean(\"delft.exhibition.alternativeImageMode\", \"Alternative image mode\", true),\n // boolean(\"delft.exhibition.transitionScale\", \"Scale transitions\", false),\n // boolean(\"delft.exhibition.ignoreCanvasBackgrounds\", \"Ignore canvas backgrounds\", false),\n\n // @todo why these don't work..\n // boolean(\"delft.exhibition.disablePresentation\", \"Disable presentation mode\", false),\n // boolean(\"delft.exhibition.imageInfoIcon\", \"Show image information icon\", false),\n // boolean(\"delft.exhibition.coverImages\", \"Cover images\", false),\n ],\n },\n {\n id: \"exhibition-slideshow\",\n label: \"Slideshow\",\n summary: \"A slide-based exhibition for linear presentations and teaching material.\",\n type: \"slideshow\",\n previewUrl: \"https://preview.exhibitionviewer.org/preview/delft/slideshow\",\n thumbnailUrl: \"https://manifest-editor-docs.netlify.app/exhibition-slideshow.png\",\n configuration: [\n boolean(\"delft.presentation.cutCorners\", \"Cut corners\", false),\n boolean(\"delft.presentation.isFloating\", \"Floating controls\", false),\n {\n id: \"delft.presentation.floatingPosition\",\n label: \"Floating position\",\n type: \"select\",\n defaultValue: \"top-left\",\n options: [\n { label: \"Top left\", value: \"top-left\" },\n { label: \"Top right\", value: \"top-right\" },\n { label: \"Bottom left\", value: \"bottom-left\" },\n { label: \"Bottom right\", value: \"bottom-right\" },\n ],\n },\n boolean(\"delft.presentation.labelOnlyFloating\", \"Only float labels\", true),\n // boolean(\"delft.presentation.ignoreCanvasBackgrounds\", \"Ignore canvas backgrounds\", false),\n ],\n },\n {\n id: \"exhibition-scroll\",\n label: \"Scrolling story\",\n summary: \"A vertical reading experience for essays, object stories, and long-form interpretation.\",\n type: \"scroll\",\n previewUrl: \"https://preview.exhibitionviewer.org/preview/delft/scroll\",\n thumbnailUrl: \"https://manifest-editor-docs.netlify.app/exhibition-scroll.png\",\n configuration: [\n boolean(\"scroll.options.showTitleBlock\", \"Show title block\", true),\n boolean(\"scroll.options.titleBlock.fullHeight\", \"Full-height title block\", true),\n boolean(\"scroll.options.showTableOfContents\", \"Show table of contents\", false),\n boolean(\"scroll.options.showProgressBar\", \"Show progress bar\", true),\n boolean(\"scroll.options.showProgressTableOfContents\", \"Show contents in progress bar\", true),\n boolean(\"scroll.options.showScrollToTop\", \"Show scroll-to-top button\", true),\n boolean(\"scroll.options.showNavigationControls\", \"Show navigation controls\", true),\n // boolean(\"scroll.options.ignoreCanvasBackgrounds\", \"Ignore canvas backgrounds\", false),\n ],\n },\n {\n id: \"leeds-exhibition\",\n label: \"Leeds exhibition\",\n summary: \"A full-page exhibition template for the Leeds University Library.\",\n type: \"fullpage\",\n previewUrl: \"https://preview.exhibitionviewer.org/preview/leeds/full-page\",\n thumbnailUrl: \"https://manifest-editor-docs.netlify.app/exhibition-fullpage-leeds.png\",\n configuration: [],\n },\n {\n id: \"leeds-exhibition-slideshow\",\n label: \"Leeds exhibition slideshow\",\n summary: \"A slideshow exhibition template for the Leeds University Library.\",\n type: \"slideshow\",\n previewUrl: \"https://preview.exhibitionviewer.org/preview/leeds/slideshow\",\n thumbnailUrl: \"https://manifest-editor-docs.netlify.app/exhibition-slideshow-leeds.png\",\n configuration: [],\n },\n {\n id: \"leeds-exhibition-scroll\",\n label: \"Leeds exhibition scroll\",\n summary: \"A scroll exhibition template for the Leeds University Library.\",\n type: \"scroll\",\n previewUrl: \"https://preview.exhibitionviewer.org/preview/leeds/scroll\",\n thumbnailUrl: \"https://manifest-editor-docs.netlify.app/exhibition-scroll-leeds.png\",\n configuration: [],\n }\n];\n\nexport function getTemplateConfigurationValue(values: Record<string, any>, path: string): any {\n let current: any = values;\n for (const key of path.split(\".\")) current = current?.[key];\n return current;\n}\n\nexport function setTemplateConfigurationValue(values: Record<string, any>, path: string, value: unknown) {\n const next = structuredClone(values);\n const parts = path.split(\".\");\n let current = next;\n for (const part of parts.slice(0, -1)) current = current[part] ||= {};\n current[parts.at(-1)!] = value;\n return next;\n}\n","import { Sidebar, SidebarContent } from \"@manifest-editor/components\";\nimport { Input, InputContainer, InputLabel } from \"@manifest-editor/editors\";\nimport {\n type LayoutPanel,\n type PresetTemplateConfigurationField,\n useOpenPresetOnboarding,\n} from \"@manifest-editor/shell\";\nimport { DownIcon } from \"@manifest-editor/ui/icons/DownIcon\";\nimport { type ChangeEvent, type ReactNode, useMemo, useState } from \"react\";\nimport { Button } from \"react-aria-components\";\nimport { useManifest, useVault } from \"react-iiif-vault\";\nimport { useConfiguredExhibitionPreviewPreset } from \"../helpers/exhibition-preview-state\";\nimport type {\n ExhibitionThemeConfig,\n ExhibitionThemePreset,\n FloatingPosition,\n TableOfContentsPlacement,\n TitleTransform,\n} from \"../theme/theme-service\";\nimport {\n EXHIBITION_THEME_SERVICE_LABEL,\n EXHIBITION_THEME_SERVICE_PROFILE,\n createThemeService,\n getThemePreset,\n getThemeServiceDetails,\n replaceThemeService,\n resolveThemeConfig,\n} from \"../theme/theme-service\";\nimport { useExhibitionTemplate } from \"../helpers/exhibition-template\";\nimport { PreviewIcon } from \"../icons/PreviewIcon\";\nimport { getTemplateConfigurationValue, setTemplateConfigurationValue } from \"../exhibition-templates\";\n\nexport const exhibitionThemeLeftPanel: LayoutPanel = {\n id: \"@exhibitions/theme-panel\",\n label: \"Preview\",\n icon: <PreviewIcon />,\n render: () => <ExhibitionPreviewPanel />,\n options: {\n minWidth: 360,\n maxWidth: 440,\n },\n};\n\nfunction ExhibitionPreviewPanel() {\n const manifest = useManifest();\n const vault = useVault();\n const template = useExhibitionTemplate();\n const openOnboarding = useOpenPresetOnboarding();\n const serviceList = ((manifest as any)?.service || []) as Array<any>;\n const servicesList = ((manifest as any)?.services || []) as Array<any>;\n const details = getThemeServiceDetails(serviceList) || getThemeServiceDetails(servicesList);\n const configuration = template?.configuration || [];\n const values = (details?.service?.theme || {}) as Record<string, any>;\n const configuredValues = configuration.reduce(\n (result, field) =>\n setTemplateConfigurationValue(\n result,\n field.id,\n getTemplateConfigurationValue(values, field.id) ?? field.defaultValue ?? defaultFieldValue(field),\n ),\n {} as Record<string, any>,\n );\n\n if (!manifest || !template) return null;\n\n const setService = (nextValues: Record<string, any> | null) => {\n const nextService = nextValues\n ? {\n id: `${manifest.id}#exhibition-viewer-theme`,\n type: \"Service\",\n profile: EXHIBITION_THEME_SERVICE_PROFILE,\n label: EXHIBITION_THEME_SERVICE_LABEL,\n theme: nextValues,\n }\n : null;\n const manifestRef = { id: manifest.id, type: \"Manifest\" } as const;\n vault.batch((batch) => {\n batch.modifyEntityField(manifestRef as any, \"service\", replaceThemeService(serviceList, nextService as any));\n if ((manifest as any).services || getThemeServiceDetails(servicesList)) {\n batch.modifyEntityField(manifestRef as any, \"services\", replaceThemeService(servicesList, null));\n }\n });\n };\n\n const enableService = () =>\n setService(configuredValues);\n\n return (\n <Sidebar>\n <SidebarContent padding>\n <ThemeSection title={template.label} description={template.summary}>\n <img src={template.thumbnailUrl} alt=\"\" className=\"aspect-video w-full rounded border border-slate-200 object-cover\" />\n <Button className=\"rounded border border-slate-300 px-3 py-2 text-sm hover:bg-slate-50\" onPress={openOnboarding}>\n Change template\n </Button>\n </ThemeSection>\n\n <ThemeSection\n title=\"Preview configuration\"\n description=\"These settings are defined by the selected template and stored as a service on the Manifest.\"\n >\n {configuration.map((field) => (\n <TemplateConfigurationField\n key={field.id}\n field={field}\n value={getTemplateConfigurationValue(values, field.id) ?? field.defaultValue ?? defaultFieldValue(field)}\n onChange={(value) => setService(setTemplateConfigurationValue(configuredValues, field.id, value))}\n />\n ))}\n {!configuration.length ? <p className=\"text-sm text-slate-500\">This template has no configurable settings.</p> : null}\n {details ? (\n <Button className=\"rounded border border-slate-300 px-3 py-2 text-sm hover:bg-slate-50\" onPress={() => setService(null)}>\n Remove preview service\n </Button>\n ) : (\n <Button className=\"rounded bg-me-primary-600 px-3 py-2 text-sm text-white hover:bg-me-primary-700\" onPress={enableService}>\n Add preview service\n </Button>\n )}\n </ThemeSection>\n <ExhibitionThemeOptions />\n </SidebarContent>\n </Sidebar>\n );\n}\n\nfunction defaultFieldValue(field: PresetTemplateConfigurationField) {\n if (field.type === \"boolean\") return false;\n if (field.type === \"number\") return 0;\n return \"\";\n}\n\nfunction TemplateConfigurationField({\n field,\n value,\n onChange,\n}: {\n field: PresetTemplateConfigurationField;\n value: string | number | boolean;\n onChange: (value: string | number | boolean) => void;\n}) {\n if (field.type === \"boolean\") {\n return <ThemeToggle label={field.label} checked={Boolean(value)} onChange={onChange} />;\n }\n if (field.type === \"select\") {\n return (\n <ThemeSelectField\n label={field.label}\n value={String(value)}\n onChange={onChange}\n options={(field.options || []).map((option) => ({ label: option.label, value: String(option.value) }))}\n />\n );\n }\n return (\n <InputContainer $wide>\n <InputLabel>{field.label}</InputLabel>\n {field.type === \"textarea\" ? (\n <textarea aria-label={field.label} className=\"w-full rounded border border-slate-300 bg-slate-50 px-3 py-2 text-sm\" value={String(value)} onChange={(event) => onChange(event.target.value)} />\n ) : (\n <Input aria-label={field.label} type={field.type === \"number\" ? \"number\" : \"text\"} value={String(value)} onChange={(event: ChangeEvent<HTMLInputElement>) => onChange(field.type === \"number\" ? event.target.valueAsNumber : event.target.value)} />\n )}\n </InputContainer>\n );\n}\n\ntype ServiceDetails = {\n service: any;\n} | null;\n\ntype ThemePanelMode = \"simple\" | \"advanced\";\ntype ThemeTarget = \"presentation\" | \"slideshow\" | \"scroll\";\n\nfunction ThemeSection({\n title,\n description,\n children,\n collapsible = false,\n}: {\n title: string;\n description?: string;\n children?: ReactNode;\n collapsible?: boolean;\n}) {\n const [isOpen, setIsOpen] = useState(true);\n\n if (collapsible) {\n return (\n <section className=\"mb-3 rounded-md border border-slate-200 bg-white last:mb-0\">\n <Button\n className=\"flex w-full items-center justify-between gap-3 px-3 py-3 text-left hover:bg-slate-50\"\n aria-expanded={isOpen}\n onPress={() => setIsOpen((open) => !open)}\n >\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-semibold\">{title}</span>\n {description ? (\n <span className=\"mt-1 block text-xs text-slate-500\">\n {description}\n </span>\n ) : null}\n </span>\n <DownIcon\n className=\"shrink-0 text-base text-slate-500\"\n rotate={isOpen ? 0 : -90}\n aria-hidden\n />\n </Button>\n {isOpen && children ? (\n <div className=\"space-y-3 border-t border-slate-200 px-3 py-3\">\n {children}\n </div>\n ) : null}\n </section>\n );\n }\n\n return (\n <section className=\"mb-5 border-b border-slate-200 pb-5 last:mb-0 last:border-b-0\">\n <div className=\"mb-3\">\n <h3 className=\"text-sm font-semibold\">{title}</h3>\n {description ? (\n <p className=\"mt-1 text-xs text-slate-500\">{description}</p>\n ) : null}\n </div>\n {children ? <div className=\"space-y-3\">{children}</div> : null}\n </section>\n );\n}\n\nfunction ThemeInlineSelect<T extends string>({\n label,\n value,\n onChange,\n options,\n}: {\n label: string;\n value: T;\n onChange: (value: T) => void;\n options: Array<{ label: string; value: T }>;\n}) {\n return (\n <div>\n <div className=\"mb-2 text-xs font-medium text-slate-500\">{label}</div>\n <div className=\"flex flex-wrap gap-1 rounded-md border border-slate-200 bg-slate-100 p-1\">\n {options.map((option) => {\n const isActive = option.value === value;\n return (\n <Button\n key={option.value}\n className={[\n \"rounded px-2 py-1.5 text-sm transition-colors\",\n isActive\n ? \"bg-white font-semibold text-slate-950 shadow-sm\"\n : \"text-slate-600 hover:bg-white/70 hover:text-slate-900\",\n ].join(\" \")}\n aria-pressed={isActive}\n onPress={() => onChange(option.value)}\n >\n {option.label}\n </Button>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction ThemeToggle({\n label,\n checked,\n disabled = false,\n onChange,\n}: {\n label: string;\n checked: boolean;\n disabled?: boolean;\n onChange: (checked: boolean) => void;\n}) {\n return (\n <label className={`flex items-center gap-3 text-sm ${disabled ? \"opacity-50\" : \"\"}`}>\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onChange(event.target.checked)\n }\n />\n <span>{label}</span>\n </label>\n );\n}\n\nfunction ThemeColorField({\n label,\n value,\n onChange,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}) {\n return (\n <div\n className=\"items-center\"\n style={{\n display: \"grid\",\n gap: \"0.5rem\",\n gridTemplateColumns: \"minmax(0, 1fr) 3rem 100px\",\n }}\n >\n <label className=\"min-w-0 truncate whitespace-nowrap text-sm\">\n {label}\n </label>\n <input\n aria-label={`${label} colour picker`}\n className=\"h-9 w-12 shrink-0 cursor-pointer rounded border border-slate-300 bg-white p-1\"\n type=\"color\"\n value={toHexColor(value)}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onChange(event.target.value)\n }\n />\n <div className=\"min-w-0\">\n <Input\n aria-label={`${label} colour value`}\n style={{ width: \"100%\" }}\n value={value}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onChange(event.target.value)\n }\n />\n </div>\n </div>\n );\n}\n\nfunction ThemeTextField({\n label,\n value,\n onChange,\n}: {\n label: string;\n value: string;\n onChange: (value: string) => void;\n}) {\n return (\n <InputContainer $wide>\n <InputLabel>{label}</InputLabel>\n <Input\n aria-label={label}\n value={value}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n onChange(event.target.value)\n }\n />\n </InputContainer>\n );\n}\n\nfunction ThemeSelectField<T extends string>({\n label,\n value,\n disabled = false,\n onChange,\n options,\n}: {\n label: string;\n value: T;\n disabled?: boolean;\n onChange: (value: T) => void;\n options: Array<{ label: string; value: T }>;\n}) {\n return (\n <InputContainer $wide>\n <InputLabel>{label}</InputLabel>\n <select\n aria-label={label}\n className=\"w-full rounded border border-slate-300 bg-slate-50 px-3 py-2 text-sm disabled:cursor-not-allowed disabled:opacity-50\"\n value={value}\n disabled={disabled}\n onChange={(event: ChangeEvent<HTMLSelectElement>) =>\n onChange(event.target.value as T)\n }\n >\n {options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </InputContainer>\n );\n}\n\nfunction toHexColor(value: string) {\n const trimmed = value.trim();\n if (/^#[0-9a-fA-F]{6}$/.test(trimmed)) {\n return trimmed;\n }\n if (/^#[0-9a-fA-F]{3}$/.test(trimmed)) {\n const [r, g, b] = trimmed.slice(1);\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return \"#ffffff\";\n}\n\nfunction cloneTheme(theme: ExhibitionThemeConfig) {\n return JSON.parse(JSON.stringify(theme)) as ExhibitionThemeConfig;\n}\n\nfunction setThemeValue(\n theme: ExhibitionThemeConfig,\n path: string[],\n value: unknown,\n) {\n const next = cloneTheme(theme) as Record<string, any>;\n let current = next;\n for (const segment of path.slice(0, -1)) {\n current[segment] ||= {};\n current = current[segment];\n }\n const finalSegment = path[path.length - 1];\n if (!finalSegment) {\n return next as ExhibitionThemeConfig;\n }\n current[finalSegment] = value;\n return next as ExhibitionThemeConfig;\n}\n\nfunction setThemeValues(\n theme: ExhibitionThemeConfig,\n updates: Array<{ path: string[]; value: unknown }>,\n) {\n const next = cloneTheme(theme) as Record<string, any>;\n\n for (const update of updates) {\n let current = next;\n for (const segment of update.path.slice(0, -1)) {\n current[segment] ||= {};\n current = current[segment];\n }\n const finalSegment = update.path[update.path.length - 1];\n if (finalSegment) {\n current[finalSegment] = update.value;\n }\n }\n\n return next as ExhibitionThemeConfig;\n}\n\nfunction ExhibitionThemeOptions() {\n const manifest = useManifest();\n const vault = useVault();\n const previewPreset = useConfiguredExhibitionPreviewPreset();\n const [themeMode, setThemeMode] = useState<ThemePanelMode>(\"simple\");\n const themeTarget: ThemeTarget =\n previewPreset === \"scroll\"\n ? \"scroll\"\n : previewPreset === \"slideshow\"\n ? \"slideshow\"\n : \"presentation\";\n const serviceList = ((manifest as any)?.service || []) as Array<any>;\n const servicesList = ((manifest as any)?.services || []) as Array<any>;\n\n const serviceDetails = useMemo<ServiceDetails>(() => {\n const directDetails = getThemeServiceDetails(serviceList);\n if (directDetails) {\n return { service: directDetails.service };\n }\n\n const pluralDetails = getThemeServiceDetails(servicesList);\n if (pluralDetails) {\n return { service: pluralDetails.service };\n }\n\n return null;\n }, [serviceList, servicesList]);\n\n const storedTheme = useMemo(() => {\n if (!serviceDetails) {\n return null;\n }\n return resolveThemeConfig(serviceDetails.service.theme);\n }, [serviceDetails]);\n\n const resolvedTheme = storedTheme || getThemePreset(\"delft\");\n\n if (!manifest) {\n return null;\n }\n\n const upsertTheme = (nextTheme: ExhibitionThemeConfig | null) => {\n const nextService = nextTheme\n ? createThemeService(manifest.id, nextTheme)\n : null;\n const nextServiceList = replaceThemeService(serviceList, nextService);\n const nextLegacyServiceList = replaceThemeService(servicesList, null);\n const manifestRef = { id: manifest.id, type: \"Manifest\" } as const;\n\n vault.batch((batch) => {\n batch.modifyEntityField(manifestRef as any, \"service\", nextServiceList);\n\n if (\n (manifest as any).services ||\n nextLegacyServiceList.length !== servicesList.length\n ) {\n batch.modifyEntityField(\n manifestRef as any,\n \"services\",\n nextLegacyServiceList,\n );\n }\n });\n };\n\n const updatePath = (path: string[], value: unknown) => {\n upsertTheme(setThemeValue(resolvedTheme, path, value));\n };\n\n const updatePaths = (updates: Array<{ path: string[]; value: unknown }>) => {\n upsertTheme(setThemeValues(resolvedTheme, updates));\n };\n\n const setSimpleBaseColor = (value: string) => {\n const sharedBaseUpdates = [\n { path: [\"delft\", \"tokens\", \"backgroundPrimary\"], value },\n { path: [\"delft\", \"tokens\", \"backgroundSecondary\"], value },\n { path: [\"delft\", \"tokens\", \"backgroundOverlay\"], value },\n { path: [\"delft\", \"tokens\", \"controlBar\"], value },\n { path: [\"delft\", \"tokens\", \"controlBarBorder\"], value },\n { path: [\"delft\", \"tokens\", \"closeBackground\"], value },\n { path: [\"delft\", \"tokens\", \"closeBackgroundHover\"], value },\n { path: [\"delft\", \"tokens\", \"infoBlock\"], value },\n { path: [\"delft\", \"tokens\", \"viewerBackground\"], value },\n ];\n const titleCardUpdates =\n themeTarget === \"presentation\"\n ? [{ path: [\"delft\", \"tokens\", \"titleCard\"], value }]\n : [];\n\n if (themeTarget === \"scroll\") {\n updatePaths([\n ...sharedBaseUpdates,\n { path: [\"scroll\", \"tokens\", \"titleBackground\"], value },\n { path: [\"scroll\", \"tokens\", \"annotationBackground\"], value },\n { path: [\"scroll\", \"tokens\", \"infoBlockBackground\"], value },\n ]);\n return;\n }\n\n updatePaths([...sharedBaseUpdates, ...titleCardUpdates]);\n };\n\n const setSimpleTextColor = (value: string) => {\n const sharedTextUpdates = [\n { path: [\"delft\", \"tokens\", \"textPrimary\"], value },\n { path: [\"delft\", \"tokens\", \"textSecondary\"], value },\n { path: [\"delft\", \"tokens\", \"imageCaption\"], value },\n { path: [\"delft\", \"tokens\", \"closeText\"], value },\n { path: [\"delft\", \"tokens\", \"infoBlockText\"], value },\n ];\n const titleCardTextUpdates =\n themeTarget === \"presentation\"\n ? [{ path: [\"delft\", \"tokens\", \"titleCardText\"], value }]\n : [];\n\n if (themeTarget === \"scroll\") {\n updatePaths([\n ...sharedTextUpdates,\n { path: [\"scroll\", \"tokens\", \"titleColor\"], value },\n { path: [\"scroll\", \"tokens\", \"annotationColor\"], value },\n { path: [\"scroll\", \"tokens\", \"infoBlockColor\"], value },\n ]);\n return;\n }\n\n updatePaths([...sharedTextUpdates, ...titleCardTextUpdates]);\n };\n\n const setShowContentsNavigation = (value: boolean) => {\n if (themeTarget === \"scroll\") {\n updatePath([\"scroll\", \"options\", \"showTableOfContents\"], value);\n return;\n }\n\n updatePath([\"delft\", \"exhibition\", \"hideTableOfContents\"], !value);\n };\n\n const setTableOfContentsPlacement = (value: TableOfContentsPlacement) => {\n if (themeTarget === \"scroll\") {\n updatePath([\"scroll\", \"options\", \"tableOfContentsPlacement\"], value);\n return;\n }\n\n updatePath([\"delft\", \"exhibition\", \"tableOfContentsPlacement\"], value);\n };\n\n const setImageDisplayStyle = (value: \"default\" | \"alternative\") => {\n const path =\n themeTarget === \"slideshow\"\n ? [\"delft\", \"slideshow\", \"alternativeImageMode\"]\n : [\"delft\", \"exhibition\", \"alternativeImageMode\"];\n updatePath(path, value === \"alternative\");\n };\n\n const setCoverImages = (value: boolean) => {\n const path =\n themeTarget === \"slideshow\"\n ? [\"delft\", \"slideshow\", \"coverImages\"]\n : [\"delft\", \"exhibition\", \"coverImages\"];\n updatePath(path, value);\n };\n\n const showContentsNavigation =\n themeTarget === \"scroll\"\n ? resolvedTheme.scroll.options.showTableOfContents\n : !resolvedTheme.delft.exhibition.hideTableOfContents;\n const tableOfContentsPlacement =\n themeTarget === \"scroll\"\n ? resolvedTheme.scroll.options.tableOfContentsPlacement\n : resolvedTheme.delft.exhibition.tableOfContentsPlacement;\n const imageDisplayStyle =\n (themeTarget === \"slideshow\"\n ? resolvedTheme.delft.slideshow.alternativeImageMode\n : resolvedTheme.delft.exhibition.alternativeImageMode)\n ? \"alternative\"\n : \"default\";\n const coverImages =\n themeTarget === \"slideshow\"\n ? resolvedTheme.delft.slideshow.coverImages\n : resolvedTheme.delft.exhibition.coverImages;\n const progressBarEnabled =\n themeTarget === \"scroll\"\n ? resolvedTheme.scroll.options.showProgressBar\n : resolvedTheme.delft.exhibition.showProgressBar;\n\n const enableTheme = (enabled: boolean) => {\n if (!enabled) {\n upsertTheme(null);\n return;\n }\n upsertTheme(getThemePreset(\"delft\"));\n };\n\n const setPreset = (preset: ExhibitionThemePreset) => {\n upsertTheme(getThemePreset(preset));\n };\n\n const resetToPreset = () => {\n upsertTheme(getThemePreset(resolvedTheme.preset));\n };\n\n return (\n <>\n <ThemeSection\n title=\"Saved Theme\"\n description=\"Save custom exhibition styling and viewer defaults on the Manifest.\"\n >\n <ThemeToggle\n label=\"Save custom theme\"\n checked={!!serviceDetails}\n onChange={enableTheme}\n />\n\n <div className=\"flex flex-wrap gap-2\">\n <Button\n className=\"rounded border border-slate-300 px-3 py-2 text-sm hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50\"\n onPress={resetToPreset}\n isDisabled={!serviceDetails}\n >\n Reset selected theme\n </Button>\n <Button\n className=\"rounded border border-slate-300 px-3 py-2 text-sm hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-50\"\n onPress={() => upsertTheme(null)}\n isDisabled={!serviceDetails}\n >\n Clear saved settings\n </Button>\n </div>\n\n <ThemeInlineSelect<ExhibitionThemePreset>\n label=\"Preset\"\n value={resolvedTheme.preset}\n onChange={setPreset}\n options={[\n { label: \"Delft\", value: \"delft\" },\n { label: \"Gallery\", value: \"gallery\" },\n { label: \"Minimal\", value: \"minimal\" },\n ]}\n />\n </ThemeSection>\n\n <ThemeSection\n title=\"Theme Options\"\n description=\"Choose a shorter or more detailed set of theme controls.\"\n >\n <ThemeInlineSelect<ThemePanelMode>\n label=\"Editing mode\"\n value={themeMode}\n onChange={setThemeMode}\n options={[\n { label: \"Simple\", value: \"simple\" },\n { label: \"Advanced\", value: \"advanced\" },\n ]}\n />\n </ThemeSection>\n\n {themeMode === \"simple\" ? (\n <ThemeSection\n title=\"Key Settings\"\n description={\n themeTarget === \"scroll\"\n ? \"Main background updates the opening title, annotation cards, info blocks, and viewer background.\"\n : \"The main controls most people need for this theme.\"\n }\n >\n <ThemeColorField\n label=\"Main background\"\n value={\n themeTarget === \"scroll\"\n ? resolvedTheme.scroll.tokens.titleBackground\n : resolvedTheme.delft.tokens.viewerBackground\n }\n onChange={setSimpleBaseColor}\n />\n <ThemeColorField\n label=\"Text colour\"\n value={\n themeTarget === \"scroll\"\n ? resolvedTheme.scroll.tokens.titleColor\n : resolvedTheme.delft.tokens.textSecondary\n }\n onChange={setSimpleTextColor}\n />\n <ThemeTextField\n label=\"Heading font\"\n value={resolvedTheme.shared.fontSans}\n onChange={(value) => updatePath([\"shared\", \"fontSans\"], value)}\n />\n <ThemeTextField\n label=\"Body font\"\n value={resolvedTheme.shared.fontMono}\n onChange={(value) => updatePath([\"shared\", \"fontMono\"], value)}\n />\n {themeTarget !== \"scroll\" ? (\n <ThemeSelectField<TitleTransform>\n label=\"Title capitalisation\"\n value={resolvedTheme.shared.titleTransform}\n onChange={(value) =>\n updatePath([\"shared\", \"titleTransform\"], value)\n }\n options={[\n { label: \"Uppercase\", value: \"uppercase\" },\n { label: \"None\", value: \"none\" },\n { label: \"Capitalize\", value: \"capitalize\" },\n ]}\n />\n ) : null}\n {themeTarget === \"presentation\" ? (\n <>\n <ThemeToggle\n label=\"Table of Contents bar\"\n checked={showContentsNavigation}\n onChange={setShowContentsNavigation}\n />\n <ThemeToggle\n label=\"Full-width title bar\"\n checked={resolvedTheme.delft.exhibition.fullTitleBar}\n onChange={(value) =>\n updatePath([\"delft\", \"exhibition\", \"fullTitleBar\"], value)\n }\n />\n <ThemeSelectField<\"default\" | \"alternative\">\n label=\"Image layout\"\n value={imageDisplayStyle}\n onChange={setImageDisplayStyle}\n options={[\n { label: \"Standard\", value: \"default\" },\n { label: \"Feature image\", value: \"alternative\" },\n ]}\n />\n <ThemeToggle\n label=\"Fill image area\"\n checked={coverImages}\n onChange={setCoverImages}\n />\n </>\n ) : null}\n {themeTarget === \"slideshow\" ? (\n <>\n <ThemeSelectField<\"default\" | \"alternative\">\n label=\"Image layout\"\n value={imageDisplayStyle}\n onChange={setImageDisplayStyle}\n options={[\n { label: \"Standard\", value: \"default\" },\n { label: \"Feature image\", value: \"alternative\" },\n ]}\n />\n <ThemeToggle\n label=\"Fill image area\"\n checked={coverImages}\n onChange={setCoverImages}\n />\n <ThemeToggle\n label=\"Zoom effect\"\n checked={resolvedTheme.delft.slideshow.transitionScale}\n onChange={(value) =>\n updatePath([\"delft\", \"slideshow\", \"transitionScale\"], value)\n }\n />\n </>\n ) : null}\n {themeTarget === \"scroll\" ? (\n <>\n <ThemeToggle\n label=\"Full-height title\"\n checked={resolvedTheme.scroll.options.titleBlock.fullHeight}\n onChange={(value) =>\n updatePath(\n [\"scroll\", \"options\", \"titleBlock\", \"fullHeight\"],\n value,\n )\n }\n />\n </>\n ) : null}\n </ThemeSection>\n ) : (\n <>\n {themeTarget === \"presentation\" ? (\n <ThemeSection title=\"Opening Title\" collapsible>\n <ThemeColorField\n label=\"Card background\"\n value={resolvedTheme.delft.tokens.titleCard}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"titleCard\"], value)\n }\n />\n <ThemeColorField\n label=\"Card text\"\n value={resolvedTheme.delft.tokens.titleCardText}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"titleCardText\"], value)\n }\n />\n <ThemeToggle\n label=\"Hide title\"\n checked={resolvedTheme.delft.exhibition.hideTitle}\n onChange={(value) =>\n updatePath([\"delft\", \"exhibition\", \"hideTitle\"], value)\n }\n />\n <ThemeToggle\n label=\"Hide title card\"\n checked={resolvedTheme.delft.exhibition.hideTitleCard}\n onChange={(value) =>\n updatePath([\"delft\", \"exhibition\", \"hideTitleCard\"], value)\n }\n />\n </ThemeSection>\n ) : null}\n\n {themeTarget === \"scroll\" ? (\n <ThemeSection title=\"Opening Title\" collapsible>\n <ThemeToggle\n label=\"Show opening title\"\n checked={resolvedTheme.scroll.options.showTitleBlock}\n onChange={(value) =>\n updatePath([\"scroll\", \"options\", \"showTitleBlock\"], value)\n }\n />\n <ThemeToggle\n label=\"Show table of contents\"\n checked={showContentsNavigation}\n onChange={setShowContentsNavigation}\n />\n <ThemeColorField\n label=\"Background\"\n value={resolvedTheme.scroll.tokens.titleBackground}\n onChange={(value) =>\n updatePath([\"scroll\", \"tokens\", \"titleBackground\"], value)\n }\n />\n <ThemeColorField\n label=\"Text\"\n value={resolvedTheme.scroll.tokens.titleColor}\n onChange={(value) =>\n updatePath([\"scroll\", \"tokens\", \"titleColor\"], value)\n }\n />\n <ThemeToggle\n label=\"Full-height title\"\n checked={resolvedTheme.scroll.options.titleBlock.fullHeight}\n onChange={(value) =>\n updatePath(\n [\"scroll\", \"options\", \"titleBlock\", \"fullHeight\"],\n value,\n )\n }\n />\n </ThemeSection>\n ) : null}\n\n <ThemeSection\n title=\"Page & Viewer\"\n description={\n themeTarget === \"scroll\"\n ? \"Shared backgrounds around the Scroll view. Opening title, annotation, and info block colours are controlled below.\"\n : undefined\n }\n collapsible\n >\n <ThemeColorField\n label=\"Viewer background\"\n value={resolvedTheme.delft.tokens.viewerBackground}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"viewerBackground\"], value)\n }\n />\n <ThemeColorField\n label=\"Main\"\n value={resolvedTheme.delft.tokens.backgroundPrimary}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"backgroundPrimary\"], value)\n }\n />\n <ThemeColorField\n label=\"Secondary\"\n value={resolvedTheme.delft.tokens.backgroundSecondary}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"backgroundSecondary\"], value)\n }\n />\n <ThemeColorField\n label=\"Overlay\"\n value={resolvedTheme.delft.tokens.backgroundOverlay}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"backgroundOverlay\"], value)\n }\n />\n {themeTarget === \"scroll\" ? (\n <ThemeToggle\n label=\"Use theme background instead of canvas colours\"\n checked={resolvedTheme.scroll.options.ignoreCanvasBackgrounds}\n onChange={(value) =>\n updatePath(\n [\"scroll\", \"options\", \"ignoreCanvasBackgrounds\"],\n value,\n )\n }\n />\n ) : null}\n </ThemeSection>\n\n {themeTarget !== \"scroll\" ? (\n <ThemeSection\n title=\"Text Colours\"\n description=\"General fallback text colours. Captions, info blocks, and controls have their own options below.\"\n collapsible\n >\n <ThemeColorField\n label=\"Dark text\"\n value={resolvedTheme.delft.tokens.textPrimary}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"textPrimary\"], value)\n }\n />\n <ThemeColorField\n label=\"Light text\"\n value={resolvedTheme.delft.tokens.textSecondary}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"textSecondary\"], value)\n }\n />\n </ThemeSection>\n ) : null}\n\n <ThemeSection title=\"Info Blocks\" collapsible>\n {themeTarget === \"scroll\" ? (\n <>\n <ThemeColorField\n label=\"Background\"\n value={resolvedTheme.scroll.tokens.infoBlockBackground}\n onChange={(value) =>\n updatePath(\n [\"scroll\", \"tokens\", \"infoBlockBackground\"],\n value,\n )\n }\n />\n <ThemeColorField\n label=\"Text\"\n value={resolvedTheme.scroll.tokens.infoBlockColor}\n onChange={(value) =>\n updatePath([\"scroll\", \"tokens\", \"infoBlockColor\"], value)\n }\n />\n </>\n ) : (\n <>\n <ThemeColorField\n label=\"Background\"\n value={resolvedTheme.delft.tokens.infoBlock}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"infoBlock\"], value)\n }\n />\n <ThemeColorField\n label=\"Text\"\n value={resolvedTheme.delft.tokens.infoBlockText}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"infoBlockText\"], value)\n }\n />\n </>\n )}\n </ThemeSection>\n\n <ThemeSection title=\"Images & Annotations\" collapsible>\n {themeTarget !== \"scroll\" ? (\n <>\n <ThemeColorField\n label=\"Image caption\"\n value={resolvedTheme.delft.tokens.imageCaption}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"imageCaption\"], value)\n }\n />\n <ThemeColorField\n label=\"Selected hotspot\"\n value={resolvedTheme.delft.tokens.annotationSelected}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"annotationSelected\"], value)\n }\n />\n <ThemeSelectField<\"default\" | \"alternative\">\n label=\"Image layout\"\n value={imageDisplayStyle}\n onChange={setImageDisplayStyle}\n options={[\n { label: \"Standard\", value: \"default\" },\n { label: \"Feature image\", value: \"alternative\" },\n ]}\n />\n <ThemeToggle\n label=\"Info button\"\n checked={\n themeTarget === \"slideshow\"\n ? resolvedTheme.delft.slideshow.imageInfoIcon\n : resolvedTheme.delft.exhibition.imageInfoIcon\n }\n onChange={(value) =>\n updatePath(\n themeTarget === \"slideshow\"\n ? [\"delft\", \"slideshow\", \"imageInfoIcon\"]\n : [\"delft\", \"exhibition\", \"imageInfoIcon\"],\n value,\n )\n }\n />\n <ThemeToggle\n label=\"Fill image area\"\n checked={coverImages}\n onChange={setCoverImages}\n />\n <ThemeToggle\n label=\"Use theme background instead of canvas colours\"\n checked={\n themeTarget === \"slideshow\"\n ? resolvedTheme.delft.slideshow.ignoreCanvasBackgrounds\n : resolvedTheme.delft.exhibition.ignoreCanvasBackgrounds\n }\n onChange={(value) =>\n updatePath(\n themeTarget === \"slideshow\"\n ? [\"delft\", \"slideshow\", \"ignoreCanvasBackgrounds\"]\n : [\"delft\", \"exhibition\", \"ignoreCanvasBackgrounds\"],\n value,\n )\n }\n />\n </>\n ) : null}\n {themeTarget === \"scroll\" ? (\n <>\n <ThemeColorField\n label=\"Annotation background\"\n value={resolvedTheme.scroll.tokens.annotationBackground}\n onChange={(value) =>\n updatePath(\n [\"scroll\", \"tokens\", \"annotationBackground\"],\n value,\n )\n }\n />\n <ThemeColorField\n label=\"Annotation text\"\n value={resolvedTheme.scroll.tokens.annotationColor}\n onChange={(value) =>\n updatePath([\"scroll\", \"tokens\", \"annotationColor\"], value)\n }\n />\n <ThemeTextField\n label=\"Corner radius\"\n value={resolvedTheme.scroll.tokens.annotationRadius}\n onChange={(value) =>\n updatePath([\"scroll\", \"tokens\", \"annotationRadius\"], value)\n }\n />\n <ThemeTextField\n label=\"Max width\"\n value={resolvedTheme.scroll.tokens.annotationMaxWidth}\n onChange={(value) =>\n updatePath(\n [\"scroll\", \"tokens\", \"annotationMaxWidth\"],\n value,\n )\n }\n />\n </>\n ) : null}\n </ThemeSection>\n\n <ThemeSection\n title=\"Navigation & Controls\"\n description={\n themeTarget === \"scroll\"\n ? \"Scroll contents navigation, placement, dropdown text, and progress colours.\"\n : themeTarget === \"slideshow\"\n ? \"Slideshow controls, progress, and overlay buttons. Contents controls only apply to Full page and Scroll.\"\n : \"Contents, viewer controls, progress, and overlay buttons.\"\n }\n collapsible\n >\n {themeTarget === \"presentation\" || themeTarget === \"scroll\" ? (\n <ThemeToggle\n label=\"Progress bar\"\n checked={progressBarEnabled}\n onChange={(value) =>\n updatePath(\n themeTarget === \"scroll\"\n ? [\"scroll\", \"options\", \"showProgressBar\"]\n : [\"delft\", \"exhibition\", \"showProgressBar\"],\n value,\n )\n }\n />\n ) : null}\n {themeTarget === \"presentation\" || themeTarget === \"scroll\" ? (\n <ThemeToggle\n label=\"Previous/next side controls\"\n checked={\n themeTarget === \"scroll\"\n ? resolvedTheme.scroll.options.showNavigationControls\n : resolvedTheme.delft.exhibition.showNavigationControls\n }\n onChange={(value) =>\n updatePath(\n themeTarget === \"scroll\"\n ? [\"scroll\", \"options\", \"showNavigationControls\"]\n : [\"delft\", \"exhibition\", \"showNavigationControls\"],\n value,\n )\n }\n />\n ) : null}\n {themeTarget === \"presentation\" ? (\n <ThemeToggle\n label=\"Table of Contents bar\"\n checked={showContentsNavigation}\n onChange={setShowContentsNavigation}\n />\n ) : null}\n {themeTarget === \"presentation\" || themeTarget === \"scroll\" ? (\n <ThemeSelectField<TableOfContentsPlacement>\n label=\"Contents position\"\n value={tableOfContentsPlacement}\n disabled={!showContentsNavigation}\n onChange={setTableOfContentsPlacement}\n options={[\n { label: \"Header\", value: \"header\" },\n { label: \"Footer\", value: \"footer\" },\n ]}\n />\n ) : null}\n {themeTarget === \"scroll\" ? (\n <ThemeToggle\n label=\"Back to top button\"\n checked={resolvedTheme.scroll.options.showScrollToTop}\n onChange={(value) =>\n updatePath([\"scroll\", \"options\", \"showScrollToTop\"], value)\n }\n />\n ) : null}\n <ThemeColorField\n label=\"Navigation bar background\"\n value={resolvedTheme.delft.tokens.controlBar}\n onChange={(value) =>\n updatePaths([\n { path: [\"delft\", \"tokens\", \"controlBar\"], value },\n { path: [\"delft\", \"tokens\", \"controlBarBorder\"], value },\n ])\n }\n />\n <ThemeColorField\n label=\"Navigation text colour\"\n value={resolvedTheme.delft.tokens.closeText}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"closeText\"], value)\n }\n />\n <ThemeColorField\n label=\"Progress bar colour\"\n value={resolvedTheme.delft.tokens.progressBar}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"progressBar\"], value)\n }\n />\n {themeTarget !== \"scroll\" ? (\n <>\n <ThemeColorField\n label=\"Close button background\"\n value={resolvedTheme.delft.tokens.closeBackground}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"closeBackground\"], value)\n }\n />\n <ThemeColorField\n label=\"Close button hover\"\n value={resolvedTheme.delft.tokens.closeBackgroundHover}\n onChange={(value) =>\n updatePath(\n [\"delft\", \"tokens\", \"closeBackgroundHover\"],\n value,\n )\n }\n />\n </>\n ) : (\n <ThemeColorField\n label=\"Back to top button background\"\n value={resolvedTheme.delft.tokens.closeBackground}\n onChange={(value) =>\n updatePath([\"delft\", \"tokens\", \"closeBackground\"], value)\n }\n />\n )}\n </ThemeSection>\n\n {themeTarget === \"presentation\" ? (\n <>\n <ThemeSection title=\"Display & Layout\" collapsible>\n <ThemeToggle\n label=\"Angled corners\"\n checked={resolvedTheme.delft.exhibition.cutCorners}\n onChange={(value) =>\n updatePath([\"delft\", \"exhibition\", \"cutCorners\"], value)\n }\n />\n <ThemeToggle\n label=\"Full-width title bar\"\n checked={resolvedTheme.delft.exhibition.fullTitleBar}\n onChange={(value) =>\n updatePath([\"delft\", \"exhibition\", \"fullTitleBar\"], value)\n }\n />\n <ThemeToggle\n label=\"Full-width item grid\"\n checked={resolvedTheme.delft.exhibition.fullWidthGrid}\n onChange={(value) =>\n updatePath([\"delft\", \"exhibition\", \"fullWidthGrid\"], value)\n }\n />\n <ThemeToggle\n label=\"Use theme background instead of canvas colours\"\n checked={resolvedTheme.delft.exhibition.ignoreCanvasBackgrounds}\n onChange={(value) =>\n updatePath(\n [\"delft\", \"exhibition\", \"ignoreCanvasBackgrounds\"],\n value,\n )\n }\n />\n </ThemeSection>\n <ThemeSection title=\"Interaction Behaviour\" collapsible>\n <ThemeSelectField<\"available\" | \"disabled\">\n label=\"Presentation mode\"\n value={\n resolvedTheme.delft.exhibition.disablePresentation\n ? \"disabled\"\n : \"available\"\n }\n onChange={(value) =>\n updatePath(\n [\"delft\", \"exhibition\", \"disablePresentation\"],\n value === \"disabled\",\n )\n }\n options={[\n { label: \"Available\", value: \"available\" },\n { label: \"Disabled\", value: \"disabled\" },\n ]}\n />\n <ThemeToggle\n label=\"Zoom effect\"\n checked={resolvedTheme.delft.exhibition.transitionScale}\n onChange={(value) =>\n updatePath([\"delft\", \"exhibition\", \"transitionScale\"], value)\n }\n />\n <ThemeToggle\n label=\"Floating panels\"\n checked={resolvedTheme.delft.presentation.isFloating}\n onChange={(value) =>\n updatePath([\"delft\", \"presentation\", \"isFloating\"], value)\n }\n />\n {resolvedTheme.delft.presentation.isFloating ? (\n <ThemeToggle\n label=\"Label-only floating\"\n checked={resolvedTheme.delft.presentation.labelOnlyFloating}\n onChange={(value) =>\n updatePath(\n [\"delft\", \"presentation\", \"labelOnlyFloating\"],\n value,\n )\n }\n />\n ) : null}\n {resolvedTheme.delft.presentation.isFloating ? (\n <ThemeSelectField<FloatingPosition>\n label=\"Panel position\"\n value={resolvedTheme.delft.presentation.floatingPosition}\n onChange={(value) =>\n updatePath(\n [\"delft\", \"presentation\", \"floatingPosition\"],\n value,\n )\n }\n options={[\n { label: \"Top left\", value: \"top-left\" },\n { label: \"Top right\", value: \"top-right\" },\n { label: \"Bottom left\", value: \"bottom-left\" },\n { label: \"Bottom right\", value: \"bottom-right\" },\n { label: \"Top\", value: \"top\" },\n { label: \"Bottom\", value: \"bottom\" },\n { label: \"Left\", value: \"left\" },\n { label: \"Right\", value: \"right\" },\n ]}\n />\n ) : null}\n <ThemeToggle\n label=\"Angled panel corners\"\n checked={resolvedTheme.delft.presentation.cutCorners}\n onChange={(value) =>\n updatePath([\"delft\", \"presentation\", \"cutCorners\"], value)\n }\n />\n <ThemeToggle\n label=\"Use theme background instead of canvas colours\"\n checked={resolvedTheme.delft.presentation.ignoreCanvasBackgrounds}\n onChange={(value) =>\n updatePath(\n [\"delft\", \"presentation\", \"ignoreCanvasBackgrounds\"],\n value,\n )\n }\n />\n </ThemeSection>\n </>\n ) : null}\n\n {themeTarget === \"slideshow\" ? (\n <ThemeSection title=\"Interaction Behaviour\" collapsible>\n <ThemeToggle\n label=\"Zoom effect\"\n checked={resolvedTheme.delft.slideshow.transitionScale}\n onChange={(value) =>\n updatePath([\"delft\", \"slideshow\", \"transitionScale\"], value)\n }\n />\n </ThemeSection>\n ) : null}\n </>\n )}\n </>\n );\n}\n\nfunction ThemeIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"currentColor\"\n viewBox=\"0 -960 960 960\"\n >\n <title>Theme</title>\n <path d=\"M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 32.5-156T201-763q56-54 131-85.5T492-880q79 0 147 27t120 74q52 47 81.5 110T870-533q0 93-56 147t-145 54h-72q-18 0-28 10t-10 25q0 15 12 31.5t12 39.5q0 55-29 100.5T480-80ZM280-480q25 0 42.5-17.5T340-540q0-25-17.5-42.5T280-600q-25 0-42.5 17.5T220-540q0 25 17.5 42.5T280-480Zm120-160q25 0 42.5-17.5T460-700q0-25-17.5-42.5T400-760q-25 0-42.5 17.5T340-700q0 25 17.5 42.5T400-640Zm160 0q25 0 42.5-17.5T620-700q0-25-17.5-42.5T560-760q-25 0-42.5 17.5T500-700q0 25 17.5 42.5T560-640Zm120 160q25 0 42.5-17.5T740-540q0-25-17.5-42.5T680-600q-25 0-42.5 17.5T620-540q0 25 17.5 42.5T680-480Z\" />\n </svg>\n );\n}\n","import {\n type BackgroundPanel,\n useLayoutActions,\n useLayoutState,\n} from \"@manifest-editor/shell\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useManifest } from \"react-iiif-vault\";\nimport { exhibitionCenterPanel } from \"./center-panels/ExhibitionCenterPanel\";\nimport { exhibitionRemotePreviewPanel } from \"./center-panels/ExhibitionRemotePreviewPanel\";\nimport { exhibitionGridLeftPanel } from \"./left-panels/ExhibitionGrid\";\nimport { exhibitionOverviewLeftPanel } from \"./left-panels/ExhibitionOverview\";\nimport { exhibitionThemeLeftPanel } from \"./left-panels/ExhibitionTheme\";\n\nconst manifestSummaryLeftPanelId = \"left-panel-manifest\";\n\nfunction isPrimaryLeftPanel(panelId: string | null) {\n return (\n panelId === manifestSummaryLeftPanelId ||\n panelId === exhibitionGridLeftPanel.id\n );\n}\n\nexport const exhibitionBackgroundTask: BackgroundPanel = {\n id: \"exhibition-background-task\",\n label: \"Query string\",\n render: () => <ExhibitionBackgroundPanel />,\n};\n\nfunction ExhibitionBackgroundPanel() {\n const manifest = useManifest();\n const { leftPanel, rightPanel } = useLayoutState();\n const {\n edit,\n centerPanel: centerPanelActions,\n rightPanel: rightPanelActions,\n } = useLayoutActions();\n const [\n wasRightPanelClosedAutomatically,\n setWasRightPanelClosedAutomatically,\n ] = useState(false);\n const previousLeftPanel = useRef<string | null>(null);\n const previousManifestId = useRef<string | null>(null);\n\n useEffect(() => {\n const manifestId = manifest?.id || null;\n const leftPanelChanged = previousLeftPanel.current !== leftPanel.current;\n const manifestChanged = previousManifestId.current !== manifestId;\n const previousLeftPanelId = previousLeftPanel.current;\n\n previousLeftPanel.current = leftPanel.current;\n previousManifestId.current = manifestId;\n\n if (!manifest || (!leftPanelChanged && !manifestChanged)) {\n return;\n }\n\n // When left panel is exhibition overview, set the main panel\n if (leftPanel.current === exhibitionOverviewLeftPanel.id) {\n edit(manifest);\n centerPanelActions.open({ id: exhibitionCenterPanel.id });\n setWasRightPanelClosedAutomatically(false);\n return;\n }\n\n if (leftPanel.current === exhibitionThemeLeftPanel.id) {\n edit(manifest);\n if (rightPanel.open) {\n rightPanelActions.close();\n setWasRightPanelClosedAutomatically(true);\n } else {\n setWasRightPanelClosedAutomatically(false);\n }\n centerPanelActions.open({ id: exhibitionRemotePreviewPanel.id });\n return;\n }\n\n if (\n !rightPanel.open &&\n rightPanel.current &&\n isPrimaryLeftPanel(leftPanel.current) &&\n (previousLeftPanelId === null ||\n (previousLeftPanelId === exhibitionThemeLeftPanel.id &&\n wasRightPanelClosedAutomatically))\n ) {\n rightPanelActions.open();\n setWasRightPanelClosedAutomatically(false);\n }\n }, [\n centerPanelActions,\n edit,\n leftPanel.current,\n manifest?.id,\n rightPanel.current,\n rightPanel.open,\n rightPanelActions,\n wasRightPanelClosedAutomatically,\n ]);\n\n return null;\n}\n","import { CanvasPanelEditor, useInStack } from \"@manifest-editor/editors\";\nimport type { CanvasEditorDefinition } from \"@manifest-editor/shell\";\nimport { useLocalStorage } from \"@manifest-editor/shell\";\nimport { useEffect } from \"react\";\nimport { Button } from \"react-aria-components\";\nimport { CanvasContext, LocaleString, type RenderingStrategy, useCanvas } from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ExhibitionPreviewPanel } from \"../components/ExhibitionPreviewPanel\";\nimport { useConfiguredExhibitionPreviewPreset } from \"../helpers/exhibition-preview-state\";\nimport { useSlideshowWorkbenchState } from \"../slideshow-content-positioning\";\n\nexport const imageBlockEditor: CanvasEditorDefinition = {\n id: \"image-block-editor\",\n label: \"Image Block Editor\",\n component: (strategy) => <ImageBlockEditor strategy={strategy} />,\n supports: {\n strategy: (strategy, resource, vault) => {\n if (strategy.type !== \"images\") {\n return false;\n }\n\n const fullResource = vault.get(resource.resource);\n if (fullResource.type !== \"Canvas\") {\n return false;\n }\n\n const behaviors = fullResource.behavior || [];\n\n let isImage = false;\n for (const behaviour of behaviors) {\n if (behaviour.startsWith(\"w-\") || behaviour.startsWith(\"h-\") || behaviour === \"image\") {\n isImage = true;\n }\n }\n\n return isImage;\n },\n },\n};\n\nexport function ImageBlockEditor({ strategy: _strategy }: { strategy: RenderingStrategy }) {\n const [isPreview, setIsPreview] = useLocalStorage(\"exhibition-preview-mode\");\n const centerPanelMode = useSlideshowWorkbenchState((state) => state.centerPanelMode);\n const setCenterPanelMode = useSlideshowWorkbenchState((state) => state.setCenterPanelMode);\n const previewPreset = useConfiguredExhibitionPreviewPreset();\n const canvas = useInStack(\"Canvas\");\n\n useEffect(() => {\n if (centerPanelMode === \"edit\" && isPreview) {\n setIsPreview(false);\n } else if (centerPanelMode === \"preview\" && !isPreview) {\n setIsPreview(true);\n }\n }, [centerPanelMode, isPreview, setIsPreview]);\n\n if (!canvas) {\n return null;\n }\n\n return (\n <CanvasContext canvas={canvas.resource.source?.id}>\n <ImageBlockEditorContent\n isPreview={!!isPreview}\n previewPreset={previewPreset}\n onModeChange={(nextIsPreview) => {\n setCenterPanelMode(nextIsPreview ? \"preview\" : \"edit\");\n setIsPreview(nextIsPreview);\n }}\n />\n </CanvasContext>\n );\n}\n\nfunction ImageBlockEditorContent({\n isPreview,\n previewPreset,\n onModeChange,\n}: {\n isPreview: boolean;\n previewPreset: ReturnType<typeof useConfiguredExhibitionPreviewPreset>;\n onModeChange: (isPreview: boolean) => void;\n}) {\n const canvas = useCanvas();\n\n return (\n <div className=\"relative z-0 flex h-full min-h-0 w-full min-w-0 max-w-full flex-col overflow-hidden bg-white\">\n <div className=\"exhibition-slideshow-current-toolbar flex items-center gap-3 border-b border-slate-200 bg-white px-4 py-3 shadow-sm\">\n <div className=\"min-w-0 flex-1\">\n <LocaleString className=\"block truncate text-sm font-semibold text-slate-800\">{canvas?.label}</LocaleString>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex shrink-0 overflow-hidden rounded-md border border-slate-200 bg-slate-50 text-xs font-semibold\">\n <ModeButton selected={!isPreview} onPress={() => onModeChange(false)}>\n Edit\n </ModeButton>\n <ModeButton selected={isPreview} onPress={() => onModeChange(true)}>\n Preview\n </ModeButton>\n </div>\n </div>\n </div>\n {isPreview ? (\n <div className=\"min-h-0 flex-1\">\n <ExhibitionPreviewPanel preset={previewPreset} />\n </div>\n ) : (\n <div className=\"flex min-h-0 flex-1\">\n <CanvasPanelEditor asFallback />\n </div>\n )}\n </div>\n );\n}\n\nfunction ModeButton({ children, selected, onPress }: { children: string; selected: boolean; onPress: () => void }) {\n return (\n <Button\n className={twMerge(\n \"px-3 py-2 text-xs font-semibold transition\",\n selected ? \"bg-me-primary-500 text-white shadow-sm\" : \"text-slate-500 hover:text-slate-700\",\n )}\n onPress={onPress}\n >\n {children}\n </Button>\n );\n}\n","import { ActionButton, HTMLEditor } from \"@manifest-editor/components\";\nimport { addMappings, importEntities } from \"@iiif/helpers/vault/actions\";\nimport {\n type CanvasEditorDefinition,\n useConfig,\n useGenericEditor,\n useInlineCreator,\n useLocalStorage,\n} from \"@manifest-editor/shell\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Button } from \"react-aria-components\";\nimport {\n AnnotationContext,\n LocaleString,\n type TextualContentStrategy,\n useAnnotation,\n useCanvas,\n useVault,\n useVaultSelector,\n} from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ExhibitionPreviewPanel } from \"../components/ExhibitionPreviewPanel\";\nimport { getGridStats, getHeightWidthRatio } from \"../helpers\";\nimport { useConfiguredExhibitionPreviewPreset } from \"../helpers/exhibition-preview-state\";\n\nexport const infoBlockEditor: CanvasEditorDefinition = {\n id: \"info-block-editor\",\n label: \"info Block Editor\",\n component: (strategy) => <InfoBlockEditor strategy={strategy as TextualContentStrategy} />,\n supports: {\n strategy: (strategy, _resource, _vault) => {\n if (strategy.type !== \"textual-content\") {\n return false;\n }\n return true;\n },\n },\n};\n\ntype InfoBlockMode = \"edit\" | \"preview\";\n\nexport function getLanguageCodeDetails(languageCode: string) {\n if (languageCode === \"@none\" || languageCode === \"none\") {\n return null;\n }\n try {\n const helper = new Intl.DisplayNames([languageCode], { type: \"language\" });\n if (languageCode === \"cy\") {\n return { key: languageCode, language: languageCode, label: \"Cymraeg\" };\n }\n return {\n key: languageCode,\n language: languageCode,\n label: helper.of(languageCode) as string,\n };\n } catch (e) {\n return { key: languageCode, language: languageCode, label: languageCode };\n }\n}\n\n// ─── Language selector ─────────────────────────────────────────────────────────\n\nfunction LanguageSelector({\n selectedLanguage,\n languages,\n availableLanguages,\n onSelectLanguage,\n onAddLanguage,\n}: {\n selectedLanguage: string;\n languages: string[];\n availableLanguages: string[];\n onSelectLanguage: (lang: string) => void;\n onAddLanguage: (lang: string) => void;\n}) {\n const [open, setOpen] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n const addableLanguages = availableLanguages.filter((l) => !languages.includes(l));\n const details = getLanguageCodeDetails(selectedLanguage);\n\n return (\n <div ref={ref} className=\"relative\">\n <button\n type=\"button\"\n className=\"flex items-center gap-1 rounded-md border border-slate-200 bg-white px-3 py-2 text-xs font-semibold text-slate-700 shadow-sm transition hover:bg-slate-50\"\n onClick={() => setOpen((v) => !v)}\n >\n <span className=\"\">{details?.label || selectedLanguage}</span>\n <svg className=\"h-3 w-3 text-slate-400\" viewBox=\"0 0 12 12\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2}>\n <path d=\"M2 4l4 4 4-4\" />\n </svg>\n </button>\n\n {open && (\n <div className=\"absolute right-0 top-full z-50 mt-1 min-w-[14rem] rounded-md border border-slate-200 bg-white py-1 shadow-lg\">\n {languages.length > 0 && (\n <>\n <div className=\"px-3 py-1 text-[10px] font-semibold uppercase tracking-wider text-slate-400\">\n Language\n </div>\n {languages.map((lang) => {\n const details = getLanguageCodeDetails(lang);\n return (\n <button\n key={lang}\n type=\"button\"\n className={twMerge(\n \"flex w-full items-center gap-2 px-3 py-1.5 text-xs hover:bg-slate-50\",\n lang === selectedLanguage ? \"font-semibold text-slate-900\" : \"text-slate-600\",\n )}\n onClick={() => {\n onSelectLanguage(lang);\n setOpen(false);\n }}\n >\n {lang === selectedLanguage ? (\n <svg className=\"h-3 w-3 shrink-0 text-slate-500\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\n <path d=\"M2 6l3 3 5-5\" stroke=\"currentColor\" strokeWidth={2} fill=\"none\" />\n </svg>\n ) : (\n <div className=\"h-3 w-3 shrink-0 text-slate-500\" />\n )}\n <span>{details?.label || lang}</span>\n </button>\n );\n })}\n </>\n )}\n\n {addableLanguages.length > 0 && (\n <>\n {languages.length > 0 && <div className=\"my-1 border-t border-slate-100\" />}\n <div className=\"px-3 py-1 text-[10px] font-semibold uppercase tracking-wider text-slate-400\">\n Add language\n </div>\n {addableLanguages.map((lang) => {\n const details = getLanguageCodeDetails(lang);\n return (\n <button\n key={lang}\n type=\"button\"\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-xs text-slate-600 hover:bg-slate-50\"\n onClick={() => {\n onAddLanguage(lang);\n setOpen(false);\n }}\n >\n <svg\n className=\"h-3 w-3 shrink-0 text-slate-400\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path d=\"M6 2v8M2 6h8\" />\n </svg>\n {details?.label || lang}\n </button>\n );\n })}\n </>\n )}\n\n {addableLanguages.length === 0 && languages.length === 0 && (\n <div className=\"px-3 py-2 text-xs text-slate-400\">No languages available</div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── Helpers to collect all languages present in the canvas annotations ───────\n\nfunction collectLanguagesFromPage(page: any, vault: any): string[] {\n if (!page) return [];\n const items: any[] = page.items || [];\n const langs = new Set<string>();\n for (const annotationRef of items) {\n const annotation = resolveResource(annotationRef, vault);\n if (!annotation) continue;\n const bodies = toArray(annotation.body);\n for (const bodyRef of bodies) {\n const body = resolveResource(bodyRef, vault);\n if (body?.language) langs.add(body.language);\n }\n }\n return Array.from(langs);\n}\n\n// ─── Main editor ──────────────────────────────────────────────────────────────\n\nfunction InfoBlockEditor({ strategy }: { strategy: TextualContentStrategy }) {\n const canvas = useCanvas();\n const behavior = canvas?.behavior || [];\n const dims = getHeightWidthRatio(behavior);\n const hasDimension = Boolean(dims.h && dims.w);\n const { isBottom, isLeft, isRight } = getGridStats(behavior);\n const compact = hasDimension && dims.w <= 6;\n const annotationPage = useVaultSelector((_, vault) => (canvas?.items[0] ? vault.get(canvas.items[0]) : null));\n const longSummaries = useVaultSelector((_, vault) =>\n canvas?.annotations[0] ? vault.get(canvas?.annotations[0]!) : null,\n );\n\n const {\n i18n: { availableLanguages, defaultLanguage },\n } = useConfig();\n\n const [mode, setMode] = useLocalStorage<InfoBlockMode>(\"exhibition-info-block-mode\", \"edit\");\n const previewPreset = useConfiguredExhibitionPreviewPreset();\n const isFullPagePreset = previewPreset === \"exhibition\";\n const showShortSummary = isFullPagePreset;\n const shortSummaryHeading = \"Short text in info box\";\n const longSummaryHeading = isFullPagePreset ? \"Read more text in modal\" : \"Summary\";\n\n // Collect all languages present in the canvas\n const presentLanguages = useVaultSelector(\n (_, selectedVault) => {\n const fromItems = collectLanguagesFromPage(annotationPage, selectedVault);\n const fromAnnotations = collectLanguagesFromPage(longSummaries, selectedVault);\n const all = new Set([...fromItems, ...fromAnnotations]);\n if (all.size === 0) all.add(defaultLanguage || \"en\");\n return Array.from(all);\n },\n [annotationPage?.id, longSummaries?.id, defaultLanguage],\n );\n\n const [selectedLanguage, setSelectedLanguage] = useState<string>();\n const effectiveLanguage =\n selectedLanguage ||\n (presentLanguages.includes(defaultLanguage)\n ? defaultLanguage\n : presentLanguages[0] || defaultLanguage || \"en\");\n\n // When a new language is added we switch to it immediately\n const handleAddLanguage = (lang: string) => {\n setSelectedLanguage(lang);\n };\n\n // For narrow columns (w <= 6), cap the editor width so it doesn't sprawl\n const editorMaxWidth = compact ? \"30rem\" : undefined;\n\n return (\n <div className=\"relative z-0 flex h-full min-h-0 w-full min-w-0 max-w-full flex-col overflow-hidden bg-white\">\n {/* Toolbar — same height and position as the image viewer toolbar */}\n <div className=\"exhibition-slideshow-current-toolbar relative z-[70] flex items-center gap-3 border-b border-slate-200 bg-white px-4 py-3 shadow-sm\">\n <div className=\"min-w-0 flex-1\">\n <LocaleString className=\"block truncate text-sm font-semibold text-slate-800\">{canvas?.label}</LocaleString>\n </div>\n <div className=\"flex items-center gap-2\">\n {mode === \"edit\" && (\n <LanguageSelector\n selectedLanguage={effectiveLanguage}\n languages={presentLanguages}\n availableLanguages={availableLanguages}\n onSelectLanguage={setSelectedLanguage}\n onAddLanguage={handleAddLanguage}\n />\n )}\n <div className=\"flex shrink-0 overflow-hidden rounded-md border border-slate-200 bg-slate-50 text-xs font-semibold\">\n <ModeButton selected={mode === \"edit\"} onPress={() => setMode(\"edit\")}>\n Edit\n </ModeButton>\n <ModeButton selected={mode === \"preview\"} onPress={() => setMode(\"preview\")}>\n Preview\n </ModeButton>\n </div>\n </div>\n </div>\n\n {/* Content area */}\n {mode === \"preview\" ? (\n <div className=\"min-h-0 flex-1\">\n <ExhibitionPreviewPanel preset={previewPreset} />\n </div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-x-hidden overflow-y-auto\">\n {showShortSummary ? (\n <SummarySection\n annotationPage={annotationPage}\n compact={compact}\n editorMaxWidth={editorMaxWidth}\n fallbackText={strategy.items[0]?.text}\n heading={shortSummaryHeading}\n panelClassName={twMerge(\n \"border-b border-gray-100\",\n compact ? \"p-3\" : \"p-5\",\n hasDimension && (isLeft || isRight) ? \"max-w-xl\" : \"\",\n hasDimension && isBottom ? \"max-w-4xl\" : \"\",\n )}\n parentProperty=\"items\"\n selectedLanguage={effectiveLanguage}\n onLanguageAdded={handleAddLanguage}\n />\n ) : null}\n <SummarySection\n annotationPage={longSummaries}\n compact={compact}\n heading={longSummaryHeading}\n panelClassName={twMerge(compact ? \"p-3\" : \"p-5\")}\n parentProperty=\"annotations\"\n selectedLanguage={effectiveLanguage}\n onLanguageAdded={handleAddLanguage}\n />\n </div>\n )}\n </div>\n );\n}\n\n// ─── Small UI components ──────────────────────────────────────────────────────\n\nfunction ModeButton({ children, selected, onPress }: { children: string; selected: boolean; onPress: () => void }) {\n return (\n <Button\n className={twMerge(\n \"px-3 py-2 text-xs font-semibold transition\",\n selected ? \"bg-white text-slate-900 shadow-sm\" : \"text-slate-500 hover:text-slate-700\",\n )}\n onPress={onPress}\n >\n {children}\n </Button>\n );\n}\n\n// ─── Editor sections ──────────────────────────────────────────────────────────\n\nfunction SummarySection({\n annotationPage,\n compact,\n editorMaxWidth,\n fallbackText,\n heading,\n panelClassName,\n parentProperty,\n selectedLanguage,\n onLanguageAdded,\n}: {\n annotationPage: any;\n compact?: boolean;\n editorMaxWidth?: string;\n fallbackText?: any;\n heading: string;\n panelClassName?: string;\n parentProperty: \"items\" | \"annotations\";\n selectedLanguage: string;\n onLanguageAdded: (lang: string) => void;\n}) {\n const canvas = useCanvas();\n const creator = useInlineCreator();\n const vault = useVault();\n const {\n i18n: { defaultLanguage },\n } = useConfig();\n const page = annotationPage || null;\n const items = page?.items || [];\n const visibleItems = getVisibleItems(items, vault);\n\n const createSummaryPage = () => {\n if (!canvas) return;\n creator.create(\n \"@manifest-editor/empty-annotation-page\",\n { label: { en: [heading] } },\n {\n target: { id: canvas.id, type: \"Canvas\" },\n targetType: \"AnnotationPage\",\n parent: {\n property: parentProperty,\n resource: { id: canvas.id, type: \"Canvas\" },\n },\n },\n );\n };\n\n const createSummaryAnnotation = () => {\n if (!canvas) return;\n\n if (!page) {\n createSummaryPage();\n return;\n }\n\n creator.create(\n \"@manifest-editor/html-annotation\",\n {\n label: { en: [heading] },\n body: { [selectedLanguage || defaultLanguage || \"en\"]: [\"\"] },\n motivation: parentProperty === \"annotations\" ? \"tagging\" : \"painting\",\n },\n {\n target: { id: canvas.id, type: \"Canvas\" },\n targetType: \"Annotation\",\n parent: {\n property: \"items\",\n resource: { id: page.id, type: \"AnnotationPage\" },\n },\n initialData: {},\n },\n );\n };\n\n // Add a body in the selected language to every annotation in this page\n const addLanguageToPage = () => {\n if (!page) {\n // If there's no page yet, create an annotation with the selected language\n createSummaryAnnotation();\n onLanguageAdded(selectedLanguage);\n return;\n }\n\n let addedAny = false;\n for (const annotationRef of items) {\n const annotation = resolveResource(annotationRef, vault);\n if (!annotation) continue;\n const bodies = toArray(annotation.body);\n const alreadyHasLang = bodies.some((bodyRef) => {\n const body = resolveResource(bodyRef, vault);\n return body?.language === selectedLanguage;\n });\n if (alreadyHasLang) continue;\n\n // Create a new body with the selected language by cloning the first body's structure\n const firstBodyRef = bodies[0];\n const firstBody = firstBodyRef ? resolveResource(firstBodyRef, vault) : null;\n const newBodyId = `${annotation.id}-body-${selectedLanguage}-${Date.now()}`;\n vault.batch(() => {\n vault.dispatch(\n importEntities({\n entities: {\n ContentResource: {\n [newBodyId]: {\n id: newBodyId,\n type: firstBody?.type || \"TextualBody\",\n language: selectedLanguage,\n value: \"\",\n format: firstBody?.format || \"text/html\",\n },\n },\n },\n }),\n );\n vault.dispatch(addMappings({ mapping: { [newBodyId]: \"ContentResource\" } }));\n vault.modifyEntityField({ id: annotation.id, type: \"Annotation\" }, \"body\", [\n ...bodies,\n { id: newBodyId, type: \"ContentResource\" },\n ]);\n });\n addedAny = true;\n }\n\n if (addedAny) {\n onLanguageAdded(selectedLanguage);\n } else {\n // If there were no annotations yet, create a fresh one\n createSummaryAnnotation();\n onLanguageAdded(selectedLanguage);\n }\n };\n\n // Check whether the selected language is already represented in this page\n const languageExistsInPage = useVaultSelector(\n (_, selectedVault) => {\n if (!page) return false;\n for (const annotationRef of items) {\n const annotation = resolveResource(annotationRef, selectedVault);\n if (!annotation) continue;\n const bodies = toArray(annotation.body);\n for (const bodyRef of bodies) {\n const body = resolveResource(bodyRef, selectedVault);\n if (body?.language === selectedLanguage) return true;\n }\n }\n return false;\n },\n [page?.id, items, selectedLanguage],\n );\n\n return (\n <section className={twMerge(\"min-w-0 max-w-full\", panelClassName)}>\n <div className={twMerge(\"flex items-center justify-between gap-3\", visibleItems.length ? \"mb-3\" : \"mb-0\")}>\n <h2\n className={twMerge(\n \"font-semibold tracking-tight text-gray-700\",\n compact ? \"text-xs uppercase\" : \"text-sm uppercase tracking-wide\",\n )}\n >\n {heading}\n </h2>\n {!languageExistsInPage && (\n <ActionButton primary onPress={addLanguageToPage}>\n {page ? \"Add text\" : \"Add\"}\n </ActionButton>\n )}\n </div>\n\n {!page && fallbackText ? (\n <div className=\"mt-2 text-sm text-gray-600\">\n <LocaleString enableDangerouslySetInnerHTML>{fallbackText}</LocaleString>\n </div>\n ) : null}\n\n {visibleItems.length ? (\n <div className=\"min-w-0 max-w-full\">\n {visibleItems.map(({ item: annotation, index }) => (\n <AnnotationContext key={annotation.id + index} annotation={annotation.id}>\n <AnnotationEditor\n editorMaxWidth={editorMaxWidth}\n pageItems={items}\n pageRef={{ id: page.id, type: \"AnnotationPage\" }}\n selectedLanguage={selectedLanguage}\n onRemoveAnnotation={() => {\n vault.modifyEntityField(\n { id: page.id, type: \"AnnotationPage\" },\n \"items\",\n items.filter((_item: any, itemIndex: number) => itemIndex !== index),\n );\n }}\n />\n </AnnotationContext>\n ))}\n </div>\n ) : page && languageExistsInPage ? (\n <div className={twMerge(\"mt-2 text-sm text-gray-400 italic\", compact ? \"\" : \"\")}>No text added yet.</div>\n ) : null}\n </section>\n );\n}\n\nfunction AnnotationEditor({\n editorMaxWidth,\n onRemoveAnnotation: _onRemoveAnnotation,\n pageItems,\n pageRef,\n selectedLanguage,\n}: {\n editorMaxWidth?: string;\n onRemoveAnnotation: () => void;\n pageItems: any[];\n pageRef: { id: string; type: \"AnnotationPage\" };\n selectedLanguage: string;\n}) {\n const annotation = useAnnotation();\n const vault = useVault();\n const bodies = annotation?.body || [];\n const editor = useGenericEditor(annotation);\n\n if (!annotation) {\n return null;\n }\n\n // Show only the body matching the selected language\n const allBodiesWithIndex = bodies.map((item: any, index: number) => ({\n item,\n index,\n }));\n const languageBodies = allBodiesWithIndex.filter(({ item }: { item: any }) => {\n const body = resolveResource(item, vault);\n return body?.language === selectedLanguage;\n });\n const visibleBodies = languageBodies.length > 0 ? languageBodies : [];\n\n const pruneEmptySiblings = useCallback(\n (currentBodyId: string) => {\n const nextBodies = filterEmptyRefs(bodies, vault, currentBodyId);\n if (nextBodies.length !== bodies.length) {\n vault.modifyEntityField({ id: annotation.id, type: \"Annotation\" }, \"body\", nextBodies);\n }\n\n const nextPageItems = filterEmptyAnnotations(pageItems, vault, annotation.id);\n if (nextPageItems.length !== pageItems.length) {\n vault.modifyEntityField(pageRef, \"items\", nextPageItems);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n },\n [annotation.id, pageRef.id, pageItems, vault],\n );\n\n if (!visibleBodies.length) {\n return null;\n }\n\n return (\n <div className=\"min-w-0 max-w-full overflow-hidden\">\n {visibleBodies.map(({ item: body, index }: { item: any; index: number }) => (\n <HTMLAnnotationBodyEditor\n key={body.id || index}\n resourceId={body.id}\n onRemove={() => editor.annotation.body.deleteAtIndex(index)}\n onUpdate={() => pruneEmptySiblings(body.id)}\n editorMaxWidth={editorMaxWidth}\n />\n ))}\n </div>\n );\n}\n\nfunction HTMLAnnotationBodyEditor({\n editorMaxWidth,\n resourceId,\n onRemove,\n onUpdate,\n}: {\n editorMaxWidth?: string;\n resourceId: string;\n onRemove: () => void;\n onUpdate: () => void;\n}) {\n const resourceRef = useMemo(() => ({ id: resourceId, type: \"ContentResource\" as const }), [resourceId]);\n const editor = useGenericEditor(resourceRef);\n const {\n i18n: { advancedLanguageMode, availableLanguages, defaultLanguage },\n } = useConfig();\n const { language, value } = editor.descriptive;\n const languageValue = language.get();\n const currentLanguage = Array.isArray(languageValue)\n ? languageValue[0] || defaultLanguage || \"en\"\n : languageValue || defaultLanguage || \"en\";\n\n useEffect(() => {\n const nextLanguage = Array.isArray(language.get()) ? language.get()[0] : language.get();\n if (!advancedLanguageMode && nextLanguage !== currentLanguage) {\n language.set(currentLanguage as any);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [advancedLanguageMode, currentLanguage]);\n\n return (\n <div\n className=\"min-w-0 max-w-full overflow-hidden\"\n style={editorMaxWidth ? { maxWidth: editorMaxWidth } : undefined}\n >\n {advancedLanguageMode ? (\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <select\n aria-label=\"Language\"\n className=\"rounded border border-slate-200 bg-white px-2 py-1 text-sm\"\n value={currentLanguage}\n onChange={(event) => language.set(event.currentTarget.value as any)}\n >\n {availableLanguages.map((availableLanguage) => (\n <option key={availableLanguage} value={availableLanguage}>\n {availableLanguage}\n </option>\n ))}\n </select>\n <button type=\"button\" className=\"text-sm text-slate-600 hover:text-slate-900\" onClick={onRemove}>\n Remove\n </button>\n </div>\n ) : null}\n <HTMLEditor\n key={`${resourceId}:${currentLanguage}`}\n value={value.get() || \"\"}\n onChange={(newValue) => {\n value.set(newValue);\n onUpdate();\n }}\n />\n </div>\n );\n}\n\nfunction getVisibleItems(items: any[], vault: any) {\n const withIndex = items.map((item, index) => ({ item, index }));\n const nonEmpty = withIndex.filter(({ item }) => !isAnnotationEmpty(item, vault));\n return nonEmpty.length ? nonEmpty : withIndex.slice(0, 1);\n}\n\nfunction getVisibleBodyRefs(items: any[], vault: any) {\n const withIndex = items.map((item, index) => ({ item, index }));\n const nonEmpty = withIndex.filter(({ item }) => !isBodyRefEmpty(item, vault));\n return nonEmpty.length ? nonEmpty : withIndex.slice(0, 1);\n}\n\nfunction filterEmptyAnnotations(items: any[], vault: any, keepId?: string) {\n const filtered = items.filter((item) => item?.id === keepId || !isAnnotationEmpty(item, vault));\n return filtered.length ? filtered : items.slice(0, 1);\n}\n\nfunction filterEmptyRefs(items: any[], vault: any, keepId?: string) {\n const filtered = items.filter((item) => item?.id === keepId || !isBodyRefEmpty(item, vault));\n return filtered.length ? filtered : items.slice(0, 1);\n}\n\nfunction isAnnotationEmpty(annotationRef: any, vault: any) {\n const annotation = resolveResource(annotationRef, vault);\n const bodies = toArray(annotation?.body);\n if (!bodies.length) {\n return true;\n }\n return bodies.every((body) => isBodyRefEmpty(body, vault));\n}\n\nfunction isBodyRefEmpty(bodyRef: any, vault: any) {\n const body = resolveResource(bodyRef, vault);\n if (!body) {\n return true;\n }\n return isHtmlEmpty(body.value || \"\");\n}\n\nfunction isHtmlEmpty(value: string) {\n const html = String(value || \"\");\n if (/<img\\b/i.test(html)) {\n return false;\n }\n return (\n html\n .replace(/<[^>]*>/g, \"\")\n .replace(/&nbsp;/gi, \" \")\n .replace(/\\s+/g, \"\")\n .trim() === \"\"\n );\n}\n\nfunction resolveResource(resource: any, vault: any) {\n if (!resource?.id || resource.value || resource.items || resource.body) {\n return resource;\n }\n\n return vault.get(resource as any, { skipSelfReturn: false } as any) || resource;\n}\n\nfunction toArray<T>(value: T | T[] | null | undefined): T[] {\n if (Array.isArray(value)) return value;\n if (typeof value === \"undefined\" || value === null) return [];\n return [value];\n}\n","import { ActionButton, LazyThumbnail } from \"@manifest-editor/components\";\nimport { type CanvasEditorDefinition, useGenericEditor, useLayoutActions } from \"@manifest-editor/shell\";\nimport { useRef } from \"react\";\nimport {\n LocaleString,\n type MediaStrategy,\n type SingleYouTubeVideo,\n useCanvas,\n useVaultSelector,\n} from \"react-iiif-vault\";\nimport invariant from \"tiny-invariant\";\n\nexport const youtubeMainEdtior: CanvasEditorDefinition = {\n id: \"youtube-main-editor\",\n label: \"YouTube main editor\",\n component: (strategy) =>\n strategy.type === \"media\" ? (\n <YouTubeEditor strategy={strategy as MediaStrategy} video={strategy.media as SingleYouTubeVideo} />\n ) : null,\n supports: {\n strategy: (strategy, resource, vault) => {\n if (strategy.type !== \"media\") {\n return false;\n }\n\n if (strategy.media.type !== \"VideoYouTube\") {\n return false;\n }\n\n return true;\n },\n },\n};\n\nexport function YouTubeEditor({ strategy, video }: { strategy: MediaStrategy; video: SingleYouTubeVideo }) {\n const { edit } = useLayoutActions();\n const canvas = useCanvas();\n const annotationRef = useVaultSelector((_, v) => {\n const page = v.get(canvas?.items[0]!);\n return page.items[0]!;\n });\n invariant(canvas && annotationRef);\n const player = useRef<HTMLIFrameElement>(null);\n const annotation = useGenericEditor(annotationRef);\n const media = video;\n\n const ar = (canvas.width || 1) / (canvas.height || 1);\n const ytThumbnail = `https://img.youtube.com/vi/${media.youTubeId}/maxresdefault.jpg`;\n\n return (\n <div className=\"overflow-y-auto\">\n <div className=\"p-8\">\n <div className=\"bg-black z-20 flex p-8 rounded-lg max-w-full max-h-[70vh] mx-auto\" style={{ aspectRatio: ar }}>\n <iframe\n title=\"YouTube video\"\n className=\"border-none w-full h-full object-contain\"\n ref={player}\n src={`https://www.youtube.com/embed/${media.youTubeId}?enablejsapi=1&origin=${window.location.host}&modestbranding=1&rel=0`}\n // @ts-expect-error\n referrerPolicy=\"no-referrer compute-pressure\"\n sandbox=\"allow-scripts allow-same-origin allow-presentation\"\n />\n </div>\n </div>\n\n <div className=\"bg-white shadow w-full p-8 flex gap-8\">\n <div>\n <div\n className=\"w-64 bg-black flex-shrink-0 flex items-center justify-center rounded overflow-clip\"\n style={{ aspectRatio: ar }}\n >\n {canvas.thumbnail?.length ? (\n <LazyThumbnail cover />\n ) : (\n <div className=\"text-white/50 text-center py-16\">No thumbnail</div>\n )}\n </div>\n </div>\n <div className=\"flex-1\">\n <LocaleString\n as=\"h3\"\n className=\"text-2xl font-bold mt-4\"\n defaultText={(<span className=\"text-black/30\">No Label</span>) as any}\n >\n {annotation.descriptive.label.get()}\n </LocaleString>\n <LocaleString\n as=\"p\"\n className=\"mt-2 mb-8\"\n defaultText={(<span className=\"text-black/30\">No summary</span>) as any}\n >\n {annotation.descriptive.summary.get()}\n </LocaleString>\n <ActionButton onPress={() => edit(annotation.ref())}>Edit properties</ActionButton>\n </div>\n </div>\n </div>\n );\n}\n","import {\n type CreatorFunctionContext,\n type CreatorDefinition,\n creatorHelper,\n type CreatorResource,\n defineCreator,\n} from \"@manifest-editor/creator-api\";\nimport {\n type IIIFBrowserCreatorPayload,\n iiifBrowserCreator,\n} from \"@manifest-editor/creators\";\n\ndeclare module \"@manifest-editor/creator-api\" {\n namespace IIIFManifestEditor {\n interface CreatorDefinitions {\n \"@exhibitions/browser-creator\": typeof imageBrowserSlideCreator;\n }\n }\n}\n\nexport const imageBrowserSlideCreator = defineCreator({\n ...iiifBrowserCreator,\n id: \"@exhibitions/browser-creator\",\n configKey: iiifBrowserCreator.id,\n create: createBrowser,\n sideEffects: [],\n tags: [\"image\", \"exhibition-slide\", \"exhibition-slideshow-slide\"],\n label: \"IIIF Browser\",\n summary: \"Browse IIIF Resources\",\n resourceType: \"Canvas\",\n resourceFields: [\"id\", \"language\", \"type\", \"format\", \"value\"],\n additionalTypes: [],\n supports: {\n initialData: true,\n onlyPainting: true,\n parentTypes: [\"Manifest\"],\n parentFields: [\"items\"],\n parentFieldMap: {\n Manifest: [\"items\"],\n },\n },\n});\n\nexport function keepIIIFBrowserNested(\n creator: CreatorDefinition,\n): CreatorDefinition {\n return {\n ...creator,\n additionalTypes: creator.additionalTypes?.filter(\n (type: string) => type !== \"Canvas\",\n ),\n supports: {\n ...creator.supports,\n parentTypes: [\"Annotation\", \"AnnotationPage\"],\n parentFieldMap: {\n Annotation: [\"body\"],\n AnnotationPage: [\"items\"],\n },\n },\n };\n}\n\nasync function createBrowser(\n data: IIIFBrowserCreatorPayload,\n ctx: CreatorFunctionContext,\n): Promise<CreatorResource> {\n const canvasId = ctx.generateId(\"canvas\");\n const pageId = ctx.generateId(\"annotation-page\", {\n id: canvasId,\n type: \"Canvas\",\n });\n\n const dimensions = { width: 0, height: 0 };\n let manifestTracking:\n | Parameters<NonNullable<IIIFBrowserCreatorPayload[\"trackManifest\"]>>[0]\n | undefined;\n\n const createBrowserAnnotation = creatorHelper(\n ctx,\n { id: pageId, type: \"AnnotationPage\" },\n \"items\",\n \"@manifest-editor/iiif-browser-creator\",\n );\n\n const annotation = await createBrowserAnnotation(\n {\n ...data,\n trackSize({ width, height }) {\n dimensions.height = height;\n dimensions.width = width;\n },\n trackManifest(manifest) {\n manifestTracking = manifest;\n },\n },\n {\n targetType: \"Annotation\",\n target: {\n id: canvasId,\n type: \"Canvas\",\n },\n },\n );\n\n const createSlide = creatorHelper(\n ctx,\n \"Manifest\",\n \"items\",\n \"@exhibitions/image-slide-creator\",\n );\n\n // 2. Pass that to an empty slide.\n return await createSlide({\n canvasId,\n width: dimensions.width,\n height: dimensions.height,\n type: \"default\", // default / left / right / bottom\n items: annotation,\n imageSlideBehavior: ctx.options.initialData?.imageSlideBehavior,\n ...manifestTracking,\n });\n}\n","import {\n type CreatorFunctionContext,\n creatorHelper,\n type CreatorResource,\n defineCreator,\n} from \"@manifest-editor/creator-api\";\nimport { type CreateImageServicePayload, imageServiceCreator } from \"@manifest-editor/creators\";\nimport { imageSlideCreator } from \"./image-slide-creator\";\n\nexport interface CreateImageServiceSlidePayload extends CreateImageServicePayload {\n imageSlideBehavior?: string[];\n slideType?: \"default\" | \"left\" | \"right\" | \"bottom\";\n}\n\ndeclare module \"@manifest-editor/creator-api\" {\n namespace IIIFManifestEditor {\n interface CreatorDefinitions {\n \"@exhibitions/image-service-creator\": typeof imageServiceSlideCreator;\n }\n }\n}\n\nexport const imageServiceSlideCreator = defineCreator({\n ...imageServiceCreator,\n id: \"@exhibitions/image-service-creator\",\n create: createImageService,\n tags: [\"image\", \"exhibition-slide\", \"exhibition-slideshow-slide\"],\n label: \"IIIF Image\",\n summary: \"IIIF Image service\",\n resourceType: \"Canvas\",\n supports: {\n initialData: true,\n parentTypes: [\"Manifest\"],\n parentFields: [\"items\"],\n },\n});\n\nasync function createImageService(\n data: CreateImageServiceSlidePayload,\n ctx: CreatorFunctionContext,\n): Promise<CreatorResource> {\n const canvasId = ctx.generateId(\"canvas\");\n const pageId = ctx.generateId(\"annotation-page\", {\n id: canvasId,\n type: \"Canvas\",\n });\n const annotationId = ctx.generateId(\"annotation\");\n\n const createImageService = creatorHelper(\n ctx,\n { id: annotationId, type: \"Annotation\" },\n \"body\",\n \"@manifest-editor/image-service-creator\",\n );\n\n // 1. Call the original creator to get the annotation\n const resource = await createImageService(data, {\n target: {\n id: canvasId,\n type: \"Canvas\",\n },\n });\n\n const { width, height } = resource.get();\n\n const annotation = ctx.embed({\n id: ctx.generateId(\"annotation\"),\n type: \"Annotation\",\n motivation: \"painting\",\n body: [resource],\n target: {\n type: \"SpecificResource\",\n source: { id: canvasId, type: \"Canvas\" },\n },\n });\n\n // 2. Pass that to an empty slide.\n const createSlide = creatorHelper(ctx, \"Manifest\", \"items\", \"@exhibitions/image-slide-creator\");\n return await createSlide({\n canvasId,\n width,\n height,\n type: data.slideType ?? \"default\",\n items: [annotation],\n imageSlideBehavior: data.imageSlideBehavior ?? ctx.options.initialData?.imageSlideBehavior,\n });\n}\n","import { emptyAnnotationPage, emptyCanvas } from \"@iiif/parser\";\nimport type { InternationalString } from \"@iiif/presentation-3\";\nimport { EmptyCanvasIcon } from \"@manifest-editor/components\";\nimport { type CreatorFunctionContext, type CreatorResource, defineCreator } from \"@manifest-editor/creator-api\";\n\ndeclare module \"@manifest-editor/creator-api\" {\n namespace IIIFManifestEditor {\n interface CreatorDefinitions {\n \"@exhibitions/image-slide-creator\": typeof imageSlideCreator;\n \"@exhibitions/image-slide-creator-bottom\": typeof imageSlideBottomCreator;\n \"@exhibitions/image-slide-creator-left\": typeof imageSlideLeftCreator;\n \"@exhibitions/image-slide-creator-right\": typeof imageSlideRightCreator;\n \"@exhibitions/slideshow-image-only-creator\": typeof slideshowImageOnlyCreator;\n \"@exhibitions/slideshow-image-text-creator\": typeof slideshowImageTextCreator;\n \"@exhibitions/scroll-compact-deck-creator\": typeof scrollCompactDeckCreator;\n }\n }\n}\n\nexport const imageSlideCreator = defineCreator({\n id: \"@exhibitions/image-slide-creator\",\n create: createImageSlide,\n label: \"Empty slide\",\n summary: \"An empty image slide.\",\n icon: <EmptyCanvasIcon />,\n tags: [\"exhibition-slide\"], // No tag, so it doesn't appear, it's just called.\n resourceType: \"Canvas\",\n resourceFields: [\"id\", \"type\", \"label\", \"height\", \"width\", \"items\"],\n supports: {\n initialData: true,\n parentTypes: [\"Manifest\"],\n parentFields: [\"items\"],\n },\n});\n\nexport const imageSlideLeftCreator = defineCreator({\n ...imageSlideCreator,\n id: \"@exhibitions/image-slide-creator-left\",\n label: \"Image (Left)\",\n summary: \"An image with text on the left.\",\n icon: <div>IMAGE (LEFT)</div>,\n create: (payload, ctx) => createImageSlide({ ...payload, type: \"left\" }, ctx),\n});\n\nexport const imageSlideRightCreator = defineCreator({\n ...imageSlideCreator,\n id: \"@exhibitions/image-slide-creator-right\",\n label: \"Image (Right)\",\n summary: \"An image with text on the right.\",\n icon: <div>IMAGE (RIGHT)</div>,\n create: (payload, ctx) => createImageSlide({ ...payload, type: \"right\" }, ctx),\n});\n\nexport const imageSlideBottomCreator = defineCreator({\n ...imageSlideCreator,\n id: \"@exhibitions/image-slide-creator-bottom\",\n label: \"Image (Bottom)\",\n summary: \"An image with text at the bottom.\",\n icon: <div>IMAGE (BOTTOM)</div>,\n create: (payload, ctx) => createImageSlide({ ...payload, type: \"bottom\" }, ctx),\n});\n\nexport const slideshowImageOnlyCreator = defineCreator({\n ...imageSlideCreator,\n id: \"@exhibitions/slideshow-image-only-creator\",\n label: \"Multiple images\",\n summary: \"An empty slideshow slide\",\n tags: [\"exhibition-slideshow-slide\"],\n create: (payload, ctx) =>\n createImageSlide(\n {\n ...payload,\n behavior: [\"w-12\", \"h-8\", \"image\"],\n height: payload.height || 1080,\n width: payload.width || 1920,\n type: \"default\",\n },\n ctx,\n ),\n});\n\nexport const slideshowImageTextCreator = defineCreator({\n ...imageSlideCreator,\n id: \"@exhibitions/slideshow-image-text-creator\",\n label: \"Multiple images with text\",\n summary: \"An empty slideshow slide, with text\",\n tags: [\"exhibition-slideshow-slide\"],\n create: (payload, ctx) =>\n createImageSlide(\n {\n ...payload,\n behavior: [\"w-12\", \"h-8\", \"right\"],\n height: payload.height || 1080,\n width: payload.width || 1920,\n type: \"right\",\n },\n ctx,\n ),\n});\n\nexport const scrollCompactDeckCreator = defineCreator({\n ...imageSlideCreator,\n id: \"@exhibitions/scroll-compact-deck-creator\",\n label: \"Compact image deck\",\n summary: \"A scrolling section with compact annotation-led image slides.\",\n tags: [\"exhibition-scroll-section\", \"exhibition-slide\"],\n create: (payload, ctx) =>\n createImageSlide(\n {\n ...payload,\n behavior: [\"w-12\", \"h-8\", \"compact-deck\"],\n height: payload.height || 1080,\n width: payload.width || 1920,\n type: \"default\",\n },\n ctx,\n ),\n});\n\ninterface InfoBoxPayload {\n canvasId?: string;\n label?: InternationalString;\n metadata?: any[];\n requiredStatement?: any;\n rights?: string;\n partOf?: any[];\n height?: number;\n width?: number;\n duration?: number;\n type: \"default\" | \"left\" | \"right\" | \"bottom\";\n behavior?: string[];\n imageSlideBehavior?: string[];\n items?: CreatorResource[];\n}\n\nfunction createImageSlide(payload: InfoBoxPayload, ctx: CreatorFunctionContext) {\n const canvasId = payload.canvasId || ctx.generateId(\"Canvas\");\n const itemsPageId = ctx.generateId(\"AnnotationPage\", {\n id: canvasId,\n type: \"Canvas\",\n });\n const annotationsPageId = ctx.generateId(\"AnnotationPage\", {\n id: canvasId,\n type: \"Canvas\",\n });\n\n const behavior = [];\n let width = 6000;\n\n const imageSlideBehavior = payload.imageSlideBehavior || ctx.options.initialData?.imageSlideBehavior;\n\n if (payload.behavior) {\n behavior.push(...payload.behavior);\n } else if (imageSlideBehavior) {\n behavior.push(...imageSlideBehavior);\n } else if (payload.width && payload.height) {\n // Determine layout type to apply effective-width modifier for text panels\n const layoutType = payload.type ?? \"default\";\n const isLeftRight = layoutType === \"left\" || layoutType === \"right\";\n const isBottom = layoutType === \"bottom\";\n\n // Always start full-width (w-12); height is derived from aspect ratio\n const displayWidth = 12;\n const ratio = payload.width / payload.height;\n // Effective image width after text-panel area is subtracted\n const effectiveWidth = isLeftRight ? displayWidth * (2 / 3) : displayWidth;\n // For bottom layout the text panel adds ~half height again\n const textHeightMultiplier = isBottom ? 3 / 2 : 1;\n const derivedHeight = Math.max(1, Math.min(12, Math.round((effectiveWidth / ratio) * textHeightMultiplier)));\n\n behavior.push(`w-${displayWidth}`, `h-${derivedHeight}`);\n } else {\n behavior.push(\"w-12\", \"h-4\");\n }\n\n if (!payload.behavior) {\n switch (payload.type) {\n case \"left\":\n behavior.push(\"left\");\n width *= 2 / 3;\n break;\n case \"right\":\n behavior.push(\"right\");\n width *= 2 / 3;\n break;\n case \"bottom\":\n behavior.push(\"bottom\");\n break;\n }\n }\n\n if (!payload.items?.length) {\n behavior.push(\"multi-image\");\n }\n\n const manifestTracking = {\n ...(payload.metadata ? { metadata: payload.metadata } : {}),\n ...(payload.requiredStatement ? { requiredStatement: payload.requiredStatement } : {}),\n ...(payload.rights ? { rights: payload.rights } : {}),\n ...(payload.partOf ? { partOf: payload.partOf } : {}),\n };\n\n return ctx.embed({\n ...emptyCanvas,\n id: canvasId,\n behavior,\n label: payload.label || { en: [\"Untitled\"] },\n ...manifestTracking,\n height: payload.height || 4000,\n duration: payload.duration,\n width: payload.width || width,\n items: [\n ctx.embed({\n ...emptyAnnotationPage,\n id: itemsPageId,\n type: \"AnnotationPage\",\n items: payload.items ? payload.items : [],\n }),\n ],\n annotations: [\n ctx.embed({\n ...emptyAnnotationPage,\n id: annotationsPageId,\n type: \"AnnotationPage\",\n items: [],\n }),\n ],\n });\n}\n","import {\n type CreatorFunctionContext,\n creatorHelper,\n type CreatorResource,\n defineCreator,\n} from \"@manifest-editor/creator-api\";\nimport { type CreateImageUrlPayload, imageUrlCreator } from \"@manifest-editor/creators\";\n\ndeclare module \"@manifest-editor/creator-api\" {\n namespace IIIFManifestEditor {\n interface CreatorDefinitions {\n \"@exhibitions/image-url-creator\": typeof imageUrlSlideCreator;\n }\n }\n}\n\nexport const imageUrlSlideCreator = defineCreator({\n ...imageUrlCreator,\n id: \"@exhibitions/image-url-creator\",\n create: createUrlSlide,\n tags: [\"exhibition-slide\", \"exhibition-slideshow-slide\"],\n label: \"Image from URL\",\n summary: \"Image from URL\",\n resourceType: \"Canvas\",\n supports: {\n initialData: true,\n parentTypes: [\"Manifest\"],\n parentFields: [\"items\"],\n },\n});\n\nasync function createUrlSlide(data: CreateImageUrlPayload, ctx: CreatorFunctionContext): Promise<CreatorResource> {\n const canvasId = ctx.generateId(\"canvas\");\n const pageId = ctx.generateId(\"annotation-page\", {\n id: canvasId,\n type: \"Canvas\",\n });\n const annotationId = ctx.generateId(\"annotation\");\n\n const createImageUrl = creatorHelper(\n ctx,\n { id: annotationId, type: \"Annotation\" },\n \"body\",\n \"@manifest-editor/image-url-creator\",\n );\n\n // 1. Call the original creator to get the annotation\n const resource = await createImageUrl(data, {\n target: {\n id: canvasId,\n type: \"Canvas\",\n },\n targetType: \"Annotation\",\n });\n\n const { width, height } = resource.get();\n\n const annotation = ctx.embed({\n id: annotationId,\n type: \"Annotation\",\n motivation: \"painting\",\n body: [resource],\n target: {\n type: \"SpecificResource\",\n source: { id: canvasId, type: \"Canvas\" },\n },\n });\n\n // 2. Pass that to an empty slide.\n const createSlide = creatorHelper(ctx, \"Manifest\", \"items\", \"@exhibitions/image-slide-creator\");\n return await createSlide({\n canvasId,\n width,\n height,\n type: \"default\", // default / left / right / bottom\n items: [annotation],\n imageSlideBehavior: ctx.options.initialData?.imageSlideBehavior,\n });\n}\n","import { DownloadButton, OnboardingTour } from \"@manifest-editor/components\";\nimport {\n ButtonChange,\n ButtonContainer,\n ButtonMain,\n MenuContainer,\n MenuItemLabel,\n MenuItemStatus,\n type PresetDefinition,\n type PresetPreviewButtonRenderContext,\n type PresetTemplateDefinition,\n useAppResource,\n useConfig,\n useLayoutActions,\n useOpenPresetOnboarding,\n usePresetTemplateSelection,\n usePreviewContext,\n} from \"@manifest-editor/shell\";\nimport { DownIcon } from \"@manifest-editor/ui/icons/DownIcon\";\nimport { type SVGProps } from \"react\";\nimport { Button, Menu, MenuItem, MenuTrigger, Popover } from \"react-aria-components\";\nimport { useVault } from \"react-iiif-vault\";\nimport { getExhibitionTemplatePreviews, useExhibitionTemplate } from \"./helpers/exhibition-template\";\nimport { exhibitionTemplates } from \"./exhibition-templates\";\n\nexport { exhibitionTemplates } from \"./exhibition-templates\";\n\nconst exhibitionTemplateShortLabels = {\n fullpage: \"Full page\",\n slideshow: \"Slideshow\",\n scroll: \"Scroll\",\n};\n\nexport const exhibitionPresetConfig: PresetDefinition = {\n templates: exhibitionTemplates,\n onboarding: {\n id: \"exhibition-template-selection\",\n mode: \"per-resource\",\n title: \"Choose exhibition format\",\n summary: \"Pick a starting point for this exhibition.\",\n openLabel: \"Exhibition formats\",\n dismissLabel: \"Skip for now\",\n primaryLabel: \"Start building\",\n renderPreviewButton: (props) => <ExhibitionPresetPreviewButton {...props} />,\n renderBody: ({ templates, selectedTemplateId, setSelectedTemplateId, dismiss }) => (\n <div className=\"grid gap-3 sm:grid-cols-3\">\n {templates.length ? (\n templates.map((template) => {\n const selected = selectedTemplateId === template.id;\n const select = () => {\n setSelectedTemplateId(template.id);\n dismiss();\n };\n return (\n <article\n key={template.id}\n className={[\n \"relative overflow-hidden rounded border-2 bg-white\",\n selected ? \"border-me-primary-500\" : \"border-gray-200\",\n ].join(\" \")}\n >\n <Button\n aria-label={`Use ${template.label} format`}\n aria-pressed={selected}\n className=\"absolute inset-0 z-10 cursor-pointer rounded outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-me-primary-500\"\n onPress={select}\n />\n <img src={template.thumbnailUrl} alt=\"\" className=\"aspect-video w-full bg-gray-100 object-cover\" />\n <div className=\"pointer-events-none flex flex-col gap-2 p-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-gray-900\">{template.label}</h3>\n <p className=\"mt-1 text-xs uppercase tracking-normal text-gray-500\">{template.type}</p>\n </div>\n <p className=\"text-sm text-gray-600\">{template.summary}</p>\n <a\n href={template.previewUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"pointer-events-auto relative z-20 inline-flex w-fit items-center rounded py-0.5 text-sm font-medium text-me-700 hover:text-me-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-me-primary-500 focus-visible:ring-offset-2\"\n >\n Preview\n </a>\n </div>\n </article>\n );\n })\n ) : (\n <p className=\"text-sm text-gray-600\">No exhibition formats are available for this editor.</p>\n )}\n </div>\n ),\n },\n};\n\nfunction getTemplatePreviewUrl(previewUrl: string, manifestId: string) {\n const url = new URL(previewUrl);\n url.searchParams.set(\"manifest\", manifestId);\n return url.toString();\n}\n\nfunction ExhibitionPresetPreviewButton({\n downloadEnabled,\n fileName,\n preview,\n showOnboardingPreviewHint,\n onOnboardingPreviewHintClose,\n}: PresetPreviewButtonRenderContext) {\n const { actions, configs, active } = usePreviewContext();\n const vault = useVault();\n const config = useConfig();\n const resource = useAppResource();\n const layoutActions = useLayoutActions();\n const openOnboarding = useOpenPresetOnboarding();\n const { selectedTemplate, templates } = usePresetTemplateSelection();\n const configuredTemplate = useExhibitionTemplate();\n const previewConfigs = configs.filter((item) => item.type === \"external-manifest-preview\");\n const templatePreviews = getExhibitionTemplatePreviews(templates, selectedTemplate, configuredTemplate);\n const currentPreviewConfig =\n previewConfigs.find((item) => item.id === config.defaultPreview) ||\n previewConfigs.find((item) => !item.id.includes(\"theseus\") && item.id !== \"raw-manifest\") ||\n previewConfigs[0];\n const theseus = previewConfigs.find((item) => item.id === \"theseus\" || item.id === \"theseus-viewer\");\n const json = previewConfigs.find((item) => item.id === \"raw-manifest\");\n\n async function openPreview(template: PresetTemplateDefinition) {\n const manifestId = await actions.getPreviewLink();\n if (manifestId) {\n window.open(getTemplatePreviewUrl(template.previewUrl, manifestId), template.id);\n }\n }\n\n function openPreviewFixed(id: string) {\n // if (active.includes(id)) {\n // actions.focusPreview(id);\n // return;\n // }\n actions.selectPreview(id);\n }\n\n function openThemePanel() {\n layoutActions.leftPanel.open({ id: \"@exhibitions/theme-panel\" });\n }\n\n if (!templatePreviews.length && !preview?.mainAction && !preview?.actions?.length) {\n return null;\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 style={{ width: \"auto\", minWidth: \"10em\" }}>\n <ButtonMain\n as={Button}\n data-preview-action={preview?.mainAction?.id}\n isDisabled={preview?.mainAction?.disabled}\n onPress={preview?.mainAction?.onClick || openThemePanel}\n >\n {preview?.mainAction?.label || \"Preview\"}\n {configuredTemplate ? (\n <span className=\"ml-1 whitespace-nowrap opacity-75\">\n · {exhibitionTemplateShortLabels[configuredTemplate.type]}\n </span>\n ) : null}\n </ButtonMain>\n <MenuTrigger>\n <ButtonChange\n as={Button}\n $open={false}\n aria-label=\"Choose preview\"\n className=\"exhibition-preview-preset-menu\"\n >\n <DownIcon />\n </ButtonChange>\n <Popover placement=\"bottom right\" className=\"z-50\">\n <MenuContainer\n as={Menu}\n $open\n className=\"outline-none\"\n style={{ position: \"relative\", top: \"auto\", left: \"auto\", marginTop: 0, width: \"15em\" }}\n >\n <MenuItem\n className=\"flex cursor-pointer items-center border-b border-gray-100 p-1 outline-none hover:bg-gray-50 focus:bg-gray-50\"\n onAction={openOnboarding}\n >\n <span className=\"mx-2 flex h-4 w-8 shrink-0 items-center justify-center\">\n <TablerSwitch3 className=\"h-4 w-4 text-gray-500\" />\n </span>\n <MenuItemLabel>Change exhibition format</MenuItemLabel>\n </MenuItem>\n {templatePreviews.map((template) => {\n const isCurrent = configuredTemplate?.id === template.id;\n return (\n <MenuItem\n key={template.id}\n aria-current={isCurrent ? \"true\" : undefined}\n className=\"flex cursor-pointer items-center p-1 outline-none hover:bg-gray-50 focus:bg-gray-50\"\n onAction={() => openPreview(template)}\n >\n <MenuItemStatus $status={isCurrent ? \"active\" : \"available\"} />\n <MenuItemLabel>\n {template.label}\n {isCurrent ? \" (current)\" : \"\"}\n </MenuItemLabel>\n </MenuItem>\n );\n })}\n {preview?.actions?.map((action) => (\n <MenuItem\n key={action.id}\n className=\"flex cursor-pointer items-center p-1 outline-none hover:bg-gray-50 focus:bg-gray-50\"\n isDisabled={action.disabled}\n onAction={action.onClick}\n >\n <MenuItemStatus $status={action.status || \"available\"} />\n <MenuItemLabel>{action.label}</MenuItemLabel>\n </MenuItem>\n ))}\n {theseus && theseus.id !== currentPreviewConfig?.id ? (\n <MenuItem\n className=\"flex cursor-pointer items-center p-1 outline-none hover:bg-gray-50 focus:bg-gray-50\"\n onAction={() => openPreviewFixed(theseus.id)}\n >\n <MenuItemStatus $status={active.includes(theseus.id) ? \"configured\" : \"available\"} />\n <MenuItemLabel>{theseus.label}</MenuItemLabel>\n </MenuItem>\n ) : null}\n {json && json.id !== currentPreviewConfig?.id ? (\n <MenuItem\n className=\"flex cursor-pointer items-center p-1 outline-none hover:bg-gray-50 focus:bg-gray-50\"\n onAction={() => openPreviewFixed(json.id)}\n >\n <MenuItemStatus $status={active.includes(json.id) ? \"configured\" : \"available\"} />\n <MenuItemLabel>{json.label}</MenuItemLabel>\n </MenuItem>\n ) : null}\n </MenuContainer>\n </Popover>\n </MenuTrigger>\n </ButtonContainer>\n <OnboardingTour\n id=\"exhibition-preview-preset-menu\"\n forceStart={showOnboardingPreviewHint}\n onClose={onOnboardingPreviewHintClose}\n lastButtonLabel=\"Dismiss\"\n steps={[\n {\n target: \".exhibition-preview-preset-menu\",\n placement: \"bottom\",\n disableBeacon: true,\n content: \"You can change the exhibition format again from this preview menu.\",\n },\n ]}\n />\n </>\n );\n}\n\nfunction TablerSwitch3(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <g fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\">\n <path d=\"M3 17h2.397a5 5 0 0 0 4.096-2.133l.177-.253m3.66-5.227l.177-.254A5 5 0 0 1 17.603 7H21\" />\n <path d=\"m18 4l3 3l-3 3M3 7h2.397a5 5 0 0 1 4.096 2.133l4.014 5.734A5 5 0 0 0 17.603 17H21\" />\n <path d=\"m18 20l3-3l-3-3\" />\n </g>\n </svg>\n );\n}\n","import { emptyAnnotation, emptyCanvas } from \"@iiif/parser\";\nimport type { InternationalString } from \"@iiif/presentation-3\";\nimport { type CreatorFunctionContext, defineCreator } from \"@manifest-editor/creator-api\";\n\ndeclare module \"@manifest-editor/creator-api\" {\n namespace IIIFManifestEditor {\n interface CreatorDefinitions {\n \"@exhibitions/info-box-creator\": typeof infoBoxCreator;\n \"@exhibitions/slideshow-long-editorial-creator\": typeof slideshowLongEditorialCreator;\n }\n }\n}\n\nexport const infoBoxCreator = defineCreator({\n id: \"@exhibitions/info-box-creator\",\n create: createInfoBox,\n label: \"Info box\",\n summary: \"A text panel for an exhibition\",\n icon: (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\">\n <title>Info box</title>\n <path\n fill=\"currentColor\"\n d=\"M11 17h2v-6h-2zm1-8q.425 0 .713-.288T13 8t-.288-.712T12 7t-.712.288T11 8t.288.713T12 9m0 13q-2.075 0-3.9-.788t-3.175-2.137T2.788 15.9T2 12t.788-3.9t2.137-3.175T8.1 2.788T12 2t3.9.788t3.175 2.137T21.213 8.1T22 12t-.788 3.9t-2.137 3.175t-3.175 2.138T12 22\"\n />\n </svg>\n ),\n tags: [\"exhibition-slide\"],\n resourceType: \"Canvas\",\n resourceFields: [\"id\", \"type\", \"label\", \"height\", \"width\", \"items\"],\n supports: {\n initialData: true,\n parentTypes: [\"Manifest\"],\n parentFields: [\"items\"],\n },\n});\n\nexport const slideshowLongEditorialCreator = defineCreator({\n ...infoBoxCreator,\n id: \"@exhibitions/slideshow-long-editorial-creator\",\n label: \"Long editorial\",\n summary: \"A text-led slideshow slide.\",\n tags: [\"exhibition-slideshow-slide\"],\n create: (payload, ctx) =>\n createInfoBox(\n {\n ...payload,\n behavior: [\"w-12\", \"h-8\", \"info\"],\n height: payload.height || 1080,\n width: payload.width || 1920,\n },\n ctx,\n ),\n});\n\ninterface InfoBoxPayload {\n label?: InternationalString;\n height?: number;\n width?: number;\n behavior?: string[];\n}\n\nasync function createInfoBox(data: InfoBoxPayload, ctx: CreatorFunctionContext) {\n const canvasId = ctx.generateId(\"canvas\");\n const pageId = ctx.generateId(\"annotation-page\", {\n id: canvasId,\n type: \"Canvas\",\n });\n const annotationsId = ctx.generateId(\"annotation-page\", {\n id: canvasId,\n type: \"Canvas\",\n });\n const annotation = {\n ...emptyAnnotation,\n id: ctx.generateId(\"annotation\", { id: canvasId, type: \"Canvas\" }),\n type: \"Annotation\",\n };\n\n const bodies = [\n await ctx.create(\n \"@manifest-editor/html-body-creator\",\n {\n language: \"en\",\n body: \"\",\n },\n { parent: { resource: annotation, property: \"body\" } },\n ),\n ];\n\n const annotationResource = ctx.embed({\n ...annotation,\n motivation: \"painting\",\n body: bodies,\n target: {\n type: \"SpecificResource\",\n source: { id: canvasId, type: \"Canvas\" },\n },\n });\n\n const annotationLongId = ctx.generateId(\"annotation\", {\n id: canvasId,\n type: \"Canvas\",\n });\n const longDescriptionResource = ctx.embed({\n id: annotationLongId,\n type: \"Annotation\",\n motivation: \"tagging\",\n body: [\n await ctx.create(\n \"@manifest-editor/html-body-creator\",\n {\n language: \"en\",\n body: \"\",\n },\n {\n parent: {\n resource: { id: annotationLongId, type: \"Annotation\" },\n property: \"body\",\n },\n },\n ),\n ],\n target: {\n type: \"SpecificResource\",\n source: { id: canvasId, type: \"Canvas\" },\n },\n });\n\n const page = ctx.embed({\n id: pageId,\n type: \"AnnotationPage\",\n items: [annotationResource],\n });\n\n const annotations = ctx.embed({\n id: annotationsId,\n type: \"AnnotationPage\",\n items: [longDescriptionResource],\n });\n\n return ctx.embed({\n ...emptyCanvas, // bug with placeholder canvas.\n id: canvasId,\n type: \"Canvas\",\n behavior: data.behavior || [\"w-4\", \"h-4\", \"info\"],\n label: data.label || undefined,\n height: data.height || 1000,\n width: data.width || 1000,\n items: [page],\n annotations: [annotations],\n });\n}\n","import { emptyCanvas } from \"@iiif/parser\";\nimport type { ContentResource } from \"@iiif/presentation-3\";\nimport { type CreatorFunctionContext, creatorHelper, defineCreator } from \"@manifest-editor/creator-api\";\nimport { type CreateVideoAnnotationPayload, videoAnnotation } from \"@manifest-editor/creators\";\n\ndeclare module \"@manifest-editor/creator-api\" {\n namespace IIIFManifestEditor {\n interface CreatorDefinitions {\n \"@exhibitions/video-creator\": typeof videoSlideCreator;\n \"@exhibitions/slideshow-video-creator\": typeof slideshowVideoCreator;\n }\n }\n}\n\nexport const videoSlideCreator = defineCreator({\n ...videoAnnotation,\n id: \"@exhibitions/video-creator\",\n create: createVideo,\n tags: [\"video\", \"exhibition-slide\"],\n label: \"Video\",\n summary: \"A video for an exhibition\",\n resourceType: \"Canvas\",\n resourceFields: [\"id\", \"type\", \"label\", \"height\", \"width\", \"items\"],\n supports: {\n initialData: true,\n parentTypes: [\"Manifest\"],\n parentFields: [\"items\"],\n },\n});\n\nexport const slideshowVideoCreator = defineCreator({\n ...videoSlideCreator,\n id: \"@exhibitions/slideshow-video-creator\",\n label: \"Video\",\n summary: \"A video slide for a slideshow exhibition.\",\n tags: [\"exhibition-slideshow-slide\"],\n create: (payload, ctx) =>\n createVideo(\n {\n ...payload,\n behavior: [\"w-12\", \"h-8\", \"image\"],\n height: payload.height || 1080,\n slideType: \"default\",\n width: payload.width || 1920,\n },\n ctx,\n ),\n});\n\nasync function createVideo(\n data: CreateVideoAnnotationPayload & {\n behavior?: string[];\n slideType?: \"default\" | \"left\" | \"right\" | \"bottom\";\n },\n ctx: CreatorFunctionContext,\n): Promise<any> {\n const canvasId = ctx.generateId(\"canvas\");\n const pageId = ctx.generateId(\"annotation-page\", {\n id: canvasId,\n type: \"Canvas\",\n });\n\n const annotation = await ctx.create(\"@manifest-editor/video-annotation\", data, {\n target: {\n id: canvasId,\n type: \"Canvas\",\n },\n targetType: \"Annotation\",\n parent: {\n resource: { id: pageId, type: \"AnnotationPage\" },\n property: \"items\",\n },\n });\n\n const page = ctx.embed({\n id: pageId,\n type: \"AnnotationPage\",\n items: [annotation],\n });\n\n // Add thumbnail?\n\n const createSlide = creatorHelper(ctx, \"Manifest\", \"items\", \"@exhibitions/image-slide-creator\");\n\n // 2. Pass that to an empty slide.\n return await createSlide({\n canvasId,\n behavior: data.behavior,\n height: data.height || 1080,\n width: data.width || 1920,\n duration: data.duration,\n type: data.slideType || \"bottom\", // default / left / right / bottom\n items: [annotation as any],\n });\n}\n","import { emptyCanvas } from \"@iiif/parser\";\nimport type { InternationalString } from \"@iiif/presentation-3\";\nimport { type CreatorFunctionContext, defineCreator } from \"@manifest-editor/creator-api\";\nimport { createYoutubeBodyResource, youTubeBodyCreator } from \"@manifest-editor/creators\";\nimport { getYouTubeId } from \"@manifest-editor/editors\";\n\ndeclare module \"@manifest-editor/creator-api\" {\n namespace IIIFManifestEditor {\n interface CreatorDefinitions {\n \"@exhibitions/youtube-creator\": typeof youtubeSlideCreator;\n \"@exhibitions/slideshow-youtube-creator\": typeof slideshowYoutubeCreator;\n }\n }\n}\n\nexport const youtubeSlideCreator = defineCreator({\n ...youTubeBodyCreator,\n id: \"@exhibitions/youtube-creator\",\n create: createYoutube,\n tags: [\"video\", \"exhibition-slide\"],\n label: \"YouTube\",\n summary: \"A YouTube for an exhibition\",\n});\n\nexport const slideshowYoutubeCreator = defineCreator({\n ...youtubeSlideCreator,\n id: \"@exhibitions/slideshow-youtube-creator\",\n label: \"YouTube\",\n summary: \"A YouTube slide for a slideshow exhibition.\",\n tags: [\"exhibition-slideshow-slide\"],\n});\n\ninterface YouTubeCreatePayload {\n youtubeUrl: string;\n label?: InternationalString;\n height?: number;\n width?: number;\n duration: number;\n}\n\nasync function createYoutube(data: YouTubeCreatePayload, ctx: CreatorFunctionContext) {\n const ytId = getYouTubeId(data.youtubeUrl);\n const canvasId = ctx.generateId(\"canvas\");\n const pageId = ctx.generateId(\"annotation-page\", {\n id: canvasId,\n type: \"Canvas\",\n });\n\n const annotation = ctx.embed({\n id: ctx.generateId(\"annotation\", { id: pageId, type: \"AnnotationPage\" }),\n type: \"Annotation\",\n motivation: \"painting\",\n body: [createYoutubeBodyResource(data, ctx)],\n target: {\n type: \"SpecificResource\",\n source: { id: canvasId, type: \"Canvas\" },\n },\n });\n\n const page = ctx.embed({\n id: pageId,\n type: \"AnnotationPage\",\n items: [annotation],\n });\n\n const thumbnail = ctx.embed({\n id: `https://img.youtube.com/vi/${ytId}/maxresdefault.jpg`,\n type: \"Image\",\n format: \"image/jpeg\",\n width: 640,\n height: 360,\n });\n\n // Add thumbnail?\n\n return ctx.embed({\n ...emptyCanvas, // bug with placeholder canvas.\n id: canvasId,\n type: \"Canvas\",\n behavior: [\"w-12\", \"h-8\"],\n label: data.label || { en: [\"Untitled YouTube Video\"] },\n height: data.height || 1080,\n width: data.width || 1920,\n thumbnail: [thumbnail],\n items: [page],\n });\n}\n","import { getValue } from \"@iiif/helpers\";\n\nexport function needsExhibitionSummary(\n summary: Parameters<typeof getValue>[0],\n) {\n return !getValue(summary);\n}\n\nexport function withExhibitionDefaults(\n behavior: string[],\n width: number,\n height: number,\n) {\n const defaultHeight =\n width > 0 && height > 0\n ? Math.max(1, Math.min(12, Math.round((width / height) * 12)))\n : 4;\n\n return [\n ...behavior.filter(\n (item) => !item.startsWith(\"w-\") && !item.startsWith(\"h-\"),\n ),\n \"w-12\",\n `h-${defaultHeight}`,\n ];\n}\n","import { ActionButton } from \"@manifest-editor/components\";\nimport { useEditor } from \"@manifest-editor/shell\";\nimport {\n needsExhibitionSummary,\n withExhibitionDefaults,\n} from \"./exhibition-item-defaults\";\n\nexport function ExhibitionItemConversion({\n misplacedSplash = false,\n}: {\n misplacedSplash?: boolean;\n}) {\n const editor = useEditor();\n\n const applyDefaultSettings = () => {\n const canvasWidth = editor.technical.width.get();\n const canvasHeight = editor.technical.height.get();\n const summary = editor.descriptive.summary;\n const behaviors = editor.technical.behavior;\n\n const currentBehaviors = behaviors.get();\n const defaultBehaviors = withExhibitionDefaults(\n misplacedSplash\n ? currentBehaviors.filter((behavior) => behavior !== \"splash\")\n : currentBehaviors,\n canvasWidth,\n canvasHeight,\n );\n\n if (needsExhibitionSummary(summary.get())) {\n summary.set({ en: [\"Summary of image\"] });\n }\n\n if (\n defaultBehaviors.length !== currentBehaviors.length ||\n defaultBehaviors.some(\n (behavior, index) => behavior !== currentBehaviors[index],\n )\n ) {\n behaviors.set(defaultBehaviors);\n }\n };\n\n return (\n <div className=\"flex flex-col items-center gap-4 border-me-100 border-2 p-4 rounded\">\n {misplacedSplash\n ? \"Opening cover canvases must be first. Apply defaults to use this canvas as a regular exhibition slide.\"\n : \"This canvas was not created in the exhibition editor. Do you want to apply default settings?\"}\n <ActionButton onPress={() => applyDefaultSettings()}>\n Apply defaults\n </ActionButton>\n </div>\n );\n}\n","import { Input, InputContainer, InputLabel } from \"@manifest-editor/editors\";\n\nexport function CanvasBackgroundColorField({ editor }: { editor: any }) {\n const backgroundColor = editor.get() || \"\";\n\n return (\n <InputContainer $wide id={editor.containerId()}>\n <InputLabel htmlFor={editor.focusId()}>Background colour</InputLabel>\n <div className=\"flex min-w-0 items-center gap-2\">\n <input\n id={editor.focusId()}\n aria-label=\"Choose background colour\"\n className=\"h-9 w-12 shrink-0 cursor-pointer rounded border border-[#dcd5ce] bg-white p-1\"\n type=\"color\"\n value={toHexColor(backgroundColor)}\n onChange={(event) => editor.set(event.target.value)}\n />\n <Input\n aria-label=\"Background colour value\"\n placeholder=\"No colour\"\n value={backgroundColor}\n onChange={(event) => editor.set(event.target.value || null)}\n />\n {backgroundColor ? (\n <button\n type=\"button\"\n className=\"rounded border border-[#dcd5ce] bg-white px-3 py-2 text-sm font-semibold text-[#332f2c]\"\n onClick={() => editor.set(null)}\n >\n Remove\n </button>\n ) : null}\n </div>\n <p className=\"mt-1 text-xs text-[#6a625c]\">Shown behind the image and text for this section.</p>\n </InputContainer>\n );\n}\n\nfunction toHexColor(value: string) {\n const trimmed = value.trim();\n if (/^#[0-9a-fA-F]{6}$/.test(trimmed)) return trimmed;\n if (/^#[0-9a-fA-F]{3}$/.test(trimmed)) {\n const [r, g, b] = trimmed.slice(1);\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n return \"#ffffff\";\n}\n","import {\n getPaintingAnnotations,\n getResolvedAnnotationBody,\n} from \"../slideshow-content-positioning\";\n\nexport function getSingleImageAnnotationToRescale(vault: any, canvas: any) {\n if (!canvas?.behavior?.includes(\"multi-image\")) return null;\n\n const annotations = getPaintingAnnotations(vault, canvas);\n if (annotations.length !== 1) return null;\n\n const annotation = annotations[0];\n const body = Array.isArray(annotation?.body)\n ? annotation.body[0]\n : annotation?.body;\n const selector = body?.type === \"SpecificResource\" ? body.selector : null;\n const region = selector?.region?.split(\",\").map(Number);\n\n return annotation?.target?.selector &&\n getResolvedAnnotationBody(vault, annotation)?.type === \"Image\" &&\n [\"ImageApiSelector\", \"iiif:ImageApiSelector\"].includes(selector?.type) &&\n region?.length === 4 &&\n region.every(Number.isFinite) &&\n region[2] > 0 &&\n region[3] > 0\n ? annotation\n : null;\n}\n","import { targetWholeCanvas } from \"@manifest-editor/editors\";\nimport { useGenericEditor } from \"@manifest-editor/shell\";\nimport { Button } from \"react-aria-components\";\nimport { useCanvas, useVault, useVaultSelector } from \"react-iiif-vault\";\nimport { getSingleImageAnnotationToRescale } from \"./single-image-rescale\";\n\nexport function RescaleSingleImagePrompt() {\n const canvas = useCanvas();\n const vault = useVault();\n const annotation = useVaultSelector(\n (_, currentVault) =>\n getSingleImageAnnotationToRescale(currentVault, canvas),\n [canvas?.id, canvas?.items],\n );\n const annotationEditor = useGenericEditor(\n annotation ? { id: annotation.id, type: \"Annotation\" } : undefined,\n { allowNull: true },\n );\n\n if (!canvas || !annotation || !annotationEditor?.annotation) return null;\n\n return (\n <div className=\"mb-6 rounded-md border border-amber-300 bg-amber-50 p-4 text-sm text-amber-950\">\n <p className=\"mb-3\">\n This slide has one image positioned for a multi-image layout. Rescale\n the slide to fit it.\n </p>\n <Button\n className=\"rounded-md bg-amber-900 px-3 py-2 font-semibold text-white hover:bg-amber-800\"\n onPress={() =>\n targetWholeCanvas(vault, canvas, annotationEditor.annotation)\n }\n >\n Rescale for current image\n </Button>\n </div>\n );\n}\n","import type { InternationalString } from \"@iiif/presentation-3\";\nimport { Sidebar, SidebarContent } from \"@manifest-editor/components\";\nimport {\n LanguageMapEditor,\n LanguageFieldEditor,\n InputContainer,\n InputFieldset,\n InputLabel,\n TiptapLanguageFieldEditor,\n type MetadataSave,\n} from \"@manifest-editor/editors\";\nimport {\n type EditorDefinition,\n ResourceEditingProvider,\n useEditor,\n} from \"@manifest-editor/shell\";\nimport { useEffect, useMemo } from \"react\";\nimport { useCanvas, useVault } from \"react-iiif-vault\";\nimport { isEditableExhibitionCanvas, isInfoBoxCanvas } from \"../helpers\";\nimport { useSlideshowWorkbenchState } from \"../slideshow-content-positioning\";\nimport {\n normalizeSummaryForHtmlEditor,\n normalizeSummaryForSave,\n} from \"./summary-html\";\nimport { isOpeningSplashResource } from \"./opening-splash\";\n\nexport const exhibitionSummaryEdtior: EditorDefinition = {\n id: \"@exhibition/summary-editor\",\n supports: {\n edit: true,\n properties: [\"summary\", \"requiredStatement\"],\n resourceTypes: [\"Canvas\"],\n custom: (editingResource, vault) => {\n const { resource } = editingResource;\n if (!isEditableExhibitionCanvas(resource as any, vault)) return false;\n // These surfaces edit their copy in their main exhibition panels.\n return !isOpeningSplashResource(editingResource, vault) && !isInfoBoxCanvas(resource as any, vault);\n },\n },\n label: \"Text content\",\n component: () => <ExhibitionSummaryPanel />,\n};\n\nexport function ExhibitionSummaryPanel() {\n return (\n <Sidebar>\n <SidebarContent padding>\n <ExhibitionSummaryContent />\n </SidebarContent>\n </Sidebar>\n );\n}\n\nexport function ExhibitionSummaryContent() {\n const setCenterPanelMode = useSlideshowWorkbenchState((state) => state.setCenterPanelMode);\n const canvas = useCanvas();\n\n useEffect(() => {\n setCenterPanelMode(\"preview\");\n }, [setCenterPanelMode]);\n\n if (!canvas) return null;\n\n return (\n <ResourceEditingProvider resource={canvas}>\n <LanguageMapEditor dispatchType=\"label\" />\n <ExhibitionHtmlSummaryEditor resource={canvas} />\n <ExhibitionRequiredStatementEditor />\n </ResourceEditingProvider>\n );\n}\n\nexport function ExhibitionRequiredStatementEditor() {\n const { descriptive } = useEditor();\n const { requiredStatement } = descriptive;\n const statement = requiredStatement.get();\n\n return (\n <InputContainer $wide id={requiredStatement.containerId()}>\n <InputLabel htmlFor={requiredStatement.focusId()}>Required statement</InputLabel>\n <InputFieldset id={requiredStatement.focusId()}>\n <LanguageFieldEditor\n focusId={`${requiredStatement.focusId()}_label`}\n label=\"Label\"\n fields={statement?.label || { none: [] }}\n onSave={(e: any) => requiredStatement.updateLabel(e.toInternationalString())}\n />\n <LanguageFieldEditor\n focusId={`${requiredStatement.focusId()}_value`}\n label=\"Value\"\n fields={statement?.value || { none: [] }}\n onSave={(e: any) => requiredStatement.update(e.toInternationalString())}\n />\n </InputFieldset>\n </InputContainer>\n );\n}\n\nexport function ExhibitionHtmlSummaryEditor({\n resource,\n}: {\n resource: { id: string; type?: string; summary?: InternationalString | null };\n}) {\n const vault = useVault();\n const fields = useMemo(\n () => normalizeSummaryForHtmlEditor(resource.summary),\n [resource.summary],\n );\n\n const saveSummary: MetadataSave = (data) => {\n vault.modifyEntityField(\n resource as any,\n \"summary\",\n normalizeSummaryForSave(data.toInternationalString()),\n );\n };\n\n return (\n <TiptapLanguageFieldEditor\n key={resource.id}\n label=\"summary\"\n metadataKey=\"summary\"\n fields={fields}\n onSave={saveSummary}\n />\n );\n}\n","import { ArrowRightIcon, Sidebar, SidebarContent } from \"@manifest-editor/components\";\nimport { InputContainer, LanguageMapEditor, PaintingAnnotationList } from \"@manifest-editor/editors\";\nimport {\n type EditorDefinition,\n ResourceEditingProvider,\n useEditingResource,\n useCreator,\n useEditor,\n useLayoutActions,\n useManifestEditor,\n} from \"@manifest-editor/shell\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { AnnotationPageContext, useCanvas, useVault, useVaultSelector } from \"react-iiif-vault\";\nimport { ExhibitionItemConversion } from \"../components/ExhibitionItemConversion\";\nimport { CanvasBackgroundColorField } from \"../components/CanvasBackgroundColorField\";\nimport { RescaleSingleImagePrompt } from \"../components/RescaleSingleImagePrompt\";\nimport { isEditableExhibitionCanvas, isExhibitionItem, isInfoBoxCanvas } from \"../helpers\";\nimport {\n getTourStepAnnotations,\n supportsTourSteps,\n useSlideshowWorkbenchState,\n} from \"../slideshow-content-positioning\";\nimport {\n buildLayoutPresetBehaviors,\n FloatingPositionPicker,\n getFloatingBehavior,\n getLayoutPreset,\n hasFloatingBehavior,\n injectTextPlaceholders,\n LayoutPresetCard,\n updateFloatingBehavior,\n useExhibitionTemplateControls,\n} from \"./SlideBehaviours\";\nimport { getLanguageMapHtml } from \"./summary-html\";\nimport { ExhibitionHtmlSummaryEditor } from \"./ExhibitionSummaryEditor\";\nimport { isOpeningSplashCanvas } from \"./opening-splash\";\n\nexport const exhibitionCanvasEditor: EditorDefinition = {\n id: \"@exhibition/right-panel-editor\",\n supports: {\n edit: true,\n properties: [\"label\", \"summary\"],\n resourceTypes: [\"Canvas\"],\n custom: ({ resource }, vault) => {\n if (!isEditableExhibitionCanvas(resource as any, vault)) return false;\n // Hide the Exhibition tab for textual-content (info box) canvases.\n return !isInfoBoxCanvas(resource as any, vault);\n },\n },\n label: \"Exhibition\",\n component: () => <ExhibitionCanvasAdvancedPanel />,\n};\n\nexport function ExhibitionCanvasAdvancedPanel() {\n return (\n <Sidebar>\n <SidebarContent padding>\n <ExhibitionCanvasAdvancedContent />\n </SidebarContent>\n </Sidebar>\n );\n}\n\nexport function ExhibitionCanvasAdvancedContent() {\n const setCenterPanelMode = useSlideshowWorkbenchState((state) => state.setCenterPanelMode);\n const canvas = useCanvas();\n const vault = useVault();\n const manifestEditor = useManifestEditor();\n const resource = useEditingResource();\n const { structural, technical } = useEditor();\n const { items } = structural;\n const behavior = technical.behavior.get() || [];\n const pages = items.get();\n const page = pages[0];\n const [, annotationActions] = useCreator(\n page ? { id: page.id, type: \"AnnotationPage\" } : undefined,\n \"items\",\n \"Annotation\",\n canvas ? { id: canvas.id, type: \"Canvas\" } : undefined,\n { isPainting: true },\n );\n\n const isAnExhibitionCanvas = isExhibitionItem(canvas);\n const isTextOnly = behavior.includes(\"info\");\n const isOpeningCover = isOpeningSplashCanvas(canvas, manifestEditor.structural.items.get());\n const isMisplacedSplash = behavior.includes(\"splash\") && !isOpeningCover;\n const tourSupported = supportsTourSteps(vault, canvas);\n const hasTourSteps = useVaultSelector(\n (_, vaultInstance) => (canvas ? getTourStepAnnotations(vaultInstance, canvas).length > 0 : false),\n [canvas?.id, canvas?.annotations?.[0]?.id],\n );\n const controls = useExhibitionTemplateControls(behavior, hasTourSteps);\n\n useEffect(() => {\n setCenterPanelMode(\"preview\");\n }, [setCenterPanelMode]);\n\n if (!canvas || !page || !resource) return <div className=\"p-8\">Canvas, page, or resource not found</div>;\n\n if (isTextOnly) {\n return (\n <ResourceEditingProvider resource={canvas}>\n {!isAnExhibitionCanvas || isMisplacedSplash ? (\n <ExhibitionItemConversion misplacedSplash={isMisplacedSplash} />\n ) : null}\n <ReadonlyExhibitionSummary canvas={canvas} />\n {tourSupported ? <TourStepsSummary canvas={canvas} /> : null}\n </ResourceEditingProvider>\n );\n }\n\n return (\n <ResourceEditingProvider resource={canvas}>\n {!isAnExhibitionCanvas || isMisplacedSplash ? (\n <ExhibitionItemConversion misplacedSplash={isMisplacedSplash} />\n ) : null}\n\n <RescaleSingleImagePrompt />\n\n {isOpeningCover ? (\n <ManifestSplashFields manifestEditor={manifestEditor} />\n ) : (\n <ReadonlyExhibitionSummary canvas={canvas} />\n )}\n\n <CanvasBackgroundColorField editor={technical.backgroundColor} />\n\n {controls.layoutOptions.length || (controls.isSlideshow && hasFloatingBehavior(behavior)) ? (\n <InputContainer $wide>\n <div>\n <div className=\"exhibition-workbench-muted mb-3 text-sm font-semibold\">\n {controls.isSlideshow && hasFloatingBehavior(behavior) ? \"Text overlay position\" : \"Text placement\"}\n </div>\n {controls.isSlideshow && hasFloatingBehavior(behavior) ? (\n <FloatingPositionPicker\n value={getFloatingBehavior(behavior)}\n onChange={(next) => technical.behavior.set(updateFloatingBehavior(behavior, next))}\n />\n ) : (\n <div className=\"grid grid-cols-2 gap-3\">\n {controls.layoutOptions.map((option) => (\n <LayoutPresetCard\n key={option.value}\n preset={option.value}\n label={option.label}\n selected={getLayoutPreset(behavior) === option.value}\n onClick={() => {\n technical.behavior.set(\n buildLayoutPresetBehaviors(\n behavior,\n option.value,\n canvas ? { width: canvas.width, height: canvas.height } : undefined,\n ),\n );\n if (canvas) {\n injectTextPlaceholders(vault, canvas, option.value);\n }\n }}\n />\n ))}\n </div>\n )}\n <EditorTabLink canvas={canvas} tabId=\"slide-behaviors\" label=\"More display options\" />\n </div>\n </InputContainer>\n ) : null}\n\n {tourSupported && !isOpeningCover ? <TourStepsSummary canvas={canvas} /> : null}\n\n <AnnotationPageContext annotationPage={page.id}>\n <PaintingAnnotationList\n onCreate={() => {\n setCenterPanelMode(\"edit\");\n annotationActions.createFiltered(\"image\", undefined, { skipEditingOnCreate: true });\n }}\n />\n </AnnotationPageContext>\n </ResourceEditingProvider>\n );\n}\n\nfunction ManifestSplashFields({ manifestEditor }: { manifestEditor: ReturnType<typeof useManifestEditor> }) {\n const manifest = {\n ...manifestEditor.ref(),\n summary: manifestEditor.descriptive.summary.get(),\n };\n\n return (\n <ResourceEditingProvider resource={manifest}>\n <LanguageMapEditor dispatchType=\"label\" />\n <ExhibitionHtmlSummaryEditor resource={manifest} />\n </ResourceEditingProvider>\n );\n}\n\nfunction ReadonlyExhibitionSummary({ canvas }: { canvas: any }) {\n const { edit } = useLayoutActions();\n const summaryRef = useRef<HTMLDivElement | null>(null);\n const [expanded, setExpanded] = useState(false);\n const [canExpand, setCanExpand] = useState(false);\n const label = getLanguageMapText(canvas.label) || \"Untitled\";\n const summary = getLanguageMapHtml(canvas.summary);\n\n useEffect(() => {\n const element = summaryRef.current;\n if (!element) {\n setCanExpand(false);\n return;\n }\n\n setCanExpand(element.scrollHeight > element.clientHeight + 1);\n }, [summary, expanded]);\n\n const openSummaryTab = () => {\n edit({ id: canvas.id, type: \"Canvas\" }, undefined, {\n selectedTab: \"@exhibition/summary-editor\",\n forceOpen: true,\n });\n };\n\n return (\n <InputContainer $wide>\n <div className=\"rounded-md border border-[#dcd5ce] bg-[#f8f6f3] p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"text-xs font-semibold uppercase text-[#6a625c]\">Label</div>\n <div className=\"mt-1 break-words text-base font-semibold text-[#25211f]\">{label}</div>\n </div>\n <button\n type=\"button\"\n className=\"flex-shrink-0 rounded-md px-3 py-2 text-sm font-semibold shadow-sm\"\n style={{\n backgroundColor: \"#b84c74\",\n border: \"1px solid #a13e63\",\n color: \"#ffffff\",\n }}\n onClick={openSummaryTab}\n >\n Edit\n </button>\n </div>\n\n <div className=\"mt-5\">\n <div className=\"text-xs font-semibold uppercase text-[#6a625c]\">Summary</div>\n <div\n ref={summaryRef}\n className={[\n \"mt-2 whitespace-pre-wrap break-words text-sm leading-relaxed text-[#332f2c]\",\n expanded ? \"\" : \"max-h-32 overflow-hidden\",\n ].join(\" \")}\n >\n {summary ? (\n <div\n className=\"prose prose-sm max-w-none prose-p:my-2 prose-headings:my-2 prose-ul:my-2 prose-ol:my-2\"\n dangerouslySetInnerHTML={{ __html: summary }}\n />\n ) : (\n <span className=\"text-[#6a625c]\">No summary added.</span>\n )}\n </div>\n {canExpand || expanded ? (\n <button\n type=\"button\"\n className=\"mt-2 text-sm font-semibold text-[#b84c74]\"\n onClick={() => setExpanded((value) => !value)}\n >\n {expanded ? \"Read less\" : \"Read more\"}\n </button>\n ) : null}\n </div>\n </div>\n </InputContainer>\n );\n}\n\nfunction TourStepsSummary({ canvas }: { canvas: any }) {\n const vault = useVault();\n const annotationPageRef = canvas.annotations?.[0];\n const annotationPage = annotationPageRef\n ? (vault.get(annotationPageRef, { skipSelfReturn: false } as any) as any)\n : null;\n const count = Array.isArray(annotationPage?.items) ? annotationPage.items.length : 0;\n const message =\n count === 0 ? \"There are no tour steps yet.\" : `${count} tour step${count === 1 ? \"\" : \"s\"} on this canvas.`;\n\n return (\n <InputContainer $wide>\n <div className=\"rounded-md border border-[#dcd5ce] bg-white p-4\">\n <div className=\"text-sm font-semibold text-[#25211f]\">Tour steps</div>\n <div className=\"mt-1 text-sm text-[#6a625c]\">{message}</div>\n <EditorTabLink\n canvas={canvas}\n tabId=\"@exhibition/tour-steps\"\n label={count === 0 ? \"Open Tour steps tab to add one\" : \"Open Tour steps tab\"}\n />\n </div>\n </InputContainer>\n );\n}\n\nfunction EditorTabLink({ canvas, tabId, label }: { canvas: any; tabId: string; label: string }) {\n const { edit } = useLayoutActions();\n\n return (\n <button\n type=\"button\"\n onClick={() => edit({ id: canvas.id, type: \"Canvas\" }, undefined, { selectedTab: tabId, forceOpen: true })}\n className=\"flex gap-2 items-center justify-between mt-3 text-me-primary-600 bg-gray-50 py-2 px-4 rounded-full hover:bg-gray-100\"\n >\n <span className=\"text-left text-sm font-semibold\">{label}</span>\n <ArrowRightIcon />\n </button>\n );\n}\n\nfunction getLanguageMapText(value: any): string {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) return value.filter(Boolean).join(\" \");\n\n if (typeof value === \"object\") {\n const values = Object.values(value).flatMap((item) => (Array.isArray(item) ? item : [item]));\n\n return values.filter((item): item is string => typeof item === \"string\").join(\" \");\n }\n\n return \"\";\n}\n","import { addMappings, importEntities } from \"@iiif/helpers/vault/actions\";\nimport {\n canonicalServiceUrl,\n createImageServiceRequest,\n imageServiceRequestToString,\n isImageService,\n parseImageServiceRequest,\n} from \"@iiif/parser/image-3\";\n\nexport interface CropRegion {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface EditableImageCrop {\n annotation: any;\n annotationRef: { id: string; type: \"Annotation\" };\n body: any;\n selector: any;\n source: any;\n service: any;\n}\n\ntype Resolver = (resource: any) => any;\n\nexport function getEditableImageCrop(\n annotation: any,\n resolve: Resolver = (resource) => resource,\n): EditableImageCrop | null {\n const crop = getImageCropContext(annotation, resolve);\n return crop && parseCropRegion(crop.selector.region) ? crop : null;\n}\n\nexport function getImageCropContext(\n annotation: any,\n resolve: Resolver = (resource) => resource,\n): EditableImageCrop | null {\n const motivations = Array.isArray(annotation?.motivation) ? annotation.motivation : [annotation?.motivation];\n const bodyRefs = Array.isArray(annotation?.body) ? annotation.body : annotation?.body ? [annotation.body] : [];\n if (!motivations.includes(\"painting\") || bodyRefs.length !== 1) return null;\n\n const bodyRef = bodyRefs[0];\n if (!annotation?.id || bodyRef?.type === \"Choice\" || bodyRef?.source?.type === \"Choice\") return null;\n\n const isSpecificResource = bodyRef?.type === \"SpecificResource\";\n const existingSelector = isSpecificResource ? bodyRef.selector : undefined;\n if (existingSelector && ![\"ImageApiSelector\", \"iiif:ImageApiSelector\"].includes(existingSelector.type)) {\n return null;\n }\n\n const sourceRef = isSpecificResource ? bodyRef.source : bodyRef;\n const source = resolve(sourceRef) || sourceRef;\n if (source?.type !== \"Image\") return null;\n\n const services = Array.isArray(source.service) ? source.service : source.service ? [source.service] : [];\n const service = services\n .map((item: any) => resolve(item) || item)\n .find((item: any) => isImageService(item) && (item.id || item[\"@id\"]));\n if (!service) return null;\n\n return {\n annotation,\n annotationRef: { id: annotation.id, type: \"Annotation\" },\n body: isSpecificResource ? bodyRef : { type: \"SpecificResource\", source: sourceRef },\n selector: existingSelector || { type: \"ImageApiSelector\" },\n source,\n service,\n };\n}\n\nexport function parseCropRegion(value: unknown): CropRegion | null {\n if (typeof value !== \"string\") return null;\n const values = value.split(\",\").map(Number);\n if (values.length !== 4 || !values.every(Number.isFinite)) return null;\n const x = values[0]!;\n const y = values[1]!;\n const width = values[2]!;\n const height = values[3]!;\n if (width <= 0 || height <= 0) return null;\n return { x, y, width, height };\n}\n\nexport function normaliseCropRegion(region: CropRegion): CropRegion {\n const normalised = {\n x: Math.max(0, Math.round(region.x)),\n y: Math.max(0, Math.round(region.y)),\n width: Math.round(region.width),\n height: Math.round(region.height),\n };\n if (normalised.width <= 0 || normalised.height <= 0) {\n throw new Error(\"The crop must have a positive width and height\");\n }\n return normalised;\n}\n\nexport function transformImageCrop(crop: EditableImageCrop, editedRegion: CropRegion) {\n const region = normaliseCropRegion(editedRegion);\n return transformImage(crop, region, crop.selector.rotation);\n}\n\nexport function transformImageRotation(crop: EditableImageCrop, rotation: number) {\n const region = parseCropRegion(crop.selector.region);\n const dimensions = region || getServiceDimensions(crop.service);\n if (!dimensions) throw new Error(\"The image service did not provide full image dimensions\");\n return transformImage(crop, region, normaliseImageRotation(rotation), dimensions);\n}\n\nfunction transformImage(\n crop: EditableImageCrop,\n region: CropRegion | null,\n rotation: unknown,\n dimensions: { width: number; height: number } = region!,\n) {\n const selector: any = {\n ...crop.selector,\n ...(rotation !== undefined ? { rotation: String(rotation) } : {}),\n };\n if (region) selector.region = serialiseCropRegion(region);\n else delete selector.region;\n const sourceId = imageRequestForTransform(crop, region, rotation);\n const thumbnailWidth = Math.min(512, dimensions.width);\n const thumbnailId = imageRequestForTransform(crop, region, rotation, thumbnailWidth);\n const imageDimensions = rotatedImageDimensions(dimensions.width, dimensions.height, rotation);\n const thumbnailDimensions = rotatedImageDimensions(\n thumbnailWidth,\n Math.round((dimensions.height / dimensions.width) * thumbnailWidth),\n rotation,\n );\n\n return {\n region,\n imageDimensions,\n thumbnailDimensions,\n selector,\n source: {\n ...crop.source,\n id: sourceId,\n ...(crop.source[\"@id\"] ? { \"@id\": sourceId } : {}),\n width: imageDimensions.width,\n height: imageDimensions.height,\n },\n sourceId,\n thumbnailId,\n };\n}\n\nexport function applyImageCropResponse(\n vault: any,\n crop: EditableImageCrop,\n canvas: any,\n response: { cancelled?: boolean; boundingBox?: CropRegion | null } | null | undefined,\n) {\n if (!response || response.cancelled || !response.boundingBox) return null;\n return applyImageCrop(vault, crop, canvas, response.boundingBox);\n}\n\nexport function shouldResizeCanvasForCrop(canvas: any, annotation: any, paintingAnnotationCount: number) {\n const behavior = Array.isArray(canvas?.behavior) ? canvas.behavior : canvas?.behavior ? [canvas.behavior] : [];\n const targets = Array.isArray(annotation?.target)\n ? annotation.target\n : annotation?.target\n ? [annotation.target]\n : [];\n const targetsWholeCanvas = targets.some((target: any) => targetCoversCanvas(target, canvas));\n return targetsWholeCanvas && paintingAnnotationCount === 1 && !behavior.includes(\"multi-image\");\n}\n\nexport function applyImageCrop(vault: any, crop: EditableImageCrop, canvas: any, editedRegion: CropRegion) {\n const transformed = transformImageCrop(crop, editedRegion);\n return applyImageTransform(vault, crop, canvas, transformed);\n}\n\nexport function applyImageRotation(vault: any, crop: EditableImageCrop, canvas: any, rotation: number) {\n const transformed = transformImageRotation(crop, rotation);\n return applyImageTransform(vault, crop, canvas, transformed);\n}\n\nfunction applyImageTransform(\n vault: any,\n crop: EditableImageCrop,\n canvas: any,\n transformed: ReturnType<typeof transformImage>,\n) {\n const paintingAnnotationCount = countPaintingAnnotations(vault, canvas);\n const resizeCanvas = shouldResizeCanvasForCrop(canvas, crop.annotation, paintingAnnotationCount);\n\n vault.batch(() => {\n vault.dispatch(\n importEntities({\n entities: {\n ContentResource: {\n [transformed.sourceId]: transformed.source,\n [transformed.thumbnailId]: {\n id: transformed.thumbnailId,\n type: \"Image\",\n format: \"image/jpeg\",\n width: transformed.thumbnailDimensions.width,\n height: transformed.thumbnailDimensions.height,\n service: [crop.service],\n },\n },\n },\n }),\n );\n vault.dispatch(\n addMappings({\n mapping: {\n [transformed.sourceId]: \"ContentResource\",\n [transformed.thumbnailId]: \"ContentResource\",\n },\n }),\n );\n vault.modifyEntityField(crop.annotationRef, \"body\", [\n {\n ...crop.body,\n selector: transformed.selector,\n source: {\n id: transformed.sourceId,\n type: \"ContentResource\",\n },\n },\n ]);\n\n vault.modifyEntityField({ id: canvas.id, type: \"Canvas\" }, \"thumbnail\", [\n { id: transformed.thumbnailId, type: \"ContentResource\" },\n ]);\n\n if (resizeCanvas) {\n vault.modifyEntityField({ id: canvas.id, type: \"Canvas\" }, \"width\", transformed.imageDimensions.width);\n vault.modifyEntityField({ id: canvas.id, type: \"Canvas\" }, \"height\", transformed.imageDimensions.height);\n vault.modifyEntityField(crop.annotationRef, \"target\", removeWholeCanvasSelector(crop.annotation.target, canvas));\n }\n });\n\n return transformed;\n}\n\nexport function rotatedImageDimensions(width: number, height: number, rotation: unknown) {\n const angle = Number(String(rotation ?? 0).replace(/^!/, \"\"));\n const normalised = Number.isFinite(angle) ? ((angle % 360) + 360) % 360 : 0;\n return normalised === 90 || normalised === 270 ? { width: height, height: width } : { width, height };\n}\n\nfunction rotateRegion(\n region: CropRegion,\n dimensions: { width: number; height: number },\n rotation: unknown,\n): CropRegion {\n switch (normaliseImageRotation(rotation)) {\n case 90:\n return {\n x: dimensions.height - region.y - region.height,\n y: region.x,\n width: region.height,\n height: region.width,\n };\n case 180:\n return {\n x: dimensions.width - region.x - region.width,\n y: dimensions.height - region.y - region.height,\n width: region.width,\n height: region.height,\n };\n case 270:\n return {\n x: region.y,\n y: dimensions.width - region.x - region.width,\n width: region.height,\n height: region.width,\n };\n default:\n return { ...region };\n }\n}\n\nexport function imageRegionToDisplay(\n region: CropRegion,\n dimensions: { width: number; height: number },\n rotation: unknown,\n): CropRegion {\n const sourceRegion = String(rotation ?? \"\").startsWith(\"!\")\n ? { ...region, x: dimensions.width - region.x - region.width }\n : region;\n return rotateRegion(sourceRegion, dimensions, rotation);\n}\n\nexport function displayRegionToImage(\n region: CropRegion,\n dimensions: { width: number; height: number },\n rotation: unknown,\n): CropRegion {\n const displayDimensions = rotatedImageDimensions(\n dimensions.width,\n dimensions.height,\n rotation,\n );\n const sourceRegion = rotateRegion(\n region,\n displayDimensions,\n 360 - normaliseImageRotation(rotation),\n );\n return String(rotation ?? \"\").startsWith(\"!\")\n ? {\n ...sourceRegion,\n x: dimensions.width - sourceRegion.x - sourceRegion.width,\n }\n : sourceRegion;\n}\n\nexport function getServiceDimensions(service: any): { width: number; height: number } | null {\n const width = Number(service?.width);\n const height = Number(service?.height);\n return width > 0 && height > 0 ? { width, height } : null;\n}\n\nexport async function resolveImageService(service: any, fetcher: typeof fetch = fetch): Promise<any> {\n if (getServiceDimensions(service)) return service;\n\n const serviceId = service?.id || service?.[\"@id\"];\n if (!serviceId) throw new Error(\"The image service has no identifier\");\n\n const response = await fetcher(canonicalServiceUrl(serviceId));\n if (!response.ok) throw new Error(`The image service returned ${response.status}`);\n const info = await response.json();\n const resolved = {\n ...service,\n ...info,\n id: info.id || info[\"@id\"] || serviceId,\n };\n if (!getServiceDimensions(resolved)) {\n throw new Error(\"The image service did not provide full image dimensions\");\n }\n return resolved;\n}\n\nexport function fullImageRequest(service: any, rotation: unknown = 0) {\n const request = createImageServiceRequest(normaliseService(service));\n return imageServiceRequestToString({\n ...request,\n type: \"image\",\n region: { full: true },\n size: { max: true, confined: false, upscaled: false },\n rotation: selectorRotation(rotation),\n quality: \"default\",\n format: \"jpg\",\n } as any);\n}\n\nfunction serialiseCropRegion(region: CropRegion) {\n return `${region.x},${region.y},${region.width},${region.height}`;\n}\n\nfunction targetCoversCanvas(target: any, canvas: any) {\n const source = target?.type === \"SpecificResource\" ? target.source : target;\n const sourceValue = typeof source === \"string\" ? source : source?.id;\n if (typeof sourceValue !== \"string\") return false;\n const [sourceId, fragment] = sourceValue.split(\"#\", 2);\n if (sourceId !== canvas.id) return false;\n\n const selectors = Array.isArray(target?.selector)\n ? target.selector\n : target?.selector\n ? [target.selector]\n : [];\n if (!selectors.length && !fragment) return true;\n\n const selector = selectors.find(\n (item: any) => item?.spatial || (typeof item?.value === \"string\" && item.value.startsWith(\"xywh=\")),\n );\n let region = selector?.spatial;\n const value = fragment || selector?.value;\n if (!region && typeof value === \"string\" && value.startsWith(\"xywh=\")) {\n const [x, y, width, height] = value.replace(/^xywh=(?:pixel:)?/, \"\").split(/[,&]/).slice(0, 4).map(Number);\n region = { x, y, width, height };\n }\n if (!region) return false;\n\n return (\n Number(region?.x) === 0 &&\n Number(region?.y) === 0 &&\n Number(region?.width) === Number(canvas?.width) &&\n Number(region?.height) === Number(canvas?.height)\n );\n}\n\nfunction removeWholeCanvasSelector(target: any, canvas: any): any {\n if (Array.isArray(target)) {\n return target.map((item) => (targetCoversCanvas(item, canvas) ? removeWholeCanvasSelector(item, canvas) : item));\n }\n if (typeof target === \"string\") return canvas.id;\n if (target?.type !== \"SpecificResource\") return target;\n\n return {\n ...target,\n source:\n typeof target.source === \"string\"\n ? canvas.id\n : target.source?.id?.includes(\"#\")\n ? { ...target.source, id: canvas.id }\n : target.source,\n selector: undefined,\n };\n}\n\nfunction imageRequestForTransform(\n crop: EditableImageCrop,\n region: CropRegion | null,\n rotationValue: unknown,\n thumbnailWidth?: number,\n) {\n const parsedSource = parseImageRequest(crop.source.id);\n const request = parsedSource || createImageServiceRequest(normaliseService(crop.service));\n const rotation =\n rotationValue !== undefined\n ? selectorRotation(rotationValue)\n : parsedSource?.rotation || { angle: 0 };\n\n return imageServiceRequestToString({\n ...request,\n type: \"image\",\n region: region\n ? { x: region.x, y: region.y, w: region.width, h: region.height }\n : { full: true },\n size: thumbnailWidth\n ? { max: false, confined: false, upscaled: false, width: thumbnailWidth }\n : { max: true, confined: false, upscaled: false },\n rotation,\n quality: parsedSource?.quality || \"default\",\n format: parsedSource?.format || \"jpg\",\n } as any);\n}\n\nfunction parseImageRequest(id: unknown) {\n if (typeof id !== \"string\") return null;\n try {\n const request = parseImageServiceRequest(id);\n return request.type === \"image\" ? request : null;\n } catch {\n return null;\n }\n}\n\nfunction selectorRotation(value: unknown) {\n const stringValue = String(value ?? 0);\n const angle = Number(stringValue.replace(/^!/, \"\"));\n return { angle: Number.isFinite(angle) ? angle : 0, ...(stringValue.startsWith(\"!\") ? { mirror: true } : {}) };\n}\n\nexport function normaliseImageRotation(rotation: unknown) {\n const angle = Number(String(rotation ?? 0).replace(/^!/, \"\"));\n const normalised = Number.isFinite(angle) ? ((angle % 360) + 360) % 360 : 0;\n return [0, 90, 180, 270].includes(normalised) ? normalised : 0;\n}\n\nfunction normaliseService(service: any) {\n return {\n ...service,\n id: service.id || service[\"@id\"],\n type: service.type || service[\"@type\"],\n };\n}\n\nfunction countPaintingAnnotations(vault: any, canvas: any) {\n let count = 0;\n for (const pageRef of canvas?.items || []) {\n const page = vault.get(pageRef, { skipSelfReturn: false }) || pageRef;\n for (const annotationRef of page?.items || []) {\n const annotation = vault.get(annotationRef, { skipSelfReturn: false }) || annotationRef;\n const motivations = Array.isArray(annotation?.motivation) ? annotation.motivation : [annotation?.motivation];\n if (motivations.includes(\"painting\")) count++;\n }\n }\n return count;\n}\n","import { ActionButton, Modal } from \"@manifest-editor/components\";\nimport { MediaEditor } from \"@manifest-editor/editors\";\nimport { type EditorDefinition, useEditor } from \"@manifest-editor/shell\";\nimport { HTMLPortal } from \"@atlas-viewer/atlas\";\nimport { Vault } from \"@iiif/helpers\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n AtlasStoreReactContext,\n CanvasPanel,\n useCanvas,\n useCurrentAnnotationActions,\n useRequestAnnotation,\n useVault,\n VaultProvider,\n} from \"react-iiif-vault\";\nimport {\n applyImageRotation,\n applyImageCropResponse,\n displayRegionToImage,\n type CropRegion,\n type EditableImageCrop,\n fullImageRequest,\n getImageCropContext,\n getServiceDimensions,\n imageRegionToDisplay,\n normaliseImageRotation,\n parseCropRegion,\n resolveImageService,\n rotatedImageDimensions,\n} from \"../image-crop\";\n\nexport const exhibitionImageCropEditor: EditorDefinition = {\n id: \"@exhibition/image-crop-editor\",\n label: \"Media\",\n supports: {\n edit: true,\n sortKey: \"annotation-target\",\n properties: [\"body\"],\n resourceTypes: [\"Annotation\"],\n custom: ({ resource }, vault) => {\n const annotation = vault.get(resource, { skipSelfReturn: false } as any);\n return Boolean(\n annotation &&\n getImageCropContext(annotation, (item) =>\n resolveFromVault(vault, item),\n ),\n );\n },\n },\n component: () => <ExhibitionImageCropPanel />,\n};\n\nfunction ExhibitionImageCropPanel() {\n const vault = useVault();\n const editor = useEditor();\n const canvas = useCanvas({ id: editor.annotation.target.getSourceId() });\n const annotation = vault.get(editor.ref(), { skipSelfReturn: false } as any);\n const crop = annotation\n ? getImageCropContext(annotation, (item) => resolveFromVault(vault, item))\n : null;\n const region = parseCropRegion(crop?.selector.region);\n const triggerRef = useRef<HTMLSpanElement>(null);\n const [open, setOpen] = useState(false);\n const [rotating, setRotating] = useState(false);\n const [rotationError, setRotationError] = useState<string | null>(null);\n const currentRotation = normaliseImageRotation(crop?.selector.rotation);\n\n const rotate = async (rotation: number) => {\n if (!crop || !canvas || rotation === currentRotation) return;\n setRotating(true);\n setRotationError(null);\n try {\n const service = await resolveImageService(crop.service);\n applyImageRotation(vault, { ...crop, service }, canvas, rotation);\n } catch (reason) {\n setRotationError(\n reason instanceof Error\n ? reason.message\n : \"The rotation could not be saved\",\n );\n } finally {\n setRotating(false);\n }\n };\n\n const close = () => {\n setOpen(false);\n requestAnimationFrame(() =>\n triggerRef.current?.querySelector(\"button\")?.focus(),\n );\n };\n\n if (!crop || !canvas) return null;\n\n const cropSection = (\n <div className=\"flex flex-col gap-3\">\n {region ? (\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 rounded border border-gray-200 bg-gray-50 p-3 text-sm\">\n <dt className=\"font-semibold text-gray-700\">Position</dt>\n <dd className=\"text-gray-600\">\n {region.x}, {region.y}\n </dd>\n <dt className=\"font-semibold text-gray-700\">Size</dt>\n <dd className=\"text-gray-600\">\n {region.width} × {region.height}\n </dd>\n </dl>\n ) : (\n <p className=\"rounded border border-gray-200 bg-gray-50 p-3 text-sm text-gray-600\">\n This image currently uses the full image. Create a crop to select a\n smaller visible region.\n </p>\n )}\n <span ref={triggerRef}>\n <ActionButton onPress={() => setOpen(true)}>\n {region ? \"Edit crop\" : \"Create crop\"}\n </ActionButton>\n </span>\n </div>\n );\n\n const rotationSection = (\n <div className=\"flex flex-col gap-3\">\n <div className=\"grid grid-cols-4 gap-2\" aria-label=\"Image rotation\">\n {[0, 90, 180, 270].map((rotation) => (\n <ActionButton\n key={rotation}\n aria-pressed={rotation === currentRotation}\n primary={rotation === currentRotation}\n isDisabled={rotating}\n onPress={() => rotate(rotation)}\n >\n {rotation}°\n </ActionButton>\n ))}\n </div>\n {rotationError ? (\n <p className=\"text-sm text-red-700\">{rotationError}</p>\n ) : null}\n </div>\n );\n\n return (\n <>\n <MediaEditor\n additionalSections={[\n {\n label: \"Image crop\",\n initialOpen: Boolean(region),\n children: cropSection,\n },\n {\n label: \"Image rotation\",\n initialOpen: currentRotation !== 0,\n children: rotationSection,\n },\n ]}\n />\n {open ? (\n <ImageCropModal\n crop={crop}\n canvas={canvas}\n onClose={close}\n vault={vault}\n />\n ) : null}\n </>\n );\n}\n\nfunction ImageCropModal({\n crop,\n canvas,\n vault,\n onClose,\n}: {\n crop: EditableImageCrop;\n canvas: any;\n vault: any;\n onClose: () => void;\n}) {\n const [service, setService] = useState<any>(() =>\n getServiceDimensions(crop.service) ? crop.service : null,\n );\n const [error, setError] = useState<string | null>(null);\n const [editing, setEditing] = useState(false);\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n let active = true;\n resolveImageService(crop.service)\n .then((resolved) => {\n if (active) setService(resolved);\n })\n .catch((reason) => {\n if (active)\n setError(\n reason instanceof Error\n ? reason.message\n : \"Unable to load the image service\",\n );\n });\n return () => {\n active = false;\n };\n }, [crop.service]);\n\n const dimensions = getServiceDimensions(service);\n const sourceRegion =\n parseCropRegion(crop.selector.region) ||\n (dimensions\n ? { x: 0, y: 0, width: dimensions.width, height: dimensions.height }\n : null);\n const displayDimensions = dimensions\n ? rotatedImageDimensions(\n dimensions.width,\n dimensions.height,\n crop.selector.rotation,\n )\n : null;\n const initialRegion =\n dimensions && sourceRegion\n ? imageRegionToDisplay(\n sourceRegion,\n dimensions,\n crop.selector.rotation,\n )\n : null;\n const serviceId = service?.id || service?.[\"@id\"];\n\n const resolveRequest = useCallback(\n async (response: {\n cancelled?: boolean;\n boundingBox?: CropRegion | null;\n }) => {\n if (response.cancelled || !response.boundingBox || !dimensions)\n return setEditing(false);\n setSaving(true);\n setError(null);\n try {\n applyImageCropResponse(vault, { ...crop, service }, canvas, {\n ...response,\n boundingBox: displayRegionToImage(\n response.boundingBox,\n dimensions,\n crop.selector.rotation,\n ),\n });\n onClose();\n } catch (reason) {\n setError(\n reason instanceof Error\n ? reason.message\n : \"The crop could not be saved\",\n );\n setSaving(false);\n }\n },\n [canvas, crop, onClose, service, vault],\n );\n const showRequestError = useCallback(\n (message: string) => setError(message),\n [],\n );\n\n return (\n <Modal\n title={\n parseCropRegion(crop.selector.region)\n ? \"Edit image crop\"\n : \"Create image crop\"\n }\n onClose={onClose}\n className=\"max-w-5xl\"\n height=\"80vh\"\n disableAnimation\n >\n <div className=\"flex min-h-0 flex-1 flex-col p-4\">\n {error ? (\n <CropError message={error} />\n ) : dimensions && displayDimensions && initialRegion && serviceId ? (\n <div className=\"relative min-h-0 flex-1 overflow-hidden rounded border border-gray-200 bg-gray-950\">\n <VirtualCropCanvas\n crop={crop}\n service={service}\n dimensions={displayDimensions}\n initialRegion={initialRegion}\n editing={editing}\n onEditingChange={setEditing}\n onResolve={resolveRequest}\n onError={showRequestError}\n />\n {saving ? (\n <div className=\"absolute inset-0 z-20 grid place-items-center bg-black/40 text-sm font-semibold text-white\">\n Saving crop…\n </div>\n ) : null}\n </div>\n ) : (\n <div className=\"grid min-h-[20rem] flex-1 place-items-center text-sm text-gray-500\">\n Loading full image…\n </div>\n )}\n <div className=\"mt-3 flex justify-end\">\n <ActionButton onPress={onClose}>Cancel</ActionButton>\n </div>\n </div>\n </Modal>\n );\n}\n\nfunction VirtualCropCanvas({\n crop,\n service,\n dimensions,\n initialRegion,\n editing,\n onEditingChange,\n onResolve,\n onError,\n}: {\n crop: EditableImageCrop;\n service: any;\n dimensions: { width: number; height: number };\n initialRegion: CropRegion;\n editing: boolean;\n onEditingChange: (editing: boolean) => void;\n onResolve: (response: {\n cancelled?: boolean;\n boundingBox?: CropRegion | null;\n }) => Promise<void>;\n onError: (message: string) => void;\n}) {\n const changeCropRef = useRef<() => void>(() => undefined);\n const virtualManifest = useMemo(\n () =>\n createVirtualCropManifest(\n crop,\n service,\n dimensions,\n crop.selector.rotation,\n ),\n [\n crop.annotationRef.id,\n crop.selector.rotation,\n dimensions.height,\n dimensions.width,\n service,\n ],\n );\n const temporaryVault = useMemo(() => {\n const nextVault = new Vault();\n nextVault.loadManifestSync(virtualManifest.id, virtualManifest);\n return nextVault;\n }, [virtualManifest]);\n const viewerControls = useMemo(\n () =>\n function ViewerControls() {\n return (\n <CropViewerControls\n bounds={{\n x: 0,\n y: 0,\n width: dimensions.width,\n height: dimensions.height,\n }}\n initialRegion={initialRegion}\n changeCropRef={changeCropRef}\n onEditingChange={onEditingChange}\n onResolve={onResolve}\n onError={onError}\n />\n );\n },\n [\n dimensions.height,\n dimensions.width,\n initialRegion.height,\n initialRegion.width,\n initialRegion.x,\n initialRegion.y,\n onEditingChange,\n onError,\n onResolve,\n ],\n );\n\n return (\n <VaultProvider vault={temporaryVault}>\n <AtlasStoreReactContext.Provider value={null}>\n <CanvasPanel\n manifest={virtualManifest.id}\n startCanvas={virtualManifest.items[0]!.id}\n pagingEnabled={false}\n padding={0}\n components={{ ViewerControls: viewerControls }}\n annotations={\n editing ? null : (\n <CropRegionPreview\n region={initialRegion}\n onChange={() => changeCropRef.current()}\n />\n )\n }\n />\n </AtlasStoreReactContext.Provider>\n </VaultProvider>\n );\n}\n\nfunction createVirtualCropManifest(\n crop: EditableImageCrop,\n service: any,\n dimensions: { width: number; height: number },\n rotation: unknown,\n) {\n const manifestId = `${crop.annotationRef.id}/crop-editor/manifest`;\n const canvasId = `${manifestId}/canvas`;\n const pageId = `${canvasId}/painting-page`;\n\n return {\n \"@context\": \"http://iiif.io/api/presentation/3/context.json\",\n id: manifestId,\n type: \"Manifest\",\n label: { en: [\"Image crop editor\"] },\n items: [\n {\n id: canvasId,\n type: \"Canvas\",\n width: dimensions.width,\n height: dimensions.height,\n items: [\n {\n id: pageId,\n type: \"AnnotationPage\",\n items: [\n {\n id: `${pageId}/painting`,\n type: \"Annotation\",\n motivation: \"painting\",\n target: canvasId,\n body: {\n id: fullImageRequest(service, rotation),\n type: \"Image\",\n format: \"image/jpeg\",\n width: dimensions.width,\n height: dimensions.height,\n },\n },\n ],\n },\n ],\n },\n ],\n };\n}\n\nfunction CropViewerControls({\n bounds,\n initialRegion,\n changeCropRef,\n onEditingChange,\n onResolve,\n onError,\n}: {\n bounds: CropRegion;\n initialRegion: CropRegion;\n changeCropRef: React.MutableRefObject<() => void>;\n onEditingChange: (editing: boolean) => void;\n onResolve: (response: {\n cancelled?: boolean;\n boundingBox?: CropRegion | null;\n }) => Promise<void>;\n onError: (message: string) => void;\n}) {\n const popup = useMemo(() => <CropRequestActions />, []);\n const { requestAnnotation, cancelRequest, requestId, isActive, busy } =\n useRequestAnnotation();\n const cancelRef = useRef(cancelRequest);\n cancelRef.current = cancelRequest;\n\n useEffect(() => () => cancelRef.current(), []);\n\n const changeCrop = () => {\n onEditingChange(true);\n requestAnnotation({\n type: \"box\",\n bounds,\n selector: initialRegion,\n annotationPopup: popup,\n })\n .then((response) => {\n if (response) return onResolve(response);\n onEditingChange(false);\n })\n .catch((reason) => {\n onEditingChange(false);\n onError(\n reason instanceof Error\n ? reason.message\n : \"The crop editor could not be opened\",\n );\n });\n };\n changeCropRef.current = changeCrop;\n\n return isActive ? null : (\n <div className=\"absolute bottom-3 right-3 z-20 rounded bg-white p-2 shadow-lg\">\n <ActionButton\n primary\n isDisabled={!requestId || busy}\n onPress={changeCrop}\n >\n Change crop\n </ActionButton>\n </div>\n );\n}\n\nfunction CropRegionPreview({\n region,\n onChange,\n}: {\n region: CropRegion;\n onChange: () => void;\n}) {\n const Box = \"box\" as any;\n return (\n <>\n <Box\n html\n relativeStyle\n interactive={false}\n target={region}\n style={{\n backgroundColor: \"rgba(250, 204, 21, 0.18)\",\n border: \"6px solid #facc15\",\n boxShadow:\n \"inset 0 0 0 2px #111827, inset 0 0 20px rgba(250, 204, 21, 0.65)\",\n boxSizing: \"border-box\",\n }}\n />\n <HTMLPortal target={region} relative interactive>\n <button\n type=\"button\"\n aria-label=\"Change crop\"\n title=\"Change crop\"\n onClick={onChange}\n className=\"absolute inset-0 cursor-pointer bg-transparent text-left\"\n style={{ border: 0, padding: 0 }}\n >\n <span\n className=\"absolute left-2 top-2 rounded px-3 py-1.5 text-sm font-semibold shadow-lg\"\n style={{\n background: \"rgba(17, 24, 39, 0.94)\",\n border: \"2px solid #fde047\",\n color: \"#fde047\",\n }}\n >\n Change crop\n </span>\n </button>\n </HTMLPortal>\n </>\n );\n}\n\nfunction CropRequestActions() {\n const { saveAnnotation, cancelRequest } = useCurrentAnnotationActions();\n return (\n <div className=\"flex gap-2 rounded bg-white p-2 shadow-lg\">\n <ActionButton onPress={() => cancelRequest()}>Discard</ActionButton>\n <ActionButton primary onPress={saveAnnotation}>\n Confirm\n </ActionButton>\n </div>\n );\n}\n\nfunction CropError({ message }: { message: string }) {\n return (\n <div\n role=\"alert\"\n className=\"grid min-h-[20rem] place-items-center rounded border border-red-200 bg-red-50 p-6 text-center text-sm text-red-800\"\n >\n <div>\n <div className=\"font-semibold\">The full image could not be loaded</div>\n <div className=\"mt-1\">{message}</div>\n </div>\n </div>\n );\n}\n\nfunction resolveFromVault(vault: any, resource: any) {\n if (!resource?.id) return resource;\n return (\n vault.get(resource, {\n preserveSpecificResources: true,\n skipSelfReturn: false,\n } as any) || resource\n );\n}\n","export function CheckIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n {/* Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE */}\n <path fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19L21 7l-1.41-1.41z\" />\n </svg>\n );\n}\n","import { HTMLEditor } from \"@manifest-editor/components\";\nimport { useRef, useState } from \"react\";\nimport { sanitizeSummaryHtml } from \"../right-panels/summary-html\";\nimport { joinTourStepHtml, splitTourStepHtml } from \"./tour-step-html\";\n\nexport function TourStepHtmlForm({\n value,\n onChange,\n}: {\n value: string;\n onChange: (value: string) => void;\n}) {\n const [initial] = useState(() => splitTourStepHtml(value));\n const valueRef = useRef(value);\n\n return (\n <TourStepLabelSummaryForm\n label={initial.label ?? \"\"}\n summary={initial.summary}\n onChange={({ label, summary }) => {\n valueRef.current = joinTourStepHtml(label, summary);\n onChange(valueRef.current);\n }}\n />\n );\n}\n\nexport function TourStepLabelSummaryForm({\n label: initialLabel,\n summary: initialSummary,\n onChange,\n}: {\n label: string;\n summary: string;\n onChange: (value: { label: string; summary: string }) => void;\n}) {\n const [label, setLabel] = useState(initialLabel);\n const labelRef = useRef(initialLabel);\n const summaryRef = useRef(initialSummary);\n\n const update = (nextLabel: string, nextSummary: string) => {\n onChange({ label: nextLabel, summary: nextSummary });\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <label className=\"block text-sm font-medium text-slate-700\">\n Label\n <input\n className=\"mt-1 w-full rounded border border-slate-200 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-me-primary-400 focus:ring-1 focus:ring-me-primary-100\"\n value={label}\n onChange={(event) => {\n const nextLabel = event.currentTarget.value;\n labelRef.current = nextLabel;\n setLabel(nextLabel);\n update(nextLabel, summaryRef.current);\n }}\n />\n </label>\n <div className=\"block text-sm font-medium text-slate-700\">\n Summary\n <div className=\"mt-1\">\n <HTMLEditor\n value={summaryRef.current}\n onChange={(nextSummary) => {\n summaryRef.current = nextSummary;\n update(labelRef.current, nextSummary);\n }}\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport function TourStepHtmlPreview({ value }: { value: string }) {\n const { label, summary } = splitTourStepHtml(value);\n\n return <TourStepLabelSummaryPreview label={label ?? \"\"} summary={summary} />;\n}\n\nexport function TourStepLabelSummaryPreview({\n label,\n summary,\n}: {\n label: string;\n summary: string;\n}) {\n return (\n <>\n <div className=\"whitespace-nowrap overflow-ellipsis w-full overflow-x-hidden\">\n {label || <span className=\"opacity-50\">Untitled</span>}\n </div>\n <div\n className=\"exhibition-tour-step-body text-gray-500 text-sm bg-white line-clamp-2 prose-headings:mt-1 prose-headings:mb-1 prose-sm\"\n dangerouslySetInnerHTML={{ __html: sanitizeSummaryHtml(summary) }}\n />\n </>\n );\n}\n","import {\n ActionButton,\n DeleteIcon,\n TargetIcon,\n} from \"@manifest-editor/components\";\nimport { useAtlasStore } from \"@manifest-editor/shell\";\nimport {\n useCurrentAnnotationActions,\n useCurrentAnnotationMetadata,\n} from \"react-iiif-vault\";\nimport { useStore } from \"zustand\";\nimport { CheckIcon } from \"../icons/CheckIcon\";\nimport { TourStepHtmlForm } from \"./TourStepHtmlForm\";\nimport { DEFAULT_TOUR_STEP_HTML } from \"./tour-step-html\";\n\nexport function PendingTourStepAnnotation() {\n const store = useAtlasStore();\n const polygon = useStore(store, (s) => s.polygon);\n const [metadata, setMetadata] = useCurrentAnnotationMetadata();\n const { cancelRequest, saveAnnotation } = useCurrentAnnotationActions();\n\n return (\n <div className=\"border border-gray-300 hover:border-me-500 shadow-sm rounded bg-white relative\">\n <div className=\"bg-me-primary-500 text-white p-2 m-1 rounded flex gap-2\">\n <TargetIcon />\n Draw a box on the canvas\n </div>\n <div className=\"p-3\">\n <TourStepHtmlForm\n value={metadata.bodyValue ?? DEFAULT_TOUR_STEP_HTML}\n onChange={(bodyValue) => setMetadata({ bodyValue })}\n />\n </div>\n <div className=\"flex gap-2 p-3\">\n <ActionButton\n isDisabled={polygon?.points.length === 0}\n onPress={() => saveAnnotation()}\n >\n <CheckIcon /> Finish editing\n </ActionButton>\n\n <ActionButton className=\"gap-2 flex\" onPress={() => cancelRequest()}>\n <DeleteIcon /> Delete\n </ActionButton>\n </div>\n </div>\n );\n}\n","import { useGenericEditor } from \"@manifest-editor/shell\";\nimport { Button, Dialog, DialogTrigger, Popover } from \"react-aria-components\";\nimport { useAnnotation } from \"react-iiif-vault\";\n\n/**\n * A compact border-colour picker for tour step annotations. It shows a small\n * circle with the currently selected colour and, when clicked, reveals a\n * context menu of 10 fixed colours (in two rows) plus a \"None\" option.\n *\n * Selecting a colour updates both the annotation `stylesheet` and the target\n * `styleClass` via the editor abstraction (`target.setBorder(...)`).\n */\n\nconst BORDER_WIDTH = \"3px\";\n\n// 10 fixed colours, laid out in two rows of five.\nconst BORDER_COLORS: Array<{ name: string; value: string }> = [\n { name: \"Black\", value: \"#121212\" },\n { name: \"Red\", value: \"#E5484D\" },\n { name: \"Orange\", value: \"#F76B15\" },\n { name: \"Amber\", value: \"#FFB224\" },\n { name: \"Green\", value: \"#46A758\" },\n { name: \"Teal\", value: \"#12A594\" },\n { name: \"Blue\", value: \"#0091FF\" },\n { name: \"Indigo\", value: \"#3E63DD\" },\n { name: \"Purple\", value: \"#8E4EC6\" },\n { name: \"Pink\", value: \"#E93D82\" },\n];\n\nfunction extractColor(border?: string): string | undefined {\n if (!border) return undefined;\n const match = border.match(/#[0-9a-fA-F]{3,8}|rgba?\\([^)]*\\)|hsla?\\([^)]*\\)/);\n return match ? match[0] : undefined;\n}\n\nfunction sameColor(a?: string, b?: string): boolean {\n if (!a || !b) return false;\n return a.toLowerCase() === b.toLowerCase();\n}\n\nexport function TourStepBorderPicker() {\n const annotation = useAnnotation();\n const editor = useGenericEditor(annotation);\n const target = editor?.annotation?.target;\n\n if (!annotation || !target) {\n return null;\n }\n\n const boxStyle = target.getBoxStyle();\n const currentColor = extractColor(boxStyle.border) ?? boxStyle.borderColor;\n\n const selectColor = (color: string | null) => {\n if (!color) {\n target.setBorder(undefined);\n } else {\n target.setBorder(`${BORDER_WIDTH} solid ${color}`);\n }\n };\n\n return (\n // The wrapping span provides the hover help text (native tooltip) for the\n // control without bloating the form.\n <span title=\"Choose a border colour for this tour step's highlight\" className=\"inline-flex\">\n <DialogTrigger>\n <Button\n aria-label=\"Tour step border colour\"\n className=\"flex-none w-6 h-6 rounded-full border border-gray-300 shadow-sm cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-me-500\"\n style={\n currentColor\n ? { backgroundColor: currentColor }\n : {\n // Diagonal line to signify \"no colour\".\n backgroundImage: \"linear-gradient(45deg, transparent 45%, #d1d5db 45%, #d1d5db 55%, transparent 55%)\",\n }\n }\n />\n <Popover placement=\"bottom\" style={{ zIndex: 1000010 }}>\n {/*\n Tailwind utilities in this project are scoped to descendants of\n `.manifest-editor` (see `important: \".manifest-editor\"`). The popover\n is portalled to `document.body`, so we re-establish that scope here.\n */}\n <div className=\"manifest-editor\">\n <Dialog className=\"outline-none bg-white rounded-lg shadow-lg border border-gray-200 p-2\">\n {({ close }) => (\n <>\n <div className=\"text-[11px] font-semibold text-gray-500 px-1 pb-1.5\">Border colour</div>\n <div className=\"grid grid-cols-5 gap-1.5\">\n {BORDER_COLORS.map((color) => {\n const selected = sameColor(currentColor, color.value);\n return (\n <button\n key={color.value}\n type=\"button\"\n aria-label={color.name}\n title={color.name}\n onClick={() => {\n selectColor(color.value);\n close();\n }}\n className={`w-6 h-6 rounded-full border cursor-pointer outline-none transition-transform hover:scale-110 focus-visible:ring-2 focus-visible:ring-me-500 ${\n selected ? \"ring-2 ring-offset-1 ring-me-500 border-transparent\" : \"border-gray-300\"\n }`}\n style={{ backgroundColor: color.value }}\n />\n );\n })}\n </div>\n <button\n type=\"button\"\n title=\"Remove the border colour\"\n onClick={() => {\n selectColor(null);\n close();\n }}\n className=\"mt-2 w-full text-[11px] text-gray-500 hover:text-me-500 rounded px-1 py-1 cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-me-500\"\n >\n None\n </button>\n </>\n )}\n </Dialog>\n </div>\n </Popover>\n </DialogTrigger>\n </span>\n );\n}\n","import { Button, Dialog, DialogTrigger, Popover } from \"react-aria-components\";\nimport { useCanvas, useVault } from \"react-iiif-vault\";\nimport {\n type FloatingBehavior,\n FloatingPositionIcon,\n floatingBehaviorOptions,\n floatingGridWithCenter,\n getFloatingBehavior,\n hasFloatingBehavior,\n} from \"../right-panels/SlideBehaviours\";\nimport { useSlideshowContentPositioning } from \"../slideshow-content-positioning\";\n\nexport type TourStepSide = \"\" | \"left\" | \"right\";\n\nexport function getTourStepSide(behavior: unknown): TourStepSide {\n const items = Array.isArray(behavior) ? behavior : [];\n if (items.includes(\"left\")) return \"left\";\n if (items.includes(\"right\")) return \"right\";\n return \"\";\n}\n\nexport function withTourStepSideBehavior(behavior: unknown, side: TourStepSide) {\n const next = (Array.isArray(behavior) ? behavior : []).filter((item) => item !== \"left\" && item !== \"right\");\n if (side) next.push(side);\n return next;\n}\n\nexport function withTourStepFloatingBehavior(behavior: unknown, floating: \"\" | FloatingBehavior) {\n const values = new Set(floatingBehaviorOptions.map((option) => option.value));\n const next = (Array.isArray(behavior) ? behavior : []).filter((item) => !values.has(item as FloatingBehavior));\n if (floating) next.push(floating);\n return next;\n}\n\nexport function TourStepSideControl({ annotation }: { annotation: any }) {\n const vault = useVault();\n const canvas = useCanvas();\n const selectTourStep = useSlideshowContentPositioning((state) => state.selectTourStep);\n const side = getTourStepSide(annotation?.behavior);\n const showFloating = hasFloatingBehavior(Array.isArray(canvas?.behavior) ? canvas.behavior : []);\n const annotationBehavior = Array.isArray(annotation?.behavior) ? annotation.behavior : [];\n const hasFloatingOverride = annotationBehavior.some((item: string) => item.startsWith(\"float-\"));\n const floating = getFloatingBehavior(annotationBehavior);\n\n if (!annotation?.id) return null;\n\n const showInPreview = () => {\n selectTourStep(annotation.id);\n };\n\n const setSide = (nextSide: TourStepSide) => {\n vault.modifyEntityField(\n { id: annotation.id, type: \"Annotation\" },\n \"behavior\",\n withTourStepSideBehavior(annotation.behavior, nextSide),\n );\n showInPreview();\n };\n const setFloating = (nextFloating: \"\" | FloatingBehavior) => {\n vault.modifyEntityField(\n { id: annotation.id, type: \"Annotation\" },\n \"behavior\",\n withTourStepFloatingBehavior(annotation.behavior, nextFloating),\n );\n showInPreview();\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {!showFloating ? (\n <div className=\"grid grid-cols-3 overflow-hidden rounded border border-slate-200 text-xs font-semibold\">\n {[\n { value: \"\" as const, label: \"Default\" },\n { value: \"left\" as const, label: \"Left\" },\n { value: \"right\" as const, label: \"Right\" },\n ].map((option) => (\n <button\n key={option.label}\n type=\"button\"\n className={\n side === option.value ? \"bg-me-primary-500 px-2 py-1 text-white\" : \"bg-white px-2 py-1 text-slate-700\"\n }\n onClick={() => setSide(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n ) : null}\n {showFloating ? (\n <FloatingOverrideMenu value={hasFloatingOverride ? floating : \"\"} onChange={setFloating} />\n ) : null}\n </div>\n );\n}\n\nfunction FloatingOverrideMenu({\n value,\n onChange,\n}: {\n value: \"\" | FloatingBehavior;\n onChange: (value: \"\" | FloatingBehavior) => void;\n}) {\n const hasOverride = Boolean(value);\n\n return (\n <span title=\"Floating position override\" className=\"inline-flex\">\n <DialogTrigger>\n <Button\n aria-label=\"Floating position override\"\n className={`relative inline-grid h-8 w-8 place-items-center rounded-md border bg-white shadow-sm outline-none transition-colors hover:border-me-primary-400 focus-visible:ring-2 focus-visible:ring-me-500 ${\n hasOverride ? \"border-me-primary-500 text-me-primary-600\" : \"border-slate-200 text-slate-500\"\n }`}\n >\n <FloatingPositionIcon position={value} />\n {hasOverride ? (\n <span className=\"absolute -right-1 -top-1 h-2.5 w-2.5 rounded-full bg-me-primary-500 ring-2 ring-white\" />\n ) : null}\n </Button>\n <Popover placement=\"bottom\" style={{ zIndex: 1000010 }}>\n <div className=\"manifest-editor\">\n <Dialog className=\"rounded-lg border border-slate-200 bg-white p-2 shadow-lg outline-none\">\n {({ close }) => (\n <div className=\"grid grid-cols-3 gap-1\">\n {floatingGridWithCenter(\"No override\").map((option) => (\n <button\n key={option.value || \"none\"}\n type=\"button\"\n aria-label={option.label}\n title={option.label}\n onClick={() => {\n onChange(option.value);\n close();\n }}\n className={`grid h-8 w-8 place-items-center rounded-md border outline-none transition-colors hover:border-me-primary-400 hover:bg-me-primary-50 focus-visible:ring-2 focus-visible:ring-me-500 ${\n value === option.value\n ? \"border-me-primary-500 bg-me-primary-50 text-me-primary-600\"\n : \"border-slate-200 bg-white text-slate-500\"\n }`}\n >\n <FloatingPositionIcon position={option.value} />\n </button>\n ))}\n </div>\n )}\n </Dialog>\n </div>\n </Popover>\n </DialogTrigger>\n </span>\n );\n}\n","import {\n ActionButton,\n DeleteIcon,\n EditTextIcon,\n} from \"@manifest-editor/components\";\nimport { useAnnotationEditor } from \"@manifest-editor/editors\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useAnnotation, useVault } from \"react-iiif-vault\";\nimport { CheckIcon } from \"../icons/CheckIcon\";\nimport {\n useSlideshowContentPositioning,\n useSlideshowWorkbenchState,\n} from \"../slideshow-content-positioning\";\nimport { TourStepHtmlForm, TourStepHtmlPreview } from \"./TourStepHtmlForm\";\nimport { TourStepBorderPicker } from \"./TourStepBorderPicker\";\nimport { TourStepSideControl } from \"./TourStepSideControl\";\n\nexport function TourNormalAnnotationEditor({\n editAlignment = false,\n highlightProps,\n index = 0,\n tourStyle = \"linear\",\n useSlideshowWorkbench = false,\n}: {\n editAlignment?: boolean;\n highlightProps: any;\n index?: number;\n tourStyle?: \"linear\" | \"non-linear\";\n useSlideshowWorkbench?: boolean;\n}) {\n const annotation = useAnnotation();\n const vault = useVault();\n const body = getFirstTextualBody(annotation?.body || [], vault);\n const bodyValueRef = useRef(body?.resource?.value || \"\");\n const startTourStepRepositioning = useSlideshowContentPositioning(\n (state) => state.startTourStepRepositioning,\n );\n const selectTourStep = useSlideshowContentPositioning(\n (state) => state.selectTourStep,\n );\n const requestWorkbenchTab = useSlideshowWorkbenchState(\n (state) => state.requestTab,\n );\n const setShowTourSteps = useSlideshowWorkbenchState(\n (state) => state.setShowTourSteps,\n );\n\n const {\n target,\n isPending,\n cancelRequest,\n busy,\n requestAnnotationFromTarget,\n deleteAnnotation,\n } = useAnnotationEditor();\n const invalidRegion = !target;\n\n const [isOpen, setIsOpen] = useState(false);\n const showInSlideshowWorkbench = () => {\n if (annotation?.id) {\n selectTourStep(annotation.id);\n }\n\n if (!useSlideshowWorkbench || !annotation?.id) {\n return false;\n }\n\n setShowTourSteps(true);\n startTourStepRepositioning(annotation.id);\n requestWorkbenchTab(\"tour\");\n return true;\n };\n\n useEffect(() => {\n if (!isOpen) {\n bodyValueRef.current = body?.resource?.value || \"\";\n }\n }, [body?.resource?.value, isOpen]);\n\n useEffect(() => {\n if (isOpen && !isPending) {\n setIsOpen(true);\n }\n }, [isPending, isOpen]);\n\n // This is an annotation within a page.\n return (\n <div\n {...highlightProps}\n className={`exhibition-tour-step-card border shadow-sm rounded bg-white relative ${\n tourStyle === \"non-linear\"\n ? \"border-gray-900 hover:border-black\"\n : \"border-gray-300 hover:border-me-500\"\n }`}\n onClick={showInSlideshowWorkbench}\n >\n <div\n className=\"absolute right-3 top-3 z-10 rounded-full px-2 py-1 text-xs font-semibold\"\n style={{ backgroundColor: \"#f5f5f5\", color: \"#b84c74\" }}\n >\n {tourStyle === \"non-linear\"\n ? `Point ${index + 1}`\n : `Step ${index + 1}`}\n </div>\n <div className=\"relative\">\n {invalidRegion ? (\n <div className=\"mx-3 mt-3 rounded border border-amber-300 bg-amber-50 px-3 py-2 text-xs text-amber-900\">\n Invalid region. Select Edit to draw a new region.\n </div>\n ) : null}\n {isOpen ? (\n <div className=\"p-3\">\n <TourStepHtmlForm\n value={body?.resource?.value || \"\"}\n onChange={(nextValue) => (bodyValueRef.current = nextValue)}\n />\n </div>\n ) : (\n <div className=\"px-3 pt-3\">\n <TourStepHtmlPreview value={body?.resource?.value || \"\"} />\n </div>\n )}\n </div>\n <div className=\"flex gap-2 p-2\" onClick={(e) => e.stopPropagation()}>\n {isOpen && isPending ? (\n <>\n <ActionButton\n primary\n onPress={() => {\n saveTourStepBody(vault, annotation, body, bodyValueRef.current);\n setIsOpen(false);\n cancelRequest();\n }}\n >\n <CheckIcon /> Finish editing\n </ActionButton>\n </>\n ) : (\n <ActionButton\n isDisabled={busy}\n onPress={() => {\n if (useSlideshowWorkbench && annotation?.id) {\n setShowTourSteps(true);\n startTourStepRepositioning(annotation.id);\n requestWorkbenchTab(\"tour\");\n }\n\n setIsOpen(true);\n requestAnnotationFromTarget().then(() => {\n setIsOpen(false);\n });\n }}\n >\n <EditTextIcon /> Edit\n </ActionButton>\n )}\n <ActionButton className=\"gap-2 flex\" onPress={() => deleteAnnotation()}>\n <DeleteIcon /> Delete\n </ActionButton>\n <div className=\"ml-auto flex items-center gap-2\">\n {editAlignment ? (\n <TourStepSideControl annotation={annotation} />\n ) : null}\n <TourStepBorderPicker />\n </div>\n </div>\n {tourStyle === \"linear\" ? (\n <div className=\"absolute -bottom-5 left-5 h-5 border-l-2 border-gray-300 w-0\" />\n ) : null}\n </div>\n );\n}\n\nfunction getFirstTextualBody(\n bodies: any[],\n vault: any,\n): { ref: any; resource: any; bodyIndex: number } | null {\n for (let bodyIndex = 0; bodyIndex < bodies.length; bodyIndex++) {\n const body = bodies[bodyIndex];\n const resource = resolveBody(body, vault);\n if (\n resource?.type === \"TextualBody\" ||\n resource?.type === \"Text\" ||\n resource?.format === \"text/html\"\n ) {\n return {\n ref: body?.id ? { id: body.id, type: \"ContentResource\" } : null,\n resource,\n bodyIndex,\n };\n }\n }\n return null;\n}\n\nfunction resolveBody(body: any, vault: any) {\n if (!body?.id || body.value) return body;\n return vault.get(body as any, { skipSelfReturn: false } as any) || body;\n}\n\nfunction saveTourStepBody(\n vault: any,\n annotation: any,\n body: ReturnType<typeof getFirstTextualBody>,\n value: string,\n) {\n if (!annotation || !body) return;\n\n if (body.ref?.id) {\n vault.modifyEntityField(body.ref, \"value\", value);\n return;\n }\n\n const bodies = Array.isArray(annotation.body) ? annotation.body : [];\n vault.modifyEntityField({ id: annotation.id, type: \"Annotation\" }, \"body\", [\n ...bodies.slice(0, body.bodyIndex),\n { ...body.resource, value },\n ...bodies.slice(body.bodyIndex + 1),\n ]);\n}\n","import { ActionButton, DeleteIcon, EditTextIcon } from \"@manifest-editor/components\";\nimport { useGenericEditor, useLayoutActions } from \"@manifest-editor/shell\";\nimport { useRef, useState } from \"react\";\nimport { useAnnotation, useAnnotationPage, useCanvas, useVault } from \"react-iiif-vault\";\nimport { CheckIcon } from \"../icons/CheckIcon\";\nimport { normalizeSummaryForSave } from \"../right-panels/summary-html\";\nimport { useSlideshowContentPositioning, useSlideshowWorkbenchState } from \"../slideshow-content-positioning\";\nimport { TourStepLabelSummaryForm, TourStepLabelSummaryPreview } from \"./TourStepHtmlForm\";\nimport { TourStepSideControl } from \"./TourStepSideControl\";\n\nexport function TourPaintingAnnotationEditor({\n editAlignment = false,\n originalAnnotationId,\n highlightProps,\n index = 0,\n tourStyle = \"linear\",\n useSlideshowWorkbench = false,\n}: {\n editAlignment?: boolean;\n originalAnnotationId?: string;\n highlightProps: any;\n index?: number;\n tourStyle?: \"linear\" | \"non-linear\";\n useSlideshowWorkbench?: boolean;\n}) {\n const page = useAnnotationPage();\n const pageEditor = useGenericEditor(page);\n const annotation = useAnnotation();\n const canvas = useCanvas();\n const vault = useVault();\n const { edit } = useLayoutActions();\n const [isOpen, setIsOpen] = useState(false);\n const labelRef = useRef(getLanguageMapText(annotation?.label));\n const summaryRef = useRef(getLanguageMapText(annotation?.summary));\n const selectTourStep = useSlideshowContentPositioning((state) => state.selectTourStep);\n const startTourStepRepositioning = useSlideshowContentPositioning((state) => state.startTourStepRepositioning);\n const requestWorkbenchTab = useSlideshowWorkbenchState((state) => state.requestTab);\n const setShowTourSteps = useSlideshowWorkbenchState((state) => state.setShowTourSteps);\n const paintingPage = canvas?.items?.[0];\n const annotationIndex =\n paintingPage?.id && annotation?.id\n ? (vault.get(paintingPage as any)?.items || []).findIndex((item: any) => item.id === annotation.id)\n : -1;\n\n const deleteAnnotation = () => {\n if (originalAnnotationId && confirm(\"Are you sure you want to delete this annotation?\")) {\n // Delete the original annotation.\n const index = pageEditor.structural.items\n .getWithoutTracking()\n .findIndex((item) => item.id === originalAnnotationId);\n pageEditor.structural.items.deleteAtIndex(index);\n }\n };\n const showInSlideshowWorkbench = () => {\n if (originalAnnotationId) {\n selectTourStep(originalAnnotationId);\n }\n\n if (!useSlideshowWorkbench || !originalAnnotationId) {\n return false;\n }\n\n setShowTourSteps(true);\n startTourStepRepositioning(originalAnnotationId);\n requestWorkbenchTab(\"tour\");\n return true;\n };\n const saveStepText = () => {\n if (!annotation) return;\n vault.modifyEntityField({ id: annotation.id, type: \"Annotation\" }, \"label\", {\n en: [labelRef.current],\n });\n vault.modifyEntityField(\n { id: annotation.id, type: \"Annotation\" },\n \"summary\",\n normalizeSummaryForSave({ en: [summaryRef.current] }),\n );\n };\n\n return (\n <div\n {...highlightProps}\n className={`exhibition-tour-step-card border shadow-sm rounded bg-white relative ${\n tourStyle === \"non-linear\" ? \"border-gray-900 hover:border-black\" : \"border-gray-300 hover:border-me-500\"\n }`}\n onClick={showInSlideshowWorkbench}\n >\n <div\n className=\"absolute right-3 top-3 z-10 rounded-full px-2 py-1 text-xs font-semibold\"\n style={{ backgroundColor: \"#f5f5f5\", color: \"#b84c74\" }}\n >\n {tourStyle === \"non-linear\" ? `Point ${index + 1}` : `Step ${index + 1}`}\n </div>\n <div className=\"flex gap-2 mb-2 p-3\">\n <div className=\"flex-1 min-w-0\">\n {isOpen ? (\n <div className=\"flex flex-col gap-3\">\n <TourStepLabelSummaryForm\n label={labelRef.current}\n summary={summaryRef.current}\n onChange={({ label, summary }) => {\n labelRef.current = label;\n summaryRef.current = summary;\n }}\n />\n </div>\n ) : (\n <TourStepLabelSummaryPreview\n label={getLanguageMapText(annotation?.label)}\n summary={getLanguageMapText(annotation?.summary)}\n />\n )}\n </div>\n </div>\n\n <div className=\"flex gap-2 p-2\" onClick={(e) => e.stopPropagation()}>\n {isOpen ? (\n <ActionButton\n primary\n onPress={() => {\n saveStepText();\n setIsOpen(false);\n }}\n >\n <CheckIcon /> Finish editing\n </ActionButton>\n ) : (\n <ActionButton onPress={() => setIsOpen(true)}>\n <EditTextIcon /> Edit\n </ActionButton>\n )}\n\n <ActionButton className=\"gap-2 flex\" onPress={() => deleteAnnotation()}>\n <DeleteIcon /> Delete\n </ActionButton>\n\n <ActionButton\n onPress={() => {\n if (showInSlideshowWorkbench()) {\n return;\n }\n\n if (!annotation) {\n return;\n }\n\n edit(\n { id: annotation.id, type: \"Annotation\" },\n paintingPage\n ? {\n parent: paintingPage,\n property: \"items\",\n index: annotationIndex,\n }\n : undefined,\n { forceOpen: true },\n );\n }}\n >\n Edit annotation\n </ActionButton>\n\n {editAlignment ? (\n <div className=\"ml-auto flex items-center\">\n <TourStepSideControl annotation={annotation} />\n </div>\n ) : null}\n </div>\n {tourStyle === \"linear\" ? <div className=\"absolute -bottom-5 left-5 h-5 border-l-2 border-gray-300 w-0\" /> : null}\n </div>\n );\n}\n\nfunction getLanguageMapText(value: any) {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) return value.find((item) => typeof item === \"string\") || \"\";\n const values = value.en || Object.values(value)[0];\n return Array.isArray(values) ? values.find((item) => typeof item === \"string\") || \"\" : \"\";\n}\n","import { useAnnotationInfo } from \"@manifest-editor/editors\";\nimport { ResourceEditingProvider } from \"@manifest-editor/shell\";\nimport { useMemo } from \"react\";\nimport { AnnotationContext } from \"react-iiif-vault\";\nimport { TourNormalAnnotationEditor } from \"./TourNormalAnnotationEditor\";\nimport { TourPaintingAnnotationEditor } from \"./TourPaintingAnnotationEditor\";\n\nexport function TourAnnotationEditor({\n editAlignment = false,\n index = 0,\n tourStyle = \"linear\",\n useSlideshowWorkbench = false,\n}: {\n editAlignment?: boolean;\n index?: number;\n tourStyle?: \"linear\" | \"non-linear\";\n useSlideshowWorkbench?: boolean;\n}) {\n const [annotation, { annotationTarget, highlightProps }] = useAnnotationInfo();\n\n const resource = useMemo(() => {\n if (annotationTarget) {\n return { id: annotationTarget, type: \"Annotation\" };\n }\n return { id: annotation?.id as string, type: \"Annotation\" };\n }, [annotation?.id, annotationTarget]);\n\n if (annotationTarget) {\n return (\n <ResourceEditingProvider resource={resource}>\n <AnnotationContext annotation={annotationTarget}>\n <TourPaintingAnnotationEditor\n editAlignment={editAlignment}\n originalAnnotationId={annotation?.id}\n highlightProps={highlightProps}\n index={index}\n tourStyle={tourStyle}\n useSlideshowWorkbench={useSlideshowWorkbench}\n />\n </AnnotationContext>\n </ResourceEditingProvider>\n );\n }\n\n return (\n <ResourceEditingProvider resource={resource}>\n <TourNormalAnnotationEditor\n editAlignment={editAlignment}\n highlightProps={highlightProps}\n index={index}\n tourStyle={tourStyle}\n useSlideshowWorkbench={useSlideshowWorkbench}\n />\n </ResourceEditingProvider>\n );\n}\n","import { ReorderList } from \"@manifest-editor/editors\";\nimport { useGenericEditor } from \"@manifest-editor/shell\";\nimport { AnnotationContext, useAnnotationPage } from \"react-iiif-vault\";\nimport { TourAnnotationEditor } from \"./TourAnnotationEditor\";\n\nexport function TourAnnotationPageEditor({\n editAlignment = false,\n reorderable = false,\n tourStyle = \"linear\",\n useSlideshowWorkbench = false,\n}: {\n editAlignment?: boolean;\n reorderable?: boolean;\n tourStyle?: \"linear\" | \"non-linear\";\n useSlideshowWorkbench?: boolean;\n}) {\n const page = useAnnotationPage();\n const editor = useGenericEditor(page);\n\n if (!page) {\n return null;\n }\n\n if (!reorderable) {\n return (\n <>\n {page.items.map((annotation, index) => (\n <AnnotationContext annotation={annotation.id} key={annotation.id}>\n <TourAnnotationEditor\n index={index}\n tourStyle={tourStyle}\n editAlignment={editAlignment}\n useSlideshowWorkbench={useSlideshowWorkbench}\n />\n </AnnotationContext>\n ))}\n </>\n );\n }\n\n return (\n <>\n <ReorderList\n id={page.id}\n marginBottom=\"0.5em\"\n items={page.items || []}\n inlineHandle={false}\n reorder={({ startIndex, endIndex }) =>\n editor.structural.items.reorder(startIndex, endIndex)\n }\n renderItem={(ref, index) => (\n <AnnotationContext annotation={ref.id as string}>\n <TourAnnotationEditor\n index={index}\n tourStyle={tourStyle}\n editAlignment={editAlignment}\n useSlideshowWorkbench={useSlideshowWorkbench}\n />\n </AnnotationContext>\n )}\n />\n </>\n );\n}\n","import { constrainSlideContentBox } from \"./slideshow-content-positioning\";\n\nfunction isFiniteBox(box: any) {\n return (\n box &&\n [box.x, box.y, box.width, box.height].every(Number.isFinite) &&\n box.width > 0 &&\n box.height > 0\n );\n}\n\nfunction hasFinitePoints(polygon: any) {\n return (\n !polygon ||\n (Array.isArray(polygon.points) &&\n polygon.points.length &&\n polygon.points.every(\n (point: any) =>\n Array.isArray(point) &&\n Number.isFinite(point[0]) &&\n Number.isFinite(point[1]),\n ))\n );\n}\n\nfunction hasFiniteTarget(target: any) {\n if (target?.type === \"FragmentSelector\") {\n const values = target.value?.replace(/^xywh=/, \"\").split(\",\").map(Number);\n return (\n values?.length === 4 &&\n values.every(Number.isFinite) &&\n values[2] > 0 &&\n values[3] > 0\n );\n }\n\n return (\n target?.type === \"SvgSelector\" &&\n typeof target.value === \"string\" &&\n !/\\b(?:NaN|Infinity|undefined)\\b/.test(target.value)\n );\n}\n\nexport function normaliseTourStepAnnotationResponse(response: any, canvas: any) {\n const canvasWidth = Number(canvas?.width) || 1920;\n const canvasHeight = Number(canvas?.height) || 1080;\n const box = response?.boundingBox;\n if (\n hasFinitePoints(response?.polygon) &&\n isFiniteBox(box) &&\n box.x >= 0 &&\n box.y >= 0 &&\n box.x + box.width <= canvasWidth &&\n box.y + box.height <= canvasHeight &&\n hasFiniteTarget(response?.target)\n ) {\n return response;\n }\n\n const recoveredBox = constrainSlideContentBox(\n canvas,\n isFiniteBox(response?.boundingBox)\n ? response.boundingBox\n : { x: 0, y: 0, width: canvasWidth, height: canvasHeight },\n );\n\n return {\n ...response,\n polygon: null,\n boundingBox: recoveredBox,\n target: {\n type: \"FragmentSelector\",\n value: `xywh=${recoveredBox.x},${recoveredBox.y},${recoveredBox.width},${recoveredBox.height}`,\n },\n };\n}\n","import type { InternationalString } from \"@iiif/presentation-3\";\nimport { ActionButton, Sidebar, SidebarContent } from \"@manifest-editor/components\";\nimport { PromptToAddPaintingAnnotations } from \"@manifest-editor/editors\";\nimport {\n type EditorDefinition,\n ResourceEditingProvider,\n useApp,\n useEditor,\n useInlineCreator,\n} from \"@manifest-editor/shell\";\nimport { type ReactNode, useEffect, useState } from \"react\";\nimport { Button } from \"react-aria-components\";\nimport { AnnotationPageContext, useCanvas, useRequestAnnotation } from \"react-iiif-vault\";\nimport { PendingTourStepAnnotation } from \"../components/PendingTourStepAnnotation\";\nimport { TourAnnotationPageEditor } from \"../components/TourAnnotationPageEditor\";\nimport { DEFAULT_TOUR_STEP_HTML } from \"../components/tour-step-html\";\nimport { isEditableExhibitionCanvas, isInfoBoxCanvas, isVideoCanvas } from \"../helpers\";\nimport { useExhibitionTemplate } from \"../helpers/exhibition-template\";\nimport { useSlideshowContentPositioning, useSlideshowWorkbenchState } from \"../slideshow-content-positioning\";\nimport { nonLinearTourBehavior, tourMarkerPinBehavior } from \"../tour-behaviors\";\nimport { normaliseTourStepAnnotationResponse } from \"../tour-step-target\";\nimport { hasFloatingBehavior, resolveExhibitionTemplateType, SimpleCheckbox } from \"./SlideBehaviours\";\n\ntype EditingMode = \"simple\" | \"advanced\";\n\nexport const exhibitionTourSteps: EditorDefinition = {\n id: \"@exhibition/tour-steps\",\n supports: {\n edit: true,\n properties: [\"annotations\", \"behavior\"],\n resourceTypes: [\"Canvas\"],\n custom: ({ resource }, vault) => {\n if (!isEditableExhibitionCanvas(resource as any, vault)) return false;\n const canvas = vault.get(resource as any) as any;\n // Tour steps are supported for image canvases only.\n return (\n !canvas?.behavior?.includes(\"splash\") &&\n !isInfoBoxCanvas(resource as any, vault) &&\n !isVideoCanvas(resource as any, vault)\n );\n },\n },\n label: \"Tour steps\",\n component: () => <ExhibitionTourStepsPanel />,\n};\n\nexport function ExhibitionTourStepsPanel({ mode = \"advanced\" }: { mode?: EditingMode }) {\n const canvas = useCanvas();\n const firstAnnotationPage = canvas?.annotations[0];\n const itemsAnnotationPage = canvas?.items[0];\n\n // @todo create annotation page?\n if (!firstAnnotationPage || !canvas || !itemsAnnotationPage) {\n return <PromptCreationOfTourSteps />;\n }\n\n return (\n <Sidebar>\n <SidebarContent padding>\n <ExhibitionTourStepsContent mode={mode} />\n </SidebarContent>\n </Sidebar>\n );\n}\n\nfunction PromptCreationOfTourSteps() {\n const canvas = useCanvas();\n const creator = useInlineCreator();\n\n const createEmptyAnnotationPage = () => {\n if (!canvas) return;\n creator.create(\n \"@manifest-editor/empty-annotation-page\",\n {\n label: { en: [\"Tour steps\"] },\n },\n {\n target: {\n id: canvas.id,\n type: \"Canvas\",\n },\n targetType: \"AnnotationPage\",\n parent: {\n property: \"annotations\",\n resource: {\n id: canvas.id,\n type: \"Canvas\",\n },\n },\n },\n );\n };\n\n return (\n <div className=\"flex flex-col items-center justify-center p-4\">\n <div className=\"p-4 opacity-50 text-center\">This image does not yet have a tour.</div>\n\n <Button\n className=\"border w-full disabled:opacity-50 border-gray-300 hover:border-me-500 hover:bg-me-50 cursor-pointer shadow-sm rounded p-4 bg-white relative text-[#6a625c] hover:text-me-500\"\n onPress={() => createEmptyAnnotationPage()}\n >\n Create Tour\n </Button>\n </div>\n );\n}\n\nexport function ExhibitionTourStepsContent({\n mode,\n useSlideshowWorkbench = false,\n}: {\n mode: EditingMode;\n useSlideshowWorkbench?: boolean;\n}) {\n const canvas = useCanvas();\n const editor = useEditor();\n const firstAnnotationPage = canvas?.annotations?.[0];\n const itemsAnnotationPage = canvas?.items?.[0];\n const [reorderable, setReorderable] = useState(false);\n const [editAlignment, setEditAlignment] = useState(false);\n const app = useApp();\n const selectedTemplate = useExhibitionTemplate();\n const templateType = resolveExhibitionTemplateType(selectedTemplate?.type, app.metadata.id);\n const canUseNonLinearTour = templateType === \"slideshow\";\n const canvasBehavior = Array.isArray(canvas?.behavior) ? canvas.behavior : [];\n const canEditAlignment = templateType === \"scroll\" || hasFloatingBehavior(canvasBehavior);\n const setShowTourSteps = useSlideshowWorkbenchState((state) => state.setShowTourSteps);\n const setCenterPanelMode = useSlideshowWorkbenchState((state) => state.setCenterPanelMode);\n const stopContentRepositioning = useSlideshowContentPositioning((state) => state.stopRepositioning);\n const stopTextRepositioning = useSlideshowContentPositioning((state) => state.stopTextRepositioning);\n\n useEffect(() => {\n setShowTourSteps(true);\n setCenterPanelMode(\"edit\");\n stopContentRepositioning();\n stopTextRepositioning();\n }, [setCenterPanelMode, setShowTourSteps, stopContentRepositioning, stopTextRepositioning]);\n const { requestTourStep, isPending, busy } = useTourStepAnnotationRequest({\n onBeforeRequest: useSlideshowWorkbench\n ? () => {\n setShowTourSteps(true);\n setCenterPanelMode(\"edit\");\n stopContentRepositioning();\n stopTextRepositioning();\n }\n : undefined,\n });\n const toggleEditAlignment = () => {\n setEditAlignment((value) => {\n const nextValue = !value;\n setCenterPanelMode(nextValue ? \"preview\" : \"edit\");\n return nextValue;\n });\n };\n\n if (!canvas) return null;\n if (!firstAnnotationPage) {\n return <PromptCreationOfTourSteps />;\n }\n\n const showPaintingAnnotations = mode === \"advanced\" && Boolean(itemsAnnotationPage);\n const behavior = editor.technical.type === \"Canvas\" ? editor.technical.behavior.get() || [] : [];\n const nonLinear = canUseNonLinearTour && behavior.includes(nonLinearTourBehavior);\n const markerStyle = behavior.includes(tourMarkerPinBehavior) ? \"pin\" : \"circle\";\n const tourStyle = nonLinear ? \"non-linear\" : \"linear\";\n const setNonLinearTour = (nextNonLinear: boolean) => {\n if (editor.technical.type !== \"Canvas\") return;\n const next = behavior.filter((item) => item !== nonLinearTourBehavior);\n editor.technical.behavior.set(nextNonLinear ? [...next, nonLinearTourBehavior] : next);\n };\n const setMarkerStyle = (nextMarkerStyle: \"circle\" | \"pin\") => {\n if (editor.technical.type !== \"Canvas\") return;\n const next = behavior.filter((item) => item !== tourMarkerPinBehavior);\n editor.technical.behavior.set(nextMarkerStyle === \"pin\" ? [...next, tourMarkerPinBehavior] : next);\n };\n\n return (\n <>\n <div className=\"flex gap-4 border-b pt-4 pb-2 mb-2\">\n <h2 className=\"text-lg font-semibold flex-1\">Tour steps</h2>\n {mode === \"advanced\" && !nonLinear ? (\n <ActionButton onPress={() => setReorderable((r) => !r)}>{reorderable ? \"Done\" : \"Reorder\"}</ActionButton>\n ) : null}\n {mode === \"advanced\" && canEditAlignment ? (\n <ActionButton onPress={toggleEditAlignment}>{editAlignment ? \"Done\" : \"Edit alignment\"}</ActionButton>\n ) : null}\n </div>\n\n {canUseNonLinearTour ? (\n <div className=\"mb-4 rounded border border-gray-200 bg-white p-3\">\n <div className=\"mb-2 text-sm font-semibold text-gray-700\">Tour style</div>\n <SimpleCheckbox checked={nonLinear} label=\"Let visitors choose map points\" onChange={setNonLinearTour} />\n <p className=\"mt-2 text-xs leading-relaxed text-gray-500\">\n Shows all tour steps as markers that visitors can open in any order.\n </p>\n {nonLinear ? (\n <div className=\"mt-4 space-y-3 border-t border-gray-100 pt-3\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-sm font-semibold text-gray-700\">Marker</div>\n <div\n role=\"group\"\n aria-label=\"Tour marker style\"\n className=\"inline-flex rounded-md border border-gray-200 bg-gray-50 p-0.5\"\n >\n <MarkerStyleButton selected={markerStyle === \"circle\"} onPress={() => setMarkerStyle(\"circle\")}>\n Circle\n </MarkerStyleButton>\n <MarkerStyleButton selected={markerStyle === \"pin\"} onPress={() => setMarkerStyle(\"pin\")}>\n Pin\n </MarkerStyleButton>\n </div>\n </div>\n <p className=\"text-xs leading-relaxed text-gray-500\">\n Marker colour follows the exhibition theme annotation text colour.\n </p>\n </div>\n ) : null}\n </div>\n ) : null}\n\n <ResourceEditingProvider resource={canvas}>\n <AnnotationPageContext annotationPage={firstAnnotationPage.id}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"text-sm font-semibold text-gray-700\">{nonLinear ? \"Map points\" : \"Linear step list\"}</div>\n <TourAnnotationPageEditor\n reorderable={mode === \"advanced\" && !nonLinear ? reorderable : false}\n tourStyle={tourStyle}\n editAlignment={canEditAlignment && editAlignment}\n useSlideshowWorkbench={useSlideshowWorkbench}\n />\n\n {!busy ? (\n isPending ? (\n <PendingTourStepAnnotation />\n ) : (\n <Button\n onPress={requestTourStep}\n className=\"border disabled:opacity-50 border-gray-300 hover:border-me-500 hover:bg-me-50 cursor-pointer shadow-sm rounded p-4 bg-white relative text-[#6a625c] hover:text-me-500\"\n >\n {nonLinear ? \"+ Add map point\" : \"+ Add new step\"}\n </Button>\n )\n ) : null}\n </div>\n {showPaintingAnnotations && itemsAnnotationPage ? (\n <>\n <PromptToAddPaintingAnnotations\n title={<h3 className=\"text-md border-b pt-4 pb-2 mb-2\">Available tour steps from images</h3>}\n painting={itemsAnnotationPage}\n page={firstAnnotationPage}\n canvasId={canvas.id}\n />\n </>\n ) : null}\n </AnnotationPageContext>\n </ResourceEditingProvider>\n </>\n );\n}\n\nfunction MarkerStyleButton({\n children,\n selected,\n onPress,\n}: {\n children: ReactNode;\n selected: boolean;\n onPress: () => void;\n}) {\n return (\n <Button\n aria-pressed={selected}\n className={`rounded px-2.5 py-1 text-xs font-semibold transition-colors ${\n selected ? \"bg-white text-me-primary-600 shadow-sm\" : \"text-gray-500 hover:text-gray-800\"\n }`}\n onPress={onPress}\n >\n {children}\n </Button>\n );\n}\n\nexport function useTourStepAnnotationRequest({ onBeforeRequest }: { onBeforeRequest?: () => void } = {}) {\n const canvas = useCanvas();\n const firstAnnotationPage = canvas?.annotations?.[0];\n const creator = useInlineCreator();\n const { requestAnnotation, isPending, busy } = useRequestAnnotation({\n onSuccess: (resp) => {\n const bodyValue = resp.metadata.bodyValue ?? DEFAULT_TOUR_STEP_HTML;\n\n if (!resp.cancelled && resp.target && canvas && firstAnnotationPage) {\n const selector = normaliseTourStepAnnotationResponse(resp, canvas);\n creator.create(\n \"@manifest-editor/html-annotation\",\n {\n label: { en: [\"Tour step\"] },\n body: {\n en: [bodyValue],\n },\n motivation: \"tagging\",\n } as {\n label?: InternationalString;\n body: InternationalString;\n motivation?: string;\n height?: number;\n width?: number;\n },\n {\n target: {\n id: canvas.id,\n type: \"Canvas\",\n },\n targetType: \"Annotation\",\n parent: {\n property: \"items\",\n resource: {\n id: firstAnnotationPage.id,\n type: \"AnnotationPage\",\n },\n },\n initialData: {\n selector,\n },\n },\n );\n }\n },\n });\n\n const requestTourStep = () => {\n onBeforeRequest?.();\n requestAnnotation({\n type: \"box\",\n });\n };\n\n return {\n requestTourStep,\n isPending,\n busy,\n canRequestTourStep: Boolean(canvas && firstAnnotationPage),\n };\n}\n","import { Input, InputContainer, InputLabel } from \"@manifest-editor/editors\";\nimport { useEditor } from \"@manifest-editor/shell\";\nimport { useExhibitionTemplate } from \"../helpers/exhibition-template\";\n\nexport function SlideshowDurationField() {\n const selectedTemplate = useExhibitionTemplate();\n const editor = useEditor();\n const duration = editor.technical.duration;\n\n if (selectedTemplate?.type !== \"slideshow\" || editor.technical.type !== \"Canvas\") {\n return null;\n }\n\n return (\n <InputContainer $wide id={duration.containerId()}>\n <InputLabel htmlFor={duration.focusId()}>Slide duration</InputLabel>\n <Input\n id={duration.focusId()}\n min={0}\n type=\"number\"\n value={duration.get() || 0}\n onChange={(event) => {\n const value = event.currentTarget.valueAsNumber;\n if (Number.isFinite(value)) duration.set(value);\n }}\n />\n </InputContainer>\n );\n}\n","import { Sidebar, SidebarContent } from \"@manifest-editor/components\";\nimport {\n BehaviorEditor,\n DimensionsTriplet,\n InputContainer,\n LanguageMapEditor,\n} from \"@manifest-editor/editors\";\nimport {\n type EditorDefinition,\n ResourceEditingProvider,\n useEditor,\n useLocalStorage,\n} from \"@manifest-editor/shell\";\nimport { useCanvas, useManifest, useVault } from \"react-iiif-vault\";\nimport { isEditableExhibitionCanvas, isInfoBoxCanvas } from \"../helpers\";\nimport { ExhibitionHtmlSummaryEditor } from \"./ExhibitionSummaryEditor\";\nimport {\n computeFitWidth,\n type DisplayWidth,\n EditSize,\n getBehaviorWidth,\n SimpleAdvancedToggle,\n SimpleField,\n SimpleFieldLabel,\n SimpleOptionButton,\n simpleLayoutColours,\n textualWidthOptions,\n useExhibitionTemplateControls,\n} from \"./SlideBehaviours\";\nimport { SlideshowDurationField } from \"./SlideshowDurationField\";\n\ntype EditingMode = \"simple\" | \"advanced\";\n\nconst storageKey = \"exhibition-info-box-mode\";\n\nexport const infoBoxWorkbenchEditor: EditorDefinition = {\n id: \"@exhibition/info-box-editor\",\n supports: {\n edit: true,\n properties: [\"label\", \"behavior\"],\n resourceTypes: [\"Canvas\"],\n custom: ({ resource }, vault) => {\n if (!isEditableExhibitionCanvas(resource as any, vault)) return false;\n return isInfoBoxCanvas(resource as any, vault);\n },\n },\n label: \"Text box\",\n component: () => <InfoBoxPanel />,\n};\n\nexport function InfoBoxPanel() {\n const [mode, setMode] = useLocalStorage<EditingMode>(storageKey, \"simple\");\n const canvas = useCanvas();\n const vault = useVault();\n const manifest = useManifest();\n const editor = useEditor();\n const controls = useExhibitionTemplateControls();\n\n if (!canvas || editor.technical.type !== \"Canvas\") return null;\n\n const behavior = editor.technical.behavior.get() || [];\n const currentWidth = (getBehaviorWidth(behavior) as DisplayWidth) || 12;\n\n const setWidth = (w: DisplayWidth) => {\n const next = behavior.filter(\n (b) => !b.startsWith(\"w-\") && !b.startsWith(\"h-\"),\n );\n const existingH = behavior.find((b) => b.startsWith(\"h-\"));\n next.push(`w-${w}`);\n if (!existingH) next.push(\"h-4\");\n editor.technical.behavior.set(next);\n };\n\n const fitSuggestion =\n controls.showGridSizing && manifest?.items && canvas\n ? computeFitWidth(\n canvas.id,\n manifest.items as Array<{ id: string }>,\n vault,\n )\n : null;\n\n return (\n <Sidebar>\n <SidebarContent className=\"bg-white px-6 pt-5 pb-20\">\n <div className=\"flex justify-center\">\n <SimpleAdvancedToggle value={mode} onChange={setMode} />\n </div>\n\n <div className=\"mt-8 flex flex-col gap-7\">\n <SlideshowDurationField />\n\n {/* Text content */}\n <ResourceEditingProvider resource={canvas}>\n {mode === \"simple\" ? (\n <SimpleField>\n <SimpleFieldLabel>Title</SimpleFieldLabel>\n <div className=\"mt-2\">\n <LanguageMapEditor\n dispatchType=\"label\"\n disableMultiline\n disallowHTML\n />\n </div>\n </SimpleField>\n ) : (\n <SimpleField>\n <SimpleFieldLabel>Label &amp; summary</SimpleFieldLabel>\n <div className=\"mt-2 flex flex-col gap-3\">\n <LanguageMapEditor\n dispatchType=\"label\"\n disableMultiline\n disallowHTML\n />\n <ExhibitionHtmlSummaryEditor resource={canvas} />\n </div>\n </SimpleField>\n )}\n </ResourceEditingProvider>\n\n {/* Width */}\n {mode === \"simple\" && controls.showGridSizing ? (\n <>\n <SimpleField>\n <SimpleFieldLabel>Width</SimpleFieldLabel>\n <div className=\"mt-3 grid grid-cols-2 gap-3\">\n {textualWidthOptions.map((option) => (\n <SimpleOptionButton\n key={option.value}\n selected={currentWidth === option.value}\n onClick={() => setWidth(option.value)}\n >\n {option.label}\n </SimpleOptionButton>\n ))}\n </div>\n </SimpleField>\n\n {fitSuggestion ? (\n <SimpleField>\n <SimpleFieldLabel>\n Fit alongside {fitSuggestion.neighbour} slide\n </SimpleFieldLabel>\n <div className=\"mt-3\">\n <SimpleOptionButton\n selected={currentWidth === fitSuggestion.width}\n onClick={() =>\n setWidth(fitSuggestion.width as DisplayWidth)\n }\n >\n w-{fitSuggestion.width} — fills remaining space\n </SimpleOptionButton>\n </div>\n </SimpleField>\n ) : null}\n\n <div\n className=\"text-center text-xs\"\n style={{ color: simpleLayoutColours.muted }}\n >\n w-{currentWidth}\n </div>\n </>\n ) : mode === \"advanced\" ? (\n <>\n <div className=\"px-2\">\n <InputContainer $wide>\n <DimensionsTriplet\n widthId={editor.technical.width.containerId()}\n width={editor.technical.width.get() || 0}\n changeWidth={(v) => editor.technical.width.set(v)}\n heightId={editor.technical.height.containerId()}\n height={editor.technical.height.get() || 0}\n changeHeight={(v) => editor.technical.height.set(v)}\n />\n </InputContainer>\n </div>\n {controls.showGridSizing ? (\n <BehaviorEditor\n behavior={behavior}\n onChange={(v) => editor.technical.behavior.set(v)}\n configs={[\n {\n id: \"size\",\n component: (existing, setBehaviors) => (\n <EditSize\n behaviors={existing}\n setBehaviors={setBehaviors}\n />\n ),\n label: { en: [\"Size\"] },\n type: \"custom\",\n initialOpen: true,\n supports: (b) => b.startsWith(\"w-\") || b.startsWith(\"h-\"),\n },\n ]}\n />\n ) : null}\n </>\n ) : null}\n </div>\n </SidebarContent>\n </Sidebar>\n );\n}\n","import {\n getInternationalStringText,\n resolveContentResource,\n useAnnotationThumbnail,\n} from \"@manifest-editor/editors\";\nimport { useCreator } from \"@manifest-editor/shell\";\nimport { type ReactNode } from \"react\";\nimport { Button } from \"react-aria-components\";\nimport { useCanvas, useVault, useVaultSelector } from \"react-iiif-vault\";\nimport {\n type SlideContentBox,\n getSlideLayoutRegions,\n getSlideContentLayers,\n useSlideshowContentPositioning,\n useSlideshowWorkbenchState,\n} from \"../slideshow-content-positioning\";\n\nconst editorialTextRegionId = \"editorial-text\";\n\nexport function SlideshowContentPanel() {\n const canvas = useCanvas();\n const pageRef = canvas?.items?.[0]\n ? { id: canvas.items[0].id, type: \"AnnotationPage\" }\n : undefined;\n const [, contentActions] = useCreator(\n pageRef,\n \"items\",\n \"Annotation\",\n canvas ? { id: canvas.id, type: \"Canvas\" } : undefined,\n { isPainting: true },\n );\n const {\n selectedAnnotationId,\n repositioningAnnotationId,\n selectedTextRegion,\n repositioningTextRegion,\n selectAnnotation,\n startRepositioning,\n stopRepositioning,\n selectTextRegion,\n startTextRepositioning,\n stopTextRepositioning,\n } = useSlideshowContentPositioning();\n const setShowTourSteps = useSlideshowWorkbenchState(\n (state) => state.setShowTourSteps,\n );\n const layers = useVaultSelector(\n (_, vaultInstance) =>\n canvas ? getSlideContentLayers(vaultInstance, canvas) : [],\n [canvas?.id, pageRef?.id],\n );\n const editorialTextBox = getSlideLayoutRegions(canvas).text;\n const hasContent = layers.length || editorialTextBox;\n\n if (!canvas || !pageRef) {\n return (\n <div>\n <FieldLabel>Content on this slide</FieldLabel>\n <p className=\"exhibition-workbench-muted mt-2 text-sm leading-relaxed\">\n This slide does not have a content layer yet.\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-5\">\n <div>\n <FieldLabel>Content on this slide</FieldLabel>\n <p className=\"exhibition-workbench-muted mt-2 text-sm leading-relaxed\">\n Select a painting annotation to highlight it in the workbench. Use the\n centre panel to add, position, and edit slide content.\n </p>\n </div>\n\n {!hasContent ? (\n <div className=\"exhibition-slideshow-content-empty rounded-lg border border-dashed border-slate-200 bg-slate-50 p-4 text-sm\">\n No painting annotations on this slide yet.\n </div>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {editorialTextBox ? (\n <EditorialContentItem\n box={editorialTextBox}\n selected={selectedTextRegion === editorialTextRegionId}\n repositioning={repositioningTextRegion === editorialTextRegionId}\n onSelect={() => {\n setShowTourSteps(false);\n selectTextRegion(editorialTextRegionId);\n }}\n onReposition={() => {\n setShowTourSteps(false);\n startTextRepositioning(editorialTextRegionId);\n }}\n onStopReposition={stopTextRepositioning}\n />\n ) : null}\n {layers.map((layer, index) => (\n <ContentInventoryItem\n key={layer.annotation.id}\n layer={layer}\n index={index}\n selected={selectedAnnotationId === layer.annotation.id}\n repositioning={repositioningAnnotationId === layer.annotation.id}\n onSelect={() => {\n setShowTourSteps(false);\n selectAnnotation(layer.annotation.id);\n }}\n onReposition={() => {\n setShowTourSteps(false);\n startRepositioning(layer.annotation.id);\n }}\n onStopReposition={stopRepositioning}\n onAdvancedEdit={() =>\n contentActions.edit(\n { id: layer.annotation.id, type: \"Annotation\" },\n index,\n )\n }\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction ContentInventoryItem({\n layer,\n index,\n selected,\n repositioning,\n onSelect,\n onReposition,\n onStopReposition,\n onAdvancedEdit,\n}: {\n layer: ReturnType<typeof getSlideContentLayers>[number];\n index: number;\n selected: boolean;\n repositioning: boolean;\n onSelect: () => void;\n onReposition: () => void;\n onStopReposition: () => void;\n onAdvancedEdit: () => void;\n}) {\n const vault = useVault();\n const thumbnail = useAnnotationThumbnail({\n annotationId: layer.annotation.id,\n options: { maxWidth: 96, maxHeight: 96 },\n });\n const body = getAnnotationBody(layer.annotation, vault);\n const type = getLayerType(layer, body);\n const label = getContentLabel(layer, body, index);\n const detail = getContentDetail(layer, body, type);\n\n return (\n <div\n className={[\n \"exhibition-slideshow-content-item rounded-lg border bg-white p-3 transition\",\n selected\n ? \"exhibition-slideshow-content-item-selected border-me-primary-500 bg-me-primary-50 ring-2 ring-me-primary-100\"\n : \"border-slate-200\",\n ].join(\" \")}\n >\n <Button\n className=\"flex w-full items-center gap-3 border-none bg-transparent p-0 text-left\"\n onPress={onSelect}\n >\n <ContentThumbnail thumbnailUrl={thumbnail?.id} type={type} />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-[11px] font-semibold uppercase tracking-wide text-me-primary-500\">\n {type}\n </span>\n <span className=\"mt-0.5 block truncate text-sm font-semibold\">\n {label}\n </span>\n <span className=\"exhibition-workbench-muted mt-0.5 block truncate text-xs\">\n {detail}\n </span>\n </span>\n </Button>\n <div className=\"mt-3 flex items-center justify-between gap-3\">\n <span className=\"exhibition-workbench-muted text-xs\">\n {repositioning\n ? \"Drag or resize in the workbench\"\n : selected\n ? \"Selected in workbench\"\n : \"Click to select on slide\"}\n </span>\n <div className=\"flex gap-2\">\n <Button\n className=\"rounded-md border border-me-primary-200 bg-me-primary-50 px-3 py-1.5 text-xs font-semibold text-me-primary-600 transition hover:bg-me-primary-100\"\n onPress={repositioning ? onStopReposition : onReposition}\n >\n {repositioning ? \"Done moving\" : \"Reposition\"}\n </Button>\n <Button\n className=\"rounded-md border border-slate-200 bg-white px-3 py-1.5 text-xs font-semibold text-slate-700 transition hover:bg-slate-50\"\n onPress={onAdvancedEdit}\n >\n Advanced edit\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\nfunction EditorialContentItem({\n box,\n selected,\n repositioning,\n onSelect,\n onReposition,\n onStopReposition,\n}: {\n box: SlideContentBox;\n selected: boolean;\n repositioning: boolean;\n onSelect: () => void;\n onReposition: () => void;\n onStopReposition: () => void;\n}) {\n return (\n <div\n className={[\n \"exhibition-slideshow-content-item rounded-lg border bg-white p-3 transition\",\n selected\n ? \"exhibition-slideshow-content-item-selected border-me-primary-500 bg-me-primary-50 ring-2 ring-me-primary-100\"\n : \"border-slate-200\",\n ].join(\" \")}\n >\n <Button\n className=\"flex w-full items-center gap-3 border-none bg-transparent p-0 text-left\"\n onPress={onSelect}\n >\n <ContentThumbnail type=\"Text\" />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block text-[11px] font-semibold uppercase tracking-wide text-me-primary-500\">\n Editorial text\n </span>\n <span className=\"mt-0.5 block truncate text-sm font-semibold\">\n Slide label and summary\n </span>\n <span className=\"exhibition-workbench-muted mt-0.5 block truncate text-xs\">\n Position {Math.round(box.x)}, {Math.round(box.y)} ·{\" \"}\n {Math.round(box.width)} x {Math.round(box.height)}\n </span>\n </span>\n </Button>\n <div className=\"mt-3 flex items-center justify-between gap-3\">\n <span className=\"exhibition-workbench-muted text-xs\">\n {repositioning\n ? \"Drag or resize in the workbench\"\n : selected\n ? \"Selected in workbench\"\n : \"Click to select on slide\"}\n </span>\n <Button\n className=\"rounded-md border border-me-primary-200 bg-me-primary-50 px-3 py-1.5 text-xs font-semibold text-me-primary-600 transition hover:bg-me-primary-100\"\n onPress={repositioning ? onStopReposition : onReposition}\n >\n {repositioning ? \"Done moving\" : \"Reposition\"}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction ContentThumbnail({\n thumbnailUrl,\n type,\n}: {\n thumbnailUrl?: string;\n type: string;\n}) {\n return (\n <div className=\"flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-md bg-[#f8f6f3] text-xs font-semibold text-black/60 ring-1 ring-slate-200\">\n {thumbnailUrl ? (\n <img\n alt=\"\"\n className=\"h-full w-full object-cover\"\n src={thumbnailUrl}\n />\n ) : (\n <span>{type}</span>\n )}\n </div>\n );\n}\n\nfunction getLayerType(\n layer: ReturnType<typeof getSlideContentLayers>[number],\n body?: any,\n) {\n if (layer.imageUrl) return \"Image\";\n if (layer.youtubeId) return \"YouTube\";\n if (layer.videoUrl) return \"Video\";\n if (layer.html !== null) return \"Text\";\n if (body?.type === \"Canvas\") return \"Canvas\";\n if (body?.type) return String(body.type);\n return \"Media\";\n}\n\nfunction getContentLabel(\n layer: ReturnType<typeof getSlideContentLayers>[number],\n body: any,\n index: number,\n) {\n const bodyLabel = getInternationalStringText(body?.label, \"\");\n const annotationLabel = getInternationalStringText(layer.annotation.label, \"\");\n const htmlLabel = layer.html ? stripHtml(layer.html).slice(0, 80) : \"\";\n\n return (\n bodyLabel ||\n annotationLabel ||\n htmlLabel ||\n `${getLayerType(layer, body)} layer ${index + 1}`\n );\n}\n\nfunction getContentDetail(\n layer: ReturnType<typeof getSlideContentLayers>[number],\n body: any,\n type: string,\n) {\n const position = `${Math.round(layer.box.x)}, ${Math.round(\n layer.box.y,\n )} · ${Math.round(layer.box.width)} x ${Math.round(layer.box.height)}`;\n const format = body?.format || body?.profile || body?.type;\n\n return [format || `${type} painting annotation`, `Position ${position}`]\n .filter(Boolean)\n .join(\" · \");\n}\n\nfunction getAnnotationBody(annotation: any, vault: any) {\n const body = Array.isArray(annotation?.body)\n ? annotation.body[0]\n : annotation?.body;\n return resolveContentResource(vault, body);\n}\n\nfunction stripHtml(value: string) {\n return value\n .replace(/<br\\s*\\/?>/gi, \" \")\n .replace(/<\\/p>/gi, \" \")\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction FieldLabel({ children }: { children: ReactNode }) {\n return (\n <div className=\"exhibition-workbench-muted text-sm font-semibold\">\n {children}\n </div>\n );\n}\n","import { Sidebar, SidebarContent } from \"@manifest-editor/components\";\nimport { LanguageMapEditor } from \"@manifest-editor/editors\";\nimport {\n type EditorDefinition,\n ResourceEditingProvider,\n useLocalStorage,\n} from \"@manifest-editor/shell\";\nimport { type ReactNode, useEffect, useMemo, useState } from \"react\";\nimport { Button } from \"react-aria-components\";\nimport { useCanvas, useVault } from \"react-iiif-vault\";\nimport { isEditableExhibitionCanvas, isInfoBoxCanvas } from \"../helpers\";\nimport { RescaleSingleImagePrompt } from \"../components/RescaleSingleImagePrompt\";\nimport {\n supportsTourSteps,\n useSlideshowWorkbenchState,\n} from \"../slideshow-content-positioning\";\nimport {\n ExhibitionHtmlSummaryEditor,\n ExhibitionRequiredStatementEditor,\n ExhibitionSummaryContent,\n} from \"./ExhibitionSummaryEditor\";\nimport { ExhibitionTourStepsContent } from \"./ExhibitionTourSteps\";\nimport { InfoBoxPanel } from \"./InfoBoxPanel\";\nimport { SlideBehavioursContent } from \"./SlideBehaviours\";\nimport { SlideshowContentPanel } from \"./SlideshowContentPanel\";\nimport { SlideshowDurationField } from \"./SlideshowDurationField\";\n\ntype EditingMode = \"simple\" | \"advanced\";\ntype WorkbenchPreset = \"default\" | \"slideshow\";\ntype RightPanelTab = \"layout\" | \"content\" | \"summary\" | \"tour\";\n\nconst defaultTabs: Array<{ id: RightPanelTab; label: string }> = [\n { id: \"layout\", label: \"Layout\" },\n { id: \"summary\", label: \"Text content\" },\n { id: \"tour\", label: \"Tour steps\" },\n];\n\nconst slideshowTabs: Array<{ id: RightPanelTab; label: string }> = [\n { id: \"layout\", label: \"Layout\" },\n { id: \"content\", label: \"Content\" },\n { id: \"summary\", label: \"Text content\" },\n { id: \"tour\", label: \"Tour steps\" },\n];\n\nconst modeOptions: Array<{ value: EditingMode; label: string }> = [\n { value: \"simple\", label: \"Simple\" },\n { value: \"advanced\", label: \"Advanced\" },\n];\n\nconst workbenchStorageKey = \"exhibition-right-panel-mode\";\nconst toggleColours = {\n track: \"#f5eaf0\",\n active: \"#b84c74\",\n inactiveText: \"#8b3f61\",\n activeText: \"#ffffff\",\n activeShadow: \"0 1px 3px rgba(15, 23, 42, 0.18)\",\n};\n\nexport const exhibitionWorkbenchEditor: EditorDefinition = {\n id: \"@exhibition/workbench-editor\",\n supports: {\n edit: true,\n properties: [\"label\", \"summary\", \"requiredStatement\", \"behavior\", \"annotations\"],\n resourceTypes: [\"Canvas\"],\n custom: ({ resource }, vault) => {\n if (!isEditableExhibitionCanvas(resource as any, vault)) return false;\n // In standalone-tab mode (non-slideshow presets) the workbench only shows\n // for info-box canvases; image canvases use the individual tabs instead.\n return isInfoBoxCanvas(resource as any, vault);\n },\n },\n label: \"Canvas\",\n component: () => <ExhibitionWorkbenchRightPanel />,\n};\n\nexport const slideshowWorkbenchEditor: EditorDefinition = {\n ...exhibitionWorkbenchEditor,\n id: \"@exhibition/slideshow-workbench-editor\",\n supports: {\n ...exhibitionWorkbenchEditor.supports,\n // In slideshow mode (singleTab) the workbench handles ALL canvas types.\n custom: ({ resource }, vault) =>\n isEditableExhibitionCanvas(resource as any, vault),\n },\n component: () => <ExhibitionWorkbenchRightPanel preset=\"slideshow\" />,\n};\n\nfunction ExhibitionWorkbenchRightPanel({\n preset = \"default\",\n}: {\n preset?: WorkbenchPreset;\n}) {\n const [mode, setMode] = useLocalStorage<EditingMode>(\n workbenchStorageKey,\n \"simple\",\n );\n const canvas = useCanvas();\n const vault = useVault();\n const isInfoBox = Boolean(canvas?.behavior?.includes(\"info\"));\n const tourSupported = supportsTourSteps(vault, canvas);\n\n const tabs = useMemo(\n () =>\n (preset === \"slideshow\" ? slideshowTabs : defaultTabs).filter(\n (tab) => tab.id !== \"tour\" || tourSupported,\n ),\n [preset, tourSupported],\n );\n const [selectedTab, setSelectedTab] = useState<RightPanelTab>(\"layout\");\n const requestedTab = useSlideshowWorkbenchState(\n (state) => state.requestedTab,\n );\n const clearRequestedTab = useSlideshowWorkbenchState(\n (state) => state.clearRequestedTab,\n );\n const setShowTourSteps = useSlideshowWorkbenchState(\n (state) => state.setShowTourSteps,\n );\n const setCenterPanelMode = useSlideshowWorkbenchState(\n (state) => state.setCenterPanelMode,\n );\n\n useEffect(() => {\n // Sync center panel mode with the initially selected tab on mount\n if (selectedTab === \"tour\") {\n setCenterPanelMode(\"edit\");\n } else if (selectedTab === \"layout\" || selectedTab === \"summary\") {\n setCenterPanelMode(\"preview\");\n }\n // Only run on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (requestedTab && tabs.some((tab) => tab.id === requestedTab)) {\n const tab = requestedTab as RightPanelTab;\n setSelectedTab(tab);\n setShowTourSteps(tab === \"tour\");\n if (tab === \"tour\") {\n setCenterPanelMode(\"edit\");\n } else if (tab === \"layout\" || tab === \"summary\") {\n setCenterPanelMode(\"preview\");\n }\n clearRequestedTab();\n }\n }, [\n clearRequestedTab,\n requestedTab,\n setCenterPanelMode,\n setShowTourSteps,\n tabs,\n ]);\n\n useEffect(() => {\n if (selectedTab === \"tour\" && !tourSupported) {\n setSelectedTab(\"layout\");\n setShowTourSteps(false);\n }\n }, [selectedTab, setShowTourSteps, tourSupported]);\n\n const selectTab = (tab: RightPanelTab) => {\n setSelectedTab(tab);\n setShowTourSteps(tab === \"tour\");\n if (tab === \"tour\") {\n setCenterPanelMode(\"edit\");\n } else if (tab === \"layout\" || tab === \"summary\") {\n setCenterPanelMode(\"preview\");\n }\n };\n\n // For info-box canvases inside the slideshow singleTab context, render the\n // dedicated InfoBoxPanel directly — no nested tabs, no double toggle.\n if (isInfoBox) {\n return <InfoBoxPanel />;\n }\n\n return (\n <Sidebar>\n <SidebarContent className=\"bg-white px-6 pt-5 pb-20\">\n <div className=\"flex justify-center\">\n <SegmentedToggle\n value={mode}\n options={modeOptions}\n onChange={setMode}\n />\n </div>\n\n <div\n role=\"tablist\"\n aria-label=\"Canvas editing sections\"\n className={[\n \"mt-5 grid border-b border-[#e4ddd6]\",\n tabs.length === 4 ? \"grid-cols-4\" : \"grid-cols-3\",\n ].join(\" \")}\n >\n {tabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n id={`exhibition-workbench-tab-${tab.id}`}\n role=\"tab\"\n aria-selected={selectedTab === tab.id}\n aria-controls={`exhibition-workbench-panel-${tab.id}`}\n className={[\n \"exhibition-workbench-tab\",\n \"-mb-px border-b-[3px] border-transparent px-1 pb-3 text-center text-sm font-semibold\",\n selectedTab === tab.id\n ? \"border-me-primary-500 text-me-primary-500\"\n : \"exhibition-workbench-muted\",\n ].join(\" \")}\n onClick={() => selectTab(tab.id)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n <div\n id={`exhibition-workbench-panel-${selectedTab}`}\n role=\"tabpanel\"\n aria-labelledby={`exhibition-workbench-tab-${selectedTab}`}\n className=\"mt-8 px-4\"\n >\n {selectedTab === \"layout\" ? (\n <>\n <RescaleSingleImagePrompt />\n <SlideshowDurationField />\n <SlideBehavioursContent\n mode={mode}\n layoutContext={preset === \"slideshow\" ? \"slideshow\" : \"default\"}\n />\n </>\n ) : null}\n {selectedTab === \"content\" ? <SlideshowContentPanel /> : null}\n {selectedTab === \"summary\" ? (\n mode === \"simple\" ? (\n <SimpleSummaryPanel />\n ) : (\n <ExhibitionSummaryContent />\n )\n ) : null}\n {selectedTab === \"tour\" ? (\n <ExhibitionTourStepsContent\n mode={mode}\n useSlideshowWorkbench={preset === \"slideshow\"}\n />\n ) : null}\n </div>\n </SidebarContent>\n </Sidebar>\n );\n}\n\nfunction SegmentedToggle<T extends string>({\n value,\n options,\n onChange,\n}: {\n value: T;\n options: Array<{ value: T; label: string }>;\n onChange: (value: T) => void;\n}) {\n return (\n <div\n role=\"group\"\n aria-label=\"Editing mode\"\n className=\"grid w-full max-w-[240px] grid-cols-2 rounded-full p-1\"\n style={{ backgroundColor: toggleColours.track }}\n >\n {options.map((option) => {\n const selected = value === option.value;\n return (\n <Button\n key={option.value}\n aria-pressed={selected}\n className=\"border-none rounded-full bg-transparent px-4 py-2 text-sm font-semibold transition-colors\"\n style={{\n backgroundColor: selected ? toggleColours.active : \"transparent\",\n color: selected\n ? toggleColours.activeText\n : toggleColours.inactiveText,\n boxShadow: selected ? toggleColours.activeShadow : \"none\",\n }}\n onPress={() => onChange(option.value)}\n >\n {option.label}\n </Button>\n );\n })}\n </div>\n );\n}\n\nfunction SimpleSummaryPanel() {\n const canvas = useCanvas();\n if (!canvas) return null;\n return (\n <ResourceEditingProvider resource={canvas}>\n <div className=\"flex flex-col gap-7\">\n <div>\n <SimpleFieldLabel>Slide title</SimpleFieldLabel>\n <div className=\"mt-2\">\n <LanguageMapEditor\n dispatchType=\"label\"\n disableMultiline\n disallowHTML\n />\n </div>\n </div>\n <div>\n <SimpleFieldLabel>Slide summary</SimpleFieldLabel>\n <div className=\"mt-2\">\n <ExhibitionHtmlSummaryEditor resource={canvas} />\n </div>\n </div>\n <ExhibitionRequiredStatementEditor />\n </div>\n </ResourceEditingProvider>\n );\n}\n\nfunction SimpleFieldLabel({ children }: { children: ReactNode }) {\n return (\n <div className=\"exhibition-workbench-muted text-sm font-semibold\">\n {children}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { type SVGProps } from \"react\";\n\nconst PresetIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 15 15\"\n {...props}\n >\n <path\n fill=\"currentColor\"\n d=\"M4.5 1a2.5 2.5 0 0 0-2.45 2H0v1h2.05a2.5 2.5 0 0 0 4.9 0H15V3H6.95A2.5 2.5 0 0 0 4.5 1m6 8a2.5 2.5 0 0 0-2.45 2H0v1h8.05a2.5 2.5 0 0 0 4.9 0H15v-1h-2.05a2.5 2.5 0 0 0-2.45-2\"\n />\n </svg>\n);\n\nexport default PresetIcon;\n","import * as ManifestPreset from \"@manifest-editor/manifest-preset\";\nimport { extendApp, mapApp } from \"@manifest-editor/shell\";\nimport {\n imageBrowserSlideCreator,\n keepIIIFBrowserNested,\n} from \"../creators/image-browser-slide-creator\";\nimport { imageServiceSlideCreator } from \"../creators/image-service-slide-creator\";\nimport { imageSlideCreator } from \"../creators/image-slide-creator\";\nimport { imageUrlSlideCreator } from \"../creators/image-url-slide\";\nimport { infoBoxCreator } from \"../creators/info-box-creator\";\nimport { videoSlideCreator } from \"../creators/video-slide-creator\";\nimport { exhibitionPresetConfig } from \"../exhibition-onboarding\";\nimport { youtubeSlideCreator } from \"../creators/youtube-slide-creator\";\nimport { scrollGridLeftPanel } from \"../left-panels/ExhibitionGrid\";\nimport { exhibitionThemeLeftPanel } from \"../left-panels/ExhibitionTheme\";\nimport { exhibitionCanvasEditor } from \"../right-panels/ExhibitionCanvasEditor\";\nimport { exhibitionSummaryEdtior } from \"../right-panels/ExhibitionSummaryEditor\";\nimport { exhibitionTourSteps } from \"../right-panels/ExhibitionTourSteps\";\nimport { exhibitionWorkbenchEditor } from \"../right-panels/ExhibitionWorkbenchEditor\";\nimport { infoBoxWorkbenchEditor } from \"../right-panels/InfoBoxPanel\";\nimport { customBehaviourEditor } from \"../right-panels/SlideBehaviours\";\n\nexport const exhibitionEditorScrollingPreset = extendApp(\n mapApp(ManifestPreset, (app) => ({\n ...app,\n layout: {\n ...app.layout,\n creators: app.layout.creators?.map((creator) =>\n creator.id === \"@manifest-editor/iiif-browser-creator\"\n ? keepIIIFBrowserNested(creator)\n : creator,\n ),\n },\n })),\n {\n id: \"exhibition-scrolling-editor\",\n title: \"Exhibition Editor (scrolling)\",\n project: true,\n projectType: \"Manifest\",\n },\n {\n preset: exhibitionPresetConfig,\n config: {\n editorConfig: {},\n },\n leftPanels: [\n //\n scrollGridLeftPanel,\n exhibitionThemeLeftPanel,\n ],\n leftPanelIds: [\"left-panel-manifest\"],\n centerPanels: [\n //\n ],\n annotations: [\n //\n ],\n // leftPanelIds: [\"left-panel-manifest\"],\n background: [\n //\n ],\n canvasEditors: [\n //\n ],\n editors: [\n //\n infoBoxWorkbenchEditor,\n exhibitionWorkbenchEditor,\n exhibitionCanvasEditor,\n customBehaviourEditor,\n exhibitionSummaryEdtior,\n exhibitionTourSteps,\n ],\n creators: [\n infoBoxCreator,\n youtubeSlideCreator,\n imageServiceSlideCreator,\n imageBrowserSlideCreator,\n imageSlideCreator,\n imageUrlSlideCreator,\n videoSlideCreator,\n ],\n },\n);\n","import { CanvasPanelEditor, useAnnotationEditing } from \"@manifest-editor/editors\";\nimport type { CanvasEditorDefinition, EditableResource } from \"@manifest-editor/shell\";\nimport { useLayoutActions, useLayoutState } from \"@manifest-editor/shell\";\nimport { useState } from \"react\";\nimport { Button } from \"react-aria-components\";\nimport {\n CanvasContext,\n LocaleString,\n type RenderingStrategy,\n useCanvas,\n useCurrentAnnotationRequest,\n useManifest,\n} from \"react-iiif-vault\";\nimport { SlideshowSlidePreview } from \"../components/SlideshowSlidePreview\";\nimport { isExhibitionItem } from \"../helpers\";\nimport { useSlideshowWorkbenchState } from \"../slideshow-content-positioning\";\n\nexport const slideshowCanvasEditor: CanvasEditorDefinition = {\n id: \"slideshow-canvas-editor\",\n label: \"Slideshow canvas editor\",\n component: () => <SlideshowCanvasEditor />,\n supports: {\n strategy: (_strategy: RenderingStrategy, resource: EditableResource, vault) => {\n const canvas = vault.get(resource.resource);\n return canvas?.type === \"Canvas\" && isExhibitionItem(canvas as any);\n },\n },\n};\n\nfunction SlideshowCanvasEditor() {\n const canvas = useCanvas();\n const manifest = useManifest();\n const { edit } = useLayoutActions();\n const { rightPanel } = useLayoutState();\n const centerPanelMode = useSlideshowWorkbenchState((state) => state.centerPanelMode);\n const request = useCurrentAnnotationRequest();\n const editingAnnotationId = useAnnotationEditing((state) => state.annotationId);\n const [zoom, setZoom] = useState(1);\n const currentCanvasIndex = manifest?.items?.findIndex((item) => item.id === canvas?.id);\n const previousCanvas = typeof currentCanvasIndex === \"number\" ? manifest?.items?.[currentCanvasIndex - 1] : undefined;\n const nextCanvas = typeof currentCanvasIndex === \"number\" ? manifest?.items?.[currentCanvasIndex + 1] : undefined;\n\n if (!canvas) {\n return null;\n }\n\n if (\n request ||\n editingAnnotationId ||\n centerPanelMode === \"edit\" ||\n (rightPanel.current === \"@manifest-editor/editor\" &&\n rightPanel.state?.currentTab?.startsWith(\"@exhibition/tour-steps\"))\n ) {\n return <CanvasPanelEditor asFallback />;\n }\n\n return (\n <div className=\"exhibition-slideshow-current-canvas flex h-full min-h-0 flex-col bg-slate-100\">\n <div className=\"exhibition-slideshow-current-toolbar flex items-center gap-3 border-b border-slate-200 bg-white px-4 py-3 shadow-sm\">\n <div className=\"min-w-0 flex-1\">\n <LocaleString className=\"block truncate text-sm font-semibold text-slate-800\">{canvas.label}</LocaleString>\n </div>\n <div className=\"flex items-center gap-2\">\n <ControlButton onPress={() => setZoom(1)}>Home</ControlButton>\n <ControlButton onPress={() => setZoom((value) => Math.max(0.25, value - 0.25))}>-</ControlButton>\n <ControlButton onPress={() => setZoom((value) => Math.min(3, value + 0.25))}>+</ControlButton>\n <ControlButton\n isDisabled={!previousCanvas}\n onPress={() =>\n previousCanvas &&\n edit({ id: previousCanvas.id, type: \"Canvas\" }, undefined, {\n forceOpen: false,\n })\n }\n >\n Previous\n </ControlButton>\n <ControlButton\n isDisabled={!nextCanvas}\n onPress={() =>\n nextCanvas &&\n edit({ id: nextCanvas.id, type: \"Canvas\" }, undefined, {\n forceOpen: false,\n })\n }\n >\n Next\n </ControlButton>\n </div>\n </div>\n <div className=\"exhibition-slideshow-current-viewport min-h-0 flex-1 overflow-auto p-8\">\n <div\n className=\"exhibition-slideshow-current-preview mx-auto origin-top overflow-hidden rounded-md bg-white shadow-xl ring-1 ring-black/10\"\n style={{\n width: \"min(100%, 1200px)\",\n aspectRatio: `${canvas.width || 1920} / ${canvas.height || 1080}`,\n transform: `scale(${zoom})`,\n transformOrigin: \"top center\",\n }}\n >\n <CanvasContext canvas={canvas.id}>\n <SlideshowSlidePreview />\n </CanvasContext>\n </div>\n </div>\n </div>\n );\n}\n\nfunction ControlButton({\n children,\n isDisabled,\n onPress,\n}: {\n children: string;\n isDisabled?: boolean;\n onPress: () => void;\n}) {\n return (\n <Button\n className=\"exhibition-slideshow-current-control rounded-md border border-slate-200 bg-white px-3 py-2 text-sm font-semibold text-slate-700 shadow-sm transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:opacity-40\"\n isDisabled={isDisabled}\n onPress={onPress}\n >\n {children}\n </Button>\n );\n}\n","import * as React from 'react';\nimport { SVGProps } from 'react';\nconst MoveIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 48 48\" {...props}>\n <g fill=\"none\" stroke=\"#000\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={4}>\n <path d=\"m20 8 4-4m0 0 4 4m-4-4v12M20 40l4 4m0 0 4-4m-4 4V32M40 20l4 4m0 0-4 4m4-4H32M8 20l-4 4m0 0 4 4m-4-4h12\" />\n <circle cx={24} cy={24} r={2} />\n </g>\n </svg>\n);\nexport default MoveIcon;\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\n\nconst SlideshowIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path\n fill=\"currentColor\"\n d=\"M20 22H4q-.825 0-1.413-.588T2 20V8q0-.825.588-1.413T4 6h5.975v2H4v12h16v-3.975h2V20q0 .825-.588 1.413T20 22ZM4 20V8v8.025-.675V20Zm13-5.975-1.55-3.475L11.975 9l3.475-1.55L17 4l1.55 3.45L22 9l-3.45 1.55L17 14.025Z\"\n />\n </svg>\n);\n\nexport default SlideshowIcon;\n","import { addMappings, importEntities } from \"@iiif/helpers/vault/actions\";\nimport { ActionButton, SidebarContent } from \"@manifest-editor/components\";\nimport { useInStack } from \"@manifest-editor/editors\";\nimport {\n type LayoutPanel,\n ResourceEditingProvider,\n useCreator,\n useEditingStack,\n useInlineCreator,\n useLayoutActions,\n useManifestEditor,\n} from \"@manifest-editor/shell\";\nimport MoveIcon from \"@manifest-editor/ui/icons/MoveIcon\";\nimport SlideshowIcon from \"@manifest-editor/ui/icons/SlideshowIcon\";\nimport { type ReactNode, type PointerEvent as ReactPointerEvent, useEffect, useRef, useState } from \"react\";\nimport { Button } from \"react-aria-components\";\nimport {\n AnnotationPageContext,\n CanvasContext,\n LocaleString,\n useCanvas,\n useManifest,\n useVault,\n useVaultSelector,\n} from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ExhibitionPreviewPanel } from \"../components/ExhibitionPreviewPanel\";\nimport { SlideshowSlidePreview } from \"../components/SlideshowSlidePreview\";\nimport { TourAnnotationPageEditor } from \"../components/TourAnnotationPageEditor\";\nimport { DEFAULT_TOUR_STEP_HTML } from \"../components/tour-step-html\";\nimport { getSlideSelectionAfterDeletion } from \"../helpers/slide-selection\";\nimport {\n createDefaultSlideContentTarget,\n getAnnotationTargetBox,\n getPaintingAnnotations,\n getSlideLayoutRegions,\n getTourStepAnnotations,\n type SlideContentBox,\n setAnnotationTargetBox,\n setSlideTextRegionBox,\n supportsTourSteps,\n useSlideshowContentPositioning,\n useSlideshowWorkbenchState,\n} from \"../slideshow-content-positioning\";\n\nconst contentCreatorOptions = {\n skipEditingOnCreate: true,\n};\n\nexport const slideshowCenterPanel: LayoutPanel = {\n id: \"@exhibitions/slideshow-center-panel\",\n label: \"Slideshow workbench\",\n icon: <SlideshowIcon />,\n render: () => <SlideshowCenterPanel />,\n};\n\nfunction SlideshowCenterPanel() {\n const { structural, technical } = useManifestEditor();\n const items = structural.items.get();\n const manifest = { id: technical.id.get(), type: \"Manifest\" };\n const vault = useVault();\n const [, canvasActions] = useCreator(manifest, \"items\", \"Canvas\", undefined, {\n isPainting: true,\n });\n const editingCanvas = useInStack(\"Canvas\");\n const editingStack = useEditingStack();\n const { edit } = useLayoutActions();\n const clearContentPositioning = useSlideshowContentPositioning((state) => state.clear);\n\n const selectedCanvasId = editingCanvas?.resource.source.id || items[0]?.id;\n const selectedIndex = selectedCanvasId ? items.findIndex((item) => item.id === selectedCanvasId) : -1;\n const selectedSlideIndex = selectedIndex >= 0 ? selectedIndex : 0;\n const selectedItem = selectedIndex >= 0 ? items[selectedIndex] : items[0] || null;\n\n const addNewSlide = () => {\n canvasActions.createFiltered(\"exhibition-slideshow-slide\", items.length ? selectedSlideIndex + 1 : undefined);\n };\n\n const openSlide = (item: { id: string; type?: string }, index: number, forceOpen = false) => {\n edit({ id: item.id, type: \"Canvas\" }, { parent: manifest, property: \"items\", index }, { forceOpen });\n };\n\n const selectSlide = (item: { id: string; type?: string }, index: number) => {\n clearContentPositioning();\n openSlide(item, index);\n };\n\n const deleteSlide = (index: number) => {\n const item = items[index];\n if (!item || !confirm(\"Are you sure you want to delete this slide?\")) {\n return;\n }\n\n const nextCanvasId = getSlideSelectionAfterDeletion(items, selectedItem?.id, item.id);\n structural.items.deleteAtIndex(index);\n\n if (selectedItem?.id !== item.id) return;\n\n clearContentPositioning();\n editingStack.close();\n\n if (!nextCanvasId) return;\n\n const nextItems = structural.items.getWithoutTracking();\n const nextIndex = nextItems.findIndex((candidate) => candidate.id === nextCanvasId);\n const nextItem = nextItems[nextIndex];\n if (nextItem) openSlide(nextItem, nextIndex);\n };\n\n const previousSlide = selectedSlideIndex > 0 ? items[selectedSlideIndex - 1] : undefined;\n const nextSlide = selectedSlideIndex < items.length - 1 ? items[selectedSlideIndex + 1] : undefined;\n\n if (!items.length) {\n return (\n <SlideshowWorkbenchShell>\n <div className=\"flex min-h-full items-center justify-center px-24 py-12\">\n <div className=\"w-full max-w-4xl\">\n <p className=\"text-sm font-semibold uppercase tracking-wider text-me-primary-500\">Slideshow exhibition</p>\n <h2 className=\"mt-2 text-3xl font-bold text-slate-900\">Create your first slideshow slide</h2>\n <p className=\"mt-3 max-w-2xl text-sm text-slate-600\">\n Add a new slide and choose one of the supported slideshow slide types. You can add images, text, media,\n and tour steps after the slide is created.\n </p>\n <div className=\"mt-8\">\n <ActionButton primary large onPress={addNewSlide}>\n Add new slide\n </ActionButton>\n </div>\n </div>\n </div>\n </SlideshowWorkbenchShell>\n );\n }\n\n return (\n <SlideshowWorkbenchShell>\n <div className=\"exhibition-slideshow-main flex min-h-full flex-col gap-6 pb-12 pt-16\">\n <div\n className=\"flex flex-wrap items-center gap-3 px-8\"\n style={{\n paddingInlineStart: \"calc(2rem + var(--manifest-editor-layout-left-sidebar-small, 0px))\",\n paddingInlineEnd: \"calc(2rem + var(--manifest-editor-layout-right-sidebar-small, 0px))\",\n }}\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold uppercase tracking-wider text-me-primary-500\">Slideshow workbench</p>\n <h2 className=\"exhibition-slideshow-heading truncate text-2xl font-bold text-slate-900\">\n {selectedItem ? (\n <CanvasContext canvas={selectedItem.id}>\n <SelectedSlideTitle />\n </CanvasContext>\n ) : (\n \"Slides\"\n )}\n </h2>\n <p className=\"exhibition-slideshow-muted mt-1 text-sm font-semibold text-slate-500\">\n Slide {selectedSlideIndex + 1} of {items.length}\n </p>\n </div>\n <SlideNavigation\n current={selectedSlideIndex + 1}\n total={items.length}\n onPrevious={previousSlide ? () => selectSlide(previousSlide, selectedSlideIndex - 1) : undefined}\n onNext={nextSlide ? () => selectSlide(nextSlide, selectedSlideIndex + 1) : undefined}\n />\n <div>\n <ActionButton primary onPress={addNewSlide}>\n Add new slide\n </ActionButton>\n </div>\n </div>\n\n <div\n className=\"flex flex-1 flex-col gap-5 px-8\"\n style={{\n paddingInlineStart: \"calc(1.5rem + var(--manifest-editor-layout-left-sidebar-small, 0px))\",\n paddingInlineEnd: \"calc(1.5rem + var(--manifest-editor-layout-right-sidebar-small, 0px))\",\n }}\n >\n <div className=\"exhibition-slideshow-preview-frame flex items-center justify-center overflow-hidden rounded-lg bg-slate-100\">\n {selectedItem ? (\n <CanvasContext canvas={selectedItem.id}>\n <SelectedSlidePreview />\n </CanvasContext>\n ) : null}\n </div>\n\n <aside className=\"exhibition-slideshow-slide-strip overflow-hidden rounded-lg border border-slate-200 bg-white p-4\">\n <div className=\"exhibition-slideshow-heading mb-3 text-sm font-semibold text-slate-700\">Slides</div>\n <div className=\"flex gap-3 overflow-x-auto pb-2\">\n {items.map((item, index) => (\n <CanvasContext key={item.id} canvas={item.id}>\n <SlideStripItem\n index={index}\n selected={selectedItem?.id === item.id}\n onPress={() => selectSlide(item, index)}\n onDelete={() => deleteSlide(index)}\n />\n </CanvasContext>\n ))}\n </div>\n </aside>\n </div>\n </div>\n </SlideshowWorkbenchShell>\n );\n}\n\nfunction SlideshowWorkbenchShell({ children }: { children: ReactNode }) {\n return (\n <SidebarContent className=\"exhibition-slideshow-workbench h-full overflow-x-hidden overflow-y-auto bg-[#f8f6f3]\">\n {children}\n </SidebarContent>\n );\n}\n\nfunction SelectedSlideTitle() {\n const canvas = useCanvas();\n const title = getLanguageMapValue(canvas?.label, \"Untitled slide\");\n\n return <>{title || \"Untitled slide\"}</>;\n}\n\nfunction SlideNavigation({\n current,\n total,\n onPrevious,\n onNext,\n}: {\n current: number;\n total: number;\n onPrevious?: () => void;\n onNext?: () => void;\n}) {\n return (\n <div className=\"exhibition-slideshow-navigation flex items-stretch overflow-hidden rounded-lg border border-slate-200 bg-white text-sm text-slate-800 shadow-sm\">\n <Button\n className=\"border-none bg-white px-5 py-3 font-semibold transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:text-slate-300\"\n isDisabled={!onPrevious}\n onPress={onPrevious}\n >\n Previous\n </Button>\n <span className=\"exhibition-slideshow-navigation-current flex min-w-[96px] items-center justify-center border-x border-slate-200 bg-slate-50 px-4 font-bold text-slate-900\">\n {current} of {total}\n </span>\n <Button\n className=\"border-none bg-white px-5 py-3 font-semibold transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:text-slate-300\"\n isDisabled={!onNext}\n onPress={onNext}\n >\n Next\n </Button>\n </div>\n );\n}\n\nfunction TourStepNavigation({\n current,\n total,\n onPrevious,\n onNext,\n}: {\n current: number;\n total: number;\n onPrevious?: () => void;\n onNext?: () => void;\n}) {\n return (\n <div className=\"exhibition-slideshow-navigation flex items-stretch overflow-hidden rounded-md border border-slate-200 bg-white text-xs text-slate-800 shadow-sm\">\n <Button\n className=\"border-none bg-white px-3 py-2 font-semibold transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:text-slate-300\"\n isDisabled={!onPrevious}\n onPress={onPrevious}\n >\n Previous step\n </Button>\n <span className=\"exhibition-slideshow-navigation-current flex min-w-[84px] items-center justify-center border-x border-slate-200 bg-slate-50 px-3 font-bold text-slate-900\">\n {total ? `${current} of ${total}` : \"0 of 0\"}\n </span>\n <Button\n className=\"border-none bg-white px-3 py-2 font-semibold transition hover:bg-slate-50 disabled:cursor-not-allowed disabled:text-slate-300\"\n isDisabled={!onNext}\n onPress={onNext}\n >\n Next step\n </Button>\n </div>\n );\n}\n\nfunction SelectedSlidePreview() {\n const canvas = useCanvas();\n const manifest = useManifest();\n const vault = useVault();\n const inlineCreator = useInlineCreator();\n const centerPanelMode = useSlideshowWorkbenchState((state) => state.centerPanelMode);\n const setCenterPanelMode = useSlideshowWorkbenchState((state) => state.setCenterPanelMode);\n const mode = centerPanelMode;\n const setMode = setCenterPanelMode;\n const [targetDrawingMode, setTargetDrawingMode] = useState<\n { type: \"add\" } | { type: \"edit\"; annotationId: string } | null\n >(null);\n const [targetDrawingTool, setTargetDrawingTool] = useState<\"box\" | \"circle\" | \"line\" | \"polygon\">(\"box\");\n const previousTourStepCount = useRef<number | null>(null);\n const annotationPageId = canvas?.annotations?.[0]?.id;\n const pageRef = canvas?.items?.[0] ? { id: canvas.items[0].id, type: \"AnnotationPage\" } : undefined;\n const [, contentActions] = useCreator(\n pageRef,\n \"items\",\n \"Annotation\",\n canvas ? (createDefaultSlideContentTarget(canvas) as any) : undefined,\n { isPainting: true },\n );\n const {\n selectedAnnotationId,\n repositioningAnnotationId,\n selectedTextRegion,\n repositioningTextRegion,\n selectedTourStepId,\n selectAnnotation,\n startRepositioning,\n stopRepositioning,\n startTextRepositioning,\n stopTextRepositioning,\n selectTourStep,\n stopTourStepRepositioning,\n } = useSlideshowContentPositioning();\n const showTourSteps = useSlideshowWorkbenchState((state) => state.showTourSteps);\n const setShowTourSteps = useSlideshowWorkbenchState((state) => state.setShowTourSteps);\n const annotations = useVaultSelector(\n (_, vaultInstance) => (canvas ? getPaintingAnnotations(vaultInstance, canvas) : []),\n [canvas?.id, pageRef?.id],\n );\n const selectedAnnotation = annotations.find((annotation: any) => annotation.id === selectedAnnotationId);\n const selectedTextRegionBox = selectedTextRegion === \"editorial-text\" ? getSlideLayoutRegions(canvas).text : null;\n const tourSteps = useVaultSelector(\n (_, vaultInstance) => (canvas ? getTourStepAnnotations(vaultInstance, canvas) : []),\n [canvas?.id, annotationPageId],\n );\n const selectedTourStep = tourSteps.find((annotation: any) => annotation.id === selectedTourStepId) || tourSteps[0];\n const selectedTourStepIndex = selectedTourStep\n ? Math.max(\n 0,\n tourSteps.findIndex((annotation: any) => annotation.id === selectedTourStep.id),\n )\n : -1;\n const tourSupported = supportsTourSteps(vault, canvas);\n const tourAuthoringActive = showTourSteps && tourSupported;\n\n const selectTourStepAtIndex = (index: number) => {\n const tourStep = tourSteps[index];\n\n if (tourStep?.id) {\n selectTourStep(tourStep.id);\n }\n };\n\n useEffect(() => {\n previousTourStepCount.current = null;\n setTargetDrawingMode(null);\n setTargetDrawingTool(\"box\");\n }, [canvas?.id]);\n\n useEffect(() => {\n if (!tourSupported && showTourSteps) {\n setShowTourSteps(false);\n stopTourStepRepositioning();\n setTargetDrawingMode(null);\n }\n }, [setShowTourSteps, showTourSteps, stopTourStepRepositioning, tourSupported]);\n\n useEffect(() => {\n if (tourAuthoringActive) {\n setMode(\"edit\");\n }\n }, [tourAuthoringActive]);\n\n useEffect(() => {\n if (previousTourStepCount.current === null) {\n previousTourStepCount.current = tourSteps.length;\n return;\n }\n\n const newestTourStep = tourSteps[tourSteps.length - 1];\n if (tourSteps.length > previousTourStepCount.current && newestTourStep?.id) {\n selectTourStep(newestTourStep.id);\n stopRepositioning();\n stopTextRepositioning();\n setShowTourSteps(true);\n }\n\n previousTourStepCount.current = tourSteps.length;\n }, [selectTourStep, setShowTourSteps, stopRepositioning, stopTextRepositioning, tourSteps]);\n\n const toggleTourSteps = () => {\n const nextShowTourSteps = !showTourSteps;\n setShowTourSteps(nextShowTourSteps);\n\n if (nextShowTourSteps) {\n stopRepositioning();\n stopTextRepositioning();\n if (selectedTourStep?.id) {\n selectTourStep(selectedTourStep.id);\n }\n } else {\n stopTourStepRepositioning();\n }\n };\n\n const createTourAnnotationPage = () => {\n if (!canvas) return;\n\n inlineCreator.create(\n \"@manifest-editor/empty-annotation-page\",\n {\n label: { en: [\"Tour steps\"] },\n },\n {\n target: {\n id: canvas.id,\n type: \"Canvas\",\n },\n targetType: \"AnnotationPage\",\n parent: {\n property: \"annotations\",\n resource: {\n id: canvas.id,\n type: \"Canvas\",\n },\n },\n },\n );\n };\n\n const startAddTourStepTarget = () => {\n if (!canvas || !annotationPageId) return;\n\n setShowTourSteps(true);\n stopRepositioning();\n stopTextRepositioning();\n setTargetDrawingTool(\"box\");\n setTargetDrawingMode({ type: \"add\" });\n };\n\n const startEditSelectedTourStepTarget = () => {\n if (!selectedTourStep?.id) return;\n\n setShowTourSteps(true);\n stopRepositioning();\n stopTextRepositioning();\n setTargetDrawingTool(getTourStepTargetDrawingTool(selectedTourStep));\n setTargetDrawingMode({\n type: \"edit\",\n annotationId: selectedTourStep.id,\n });\n };\n\n return (\n <div\n className=\"exhibition-slideshow-preview-card group relative flex max-h-full flex-col overflow-hidden rounded-md bg-white shadow-xl ring-1 ring-black/10\"\n style={{\n width: \"100%\",\n height: \"min(68vh, 760px)\",\n minHeight: 420,\n }}\n >\n <div className=\"exhibition-slideshow-toolbar flex flex-wrap items-center justify-between gap-3 border-b border-slate-200 bg-white px-4 py-3\">\n <span className=\"exhibition-slideshow-muted text-xs font-semibold text-slate-500\">\n {mode === \"edit\" ? \"Click content to edit or reposition it\" : \"Live slideshow preview\"}\n </span>\n <div className=\"flex flex-wrap items-center gap-2\">\n {mode === \"edit\" ? (\n <>\n {tourSupported ? (\n <Button\n className={twMerge(\n \"rounded-md border px-3 py-2 text-xs font-semibold shadow-sm transition\",\n tourAuthoringActive\n ? \"border-me-primary-500 bg-me-primary-50 text-me-primary-600\"\n : \"border-slate-200 bg-white text-slate-700 hover:border-me-primary-300\",\n )}\n onPress={toggleTourSteps}\n >\n {tourAuthoringActive ? \"Hide tour steps\" : \"Show tour steps\"}\n </Button>\n ) : null}\n {tourAuthoringActive ? (\n <>\n <TourStepNavigation\n current={selectedTourStepIndex + 1}\n total={tourSteps.length}\n onPrevious={\n selectedTourStepIndex > 0\n ? () => selectTourStepAtIndex(selectedTourStepIndex - 1)\n : undefined\n }\n onNext={\n selectedTourStepIndex >= 0 &&\n selectedTourStepIndex < tourSteps.length - 1\n ? () => selectTourStepAtIndex(selectedTourStepIndex + 1)\n : undefined\n }\n />\n {annotationPageId ? (\n <Button\n className=\"rounded-md bg-me-primary-500 px-3 py-2 text-xs font-semibold text-white shadow-sm transition hover:bg-me-primary-600\"\n onPress={startAddTourStepTarget}\n >\n Add tour step\n </Button>\n ) : (\n <Button\n className=\"rounded-md bg-me-primary-500 px-3 py-2 text-xs font-semibold text-white shadow-sm transition hover:bg-me-primary-600\"\n onPress={createTourAnnotationPage}\n >\n Create tour\n </Button>\n )}\n </>\n ) : (\n <Button\n className=\"rounded-md bg-me-primary-500 px-3 py-2 text-xs font-semibold text-white shadow-sm transition hover:bg-me-primary-600\"\n onPress={() => {\n setMode(\"edit\");\n selectAnnotation(null);\n setShowTourSteps(false);\n stopTourStepRepositioning();\n contentActions.create(undefined, contentCreatorOptions);\n }}\n >\n Add content\n </Button>\n )}\n </>\n ) : null}\n <div className=\"flex shrink-0 overflow-hidden rounded-md border border-slate-200 bg-slate-50 text-xs font-semibold\">\n <PreviewModeButton\n selected={mode === \"edit\"}\n onPress={() => setMode(\"edit\")}\n >\n Edit\n </PreviewModeButton>\n <PreviewModeButton\n selected={mode === \"preview\"}\n onPress={() => setMode(\"preview\")}\n >\n Preview\n </PreviewModeButton>\n </div>\n </div>\n </div>\n <div className=\"relative min-h-0 flex-1 bg-black\">\n {mode === \"preview\" ? (\n <ExhibitionPreviewPanel\n preset=\"slideshow\"\n presetOptions={{\n manifest: manifest?.id || \"\",\n canvas: canvas?.id,\n minimal: true,\n }}\n />\n ) : (\n <SlideshowSlidePreview editable mode={mode} showTourSteps={tourAuthoringActive} />\n )}\n\n {mode === \"edit\" && targetDrawingMode && canvas && annotationPageId ? (\n <TourStepTargetDrawingOverlay\n annotationPageId={annotationPageId}\n canvas={canvas}\n mode={targetDrawingMode}\n selectedTool={targetDrawingTool}\n setSelectedTool={setTargetDrawingTool}\n vault={vault}\n onCancel={() => setTargetDrawingMode(null)}\n onComplete={(annotationId) => {\n if (annotationId) {\n selectTourStep(annotationId);\n }\n\n setShowTourSteps(true);\n setTargetDrawingMode(null);\n }}\n />\n ) : null}\n\n {!targetDrawingMode &&\n mode === \"edit\" &&\n !tourAuthoringActive &&\n selectedAnnotation &&\n canvas ? (\n <CentrePositionControls\n annotation={selectedAnnotation}\n canvas={canvas}\n isRepositioning={\n repositioningAnnotationId === selectedAnnotation.id\n }\n onStartReposition={() => startRepositioning(selectedAnnotation.id)}\n onStopReposition={stopRepositioning}\n vault={vault}\n />\n ) : null}\n\n {!targetDrawingMode &&\n mode === \"edit\" &&\n !tourAuthoringActive &&\n selectedTextRegionBox &&\n canvas ? (\n <CentrePositionControls\n canvas={canvas}\n currentBox={selectedTextRegionBox}\n isRepositioning={repositioningTextRegion === selectedTextRegion}\n label=\"Editorial text\"\n onStartReposition={() => startTextRepositioning(\"editorial-text\")}\n onStopReposition={stopTextRepositioning}\n setBox={(box) => setSlideTextRegionBox(vault, canvas, box)}\n vault={vault}\n />\n ) : null}\n\n {!targetDrawingMode &&\n mode === \"edit\" &&\n tourAuthoringActive &&\n canvas ? (\n selectedTourStep ? (\n <CentrePositionControls\n annotation={selectedTourStep}\n canvas={canvas}\n isRepositioning={false}\n label=\"Selected tour step target\"\n onStopReposition={stopTourStepRepositioning}\n showBoxFields\n showRepositionButton={false}\n vault={vault}\n >\n {annotationPageId ? (\n <TourStepsWorkbenchPanel\n annotationPageId={annotationPageId}\n canvas={canvas}\n onAddTourStep={startAddTourStepTarget}\n onEditTarget={startEditSelectedTourStepTarget}\n selectedTourStepId={selectedTourStep?.id}\n />\n ) : null}\n </CentrePositionControls>\n ) : (\n <FloatingWorkbenchPanel label=\"Tour steps\">\n {annotationPageId ? (\n <TourStepsWorkbenchPanel\n annotationPageId={annotationPageId}\n canvas={canvas}\n onAddTourStep={startAddTourStepTarget}\n onEditTarget={startEditSelectedTourStepTarget}\n selectedTourStepId={selectedTourStep?.id}\n />\n ) : (\n <CreateTourPanel onCreate={createTourAnnotationPage} />\n )}\n </FloatingWorkbenchPanel>\n )\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction TourStepsWorkbenchPanel({\n annotationPageId,\n canvas,\n onAddTourStep,\n onEditTarget,\n selectedTourStepId,\n}: {\n annotationPageId: string;\n canvas: any;\n onAddTourStep: () => void;\n onEditTarget: () => void;\n selectedTourStepId?: string;\n}) {\n return (\n <ResourceEditingProvider resource={canvas}>\n <AnnotationPageContext annotationPage={annotationPageId}>\n <div className=\"space-y-3 text-slate-800\">\n <div className=\"flex items-center justify-between gap-2\">\n <h3 className=\"text-sm font-semibold text-slate-800\">Tour steps</h3>\n <div className=\"flex flex-wrap gap-2\">\n {selectedTourStepId ? <PositionButton label=\"Edit target\" onPress={onEditTarget} /> : null}\n <PositionButton primary label=\"Add step\" onPress={onAddTourStep} />\n </div>\n </div>\n <p className=\"text-xs text-slate-500\">\n Select a step below. Use the quick box controls here, or edit the target with the Atlas drawing tools.\n </p>\n <div className=\"max-h-72 overflow-y-auto pr-1\">\n <TourAnnotationPageEditor reorderable={false} useSlideshowWorkbench />\n </div>\n </div>\n </AnnotationPageContext>\n </ResourceEditingProvider>\n );\n}\n\nfunction CreateTourPanel({ onCreate }: { onCreate: () => void }) {\n return (\n <div className=\"space-y-3 text-slate-800\">\n <p className=\"text-xs text-slate-600\">This slide does not have a tour annotation page yet.</p>\n <PositionButton primary label=\"Create tour\" onPress={onCreate} />\n </div>\n );\n}\n\nfunction FloatingWorkbenchPanel({ children, label }: { children: ReactNode; label: string }) {\n return (\n <div className=\"absolute bottom-4 left-4 z-40 max-w-[min(34rem,calc(100%-2rem))] rounded-lg bg-white/95 p-3 text-xs shadow-lg ring-1 ring-black/10\">\n <div className=\"mb-2 font-semibold text-slate-700\">{label}</div>\n {children}\n </div>\n );\n}\n\nfunction CentrePositionControls({\n annotation,\n canvas,\n children,\n currentBox,\n isRepositioning,\n label = \"Selected content\",\n onStartReposition,\n onStopReposition,\n setBox: setBoxOverride,\n vault,\n hidePositionControls = false,\n showBoxFields = false,\n showRepositionButton = true,\n}: {\n annotation?: any;\n canvas: any;\n children?: ReactNode;\n currentBox?: SlideContentBox;\n hidePositionControls?: boolean;\n isRepositioning: boolean;\n label?: string;\n onStartReposition?: () => void;\n onStopReposition?: () => void;\n setBox?: (box: SlideContentBox) => void;\n showBoxFields?: boolean;\n showRepositionButton?: boolean;\n vault: any;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const dragRef = useRef<{\n pointerId: number;\n startX: number;\n startY: number;\n panelX: number;\n panelY: number;\n maxX: number;\n maxY: number;\n } | null>(null);\n const [panelOffset, setPanelOffset] = useState<{\n x: number;\n y: number;\n } | null>(null);\n const canvasWidth = Number(canvas?.width) || 1920;\n const canvasHeight = Number(canvas?.height) || 1080;\n const box = currentBox || getAnnotationTargetBox(annotation, canvas);\n const setBox =\n setBoxOverride || ((next: SlideContentBox) => setAnnotationTargetBox(vault, canvas, annotation.id, next));\n const halfWidth = Math.round(canvasWidth / 2);\n const halfHeight = Math.round(canvasHeight / 2);\n const startPanelDrag = (event: ReactPointerEvent<HTMLButtonElement>) => {\n const panel = panelRef.current;\n const boundary = panel?.offsetParent as HTMLElement | null;\n const panelRect = panel?.getBoundingClientRect();\n const boundaryRect = boundary?.getBoundingClientRect();\n\n if (!panel || !panelRect || !boundaryRect) {\n return;\n }\n\n event.currentTarget.setPointerCapture(event.pointerId);\n dragRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n panelX: panelRect.left - boundaryRect.left,\n panelY: panelRect.top - boundaryRect.top,\n maxX: Math.max(16, boundaryRect.width - panelRect.width - 16),\n maxY: Math.max(16, boundaryRect.height - panelRect.height - 16),\n };\n };\n const dragPanel = (event: ReactPointerEvent<HTMLButtonElement>) => {\n const drag = dragRef.current;\n\n if (!drag || drag.pointerId !== event.pointerId) {\n return;\n }\n\n setPanelOffset({\n x: Math.min(drag.maxX, Math.max(16, drag.panelX + event.clientX - drag.startX)),\n y: Math.min(drag.maxY, Math.max(16, drag.panelY + event.clientY - drag.startY)),\n });\n };\n const stopPanelDrag = (event: ReactPointerEvent<HTMLButtonElement>) => {\n if (dragRef.current?.pointerId === event.pointerId) {\n dragRef.current = null;\n if (event.currentTarget.hasPointerCapture(event.pointerId)) {\n event.currentTarget.releasePointerCapture(event.pointerId);\n }\n }\n };\n\n return (\n <div\n ref={panelRef}\n className={twMerge(\n \"absolute z-40 w-[min(30rem,calc(100%-2rem))] rounded-lg bg-white/95 p-3 text-xs shadow-lg ring-1 ring-black/10\",\n panelOffset ? null : \"bottom-4 left-4\",\n )}\n style={panelOffset ? { left: panelOffset.x, top: panelOffset.y } : undefined}\n >\n <div className=\"flex flex-col gap-3\">\n <div className=\"min-w-[280px]\">\n <div className=\"mb-2 flex items-center justify-between gap-3\">\n <span className=\"font-semibold text-slate-700\">{label}</span>\n <div className=\"flex items-center gap-2\">\n <button\n className=\"cursor-move rounded border border-slate-200 bg-white px-2 py-1 text-[11px] font-semibold text-slate-600 transition hover:border-me-primary-300 hover:text-me-primary-600\"\n type=\"button\"\n onPointerDown={startPanelDrag}\n onPointerMove={dragPanel}\n onPointerUp={stopPanelDrag}\n onPointerCancel={stopPanelDrag}\n >\n <MoveIcon />\n </button>\n <span className=\"text-slate-400\">\n {Math.round(box.width)} x {Math.round(box.height)}\n </span>\n </div>\n </div>\n\n {hidePositionControls ? null : (\n <div className=\"space-y-2\">\n <div className=\"flex flex-wrap gap-2\">\n {showRepositionButton && onStartReposition ? (\n <PositionButton onPress={onStartReposition} label=\"Reposition\" primary />\n ) : null}\n\n {isRepositioning && onStopReposition ? (\n <PositionButton onPress={onStopReposition} label=\"Stop moving\" />\n ) : null}\n\n <PositionButton\n onPress={() =>\n setBox({\n x: 0,\n y: 0,\n width: canvasWidth,\n height: canvasHeight,\n })\n }\n label=\"Fill\"\n />\n\n <PositionButton\n onPress={() =>\n setBox({\n x: Math.round(canvasWidth * 0.1),\n y: Math.round(canvasHeight * 0.1),\n width: Math.round(canvasWidth * 0.8),\n height: Math.round(canvasHeight * 0.8),\n })\n }\n label=\"Centre\"\n />\n\n <PositionButton\n onPress={() =>\n setBox({\n x: 0,\n y: 0,\n width: halfWidth,\n height: canvasHeight,\n })\n }\n label=\"Left\"\n />\n\n <PositionButton\n onPress={() =>\n setBox({\n x: halfWidth,\n y: 0,\n width: halfWidth,\n height: canvasHeight,\n })\n }\n label=\"Right\"\n />\n\n <PositionButton\n onPress={() =>\n setBox({\n x: 0,\n y: 0,\n width: canvasWidth,\n height: halfHeight,\n })\n }\n label=\"Top\"\n />\n\n <PositionButton\n onPress={() =>\n setBox({\n x: 0,\n y: halfHeight,\n width: canvasWidth,\n height: halfHeight,\n })\n }\n label=\"Bottom\"\n />\n </div>\n\n {showBoxFields ? <TargetBoxFields box={box} onChange={setBox} /> : null}\n </div>\n )}\n </div>\n\n {children ? <div className=\"w-full border-t border-slate-200 pt-3\">{children}</div> : null}\n </div>\n </div>\n );\n}\n\nfunction TargetBoxFields({ box, onChange }: { box: SlideContentBox; onChange: (box: SlideContentBox) => void }) {\n const updateBoxField = (field: keyof SlideContentBox, value: string) => {\n const numericValue = Number(value);\n\n if (!Number.isFinite(numericValue)) {\n return;\n }\n\n onChange({\n ...box,\n [field]: Math.round(numericValue),\n });\n };\n\n return (\n <div className=\"grid grid-cols-4 gap-2 pt-1\">\n <NumberField label=\"X\" value={box.x} onChange={(value) => updateBoxField(\"x\", value)} />\n <NumberField label=\"Y\" value={box.y} onChange={(value) => updateBoxField(\"y\", value)} />\n <NumberField label=\"W\" value={box.width} onChange={(value) => updateBoxField(\"width\", value)} />\n <NumberField label=\"H\" value={box.height} onChange={(value) => updateBoxField(\"height\", value)} />\n </div>\n );\n}\n\nfunction NumberField({ label, value, onChange }: { label: string; value: number; onChange: (value: string) => void }) {\n return (\n <label className=\"block text-[11px] font-semibold text-slate-500\">\n {label}\n <input\n className=\"mt-1 w-full rounded border border-slate-200 bg-white px-1.5 py-1 text-xs text-slate-900 outline-none focus:border-me-primary-400 focus:ring-1 focus:ring-me-primary-100\"\n type=\"number\"\n value={Math.round(value)}\n onChange={(event) => onChange(event.target.value)}\n />\n </label>\n );\n}\n\nfunction createTourStepAnnotation(vault: any, canvas: any, annotationPageId: string, target: any) {\n const timestamp = Date.now();\n const random = Math.random().toString(36).slice(2, 8);\n const annotationId = `${annotationPageId}/tour-step/${timestamp}-${random}`;\n const bodyId = `${annotationId}/body/en`;\n const annotationPage = vault.get?.({ id: annotationPageId, type: \"AnnotationPage\" }) || {};\n const existingItems = Array.isArray(annotationPage?.items) ? annotationPage.items : [];\n\n const updateVault = () => {\n vault.dispatch(\n importEntities({\n entities: {\n ContentResource: {\n [bodyId]: {\n id: bodyId,\n type: \"TextualBody\",\n language: \"en\",\n format: \"text/html\",\n value: DEFAULT_TOUR_STEP_HTML,\n },\n },\n Annotation: {\n [annotationId]: {\n id: annotationId,\n type: \"Annotation\",\n motivation: \"tagging\",\n body: [{ id: bodyId, type: \"ContentResource\" }],\n target,\n },\n },\n },\n }),\n );\n\n vault.dispatch(\n addMappings({\n mapping: {\n [bodyId]: \"ContentResource\",\n [annotationId]: \"Annotation\",\n },\n }),\n );\n\n vault.modifyEntityField({ id: annotationPageId, type: \"AnnotationPage\" }, \"items\", [\n ...existingItems,\n { id: annotationId, type: \"Annotation\" },\n ]);\n };\n\n if (vault.batch) {\n vault.batch(updateVault);\n } else {\n updateVault();\n }\n\n return annotationId;\n}\n\ntype TourStepShape =\n | {\n type: \"box\";\n x: number;\n y: number;\n width: number;\n height: number;\n }\n | {\n type: \"circle\";\n cx: number;\n cy: number;\n r: number;\n }\n | {\n type: \"line\";\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n }\n | {\n type: \"polygon\";\n points: Array<{ x: number; y: number }>;\n };\n\nfunction TourStepTargetDrawingOverlay({\n annotationPageId,\n canvas,\n mode,\n selectedTool,\n setSelectedTool,\n vault,\n onCancel,\n onComplete,\n}: {\n annotationPageId: string;\n canvas: any;\n mode: { type: \"add\" } | { type: \"edit\"; annotationId: string };\n selectedTool: \"box\" | \"circle\" | \"line\" | \"polygon\";\n setSelectedTool: (tool: \"box\" | \"circle\" | \"line\" | \"polygon\") => void;\n vault: any;\n onCancel: () => void;\n onComplete: (annotationId?: string) => void;\n}) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [startPoint, setStartPoint] = useState<{ x: number; y: number } | null>(null);\n const [draftShape, setDraftShape] = useState<TourStepShape | null>(null);\n const [polygonPoints, setPolygonPoints] = useState<Array<{ x: number; y: number }>>([]);\n\n const canvasWidth = Number(canvas?.width) || 1920;\n const canvasHeight = Number(canvas?.height) || 1080;\n\n const getPoint = (event: ReactPointerEvent<SVGSVGElement>) => {\n const svg = svgRef.current;\n if (!svg) {\n return { x: 0, y: 0 };\n }\n\n const point = svg.createSVGPoint();\n point.x = event.clientX;\n point.y = event.clientY;\n\n const matrix = svg.getScreenCTM()?.inverse();\n const transformed = matrix ? point.matrixTransform(matrix) : point;\n\n return {\n x: clamp(Math.round(transformed.x), 0, canvasWidth),\n y: clamp(Math.round(transformed.y), 0, canvasHeight),\n };\n };\n\n const startDrawing = (event: ReactPointerEvent<SVGSVGElement>) => {\n event.preventDefault();\n\n if (selectedTool === \"polygon\") {\n const nextPoint = getPoint(event);\n setPolygonPoints((points) => [...points, nextPoint]);\n return;\n }\n\n const point = getPoint(event);\n setStartPoint(point);\n setDraftShape(null);\n };\n\n const updateDrawing = (event: ReactPointerEvent<SVGSVGElement>) => {\n if (!startPoint || selectedTool === \"polygon\") {\n return;\n }\n\n const point = getPoint(event);\n\n if (selectedTool === \"box\") {\n setDraftShape({\n type: \"box\",\n x: Math.min(startPoint.x, point.x),\n y: Math.min(startPoint.y, point.y),\n width: Math.abs(point.x - startPoint.x),\n height: Math.abs(point.y - startPoint.y),\n });\n }\n\n if (selectedTool === \"circle\") {\n setDraftShape({\n type: \"circle\",\n cx: startPoint.x,\n cy: startPoint.y,\n r: Math.round(Math.sqrt((point.x - startPoint.x) ** 2 + (point.y - startPoint.y) ** 2)),\n });\n }\n\n if (selectedTool === \"line\") {\n setDraftShape({\n type: \"line\",\n x1: startPoint.x,\n y1: startPoint.y,\n x2: point.x,\n y2: point.y,\n });\n }\n };\n\n const stopDrawing = () => {\n setStartPoint(null);\n };\n\n const activeShape =\n selectedTool === \"polygon\" && polygonPoints.length\n ? ({\n type: \"polygon\",\n points: polygonPoints,\n } as TourStepShape)\n : draftShape;\n\n const clearDraft = () => {\n setStartPoint(null);\n setDraftShape(null);\n setPolygonPoints([]);\n };\n\n const saveTarget = () => {\n if (!activeShape) {\n return;\n }\n\n const target = makeTourStepTarget(canvas.id, activeShape);\n\n if (mode.type === \"edit\") {\n vault.modifyEntityField({ id: mode.annotationId, type: \"Annotation\" }, \"target\", target);\n\n onComplete(mode.annotationId);\n return;\n }\n\n const annotationId = createTourStepAnnotation(vault, canvas, annotationPageId, target);\n\n onComplete(annotationId);\n };\n\n return (\n <div className=\"absolute inset-0 z-30\">\n <svg\n ref={svgRef}\n className=\"absolute inset-0 h-full w-full cursor-crosshair touch-none\"\n preserveAspectRatio=\"xMidYMid meet\"\n viewBox={`0 0 ${canvasWidth} ${canvasHeight}`}\n onPointerDown={startDrawing}\n onPointerMove={updateDrawing}\n onPointerUp={stopDrawing}\n onPointerCancel={stopDrawing}\n >\n <rect x={0} y={0} width={canvasWidth} height={canvasHeight} fill=\"transparent\" />\n\n {activeShape ? <TourStepShapePreview shape={activeShape} /> : null}\n\n {polygonPoints.map((point, index) => (\n <circle\n key={`${point.x}-${point.y}-${index}`}\n cx={point.x}\n cy={point.y}\n r={8}\n fill=\"white\"\n stroke=\"#be4778\"\n strokeWidth={4}\n />\n ))}\n </svg>\n\n <div className=\"absolute left-4 top-4 z-40 flex flex-wrap items-center gap-2 rounded-lg bg-white/95 p-2 text-xs shadow-lg ring-1 ring-black/10\">\n <span className=\"mr-2 font-semibold text-slate-700\">\n {mode.type === \"add\" ? \"Draw new tour step\" : \"Edit target\"}\n </span>\n\n <DrawingToolButton\n active={selectedTool === \"box\"}\n label=\"Box\"\n onPress={() => {\n clearDraft();\n setSelectedTool(\"box\");\n }}\n />\n\n <DrawingToolButton\n active={selectedTool === \"circle\"}\n label=\"Circle\"\n onPress={() => {\n clearDraft();\n setSelectedTool(\"circle\");\n }}\n />\n\n <DrawingToolButton\n active={selectedTool === \"line\"}\n label=\"Line\"\n onPress={() => {\n clearDraft();\n setSelectedTool(\"line\");\n }}\n />\n\n <DrawingToolButton\n active={selectedTool === \"polygon\"}\n label=\"Polygon\"\n onPress={() => {\n clearDraft();\n setSelectedTool(\"polygon\");\n }}\n />\n\n <PositionButton primary label={mode.type === \"add\" ? \"Create step\" : \"Save target\"} onPress={saveTarget} />\n\n <PositionButton label=\"Clear\" onPress={clearDraft} />\n <PositionButton label=\"Cancel\" onPress={onCancel} />\n </div>\n </div>\n );\n}\n\nfunction DrawingToolButton({ active, label, onPress }: { active: boolean; label: string; onPress: () => void }) {\n return (\n <Button\n className={twMerge(\n \"rounded-md border px-2.5 py-1.5 font-semibold transition\",\n active\n ? \"border-me-primary-500 bg-me-primary-500 text-white\"\n : \"border-slate-200 bg-white text-slate-700 hover:border-me-primary-300 hover:bg-me-primary-50\",\n )}\n onPress={onPress}\n >\n {label}\n </Button>\n );\n}\n\nfunction TourStepShapePreview({ shape }: { shape: TourStepShape }) {\n const commonProps = {\n fill: \"rgba(190, 71, 120, 0.18)\",\n stroke: \"#be4778\",\n strokeWidth: 6,\n vectorEffect: \"non-scaling-stroke\" as const,\n };\n\n if (shape.type === \"box\") {\n return <rect {...commonProps} x={shape.x} y={shape.y} width={shape.width} height={shape.height} />;\n }\n\n if (shape.type === \"circle\") {\n return <circle {...commonProps} cx={shape.cx} cy={shape.cy} r={shape.r} />;\n }\n\n if (shape.type === \"line\") {\n return (\n <line\n x1={shape.x1}\n y1={shape.y1}\n x2={shape.x2}\n y2={shape.y2}\n stroke=\"#be4778\"\n strokeWidth={6}\n vectorEffect=\"non-scaling-stroke\"\n />\n );\n }\n\n return <polygon {...commonProps} points={shape.points.map((point) => `${point.x},${point.y}`).join(\" \")} />;\n}\n\nfunction makeTourStepTarget(canvasId: string, shape: TourStepShape) {\n if (shape.type === \"box\") {\n return `${canvasId}#xywh=${Math.round(shape.x)},${Math.round(\n shape.y,\n )},${Math.round(shape.width)},${Math.round(shape.height)}`;\n }\n\n return {\n source: canvasId,\n selector: {\n type: \"SvgSelector\",\n value: makeSvgSelectorValue(shape),\n },\n };\n}\n\nfunction makeSvgSelectorValue(shape: Exclude<TourStepShape, { type: \"box\" }>) {\n if (shape.type === \"circle\") {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"${Math.round(\n shape.cx,\n )}\" cy=\"${Math.round(shape.cy)}\" r=\"${Math.round(shape.r)}\" /></svg>`;\n }\n\n if (shape.type === \"line\") {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\"><line x1=\"${Math.round(\n shape.x1,\n )}\" y1=\"${Math.round(shape.y1)}\" x2=\"${Math.round(shape.x2)}\" y2=\"${Math.round(shape.y2)}\" /></svg>`;\n }\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\"><polygon points=\"${shape.points\n .map((point) => `${Math.round(point.x)},${Math.round(point.y)}`)\n .join(\" \")}\" /></svg>`;\n}\n\nfunction getTourStepTargetDrawingTool(annotation: any): \"box\" | \"circle\" | \"line\" | \"polygon\" {\n const selector = Array.isArray(annotation?.target?.selector)\n ? annotation.target.selector.find((item: any) => item?.type === \"SvgSelector\")\n : annotation?.target?.selector;\n\n if (selector?.type !== \"SvgSelector\") return \"box\";\n if (Array.isArray(selector.points) && selector.svgShape !== \"polyline\") {\n return \"polygon\";\n }\n return typeof selector.value === \"string\" && /<polygon\\b/i.test(selector.value) ? \"polygon\" : \"box\";\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction getLanguageMapValue(value: any, fallback = \"\") {\n if (!value) return fallback;\n if (typeof value === \"string\") return value;\n\n const values = value.en || value.none || Object.values(value).flat();\n\n if (Array.isArray(values) && values.length) {\n return String(values[0]);\n }\n\n return fallback;\n}\n\nfunction PositionButton({ label, onPress, primary }: { label: string; onPress: () => void; primary?: boolean }) {\n return (\n <Button\n className={twMerge(\n \"rounded-md border px-2.5 py-1.5 font-semibold transition\",\n primary\n ? \"border-me-primary-500 bg-me-primary-500 text-white hover:bg-me-primary-600\"\n : \"border-slate-200 bg-white text-slate-700 hover:border-me-primary-300 hover:bg-me-primary-50\",\n )}\n onPress={onPress}\n >\n {label}\n </Button>\n );\n}\n\nfunction PreviewModeButton({\n children,\n selected,\n onPress,\n}: {\n children: string;\n selected: boolean;\n onPress: () => void;\n}) {\n return (\n <Button\n className={twMerge(\n \"border-none px-3 py-2 transition\",\n selected ? \"bg-me-primary-500 text-white\" : \"bg-transparent text-slate-600 hover:bg-white\",\n )}\n onPress={onPress}\n >\n {children}\n </Button>\n );\n}\n\nfunction SlideStripItem({\n index,\n selected,\n onPress,\n onDelete,\n}: {\n index: number;\n selected: boolean;\n onPress: () => void;\n onDelete: () => void;\n}) {\n const canvas = useCanvas();\n\n return (\n <div\n className={twMerge(\n \"exhibition-slideshow-slide-card relative w-44 shrink-0 rounded-md border bg-white p-2 text-left transition\",\n selected ? \"border-me-primary-500 ring-2 ring-me-primary-200\" : \"border-slate-200 hover:border-me-primary-300\",\n )}\n >\n <Button className=\"block w-full border-none bg-transparent p-0 text-left\" onPress={onPress}>\n <div className=\"aspect-video overflow-hidden rounded\" style={{ backgroundColor: \"#0e0d12\" }}>\n <SlideshowSlidePreview className=\"pointer-events-none h-full w-full\" mode=\"preview\" />\n </div>\n <div className=\"mt-2 flex items-center gap-2 pr-7\">\n <span className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded bg-slate-100 text-xs font-semibold text-slate-600\">\n {index + 1}\n </span>\n <LocaleString className=\"min-w-0 truncate text-sm font-medium text-slate-800\">{canvas?.label}</LocaleString>\n </div>\n </Button>\n <Button\n className=\"absolute bottom-2 right-2 flex items-center gap-1 rounded border border-me-primary-100 bg-white px-2 py-1 text-xs font-semibold text-me-primary-500 shadow-sm transition hover:bg-me-primary-50\"\n aria-label={`Delete slide ${index + 1}`}\n onPress={onDelete}\n >\n Delete\n </Button>\n </div>\n );\n}\n","import * as ManifestPreset from \"@manifest-editor/manifest-preset\";\nimport { extendApp, mapApp } from \"@manifest-editor/shell\";\nimport { tourStepAnnotations } from \"../annotations/TourStepAnnotations\";\nimport { exhibitionBackgroundTask } from \"../background-panel\";\nimport { slideshowCanvasEditor } from \"../canvas-editors/slideshow-canvas-editor\";\nimport { slideshowCenterPanel } from \"../center-panels/SlideshowCenterPanel\";\nimport { imageBrowserSlideCreator } from \"../creators/image-browser-slide-creator\";\nimport { imageServiceSlideCreator } from \"../creators/image-service-slide-creator\";\nimport {\n slideshowImageOnlyCreator,\n slideshowImageTextCreator,\n} from \"../creators/image-slide-creator\";\nimport { imageUrlSlideCreator } from \"../creators/image-url-slide\";\nimport { slideshowLongEditorialCreator } from \"../creators/info-box-creator\";\nimport { slideshowVideoCreator } from \"../creators/video-slide-creator\";\nimport { slideshowYoutubeCreator } from \"../creators/youtube-slide-creator\";\nimport { exhibitionPresetConfig } from \"../exhibition-onboarding\";\nimport { slideshowGridLeftPanel } from \"../left-panels/ExhibitionGrid\";\nimport { exhibitionOverviewLeftPanel } from \"../left-panels/ExhibitionOverview\";\nimport { exhibitionThemeLeftPanel } from \"../left-panels/ExhibitionTheme\";\nimport { exhibitionCanvasEditor } from \"../right-panels/ExhibitionCanvasEditor\";\nimport { exhibitionSummaryEdtior } from \"../right-panels/ExhibitionSummaryEditor\";\nimport { exhibitionTourSteps } from \"../right-panels/ExhibitionTourSteps\";\nimport { slideshowWorkbenchEditor } from \"../right-panels/ExhibitionWorkbenchEditor\";\nimport { infoBoxWorkbenchEditor } from \"../right-panels/InfoBoxPanel\";\nimport { customBehaviourEditor } from \"../right-panels/SlideBehaviours\";\n\nexport const exhibitionEditorSlideshowPreset = extendApp(\n mapApp(ManifestPreset),\n {\n id: \"exhibition-slideshow-editor\",\n title: \"Exhibition Editor (slideshow)\",\n project: true,\n projectType: \"Manifest\",\n },\n {\n preset: exhibitionPresetConfig,\n config: {\n editorConfig: {\n Canvas: {\n singleTab: \"@exhibition/slideshow-workbench-editor\",\n hideTabs: [\n \"@manifest-editor/overview\",\n \"@manifest-editor/technical-properties\",\n \"@manifest-editor/linking-properties\",\n \"@manifest-editor/nav-place-editor\",\n \"@manifest-editor/canvas-structural\",\n \"@manifest-editor/descriptive-properties\",\n \"@manifest-editor/overview-canvas-editor\",\n \"@manifest-editor/metadata\",\n ],\n },\n },\n },\n leftPanels: [\n //\n slideshowGridLeftPanel,\n exhibitionThemeLeftPanel,\n // exhibitionOverviewLeftPanel,\n ],\n centerPanels: [\n //\n slideshowCenterPanel,\n ],\n annotations: [\n //\n tourStepAnnotations,\n ],\n leftPanelIds: [\"left-panel-manifest\"],\n background: [\n //\n exhibitionBackgroundTask,\n ],\n canvasEditors: [\n //\n slideshowCanvasEditor,\n ],\n editors: [\n //\n slideshowWorkbenchEditor,\n infoBoxWorkbenchEditor,\n exhibitionCanvasEditor,\n customBehaviourEditor,\n exhibitionSummaryEdtior,\n exhibitionTourSteps,\n ],\n creators: [\n imageBrowserSlideCreator,\n imageServiceSlideCreator,\n imageUrlSlideCreator,\n slideshowImageOnlyCreator,\n slideshowImageTextCreator,\n slideshowVideoCreator,\n slideshowYoutubeCreator,\n slideshowLongEditorialCreator,\n ],\n },\n);\n","import * as ManifestPreset from \"@manifest-editor/manifest-preset\";\nimport { extendApp, mapApp } from \"@manifest-editor/shell\";\n// import \"exhibition-viewer/dist/index.css\";\nimport \"./index.css\";\nimport { tourStepAnnotations } from \"./annotations/TourStepAnnotations\";\nimport { exhibitionBackgroundTask } from \"./background-panel\";\nimport { imageBlockEditor } from \"./canvas-editors/image-block-editor\";\nimport { infoBlockEditor } from \"./canvas-editors/info-block-editor\";\nimport { youtubeMainEdtior } from \"./canvas-editors/youtube-editor\";\nimport { exhibitionCenterPanel } from \"./center-panels/ExhibitionCenterPanel\";\nimport { exhibitionRemotePreviewPanel } from \"./center-panels/ExhibitionRemotePreviewPanel\";\nimport { imageBrowserSlideCreator } from \"./creators/image-browser-slide-creator\";\nimport { imageServiceSlideCreator } from \"./creators/image-service-slide-creator\";\nimport {\n imageSlideCreator,\n slideshowImageOnlyCreator,\n slideshowImageTextCreator,\n} from \"./creators/image-slide-creator\";\nimport { imageUrlSlideCreator } from \"./creators/image-url-slide\";\nimport { exhibitionPresetConfig } from \"./exhibition-onboarding\";\nimport { infoBoxCreator, slideshowLongEditorialCreator } from \"./creators/info-box-creator\";\nimport { slideshowVideoCreator, videoSlideCreator } from \"./creators/video-slide-creator\";\nimport { slideshowYoutubeCreator, youtubeSlideCreator } from \"./creators/youtube-slide-creator\";\nimport { exhibitionGridLeftPanel } from \"./left-panels/ExhibitionGrid\";\nimport { exhibitionOverviewLeftPanel } from \"./left-panels/ExhibitionOverview\";\nimport { exhibitionThemeLeftPanel } from \"./left-panels/ExhibitionTheme\";\nimport { exhibitionCanvasEditor } from \"./right-panels/ExhibitionCanvasEditor\";\nimport { exhibitionImageCropEditor } from \"./right-panels/ExhibitionImageCropEditor\";\nimport { exhibitionSummaryEdtior } from \"./right-panels/ExhibitionSummaryEditor\";\nimport { exhibitionTourSteps } from \"./right-panels/ExhibitionTourSteps\";\nimport { exhibitionWorkbenchEditor } from \"./right-panels/ExhibitionWorkbenchEditor\";\nimport { infoBoxWorkbenchEditor } from \"./right-panels/InfoBoxPanel\";\nimport { customBehaviourEditor } from \"./right-panels/SlideBehaviours\";\n\nexport { default as PresetIcon } from \"./icons/PresetIcon\";\nexport { imageServiceSlideCreator, type CreateImageServiceSlidePayload } from \"./creators/image-service-slide-creator\";\nexport { exhibitionEditorScrollingPreset } from \"./presets/scrolling-preset\";\nexport { exhibitionEditorSlideshowPreset } from \"./presets/slideshow-preset\";\nexport { useExhibitionPreviewWindow } from \"./components/ExhibitionPreviewPanel\";\n\nexport const exhibitionEditorPreset = extendApp(\n mapApp(ManifestPreset, (app) => ({\n ...app,\n layout: {\n ...app.layout,\n leftPanels: [\n exhibitionGridLeftPanel,\n ...app.layout.leftPanels.filter((panel) => panel.id === \"left-panel-manifest\"),\n ],\n },\n })),\n {\n id: \"exhibition-editor\",\n title: \"Exhibition Editor\",\n project: true,\n projectType: \"Manifest\",\n },\n {\n preset: exhibitionPresetConfig,\n config: {\n editorConfig: {\n Canvas: {\n hideTabs: [\n \"@manifest-editor/overview\",\n \"@manifest-editor/technical-properties\",\n \"@manifest-editor/linking-properties\",\n \"@manifest-editor/nav-place-editor\",\n \"@manifest-editor/canvas-structural\",\n \"@manifest-editor/descriptive-properties\",\n \"@manifest-editor/overview-canvas-editor\",\n \"@manifest-editor/metadata\",\n ],\n },\n },\n },\n leftPanels: [\n //\n // exhibitionOverviewLeftPanel,\n exhibitionThemeLeftPanel,\n ],\n centerPanels: [\n //\n exhibitionCenterPanel,\n exhibitionRemotePreviewPanel,\n ],\n annotations: [\n //\n tourStepAnnotations,\n ],\n leftPanelIds: [\"canvas-listing\", \"left-panel-manifest\"],\n background: [exhibitionBackgroundTask],\n canvasEditors: [\n //\n imageBlockEditor,\n youtubeMainEdtior,\n infoBlockEditor,\n ],\n editors: [\n //\n infoBoxWorkbenchEditor,\n exhibitionWorkbenchEditor,\n exhibitionCanvasEditor,\n exhibitionImageCropEditor,\n customBehaviourEditor,\n exhibitionSummaryEdtior,\n exhibitionTourSteps,\n ],\n creators: [\n infoBoxCreator,\n youtubeSlideCreator,\n imageServiceSlideCreator,\n imageBrowserSlideCreator,\n imageSlideCreator,\n imageUrlSlideCreator,\n videoSlideCreator,\n slideshowImageOnlyCreator,\n slideshowImageTextCreator,\n slideshowVideoCreator,\n slideshowYoutubeCreator,\n slideshowLongEditorialCreator,\n ],\n }\n);\n"],"mappings":"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OAAQ,CACN,aAAc,CACZ,OAAQ,CACN,UAAW,yCACX,SAAU,CACR,4BACA,wCACA,sCACA,oCACA,qCACA,0CACA,0CACA,2BACF,CACF,CACF,CACF,EACA,WAAY,CAEV,GACA,EAEF,EACA,aAAc,CAEZ,EACF,EACA,YAAa,CAEX,CACF,EACA,aAAc,CAAC,qBAAqB,EACpC,WAAY,CAEV,EACF,EACA,cAAe,CAEb,EACF,EACA,QAAS,CAEP,GACA,GACA,GACA,GACA,GACA,EACF,EACA,SAAU,CACR,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACF,CACF,CACF,ECzDa,IAAA,EAAyBC,EAAAA,UAAAA,EAAAA,EACpCC,EAAAA,OAAAA,CAAOC,EAAiB,IAAS,CAC/B,GAAG,EACH,OAAQ,CACN,GAAG,EAAI,OACP,WAAY,CACV,GACA,GAAG,EAAI,OAAO,WAAW,OAAQ,GAAU,EAAM,KAAO,qBAAqB,CAC/E,CACF,CACF,EAAE,EACF,CACE,GAAI,oBACJ,MAAO,oBACP,QAAS,GACT,YAAa,UACf,EACA,CACE,OAAQ,GACR,OAAQ,CACN,aAAc,CACZ,OAAQ,CACN,SAAU,CACR,4BACA,wCACA,sCACA,oCACA,qCACA,0CACA,0CACA,2BACF,CACF,CACF,CACF,EACA,WAAY,CAGV,EACF,EACA,aAAc,CAEZ,GACA,EACF,EACA,YAAa,CAEX,CACF,EACA,aAAc,CAAC,iBAAkB,qBAAqB,EACtD,WAAY,CAAC,EAAwB,EACrC,cAAe,CAEb,GACA,GACA,EACF,EACA,QAAS,CAEP,GACA,GACA,GACA,GACA,GACA,GACA,EACF,EACA,SAAU,CACR,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACF,CACF,CACF"}