@manifest-editor/components 2.2.2-next.0.903673e → 2.2.2-next.0.92cba17

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/README.md CHANGED
@@ -34,6 +34,14 @@ export function SaveButton() {
34
34
 
35
35
  Use React 19. Components that read IIIF resources or editor state need the corresponding Vault or shell providers. The combined editor includes the shared styles.
36
36
 
37
+ Rich-text editors, media playback and the IIIF browser load their implementations when mounted,
38
+ using React lazy boundaries with localized loading indicators. These boundaries also work in
39
+ non-Next hosts. Imperative editor refs become available when the deferred component mounts.
40
+ Locale/profile changes keep the mounted editor and its draft state intact.
41
+
42
+ ESM/CJS application bundlers can split these implementations into separate chunks. The classic
43
+ CDN facade keeps its single integrity-checked script and defers their initialization within it.
44
+
37
45
  ## API overview
38
46
 
39
47
  - Controls: `ActionButton`, `IconButton`, selection controls, tooltips, and menus.
@@ -43,3 +51,62 @@ Use React 19. Components that read IIIF resources or editor state need the corre
43
51
  - Icons and hooks are exported from the package root.
44
52
 
45
53
  See the [source exports](https://github.com/digirati-co-uk/iiif-manifest-editor/tree/main/packages/components/src) for the complete API and TypeScript definitions.
54
+
55
+ ## Interface language
56
+
57
+ Package-owned labels use the shared `@manifest-editor/i18n` runtime. Without an
58
+ `EditorI18nProvider`, controls use the built-in English catalog. Wrap components
59
+ in the host's existing provider to share live locale and wording changes; this
60
+ package never creates a second provider instance or reads browser language/storage
61
+ for UI selection. The host explicitly enables optional Dutch catalogs from
62
+ `@manifest-editor/i18n/nl` (see the runtime README).
63
+
64
+ `CreatorGrid` accepts optional `labelMessage`, and its items accept `titleMessage`
65
+ and `descriptionMessage`. Panel menu items and sidebar tabs accept `labelMessage`;
66
+ `SidebarHeader` and its actions accept `titleMessage`; `IconButton` accepts
67
+ `labelMessage`. These serialisable public message references resolve at render
68
+ time, with the existing string props as legacy fallbacks. Keep stable IDs unchanged.
69
+
70
+ Caller-supplied children, labels and IIIF `InternationalString` values remain caller
71
+ content. UI locale does not change content languages, caption languages, generated
72
+ resource data or download filenames. Tooltip/modal/toast portals retain the shared
73
+ React context and carry the UI language/direction. React Aria collection, modal
74
+ and toast roots also receive the selected UI locale for dependency instructions.
75
+
76
+ The module implementation guide records dependency-owned localisation gaps and
77
+ validation evidence; optional catalogs alone do not establish whole-editor coverage.
78
+
79
+ ### Dependency adapters
80
+
81
+ The hosted workspace maintains version-specific patches for `iiif-browser` 2.2.6,
82
+ `@vidstack/react` 1.12.12 and MDXEditor 4.0.4. These adapters require those patches
83
+ (or equivalent upstream APIs); independently installed npm consumers do not receive
84
+ the workspace patches automatically. See [patch maintenance](../../patches/README.md).
85
+
86
+ ```tsx
87
+ import {
88
+ LocalizedIIIFBrowser, IIIFBrowserI18nProvider,
89
+ useIIIFBrowserI18n, useMediaTimeTranslations,
90
+ } from "@manifest-editor/components";
91
+
92
+ // Direct browser: resolves built-in UI under the existing editor runtime.
93
+ <LocalizedIIIFBrowser {...browserProps} />;
94
+
95
+ // Plugin hosts: covers browser dialogs and their sibling image-options screens.
96
+ <IIIFBrowserI18nProvider><MyTiptapEditor /></IIIFBrowserI18nProvider>;
97
+
98
+ // When keeping the dependency's component import:
99
+ const i18n = useIIIFBrowserI18n();
100
+ <IIIFBrowser {...browserProps} i18n={i18n} />;
101
+
102
+ // Independent media consumers; contentLanguage still selects subtitle/content language.
103
+ const uiTime = useMediaTimeTranslations();
104
+ <MediaPlayer uiTime={uiTime} lang={contentLanguage}>{children}</MediaPlayer>;
105
+ ```
106
+
107
+ `MDXEditor` already supplies the browser provider and existing MDX translation
108
+ callback. `IIIFMediaPlayer` already supplies time speech and the layout dictionary.
109
+ Locale switches update phrases/formatters and built-in command search without
110
+ remounting browsers, players or source editors. Caller output labels remain caller
111
+ content; migrate them in their owning namespace. Browser message metadata applies
112
+ only to explicit UI descriptors, never by matching the text of an authored label.
@@ -0,0 +1,3 @@
1
+ 'use client'
2
+ import{MDXEditor as e}from"./MDXEditorImpl-0XZVgBT6.js";import{jsx as t}from"react/jsx-runtime";import{twMerge as n}from"tailwind-merge";import{useCallback as r,useEffect as i,useMemo as a,useRef as o}from"react";import{useDebounce as s}from"tiny-use-debounce";import{Converter as c}from"showdown";import l from"turndown";const u=new c;u.setFlavor(`github`);const d=new l;d.addRule(`iiif-image`,{filter:e=>e.nodeName===`IMG`&&e.getAttribute(`data-iiif-image`)===`true`,replacement:(e,t)=>t.outerHTML.replace(/\/?>$/,` />`)});function f(e){return d.turndown(e)}function p(e){return u.makeHtml(e)}function m({className:c,value:l,onChange:u,disabled:d}){let m=o(null),h=o(l),g=o(u);i(()=>{g.current=u},[u]);let _=r(()=>{if(m.current){let e=p(m.current.getMarkdown());e!==h.current&&(h.current=e,g.current(e))}},[]),v=s(_,400),y=a(()=>f(l),[l]);return i(()=>{l!==h.current&&(h.current=l,m.current?.setMarkdown(y))},[y,l]),i(()=>{let e=m.current,t=()=>{if(!e)return;let t=p(e.getMarkdown());t!==h.current&&(h.current=t,g.current(t))};return()=>{v.cancel(),t()}},[v]),t(e,{editorRef:m,onBlur:_,readOnly:d,className:n([`me-html-editor prose prose-sm max-w-none text-sm prose-a:text-me-primary-500 prose-a:underline prose-ul:list-disc`,`prose-ol:list-decimal relative`].join(` `),c),markdown:y,onError:e=>{console.log(`err`,e)},onChange:()=>{v()}})}export{m as HTMLEditor};
3
+ //# sourceMappingURL=HTMLEditorImpl-BTL6pknt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HTMLEditorImpl-BTL6pknt.js","names":[],"sources":["../src/html-editor-conversion.ts","../src/HTMLEditorImpl.tsx"],"sourcesContent":["import { Converter } from \"showdown\";\nimport TurndownService from \"turndown\";\n\nconst converter = new Converter();\nconverter.setFlavor(\"github\");\n\nconst turndownService = new TurndownService();\nturndownService.addRule(\"iiif-image\", {\n filter: (node) =>\n node.nodeName === \"IMG\" && node.getAttribute(\"data-iiif-image\") === \"true\",\n replacement: (_content, node) =>\n (node as HTMLElement).outerHTML.replace(/\\/?>$/, \" />\"),\n});\n\nexport function htmlToMarkdown(value: string) {\n return turndownService.turndown(value);\n}\n\nexport function markdownToHtml(value: string) {\n return converter.makeHtml(value);\n}\n","import type { MDXEditorMethods } from \"@mdxeditor/editor\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useDebounce } from \"tiny-use-debounce\";\nimport { htmlToMarkdown, markdownToHtml } from \"./html-editor-conversion\";\nimport { MDXEditor } from \"./MDXEditorImpl\";\nimport \"./HTMLEditor.css\";\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 lastEmittedHtml = useRef(value);\n const onChangeRef = useRef(onChange);\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n const internalOnChange = useCallback(() => {\n if (editorRef.current) {\n const nextHtml = markdownToHtml(editorRef.current.getMarkdown());\n if (nextHtml !== lastEmittedHtml.current) {\n lastEmittedHtml.current = nextHtml;\n onChangeRef.current(nextHtml);\n }\n }\n }, []);\n const debounceSave = useDebounce(internalOnChange, 400);\n const markdown = useMemo(() => {\n return htmlToMarkdown(value);\n }, [value]);\n\n useEffect(() => {\n if (value === lastEmittedHtml.current) return;\n lastEmittedHtml.current = value;\n editorRef.current?.setMarkdown(markdown);\n }, [markdown, value]);\n\n useEffect(() => {\n const ref = editorRef.current;\n const saveCurrentValue = () => {\n if (!ref) {\n return;\n }\n\n const nextHtml = markdownToHtml(ref.getMarkdown());\n if (nextHtml !== lastEmittedHtml.current) {\n lastEmittedHtml.current = nextHtml;\n onChangeRef.current(nextHtml);\n }\n };\n\n return () => {\n debounceSave.cancel();\n saveCurrentValue();\n };\n }, [debounceSave]);\n\n return (\n <MDXEditor\n editorRef={editorRef}\n onBlur={internalOnChange}\n readOnly={disabled}\n className={twMerge(\n [\n \"me-html-editor prose prose-sm max-w-none text-sm prose-a:text-me-primary-500 prose-a:underline prose-ul:list-disc\",\n \"prose-ol:list-decimal relative\",\n ].join(\" \"),\n className\n )}\n markdown={markdown}\n onError={(err) => {\n console.log(\"err\", err);\n }}\n onChange={() => {\n debounceSave();\n }}\n />\n );\n}\n"],"mappings":";kUAGA,MAAM,EAAY,IAAI,EACtB,EAAU,UAAU,QAAQ,EAE5B,MAAM,EAAkB,IAAI,EAC5B,EAAgB,QAAQ,aAAc,CACpC,OAAS,GACP,EAAK,WAAa,OAAS,EAAK,aAAa,iBAAiB,IAAM,OACtE,aAAc,EAAU,IACrB,EAAqB,UAAU,QAAQ,QAAS,KAAK,CAC1D,CAAC,EAED,SAAgB,EAAe,EAAe,CAC5C,OAAO,EAAgB,SAAS,CAAK,CACvC,CAEA,SAAgB,EAAe,EAAe,CAC5C,OAAO,EAAU,SAAS,CAAK,CACjC,CCZA,SAAgB,EAAW,CACzB,YACA,QACA,WACA,YAMC,CACD,IAAM,EAAY,EAAyB,IAAI,EACzC,EAAkB,EAAO,CAAK,EAC9B,EAAc,EAAO,CAAQ,EAEnC,MAAgB,CACd,EAAY,QAAU,CACxB,EAAG,CAAC,CAAQ,CAAC,EAEb,IAAM,EAAmB,MAAkB,CACzC,GAAI,EAAU,QAAS,CACrB,IAAM,EAAW,EAAe,EAAU,QAAQ,YAAY,CAAC,EAC3D,IAAa,EAAgB,UAC/B,EAAgB,QAAU,EAC1B,EAAY,QAAQ,CAAQ,EAEhC,CACF,EAAG,CAAC,CAAC,EACC,EAAe,EAAY,EAAkB,GAAG,EAChD,EAAW,MACR,EAAe,CAAK,EAC1B,CAAC,CAAK,CAAC,EA4BV,OA1BA,MAAgB,CACV,IAAU,EAAgB,UAC9B,EAAgB,QAAU,EAC1B,EAAU,SAAS,YAAY,CAAQ,EACzC,EAAG,CAAC,EAAU,CAAK,CAAC,EAEpB,MAAgB,CACd,IAAM,EAAM,EAAU,QAChB,MAAyB,CAC7B,GAAI,CAAC,EACH,OAGF,IAAM,EAAW,EAAe,EAAI,YAAY,CAAC,EAC7C,IAAa,EAAgB,UAC/B,EAAgB,QAAU,EAC1B,EAAY,QAAQ,CAAQ,EAEhC,EAEA,UAAa,CACX,EAAa,OAAO,EACpB,EAAiB,CACnB,CACF,EAAG,CAAC,CAAY,CAAC,EAGf,EAAC,EAAD,CACa,YACX,OAAQ,EACR,SAAU,EACV,UAAW,EACT,CACE,oHACA,gCACF,CAAC,CAAC,KAAK,GAAG,EACV,CACF,EACU,WACV,QAAU,GAAQ,CAChB,QAAQ,IAAI,MAAO,CAAG,CACxB,EACA,aAAgB,CACd,EAAa,CACf,CACD,CAAA,CAEL"}
@@ -0,0 +1,3 @@
1
+ 'use client'
2
+ const e=require("./IIIFBrowserI18n-BqjV5W5b.cjs"),t=require("./MDXEditorImpl-Db_xagm5.cjs");let n=require("react/jsx-runtime"),r=require("tailwind-merge"),i=require("react"),a=require("tiny-use-debounce"),o=require("showdown"),s=require("turndown");s=e.s(s,1);const c=new o.Converter;c.setFlavor(`github`);const l=new s.default;l.addRule(`iiif-image`,{filter:e=>e.nodeName===`IMG`&&e.getAttribute(`data-iiif-image`)===`true`,replacement:(e,t)=>t.outerHTML.replace(/\/?>$/,` />`)});function u(e){return l.turndown(e)}function d(e){return c.makeHtml(e)}function f({className:e,value:o,onChange:s,disabled:c}){let l=(0,i.useRef)(null),f=(0,i.useRef)(o),p=(0,i.useRef)(s);(0,i.useEffect)(()=>{p.current=s},[s]);let m=(0,i.useCallback)(()=>{if(l.current){let e=d(l.current.getMarkdown());e!==f.current&&(f.current=e,p.current(e))}},[]),h=(0,a.useDebounce)(m,400),g=(0,i.useMemo)(()=>u(o),[o]);return(0,i.useEffect)(()=>{o!==f.current&&(f.current=o,l.current?.setMarkdown(g))},[g,o]),(0,i.useEffect)(()=>{let e=l.current,t=()=>{if(!e)return;let t=d(e.getMarkdown());t!==f.current&&(f.current=t,p.current(t))};return()=>{h.cancel(),t()}},[h]),(0,n.jsx)(t.MDXEditor,{editorRef:l,onBlur:m,readOnly:c,className:(0,r.twMerge)([`me-html-editor prose prose-sm max-w-none text-sm prose-a:text-me-primary-500 prose-a:underline prose-ul:list-disc`,`prose-ol:list-decimal relative`].join(` `),e),markdown:g,onError:e=>{console.log(`err`,e)},onChange:()=>{h()}})}exports.HTMLEditor=f;
3
+ //# sourceMappingURL=HTMLEditorImpl-YSNaSOFQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HTMLEditorImpl-YSNaSOFQ.cjs","names":["Converter","TurndownService","useRef","useCallback","useDebounce","useMemo","MDXEditor","twMerge"],"sources":["../src/html-editor-conversion.ts","../src/HTMLEditorImpl.tsx"],"sourcesContent":["import { Converter } from \"showdown\";\nimport TurndownService from \"turndown\";\n\nconst converter = new Converter();\nconverter.setFlavor(\"github\");\n\nconst turndownService = new TurndownService();\nturndownService.addRule(\"iiif-image\", {\n filter: (node) =>\n node.nodeName === \"IMG\" && node.getAttribute(\"data-iiif-image\") === \"true\",\n replacement: (_content, node) =>\n (node as HTMLElement).outerHTML.replace(/\\/?>$/, \" />\"),\n});\n\nexport function htmlToMarkdown(value: string) {\n return turndownService.turndown(value);\n}\n\nexport function markdownToHtml(value: string) {\n return converter.makeHtml(value);\n}\n","import type { MDXEditorMethods } from \"@mdxeditor/editor\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { twMerge } from \"tailwind-merge\";\nimport { useDebounce } from \"tiny-use-debounce\";\nimport { htmlToMarkdown, markdownToHtml } from \"./html-editor-conversion\";\nimport { MDXEditor } from \"./MDXEditorImpl\";\nimport \"./HTMLEditor.css\";\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 lastEmittedHtml = useRef(value);\n const onChangeRef = useRef(onChange);\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n const internalOnChange = useCallback(() => {\n if (editorRef.current) {\n const nextHtml = markdownToHtml(editorRef.current.getMarkdown());\n if (nextHtml !== lastEmittedHtml.current) {\n lastEmittedHtml.current = nextHtml;\n onChangeRef.current(nextHtml);\n }\n }\n }, []);\n const debounceSave = useDebounce(internalOnChange, 400);\n const markdown = useMemo(() => {\n return htmlToMarkdown(value);\n }, [value]);\n\n useEffect(() => {\n if (value === lastEmittedHtml.current) return;\n lastEmittedHtml.current = value;\n editorRef.current?.setMarkdown(markdown);\n }, [markdown, value]);\n\n useEffect(() => {\n const ref = editorRef.current;\n const saveCurrentValue = () => {\n if (!ref) {\n return;\n }\n\n const nextHtml = markdownToHtml(ref.getMarkdown());\n if (nextHtml !== lastEmittedHtml.current) {\n lastEmittedHtml.current = nextHtml;\n onChangeRef.current(nextHtml);\n }\n };\n\n return () => {\n debounceSave.cancel();\n saveCurrentValue();\n };\n }, [debounceSave]);\n\n return (\n <MDXEditor\n editorRef={editorRef}\n onBlur={internalOnChange}\n readOnly={disabled}\n className={twMerge(\n [\n \"me-html-editor prose prose-sm max-w-none text-sm prose-a:text-me-primary-500 prose-a:underline prose-ul:list-disc\",\n \"prose-ol:list-decimal relative\",\n ].join(\" \"),\n className\n )}\n markdown={markdown}\n onError={(err) => {\n console.log(\"err\", err);\n }}\n onChange={() => {\n debounceSave();\n }}\n />\n );\n}\n"],"mappings":";oQAGA,MAAM,EAAY,IAAIA,EAAAA,UACtB,EAAU,UAAU,QAAQ,EAE5B,MAAM,EAAkB,IAAIC,EAAAA,QAC5B,EAAgB,QAAQ,aAAc,CACpC,OAAS,GACP,EAAK,WAAa,OAAS,EAAK,aAAa,iBAAiB,IAAM,OACtE,aAAc,EAAU,IACrB,EAAqB,UAAU,QAAQ,QAAS,KAAK,CAC1D,CAAC,EAED,SAAgB,EAAe,EAAe,CAC5C,OAAO,EAAgB,SAAS,CAAK,CACvC,CAEA,SAAgB,EAAe,EAAe,CAC5C,OAAO,EAAU,SAAS,CAAK,CACjC,CCZA,SAAgB,EAAW,CACzB,YACA,QACA,WACA,YAMC,CACD,IAAM,GAAA,EAAYC,EAAAA,OAAAA,CAAyB,IAAI,EACzC,GAAA,EAAkBA,EAAAA,OAAAA,CAAO,CAAK,EAC9B,GAAA,EAAcA,EAAAA,OAAAA,CAAO,CAAQ,GAEnC,EAAA,EAAA,UAAA,KAAgB,CACd,EAAY,QAAU,CACxB,EAAG,CAAC,CAAQ,CAAC,EAEb,IAAM,GAAA,EAAmBC,EAAAA,YAAAA,KAAkB,CACzC,GAAI,EAAU,QAAS,CACrB,IAAM,EAAW,EAAe,EAAU,QAAQ,YAAY,CAAC,EAC3D,IAAa,EAAgB,UAC/B,EAAgB,QAAU,EAC1B,EAAY,QAAQ,CAAQ,EAEhC,CACF,EAAG,CAAC,CAAC,EACC,GAAA,EAAeC,EAAAA,YAAAA,CAAY,EAAkB,GAAG,EAChD,GAAA,EAAWC,EAAAA,QAAAA,KACR,EAAe,CAAK,EAC1B,CAAC,CAAK,CAAC,EA4BV,OA1BA,EAAA,EAAA,UAAA,KAAgB,CACV,IAAU,EAAgB,UAC9B,EAAgB,QAAU,EAC1B,EAAU,SAAS,YAAY,CAAQ,EACzC,EAAG,CAAC,EAAU,CAAK,CAAC,GAEpB,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAM,EAAU,QAChB,MAAyB,CAC7B,GAAI,CAAC,EACH,OAGF,IAAM,EAAW,EAAe,EAAI,YAAY,CAAC,EAC7C,IAAa,EAAgB,UAC/B,EAAgB,QAAU,EAC1B,EAAY,QAAQ,CAAQ,EAEhC,EAEA,UAAa,CACX,EAAa,OAAO,EACpB,EAAiB,CACnB,CACF,EAAG,CAAC,CAAY,CAAC,GAGf,EAAA,EAAA,IAAA,CAACC,EAAAA,UAAD,CACa,YACX,OAAQ,EACR,SAAU,EACV,WAAA,EAAWC,EAAAA,QAAAA,CACT,CACE,oHACA,gCACF,CAAC,CAAC,KAAK,GAAG,EACV,CACF,EACU,WACV,QAAU,GAAQ,CAChB,QAAQ,IAAI,MAAO,CAAG,CACxB,EACA,aAAgB,CACd,EAAa,CACf,CACD,CAAA,CAEL"}
@@ -0,0 +1,3 @@
1
+ 'use client'
2
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,o)=>(o=n==null?{}:e(i(n)),s(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n));let l=require("react/jsx-runtime"),u=require("@manifest-editor/i18n"),d=require("react-aria"),f=require("react");f=c(f,1);function p({children:e}){let{locale:t}=(0,u.useEditorI18n)();return(0,l.jsx)(d.I18nProvider,{locale:t,children:e})}function m(e){let t=(0,u.useTranslations)(`components`);return(0,l.jsx)(`svg`,{width:`1em`,height:`1em`,viewBox:`0 0 42 42`,xmlns:`http://www.w3.org/2000/svg`,stroke:`currentColor`,role:`img`,"aria-label":t(`controls.loading`),...e,children:(0,l.jsxs)(`g`,{transform:`translate(2 2)`,strokeWidth:5,fill:`none`,fillRule:`evenodd`,children:[(0,l.jsx)(`circle`,{strokeOpacity:.5,cx:18,cy:18,r:18}),(0,l.jsx)(`path`,{d:`M36 18c0-9.94-8.06-18-18-18`,children:(0,l.jsx)(`animateTransform`,{attributeName:`transform`,type:`rotate`,from:`0 18 18`,to:`360 18 18`,dur:`1s`,repeatCount:`indefinite`})})]})})}const h=(0,f.lazy)(()=>Promise.resolve().then(()=>require("./IIIFBrowserI18nImpl-B3WDLcnW.cjs")).then(e=>e.t).then(e=>({default:e.LocalizedIIIFBrowser}))),g=(0,f.lazy)(()=>Promise.resolve().then(()=>require("./IIIFBrowserI18nImpl-B3WDLcnW.cjs")).then(e=>e.t).then(e=>({default:e.IIIFBrowserI18nProvider})));function _(){let e=(0,u.useTranslations)(`components`),{locale:t,direction:n,profile:r}=(0,u.useEditorI18n)();return(0,f.useMemo)(()=>{let r=new Intl.NumberFormat(t),i=new Intl.RelativeTimeFormat(t,{numeric:`auto`});return{locale:t,direction:n,translate:(t,n,i)=>{let a=i&&Object.fromEntries(Object.entries(i).map(([e,t])=>[e,e!==`count`&&typeof t==`number`?r.format(t):t]));return e(`browser.${t}`,a,{defaultValue:n})},formatRelativeTime:(e,t,n)=>i.format(n===`ago`?-e:e,{second:`second`,minute:`minute`,hour:`hour`,day:`day`,week:`week`,month:`month`,year:`year`}[t]??`second`)}},[e,t,n,r])}function v({children:e}){return(0,l.jsx)(f.Suspense,{fallback:(0,l.jsx)(m,{}),children:(0,l.jsx)(g,{children:e})})}function y(e){return(0,l.jsx)(f.Suspense,{fallback:(0,l.jsx)(m,{}),children:(0,l.jsx)(h,{...e})})}Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return v}});
3
+ //# sourceMappingURL=IIIFBrowserI18n-BqjV5W5b.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IIIFBrowserI18n-BqjV5W5b.cjs","names":["useEditorI18n","I18nProvider","useTranslations","lazy","useTranslations","useEditorI18n","useMemo","Suspense"],"sources":["../src/ComponentI18nProvider.tsx","../src/Spinner.tsx","../src/IIIFBrowserI18n.tsx"],"sourcesContent":["import { useEditorI18n } from \"@manifest-editor/i18n\";\nimport type { ReactNode } from \"react\";\nimport { I18nProvider } from \"react-aria\";\n\n/** Keep React Aria's built-in instructions/collation on the UI locale, independently of IIIF content. */\nexport function ComponentI18nProvider({ children }: { children: ReactNode }) {\n const { locale } = useEditorI18n();\n return <I18nProvider locale={locale}>{children}</I18nProvider>;\n}\n","import { useTranslations } from \"@manifest-editor/i18n\";\nimport * as React from \"react\";\n\nexport function Spinner(props: React.SVGProps<SVGSVGElement>) {\n const t = useTranslations(\"components\");\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 // SVG retains scalable animation; native img cannot represent these children.\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role\n role=\"img\"\n aria-label={t(\"controls.loading\")}\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 { useEditorI18n, useTranslations } from \"@manifest-editor/i18n\";\nimport type { BrowserI18n, IIIFBrowserProps } from \"iiif-browser\";\nimport { lazy, Suspense, useMemo, type ReactNode } from \"react\";\nimport { Spinner } from \"./Spinner\";\n\nconst Browser = lazy(() =>\n import(\"./IIIFBrowserI18nImpl\").then((module) => ({ default: module.LocalizedIIIFBrowser }))\n);\nconst Provider = lazy(() =>\n import(\"./IIIFBrowserI18nImpl\").then((module) => ({ default: module.IIIFBrowserI18nProvider }))\n);\n\n/** Portable inputs for direct browsers and plugin-owned browsers. Never translates resource content. */\nexport function useIIIFBrowserI18n(): BrowserI18n {\n const t = useTranslations(\"components\");\n const { locale, direction, profile } = useEditorI18n();\n return useMemo(\n () => {\n const number = new Intl.NumberFormat(locale);\n const relativeTime = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n return {\n locale,\n direction,\n translate: (key, defaultValue, values) => {\n const formatted =\n values &&\n Object.fromEntries(\n Object.entries(values).map(([name, value]) => [\n name,\n name !== \"count\" && typeof value === \"number\" ? number.format(value) : value,\n ])\n );\n return t(`browser.${key}`, formatted, { defaultValue });\n },\n formatRelativeTime: (value, unit, suffix) => {\n const units: Record<string, Intl.RelativeTimeFormatUnit> = {\n second: \"second\",\n minute: \"minute\",\n hour: \"hour\",\n day: \"day\",\n week: \"week\",\n month: \"month\",\n year: \"year\",\n };\n return relativeTime.format(suffix === \"ago\" ? -value : value, units[unit] ?? \"second\");\n },\n };\n },\n // Profile changes must invalidate the browser command-search index as well as displayed labels.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n [t, locale, direction, profile]\n );\n}\n\n/** Wrap plugin hosts so their dialogs and image options inherit the same UI inputs. */\nexport function IIIFBrowserI18nProvider({ children }: { children: ReactNode }) {\n return (\n <Suspense fallback={<Spinner />}>\n <Provider>{children}</Provider>\n </Suspense>\n );\n}\n\nexport function LocalizedIIIFBrowser(props: IIIFBrowserProps) {\n return (\n <Suspense fallback={<Spinner />}>\n <Browser {...props} />\n </Suspense>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ 'use client'
2
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{useEditorI18n as n,useTranslations as r}from"@manifest-editor/i18n";import{I18nProvider as i}from"react-aria";import{Suspense as a,lazy as o,useMemo as s}from"react";function c({children:t}){let{locale:r}=n();return e(i,{locale:r,children:t})}function l(n){let i=r(`components`);return e(`svg`,{width:`1em`,height:`1em`,viewBox:`0 0 42 42`,xmlns:`http://www.w3.org/2000/svg`,stroke:`currentColor`,role:`img`,"aria-label":i(`controls.loading`),...n,children:t(`g`,{transform:`translate(2 2)`,strokeWidth:5,fill:`none`,fillRule:`evenodd`,children:[e(`circle`,{strokeOpacity:.5,cx:18,cy:18,r:18}),e(`path`,{d:`M36 18c0-9.94-8.06-18-18-18`,children:e(`animateTransform`,{attributeName:`transform`,type:`rotate`,from:`0 18 18`,to:`360 18 18`,dur:`1s`,repeatCount:`indefinite`})})]})})}const u=o(()=>import(`./IIIFBrowserI18nImpl-DLwELdwH.js`).then(e=>e.t).then(e=>({default:e.LocalizedIIIFBrowser}))),d=o(()=>import(`./IIIFBrowserI18nImpl-DLwELdwH.js`).then(e=>e.t).then(e=>({default:e.IIIFBrowserI18nProvider})));function f(){let e=r(`components`),{locale:t,direction:i,profile:a}=n();return s(()=>{let n=new Intl.NumberFormat(t),r=new Intl.RelativeTimeFormat(t,{numeric:`auto`});return{locale:t,direction:i,translate:(t,r,i)=>{let a=i&&Object.fromEntries(Object.entries(i).map(([e,t])=>[e,e!==`count`&&typeof t==`number`?n.format(t):t]));return e(`browser.${t}`,a,{defaultValue:r})},formatRelativeTime:(e,t,n)=>r.format(n===`ago`?-e:e,{second:`second`,minute:`minute`,hour:`hour`,day:`day`,week:`week`,month:`month`,year:`year`}[t]??`second`)}},[e,t,i,a])}function p({children:t}){return e(a,{fallback:e(l,{}),children:e(d,{children:t})})}function m(t){return e(a,{fallback:e(l,{}),children:e(u,{...t})})}export{c as a,l as i,m as n,f as r,p as t};
3
+ //# sourceMappingURL=IIIFBrowserI18n-DroWtq-M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IIIFBrowserI18n-DroWtq-M.js","names":[],"sources":["../src/ComponentI18nProvider.tsx","../src/Spinner.tsx","../src/IIIFBrowserI18n.tsx"],"sourcesContent":["import { useEditorI18n } from \"@manifest-editor/i18n\";\nimport type { ReactNode } from \"react\";\nimport { I18nProvider } from \"react-aria\";\n\n/** Keep React Aria's built-in instructions/collation on the UI locale, independently of IIIF content. */\nexport function ComponentI18nProvider({ children }: { children: ReactNode }) {\n const { locale } = useEditorI18n();\n return <I18nProvider locale={locale}>{children}</I18nProvider>;\n}\n","import { useTranslations } from \"@manifest-editor/i18n\";\nimport * as React from \"react\";\n\nexport function Spinner(props: React.SVGProps<SVGSVGElement>) {\n const t = useTranslations(\"components\");\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 // SVG retains scalable animation; native img cannot represent these children.\n // oxlint-disable-next-line jsx-a11y/prefer-tag-over-role\n role=\"img\"\n aria-label={t(\"controls.loading\")}\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 { useEditorI18n, useTranslations } from \"@manifest-editor/i18n\";\nimport type { BrowserI18n, IIIFBrowserProps } from \"iiif-browser\";\nimport { lazy, Suspense, useMemo, type ReactNode } from \"react\";\nimport { Spinner } from \"./Spinner\";\n\nconst Browser = lazy(() =>\n import(\"./IIIFBrowserI18nImpl\").then((module) => ({ default: module.LocalizedIIIFBrowser }))\n);\nconst Provider = lazy(() =>\n import(\"./IIIFBrowserI18nImpl\").then((module) => ({ default: module.IIIFBrowserI18nProvider }))\n);\n\n/** Portable inputs for direct browsers and plugin-owned browsers. Never translates resource content. */\nexport function useIIIFBrowserI18n(): BrowserI18n {\n const t = useTranslations(\"components\");\n const { locale, direction, profile } = useEditorI18n();\n return useMemo(\n () => {\n const number = new Intl.NumberFormat(locale);\n const relativeTime = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" });\n return {\n locale,\n direction,\n translate: (key, defaultValue, values) => {\n const formatted =\n values &&\n Object.fromEntries(\n Object.entries(values).map(([name, value]) => [\n name,\n name !== \"count\" && typeof value === \"number\" ? number.format(value) : value,\n ])\n );\n return t(`browser.${key}`, formatted, { defaultValue });\n },\n formatRelativeTime: (value, unit, suffix) => {\n const units: Record<string, Intl.RelativeTimeFormatUnit> = {\n second: \"second\",\n minute: \"minute\",\n hour: \"hour\",\n day: \"day\",\n week: \"week\",\n month: \"month\",\n year: \"year\",\n };\n return relativeTime.format(suffix === \"ago\" ? -value : value, units[unit] ?? \"second\");\n },\n };\n },\n // Profile changes must invalidate the browser command-search index as well as displayed labels.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n [t, locale, direction, profile]\n );\n}\n\n/** Wrap plugin hosts so their dialogs and image options inherit the same UI inputs. */\nexport function IIIFBrowserI18nProvider({ children }: { children: ReactNode }) {\n return (\n <Suspense fallback={<Spinner />}>\n <Provider>{children}</Provider>\n </Suspense>\n );\n}\n\nexport function LocalizedIIIFBrowser(props: IIIFBrowserProps) {\n return (\n <Suspense fallback={<Spinner />}>\n <Browser {...props} />\n </Suspense>\n );\n}\n"],"mappings":";+NAKA,SAAgB,EAAsB,CAAE,YAAqC,CAC3E,GAAM,CAAE,UAAW,EAAc,EACjC,OAAO,EAAC,EAAD,CAAsB,SAAS,UAAuB,CAAA,CAC/D,CCLA,SAAgB,EAAQ,EAAsC,CAC5D,IAAM,EAAI,EAAgB,YAAY,EACtC,OACE,EAAC,MAAD,CACE,MAAM,MACN,OAAO,MACP,QAAQ,YACR,MAAM,6BACN,OAAO,eAGP,KAAK,MACL,aAAY,EAAE,kBAAkB,EAChC,GAAI,EAEJ,SAAA,EAAC,IAAD,CAAG,UAAU,iBAAiB,YAAa,EAAG,KAAK,OAAO,SAAS,UAAnE,SAAA,CACE,EAAC,SAAD,CAAQ,cAAe,GAAK,GAAI,GAAI,GAAI,GAAI,EAAG,EAAK,CAAA,EACpD,EAAC,OAAD,CAAM,EAAE,8BACN,SAAA,EAAC,mBAAD,CACE,cAAc,YACd,KAAK,SACL,KAAK,UACL,GAAG,YACH,IAAI,KACJ,YAAY,YACb,CAAA,CACG,CAAA,CACL,GACA,CAAA,CAET,CC5BA,MAAM,EAAU,MACd,OAAO,oCAAwB,CAAA,KAAA,GAAA,EAAA,CAAA,CAAA,CAAC,KAAM,IAAY,CAAE,QAAS,EAAO,oBAAqB,EAAE,CAC7F,EACM,EAAW,MACf,OAAO,oCAAwB,CAAA,KAAA,GAAA,EAAA,CAAA,CAAA,CAAC,KAAM,IAAY,CAAE,QAAS,EAAO,uBAAwB,EAAE,CAChG,EAGA,SAAgB,GAAkC,CAChD,IAAM,EAAI,EAAgB,YAAY,EAChC,CAAE,SAAQ,YAAW,WAAY,EAAc,EACrD,OAAO,MACC,CACJ,IAAM,EAAS,IAAI,KAAK,aAAa,CAAM,EACrC,EAAe,IAAI,KAAK,mBAAmB,EAAQ,CAAE,QAAS,MAAO,CAAC,EAC5E,MAAO,CACL,SACA,YACA,WAAY,EAAK,EAAc,IAAW,CACxC,IAAM,EACJ,GACA,OAAO,YACL,OAAO,QAAQ,CAAM,CAAC,CAAC,KAAK,CAAC,EAAM,KAAW,CAC5C,EACA,IAAS,SAAW,OAAO,GAAU,SAAW,EAAO,OAAO,CAAK,EAAI,CACzE,CAAC,CACH,EACF,OAAO,EAAE,WAAW,IAAO,EAAW,CAAE,cAAa,CAAC,CACxD,EACA,oBAAqB,EAAO,EAAM,IAUzB,EAAa,OAAO,IAAW,MAAQ,CAAC,EAAQ,EAAO,CAR5D,OAAQ,SACR,OAAQ,SACR,KAAM,OACN,IAAK,MACL,KAAM,OACN,MAAO,QACP,KAAM,MAE0D,EAAE,IAAS,QAAQ,CAEzF,CACF,EAGA,CAAC,EAAG,EAAQ,EAAW,CAAO,CAChC,CACF,CAGA,SAAgB,EAAwB,CAAE,YAAqC,CAC7E,OACE,EAAC,EAAD,CAAU,SAAU,EAAC,EAAD,CAAU,CAAA,EAC5B,SAAA,EAAC,EAAD,CAAW,UAAmB,CAAA,CACtB,CAAA,CAEd,CAEA,SAAgB,EAAqB,EAAyB,CAC5D,OACE,EAAC,EAAD,CAAU,SAAU,EAAC,EAAD,CAAU,CAAA,EAC5B,SAAA,EAAC,EAAD,CAAS,GAAI,CAAQ,CAAA,CACb,CAAA,CAEd"}
@@ -0,0 +1,3 @@
1
+ 'use client'
2
+ const e=require("./IIIFBrowserI18n-BqjV5W5b.cjs");let t=require("react/jsx-runtime"),n=require("@manifest-editor/i18n"),r=require("iiif-browser");var i=e.o({IIIFBrowserI18nProvider:()=>a,LocalizedIIIFBrowser:()=>o});function a({children:i}){let a=e.r();return(0,t.jsx)(e.a,{children:(0,t.jsx)(n.EditorI18nScope,{children:(0,t.jsx)(r.BrowserI18nProvider,{i18n:a,children:i})})})}function o(n){let i=e.r();return(0,t.jsx)(e.a,{children:(0,t.jsx)(r.IIIFBrowser,{i18n:i,...n})})}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return i}});
3
+ //# sourceMappingURL=IIIFBrowserI18nImpl-B3WDLcnW.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IIIFBrowserI18nImpl-B3WDLcnW.cjs","names":["useIIIFBrowserI18n","ComponentI18nProvider","EditorI18nScope","BrowserI18nProvider","IIIFBrowser"],"sources":["../src/IIIFBrowserI18nImpl.tsx"],"sourcesContent":["import { EditorI18nScope } from \"@manifest-editor/i18n\";\nimport { BrowserI18nProvider, IIIFBrowser, type IIIFBrowserProps } from \"iiif-browser\";\nimport type { ReactNode } from \"react\";\nimport { ComponentI18nProvider } from \"./ComponentI18nProvider\";\nimport { useIIIFBrowserI18n } from \"./IIIFBrowserI18n\";\n\nexport function IIIFBrowserI18nProvider({ children }: { children: ReactNode }) {\n const i18n = useIIIFBrowserI18n();\n return (\n <ComponentI18nProvider>\n <EditorI18nScope>\n <BrowserI18nProvider i18n={i18n}>{children}</BrowserI18nProvider>\n </EditorI18nScope>\n </ComponentI18nProvider>\n );\n}\n\nexport function LocalizedIIIFBrowser(props: IIIFBrowserProps) {\n const i18n = useIIIFBrowserI18n();\n return (\n <ComponentI18nProvider>\n <IIIFBrowser i18n={i18n} {...props} />\n </ComponentI18nProvider>\n );\n}\n"],"mappings":";wNAMA,SAAgB,EAAwB,CAAE,YAAqC,CAC7E,IAAM,EAAOA,EAAAA,EAAmB,EAChC,OACE,EAAA,EAAA,IAAA,CAACC,EAAAA,EAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAACC,EAAAA,gBAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAACC,EAAAA,oBAAD,CAA2B,OAAO,UAA8B,CAAA,CACjD,CAAA,CACI,CAAA,CAE3B,CAEA,SAAgB,EAAqB,EAAyB,CAC5D,IAAM,EAAOH,EAAAA,EAAmB,EAChC,OACE,EAAA,EAAA,IAAA,CAACC,EAAAA,EAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAACG,EAAAA,YAAD,CAAmB,OAAM,GAAI,CAAQ,CAAA,CAChB,CAAA,CAE3B"}
@@ -0,0 +1,3 @@
1
+ 'use client'
2
+ import{a as e,r as t}from"./IIIFBrowserI18n-DroWtq-M.js";import{jsx as n}from"react/jsx-runtime";import{EditorI18nScope as r}from"@manifest-editor/i18n";import{BrowserI18nProvider as i,IIIFBrowser as a}from"iiif-browser";var o=Object.defineProperty,s=((e,t)=>{let n={};for(var r in e)o(n,r,{get:e[r],enumerable:!0});return t||o(n,Symbol.toStringTag,{value:`Module`}),n})({IIIFBrowserI18nProvider:()=>c,LocalizedIIIFBrowser:()=>l});function c({children:a}){let o=t();return n(e,{children:n(r,{children:n(i,{i18n:o,children:a})})})}function l(r){let i=t();return n(e,{children:n(a,{i18n:i,...r})})}export{c as n,s as t};
3
+ //# sourceMappingURL=IIIFBrowserI18nImpl-DLwELdwH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IIIFBrowserI18nImpl-DLwELdwH.js","names":[],"sources":["../src/IIIFBrowserI18nImpl.tsx"],"sourcesContent":["import { EditorI18nScope } from \"@manifest-editor/i18n\";\nimport { BrowserI18nProvider, IIIFBrowser, type IIIFBrowserProps } from \"iiif-browser\";\nimport type { ReactNode } from \"react\";\nimport { ComponentI18nProvider } from \"./ComponentI18nProvider\";\nimport { useIIIFBrowserI18n } from \"./IIIFBrowserI18n\";\n\nexport function IIIFBrowserI18nProvider({ children }: { children: ReactNode }) {\n const i18n = useIIIFBrowserI18n();\n return (\n <ComponentI18nProvider>\n <EditorI18nScope>\n <BrowserI18nProvider i18n={i18n}>{children}</BrowserI18nProvider>\n </EditorI18nScope>\n </ComponentI18nProvider>\n );\n}\n\nexport function LocalizedIIIFBrowser(props: IIIFBrowserProps) {\n const i18n = useIIIFBrowserI18n();\n return (\n <ComponentI18nProvider>\n <IIIFBrowser i18n={i18n} {...props} />\n </ComponentI18nProvider>\n );\n}\n"],"mappings":";+aAMA,SAAgB,EAAwB,CAAE,YAAqC,CAC7E,IAAM,EAAO,EAAmB,EAChC,OACE,EAAC,EAAD,CAAA,SACE,EAAC,EAAD,CAAA,SACE,EAAC,EAAD,CAA2B,OAAO,UAA8B,CAAA,CACjD,CAAA,CACI,CAAA,CAE3B,CAEA,SAAgB,EAAqB,EAAyB,CAC5D,IAAM,EAAO,EAAmB,EAChC,OACE,EAAC,EAAD,CAAA,SACE,EAAC,EAAD,CAAmB,OAAM,GAAI,CAAQ,CAAA,CAChB,CAAA,CAE3B"}
@@ -0,0 +1,3 @@
1
+ 'use client'
2
+ import{useMediaTimeTranslations as e}from"./index.js";import{Fragment as t,jsx as n,jsxs as r}from"react/jsx-runtime";import{EditorI18nScope as i,useTranslations as a}from"@manifest-editor/i18n";import{getValue as o}from"@iiif/helpers";import{useRef as s}from"react";import"@vidstack/react/player/styles/base.css";import"@vidstack/react/player/styles/default/theme.css";import"@vidstack/react/player/styles/default/captions.css";import"@vidstack/react/player/styles/default/layouts/video.css";import{Gesture as c,MediaPlayer as l,MediaProvider as u,Poster as d,Track as f}from"@vidstack/react";import{DefaultVideoLayout as p,defaultLayoutIcons as m}from"@vidstack/react/player/layouts/default";function h(t){let c=e(),h=a(`components`),_={Announcements:h(`media.announcements`),Accessibility:h(`media.accessibility`),AirPlay:h(`media.airPlay`),Audio:h(`media.audio`),Auto:h(`media.auto`),Boost:h(`media.boost`),Captions:h(`media.captions`),"Caption Styles":h(`media.captionStyles`),"Captions look like this":h(`media.captionsLookLikeThis`),Chapters:h(`media.chapters`),"Closed-Captions Off":h(`media.closedCaptionsOff`),"Closed-Captions On":h(`media.closedCaptionsOn`),Connected:h(`media.connected`),Continue:h(`media.continue`),Connecting:h(`media.connecting`),Default:h(`media.default`),Disabled:h(`media.disabled`),Disconnected:h(`media.disconnected`),"Display Background":h(`media.displayBackground`),Download:h(`media.download`),"Enter Fullscreen":h(`media.enterFullscreen`),"Enter PiP":h(`media.enterPiP`),"Exit Fullscreen":h(`media.exitFullscreen`),"Exit PiP":h(`media.exitPiP`),Font:h(`media.font`),Family:h(`media.family`),Fullscreen:h(`media.fullscreen`),"Google Cast":h(`media.googleCast`),"Keyboard Animations":h(`media.keyboardAnimations`),LIVE:h(`media.live`),Loop:h(`media.loop`),Mute:h(`media.mute`),Normal:h(`media.normal`),Off:h(`media.off`),Pause:h(`media.pause`),Play:h(`media.play`),Playback:h(`media.playback`),PiP:h(`media.piP`),Quality:h(`media.quality`),Replay:h(`media.replay`),Reset:h(`media.reset`),"Seek Backward":h(`media.seekBackward`),"Seek Forward":h(`media.seekForward`),Seek:h(`media.seek`),Settings:h(`media.settings`),"Skip To Live":h(`media.skipToLive`),Speed:h(`media.speed`),Size:h(`media.size`),Color:h(`media.color`),Opacity:h(`media.opacity`),Shadow:h(`media.shadow`),Text:h(`media.text`),"Text Background":h(`media.textBackground`),Track:h(`media.track`),Unmute:h(`media.unmute`),Volume:h(`media.volume`)},v=s(null),y=t.captions||[],b=t.language,x=s(t.startTime||0);return n(l,{uiTime:c,onTimeUpdate:e=>{let t=Math.round(e.currentTime);x.current!==t&&(x.current=t)},ref:v,lang:b,className:`h-full w-full min-w-[275px] flex radius-0`,playsInline:!0,currentTime:t.startTime,duration:t.media.duration,src:[{src:t.media.url,type:t.media.format}],children:r(u,{className:`w-full h-full [&>video]:w-full [&>video]:h-full [&>video]:object-contain`,children:[y.map(e=>n(f,{src:e.id,kind:`subtitles`,label:o(e.label),default:e.language===b,language:e.language},e.id)),t.poster?n(d,{className:`absolute inset-0 bg-black block h-full w-full opacity-0 transition-opacity data-[visible]:opacity-100 object-contain`,src:t.poster}):null,n(g,{}),n(i,{children:n(p,{className:`z-1`,translations:_,noGestures:!0,icons:m})})]})})}function g(){return r(t,{children:[n(c,{className:`pointer-coarse:hidden absolute top-0 start-12 bottom-20 right-0 -z-1 block`,event:`pointerup`,action:`toggle:paused`}),n(c,{className:`absolute inset-0 z-0 block h-full w-full`,event:`dblpointerup`,action:`toggle:fullscreen`})]})}export{h as IIIFMediaPlayer};
3
+ //# sourceMappingURL=IIIFMediaPlayerImpl-BrVehzn_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IIIFMediaPlayerImpl-BrVehzn_.js","names":[],"sources":["../src/IIIFMediaPlayerImpl.tsx"],"sourcesContent":["import { useMediaTimeTranslations } from \"./useMediaTimeTranslations\";\nimport { EditorI18nScope, useTranslations } from \"@manifest-editor/i18n\";\nimport \"@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 {\n defaultLayoutIcons,\n DefaultVideoLayout,\n type DefaultLayoutTranslations,\n} from \"@vidstack/react/player/layouts/default\";\nimport { getValue } from \"@iiif/helpers\";\nimport { useRef } from \"react\";\n\nimport type { IIIFMediaPlayerProps } from \"./IIIFMediaPlayer\";\n\nexport function IIIFMediaPlayer(props: IIIFMediaPlayerProps) {\n const uiTime = useMediaTimeTranslations();\n const t = useTranslations(\"components\");\n const translations = {\n Announcements: t(\"media.announcements\"),\n Accessibility: t(\"media.accessibility\"),\n AirPlay: t(\"media.airPlay\"),\n Audio: t(\"media.audio\"),\n Auto: t(\"media.auto\"),\n Boost: t(\"media.boost\"),\n Captions: t(\"media.captions\"),\n \"Caption Styles\": t(\"media.captionStyles\"),\n \"Captions look like this\": t(\"media.captionsLookLikeThis\"),\n Chapters: t(\"media.chapters\"),\n \"Closed-Captions Off\": t(\"media.closedCaptionsOff\"),\n \"Closed-Captions On\": t(\"media.closedCaptionsOn\"),\n Connected: t(\"media.connected\"),\n Continue: t(\"media.continue\"),\n Connecting: t(\"media.connecting\"),\n Default: t(\"media.default\"),\n Disabled: t(\"media.disabled\"),\n Disconnected: t(\"media.disconnected\"),\n \"Display Background\": t(\"media.displayBackground\"),\n Download: t(\"media.download\"),\n \"Enter Fullscreen\": t(\"media.enterFullscreen\"),\n \"Enter PiP\": t(\"media.enterPiP\"),\n \"Exit Fullscreen\": t(\"media.exitFullscreen\"),\n \"Exit PiP\": t(\"media.exitPiP\"),\n Font: t(\"media.font\"),\n Family: t(\"media.family\"),\n Fullscreen: t(\"media.fullscreen\"),\n \"Google Cast\": t(\"media.googleCast\"),\n \"Keyboard Animations\": t(\"media.keyboardAnimations\"),\n LIVE: t(\"media.live\"),\n Loop: t(\"media.loop\"),\n Mute: t(\"media.mute\"),\n Normal: t(\"media.normal\"),\n Off: t(\"media.off\"),\n Pause: t(\"media.pause\"),\n Play: t(\"media.play\"),\n Playback: t(\"media.playback\"),\n PiP: t(\"media.piP\"),\n Quality: t(\"media.quality\"),\n Replay: t(\"media.replay\"),\n Reset: t(\"media.reset\"),\n \"Seek Backward\": t(\"media.seekBackward\"),\n \"Seek Forward\": t(\"media.seekForward\"),\n Seek: t(\"media.seek\"),\n Settings: t(\"media.settings\"),\n \"Skip To Live\": t(\"media.skipToLive\"),\n Speed: t(\"media.speed\"),\n Size: t(\"media.size\"),\n Color: t(\"media.color\"),\n Opacity: t(\"media.opacity\"),\n Shadow: t(\"media.shadow\"),\n Text: t(\"media.text\"),\n \"Text Background\": t(\"media.textBackground\"),\n Track: t(\"media.track\"),\n Unmute: t(\"media.unmute\"),\n Volume: t(\"media.volume\"),\n } satisfies DefaultLayoutTranslations;\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 <MediaPlayer\n uiTime={uiTime}\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 <EditorI18nScope>\n <DefaultVideoLayout\n className=\"z-1\"\n translations={translations}\n //\n noGestures\n icons={defaultLayoutIcons}\n />\n </EditorI18nScope>\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"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ 'use client'
2
+ const e=require("./index.cjs");let t=require("react/jsx-runtime"),n=require("@manifest-editor/i18n"),r=require("@iiif/helpers"),i=require("react");require("@vidstack/react/player/styles/base.css"),require("@vidstack/react/player/styles/default/theme.css"),require("@vidstack/react/player/styles/default/captions.css"),require("@vidstack/react/player/styles/default/layouts/video.css");let a=require("@vidstack/react"),o=require("@vidstack/react/player/layouts/default");function s(s){let l=e.useMediaTimeTranslations(),u=(0,n.useTranslations)(`components`),d={Announcements:u(`media.announcements`),Accessibility:u(`media.accessibility`),AirPlay:u(`media.airPlay`),Audio:u(`media.audio`),Auto:u(`media.auto`),Boost:u(`media.boost`),Captions:u(`media.captions`),"Caption Styles":u(`media.captionStyles`),"Captions look like this":u(`media.captionsLookLikeThis`),Chapters:u(`media.chapters`),"Closed-Captions Off":u(`media.closedCaptionsOff`),"Closed-Captions On":u(`media.closedCaptionsOn`),Connected:u(`media.connected`),Continue:u(`media.continue`),Connecting:u(`media.connecting`),Default:u(`media.default`),Disabled:u(`media.disabled`),Disconnected:u(`media.disconnected`),"Display Background":u(`media.displayBackground`),Download:u(`media.download`),"Enter Fullscreen":u(`media.enterFullscreen`),"Enter PiP":u(`media.enterPiP`),"Exit Fullscreen":u(`media.exitFullscreen`),"Exit PiP":u(`media.exitPiP`),Font:u(`media.font`),Family:u(`media.family`),Fullscreen:u(`media.fullscreen`),"Google Cast":u(`media.googleCast`),"Keyboard Animations":u(`media.keyboardAnimations`),LIVE:u(`media.live`),Loop:u(`media.loop`),Mute:u(`media.mute`),Normal:u(`media.normal`),Off:u(`media.off`),Pause:u(`media.pause`),Play:u(`media.play`),Playback:u(`media.playback`),PiP:u(`media.piP`),Quality:u(`media.quality`),Replay:u(`media.replay`),Reset:u(`media.reset`),"Seek Backward":u(`media.seekBackward`),"Seek Forward":u(`media.seekForward`),Seek:u(`media.seek`),Settings:u(`media.settings`),"Skip To Live":u(`media.skipToLive`),Speed:u(`media.speed`),Size:u(`media.size`),Color:u(`media.color`),Opacity:u(`media.opacity`),Shadow:u(`media.shadow`),Text:u(`media.text`),"Text Background":u(`media.textBackground`),Track:u(`media.track`),Unmute:u(`media.unmute`),Volume:u(`media.volume`)},f=(0,i.useRef)(null),p=s.captions||[],m=s.language,h=(0,i.useRef)(s.startTime||0);return(0,t.jsx)(a.MediaPlayer,{uiTime:l,onTimeUpdate:e=>{let t=Math.round(e.currentTime);h.current!==t&&(h.current=t)},ref:f,lang:m,className:`h-full w-full min-w-[275px] flex radius-0`,playsInline:!0,currentTime:s.startTime,duration:s.media.duration,src:[{src:s.media.url,type:s.media.format}],children:(0,t.jsxs)(a.MediaProvider,{className:`w-full h-full [&>video]:w-full [&>video]:h-full [&>video]:object-contain`,children:[p.map(e=>(0,t.jsx)(a.Track,{src:e.id,kind:`subtitles`,label:(0,r.getValue)(e.label),default:e.language===m,language:e.language},e.id)),s.poster?(0,t.jsx)(a.Poster,{className:`absolute inset-0 bg-black block h-full w-full opacity-0 transition-opacity data-[visible]:opacity-100 object-contain`,src:s.poster}):null,(0,t.jsx)(c,{}),(0,t.jsx)(n.EditorI18nScope,{children:(0,t.jsx)(o.DefaultVideoLayout,{className:`z-1`,translations:d,noGestures:!0,icons:o.defaultLayoutIcons})})]})})}function c(){return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.Gesture,{className:`pointer-coarse:hidden absolute top-0 start-12 bottom-20 right-0 -z-1 block`,event:`pointerup`,action:`toggle:paused`}),(0,t.jsx)(a.Gesture,{className:`absolute inset-0 z-0 block h-full w-full`,event:`dblpointerup`,action:`toggle:fullscreen`})]})}exports.IIIFMediaPlayer=s;
3
+ //# sourceMappingURL=IIIFMediaPlayerImpl-cjHwnAgN.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IIIFMediaPlayerImpl-cjHwnAgN.cjs","names":["useMediaTimeTranslations","useTranslations","useRef","MediaPlayer","MediaProvider","Track","getValue","Poster","EditorI18nScope","DefaultVideoLayout","defaultLayoutIcons","Gesture"],"sources":["../src/IIIFMediaPlayerImpl.tsx"],"sourcesContent":["import { useMediaTimeTranslations } from \"./useMediaTimeTranslations\";\nimport { EditorI18nScope, useTranslations } from \"@manifest-editor/i18n\";\nimport \"@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 {\n defaultLayoutIcons,\n DefaultVideoLayout,\n type DefaultLayoutTranslations,\n} from \"@vidstack/react/player/layouts/default\";\nimport { getValue } from \"@iiif/helpers\";\nimport { useRef } from \"react\";\n\nimport type { IIIFMediaPlayerProps } from \"./IIIFMediaPlayer\";\n\nexport function IIIFMediaPlayer(props: IIIFMediaPlayerProps) {\n const uiTime = useMediaTimeTranslations();\n const t = useTranslations(\"components\");\n const translations = {\n Announcements: t(\"media.announcements\"),\n Accessibility: t(\"media.accessibility\"),\n AirPlay: t(\"media.airPlay\"),\n Audio: t(\"media.audio\"),\n Auto: t(\"media.auto\"),\n Boost: t(\"media.boost\"),\n Captions: t(\"media.captions\"),\n \"Caption Styles\": t(\"media.captionStyles\"),\n \"Captions look like this\": t(\"media.captionsLookLikeThis\"),\n Chapters: t(\"media.chapters\"),\n \"Closed-Captions Off\": t(\"media.closedCaptionsOff\"),\n \"Closed-Captions On\": t(\"media.closedCaptionsOn\"),\n Connected: t(\"media.connected\"),\n Continue: t(\"media.continue\"),\n Connecting: t(\"media.connecting\"),\n Default: t(\"media.default\"),\n Disabled: t(\"media.disabled\"),\n Disconnected: t(\"media.disconnected\"),\n \"Display Background\": t(\"media.displayBackground\"),\n Download: t(\"media.download\"),\n \"Enter Fullscreen\": t(\"media.enterFullscreen\"),\n \"Enter PiP\": t(\"media.enterPiP\"),\n \"Exit Fullscreen\": t(\"media.exitFullscreen\"),\n \"Exit PiP\": t(\"media.exitPiP\"),\n Font: t(\"media.font\"),\n Family: t(\"media.family\"),\n Fullscreen: t(\"media.fullscreen\"),\n \"Google Cast\": t(\"media.googleCast\"),\n \"Keyboard Animations\": t(\"media.keyboardAnimations\"),\n LIVE: t(\"media.live\"),\n Loop: t(\"media.loop\"),\n Mute: t(\"media.mute\"),\n Normal: t(\"media.normal\"),\n Off: t(\"media.off\"),\n Pause: t(\"media.pause\"),\n Play: t(\"media.play\"),\n Playback: t(\"media.playback\"),\n PiP: t(\"media.piP\"),\n Quality: t(\"media.quality\"),\n Replay: t(\"media.replay\"),\n Reset: t(\"media.reset\"),\n \"Seek Backward\": t(\"media.seekBackward\"),\n \"Seek Forward\": t(\"media.seekForward\"),\n Seek: t(\"media.seek\"),\n Settings: t(\"media.settings\"),\n \"Skip To Live\": t(\"media.skipToLive\"),\n Speed: t(\"media.speed\"),\n Size: t(\"media.size\"),\n Color: t(\"media.color\"),\n Opacity: t(\"media.opacity\"),\n Shadow: t(\"media.shadow\"),\n Text: t(\"media.text\"),\n \"Text Background\": t(\"media.textBackground\"),\n Track: t(\"media.track\"),\n Unmute: t(\"media.unmute\"),\n Volume: t(\"media.volume\"),\n } satisfies DefaultLayoutTranslations;\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 <MediaPlayer\n uiTime={uiTime}\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 <EditorI18nScope>\n <DefaultVideoLayout\n className=\"z-1\"\n translations={translations}\n //\n noGestures\n icons={defaultLayoutIcons}\n />\n </EditorI18nScope>\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"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ 'use client'
2
+ import{n as e}from"./IIIFBrowserI18nImpl-DLwELdwH.js";import{a as t}from"./IIIFBrowserI18n-DroWtq-M.js";import{Fragment as n,jsx as r,jsxs as i}from"react/jsx-runtime";import{useTranslations as a}from"@manifest-editor/i18n";import{useMemo as o}from"react";import"@mdxeditor/editor/style.css";import"iiif-browser/mdx-plugins.css";import{BlockTypeSelect as s,BoldItalicUnderlineToggles as c,CreateLink as l,ListsToggle as u,MDXEditor as d,Separator as f,diffSourcePlugin as p,headingsPlugin as m,linkDialogPlugin as h,linkPlugin as g,listsPlugin as _,quotePlugin as v,thematicBreakPlugin as y,toolbarPlugin as b}from"@mdxeditor/editor";import{InsertIIIFBrowser as x,iiifBrowserPlugin as S}from"iiif-browser/mdxeditor";function C({editorRef:n,...i}){let s=a(`components`),c=s(`mdx.iiif.title`),l=s(`mdx.iiif.options`),u=s(`actions.close`),f=s(`mdx.iiif.action`),x=s(`mdx.iiif.select`);return r(t,{children:r(e,{children:r(d,{translation:(e,t,n)=>s(`mdx.${e}`,n,{defaultValue:t}),plugins:o(()=>[m({allowedHeadingLevels:[2,3]}),_(),g(),v(),y(),S({dialog:{title:c,optionsTitle:l,closeLabel:u},image:{actionLabel:f,selectLabel:x},browserProps:{navigation:{canSelectCollection:!1,canSelectManifest:!1,canSelectCanvas:!0}}}),h(),p(),b({toolbarContents:w})],[c,l,u,f,x]),...i,ref:n})})})}function w(){let e=a(`components`);return i(n,{children:[r(c,{}),r(l,{}),r(f,{}),r(s,{}),r(u,{options:[`bullet`,`number`]}),r(f,{}),r(x,{label:e(`mdx.iiif.insert`)})]})}export{C as MDXEditor};
3
+ //# sourceMappingURL=MDXEditorImpl-0XZVgBT6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MDXEditorImpl-0XZVgBT6.js","names":["BaseMDXEditor"],"sources":["../src/MDXEditorImpl.tsx"],"sourcesContent":["import { IIIFBrowserI18nProvider } from \"./IIIFBrowserI18nImpl\";\nimport { ComponentI18nProvider } from \"./ComponentI18nProvider\";\nimport { useTranslations } from \"@manifest-editor/i18n\";\nimport \"@mdxeditor/editor/style.css\";\nimport \"iiif-browser/mdx-plugins.css\";\nimport {\n MDXEditor as BaseMDXEditor,\n BlockTypeSelect,\n BoldItalicUnderlineToggles,\n CreateLink,\n diffSourcePlugin,\n headingsPlugin,\n ListsToggle,\n linkDialogPlugin,\n linkPlugin,\n listsPlugin,\n type MDXEditorMethods,\n type MDXEditorProps,\n quotePlugin,\n Separator,\n thematicBreakPlugin,\n toolbarPlugin,\n} from \"@mdxeditor/editor\";\nimport { InsertIIIFBrowser, iiifBrowserPlugin } from \"iiif-browser/mdxeditor\";\nimport { type ForwardedRef, useMemo } from \"react\";\n\n// Loaded by the public component only when a rich-text field is mounted.\nexport function MDXEditor({\n editorRef,\n ...props\n}: { editorRef?: ForwardedRef<MDXEditorMethods> | null } & MDXEditorProps) {\n const t = useTranslations(\"components\");\n const dialogTitle = t(\"mdx.iiif.title\");\n const optionsTitle = t(\"mdx.iiif.options\");\n const closeLabel = t(\"actions.close\");\n const actionLabel = t(\"mdx.iiif.action\");\n const selectLabel = t(\"mdx.iiif.select\");\n return (\n <ComponentI18nProvider>\n <IIIFBrowserI18nProvider>\n <BaseMDXEditor\n translation={(key, defaultValue, values) => t(`mdx.${key}`, values, { defaultValue })}\n plugins={useMemo(\n () => [\n // Example Plugin Usage\n headingsPlugin({ allowedHeadingLevels: [2, 3] }),\n listsPlugin(),\n linkPlugin(),\n quotePlugin(),\n thematicBreakPlugin(),\n iiifBrowserPlugin({\n dialog: { title: dialogTitle, optionsTitle, closeLabel },\n image: { actionLabel, selectLabel },\n browserProps: {\n navigation: {\n canSelectCollection: false,\n canSelectManifest: false,\n canSelectCanvas: true,\n },\n },\n }),\n linkDialogPlugin(),\n diffSourcePlugin(),\n toolbarPlugin({\n toolbarContents: LocalizedToolbar,\n }),\n ],\n [dialogTitle, optionsTitle, closeLabel, actionLabel, selectLabel]\n )}\n {...props}\n ref={editorRef}\n />\n </IIIFBrowserI18nProvider>\n </ComponentI18nProvider>\n );\n}\n\nfunction LocalizedToolbar() {\n const t = useTranslations(\"components\");\n return (\n <>\n <BoldItalicUnderlineToggles />\n <CreateLink />\n <Separator />\n <BlockTypeSelect />\n <ListsToggle options={[\"bullet\", \"number\"]} />\n <Separator />\n <InsertIIIFBrowser label={t(\"mdx.iiif.insert\")} />\n </>\n );\n}\n"],"mappings":";4sBA2BA,SAAgB,EAAU,CACxB,YACA,GAAG,GACsE,CACzE,IAAM,EAAI,EAAgB,YAAY,EAChC,EAAc,EAAE,gBAAgB,EAChC,EAAe,EAAE,kBAAkB,EACnC,EAAa,EAAE,eAAe,EAC9B,EAAc,EAAE,iBAAiB,EACjC,EAAc,EAAE,iBAAiB,EACvC,OACE,EAAC,EAAD,CAAA,SACE,EAAC,EAAD,CAAA,SACE,EAACA,EAAD,CACE,aAAc,EAAK,EAAc,IAAW,EAAE,OAAO,IAAO,EAAQ,CAAE,cAAa,CAAC,EACpF,QAAS,MACD,CAEJ,EAAe,CAAE,qBAAsB,CAAC,EAAG,CAAC,CAAE,CAAC,EAC/C,EAAY,EACZ,EAAW,EACX,EAAY,EACZ,EAAoB,EACpB,EAAkB,CAChB,OAAQ,CAAE,MAAO,EAAa,eAAc,YAAW,EACvD,MAAO,CAAE,cAAa,aAAY,EAClC,aAAc,CACZ,WAAY,CACV,oBAAqB,GACrB,kBAAmB,GACnB,gBAAiB,EACnB,CACF,CACF,CAAC,EACD,EAAiB,EACjB,EAAiB,EACjB,EAAc,CACZ,gBAAiB,CACnB,CAAC,CACH,EACA,CAAC,EAAa,EAAc,EAAY,EAAa,CAAW,CAClE,EACA,GAAI,EACJ,IAAK,CACN,CAAA,CACsB,CAAA,CACJ,CAAA,CAE3B,CAEA,SAAS,GAAmB,CAC1B,IAAM,EAAI,EAAgB,YAAY,EACtC,OACE,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,EAAD,CAA6B,CAAA,EAC7B,EAAC,EAAD,CAAa,CAAA,EACb,EAAC,EAAD,CAAY,CAAA,EACZ,EAAC,EAAD,CAAkB,CAAA,EAClB,EAAC,EAAD,CAAa,QAAS,CAAC,SAAU,QAAQ,CAAI,CAAA,EAC7C,EAAC,EAAD,CAAY,CAAA,EACZ,EAAC,EAAD,CAAmB,MAAO,EAAE,iBAAiB,CAAI,CAAA,CACjD,CAAA,CAAA,CAEN"}
@@ -0,0 +1,3 @@
1
+ 'use client'
2
+ const e=require("./IIIFBrowserI18n-BqjV5W5b.cjs"),t=require("./IIIFBrowserI18nImpl-B3WDLcnW.cjs");let n=require("react/jsx-runtime"),r=require("@manifest-editor/i18n"),i=require("react");require("@mdxeditor/editor/style.css"),require("iiif-browser/mdx-plugins.css");let a=require("@mdxeditor/editor"),o=require("iiif-browser/mdxeditor");function s({editorRef:s,...l}){let u=(0,r.useTranslations)(`components`),d=u(`mdx.iiif.title`),f=u(`mdx.iiif.options`),p=u(`actions.close`),m=u(`mdx.iiif.action`),h=u(`mdx.iiif.select`);return(0,n.jsx)(e.a,{children:(0,n.jsx)(t.n,{children:(0,n.jsx)(a.MDXEditor,{translation:(e,t,n)=>u(`mdx.${e}`,n,{defaultValue:t}),plugins:(0,i.useMemo)(()=>[(0,a.headingsPlugin)({allowedHeadingLevels:[2,3]}),(0,a.listsPlugin)(),(0,a.linkPlugin)(),(0,a.quotePlugin)(),(0,a.thematicBreakPlugin)(),(0,o.iiifBrowserPlugin)({dialog:{title:d,optionsTitle:f,closeLabel:p},image:{actionLabel:m,selectLabel:h},browserProps:{navigation:{canSelectCollection:!1,canSelectManifest:!1,canSelectCanvas:!0}}}),(0,a.linkDialogPlugin)(),(0,a.diffSourcePlugin)(),(0,a.toolbarPlugin)({toolbarContents:c})],[d,f,p,m,h]),...l,ref:s})})})}function c(){let e=(0,r.useTranslations)(`components`);return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.BoldItalicUnderlineToggles,{}),(0,n.jsx)(a.CreateLink,{}),(0,n.jsx)(a.Separator,{}),(0,n.jsx)(a.BlockTypeSelect,{}),(0,n.jsx)(a.ListsToggle,{options:[`bullet`,`number`]}),(0,n.jsx)(a.Separator,{}),(0,n.jsx)(o.InsertIIIFBrowser,{label:e(`mdx.iiif.insert`)})]})}exports.MDXEditor=s;
3
+ //# sourceMappingURL=MDXEditorImpl-Db_xagm5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MDXEditorImpl-Db_xagm5.cjs","names":["useTranslations","ComponentI18nProvider","IIIFBrowserI18nProvider","BaseMDXEditor","useMemo","headingsPlugin","listsPlugin","linkPlugin","quotePlugin","thematicBreakPlugin","iiifBrowserPlugin","linkDialogPlugin","diffSourcePlugin","toolbarPlugin","BoldItalicUnderlineToggles","CreateLink","Separator","BlockTypeSelect","ListsToggle","InsertIIIFBrowser"],"sources":["../src/MDXEditorImpl.tsx"],"sourcesContent":["import { IIIFBrowserI18nProvider } from \"./IIIFBrowserI18nImpl\";\nimport { ComponentI18nProvider } from \"./ComponentI18nProvider\";\nimport { useTranslations } from \"@manifest-editor/i18n\";\nimport \"@mdxeditor/editor/style.css\";\nimport \"iiif-browser/mdx-plugins.css\";\nimport {\n MDXEditor as BaseMDXEditor,\n BlockTypeSelect,\n BoldItalicUnderlineToggles,\n CreateLink,\n diffSourcePlugin,\n headingsPlugin,\n ListsToggle,\n linkDialogPlugin,\n linkPlugin,\n listsPlugin,\n type MDXEditorMethods,\n type MDXEditorProps,\n quotePlugin,\n Separator,\n thematicBreakPlugin,\n toolbarPlugin,\n} from \"@mdxeditor/editor\";\nimport { InsertIIIFBrowser, iiifBrowserPlugin } from \"iiif-browser/mdxeditor\";\nimport { type ForwardedRef, useMemo } from \"react\";\n\n// Loaded by the public component only when a rich-text field is mounted.\nexport function MDXEditor({\n editorRef,\n ...props\n}: { editorRef?: ForwardedRef<MDXEditorMethods> | null } & MDXEditorProps) {\n const t = useTranslations(\"components\");\n const dialogTitle = t(\"mdx.iiif.title\");\n const optionsTitle = t(\"mdx.iiif.options\");\n const closeLabel = t(\"actions.close\");\n const actionLabel = t(\"mdx.iiif.action\");\n const selectLabel = t(\"mdx.iiif.select\");\n return (\n <ComponentI18nProvider>\n <IIIFBrowserI18nProvider>\n <BaseMDXEditor\n translation={(key, defaultValue, values) => t(`mdx.${key}`, values, { defaultValue })}\n plugins={useMemo(\n () => [\n // Example Plugin Usage\n headingsPlugin({ allowedHeadingLevels: [2, 3] }),\n listsPlugin(),\n linkPlugin(),\n quotePlugin(),\n thematicBreakPlugin(),\n iiifBrowserPlugin({\n dialog: { title: dialogTitle, optionsTitle, closeLabel },\n image: { actionLabel, selectLabel },\n browserProps: {\n navigation: {\n canSelectCollection: false,\n canSelectManifest: false,\n canSelectCanvas: true,\n },\n },\n }),\n linkDialogPlugin(),\n diffSourcePlugin(),\n toolbarPlugin({\n toolbarContents: LocalizedToolbar,\n }),\n ],\n [dialogTitle, optionsTitle, closeLabel, actionLabel, selectLabel]\n )}\n {...props}\n ref={editorRef}\n />\n </IIIFBrowserI18nProvider>\n </ComponentI18nProvider>\n );\n}\n\nfunction LocalizedToolbar() {\n const t = useTranslations(\"components\");\n return (\n <>\n <BoldItalicUnderlineToggles />\n <CreateLink />\n <Separator />\n <BlockTypeSelect />\n <ListsToggle options={[\"bullet\", \"number\"]} />\n <Separator />\n <InsertIIIFBrowser label={t(\"mdx.iiif.insert\")} />\n </>\n );\n}\n"],"mappings":";iVA2BA,SAAgB,EAAU,CACxB,YACA,GAAG,GACsE,CACzE,IAAM,GAAA,EAAIA,EAAAA,gBAAAA,CAAgB,YAAY,EAChC,EAAc,EAAE,gBAAgB,EAChC,EAAe,EAAE,kBAAkB,EACnC,EAAa,EAAE,eAAe,EAC9B,EAAc,EAAE,iBAAiB,EACjC,EAAc,EAAE,iBAAiB,EACvC,OACE,EAAA,EAAA,IAAA,CAACC,EAAAA,EAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAACC,EAAAA,EAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAACC,EAAAA,UAAD,CACE,aAAc,EAAK,EAAc,IAAW,EAAE,OAAO,IAAO,EAAQ,CAAE,cAAa,CAAC,EACpF,SAAA,EAASC,EAAAA,QAAAA,KACD,EAEJC,EAAAA,EAAAA,eAAAA,CAAe,CAAE,qBAAsB,CAAC,EAAG,CAAC,CAAE,CAAC,GAC/CC,EAAAA,EAAAA,YAAAA,CAAY,GACZC,EAAAA,EAAAA,WAAAA,CAAW,GACXC,EAAAA,EAAAA,YAAAA,CAAY,GACZC,EAAAA,EAAAA,oBAAAA,CAAoB,GACpBC,EAAAA,EAAAA,kBAAAA,CAAkB,CAChB,OAAQ,CAAE,MAAO,EAAa,eAAc,YAAW,EACvD,MAAO,CAAE,cAAa,aAAY,EAClC,aAAc,CACZ,WAAY,CACV,oBAAqB,GACrB,kBAAmB,GACnB,gBAAiB,EACnB,CACF,CACF,CAAC,GACDC,EAAAA,EAAAA,iBAAAA,CAAiB,GACjBC,EAAAA,EAAAA,iBAAAA,CAAiB,GACjBC,EAAAA,EAAAA,cAAAA,CAAc,CACZ,gBAAiB,CACnB,CAAC,CACH,EACA,CAAC,EAAa,EAAc,EAAY,EAAa,CAAW,CAClE,EACA,GAAI,EACJ,IAAK,CACN,CAAA,CACsB,CAAA,CACJ,CAAA,CAE3B,CAEA,SAAS,GAAmB,CAC1B,IAAM,GAAA,EAAIb,EAAAA,gBAAAA,CAAgB,YAAY,EACtC,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,IAAA,CAACc,EAAAA,2BAAD,CAA6B,CAAA,GAC7B,EAAA,EAAA,IAAA,CAACC,EAAAA,WAAD,CAAa,CAAA,GACb,EAAA,EAAA,IAAA,CAACC,EAAAA,UAAD,CAAY,CAAA,GACZ,EAAA,EAAA,IAAA,CAACC,EAAAA,gBAAD,CAAkB,CAAA,GAClB,EAAA,EAAA,IAAA,CAACC,EAAAA,YAAD,CAAa,QAAS,CAAC,SAAU,QAAQ,CAAI,CAAA,GAC7C,EAAA,EAAA,IAAA,CAACF,EAAAA,UAAD,CAAY,CAAA,GACZ,EAAA,EAAA,IAAA,CAACG,EAAAA,kBAAD,CAAmB,MAAO,EAAE,iBAAiB,CAAI,CAAA,CACjD,CAAA,CAAA,CAEN"}