@manifest-editor/components 1.4.3 → 2.0.1-next.0.ede7d58

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.js","names":["className","className","bounds: DOMRect","className","imagesToRender: { image: FixedSizeImage; target: BoxSelector | TemporalBoxSelector }[]","getValue","className","React","TooltipTrigger","TooltipContent","className","className","RAForm","HandleContainer","className","className","bodiesToRender: any[]","BaseMDXEditor","className","value","listener: any","className","IconHandle","className","className","className","className","className","className","ResizeHandle","className","className","hidden","Tabs","TabList","Tab","TabPanel","MoreMenu","BaseTabs","className","BaseTabList","BaseTab","BaseTabPanel","className","className","className"],"sources":["../src/AccessibilityButton.tsx","../src/ActionButton.tsx","../src/AtlasBanner.tsx","../src/CanvasLabel.tsx","../src/Card3D.tsx","../src/icons/TextIcon.tsx","../src/Spinner.tsx","../src/LazyThumbnail.tsx","../src/utils.ts","../src/CanvasThumbnailGridItem.tsx","../src/icons/CollectionIcon.tsx","../src/CollectionListItem.tsx","../src/ConfirmSelectionButton.tsx","../src/ControlButton.tsx","../src/CreatorGrid.tsx","../src/icons/DownloadIcon.tsx","../src/Tooltip.tsx","../src/DownloadButton.tsx","../src/EmptyState.tsx","../src/ErrorMessage.tsx","../src/Forms.tsx","../src/HandleContainer.tsx","../src/HTMLAnnotationBodyRender.tsx","../src/MDXEditor.tsx","../src/HTMLEditor.tsx","../src/hooks/use-fast-list.ts","../src/hooks/use-local-storage.ts","../src/hooks/use-grid-options.tsx","../src/hooks/use-load-more-items.tsx","../src/IconButton.tsx","../src/IconHandle.tsx","../src/IIIFMediaPlayer.tsx","../src/InfoMessage.tsx","../src/ItemWithHandle.tsx","../src/icons/AddIcon.tsx","../src/icons/AddImageIcon.tsx","../src/icons/AnnotationPopInIcon.tsx","../src/icons/AnnotationPopOutIcon.tsx","../src/icons/AudioIcon.tsx","../src/icons/BackIcon.tsx","../src/icons/CheckIcon.tsx","../src/icons/CloseIcon.tsx","../src/icons/CreateCanvasIcon.tsx","../src/icons/DeleteForeverIcon.tsx","../src/icons/DeleteIcon.tsx","../src/icons/EditTextIcon.tsx","../src/icons/EmptyCanvasIcon.tsx","../src/icons/GridIcon.tsx","../src/icons/HTMLIcon.tsx","../src/icons/IIIFBrowserIcon.tsx","../src/icons/IIIFLogo.tsx","../src/icons/ImageListIcon.tsx","../src/icons/InfoIcon.tsx","../src/icons/ListEditIcon.tsx","../src/icons/ListingIcon.tsx","../src/icons/ManifestIcon.tsx","../src/icons/MoreMenu.tsx","../src/icons/PreviewIcon.tsx","../src/icons/RangesIcon.tsx","../src/icons/ResetIcon.tsx","../src/icons/ResizeHandleIcon.tsx","../src/icons/ScaledImageIcon.tsx","../src/icons/TargetIcon.tsx","../src/icons/VideoIcon.tsx","../src/icons/YouTubeIcon.tsx","../src/ListResizeDragHandle.tsx","../src/ManifestEditorLogo.tsx","../src/ManifestListItem.tsx","../src/ManifestOverviewEmptyState.tsx","../src/MetadataContainer.tsx","../src/Modal.tsx","../src/MoreMenuButton.tsx","../src/OnboardingTour.tsx","../src/OpaqueControls.tsx","../src/PaddedSidebarContainer.tsx","../src/PanelSideMenuItem.tsx","../src/PanelSideMenu.tsx","../src/RenderTextualContent.tsx","../src/ResizeHandle.tsx","../src/SelectionCheckbox.tsx","../src/Sidebar.tsx","../src/SidebarTabs.tsx","../src/icons/DrawIcon.tsx","../src/icons/HexagonIcon.tsx","../src/icons/LineBoxIcon.tsx","../src/icons/LineIcon.tsx","../src/icons/PolygonIcon.tsx","../src/icons/ShapesIcon.tsx","../src/icons/SquareIcon.tsx","../src/icons/TriangleIcon.tsx","../src/SvgControlBar.tsx","../src/Tabs.tsx","../src/ThumbnailGridContainer.tsx","../src/ProviderImage.tsx","../src/ProviderLink.tsx","../src/ViewProvider.tsx","../src/WarningMessage.tsx"],"sourcesContent":["import { Button, ButtonProps } from \"react-aria-components\";\n\nexport function AccessibilityButton({ className, children, ...props }: ButtonProps & { className?: string }) {\n return (\n <Button className={[\"sr-only focus:not-sr-only p-2 bg-white text-black\", className].join(\" \")} {...props}>\n {children}\n </Button>\n );\n}\n","import { Button, type ButtonProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function ActionButton({\n className,\n primary,\n center,\n large,\n onDark,\n children,\n ...props\n}: { primary?: boolean; onDark?: boolean; center?: boolean; large?: boolean } & ButtonProps) {\n return (\n <Button\n className={(t) =>\n twMerge(\n //\n \"border-none flex gap-1 items-center bg-me-50 flex-nowrap whitespace-nowrap text-me-700 text-sm rounded hover:bg-me-100\",\n primary && !onDark ? \"bg-me-500 text-white hover:bg-me-600\" : \"\",\n primary && onDark ? \"bg-me-700 text-white hover:bg-me-800\" : \"\",\n center ? \"place-content-center\" : \"\",\n large ? \"px-4 py-2\" : \"px-2 py-1\",\n t.isDisabled ? \"opacity-70 cursor-not-allowed pointer-events-none\" : \"\",\n typeof className === \"string\" ? className : className?.(t),\n )\n }\n {...props}\n >\n {children}\n </Button>\n );\n}\n","import { ReactNode } from \"react\";\n\nexport function AtlasBanner({ children, controlsId }: { controlsId: string; children: ReactNode }) {\n return (\n <div className=\"bg-me-gray-100 border-b text-black p-1 flex gap-4 items-center h-12\">\n <div className=\"px-4\">{children}</div>\n <div id={controlsId || \"atlas-controls\"} className=\"flex gap-2\" />\n </div>\n );\n}\n","import { LocaleString, useCanvas } from \"react-iiif-vault\";\n\nexport function CanvasLabel(props: { className?: string; as?: string }) {\n const canvas = useCanvas();\n if (!canvas) return null;\n return (\n <LocaleString className={props.className} as={props.as}>\n {canvas.label}\n </LocaleString>\n );\n}\n","import { useLayoutEffect, useRef } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function Card3D({\n className,\n shouldTranslate,\n children,\n ...props\n}: { shouldTranslate?: boolean } & React.HTMLAttributes<HTMLDivElement>) {\n const outer = useRef<HTMLDivElement>(null);\n const inner = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (!outer.current || !inner.current) return;\n\n let bounds: DOMRect;\n function rotateToMouse(e: MouseEvent) {\n const mouseX = e.clientX;\n const mouseY = e.clientY;\n const leftX = mouseX - bounds.x;\n const topY = mouseY - bounds.y;\n const center = {\n x: leftX - bounds.width / 2,\n y: topY - bounds.height / 2,\n };\n const distance = Math.sqrt(center.x ** 2 + center.y ** 2);\n\n if (shouldTranslate) {\n outer.current!.style.transform = `\n scale3d(1.07, 1.07, 1.07)\n rotate3d(\n ${center.y / 100},\n ${-center.x / 100},\n 0,\n ${Math.log(distance) * 2}deg\n )\n `;\n }\n\n inner.current!.style.backgroundImage = `\n radial-gradient(\n circle at\n ${center.x * 2 + bounds.width / 2}px\n ${center.y * 2 + bounds.height / 2}px,\n #ffffff66,\n #ffffff00\n )\n `;\n }\n\n function reset() {\n outer.current!.style.transform = \"\";\n inner.current!.style.backgroundImage = \"\";\n }\n\n let isActive = false;\n\n const mouseenter = () => {\n bounds = outer.current!.getBoundingClientRect();\n isActive = true;\n };\n\n const mouseleave = () => {\n isActive = false;\n reset();\n };\n\n const mousemove = (e: MouseEvent) => {\n if (!isActive) return;\n rotateToMouse(e);\n };\n\n outer.current.addEventListener(\"mouseenter\", mouseenter);\n outer.current.addEventListener(\"mouseleave\", mouseleave);\n outer.current.addEventListener(\"mousemove\", mousemove);\n\n return () => {\n outer.current!.removeEventListener(\"mouseenter\", mouseenter);\n outer.current!.removeEventListener(\"mouseleave\", mouseleave);\n outer.current!.removeEventListener(\"mousemove\", mousemove);\n };\n }, []);\n\n return (\n <div\n ref={outer}\n className={twMerge(\n //\n \"relative transition-all hover:duration-50\",\n shouldTranslate && \"hover:shadow-xl\",\n className\n )}\n {...props}\n >\n {children}\n <div\n className=\"pointer-events-none absolute inset-0 transition-all\"\n style={{\n backgroundImage: \"radial-gradient(circle at 50% -20%, #ffffff00, #ffffff00)\",\n }}\n ref={inner}\n />\n </div>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport function TextIcon(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>Text</title>\n <path\n fill=\"currentColor\"\n d=\"M3 21v-2h18v2zm0-4v-2h12v2zm0-4v-2h18v2zm0-4V7h12v2zm0-4V3h18v2z\"\n />\n </svg>\n );\n}\n","import * as React from \"react\";\n\nexport function Spinner(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 42 42\"\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"currentColor\"\n {...props}\n >\n <g transform=\"translate(2 2)\" strokeWidth={5} fill=\"none\" fillRule=\"evenodd\">\n <circle strokeOpacity={0.5} cx={18} cy={18} r={18} />\n <path d=\"M36 18c0-9.94-8.06-18-18-18\">\n <animateTransform\n attributeName=\"transform\"\n type=\"rotate\"\n from=\"0 18 18\"\n to=\"360 18 18\"\n dur=\"1s\"\n repeatCount=\"indefinite\"\n />\n </path>\n </g>\n </svg>\n );\n}\n","import { type BoxSelector, createThumbnailHelper, type FixedSizeImage, type TemporalBoxSelector } from \"@iiif/helpers\";\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { useCanvas, useRenderingStrategy, useStrategy, useThumbnail, useVault } from \"react-iiif-vault\";\nimport { LazyLoadComponent } from \"react-lazy-load-image-component\";\nimport { twMerge } from \"tailwind-merge\";\nimport { TextIcon } from \"./icons/TextIcon\";\nimport { Spinner } from \"./Spinner\";\n\nexport function LazyThumbnail({ cover, fade = true }: { cover?: boolean; fade?: boolean }) {\n return (\n <LazyLoadComponent>\n <LazyThumbnailOuter cover={cover} fade={fade} />\n </LazyLoadComponent>\n );\n}\n\nconst renderCache = new Map<string, string>();\n\nfunction LazyThumbnailOuter({ cover, fade = true }: { cover?: boolean; fade?: boolean }) {\n const [strategy] = useRenderingStrategy();\n\n if (strategy.type === \"images\" && strategy.images.length > 1) {\n return <ComplexCanvasThumbnail cover={cover} fade={fade} />;\n }\n\n if (strategy.type === \"textual-content\") {\n return (\n <div className=\"text-black/30 flex items-center justify-center h-full bg-me-gray-100 animate-fadeInDelayed absolute inset-0\">\n <TextIcon className=\"w-16 h-16\" />\n </div>\n );\n }\n\n return <LazyThumbnailInner cover={cover} fade={fade} />;\n}\n\nfunction LazyThumbnailInner({ cover, fade = true }: { cover?: boolean; fade?: boolean }) {\n const img = useRef<HTMLImageElement>(null);\n const canvas = useCanvas();\n const isCached = canvas ? !!renderCache.get(canvas?.id) : false;\n const [isLoading, setIsLoading] = useState(!isCached);\n const thumbnail = useThumbnail({ height: 256, width: 256 }, true);\n let thumbnailId = thumbnail?.id;\n\n if (canvas?.id && thumbnailId) {\n renderCache.set(canvas.id, thumbnailId);\n } else if (canvas?.id && renderCache.get(canvas.id)) {\n thumbnailId = renderCache.get(canvas?.id);\n }\n\n useEffect(() => {\n if (thumbnailId && !isCached) {\n setIsLoading(true);\n }\n }, [thumbnailId, isCached]);\n\n const checkImage = useCallback(\n (node: HTMLImageElement) => {\n if (node && !isCached) {\n if (node.complete || node.naturalWidth > 0) {\n setIsLoading(false);\n }\n }\n },\n [isCached],\n );\n\n return (\n <div className={`w-full h-full relative`}>\n {thumbnail?.id ? (\n <img\n onLoad={() => setIsLoading(false)}\n ref={checkImage}\n src={thumbnail?.id}\n alt=\"\"\n className={`select-none w-full h-full ${cover ? \"object-cover\" : \"object-contain\"} ${!isLoading ? (isCached ? \"\" : \"animate-fadeIn\") : \"opacity-0\"}`}\n />\n ) : (\n <ThumbnailFallback />\n )}\n {!thumbnail?.id || isLoading ? (\n <div\n className={twMerge(\n \"absolute inset-0 flex items-center justify-center bg-me-gray-100 text-2xl z-10\",\n fade && \"animate-fadeIn\",\n )}\n >\n <Spinner />\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction ThumbnailFallback() {\n const [strategy] = useRenderingStrategy();\n\n if (strategy.type === \"textual-content\") {\n return (\n <div className=\"text-black/30 flex items-center justify-center h-full bg-me-gray-100 animate-fadeInDelayed absolute inset-0\">\n <TextIcon className=\"w-16 h-16\" />\n </div>\n );\n }\n\n return (\n <div className=\"text-black/30 flex items-center justify-center h-full bg-me-gray-100 animate-fadeInDelayed absolute inset-0\">\n No thumbnail\n </div>\n );\n}\n\nfunction ComplexCanvasThumbnail({ cover, fade = true }: { cover?: boolean; fade?: boolean }) {\n const canvas = useCanvas();\n const [strategy] = useRenderingStrategy();\n const vault = useVault();\n const helper = useMemo(() => {\n return createThumbnailHelper(vault);\n }, [vault]);\n const [state, setState] = useState<{\n canvasId: string | null;\n imagesToRender: { image: FixedSizeImage; target: BoxSelector | TemporalBoxSelector }[];\n }>({\n canvasId: null,\n imagesToRender: [],\n });\n\n useEffect(() => {\n const abort = new AbortController();\n\n (async () => {\n if (!canvas || strategy.type !== \"images\" || strategy.images.length <= 1) {\n return;\n }\n\n const imagesToRender: { image: FixedSizeImage; target: BoxSelector | TemporalBoxSelector }[] = [];\n for (const image of strategy.images) {\n const resource = image.annotation.body[0] ? vault.get(image.annotation.body[0]) : image.annotation;\n await helper\n .getBestThumbnailAtSize(resource, {\n width: 256,\n height: 256,\n maxWidth: 768,\n maxHeight: 768,\n unsafeImageService: true,\n allowUnsafe: true,\n returnAllOptions: true,\n })\n .then((thumbnail) => {\n if (abort.signal.aborted) return;\n if (thumbnail.best?.type === \"fixed\") {\n // @todo this is broken.\n if (thumbnail.best.id.includes(\"/full/full/\")) {\n imagesToRender.push({\n image: {\n ...thumbnail.best,\n id: thumbnail.best.id.replace(\"/full/full/\", \"/full/256,/\"),\n },\n target: image.target,\n });\n return;\n }\n\n imagesToRender.push({\n image: thumbnail.best,\n target: image.target,\n });\n }\n });\n\n if (abort.signal.aborted) return;\n\n setState({\n canvasId: canvas.id,\n imagesToRender,\n });\n }\n })().catch((err) => {\n // ignore.\n });\n\n return () => {\n abort.abort();\n };\n }, [strategy, helper]);\n\n if (!state || !canvas || state.canvasId !== canvas?.id) {\n return (\n <div\n className={twMerge(\n \"absolute inset-0 flex items-center justify-center bg-me-gray-100 text-2xl z-10\",\n fade && \"animate-fadeIn\",\n )}\n >\n <Spinner />\n </div>\n );\n }\n\n return (\n <div className=\"flex items-center justify-center w-full h-full\">\n <div\n className=\"relative overflow-hidden margin-auto h-full w-full basis-[content] bg-white\"\n style={{\n aspectRatio: `${canvas.width / canvas.height}`,\n }}\n >\n {state.imagesToRender.map((image) => {\n return (\n <div\n className=\"absolute\"\n key={image.image.id}\n style={{\n width: `${(image.target.spatial.width / canvas.width) * 100}%`,\n height: `${(image.target.spatial.height / canvas.height) * 100}%`,\n top: `${(image.target.spatial.y / canvas.height) * 100}%`,\n left: `${(image.target.spatial.x / canvas.width) * 100}%`,\n }}\n >\n <img className=\"w-full h-full object-cover select-none\" src={image.image.id} />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const cn = (...inputs: ClassValue[]) => {\n return twMerge(clsx(inputs));\n};\n","import type { InternationalString } from \"@iiif/presentation-3\";\nimport { useRef } from \"react\";\nimport { useDrag, useDraggableItem, usePress } from \"react-aria\";\nimport { CanvasContext } from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\nimport { CanvasLabel } from \"./CanvasLabel\";\nimport { Card3D } from \"./Card3D\";\nimport { LazyThumbnail } from \"./LazyThumbnail\";\nimport { cn } from \"./utils\";\n\ninterface CanvasThumbnailGridItemProps {\n onClick?: () => void;\n id: string;\n selected?: boolean;\n active?: boolean;\n className?: string;\n icon?: React.ReactNode;\n hideLabel?: boolean;\n containerProps?: any;\n dragState?: any;\n customLabel?: (opts: { className: string; children: InternationalString }) => React.ReactNode;\n}\nexport function CanvasThumbnailGridItem(props: CanvasThumbnailGridItemProps) {\n const { dragProps } = useDrag({\n isDisabled: !props.dragState,\n getItems() {\n return [\n {\n \"text/plain\": JSON.stringify(props.dragState),\n },\n ];\n },\n });\n\n return (\n <CanvasContext canvas={props.id}>\n <div\n {...(props.dragState ? dragProps : {})}\n onClick={props.onClick}\n className={twMerge(\"flex flex-col\", props.className)}\n data-canvas-selected={props.selected}\n {...(props.containerProps || {})}\n >\n <div className=\"bg-me-gray-100 relative w-full aspect-square group flex-1 overflow-hidden rounded\">\n <Card3D\n data-canvas-selected={props.active}\n aria-selected={props.active}\n className={cn(\n \"border-2 border-transparent p-1 w-full h-full rounded select-none\",\n props.selected && \"border-me-primary-500\",\n )}\n >\n <LazyThumbnail />\n </Card3D>\n {props.icon || null}\n </div>\n {props.hideLabel ? null : props.customLabel ? (\n props.customLabel({ className: \"text-sm text-center truncate mt-1\" })\n ) : (\n <CanvasLabel className=\"text-sm text-center truncate mt-1\" as=\"div\" />\n )}\n </div>\n </CanvasContext>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport function CollectionIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 -960 960 960\"\n aria-label=\"collection\"\n role=\"img\"\n {...props}\n >\n <path\n d=\"M320-320h480v-480h-80v280l-100-60-100 60v-280H320v480Zm0 80q-33 0-56.5-23.5T240-320v-480q0-33 23.5-56.5T320-880h480q33 0 56.5 23.5T880-800v480q0 33-23.5 56.5T800-240H320ZM160-80q-33 0-56.5-23.5T80-160v-560h80v560h560v80H160Zm360-720h200-200Zm-200 0h480-480Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import { LocaleString, useCollection } from \"react-iiif-vault\";\nimport { CollectionIcon } from \"./icons/CollectionIcon\";\nimport { usePress } from \"react-aria\";\nimport { getValue } from \"@iiif/helpers/i18n\";\n\nexport function CollectionListItem({ isActive, onAction }: { isActive: boolean; onAction: () => void }) {\n const collection = useCollection({} as any);\n const { pressProps } = usePress({\n onPress: onAction,\n });\n\n return (\n <li\n aria-label={getValue(collection?.label)}\n className=\"border-b-2 border-b-gray-200 flex p-2 gap-3 text-left truncate items-center w-full hover:bg-gray-100 data-[active]:bg-gray-200 data-[active]:border-b-me-primary-500\"\n data-active={isActive || undefined}\n {...pressProps}\n >\n <CollectionIcon\n data-active={isActive || undefined}\n className=\"flex-shrink-0 text-2xl data-[active]:text-me-primary-500 text-gray-400\"\n />\n <LocaleString>{collection?.label}</LocaleString>\n </li>\n );\n}\n","import { ReactNode } from \"react\";\nimport { Button } from \"react-aria-components\";\n\nexport function ConfirmSelectionButton({ onPress, children }: { onPress: () => void; children: ReactNode }) {\n return (\n <Button className=\"bg-me-primary-500 px-3 py-1 hover:bg-me-primary-600 text-white rounded\" onPress={onPress}>\n {children}\n </Button>\n );\n}\n","import { cn } from \"./utils\";\n\nexport function ControlButton({\n children,\n className,\n ...props\n}: React.PropsWithChildren<React.ButtonHTMLAttributes<HTMLButtonElement>>) {\n return (\n <button\n className={cn(\n \"bg-white border border-me-primary-500 text-xs py-1 px-2 rounded text-me-primary-600 hover:bg-me-primary-50\",\n className\n )}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { ListBox, ListBoxItem } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function CreatorGrid(props: {\n label: string;\n items: CreatorGridItemProps[];\n}) {\n return (\n <ListBox\n orientation=\"horizontal\"\n aria-label={props.label}\n selectionMode=\"single\"\n items={props.items}\n className=\"grid grid-sm gap-4 p-4 mb-8\"\n >\n {(item) => <CreatorGridItem {...item} />}\n </ListBox>\n );\n}\n\nexport interface CreatorGridItemProps {\n id: string;\n icon: ReactNode;\n title: string;\n description: string;\n onClick: () => void;\n}\n\nfunction CreatorGridItem(props: CreatorGridItemProps) {\n return (\n <ListBoxItem\n id={props.id}\n onAction={props.onClick}\n className={($s) =>\n twMerge(\n \"bg-white p-2 border-me-gray-300 rounded-md border hover:border-me-primary-500\",\n $s.isFocused &&\n \"border-me-primary-500 outline-me-primary-500 outline-2\",\n )\n }\n >\n <div className=\"rounded bg-me-gray-300 mb-2 flex items-center justify-center py-1 aspect-square\">\n <div className=\"text-center [&>svg]:w-16 [&>svg]:h-16\">\n {props.icon}\n </div>\n </div>\n <div className=\"text-center font-semibold text-sm\">{props.title}</div>\n <div className=\"text-sm text-center text-black/50\">\n {props.description}\n </div>\n </ListBoxItem>\n );\n}\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\nconst DownloadIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" fill=\"#5f6368\" viewBox=\"0 -960 960 960\" {...props}>\n <path\n d=\"M480-320 280-520l56-58 104 104v-326h80v326l104-104 56 58-200 200ZM240-160q-33 0-56.5-23.5T160-240v-120h80v120h480v-120h80v120q0 33-23.5 56.5T720-160H240Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport { DownloadIcon };\n","import type { Placement, UseInteractionsReturn } from \"@floating-ui/react\";\nimport {\n autoUpdate,\n FloatingPortal,\n flip,\n offset,\n shift,\n useDismiss,\n useFloating,\n useFocus,\n useHover,\n useInteractions,\n useMergeRefs,\n useRole,\n} from \"@floating-ui/react\";\nimport type { UseFloatingReturn } from \"@floating-ui/react-dom\";\nimport * as React from \"react\";\nimport { Button } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\ninterface TooltipOptions {\n initialOpen?: boolean;\n placement?: Placement;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport function useTooltip({\n initialOpen = false,\n placement = \"top\",\n open: controlledOpen,\n onOpenChange: setControlledOpen,\n}: TooltipOptions = {}): {\n open: boolean;\n setOpen: (open: boolean) => void;\n} & UseFloatingReturn &\n UseInteractionsReturn {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(initialOpen);\n\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = setControlledOpen ?? setUncontrolledOpen;\n\n const data = useFloating({\n placement,\n open,\n onOpenChange: setOpen,\n whileElementsMounted: autoUpdate,\n middleware: [\n offset(5),\n flip({\n crossAxis: placement.includes(\"-\"),\n fallbackAxisSideDirection: \"start\",\n padding: 5,\n }),\n shift({ padding: 5 }),\n ],\n });\n\n const context = data.context;\n\n const hover = useHover(context, {\n move: false,\n enabled: controlledOpen == null,\n });\n const focus = useFocus(context, {\n enabled: controlledOpen == null,\n });\n const dismiss = useDismiss(context);\n const role = useRole(context, { role: \"tooltip\" });\n\n const interactions = useInteractions([hover, focus, dismiss, role]);\n\n return React.useMemo(\n () => ({\n open,\n setOpen,\n ...interactions,\n ...data,\n }),\n [open, setOpen, interactions, data],\n );\n}\n\ntype ContextType = ReturnType<typeof useTooltip> | null;\n\nconst TooltipContext = React.createContext<ContextType>(null);\n\nconst useTooltipContext = () => {\n const context = React.useContext(TooltipContext);\n\n if (context == null) {\n throw new Error(\"Tooltip components must be wrapped in <Tooltip />\");\n }\n\n return context;\n};\n\nexport function Tooltip({ children, ...options }: { children: React.ReactNode } & TooltipOptions) {\n // This can accept any props as options, e.g. `placement`,\n // or other positioning options.\n const tooltip = useTooltip(options);\n return <TooltipContext.Provider value={tooltip}>{children}</TooltipContext.Provider>;\n}\n\nexport const TooltipTrigger = React.forwardRef<\n HTMLElement,\n React.HTMLProps<HTMLElement> & { asChild?: boolean; onPress?: any; as?: any; $dir?: any }\n>(function TooltipTrigger({ children, as: Component, asChild = false, ...props }, propRef) {\n const context = useTooltipContext();\n const childrenRef = (children as any).ref;\n const ref = useMergeRefs([context.refs.setReference, propRef, childrenRef]);\n\n // `asChild` allows the user to pass any element as the anchor\n if (asChild && React.isValidElement(children)) {\n return React.cloneElement(\n children,\n context.getReferenceProps({\n ref,\n ...props,\n ...children.props,\n \"data-state\": context.open ? \"open\" : \"closed\",\n }),\n );\n }\n\n const Btn = (Component as typeof Button) || Button;\n\n return (\n <Btn\n ref={ref}\n // The user can style the trigger based on the state\n data-state={context.open ? \"open\" : \"closed\"}\n {...context.getReferenceProps(props)}\n >\n {children}\n </Btn>\n );\n});\n\nexport const TooltipContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLProps<HTMLDivElement> & { root?: HTMLElement }\n>(function TooltipContent({ style, root, ...props }, propRef) {\n const context = useTooltipContext();\n const ref = useMergeRefs([context.refs.setFloating, propRef]);\n\n if (!context.open) return null;\n\n return (\n <FloatingPortal root={root}>\n <div\n ref={ref}\n style={{\n ...context.floatingStyles,\n ...style,\n }}\n {...context.getFloatingProps(props)}\n />\n </FloatingPortal>\n );\n});\n\nexport function DefaultTooltipContent(props: { className?: string; root?: HTMLElement; children: React.ReactNode }) {\n return (\n <TooltipContent\n root={props.root}\n className={twMerge(\"bg-me-gray-900 text-white text-sm px-3 py-2 rounded opacity-90 z-50\", props.className)}\n >\n {props.children}\n </TooltipContent>\n );\n}\n","import { Button } from \"react-aria-components\";\nimport { DownloadIcon } from \"./icons/DownloadIcon\";\nimport { useId } from \"react-aria\";\nimport { Tooltip, DefaultTooltipContent, TooltipTrigger } from \"./Tooltip\";\n\ninterface DownloadButtonProps {\n getData: () => any;\n fileName: string;\n id?: string;\n fileType?: string;\n label?: string;\n}\n\nexport function DownloadButton({ label, id: _id, getData, fileName, fileType }: DownloadButtonProps) {\n const id = useId(_id);\n return (\n <Tooltip placement=\"bottom\">\n <TooltipTrigger\n className=\"bg-me-gray-100 hover:bg-me-primary-500 hover:text-white p-1 rounded-md text-me-primary-500 text-2xl\"\n aria-label={label}\n id={id}\n onPress={() => createDownload(getData(), fileName, fileType)}\n >\n <DownloadIcon aria-labelledby={_id} />\n <DefaultTooltipContent>{label}</DefaultTooltipContent>\n </TooltipTrigger>\n </Tooltip>\n );\n}\n\nexport function createDownload(data: any, fileName: string, fileType = \"text/json\") {\n // Create a blob with the data we want to download as a file\n const blob = data instanceof Blob ? data : new Blob([data], { type: fileType });\n // Create an anchor element and dispatch a click event on it\n // to trigger a download\n const a = document.createElement(\"a\");\n a.download = fileName;\n a.href = window.URL.createObjectURL(blob);\n const clickEvt = new MouseEvent(\"click\", {\n view: window,\n bubbles: true,\n cancelable: true,\n });\n a.dispatchEvent(clickEvt);\n a.remove();\n}\n","import { cn } from \"./utils\";\n\nexport function EmptyState(props: { children: React.ReactNode; $noMargin?: boolean; $box?: boolean }) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center text-gray-400 text-md\",\n props.$noMargin ? \"\" : \"m-4\",\n props.$box ? \"p-4 border border-gray-200 rounded\" : \"\"\n )}\n >\n {props.children}\n </div>\n );\n}\n","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\ninterface ErrorMessageProps {\n children: React.ReactNode;\n small?: boolean;\n className?: string;\n}\n\n// export const ErrorMessage = styled.div<{ $small?: boolean }>`\n// border: 2px solid ${(props: any) => props.theme.color.danger || \"red\"};\n// width: 100%;\n// border-radius: 5px;\n// padding: ${(props: any) => props.theme.padding.small || \"0.5rem\"}\n// ${(props: any) => props.theme.padding.medium || \"1rem\"};\n// line-height: 1.9em;\n// display: flex;\n// align-items: center;\n// a {\n// color: ${(props: any) => props.theme.color.white || \"white\"};\n// }\n// ${(props) =>\n// props.$small &&\n// css`\n// font-size: 0.75em;\n// white-space: nowrap;\n// padding: ${props.theme.padding.xs || \"0.25rem\"} ${props.theme.padding.small || \"0.5rem\"};\n// line-height: 1.6em;\n// width: fit-content;\n// `}\n// `;\n\nexport function ErrorMessage({ children, small = false, className }: ErrorMessageProps) {\n return (\n <div\n className={\n twMerge(\n 'bg-red-500 text-white',\n 'border-1 drop-shadow border-red-700 w-full rounded-md py-2 px-4 leading-[1.9em] flex items-center',\n 'has-[a]:text-white',\n small && 'text-xs whitespace-nowrap py-1 px-2 leading-[1.6em] w-fit',\n className\n )\n }\n >\n {children}\n </div >\n );\n};\n","import { Input, Label, type LabelProps, Form as RAForm, Radio, RadioGroup, TextArea } from \"react-aria-components\";\nimport { cn } from \"./utils\";\n\nfunction MeLabel({ className, ...props }: LabelProps) {\n return (\n <Label\n className={cn(\n //\n \"font-semibold text-sm\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction MeRadioGroup({ className, ...props }: any) {\n return (\n <RadioGroup\n className={cn(\n //\n \"\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction MeRadio({ className, ...props }: any) {\n return (\n <Radio\n className={(state) =>\n cn(\n //\n \"outline outline-me-primary-500 outline-offset-2 w-5 h-5 rounded-full bg-white transition-all border-[7px] border-gray-700 group-pressed:border-gray-800 outline-0\",\n className,\n )\n }\n {...props}\n />\n );\n}\n\nfunction MeForm({ className, ...props }: any) {\n return (\n <RAForm\n className={cn(\n //\n \"\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction MeInput({ className, ...props }: any) {\n return (\n <Input\n className={cn(\n //\n \"p-2 bg-me-gray-100 border-b border-b-me-gray-500\",\n \"focus:ring-0 outline-0 focus:border-me-primary-500 focus:bg-[#ECEEF5]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction MeTextArea({ className, ...props }: any) {\n return (\n <TextArea\n className={cn(\n //\n \"p-2 bg-me-gray-100 border-b border-b-me-gray-500\",\n \"focus:ring-0 outline-0 focus:border-me-primary-500 focus:bg-[#ECEEF5]\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction MeInputContainer({\n horizontal,\n className,\n ...props\n}: React.HTMLProps<HTMLDivElement> & { horizontal?: boolean }) {\n return (\n <div\n className={cn(\n //\n \"flex flex-col gap-2\",\n horizontal && \"flex-row\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport const Form = {\n Input: MeInput,\n Form: MeForm,\n Label: MeLabel,\n InputContainer: MeInputContainer,\n RadioGroup: MeRadioGroup,\n Radio: MeRadio,\n TextArea: MeTextArea,\n};\n","import { forwardRef } from \"react\";\n\nexport const HandleContainer = forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(function HandleContainer({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n className={`relative text-2xl flex p-0.5 rounded-sm aspect-square hover:bg-me-primary-100 aria-expanded:bg-me-primary-500 aria-expanded:text-white ${className || \"\"}`}\n {...props}\n />\n );\n});\n","import { useMemo } from \"react\";\nimport { useAnnotation } from \"react-iiif-vault\";\n\nexport function HTMLAnnotationBodyRender({\n className,\n locale,\n}: {\n className?: string;\n locale?: string;\n}) {\n const annotation = useAnnotation();\n\n const htmlValues = useMemo(() => {\n if (!annotation?.body) return [];\n\n let bodiesToRender: any[] = [];\n\n if (locale && annotation) {\n const filteredBodies = annotation.body.filter((body: any) => {\n const language = Array.isArray(body.language)\n ? body.language[0]\n : body.language;\n return language === locale;\n });\n\n if (filteredBodies.length) {\n bodiesToRender = filteredBodies;\n } else {\n bodiesToRender = [annotation.body[0]];\n }\n } else {\n bodiesToRender = annotation.body;\n }\n\n return bodiesToRender\n .filter((body) => body)\n .map((body: any) => body.value)\n .filter(Boolean);\n }, [locale, annotation]);\n\n return (\n <div className={className}>\n {htmlValues.map((htmlValue: string, idx) => {\n return (\n <div\n key={idx}\n className=\"prose-headings:mt-1 prose-headings:mb-1 prose-sm\"\n >\n <div dangerouslySetInnerHTML={{ __html: htmlValue }} />\n </div>\n );\n })}\n </div>\n );\n}\n","import \"@mdxeditor/editor/style.css\";\nimport {\n MDXEditor as BaseMDXEditor,\n BlockTypeSelect,\n BoldItalicUnderlineToggles,\n CreateLink,\n DiffSourceToggleWrapper,\n InsertCodeBlock,\n InsertImage,\n ListsToggle,\n type MDXEditorMethods,\n type MDXEditorProps,\n UndoRedo,\n codeBlockPlugin,\n codeMirrorPlugin,\n diffSourcePlugin,\n headingsPlugin,\n imagePlugin,\n linkDialogPlugin,\n linkPlugin,\n listsPlugin,\n quotePlugin,\n thematicBreakPlugin,\n toolbarPlugin,\n} from \"@mdxeditor/editor\";\nimport { type ForwardedRef, useMemo } from \"react\";\n\n// Only import this to the next file\nexport function MDXEditor({\n editorRef,\n ...props\n}: { editorRef?: ForwardedRef<MDXEditorMethods> | null } & MDXEditorProps) {\n return (\n <BaseMDXEditor\n plugins={useMemo(\n () => [\n // Example Plugin Usage\n headingsPlugin({ allowedHeadingLevels: [2, 3] }),\n listsPlugin(),\n linkPlugin(),\n quotePlugin(),\n thematicBreakPlugin(),\n linkDialogPlugin(),\n imagePlugin(),\n diffSourcePlugin(),\n toolbarPlugin({\n toolbarClassName: \"mdx-toolbar\",\n toolbarContents: () => (\n <>\n {\" \"}\n <UndoRedo />\n <BoldItalicUnderlineToggles />\n <BlockTypeSelect />\n <ListsToggle options={[\"bullet\", \"number\"]} />\n <CreateLink />\n <InsertImage />\n </>\n ),\n }),\n ],\n [],\n )}\n {...props}\n ref={editorRef}\n />\n );\n}\n","import type { MDXEditorMethods } from \"@mdxeditor/editor\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Converter } from \"showdown\";\nimport { useDebounce } from \"tiny-use-debounce\";\nimport TurndownService from \"turndown\";\nimport { MDXEditor } from \"./MDXEditor\";\nimport { twMerge } from \"tailwind-merge\";\n\nconst converter = new Converter();\nconverter.setFlavor(\"github\");\n\nconst turndownService = new TurndownService();\n\nexport function HTMLEditor({\n className,\n value,\n onChange,\n disabled,\n}: {\n className?: string;\n value: string;\n disabled?: boolean;\n onChange: (text: string) => void;\n}) {\n const editorRef = useRef<MDXEditorMethods>(null);\n const [_value, _setValue] = useState<any>(undefined);\n const internalOnChange = useCallback(() => {\n if (editorRef.current) {\n onChange(converter.makeHtml(editorRef.current.getMarkdown()));\n }\n }, []);\n const debounceSave = useDebounce(internalOnChange, 400);\n const memoState = useMemo(() => {\n return turndownService.turndown(value);\n }, []);\n\n useEffect(() => {\n const ref = editorRef.current;\n return () => {\n if (ref) {\n onChange(converter.makeHtml(ref.getMarkdown()));\n }\n };\n }, []);\n\n return (\n <MDXEditor\n editorRef={editorRef}\n onBlur={internalOnChange}\n readOnly={disabled}\n className={twMerge(\n [\n \"bg-white prose-sm text-sm border rounded prose-a:text-me-primary-500 prose-a:underline prose-ul:list-disc p-0.5\",\n \"prose-ol:list-decimal\",\n \"focus-within:outline-none focus-within:border-me-primary-500 z-50 relative\",\n ].join(\" \"),\n className\n )}\n markdown={memoState}\n suppressHtmlProcessing\n onError={(err) => {\n console.log(\"err\", err);\n }}\n onChange={(value) => {\n _setValue(value);\n debounceSave();\n }}\n />\n );\n}\n","import { useLayoutEffect, useState } from \"react\";\n\nexport function useFastList<T>(list: undefined | T[], firstRender = 24): T[] {\n const [isMounted, setIsMounted] = useState(false);\n useLayoutEffect(() => {\n if (list) {\n setTimeout(() => {\n setIsMounted(true);\n }, 0);\n }\n }, [list]);\n\n if (!list) {\n return [];\n }\n\n if (isMounted) {\n return list;\n }\n\n return list.slice(0, firstRender);\n}\n","import mitt from \"mitt\";\nimport { useEffect, useRef, useState } from \"react\";\n\n// @ts-expect-error\nglobalThis.MS_LS_EMITTER = globalThis.MS_LS_EMITTER || mitt();\n// @ts-expect-error\nconst lsEmitter = globalThis.MS_LS_EMITTER;\n\nexport function useOptionalLocalStorage<T>(\n key: string,\n initialValue?: T,\n disabled?: boolean,\n) {\n const [storedValue, setStoredValue] = useState<T | undefined>(initialValue);\n const [localStorageValue, setLocalStorageValue] = useLocalStorage(\n key,\n initialValue,\n );\n\n if (disabled) {\n return [storedValue, setStoredValue] as const;\n }\n return [localStorageValue, setLocalStorageValue] as const;\n}\n\nexport function useLocalStorage<T>(key: string, initialValue?: T) {\n const lastStoredValue = useRef<string>();\n\n if (!lastStoredValue.current && typeof initialValue !== \"undefined\") {\n lastStoredValue.current = JSON.stringify(initialValue);\n }\n\n // State to store our value\n // Pass initial state function to useState so logic is only executed once\n const [storedValue, setStoredValue] = useState<T>(() => {\n try {\n if (\n typeof window === \"undefined\" ||\n typeof window.localStorage === \"undefined\"\n ) {\n return initialValue as T;\n }\n // Get from local storage by key\n const item = window.localStorage.getItem(key);\n if (typeof item !== \"undefined\" && item !== null) {\n lastStoredValue.current = item;\n }\n // Parse stored json or if none return initialValue\n return item ? JSON.parse(item) : initialValue;\n } catch (error) {\n // If error also return initialValue\n console.log(error);\n return initialValue as T;\n }\n });\n\n // Return a wrapped version of useState's setter function that ...\n // ... persists the new value to localStorage.\n const setValue = (value: ((prev: T) => T) | T) => {\n try {\n if (\n typeof window !== \"undefined\" &&\n typeof window.localStorage !== \"undefined\"\n ) {\n let prev = initialValue;\n try {\n prev =\n typeof lastStoredValue.current === \"undefined\"\n ? initialValue\n : JSON.parse(lastStoredValue.current);\n } catch (e) {}\n\n // Allow value to be a function so we have same API as useState\n const valueToStore =\n value instanceof Function ? value(prev as any) : value;\n\n // Save state\n setStoredValue(valueToStore);\n const valueJson = JSON.stringify(valueToStore);\n // Save to local storage\n window.localStorage.setItem(key, valueJson);\n if (valueJson !== lastStoredValue.current) {\n // Store last changed value.\n lastStoredValue.current = valueJson;\n // Emit change for other hooks.\n lsEmitter.emit(`change:${key}`, { valueJson });\n }\n }\n } catch (error) {\n // A more advanced implementation would handle the error case\n console.log(error);\n }\n };\n\n // Detect adjacent hook changes.\n useEffect(() => {\n const listener: any = ({ valueJson }: { valueJson: string | null }) => {\n if (valueJson && valueJson !== lastStoredValue.current) {\n try {\n setStoredValue(JSON.parse(valueJson));\n lastStoredValue.current = valueJson;\n } catch (e) {\n // unknown error.\n }\n }\n };\n\n lsEmitter.on(`change:${key}`, listener);\n\n return () => {\n lsEmitter.off(`change:${key}`, listener);\n };\n }, [key]);\n\n return [storedValue, setValue, lastStoredValue] as const;\n}\n","import { ActionButton } from \"../ActionButton\";\nimport { useLocalStorage } from \"./use-local-storage\";\n\nexport function useGridOptions(\n //\n name?: string,\n options: {\n defaultGridSize?: \"grid-sm\" | \"grid-md\" | \"grid-lg\";\n onDark?: boolean;\n } = {},\n) {\n const { defaultGridSize = \"grid-md\", onDark = false } = options;\n const [size, setSize] = useLocalStorage<\"grid-sm\" | \"grid-md\" | \"grid-lg\">(\n name || \"default-grid-size\",\n defaultGridSize || \"grid-md\",\n );\n\n const component = (\n <div className=\"flex gap-2 items-center\" id=\"grid-options\">\n <div className={onDark ? \"opacity-90 text-white text-sm\" : \"opacity-90 text-sm\"}>Grid size:</div>\n <ActionButton onDark={onDark} primary={size === \"grid-sm\"} onPress={() => setSize(\"grid-sm\")}>\n Small\n </ActionButton>\n <ActionButton onDark={onDark} primary={size === \"grid-md\"} onPress={() => setSize(\"grid-md\")}>\n Medium\n </ActionButton>\n <ActionButton onDark={onDark} primary={size === \"grid-lg\"} onPress={() => setSize(\"grid-lg\")}>\n Large\n </ActionButton>\n </div>\n );\n\n return [{ size }, component] as const;\n}\n","import { useState, useMemo, useCallback } from \"react\";\n\nexport function useLoadMoreItems<T extends object>(\n items: T[],\n options: {\n batchSize: number;\n },\n) {\n const [index, setIndex] = useState(options.batchSize);\n\n const itemsFiltered = useMemo(() => {\n return items.slice(0, index);\n }, [items, index]);\n\n const loadMore = useCallback(() => {\n setIndex((prevIndex) => prevIndex + options.batchSize);\n }, [options.batchSize]);\n\n const intersector = useMemo(\n () => (\n <div\n style={{ width: 1, height: 1 }}\n ref={(intersectorRef) => {\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting) {\n loadMore();\n }\n },\n { root: intersectorRef?.parentElement, threshold: 0.1 },\n );\n\n if (intersectorRef) {\n observer.observe(intersectorRef);\n }\n\n return () => {\n if (intersectorRef) {\n observer.unobserve(intersectorRef);\n }\n };\n }}\n />\n ),\n [loadMore],\n );\n\n const isFullyLoaded = index >= items.length;\n\n const reset = () => {\n setIndex(options.batchSize);\n };\n\n return [\n isFullyLoaded ? items : itemsFiltered,\n {\n intersector: isFullyLoaded ? null : intersector,\n loadMore,\n isFullyLoaded,\n reset,\n },\n ] as const;\n}\n","import type { Placement } from \"@floating-ui/react-dom\";\nimport { twMerge } from \"tailwind-merge\";\nimport { DefaultTooltipContent, Tooltip, TooltipTrigger } from \"./Tooltip\";\n\nexport function IconButton({\n children,\n active,\n label,\n disabled,\n onPress,\n root,\n className,\n placement = \"top\",\n}: {\n children: React.ReactNode;\n onPress?: () => void;\n className?: string;\n active?: boolean;\n disabled?: boolean;\n label: string;\n placement?: Placement;\n root?: HTMLElement;\n}) {\n return (\n <Tooltip placement={placement}>\n <TooltipTrigger\n aria-label={label}\n onClick={onPress}\n className={twMerge(\n \"rounded flex items-center bg-white justify-center p-2 hover:bg-gray-100 text-2xl\",\n active ? \"bg-me-primary-500 bg-opacity-40 hover:bg-opacity-70 hover:bg-me-primary-500\" : \"\",\n disabled ? \"opacity-50 pointer-events-none\" : \"\",\n className\n )}\n >\n {children}\n <DefaultTooltipContent root={root} className=\"translate-x-3 z-50\">\n {label}\n </DefaultTooltipContent>\n </TooltipTrigger>\n </Tooltip>\n );\n}\n","import { forwardRef } from \"react\";\nimport { Button, type ButtonProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const IconHandle = forwardRef(function IconHandle(\n { className, ...props }: ButtonProps,\n ref: React.Ref<HTMLButtonElement>,\n) {\n return (\n <Button\n className={twMerge(\n \"transition-all mt-1 mb-1 opacity-0 transform scale-y-70 focus:ring focus:ring-me-500\",\n \"bg-white h-8 w-8 flex items-center justify-center rounded-full drop-shadow select-none group-hover:opacity-100 text-gray-500\",\n \"hover:text-me-500 hover:bg-me-100\",\n className as any,\n )}\n {...props}\n ref={ref}\n />\n );\n});\n","import \"@vidstack/react/player/styles/base.css\";\nimport \"@vidstack/react/player/styles/default/theme.css\";\nimport \"@vidstack/react/player/styles/default/captions.css\";\nimport \"@vidstack/react/player/styles/default/layouts/video.css\";\n\nimport { MediaPlayer, MediaProvider, Poster, Gesture, Track, type MediaPlayerInstance } from \"@vidstack/react\";\nimport { defaultLayoutIcons, DefaultVideoLayout } from \"@vidstack/react/player/layouts/default\";\nimport { getValue } from \"@iiif/helpers\";\nimport { useRef } from \"react\";\n\n// Things not to forget\n// - Annoucer translations\n\nexport interface IIIFMediaPlayerProps {\n canvas: { id: string };\n media: { duration: number; format: string; url: string };\n captions?: any[];\n poster?: string;\n startTime?: number;\n language?: string;\n}\n\nexport function IIIFMediaPlayer(props: IIIFMediaPlayerProps) {\n const mediaPlayer = useRef<MediaPlayerInstance>(null);\n const captions = props.captions || [];\n const language = props.language;\n const timeRef = useRef<number>(props.startTime || 0);\n\n return (\n\n <MediaPlayer\n onTimeUpdate={(time) => {\n const newT = Math.round(time.currentTime);\n if (timeRef.current === newT) return;\n timeRef.current = newT;\n }}\n ref={mediaPlayer}\n lang={language}\n className=\"h-full w-full min-w-[275px] flex radius-0\"\n playsInline\n currentTime={props.startTime}\n duration={props.media.duration}\n // Use the selector to clip it.\n // clipEndTime={...}\n // clipStartTime={...}\n src={[\n {\n src: props.media.url,\n type: props.media.format as any,\n },\n ]}\n >\n <MediaProvider className=\"w-full h-full [&>video]:w-full [&>video]:h-full [&>video]:object-contain\">\n {/* VTT */}\n {captions.map((caption: any) => {\n return (\n <Track\n key={caption.id}\n src={caption.id}\n kind=\"subtitles\"\n label={getValue(caption.label)}\n default={caption.language === language}\n language={caption.language}\n />\n );\n })}\n\n {/* Chapters from Ranges */}\n {/* {chapters.length ? (\n <Track content={chapters as any} type=\"json\" kind=\"chapters\" label=\"Chapters\" default />\n ) : null} */}\n {/* <Track content={exampleChapters} type=\"json\" kind=\"chapters\" label=\"Chapters\" default /> */}\n\n {/* This is the Placeholder Canvas from the IIIF Canvas */}\n {props.poster ? (\n <Poster\n className=\"absolute inset-0 bg-black block h-full w-full opacity-0 transition-opacity data-[visible]:opacity-100 object-contain\"\n src={props.poster}\n />\n ) : null}\n <Gestures />\n <DefaultVideoLayout\n className=\"z-1\"\n //\n noGestures\n icons={defaultLayoutIcons}\n />\n </MediaProvider>\n </MediaPlayer>\n );\n}\n\nfunction Gestures() {\n return (\n <>\n <Gesture\n className=\"pointer-coarse:hidden absolute top-0 start-12 bottom-20 right-0 -z-1 block\"\n event=\"pointerup\"\n action=\"toggle:paused\"\n />\n <Gesture className=\"absolute inset-0 z-0 block h-full w-full\" event=\"dblpointerup\" action=\"toggle:fullscreen\" />\n </>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\ninterface InfoMessageProps {\n children: React.ReactNode;\n small?: boolean;\n className?: string;\n}\n\nexport function InfoMessage({ children, small = false, className }: InfoMessageProps) {\n return (\n <div\n className={twMerge(\n \"bg-me-500 text-white\",\n \"border-1 drop-shadow border-me-700 w-full rounded-md py-2 px-4 leading-[1.9em] flex items-center\",\n \"has-[a]:text-white\",\n small && \"text-xs whitespace-nowrap py-1 px-2 leading-[1.6em] w-fit\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","export function ItemWithHandle({\n children,\n handle,\n actions,\n grid,\n}: {\n grid?: boolean;\n children: React.ReactNode;\n handle: React.ReactNode;\n actions?: React.ReactNode;\n}) {\n const gridStyleClassName = grid\n ? // Tailwind\n \"absolute flex p-1 gap-1 bg-white z-1 right-1 top-1 rounded\"\n : \"flex-shrink-0 flex items-center gap-1 px-1\";\n\n return (\n <div className={grid ? \"relative flex flex-col\" : \"flex items-center\"}>\n <div className=\"flex-1 min-w-0\" style={{ flex: 1, minWidth: 0 }}>\n {children}\n </div>\n <div className={gridStyleClassName}>\n {actions}\n {handle}\n </div>\n </div>\n );\n}\n","export function AddIcon({\n className,\n inline,\n height = 16,\n color = \"black\",\n}: {\n inline?: boolean;\n height?: number;\n className?: string;\n color?: string;\n}) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height={`${height}px`}\n viewBox=\"0 0 24 24\"\n width=\"24px\"\n fill={color}\n style={{ verticalAlign: inline ? \"bottom\" : undefined }}\n className={className}\n >\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\" fill=\"currentColor\" />\n </svg>\n );\n}\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\nconst AddImageIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" fill=\"#5f6368\" viewBox=\"0 -960 960 960\" {...props}>\n <path\n d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h360v80H200v560h560v-360h80v360q0 33-23.5 56.5T760-120H200Zm480-480v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80ZM240-280h480L570-480 450-320l-90-120-120 160Zm-40-480v560-560Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport { AddImageIcon };\n","export function AnnotationPopInIcon(props: React.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 {/* Icon from Material Symbols by Google - https://github.com/google/material-design-icons/blob/master/LICENSE */}\n <path\n fill=\"currentColor\"\n d=\"M5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h14q.825 0 1.413.588T21 5v14q0 .825-.587 1.413T19 21zm9-2V5H5v14z\"\n />\n </svg>\n );\n}\n","export function AnnotationPopOutIcon(props: React.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 {/* Icon from Material Symbols by Google - https://github.com/google/material-design-icons/blob/master/LICENSE */}\n <path\n fill=\"currentColor\"\n d=\"M4 20q-.825 0-1.413-.588T2 18V6q0-.825.588-1.413T4 4h16q.825 0 1.413.588T22 6v5h-2V6H4v12h11v2H4Zm7.075-5.5l1.425-1.425L9.4 10H12V8H6v6h2v-2.575l3.075 3.075ZM17 20v-7h5v7h-5Zm-5-8Z\"\n />\n </svg>\n );\n}\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\nconst AudioIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" fill=\"#5f6368\" viewBox=\"0 -960 960 960\" {...props}>\n <path\n d=\"M480-400q-50 0-85-35t-35-85v-240q0-50 35-85t85-35q50 0 85 35t35 85v240q0 50-35 85t-85 35Zm0-240Zm-40 520v-123q-104-14-172-93t-68-184h80q0 83 58.5 141.5T480-320q83 0 141.5-58.5T680-520h80q0 105-68 184t-172 93v123h-80Zm40-360q17 0 28.5-11.5T520-520v-240q0-17-11.5-28.5T480-800q-17 0-28.5 11.5T440-760v240q0 17 11.5 28.5T480-480Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport { AudioIcon };\n","import type { SVGProps } from \"react\";\n\nexport function BackIcon(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 {/* Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE */}\n <path fill=\"currentColor\" d=\"M20 11H7.83l5.59-5.59L12 4l-8 8l8 8l1.41-1.41L7.83 13H20z\" />\n </svg>\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 <path fill=\"currentColor\" d=\"M9 16.17L4.83 12l-1.42 1.41L9 19L21 7l-1.41-1.41z\"></path>\n </svg>\n );\n}\n","export function CloseIcon(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\n fill=\"currentColor\"\n d=\"M18.3 5.71a.996.996 0 0 0-1.41 0L12 10.59L7.11 5.7A.996.996 0 1 0 5.7 7.11L10.59 12L5.7 16.89a.996.996 0 1 0 1.41 1.41L12 13.41l4.89 4.89a.996.996 0 1 0 1.41-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4\"\n />\n </svg>\n );\n}\n","export function CreateCanvasIcon() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24\" viewBox=\"0 0 24 24\" width=\"24\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path\n d=\"M13 11h-2v3H8v2h3v3h2v-3h3v-2h-3zm1-9H6c-1.1 0-2 .9-2 2v16c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import * as React from \"react\";\n\nexport function DeleteForeverIcon(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg height=\"1em\" width=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path\n d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12 1.41 1.41L13.41 14l2.12 2.12-1.41 1.41L12 15.41l-2.12 2.12-1.41-1.41L10.59 14l-2.13-2.12zM15.5 4l-1-1h-5l-1 1H5v2h14V4z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","export function DeleteIcon(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\n fill=\"currentColor\"\n d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zm2.46-7.12l1.41-1.41L12 12.59l2.12-2.12l1.41 1.41L13.41 14l2.12 2.12l-1.41 1.41L12 15.41l-2.12 2.12l-1.41-1.41L10.59 14zM15.5 4l-1-1h-5l-1 1H5v2h14V4z\"\n />\n </svg>\n );\n}\n","export function EditTextIcon(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\n fill=\"currentColor\"\n d=\"M14 11c0 .55-.45 1-1 1H4c-.55 0-1-.45-1-1s.45-1 1-1h9c.55 0 1 .45 1 1M3 7c0 .55.45 1 1 1h9c.55 0 1-.45 1-1s-.45-1-1-1H4c-.55 0-1 .45-1 1m7 8c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1s.45 1 1 1h5c.55 0 1-.45 1-1m8.01-2.13l.71-.71a.996.996 0 0 1 1.41 0l.71.71c.39.39.39 1.02 0 1.41l-.71.71zm-.71.71l-5.16 5.16c-.09.09-.14.21-.14.35v1.41c0 .28.22.5.5.5h1.41c.13 0 .26-.05.35-.15l5.16-5.16z\"\n />\n </svg>\n );\n}\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\nconst EmptyCanvasIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" fill=\"#5f6368\" viewBox=\"0 -960 960 960\" {...props}>\n <path\n d=\"M240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520v-200H240v640h480v-440H520ZM240-800v200-200 640-640Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport { EmptyCanvasIcon };\n","import type { SVGProps } from \"react\";\n\nexport function GridIcon(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 {/* Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE */}\n <path\n fill=\"currentColor\"\n d=\"M10 10h4v4h-4zm0 6h4v4h-4zM4 4h4v4H4zm0 6h4v4H4zm0 6h4v4H4zM16 4h4v4h-4zm0 6h4v4h-4zm0 6h4v4h-4zM10 4h4v4h-4z\"\n opacity=\".3\"\n />\n <path\n fill=\"currentColor\"\n d=\"M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2M8 20H4v-4h4zm0-6H4v-4h4zm0-6H4V4h4zm6 12h-4v-4h4zm0-6h-4v-4h4zm0-6h-4V4h4zm6 12h-4v-4h4zm0-6h-4v-4h4zm0-6h-4V4h4z\"\n />\n </svg>\n );\n}\n","import { SVGProps } from \"react\";\nconst HTMLIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" fill=\"#5f6368\" viewBox=\"0 -960 960 960\" {...props}>\n <path\n d=\"M0-360v-240h60v80h80v-80h60v240h-60v-100H60v100H0Zm310 0v-180h-70v-60h200v60h-70v180h-60Zm170 0v-200q0-17 11.5-28.5T520-600h180q17 0 28.5 11.5T740-560v200h-60v-180h-40v140h-60v-140h-40v180h-60Zm320 0v-240h60v180h100v60H800Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport { HTMLIcon };\n","import { SVGProps } from \"react\";\nconst IIIFBrowserIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" fill=\"#5f6368\" viewBox=\"0 -960 960 960\" {...props}>\n <path\n d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h200v80H200v560h560v-214l80 80v134q0 33-23.5 56.5T760-120H200Zm40-160 120-160 90 120 120-160 150 200H240Zm622-144L738-548q-21 14-45 21t-51 7q-74 0-126-52.5T464-700q0-75 52.5-127.5T644-880q75 0 127.5 52.5T824-700q0 27-8 52t-20 46l122 122-56 56ZM644-600q42 0 71-29t29-71q0-42-29-71t-71-29q-42 0-71 29t-29 71q0 42 29 71t71 29Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport { IIIFBrowserIcon };\n","import { SVGProps } from \"react\";\nconst IIIFLogo = ({ mono = true, ...props }: SVGProps<SVGSVGElement> & { mono?: boolean }) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlSpace=\"preserve\"\n width=\"1em\"\n height=\"1em\"\n {...props}\n viewBox=\"0 0 493.36 441.333\"\n >\n <path\n d=\"m65.242 2178.75 710-263.75-1.25-1900-708.75 261.25v1902.5m738.903 461.34c81.441-240.91-26.473-436.2-241.04-436.2-214.558 0-454.511 195.29-535.953 436.2-81.433 240.89 26.48 436.18 241.039 436.18 214.567 0 454.512-195.29 535.954-436.18\"\n style={{\n fill: mono ? \"currentColor\" : \"#2873ab\",\n fillOpacity: 1,\n fillRule: \"nonzero\",\n stroke: \"none\",\n }}\n transform=\"matrix(.13333 0 0 -.13333 0 441.333)\"\n />\n <path\n d=\"M1678.58 2178.75 968.578 1915l1.25-1900 708.752 261.25v1902.5m-743.498 461.34c-81.437-240.91 26.477-436.2 241.038-436.2 214.56 0 454.51 195.29 535.96 436.2 81.43 240.89-26.48 436.18-241.04 436.18-214.57 0-454.52-195.29-535.958-436.18\"\n style={{\n fill: mono ? \"currentColor\" : \"#ed1d33\",\n fillOpacity: 1,\n fillRule: \"nonzero\",\n stroke: \"none\",\n }}\n transform=\"matrix(.13333 0 0 -.13333 0 441.333)\"\n />\n <path\n d=\"m1860.24 2178.75 710-263.75-1.25-1900-708.75 261.25v1902.5m743.5 461.34c81.45-240.91-26.47-436.2-241.03-436.2-214.58 0-454.52 195.29-535.96 436.2-81.44 240.89 26.48 436.18 241.03 436.18 214.57 0 454.51-195.29 535.96-436.18\"\n style={{\n fill: mono ? \"currentColor\" : \"#2873ab\",\n fillOpacity: 1,\n fillRule: \"nonzero\",\n stroke: \"none\",\n }}\n transform=\"matrix(.13333 0 0 -.13333 0 441.333)\"\n />\n <path\n d=\"M3700.24 3310v-652.5s-230 90-257.5-142.5c-2.5-247.5 0-336.25 0-336.25l257.5 83.75V1690l-258.61-92.5v-1335L2735.24 0v2360s-15 850 965 950\"\n style={{\n fill: mono ? \"currentColor\" : \"#ed1d33\",\n fillOpacity: 1,\n fillRule: \"nonzero\",\n stroke: \"none\",\n }}\n transform=\"matrix(.13333 0 0 -.13333 0 441.333)\"\n />\n </svg>\n);\nexport { IIIFLogo };\n","import type { SVGProps } from \"react\";\n\nexport function ImageListIcon(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 {/* Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE */}\n <path\n fill=\"currentColor\"\n d=\"M1 5h2v14H1zm4 0h2v14H5zm17 0H10c-.55 0-1 .45-1 1v12c0 .55.45 1 1 1h12c.55 0 1-.45 1-1V6c0-.55-.45-1-1-1M11 17l2.5-3.15L15.29 16l2.5-3.22L21 17z\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport function InfoIcon({ title, titleId, ...props }: SVGProps<SVGSVGElement> & { title?: string; titleId?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" aria-labelledby={titleId} {...props}>\n {title ? <title id={titleId}>{title}</title> : null}\n\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path\n d=\"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport function ListEditIcon({\n title,\n titleId,\n ...props\n}: SVGProps<SVGSVGElement> & { title?: string; titleId?: string }) {\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 aria-labelledby={titleId}\n {...props}\n >\n {title ? <title id={titleId}>{title}</title> : null}\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}\n","import type { SVGProps } from \"react\";\n\nexport function ListingIcon({\n title,\n titleId,\n ...props\n}: SVGProps<SVGSVGElement> & { title?: string; titleId?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n aria-labelledby={titleId}\n {...props}\n >\n {title ? <title id={titleId}>{title}</title> : null}\n\n <g fill=\"none\">\n <path d=\"M0 0h24v24H0V0z\" />\n <path d=\"M0 0h24v24H0V0z\" opacity=\".87\" />\n </g>\n <path\n d=\"M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7zm-4 6h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport function ManifestIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"20 -910 960 960\"\n aria-label=\"manifest\"\n role=\"img\"\n {...props}\n >\n <path\n d=\"M480-160q-48-38-104-59t-116-21q-42 0-82.5 11T100-198q-21 11-40.5-1T40-234v-482q0-11 5.5-21T62-752q46-24 96-36t102-12q58 0 113.5 15T480-740v484q51-32 107-48t113-16q36 0 70.5 6t69.5 18v-480q15 5 29.5 10.5T898-752q11 5 16.5 15t5.5 21v482q0 23-19.5 35t-40.5 1q-37-20-77.5-31T700-240q-60 0-116 21t-104 59Zm80-200v-380l200-200v400L560-360Zm-160 65v-396q-33-14-68.5-21.5T260-720q-37 0-72 7t-68 21v397q35-13 69.5-19t70.5-6q36 0 70.5 6t69.5 19Zm0 0v-396 396Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","export function MoreMenu(props: React.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 {/* Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE */}\n <path\n fill=\"currentColor\"\n d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2s-2 .9-2 2s.9 2 2 2m0 2c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2m0 6c-1.1 0-2 .9-2 2s.9 2 2 2s2-.9 2-2s-.9-2-2-2\"\n />\n </svg>\n );\n}\n\nexport const MoreMenuIcon = MoreMenu;\n","import type { SVGProps } from \"react\";\n\nexport function PreviewIcon(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 {/* Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE */}\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","export function RangesIcon(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\n fill=\"currentColor\"\n d=\"M17 4v16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2m-4-2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h9c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2m0 18H4V4h9zm8-14v12c.83 0 1.5-.67 1.5-1.5v-9c0-.83-.67-1.5-1.5-1.5\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport function ResetIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n <path\n d=\"M12 5V2L8 6l4 4V7c3.31 0 6 2.69 6 6 0 2.97-2.17 5.43-5 5.91v2.02c3.95-.49 7-3.85 7-7.93 0-4.42-3.58-8-8-8zM6 13c0-1.65.67-3.15 1.76-4.24L6.34 7.34A8.014 8.014 0 0 0 4 13c0 4.08 3.05 7.44 7 7.93v-2.02c-2.83-.48-5-2.94-5-5.91z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport function ResizeHandleIcon({ title, ...props }: SVGProps<SVGSVGElement> & { title?: string }) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" height=\"1em\" width=\"1em\" {...props}>\n <path fill=\"none\" d=\"M0 0h24v24H0z\" />\n <path d=\"M20 9H4v2h16V9zM4 15h16v-2H4v2z\" />\n {title ? <title>{title}</title> : null}\n </svg>\n );\n}\n","import type { SVGProps } from \"react\";\n\nexport function ScaledImageIcon(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 {/* Icon from Google Material Icons by Material Design Authors - https://github.com/material-icons/material-icons/blob/master/LICENSE */}\n <path\n fill=\"currentColor\"\n d=\"M21 15h2v2h-2zm0-4h2v2h-2zm2 8h-2v2c1 0 2-1 2-2M13 3h2v2h-2zm8 4h2v2h-2zm0-4v2h2c0-1-1-2-2-2M1 7h2v2H1zm16-4h2v2h-2zm0 16h2v2h-2zM3 3C2 3 1 4 1 5h2zm6 0h2v2H9zM5 3h2v2H5zm-4 8v8c0 1.1.9 2 2 2h12V11zm2 8l2.5-3.21l1.79 2.15l2.5-3.22L13 19z\"\n />\n </svg>\n );\n}\n","export function TargetIcon(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\n fill=\"currentColor\"\n d=\"M21 15h2v2h-2zm0-4h2v2h-2zm2 8h-2v2c1 0 2-1 2-2M13 3h2v2h-2zm8 4h2v2h-2zm0-4v2h2c0-1-1-2-2-2M1 7h2v2H1zm16-4h2v2h-2zm0 16h2v2h-2zM3 3C2 3 1 4 1 5h2zm6 0h2v2H9zM5 3h2v2H5zm-4 8v8c0 1.1.9 2 2 2h12V11zm2 8l2.5-3.21l1.79 2.15l2.5-3.22L13 19z\"\n />\n </svg>\n );\n}\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\nconst VideoIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" fill=\"#5f6368\" viewBox=\"0 -960 960 960\" {...props}>\n <path\n d=\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h480q33 0 56.5 23.5T720-720v180l160-160v440L720-420v180q0 33-23.5 56.5T640-160H160Zm0-80h480v-480H160v480Zm0 0v-480 480Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport { VideoIcon };\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\nconst YouTubeIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" fill=\"#5f6368\" viewBox=\"0 -960 960 960\" {...props}>\n <path\n d=\"M616-242q-27 1-51.5 1.5t-43.5.5h-41q-71 0-133-2-53-2-104.5-5.5T168-257q-26-7-45-26t-26-45q-6-23-9.5-56T82-447q-2-36-2-73t2-73q2-30 5.5-63t9.5-56q7-26 26-45t45-26q23-6 74.5-9.5T347-798q62-2 133-2t133 2q53 2 104.5 5.5T792-783q26 7 45 26t26 45q6 23 9.5 56t5.5 63q2 36 2 73v17q-19-8-39-12.5t-41-4.5q-83 0-141.5 58.5T600-320q0 21 4 40.5t12 37.5ZM400-400l208-120-208-120v240Zm360 200v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\nexport { YouTubeIcon };\n","import { Button } from \"react-aria-components\";\nimport { ResizeHandleIcon } from \"./icons/ResizeHandleIcon\";\n\nexport function ListResizeDragHandle() {\n return (\n <Button slot=\"drag\" className=\"rounded-sm cursor-move bg-transparent text-gray-500 hover:bg-gray-300\">\n <ResizeHandleIcon className=\"text-xl cursor-move\" />\n </Button>\n );\n}\n","import { SVGProps } from \"react\";\n\nexport function ManifestEditorLogo(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 206 27\" // Original viewBox\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"me-logo h-[23px] w-[176px]\"\n {...props}\n >\n <g fill=\"none\">\n <path\n d=\"M62.558 5.41v14.873h-2.983v-9.675l-3.985 9.675h-2.26l-4.006-9.675v9.675H46.34V5.41h3.388l4.73 11.06L59.19 5.41zm2.173 8.928c0-1.194.238-2.252.714-3.176.476-.923 1.123-1.633 1.94-2.13.816-.498 1.73-.746 2.738-.746.88 0 1.651.177 2.312.532.66.355 1.19.803 1.588 1.343V8.477h3.004v11.806h-3.004v-1.726c-.384.554-.913 1.012-1.588 1.374-.675.363-1.453.544-2.334.544-.994 0-1.9-.256-2.717-.767-.816-.512-1.463-1.233-1.939-2.163-.476-.93-.714-2-.714-3.207Zm9.292.042c0-.724-.143-1.346-.427-1.864a3.005 3.005 0 0 0-1.15-1.194 3.076 3.076 0 0 0-1.556-.415c-.554 0-1.066.135-1.534.405-.47.27-.85.664-1.14 1.182-.292.519-.437 1.133-.437 1.844 0 .71.145 1.331.437 1.864.29.533.674.941 1.15 1.226.476.284.984.426 1.524.426.554 0 1.073-.139 1.556-.416a3.005 3.005 0 0 0 1.15-1.193c.284-.519.427-1.14.427-1.865Zm12.466-6.073c1.406 0 2.543.444 3.41 1.332.866.888 1.3 2.127 1.3 3.718v6.926h-2.984v-6.52c0-.938-.234-1.66-.703-2.164-.47-.504-1.108-.756-1.918-.756-.824 0-1.474.252-1.95.756-.476.505-.714 1.226-.714 2.163v6.521h-2.983V8.477h2.983v1.47a4.121 4.121 0 0 1 1.524-1.203 4.713 4.713 0 0 1 2.035-.437Zm9.057-1.237c-.526 0-.963-.166-1.311-.5a1.657 1.657 0 0 1-.522-1.247c0-.497.174-.912.522-1.246.348-.334.785-.5 1.31-.5.526 0 .963.166 1.311.5.348.334.522.75.522 1.246 0 .498-.174.913-.522 1.247-.348.334-.785.5-1.31.5Zm1.47 1.407v11.806h-2.983V8.477h2.983Zm8.354 2.451h-2.068v9.355h-3.026v-9.355h-1.342v-2.45h1.342V7.88c0-1.45.412-2.515 1.236-3.197.824-.682 2.067-1.001 3.73-.959V6.24c-.725-.014-1.23.106-1.513.362-.284.256-.427.718-.427 1.385v.49h2.068v2.451Zm12.913 3.197c0 .426-.028.81-.085 1.15h-8.63c.07.853.369 1.52.895 2.003.525.483 1.172.725 1.939.725 1.108 0 1.896-.476 2.365-1.428h3.218c-.34 1.137-.994 2.07-1.96 2.802-.967.732-2.153 1.098-3.56 1.098-1.136 0-2.155-.252-3.057-.757a5.325 5.325 0 0 1-2.11-2.141c-.504-.924-.756-1.99-.756-3.197 0-1.222.248-2.294.745-3.218a5.204 5.204 0 0 1 2.089-2.13c.895-.498 1.925-.746 3.09-.746 1.122 0 2.127.241 3.015.724a5.1 5.1 0 0 1 2.067 2.057c.49.887.735 1.907.735 3.058Zm-3.09-.853c-.014-.767-.29-1.381-.83-1.843-.54-.462-1.201-.693-1.982-.693-.74 0-1.36.224-1.865.671-.504.448-.813 1.07-.927 1.865h5.604Zm9.782 7.203c-.966 0-1.833-.174-2.6-.522-.767-.348-1.375-.82-1.822-1.417a3.591 3.591 0 0 1-.735-1.982h3.004c.057.454.281.83.672 1.13.39.298.877.447 1.46.447.568 0 1.012-.114 1.331-.341.32-.227.48-.519.48-.874 0-.383-.196-.671-.586-.863-.391-.192-1.012-.401-1.865-.629-.88-.213-1.602-.433-2.163-.66a3.755 3.755 0 0 1-1.449-1.044c-.405-.47-.607-1.101-.607-1.897 0-.653.188-1.25.564-1.79.377-.54.917-.966 1.62-1.279.703-.312 1.53-.468 2.483-.468 1.406 0 2.528.351 3.367 1.054.838.704 1.3 1.652 1.385 2.845h-2.856c-.042-.469-.238-.841-.586-1.118-.348-.277-.813-.416-1.396-.416-.54 0-.955.1-1.246.298a.951.951 0 0 0-.437.831c0 .398.199.7.597.906.397.206 1.015.416 1.854.629.852.213 1.555.433 2.11.66a3.727 3.727 0 0 1 1.438 1.055c.405.476.614 1.105.628 1.886 0 .682-.188 1.293-.564 1.833-.377.54-.917.962-1.62 1.268-.703.305-1.524.458-2.461.458Zm10.569-9.547v5.711c0 .398.096.686.288.863.192.178.515.267.97.267h1.385v2.514h-1.875c-2.515 0-3.772-1.222-3.772-3.665v-5.69h-1.407v-2.45h1.407v-2.92h3.004v2.92h2.643v2.45h-2.643Zm12.851-3.111v3.73h5.007v2.364h-5.007v3.943h5.647v2.43h-8.631V5.386h8.63v2.43zm7.585 6.521c0-1.194.239-2.252.715-3.176.476-.923 1.126-1.633 1.95-2.13.824-.498 1.74-.746 2.749-.746.767 0 1.498.167 2.194.5.697.334 1.25.778 1.663 1.332V4.514h3.026v15.77h-3.026v-1.748c-.37.582-.888 1.051-1.556 1.406s-1.442.533-2.323.533a5.07 5.07 0 0 1-2.727-.767c-.824-.512-1.474-1.233-1.95-2.163-.476-.93-.714-2-.714-3.207Zm9.292.042c0-.724-.142-1.346-.426-1.864a3.005 3.005 0 0 0-1.151-1.194 3.076 3.076 0 0 0-1.556-.415 3.02 3.02 0 0 0-1.534.405c-.469.27-.849.664-1.14 1.182-.291.519-.437 1.133-.437 1.844 0 .71.146 1.331.437 1.864.291.533.675.941 1.15 1.226a2.93 2.93 0 0 0 1.524.426c.554 0 1.073-.139 1.556-.416a3.005 3.005 0 0 0 1.15-1.193c.285-.519.427-1.14.427-1.865Zm7.438-7.31c-.527 0-.963-.166-1.311-.5a1.657 1.657 0 0 1-.523-1.247c0-.497.174-.912.523-1.246.348-.334.784-.5 1.31-.5s.963.166 1.31.5c.349.334.523.75.523 1.246 0 .498-.174.913-.522 1.247-.348.334-.785.5-1.31.5Zm1.47 1.407v11.806h-2.984V8.477h2.984Zm6.414 2.451v5.711c0 .398.096.686.287.863.192.178.515.267.97.267h1.385v2.514h-1.875c-2.515 0-3.772-1.222-3.772-3.665v-5.69h-1.406v-2.45h1.406v-2.92h3.005v2.92h2.642v2.45h-2.642Zm10.036 9.547c-1.136 0-2.159-.252-3.068-.757a5.447 5.447 0 0 1-2.141-2.141c-.519-.924-.778-1.99-.778-3.197s.266-2.273.799-3.196a5.553 5.553 0 0 1 2.184-2.142c.924-.504 1.954-.756 3.09-.756 1.137 0 2.167.252 3.09.756a5.553 5.553 0 0 1 2.184 2.142c.533.923.8 1.989.8 3.196 0 1.208-.274 2.273-.821 3.197a5.681 5.681 0 0 1-2.216 2.141c-.93.505-1.971.757-3.122.757Zm0-2.6a3.1 3.1 0 0 0 1.524-.394c.476-.263.856-.657 1.14-1.183.285-.526.427-1.165.427-1.918 0-1.122-.295-1.985-.885-2.589a2.907 2.907 0 0 0-2.163-.906c-.852 0-1.566.302-2.141.906-.576.604-.863 1.467-.863 2.59 0 1.122.28 1.985.841 2.588.562.604 1.268.906 2.12.906Zm11.338-7.565a4.194 4.194 0 0 1 1.502-1.47c.618-.356 1.325-.533 2.12-.533v3.132h-.788c-.938 0-1.644.22-2.12.661-.476.44-.714 1.208-.714 2.302v5.881h-2.984V8.477h2.984v1.833Z\"\n fill=\"#000\"\n />\n <path fill=\"#E94581\" className=\"me-logo-1\" d=\"M0 13.343 13.343 0l13.343 13.343-13.343 13.343z\" />\n <path fill=\"#E94581\" className=\"me-logo-2\" d=\"M12.137 13.346 25.48.003l13.343 13.343L25.48 26.69z\" />\n <path fill=\"#C63E75\" className=\"me-logo-3\" d=\"m12.104 13.348 7.311-7.311 7.312 7.311-7.312 7.312z\" />\n </g>\n </svg>\n );\n}\n","import { LocaleString, useManifest } from \"react-iiif-vault\";\nimport { ManifestIcon } from \"./icons/ManifestIcon\";\nimport { usePress } from \"react-aria\";\nimport { getValue } from \"@iiif/helpers\";\n\nexport function ManifestListItem({ isActive, onAction }: { isActive: boolean; onAction: () => void }) {\n const manifest = useManifest();\n const { pressProps } = usePress({\n onPress: onAction,\n });\n\n return (\n <li\n aria-label={getValue(manifest?.label)}\n className=\"border-b-2 border-b-gray-200 flex p-2 gap-3 text-left truncate items-center w-full hover:bg-gray-100 data-[active]:bg-gray-200 data-[active]:border-b-me-primary-500\"\n data-active={isActive || undefined}\n {...pressProps}\n >\n <ManifestIcon\n data-active={isActive || undefined}\n className=\"flex-shrink-0 text-2xl data-[active]:text-me-primary-500 text-gray-400\"\n />\n <LocaleString>{manifest?.label}</LocaleString>\n </li>\n );\n}\n","import { Button } from \"react-aria-components\";\nimport { Card3D } from \"./Card3D\";\n\nexport function ManifestOverviewEmptyState({ onCreate, canCreate }: { onCreate: () => void; canCreate: boolean }) {\n return (\n <div className=\"flex items-center flex-col gap-5 py-16\">\n <Card3D\n shouldTranslate\n onClick={canCreate ? onCreate : undefined}\n className=\"border-2 border-dotted bg-black/5 aspect-[3/4] rounded w-32 border-black\"\n />\n <div className=\"font-bold text-lg\">Let's get started!</div>\n <div className=\"max-w-xl px-5 my-4\">\n Add a title and top level information for this manifest using the editing panel on the right, and then add some\n canvases and content.\n </div>\n {canCreate ? (\n <Button\n className=\"px-8 font-bold py-2 border rounded-lg border-me-primary-500 text-me-primary-500 hover:border-me-primary-600 hover:text-me-primary-600\"\n onPress={onCreate}\n >\n Start adding content\n </Button>\n ) : null}\n </div>\n );\n}\n","import { LocaleString } from \"react-iiif-vault\";\nimport { cn } from \"./utils\";\nimport { InternationalString } from \"@iiif/presentation-3\";\n\nexport function MetadataContainer({\n className,\n label,\n children,\n ...props\n}: { label: InternationalString | null } & React.HTMLAttributes<HTMLFieldSetElement>) {\n return (\n <fieldset\n className={cn(\n \"hover:ring ring-gray-200 focus-within:ring-me-primary-500 focus-within:ring p-2 rounded mb-2\",\n className\n )}\n {...props}\n >\n <LocaleString className=\"text-lg font-bold text-[#333] mb-2\" as={\"h3\"}>\n {label}\n </LocaleString>\n {children}\n </fieldset>\n );\n}\n","import {\n CloseButton,\n Description,\n Dialog,\n DialogPanel,\n DialogTitle,\n} from \"@headlessui/react\";\nimport { createPortal } from \"react-dom\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport interface ModalProps {\n id?: string;\n title: string | React.ReactNode;\n onClose: () => void;\n className?: string;\n open?: boolean;\n width?: number | string;\n height?: number | string;\n children: React.ReactNode;\n actions?: React.ReactNode;\n}\n\nexport function ModalBackSlot({ children }: { children: React.ReactNode }) {\n const element = document.getElementById(\"modal-back-slot\");\n\n if (!element) return null;\n\n return createPortal(children, element);\n}\n\nexport function Modal({\n id,\n className,\n title,\n open = true,\n onClose,\n actions,\n children,\n}: ModalProps) {\n return (\n <>\n <Dialog\n open={open}\n onClose={onClose}\n id={id}\n className=\"relative z-[1000002]\"\n >\n <div\n className={`fixed inset-0 bg-black/30 animate-fadeIn z-[1000003]`}\n aria-hidden=\"true\"\n />\n <div className=\"fixed inset-0 flex w-screen items-center justify-center p-4 z-[1000004]\">\n <div\n className={twMerge(\n \"relative p-4 w-full max-w-4xl max-h-full\",\n className,\n )}\n >\n <DialogPanel className=\"relative bg-white rounded-lg overflow-hidden shadow-2xl max-h-[80vh] flex flex-col\">\n <div className=\"flex items-center justify-between gap-3 p-4 rounded-t-lg sticky top-0 bg-white\">\n <div id=\"modal-back-slot\" />\n <DialogTitle className=\"text-xl font-semibold text-gray-900 grow\">\n {title}\n </DialogTitle>\n <CloseButton className=\"text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center\">\n <svg\n className=\"w-3 h-3\"\n aria-hidden=\"true\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 14 14\"\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6\"\n />\n </svg>\n <span className=\"sr-only\">Close</span>\n </CloseButton>\n </div>\n\n <div className=\"flex-1 min-h-0 overflow-y-auto flex flex-col\">\n {children}\n </div>\n\n {actions ? (\n <div className=\"flex items-center p-4 border-t border-gray-200 rounded-b justify-end\">\n {actions}\n </div>\n ) : null}\n </DialogPanel>\n </div>\n </div>\n </Dialog>\n </>\n );\n}\n","import { Button } from \"react-aria-components\";\nimport { MoreMenuIcon } from \"./icons/MoreMenu\";\n\nexport function MoreMenuButton() {\n return (\n <Button className=\"rounded-full bg-gray-200 text-gray-500 hover:bg-me-600 hover:text-white data-[pressed]:bg-me-600 data-[pressed]:text-white\">\n <MoreMenuIcon className=\"text-xl\" />\n </Button>\n );\n}\n","\"use client\";\nimport { useEffect } from \"react\";\nimport Joyride, { type CallBackProps, type Step } from \"react-joyride\";\nimport { useLocalStorage } from \"./hooks/use-local-storage\";\n\ninterface OnboardingTourProps {\n id: string;\n steps: Step[];\n forceStart?: boolean;\n onClose?: () => void;\n}\n\nexport function OnboardingTour({ id, steps, forceStart, onClose }: OnboardingTourProps) {\n const [isEnabled, setIsEnabled] = useLocalStorage(`tour_step/${id}`, true);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: like setState in React.\n useEffect(() => {\n const onRestart = (e: Event) => {\n const target = (e as CustomEvent<{ id?: string }>).detail?.id;\n if (target === id) {\n setIsEnabled(true);\n }\n };\n window.addEventListener(\"onboarding:restart\", onRestart as EventListener);\n return () => window.removeEventListener(\"onboarding:restart\", onRestart as EventListener);\n }, [id]);\n\n const lifecycle = (e: CallBackProps) => {\n if (e.action === \"close\" || e.action === \"skip\" || e.action === \"stop\" || e.action === \"reset\") {\n setIsEnabled(false);\n onClose?.();\n }\n };\n\n if (steps.length === 0) {\n return null;\n }\n\n return (\n <Joyride\n key={id}\n showProgress\n showSkipButton\n continuous\n steps={steps}\n run={isEnabled || forceStart}\n callback={lifecycle}\n styles={{\n options: {\n primaryColor: \"#b84c74\",\n textColor: \"#000000\",\n zIndex: 10000,\n },\n }}\n />\n );\n}\n","import { cn } from \"./utils\";\n\nexport function OpaqueControls(props: { children: React.ReactNode; active?: boolean }) {\n return (\n <div\n className={cn(\"flex w-full p-0.5 opacity-0 transition-opacity duration-300 gap-2\", props.active && \"opacity-1\")}\n >\n {props.children}\n </div>\n );\n}\n","import { type DetailedHTMLProps, forwardRef } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const PaddedSidebarContainer = forwardRef<\n HTMLDivElement,\n DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={twMerge(\"px-4 py-2 flex-1 overflow-visible\", className)} {...props} />\n));\n","import { Button } from \"react-aria-components\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./Tooltip\";\nimport { cn } from \"./utils\";\n\ninterface PanelSideMenuItemProps {\n icon: React.ReactNode;\n label: string;\n selected: boolean;\n onClick: () => void;\n}\n\nexport function PanelSideMenuItem(props: PanelSideMenuItemProps) {\n return (\n <Tooltip placement=\"right\">\n <TooltipTrigger asChild>\n <Button\n className={cn(\n \"border-none aspect-square w-full flex justify-center items-center hover:bg-me-primary-100 hover:text-black [&>svg]:text-2xl cursor-default\",\n props.selected\n ? \"bg-me-primary-500 hover:bg-me-primary-600 hover:text-white text-white\"\n : \"text-me-gray-700\",\n )}\n aria-label={props.label}\n onMouseDown={props.onClick}\n >\n {props.icon}\n <TooltipContent className=\"bg-me-gray-900 text-white text-sm px-3 py-2 rounded opacity-90 z-50\">\n {props.label}\n </TooltipContent>\n </Button>\n </TooltipTrigger>\n </Tooltip>\n );\n}\n","import { Fragment } from \"react/jsx-runtime\";\nimport { PanelSideMenuItem } from \"./PanelSideMenuItem\";\n\ninterface PanelSideMenuProps {\n items: Array<{\n id: string;\n icon: React.ReactNode;\n label: string;\n divide?: boolean;\n onClick: () => void;\n }>;\n open: boolean;\n current: string | null;\n}\n\nexport function PanelSideMenu(props: PanelSideMenuProps) {\n return (\n <div className=\"bg-white border-me-gray-300 border-t border-r flex flex-col w-12 pb-2\" data-open={props.open}>\n {props.items.map((panel) => (\n <Fragment key={panel.id}>\n {panel.divide ? <div className=\"flex-1 block w-2 min-h-1\" /> : null}\n <PanelSideMenuItem\n key={panel.id}\n label={panel.label}\n selected={panel.id === props.current && props.open}\n icon={panel.icon}\n onClick={panel.onClick}\n />\n </Fragment>\n ))}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Button } from \"react-aria-components\";\nimport {\n LocaleString,\n type TextualContentStrategy,\n useVault,\n} from \"react-iiif-vault\";\n\nexport function RenderTextualContent(props: {\n strategy: TextualContentStrategy;\n}) {\n const languages = props.strategy.items.map(\n (item) => Object.keys(item.text)[0]!,\n );\n const [langauge, setLanguage] = useState(languages[0]);\n const selected = props.strategy.items.find(\n (item) => Object.keys(item.text)[0] === langauge,\n );\n\n return (\n <div className=\"overflow-y-auto bg-white shadow\">\n <div className=\"flex gap-2 border-b\">\n {languages.map((language) => {\n return (\n <Button\n className={`py-1 px-3 ${langauge === language ? \"bg-me-500 text-white\" : \"bg-white text-black\"}`}\n key={language}\n onPress={() => setLanguage(language)}\n >\n {language}\n </Button>\n );\n })}\n </div>\n <div className=\"p-4 prose\">\n <LocaleString\n enableDangerouslySetInnerHTML\n defaultText={\n (\n <span className=\"text-gray-500 my-8\">No content available</span>\n ) as any\n }\n >\n {selected?.text}\n </LocaleString>\n </div>\n </div>\n );\n}\n","import { forwardRef } from \"react\";\nimport { Button, type ButtonProps } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport const ResizeHandle = forwardRef(function ResizeHandle(\n { className, ...props }: ButtonProps,\n ref: React.Ref<HTMLButtonElement>,\n) {\n return (\n <Button\n className={twMerge(\n \"transition-all mt-2 mb-2 opacity-0 transform scale-y-70 focus:ring focus:ring-me-500\",\n \"bg-white h-10 w-3 rounded shadow select-none group-hover:opacity-100\",\n className as any,\n )}\n {...props}\n ref={ref}\n />\n );\n});\n","import { Checkbox } from \"react-aria-components\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function SelectionCheckbox({ alwaysVisible }: { alwaysVisible?: boolean }) {\n return (\n <Checkbox\n slot=\"selection\"\n className={twMerge(\n \"bg-white/50\",\n \"group-hover:opacity-100 block h-5 w-5 shrink-0 rounded border border-gray-300 hover:border-gray-400 ring-offset-1\",\n \"data-[disabled]:hidden data-[indeterminate]:bg-me-700 data-[selected]:bg-me-700 data-[indeterminate]:text-white\",\n \"data-[selected]:border-me-700 data-[indeterminate]:border-me-700\",\n \"data-[selected]:text-white data-[disabled]:opacity-50 data-[focus-visible]:outline-none data-[focus-visible]:ring-2\",\n \"data-[focus-visible]:ring-me-700 data-[focus-visible]:ring-offset-2 data-[focus-visible]:opacity-100\",\n !alwaysVisible &&\n \"opacity-0 group-hover:opacity-100 data-[selected]:opacity-100 data-[indeterminate]:opacity-100\",\n )}\n >\n {({ isSelected, isIndeterminate }) => (\n <div className=\"flex items-center justify-center text-current\">\n <svg viewBox=\"0 -960 960 960\" aria-hidden=\"true\" fill=\"currentColor\">\n {isIndeterminate ? (\n <path d=\"M160-440v-80h640v80H160Z\" />\n ) : isSelected ? (\n <path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\" />\n ) : null}\n </svg>\n </div>\n )}\n </Checkbox>\n );\n}\n","import type { InternationalString } from \"@iiif/presentation-3\";\nimport { Button, MenuTrigger, Popover } from \"react-aria-components\";\nimport { LocaleString } from \"react-iiif-vault\";\nimport {\n DefaultTooltipContent,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"./Tooltip\";\nimport { cn } from \"./utils\";\n\nexport function Sidebar({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"w-full h-full flex flex-col overflow-hidden\">\n {children}\n </div>\n );\n}\n\nexport function SidebarContent({\n id,\n children,\n className,\n padding,\n}: {\n id?: string;\n children: React.ReactNode;\n className?: string;\n padding?: boolean;\n}) {\n return (\n <div\n id={id}\n className={cn(\n \"flex-1 min-h-0 overflow-y-auto pb-64\",\n className,\n padding && \"px-3 pt-3\",\n )}\n >\n {children}\n </div>\n );\n}\n\ninterface SidebarHeaderProps {\n actions?: Array<{\n id?: string;\n icon: any;\n onClick?: () => void;\n disabled?: boolean;\n toggled?: boolean;\n title: string;\n menu?: React.ReactNode;\n }>;\n title: string | InternationalString;\n customActions?: React.ReactNode;\n}\n\nexport function SidebarHeader(props: SidebarHeaderProps) {\n const { actions, title, customActions } = props;\n\n return (\n <div className=\"bg-me-gray-100 h-12 flex items-center px-3 z-10 text-black border-b-me-gray-300 border-b flex-shrink-0\">\n <LocaleString className=\"flex-1\">{title}</LocaleString>\n <div className=\"ml-auto flex gap-2 items-center\">\n {actions?.map((action, index) => {\n if (action.menu) {\n return (\n <MenuTrigger key={index}>\n <Button\n key={index}\n id={action.id}\n className={cn(\n //\n `p-1 rounded hover:bg-me-gray-300`,\n action.toggled && \"bg-me-gray-300\",\n action.disabled && \"opacity-50 cursor-not-allowed\",\n )}\n aria-label={\n typeof action.title === \"string\" ? action.title : \"\"\n }\n isDisabled={action.disabled}\n >\n {action.icon}\n </Button>\n <Popover placement=\"bottom right\">{action.menu}</Popover>\n </MenuTrigger>\n );\n }\n\n return (\n <Tooltip placement=\"bottom\" key={index}>\n <TooltipTrigger asChild>\n <Button\n key={index}\n id={action.id}\n className={cn(\n //\n `p-1 rounded hover:bg-me-gray-300`,\n action.toggled && \"bg-me-gray-300\",\n action.disabled && \"opacity-50 cursor-not-allowed\",\n )}\n onPress={action.onClick}\n aria-label={\n typeof action.title === \"string\" ? action.title : \"\"\n }\n isDisabled={action.disabled}\n >\n {action.icon}\n </Button>\n </TooltipTrigger>\n {!action.disabled ? (\n <DefaultTooltipContent>{action.title}</DefaultTooltipContent>\n ) : null}\n </Tooltip>\n );\n })}\n {customActions}\n </div>\n </div>\n );\n}\n","import { createHideableComponent } from \"@react-aria/collections\";\nimport { type ReactNode, useLayoutEffect, useMemo, useRef, useState } from \"react\";\nimport { Button, Menu, MenuItem, MenuTrigger, Popover, Tab, TabList, TabPanel, Tabs } from \"react-aria-components\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"./utils\";\n\ninterface SidebarTabsProps {\n menuId: string;\n menu: Array<{\n id: string;\n label: string;\n renderComponent: () => ReactNode;\n }>;\n\n selectedKey?: string;\n onSelectionChange?: (key: string) => void;\n\n // New future options.\n isNested?: boolean;\n rootResource?: { id: string; type: string };\n}\n\nexport function SidebarTabs({ menu, menuId, selectedKey, onSelectionChange }: SidebarTabsProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [hidden, setHidden] = useState(0);\n const [hiddenMenu, setHiddenMenu] = useState<HTMLDivElement | null>(null);\n const widths = useRef<number[]>([]);\n const itemsRef = useRef<Array<HTMLDivElement | null>>([]);\n\n const selectedIndex = useMemo(() => menu.findIndex((item) => item.id === selectedKey), [menu, selectedKey]);\n\n useLayoutEffect(() => {\n const cb = () => {\n if (widths.current.length === 0) {\n widths.current = [];\n for (const item of itemsRef.current) {\n if (item) {\n widths.current.push(item.getBoundingClientRect().width);\n }\n }\n }\n\n const fullWidth = widths.current.reduce((a, b) => a + b, 0);\n\n if (fullWidth && ref.current) {\n const el = ref.current;\n const width = el.getBoundingClientRect().width - 20; // 60 is the width of the \"more\" button\n\n let hidden = 0;\n let total = 0;\n for (let i = widths.current.length - 1; i >= 0; i--) {\n total += widths.current[i]!;\n if (total > width) {\n hidden = i + 1;\n break;\n }\n }\n\n setHidden(hidden);\n }\n };\n cb();\n const interval = setInterval(cb, 500);\n\n return () => {\n clearInterval(interval);\n };\n }, []);\n\n const menuHidden = menu.filter((item, idx) => hidden >= menu.length - idx);\n\n return (\n <>\n <Tabs\n className=\"w-full flex-1 overflow-hidden flex flex-col\"\n key={menuId}\n selectedKey={selectedKey}\n onSelectionChange={onSelectionChange as any}\n >\n <div className=\"flex items-center w-full tab-shadow\">\n <TabList ref={ref} className=\"flex-1 overflow-hidden w-full flex text-sm whitespace-nowrap\">\n {menu.map((item, idx) => {\n const isHidden = hidden >= menu.length - idx;\n return (\n <Tab\n ref={(el) => (itemsRef.current[idx] = el as any)}\n id={item.id}\n key={item.id}\n className={(state) =>\n cn(\n //\n \"border-b-2 px-2 py-1 text-sm text-gray-400 select-none hover:text-black focus:ring-0 focus:outline-none\",\n state.isSelected && \"border-me-primary-500 text-black\",\n state.isFocusVisible && \"ring-0 bg-me-gray-100\",\n isHidden && \"hidden\",\n )\n }\n >\n {item.label}\n </Tab>\n );\n })}\n </TabList>\n <div ref={setHiddenMenu} id=\"hidden-menu\" />\n </div>\n {menu.map((item) => (\n <TabPanel key={item.id} id={item.id} className=\"flex-1 overflow-y-auto h-full\">\n {item.renderComponent}\n </TabPanel>\n ))}\n </Tabs>\n\n {/* This is a bug where buttons that are not tabs can't be inside the <Tabs/> context, since the context is overwritten. */}\n {hiddenMenu && hidden > 0\n ? createPortal(\n <MoreMenu\n hidden={hidden}\n menuHidden={menuHidden}\n selectedIndex={selectedIndex}\n selectedKey={selectedKey}\n onSelectionChange={onSelectionChange}\n />,\n hiddenMenu,\n )\n : null}\n </>\n );\n}\n\nconst MoreMenu = createHideableComponent<\n {},\n {\n selectedIndex: number;\n hidden: number;\n menuHidden: Array<{ id: string; label: string }>;\n selectedKey: string | undefined;\n onSelectionChange?: (key: string) => void;\n }\n>(({ selectedIndex, hidden, menuHidden, selectedKey, onSelectionChange }) => {\n return (\n <MenuTrigger>\n <Button\n className={cn(\n \"border-none rounded bg-gray-100 px-1.5 py-1 mr-2 mb-1 text-me-primary-500 semibold uppercase text-[10px]\",\n selectedIndex > hidden && \"bg-me-primary-500 text-white rounded\",\n )}\n >\n MORE\n </Button>\n <Popover>\n {menuHidden.length ? (\n <Menu className=\"bg-white rounded shadow-lg flex flex-col gap-0.5 p-0.5 min-w-28\">\n {menuHidden.map((item) => {\n return (\n <MenuItem\n className={(state) =>\n cn(\n \"hover:bg-me-gray-100 p-1 rounded-sm text-sm\",\n selectedKey === item.id && \"ring ring-me-primary-500\",\n )\n }\n key={item.id}\n onAction={() => onSelectionChange?.(item.id)}\n >\n {item.label}\n </MenuItem>\n );\n })}\n </Menu>\n ) : null}\n </Popover>\n </MenuTrigger>\n );\n});\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\ninterface SVGRProps {\n title?: string;\n titleId?: string;\n}\nexport const DrawIcon = ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 -960 960 960\"\n aria-labelledby={titleId}\n {...props}\n >\n {title ? <title id={titleId}>{title}</title> : null}\n <path\n fill=\"currentColor\"\n d=\"M160-120v-170l527-526q12-12 27-18t30-6q16 0 30.5 6t25.5 18l56 56q12 11 18 25.5t6 30.5q0 15-6 30t-18 27L330-120H160Zm80-80h56l393-392-28-29-29-28-392 393v56Zm560-503-57-57 57 57Zm-139 82-29-28 57 57-28-29ZM560-120q74 0 137-37t63-103q0-36-19-62t-51-45l-59 59q23 10 36 22t13 26q0 23-36.5 41.5T560-200q-17 0-28.5 11.5T520-160q0 17 11.5 28.5T560-120ZM183-426l60-60q-20-8-31.5-16.5T200-520q0-12 18-24t76-37q88-38 117-69t29-70q0-55-44-87.5T280-840q-45 0-80.5 16T145-785q-11 13-9 29t15 26q13 11 29 9t27-13q14-14 31-20t42-6q41 0 60.5 12t19.5 28q0 14-17.5 25.5T262-654q-80 35-111 63.5T120-520q0 32 17 54.5t46 39.5Z\"\n />\n </svg>\n);\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\ninterface SVGRProps {\n title?: string;\n titleId?: string;\n}\nexport const HexagonIcon = ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 -960 960 960\"\n aria-labelledby={titleId}\n {...props}\n >\n {title ? <title id={titleId}>{title}</title> : null}\n <path\n fill=\"currentColor\"\n d=\"M272-120 64-480l208-360h416l208 360-208 360H272Zm46-80h324l161-280-161-280H318L156-480l162 280Zm162-280Z\"\n />\n </svg>\n);\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\n\ninterface SVGRProps {\n title?: string;\n titleId?: string;\n}\n\nexport function LineBoxIcon({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" aria-labelledby={titleId} {...props}>\n {title ? <title id={titleId}>{title}</title> : null}\n <g fill=\"none\" fillRule=\"evenodd\">\n <path d=\"M0 0h20v20H0z\" />\n <path stroke=\"currentColor\" strokeLinecap=\"square\" strokeWidth={2} d=\"m8.5 11.5 6-6M16 4v3m0-3h-3m0 14L2 7\" />\n <path stroke=\"currentColor\" strokeOpacity={0.407} strokeWidth={2} d=\"m2 7 5-5 11 11-5 5z\" />\n </g>\n </svg>\n );\n}\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\ninterface SVGRProps {\n title?: string;\n titleId?: string;\n}\nexport function LineIcon({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" aria-labelledby={titleId} {...props}>\n {title ? <title id={titleId}>{title}</title> : null}\n <g fill=\"none\" fillRule=\"evenodd\">\n <circle cx={4.5} cy={4.5} r={2.5} fill=\"currentColor\" />\n <circle cx={15.5} cy={15.5} r={2.5} fill=\"currentColor\" />\n <path stroke=\"currentColor\" strokeLinecap=\"square\" strokeWidth={2} d=\"m13.5 13.5-9-9\" />\n </g>\n </svg>\n );\n}\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\ninterface SVGRProps {\n title?: string;\n titleId?: string;\n}\nexport const PolygonIcon = ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 -960 960 960\"\n aria-labelledby={titleId}\n {...props}\n >\n {title ? <title id={titleId}>{title}</title> : null}\n <path\n fill=\"currentColor\"\n d=\"M600-80v-100L320-320H120v-240h172l108-124v-196h240v240H468L360-516v126l240 120v-50h240v240H600ZM480-720h80v-80h-80v80ZM200-400h80v-80h-80v80Zm480 240h80v-80h-80v80ZM520-760ZM240-440Zm480 240Z\"\n />\n </svg>\n);\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\ninterface SVGRProps {\n title?: string;\n titleId?: string;\n}\nexport const ShapesIcon = ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 -960 960 960\"\n aria-labelledby={titleId}\n {...props}\n >\n {title ? <title id={titleId}>{title}</title> : null}\n <path\n fill=\"currentColor\"\n d=\"M600-360ZM320-242q10 1 19.5 1.5t20.5.5q11 0 20.5-.5T400-242v82h400v-400h-82q1-10 1.5-19.5t.5-20.5q0-11-.5-20.5T718-640h82q33 0 56.5 23.5T880-560v400q0 33-23.5 56.5T800-80H400q-33 0-56.5-23.5T320-160v-82Zm40-78q-117 0-198.5-81.5T80-600q0-117 81.5-198.5T360-880q117 0 198.5 81.5T640-600q0 117-81.5 198.5T360-320Zm0-80q83 0 141.5-58.5T560-600q0-83-58.5-141.5T360-800q-83 0-141.5 58.5T160-600q0 83 58.5 141.5T360-400Zm0-200Z\"\n />\n </svg>\n);\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\ninterface SVGRProps {\n title?: string;\n titleId?: string;\n}\nexport const SquareIcon = ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 -960 960 960\"\n aria-labelledby={titleId}\n {...props}\n >\n {title ? <title id={titleId}>{title}</title> : null}\n <path\n fill=\"currentColor\"\n d=\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0 0v-560 560Z\"\n />\n </svg>\n);\n","import * as React from \"react\";\nimport { SVGProps } from \"react\";\ninterface SVGRProps {\n title?: string;\n titleId?: string;\n}\nexport const TriangleIcon = ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 -960 960 960\"\n aria-labelledby={titleId}\n {...props}\n >\n {title ? <title id={titleId}>{title}</title> : null}\n <path d=\"m80-160 400-640 400 640H80Zm144-80h512L480-650 224-240Zm256-205Z\" fill=\"currentColor\" />\n </svg>\n);\n","import type { createHelper } from \"polygon-editor\";\nimport { useEffect } from \"react\";\nimport { RenderSvgEditorControls } from \"react-iiif-vault\";\nimport { DeleteForeverIcon } from \"./icons/DeleteForeverIcon\";\nimport { DrawIcon } from \"./icons/DrawIcon\";\nimport { HexagonIcon } from \"./icons/HexagonIcon\";\nimport { LineBoxIcon } from \"./icons/LineBoxIcon\";\nimport { LineIcon } from \"./icons/LineIcon\";\nimport { PolygonIcon } from \"./icons/PolygonIcon\";\nimport { ShapesIcon } from \"./icons/ShapesIcon\";\nimport { SquareIcon } from \"./icons/SquareIcon\";\nimport { TriangleIcon } from \"./icons/TriangleIcon\";\n\nconst className =\n 'bg-me-gray-100 border hover:bg-me-gray-300 rounded p-1 text-2xl text-me-primary-500 data-[active=\"true\"]:border-me-primary-600';\n\nconst icons = {\n DrawIcon: <DrawIcon />,\n PolygonIcon: <PolygonIcon />,\n LineIcon: <LineIcon />,\n LineBoxIcon: <LineBoxIcon />,\n ShapesIcon: <ShapesIcon />,\n SquareIcon: <SquareIcon />,\n TriangleIcon: <TriangleIcon />,\n HexagonIcon: <HexagonIcon />,\n DeleteForeverIcon: <DeleteForeverIcon />,\n};\n\nexport function SvgControlBar({\n helper,\n showShapes,\n}: {\n helper: ReturnType<typeof createHelper>;\n state: any;\n showShapes: any;\n}) {\n useEffect(() => {\n helper.stamps.square();\n }, []);\n\n return (\n <RenderSvgEditorControls\n icons={icons}\n showShapes={showShapes}\n classNames={{\n button: className,\n }}\n />\n );\n}\n","import {\n Tab as BaseTab,\n TabList as BaseTabList,\n TabPanel as BaseTabPanel,\n Tabs as BaseTabs,\n type TabListProps,\n type TabPanelProps,\n type TabProps,\n type TabsProps,\n} from \"react-aria-components\";\nimport { cn } from \"./utils\";\n\nexport function Tabs({ className, children, ...props }: TabsProps) {\n return (\n <BaseTabs\n className={(state) => {\n const cs = typeof className === \"function\" ? className(state) : className;\n return cn(\"\", cs);\n }}\n {...props}\n >\n {children}\n </BaseTabs>\n );\n}\n\nexport function TabList<T extends object>({ className, children, ...props }: TabListProps<T>) {\n return (\n <BaseTabList\n className={(state) => {\n const cs = typeof className === \"function\" ? className(state) : className;\n return cn(\"flex gap-4\", cs);\n }}\n {...props}\n >\n {children}\n </BaseTabList>\n );\n}\n\nexport function Tab({ className, children, ...props }: TabProps) {\n return (\n <BaseTab\n className={(state) => {\n const cs = typeof className === \"function\" ? className(state) : className;\n return cn(\n \"cursor-default outline-none group py-1 font-semibold px-2 border-b-2 text-me-gray-700\",\n state.isSelected && \"border-b-me-primary-600 text-black\",\n state.isFocusVisible && \"focus-visible:bg-me-primary-100\",\n cs,\n );\n }}\n {...props}\n >\n {children}\n </BaseTab>\n );\n}\n\nexport function TabPanel({ className, children, ...props }: TabPanelProps) {\n return (\n <BaseTabPanel\n className={(state) => {\n const cs = typeof className === \"function\" ? className(state) : className;\n return cn(\"\", cs);\n }}\n {...props}\n >\n {children}\n </BaseTabPanel>\n );\n}\n","import { twMerge } from \"tailwind-merge\";\n\nexport function ThumbnailGridContainer(props: {\n size?: 'grid-sm' | 'grid-md' | 'grid-lg',\n children: React.ReactNode; wide?: boolean }) {\n if (props.wide) {\n return <div className={twMerge('grid', props.size || \"grid-md\", 'gap-4 p-4 overflow-y-auto')}>{props.children}</div>;\n }\n return <div className=\"grid grid-cols-2 gap-4 p-4\">{props.children}</div>;\n}\n","import type { Reference } from \"@iiif/presentation-3\";\nimport { useVaultSelector } from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function ProviderImage({ className, item }: { className?: string; item: Reference<\"ContentResource\"> }) {\n const image = useVaultSelector((_, vault) => vault.get(item, { skipSelfReturn: false }), [item]);\n\n return (\n <div className={twMerge(\"h-16 my-5 w-full\", className)}>\n <img\n src={image.id}\n alt=\"\"\n className={twMerge(\n //\n \"h-full w-full object-contain\",\n )}\n />\n </div>\n );\n}\n","import type { Reference } from \"@iiif/presentation-3\";\nimport { LocaleString, useVaultSelector } from \"react-iiif-vault\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function ProviderLink({ className, item }: { className?: string; item: Reference<\"WebPage\"> }) {\n const webPage = useVaultSelector((_, vault) => vault.get(item), [item]);\n\n if (item.id.startsWith(\"http://example.org/\")) {\n return null;\n }\n\n if (!webPage) {\n return null;\n }\n return (\n <a\n href={webPage.id}\n target=\"_blank\"\n className={twMerge(\n `flex justify-between items-center group pe-2 focus:ring focus:outline-none ring-me-500 cursor-default underline-offset-4 underline focus:no-underline focus:bg-gray-50 rounded py-1 px-2`,\n className,\n )}\n rel=\"noreferrer\"\n >\n <LocaleString\n enableDangerouslySetInnerHTML\n separator=\"<br>\"\n className=\"whitespace-nowrap overflow-hidden text-ellipsis min-w-0\"\n defaultText=\"Go to link\"\n >\n {webPage.label}\n </LocaleString>\n </a>\n );\n}\n","import { getValue } from \"@iiif/helpers\";\nimport { Button } from \"react-aria-components\";\nimport { LocaleString, useVault, useVaultSelector } from \"react-iiif-vault\";\nimport { ProviderImage } from \"./ProviderImage\";\nimport { ProviderLink } from \"./ProviderLink\";\n\nexport function ViewProvider({ resource, onPress }: { resource: { id: string; type: string }; onPress?: () => void }) {\n const provider = useVaultSelector((_, v) => v.get(resource));\n\n if (!provider) return null;\n\n const isUnknown = getValue(provider.label) === \"Unknown\";\n return (\n <Button\n className=\"rounded p-2 border border-gray-200 text-center hover:border-me-500 shadow-sm\"\n key={provider.id}\n onPress={onPress}\n >\n {provider.logo?.length > 0 ? (\n <div>\n {provider.logo.map((logo: any, n: number) => (\n <ProviderImage key={n} item={logo} />\n ))}\n </div>\n ) : null}\n\n {!isUnknown && (\n <div className=\"px-2 font-semibold mb-5\">\n <LocaleString enableDangerouslySetInnerHTML separator=\"<br>\">\n {provider?.label}\n </LocaleString>\n </div>\n )}\n\n {provider.homepage?.length > 0 ? (\n <div>\n {provider.homepage.map((homepage: any, n: number) => (\n <ProviderLink key={n} className=\"justify-center\" item={homepage} />\n ))}\n </div>\n ) : null}\n\n {provider.seeAlso?.length > 0 ? (\n <div>\n {provider.seeAlso?.map((seeAlso: any, n: number) => (\n <ProviderLink className=\"justify-center\" key={n} item={seeAlso} />\n ))}\n </div>\n ) : null}\n </Button>\n );\n}\n","import type React from \"react\";\nimport { twMerge } from \"tailwind-merge\";\n\ninterface WarningMessageProps {\n children: React.ReactNode;\n small?: boolean;\n className?: string;\n}\n\nexport function WarningMessage({ children, small = false, className }: WarningMessageProps) {\n return (\n <div\n className={twMerge(\n \"bg-orange-500 text-white\",\n \"border-1 drop-shadow border-orange-700 w-full rounded-md py-2 px-4 leading-[1.9em] flex items-center\",\n \"has-[a]:text-white\",\n small && \"text-xs whitespace-nowrap py-1 px-2 leading-[1.6em] w-fit\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ "use client";
@@ -0,0 +1 @@
1
+ "use client";