@manifest-editor/components 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -5,32 +5,27 @@ import "iiif-browser/dist/index.css";
5
5
 
6
6
  // src/ActionButton.tsx
7
7
  import { Button } from "react-aria-components";
8
-
9
- // src/utils.ts
10
- import { clsx } from "clsx";
11
8
  import { twMerge } from "tailwind-merge";
12
- var cn = (...inputs) => {
13
- return twMerge(clsx(inputs));
14
- };
15
-
16
- // src/ActionButton.tsx
17
9
  import { jsx } from "react/jsx-runtime";
18
10
  function ActionButton({
19
11
  className: className2,
20
12
  primary,
21
13
  center,
14
+ large,
22
15
  children,
23
16
  ...props
24
17
  }) {
25
18
  return /* @__PURE__ */ jsx(
26
19
  Button,
27
20
  {
28
- className: cn(
21
+ className: (t) => twMerge(
29
22
  //
30
- "border-none flex gap-1 items-center px-2 py-1 bg-gray-100 text-me-primary-500 text-sm rounded hover:bg-gray-200",
23
+ "border-none flex gap-1 items-center bg-gray-100 text-me-primary-500 text-sm rounded hover:bg-gray-200",
31
24
  primary ? "bg-me-primary-500 text-white hover:bg-me-primary-600" : "",
32
25
  center ? "place-content-center" : "",
33
- className2
26
+ large ? "px-4 py-2" : "px-2 py-1",
27
+ t.isDisabled ? "opacity-70 cursor-not-allowed pointer-events-none" : "",
28
+ typeof className2 === "string" ? className2 : className2?.(t)
34
29
  ),
35
30
  ...props,
36
31
  children
@@ -38,24 +33,31 @@ function ActionButton({
38
33
  );
39
34
  }
40
35
 
36
+ // src/utils.ts
37
+ import { clsx } from "clsx";
38
+ import { twMerge as twMerge2 } from "tailwind-merge";
39
+ var cn = (...inputs) => {
40
+ return twMerge2(clsx(inputs));
41
+ };
42
+
41
43
  // src/Tooltip.tsx
42
- import * as React from "react";
43
44
  import {
44
- useFloating,
45
+ FloatingPortal,
45
46
  autoUpdate,
46
- offset,
47
47
  flip,
48
+ offset,
48
49
  shift,
49
- useHover,
50
- useFocus,
51
50
  useDismiss,
52
- useRole,
51
+ useFloating,
52
+ useFocus,
53
+ useHover,
53
54
  useInteractions,
54
55
  useMergeRefs,
55
- FloatingPortal
56
+ useRole
56
57
  } from "@floating-ui/react";
58
+ import * as React from "react";
57
59
  import { Button as Button2 } from "react-aria-components";
58
- import { twMerge as twMerge2 } from "tailwind-merge";
60
+ import { twMerge as twMerge3 } from "tailwind-merge";
59
61
  import { jsx as jsx2 } from "react/jsx-runtime";
60
62
  function useTooltip({
61
63
  initialOpen = false,
@@ -110,10 +112,7 @@ var useTooltipContext = () => {
110
112
  }
111
113
  return context;
112
114
  };
113
- function Tooltip({
114
- children,
115
- ...options
116
- }) {
115
+ function Tooltip({ children, ...options }) {
117
116
  const tooltip = useTooltip(options);
118
117
  return /* @__PURE__ */ jsx2(TooltipContext.Provider, { value: tooltip, children });
119
118
  }
@@ -142,12 +141,12 @@ var TooltipTrigger = React.forwardRef(function TooltipTrigger2({ children, asChi
142
141
  }
143
142
  );
144
143
  });
145
- var TooltipContent = React.forwardRef(function TooltipContent2({ style, ...props }, propRef) {
144
+ var TooltipContent = React.forwardRef(function TooltipContent2({ style, root, ...props }, propRef) {
146
145
  const context = useTooltipContext();
147
146
  const ref = useMergeRefs([context.refs.setFloating, propRef]);
148
147
  if (!context.open)
149
148
  return null;
150
- return /* @__PURE__ */ jsx2(FloatingPortal, { children: /* @__PURE__ */ jsx2(
149
+ return /* @__PURE__ */ jsx2(FloatingPortal, { root, children: /* @__PURE__ */ jsx2(
151
150
  "div",
152
151
  {
153
152
  ref,
@@ -163,10 +162,8 @@ function DefaultTooltipContent(props) {
163
162
  return /* @__PURE__ */ jsx2(
164
163
  TooltipContent,
165
164
  {
166
- className: twMerge2(
167
- "bg-me-gray-900 text-white text-sm px-3 py-2 rounded-lg opacity-90 z-50",
168
- props.className
169
- ),
165
+ root: props.root,
166
+ className: twMerge3("bg-me-gray-900 text-white text-sm px-3 py-2 rounded opacity-90 z-50", props.className),
170
167
  children: props.children
171
168
  }
172
169
  );
@@ -223,10 +220,11 @@ function PanelSideMenuItem(props) {
223
220
  "border-none aspect-square w-full flex justify-center items-center hover:bg-me-primary-100 hover:text-black [&>svg]:text-2xl cursor-default",
224
221
  props.selected ? "bg-me-primary-500 hover:bg-me-primary-600 hover:text-white text-white" : "text-me-gray-700"
225
222
  ),
223
+ "aria-label": props.label,
226
224
  onMouseDown: props.onClick,
227
225
  children: [
228
226
  props.icon,
229
- /* @__PURE__ */ jsx4(TooltipContent, { className: "bg-me-gray-900 text-white text-sm px-3 py-2 rounded-lg opacity-90 z-50", children: props.label })
227
+ /* @__PURE__ */ jsx4(TooltipContent, { className: "bg-me-gray-900 text-white text-sm px-3 py-2 rounded opacity-90 z-50", children: props.label })
230
228
  ]
231
229
  }
232
230
  ) }) });
@@ -272,7 +270,7 @@ import {
272
270
  useThumbnail
273
271
  } from "react-iiif-vault";
274
272
  import { LazyLoadComponent } from "react-lazy-load-image-component";
275
- import { twMerge as twMerge3 } from "tailwind-merge";
273
+ import { twMerge as twMerge4 } from "tailwind-merge";
276
274
 
277
275
  // src/Spinner.tsx
278
276
  import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
@@ -382,7 +380,7 @@ function LazyThumbnailInner({
382
380
  !thumbnail?.id || isLoading ? /* @__PURE__ */ jsx9(
383
381
  "div",
384
382
  {
385
- className: twMerge3(
383
+ className: twMerge4(
386
384
  "absolute inset-0 flex items-center justify-center bg-me-gray-100 text-2xl z-10",
387
385
  fade && "animate-fadeIn"
388
386
  ),
@@ -414,7 +412,7 @@ function CanvasLabel(props) {
414
412
 
415
413
  // src/Card3D.tsx
416
414
  import { useLayoutEffect as useLayoutEffect2, useRef as useRef2 } from "react";
417
- import { twMerge as twMerge4 } from "tailwind-merge";
415
+ import { twMerge as twMerge5 } from "tailwind-merge";
418
416
  import { jsx as jsx11, jsxs as jsxs7 } from "react/jsx-runtime";
419
417
  function Card3D({
420
418
  className: className2,
@@ -490,7 +488,7 @@ function Card3D({
490
488
  "div",
491
489
  {
492
490
  ref: outer,
493
- className: twMerge4(
491
+ className: twMerge5(
494
492
  //
495
493
  "relative transition-all hover:duration-50",
496
494
  shouldTranslate && "hover:shadow-xl",
@@ -535,69 +533,50 @@ function CanvasThumbnailGridItem(props) {
535
533
  }
536
534
 
537
535
  // src/Modal.tsx
538
- import {
539
- CloseButton,
540
- Dialog,
541
- DialogPanel,
542
- DialogTitle
543
- } from "@headlessui/react";
536
+ import { CloseButton, Dialog, DialogPanel, DialogTitle } from "@headlessui/react";
537
+ import { createPortal } from "react-dom";
544
538
  import { Fragment as Fragment2, jsx as jsx13, jsxs as jsxs9 } from "react/jsx-runtime";
545
- function Modal({
546
- id,
547
- title,
548
- open = true,
549
- onClose,
550
- actions,
551
- children
552
- }) {
553
- return /* @__PURE__ */ jsx13(Fragment2, { children: /* @__PURE__ */ jsxs9(
554
- Dialog,
555
- {
556
- open,
557
- onClose,
558
- id,
559
- className: "relative z-[500]",
560
- children: [
561
- /* @__PURE__ */ jsx13(
562
- "div",
563
- {
564
- className: `fixed inset-0 bg-black/30 animate-fadeIn z-[501]`,
565
- "aria-hidden": "true"
566
- }
567
- ),
568
- /* @__PURE__ */ jsx13("div", { className: "fixed inset-0 flex w-screen items-center justify-center p-4 z-[502]", children: /* @__PURE__ */ jsx13("div", { className: "relative p-4 w-full max-w-4xl max-h-full", children: /* @__PURE__ */ jsxs9(DialogPanel, { className: "relative bg-white rounded-lg overflow-hidden shadow-2xl max-h-[80vh] flex flex-col", children: [
569
- /* @__PURE__ */ jsxs9("div", { className: "flex items-center justify-between p-4 md:p-5 rounded-t-lg sticky top-0 bg-white", children: [
570
- /* @__PURE__ */ jsx13(DialogTitle, { className: "text-xl font-semibold text-gray-900 ", children: title }),
571
- /* @__PURE__ */ jsxs9(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", children: [
572
- /* @__PURE__ */ jsx13(
573
- "svg",
539
+ function ModalBackSlot({ children }) {
540
+ const element = document.getElementById("modal-back-slot");
541
+ if (!element)
542
+ return null;
543
+ return createPortal(children, element);
544
+ }
545
+ function Modal({ id, title, open = true, onClose, actions, children }) {
546
+ return /* @__PURE__ */ jsx13(Fragment2, { children: /* @__PURE__ */ jsxs9(Dialog, { open, onClose, id, className: "relative z-[500]", children: [
547
+ /* @__PURE__ */ jsx13("div", { className: `fixed inset-0 bg-black/30 animate-fadeIn z-[501]`, "aria-hidden": "true" }),
548
+ /* @__PURE__ */ jsx13("div", { className: "fixed inset-0 flex w-screen items-center justify-center p-4 z-[502]", children: /* @__PURE__ */ jsx13("div", { className: "relative p-4 w-full max-w-4xl max-h-full", children: /* @__PURE__ */ jsxs9(DialogPanel, { className: "relative bg-white rounded-lg overflow-hidden shadow-2xl max-h-[80vh] flex flex-col", children: [
549
+ /* @__PURE__ */ jsxs9("div", { className: "flex items-center justify-between gap-3 p-4 rounded-t-lg sticky top-0 bg-white", children: [
550
+ /* @__PURE__ */ jsx13("div", { id: "modal-back-slot" }),
551
+ /* @__PURE__ */ jsx13(DialogTitle, { className: "text-xl font-semibold text-gray-900 ", children: title }),
552
+ /* @__PURE__ */ jsxs9(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", children: [
553
+ /* @__PURE__ */ jsx13(
554
+ "svg",
555
+ {
556
+ className: "w-3 h-3",
557
+ "aria-hidden": "true",
558
+ xmlns: "http://www.w3.org/2000/svg",
559
+ fill: "none",
560
+ viewBox: "0 0 14 14",
561
+ children: /* @__PURE__ */ jsx13(
562
+ "path",
574
563
  {
575
- className: "w-3 h-3",
576
- "aria-hidden": "true",
577
- xmlns: "http://www.w3.org/2000/svg",
578
- fill: "none",
579
- viewBox: "0 0 14 14",
580
- children: /* @__PURE__ */ jsx13(
581
- "path",
582
- {
583
- stroke: "currentColor",
584
- strokeLinecap: "round",
585
- strokeLinejoin: "round",
586
- strokeWidth: "2",
587
- d: "m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"
588
- }
589
- )
564
+ stroke: "currentColor",
565
+ strokeLinecap: "round",
566
+ strokeLinejoin: "round",
567
+ strokeWidth: "2",
568
+ d: "m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6"
590
569
  }
591
- ),
592
- /* @__PURE__ */ jsx13("span", { className: "sr-only", children: "Close" })
593
- ] })
594
- ] }),
595
- /* @__PURE__ */ jsx13("div", { className: "flex-1 min-h-0 overflow-y-auto flex flex-col", children }),
596
- actions ? /* @__PURE__ */ jsx13("div", { className: "flex items-center p-4 md:p-5 border-t border-gray-200 rounded-b justify-end", children: actions }) : null
597
- ] }) }) })
598
- ]
599
- }
600
- ) });
570
+ )
571
+ }
572
+ ),
573
+ /* @__PURE__ */ jsx13("span", { className: "sr-only", children: "Close" })
574
+ ] })
575
+ ] }),
576
+ /* @__PURE__ */ jsx13("div", { className: "flex-1 min-h-0 overflow-y-auto flex flex-col", children }),
577
+ actions ? /* @__PURE__ */ jsx13("div", { className: "flex items-center p-4 border-t border-gray-200 rounded-b justify-end", children: actions }) : null
578
+ ] }) }) })
579
+ ] }) });
601
580
  }
602
581
 
603
582
  // src/ControlButton.tsx
@@ -704,7 +683,7 @@ function TabPanel({ className: className2, children, ...props }) {
704
683
 
705
684
  // src/CreatorGrid.tsx
706
685
  import { ListBox, ListBoxItem } from "react-aria-components";
707
- import { twMerge as twMerge5 } from "tailwind-merge";
686
+ import { twMerge as twMerge6 } from "tailwind-merge";
708
687
  import { jsx as jsx17, jsxs as jsxs10 } from "react/jsx-runtime";
709
688
  function CreatorGrid(props) {
710
689
  return /* @__PURE__ */ jsx17(
@@ -725,7 +704,7 @@ function CreatorGridItem(props) {
725
704
  {
726
705
  id: props.id,
727
706
  onAction: props.onClick,
728
- className: ($s) => twMerge5(
707
+ className: ($s) => twMerge6(
729
708
  "bg-white p-2 border-me-gray-300 rounded-md border hover:border-me-primary-500",
730
709
  $s.isFocused && "border-me-primary-500 outline-me-primary-500 outline-2"
731
710
  ),
@@ -1062,7 +1041,7 @@ import {
1062
1041
  Tabs as Tabs2
1063
1042
  } from "react-aria-components";
1064
1043
  import { createHideableComponent } from "@react-aria/collections";
1065
- import { createPortal } from "react-dom";
1044
+ import { createPortal as createPortal2 } from "react-dom";
1066
1045
  import { Fragment as Fragment3, jsx as jsx33, jsxs as jsxs23 } from "react/jsx-runtime";
1067
1046
  function SidebarTabs({
1068
1047
  menu,
@@ -1162,7 +1141,7 @@ function SidebarTabs({
1162
1141
  },
1163
1142
  menuId
1164
1143
  ),
1165
- hiddenMenu && hidden > 0 ? createPortal(
1144
+ hiddenMenu && hidden > 0 ? createPortal2(
1166
1145
  /* @__PURE__ */ jsx33(
1167
1146
  MoreMenu,
1168
1147
  {
@@ -1222,7 +1201,7 @@ function MetadataContainer({
1222
1201
  ...props
1223
1202
  }) {
1224
1203
  return /* @__PURE__ */ jsxs24(
1225
- "div",
1204
+ "fieldset",
1226
1205
  {
1227
1206
  className: cn(
1228
1207
  "hover:ring ring-gray-200 focus-within:ring-me-primary-500 focus-within:ring p-2 rounded mb-2",
@@ -1282,7 +1261,7 @@ function ManifestEditorLogo(props) {
1282
1261
  }
1283
1262
 
1284
1263
  // src/Forms.tsx
1285
- import { Label, Form as RAForm, Input, RadioGroup, Radio } from "react-aria-components";
1264
+ import { Input, Label, Form as RAForm, Radio, RadioGroup, TextArea } from "react-aria-components";
1286
1265
  import { jsx as jsx37 } from "react/jsx-runtime";
1287
1266
  function MeLabel({ className: className2, ...props }) {
1288
1267
  return /* @__PURE__ */ jsx37(
@@ -1350,6 +1329,20 @@ function MeInput({ className: className2, ...props }) {
1350
1329
  }
1351
1330
  );
1352
1331
  }
1332
+ function MeTextArea({ className: className2, ...props }) {
1333
+ return /* @__PURE__ */ jsx37(
1334
+ TextArea,
1335
+ {
1336
+ className: cn(
1337
+ //
1338
+ "p-2 bg-me-gray-100 border-b border-b-me-gray-500",
1339
+ "focus:ring-0 outline-0 focus:border-me-primary-500 focus:bg-[#ECEEF5]",
1340
+ className2
1341
+ ),
1342
+ ...props
1343
+ }
1344
+ );
1345
+ }
1353
1346
  function MeInputContainer({
1354
1347
  horizontal,
1355
1348
  className: className2,
@@ -1374,7 +1367,8 @@ var Form = {
1374
1367
  Label: MeLabel,
1375
1368
  InputContainer: MeInputContainer,
1376
1369
  RadioGroup: MeRadioGroup,
1377
- Radio: MeRadio
1370
+ Radio: MeRadio,
1371
+ TextArea: MeTextArea
1378
1372
  };
1379
1373
 
1380
1374
  // src/HTMLEditor.tsx
@@ -1387,18 +1381,21 @@ import TurndownService from "turndown";
1387
1381
  import "@mdxeditor/editor/style.css";
1388
1382
  import {
1389
1383
  MDXEditor as BaseMDXEditor,
1384
+ BlockTypeSelect,
1385
+ BoldItalicUnderlineToggles,
1386
+ CreateLink,
1390
1387
  InsertImage,
1391
1388
  ListsToggle,
1392
1389
  UndoRedo,
1390
+ diffSourcePlugin,
1393
1391
  headingsPlugin,
1394
1392
  imagePlugin,
1393
+ linkDialogPlugin,
1395
1394
  linkPlugin,
1396
1395
  listsPlugin,
1397
- markdownShortcutPlugin,
1398
1396
  quotePlugin,
1399
1397
  thematicBreakPlugin,
1400
- toolbarPlugin,
1401
- BlockTypeSelect
1398
+ toolbarPlugin
1402
1399
  } from "@mdxeditor/editor";
1403
1400
  import { useMemo as useMemo3 } from "react";
1404
1401
  import { Fragment as Fragment4, jsx as jsx38, jsxs as jsxs26 } from "react/jsx-runtime";
@@ -1412,22 +1409,23 @@ function MDXEditor({
1412
1409
  plugins: useMemo3(
1413
1410
  () => [
1414
1411
  // Example Plugin Usage
1415
- headingsPlugin(),
1412
+ headingsPlugin({ allowedHeadingLevels: [2, 3] }),
1416
1413
  listsPlugin(),
1417
1414
  linkPlugin(),
1418
1415
  quotePlugin(),
1419
1416
  thematicBreakPlugin(),
1420
- headingsPlugin(),
1421
- // linkDialogPlugin(),
1422
- markdownShortcutPlugin(),
1417
+ linkDialogPlugin(),
1423
1418
  imagePlugin(),
1419
+ diffSourcePlugin(),
1424
1420
  toolbarPlugin({
1425
1421
  toolbarClassName: "mdx-toolbar",
1426
1422
  toolbarContents: () => /* @__PURE__ */ jsxs26(Fragment4, { children: [
1427
1423
  " ",
1428
1424
  /* @__PURE__ */ jsx38(UndoRedo, {}),
1425
+ /* @__PURE__ */ jsx38(BoldItalicUnderlineToggles, {}),
1429
1426
  /* @__PURE__ */ jsx38(BlockTypeSelect, {}),
1430
- /* @__PURE__ */ jsx38(ListsToggle, {}),
1427
+ /* @__PURE__ */ jsx38(ListsToggle, { options: ["bullet", "number"] }),
1428
+ /* @__PURE__ */ jsx38(CreateLink, {}),
1431
1429
  /* @__PURE__ */ jsx38(InsertImage, {})
1432
1430
  ] })
1433
1431
  })
@@ -1475,7 +1473,11 @@ function HTMLEditor({
1475
1473
  editorRef,
1476
1474
  onBlur: internalOnChange,
1477
1475
  readOnly: disabled,
1478
- className: "bg-white prose-sm text-sm border rounded-lg p-0.5 focus-within:outline-none focus-within:border-me-primary-500",
1476
+ className: [
1477
+ "bg-white prose-sm text-sm border rounded-lg prose-a:text-me-primary-500 prose-a:underline prose-ul:list-disc p-0.5",
1478
+ "prose-ol:list-decimal",
1479
+ "focus-within:outline-none focus-within:border-me-primary-500 z-50 relative"
1480
+ ].join(" "),
1479
1481
  markdown: memoState,
1480
1482
  suppressHtmlProcessing: true,
1481
1483
  onError: (err) => {
@@ -1490,27 +1492,31 @@ function HTMLEditor({
1490
1492
  }
1491
1493
 
1492
1494
  // src/IconButton.tsx
1493
- import { twMerge as twMerge6 } from "tailwind-merge";
1495
+ import { twMerge as twMerge7 } from "tailwind-merge";
1494
1496
  import { jsx as jsx40, jsxs as jsxs27 } from "react/jsx-runtime";
1495
1497
  function IconButton({
1496
1498
  children,
1497
1499
  active,
1498
1500
  label,
1499
1501
  disabled,
1500
- onPress
1502
+ onPress,
1503
+ root,
1504
+ className: className2,
1505
+ placement = "top"
1501
1506
  }) {
1502
- return /* @__PURE__ */ jsx40(Tooltip, { placement: "top", children: /* @__PURE__ */ jsxs27(
1507
+ return /* @__PURE__ */ jsx40(Tooltip, { placement, children: /* @__PURE__ */ jsxs27(
1503
1508
  TooltipTrigger,
1504
1509
  {
1505
1510
  onClick: onPress,
1506
- className: twMerge6(
1511
+ className: twMerge7(
1507
1512
  "rounded flex items-center bg-white justify-center p-2 hover:bg-gray-100 text-2xl",
1508
1513
  active ? "bg-me-primary-500 bg-opacity-40 hover:bg-opacity-70 hover:bg-me-primary-500" : "",
1509
- disabled ? "opacity-50 pointer-events-none" : ""
1514
+ disabled ? "opacity-50 pointer-events-none" : "",
1515
+ className2
1510
1516
  ),
1511
1517
  children: [
1512
1518
  children,
1513
- /* @__PURE__ */ jsx40(DefaultTooltipContent, { className: "translate-x-3", children: label })
1519
+ /* @__PURE__ */ jsx40(DefaultTooltipContent, { root, className: "translate-x-3 z-50", children: label })
1514
1520
  ]
1515
1521
  }
1516
1522
  ) });
@@ -1551,12 +1557,116 @@ var HandleContainer = forwardRef2(function HandleContainer2({ className: classNa
1551
1557
  );
1552
1558
  });
1553
1559
 
1560
+ // src/CollectionListItem.tsx
1561
+ import { Button as Button6 } from "react-aria-components";
1562
+ import { LocaleString as LocaleString3, useCollection } from "react-iiif-vault";
1563
+
1564
+ // src/icons/CollectionIcon.tsx
1565
+ import { jsx as jsx43 } from "react/jsx-runtime";
1566
+ function CollectionIcon(props) {
1567
+ return /* @__PURE__ */ jsx43(
1568
+ "svg",
1569
+ {
1570
+ xmlns: "http://www.w3.org/2000/svg",
1571
+ width: "1em",
1572
+ height: "1em",
1573
+ viewBox: "0 -960 960 960",
1574
+ "aria-label": "collection",
1575
+ role: "img",
1576
+ ...props,
1577
+ children: /* @__PURE__ */ jsx43(
1578
+ "path",
1579
+ {
1580
+ 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",
1581
+ fill: "currentColor"
1582
+ }
1583
+ )
1584
+ }
1585
+ );
1586
+ }
1587
+
1588
+ // src/CollectionListItem.tsx
1589
+ import { jsx as jsx44, jsxs as jsxs29 } from "react/jsx-runtime";
1590
+ function CollectionListItem({ isActive, onAction }) {
1591
+ const collection = useCollection({});
1592
+ return /* @__PURE__ */ jsxs29(
1593
+ Button6,
1594
+ {
1595
+ 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",
1596
+ onPress: onAction,
1597
+ "data-active": isActive || void 0,
1598
+ children: [
1599
+ /* @__PURE__ */ jsx44(
1600
+ CollectionIcon,
1601
+ {
1602
+ "data-active": isActive || void 0,
1603
+ className: "flex-shrink-0 text-2xl data-[active]:text-me-primary-500 text-gray-400"
1604
+ }
1605
+ ),
1606
+ /* @__PURE__ */ jsx44(LocaleString3, { children: collection?.label })
1607
+ ]
1608
+ }
1609
+ );
1610
+ }
1611
+
1612
+ // src/ManifestListItem.tsx
1613
+ import { Button as Button7 } from "react-aria-components";
1614
+ import { LocaleString as LocaleString4, useManifest } from "react-iiif-vault";
1615
+
1616
+ // src/icons/ManifestIcon.tsx
1617
+ import { jsx as jsx45 } from "react/jsx-runtime";
1618
+ function ManifestIcon(props) {
1619
+ return /* @__PURE__ */ jsx45(
1620
+ "svg",
1621
+ {
1622
+ xmlns: "http://www.w3.org/2000/svg",
1623
+ width: "1em",
1624
+ height: "1em",
1625
+ viewBox: "20 -910 960 960",
1626
+ "aria-label": "manifest",
1627
+ role: "img",
1628
+ ...props,
1629
+ children: /* @__PURE__ */ jsx45(
1630
+ "path",
1631
+ {
1632
+ 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",
1633
+ fill: "currentColor"
1634
+ }
1635
+ )
1636
+ }
1637
+ );
1638
+ }
1639
+
1640
+ // src/ManifestListItem.tsx
1641
+ import { jsx as jsx46, jsxs as jsxs30 } from "react/jsx-runtime";
1642
+ function ManifestListItem({ isActive, onAction }) {
1643
+ const manifest = useManifest();
1644
+ return /* @__PURE__ */ jsxs30(
1645
+ Button7,
1646
+ {
1647
+ 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",
1648
+ onPress: onAction,
1649
+ "data-active": isActive || void 0,
1650
+ children: [
1651
+ /* @__PURE__ */ jsx46(
1652
+ ManifestIcon,
1653
+ {
1654
+ "data-active": isActive || void 0,
1655
+ className: "flex-shrink-0 text-2xl data-[active]:text-me-primary-500 text-gray-400"
1656
+ }
1657
+ ),
1658
+ /* @__PURE__ */ jsx46(LocaleString4, { children: manifest?.label })
1659
+ ]
1660
+ }
1661
+ );
1662
+ }
1663
+
1554
1664
  // src/icons/CreateCanvasIcon.tsx
1555
- import { jsx as jsx43, jsxs as jsxs29 } from "react/jsx-runtime";
1665
+ import { jsx as jsx47, jsxs as jsxs31 } from "react/jsx-runtime";
1556
1666
  function CreateCanvasIcon() {
1557
- return /* @__PURE__ */ jsxs29("svg", { xmlns: "http://www.w3.org/2000/svg", height: "24", viewBox: "0 0 24 24", width: "24", children: [
1558
- /* @__PURE__ */ jsx43("path", { d: "M0 0h24v24H0V0z", fill: "none" }),
1559
- /* @__PURE__ */ jsx43(
1667
+ return /* @__PURE__ */ jsxs31("svg", { xmlns: "http://www.w3.org/2000/svg", height: "24", viewBox: "0 0 24 24", width: "24", children: [
1668
+ /* @__PURE__ */ jsx47("path", { d: "M0 0h24v24H0V0z", fill: "none" }),
1669
+ /* @__PURE__ */ jsx47(
1560
1670
  "path",
1561
1671
  {
1562
1672
  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",
@@ -1567,8 +1677,8 @@ function CreateCanvasIcon() {
1567
1677
  }
1568
1678
 
1569
1679
  // src/icons/AddImageIcon.tsx
1570
- import { jsx as jsx44 } from "react/jsx-runtime";
1571
- var AddImageIcon = (props) => /* @__PURE__ */ jsx44("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx44(
1680
+ import { jsx as jsx48 } from "react/jsx-runtime";
1681
+ var AddImageIcon = (props) => /* @__PURE__ */ jsx48("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx48(
1572
1682
  "path",
1573
1683
  {
1574
1684
  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",
@@ -1577,8 +1687,8 @@ var AddImageIcon = (props) => /* @__PURE__ */ jsx44("svg", { xmlns: "http://www.
1577
1687
  ) });
1578
1688
 
1579
1689
  // src/icons/IIIFLogo.tsx
1580
- import { jsx as jsx45, jsxs as jsxs30 } from "react/jsx-runtime";
1581
- var IIIFLogo = ({ mono = true, ...props }) => /* @__PURE__ */ jsxs30(
1690
+ import { jsx as jsx49, jsxs as jsxs32 } from "react/jsx-runtime";
1691
+ var IIIFLogo = ({ mono = true, ...props }) => /* @__PURE__ */ jsxs32(
1582
1692
  "svg",
1583
1693
  {
1584
1694
  xmlns: "http://www.w3.org/2000/svg",
@@ -1588,7 +1698,7 @@ var IIIFLogo = ({ mono = true, ...props }) => /* @__PURE__ */ jsxs30(
1588
1698
  ...props,
1589
1699
  viewBox: "0 0 493.36 441.333",
1590
1700
  children: [
1591
- /* @__PURE__ */ jsx45(
1701
+ /* @__PURE__ */ jsx49(
1592
1702
  "path",
1593
1703
  {
1594
1704
  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",
@@ -1601,7 +1711,7 @@ var IIIFLogo = ({ mono = true, ...props }) => /* @__PURE__ */ jsxs30(
1601
1711
  transform: "matrix(.13333 0 0 -.13333 0 441.333)"
1602
1712
  }
1603
1713
  ),
1604
- /* @__PURE__ */ jsx45(
1714
+ /* @__PURE__ */ jsx49(
1605
1715
  "path",
1606
1716
  {
1607
1717
  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",
@@ -1614,7 +1724,7 @@ var IIIFLogo = ({ mono = true, ...props }) => /* @__PURE__ */ jsxs30(
1614
1724
  transform: "matrix(.13333 0 0 -.13333 0 441.333)"
1615
1725
  }
1616
1726
  ),
1617
- /* @__PURE__ */ jsx45(
1727
+ /* @__PURE__ */ jsx49(
1618
1728
  "path",
1619
1729
  {
1620
1730
  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",
@@ -1627,7 +1737,7 @@ var IIIFLogo = ({ mono = true, ...props }) => /* @__PURE__ */ jsxs30(
1627
1737
  transform: "matrix(.13333 0 0 -.13333 0 441.333)"
1628
1738
  }
1629
1739
  ),
1630
- /* @__PURE__ */ jsx45(
1740
+ /* @__PURE__ */ jsx49(
1631
1741
  "path",
1632
1742
  {
1633
1743
  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",
@@ -1645,8 +1755,8 @@ var IIIFLogo = ({ mono = true, ...props }) => /* @__PURE__ */ jsxs30(
1645
1755
  );
1646
1756
 
1647
1757
  // src/icons/HTMLIcon.tsx
1648
- import { jsx as jsx46 } from "react/jsx-runtime";
1649
- var HTMLIcon = (props) => /* @__PURE__ */ jsx46("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx46(
1758
+ import { jsx as jsx50 } from "react/jsx-runtime";
1759
+ var HTMLIcon = (props) => /* @__PURE__ */ jsx50("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx50(
1650
1760
  "path",
1651
1761
  {
1652
1762
  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",
@@ -1655,8 +1765,8 @@ var HTMLIcon = (props) => /* @__PURE__ */ jsx46("svg", { xmlns: "http://www.w3.o
1655
1765
  ) });
1656
1766
 
1657
1767
  // src/icons/IIIFBrowserIcon.tsx
1658
- import { jsx as jsx47 } from "react/jsx-runtime";
1659
- var IIIFBrowserIcon = (props) => /* @__PURE__ */ jsx47("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx47(
1768
+ import { jsx as jsx51 } from "react/jsx-runtime";
1769
+ var IIIFBrowserIcon = (props) => /* @__PURE__ */ jsx51("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx51(
1660
1770
  "path",
1661
1771
  {
1662
1772
  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",
@@ -1664,9 +1774,59 @@ var IIIFBrowserIcon = (props) => /* @__PURE__ */ jsx47("svg", { xmlns: "http://w
1664
1774
  }
1665
1775
  ) });
1666
1776
 
1777
+ // src/icons/InfoIcon.tsx
1778
+ import { jsx as jsx52, jsxs as jsxs33 } from "react/jsx-runtime";
1779
+ function InfoIcon({ title, titleId, ...props }) {
1780
+ return /* @__PURE__ */ jsxs33("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", "aria-labelledby": titleId, ...props, children: [
1781
+ title ? /* @__PURE__ */ jsx52("title", { id: titleId, children: title }) : null,
1782
+ /* @__PURE__ */ jsx52("path", { d: "M0 0h24v24H0V0z", fill: "none" }),
1783
+ /* @__PURE__ */ jsx52(
1784
+ "path",
1785
+ {
1786
+ 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",
1787
+ fill: "currentColor"
1788
+ }
1789
+ )
1790
+ ] });
1791
+ }
1792
+
1793
+ // src/icons/ListingIcon.tsx
1794
+ import { jsx as jsx53, jsxs as jsxs34 } from "react/jsx-runtime";
1795
+ function ListingIcon({
1796
+ title,
1797
+ titleId,
1798
+ ...props
1799
+ }) {
1800
+ return /* @__PURE__ */ jsxs34(
1801
+ "svg",
1802
+ {
1803
+ xmlns: "http://www.w3.org/2000/svg",
1804
+ viewBox: "0 0 24 24",
1805
+ width: "1em",
1806
+ height: "1em",
1807
+ "aria-labelledby": titleId,
1808
+ ...props,
1809
+ children: [
1810
+ title ? /* @__PURE__ */ jsx53("title", { id: titleId, children: title }) : null,
1811
+ /* @__PURE__ */ jsxs34("g", { fill: "none", children: [
1812
+ /* @__PURE__ */ jsx53("path", { d: "M0 0h24v24H0V0z" }),
1813
+ /* @__PURE__ */ jsx53("path", { d: "M0 0h24v24H0V0z", opacity: ".87" })
1814
+ ] }),
1815
+ /* @__PURE__ */ jsx53(
1816
+ "path",
1817
+ {
1818
+ d: "M3 13h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7zm-4 6h2v-2H3v2zm0 4h2v-2H3v2zm0-8h2V7H3v2zm4 4h14v-2H7v2zm0 4h14v-2H7v2zM7 7v2h14V7H7z",
1819
+ fill: "currentColor"
1820
+ }
1821
+ )
1822
+ ]
1823
+ }
1824
+ );
1825
+ }
1826
+
1667
1827
  // src/icons/YouTubeIcon.tsx
1668
- import { jsx as jsx48 } from "react/jsx-runtime";
1669
- var YouTubeIcon = (props) => /* @__PURE__ */ jsx48("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx48(
1828
+ import { jsx as jsx54 } from "react/jsx-runtime";
1829
+ var YouTubeIcon = (props) => /* @__PURE__ */ jsx54("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx54(
1670
1830
  "path",
1671
1831
  {
1672
1832
  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",
@@ -1674,9 +1834,34 @@ var YouTubeIcon = (props) => /* @__PURE__ */ jsx48("svg", { xmlns: "http://www.w
1674
1834
  }
1675
1835
  ) });
1676
1836
 
1837
+ // src/icons/ListEditIcon.tsx
1838
+ import { jsx as jsx55, jsxs as jsxs35 } from "react/jsx-runtime";
1839
+ function ListEditIcon({
1840
+ title,
1841
+ titleId,
1842
+ ...props
1843
+ }) {
1844
+ return /* @__PURE__ */ jsxs35(
1845
+ "svg",
1846
+ {
1847
+ xmlns: "http://www.w3.org/2000/svg",
1848
+ height: "24",
1849
+ viewBox: "0 0 24 24",
1850
+ width: "24",
1851
+ "aria-labelledby": titleId,
1852
+ ...props,
1853
+ children: [
1854
+ title ? /* @__PURE__ */ jsx55("title", { id: titleId, children: title }) : null,
1855
+ /* @__PURE__ */ jsx55("path", { d: "M0 0h24v24H0V0z", fill: "none" }),
1856
+ /* @__PURE__ */ jsx55("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" })
1857
+ ]
1858
+ }
1859
+ );
1860
+ }
1861
+
1677
1862
  // src/icons/VideoIcon.tsx
1678
- import { jsx as jsx49 } from "react/jsx-runtime";
1679
- var VideoIcon = (props) => /* @__PURE__ */ jsx49("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx49(
1863
+ import { jsx as jsx56 } from "react/jsx-runtime";
1864
+ var VideoIcon = (props) => /* @__PURE__ */ jsx56("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx56(
1680
1865
  "path",
1681
1866
  {
1682
1867
  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",
@@ -1685,8 +1870,8 @@ var VideoIcon = (props) => /* @__PURE__ */ jsx49("svg", { xmlns: "http://www.w3.
1685
1870
  ) });
1686
1871
 
1687
1872
  // src/icons/AudioIcon.tsx
1688
- import { jsx as jsx50 } from "react/jsx-runtime";
1689
- var AudioIcon = (props) => /* @__PURE__ */ jsx50("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx50(
1873
+ import { jsx as jsx57 } from "react/jsx-runtime";
1874
+ var AudioIcon = (props) => /* @__PURE__ */ jsx57("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx57(
1690
1875
  "path",
1691
1876
  {
1692
1877
  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",
@@ -1695,8 +1880,8 @@ var AudioIcon = (props) => /* @__PURE__ */ jsx50("svg", { xmlns: "http://www.w3.
1695
1880
  ) });
1696
1881
 
1697
1882
  // src/icons/EmptyCanvasIcon.tsx
1698
- import { jsx as jsx51 } from "react/jsx-runtime";
1699
- var EmptyCanvasIcon = (props) => /* @__PURE__ */ jsx51("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx51(
1883
+ import { jsx as jsx58 } from "react/jsx-runtime";
1884
+ var EmptyCanvasIcon = (props) => /* @__PURE__ */ jsx58("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", fill: "#5f6368", viewBox: "0 -960 960 960", ...props, children: /* @__PURE__ */ jsx58(
1700
1885
  "path",
1701
1886
  {
1702
1887
  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",
@@ -1705,14 +1890,14 @@ var EmptyCanvasIcon = (props) => /* @__PURE__ */ jsx51("svg", { xmlns: "http://w
1705
1890
  ) });
1706
1891
 
1707
1892
  // src/icons/AddIcon.tsx
1708
- import { jsx as jsx52, jsxs as jsxs31 } from "react/jsx-runtime";
1893
+ import { jsx as jsx59, jsxs as jsxs36 } from "react/jsx-runtime";
1709
1894
  function AddIcon({
1710
1895
  className: className2,
1711
1896
  inline,
1712
1897
  height = 16,
1713
1898
  color = "black"
1714
1899
  }) {
1715
- return /* @__PURE__ */ jsxs31(
1900
+ return /* @__PURE__ */ jsxs36(
1716
1901
  "svg",
1717
1902
  {
1718
1903
  xmlns: "http://www.w3.org/2000/svg",
@@ -1723,17 +1908,17 @@ function AddIcon({
1723
1908
  style: { verticalAlign: inline ? "bottom" : void 0 },
1724
1909
  className: className2,
1725
1910
  children: [
1726
- /* @__PURE__ */ jsx52("path", { d: "M0 0h24v24H0z", fill: "none" }),
1727
- /* @__PURE__ */ jsx52("path", { d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z", fill: "currentColor" })
1911
+ /* @__PURE__ */ jsx59("path", { d: "M0 0h24v24H0z", fill: "none" }),
1912
+ /* @__PURE__ */ jsx59("path", { d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z", fill: "currentColor" })
1728
1913
  ]
1729
1914
  }
1730
1915
  );
1731
1916
  }
1732
1917
 
1733
1918
  // src/icons/MoreMenu.tsx
1734
- import { jsx as jsx53, jsxs as jsxs32 } from "react/jsx-runtime";
1919
+ import { jsx as jsx60, jsxs as jsxs37 } from "react/jsx-runtime";
1735
1920
  function MoreMenu2() {
1736
- return /* @__PURE__ */ jsxs32(
1921
+ return /* @__PURE__ */ jsxs37(
1737
1922
  "svg",
1738
1923
  {
1739
1924
  xmlns: "http://www.w3.org/2000/svg",
@@ -1741,8 +1926,8 @@ function MoreMenu2() {
1741
1926
  viewBox: "0 0 24 24",
1742
1927
  width: "1em",
1743
1928
  children: [
1744
- /* @__PURE__ */ jsx53("path", { d: "M0 0h24v24H0z", fill: "none" }),
1745
- /* @__PURE__ */ jsx53(
1929
+ /* @__PURE__ */ jsx60("path", { d: "M0 0h24v24H0z", fill: "none" }),
1930
+ /* @__PURE__ */ jsx60(
1746
1931
  "path",
1747
1932
  {
1748
1933
  d: "M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z",
@@ -1754,14 +1939,78 @@ function MoreMenu2() {
1754
1939
  );
1755
1940
  }
1756
1941
 
1942
+ // src/icons/PreviewIcon.tsx
1943
+ import { jsx as jsx61 } from "react/jsx-runtime";
1944
+ function PreviewIcon(props) {
1945
+ return /* @__PURE__ */ jsx61("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props, children: /* @__PURE__ */ jsx61(
1946
+ "path",
1947
+ {
1948
+ fill: "currentColor",
1949
+ 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"
1950
+ }
1951
+ ) });
1952
+ }
1953
+
1954
+ // src/icons/ImageListIcon.tsx
1955
+ import { jsx as jsx62 } from "react/jsx-runtime";
1956
+ function ImageListIcon(props) {
1957
+ return /* @__PURE__ */ jsx62("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props, children: /* @__PURE__ */ jsx62(
1958
+ "path",
1959
+ {
1960
+ fill: "currentColor",
1961
+ 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"
1962
+ }
1963
+ ) });
1964
+ }
1965
+
1966
+ // src/icons/BackIcon.tsx
1967
+ import { jsx as jsx63 } from "react/jsx-runtime";
1968
+ function BackIcon(props) {
1969
+ return /* @__PURE__ */ jsx63("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props, children: /* @__PURE__ */ jsx63("path", { fill: "currentColor", d: "M20 11H7.83l5.59-5.59L12 4l-8 8l8 8l1.41-1.41L7.83 13H20z" }) });
1970
+ }
1971
+
1972
+ // src/icons/GridIcon.tsx
1973
+ import { jsx as jsx64, jsxs as jsxs38 } from "react/jsx-runtime";
1974
+ function GridIcon(props) {
1975
+ return /* @__PURE__ */ jsxs38("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props, children: [
1976
+ /* @__PURE__ */ jsx64(
1977
+ "path",
1978
+ {
1979
+ fill: "currentColor",
1980
+ d: "M10 10h4v4h-4zm0 6h4v4h-4zM4 4h4v4H4zm0 6h4v4H4zm0 6h4v4H4zM16 4h4v4h-4zm0 6h4v4h-4zm0 6h4v4h-4zM10 4h4v4h-4z",
1981
+ opacity: ".3"
1982
+ }
1983
+ ),
1984
+ /* @__PURE__ */ jsx64(
1985
+ "path",
1986
+ {
1987
+ fill: "currentColor",
1988
+ 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"
1989
+ }
1990
+ )
1991
+ ] });
1992
+ }
1993
+
1994
+ // src/icons/ScaledImageIcon.tsx
1995
+ import { jsx as jsx65 } from "react/jsx-runtime";
1996
+ function ScaledImageIcon(props) {
1997
+ return /* @__PURE__ */ jsx65("svg", { xmlns: "http://www.w3.org/2000/svg", width: "1em", height: "1em", viewBox: "0 0 24 24", ...props, children: /* @__PURE__ */ jsx65(
1998
+ "path",
1999
+ {
2000
+ fill: "currentColor",
2001
+ 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"
2002
+ }
2003
+ ) });
2004
+ }
2005
+
1757
2006
  // src/ErrorMessage.tsx
1758
- import { twMerge as twMerge7 } from "tailwind-merge";
1759
- import { jsx as jsx54 } from "react/jsx-runtime";
2007
+ import { twMerge as twMerge8 } from "tailwind-merge";
2008
+ import { jsx as jsx66 } from "react/jsx-runtime";
1760
2009
  function ErrorMessage({ children, small = false, className: className2 }) {
1761
- return /* @__PURE__ */ jsx54(
2010
+ return /* @__PURE__ */ jsx66(
1762
2011
  "div",
1763
2012
  {
1764
- className: twMerge7(
2013
+ className: twMerge8(
1765
2014
  "bg-red-500 text-white",
1766
2015
  "border-1 drop-shadow border-red-700 w-full rounded-md py-2 px-4 leading-[1.9em] flex items-center",
1767
2016
  "has-[a]:text-white",
@@ -1795,11 +2044,11 @@ function useFastList(list, firstRender = 24) {
1795
2044
 
1796
2045
  // src/RenderTextualContent.tsx
1797
2046
  import { useState as useState6 } from "react";
1798
- import { Button as Button6 } from "react-aria-components";
2047
+ import { Button as Button8 } from "react-aria-components";
1799
2048
  import {
1800
- LocaleString as LocaleString3
2049
+ LocaleString as LocaleString5
1801
2050
  } from "react-iiif-vault";
1802
- import { jsx as jsx55, jsxs as jsxs33 } from "react/jsx-runtime";
2051
+ import { jsx as jsx67, jsxs as jsxs39 } from "react/jsx-runtime";
1803
2052
  function RenderTextualContent(props) {
1804
2053
  const languages = props.strategy.items.map(
1805
2054
  (item) => Object.keys(item.text)[0]
@@ -1808,10 +2057,10 @@ function RenderTextualContent(props) {
1808
2057
  const selected = props.strategy.items.find(
1809
2058
  (item) => Object.keys(item.text)[0] === langauge
1810
2059
  );
1811
- return /* @__PURE__ */ jsxs33("div", { className: "overflow-y-auto bg-white shadow", children: [
1812
- /* @__PURE__ */ jsx55("div", { className: "flex gap-2 border-b", children: languages.map((language) => {
1813
- return /* @__PURE__ */ jsx55(
1814
- Button6,
2060
+ return /* @__PURE__ */ jsxs39("div", { className: "overflow-y-auto bg-white shadow", children: [
2061
+ /* @__PURE__ */ jsx67("div", { className: "flex gap-2 border-b", children: languages.map((language) => {
2062
+ return /* @__PURE__ */ jsx67(
2063
+ Button8,
1815
2064
  {
1816
2065
  className: `py-1 px-3 ${langauge === language ? "bg-me-500 text-white" : "bg-white text-black"}`,
1817
2066
  onPress: () => setLanguage(language),
@@ -1820,11 +2069,11 @@ function RenderTextualContent(props) {
1820
2069
  language
1821
2070
  );
1822
2071
  }) }),
1823
- /* @__PURE__ */ jsx55("div", { className: "p-4 prose", children: /* @__PURE__ */ jsx55(
1824
- LocaleString3,
2072
+ /* @__PURE__ */ jsx67("div", { className: "p-4 prose", children: /* @__PURE__ */ jsx67(
2073
+ LocaleString5,
1825
2074
  {
1826
2075
  enableDangerouslySetInnerHTML: true,
1827
- defaultText: /* @__PURE__ */ jsx55("span", { className: "text-gray-500 my-8", children: "No content available" }),
2076
+ defaultText: /* @__PURE__ */ jsx67("span", { className: "text-gray-500 my-8", children: "No content available" }),
1828
2077
  children: selected?.text
1829
2078
  }
1830
2079
  ) })
@@ -1840,13 +2089,13 @@ import { MediaPlayer, MediaProvider, Poster, Gesture, Track } from "@vidstack/re
1840
2089
  import { defaultLayoutIcons, DefaultVideoLayout } from "@vidstack/react/player/layouts/default";
1841
2090
  import { getValue } from "@iiif/helpers";
1842
2091
  import { useRef as useRef5 } from "react";
1843
- import { Fragment as Fragment5, jsx as jsx56, jsxs as jsxs34 } from "react/jsx-runtime";
2092
+ import { Fragment as Fragment5, jsx as jsx68, jsxs as jsxs40 } from "react/jsx-runtime";
1844
2093
  function IIIFMediaPlayer(props) {
1845
2094
  const mediaPlayer = useRef5(null);
1846
2095
  const captions = props.captions || [];
1847
2096
  const language = props.language;
1848
2097
  const timeRef = useRef5(props.startTime || 0);
1849
- return /* @__PURE__ */ jsx56(
2098
+ return /* @__PURE__ */ jsx68(
1850
2099
  MediaPlayer,
1851
2100
  {
1852
2101
  onTimeUpdate: (time) => {
@@ -1867,9 +2116,9 @@ function IIIFMediaPlayer(props) {
1867
2116
  type: props.media.format
1868
2117
  }
1869
2118
  ],
1870
- children: /* @__PURE__ */ jsxs34(MediaProvider, { className: "w-full h-full [&>video]:w-full [&>video]:h-full [&>video]:object-contain", children: [
2119
+ children: /* @__PURE__ */ jsxs40(MediaProvider, { className: "w-full h-full [&>video]:w-full [&>video]:h-full [&>video]:object-contain", children: [
1871
2120
  captions.map((caption) => {
1872
- return /* @__PURE__ */ jsx56(
2121
+ return /* @__PURE__ */ jsx68(
1873
2122
  Track,
1874
2123
  {
1875
2124
  src: caption.id,
@@ -1881,15 +2130,15 @@ function IIIFMediaPlayer(props) {
1881
2130
  caption.id
1882
2131
  );
1883
2132
  }),
1884
- props.poster ? /* @__PURE__ */ jsx56(
2133
+ props.poster ? /* @__PURE__ */ jsx68(
1885
2134
  Poster,
1886
2135
  {
1887
2136
  className: "absolute inset-0 bg-black block h-full w-full opacity-0 transition-opacity data-[visible]:opacity-100 object-contain",
1888
2137
  src: props.poster
1889
2138
  }
1890
2139
  ) : null,
1891
- /* @__PURE__ */ jsx56(Gestures, {}),
1892
- /* @__PURE__ */ jsx56(
2140
+ /* @__PURE__ */ jsx68(Gestures, {}),
2141
+ /* @__PURE__ */ jsx68(
1893
2142
  DefaultVideoLayout,
1894
2143
  {
1895
2144
  className: "z-1",
@@ -1902,8 +2151,8 @@ function IIIFMediaPlayer(props) {
1902
2151
  );
1903
2152
  }
1904
2153
  function Gestures() {
1905
- return /* @__PURE__ */ jsxs34(Fragment5, { children: [
1906
- /* @__PURE__ */ jsx56(
2154
+ return /* @__PURE__ */ jsxs40(Fragment5, { children: [
2155
+ /* @__PURE__ */ jsx68(
1907
2156
  Gesture,
1908
2157
  {
1909
2158
  className: "pointer-coarse:hidden absolute top-0 start-12 bottom-20 right-0 -z-1 block",
@@ -1911,7 +2160,7 @@ function Gestures() {
1911
2160
  action: "toggle:paused"
1912
2161
  }
1913
2162
  ),
1914
- /* @__PURE__ */ jsx56(Gesture, { className: "absolute inset-0 z-0 block h-full w-full", event: "dblpointerup", action: "toggle:fullscreen" })
2163
+ /* @__PURE__ */ jsx68(Gesture, { className: "absolute inset-0 z-0 block h-full w-full", event: "dblpointerup", action: "toggle:fullscreen" })
1915
2164
  ] });
1916
2165
  }
1917
2166
  export {
@@ -1920,8 +2169,11 @@ export {
1920
2169
  AddImageIcon,
1921
2170
  AtlasBanner,
1922
2171
  AudioIcon,
2172
+ BackIcon,
1923
2173
  CanvasThumbnailGridItem,
1924
2174
  Card3D,
2175
+ CollectionIcon,
2176
+ CollectionListItem,
1925
2177
  ConfirmSelectionButton,
1926
2178
  ControlButton,
1927
2179
  CreateCanvasIcon,
@@ -1934,6 +2186,7 @@ export {
1934
2186
  EmptyState,
1935
2187
  ErrorMessage,
1936
2188
  Form,
2189
+ GridIcon,
1937
2190
  HTMLEditor,
1938
2191
  HTMLIcon,
1939
2192
  HandleContainer,
@@ -1941,21 +2194,31 @@ export {
1941
2194
  IIIFLogo,
1942
2195
  IIIFMediaPlayer,
1943
2196
  IconButton,
2197
+ ImageListIcon,
2198
+ InfoIcon,
1944
2199
  ItemWithHandle,
1945
2200
  LazyThumbnail,
2201
+ ListEditIcon,
2202
+ ListingIcon,
1946
2203
  MDXEditor,
1947
2204
  ManifestEditorLogo,
2205
+ ManifestIcon,
2206
+ ManifestListItem,
1948
2207
  ManifestOverviewEmptyState,
1949
2208
  MetadataContainer,
1950
2209
  Modal,
2210
+ ModalBackSlot,
1951
2211
  MoreMenu2 as MoreMenu,
1952
2212
  OpaqueControls,
1953
2213
  PanelSideMenu,
2214
+ PreviewIcon,
1954
2215
  RenderTextualContent,
2216
+ ScaledImageIcon,
1955
2217
  Sidebar,
1956
2218
  SidebarContent,
1957
2219
  SidebarHeader,
1958
2220
  SidebarTabs,
2221
+ Spinner,
1959
2222
  SvgControlBar,
1960
2223
  Tab,
1961
2224
  TabList,