@pantheon-systems/p1-media 0.4.2 → 0.4.3
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 +56 -0
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +111 -107
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +111 -107
- package/dist/index.mjs.map +1 -1
- package/dist/server.js.map +1 -1
- package/dist/server.mjs.map +1 -1
- package/package.json +16 -11
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/patterns.ts","../src/components/media-field.tsx","../src/components/media-library.tsx","../src/context.tsx","../src/components/use-media-schema.ts","../src/components/staging.ts","../src/components/media-item.ts","../src/components/upload-flow.ts","../src/components/media-upload-dropzone.tsx","../src/components/metadata-grid.tsx","../src/delimited.ts","../src/components/media-panel-styles.ts","../src/components/media-upload-panel.tsx","../src/components/media-edit-panel.tsx","../src/components/media-grid.tsx","../src/crop.ts","../src/components/media-object-field.tsx","../src/components/crop-dialog.tsx","../../../node_modules/.pnpm/react-image-crop@11.1.2_react@19.2.6/node_modules/react-image-crop/dist/index.js","#style-inject:#style-inject","../../../node_modules/.pnpm/react-image-crop@11.1.2_react@19.2.6/node_modules/react-image-crop/dist/ReactCrop.css","../src/media-value.ts","../src/puck-css-bridge.tsx","../src/plugin.tsx","../src/utils.ts","../src/render.tsx","../src/media-figure-block.tsx"],"sourcesContent":["export { createMediaPlugin } from \"./plugin\";\nexport type { MediaPluginOptions } from \"./plugin\";\nexport type { MediaConfig } from \"./context\";\nexport { DEFAULT_MEDIA_PATTERNS } from \"./patterns\";\nexport { buildImageUrl } from \"./utils\";\nexport type { ImageTransformParams } from \"./utils\";\nexport { getMediaProps, MediaImage, MediaFigure } from \"./render\";\nexport type { GetMediaPropsOptions } from \"./render\";\nexport { createMediaFigureBlock } from \"./media-figure-block\";\nexport type { MediaFigureBlockOptions, MediaFigureBlockProps } from \"./media-figure-block\";\nexport { makeMediaValue, isMediaValue } from \"./media-value\";\nexport type {\n MediaValue,\n MediaFieldValue,\n MediaProps,\n MetadataFieldDef,\n} from \"./types\";\n","/**\n * Default field name patterns that trigger the media library picker.\n * Targets image/logo/icon source fields while excluding navigation URLs\n * (buttonUrl, linkUrl, ctaUrl, etc.) and alt text fields.\n */\nexport const DEFAULT_MEDIA_PATTERNS = [\n /^image(?:Url)?$/,\n /^logo(?:Url)?$/,\n /^media(?:Url)?$/,\n /^icon(?:Url)?$/,\n /^thumbnail(?:Url)?$/,\n /ImageUrl$/,\n /LogoUrl$/,\n];\n","\"use client\";\n\nimport { useState, type ReactElement } from \"react\";\nimport type { CustomField } from \"@puckeditor/core\";\nimport { MediaLibrary } from \"./media-library\";\nimport { getBaseUrl, getCropMode, buildValueWithCrop, type CropMode } from \"../crop\";\n\nexport function MediaFieldRender(props: {\n field: CustomField<string>;\n name: string;\n id: string;\n value: string;\n onChange: (value: string) => void;\n readOnly?: boolean;\n}): ReactElement {\n const { value, onChange, readOnly } = props;\n const [isLibraryOpen, setIsLibraryOpen] = useState(false);\n\n const baseUrl = getBaseUrl(value);\n const cropMode = getCropMode(value);\n\n const handleCropChange = (crop: CropMode) => {\n if (!baseUrl) return;\n onChange(buildValueWithCrop(baseUrl, crop));\n };\n\n const handleSelect = (url: string) => {\n onChange(buildValueWithCrop(url.split(\"?\")[0], cropMode));\n setIsLibraryOpen(false);\n };\n\n const buttonBase: React.CSSProperties = {\n padding: \"3px 10px\",\n fontSize: \"12px\",\n fontWeight: 500,\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n fontFamily: \"inherit\",\n };\n\n return (\n <div style={{ width: \"100%\" }}>\n {value ? (\n <div style={{ marginBottom: \"8px\" }}>\n <img\n src={baseUrl}\n alt=\"Preview\"\n style={{\n width: \"100%\",\n maxHeight: \"120px\",\n objectFit: \"cover\",\n borderRadius: \"6px\",\n display: \"block\",\n border: \"1px solid #e0e0e0\",\n }}\n />\n </div>\n ) : (\n <div\n style={{\n height: \"80px\",\n border: \"2px dashed #d0d0d0\",\n borderRadius: \"6px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginBottom: \"8px\",\n color: \"#999\",\n fontSize: \"13px\",\n cursor: readOnly ? \"default\" : \"pointer\",\n }}\n onClick={() => !readOnly && setIsLibraryOpen(true)}\n >\n Click to select image\n </div>\n )}\n\n {value && (\n <div style={{ marginBottom: \"8px\" }}>\n <div style={{ fontSize: \"11px\", color: \"#666\", fontWeight: 500, marginBottom: \"4px\" }}>\n Crop\n </div>\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => handleCropChange(\"fit\")}\n style={{\n ...buttonBase,\n backgroundColor: cropMode === \"fit\" ? \"#2563eb\" : \"white\",\n color: cropMode === \"fit\" ? \"white\" : \"#444\",\n borderColor: cropMode === \"fit\" ? \"#2563eb\" : \"#d0d0d0\",\n opacity: readOnly ? 0.5 : 1,\n }}\n >\n Fit in\n </button>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => handleCropChange(\"smart\")}\n style={{\n ...buttonBase,\n backgroundColor: cropMode === \"smart\" ? \"#2563eb\" : \"white\",\n color: cropMode === \"smart\" ? \"white\" : \"#444\",\n borderColor: cropMode === \"smart\" ? \"#2563eb\" : \"#d0d0d0\",\n opacity: readOnly ? 0.5 : 1,\n }}\n >\n Smart crop\n </button>\n </div>\n </div>\n )}\n\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <button\n type=\"button\"\n onClick={() => setIsLibraryOpen(true)}\n disabled={readOnly}\n style={{\n flex: 1,\n padding: \"6px 12px\",\n backgroundColor: \"#2563eb\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n opacity: readOnly ? 0.5 : 1,\n fontFamily: \"inherit\",\n }}\n >\n Choose from Library\n </button>\n\n {value && (\n <button\n type=\"button\"\n onClick={() => onChange(\"\")}\n disabled={readOnly}\n style={{\n padding: \"6px 12px\",\n backgroundColor: \"white\",\n color: \"#666\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n opacity: readOnly ? 0.5 : 1,\n fontFamily: \"inherit\",\n }}\n >\n Clear\n </button>\n )}\n </div>\n\n <MediaLibrary\n isOpen={isLibraryOpen}\n onClose={() => setIsLibraryOpen(false)}\n onSelect={handleSelect}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport { useMediaConfig, type MediaConfig } from \"../context\";\nimport { useMediaSchema, orderAltFirst } from \"./use-media-schema\";\nimport { buildPatchBody, keepIncompleteRows } from \"./staging\";\nimport { parseMediaList, type MediaItem } from \"./media-item\";\nimport {\n runUpload,\n UploadFlowError,\n STAGED_STATUS,\n type RowStatus,\n type UploadProgress,\n type UploadTarget,\n} from \"./upload-flow\";\nimport { MediaUploadDropzone } from \"./media-upload-dropzone\";\nimport { MediaUploadPanel } from \"./media-upload-panel\";\nimport { MediaEditPanel } from \"./media-edit-panel\";\nimport { MediaGrid } from \"./media-grid\";\nimport type { MetadataFieldDef } from \"../types\";\n\nexport type { MediaItem } from \"./media-item\";\n\ninterface MediaLibraryProps {\n isOpen: boolean;\n onClose: () => void;\n /** Basic mode: receives the bare CDN URL of the picked item. */\n onSelect: (url: string) => void;\n /**\n * Rich mode (p1-media): receives the full item, including asset identity and\n * metadata defaults when the Worker returns the asset-shaped list. Takes\n * precedence over `onSelect` when provided.\n */\n onSelectItem?: (item: MediaItem) => void;\n}\n\n// The Worker caps list responses at 500; ask for the max rather than its\n// 200 default so large libraries are actually reachable by scrolling.\nconst LIST_LIMIT = \"500\";\n\n// workstreamId is accepted for forward-compat but not read by the Worker —\n// omit it entirely rather than sending a meaningless placeholder value.\nfunction siteParams(config: Pick<MediaConfig, \"siteId\" | \"workstreamId\">): URLSearchParams {\n const params = new URLSearchParams({ siteId: config.siteId });\n if (config.workstreamId) params.set(\"workstreamId\", config.workstreamId);\n return params;\n}\n\nexport function MediaLibrary({ isOpen, onClose, onSelect, onSelectItem }: MediaLibraryProps) {\n const config = useMediaConfig();\n const schema = orderAltFirst(useMediaSchema());\n const [media, setMedia] = useState<MediaItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n // Owned here (not MediaGrid) so switching to the upload/edit panel and back\n // — which unmounts/remounts the grid — doesn't lose the focused tile.\n const [focusIdx, setFocusIdx] = useState(0);\n // Files staged for upload — shown in the metadata grid before POSTing.\n const [pending, setPending] = useState<Array<{ file: File; previewUrl: string }>>([]);\n const [pendingValues, setPendingValues] = useState<string[][]>([]);\n // Per-row upload progress/status, position-matched with `pending`. `progress`\n // survives a failed attempt so a retry resumes from the step that failed\n // instead of redoing presign/PUT/finalize from scratch.\n const [pendingProgress, setPendingProgress] = useState<UploadProgress[]>([]);\n const [pendingStatus, setPendingStatus] = useState<RowStatus[]>([]);\n // Existing item whose metadata is being edited. editFields is the schema\n // SNAPSHOT taken when the edit began — the grid columns and the PATCH body\n // both use it, so a schema fetch resolving mid-edit can't add columns whose\n // empty cells would clear (null) metadata the user never touched.\n const [editing, setEditing] = useState<MediaItem | null>(null);\n const [editFields, setEditFields] = useState<MetadataFieldDef[]>([]);\n const [editValues, setEditValues] = useState<string[][]>([]);\n const [panelError, setPanelError] = useState<string | null>(null);\n const replaceInputRef = useRef<HTMLInputElement>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const getAuthHeaders = useCallback(async (): Promise<HeadersInit> => {\n const token = await config.getAuthToken();\n return token ? { Authorization: \"Bearer \" + token } : {};\n }, [config]);\n\n const fetchMedia = useCallback(\n async (search?: string) => {\n setLoading(true);\n try {\n const params = siteParams(config);\n params.set(\"limit\", LIST_LIMIT);\n if (search) params.set(\"search\", search);\n const response = await fetch(\n config.workerUrl + \"/media?\" + params.toString(),\n { headers: await getAuthHeaders() },\n );\n if (response.ok) {\n setMedia(parseMediaList(await response.json()));\n setFocusIdx(0);\n }\n } catch (error) {\n console.error(\"Failed to fetch media:\", error);\n } finally {\n setLoading(false);\n }\n },\n [config, getAuthHeaders],\n );\n\n useEffect(() => {\n if (isOpen) {\n fetchMedia();\n setSearchQuery(\"\");\n }\n }, [isOpen, fetchMedia]);\n\n const searchInitialized = useRef(false);\n useEffect(() => {\n if (!isOpen) {\n searchInitialized.current = false;\n return;\n }\n // Skip the initial run — the open effect already fetches\n if (!searchInitialized.current) {\n searchInitialized.current = true;\n return;\n }\n const timer = setTimeout(() => {\n fetchMedia(searchQuery || undefined);\n }, 300);\n return () => clearTimeout(timer);\n }, [searchQuery, isOpen, fetchMedia]);\n\n // Chosen/dropped files are STAGED first: the metadata grid prompts for\n // alt/caption/… per file, then \"Upload\" POSTs each file with its row.\n const stageFiles = (files: FileList | null) => {\n if (!files || files.length === 0) return;\n const staged = Array.from(files).map((file) => ({\n file,\n previewUrl: URL.createObjectURL(file),\n }));\n setPending(staged);\n setPendingValues(staged.map(() => schema.map(() => \"\")));\n setPendingProgress(staged.map(() => ({})));\n setPendingStatus(staged.map(() => STAGED_STATUS));\n setPanelError(null);\n };\n\n const clearPending = useCallback(() => {\n setPending((prev) => {\n prev.forEach((p) => URL.revokeObjectURL(p.previewUrl));\n return [];\n });\n setPendingValues([]);\n setPendingProgress([]);\n setPendingStatus([]);\n setPanelError(null);\n }, []);\n\n // Modal closed with a staged upload → drop it (and its object URLs).\n useEffect(() => {\n if (!isOpen) {\n clearPending();\n setEditing(null);\n }\n }, [isOpen, clearPending]);\n\n const uploadAll = async () => {\n setUploading(true);\n setPanelError(null);\n const target: UploadTarget = {\n workerUrl: config.workerUrl,\n siteId: config.siteId,\n workstreamId: config.workstreamId,\n getAuthHeaders,\n };\n // Per-row outcome: retrying must never re-POST a file that already\n // finished (duplicate assets). Each row is caught individually below, so\n // one file's failure never aborts the rest of the batch.\n const progress = pending.map((_, i) => pendingProgress[i] ?? {});\n const statuses = pending.map((_, i) => pendingStatus[i] ?? STAGED_STATUS);\n for (let i = 0; i < pending.length; i++) {\n const metadata: Record<string, string> = {};\n schema.forEach((f, c) => {\n const value = pendingValues[i]?.[c]?.trim();\n if (value) metadata[f.name] = value;\n });\n try {\n const result = await runUpload(target, pending[i].file, metadata, undefined, progress[i], (step) => {\n statuses[i] = { step };\n setPendingStatus([...statuses]);\n });\n progress[i] = result.progress;\n statuses[i] = { step: \"done\" };\n } catch (error) {\n const message = error instanceof UploadFlowError ? error.message : \"Upload failed\";\n if (error instanceof UploadFlowError) progress[i] = error.progress;\n statuses[i] = { step: \"failed\", error: message };\n console.error(\"Upload failed:\", error);\n }\n setPendingProgress([...progress]);\n setPendingStatus([...statuses]);\n }\n try {\n if (statuses.every((s) => s.step === \"done\")) {\n clearPending();\n } else {\n // Drop finished rows (and release their previews); keep the rest with\n // their typed metadata AND progress so Upload retries resume from the\n // step that failed rather than redoing presign/PUT/finalize.\n pending.forEach((p, i) => {\n if (statuses[i].step === \"done\") URL.revokeObjectURL(p.previewUrl);\n });\n const kept = keepIncompleteRows(pending, pendingValues, progress, statuses);\n setPending(kept.rows);\n setPendingValues(kept.values);\n setPendingProgress(kept.progress);\n setPendingStatus(kept.statuses);\n const failures = kept.rows.length;\n setPanelError(\n `${failures} of ${pending.length} uploads failed — successful files are already in the library; only the failed rows below will be retried`,\n );\n }\n await fetchMedia(searchQuery || undefined);\n } finally {\n setUploading(false);\n }\n };\n\n const startEdit = (item: MediaItem) => {\n setEditing(item);\n setEditFields(schema);\n setEditValues([schema.map((f) => item.metadata?.[f.name] ?? \"\")]);\n setPanelError(null);\n };\n\n const saveEdit = async () => {\n if (!editing?.assetId) return;\n setUploading(true);\n setPanelError(null);\n try {\n // Flat map per the PATCH contract; empty cells clear via null. Built\n // from the edit-time field snapshot, never the live schema.\n const body = buildPatchBody(editFields, editValues[0] ?? []);\n const params = siteParams(config);\n const response = await fetch(\n config.workerUrl + \"/media/\" + encodeURIComponent(editing.assetId) + \"?\" + params.toString(),\n {\n method: \"PATCH\",\n body: JSON.stringify(body),\n headers: { ...(await getAuthHeaders()), \"Content-Type\": \"application/json\" },\n },\n );\n if (response.ok) {\n setEditing(null);\n await fetchMedia(searchQuery || undefined);\n } else {\n setPanelError(\"Failed to save metadata\");\n }\n } catch (error) {\n console.error(\"Failed to save metadata:\", error);\n setPanelError(\"Failed to save metadata\");\n } finally {\n setUploading(false);\n }\n };\n\n // \"Replace image\" in the edit panel: uploads the chosen file as a NEW\n // immutable version of the asset (POST /media/:assetId/versions) and\n // repoints current_version — metadata is untouched.\n const replaceImage = async (file: File | undefined) => {\n if (!file || !editing?.assetId) return;\n setUploading(true);\n setPanelError(null);\n try {\n const target: UploadTarget = {\n workerUrl: config.workerUrl,\n siteId: config.siteId,\n workstreamId: config.workstreamId,\n getAuthHeaders,\n };\n // Metadata is untouched by a replace — no metadata to send.\n const { item } = await runUpload(target, file, undefined, editing.assetId, {}, () => {});\n // Show the new version in the panel; the list refreshes on save/close.\n setEditing(item);\n await fetchMedia(searchQuery || undefined);\n } catch (error) {\n console.error(\"Failed to replace image:\", error);\n setPanelError(\n error instanceof UploadFlowError ? `Failed to replace image: ${error.message}` : \"Failed to replace image\",\n );\n } finally {\n setUploading(false);\n if (replaceInputRef.current) replaceInputRef.current.value = \"\";\n }\n };\n\n const selectItem = (item: MediaItem) => {\n if (onSelectItem) {\n onSelectItem(item);\n } else {\n onSelect(item.url);\n }\n onClose();\n };\n\n // Two-step inline delete: the tile's × button (or Delete key) arms a\n // per-tile confirmation overlay instead of window.confirm — a native\n // dialog blocks the whole page (including any browser automation driving it).\n const deleteItem = (item: MediaItem) => {\n if (!item.assetId) return; // soft delete is by assetId (frozen contract)\n (async () => {\n try {\n const params = siteParams(config);\n const response = await fetch(\n config.workerUrl + \"/media/\" + encodeURIComponent(item.assetId!) + \"?\" + params.toString(),\n {\n method: \"DELETE\",\n headers: await getAuthHeaders(),\n },\n );\n if (response.ok) {\n await fetchMedia(searchQuery || undefined);\n } else {\n console.error(\"Failed to delete media:\", response.statusText);\n }\n } catch (error) {\n console.error(\"Failed to delete media:\", error);\n }\n })();\n };\n\n if (!isOpen) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 99999,\n padding: \"20px\",\n }}\n onClick={onClose}\n >\n <div\n style={{\n backgroundColor: \"white\",\n borderRadius: \"12px\",\n boxShadow:\n \"0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04)\",\n maxWidth: \"900px\",\n width: \"100%\",\n maxHeight: \"80vh\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n padding: \"20px 24px\",\n borderBottom: \"1px solid #e0e0e0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <h2 style={{ margin: 0, fontSize: \"20px\", fontWeight: 600, color: \"#333\" }}>Media Library</h2>\n <button\n onClick={onClose}\n style={{\n background: \"none\",\n border: \"none\",\n fontSize: \"24px\",\n cursor: \"pointer\",\n color: \"#666\",\n padding: \"0\",\n width: \"32px\",\n height: \"32px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"4px\",\n }}\n >\n ×\n </button>\n </div>\n\n {/* Content */}\n <div ref={scrollRef} style={{ padding: \"24px\", overflowY: \"auto\", flex: 1 }}>\n {pending.length > 0 ? (\n <MediaUploadPanel\n schema={schema}\n pending={pending}\n pendingValues={pendingValues}\n onValuesChange={setPendingValues}\n pendingStatus={pendingStatus}\n uploading={uploading}\n panelError={panelError}\n onCancel={clearPending}\n onUpload={uploadAll}\n />\n ) : editing ? (\n <MediaEditPanel\n editing={editing}\n editFields={editFields}\n editValues={editValues}\n onValuesChange={setEditValues}\n uploading={uploading}\n panelError={panelError}\n onCancel={() => setEditing(null)}\n onSave={saveEdit}\n onReplaceImage={replaceImage}\n replaceInputRef={replaceInputRef}\n />\n ) : (\n <>\n <MediaUploadDropzone uploading={uploading} onFilesSelected={stageFiles} />\n <MediaGrid\n media={media}\n loading={loading}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onSelectItem={selectItem}\n onStartEdit={startEdit}\n onDeleteItem={deleteItem}\n scrollRef={scrollRef}\n focusIdx={focusIdx}\n onFocusIdxChange={setFocusIdx}\n />\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { MetadataFieldDef } from \"./types\";\n\nexport interface MediaConfig {\n workerUrl: string;\n siteId: string;\n workstreamId?: string;\n getAuthToken: () => Promise<string | null> | string | null;\n /**\n * Fallback metadata field schema for the rich `p1-media` field, used when\n * `GET /media/schema` is absent/unreachable (lets the plugin ship before the\n * Worker upgrade). Defaults to `[{ name: \"alt\", label: \"Alt text\", type: \"string\" }]`.\n */\n metadataFields?: MetadataFieldDef[];\n}\n\nconst MediaConfigContext = createContext<MediaConfig | null>(null);\n\nexport function MediaConfigProvider({\n config,\n children,\n}: {\n config: MediaConfig;\n children: React.ReactNode;\n}) {\n return (\n <MediaConfigContext.Provider value={config}>\n {children}\n </MediaConfigContext.Provider>\n );\n}\n\nexport function useMediaConfig(): MediaConfig {\n const ctx = useContext(MediaConfigContext);\n if (!ctx)\n throw new Error(\"useMediaConfig must be used within MediaConfigProvider\");\n return ctx;\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useMediaConfig } from \"../context\";\nimport type { MetadataFieldDef } from \"../types\";\n\nexport const DEFAULT_METADATA_FIELDS: MetadataFieldDef[] = [\n { name: \"alt\", label: \"Alt text\", type: \"string\" },\n];\n\n/** Ensures `alt` renders first (design: \"alt first\"), keeping the rest in order. */\nexport function orderAltFirst(schema: MetadataFieldDef[]): MetadataFieldDef[] {\n const alt = schema.find((f) => f.name === \"alt\");\n if (!alt) return schema;\n return [alt, ...schema.filter((f) => f.name !== \"alt\")];\n}\n\n/**\n * Fetches the metadata schema from `GET /media/schema`, falling back to the\n * plugin's `metadataFields` option (or `[alt]`) when the endpoint is\n * absent/unreachable — so the plugin works before the Worker is upgraded.\n */\nexport function useMediaSchema(): MetadataFieldDef[] {\n const config = useMediaConfig();\n const fallback =\n config.metadataFields && config.metadataFields.length > 0\n ? config.metadataFields\n : DEFAULT_METADATA_FIELDS;\n const [schema, setSchema] = useState<MetadataFieldDef[]>(fallback);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const token = await config.getAuthToken();\n const headers: HeadersInit = token ? { Authorization: \"Bearer \" + token } : {};\n const res = await fetch(config.workerUrl + \"/media/schema\", { headers });\n if (!res.ok) return;\n const data = await res.json();\n if (!cancelled && Array.isArray(data) && data.length > 0) {\n setSchema(data as MetadataFieldDef[]);\n }\n } catch {\n // keep the fallback\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [config]);\n\n return schema;\n}\n","// Pure helpers for the media library's staged-upload and edit panels.\n// Extracted from media-library.tsx so the two invariants below are unit-testable.\nimport type { MetadataFieldDef } from \"../types\";\nimport type { RowStatus, UploadProgress } from \"./upload-flow\";\n\n/**\n * Builds the PATCH body for saving edited metadata. `fields` must be the\n * SNAPSHOT taken when the edit began — never the live schema — because the\n * body sends `null` (= clear) for every listed field the user left empty.\n * If the schema fetch resolves mid-edit and grew the field list, iterating\n * the live schema here would null out fields the user never saw or touched.\n */\nexport function buildPatchBody(\n fields: MetadataFieldDef[],\n row: Array<string | undefined>,\n): Record<string, string | null> {\n const body: Record<string, string | null> = {};\n fields.forEach((f, c) => {\n const value = row[c]?.trim();\n body[f.name] = value ? value : null;\n });\n return body;\n}\n\n/**\n * Partitions a staged batch after an upload pass: rows whose upload finished\n * (`step === \"done\"`) are dropped (retrying must never re-POST them — that\n * would create duplicate assets); every other row keeps its position-matched\n * metadata values AND its `UploadProgress`, so a retry resumes from the step\n * that failed instead of restarting the whole presign/PUT/finalize sequence.\n * Rows never attempted (a mid-batch throw) are still \"staged\" and are kept.\n */\nexport function keepIncompleteRows<T>(\n rows: T[],\n values: string[][],\n progress: UploadProgress[],\n statuses: RowStatus[],\n): { rows: T[]; values: string[][]; progress: UploadProgress[]; statuses: RowStatus[] } {\n const kept: T[] = [];\n const keptValues: string[][] = [];\n const keptProgress: UploadProgress[] = [];\n const keptStatuses: RowStatus[] = [];\n rows.forEach((row, i) => {\n if (statuses[i]?.step === \"done\") return;\n kept.push(row);\n keptValues.push(values[i] ?? []);\n keptProgress.push(progress[i] ?? {});\n keptStatuses.push(statuses[i] ?? { step: \"staged\" });\n });\n return { rows: kept, values: keptValues, progress: keptProgress, statuses: keptStatuses };\n}\n","/**\n * A library item — the Worker's MediaAsset shape (frozen contract). `metadata`\n * is a FLAT string map that INCLUDES `alt`; `width`/`height` are top-level\n * captured dimensions. `assetId`/`versionId` are absent only when pointed at a\n * pre-cutover Worker, in which case selection falls back to a string value (R10).\n */\nexport interface MediaItem {\n assetId?: string;\n versionId?: string;\n url: string;\n filename: string;\n contentType?: string;\n size?: number;\n width?: number;\n height?: number;\n metadata?: Record<string, string>;\n metaSchemaVersion?: number;\n createdAt?: string;\n}\n\n/** Normalizes one raw MediaAsset entry into a MediaItem. */\nexport function normalizeItem(raw: Record<string, unknown>): MediaItem {\n let metadata = raw.metadata as Record<string, string> | undefined;\n if (typeof metadata === \"string\") {\n // Defensive: the contract sends an object, but tolerate a JSON string.\n try {\n metadata = JSON.parse(metadata);\n } catch {\n metadata = undefined;\n }\n }\n return {\n assetId: raw.assetId as string | undefined,\n versionId: raw.versionId as string | undefined,\n url: String(raw.url ?? \"\"),\n filename: String(raw.filename ?? \"\"),\n contentType: raw.contentType as string | undefined,\n size: raw.size as number | undefined,\n width: raw.width as number | undefined,\n height: raw.height as number | undefined,\n metadata: metadata && typeof metadata === \"object\" ? metadata : undefined,\n metaSchemaVersion: raw.metaSchemaVersion as number | undefined,\n createdAt: raw.createdAt as string | undefined,\n };\n}\n\n/** `GET /media` returns a bare JSON array of MediaAsset (frozen contract). */\nexport function parseMediaList(data: unknown): MediaItem[] {\n if (!Array.isArray(data)) return [];\n return data.map((r) => normalizeItem(r as Record<string, unknown>));\n}\n","// Presign -> PUT -> finalize upload sequence, extracted so both the batch\n// upload panel and the single-file \"Replace image\" action share one\n// implementation of the 3-step wire protocol.\nimport { normalizeItem, type MediaItem } from \"./media-item\";\n\n/** Lifecycle of a single file through the presign -> PUT -> finalize sequence. */\nexport type UploadStep = \"staged\" | \"presigning\" | \"uploading\" | \"finalizing\" | \"done\" | \"failed\";\n\nexport interface RowStatus {\n step: UploadStep;\n error?: string;\n}\n\nexport const STAGED_STATUS: RowStatus = { step: \"staged\" };\n\ninterface PresignResult {\n assetId: string;\n versionId: string;\n filename: string;\n uploadUrl: string;\n}\n\n/**\n * Presign result + PUT outcome for one file, carried across a failed attempt\n * so a retry resumes from the step that failed rather than redoing all\n * three. `presigned` is only kept once `uploaded` is also true — a presigned\n * URL expires after 5 minutes, so re-using one from a failed PUT attempt\n * could just fail again the same way; re-presigning is cheap and safe.\n */\nexport interface UploadProgress {\n presigned?: PresignResult;\n uploaded?: boolean;\n}\n\nexport interface UploadTarget {\n workerUrl: string;\n siteId: string;\n workstreamId?: string;\n getAuthHeaders: () => Promise<HeadersInit>;\n}\n\n/** Thrown on any step failure, carrying how far the upload actually got so the caller can retry from there. */\nexport class UploadFlowError extends Error {\n progress: UploadProgress;\n constructor(message: string, progress: UploadProgress) {\n super(message);\n this.name = \"UploadFlowError\";\n this.progress = progress;\n }\n}\n\nfunction targetParams(target: UploadTarget): string {\n const params = new URLSearchParams({ siteId: target.siteId });\n if (target.workstreamId) params.set(\"workstreamId\", target.workstreamId);\n return params.toString();\n}\n\nasync function postJson(target: UploadTarget, path: string, body: unknown): Promise<Response> {\n return fetch(`${target.workerUrl}${path}?${targetParams(target)}`, {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: { ...(await target.getAuthHeaders()), \"Content-Type\": \"application/json\" },\n });\n}\n\n/**\n * Runs the presign -> PUT -> finalize sequence for one file, resuming from\n * `progress` so a retry skips steps that already succeeded. Pass `assetId`\n * to upload a replacement version of an existing asset; omit it to create a\n * new asset. `onStep` fires before each network step so the caller can\n * render live per-row status.\n */\nexport async function runUpload(\n target: UploadTarget,\n file: File,\n metadata: Record<string, string> | undefined,\n assetId: string | undefined,\n progress: UploadProgress,\n onStep: (step: UploadStep) => void,\n): Promise<{ item: MediaItem; progress: UploadProgress }> {\n let presigned = progress.presigned;\n let uploaded = progress.uploaded ?? false;\n\n if (!uploaded) {\n onStep(\"presigning\");\n const presignPath = assetId ? `/media/${encodeURIComponent(assetId)}/versions/presign` : \"/media/presign\";\n let presignResponse: Response;\n try {\n presignResponse = await postJson(target, presignPath, {\n filename: file.name,\n contentType: file.type,\n size: file.size,\n metadata,\n });\n } catch (err) {\n throw new UploadFlowError(`Could not reach the server: ${(err as Error).message}`, {});\n }\n if (!presignResponse.ok) throw new UploadFlowError(`Presign failed (${presignResponse.status})`, {});\n const freshlyPresigned: PresignResult = await presignResponse.json();\n presigned = freshlyPresigned;\n\n onStep(\"uploading\");\n let putResponse: Response;\n try {\n putResponse = await fetch(freshlyPresigned.uploadUrl, {\n method: \"PUT\",\n body: file,\n headers: { \"Content-Type\": file.type },\n });\n } catch (err) {\n throw new UploadFlowError(`Upload to storage failed: ${(err as Error).message}`, {});\n }\n if (!putResponse.ok) throw new UploadFlowError(`Upload to storage failed (${putResponse.status})`, {});\n uploaded = true;\n }\n\n const nextProgress: UploadProgress = { presigned, uploaded };\n const presignedResult = presigned!;\n\n onStep(\"finalizing\");\n const finalizePath = assetId\n ? `/media/${encodeURIComponent(assetId)}/versions/finalize`\n : \"/media/finalize\";\n const finalizeBody = assetId\n ? { versionId: presignedResult.versionId, filename: presignedResult.filename }\n : {\n assetId: presignedResult.assetId,\n versionId: presignedResult.versionId,\n filename: presignedResult.filename,\n metadata,\n };\n let finalizeResponse: Response;\n try {\n finalizeResponse = await postJson(target, finalizePath, finalizeBody);\n } catch (err) {\n throw new UploadFlowError(`Could not reach the server: ${(err as Error).message}`, nextProgress);\n }\n if (!finalizeResponse.ok) throw new UploadFlowError(`Finalize failed (${finalizeResponse.status})`, nextProgress);\n\n const item = normalizeItem(await finalizeResponse.json());\n return { item, progress: nextProgress };\n}\n","\"use client\";\n\nimport { useRef, useState } from \"react\";\n\n/** Drag-and-drop / click-to-browse file picker shown in the library's browse view. */\nexport function MediaUploadDropzone(props: {\n uploading: boolean;\n onFilesSelected: (files: FileList | null) => void;\n}) {\n const { uploading, onFilesSelected } = props;\n const [dragActive, setDragActive] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(true);\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n onFilesSelected(e.dataTransfer.files);\n };\n\n return (\n <div\n style={{\n border: dragActive ? \"2px solid #2563eb\" : \"2px dashed #d0d0d0\",\n borderRadius: \"8px\",\n padding: \"32px\",\n textAlign: \"center\",\n marginBottom: \"16px\",\n cursor: \"pointer\",\n backgroundColor: dragActive ? \"#eff6ff\" : \"#fafafa\",\n transition: \"all 0.2s\",\n }}\n onClick={() => fileInputRef.current?.click()}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n style={{ display: \"none\" }}\n onChange={(e) => onFilesSelected(e.target.files)}\n />\n <div style={{ fontSize: \"28px\", marginBottom: \"8px\", color: \"#999\" }}>\n {uploading ? \"⏳\" : \"↑\"}\n </div>\n <div style={{ color: \"#666\", fontSize: \"14px\" }}>\n {uploading ? \"Uploading...\" : \"Drag & drop files here or click to browse\"}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, type ReactElement } from \"react\";\nimport { applyDelimited } from \"../delimited\";\nimport type { MetadataFieldDef } from \"../types\";\n\nexport interface MetadataGridRow {\n key: string;\n /** Shown in the row header and used for header-mode paste matching (filename). */\n label: string;\n thumbnailUrl?: string;\n /** Small status badge under the filename (e.g. upload progress/failure). */\n status?: { text: string; isError?: boolean };\n}\n\n/**\n * Keyboard-accessible metadata entry grid: one row per image, one column per\n * schema field. Tab moves through cells in DOM order; Enter/ArrowDown and\n * ArrowUp move within a column (inputs are single-line, so vertical arrows are\n * free). Pasting multi-cell TSV/CSV fills from the focused cell — or maps by\n * header row / filename column when present (see applyDelimited).\n */\nexport function MetadataGrid(props: {\n fields: MetadataFieldDef[];\n rows: MetadataGridRow[];\n /** `rows.length` x `fields.length` current values. */\n values: string[][];\n onChange: (next: string[][]) => void;\n disabled?: boolean;\n /** Focus the first cell when the grid mounts. */\n autoFocus?: boolean;\n}): ReactElement {\n const { fields, rows, values, onChange, disabled, autoFocus } = props;\n const inputRefs = useRef<Array<Array<HTMLInputElement | null>>>([]);\n inputRefs.current = rows.map((_, r) => inputRefs.current[r] ?? []);\n\n useEffect(() => {\n if (autoFocus) inputRefs.current[0]?.[0]?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const setCell = (r: number, c: number, v: string) => {\n const next = values.map((row) => [...row]);\n next[r][c] = v;\n onChange(next);\n };\n\n const focusCell = (r: number, c: number) => {\n inputRefs.current[r]?.[c]?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, r: number, c: number) => {\n if (e.key === \"Enter\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n focusCell(Math.min(r + 1, rows.length - 1), c);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n focusCell(Math.max(r - 1, 0), c);\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent, r: number, c: number) => {\n const text = e.clipboardData.getData(\"text/plain\");\n const next = applyDelimited({\n text,\n fields,\n rowLabels: rows.map((row) => row.label),\n current: values,\n anchorRow: r,\n anchorCol: c,\n });\n if (next) {\n e.preventDefault();\n onChange(next);\n }\n // null → plain value; let the browser paste into the cell normally\n };\n\n const cellInputStyle: React.CSSProperties = {\n width: \"100%\",\n minWidth: \"110px\",\n padding: \"5px 7px\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontFamily: \"inherit\",\n boxSizing: \"border-box\",\n outline: \"none\",\n };\n\n const thStyle: React.CSSProperties = {\n textAlign: \"left\",\n fontSize: \"11px\",\n fontWeight: 600,\n color: \"#666\",\n padding: \"4px 6px\",\n whiteSpace: \"nowrap\",\n };\n\n return (\n <div style={{ overflowX: \"auto\" }}>\n <table\n role=\"grid\"\n aria-label=\"Image metadata\"\n style={{ borderCollapse: \"separate\", borderSpacing: \"4px\", width: \"100%\" }}\n >\n <thead>\n <tr>\n <th style={thStyle} scope=\"col\">\n File\n </th>\n {fields.map((f) => (\n <th key={f.name} style={thStyle} scope=\"col\">\n {f.label}\n {f.required ? \" *\" : \"\"}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, r) => (\n <tr key={row.key}>\n <th\n scope=\"row\"\n style={{\n ...thStyle,\n fontWeight: 500,\n color: \"#444\",\n maxWidth: \"180px\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\" }}>\n {row.thumbnailUrl && (\n <img\n src={row.thumbnailUrl}\n alt=\"\"\n style={{\n width: \"32px\",\n height: \"32px\",\n objectFit: \"cover\",\n borderRadius: \"4px\",\n flexShrink: 0,\n }}\n />\n )}\n <div style={{ overflow: \"hidden\" }}>\n <span\n title={row.label}\n style={{\n display: \"block\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: \"140px\",\n }}\n >\n {row.label}\n </span>\n {row.status && (\n <span\n style={{\n display: \"block\",\n fontSize: \"11px\",\n fontWeight: 400,\n color: row.status.isError ? \"#c0392b\" : \"#888\",\n }}\n >\n {row.status.text}\n </span>\n )}\n </div>\n </div>\n </th>\n {fields.map((f, c) => (\n <td key={f.name} style={{ padding: 0 }}>\n <input\n ref={(el) => {\n inputRefs.current[r][c] = el;\n }}\n type=\"text\"\n value={values[r]?.[c] ?? \"\"}\n disabled={disabled}\n aria-label={`${f.label} for ${row.label}`}\n onChange={(e) => setCell(r, c, e.target.value)}\n onKeyDown={(e) => handleKeyDown(e, r, c)}\n onPaste={(e) => handlePaste(e, r, c)}\n style={{ ...cellInputStyle, opacity: disabled ? 0.6 : 1 }}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","// Delimited-text (TSV/CSV) paste support for the upload metadata grid.\n// Pure functions — all grid-fill decisions live here so they are unit-testable.\nimport type { MetadataFieldDef } from \"./types\";\n\n/** RFC-4180-ish parse: quoted fields, \"\" escapes, CRLF/LF rows. */\nfunction parseWithDelimiter(text: string, delim: string): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = \"\";\n let inQuotes = false;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"';\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n cell += ch;\n }\n } else if (ch === '\"' && cell === \"\") {\n inQuotes = true;\n } else if (ch === delim) {\n row.push(cell);\n cell = \"\";\n } else if (ch === \"\\n\" || ch === \"\\r\") {\n if (ch === \"\\r\" && text[i + 1] === \"\\n\") i++;\n row.push(cell);\n cell = \"\";\n rows.push(row);\n row = [];\n } else {\n cell += ch;\n }\n }\n if (cell !== \"\" || row.length > 0) {\n row.push(cell);\n rows.push(row);\n }\n // Trailing newline artifacts\n while (rows.length > 0 && rows[rows.length - 1].every((c) => c === \"\")) rows.pop();\n return rows;\n}\n\n/**\n * Parses clipboard text as TSV when it contains any tab (what spreadsheets\n * put on the clipboard), CSV otherwise.\n */\nexport function parseDelimited(text: string): string[][] {\n if (!text) return [];\n return parseWithDelimiter(text, text.includes(\"\\t\") ? \"\\t\" : \",\");\n}\n\nfunction norm(s: string): string {\n return s.trim().toLowerCase();\n}\n\nconst FILENAME_HEADERS = new Set([\"filename\", \"file\", \"name\"]);\n\n/**\n * A header row is one whose every non-empty cell names a schema field (by\n * `name` or `label`, case-insensitive) or a filename column. Returns the\n * column mapping (field index per column, -1 = ignore, \"filename\" for the\n * match column), or null when the row is not a header.\n */\nexport function detectHeader(\n row: string[],\n fields: MetadataFieldDef[],\n): Array<number | \"filename\"> | null {\n let matched = 0;\n const mapping: Array<number | \"filename\"> = row.map(() => -1);\n for (let c = 0; c < row.length; c++) {\n const cell = norm(row[c]);\n if (cell === \"\") continue;\n if (FILENAME_HEADERS.has(cell)) {\n mapping[c] = \"filename\";\n matched++;\n continue;\n }\n const idx = fields.findIndex((f) => norm(f.name) === cell || norm(f.label) === cell);\n if (idx === -1) return null; // a non-empty cell that isn't a known column\n mapping[c] = idx;\n matched++;\n }\n return matched > 0 ? mapping : null;\n}\n\nexport interface ApplyDelimitedOptions {\n /** Raw clipboard text. */\n text: string;\n /** Grid columns, in display order. */\n fields: MetadataFieldDef[];\n /** One label (filename) per grid row, for header-mode row matching. */\n rowLabels: string[];\n /** Current grid values, `rowLabels.length` x `fields.length`. */\n current: string[][];\n /** Cell the paste landed on. */\n anchorRow: number;\n anchorCol: number;\n}\n\n/**\n * Applies pasted delimited text to the grid, returning the next values or\n * `null` when the text is not grid-shaped (a plain single value — the caller\n * should let the browser's default paste happen).\n *\n * - With a header row (cells matching field names/labels, optionally a\n * filename column): columns map by header; rows match by filename when that\n * column is present, else top-to-bottom from row 0. The anchor is ignored,\n * so a whole exported sheet can be pasted into any cell.\n * - Without a header: values fill right/down from the anchor cell,\n * spreadsheet-style, clamped to the grid.\n * - A single-line comma-containing string is treated as prose, not CSV; a\n * single line is only grid-shaped when tab-delimited.\n */\nexport function applyDelimited(opts: ApplyDelimitedOptions): string[][] | null {\n const { text, fields, rowLabels, current, anchorRow, anchorCol } = opts;\n const parsed = parseDelimited(text);\n if (parsed.length === 0) return null;\n const multiCell =\n parsed.length > 1 || (parsed[0].length > 1 && text.includes(\"\\t\"));\n if (!multiCell) return null;\n\n const next = current.map((r) => [...r]);\n\n const header = detectHeader(parsed[0], fields);\n if (header && parsed.length > 1) {\n const dataRows = parsed.slice(1);\n const filenameCol = header.indexOf(\"filename\");\n for (let i = 0; i < dataRows.length; i++) {\n let targetRow: number;\n if (filenameCol !== -1) {\n const wanted = norm(dataRows[i][filenameCol] ?? \"\");\n targetRow = rowLabels.findIndex((l) => norm(l) === wanted);\n if (targetRow === -1) continue; // no matching upload — skip the row\n } else {\n targetRow = i;\n if (targetRow >= next.length) break;\n }\n for (let c = 0; c < dataRows[i].length; c++) {\n const fieldIdx = header[c];\n if (typeof fieldIdx !== \"number\" || fieldIdx < 0) continue;\n next[targetRow][fieldIdx] = dataRows[i][c] ?? \"\";\n }\n }\n return next;\n }\n\n // Anchor-relative fill, clamped to the grid.\n for (let r = 0; r < parsed.length; r++) {\n const targetRow = anchorRow + r;\n if (targetRow >= next.length) break;\n for (let c = 0; c < parsed[r].length; c++) {\n const targetCol = anchorCol + c;\n if (targetCol >= fields.length) break;\n next[targetRow][targetCol] = parsed[r][c];\n }\n }\n return next;\n}\n","import type { CSSProperties } from \"react\";\n\n// Shared inline styles for the library's upload-details and edit panels.\n\nexport function primaryBtnStyle(uploading: boolean): CSSProperties {\n return {\n padding: \"8px 16px\",\n backgroundColor: \"#2563eb\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: uploading ? \"not-allowed\" : \"pointer\",\n opacity: uploading ? 0.6 : 1,\n fontFamily: \"inherit\",\n };\n}\n\nexport function secondaryBtnStyle(uploading: boolean): CSSProperties {\n return {\n padding: \"8px 16px\",\n backgroundColor: \"white\",\n color: \"#666\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: uploading ? \"not-allowed\" : \"pointer\",\n fontFamily: \"inherit\",\n };\n}\n\nexport const panelErrorStyle: CSSProperties = {\n color: \"#b91c1c\",\n fontSize: \"12px\",\n marginTop: \"8px\",\n};\n\nexport const panelHeadingStyle: CSSProperties = {\n fontSize: \"15px\",\n fontWeight: 600,\n color: \"#333\",\n marginBottom: \"4px\",\n};\n\nexport const panelButtonRowStyle: CSSProperties = {\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n marginTop: \"16px\",\n};\n","\"use client\";\n\nimport { MetadataGrid } from \"./metadata-grid\";\nimport { panelErrorStyle, panelHeadingStyle, panelButtonRowStyle, primaryBtnStyle, secondaryBtnStyle } from \"./media-panel-styles\";\nimport type { MetadataFieldDef } from \"../types\";\nimport type { RowStatus } from \"./upload-flow\";\n\nconst STEP_LABEL: Record<RowStatus[\"step\"], string | null> = {\n staged: null,\n presigning: \"Preparing…\",\n uploading: \"Uploading…\",\n finalizing: \"Finalizing…\",\n done: \"Done\",\n failed: null, // uses the row's own error message instead\n};\n\nfunction statusBadge(status: RowStatus | undefined): { text: string; isError?: boolean } | undefined {\n if (!status) return undefined;\n if (status.step === \"failed\") return { text: status.error ?? \"Failed\", isError: true };\n const text = STEP_LABEL[status.step];\n return text ? { text } : undefined;\n}\n\n/** Staged-file metadata grid shown after files are chosen/dropped, before POSTing. */\nexport function MediaUploadPanel(props: {\n schema: MetadataFieldDef[];\n pending: Array<{ file: File; previewUrl: string }>;\n pendingValues: string[][];\n onValuesChange: (values: string[][]) => void;\n pendingStatus: RowStatus[];\n uploading: boolean;\n panelError: string | null;\n onCancel: () => void;\n onUpload: () => void;\n}) {\n const { schema, pending, pendingValues, onValuesChange, pendingStatus, uploading, panelError, onCancel, onUpload } =\n props;\n\n return (\n <div>\n <div style={panelHeadingStyle}>\n Add details for {pending.length} {pending.length === 1 ? \"image\" : \"images\"}\n </div>\n <div style={{ fontSize: \"12px\", color: \"#888\", marginBottom: \"12px\" }}>\n Tab, Enter and the arrow keys move between cells. Paste TSV or CSV from a\n spreadsheet to fill many rows at once — include a header row (alt, caption,\n …) plus an optional filename column to map values automatically.\n </div>\n <MetadataGrid\n fields={schema}\n rows={pending.map((p, i) => ({\n key: i + \"-\" + p.file.name,\n label: p.file.name,\n thumbnailUrl: p.previewUrl,\n status: statusBadge(pendingStatus[i]),\n }))}\n values={pendingValues}\n onChange={onValuesChange}\n disabled={uploading}\n autoFocus\n />\n {panelError && <div style={panelErrorStyle}>{panelError}</div>}\n <div style={panelButtonRowStyle}>\n <button type=\"button\" onClick={onCancel} disabled={uploading} style={secondaryBtnStyle(uploading)}>\n Cancel\n </button>\n <button type=\"button\" onClick={onUpload} disabled={uploading} style={primaryBtnStyle(uploading)}>\n {uploading ? \"Uploading…\" : `Upload ${pending.length} ${pending.length === 1 ? \"image\" : \"images\"}`}\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { RefObject } from \"react\";\nimport { MetadataGrid } from \"./metadata-grid\";\nimport { panelErrorStyle, panelHeadingStyle, panelButtonRowStyle, primaryBtnStyle, secondaryBtnStyle } from \"./media-panel-styles\";\nimport type { MediaItem } from \"./media-item\";\nimport type { MetadataFieldDef } from \"../types\";\n\n/** Metadata-editing panel for an existing library item, with a Replace-image action. */\nexport function MediaEditPanel(props: {\n editing: MediaItem;\n editFields: MetadataFieldDef[];\n editValues: string[][];\n onValuesChange: (values: string[][]) => void;\n uploading: boolean;\n panelError: string | null;\n onCancel: () => void;\n onSave: () => void;\n onReplaceImage: (file: File | undefined) => void;\n replaceInputRef: RefObject<HTMLInputElement | null>;\n}) {\n const {\n editing,\n editFields,\n editValues,\n onValuesChange,\n uploading,\n panelError,\n onCancel,\n onSave,\n onReplaceImage,\n replaceInputRef,\n } = props;\n\n return (\n <div>\n <div style={{ ...panelHeadingStyle, marginBottom: \"12px\" }}>Edit details — {editing.filename}</div>\n <MetadataGrid\n fields={editFields}\n rows={[\n {\n key: editing.assetId ?? editing.url,\n label: editing.filename,\n thumbnailUrl: editing.url,\n },\n ]}\n values={editValues}\n onChange={onValuesChange}\n disabled={uploading}\n autoFocus\n />\n {panelError && <div style={panelErrorStyle}>{panelError}</div>}\n <div style={panelButtonRowStyle}>\n <input\n ref={replaceInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: \"none\" }}\n onChange={(e) => onReplaceImage(e.target.files?.[0])}\n />\n <button\n type=\"button\"\n onClick={() => replaceInputRef.current?.click()}\n disabled={uploading}\n title=\"Upload a new image as a new version of this asset\"\n style={{ ...secondaryBtnStyle(uploading), marginRight: \"auto\" }}\n >\n Replace image…\n </button>\n <button type=\"button\" onClick={onCancel} disabled={uploading} style={secondaryBtnStyle(uploading)}>\n Cancel\n </button>\n <button type=\"button\" onClick={onSave} disabled={uploading} style={primaryBtnStyle(uploading)}>\n {uploading ? \"Saving…\" : \"Save details\"}\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type RefObject } from \"react\";\nimport type { MediaItem } from \"./media-item\";\n\n// Tiles are revealed in batches as a sentinel scrolls into view, so a large\n// library doesn't render everything at once (tile images also load lazily).\nconst TILE_BATCH = 60;\n\n/** Searchable, keyboard-navigable grid of existing library items. */\nexport function MediaGrid(props: {\n media: MediaItem[];\n loading: boolean;\n searchQuery: string;\n onSearchChange: (value: string) => void;\n onSelectItem: (item: MediaItem) => void;\n onStartEdit: (item: MediaItem) => void;\n onDeleteItem: (item: MediaItem) => void;\n scrollRef: RefObject<HTMLDivElement | null>;\n // Owned by the parent (not this component) so a temporary switch to the\n // upload/edit panel and back — which unmounts/remounts this grid — doesn't\n // reset which tile was focused. The parent resets it to 0 on each fetch.\n focusIdx: number;\n onFocusIdxChange: (idx: number) => void;\n}) {\n const {\n media,\n loading,\n searchQuery,\n onSearchChange,\n onSelectItem,\n onStartEdit,\n onDeleteItem,\n scrollRef,\n focusIdx,\n onFocusIdxChange,\n } = props;\n\n const [visibleCount, setVisibleCount] = useState(TILE_BATCH);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n const tileRefs = useRef<Array<HTMLDivElement | null>>([]);\n\n // A fresh fetch (new search or initial load) always starts back at the top.\n useEffect(() => {\n setVisibleCount(TILE_BATCH);\n }, [media]);\n\n // Reveal the next tile batch when the sentinel enters the scroll viewport.\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel || typeof IntersectionObserver === \"undefined\") return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setVisibleCount((count) => count + TILE_BATCH);\n }\n },\n { root: scrollRef.current, rootMargin: \"200px\" },\n );\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [media.length, visibleCount, scrollRef]);\n\n // Grid columns are responsive (auto-fill); count the tiles sharing the\n // first tile's offsetTop instead of assuming a fixed column count.\n const computeColumns = (): number => {\n const tiles = tileRefs.current.filter((t): t is HTMLDivElement => t !== null);\n if (tiles.length <= 1) return 1;\n const firstTop = tiles[0].offsetTop;\n let columns = 0;\n for (const tile of tiles) {\n if (tile.offsetTop !== firstTop) break;\n columns++;\n }\n return Math.max(1, columns);\n };\n\n const focusTile = (index: number) => {\n onFocusIdxChange(index);\n tileRefs.current[index]?.focus();\n };\n\n const handleTileKeyDown = (e: React.KeyboardEvent, index: number, item: MediaItem) => {\n const rendered = Math.min(media.length, visibleCount);\n const columns = computeColumns();\n let next: number | null = null;\n switch (e.key) {\n case \"ArrowRight\":\n next = Math.min(index + 1, rendered - 1);\n break;\n case \"ArrowLeft\":\n next = Math.max(index - 1, 0);\n break;\n case \"ArrowDown\":\n next = Math.min(index + columns, rendered - 1);\n break;\n case \"ArrowUp\":\n next = Math.max(index - columns, 0);\n break;\n case \"Home\":\n next = 0;\n break;\n case \"End\":\n next = rendered - 1;\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n onSelectItem(item);\n return;\n case \"e\":\n case \"E\":\n if (item.assetId) {\n e.preventDefault();\n onStartEdit(item);\n }\n return;\n case \"Delete\":\n case \"Backspace\":\n if (item.assetId) {\n e.preventDefault();\n setConfirmDeleteId(item.assetId);\n }\n return;\n case \"Escape\":\n if (confirmDeleteId) {\n e.preventDefault();\n setConfirmDeleteId(null);\n }\n return;\n default:\n return;\n }\n e.preventDefault();\n focusTile(next);\n };\n\n return (\n <>\n {/* Search */}\n <input\n type=\"text\"\n placeholder=\"Search by filename or metadata...\"\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"10px 12px\",\n border: \"1px solid #e0e0e0\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n fontFamily: \"inherit\",\n outline: \"none\",\n boxSizing: \"border-box\",\n marginBottom: \"16px\",\n }}\n />\n\n {/* Grid */}\n {loading ? (\n <div style={{ textAlign: \"center\", padding: \"40px\", color: \"#999\", fontSize: \"14px\" }}>Loading...</div>\n ) : media.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: \"40px\", color: \"#999\", fontSize: \"14px\" }}>No media found</div>\n ) : (\n <div\n role=\"listbox\"\n aria-label=\"Media items — arrow keys to navigate, Enter to select, E to edit, Delete to remove\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(150px, 1fr))\",\n gap: \"12px\",\n }}\n >\n {media.slice(0, visibleCount).map((item, i) => (\n <div\n key={item.assetId ?? item.url}\n ref={(el) => {\n tileRefs.current[i] = el;\n }}\n role=\"option\"\n aria-selected={false}\n aria-label={item.filename}\n tabIndex={i === Math.min(focusIdx, Math.min(media.length, visibleCount) - 1) ? 0 : -1}\n style={{\n position: \"relative\",\n cursor: \"pointer\",\n border: \"2px solid transparent\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n transition: \"border-color 0.15s\",\n backgroundColor: \"#f9f9f9\",\n outline: \"none\",\n }}\n onClick={() => onSelectItem(item)}\n onKeyDown={(e) => handleTileKeyDown(e, i, item)}\n onFocus={(e) => {\n onFocusIdxChange(i);\n e.currentTarget.style.borderColor = \"#2563eb\";\n e.currentTarget.style.boxShadow = \"0 0 0 2px rgba(37, 99, 235, 0.35)\";\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = \"transparent\";\n e.currentTarget.style.boxShadow = \"none\";\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = \"#2563eb\";\n e.currentTarget\n .querySelectorAll<HTMLElement>(\"[data-delete-btn], [data-edit-btn]\")\n .forEach((btn) => (btn.style.opacity = \"1\"));\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = \"transparent\";\n e.currentTarget\n .querySelectorAll<HTMLElement>(\"[data-delete-btn], [data-edit-btn]\")\n .forEach((btn) => (btn.style.opacity = \"0.6\"));\n }}\n >\n {item.assetId && (\n <button\n data-edit-btn\n title=\"Edit details\"\n aria-label={`Edit details for ${item.filename}`}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onStartEdit(item);\n }}\n style={{\n position: \"absolute\",\n top: \"4px\",\n right: \"32px\",\n zIndex: 1,\n width: \"24px\",\n height: \"24px\",\n padding: 0,\n border: \"none\",\n borderRadius: \"4px\",\n backgroundColor: \"rgba(0, 0, 0, 0.55)\",\n color: \"white\",\n fontSize: \"12px\",\n lineHeight: \"24px\",\n textAlign: \"center\",\n cursor: \"pointer\",\n opacity: 0.6,\n transition: \"opacity 0.15s\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n ✎\n </button>\n )}\n {item.assetId && (\n <button\n data-delete-btn\n title=\"Delete image\"\n aria-label={`Delete ${item.filename}`}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(item.assetId ?? null);\n }}\n style={{\n position: \"absolute\",\n top: \"4px\",\n right: \"4px\",\n zIndex: 1,\n width: \"24px\",\n height: \"24px\",\n padding: 0,\n border: \"none\",\n borderRadius: \"4px\",\n backgroundColor: \"rgba(0, 0, 0, 0.55)\",\n color: \"white\",\n fontSize: \"14px\",\n lineHeight: \"24px\",\n textAlign: \"center\",\n cursor: \"pointer\",\n opacity: 0.6,\n transition: \"opacity 0.15s, background-color 0.15s\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = \"1\";\n e.currentTarget.style.backgroundColor = \"rgba(220, 38, 38, 0.9)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"rgba(0, 0, 0, 0.55)\";\n }}\n >\n ×\n </button>\n )}\n <img\n src={item.url}\n alt={item.filename}\n loading=\"lazy\"\n decoding=\"async\"\n style={{ width: \"100%\", height: \"120px\", objectFit: \"cover\", display: \"block\" }}\n />\n {item.assetId && confirmDeleteId === item.assetId && (\n <div\n role=\"alertdialog\"\n aria-label={`Delete ${item.filename}?`}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n // Keep tile-level navigation from hijacking the dialog\n e.stopPropagation();\n if (e.key === \"Escape\") {\n setConfirmDeleteId(null);\n tileRefs.current[i]?.focus();\n }\n }}\n style={{\n position: \"absolute\",\n inset: 0,\n zIndex: 2,\n backgroundColor: \"rgba(0, 0, 0, 0.72)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n padding: \"8px\",\n }}\n >\n <div style={{ color: \"white\", fontSize: \"12px\", fontWeight: 600, textAlign: \"center\" }}>\n Delete this image?\n </div>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <button\n type=\"button\"\n autoFocus\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(null);\n onDeleteItem(item);\n }}\n style={{\n padding: \"4px 10px\",\n backgroundColor: \"#dc2626\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Delete\n </button>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(null);\n tileRefs.current[i]?.focus();\n }}\n style={{\n padding: \"4px 10px\",\n backgroundColor: \"white\",\n color: \"#444\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n <div\n style={{\n padding: \"6px 8px\",\n fontSize: \"11px\",\n color: \"#555\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n title={item.filename}\n >\n {item.filename}\n </div>\n </div>\n ))}\n </div>\n )}\n {media.length > visibleCount && <div ref={sentinelRef} aria-hidden=\"true\" style={{ height: \"1px\" }} />}\n </>\n );\n}\n","// Crop param helpers shared by the basic (string) and rich (p1-media) fields.\n// Crop lives in the URL query so the stored value stays a plain CDN URL.\n\nexport type CropMode = \"fit\" | \"smart\" | \"custom\";\n\n/** A manual crop region in source-image pixels (the Worker's `trim.*` params). */\nexport interface TrimRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport function getBaseUrl(value: string): string {\n return value ? value.split(\"?\")[0] : \"\";\n}\n\nfunction getParams(value: string): URLSearchParams {\n return new URLSearchParams(value.includes(\"?\") ? value.split(\"?\")[1] : \"\");\n}\n\nexport function getCropMode(value: string): CropMode {\n if (!value) return \"fit\";\n const params = getParams(value);\n if (params.has(\"trim.left\")) return \"custom\";\n return params.get(\"fit\") === \"cover\" ? \"smart\" : \"fit\";\n}\n\n/** Reads the manual crop region off a value URL, or null when absent/malformed. */\nexport function getTrimRect(value: string): TrimRect | null {\n if (!value) return null;\n const params = getParams(value);\n const read = (key: string): number | null => {\n const raw = params.get(key);\n if (raw === null || raw === \"\") return null;\n const n = Number(raw);\n return Number.isFinite(n) ? n : null;\n };\n const left = read(\"trim.left\");\n const top = read(\"trim.top\");\n const width = read(\"trim.width\");\n const height = read(\"trim.height\");\n if (left === null || top === null || width === null || height === null) return null;\n return { left, top, width, height };\n}\n\n/**\n * Builds a value URL for a preset crop mode. `custom` is not a preset — it\n * intentionally degrades to fit-in here, because callers reach this either\n * from the fit/smart buttons (never \"custom\") or when carrying the current\n * mode onto a NEWLY selected asset, where the old image's trim rect would be\n * meaningless.\n */\nexport function buildValueWithCrop(baseUrl: string, crop: CropMode): string {\n // baseUrl always has query params stripped by getBaseUrl before being passed here\n return crop === \"smart\"\n ? `${baseUrl}?fit=cover&gravity=auto`\n : `${baseUrl}?fit=scale-down`;\n}\n\n/**\n * Builds a value URL carrying a manual crop region. Values are rounded to\n * integers and clamped to a ≥1px region at a non-negative offset — the Worker\n * passes them straight to Cloudflare Images, which rejects degenerate rects.\n */\nexport function buildValueWithTrim(baseUrl: string, rect: TrimRect): string {\n const left = Math.max(0, Math.round(rect.left));\n const top = Math.max(0, Math.round(rect.top));\n const width = Math.max(1, Math.round(rect.width));\n const height = Math.max(1, Math.round(rect.height));\n return `${baseUrl}?trim.left=${left}&trim.top=${top}&trim.width=${width}&trim.height=${height}`;\n}\n","\"use client\";\n\nimport { useState, type ReactElement } from \"react\";\nimport { MediaLibrary, type MediaItem } from \"./media-library\";\nimport { CropDialog } from \"./crop-dialog\";\nimport { useMediaSchema, orderAltFirst } from \"./use-media-schema\";\nimport { getBaseUrl, getCropMode, getTrimRect, type CropMode, type TrimRect } from \"../crop\";\nimport {\n isMediaValue,\n applyCropToValue,\n applyTrimToValue,\n setMetaOnValue,\n buildValueFromAsset,\n} from \"../media-value\";\nimport type { MediaFieldValue, MetadataFieldDef } from \"../types\";\n\n/**\n * Object-aware editor UI for the `p1-media` field: image preview + crop\n * controls + schema-driven metadata inputs. Distinct from the basic (string)\n * field — crop params live inside `value.url` and the value is an object.\n */\nexport function MediaObjectFieldRender(props: {\n label: string;\n name: string;\n id: string;\n value: MediaFieldValue;\n onChange: (value: MediaFieldValue) => void;\n readOnly?: boolean;\n}): ReactElement {\n const { value, onChange, readOnly } = props;\n const [isLibraryOpen, setIsLibraryOpen] = useState(false);\n const [isCropOpen, setIsCropOpen] = useState(false);\n const schema = orderAltFirst(useMediaSchema());\n\n const isObject = isMediaValue(value);\n const urlString = isObject ? value.url : typeof value === \"string\" ? value : \"\";\n const baseUrl = getBaseUrl(urlString);\n const cropMode = getCropMode(urlString);\n\n // All write paths route through pure helpers in media-value.ts, which\n // hold the R10 invariant (never a partial-identity object) and identity-key\n // guards; the component only wires them to onChange.\n const handleCropChange = (crop: CropMode) => {\n if (!baseUrl) return;\n onChange(applyCropToValue(value, crop));\n };\n\n const handleApplyTrim = (rect: TrimRect) => {\n onChange(applyTrimToValue(value, rect));\n setIsCropOpen(false);\n };\n\n const handleMetaChange = (fieldName: string, fieldValue: string) => {\n onChange(setMetaOnValue(value, fieldName, fieldValue));\n };\n\n const handleSelectItem = (item: MediaItem) => {\n onChange(buildValueFromAsset(item, cropMode));\n setIsLibraryOpen(false);\n };\n\n const buttonBase: React.CSSProperties = {\n padding: \"3px 10px\",\n fontSize: \"12px\",\n fontWeight: 500,\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n fontFamily: \"inherit\",\n };\n\n const inputStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"6px 8px\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontFamily: \"inherit\",\n boxSizing: \"border-box\",\n outline: \"none\",\n };\n\n return (\n <div style={{ width: \"100%\" }}>\n {baseUrl ? (\n <div style={{ marginBottom: \"8px\" }}>\n <img\n src={urlString}\n alt=\"Preview\"\n style={{\n width: \"100%\",\n maxHeight: \"120px\",\n objectFit: \"cover\",\n borderRadius: \"6px\",\n display: \"block\",\n border: \"1px solid #e0e0e0\",\n }}\n />\n </div>\n ) : (\n <div\n style={{\n height: \"80px\",\n border: \"2px dashed #d0d0d0\",\n borderRadius: \"6px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginBottom: \"8px\",\n color: \"#999\",\n fontSize: \"13px\",\n cursor: readOnly ? \"default\" : \"pointer\",\n }}\n onClick={() => !readOnly && setIsLibraryOpen(true)}\n >\n Click to select image\n </div>\n )}\n\n {baseUrl && (\n <div style={{ marginBottom: \"8px\" }}>\n <div style={{ fontSize: \"11px\", color: \"#666\", fontWeight: 500, marginBottom: \"4px\" }}>\n Crop\n </div>\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => handleCropChange(\"fit\")}\n style={{\n ...buttonBase,\n backgroundColor: cropMode === \"fit\" ? \"#2563eb\" : \"white\",\n color: cropMode === \"fit\" ? \"white\" : \"#444\",\n borderColor: cropMode === \"fit\" ? \"#2563eb\" : \"#d0d0d0\",\n opacity: readOnly ? 0.5 : 1,\n }}\n >\n Fit in\n </button>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => handleCropChange(\"smart\")}\n style={{\n ...buttonBase,\n backgroundColor: cropMode === \"smart\" ? \"#2563eb\" : \"white\",\n color: cropMode === \"smart\" ? \"white\" : \"#444\",\n borderColor: cropMode === \"smart\" ? \"#2563eb\" : \"#d0d0d0\",\n opacity: readOnly ? 0.5 : 1,\n }}\n >\n Smart crop\n </button>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => setIsCropOpen(true)}\n style={{\n ...buttonBase,\n backgroundColor: cropMode === \"custom\" ? \"#2563eb\" : \"white\",\n color: cropMode === \"custom\" ? \"white\" : \"#444\",\n borderColor: cropMode === \"custom\" ? \"#2563eb\" : \"#d0d0d0\",\n opacity: readOnly ? 0.5 : 1,\n }}\n >\n Custom…\n </button>\n </div>\n </div>\n )}\n\n {baseUrl && (\n <div style={{ marginBottom: \"8px\" }}>\n {!isObject && (\n <div style={{ fontSize: \"11px\", color: \"#a15c00\", marginBottom: \"6px\" }}>\n Select from the library to add metadata.\n </div>\n )}\n {schema.map((f) => {\n const current =\n isObject && typeof value[f.name] === \"string\" ? (value[f.name] as string) : \"\";\n return (\n <div key={f.name} style={{ marginBottom: \"8px\" }}>\n <div\n style={{\n fontSize: \"11px\",\n color: \"#666\",\n fontWeight: 500,\n marginBottom: \"4px\",\n }}\n >\n {f.label}\n {f.required ? \" *\" : \"\"}\n </div>\n <input\n type=\"text\"\n value={current}\n disabled={readOnly || !isObject}\n placeholder={!isObject ? \"Re-select image to edit\" : \"\"}\n onChange={(e) => handleMetaChange(f.name, e.target.value)}\n style={{ ...inputStyle, opacity: readOnly || !isObject ? 0.6 : 1 }}\n />\n </div>\n );\n })}\n </div>\n )}\n\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <button\n type=\"button\"\n onClick={() => setIsLibraryOpen(true)}\n disabled={readOnly}\n style={{\n flex: 1,\n padding: \"6px 12px\",\n backgroundColor: \"#2563eb\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n opacity: readOnly ? 0.5 : 1,\n fontFamily: \"inherit\",\n }}\n >\n Choose from Library\n </button>\n\n {baseUrl && (\n <button\n type=\"button\"\n onClick={() => onChange(\"\")}\n disabled={readOnly}\n style={{\n padding: \"6px 12px\",\n backgroundColor: \"white\",\n color: \"#666\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n opacity: readOnly ? 0.5 : 1,\n fontFamily: \"inherit\",\n }}\n >\n Clear\n </button>\n )}\n </div>\n\n <MediaLibrary\n isOpen={isLibraryOpen}\n onClose={() => setIsLibraryOpen(false)}\n onSelect={() => {}}\n onSelectItem={handleSelectItem}\n />\n\n <CropDialog\n isOpen={isCropOpen}\n imageUrl={baseUrl}\n initialTrim={getTrimRect(urlString)}\n onApply={handleApplyTrim}\n onClose={() => setIsCropOpen(false)}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactElement, type SyntheticEvent } from \"react\";\nimport ReactCrop, { centerCrop, makeAspectCrop, type PercentCrop } from \"react-image-crop\";\nimport \"react-image-crop/dist/ReactCrop.css\";\nimport type { TrimRect } from \"../crop\";\n\n/** Fixed presets plus freeform — the \"fixed and flexible aspect ratios\" surface. */\nconst ASPECT_PRESETS: Array<{ label: string; value: number | undefined }> = [\n { label: \"Free\", value: undefined },\n { label: \"1:1\", value: 1 },\n { label: \"4:3\", value: 4 / 3 },\n { label: \"3:2\", value: 3 / 2 },\n { label: \"16:9\", value: 16 / 9 },\n];\n\nfunction centeredCrop(naturalWidth: number, naturalHeight: number, aspect?: number): PercentCrop {\n if (!aspect) {\n return { unit: \"%\", x: 10, y: 10, width: 80, height: 80 };\n }\n return centerCrop(\n makeAspectCrop({ unit: \"%\", width: 80 }, aspect, naturalWidth, naturalHeight),\n naturalWidth,\n naturalHeight,\n );\n}\n\n/** Converts an existing source-pixel trim back to a percent crop for editing. */\nfunction trimToPercentCrop(trim: TrimRect, naturalWidth: number, naturalHeight: number): PercentCrop {\n return {\n unit: \"%\",\n x: (trim.left / naturalWidth) * 100,\n y: (trim.top / naturalHeight) * 100,\n width: (trim.width / naturalWidth) * 100,\n height: (trim.height / naturalHeight) * 100,\n };\n}\n\n/**\n * Interactive crop dialog for the rich `p1-media` field. The crop box is kept\n * as a percent crop (stable across preview resizing) and converted to\n * source-pixel `trim.*` values on apply — the stored value stays a plain URL.\n */\nexport function CropDialog(props: {\n isOpen: boolean;\n /** Bare CDN URL (no transform params) of the image being cropped. */\n imageUrl: string;\n /** Existing manual crop to restore as the starting selection, if any. */\n initialTrim: TrimRect | null;\n onApply: (rect: TrimRect) => void;\n onClose: () => void;\n}): ReactElement | null {\n const { isOpen, imageUrl, initialTrim, onApply, onClose } = props;\n const [crop, setCrop] = useState<PercentCrop | undefined>(undefined);\n const [aspect, setAspect] = useState<number | undefined>(undefined);\n // Apply is gated on this, not on `crop`: state from a previous open (or a\n // previous image) must never produce a trim for an image that hasn't loaded.\n const [imageLoaded, setImageLoaded] = useState(false);\n const naturalSize = useRef<{ width: number; height: number } | null>(null);\n\n useEffect(() => {\n if (isOpen) {\n setCrop(undefined);\n setAspect(undefined);\n setImageLoaded(false);\n naturalSize.current = null;\n }\n }, [isOpen, imageUrl]);\n\n if (!isOpen) return null;\n\n const handleImageLoad = (e: SyntheticEvent<HTMLImageElement>) => {\n const { naturalWidth, naturalHeight } = e.currentTarget;\n if (naturalWidth <= 0 || naturalHeight <= 0) return; // dimensionless source — keep Apply disabled\n naturalSize.current = { width: naturalWidth, height: naturalHeight };\n setImageLoaded(true);\n setCrop(\n initialTrim\n ? trimToPercentCrop(initialTrim, naturalWidth, naturalHeight)\n : centeredCrop(naturalWidth, naturalHeight, undefined),\n );\n };\n\n const handleAspectChange = (next: number | undefined) => {\n setAspect(next);\n const size = naturalSize.current;\n if (size) setCrop(centeredCrop(size.width, size.height, next));\n };\n\n const handleApply = () => {\n const size = naturalSize.current;\n if (!size || !imageLoaded || !crop || crop.width <= 0 || crop.height <= 0) return;\n // Clamp to the source bounds — the Worker passes trim.* to Cloudflare\n // Images unclamped, and an out-of-bounds rect fails the whole render.\n const left = Math.min(Math.max((crop.x / 100) * size.width, 0), size.width - 1);\n const top = Math.min(Math.max((crop.y / 100) * size.height, 0), size.height - 1);\n onApply({\n left,\n top,\n width: Math.min((crop.width / 100) * size.width, size.width - left),\n height: Math.min((crop.height / 100) * size.height, size.height - top),\n });\n };\n\n const chipStyle = (active: boolean): React.CSSProperties => ({\n padding: \"3px 10px\",\n fontSize: \"12px\",\n fontWeight: 500,\n border: \"1px solid \" + (active ? \"#2563eb\" : \"#d0d0d0\"),\n borderRadius: \"4px\",\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n backgroundColor: active ? \"#2563eb\" : \"white\",\n color: active ? \"white\" : \"#444\",\n });\n\n return (\n <div\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 99999,\n padding: \"20px\",\n }}\n onClick={onClose}\n >\n <div\n style={{\n backgroundColor: \"white\",\n borderRadius: \"12px\",\n boxShadow: \"0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04)\",\n maxWidth: \"720px\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"16px 20px\",\n borderBottom: \"1px solid #eee\",\n }}\n >\n <div style={{ fontSize: \"16px\", fontWeight: 600 }}>Crop image</div>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n border: \"none\",\n background: \"none\",\n fontSize: \"18px\",\n cursor: \"pointer\",\n color: \"#666\",\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n <div style={{ padding: \"16px 20px\", display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {ASPECT_PRESETS.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n onClick={() => handleAspectChange(preset.value)}\n style={chipStyle(aspect === preset.value)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n\n <div\n style={{\n padding: \"0 20px\",\n display: \"flex\",\n justifyContent: \"center\",\n overflow: \"auto\",\n maxHeight: \"55vh\",\n }}\n >\n <ReactCrop\n crop={crop}\n onChange={(_, percentCrop) => setCrop(percentCrop)}\n aspect={aspect}\n keepSelection\n >\n {/* eslint-disable-next-line jsx-a11y/alt-text */}\n <img\n src={imageUrl}\n onLoad={handleImageLoad}\n onError={() => setImageLoaded(false)}\n alt=\"Image to crop\"\n style={{ maxWidth: \"100%\", maxHeight: \"55vh\", display: \"block\" }}\n />\n </ReactCrop>\n </div>\n\n <div\n style={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n padding: \"16px 20px\",\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n padding: \"6px 14px\",\n backgroundColor: \"white\",\n color: \"#666\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!imageLoaded || !crop || crop.width <= 0 || crop.height <= 0}\n style={{\n padding: \"6px 14px\",\n backgroundColor: \"#2563eb\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Apply crop\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import e, { PureComponent as t, createRef as n } from \"react\";\n//#region src/utils.ts\nvar r = {\n\tx: 0,\n\ty: 0,\n\twidth: 0,\n\theight: 0,\n\tunit: \"px\"\n}, i = (e, t, n) => Math.min(Math.max(e, t), n), a = (...e) => e.filter((e) => e && typeof e == \"string\").join(\" \"), o = (e, t) => e === t || e.width === t.width && e.height === t.height && e.x === t.x && e.y === t.y && e.unit === t.unit;\nfunction s(e, t, n, r) {\n\tlet i = u(e, n, r);\n\treturn e.width && (i.height = i.width / t), e.height && (i.width = i.height * t), i.y + i.height > r && (i.height = r - i.y, i.width = i.height * t), i.x + i.width > n && (i.width = n - i.x, i.height = i.width / t), e.unit === \"%\" ? l(i, n, r) : i;\n}\nfunction c(e, t, n) {\n\tlet r = u(e, t, n);\n\treturn r.x = (t - r.width) / 2, r.y = (n - r.height) / 2, e.unit === \"%\" ? l(r, t, n) : r;\n}\nfunction l(e, t, n) {\n\treturn e.unit === \"%\" ? {\n\t\t...r,\n\t\t...e,\n\t\tunit: \"%\"\n\t} : {\n\t\tunit: \"%\",\n\t\tx: e.x ? e.x / t * 100 : 0,\n\t\ty: e.y ? e.y / n * 100 : 0,\n\t\twidth: e.width ? e.width / t * 100 : 0,\n\t\theight: e.height ? e.height / n * 100 : 0\n\t};\n}\nfunction u(e, t, n) {\n\treturn !e.unit || e.unit === \"px\" ? {\n\t\t...r,\n\t\t...e,\n\t\tunit: \"px\"\n\t} : {\n\t\tunit: \"px\",\n\t\tx: e.x ? e.x * t / 100 : 0,\n\t\ty: e.y ? e.y * n / 100 : 0,\n\t\twidth: e.width ? e.width * t / 100 : 0,\n\t\theight: e.height ? e.height * n / 100 : 0\n\t};\n}\nfunction d(e, t, n, r, i, a = 0, o = 0, s = r, c = i) {\n\tlet l = { ...e }, u = Math.min(a, r), d = Math.min(o, i), f = Math.min(s, r), p = Math.min(c, i);\n\tt && (t > 1 ? (u = o ? o * t : u, d = u / t, f = s * t) : (d = a ? a / t : d, u = d * t, p = c / t)), l.y < 0 && (l.height = Math.max(l.height + l.y, d), l.y = 0), l.x < 0 && (l.width = Math.max(l.width + l.x, u), l.x = 0);\n\tlet m = r - (l.x + l.width);\n\tm < 0 && (l.x = Math.min(l.x, r - u), l.width += m);\n\tlet h = i - (l.y + l.height);\n\tif (h < 0 && (l.y = Math.min(l.y, i - d), l.height += h), l.width < u && ((n === \"sw\" || n == \"nw\") && (l.x -= u - l.width), l.width = u), l.height < d && ((n === \"nw\" || n == \"ne\") && (l.y -= d - l.height), l.height = d), l.width > f && ((n === \"sw\" || n == \"nw\") && (l.x -= f - l.width), l.width = f), l.height > p && ((n === \"nw\" || n == \"ne\") && (l.y -= p - l.height), l.height = p), t) {\n\t\tlet e = l.width / l.height;\n\t\tif (e < t) {\n\t\t\tlet e = Math.max(l.width / t, d);\n\t\t\t(n === \"nw\" || n == \"ne\") && (l.y -= e - l.height), l.height = e;\n\t\t} else if (e > t) {\n\t\t\tlet e = Math.max(l.height * t, u);\n\t\t\t(n === \"sw\" || n == \"nw\") && (l.x -= e - l.width), l.width = e;\n\t\t}\n\t}\n\treturn l;\n}\nfunction f(e, t, n, r) {\n\tlet i = { ...e };\n\treturn t === \"ArrowLeft\" ? r === \"nw\" ? (i.x -= n, i.y -= n, i.width += n, i.height += n) : r === \"w\" ? (i.x -= n, i.width += n) : r === \"sw\" ? (i.x -= n, i.width += n, i.height += n) : r === \"ne\" ? (i.y += n, i.width -= n, i.height -= n) : r === \"e\" ? i.width -= n : r === \"se\" && (i.width -= n, i.height -= n) : t === \"ArrowRight\" && (r === \"nw\" ? (i.x += n, i.y += n, i.width -= n, i.height -= n) : r === \"w\" ? (i.x += n, i.width -= n) : r === \"sw\" ? (i.x += n, i.width -= n, i.height -= n) : r === \"ne\" ? (i.y -= n, i.width += n, i.height += n) : r === \"e\" ? i.width += n : r === \"se\" && (i.width += n, i.height += n)), t === \"ArrowUp\" ? r === \"nw\" ? (i.x -= n, i.y -= n, i.width += n, i.height += n) : r === \"n\" ? (i.y -= n, i.height += n) : r === \"ne\" ? (i.y -= n, i.width += n, i.height += n) : r === \"sw\" ? (i.x += n, i.width -= n, i.height -= n) : r === \"s\" ? i.height -= n : r === \"se\" && (i.width -= n, i.height -= n) : t === \"ArrowDown\" && (r === \"nw\" ? (i.x += n, i.y += n, i.width -= n, i.height -= n) : r === \"n\" ? (i.y += n, i.height -= n) : r === \"ne\" ? (i.y += n, i.width -= n, i.height -= n) : r === \"sw\" ? (i.x -= n, i.width += n, i.height += n) : r === \"s\" ? i.height += n : r === \"se\" && (i.width += n, i.height += n)), i;\n}\n//#endregion\n//#region src/ReactCrop.tsx\nvar p = {\n\tcapture: !0,\n\tpassive: !1\n}, m = 0, h = class s extends t {\n\tstatic xOrds = [\"e\", \"w\"];\n\tstatic yOrds = [\"n\", \"s\"];\n\tstatic xyOrds = [\n\t\t\"nw\",\n\t\t\"ne\",\n\t\t\"se\",\n\t\t\"sw\"\n\t];\n\tstatic nudgeStep = 1;\n\tstatic nudgeStepMedium = 10;\n\tstatic nudgeStepLarge = 100;\n\tstatic defaultProps = { ariaLabels: {\n\t\tcropArea: \"Use the arrow keys to move the crop selection area\",\n\t\tnwDragHandle: \"Use the arrow keys to move the north west drag handle to change the crop selection area\",\n\t\tnDragHandle: \"Use the up and down arrow keys to move the north drag handle to change the crop selection area\",\n\t\tneDragHandle: \"Use the arrow keys to move the north east drag handle to change the crop selection area\",\n\t\teDragHandle: \"Use the up and down arrow keys to move the east drag handle to change the crop selection area\",\n\t\tseDragHandle: \"Use the arrow keys to move the south east drag handle to change the crop selection area\",\n\t\tsDragHandle: \"Use the up and down arrow keys to move the south drag handle to change the crop selection area\",\n\t\tswDragHandle: \"Use the arrow keys to move the south west drag handle to change the crop selection area\",\n\t\twDragHandle: \"Use the up and down arrow keys to move the west drag handle to change the crop selection area\"\n\t} };\n\tget document() {\n\t\treturn document;\n\t}\n\tdocMoveBound = !1;\n\tmouseDownOnCrop = !1;\n\tdragStarted = !1;\n\tevData = {\n\t\tstartClientX: 0,\n\t\tstartClientY: 0,\n\t\tstartCropX: 0,\n\t\tstartCropY: 0,\n\t\tclientX: 0,\n\t\tclientY: 0,\n\t\tisResize: !0\n\t};\n\tcomponentRef = n();\n\tmediaRef = n();\n\tresizeObserver;\n\tinitChangeCalled = !1;\n\tinstanceId = `rc-${m++}`;\n\tstate = {\n\t\tcropIsActive: !1,\n\t\tnewCropIsBeingDrawn: !1\n\t};\n\tgetBox() {\n\t\tlet e = this.mediaRef.current;\n\t\tif (!e) return {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\t\tlet { x: t, y: n, width: r, height: i } = e.getBoundingClientRect();\n\t\treturn {\n\t\t\tx: t,\n\t\t\ty: n,\n\t\t\twidth: r,\n\t\t\theight: i\n\t\t};\n\t}\n\tcomponentDidUpdate(e) {\n\t\tlet { crop: t, onComplete: n } = this.props;\n\t\tif (n && !e.crop && t) {\n\t\t\tlet { width: e, height: r } = this.getBox();\n\t\t\te && r && n(u(t, e, r), l(t, e, r));\n\t\t}\n\t}\n\tcomponentWillUnmount() {\n\t\tthis.resizeObserver && this.resizeObserver.disconnect(), this.unbindDocMove();\n\t}\n\tbindDocMove() {\n\t\tthis.docMoveBound ||= (this.document.addEventListener(\"pointermove\", this.onDocPointerMove, p), this.document.addEventListener(\"pointerup\", this.onDocPointerDone, p), this.document.addEventListener(\"pointercancel\", this.onDocPointerDone, p), !0);\n\t}\n\tunbindDocMove() {\n\t\tthis.docMoveBound &&= (this.document.removeEventListener(\"pointermove\", this.onDocPointerMove, p), this.document.removeEventListener(\"pointerup\", this.onDocPointerDone, p), this.document.removeEventListener(\"pointercancel\", this.onDocPointerDone, p), !1);\n\t}\n\tonCropPointerDown = (e) => {\n\t\tlet { crop: t, disabled: n } = this.props, r = this.getBox();\n\t\tif (!t) return;\n\t\tlet i = u(t, r.width, r.height);\n\t\tif (n) return;\n\t\te.cancelable && e.preventDefault(), this.bindDocMove(), this.componentRef.current.focus({ preventScroll: !0 });\n\t\tlet a = e.target.dataset.ord, o = !!a, s = e.clientX, c = e.clientY, l = i.x, d = i.y;\n\t\tif (a) {\n\t\t\tlet t = e.clientX - r.x, n = e.clientY - r.y, o = 0, u = 0;\n\t\t\ta === \"ne\" || a == \"e\" ? (o = t - (i.x + i.width), u = n - i.y, l = i.x, d = i.y + i.height) : a === \"se\" || a === \"s\" ? (o = t - (i.x + i.width), u = n - (i.y + i.height), l = i.x, d = i.y) : a === \"sw\" || a == \"w\" ? (o = t - i.x, u = n - (i.y + i.height), l = i.x + i.width, d = i.y) : (a === \"nw\" || a == \"n\") && (o = t - i.x, u = n - i.y, l = i.x + i.width, d = i.y + i.height), s = l + r.x + o, c = d + r.y + u;\n\t\t}\n\t\tthis.evData = {\n\t\t\tstartClientX: s,\n\t\t\tstartClientY: c,\n\t\t\tstartCropX: l,\n\t\t\tstartCropY: d,\n\t\t\tclientX: e.clientX,\n\t\t\tclientY: e.clientY,\n\t\t\tisResize: o,\n\t\t\tord: a\n\t\t}, this.mouseDownOnCrop = !0, this.setState({ cropIsActive: !0 });\n\t};\n\tonComponentPointerDown = (e) => {\n\t\tlet { crop: t, disabled: n, locked: r, keepSelection: i, onChange: a } = this.props, o = this.getBox();\n\t\tif (n || r || i && t) return;\n\t\te.cancelable && e.preventDefault(), this.bindDocMove(), this.componentRef.current.focus({ preventScroll: !0 });\n\t\tlet s = e.clientX - o.x, c = e.clientY - o.y, d = {\n\t\t\tunit: \"px\",\n\t\t\tx: s,\n\t\t\ty: c,\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\t\tthis.evData = {\n\t\t\tstartClientX: e.clientX,\n\t\t\tstartClientY: e.clientY,\n\t\t\tstartCropX: s,\n\t\t\tstartCropY: c,\n\t\t\tclientX: e.clientX,\n\t\t\tclientY: e.clientY,\n\t\t\tisResize: !0\n\t\t}, this.mouseDownOnCrop = !0, a(u(d, o.width, o.height), l(d, o.width, o.height)), this.setState({\n\t\t\tcropIsActive: !0,\n\t\t\tnewCropIsBeingDrawn: !0\n\t\t});\n\t};\n\tonDocPointerMove = (e) => {\n\t\tlet { crop: t, disabled: n, onChange: r, onDragStart: i } = this.props, a = this.getBox();\n\t\tif (n || !t || !this.mouseDownOnCrop) return;\n\t\te.cancelable && e.preventDefault(), this.dragStarted || (this.dragStarted = !0, i && i(e));\n\t\tlet { evData: s } = this;\n\t\ts.clientX = e.clientX, s.clientY = e.clientY;\n\t\tlet c;\n\t\tc = s.isResize ? this.resizeCrop() : this.dragCrop(), o(t, c) || r(u(c, a.width, a.height), l(c, a.width, a.height));\n\t};\n\tonComponentKeyDown = (e) => {\n\t\tlet { crop: t, disabled: n, onChange: r, onComplete: a } = this.props;\n\t\tif (n) return;\n\t\tlet o = e.key, c = !1;\n\t\tif (!t) return;\n\t\tlet d = this.getBox(), f = this.makePixelCrop(d), p = (navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey) ? s.nudgeStepLarge : e.shiftKey ? s.nudgeStepMedium : s.nudgeStep;\n\t\tif (o === \"ArrowLeft\" ? (f.x -= p, c = !0) : o === \"ArrowRight\" ? (f.x += p, c = !0) : o === \"ArrowUp\" ? (f.y -= p, c = !0) : o === \"ArrowDown\" && (f.y += p, c = !0), c) {\n\t\t\te.cancelable && e.preventDefault(), f.x = i(f.x, 0, d.width - f.width), f.y = i(f.y, 0, d.height - f.height);\n\t\t\tlet t = u(f, d.width, d.height), n = l(f, d.width, d.height);\n\t\t\tr(t, n), a && a(t, n);\n\t\t}\n\t};\n\tonHandlerKeyDown = (e, t) => {\n\t\tlet { aspect: n = 0, crop: r, disabled: i, minWidth: a = 0, minHeight: c = 0, maxWidth: p, maxHeight: m, onChange: h, onComplete: g } = this.props, _ = this.getBox();\n\t\tif (i || !r) return;\n\t\tif (e.key === \"ArrowUp\" || e.key === \"ArrowDown\" || e.key === \"ArrowLeft\" || e.key === \"ArrowRight\") e.stopPropagation(), e.preventDefault();\n\t\telse return;\n\t\tlet v = (navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey) ? s.nudgeStepLarge : e.shiftKey ? s.nudgeStepMedium : s.nudgeStep, y = d(f(u(r, _.width, _.height), e.key, v, t), n, t, _.width, _.height, a, c, p, m);\n\t\tif (!o(r, y)) {\n\t\t\tlet e = l(y, _.width, _.height);\n\t\t\th(y, e), g && g(y, e);\n\t\t}\n\t};\n\tonDocPointerDone = (e) => {\n\t\tlet { crop: t, disabled: n, onComplete: r, onDragEnd: i } = this.props, a = this.getBox();\n\t\tthis.unbindDocMove(), !(n || !t) && this.mouseDownOnCrop && (this.mouseDownOnCrop = !1, this.dragStarted = !1, i && i(e), r && r(u(t, a.width, a.height), l(t, a.width, a.height)), this.setState({\n\t\t\tcropIsActive: !1,\n\t\t\tnewCropIsBeingDrawn: !1\n\t\t}));\n\t};\n\tonDragFocus = () => {\n\t\tthis.componentRef.current?.scrollTo(0, 0);\n\t};\n\tgetCropStyle() {\n\t\tlet { crop: e } = this.props;\n\t\tif (e) return {\n\t\t\ttop: `${e.y}${e.unit}`,\n\t\t\tleft: `${e.x}${e.unit}`,\n\t\t\twidth: `${e.width}${e.unit}`,\n\t\t\theight: `${e.height}${e.unit}`\n\t\t};\n\t}\n\tdragCrop() {\n\t\tlet { evData: e } = this, t = this.getBox(), n = this.makePixelCrop(t), r = e.clientX - e.startClientX, a = e.clientY - e.startClientY;\n\t\treturn n.x = i(e.startCropX + r, 0, t.width - n.width), n.y = i(e.startCropY + a, 0, t.height - n.height), n;\n\t}\n\tgetPointRegion(e, t, n, r) {\n\t\tlet { evData: i } = this, a = i.clientX - e.x, o = i.clientY - e.y, s;\n\t\ts = r && t ? t === \"nw\" || t === \"n\" || t === \"ne\" : o < i.startCropY;\n\t\tlet c;\n\t\treturn c = n && t ? t === \"nw\" || t === \"w\" || t === \"sw\" : a < i.startCropX, c ? s ? \"nw\" : \"sw\" : s ? \"ne\" : \"se\";\n\t}\n\tresolveMinDimensions(e, t, n = 0, r = 0) {\n\t\tlet i = Math.min(n, e.width), a = Math.min(r, e.height);\n\t\treturn !t || !i && !a ? [i, a] : t > 1 ? i ? [i, i / t] : [a * t, a] : a ? [a * t, a] : [i, i / t];\n\t}\n\tresizeCrop() {\n\t\tlet { evData: e } = this, { aspect: t = 0, maxWidth: n, maxHeight: r } = this.props, a = this.getBox(), [o, c] = this.resolveMinDimensions(a, t, this.props.minWidth, this.props.minHeight), l = this.makePixelCrop(a), u = this.getPointRegion(a, e.ord, o, c), f = e.ord || u, p = e.clientX - e.startClientX, m = e.clientY - e.startClientY;\n\t\t(o && f === \"nw\" || f === \"w\" || f === \"sw\") && (p = Math.min(p, -o)), (c && f === \"nw\" || f === \"n\" || f === \"ne\") && (m = Math.min(m, -c));\n\t\tlet h = {\n\t\t\tunit: \"px\",\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\t\tu === \"ne\" ? (h.x = e.startCropX, h.width = p, t ? (h.height = h.width / t, h.y = e.startCropY - h.height) : (h.height = Math.abs(m), h.y = e.startCropY - h.height)) : u === \"se\" ? (h.x = e.startCropX, h.y = e.startCropY, h.width = p, t ? h.height = h.width / t : h.height = m) : u === \"sw\" ? (h.x = e.startCropX + p, h.y = e.startCropY, h.width = Math.abs(p), t ? h.height = h.width / t : h.height = m) : u === \"nw\" && (h.x = e.startCropX + p, h.width = Math.abs(p), t ? (h.height = h.width / t, h.y = e.startCropY - h.height) : (h.height = Math.abs(m), h.y = e.startCropY + m));\n\t\tlet g = d(h, t, u, a.width, a.height, o, c, n, r);\n\t\treturn t || s.xyOrds.indexOf(f) > -1 ? l = g : s.xOrds.indexOf(f) > -1 ? (l.x = g.x, l.width = g.width) : s.yOrds.indexOf(f) > -1 && (l.y = g.y, l.height = g.height), l.x = i(l.x, 0, a.width - l.width), l.y = i(l.y, 0, a.height - l.height), l;\n\t}\n\trenderCropSelection() {\n\t\tlet { ariaLabels: t = s.defaultProps.ariaLabels, disabled: n, locked: r, renderSelectionAddon: i, ruleOfThirds: a, crop: o } = this.props, c = this.getCropStyle();\n\t\tif (o) return /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tstyle: c,\n\t\t\tclassName: \"ReactCrop__crop-selection\",\n\t\t\tonPointerDown: this.onCropPointerDown,\n\t\t\t\"aria-label\": t.cropArea,\n\t\t\ttabIndex: 0,\n\t\t\tonKeyDown: this.onComponentKeyDown,\n\t\t\trole: \"group\"\n\t\t}, !n && !r && /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-elements\",\n\t\t\tonFocus: this.onDragFocus\n\t\t}, /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-bar ord-n\",\n\t\t\t\"data-ord\": \"n\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-bar ord-e\",\n\t\t\t\"data-ord\": \"e\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-bar ord-s\",\n\t\t\t\"data-ord\": \"s\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-bar ord-w\",\n\t\t\t\"data-ord\": \"w\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-nw\",\n\t\t\t\"data-ord\": \"nw\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.nwDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"nw\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-n\",\n\t\t\t\"data-ord\": \"n\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.nDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"n\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-ne\",\n\t\t\t\"data-ord\": \"ne\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.neDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"ne\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-e\",\n\t\t\t\"data-ord\": \"e\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.eDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"e\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-se\",\n\t\t\t\"data-ord\": \"se\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.seDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"se\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-s\",\n\t\t\t\"data-ord\": \"s\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.sDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"s\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-sw\",\n\t\t\t\"data-ord\": \"sw\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.swDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"sw\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-w\",\n\t\t\t\"data-ord\": \"w\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.wDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"w\"),\n\t\t\trole: \"button\"\n\t\t})), i && /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__selection-addon\",\n\t\t\tonPointerDown: (e) => e.stopPropagation()\n\t\t}, i(this.state)), a && /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"div\", { className: \"ReactCrop__rule-of-thirds-hz\" }), /* @__PURE__ */ e.createElement(\"div\", { className: \"ReactCrop__rule-of-thirds-vt\" })));\n\t}\n\tmakePixelCrop(e) {\n\t\treturn u({\n\t\t\t...r,\n\t\t\t...this.props.crop || {}\n\t\t}, e.width, e.height);\n\t}\n\trender() {\n\t\tlet { aspect: t, children: n, circularCrop: r, className: i, crop: o, disabled: s, locked: c, style: l, ruleOfThirds: u } = this.props, { cropIsActive: d, newCropIsBeingDrawn: f } = this.state, p = o ? this.renderCropSelection() : null, m = a(\"ReactCrop\", i, d && \"ReactCrop--active\", s && \"ReactCrop--disabled\", c && \"ReactCrop--locked\", f && \"ReactCrop--new-crop\", o && t && \"ReactCrop--fixed-aspect\", o && r && \"ReactCrop--circular-crop\", o && u && \"ReactCrop--rule-of-thirds\", !this.dragStarted && o && !o.width && !o.height && \"ReactCrop--invisible-crop\", r && \"ReactCrop--no-animate\");\n\t\treturn /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tref: this.componentRef,\n\t\t\tclassName: m,\n\t\t\tstyle: l\n\t\t}, /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tref: this.mediaRef,\n\t\t\tclassName: \"ReactCrop__child-wrapper\",\n\t\t\tonPointerDown: this.onComponentPointerDown\n\t\t}, n), o ? /* @__PURE__ */ e.createElement(\"svg\", {\n\t\t\tclassName: \"ReactCrop__crop-mask\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\"\n\t\t}, /* @__PURE__ */ e.createElement(\"defs\", null, /* @__PURE__ */ e.createElement(\"mask\", { id: `hole-${this.instanceId}` }, /* @__PURE__ */ e.createElement(\"rect\", {\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tfill: \"white\"\n\t\t}), r ? /* @__PURE__ */ e.createElement(\"ellipse\", {\n\t\t\tcx: `${o.x + o.width / 2}${o.unit}`,\n\t\t\tcy: `${o.y + o.height / 2}${o.unit}`,\n\t\t\trx: `${o.width / 2}${o.unit}`,\n\t\t\try: `${o.height / 2}${o.unit}`,\n\t\t\tfill: \"black\"\n\t\t}) : /* @__PURE__ */ e.createElement(\"rect\", {\n\t\t\tx: `${o.x}${o.unit}`,\n\t\t\ty: `${o.y}${o.unit}`,\n\t\t\twidth: `${o.width}${o.unit}`,\n\t\t\theight: `${o.height}${o.unit}`,\n\t\t\tfill: \"black\"\n\t\t}))), /* @__PURE__ */ e.createElement(\"rect\", {\n\t\t\tfill: \"black\",\n\t\t\tfillOpacity: .5,\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tmask: `url(#hole-${this.instanceId})`\n\t\t})) : void 0, p);\n\t}\n}, g = Math.PI / 180;\nasync function _(e, t, n, r = 1, i = 0) {\n\tlet a = t.getContext(\"2d\");\n\tif (!a) throw Error(\"No 2d context\");\n\tlet o = e.naturalWidth / e.width, s = e.naturalHeight / e.height, c = window.devicePixelRatio;\n\tt.width = Math.floor(n.width * o * c), t.height = Math.floor(n.height * s * c), a.scale(c, c), a.imageSmoothingQuality = \"high\";\n\tlet l = n.x * o, u = n.y * s, d = i * g, f = e.naturalWidth / 2, p = e.naturalHeight / 2;\n\ta.save(), a.translate(-l, -u), a.translate(f, p), a.rotate(d), a.scale(r, r), a.translate(-f, -p), a.drawImage(e, 0, 0, e.naturalWidth, e.naturalHeight, 0, 0, e.naturalWidth, e.naturalHeight), a.restore();\n}\nfunction v(e) {\n\treturn new Promise((t) => {\n\t\te.toBlob(t);\n\t});\n}\nvar y = \"\";\nasync function b(e, t, n = 1, r = 0) {\n\tlet i = document.createElement(\"canvas\");\n\t_(e, i, t, n, r);\n\tlet a = await v(i);\n\treturn a ? (y && URL.revokeObjectURL(y), y = URL.createObjectURL(a), y) : (console.error(\"Failed to create blob\"), \"\");\n}\n//#endregion\nexport { h as Component, h as ReactCrop, h as default, o as areCropsEqual, c as centerCrop, i as clamp, a as cls, d as containCrop, l as convertToPercentCrop, u as convertToPixelCrop, _ as cropToCanvas, b as cropToImg, r as defaultCrop, s as makeAspectCrop, f as nudgeCrop };\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"@keyframes marching-ants {\\n 0% {\\n background-position:\\n 0 0,\\n 0 100%,\\n 0 0,\\n 100% 0;\\n }\\n to {\\n background-position:\\n 20px 0,\\n -20px 100%,\\n 0 -20px,\\n 100% 20px;\\n }\\n}\\n:root {\\n --rc-drag-handle-size:12px;\\n --rc-drag-handle-mobile-size:24px;\\n --rc-drag-handle-bg-colour:#0003;\\n --rc-drag-bar-size:6px;\\n --rc-border-color:#ffffffb3;\\n --rc-focus-color:#08f;\\n}\\n.ReactCrop {\\n cursor: crosshair;\\n max-width: 100%;\\n display: inline-block;\\n position: relative;\\n}\\n.ReactCrop *,\\n.ReactCrop :before,\\n.ReactCrop :after {\\n box-sizing: border-box;\\n}\\n.ReactCrop--disabled,\\n.ReactCrop--locked {\\n cursor: inherit;\\n}\\n.ReactCrop__child-wrapper {\\n max-height: inherit;\\n overflow: hidden;\\n}\\n.ReactCrop__child-wrapper > img,\\n.ReactCrop__child-wrapper > video {\\n max-width: 100%;\\n max-height: inherit;\\n display: block;\\n}\\n.ReactCrop:not(.ReactCrop--disabled) .ReactCrop__child-wrapper > img,\\n.ReactCrop:not(.ReactCrop--disabled) .ReactCrop__child-wrapper > video,\\n.ReactCrop:not(.ReactCrop--disabled) .ReactCrop__crop-selection {\\n touch-action: none;\\n}\\n.ReactCrop__crop-mask {\\n pointer-events: none;\\n width: calc(100% + .5px);\\n height: calc(100% + .5px);\\n position: absolute;\\n inset: 0;\\n}\\n.ReactCrop__crop-selection {\\n cursor: move;\\n position: absolute;\\n top: 0;\\n left: 0;\\n transform: translate(0, 0);\\n}\\n.ReactCrop--disabled .ReactCrop__crop-selection {\\n cursor: inherit;\\n}\\n.ReactCrop--circular-crop .ReactCrop__crop-selection {\\n border-radius: 50%;\\n}\\n.ReactCrop--circular-crop .ReactCrop__crop-selection:after {\\n pointer-events: none;\\n content: \\\"\\\";\\n border: 1px solid var(--rc-border-color);\\n opacity: .3;\\n position: absolute;\\n inset: -1px;\\n}\\n.ReactCrop--no-animate .ReactCrop__crop-selection {\\n outline: 1px dashed #fff;\\n}\\n.ReactCrop__crop-selection:not(.ReactCrop--no-animate .ReactCrop__crop-selection) {\\n color: #fff;\\n background-image:\\n linear-gradient(\\n 90deg,\\n #fff 50%,\\n #444 50%),\\n linear-gradient(\\n 90deg,\\n #fff 50%,\\n #444 50%),\\n linear-gradient(#fff 50%, #444 50%),\\n linear-gradient(#fff 50%, #444 50%);\\n background-position:\\n 0 0,\\n 0 100%,\\n 0 0,\\n 100% 0;\\n background-repeat:\\n repeat-x,\\n repeat-x,\\n repeat-y,\\n repeat-y;\\n background-size:\\n 10px 1px,\\n 10px 1px,\\n 1px 10px,\\n 1px 10px;\\n animation: 1s linear infinite marching-ants;\\n}\\n.ReactCrop__crop-selection:focus {\\n outline: 2px solid var(--rc-focus-color);\\n outline-offset: -1px;\\n}\\n.ReactCrop--invisible-crop .ReactCrop__crop-mask,\\n.ReactCrop--invisible-crop .ReactCrop__crop-selection {\\n display: none;\\n}\\n.ReactCrop__rule-of-thirds-vt:before,\\n.ReactCrop__rule-of-thirds-vt:after,\\n.ReactCrop__rule-of-thirds-hz:before,\\n.ReactCrop__rule-of-thirds-hz:after {\\n content: \\\"\\\";\\n background-color: #fff6;\\n display: block;\\n position: absolute;\\n}\\n.ReactCrop__rule-of-thirds-vt:before,\\n.ReactCrop__rule-of-thirds-vt:after {\\n width: 1px;\\n height: 100%;\\n}\\n.ReactCrop__rule-of-thirds-vt:before {\\n left: 33.3333%;\\n}\\n.ReactCrop__rule-of-thirds-vt:after {\\n left: 66.6667%;\\n}\\n.ReactCrop__rule-of-thirds-hz:before,\\n.ReactCrop__rule-of-thirds-hz:after {\\n width: 100%;\\n height: 1px;\\n}\\n.ReactCrop__rule-of-thirds-hz:before {\\n top: 33.3333%;\\n}\\n.ReactCrop__rule-of-thirds-hz:after {\\n top: 66.6667%;\\n}\\n.ReactCrop__drag-handle {\\n width: var(--rc-drag-handle-size);\\n height: var(--rc-drag-handle-size);\\n background-color: var(--rc-drag-handle-bg-colour);\\n border: 1px solid var(--rc-border-color);\\n position: absolute;\\n}\\n.ReactCrop__drag-handle:focus {\\n background: var(--rc-focus-color);\\n}\\n.ReactCrop .ord-nw {\\n cursor: nw-resize;\\n top: 0;\\n left: 0;\\n transform: translate(-50%, -50%);\\n}\\n.ReactCrop .ord-n {\\n cursor: n-resize;\\n top: 0;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n}\\n.ReactCrop .ord-ne {\\n cursor: ne-resize;\\n top: 0;\\n right: 0;\\n transform: translate(50%, -50%);\\n}\\n.ReactCrop .ord-e {\\n cursor: e-resize;\\n top: 50%;\\n right: 0;\\n transform: translate(50%, -50%);\\n}\\n.ReactCrop .ord-se {\\n cursor: se-resize;\\n bottom: 0;\\n right: 0;\\n transform: translate(50%, 50%);\\n}\\n.ReactCrop .ord-s {\\n cursor: s-resize;\\n bottom: 0;\\n left: 50%;\\n transform: translate(-50%, 50%);\\n}\\n.ReactCrop .ord-sw {\\n cursor: sw-resize;\\n bottom: 0;\\n left: 0;\\n transform: translate(-50%, 50%);\\n}\\n.ReactCrop .ord-w {\\n cursor: w-resize;\\n top: 50%;\\n left: 0;\\n transform: translate(-50%, -50%);\\n}\\n.ReactCrop__disabled .ReactCrop__drag-handle {\\n cursor: inherit;\\n}\\n.ReactCrop__drag-bar {\\n position: absolute;\\n}\\n.ReactCrop__drag-bar.ord-n {\\n width: 100%;\\n height: var(--rc-drag-bar-size);\\n top: 0;\\n left: 0;\\n transform: translateY(-50%);\\n}\\n.ReactCrop__drag-bar.ord-e {\\n width: var(--rc-drag-bar-size);\\n height: 100%;\\n top: 0;\\n right: 0;\\n transform: translate(50%);\\n}\\n.ReactCrop__drag-bar.ord-s {\\n width: 100%;\\n height: var(--rc-drag-bar-size);\\n bottom: 0;\\n left: 0;\\n transform: translateY(50%);\\n}\\n.ReactCrop__drag-bar.ord-w {\\n width: var(--rc-drag-bar-size);\\n height: 100%;\\n top: 0;\\n left: 0;\\n transform: translate(-50%);\\n}\\n.ReactCrop--new-crop .ReactCrop__drag-bar,\\n.ReactCrop--new-crop .ReactCrop__drag-handle,\\n.ReactCrop--fixed-aspect .ReactCrop__drag-bar,\\n.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-n,\\n.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-e,\\n.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-s,\\n.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-w {\\n display: none;\\n}\\n@media (pointer: coarse) {\\n .ReactCrop .ord-n,\\n .ReactCrop .ord-e,\\n .ReactCrop .ord-s,\\n .ReactCrop .ord-w {\\n display: none;\\n }\\n .ReactCrop__drag-handle {\\n width: var(--rc-drag-handle-mobile-size);\\n height: var(--rc-drag-handle-mobile-size);\\n }\\n}\\n\")","import type { MediaFieldValue, MediaValue } from \"./types\";\nimport {\n buildValueWithCrop,\n buildValueWithTrim,\n getBaseUrl,\n type CropMode,\n type TrimRect,\n} from \"./crop\";\n\n/**\n * Structural keys on a MediaValue that are not schema-driven metadata. Used to\n * avoid clobbering identity fields when copying metadata defaults into a value.\n */\nexport const STRUCTURAL_MEDIA_KEYS = new Set([\n \"assetId\",\n \"versionId\",\n \"url\",\n \"metaSchemaVersion\",\n]);\n\n/** Narrows a MediaFieldValue to the rich object form. */\nexport function isMediaValue(\n value: MediaFieldValue | null | undefined,\n): value is MediaValue {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * Builds the value the `p1-media` field writes on asset selection.\n *\n * R10 invariant: never synthesize a MediaValue unless BOTH `assetId` and\n * `versionId` are present — otherwise fall back to a bare URL string (basic\n * mode). A value with undefined identity is unfindable by \"update usages\" and\n * can render `src=undefined`, so this fallback is load-bearing, not cosmetic.\n * It also means picking from a pre-upgrade Worker (bare-array `GET /media`, no\n * assetId) yields a string, so the plugin degrades cleanly before the cutover.\n */\nexport function makeMediaValue(input: {\n assetId?: string | null;\n versionId?: string | null;\n url: string;\n metaSchemaVersion?: number;\n metadata?: Record<string, string | number | undefined>;\n}): MediaFieldValue {\n if (!input.assetId || !input.versionId) {\n return input.url; // R10 fallback: string value\n }\n const value: MediaValue = {\n assetId: input.assetId,\n versionId: input.versionId,\n url: input.url,\n };\n if (typeof input.metaSchemaVersion === \"number\") {\n value.metaSchemaVersion = input.metaSchemaVersion;\n }\n if (input.metadata) {\n for (const [k, v] of Object.entries(input.metadata)) {\n if (v === undefined || v === \"\") continue;\n if (STRUCTURAL_MEDIA_KEYS.has(k)) continue; // never let metadata clobber identity\n value[k] = v;\n }\n }\n return value;\n}\n\n/** The asset fields the field editor needs to build a value on selection. */\nexport interface SelectableAsset {\n assetId?: string | null;\n versionId?: string | null;\n url: string;\n width?: number;\n height?: number;\n metadata?: Record<string, string>;\n metaSchemaVersion?: number;\n}\n\n/**\n * Builds the value written when an asset is picked from the library, applying\n * the current crop and copying metadata (flat, incl. alt) plus captured\n * dimensions. Delegates to makeMediaValue, so R10 still holds (a pre-cutover\n * asset with no identity yields a string).\n */\nexport function buildValueFromAsset(\n asset: SelectableAsset,\n crop: CropMode,\n): MediaFieldValue {\n const metadata: Record<string, string | number | undefined> = { ...(asset.metadata ?? {}) };\n if (typeof asset.width === \"number\") metadata.width = asset.width;\n if (typeof asset.height === \"number\") metadata.height = asset.height;\n return makeMediaValue({\n assetId: asset.assetId,\n versionId: asset.versionId,\n url: buildValueWithCrop(getBaseUrl(asset.url), crop),\n metaSchemaVersion: asset.metaSchemaVersion,\n metadata,\n });\n}\n\n/**\n * Applies a crop mode to a field value. R10: a string stays a string (basic\n * mode) — crop never promotes a value to a partial-identity object.\n */\nexport function applyCropToValue(\n value: MediaFieldValue,\n crop: CropMode,\n): MediaFieldValue {\n const currentUrl = isMediaValue(value) ? value.url : value;\n const baseUrl = getBaseUrl(typeof currentUrl === \"string\" ? currentUrl : \"\");\n if (!baseUrl) return value;\n const url = buildValueWithCrop(baseUrl, crop);\n return isMediaValue(value) ? { ...value, url } : url;\n}\n\n/**\n * Applies a manual crop region (the interactive cropper's result) to a field\n * value. Same R10 shape as applyCropToValue: a string stays a string, an\n * object keeps its identity and only swaps `url`.\n */\nexport function applyTrimToValue(\n value: MediaFieldValue,\n rect: TrimRect,\n): MediaFieldValue {\n const currentUrl = isMediaValue(value) ? value.url : value;\n const baseUrl = getBaseUrl(typeof currentUrl === \"string\" ? currentUrl : \"\");\n if (!baseUrl) return value;\n const url = buildValueWithTrim(baseUrl, rect);\n return isMediaValue(value) ? { ...value, url } : url;\n}\n\n/**\n * Sets one metadata field on a value. R10: refuses to operate on a string\n * (returns it unchanged — metadata can't be attached until an asset is picked)\n * and never lets a structural key clobber the pinned identity.\n */\nexport function setMetaOnValue(\n value: MediaFieldValue,\n fieldName: string,\n fieldValue: string,\n): MediaFieldValue {\n if (!isMediaValue(value)) return value;\n if (STRUCTURAL_MEDIA_KEYS.has(fieldName)) return value;\n return { ...value, [fieldName]: fieldValue };\n}\n","\"use client\";\n\nimport { useContext, useMemo, type ReactNode } from \"react\";\nimport { P1PuckContext, useP1Auth } from \"@pantheon-systems/puck-css\";\nimport { MediaConfigProvider, type MediaConfig } from \"./context\";\nimport type { MediaPluginOptions } from \"./plugin\";\n\n/** Production Worker/CDN host — same origin serves both the `/media` API and `/image` delivery. */\nconst DEFAULT_WORKER_URL = \"https://media.p1.pantheon.io\";\n\nexport type GetAuthToken = () => Promise<string | null> | string | null;\n\n/**\n * Resolves siteId: an explicit value always wins (back-compat for existing\n * callers); otherwise falls back to the ambient puck-css site context. Throws\n * when neither is available — createMediaPlugin() has no error UI of its own,\n * so a clear message here is the only diagnostic a caller gets.\n */\nexport function resolveSiteId(explicit: string | undefined, contextSiteId: string | undefined): string {\n const siteId = explicit ?? contextSiteId;\n if (!siteId) {\n throw new Error(\n \"p1-media: siteId is required. Pass it explicitly to createMediaPlugin(), \" +\n \"or render the plugin inside a puck-css P1PuckProvider so it can be read from context.\"\n );\n }\n return siteId;\n}\n\n/**\n * Resolves the auth-token getter: an explicit function always wins; otherwise\n * falls back to the ambient puck-css auth context's `getToken`. Throws when\n * neither is available, for the same reason as {@link resolveSiteId}.\n */\nexport function resolveGetAuthToken(\n explicit: GetAuthToken | undefined,\n contextGetToken: GetAuthToken | undefined\n): GetAuthToken {\n const getAuthToken = explicit ?? contextGetToken;\n if (!getAuthToken) {\n throw new Error(\n \"p1-media: getAuthToken is required. Pass it explicitly to createMediaPlugin(), \" +\n \"or render the plugin inside a puck-css P1AuthProvider so it can be read from context.\"\n );\n }\n return getAuthToken;\n}\n\n/**\n * Reads the ambient puck-css site context, if any. `P1PuckContext` is a plain\n * exported React Context (default value `null`), so this never throws —\n * unlike `useP1Puck()`, which throws with no provider.\n */\nfunction useAmbientSiteId(): string | undefined {\n return useContext(P1PuckContext)?.siteId;\n}\n\n/**\n * Reads the ambient puck-css auth context's token getter, if any. Unlike\n * `siteId`, puck-css doesn't publicly export a non-throwing read of auth\n * context (`useOptionalP1Auth` exists internally but isn't part of the\n * published package's public API), so this wraps the throwing `useP1Auth()`\n * in a try/catch. That's safe under the rules of hooks: the underlying\n * `useContext` call inside `useP1Auth()` still runs unconditionally every\n * render; only the subsequent plain-JS throw (when there's no provider) is\n * caught here.\n */\nfunction useAmbientGetAuthToken(): GetAuthToken | undefined {\n try {\n return useP1Auth().getToken;\n } catch {\n return undefined;\n }\n}\n\n/** Ambient values read from puck-css context — absent when there's no provider. */\nexport interface AmbientMediaContext {\n siteId?: string;\n getAuthToken?: GetAuthToken;\n}\n\n/**\n * Pure assembly of the final {@link MediaConfig} from `options` (explicit\n * args, back-compat) and `ambient` (puck-css context, auto-bind — omit to\n * resolve explicit-only, e.g. from a test that never renders). No hooks, so\n * it's directly unit-testable; `MediaConfigResolver` is the only caller that\n * supplies a real `ambient`, gathered via hooks.\n */\nexport function buildMediaConfig(options: MediaPluginOptions, ambient: AmbientMediaContext = {}): MediaConfig {\n return {\n workerUrl: options.workerUrl ?? DEFAULT_WORKER_URL,\n siteId: resolveSiteId(options.siteId, ambient.siteId),\n workstreamId: options.workstreamId,\n getAuthToken: resolveGetAuthToken(options.getAuthToken, ambient.getAuthToken),\n metadataFields: options.metadataFields,\n };\n}\n\n/**\n * Resolves `options` against the ambient puck-css context and provides the\n * result to `children`. This is the only place in the plugin that reads\n * puck-css context — everything downstream keeps consuming a fully-resolved\n * `MediaConfig` via `useMediaConfig()`, exactly as before.\n *\n * `config` is memoized on `[options, ambientSiteId, ambientGetAuthToken]`,\n * not recomputed on every render: `P1PuckContext`'s value includes the live\n * `currentData` (the document being edited), which changes on nearly every\n * keystroke anywhere in the document. Without memoizing, every mounted media\n * field would get a fresh `config` object identity on every such keystroke,\n * re-firing every `useEffect`/`useCallback` downstream that depends on it\n * (`use-media-schema.ts`, `media-library.tsx`) — including one that clears\n * the media-library search box mid-typing. `ambientGetAuthToken` is already\n * stable across unrelated re-renders (puck-css's `useP1Auth().getToken` is\n * itself a memoized `useCallback`), and `ambientSiteId` is a plain string, so\n * this memoization only recomputes when something that actually matters —\n * the resolved options object, site, or token getter — changes.\n */\nexport function MediaConfigResolver({\n options,\n children,\n}: {\n options: MediaPluginOptions;\n children: ReactNode;\n}) {\n const ambientSiteId = useAmbientSiteId();\n const ambientGetAuthToken = useAmbientGetAuthToken();\n const config = useMemo(\n () => buildMediaConfig(options, { siteId: ambientSiteId, getAuthToken: ambientGetAuthToken }),\n [options, ambientSiteId, ambientGetAuthToken]\n );\n\n return <MediaConfigProvider config={config}>{children}</MediaConfigProvider>;\n}\n","\"use client\";\n\nimport { DEFAULT_MEDIA_PATTERNS } from \"./patterns\";\nimport { MediaFieldRender } from \"./components/media-field\";\nimport { MediaObjectFieldRender } from \"./components/media-object-field\";\nimport { MediaConfigResolver, type GetAuthToken } from \"./puck-css-bridge\";\nimport type { MediaFieldValue, MetadataFieldDef } from \"./types\";\n\nexport interface MediaPluginOptions {\n /** The base URL of the Cloudflare Worker media API. Defaults to the production host. */\n workerUrl?: string;\n /**\n * Site identifier used to scope media to a specific site. Defaults to the\n * ambient puck-css site context (`P1PuckProvider`) when omitted — pass this\n * explicitly only when rendering outside that provider, or to override it.\n */\n siteId?: string;\n /**\n * Workstream (branch) identifier. Currently accepted for forward-compat but not\n * read by the Worker for any scoping decision — omit unless a future release\n * documents otherwise.\n */\n workstreamId?: string;\n /**\n * Function that returns the current auth token, or null if unauthenticated.\n * May be async. Defaults to the ambient puck-css auth context's `getToken`\n * (`P1AuthProvider`) when omitted — pass this explicitly only when rendering\n * outside that provider, or to override it.\n */\n getAuthToken?: GetAuthToken;\n /** Field name patterns that trigger the media picker (defaults to common image URL patterns) */\n fieldNamePatterns?: RegExp[];\n /**\n * Fallback metadata field schema for the rich `p1-media` field, used when\n * `GET /media/schema` is unavailable. Defaults to\n * `[{ name: \"alt\", label: \"Alt text\", type: \"string\" }]`.\n */\n metadataFields?: MetadataFieldDef[];\n}\n\n/**\n * Creates a Puck plugin that adds a media library backed by Cloudflare R2 + D1.\n * It supports two field modes:\n * - Basic: text fields matching image/media name patterns are replaced with the\n * picker and store a clean CDN URL string. Render with `buildImageUrl()`.\n * - Rich: a registered `p1-media` field type stores a MediaValue object (version\n * URL + metadata such as alt). Render with `getMediaProps()` / `MediaImage` /\n * `MediaFigure`. The editor's crop intent is carried as `?fit=…&gravity=…`.\n *\n * @example\n * ```tsx\n * // Inside a P1 site (rendered within P1PuckProvider + P1AuthProvider):\n * // siteId and getAuthToken are read from context automatically.\n * const mediaPlugin = createMediaPlugin({});\n *\n * // Outside a P1 site, or to override the ambient context, pass explicitly:\n * const mediaPlugin = createMediaPlugin({\n * siteId: \"my-site\",\n * getAuthToken: () => localStorage.getItem(\"token\"),\n * });\n *\n * <Puck plugins={[mediaPlugin]} config={config} data={data} />\n * ```\n */\nexport function createMediaPlugin(options: MediaPluginOptions) {\n const patterns = options.fieldNamePatterns ?? DEFAULT_MEDIA_PATTERNS;\n\n return {\n name: \"p1-media\",\n overrides: {\n fieldTypes: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n text: (props: any) => {\n const { children, name, field, value, onChange, readOnly, id } = props;\n // Puck passes qualified names for array items (e.g. \"slides[0].imageUrl\").\n // Extract the last segment so patterns match the bare field name.\n const bareFieldName = name?.split(\".\").pop() ?? name;\n const isMediaField = patterns.some((p: RegExp) => p.test(bareFieldName));\n\n if (!isMediaField) {\n return <>{children}</>;\n }\n\n return (\n <MediaConfigResolver options={options}>\n <MediaFieldRender\n field={{\n type: \"custom\" as const,\n label: field?.label ?? name,\n render: () => <></>,\n }}\n name={name}\n id={id ?? name}\n value={value ?? \"\"}\n onChange={onChange}\n readOnly={readOnly}\n />\n </MediaConfigResolver>\n );\n },\n // Rich mode: a first-class `p1-media` field whose value is an object.\n // Puck ≥0.20 dispatches overrides.fieldTypes[field.type] for new types.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n \"p1-media\": (props: any) => {\n const { name, field, value, onChange, readOnly, id } = props;\n return (\n <MediaConfigResolver options={options}>\n <MediaObjectFieldRender\n label={field?.label ?? name}\n name={name}\n id={id ?? name}\n value={value ?? \"\"}\n onChange={onChange}\n readOnly={readOnly}\n />\n </MediaConfigResolver>\n );\n },\n },\n },\n // Editor-preview only (never written back): normalize a legacy string to\n // the object shape so components reading the raw prop see `{ url, alt }`.\n // The R10 write-path guard lives in makeMediaValue, not here.\n fieldTransforms: {\n \"p1-media\": ({ value }: { value: MediaFieldValue }) =>\n typeof value === \"string\" ? { url: value, alt: \"\" } : value,\n },\n };\n}\n","export interface ImageTransformParams {\n width?: number;\n height?: number;\n /** `auto` negotiates avif → webp → jpeg from the request's Accept header. */\n format?: \"auto\" | \"webp\" | \"jpeg\" | \"png\" | \"gif\" | \"avif\";\n quality?: number;\n}\n\n/**\n * Merges Cloudflare Images transform params onto a CDN image URL.\n * Preserves any existing params in the URL — e.g. the editor's crop intent\n * (`fit=cover&gravity=auto` for smart crop, `trim.*` for a manual crop).\n *\n * @example\n * buildImageUrl(data.heroImage, { width: 1200, height: 630, format: \"webp\" })\n */\nexport function buildImageUrl(url: string, params: ImageTransformParams): string {\n if (!url) return url;\n const parsed = new URL(url);\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return url;\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) {\n parsed.searchParams.set(k, String(v));\n }\n }\n return parsed.toString();\n}\n","// Render-side helpers. Server-safe (no React context, no client-only hooks) so\n// they can be imported from RSC via the package's \"react-server\" export.\nimport type { ImgHTMLAttributes, ReactElement } from \"react\";\nimport type {\n MediaFieldValue,\n MediaProps,\n MetadataFieldDef,\n} from \"./types\";\nimport { isMediaValue, STRUCTURAL_MEDIA_KEYS } from \"./media-value\";\nimport { buildImageUrl, type ImageTransformParams } from \"./utils\";\n\nexport interface GetMediaPropsOptions {\n /**\n * The CDN image origin that serves media, e.g.\n * \"https://staging.media.p1.pantheon.io\". This is the public image host —\n * NOT the Worker API URL (`…workers.dev`), whose origin would reject every\n * real image URL.\n *\n * Security (required): a value's `url` is untrusted document content — anyone\n * who can edit a document, or call the CCR `/edits` API, controls it. Without\n * an origin check a crafted `https://evil.example/beacon.png` turns every\n * published render into a visitor-IP exfil beacon (and an SSRF under\n * server-fetching `next/image`). getMediaProps therefore rejects any url that\n * is not `https` on this exact origin. If `mediaBaseUrl` is omitted it\n * **fails closed** (empty src) rather than degrading to an insecure pass-through.\n *\n * Local dev exception: when the configured base is itself `http` on a\n * loopback host (`localhost`, `127.0.0.1`, `[::1]` — a local `wrangler dev`\n * worker), same-origin `http` urls are allowed so rich values render locally.\n */\n mediaBaseUrl?: string;\n /** Transform params merged onto the validated URL (width, height, format, quality). */\n transform?: ImageTransformParams;\n}\n\n// Hosts where an http mediaBaseUrl is honored (local `wrangler dev`). Exact\n// hostnames only — no *.localhost subdomains.\nconst LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n\n/**\n * Returns the url only if it is on the configured CDN origin AND https —\n * except that an http origin is honored when the configured mediaBaseUrl is\n * itself http on a loopback host (local dev against `wrangler dev`, which\n * serves plain http). Production is unaffected: real CDN bases are https, so\n * every http url still fails the origin check. Otherwise \"\". Fails closed\n * when no origin is configured (see GetMediaPropsOptions).\n */\nfunction validateSrc(url: string, mediaBaseUrl?: string): string {\n if (!url || !mediaBaseUrl) return \"\";\n let parsed: URL;\n let base: URL;\n try {\n parsed = new URL(url);\n base = new URL(mediaBaseUrl);\n } catch {\n return \"\";\n }\n if (parsed.origin !== base.origin) return \"\";\n if (parsed.protocol !== \"https:\") {\n // Non-https is allowed only as plain http against an explicitly-configured\n // local-dev loopback base. Checking parsed.protocol too keeps schemes whose\n // origin serializes to the base origin (blob:http://…) out of the carve-out.\n const isLocalDevBase = base.protocol === \"http:\" && LOOPBACK_HOSTS.has(base.hostname);\n if (!isLocalDevBase || parsed.protocol !== \"http:\") return \"\";\n }\n return url;\n}\n\n/**\n * Normalizes a `string | MediaValue | null` into `{ src, alt, width?, height? }`.\n * A string (basic mode) yields `alt: \"\"`. `src` is validated against the CDN\n * origin (see GetMediaPropsOptions) and empty on rejection.\n */\nexport function getMediaProps(\n value: MediaFieldValue | null | undefined,\n options?: GetMediaPropsOptions,\n): MediaProps {\n const mediaBaseUrl = options?.mediaBaseUrl;\n const transform = options?.transform;\n\n const finalize = (rawUrl: string): string => {\n const validated = validateSrc(rawUrl, mediaBaseUrl);\n return validated && transform ? buildImageUrl(validated, transform) : validated;\n };\n\n if (value == null) return { src: \"\", alt: \"\" };\n\n if (typeof value === \"string\") {\n return { src: finalize(value), alt: \"\" };\n }\n\n const props: MediaProps = {\n src: finalize(typeof value.url === \"string\" ? value.url : \"\"),\n alt: typeof value.alt === \"string\" ? value.alt : \"\",\n };\n if (typeof value.width === \"number\") props.width = value.width;\n if (typeof value.height === \"number\") props.height = value.height;\n return props;\n}\n\n/**\n * Common-case `<img>` wrapper. Renders nothing when the src is rejected/empty\n * (a broken foreign-origin image is never emitted). `alt` may be overridden;\n * otherwise it comes from the value.\n */\nexport function MediaImage({\n image,\n mediaBaseUrl,\n transform,\n alt,\n ...rest\n}: {\n image: MediaFieldValue | null | undefined;\n mediaBaseUrl?: string;\n transform?: ImageTransformParams;\n} & Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\">): ReactElement | null {\n const props = getMediaProps(image, { mediaBaseUrl, transform });\n if (!props.src) return null;\n return (\n <img\n src={props.src}\n alt={alt ?? props.alt}\n {...(props.width !== undefined ? { width: props.width } : {})}\n {...(props.height !== undefined ? { height: props.height } : {})}\n {...rest}\n />\n );\n}\n\n/**\n * Collects the metadata fields a figure should render, generically (req. R14):\n * with a schema, iterate its entries (canonical order/labels); without one,\n * iterate the value's own string metadata keys. Either way a new backend text\n * field appears with no plugin release. `alt` (on the `<img>`) and non-text\n * values (width/height/metaSchemaVersion) are excluded from the caption.\n */\nfunction collectFigureFields(\n image: MediaFieldValue | null | undefined,\n schema?: MetadataFieldDef[],\n): Array<{ name: string; label?: string; value: string }> {\n if (!isMediaValue(image)) return [];\n const out: Array<{ name: string; label?: string; value: string }> = [];\n if (schema && schema.length > 0) {\n for (const entry of schema) {\n if (entry.name === \"alt\") continue;\n const raw = image[entry.name];\n if (raw === undefined || raw === \"\") continue;\n out.push({ name: entry.name, label: entry.label, value: String(raw) });\n }\n } else {\n for (const [k, v] of Object.entries(image)) {\n if (k === \"alt\") continue;\n if (STRUCTURAL_MEDIA_KEYS.has(k)) continue;\n if (typeof v !== \"string\" || v === \"\") continue;\n out.push({ name: k, value: v });\n }\n }\n return out;\n}\n\n/**\n * `<figure>` that renders the image plus the schema-advertised text fields as\n * ESCAPED text (React default escaping — never dangerouslySetInnerHTML, req.\n * R6). Renders nothing when the src is rejected/empty.\n */\nexport function MediaFigure({\n image,\n schema,\n mediaBaseUrl,\n transform,\n className,\n captionClassName,\n}: {\n image: MediaFieldValue | null | undefined;\n schema?: MetadataFieldDef[];\n mediaBaseUrl?: string;\n transform?: ImageTransformParams;\n className?: string;\n captionClassName?: string;\n}): ReactElement | null {\n const props = getMediaProps(image, { mediaBaseUrl, transform });\n if (!props.src) return null;\n\n const fields = collectFigureFields(image, schema);\n\n return (\n <figure className={className}>\n <img\n src={props.src}\n alt={props.alt}\n {...(props.width !== undefined ? { width: props.width } : {})}\n {...(props.height !== undefined ? { height: props.height } : {})}\n />\n {fields.length > 0 && (\n <figcaption className={captionClassName}>\n {fields.map((f) => (\n <span key={f.name} data-field={f.name}>\n {f.value}\n </span>\n ))}\n </figcaption>\n )}\n </figure>\n );\n}\n","// Ready-made Puck component for the rich `p1-media` field. Server-safe (no\n// hooks, no context) so it can be registered in configs that render via RSC.\nimport type { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport type { ComponentConfig, Field } from \"@puckeditor/core\";\nimport { getMediaProps, MediaFigure } from \"./render\";\nimport type { ImageTransformParams } from \"./utils\";\nimport type { MediaFieldValue, MetadataFieldDef } from \"./types\";\n\nexport interface MediaFigureBlockProps {\n photo: MediaFieldValue | null;\n}\n\nexport interface MediaFigureBlockOptions {\n /**\n * The CDN image origin used to validate value URLs — NOT the Worker API\n * URL. See GetMediaPropsOptions. Defaults to the production origin\n * (\"https://media.p1.pantheon.io\"); override for sandbox/staging/local dev.\n */\n mediaBaseUrl?: string;\n /**\n * Render-time transform. Include BOTH width and height — the editor's crop\n * intent only changes the output when there is a target aspect ratio.\n * Defaults to `{ width: 1200, height: 630, format: \"auto\" }`.\n */\n transform?: ImageTransformParams;\n /** Component label in the Puck sidebar. Defaults to \"Media Figure\". */\n label?: string;\n /** Label of the media field. Defaults to \"Photo\". */\n fieldLabel?: string;\n /** Metadata schema passed to MediaFigure — pins figcaption field order/labels. */\n schema?: MetadataFieldDef[];\n className?: string;\n captionClassName?: string;\n /** Rendered when no photo is chosen (or its URL fails origin validation). */\n placeholder?: ReactNode;\n}\n\nconst DEFAULT_TRANSFORM: ImageTransformParams = { width: 1200, height: 630, format: \"auto\" };\n\n/** Same production default as createMediaPlugin's workerUrl — same host serves both. */\nconst DEFAULT_MEDIA_BASE_URL = \"https://media.p1.pantheon.io\";\n\nconst placeholderStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"200px\",\n borderRadius: \"8px\",\n backgroundColor: \"#e5e5e5\",\n color: \"#525252\",\n fontSize: \"14px\",\n};\n\n/**\n * Builds a registerable Puck component around the rich `p1-media` field and\n * `MediaFigure`. Spares consumers the custom-field-type cast and the\n * width+height transform pitfall:\n *\n * ```tsx\n * const config = {\n * components: {\n * MediaFigureBlock: createMediaFigureBlock({ mediaBaseUrl: MEDIA_BASE }),\n * },\n * };\n * ```\n */\nexport function createMediaFigureBlock(\n options: MediaFigureBlockOptions,\n): ComponentConfig<MediaFigureBlockProps> {\n const {\n mediaBaseUrl = DEFAULT_MEDIA_BASE_URL,\n transform = DEFAULT_TRANSFORM,\n label = \"Media Figure\",\n fieldLabel = \"Photo\",\n schema,\n className,\n captionClassName,\n placeholder = \"Choose a photo from the media library\",\n } = options;\n\n return {\n label,\n fields: {\n // `p1-media` is registered by createMediaPlugin via overrides.fieldTypes,\n // so it is not part of Puck's built-in Field union.\n photo: { type: \"p1-media\", label: fieldLabel } as unknown as Field,\n },\n defaultProps: {\n photo: null,\n },\n render: ({ photo }: MediaFigureBlockProps): ReactElement => {\n const { src } = getMediaProps(photo ?? null, { mediaBaseUrl });\n if (!src) {\n return <div style={placeholderStyle}>{placeholder}</div>;\n }\n return (\n <MediaFigure\n image={photo ?? null}\n mediaBaseUrl={mediaBaseUrl}\n transform={transform}\n schema={schema}\n className={className}\n captionClassName={captionClassName}\n />\n );\n },\n };\n}\n"],"mappings":"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","names":["import_react","import_react","import_react","f","f","c","i","r","import_react","import_jsx_runtime","e","import_react","i","c","s","f","r","l","import_jsx_runtime","r","c","e","f","import_jsx_runtime","p","i","import_jsx_runtime","e","import_react","import_jsx_runtime","t","e","i","import_jsx_runtime","p","i","f","c","s","e","n","import_jsx_runtime","import_react","import_react","import_react","e","t","n","r","i","a","o","s","c","l","u","d","f","p","m","h","g","import_jsx_runtime","e","import_jsx_runtime","f","e","import_react","import_jsx_runtime","import_jsx_runtime","p","import_jsx_runtime","f","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/patterns.ts","../src/components/media-field.tsx","../src/crop.ts","../src/components/media-library.tsx","../src/context.tsx","../src/components/use-media-schema.ts","../src/components/staging.ts","../src/components/media-item.ts","../src/components/upload-flow.ts","../src/components/media-upload-dropzone.tsx","../src/components/metadata-grid.tsx","../src/delimited.ts","../src/components/media-panel-styles.ts","../src/components/media-upload-panel.tsx","../src/components/media-edit-panel.tsx","../src/components/media-grid.tsx","../src/components/media-object-field.tsx","../src/media-value.ts","../src/components/crop-dialog.tsx","../../../node_modules/.pnpm/react-image-crop@11.1.2_react@19.2.7/node_modules/react-image-crop/dist/index.js","#style-inject:#style-inject","../../../node_modules/.pnpm/react-image-crop@11.1.2_react@19.2.7/node_modules/react-image-crop/dist/ReactCrop.css","../src/puck-css-bridge.tsx","../src/plugin.tsx","../src/utils.ts","../src/render.tsx","../src/media-figure-block.tsx"],"sourcesContent":["export { createMediaPlugin } from \"./plugin\";\nexport type { MediaPluginOptions } from \"./plugin\";\nexport type { MediaConfig } from \"./context\";\nexport { DEFAULT_MEDIA_PATTERNS } from \"./patterns\";\nexport { buildImageUrl } from \"./utils\";\nexport type { ImageTransformParams } from \"./utils\";\nexport { getMediaProps, MediaImage, MediaFigure } from \"./render\";\nexport type { GetMediaPropsOptions } from \"./render\";\nexport { createMediaFigureBlock } from \"./media-figure-block\";\nexport type { MediaFigureBlockOptions, MediaFigureBlockProps } from \"./media-figure-block\";\nexport { makeMediaValue, isMediaValue } from \"./media-value\";\nexport type {\n MediaValue,\n MediaFieldValue,\n MediaProps,\n MetadataFieldDef,\n} from \"./types\";\n","/**\n * Default field name patterns that trigger the media library picker.\n * Targets image/logo/icon source fields while excluding navigation URLs\n * (buttonUrl, linkUrl, ctaUrl, etc.) and alt text fields.\n */\nexport const DEFAULT_MEDIA_PATTERNS = [\n /^image(?:Url)?$/,\n /^logo(?:Url)?$/,\n /^media(?:Url)?$/,\n /^icon(?:Url)?$/,\n /^thumbnail(?:Url)?$/,\n /ImageUrl$/,\n /LogoUrl$/,\n];\n","\"use client\";\n\nimport { useState, type ReactElement } from \"react\";\nimport type { CustomField } from \"@puckeditor/core\";\nimport { getBaseUrl, getCropMode, buildValueWithCrop, type CropMode } from \"../crop\";\nimport { MediaLibrary } from \"./media-library\";\n\nexport function MediaFieldRender(props: {\n field: CustomField<string>;\n name: string;\n id: string;\n value: string;\n onChange: (value: string) => void;\n readOnly?: boolean;\n}): ReactElement {\n const { value, onChange, readOnly } = props;\n const [isLibraryOpen, setIsLibraryOpen] = useState(false);\n\n const baseUrl = getBaseUrl(value);\n const cropMode = getCropMode(value);\n\n const handleCropChange = (crop: CropMode) => {\n if (!baseUrl) return;\n onChange(buildValueWithCrop(baseUrl, crop));\n };\n\n const handleSelect = (url: string) => {\n onChange(buildValueWithCrop(url.split(\"?\")[0], cropMode));\n setIsLibraryOpen(false);\n };\n\n const buttonBase: React.CSSProperties = {\n padding: \"3px 10px\",\n fontSize: \"12px\",\n fontWeight: 500,\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n fontFamily: \"inherit\",\n };\n\n return (\n <div style={{ width: \"100%\" }}>\n {value ? (\n <div style={{ marginBottom: \"8px\" }}>\n <img\n src={baseUrl}\n alt=\"Preview\"\n style={{\n width: \"100%\",\n maxHeight: \"120px\",\n objectFit: \"cover\",\n borderRadius: \"6px\",\n display: \"block\",\n border: \"1px solid #e0e0e0\",\n }}\n />\n </div>\n ) : (\n <div\n style={{\n height: \"80px\",\n border: \"2px dashed #d0d0d0\",\n borderRadius: \"6px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginBottom: \"8px\",\n color: \"#999\",\n fontSize: \"13px\",\n cursor: readOnly ? \"default\" : \"pointer\",\n }}\n onClick={() => !readOnly && setIsLibraryOpen(true)}\n >\n Click to select image\n </div>\n )}\n\n {value && (\n <div style={{ marginBottom: \"8px\" }}>\n <div style={{ fontSize: \"11px\", color: \"#666\", fontWeight: 500, marginBottom: \"4px\" }}>\n Crop\n </div>\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => handleCropChange(\"fit\")}\n style={{\n ...buttonBase,\n backgroundColor: cropMode === \"fit\" ? \"#2563eb\" : \"white\",\n color: cropMode === \"fit\" ? \"white\" : \"#444\",\n borderColor: cropMode === \"fit\" ? \"#2563eb\" : \"#d0d0d0\",\n opacity: readOnly ? 0.5 : 1,\n }}\n >\n Fit in\n </button>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => handleCropChange(\"smart\")}\n style={{\n ...buttonBase,\n backgroundColor: cropMode === \"smart\" ? \"#2563eb\" : \"white\",\n color: cropMode === \"smart\" ? \"white\" : \"#444\",\n borderColor: cropMode === \"smart\" ? \"#2563eb\" : \"#d0d0d0\",\n opacity: readOnly ? 0.5 : 1,\n }}\n >\n Smart crop\n </button>\n </div>\n </div>\n )}\n\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <button\n type=\"button\"\n onClick={() => setIsLibraryOpen(true)}\n disabled={readOnly}\n style={{\n flex: 1,\n padding: \"6px 12px\",\n backgroundColor: \"#2563eb\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n opacity: readOnly ? 0.5 : 1,\n fontFamily: \"inherit\",\n }}\n >\n Choose from Library\n </button>\n\n {value && (\n <button\n type=\"button\"\n onClick={() => onChange(\"\")}\n disabled={readOnly}\n style={{\n padding: \"6px 12px\",\n backgroundColor: \"white\",\n color: \"#666\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n opacity: readOnly ? 0.5 : 1,\n fontFamily: \"inherit\",\n }}\n >\n Clear\n </button>\n )}\n </div>\n\n <MediaLibrary\n isOpen={isLibraryOpen}\n onClose={() => setIsLibraryOpen(false)}\n onSelect={handleSelect}\n />\n </div>\n );\n}\n","// Crop param helpers shared by the basic (string) and rich (p1-media) fields.\n// Crop lives in the URL query so the stored value stays a plain CDN URL.\n\nexport type CropMode = \"fit\" | \"smart\" | \"custom\";\n\n/** A manual crop region in source-image pixels (the Worker's `trim.*` params). */\nexport interface TrimRect {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport function getBaseUrl(value: string): string {\n return value ? value.split(\"?\")[0] : \"\";\n}\n\nfunction getParams(value: string): URLSearchParams {\n return new URLSearchParams(value.includes(\"?\") ? value.split(\"?\")[1] : \"\");\n}\n\nexport function getCropMode(value: string): CropMode {\n if (!value) return \"fit\";\n const params = getParams(value);\n if (params.has(\"trim.left\")) return \"custom\";\n return params.get(\"fit\") === \"cover\" ? \"smart\" : \"fit\";\n}\n\n/** Reads the manual crop region off a value URL, or null when absent/malformed. */\nexport function getTrimRect(value: string): TrimRect | null {\n if (!value) return null;\n const params = getParams(value);\n const read = (key: string): number | null => {\n const raw = params.get(key);\n if (raw === null || raw === \"\") return null;\n const n = Number(raw);\n return Number.isFinite(n) ? n : null;\n };\n const left = read(\"trim.left\");\n const top = read(\"trim.top\");\n const width = read(\"trim.width\");\n const height = read(\"trim.height\");\n if (left === null || top === null || width === null || height === null) return null;\n return { left, top, width, height };\n}\n\n/**\n * Builds a value URL for a preset crop mode. `custom` is not a preset — it\n * intentionally degrades to fit-in here, because callers reach this either\n * from the fit/smart buttons (never \"custom\") or when carrying the current\n * mode onto a NEWLY selected asset, where the old image's trim rect would be\n * meaningless.\n */\nexport function buildValueWithCrop(baseUrl: string, crop: CropMode): string {\n // baseUrl always has query params stripped by getBaseUrl before being passed here\n return crop === \"smart\"\n ? `${baseUrl}?fit=cover&gravity=auto`\n : `${baseUrl}?fit=scale-down`;\n}\n\n/**\n * Builds a value URL carrying a manual crop region. Values are rounded to\n * integers and clamped to a ≥1px region at a non-negative offset — the Worker\n * passes them straight to Cloudflare Images, which rejects degenerate rects.\n */\nexport function buildValueWithTrim(baseUrl: string, rect: TrimRect): string {\n const left = Math.max(0, Math.round(rect.left));\n const top = Math.max(0, Math.round(rect.top));\n const width = Math.max(1, Math.round(rect.width));\n const height = Math.max(1, Math.round(rect.height));\n return `${baseUrl}?trim.left=${left}&trim.top=${top}&trim.width=${width}&trim.height=${height}`;\n}\n","\"use client\";\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport { useMediaConfig, type MediaConfig } from \"../context\";\nimport type { MetadataFieldDef } from \"../types\";\nimport { useMediaSchema, orderAltFirst } from \"./use-media-schema\";\nimport { buildPatchBody, keepIncompleteRows } from \"./staging\";\nimport { parseMediaList, type MediaItem } from \"./media-item\";\nimport {\n runUpload,\n UploadFlowError,\n STAGED_STATUS,\n type RowStatus,\n type UploadProgress,\n type UploadTarget,\n} from \"./upload-flow\";\nimport { MediaUploadDropzone } from \"./media-upload-dropzone\";\nimport { MediaUploadPanel } from \"./media-upload-panel\";\nimport { MediaEditPanel } from \"./media-edit-panel\";\nimport { MediaGrid } from \"./media-grid\";\n\nexport type { MediaItem } from \"./media-item\";\n\ninterface MediaLibraryProps {\n isOpen: boolean;\n onClose: () => void;\n /** Basic mode: receives the bare CDN URL of the picked item. */\n onSelect: (url: string) => void;\n /**\n * Rich mode (p1-media): receives the full item, including asset identity and\n * metadata defaults when the Worker returns the asset-shaped list. Takes\n * precedence over `onSelect` when provided.\n */\n onSelectItem?: (item: MediaItem) => void;\n}\n\n// The Worker caps list responses at 500; ask for the max rather than its\n// 200 default so large libraries are actually reachable by scrolling.\nconst LIST_LIMIT = \"500\";\n\n// workstreamId is accepted for forward-compat but not read by the Worker —\n// omit it entirely rather than sending a meaningless placeholder value.\nfunction siteParams(config: Pick<MediaConfig, \"siteId\" | \"workstreamId\">): URLSearchParams {\n const params = new URLSearchParams({ siteId: config.siteId });\n if (config.workstreamId) params.set(\"workstreamId\", config.workstreamId);\n return params;\n}\n\nexport function MediaLibrary({ isOpen, onClose, onSelect, onSelectItem }: MediaLibraryProps) {\n const config = useMediaConfig();\n const schema = orderAltFirst(useMediaSchema());\n const [media, setMedia] = useState<MediaItem[]>([]);\n const [loading, setLoading] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [searchQuery, setSearchQuery] = useState(\"\");\n // Owned here (not MediaGrid) so switching to the upload/edit panel and back\n // — which unmounts/remounts the grid — doesn't lose the focused tile.\n const [focusIdx, setFocusIdx] = useState(0);\n // Files staged for upload — shown in the metadata grid before POSTing.\n const [pending, setPending] = useState<{ file: File; previewUrl: string }[]>([]);\n const [pendingValues, setPendingValues] = useState<string[][]>([]);\n // Per-row upload progress/status, position-matched with `pending`. `progress`\n // survives a failed attempt so a retry resumes from the step that failed\n // instead of redoing presign/PUT/finalize from scratch.\n const [pendingProgress, setPendingProgress] = useState<UploadProgress[]>([]);\n const [pendingStatus, setPendingStatus] = useState<RowStatus[]>([]);\n // Existing item whose metadata is being edited. editFields is the schema\n // SNAPSHOT taken when the edit began — the grid columns and the PATCH body\n // both use it, so a schema fetch resolving mid-edit can't add columns whose\n // empty cells would clear (null) metadata the user never touched.\n const [editing, setEditing] = useState<MediaItem | null>(null);\n const [editFields, setEditFields] = useState<MetadataFieldDef[]>([]);\n const [editValues, setEditValues] = useState<string[][]>([]);\n const [panelError, setPanelError] = useState<string | null>(null);\n const replaceInputRef = useRef<HTMLInputElement>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n const getAuthHeaders = useCallback(async (): Promise<HeadersInit> => {\n const token = await config.getAuthToken();\n return token ? { Authorization: \"Bearer \" + token } : {};\n }, [config]);\n\n const fetchMedia = useCallback(\n async (search?: string) => {\n setLoading(true);\n try {\n const params = siteParams(config);\n params.set(\"limit\", LIST_LIMIT);\n if (search) params.set(\"search\", search);\n const response = await fetch(\n config.workerUrl + \"/media?\" + params.toString(),\n { headers: await getAuthHeaders() },\n );\n if (response.ok) {\n setMedia(parseMediaList(await response.json()));\n setFocusIdx(0);\n }\n } catch (error) {\n console.error(\"Failed to fetch media:\", error);\n } finally {\n setLoading(false);\n }\n },\n [config, getAuthHeaders],\n );\n\n useEffect(() => {\n if (isOpen) {\n fetchMedia();\n setSearchQuery(\"\");\n }\n }, [isOpen, fetchMedia]);\n\n const searchInitialized = useRef(false);\n useEffect(() => {\n if (!isOpen) {\n searchInitialized.current = false;\n return;\n }\n // Skip the initial run — the open effect already fetches\n if (!searchInitialized.current) {\n searchInitialized.current = true;\n return;\n }\n const timer = setTimeout(() => {\n fetchMedia(searchQuery || undefined);\n }, 300);\n return () => clearTimeout(timer);\n }, [searchQuery, isOpen, fetchMedia]);\n\n // Chosen/dropped files are STAGED first: the metadata grid prompts for\n // alt/caption/… per file, then \"Upload\" POSTs each file with its row.\n const stageFiles = (files: FileList | null) => {\n if (!files || files.length === 0) return;\n const staged = Array.from(files).map((file) => ({\n file,\n previewUrl: URL.createObjectURL(file),\n }));\n setPending(staged);\n setPendingValues(staged.map(() => schema.map(() => \"\")));\n setPendingProgress(staged.map(() => ({})));\n setPendingStatus(staged.map(() => STAGED_STATUS));\n setPanelError(null);\n };\n\n const clearPending = useCallback(() => {\n setPending((prev) => {\n prev.forEach((p) => URL.revokeObjectURL(p.previewUrl));\n return [];\n });\n setPendingValues([]);\n setPendingProgress([]);\n setPendingStatus([]);\n setPanelError(null);\n }, []);\n\n // Modal closed with a staged upload → drop it (and its object URLs).\n useEffect(() => {\n if (!isOpen) {\n clearPending();\n setEditing(null);\n }\n }, [isOpen, clearPending]);\n\n const uploadAll = async () => {\n setUploading(true);\n setPanelError(null);\n const target: UploadTarget = {\n workerUrl: config.workerUrl,\n siteId: config.siteId,\n workstreamId: config.workstreamId,\n getAuthHeaders,\n };\n // Per-row outcome: retrying must never re-POST a file that already\n // finished (duplicate assets). Each row is caught individually below, so\n // one file's failure never aborts the rest of the batch.\n const progress = pending.map((_, i) => pendingProgress[i] ?? {});\n const statuses = pending.map((_, i) => pendingStatus[i] ?? STAGED_STATUS);\n for (let i = 0; i < pending.length; i++) {\n const metadata: Record<string, string> = {};\n schema.forEach((f, c) => {\n const value = pendingValues[i]?.[c]?.trim();\n if (value) metadata[f.name] = value;\n });\n try {\n const result = await runUpload(target, pending[i].file, metadata, undefined, progress[i], (step) => {\n statuses[i] = { step };\n setPendingStatus([...statuses]);\n });\n progress[i] = result.progress;\n statuses[i] = { step: \"done\" };\n } catch (error) {\n const message = error instanceof UploadFlowError ? error.message : \"Upload failed\";\n if (error instanceof UploadFlowError) progress[i] = error.progress;\n statuses[i] = { step: \"failed\", error: message };\n console.error(\"Upload failed:\", error);\n }\n setPendingProgress([...progress]);\n setPendingStatus([...statuses]);\n }\n try {\n if (statuses.every((s) => s.step === \"done\")) {\n clearPending();\n } else {\n // Drop finished rows (and release their previews); keep the rest with\n // their typed metadata AND progress so Upload retries resume from the\n // step that failed rather than redoing presign/PUT/finalize.\n pending.forEach((p, i) => {\n if (statuses[i].step === \"done\") URL.revokeObjectURL(p.previewUrl);\n });\n const kept = keepIncompleteRows(pending, pendingValues, progress, statuses);\n setPending(kept.rows);\n setPendingValues(kept.values);\n setPendingProgress(kept.progress);\n setPendingStatus(kept.statuses);\n const failures = kept.rows.length;\n setPanelError(\n `${failures} of ${pending.length} uploads failed — successful files are already in the library; only the failed rows below will be retried`,\n );\n }\n await fetchMedia(searchQuery || undefined);\n } finally {\n setUploading(false);\n }\n };\n\n const startEdit = (item: MediaItem) => {\n setEditing(item);\n setEditFields(schema);\n setEditValues([schema.map((f) => item.metadata?.[f.name] ?? \"\")]);\n setPanelError(null);\n };\n\n const saveEdit = async () => {\n if (!editing?.assetId) return;\n setUploading(true);\n setPanelError(null);\n try {\n // Flat map per the PATCH contract; empty cells clear via null. Built\n // from the edit-time field snapshot, never the live schema.\n const body = buildPatchBody(editFields, editValues[0] ?? []);\n const params = siteParams(config);\n const response = await fetch(\n config.workerUrl + \"/media/\" + encodeURIComponent(editing.assetId) + \"?\" + params.toString(),\n {\n method: \"PATCH\",\n body: JSON.stringify(body),\n headers: { ...(await getAuthHeaders()), \"Content-Type\": \"application/json\" },\n },\n );\n if (response.ok) {\n setEditing(null);\n await fetchMedia(searchQuery || undefined);\n } else {\n setPanelError(\"Failed to save metadata\");\n }\n } catch (error) {\n console.error(\"Failed to save metadata:\", error);\n setPanelError(\"Failed to save metadata\");\n } finally {\n setUploading(false);\n }\n };\n\n // \"Replace image\" in the edit panel: uploads the chosen file as a NEW\n // immutable version of the asset (POST /media/:assetId/versions) and\n // repoints current_version — metadata is untouched.\n const replaceImage = async (file: File | undefined) => {\n if (!file || !editing?.assetId) return;\n setUploading(true);\n setPanelError(null);\n try {\n const target: UploadTarget = {\n workerUrl: config.workerUrl,\n siteId: config.siteId,\n workstreamId: config.workstreamId,\n getAuthHeaders,\n };\n // Metadata is untouched by a replace — no metadata to send.\n const { item } = await runUpload(target, file, undefined, editing.assetId, {}, () => {});\n // Show the new version in the panel; the list refreshes on save/close.\n setEditing(item);\n await fetchMedia(searchQuery || undefined);\n } catch (error) {\n console.error(\"Failed to replace image:\", error);\n setPanelError(\n error instanceof UploadFlowError ? `Failed to replace image: ${error.message}` : \"Failed to replace image\",\n );\n } finally {\n setUploading(false);\n if (replaceInputRef.current) replaceInputRef.current.value = \"\";\n }\n };\n\n const selectItem = (item: MediaItem) => {\n if (onSelectItem) {\n onSelectItem(item);\n } else {\n onSelect(item.url);\n }\n onClose();\n };\n\n // Two-step inline delete: the tile's × button (or Delete key) arms a\n // per-tile confirmation overlay instead of window.confirm — a native\n // dialog blocks the whole page (including any browser automation driving it).\n const deleteItem = (item: MediaItem) => {\n const { assetId } = item; // soft delete is by assetId (frozen contract)\n if (!assetId) return;\n (async () => {\n try {\n const params = siteParams(config);\n const response = await fetch(\n config.workerUrl + \"/media/\" + encodeURIComponent(assetId) + \"?\" + params.toString(),\n {\n method: \"DELETE\",\n headers: await getAuthHeaders(),\n },\n );\n if (response.ok) {\n await fetchMedia(searchQuery || undefined);\n } else {\n console.error(\"Failed to delete media:\", response.statusText);\n }\n } catch (error) {\n console.error(\"Failed to delete media:\", error);\n }\n })();\n };\n\n if (!isOpen) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 99999,\n padding: \"20px\",\n }}\n onClick={onClose}\n >\n <div\n style={{\n backgroundColor: \"white\",\n borderRadius: \"12px\",\n boxShadow:\n \"0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04)\",\n maxWidth: \"900px\",\n width: \"100%\",\n maxHeight: \"80vh\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n padding: \"20px 24px\",\n borderBottom: \"1px solid #e0e0e0\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <h2 style={{ margin: 0, fontSize: \"20px\", fontWeight: 600, color: \"#333\" }}>Media Library</h2>\n <button\n onClick={onClose}\n style={{\n background: \"none\",\n border: \"none\",\n fontSize: \"24px\",\n cursor: \"pointer\",\n color: \"#666\",\n padding: \"0\",\n width: \"32px\",\n height: \"32px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"4px\",\n }}\n >\n ×\n </button>\n </div>\n\n {/* Content */}\n <div ref={scrollRef} style={{ padding: \"24px\", overflowY: \"auto\", flex: 1 }}>\n {pending.length > 0 ? (\n <MediaUploadPanel\n schema={schema}\n pending={pending}\n pendingValues={pendingValues}\n onValuesChange={setPendingValues}\n pendingStatus={pendingStatus}\n uploading={uploading}\n panelError={panelError}\n onCancel={clearPending}\n onUpload={uploadAll}\n />\n ) : editing ? (\n <MediaEditPanel\n editing={editing}\n editFields={editFields}\n editValues={editValues}\n onValuesChange={setEditValues}\n uploading={uploading}\n panelError={panelError}\n onCancel={() => setEditing(null)}\n onSave={saveEdit}\n onReplaceImage={replaceImage}\n replaceInputRef={replaceInputRef}\n />\n ) : (\n <>\n <MediaUploadDropzone uploading={uploading} onFilesSelected={stageFiles} />\n <MediaGrid\n media={media}\n loading={loading}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onSelectItem={selectItem}\n onStartEdit={startEdit}\n onDeleteItem={deleteItem}\n scrollRef={scrollRef}\n focusIdx={focusIdx}\n onFocusIdxChange={setFocusIdx}\n />\n </>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { MetadataFieldDef } from \"./types\";\n\nexport interface MediaConfig {\n workerUrl: string;\n siteId: string;\n workstreamId?: string;\n getAuthToken: () => Promise<string | null> | string | null;\n /**\n * Fallback metadata field schema for the rich `p1-media` field, used when\n * `GET /media/schema` is absent/unreachable (lets the plugin ship before the\n * Worker upgrade). Defaults to `[{ name: \"alt\", label: \"Alt text\", type: \"string\" }]`.\n */\n metadataFields?: MetadataFieldDef[];\n}\n\nconst MediaConfigContext = createContext<MediaConfig | null>(null);\n\nexport function MediaConfigProvider({\n config,\n children,\n}: {\n config: MediaConfig;\n children: React.ReactNode;\n}) {\n return (\n <MediaConfigContext.Provider value={config}>\n {children}\n </MediaConfigContext.Provider>\n );\n}\n\nexport function useMediaConfig(): MediaConfig {\n const ctx = useContext(MediaConfigContext);\n if (!ctx)\n throw new Error(\"useMediaConfig must be used within MediaConfigProvider\");\n return ctx;\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useMediaConfig } from \"../context\";\nimport type { MetadataFieldDef } from \"../types\";\n\nexport const DEFAULT_METADATA_FIELDS: MetadataFieldDef[] = [\n { name: \"alt\", label: \"Alt text\", type: \"string\" },\n];\n\n/** Ensures `alt` renders first (design: \"alt first\"), keeping the rest in order. */\nexport function orderAltFirst(schema: MetadataFieldDef[]): MetadataFieldDef[] {\n const alt = schema.find((f) => f.name === \"alt\");\n if (!alt) return schema;\n return [alt, ...schema.filter((f) => f.name !== \"alt\")];\n}\n\n/**\n * Fetches the metadata schema from `GET /media/schema`, falling back to the\n * plugin's `metadataFields` option (or `[alt]`) when the endpoint is\n * absent/unreachable — so the plugin works before the Worker is upgraded.\n */\nexport function useMediaSchema(): MetadataFieldDef[] {\n const config = useMediaConfig();\n const fallback =\n config.metadataFields && config.metadataFields.length > 0\n ? config.metadataFields\n : DEFAULT_METADATA_FIELDS;\n const [schema, setSchema] = useState<MetadataFieldDef[]>(fallback);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const token = await config.getAuthToken();\n const headers: HeadersInit = token ? { Authorization: \"Bearer \" + token } : {};\n const res = await fetch(config.workerUrl + \"/media/schema\", { headers });\n if (!res.ok) return;\n const data = await res.json();\n if (!cancelled && Array.isArray(data) && data.length > 0) {\n setSchema(data as MetadataFieldDef[]);\n }\n } catch {\n // keep the fallback\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [config]);\n\n return schema;\n}\n","// Pure helpers for the media library's staged-upload and edit panels.\n// Extracted from media-library.tsx so the two invariants below are unit-testable.\nimport type { MetadataFieldDef } from \"../types\";\nimport type { RowStatus, UploadProgress } from \"./upload-flow\";\n\n/**\n * Builds the PATCH body for saving edited metadata. `fields` must be the\n * SNAPSHOT taken when the edit began — never the live schema — because the\n * body sends `null` (= clear) for every listed field the user left empty.\n * If the schema fetch resolves mid-edit and grew the field list, iterating\n * the live schema here would null out fields the user never saw or touched.\n */\nexport function buildPatchBody(\n fields: MetadataFieldDef[],\n row: (string | undefined)[],\n): Record<string, string | null> {\n const body: Record<string, string | null> = {};\n fields.forEach((f, c) => {\n const value = row[c]?.trim();\n body[f.name] = value ? value : null;\n });\n return body;\n}\n\n/**\n * Partitions a staged batch after an upload pass: rows whose upload finished\n * (`step === \"done\"`) are dropped (retrying must never re-POST them — that\n * would create duplicate assets); every other row keeps its position-matched\n * metadata values AND its `UploadProgress`, so a retry resumes from the step\n * that failed instead of restarting the whole presign/PUT/finalize sequence.\n * Rows never attempted (a mid-batch throw) are still \"staged\" and are kept.\n */\nexport function keepIncompleteRows<T>(\n rows: T[],\n values: string[][],\n progress: UploadProgress[],\n statuses: RowStatus[],\n): { rows: T[]; values: string[][]; progress: UploadProgress[]; statuses: RowStatus[] } {\n const kept: T[] = [];\n const keptValues: string[][] = [];\n const keptProgress: UploadProgress[] = [];\n const keptStatuses: RowStatus[] = [];\n rows.forEach((row, i) => {\n if (statuses[i]?.step === \"done\") return;\n kept.push(row);\n keptValues.push(values[i] ?? []);\n keptProgress.push(progress[i] ?? {});\n keptStatuses.push(statuses[i] ?? { step: \"staged\" });\n });\n return { rows: kept, values: keptValues, progress: keptProgress, statuses: keptStatuses };\n}\n","/**\n * A library item — the Worker's MediaAsset shape (frozen contract). `metadata`\n * is a FLAT string map that INCLUDES `alt`; `width`/`height` are top-level\n * captured dimensions. `assetId`/`versionId` are absent only when pointed at a\n * pre-cutover Worker, in which case selection falls back to a string value (R10).\n */\nexport interface MediaItem {\n assetId?: string;\n versionId?: string;\n url: string;\n filename: string;\n contentType?: string;\n size?: number;\n width?: number;\n height?: number;\n metadata?: Record<string, string>;\n metaSchemaVersion?: number;\n createdAt?: string;\n}\n\n/** Normalizes one raw MediaAsset entry into a MediaItem. */\nexport function normalizeItem(raw: Record<string, unknown>): MediaItem {\n let metadata = raw.metadata as Record<string, string> | undefined;\n if (typeof metadata === \"string\") {\n // Defensive: the contract sends an object, but tolerate a JSON string.\n try {\n metadata = JSON.parse(metadata);\n } catch {\n metadata = undefined;\n }\n }\n return {\n assetId: raw.assetId as string | undefined,\n versionId: raw.versionId as string | undefined,\n url: String(raw.url ?? \"\"),\n filename: String(raw.filename ?? \"\"),\n contentType: raw.contentType as string | undefined,\n size: raw.size as number | undefined,\n width: raw.width as number | undefined,\n height: raw.height as number | undefined,\n metadata: metadata && typeof metadata === \"object\" ? metadata : undefined,\n metaSchemaVersion: raw.metaSchemaVersion as number | undefined,\n createdAt: raw.createdAt as string | undefined,\n };\n}\n\n/** `GET /media` returns a bare JSON array of MediaAsset (frozen contract). */\nexport function parseMediaList(data: unknown): MediaItem[] {\n if (!Array.isArray(data)) return [];\n return data.map((r) => normalizeItem(r as Record<string, unknown>));\n}\n","// Presign -> PUT -> finalize upload sequence, extracted so both the batch\n// upload panel and the single-file \"Replace image\" action share one\n// implementation of the 3-step wire protocol.\nimport { normalizeItem, type MediaItem } from \"./media-item\";\n\n/** Lifecycle of a single file through the presign -> PUT -> finalize sequence. */\nexport type UploadStep = \"staged\" | \"presigning\" | \"uploading\" | \"finalizing\" | \"done\" | \"failed\";\n\nexport interface RowStatus {\n step: UploadStep;\n error?: string;\n}\n\nexport const STAGED_STATUS: RowStatus = { step: \"staged\" };\n\ninterface PresignResult {\n assetId: string;\n versionId: string;\n filename: string;\n uploadUrl: string;\n}\n\n/**\n * Presign result + PUT outcome for one file, carried across a failed attempt\n * so a retry resumes from the step that failed rather than redoing all\n * three. `presigned` is only kept once `uploaded` is also true — a presigned\n * URL expires after 5 minutes, so re-using one from a failed PUT attempt\n * could just fail again the same way; re-presigning is cheap and safe.\n */\nexport interface UploadProgress {\n presigned?: PresignResult;\n uploaded?: boolean;\n}\n\nexport interface UploadTarget {\n workerUrl: string;\n siteId: string;\n workstreamId?: string;\n getAuthHeaders: () => Promise<HeadersInit>;\n}\n\n/** Thrown on any step failure, carrying how far the upload actually got so the caller can retry from there. */\nexport class UploadFlowError extends Error {\n progress: UploadProgress;\n constructor(message: string, progress: UploadProgress) {\n super(message);\n this.name = \"UploadFlowError\";\n this.progress = progress;\n }\n}\n\nfunction targetParams(target: UploadTarget): string {\n const params = new URLSearchParams({ siteId: target.siteId });\n if (target.workstreamId) params.set(\"workstreamId\", target.workstreamId);\n return params.toString();\n}\n\nasync function postJson(target: UploadTarget, path: string, body: unknown): Promise<Response> {\n return fetch(`${target.workerUrl}${path}?${targetParams(target)}`, {\n method: \"POST\",\n body: JSON.stringify(body),\n headers: { ...(await target.getAuthHeaders()), \"Content-Type\": \"application/json\" },\n });\n}\n\n/**\n * Runs the presign -> PUT -> finalize sequence for one file, resuming from\n * `progress` so a retry skips steps that already succeeded. Pass `assetId`\n * to upload a replacement version of an existing asset; omit it to create a\n * new asset. `onStep` fires before each network step so the caller can\n * render live per-row status.\n */\nexport async function runUpload(\n target: UploadTarget,\n file: File,\n metadata: Record<string, string> | undefined,\n assetId: string | undefined,\n progress: UploadProgress,\n onStep: (step: UploadStep) => void,\n): Promise<{ item: MediaItem; progress: UploadProgress }> {\n let presigned = progress.presigned;\n let uploaded = progress.uploaded ?? false;\n\n if (!uploaded) {\n onStep(\"presigning\");\n const presignPath = assetId ? `/media/${encodeURIComponent(assetId)}/versions/presign` : \"/media/presign\";\n let presignResponse: Response;\n try {\n presignResponse = await postJson(target, presignPath, {\n filename: file.name,\n contentType: file.type,\n size: file.size,\n metadata,\n });\n } catch (err) {\n throw new UploadFlowError(`Could not reach the server: ${(err as Error).message}`, {});\n }\n if (!presignResponse.ok) throw new UploadFlowError(`Presign failed (${presignResponse.status})`, {});\n const freshlyPresigned: PresignResult = await presignResponse.json();\n presigned = freshlyPresigned;\n\n onStep(\"uploading\");\n let putResponse: Response;\n try {\n putResponse = await fetch(freshlyPresigned.uploadUrl, {\n method: \"PUT\",\n body: file,\n headers: { \"Content-Type\": file.type },\n });\n } catch (err) {\n throw new UploadFlowError(`Upload to storage failed: ${(err as Error).message}`, {});\n }\n if (!putResponse.ok) throw new UploadFlowError(`Upload to storage failed (${putResponse.status})`, {});\n uploaded = true;\n }\n\n const nextProgress: UploadProgress = { presigned, uploaded };\n if (presigned === undefined) {\n // `uploaded` is only ever true alongside a stored presign result, so this\n // means the resume state was persisted in an inconsistent shape.\n throw new UploadFlowError(\"Resume state is missing its presign result\", nextProgress);\n }\n const presignedResult = presigned;\n\n onStep(\"finalizing\");\n const finalizePath = assetId\n ? `/media/${encodeURIComponent(assetId)}/versions/finalize`\n : \"/media/finalize\";\n const finalizeBody = assetId\n ? { versionId: presignedResult.versionId, filename: presignedResult.filename }\n : {\n assetId: presignedResult.assetId,\n versionId: presignedResult.versionId,\n filename: presignedResult.filename,\n metadata,\n };\n let finalizeResponse: Response;\n try {\n finalizeResponse = await postJson(target, finalizePath, finalizeBody);\n } catch (err) {\n throw new UploadFlowError(`Could not reach the server: ${(err as Error).message}`, nextProgress);\n }\n if (!finalizeResponse.ok) throw new UploadFlowError(`Finalize failed (${finalizeResponse.status})`, nextProgress);\n\n const item = normalizeItem(await finalizeResponse.json());\n return { item, progress: nextProgress };\n}\n","\"use client\";\n\nimport { useRef, useState } from \"react\";\n\n/** Drag-and-drop / click-to-browse file picker shown in the library's browse view. */\nexport function MediaUploadDropzone(props: {\n uploading: boolean;\n onFilesSelected: (files: FileList | null) => void;\n}) {\n const { uploading, onFilesSelected } = props;\n const [dragActive, setDragActive] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(true);\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setDragActive(false);\n onFilesSelected(e.dataTransfer.files);\n };\n\n return (\n <div\n style={{\n border: dragActive ? \"2px solid #2563eb\" : \"2px dashed #d0d0d0\",\n borderRadius: \"8px\",\n padding: \"32px\",\n textAlign: \"center\",\n marginBottom: \"16px\",\n cursor: \"pointer\",\n backgroundColor: dragActive ? \"#eff6ff\" : \"#fafafa\",\n transition: \"all 0.2s\",\n }}\n onClick={() => fileInputRef.current?.click()}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n multiple\n style={{ display: \"none\" }}\n onChange={(e) => onFilesSelected(e.target.files)}\n />\n <div style={{ fontSize: \"28px\", marginBottom: \"8px\", color: \"#999\" }}>\n {uploading ? \"⏳\" : \"↑\"}\n </div>\n <div style={{ color: \"#666\", fontSize: \"14px\" }}>\n {uploading ? \"Uploading...\" : \"Drag & drop files here or click to browse\"}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, type ReactElement } from \"react\";\nimport { applyDelimited } from \"../delimited\";\nimport type { MetadataFieldDef } from \"../types\";\n\nexport interface MetadataGridRow {\n key: string;\n /** Shown in the row header and used for header-mode paste matching (filename). */\n label: string;\n thumbnailUrl?: string;\n /** Small status badge under the filename (e.g. upload progress/failure). */\n status?: { text: string; isError?: boolean };\n}\n\n/**\n * Keyboard-accessible metadata entry grid: one row per image, one column per\n * schema field. Tab moves through cells in DOM order; Enter/ArrowDown and\n * ArrowUp move within a column (inputs are single-line, so vertical arrows are\n * free). Pasting multi-cell TSV/CSV fills from the focused cell — or maps by\n * header row / filename column when present (see applyDelimited).\n */\nexport function MetadataGrid(props: {\n fields: MetadataFieldDef[];\n rows: MetadataGridRow[];\n /** `rows.length` x `fields.length` current values. */\n values: string[][];\n onChange: (next: string[][]) => void;\n disabled?: boolean;\n /** Focus the first cell when the grid mounts. */\n autoFocus?: boolean;\n}): ReactElement {\n const { fields, rows, values, onChange, disabled, autoFocus } = props;\n const inputRefs = useRef<(HTMLInputElement | null)[][]>([]);\n inputRefs.current = rows.map((_, r) => inputRefs.current[r] ?? []);\n\n useEffect(() => {\n if (autoFocus) inputRefs.current[0]?.[0]?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const setCell = (r: number, c: number, v: string) => {\n const next = values.map((row) => [...row]);\n next[r][c] = v;\n onChange(next);\n };\n\n const focusCell = (r: number, c: number) => {\n inputRefs.current[r]?.[c]?.focus();\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, r: number, c: number) => {\n if (e.key === \"Enter\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n focusCell(Math.min(r + 1, rows.length - 1), c);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n focusCell(Math.max(r - 1, 0), c);\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent, r: number, c: number) => {\n const text = e.clipboardData.getData(\"text/plain\");\n const next = applyDelimited({\n text,\n fields,\n rowLabels: rows.map((row) => row.label),\n current: values,\n anchorRow: r,\n anchorCol: c,\n });\n if (next) {\n e.preventDefault();\n onChange(next);\n }\n // null → plain value; let the browser paste into the cell normally\n };\n\n const cellInputStyle: React.CSSProperties = {\n width: \"100%\",\n minWidth: \"110px\",\n padding: \"5px 7px\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontFamily: \"inherit\",\n boxSizing: \"border-box\",\n outline: \"none\",\n };\n\n const thStyle: React.CSSProperties = {\n textAlign: \"left\",\n fontSize: \"11px\",\n fontWeight: 600,\n color: \"#666\",\n padding: \"4px 6px\",\n whiteSpace: \"nowrap\",\n };\n\n return (\n <div style={{ overflowX: \"auto\" }}>\n <table\n role=\"grid\"\n aria-label=\"Image metadata\"\n style={{ borderCollapse: \"separate\", borderSpacing: \"4px\", width: \"100%\" }}\n >\n <thead>\n <tr>\n <th style={thStyle} scope=\"col\">\n File\n </th>\n {fields.map((f) => (\n <th key={f.name} style={thStyle} scope=\"col\">\n {f.label}\n {f.required ? \" *\" : \"\"}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, r) => (\n <tr key={row.key}>\n <th\n scope=\"row\"\n style={{\n ...thStyle,\n fontWeight: 500,\n color: \"#444\",\n maxWidth: \"180px\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\" }}>\n {row.thumbnailUrl && (\n <img\n src={row.thumbnailUrl}\n alt=\"\"\n style={{\n width: \"32px\",\n height: \"32px\",\n objectFit: \"cover\",\n borderRadius: \"4px\",\n flexShrink: 0,\n }}\n />\n )}\n <div style={{ overflow: \"hidden\" }}>\n <span\n title={row.label}\n style={{\n display: \"block\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: \"140px\",\n }}\n >\n {row.label}\n </span>\n {row.status && (\n <span\n style={{\n display: \"block\",\n fontSize: \"11px\",\n fontWeight: 400,\n color: row.status.isError ? \"#c0392b\" : \"#888\",\n }}\n >\n {row.status.text}\n </span>\n )}\n </div>\n </div>\n </th>\n {fields.map((f, c) => (\n <td key={f.name} style={{ padding: 0 }}>\n <input\n ref={(el) => {\n inputRefs.current[r][c] = el;\n }}\n type=\"text\"\n value={values[r]?.[c] ?? \"\"}\n disabled={disabled}\n aria-label={`${f.label} for ${row.label}`}\n onChange={(e) => setCell(r, c, e.target.value)}\n onKeyDown={(e) => handleKeyDown(e, r, c)}\n onPaste={(e) => handlePaste(e, r, c)}\n style={{ ...cellInputStyle, opacity: disabled ? 0.6 : 1 }}\n />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","// Delimited-text (TSV/CSV) paste support for the upload metadata grid.\n// Pure functions — all grid-fill decisions live here so they are unit-testable.\nimport type { MetadataFieldDef } from \"./types\";\n\n/** RFC-4180-ish parse: quoted fields, \"\" escapes, CRLF/LF rows. */\nfunction parseWithDelimiter(text: string, delim: string): string[][] {\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = \"\";\n let inQuotes = false;\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"';\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n cell += ch;\n }\n } else if (ch === '\"' && cell === \"\") {\n inQuotes = true;\n } else if (ch === delim) {\n row.push(cell);\n cell = \"\";\n } else if (ch === \"\\n\" || ch === \"\\r\") {\n if (ch === \"\\r\" && text[i + 1] === \"\\n\") i++;\n row.push(cell);\n cell = \"\";\n rows.push(row);\n row = [];\n } else {\n cell += ch;\n }\n }\n if (cell !== \"\" || row.length > 0) {\n row.push(cell);\n rows.push(row);\n }\n // Trailing newline artifacts\n while (rows.length > 0 && rows[rows.length - 1].every((c) => c === \"\")) rows.pop();\n return rows;\n}\n\n/**\n * Parses clipboard text as TSV when it contains any tab (what spreadsheets\n * put on the clipboard), CSV otherwise.\n */\nexport function parseDelimited(text: string): string[][] {\n if (!text) return [];\n return parseWithDelimiter(text, text.includes(\"\\t\") ? \"\\t\" : \",\");\n}\n\nfunction norm(s: string): string {\n return s.trim().toLowerCase();\n}\n\nconst FILENAME_HEADERS = new Set([\"filename\", \"file\", \"name\"]);\n\n/**\n * A header row is one whose every non-empty cell names a schema field (by\n * `name` or `label`, case-insensitive) or a filename column. Returns the\n * column mapping (field index per column, -1 = ignore, \"filename\" for the\n * match column), or null when the row is not a header.\n */\nexport function detectHeader(\n row: string[],\n fields: MetadataFieldDef[],\n): (number | \"filename\")[] | null {\n let matched = 0;\n const mapping: (number | \"filename\")[] = row.map(() => -1);\n for (let c = 0; c < row.length; c++) {\n const cell = norm(row[c]);\n if (cell === \"\") continue;\n if (FILENAME_HEADERS.has(cell)) {\n mapping[c] = \"filename\";\n matched++;\n continue;\n }\n const idx = fields.findIndex((f) => norm(f.name) === cell || norm(f.label) === cell);\n if (idx === -1) return null; // a non-empty cell that isn't a known column\n mapping[c] = idx;\n matched++;\n }\n return matched > 0 ? mapping : null;\n}\n\nexport interface ApplyDelimitedOptions {\n /** Raw clipboard text. */\n text: string;\n /** Grid columns, in display order. */\n fields: MetadataFieldDef[];\n /** One label (filename) per grid row, for header-mode row matching. */\n rowLabels: string[];\n /** Current grid values, `rowLabels.length` x `fields.length`. */\n current: string[][];\n /** Cell the paste landed on. */\n anchorRow: number;\n anchorCol: number;\n}\n\n/**\n * Applies pasted delimited text to the grid, returning the next values or\n * `null` when the text is not grid-shaped (a plain single value — the caller\n * should let the browser's default paste happen).\n *\n * - With a header row (cells matching field names/labels, optionally a\n * filename column): columns map by header; rows match by filename when that\n * column is present, else top-to-bottom from row 0. The anchor is ignored,\n * so a whole exported sheet can be pasted into any cell.\n * - Without a header: values fill right/down from the anchor cell,\n * spreadsheet-style, clamped to the grid.\n * - A single-line comma-containing string is treated as prose, not CSV; a\n * single line is only grid-shaped when tab-delimited.\n */\nexport function applyDelimited(opts: ApplyDelimitedOptions): string[][] | null {\n const { text, fields, rowLabels, current, anchorRow, anchorCol } = opts;\n const parsed = parseDelimited(text);\n if (parsed.length === 0) return null;\n const multiCell =\n parsed.length > 1 || (parsed[0].length > 1 && text.includes(\"\\t\"));\n if (!multiCell) return null;\n\n const next = current.map((r) => [...r]);\n\n const header = detectHeader(parsed[0], fields);\n if (header && parsed.length > 1) {\n const dataRows = parsed.slice(1);\n const filenameCol = header.indexOf(\"filename\");\n for (let i = 0; i < dataRows.length; i++) {\n let targetRow: number;\n if (filenameCol !== -1) {\n const wanted = norm(dataRows[i][filenameCol] ?? \"\");\n targetRow = rowLabels.findIndex((l) => norm(l) === wanted);\n if (targetRow === -1) continue; // no matching upload — skip the row\n } else {\n targetRow = i;\n if (targetRow >= next.length) break;\n }\n for (let c = 0; c < dataRows[i].length; c++) {\n const fieldIdx = header[c];\n if (typeof fieldIdx !== \"number\" || fieldIdx < 0) continue;\n next[targetRow][fieldIdx] = dataRows[i][c] ?? \"\";\n }\n }\n return next;\n }\n\n // Anchor-relative fill, clamped to the grid.\n for (let r = 0; r < parsed.length; r++) {\n const targetRow = anchorRow + r;\n if (targetRow >= next.length) break;\n for (let c = 0; c < parsed[r].length; c++) {\n const targetCol = anchorCol + c;\n if (targetCol >= fields.length) break;\n next[targetRow][targetCol] = parsed[r][c];\n }\n }\n return next;\n}\n","import type { CSSProperties } from \"react\";\n\n// Shared inline styles for the library's upload-details and edit panels.\n\nexport function primaryBtnStyle(uploading: boolean): CSSProperties {\n return {\n padding: \"8px 16px\",\n backgroundColor: \"#2563eb\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: uploading ? \"not-allowed\" : \"pointer\",\n opacity: uploading ? 0.6 : 1,\n fontFamily: \"inherit\",\n };\n}\n\nexport function secondaryBtnStyle(uploading: boolean): CSSProperties {\n return {\n padding: \"8px 16px\",\n backgroundColor: \"white\",\n color: \"#666\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"6px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: uploading ? \"not-allowed\" : \"pointer\",\n fontFamily: \"inherit\",\n };\n}\n\nexport const panelErrorStyle: CSSProperties = {\n color: \"#b91c1c\",\n fontSize: \"12px\",\n marginTop: \"8px\",\n};\n\nexport const panelHeadingStyle: CSSProperties = {\n fontSize: \"15px\",\n fontWeight: 600,\n color: \"#333\",\n marginBottom: \"4px\",\n};\n\nexport const panelButtonRowStyle: CSSProperties = {\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n marginTop: \"16px\",\n};\n","\"use client\";\n\nimport type { MetadataFieldDef } from \"../types\";\nimport { MetadataGrid } from \"./metadata-grid\";\nimport { panelErrorStyle, panelHeadingStyle, panelButtonRowStyle, primaryBtnStyle, secondaryBtnStyle } from \"./media-panel-styles\";\nimport type { RowStatus } from \"./upload-flow\";\n\nconst STEP_LABEL: Record<RowStatus[\"step\"], string | null> = {\n staged: null,\n presigning: \"Preparing…\",\n uploading: \"Uploading…\",\n finalizing: \"Finalizing…\",\n done: \"Done\",\n failed: null, // uses the row's own error message instead\n};\n\nfunction statusBadge(status: RowStatus | undefined): { text: string; isError?: boolean } | undefined {\n if (!status) return undefined;\n if (status.step === \"failed\") return { text: status.error ?? \"Failed\", isError: true };\n const text = STEP_LABEL[status.step];\n return text ? { text } : undefined;\n}\n\n/** Staged-file metadata grid shown after files are chosen/dropped, before POSTing. */\nexport function MediaUploadPanel(props: {\n schema: MetadataFieldDef[];\n pending: { file: File; previewUrl: string }[];\n pendingValues: string[][];\n onValuesChange: (values: string[][]) => void;\n pendingStatus: RowStatus[];\n uploading: boolean;\n panelError: string | null;\n onCancel: () => void;\n onUpload: () => void;\n}) {\n const { schema, pending, pendingValues, onValuesChange, pendingStatus, uploading, panelError, onCancel, onUpload } =\n props;\n\n return (\n <div>\n <div style={panelHeadingStyle}>\n Add details for {pending.length} {pending.length === 1 ? \"image\" : \"images\"}\n </div>\n <div style={{ fontSize: \"12px\", color: \"#888\", marginBottom: \"12px\" }}>\n Tab, Enter and the arrow keys move between cells. Paste TSV or CSV from a\n spreadsheet to fill many rows at once — include a header row (alt, caption,\n …) plus an optional filename column to map values automatically.\n </div>\n <MetadataGrid\n fields={schema}\n rows={pending.map((p, i) => ({\n key: i + \"-\" + p.file.name,\n label: p.file.name,\n thumbnailUrl: p.previewUrl,\n status: statusBadge(pendingStatus[i]),\n }))}\n values={pendingValues}\n onChange={onValuesChange}\n disabled={uploading}\n autoFocus\n />\n {panelError && <div style={panelErrorStyle}>{panelError}</div>}\n <div style={panelButtonRowStyle}>\n <button type=\"button\" onClick={onCancel} disabled={uploading} style={secondaryBtnStyle(uploading)}>\n Cancel\n </button>\n <button type=\"button\" onClick={onUpload} disabled={uploading} style={primaryBtnStyle(uploading)}>\n {uploading ? \"Uploading…\" : `Upload ${pending.length} ${pending.length === 1 ? \"image\" : \"images\"}`}\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport type { RefObject } from \"react\";\nimport type { MetadataFieldDef } from \"../types\";\nimport { MetadataGrid } from \"./metadata-grid\";\nimport { panelErrorStyle, panelHeadingStyle, panelButtonRowStyle, primaryBtnStyle, secondaryBtnStyle } from \"./media-panel-styles\";\nimport type { MediaItem } from \"./media-item\";\n\n/** Metadata-editing panel for an existing library item, with a Replace-image action. */\nexport function MediaEditPanel(props: {\n editing: MediaItem;\n editFields: MetadataFieldDef[];\n editValues: string[][];\n onValuesChange: (values: string[][]) => void;\n uploading: boolean;\n panelError: string | null;\n onCancel: () => void;\n onSave: () => void;\n onReplaceImage: (file: File | undefined) => void;\n replaceInputRef: RefObject<HTMLInputElement | null>;\n}) {\n const {\n editing,\n editFields,\n editValues,\n onValuesChange,\n uploading,\n panelError,\n onCancel,\n onSave,\n onReplaceImage,\n replaceInputRef,\n } = props;\n\n return (\n <div>\n <div style={{ ...panelHeadingStyle, marginBottom: \"12px\" }}>Edit details — {editing.filename}</div>\n <MetadataGrid\n fields={editFields}\n rows={[\n {\n key: editing.assetId ?? editing.url,\n label: editing.filename,\n thumbnailUrl: editing.url,\n },\n ]}\n values={editValues}\n onChange={onValuesChange}\n disabled={uploading}\n autoFocus\n />\n {panelError && <div style={panelErrorStyle}>{panelError}</div>}\n <div style={panelButtonRowStyle}>\n <input\n ref={replaceInputRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: \"none\" }}\n onChange={(e) => onReplaceImage(e.target.files?.[0])}\n />\n <button\n type=\"button\"\n onClick={() => replaceInputRef.current?.click()}\n disabled={uploading}\n title=\"Upload a new image as a new version of this asset\"\n style={{ ...secondaryBtnStyle(uploading), marginRight: \"auto\" }}\n >\n Replace image…\n </button>\n <button type=\"button\" onClick={onCancel} disabled={uploading} style={secondaryBtnStyle(uploading)}>\n Cancel\n </button>\n <button type=\"button\" onClick={onSave} disabled={uploading} style={primaryBtnStyle(uploading)}>\n {uploading ? \"Saving…\" : \"Save details\"}\n </button>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type RefObject } from \"react\";\nimport type { MediaItem } from \"./media-item\";\n\n// Tiles are revealed in batches as a sentinel scrolls into view, so a large\n// library doesn't render everything at once (tile images also load lazily).\nconst TILE_BATCH = 60;\n\n/** Searchable, keyboard-navigable grid of existing library items. */\nexport function MediaGrid(props: {\n media: MediaItem[];\n loading: boolean;\n searchQuery: string;\n onSearchChange: (value: string) => void;\n onSelectItem: (item: MediaItem) => void;\n onStartEdit: (item: MediaItem) => void;\n onDeleteItem: (item: MediaItem) => void;\n scrollRef: RefObject<HTMLDivElement | null>;\n // Owned by the parent (not this component) so a temporary switch to the\n // upload/edit panel and back — which unmounts/remounts this grid — doesn't\n // reset which tile was focused. The parent resets it to 0 on each fetch.\n focusIdx: number;\n onFocusIdxChange: (idx: number) => void;\n}) {\n const {\n media,\n loading,\n searchQuery,\n onSearchChange,\n onSelectItem,\n onStartEdit,\n onDeleteItem,\n scrollRef,\n focusIdx,\n onFocusIdxChange,\n } = props;\n\n const [visibleCount, setVisibleCount] = useState(TILE_BATCH);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n const tileRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n // A fresh fetch (new search or initial load) always starts back at the top.\n useEffect(() => {\n setVisibleCount(TILE_BATCH);\n }, [media]);\n\n // Reveal the next tile batch when the sentinel enters the scroll viewport.\n useEffect(() => {\n const sentinel = sentinelRef.current;\n if (!sentinel || typeof IntersectionObserver === \"undefined\") return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setVisibleCount((count) => count + TILE_BATCH);\n }\n },\n { root: scrollRef.current, rootMargin: \"200px\" },\n );\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [media.length, visibleCount, scrollRef]);\n\n // Grid columns are responsive (auto-fill); count the tiles sharing the\n // first tile's offsetTop instead of assuming a fixed column count.\n const computeColumns = (): number => {\n const tiles = tileRefs.current.filter((t): t is HTMLDivElement => t !== null);\n if (tiles.length <= 1) return 1;\n const firstTop = tiles[0].offsetTop;\n let columns = 0;\n for (const tile of tiles) {\n if (tile.offsetTop !== firstTop) break;\n columns++;\n }\n return Math.max(1, columns);\n };\n\n const focusTile = (index: number) => {\n onFocusIdxChange(index);\n tileRefs.current[index]?.focus();\n };\n\n const handleTileKeyDown = (e: React.KeyboardEvent, index: number, item: MediaItem) => {\n const rendered = Math.min(media.length, visibleCount);\n const columns = computeColumns();\n let next: number | null = null;\n switch (e.key) {\n case \"ArrowRight\":\n next = Math.min(index + 1, rendered - 1);\n break;\n case \"ArrowLeft\":\n next = Math.max(index - 1, 0);\n break;\n case \"ArrowDown\":\n next = Math.min(index + columns, rendered - 1);\n break;\n case \"ArrowUp\":\n next = Math.max(index - columns, 0);\n break;\n case \"Home\":\n next = 0;\n break;\n case \"End\":\n next = rendered - 1;\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n onSelectItem(item);\n return;\n case \"e\":\n case \"E\":\n if (item.assetId) {\n e.preventDefault();\n onStartEdit(item);\n }\n return;\n case \"Delete\":\n case \"Backspace\":\n if (item.assetId) {\n e.preventDefault();\n setConfirmDeleteId(item.assetId);\n }\n return;\n case \"Escape\":\n if (confirmDeleteId) {\n e.preventDefault();\n setConfirmDeleteId(null);\n }\n return;\n default:\n return;\n }\n e.preventDefault();\n focusTile(next);\n };\n\n return (\n <>\n {/* Search */}\n <input\n type=\"text\"\n placeholder=\"Search by filename or metadata...\"\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"10px 12px\",\n border: \"1px solid #e0e0e0\",\n borderRadius: \"6px\",\n fontSize: \"14px\",\n fontFamily: \"inherit\",\n outline: \"none\",\n boxSizing: \"border-box\",\n marginBottom: \"16px\",\n }}\n />\n\n {/* Grid */}\n {loading ? (\n <div style={{ textAlign: \"center\", padding: \"40px\", color: \"#999\", fontSize: \"14px\" }}>Loading...</div>\n ) : media.length === 0 ? (\n <div style={{ textAlign: \"center\", padding: \"40px\", color: \"#999\", fontSize: \"14px\" }}>No media found</div>\n ) : (\n <div\n role=\"listbox\"\n aria-label=\"Media items — arrow keys to navigate, Enter to select, E to edit, Delete to remove\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(150px, 1fr))\",\n gap: \"12px\",\n }}\n >\n {media.slice(0, visibleCount).map((item, i) => (\n <div\n key={item.assetId ?? item.url}\n ref={(el) => {\n tileRefs.current[i] = el;\n }}\n role=\"option\"\n aria-selected={false}\n aria-label={item.filename}\n tabIndex={i === Math.min(focusIdx, Math.min(media.length, visibleCount) - 1) ? 0 : -1}\n style={{\n position: \"relative\",\n cursor: \"pointer\",\n border: \"2px solid transparent\",\n borderRadius: \"8px\",\n overflow: \"hidden\",\n transition: \"border-color 0.15s\",\n backgroundColor: \"#f9f9f9\",\n outline: \"none\",\n }}\n onClick={() => onSelectItem(item)}\n onKeyDown={(e) => handleTileKeyDown(e, i, item)}\n onFocus={(e) => {\n onFocusIdxChange(i);\n e.currentTarget.style.borderColor = \"#2563eb\";\n e.currentTarget.style.boxShadow = \"0 0 0 2px rgba(37, 99, 235, 0.35)\";\n }}\n onBlur={(e) => {\n e.currentTarget.style.borderColor = \"transparent\";\n e.currentTarget.style.boxShadow = \"none\";\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = \"#2563eb\";\n e.currentTarget\n .querySelectorAll<HTMLElement>(\"[data-delete-btn], [data-edit-btn]\")\n .forEach((btn) => (btn.style.opacity = \"1\"));\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = \"transparent\";\n e.currentTarget\n .querySelectorAll<HTMLElement>(\"[data-delete-btn], [data-edit-btn]\")\n .forEach((btn) => (btn.style.opacity = \"0.6\"));\n }}\n >\n {item.assetId && (\n <button\n data-edit-btn\n title=\"Edit details\"\n aria-label={`Edit details for ${item.filename}`}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n onStartEdit(item);\n }}\n style={{\n position: \"absolute\",\n top: \"4px\",\n right: \"32px\",\n zIndex: 1,\n width: \"24px\",\n height: \"24px\",\n padding: 0,\n border: \"none\",\n borderRadius: \"4px\",\n backgroundColor: \"rgba(0, 0, 0, 0.55)\",\n color: \"white\",\n fontSize: \"12px\",\n lineHeight: \"24px\",\n textAlign: \"center\",\n cursor: \"pointer\",\n opacity: 0.6,\n transition: \"opacity 0.15s\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n ✎\n </button>\n )}\n {item.assetId && (\n <button\n data-delete-btn\n title=\"Delete image\"\n aria-label={`Delete ${item.filename}`}\n tabIndex={-1}\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(item.assetId ?? null);\n }}\n style={{\n position: \"absolute\",\n top: \"4px\",\n right: \"4px\",\n zIndex: 1,\n width: \"24px\",\n height: \"24px\",\n padding: 0,\n border: \"none\",\n borderRadius: \"4px\",\n backgroundColor: \"rgba(0, 0, 0, 0.55)\",\n color: \"white\",\n fontSize: \"14px\",\n lineHeight: \"24px\",\n textAlign: \"center\",\n cursor: \"pointer\",\n opacity: 0.6,\n transition: \"opacity 0.15s, background-color 0.15s\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = \"1\";\n e.currentTarget.style.backgroundColor = \"rgba(220, 38, 38, 0.9)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = \"rgba(0, 0, 0, 0.55)\";\n }}\n >\n ×\n </button>\n )}\n <img\n src={item.url}\n alt={item.filename}\n loading=\"lazy\"\n decoding=\"async\"\n style={{ width: \"100%\", height: \"120px\", objectFit: \"cover\", display: \"block\" }}\n />\n {item.assetId && confirmDeleteId === item.assetId && (\n <div\n role=\"alertdialog\"\n aria-label={`Delete ${item.filename}?`}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n // Keep tile-level navigation from hijacking the dialog\n e.stopPropagation();\n if (e.key === \"Escape\") {\n setConfirmDeleteId(null);\n tileRefs.current[i]?.focus();\n }\n }}\n style={{\n position: \"absolute\",\n inset: 0,\n zIndex: 2,\n backgroundColor: \"rgba(0, 0, 0, 0.72)\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n padding: \"8px\",\n }}\n >\n <div style={{ color: \"white\", fontSize: \"12px\", fontWeight: 600, textAlign: \"center\" }}>\n Delete this image?\n </div>\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <button\n type=\"button\"\n autoFocus\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(null);\n onDeleteItem(item);\n }}\n style={{\n padding: \"4px 10px\",\n backgroundColor: \"#dc2626\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Delete\n </button>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n setConfirmDeleteId(null);\n tileRefs.current[i]?.focus();\n }}\n style={{\n padding: \"4px 10px\",\n backgroundColor: \"white\",\n color: \"#444\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"12px\",\n fontWeight: 600,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n <div\n style={{\n padding: \"6px 8px\",\n fontSize: \"11px\",\n color: \"#555\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n title={item.filename}\n >\n {item.filename}\n </div>\n </div>\n ))}\n </div>\n )}\n {media.length > visibleCount && <div ref={sentinelRef} aria-hidden=\"true\" style={{ height: \"1px\" }} />}\n </>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactElement } from \"react\";\nimport { getBaseUrl, getCropMode, getTrimRect, type CropMode, type TrimRect } from \"../crop\";\nimport {\n isMediaValue,\n applyCropToValue,\n applyTrimToValue,\n setMetaOnValue,\n buildValueFromAsset,\n} from \"../media-value\";\nimport type { MediaFieldValue } from \"../types\";\nimport { MediaLibrary, type MediaItem } from \"./media-library\";\nimport { CropDialog } from \"./crop-dialog\";\nimport { useMediaSchema, orderAltFirst } from \"./use-media-schema\";\n\n/**\n * Object-aware editor UI for the `p1-media` field: image preview + crop\n * controls + schema-driven metadata inputs. Distinct from the basic (string)\n * field — crop params live inside `value.url` and the value is an object.\n */\nexport function MediaObjectFieldRender(props: {\n label: string;\n name: string;\n id: string;\n value: MediaFieldValue;\n onChange: (value: MediaFieldValue) => void;\n readOnly?: boolean;\n}): ReactElement {\n const { value, onChange, readOnly } = props;\n const [isLibraryOpen, setIsLibraryOpen] = useState(false);\n const [isCropOpen, setIsCropOpen] = useState(false);\n const schema = orderAltFirst(useMediaSchema());\n\n const isObject = isMediaValue(value);\n const urlString = isObject ? value.url : typeof value === \"string\" ? value : \"\";\n const baseUrl = getBaseUrl(urlString);\n const cropMode = getCropMode(urlString);\n\n // All write paths route through pure helpers in media-value.ts, which\n // hold the R10 invariant (never a partial-identity object) and identity-key\n // guards; the component only wires them to onChange.\n const handleCropChange = (crop: CropMode) => {\n if (!baseUrl) return;\n onChange(applyCropToValue(value, crop));\n };\n\n const handleApplyTrim = (rect: TrimRect) => {\n onChange(applyTrimToValue(value, rect));\n setIsCropOpen(false);\n };\n\n const handleMetaChange = (fieldName: string, fieldValue: string) => {\n onChange(setMetaOnValue(value, fieldName, fieldValue));\n };\n\n const handleSelectItem = (item: MediaItem) => {\n onChange(buildValueFromAsset(item, cropMode));\n setIsLibraryOpen(false);\n };\n\n const buttonBase: React.CSSProperties = {\n padding: \"3px 10px\",\n fontSize: \"12px\",\n fontWeight: 500,\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n fontFamily: \"inherit\",\n };\n\n const inputStyle: React.CSSProperties = {\n width: \"100%\",\n padding: \"6px 8px\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontFamily: \"inherit\",\n boxSizing: \"border-box\",\n outline: \"none\",\n };\n\n return (\n <div style={{ width: \"100%\" }}>\n {baseUrl ? (\n <div style={{ marginBottom: \"8px\" }}>\n <img\n src={urlString}\n alt=\"Preview\"\n style={{\n width: \"100%\",\n maxHeight: \"120px\",\n objectFit: \"cover\",\n borderRadius: \"6px\",\n display: \"block\",\n border: \"1px solid #e0e0e0\",\n }}\n />\n </div>\n ) : (\n <div\n style={{\n height: \"80px\",\n border: \"2px dashed #d0d0d0\",\n borderRadius: \"6px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n marginBottom: \"8px\",\n color: \"#999\",\n fontSize: \"13px\",\n cursor: readOnly ? \"default\" : \"pointer\",\n }}\n onClick={() => !readOnly && setIsLibraryOpen(true)}\n >\n Click to select image\n </div>\n )}\n\n {baseUrl && (\n <div style={{ marginBottom: \"8px\" }}>\n <div style={{ fontSize: \"11px\", color: \"#666\", fontWeight: 500, marginBottom: \"4px\" }}>\n Crop\n </div>\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => handleCropChange(\"fit\")}\n style={{\n ...buttonBase,\n backgroundColor: cropMode === \"fit\" ? \"#2563eb\" : \"white\",\n color: cropMode === \"fit\" ? \"white\" : \"#444\",\n borderColor: cropMode === \"fit\" ? \"#2563eb\" : \"#d0d0d0\",\n opacity: readOnly ? 0.5 : 1,\n }}\n >\n Fit in\n </button>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => handleCropChange(\"smart\")}\n style={{\n ...buttonBase,\n backgroundColor: cropMode === \"smart\" ? \"#2563eb\" : \"white\",\n color: cropMode === \"smart\" ? \"white\" : \"#444\",\n borderColor: cropMode === \"smart\" ? \"#2563eb\" : \"#d0d0d0\",\n opacity: readOnly ? 0.5 : 1,\n }}\n >\n Smart crop\n </button>\n <button\n type=\"button\"\n disabled={readOnly}\n onClick={() => setIsCropOpen(true)}\n style={{\n ...buttonBase,\n backgroundColor: cropMode === \"custom\" ? \"#2563eb\" : \"white\",\n color: cropMode === \"custom\" ? \"white\" : \"#444\",\n borderColor: cropMode === \"custom\" ? \"#2563eb\" : \"#d0d0d0\",\n opacity: readOnly ? 0.5 : 1,\n }}\n >\n Custom…\n </button>\n </div>\n </div>\n )}\n\n {baseUrl && (\n <div style={{ marginBottom: \"8px\" }}>\n {!isObject && (\n <div style={{ fontSize: \"11px\", color: \"#a15c00\", marginBottom: \"6px\" }}>\n Select from the library to add metadata.\n </div>\n )}\n {schema.map((f) => {\n const current =\n isObject && typeof value[f.name] === \"string\" ? (value[f.name] as string) : \"\";\n return (\n <div key={f.name} style={{ marginBottom: \"8px\" }}>\n <div\n style={{\n fontSize: \"11px\",\n color: \"#666\",\n fontWeight: 500,\n marginBottom: \"4px\",\n }}\n >\n {f.label}\n {f.required ? \" *\" : \"\"}\n </div>\n <input\n type=\"text\"\n value={current}\n disabled={readOnly || !isObject}\n placeholder={!isObject ? \"Re-select image to edit\" : \"\"}\n onChange={(e) => handleMetaChange(f.name, e.target.value)}\n style={{ ...inputStyle, opacity: readOnly || !isObject ? 0.6 : 1 }}\n />\n </div>\n );\n })}\n </div>\n )}\n\n <div style={{ display: \"flex\", gap: \"6px\" }}>\n <button\n type=\"button\"\n onClick={() => setIsLibraryOpen(true)}\n disabled={readOnly}\n style={{\n flex: 1,\n padding: \"6px 12px\",\n backgroundColor: \"#2563eb\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n opacity: readOnly ? 0.5 : 1,\n fontFamily: \"inherit\",\n }}\n >\n Choose from Library\n </button>\n\n {baseUrl && (\n <button\n type=\"button\"\n onClick={() => onChange(\"\")}\n disabled={readOnly}\n style={{\n padding: \"6px 12px\",\n backgroundColor: \"white\",\n color: \"#666\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: readOnly ? \"not-allowed\" : \"pointer\",\n opacity: readOnly ? 0.5 : 1,\n fontFamily: \"inherit\",\n }}\n >\n Clear\n </button>\n )}\n </div>\n\n <MediaLibrary\n isOpen={isLibraryOpen}\n onClose={() => setIsLibraryOpen(false)}\n onSelect={() => {}}\n onSelectItem={handleSelectItem}\n />\n\n <CropDialog\n isOpen={isCropOpen}\n imageUrl={baseUrl}\n initialTrim={getTrimRect(urlString)}\n onApply={handleApplyTrim}\n onClose={() => setIsCropOpen(false)}\n />\n </div>\n );\n}\n","import type { MediaFieldValue, MediaValue } from \"./types\";\nimport {\n buildValueWithCrop,\n buildValueWithTrim,\n getBaseUrl,\n type CropMode,\n type TrimRect,\n} from \"./crop\";\n\n/**\n * Structural keys on a MediaValue that are not schema-driven metadata. Used to\n * avoid clobbering identity fields when copying metadata defaults into a value.\n */\nexport const STRUCTURAL_MEDIA_KEYS = new Set([\n \"assetId\",\n \"versionId\",\n \"url\",\n \"metaSchemaVersion\",\n]);\n\n/** Narrows a MediaFieldValue to the rich object form. */\nexport function isMediaValue(\n value: MediaFieldValue | null | undefined,\n): value is MediaValue {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * Builds the value the `p1-media` field writes on asset selection.\n *\n * R10 invariant: never synthesize a MediaValue unless BOTH `assetId` and\n * `versionId` are present — otherwise fall back to a bare URL string (basic\n * mode). A value with undefined identity is unfindable by \"update usages\" and\n * can render `src=undefined`, so this fallback is load-bearing, not cosmetic.\n * It also means picking from a pre-upgrade Worker (bare-array `GET /media`, no\n * assetId) yields a string, so the plugin degrades cleanly before the cutover.\n */\nexport function makeMediaValue(input: {\n assetId?: string | null;\n versionId?: string | null;\n url: string;\n metaSchemaVersion?: number;\n metadata?: Record<string, string | number | undefined>;\n}): MediaFieldValue {\n if (!input.assetId || !input.versionId) {\n return input.url; // R10 fallback: string value\n }\n const value: MediaValue = {\n assetId: input.assetId,\n versionId: input.versionId,\n url: input.url,\n };\n if (typeof input.metaSchemaVersion === \"number\") {\n value.metaSchemaVersion = input.metaSchemaVersion;\n }\n if (input.metadata) {\n for (const [k, v] of Object.entries(input.metadata)) {\n if (v === undefined || v === \"\") continue;\n if (STRUCTURAL_MEDIA_KEYS.has(k)) continue; // never let metadata clobber identity\n value[k] = v;\n }\n }\n return value;\n}\n\n/** The asset fields the field editor needs to build a value on selection. */\nexport interface SelectableAsset {\n assetId?: string | null;\n versionId?: string | null;\n url: string;\n width?: number;\n height?: number;\n metadata?: Record<string, string>;\n metaSchemaVersion?: number;\n}\n\n/**\n * Builds the value written when an asset is picked from the library, applying\n * the current crop and copying metadata (flat, incl. alt) plus captured\n * dimensions. Delegates to makeMediaValue, so R10 still holds (a pre-cutover\n * asset with no identity yields a string).\n */\nexport function buildValueFromAsset(\n asset: SelectableAsset,\n crop: CropMode,\n): MediaFieldValue {\n const metadata: Record<string, string | number | undefined> = { ...(asset.metadata ?? {}) };\n if (typeof asset.width === \"number\") metadata.width = asset.width;\n if (typeof asset.height === \"number\") metadata.height = asset.height;\n return makeMediaValue({\n assetId: asset.assetId,\n versionId: asset.versionId,\n url: buildValueWithCrop(getBaseUrl(asset.url), crop),\n metaSchemaVersion: asset.metaSchemaVersion,\n metadata,\n });\n}\n\n/**\n * Applies a crop mode to a field value. R10: a string stays a string (basic\n * mode) — crop never promotes a value to a partial-identity object.\n */\nexport function applyCropToValue(\n value: MediaFieldValue,\n crop: CropMode,\n): MediaFieldValue {\n const currentUrl = isMediaValue(value) ? value.url : value;\n const baseUrl = getBaseUrl(typeof currentUrl === \"string\" ? currentUrl : \"\");\n if (!baseUrl) return value;\n const url = buildValueWithCrop(baseUrl, crop);\n return isMediaValue(value) ? { ...value, url } : url;\n}\n\n/**\n * Applies a manual crop region (the interactive cropper's result) to a field\n * value. Same R10 shape as applyCropToValue: a string stays a string, an\n * object keeps its identity and only swaps `url`.\n */\nexport function applyTrimToValue(\n value: MediaFieldValue,\n rect: TrimRect,\n): MediaFieldValue {\n const currentUrl = isMediaValue(value) ? value.url : value;\n const baseUrl = getBaseUrl(typeof currentUrl === \"string\" ? currentUrl : \"\");\n if (!baseUrl) return value;\n const url = buildValueWithTrim(baseUrl, rect);\n return isMediaValue(value) ? { ...value, url } : url;\n}\n\n/**\n * Sets one metadata field on a value. R10: refuses to operate on a string\n * (returns it unchanged — metadata can't be attached until an asset is picked)\n * and never lets a structural key clobber the pinned identity.\n */\nexport function setMetaOnValue(\n value: MediaFieldValue,\n fieldName: string,\n fieldValue: string,\n): MediaFieldValue {\n if (!isMediaValue(value)) return value;\n if (STRUCTURAL_MEDIA_KEYS.has(fieldName)) return value;\n return { ...value, [fieldName]: fieldValue };\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState, type ReactElement, type SyntheticEvent } from \"react\";\nimport ReactCrop, { centerCrop, makeAspectCrop, type PercentCrop } from \"react-image-crop\";\nimport \"react-image-crop/dist/ReactCrop.css\";\nimport type { TrimRect } from \"../crop\";\n\n/** Fixed presets plus freeform — the \"fixed and flexible aspect ratios\" surface. */\nconst ASPECT_PRESETS: { label: string; value: number | undefined }[] = [\n { label: \"Free\", value: undefined },\n { label: \"1:1\", value: 1 },\n { label: \"4:3\", value: 4 / 3 },\n { label: \"3:2\", value: 3 / 2 },\n { label: \"16:9\", value: 16 / 9 },\n];\n\nfunction centeredCrop(naturalWidth: number, naturalHeight: number, aspect?: number): PercentCrop {\n if (!aspect) {\n return { unit: \"%\", x: 10, y: 10, width: 80, height: 80 };\n }\n return centerCrop(\n makeAspectCrop({ unit: \"%\", width: 80 }, aspect, naturalWidth, naturalHeight),\n naturalWidth,\n naturalHeight,\n );\n}\n\n/** Converts an existing source-pixel trim back to a percent crop for editing. */\nfunction trimToPercentCrop(trim: TrimRect, naturalWidth: number, naturalHeight: number): PercentCrop {\n return {\n unit: \"%\",\n x: (trim.left / naturalWidth) * 100,\n y: (trim.top / naturalHeight) * 100,\n width: (trim.width / naturalWidth) * 100,\n height: (trim.height / naturalHeight) * 100,\n };\n}\n\n/**\n * Interactive crop dialog for the rich `p1-media` field. The crop box is kept\n * as a percent crop (stable across preview resizing) and converted to\n * source-pixel `trim.*` values on apply — the stored value stays a plain URL.\n */\nexport function CropDialog(props: {\n isOpen: boolean;\n /** Bare CDN URL (no transform params) of the image being cropped. */\n imageUrl: string;\n /** Existing manual crop to restore as the starting selection, if any. */\n initialTrim: TrimRect | null;\n onApply: (rect: TrimRect) => void;\n onClose: () => void;\n}): ReactElement | null {\n const { isOpen, imageUrl, initialTrim, onApply, onClose } = props;\n const [crop, setCrop] = useState<PercentCrop | undefined>(undefined);\n const [aspect, setAspect] = useState<number | undefined>(undefined);\n // Apply is gated on this, not on `crop`: state from a previous open (or a\n // previous image) must never produce a trim for an image that hasn't loaded.\n const [imageLoaded, setImageLoaded] = useState(false);\n const naturalSize = useRef<{ width: number; height: number } | null>(null);\n\n useEffect(() => {\n if (isOpen) {\n setCrop(undefined);\n setAspect(undefined);\n setImageLoaded(false);\n naturalSize.current = null;\n }\n }, [isOpen, imageUrl]);\n\n if (!isOpen) return null;\n\n const handleImageLoad = (e: SyntheticEvent<HTMLImageElement>) => {\n const { naturalWidth, naturalHeight } = e.currentTarget;\n if (naturalWidth <= 0 || naturalHeight <= 0) return; // dimensionless source — keep Apply disabled\n naturalSize.current = { width: naturalWidth, height: naturalHeight };\n setImageLoaded(true);\n setCrop(\n initialTrim\n ? trimToPercentCrop(initialTrim, naturalWidth, naturalHeight)\n : centeredCrop(naturalWidth, naturalHeight, undefined),\n );\n };\n\n const handleAspectChange = (next: number | undefined) => {\n setAspect(next);\n const size = naturalSize.current;\n if (size) setCrop(centeredCrop(size.width, size.height, next));\n };\n\n const handleApply = () => {\n const size = naturalSize.current;\n if (!size || !imageLoaded || !crop || crop.width <= 0 || crop.height <= 0) return;\n // Clamp to the source bounds — the Worker passes trim.* to Cloudflare\n // Images unclamped, and an out-of-bounds rect fails the whole render.\n const left = Math.min(Math.max((crop.x / 100) * size.width, 0), size.width - 1);\n const top = Math.min(Math.max((crop.y / 100) * size.height, 0), size.height - 1);\n onApply({\n left,\n top,\n width: Math.min((crop.width / 100) * size.width, size.width - left),\n height: Math.min((crop.height / 100) * size.height, size.height - top),\n });\n };\n\n const chipStyle = (active: boolean): React.CSSProperties => ({\n padding: \"3px 10px\",\n fontSize: \"12px\",\n fontWeight: 500,\n border: \"1px solid \" + (active ? \"#2563eb\" : \"#d0d0d0\"),\n borderRadius: \"4px\",\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n backgroundColor: active ? \"#2563eb\" : \"white\",\n color: active ? \"white\" : \"#444\",\n });\n\n return (\n <div\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 99999,\n padding: \"20px\",\n }}\n onClick={onClose}\n >\n <div\n style={{\n backgroundColor: \"white\",\n borderRadius: \"12px\",\n boxShadow: \"0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04)\",\n maxWidth: \"720px\",\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"16px 20px\",\n borderBottom: \"1px solid #eee\",\n }}\n >\n <div style={{ fontSize: \"16px\", fontWeight: 600 }}>Crop image</div>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Close\"\n style={{\n border: \"none\",\n background: \"none\",\n fontSize: \"18px\",\n cursor: \"pointer\",\n color: \"#666\",\n lineHeight: 1,\n }}\n >\n ×\n </button>\n </div>\n\n <div style={{ padding: \"16px 20px\", display: \"flex\", gap: \"6px\", flexWrap: \"wrap\" }}>\n {ASPECT_PRESETS.map((preset) => (\n <button\n key={preset.label}\n type=\"button\"\n onClick={() => handleAspectChange(preset.value)}\n style={chipStyle(aspect === preset.value)}\n >\n {preset.label}\n </button>\n ))}\n </div>\n\n <div\n style={{\n padding: \"0 20px\",\n display: \"flex\",\n justifyContent: \"center\",\n overflow: \"auto\",\n maxHeight: \"55vh\",\n }}\n >\n <ReactCrop\n crop={crop}\n onChange={(_, percentCrop) => setCrop(percentCrop)}\n aspect={aspect}\n keepSelection\n >\n <img\n src={imageUrl}\n onLoad={handleImageLoad}\n onError={() => setImageLoaded(false)}\n alt=\"Image to crop\"\n style={{ maxWidth: \"100%\", maxHeight: \"55vh\", display: \"block\" }}\n />\n </ReactCrop>\n </div>\n\n <div\n style={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n gap: \"8px\",\n padding: \"16px 20px\",\n }}\n >\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n padding: \"6px 14px\",\n backgroundColor: \"white\",\n color: \"#666\",\n border: \"1px solid #d0d0d0\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleApply}\n disabled={!imageLoaded || !crop || crop.width <= 0 || crop.height <= 0}\n style={{\n padding: \"6px 14px\",\n backgroundColor: \"#2563eb\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"13px\",\n fontWeight: 500,\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n }}\n >\n Apply crop\n </button>\n </div>\n </div>\n </div>\n );\n}\n","import e, { PureComponent as t, createRef as n } from \"react\";\n//#region src/utils.ts\nvar r = {\n\tx: 0,\n\ty: 0,\n\twidth: 0,\n\theight: 0,\n\tunit: \"px\"\n}, i = (e, t, n) => Math.min(Math.max(e, t), n), a = (...e) => e.filter((e) => e && typeof e == \"string\").join(\" \"), o = (e, t) => e === t || e.width === t.width && e.height === t.height && e.x === t.x && e.y === t.y && e.unit === t.unit;\nfunction s(e, t, n, r) {\n\tlet i = u(e, n, r);\n\treturn e.width && (i.height = i.width / t), e.height && (i.width = i.height * t), i.y + i.height > r && (i.height = r - i.y, i.width = i.height * t), i.x + i.width > n && (i.width = n - i.x, i.height = i.width / t), e.unit === \"%\" ? l(i, n, r) : i;\n}\nfunction c(e, t, n) {\n\tlet r = u(e, t, n);\n\treturn r.x = (t - r.width) / 2, r.y = (n - r.height) / 2, e.unit === \"%\" ? l(r, t, n) : r;\n}\nfunction l(e, t, n) {\n\treturn e.unit === \"%\" ? {\n\t\t...r,\n\t\t...e,\n\t\tunit: \"%\"\n\t} : {\n\t\tunit: \"%\",\n\t\tx: e.x ? e.x / t * 100 : 0,\n\t\ty: e.y ? e.y / n * 100 : 0,\n\t\twidth: e.width ? e.width / t * 100 : 0,\n\t\theight: e.height ? e.height / n * 100 : 0\n\t};\n}\nfunction u(e, t, n) {\n\treturn !e.unit || e.unit === \"px\" ? {\n\t\t...r,\n\t\t...e,\n\t\tunit: \"px\"\n\t} : {\n\t\tunit: \"px\",\n\t\tx: e.x ? e.x * t / 100 : 0,\n\t\ty: e.y ? e.y * n / 100 : 0,\n\t\twidth: e.width ? e.width * t / 100 : 0,\n\t\theight: e.height ? e.height * n / 100 : 0\n\t};\n}\nfunction d(e, t, n, r, i, a = 0, o = 0, s = r, c = i) {\n\tlet l = { ...e }, u = Math.min(a, r), d = Math.min(o, i), f = Math.min(s, r), p = Math.min(c, i);\n\tt && (t > 1 ? (u = o ? o * t : u, d = u / t, f = s * t) : (d = a ? a / t : d, u = d * t, p = c / t)), l.y < 0 && (l.height = Math.max(l.height + l.y, d), l.y = 0), l.x < 0 && (l.width = Math.max(l.width + l.x, u), l.x = 0);\n\tlet m = r - (l.x + l.width);\n\tm < 0 && (l.x = Math.min(l.x, r - u), l.width += m);\n\tlet h = i - (l.y + l.height);\n\tif (h < 0 && (l.y = Math.min(l.y, i - d), l.height += h), l.width < u && ((n === \"sw\" || n == \"nw\") && (l.x -= u - l.width), l.width = u), l.height < d && ((n === \"nw\" || n == \"ne\") && (l.y -= d - l.height), l.height = d), l.width > f && ((n === \"sw\" || n == \"nw\") && (l.x -= f - l.width), l.width = f), l.height > p && ((n === \"nw\" || n == \"ne\") && (l.y -= p - l.height), l.height = p), t) {\n\t\tlet e = l.width / l.height;\n\t\tif (e < t) {\n\t\t\tlet e = Math.max(l.width / t, d);\n\t\t\t(n === \"nw\" || n == \"ne\") && (l.y -= e - l.height), l.height = e;\n\t\t} else if (e > t) {\n\t\t\tlet e = Math.max(l.height * t, u);\n\t\t\t(n === \"sw\" || n == \"nw\") && (l.x -= e - l.width), l.width = e;\n\t\t}\n\t}\n\treturn l;\n}\nfunction f(e, t, n, r) {\n\tlet i = { ...e };\n\treturn t === \"ArrowLeft\" ? r === \"nw\" ? (i.x -= n, i.y -= n, i.width += n, i.height += n) : r === \"w\" ? (i.x -= n, i.width += n) : r === \"sw\" ? (i.x -= n, i.width += n, i.height += n) : r === \"ne\" ? (i.y += n, i.width -= n, i.height -= n) : r === \"e\" ? i.width -= n : r === \"se\" && (i.width -= n, i.height -= n) : t === \"ArrowRight\" && (r === \"nw\" ? (i.x += n, i.y += n, i.width -= n, i.height -= n) : r === \"w\" ? (i.x += n, i.width -= n) : r === \"sw\" ? (i.x += n, i.width -= n, i.height -= n) : r === \"ne\" ? (i.y -= n, i.width += n, i.height += n) : r === \"e\" ? i.width += n : r === \"se\" && (i.width += n, i.height += n)), t === \"ArrowUp\" ? r === \"nw\" ? (i.x -= n, i.y -= n, i.width += n, i.height += n) : r === \"n\" ? (i.y -= n, i.height += n) : r === \"ne\" ? (i.y -= n, i.width += n, i.height += n) : r === \"sw\" ? (i.x += n, i.width -= n, i.height -= n) : r === \"s\" ? i.height -= n : r === \"se\" && (i.width -= n, i.height -= n) : t === \"ArrowDown\" && (r === \"nw\" ? (i.x += n, i.y += n, i.width -= n, i.height -= n) : r === \"n\" ? (i.y += n, i.height -= n) : r === \"ne\" ? (i.y += n, i.width -= n, i.height -= n) : r === \"sw\" ? (i.x -= n, i.width += n, i.height += n) : r === \"s\" ? i.height += n : r === \"se\" && (i.width += n, i.height += n)), i;\n}\n//#endregion\n//#region src/ReactCrop.tsx\nvar p = {\n\tcapture: !0,\n\tpassive: !1\n}, m = 0, h = class s extends t {\n\tstatic xOrds = [\"e\", \"w\"];\n\tstatic yOrds = [\"n\", \"s\"];\n\tstatic xyOrds = [\n\t\t\"nw\",\n\t\t\"ne\",\n\t\t\"se\",\n\t\t\"sw\"\n\t];\n\tstatic nudgeStep = 1;\n\tstatic nudgeStepMedium = 10;\n\tstatic nudgeStepLarge = 100;\n\tstatic defaultProps = { ariaLabels: {\n\t\tcropArea: \"Use the arrow keys to move the crop selection area\",\n\t\tnwDragHandle: \"Use the arrow keys to move the north west drag handle to change the crop selection area\",\n\t\tnDragHandle: \"Use the up and down arrow keys to move the north drag handle to change the crop selection area\",\n\t\tneDragHandle: \"Use the arrow keys to move the north east drag handle to change the crop selection area\",\n\t\teDragHandle: \"Use the up and down arrow keys to move the east drag handle to change the crop selection area\",\n\t\tseDragHandle: \"Use the arrow keys to move the south east drag handle to change the crop selection area\",\n\t\tsDragHandle: \"Use the up and down arrow keys to move the south drag handle to change the crop selection area\",\n\t\tswDragHandle: \"Use the arrow keys to move the south west drag handle to change the crop selection area\",\n\t\twDragHandle: \"Use the up and down arrow keys to move the west drag handle to change the crop selection area\"\n\t} };\n\tget document() {\n\t\treturn document;\n\t}\n\tdocMoveBound = !1;\n\tmouseDownOnCrop = !1;\n\tdragStarted = !1;\n\tevData = {\n\t\tstartClientX: 0,\n\t\tstartClientY: 0,\n\t\tstartCropX: 0,\n\t\tstartCropY: 0,\n\t\tclientX: 0,\n\t\tclientY: 0,\n\t\tisResize: !0\n\t};\n\tcomponentRef = n();\n\tmediaRef = n();\n\tresizeObserver;\n\tinitChangeCalled = !1;\n\tinstanceId = `rc-${m++}`;\n\tstate = {\n\t\tcropIsActive: !1,\n\t\tnewCropIsBeingDrawn: !1\n\t};\n\tgetBox() {\n\t\tlet e = this.mediaRef.current;\n\t\tif (!e) return {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\t\tlet { x: t, y: n, width: r, height: i } = e.getBoundingClientRect();\n\t\treturn {\n\t\t\tx: t,\n\t\t\ty: n,\n\t\t\twidth: r,\n\t\t\theight: i\n\t\t};\n\t}\n\tcomponentDidUpdate(e) {\n\t\tlet { crop: t, onComplete: n } = this.props;\n\t\tif (n && !e.crop && t) {\n\t\t\tlet { width: e, height: r } = this.getBox();\n\t\t\te && r && n(u(t, e, r), l(t, e, r));\n\t\t}\n\t}\n\tcomponentWillUnmount() {\n\t\tthis.resizeObserver && this.resizeObserver.disconnect(), this.unbindDocMove();\n\t}\n\tbindDocMove() {\n\t\tthis.docMoveBound ||= (this.document.addEventListener(\"pointermove\", this.onDocPointerMove, p), this.document.addEventListener(\"pointerup\", this.onDocPointerDone, p), this.document.addEventListener(\"pointercancel\", this.onDocPointerDone, p), !0);\n\t}\n\tunbindDocMove() {\n\t\tthis.docMoveBound &&= (this.document.removeEventListener(\"pointermove\", this.onDocPointerMove, p), this.document.removeEventListener(\"pointerup\", this.onDocPointerDone, p), this.document.removeEventListener(\"pointercancel\", this.onDocPointerDone, p), !1);\n\t}\n\tonCropPointerDown = (e) => {\n\t\tlet { crop: t, disabled: n } = this.props, r = this.getBox();\n\t\tif (!t) return;\n\t\tlet i = u(t, r.width, r.height);\n\t\tif (n) return;\n\t\te.cancelable && e.preventDefault(), this.bindDocMove(), this.componentRef.current.focus({ preventScroll: !0 });\n\t\tlet a = e.target.dataset.ord, o = !!a, s = e.clientX, c = e.clientY, l = i.x, d = i.y;\n\t\tif (a) {\n\t\t\tlet t = e.clientX - r.x, n = e.clientY - r.y, o = 0, u = 0;\n\t\t\ta === \"ne\" || a == \"e\" ? (o = t - (i.x + i.width), u = n - i.y, l = i.x, d = i.y + i.height) : a === \"se\" || a === \"s\" ? (o = t - (i.x + i.width), u = n - (i.y + i.height), l = i.x, d = i.y) : a === \"sw\" || a == \"w\" ? (o = t - i.x, u = n - (i.y + i.height), l = i.x + i.width, d = i.y) : (a === \"nw\" || a == \"n\") && (o = t - i.x, u = n - i.y, l = i.x + i.width, d = i.y + i.height), s = l + r.x + o, c = d + r.y + u;\n\t\t}\n\t\tthis.evData = {\n\t\t\tstartClientX: s,\n\t\t\tstartClientY: c,\n\t\t\tstartCropX: l,\n\t\t\tstartCropY: d,\n\t\t\tclientX: e.clientX,\n\t\t\tclientY: e.clientY,\n\t\t\tisResize: o,\n\t\t\tord: a\n\t\t}, this.mouseDownOnCrop = !0, this.setState({ cropIsActive: !0 });\n\t};\n\tonComponentPointerDown = (e) => {\n\t\tlet { crop: t, disabled: n, locked: r, keepSelection: i, onChange: a } = this.props, o = this.getBox();\n\t\tif (n || r || i && t) return;\n\t\te.cancelable && e.preventDefault(), this.bindDocMove(), this.componentRef.current.focus({ preventScroll: !0 });\n\t\tlet s = e.clientX - o.x, c = e.clientY - o.y, d = {\n\t\t\tunit: \"px\",\n\t\t\tx: s,\n\t\t\ty: c,\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\t\tthis.evData = {\n\t\t\tstartClientX: e.clientX,\n\t\t\tstartClientY: e.clientY,\n\t\t\tstartCropX: s,\n\t\t\tstartCropY: c,\n\t\t\tclientX: e.clientX,\n\t\t\tclientY: e.clientY,\n\t\t\tisResize: !0\n\t\t}, this.mouseDownOnCrop = !0, a(u(d, o.width, o.height), l(d, o.width, o.height)), this.setState({\n\t\t\tcropIsActive: !0,\n\t\t\tnewCropIsBeingDrawn: !0\n\t\t});\n\t};\n\tonDocPointerMove = (e) => {\n\t\tlet { crop: t, disabled: n, onChange: r, onDragStart: i } = this.props, a = this.getBox();\n\t\tif (n || !t || !this.mouseDownOnCrop) return;\n\t\te.cancelable && e.preventDefault(), this.dragStarted || (this.dragStarted = !0, i && i(e));\n\t\tlet { evData: s } = this;\n\t\ts.clientX = e.clientX, s.clientY = e.clientY;\n\t\tlet c;\n\t\tc = s.isResize ? this.resizeCrop() : this.dragCrop(), o(t, c) || r(u(c, a.width, a.height), l(c, a.width, a.height));\n\t};\n\tonComponentKeyDown = (e) => {\n\t\tlet { crop: t, disabled: n, onChange: r, onComplete: a } = this.props;\n\t\tif (n) return;\n\t\tlet o = e.key, c = !1;\n\t\tif (!t) return;\n\t\tlet d = this.getBox(), f = this.makePixelCrop(d), p = (navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey) ? s.nudgeStepLarge : e.shiftKey ? s.nudgeStepMedium : s.nudgeStep;\n\t\tif (o === \"ArrowLeft\" ? (f.x -= p, c = !0) : o === \"ArrowRight\" ? (f.x += p, c = !0) : o === \"ArrowUp\" ? (f.y -= p, c = !0) : o === \"ArrowDown\" && (f.y += p, c = !0), c) {\n\t\t\te.cancelable && e.preventDefault(), f.x = i(f.x, 0, d.width - f.width), f.y = i(f.y, 0, d.height - f.height);\n\t\t\tlet t = u(f, d.width, d.height), n = l(f, d.width, d.height);\n\t\t\tr(t, n), a && a(t, n);\n\t\t}\n\t};\n\tonHandlerKeyDown = (e, t) => {\n\t\tlet { aspect: n = 0, crop: r, disabled: i, minWidth: a = 0, minHeight: c = 0, maxWidth: p, maxHeight: m, onChange: h, onComplete: g } = this.props, _ = this.getBox();\n\t\tif (i || !r) return;\n\t\tif (e.key === \"ArrowUp\" || e.key === \"ArrowDown\" || e.key === \"ArrowLeft\" || e.key === \"ArrowRight\") e.stopPropagation(), e.preventDefault();\n\t\telse return;\n\t\tlet v = (navigator.platform.match(\"Mac\") ? e.metaKey : e.ctrlKey) ? s.nudgeStepLarge : e.shiftKey ? s.nudgeStepMedium : s.nudgeStep, y = d(f(u(r, _.width, _.height), e.key, v, t), n, t, _.width, _.height, a, c, p, m);\n\t\tif (!o(r, y)) {\n\t\t\tlet e = l(y, _.width, _.height);\n\t\t\th(y, e), g && g(y, e);\n\t\t}\n\t};\n\tonDocPointerDone = (e) => {\n\t\tlet { crop: t, disabled: n, onComplete: r, onDragEnd: i } = this.props, a = this.getBox();\n\t\tthis.unbindDocMove(), !(n || !t) && this.mouseDownOnCrop && (this.mouseDownOnCrop = !1, this.dragStarted = !1, i && i(e), r && r(u(t, a.width, a.height), l(t, a.width, a.height)), this.setState({\n\t\t\tcropIsActive: !1,\n\t\t\tnewCropIsBeingDrawn: !1\n\t\t}));\n\t};\n\tonDragFocus = () => {\n\t\tthis.componentRef.current?.scrollTo(0, 0);\n\t};\n\tgetCropStyle() {\n\t\tlet { crop: e } = this.props;\n\t\tif (e) return {\n\t\t\ttop: `${e.y}${e.unit}`,\n\t\t\tleft: `${e.x}${e.unit}`,\n\t\t\twidth: `${e.width}${e.unit}`,\n\t\t\theight: `${e.height}${e.unit}`\n\t\t};\n\t}\n\tdragCrop() {\n\t\tlet { evData: e } = this, t = this.getBox(), n = this.makePixelCrop(t), r = e.clientX - e.startClientX, a = e.clientY - e.startClientY;\n\t\treturn n.x = i(e.startCropX + r, 0, t.width - n.width), n.y = i(e.startCropY + a, 0, t.height - n.height), n;\n\t}\n\tgetPointRegion(e, t, n, r) {\n\t\tlet { evData: i } = this, a = i.clientX - e.x, o = i.clientY - e.y, s;\n\t\ts = r && t ? t === \"nw\" || t === \"n\" || t === \"ne\" : o < i.startCropY;\n\t\tlet c;\n\t\treturn c = n && t ? t === \"nw\" || t === \"w\" || t === \"sw\" : a < i.startCropX, c ? s ? \"nw\" : \"sw\" : s ? \"ne\" : \"se\";\n\t}\n\tresolveMinDimensions(e, t, n = 0, r = 0) {\n\t\tlet i = Math.min(n, e.width), a = Math.min(r, e.height);\n\t\treturn !t || !i && !a ? [i, a] : t > 1 ? i ? [i, i / t] : [a * t, a] : a ? [a * t, a] : [i, i / t];\n\t}\n\tresizeCrop() {\n\t\tlet { evData: e } = this, { aspect: t = 0, maxWidth: n, maxHeight: r } = this.props, a = this.getBox(), [o, c] = this.resolveMinDimensions(a, t, this.props.minWidth, this.props.minHeight), l = this.makePixelCrop(a), u = this.getPointRegion(a, e.ord, o, c), f = e.ord || u, p = e.clientX - e.startClientX, m = e.clientY - e.startClientY;\n\t\t(o && f === \"nw\" || f === \"w\" || f === \"sw\") && (p = Math.min(p, -o)), (c && f === \"nw\" || f === \"n\" || f === \"ne\") && (m = Math.min(m, -c));\n\t\tlet h = {\n\t\t\tunit: \"px\",\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\t\tu === \"ne\" ? (h.x = e.startCropX, h.width = p, t ? (h.height = h.width / t, h.y = e.startCropY - h.height) : (h.height = Math.abs(m), h.y = e.startCropY - h.height)) : u === \"se\" ? (h.x = e.startCropX, h.y = e.startCropY, h.width = p, t ? h.height = h.width / t : h.height = m) : u === \"sw\" ? (h.x = e.startCropX + p, h.y = e.startCropY, h.width = Math.abs(p), t ? h.height = h.width / t : h.height = m) : u === \"nw\" && (h.x = e.startCropX + p, h.width = Math.abs(p), t ? (h.height = h.width / t, h.y = e.startCropY - h.height) : (h.height = Math.abs(m), h.y = e.startCropY + m));\n\t\tlet g = d(h, t, u, a.width, a.height, o, c, n, r);\n\t\treturn t || s.xyOrds.indexOf(f) > -1 ? l = g : s.xOrds.indexOf(f) > -1 ? (l.x = g.x, l.width = g.width) : s.yOrds.indexOf(f) > -1 && (l.y = g.y, l.height = g.height), l.x = i(l.x, 0, a.width - l.width), l.y = i(l.y, 0, a.height - l.height), l;\n\t}\n\trenderCropSelection() {\n\t\tlet { ariaLabels: t = s.defaultProps.ariaLabels, disabled: n, locked: r, renderSelectionAddon: i, ruleOfThirds: a, crop: o } = this.props, c = this.getCropStyle();\n\t\tif (o) return /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tstyle: c,\n\t\t\tclassName: \"ReactCrop__crop-selection\",\n\t\t\tonPointerDown: this.onCropPointerDown,\n\t\t\t\"aria-label\": t.cropArea,\n\t\t\ttabIndex: 0,\n\t\t\tonKeyDown: this.onComponentKeyDown,\n\t\t\trole: \"group\"\n\t\t}, !n && !r && /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-elements\",\n\t\t\tonFocus: this.onDragFocus\n\t\t}, /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-bar ord-n\",\n\t\t\t\"data-ord\": \"n\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-bar ord-e\",\n\t\t\t\"data-ord\": \"e\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-bar ord-s\",\n\t\t\t\"data-ord\": \"s\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-bar ord-w\",\n\t\t\t\"data-ord\": \"w\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-nw\",\n\t\t\t\"data-ord\": \"nw\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.nwDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"nw\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-n\",\n\t\t\t\"data-ord\": \"n\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.nDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"n\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-ne\",\n\t\t\t\"data-ord\": \"ne\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.neDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"ne\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-e\",\n\t\t\t\"data-ord\": \"e\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.eDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"e\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-se\",\n\t\t\t\"data-ord\": \"se\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.seDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"se\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-s\",\n\t\t\t\"data-ord\": \"s\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.sDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"s\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-sw\",\n\t\t\t\"data-ord\": \"sw\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.swDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"sw\"),\n\t\t\trole: \"button\"\n\t\t}), /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__drag-handle ord-w\",\n\t\t\t\"data-ord\": \"w\",\n\t\t\ttabIndex: 0,\n\t\t\t\"aria-label\": t.wDragHandle,\n\t\t\tonKeyDown: (e) => this.onHandlerKeyDown(e, \"w\"),\n\t\t\trole: \"button\"\n\t\t})), i && /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tclassName: \"ReactCrop__selection-addon\",\n\t\t\tonPointerDown: (e) => e.stopPropagation()\n\t\t}, i(this.state)), a && /* @__PURE__ */ e.createElement(e.Fragment, null, /* @__PURE__ */ e.createElement(\"div\", { className: \"ReactCrop__rule-of-thirds-hz\" }), /* @__PURE__ */ e.createElement(\"div\", { className: \"ReactCrop__rule-of-thirds-vt\" })));\n\t}\n\tmakePixelCrop(e) {\n\t\treturn u({\n\t\t\t...r,\n\t\t\t...this.props.crop || {}\n\t\t}, e.width, e.height);\n\t}\n\trender() {\n\t\tlet { aspect: t, children: n, circularCrop: r, className: i, crop: o, disabled: s, locked: c, style: l, ruleOfThirds: u } = this.props, { cropIsActive: d, newCropIsBeingDrawn: f } = this.state, p = o ? this.renderCropSelection() : null, m = a(\"ReactCrop\", i, d && \"ReactCrop--active\", s && \"ReactCrop--disabled\", c && \"ReactCrop--locked\", f && \"ReactCrop--new-crop\", o && t && \"ReactCrop--fixed-aspect\", o && r && \"ReactCrop--circular-crop\", o && u && \"ReactCrop--rule-of-thirds\", !this.dragStarted && o && !o.width && !o.height && \"ReactCrop--invisible-crop\", r && \"ReactCrop--no-animate\");\n\t\treturn /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tref: this.componentRef,\n\t\t\tclassName: m,\n\t\t\tstyle: l\n\t\t}, /* @__PURE__ */ e.createElement(\"div\", {\n\t\t\tref: this.mediaRef,\n\t\t\tclassName: \"ReactCrop__child-wrapper\",\n\t\t\tonPointerDown: this.onComponentPointerDown\n\t\t}, n), o ? /* @__PURE__ */ e.createElement(\"svg\", {\n\t\t\tclassName: \"ReactCrop__crop-mask\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\"\n\t\t}, /* @__PURE__ */ e.createElement(\"defs\", null, /* @__PURE__ */ e.createElement(\"mask\", { id: `hole-${this.instanceId}` }, /* @__PURE__ */ e.createElement(\"rect\", {\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tfill: \"white\"\n\t\t}), r ? /* @__PURE__ */ e.createElement(\"ellipse\", {\n\t\t\tcx: `${o.x + o.width / 2}${o.unit}`,\n\t\t\tcy: `${o.y + o.height / 2}${o.unit}`,\n\t\t\trx: `${o.width / 2}${o.unit}`,\n\t\t\try: `${o.height / 2}${o.unit}`,\n\t\t\tfill: \"black\"\n\t\t}) : /* @__PURE__ */ e.createElement(\"rect\", {\n\t\t\tx: `${o.x}${o.unit}`,\n\t\t\ty: `${o.y}${o.unit}`,\n\t\t\twidth: `${o.width}${o.unit}`,\n\t\t\theight: `${o.height}${o.unit}`,\n\t\t\tfill: \"black\"\n\t\t}))), /* @__PURE__ */ e.createElement(\"rect\", {\n\t\t\tfill: \"black\",\n\t\t\tfillOpacity: .5,\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\tmask: `url(#hole-${this.instanceId})`\n\t\t})) : void 0, p);\n\t}\n}, g = Math.PI / 180;\nasync function _(e, t, n, r = 1, i = 0) {\n\tlet a = t.getContext(\"2d\");\n\tif (!a) throw Error(\"No 2d context\");\n\tlet o = e.naturalWidth / e.width, s = e.naturalHeight / e.height, c = window.devicePixelRatio;\n\tt.width = Math.floor(n.width * o * c), t.height = Math.floor(n.height * s * c), a.scale(c, c), a.imageSmoothingQuality = \"high\";\n\tlet l = n.x * o, u = n.y * s, d = i * g, f = e.naturalWidth / 2, p = e.naturalHeight / 2;\n\ta.save(), a.translate(-l, -u), a.translate(f, p), a.rotate(d), a.scale(r, r), a.translate(-f, -p), a.drawImage(e, 0, 0, e.naturalWidth, e.naturalHeight, 0, 0, e.naturalWidth, e.naturalHeight), a.restore();\n}\nfunction v(e) {\n\treturn new Promise((t) => {\n\t\te.toBlob(t);\n\t});\n}\nvar y = \"\";\nasync function b(e, t, n = 1, r = 0) {\n\tlet i = document.createElement(\"canvas\");\n\t_(e, i, t, n, r);\n\tlet a = await v(i);\n\treturn a ? (y && URL.revokeObjectURL(y), y = URL.createObjectURL(a), y) : (console.error(\"Failed to create blob\"), \"\");\n}\n//#endregion\nexport { h as Component, h as ReactCrop, h as default, o as areCropsEqual, c as centerCrop, i as clamp, a as cls, d as containCrop, l as convertToPercentCrop, u as convertToPixelCrop, _ as cropToCanvas, b as cropToImg, r as defaultCrop, s as makeAspectCrop, f as nudgeCrop };\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\"@keyframes marching-ants {\\n 0% {\\n background-position:\\n 0 0,\\n 0 100%,\\n 0 0,\\n 100% 0;\\n }\\n to {\\n background-position:\\n 20px 0,\\n -20px 100%,\\n 0 -20px,\\n 100% 20px;\\n }\\n}\\n:root {\\n --rc-drag-handle-size:12px;\\n --rc-drag-handle-mobile-size:24px;\\n --rc-drag-handle-bg-colour:#0003;\\n --rc-drag-bar-size:6px;\\n --rc-border-color:#ffffffb3;\\n --rc-focus-color:#08f;\\n}\\n.ReactCrop {\\n cursor: crosshair;\\n max-width: 100%;\\n display: inline-block;\\n position: relative;\\n}\\n.ReactCrop *,\\n.ReactCrop :before,\\n.ReactCrop :after {\\n box-sizing: border-box;\\n}\\n.ReactCrop--disabled,\\n.ReactCrop--locked {\\n cursor: inherit;\\n}\\n.ReactCrop__child-wrapper {\\n max-height: inherit;\\n overflow: hidden;\\n}\\n.ReactCrop__child-wrapper > img,\\n.ReactCrop__child-wrapper > video {\\n max-width: 100%;\\n max-height: inherit;\\n display: block;\\n}\\n.ReactCrop:not(.ReactCrop--disabled) .ReactCrop__child-wrapper > img,\\n.ReactCrop:not(.ReactCrop--disabled) .ReactCrop__child-wrapper > video,\\n.ReactCrop:not(.ReactCrop--disabled) .ReactCrop__crop-selection {\\n touch-action: none;\\n}\\n.ReactCrop__crop-mask {\\n pointer-events: none;\\n width: calc(100% + .5px);\\n height: calc(100% + .5px);\\n position: absolute;\\n inset: 0;\\n}\\n.ReactCrop__crop-selection {\\n cursor: move;\\n position: absolute;\\n top: 0;\\n left: 0;\\n transform: translate(0, 0);\\n}\\n.ReactCrop--disabled .ReactCrop__crop-selection {\\n cursor: inherit;\\n}\\n.ReactCrop--circular-crop .ReactCrop__crop-selection {\\n border-radius: 50%;\\n}\\n.ReactCrop--circular-crop .ReactCrop__crop-selection:after {\\n pointer-events: none;\\n content: \\\"\\\";\\n border: 1px solid var(--rc-border-color);\\n opacity: .3;\\n position: absolute;\\n inset: -1px;\\n}\\n.ReactCrop--no-animate .ReactCrop__crop-selection {\\n outline: 1px dashed #fff;\\n}\\n.ReactCrop__crop-selection:not(.ReactCrop--no-animate .ReactCrop__crop-selection) {\\n color: #fff;\\n background-image:\\n linear-gradient(\\n 90deg,\\n #fff 50%,\\n #444 50%),\\n linear-gradient(\\n 90deg,\\n #fff 50%,\\n #444 50%),\\n linear-gradient(#fff 50%, #444 50%),\\n linear-gradient(#fff 50%, #444 50%);\\n background-position:\\n 0 0,\\n 0 100%,\\n 0 0,\\n 100% 0;\\n background-repeat:\\n repeat-x,\\n repeat-x,\\n repeat-y,\\n repeat-y;\\n background-size:\\n 10px 1px,\\n 10px 1px,\\n 1px 10px,\\n 1px 10px;\\n animation: 1s linear infinite marching-ants;\\n}\\n.ReactCrop__crop-selection:focus {\\n outline: 2px solid var(--rc-focus-color);\\n outline-offset: -1px;\\n}\\n.ReactCrop--invisible-crop .ReactCrop__crop-mask,\\n.ReactCrop--invisible-crop .ReactCrop__crop-selection {\\n display: none;\\n}\\n.ReactCrop__rule-of-thirds-vt:before,\\n.ReactCrop__rule-of-thirds-vt:after,\\n.ReactCrop__rule-of-thirds-hz:before,\\n.ReactCrop__rule-of-thirds-hz:after {\\n content: \\\"\\\";\\n background-color: #fff6;\\n display: block;\\n position: absolute;\\n}\\n.ReactCrop__rule-of-thirds-vt:before,\\n.ReactCrop__rule-of-thirds-vt:after {\\n width: 1px;\\n height: 100%;\\n}\\n.ReactCrop__rule-of-thirds-vt:before {\\n left: 33.3333%;\\n}\\n.ReactCrop__rule-of-thirds-vt:after {\\n left: 66.6667%;\\n}\\n.ReactCrop__rule-of-thirds-hz:before,\\n.ReactCrop__rule-of-thirds-hz:after {\\n width: 100%;\\n height: 1px;\\n}\\n.ReactCrop__rule-of-thirds-hz:before {\\n top: 33.3333%;\\n}\\n.ReactCrop__rule-of-thirds-hz:after {\\n top: 66.6667%;\\n}\\n.ReactCrop__drag-handle {\\n width: var(--rc-drag-handle-size);\\n height: var(--rc-drag-handle-size);\\n background-color: var(--rc-drag-handle-bg-colour);\\n border: 1px solid var(--rc-border-color);\\n position: absolute;\\n}\\n.ReactCrop__drag-handle:focus {\\n background: var(--rc-focus-color);\\n}\\n.ReactCrop .ord-nw {\\n cursor: nw-resize;\\n top: 0;\\n left: 0;\\n transform: translate(-50%, -50%);\\n}\\n.ReactCrop .ord-n {\\n cursor: n-resize;\\n top: 0;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n}\\n.ReactCrop .ord-ne {\\n cursor: ne-resize;\\n top: 0;\\n right: 0;\\n transform: translate(50%, -50%);\\n}\\n.ReactCrop .ord-e {\\n cursor: e-resize;\\n top: 50%;\\n right: 0;\\n transform: translate(50%, -50%);\\n}\\n.ReactCrop .ord-se {\\n cursor: se-resize;\\n bottom: 0;\\n right: 0;\\n transform: translate(50%, 50%);\\n}\\n.ReactCrop .ord-s {\\n cursor: s-resize;\\n bottom: 0;\\n left: 50%;\\n transform: translate(-50%, 50%);\\n}\\n.ReactCrop .ord-sw {\\n cursor: sw-resize;\\n bottom: 0;\\n left: 0;\\n transform: translate(-50%, 50%);\\n}\\n.ReactCrop .ord-w {\\n cursor: w-resize;\\n top: 50%;\\n left: 0;\\n transform: translate(-50%, -50%);\\n}\\n.ReactCrop__disabled .ReactCrop__drag-handle {\\n cursor: inherit;\\n}\\n.ReactCrop__drag-bar {\\n position: absolute;\\n}\\n.ReactCrop__drag-bar.ord-n {\\n width: 100%;\\n height: var(--rc-drag-bar-size);\\n top: 0;\\n left: 0;\\n transform: translateY(-50%);\\n}\\n.ReactCrop__drag-bar.ord-e {\\n width: var(--rc-drag-bar-size);\\n height: 100%;\\n top: 0;\\n right: 0;\\n transform: translate(50%);\\n}\\n.ReactCrop__drag-bar.ord-s {\\n width: 100%;\\n height: var(--rc-drag-bar-size);\\n bottom: 0;\\n left: 0;\\n transform: translateY(50%);\\n}\\n.ReactCrop__drag-bar.ord-w {\\n width: var(--rc-drag-bar-size);\\n height: 100%;\\n top: 0;\\n left: 0;\\n transform: translate(-50%);\\n}\\n.ReactCrop--new-crop .ReactCrop__drag-bar,\\n.ReactCrop--new-crop .ReactCrop__drag-handle,\\n.ReactCrop--fixed-aspect .ReactCrop__drag-bar,\\n.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-n,\\n.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-e,\\n.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-s,\\n.ReactCrop--fixed-aspect .ReactCrop__drag-handle.ord-w {\\n display: none;\\n}\\n@media (pointer: coarse) {\\n .ReactCrop .ord-n,\\n .ReactCrop .ord-e,\\n .ReactCrop .ord-s,\\n .ReactCrop .ord-w {\\n display: none;\\n }\\n .ReactCrop__drag-handle {\\n width: var(--rc-drag-handle-mobile-size);\\n height: var(--rc-drag-handle-mobile-size);\\n }\\n}\\n\")","\"use client\";\n\nimport { useContext, useMemo, type ReactNode } from \"react\";\nimport { P1PuckContext, useP1Auth } from \"@pantheon-systems/puck-css\";\nimport { MediaConfigProvider, type MediaConfig } from \"./context\";\nimport type { MediaPluginOptions } from \"./plugin\";\n\n/** Production Worker/CDN host — same origin serves both the `/media` API and `/image` delivery. */\nconst DEFAULT_WORKER_URL = \"https://media.p1.pantheon.io\";\n\nexport type GetAuthToken = () => Promise<string | null> | string | null;\n\n/**\n * Resolves siteId: an explicit value always wins (back-compat for existing\n * callers); otherwise falls back to the ambient puck-css site context. Throws\n * when neither is available — createMediaPlugin() has no error UI of its own,\n * so a clear message here is the only diagnostic a caller gets.\n */\nexport function resolveSiteId(explicit: string | undefined, contextSiteId: string | undefined): string {\n const siteId = explicit ?? contextSiteId;\n if (!siteId) {\n throw new Error(\n \"p1-media: siteId is required. Pass it explicitly to createMediaPlugin(), \" +\n \"or render the plugin inside a puck-css P1PuckProvider so it can be read from context.\"\n );\n }\n return siteId;\n}\n\n/**\n * Resolves the auth-token getter: an explicit function always wins; otherwise\n * falls back to the ambient puck-css auth context's `getToken`. Throws when\n * neither is available, for the same reason as {@link resolveSiteId}.\n */\nexport function resolveGetAuthToken(\n explicit: GetAuthToken | undefined,\n contextGetToken: GetAuthToken | undefined\n): GetAuthToken {\n const getAuthToken = explicit ?? contextGetToken;\n if (!getAuthToken) {\n throw new Error(\n \"p1-media: getAuthToken is required. Pass it explicitly to createMediaPlugin(), \" +\n \"or render the plugin inside a puck-css P1AuthProvider so it can be read from context.\"\n );\n }\n return getAuthToken;\n}\n\n/**\n * Reads the ambient puck-css site context, if any. `P1PuckContext` is a plain\n * exported React Context (default value `null`), so this never throws —\n * unlike `useP1Puck()`, which throws with no provider.\n */\nfunction useAmbientSiteId(): string | undefined {\n return useContext(P1PuckContext)?.siteId;\n}\n\n/**\n * Reads the ambient puck-css auth context's token getter, if any. Unlike\n * `siteId`, puck-css doesn't publicly export a non-throwing read of auth\n * context (`useOptionalP1Auth` exists internally but isn't part of the\n * published package's public API), so this wraps the throwing `useP1Auth()`\n * in a try/catch. That's safe under the rules of hooks: the underlying\n * `useContext` call inside `useP1Auth()` still runs unconditionally every\n * render; only the subsequent plain-JS throw (when there's no provider) is\n * caught here.\n */\nfunction useAmbientGetAuthToken(): GetAuthToken | undefined {\n try {\n return useP1Auth().getToken;\n } catch {\n return undefined;\n }\n}\n\n/** Ambient values read from puck-css context — absent when there's no provider. */\nexport interface AmbientMediaContext {\n siteId?: string;\n getAuthToken?: GetAuthToken;\n}\n\n/**\n * Pure assembly of the final {@link MediaConfig} from `options` (explicit\n * args, back-compat) and `ambient` (puck-css context, auto-bind — omit to\n * resolve explicit-only, e.g. from a test that never renders). No hooks, so\n * it's directly unit-testable; `MediaConfigResolver` is the only caller that\n * supplies a real `ambient`, gathered via hooks.\n */\nexport function buildMediaConfig(options: MediaPluginOptions, ambient: AmbientMediaContext = {}): MediaConfig {\n return {\n workerUrl: options.workerUrl ?? DEFAULT_WORKER_URL,\n siteId: resolveSiteId(options.siteId, ambient.siteId),\n workstreamId: options.workstreamId,\n getAuthToken: resolveGetAuthToken(options.getAuthToken, ambient.getAuthToken),\n metadataFields: options.metadataFields,\n };\n}\n\n/**\n * Resolves `options` against the ambient puck-css context and provides the\n * result to `children`. This is the only place in the plugin that reads\n * puck-css context — everything downstream keeps consuming a fully-resolved\n * `MediaConfig` via `useMediaConfig()`, exactly as before.\n *\n * `config` is memoized on `[options, ambientSiteId, ambientGetAuthToken]`,\n * not recomputed on every render: `P1PuckContext`'s value includes the live\n * `currentData` (the document being edited), which changes on nearly every\n * keystroke anywhere in the document. Without memoizing, every mounted media\n * field would get a fresh `config` object identity on every such keystroke,\n * re-firing every `useEffect`/`useCallback` downstream that depends on it\n * (`use-media-schema.ts`, `media-library.tsx`) — including one that clears\n * the media-library search box mid-typing. `ambientGetAuthToken` is already\n * stable across unrelated re-renders (puck-css's `useP1Auth().getToken` is\n * itself a memoized `useCallback`), and `ambientSiteId` is a plain string, so\n * this memoization only recomputes when something that actually matters —\n * the resolved options object, site, or token getter — changes.\n */\nexport function MediaConfigResolver({\n options,\n children,\n}: {\n options: MediaPluginOptions;\n children: ReactNode;\n}) {\n const ambientSiteId = useAmbientSiteId();\n const ambientGetAuthToken = useAmbientGetAuthToken();\n const config = useMemo(\n () => buildMediaConfig(options, { siteId: ambientSiteId, getAuthToken: ambientGetAuthToken }),\n [options, ambientSiteId, ambientGetAuthToken]\n );\n\n return <MediaConfigProvider config={config}>{children}</MediaConfigProvider>;\n}\n","\"use client\";\n\nimport { DEFAULT_MEDIA_PATTERNS } from \"./patterns\";\nimport { MediaFieldRender } from \"./components/media-field\";\nimport { MediaObjectFieldRender } from \"./components/media-object-field\";\nimport { MediaConfigResolver, type GetAuthToken } from \"./puck-css-bridge\";\nimport type { MediaFieldValue, MetadataFieldDef } from \"./types\";\n\nexport interface MediaPluginOptions {\n /** The base URL of the Cloudflare Worker media API. Defaults to the production host. */\n workerUrl?: string;\n /**\n * Site identifier used to scope media to a specific site. Defaults to the\n * ambient puck-css site context (`P1PuckProvider`) when omitted — pass this\n * explicitly only when rendering outside that provider, or to override it.\n */\n siteId?: string;\n /**\n * Workstream (branch) identifier. Currently accepted for forward-compat but not\n * read by the Worker for any scoping decision — omit unless a future release\n * documents otherwise.\n */\n workstreamId?: string;\n /**\n * Function that returns the current auth token, or null if unauthenticated.\n * May be async. Defaults to the ambient puck-css auth context's `getToken`\n * (`P1AuthProvider`) when omitted — pass this explicitly only when rendering\n * outside that provider, or to override it.\n */\n getAuthToken?: GetAuthToken;\n /** Field name patterns that trigger the media picker (defaults to common image URL patterns) */\n fieldNamePatterns?: RegExp[];\n /**\n * Fallback metadata field schema for the rich `p1-media` field, used when\n * `GET /media/schema` is unavailable. Defaults to\n * `[{ name: \"alt\", label: \"Alt text\", type: \"string\" }]`.\n */\n metadataFields?: MetadataFieldDef[];\n}\n\n/**\n * Creates a Puck plugin that adds a media library backed by Cloudflare R2 + D1.\n * It supports two field modes:\n * - Basic: text fields matching image/media name patterns are replaced with the\n * picker and store a clean CDN URL string. Render with `buildImageUrl()`.\n * - Rich: a registered `p1-media` field type stores a MediaValue object (version\n * URL + metadata such as alt). Render with `getMediaProps()` / `MediaImage` /\n * `MediaFigure`. The editor's crop intent is carried as `?fit=…&gravity=…`.\n *\n * @example\n * ```tsx\n * // Inside a P1 site (rendered within P1PuckProvider + P1AuthProvider):\n * // siteId and getAuthToken are read from context automatically.\n * const mediaPlugin = createMediaPlugin({});\n *\n * // Outside a P1 site, or to override the ambient context, pass explicitly:\n * const mediaPlugin = createMediaPlugin({\n * siteId: \"my-site\",\n * getAuthToken: () => localStorage.getItem(\"token\"),\n * });\n *\n * <Puck plugins={[mediaPlugin]} config={config} data={data} />\n * ```\n */\nexport function createMediaPlugin(options: MediaPluginOptions) {\n const patterns = options.fieldNamePatterns ?? DEFAULT_MEDIA_PATTERNS;\n\n return {\n name: \"p1-media\",\n overrides: {\n fieldTypes: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n text: (props: any) => {\n const { children, name, field, value, onChange, readOnly, id } = props;\n // Puck passes qualified names for array items (e.g. \"slides[0].imageUrl\").\n // Extract the last segment so patterns match the bare field name.\n const bareFieldName = name?.split(\".\").pop() ?? name;\n const isMediaField = patterns.some((p: RegExp) => p.test(bareFieldName));\n\n if (!isMediaField) {\n return <>{children}</>;\n }\n\n return (\n <MediaConfigResolver options={options}>\n <MediaFieldRender\n field={{\n type: \"custom\" as const,\n label: field?.label ?? name,\n render: () => <></>,\n }}\n name={name}\n id={id ?? name}\n value={value ?? \"\"}\n onChange={onChange}\n readOnly={readOnly}\n />\n </MediaConfigResolver>\n );\n },\n // Rich mode: a first-class `p1-media` field whose value is an object.\n // Puck ≥0.20 dispatches overrides.fieldTypes[field.type] for new types.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n \"p1-media\": (props: any) => {\n const { name, field, value, onChange, readOnly, id } = props;\n return (\n <MediaConfigResolver options={options}>\n <MediaObjectFieldRender\n label={field?.label ?? name}\n name={name}\n id={id ?? name}\n value={value ?? \"\"}\n onChange={onChange}\n readOnly={readOnly}\n />\n </MediaConfigResolver>\n );\n },\n },\n },\n // Editor-preview only (never written back): normalize a legacy string to\n // the object shape so components reading the raw prop see `{ url, alt }`.\n // The R10 write-path guard lives in makeMediaValue, not here.\n fieldTransforms: {\n \"p1-media\": ({ value }: { value: MediaFieldValue }) =>\n typeof value === \"string\" ? { url: value, alt: \"\" } : value,\n },\n };\n}\n","export interface ImageTransformParams {\n width?: number;\n height?: number;\n /** `auto` negotiates avif → webp → jpeg from the request's Accept header. */\n format?: \"auto\" | \"webp\" | \"jpeg\" | \"png\" | \"gif\" | \"avif\";\n quality?: number;\n}\n\n/**\n * Merges Cloudflare Images transform params onto a CDN image URL.\n * Preserves any existing params in the URL — e.g. the editor's crop intent\n * (`fit=cover&gravity=auto` for smart crop, `trim.*` for a manual crop).\n *\n * @example\n * buildImageUrl(data.heroImage, { width: 1200, height: 630, format: \"webp\" })\n */\nexport function buildImageUrl(url: string, params: ImageTransformParams): string {\n if (!url) return url;\n const parsed = new URL(url);\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') return url;\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) {\n parsed.searchParams.set(k, String(v));\n }\n }\n return parsed.toString();\n}\n","// Render-side helpers. Server-safe (no React context, no client-only hooks) so\n// they can be imported from RSC via the package's \"react-server\" export.\nimport type { ImgHTMLAttributes, ReactElement } from \"react\";\nimport type {\n MediaFieldValue,\n MediaProps,\n MetadataFieldDef,\n} from \"./types\";\nimport { isMediaValue, STRUCTURAL_MEDIA_KEYS } from \"./media-value\";\nimport { buildImageUrl, type ImageTransformParams } from \"./utils\";\n\nexport interface GetMediaPropsOptions {\n /**\n * The CDN image origin that serves media, e.g.\n * \"https://staging.media.p1.pantheon.io\". This is the public image host —\n * NOT the Worker API URL (`…workers.dev`), whose origin would reject every\n * real image URL.\n *\n * Security (required): a value's `url` is untrusted document content — anyone\n * who can edit a document, or call the CCR `/edits` API, controls it. Without\n * an origin check a crafted `https://evil.example/beacon.png` turns every\n * published render into a visitor-IP exfil beacon (and an SSRF under\n * server-fetching `next/image`). getMediaProps therefore rejects any url that\n * is not `https` on this exact origin. If `mediaBaseUrl` is omitted it\n * **fails closed** (empty src) rather than degrading to an insecure pass-through.\n *\n * Local dev exception: when the configured base is itself `http` on a\n * loopback host (`localhost`, `127.0.0.1`, `[::1]` — a local `wrangler dev`\n * worker), same-origin `http` urls are allowed so rich values render locally.\n */\n mediaBaseUrl?: string;\n /** Transform params merged onto the validated URL (width, height, format, quality). */\n transform?: ImageTransformParams;\n}\n\n// Hosts where an http mediaBaseUrl is honored (local `wrangler dev`). Exact\n// hostnames only — no *.localhost subdomains.\nconst LOOPBACK_HOSTS = new Set([\"localhost\", \"127.0.0.1\", \"[::1]\"]);\n\n/**\n * Returns the url only if it is on the configured CDN origin AND https —\n * except that an http origin is honored when the configured mediaBaseUrl is\n * itself http on a loopback host (local dev against `wrangler dev`, which\n * serves plain http). Production is unaffected: real CDN bases are https, so\n * every http url still fails the origin check. Otherwise \"\". Fails closed\n * when no origin is configured (see GetMediaPropsOptions).\n */\nfunction validateSrc(url: string, mediaBaseUrl?: string): string {\n if (!url || !mediaBaseUrl) return \"\";\n let parsed: URL;\n let base: URL;\n try {\n parsed = new URL(url);\n base = new URL(mediaBaseUrl);\n } catch {\n return \"\";\n }\n if (parsed.origin !== base.origin) return \"\";\n if (parsed.protocol !== \"https:\") {\n // Non-https is allowed only as plain http against an explicitly-configured\n // local-dev loopback base. Checking parsed.protocol too keeps schemes whose\n // origin serializes to the base origin (blob:http://…) out of the carve-out.\n const isLocalDevBase = base.protocol === \"http:\" && LOOPBACK_HOSTS.has(base.hostname);\n if (!isLocalDevBase || parsed.protocol !== \"http:\") return \"\";\n }\n return url;\n}\n\n/**\n * Normalizes a `string | MediaValue | null` into `{ src, alt, width?, height? }`.\n * A string (basic mode) yields `alt: \"\"`. `src` is validated against the CDN\n * origin (see GetMediaPropsOptions) and empty on rejection.\n */\nexport function getMediaProps(\n value: MediaFieldValue | null | undefined,\n options?: GetMediaPropsOptions,\n): MediaProps {\n const mediaBaseUrl = options?.mediaBaseUrl;\n const transform = options?.transform;\n\n const finalize = (rawUrl: string): string => {\n const validated = validateSrc(rawUrl, mediaBaseUrl);\n return validated && transform ? buildImageUrl(validated, transform) : validated;\n };\n\n if (value == null) return { src: \"\", alt: \"\" };\n\n if (typeof value === \"string\") {\n return { src: finalize(value), alt: \"\" };\n }\n\n const props: MediaProps = {\n src: finalize(typeof value.url === \"string\" ? value.url : \"\"),\n alt: typeof value.alt === \"string\" ? value.alt : \"\",\n };\n if (typeof value.width === \"number\") props.width = value.width;\n if (typeof value.height === \"number\") props.height = value.height;\n return props;\n}\n\n/**\n * Common-case `<img>` wrapper. Renders nothing when the src is rejected/empty\n * (a broken foreign-origin image is never emitted). `alt` may be overridden;\n * otherwise it comes from the value.\n */\nexport function MediaImage({\n image,\n mediaBaseUrl,\n transform,\n alt,\n ...rest\n}: {\n image: MediaFieldValue | null | undefined;\n mediaBaseUrl?: string;\n transform?: ImageTransformParams;\n} & Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\">): ReactElement | null {\n const props = getMediaProps(image, { mediaBaseUrl, transform });\n if (!props.src) return null;\n return (\n <img\n src={props.src}\n alt={alt ?? props.alt}\n {...(props.width !== undefined ? { width: props.width } : {})}\n {...(props.height !== undefined ? { height: props.height } : {})}\n {...rest}\n />\n );\n}\n\n/**\n * Collects the metadata fields a figure should render, generically (req. R14):\n * with a schema, iterate its entries (canonical order/labels); without one,\n * iterate the value's own string metadata keys. Either way a new backend text\n * field appears with no plugin release. `alt` (on the `<img>`) and non-text\n * values (width/height/metaSchemaVersion) are excluded from the caption.\n */\nfunction collectFigureFields(\n image: MediaFieldValue | null | undefined,\n schema?: MetadataFieldDef[],\n): { name: string; label?: string; value: string }[] {\n if (!isMediaValue(image)) return [];\n const out: { name: string; label?: string; value: string }[] = [];\n if (schema && schema.length > 0) {\n for (const entry of schema) {\n if (entry.name === \"alt\") continue;\n const raw = image[entry.name];\n if (raw === undefined || raw === \"\") continue;\n out.push({ name: entry.name, label: entry.label, value: String(raw) });\n }\n } else {\n for (const [k, v] of Object.entries(image)) {\n if (k === \"alt\") continue;\n if (STRUCTURAL_MEDIA_KEYS.has(k)) continue;\n if (typeof v !== \"string\" || v === \"\") continue;\n out.push({ name: k, value: v });\n }\n }\n return out;\n}\n\n/**\n * `<figure>` that renders the image plus the schema-advertised text fields as\n * ESCAPED text (React default escaping — never dangerouslySetInnerHTML, req.\n * R6). Renders nothing when the src is rejected/empty.\n */\nexport function MediaFigure({\n image,\n schema,\n mediaBaseUrl,\n transform,\n className,\n captionClassName,\n}: {\n image: MediaFieldValue | null | undefined;\n schema?: MetadataFieldDef[];\n mediaBaseUrl?: string;\n transform?: ImageTransformParams;\n className?: string;\n captionClassName?: string;\n}): ReactElement | null {\n const props = getMediaProps(image, { mediaBaseUrl, transform });\n if (!props.src) return null;\n\n const fields = collectFigureFields(image, schema);\n\n return (\n <figure className={className}>\n <img\n src={props.src}\n alt={props.alt}\n {...(props.width !== undefined ? { width: props.width } : {})}\n {...(props.height !== undefined ? { height: props.height } : {})}\n />\n {fields.length > 0 && (\n <figcaption className={captionClassName}>\n {fields.map((f) => (\n <span key={f.name} data-field={f.name}>\n {f.value}\n </span>\n ))}\n </figcaption>\n )}\n </figure>\n );\n}\n","// Ready-made Puck component for the rich `p1-media` field. Server-safe (no\n// hooks, no context) so it can be registered in configs that render via RSC.\nimport type { CSSProperties, ReactElement, ReactNode } from \"react\";\nimport type { ComponentConfig, Field } from \"@puckeditor/core\";\nimport { getMediaProps, MediaFigure } from \"./render\";\nimport type { ImageTransformParams } from \"./utils\";\nimport type { MediaFieldValue, MetadataFieldDef } from \"./types\";\n\nexport interface MediaFigureBlockProps {\n photo: MediaFieldValue | null;\n}\n\nexport interface MediaFigureBlockOptions {\n /**\n * The CDN image origin used to validate value URLs — NOT the Worker API\n * URL. See GetMediaPropsOptions. Defaults to the production origin\n * (\"https://media.p1.pantheon.io\"); override for sandbox/staging/local dev.\n */\n mediaBaseUrl?: string;\n /**\n * Render-time transform. Include BOTH width and height — the editor's crop\n * intent only changes the output when there is a target aspect ratio.\n * Defaults to `{ width: 1200, height: 630, format: \"auto\" }`.\n */\n transform?: ImageTransformParams;\n /** Component label in the Puck sidebar. Defaults to \"Media Figure\". */\n label?: string;\n /** Label of the media field. Defaults to \"Photo\". */\n fieldLabel?: string;\n /** Metadata schema passed to MediaFigure — pins figcaption field order/labels. */\n schema?: MetadataFieldDef[];\n className?: string;\n captionClassName?: string;\n /** Rendered when no photo is chosen (or its URL fails origin validation). */\n placeholder?: ReactNode;\n}\n\nconst DEFAULT_TRANSFORM: ImageTransformParams = { width: 1200, height: 630, format: \"auto\" };\n\n/** Same production default as createMediaPlugin's workerUrl — same host serves both. */\nconst DEFAULT_MEDIA_BASE_URL = \"https://media.p1.pantheon.io\";\n\nconst placeholderStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"200px\",\n borderRadius: \"8px\",\n backgroundColor: \"#e5e5e5\",\n color: \"#525252\",\n fontSize: \"14px\",\n};\n\n/**\n * Builds a registerable Puck component around the rich `p1-media` field and\n * `MediaFigure`. Spares consumers the custom-field-type cast and the\n * width+height transform pitfall:\n *\n * ```tsx\n * const config = {\n * components: {\n * MediaFigureBlock: createMediaFigureBlock({ mediaBaseUrl: MEDIA_BASE }),\n * },\n * };\n * ```\n */\nexport function createMediaFigureBlock(\n options: MediaFigureBlockOptions,\n): ComponentConfig<MediaFigureBlockProps> {\n const {\n mediaBaseUrl = DEFAULT_MEDIA_BASE_URL,\n transform = DEFAULT_TRANSFORM,\n label = \"Media Figure\",\n fieldLabel = \"Photo\",\n schema,\n className,\n captionClassName,\n placeholder = \"Choose a photo from the media library\",\n } = options;\n\n return {\n label,\n fields: {\n // `p1-media` is registered by createMediaPlugin via overrides.fieldTypes,\n // so it is not part of Puck's built-in Field union.\n photo: { type: \"p1-media\", label: fieldLabel } as unknown as Field,\n },\n defaultProps: {\n photo: null,\n },\n render: ({ photo }: MediaFigureBlockProps): ReactElement => {\n const { src } = getMediaProps(photo ?? null, { mediaBaseUrl });\n if (!src) {\n return <div style={placeholderStyle}>{placeholder}</div>;\n }\n return (\n <MediaFigure\n image={photo ?? null}\n mediaBaseUrl={mediaBaseUrl}\n transform={transform}\n schema={schema}\n className={className}\n captionClassName={captionClassName}\n />\n );\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKO,IAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACXA,IAAAA,gBAA4C;;;ACWrC,SAAS,WAAW,OAAuB;AAChD,SAAO,QAAQ,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI;AACvC;AAEA,SAAS,UAAU,OAAgC;AACjD,SAAO,IAAI,gBAAgB,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE;AAC3E;AAEO,SAAS,YAAY,OAAyB;AACnD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,UAAU,KAAK;AAC9B,MAAI,OAAO,IAAI,WAAW,EAAG,QAAO;AACpC,SAAO,OAAO,IAAI,KAAK,MAAM,UAAU,UAAU;AACnD;AAGO,SAAS,YAAY,OAAgC;AAC1D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,UAAU,KAAK;AAC9B,QAAM,OAAO,CAAC,QAA+B;AAC3C,UAAM,MAAM,OAAO,IAAI,GAAG;AAC1B,QAAI,QAAQ,QAAQ,QAAQ,GAAI,QAAO;AACvC,UAAMC,KAAI,OAAO,GAAG;AACpB,WAAO,OAAO,SAASA,EAAC,IAAIA,KAAI;AAAA,EAClC;AACA,QAAM,OAAO,KAAK,WAAW;AAC7B,QAAM,MAAM,KAAK,UAAU;AAC3B,QAAM,QAAQ,KAAK,YAAY;AAC/B,QAAM,SAAS,KAAK,aAAa;AACjC,MAAI,SAAS,QAAQ,QAAQ,QAAQ,UAAU,QAAQ,WAAW,KAAM,QAAO;AAC/E,SAAO,EAAE,MAAM,KAAK,OAAO,OAAO;AACpC;AASO,SAAS,mBAAmB,SAAiB,MAAwB;AAE1E,SAAO,SAAS,UACZ,GAAG,OAAO,4BACV,GAAG,OAAO;AAChB;AAOO,SAAS,mBAAmB,SAAiB,MAAwB;AAC1E,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,IAAI,CAAC;AAC9C,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAG,CAAC;AAC5C,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,KAAK,CAAC;AAChD,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC;AAClD,SAAO,GAAG,OAAO,cAAc,IAAI,aAAa,GAAG,eAAe,KAAK,gBAAgB,MAAM;AAC/F;;;ACrEA,IAAAC,gBAAyD;;;ACAzD,mBAA0C;AA0BtC;AAVJ,IAAM,yBAAqB,4BAAkC,IAAI;AAE1D,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAGG;AACD,SACE,4CAAC,mBAAmB,UAAnB,EAA4B,OAAO,QACjC,UACH;AAEJ;AAEO,SAAS,iBAA8B;AAC5C,QAAM,UAAM,yBAAW,kBAAkB;AACzC,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,wDAAwD;AAC1E,SAAO;AACT;;;ACrCA,IAAAC,gBAAoC;AAI7B,IAAM,0BAA8C;AAAA,EACzD,EAAE,MAAM,OAAO,OAAO,YAAY,MAAM,SAAS;AACnD;AAGO,SAAS,cAAc,QAAgD;AAC5E,QAAM,MAAM,OAAO,KAAK,CAACC,OAAMA,GAAE,SAAS,KAAK;AAC/C,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,CAAC,KAAK,GAAG,OAAO,OAAO,CAACA,OAAMA,GAAE,SAAS,KAAK,CAAC;AACxD;AAOO,SAAS,iBAAqC;AACnD,QAAM,SAAS,eAAe;AAC9B,QAAM,WACJ,OAAO,kBAAkB,OAAO,eAAe,SAAS,IACpD,OAAO,iBACP;AACN,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA6B,QAAQ;AAEjE,+BAAU,MAAM;AACd,QAAI,YAAY;AAChB,KAAC,YAAY;AACX,UAAI;AACF,cAAM,QAAQ,MAAM,OAAO,aAAa;AACxC,cAAM,UAAuB,QAAQ,EAAE,eAAe,YAAY,MAAM,IAAI,CAAC;AAC7E,cAAM,MAAM,MAAM,MAAM,OAAO,YAAY,iBAAiB,EAAE,QAAQ,CAAC;AACvE,YAAI,CAAC,IAAI,GAAI;AACb,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAI,CAAC,aAAa,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,GAAG;AACxD,oBAAU,IAA0B;AAAA,QACtC;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,GAAG;AACH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;;;ACxCO,SAAS,eACd,QACA,KAC+B;AAC/B,QAAM,OAAsC,CAAC;AAC7C,SAAO,QAAQ,CAACC,IAAGC,OAAM;AACvB,UAAM,QAAQ,IAAIA,EAAC,GAAG,KAAK;AAC3B,SAAKD,GAAE,IAAI,IAAI,QAAQ,QAAQ;AAAA,EACjC,CAAC;AACD,SAAO;AACT;AAUO,SAAS,mBACd,MACA,QACA,UACA,UACsF;AACtF,QAAM,OAAY,CAAC;AACnB,QAAM,aAAyB,CAAC;AAChC,QAAM,eAAiC,CAAC;AACxC,QAAM,eAA4B,CAAC;AACnC,OAAK,QAAQ,CAAC,KAAKE,OAAM;AACvB,QAAI,SAASA,EAAC,GAAG,SAAS,OAAQ;AAClC,SAAK,KAAK,GAAG;AACb,eAAW,KAAK,OAAOA,EAAC,KAAK,CAAC,CAAC;AAC/B,iBAAa,KAAK,SAASA,EAAC,KAAK,CAAC,CAAC;AACnC,iBAAa,KAAK,SAASA,EAAC,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,EACrD,CAAC;AACD,SAAO,EAAE,MAAM,MAAM,QAAQ,YAAY,UAAU,cAAc,UAAU,aAAa;AAC1F;;;AC7BO,SAAS,cAAc,KAAyC;AACrE,MAAI,WAAW,IAAI;AACnB,MAAI,OAAO,aAAa,UAAU;AAEhC,QAAI;AACF,iBAAW,KAAK,MAAM,QAAQ;AAAA,IAChC,QAAQ;AACN,iBAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS,IAAI;AAAA,IACb,WAAW,IAAI;AAAA,IACf,KAAK,OAAO,IAAI,OAAO,EAAE;AAAA,IACzB,UAAU,OAAO,IAAI,YAAY,EAAE;AAAA,IACnC,aAAa,IAAI;AAAA,IACjB,MAAM,IAAI;AAAA,IACV,OAAO,IAAI;AAAA,IACX,QAAQ,IAAI;AAAA,IACZ,UAAU,YAAY,OAAO,aAAa,WAAW,WAAW;AAAA,IAChE,mBAAmB,IAAI;AAAA,IACvB,WAAW,IAAI;AAAA,EACjB;AACF;AAGO,SAAS,eAAe,MAA4B;AACzD,MAAI,CAAC,MAAM,QAAQ,IAAI,EAAG,QAAO,CAAC;AAClC,SAAO,KAAK,IAAI,CAACC,OAAM,cAAcA,EAA4B,CAAC;AACpE;;;ACrCO,IAAM,gBAA2B,EAAE,MAAM,SAAS;AA6BlD,IAAM,kBAAN,cAA8B,MAAM;AAAA,EAEzC,YAAY,SAAiB,UAA0B;AACrD,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,WAAW;AAAA,EAClB;AACF;AAEA,SAAS,aAAa,QAA8B;AAClD,QAAM,SAAS,IAAI,gBAAgB,EAAE,QAAQ,OAAO,OAAO,CAAC;AAC5D,MAAI,OAAO,aAAc,QAAO,IAAI,gBAAgB,OAAO,YAAY;AACvE,SAAO,OAAO,SAAS;AACzB;AAEA,eAAe,SAAS,QAAsB,MAAc,MAAkC;AAC5F,SAAO,MAAM,GAAG,OAAO,SAAS,GAAG,IAAI,IAAI,aAAa,MAAM,CAAC,IAAI;AAAA,IACjE,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB,SAAS,EAAE,GAAI,MAAM,OAAO,eAAe,GAAI,gBAAgB,mBAAmB;AAAA,EACpF,CAAC;AACH;AASA,eAAsB,UACpB,QACA,MACA,UACA,SACA,UACA,QACwD;AACxD,MAAI,YAAY,SAAS;AACzB,MAAI,WAAW,SAAS,YAAY;AAEpC,MAAI,CAAC,UAAU;AACb,WAAO,YAAY;AACnB,UAAM,cAAc,UAAU,UAAU,mBAAmB,OAAO,CAAC,sBAAsB;AACzF,QAAI;AACJ,QAAI;AACF,wBAAkB,MAAM,SAAS,QAAQ,aAAa;AAAA,QACpD,UAAU,KAAK;AAAA,QACf,aAAa,KAAK;AAAA,QAClB,MAAM,KAAK;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,IAAI,gBAAgB,+BAAgC,IAAc,OAAO,IAAI,CAAC,CAAC;AAAA,IACvF;AACA,QAAI,CAAC,gBAAgB,GAAI,OAAM,IAAI,gBAAgB,mBAAmB,gBAAgB,MAAM,KAAK,CAAC,CAAC;AACnG,UAAM,mBAAkC,MAAM,gBAAgB,KAAK;AACnE,gBAAY;AAEZ,WAAO,WAAW;AAClB,QAAI;AACJ,QAAI;AACF,oBAAc,MAAM,MAAM,iBAAiB,WAAW;AAAA,QACpD,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,SAAS,EAAE,gBAAgB,KAAK,KAAK;AAAA,MACvC,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,IAAI,gBAAgB,6BAA8B,IAAc,OAAO,IAAI,CAAC,CAAC;AAAA,IACrF;AACA,QAAI,CAAC,YAAY,GAAI,OAAM,IAAI,gBAAgB,6BAA6B,YAAY,MAAM,KAAK,CAAC,CAAC;AACrG,eAAW;AAAA,EACb;AAEA,QAAM,eAA+B,EAAE,WAAW,SAAS;AAC3D,MAAI,cAAc,QAAW;AAG3B,UAAM,IAAI,gBAAgB,8CAA8C,YAAY;AAAA,EACtF;AACA,QAAM,kBAAkB;AAExB,SAAO,YAAY;AACnB,QAAM,eAAe,UACjB,UAAU,mBAAmB,OAAO,CAAC,uBACrC;AACJ,QAAM,eAAe,UACjB,EAAE,WAAW,gBAAgB,WAAW,UAAU,gBAAgB,SAAS,IAC3E;AAAA,IACE,SAAS,gBAAgB;AAAA,IACzB,WAAW,gBAAgB;AAAA,IAC3B,UAAU,gBAAgB;AAAA,IAC1B;AAAA,EACF;AACJ,MAAI;AACJ,MAAI;AACF,uBAAmB,MAAM,SAAS,QAAQ,cAAc,YAAY;AAAA,EACtE,SAAS,KAAK;AACZ,UAAM,IAAI,gBAAgB,+BAAgC,IAAc,OAAO,IAAI,YAAY;AAAA,EACjG;AACA,MAAI,CAAC,iBAAiB,GAAI,OAAM,IAAI,gBAAgB,oBAAoB,iBAAiB,MAAM,KAAK,YAAY;AAEhH,QAAM,OAAO,cAAc,MAAM,iBAAiB,KAAK,CAAC;AACxD,SAAO,EAAE,MAAM,UAAU,aAAa;AACxC;;;AChJA,IAAAC,gBAAiC;AA+B7B,IAAAC,sBAAA;AA5BG,SAAS,oBAAoB,OAGjC;AACD,QAAM,EAAE,WAAW,gBAAgB,IAAI;AACvC,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,KAAK;AAClD,QAAM,mBAAe,sBAAyB,IAAI;AAElD,QAAM,iBAAiB,CAACC,OAAuB;AAC7C,IAAAA,GAAE,eAAe;AACjB,IAAAA,GAAE,gBAAgB;AAClB,kBAAc,IAAI;AAAA,EACpB;AAEA,QAAM,kBAAkB,CAACA,OAAuB;AAC9C,IAAAA,GAAE,eAAe;AACjB,IAAAA,GAAE,gBAAgB;AAClB,kBAAc,KAAK;AAAA,EACrB;AAEA,QAAM,aAAa,CAACA,OAAuB;AACzC,IAAAA,GAAE,eAAe;AACjB,IAAAA,GAAE,gBAAgB;AAClB,kBAAc,KAAK;AACnB,oBAAgBA,GAAE,aAAa,KAAK;AAAA,EACtC;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,QAAQ,aAAa,sBAAsB;AAAA,QAC3C,cAAc;AAAA,QACd,SAAS;AAAA,QACT,WAAW;AAAA,QACX,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,iBAAiB,aAAa,YAAY;AAAA,QAC1C,YAAY;AAAA,MACd;AAAA,MACA,SAAS,MAAM,aAAa,SAAS,MAAM;AAAA,MAC3C,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,QAAQ;AAAA,MAER;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,MAAK;AAAA,YACL,QAAO;AAAA,YACP,UAAQ;AAAA,YACR,OAAO,EAAE,SAAS,OAAO;AAAA,YACzB,UAAU,CAACA,OAAM,gBAAgBA,GAAE,OAAO,KAAK;AAAA;AAAA,QACjD;AAAA,QACA,6CAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,cAAc,OAAO,OAAO,OAAO,GAChE,sBAAY,WAAM,UACrB;AAAA,QACA,6CAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,UAAU,OAAO,GAC3C,sBAAY,iBAAiB,6CAChC;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC/DA,IAAAC,gBAAqD;;;ACGrD,SAAS,mBAAmB,MAAc,OAA2B;AACnE,QAAM,OAAmB,CAAC;AAC1B,MAAI,MAAgB,CAAC;AACrB,MAAI,OAAO;AACX,MAAI,WAAW;AACf,WAASC,KAAI,GAAGA,KAAI,KAAK,QAAQA,MAAK;AACpC,UAAM,KAAK,KAAKA,EAAC;AACjB,QAAI,UAAU;AACZ,UAAI,OAAO,KAAK;AACd,YAAI,KAAKA,KAAI,CAAC,MAAM,KAAK;AACvB,kBAAQ;AACR,UAAAA;AAAA,QACF,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF,WAAW,OAAO,OAAO,SAAS,IAAI;AACpC,iBAAW;AAAA,IACb,WAAW,OAAO,OAAO;AACvB,UAAI,KAAK,IAAI;AACb,aAAO;AAAA,IACT,WAAW,OAAO,QAAQ,OAAO,MAAM;AACrC,UAAI,OAAO,QAAQ,KAAKA,KAAI,CAAC,MAAM,KAAM,CAAAA;AACzC,UAAI,KAAK,IAAI;AACb,aAAO;AACP,WAAK,KAAK,GAAG;AACb,YAAM,CAAC;AAAA,IACT,OAAO;AACL,cAAQ;AAAA,IACV;AAAA,EACF;AACA,MAAI,SAAS,MAAM,IAAI,SAAS,GAAG;AACjC,QAAI,KAAK,IAAI;AACb,SAAK,KAAK,GAAG;AAAA,EACf;AAEA,SAAO,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,CAAC,EAAE,MAAM,CAACC,OAAMA,OAAM,EAAE,EAAG,MAAK,IAAI;AACjF,SAAO;AACT;AAMO,SAAS,eAAe,MAA0B;AACvD,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,SAAO,mBAAmB,MAAM,KAAK,SAAS,GAAI,IAAI,MAAO,GAAG;AAClE;AAEA,SAAS,KAAKC,IAAmB;AAC/B,SAAOA,GAAE,KAAK,EAAE,YAAY;AAC9B;AAEA,IAAM,mBAAmB,oBAAI,IAAI,CAAC,YAAY,QAAQ,MAAM,CAAC;AAQtD,SAAS,aACd,KACA,QACgC;AAChC,MAAI,UAAU;AACd,QAAM,UAAmC,IAAI,IAAI,MAAM,EAAE;AACzD,WAASD,KAAI,GAAGA,KAAI,IAAI,QAAQA,MAAK;AACnC,UAAM,OAAO,KAAK,IAAIA,EAAC,CAAC;AACxB,QAAI,SAAS,GAAI;AACjB,QAAI,iBAAiB,IAAI,IAAI,GAAG;AAC9B,cAAQA,EAAC,IAAI;AACb;AACA;AAAA,IACF;AACA,UAAM,MAAM,OAAO,UAAU,CAACE,OAAM,KAAKA,GAAE,IAAI,MAAM,QAAQ,KAAKA,GAAE,KAAK,MAAM,IAAI;AACnF,QAAI,QAAQ,GAAI,QAAO;AACvB,YAAQF,EAAC,IAAI;AACb;AAAA,EACF;AACA,SAAO,UAAU,IAAI,UAAU;AACjC;AA8BO,SAAS,eAAe,MAAgD;AAC7E,QAAM,EAAE,MAAM,QAAQ,WAAW,SAAS,WAAW,UAAU,IAAI;AACnE,QAAM,SAAS,eAAe,IAAI;AAClC,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,YACJ,OAAO,SAAS,KAAM,OAAO,CAAC,EAAE,SAAS,KAAK,KAAK,SAAS,GAAI;AAClE,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,OAAO,QAAQ,IAAI,CAACG,OAAM,CAAC,GAAGA,EAAC,CAAC;AAEtC,QAAM,SAAS,aAAa,OAAO,CAAC,GAAG,MAAM;AAC7C,MAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,UAAM,WAAW,OAAO,MAAM,CAAC;AAC/B,UAAM,cAAc,OAAO,QAAQ,UAAU;AAC7C,aAASJ,KAAI,GAAGA,KAAI,SAAS,QAAQA,MAAK;AACxC,UAAI;AACJ,UAAI,gBAAgB,IAAI;AACtB,cAAM,SAAS,KAAK,SAASA,EAAC,EAAE,WAAW,KAAK,EAAE;AAClD,oBAAY,UAAU,UAAU,CAACK,OAAM,KAAKA,EAAC,MAAM,MAAM;AACzD,YAAI,cAAc,GAAI;AAAA,MACxB,OAAO;AACL,oBAAYL;AACZ,YAAI,aAAa,KAAK,OAAQ;AAAA,MAChC;AACA,eAASC,KAAI,GAAGA,KAAI,SAASD,EAAC,EAAE,QAAQC,MAAK;AAC3C,cAAM,WAAW,OAAOA,EAAC;AACzB,YAAI,OAAO,aAAa,YAAY,WAAW,EAAG;AAClD,aAAK,SAAS,EAAE,QAAQ,IAAI,SAASD,EAAC,EAAEC,EAAC,KAAK;AAAA,MAChD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,WAASG,KAAI,GAAGA,KAAI,OAAO,QAAQA,MAAK;AACtC,UAAM,YAAY,YAAYA;AAC9B,QAAI,aAAa,KAAK,OAAQ;AAC9B,aAASH,KAAI,GAAGA,KAAI,OAAOG,EAAC,EAAE,QAAQH,MAAK;AACzC,YAAM,YAAY,YAAYA;AAC9B,UAAI,aAAa,OAAO,OAAQ;AAChC,WAAK,SAAS,EAAE,SAAS,IAAI,OAAOG,EAAC,EAAEH,EAAC;AAAA,IAC1C;AAAA,EACF;AACA,SAAO;AACT;;;ADtDY,IAAAK,sBAAA;AAtFL,SAAS,aAAa,OASZ;AACf,QAAM,EAAE,QAAQ,MAAM,QAAQ,UAAU,UAAU,UAAU,IAAI;AAChE,QAAM,gBAAY,sBAAsC,CAAC,CAAC;AAC1D,YAAU,UAAU,KAAK,IAAI,CAAC,GAAGC,OAAM,UAAU,QAAQA,EAAC,KAAK,CAAC,CAAC;AAEjE,+BAAU,MAAM;AACd,QAAI,UAAW,WAAU,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM;AAAA,EAElD,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,CAACA,IAAWC,IAAW,MAAc;AACnD,UAAM,OAAO,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;AACzC,SAAKD,EAAC,EAAEC,EAAC,IAAI;AACb,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,YAAY,CAACD,IAAWC,OAAc;AAC1C,cAAU,QAAQD,EAAC,IAAIC,EAAC,GAAG,MAAM;AAAA,EACnC;AAEA,QAAM,gBAAgB,CAACC,IAAwBF,IAAWC,OAAc;AACtE,QAAIC,GAAE,QAAQ,WAAWA,GAAE,QAAQ,aAAa;AAC9C,MAAAA,GAAE,eAAe;AACjB,gBAAU,KAAK,IAAIF,KAAI,GAAG,KAAK,SAAS,CAAC,GAAGC,EAAC;AAAA,IAC/C,WAAWC,GAAE,QAAQ,WAAW;AAC9B,MAAAA,GAAE,eAAe;AACjB,gBAAU,KAAK,IAAIF,KAAI,GAAG,CAAC,GAAGC,EAAC;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,cAAc,CAACC,IAAyBF,IAAWC,OAAc;AACrE,UAAM,OAAOC,GAAE,cAAc,QAAQ,YAAY;AACjD,UAAM,OAAO,eAAe;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK;AAAA,MACtC,SAAS;AAAA,MACT,WAAWF;AAAA,MACX,WAAWC;AAAA,IACb,CAAC;AACD,QAAI,MAAM;AACR,MAAAC,GAAE,eAAe;AACjB,eAAS,IAAI;AAAA,IACf;AAAA,EAEF;AAEA,QAAM,iBAAsC;AAAA,IAC1C,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAEA,QAAM,UAA+B;AAAA,IACnC,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AAEA,SACE,6CAAC,SAAI,OAAO,EAAE,WAAW,OAAO,GAC9B;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,OAAO,EAAE,gBAAgB,YAAY,eAAe,OAAO,OAAO,OAAO;AAAA,MAEzE;AAAA,qDAAC,WACC,wDAAC,QACC;AAAA,uDAAC,QAAG,OAAO,SAAS,OAAM,OAAM,kBAEhC;AAAA,UACC,OAAO,IAAI,CAACC,OACX,8CAAC,QAAgB,OAAO,SAAS,OAAM,OACpC;AAAA,YAAAA,GAAE;AAAA,YACFA,GAAE,WAAW,OAAO;AAAA,eAFdA,GAAE,IAGX,CACD;AAAA,WACH,GACF;AAAA,QACA,6CAAC,WACE,eAAK,IAAI,CAAC,KAAKH,OACd,8CAAC,QACC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,OAAO;AAAA,gBACL,GAAG;AAAA,gBACH,YAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,UAAU;AAAA,cACZ;AAAA,cAEA,wDAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,GAC7D;AAAA,oBAAI,gBACH;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK,IAAI;AAAA,oBACT,KAAI;AAAA,oBACJ,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,WAAW;AAAA,sBACX,cAAc;AAAA,sBACd,YAAY;AAAA,oBACd;AAAA;AAAA,gBACF;AAAA,gBAEF,8CAAC,SAAI,OAAO,EAAE,UAAU,SAAS,GAC/B;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO,IAAI;AAAA,sBACX,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,UAAU;AAAA,wBACV,cAAc;AAAA,wBACd,YAAY;AAAA,wBACZ,UAAU;AAAA,sBACZ;AAAA,sBAEC,cAAI;AAAA;AAAA,kBACP;AAAA,kBACC,IAAI,UACH;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,OAAO,IAAI,OAAO,UAAU,YAAY;AAAA,sBAC1C;AAAA,sBAEC,cAAI,OAAO;AAAA;AAAA,kBACd;AAAA,mBAEJ;AAAA,iBACF;AAAA;AAAA,UACF;AAAA,UACC,OAAO,IAAI,CAACG,IAAGF,OACd,6CAAC,QAAgB,OAAO,EAAE,SAAS,EAAE,GACnC;AAAA,YAAC;AAAA;AAAA,cACC,KAAK,CAAC,OAAO;AACX,0BAAU,QAAQD,EAAC,EAAEC,EAAC,IAAI;AAAA,cAC5B;AAAA,cACA,MAAK;AAAA,cACL,OAAO,OAAOD,EAAC,IAAIC,EAAC,KAAK;AAAA,cACzB;AAAA,cACA,cAAY,GAAGE,GAAE,KAAK,QAAQ,IAAI,KAAK;AAAA,cACvC,UAAU,CAACD,OAAM,QAAQF,IAAGC,IAAGC,GAAE,OAAO,KAAK;AAAA,cAC7C,WAAW,CAACA,OAAM,cAAcA,IAAGF,IAAGC,EAAC;AAAA,cACvC,SAAS,CAACC,OAAM,YAAYA,IAAGF,IAAGC,EAAC;AAAA,cACnC,OAAO,EAAE,GAAG,gBAAgB,SAAS,WAAW,MAAM,EAAE;AAAA;AAAA,UAC1D,KAbOE,GAAE,IAcX,CACD;AAAA,aApEM,IAAI,GAqEb,CACD,GACH;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;;;AEhMO,SAAS,gBAAgB,WAAmC;AACjE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ,YAAY,gBAAgB;AAAA,IACpC,SAAS,YAAY,MAAM;AAAA,IAC3B,YAAY;AAAA,EACd;AACF;AAEO,SAAS,kBAAkB,WAAmC;AACnE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ,YAAY,gBAAgB;AAAA,IACpC,YAAY;AAAA,EACd;AACF;AAEO,IAAM,kBAAiC;AAAA,EAC5C,OAAO;AAAA,EACP,UAAU;AAAA,EACV,WAAW;AACb;AAEO,IAAM,oBAAmC;AAAA,EAC9C,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,cAAc;AAChB;AAEO,IAAM,sBAAqC;AAAA,EAChD,SAAS;AAAA,EACT,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,WAAW;AACb;;;ACXM,IAAAC,sBAAA;AAjCN,IAAM,aAAuD;AAAA,EAC3D,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,QAAQ;AAAA;AACV;AAEA,SAAS,YAAY,QAAgF;AACnG,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,SAAS,SAAU,QAAO,EAAE,MAAM,OAAO,SAAS,UAAU,SAAS,KAAK;AACrF,QAAM,OAAO,WAAW,OAAO,IAAI;AACnC,SAAO,OAAO,EAAE,KAAK,IAAI;AAC3B;AAGO,SAAS,iBAAiB,OAU9B;AACD,QAAM,EAAE,QAAQ,SAAS,eAAe,gBAAgB,eAAe,WAAW,YAAY,UAAU,SAAS,IAC/G;AAEF,SACE,8CAAC,SACC;AAAA,kDAAC,SAAI,OAAO,mBAAmB;AAAA;AAAA,MACZ,QAAQ;AAAA,MAAO;AAAA,MAAE,QAAQ,WAAW,IAAI,UAAU;AAAA,OACrE;AAAA,IACA,6CAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,OAAO,QAAQ,cAAc,OAAO,GAAG,8OAIvE;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,MAAM,QAAQ,IAAI,CAACC,IAAGC,QAAO;AAAA,UAC3B,KAAKA,KAAI,MAAMD,GAAE,KAAK;AAAA,UACtB,OAAOA,GAAE,KAAK;AAAA,UACd,cAAcA,GAAE;AAAA,UAChB,QAAQ,YAAY,cAAcC,EAAC,CAAC;AAAA,QACtC,EAAE;AAAA,QACF,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAS;AAAA;AAAA,IACX;AAAA,IACC,cAAc,6CAAC,SAAI,OAAO,iBAAkB,sBAAW;AAAA,IACxD,8CAAC,SAAI,OAAO,qBACV;AAAA,mDAAC,YAAO,MAAK,UAAS,SAAS,UAAU,UAAU,WAAW,OAAO,kBAAkB,SAAS,GAAG,oBAEnG;AAAA,MACA,6CAAC,YAAO,MAAK,UAAS,SAAS,UAAU,UAAU,WAAW,OAAO,gBAAgB,SAAS,GAC3F,sBAAY,oBAAe,UAAU,QAAQ,MAAM,IAAI,QAAQ,WAAW,IAAI,UAAU,QAAQ,IACnG;AAAA,OACF;AAAA,KACF;AAEJ;;;ACpCM,IAAAC,sBAAA;AA3BC,SAAS,eAAe,OAW5B;AACD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,SACE,8CAAC,SACC;AAAA,kDAAC,SAAI,OAAO,EAAE,GAAG,mBAAmB,cAAc,OAAO,GAAG;AAAA;AAAA,MAAgB,QAAQ;AAAA,OAAS;AAAA,IAC7F;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ;AAAA,YACE,KAAK,QAAQ,WAAW,QAAQ;AAAA,YAChC,OAAO,QAAQ;AAAA,YACf,cAAc,QAAQ;AAAA,UACxB;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAS;AAAA;AAAA,IACX;AAAA,IACC,cAAc,6CAAC,SAAI,OAAO,iBAAkB,sBAAW;AAAA,IACxD,8CAAC,SAAI,OAAO,qBACV;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,QAAO;AAAA,UACP,OAAO,EAAE,SAAS,OAAO;AAAA,UACzB,UAAU,CAACC,OAAM,eAAeA,GAAE,OAAO,QAAQ,CAAC,CAAC;AAAA;AAAA,MACrD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,gBAAgB,SAAS,MAAM;AAAA,UAC9C,UAAU;AAAA,UACV,OAAM;AAAA,UACN,OAAO,EAAE,GAAG,kBAAkB,SAAS,GAAG,aAAa,OAAO;AAAA,UAC/D;AAAA;AAAA,MAED;AAAA,MACA,6CAAC,YAAO,MAAK,UAAS,SAAS,UAAU,UAAU,WAAW,OAAO,kBAAkB,SAAS,GAAG,oBAEnG;AAAA,MACA,6CAAC,YAAO,MAAK,UAAS,SAAS,QAAQ,UAAU,WAAW,OAAO,gBAAgB,SAAS,GACzF,sBAAY,iBAAY,gBAC3B;AAAA,OACF;AAAA,KACF;AAEJ;;;AC5EA,IAAAC,gBAA4D;AAyIxD,IAAAC,sBAAA;AApIJ,IAAM,aAAa;AAGZ,SAAS,UAAU,OAcvB;AACD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,UAAU;AAC3D,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAAwB,IAAI;AAC1E,QAAM,kBAAc,sBAA8B,IAAI;AACtD,QAAM,eAAW,sBAAkC,CAAC,CAAC;AAGrD,+BAAU,MAAM;AACd,oBAAgB,UAAU;AAAA,EAC5B,GAAG,CAAC,KAAK,CAAC;AAGV,+BAAU,MAAM;AACd,UAAM,WAAW,YAAY;AAC7B,QAAI,CAAC,YAAY,OAAO,yBAAyB,YAAa;AAC9D,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,YAAY;AACX,YAAI,QAAQ,KAAK,CAAC,UAAU,MAAM,cAAc,GAAG;AACjD,0BAAgB,CAAC,UAAU,QAAQ,UAAU;AAAA,QAC/C;AAAA,MACF;AAAA,MACA,EAAE,MAAM,UAAU,SAAS,YAAY,QAAQ;AAAA,IACjD;AACA,aAAS,QAAQ,QAAQ;AACzB,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,MAAM,QAAQ,cAAc,SAAS,CAAC;AAI1C,QAAM,iBAAiB,MAAc;AACnC,UAAM,QAAQ,SAAS,QAAQ,OAAO,CAACC,OAA2BA,OAAM,IAAI;AAC5E,QAAI,MAAM,UAAU,EAAG,QAAO;AAC9B,UAAM,WAAW,MAAM,CAAC,EAAE;AAC1B,QAAI,UAAU;AACd,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,cAAc,SAAU;AACjC;AAAA,IACF;AACA,WAAO,KAAK,IAAI,GAAG,OAAO;AAAA,EAC5B;AAEA,QAAM,YAAY,CAAC,UAAkB;AACnC,qBAAiB,KAAK;AACtB,aAAS,QAAQ,KAAK,GAAG,MAAM;AAAA,EACjC;AAEA,QAAM,oBAAoB,CAACC,IAAwB,OAAe,SAAoB;AACpF,UAAM,WAAW,KAAK,IAAI,MAAM,QAAQ,YAAY;AACpD,UAAM,UAAU,eAAe;AAC/B,QAAI,OAAsB;AAC1B,YAAQA,GAAE,KAAK;AAAA,MACb,KAAK;AACH,eAAO,KAAK,IAAI,QAAQ,GAAG,WAAW,CAAC;AACvC;AAAA,MACF,KAAK;AACH,eAAO,KAAK,IAAI,QAAQ,GAAG,CAAC;AAC5B;AAAA,MACF,KAAK;AACH,eAAO,KAAK,IAAI,QAAQ,SAAS,WAAW,CAAC;AAC7C;AAAA,MACF,KAAK;AACH,eAAO,KAAK,IAAI,QAAQ,SAAS,CAAC;AAClC;AAAA,MACF,KAAK;AACH,eAAO;AACP;AAAA,MACF,KAAK;AACH,eAAO,WAAW;AAClB;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,QAAAA,GAAE,eAAe;AACjB,qBAAa,IAAI;AACjB;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,KAAK,SAAS;AAChB,UAAAA,GAAE,eAAe;AACjB,sBAAY,IAAI;AAAA,QAClB;AACA;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,KAAK,SAAS;AAChB,UAAAA,GAAE,eAAe;AACjB,6BAAmB,KAAK,OAAO;AAAA,QACjC;AACA;AAAA,MACF,KAAK;AACH,YAAI,iBAAiB;AACnB,UAAAA,GAAE,eAAe;AACjB,6BAAmB,IAAI;AAAA,QACzB;AACA;AAAA,MACF;AACE;AAAA,IACJ;AACA,IAAAA,GAAE,eAAe;AACjB,cAAU,IAAI;AAAA,EAChB;AAEA,SACE,8EAEE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,aAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU,CAACA,OAAM,eAAeA,GAAE,OAAO,KAAK;AAAA,QAC9C,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,WAAW;AAAA,UACX,cAAc;AAAA,QAChB;AAAA;AAAA,IACF;AAAA,IAGC,UACC,6CAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,QAAQ,OAAO,QAAQ,UAAU,OAAO,GAAG,wBAAU,IAC/F,MAAM,WAAW,IACnB,6CAAC,SAAI,OAAO,EAAE,WAAW,UAAU,SAAS,QAAQ,OAAO,QAAQ,UAAU,OAAO,GAAG,4BAAc,IAErG;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,KAAK;AAAA,QACP;AAAA,QAEC,gBAAM,MAAM,GAAG,YAAY,EAAE,IAAI,CAAC,MAAMC,OACvC;AAAA,UAAC;AAAA;AAAA,YAEC,KAAK,CAAC,OAAO;AACX,uBAAS,QAAQA,EAAC,IAAI;AAAA,YACxB;AAAA,YACA,MAAK;AAAA,YACL,iBAAe;AAAA,YACf,cAAY,KAAK;AAAA,YACjB,UAAUA,OAAM,KAAK,IAAI,UAAU,KAAK,IAAI,MAAM,QAAQ,YAAY,IAAI,CAAC,IAAI,IAAI;AAAA,YACnF,OAAO;AAAA,cACL,UAAU;AAAA,cACV,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,iBAAiB;AAAA,cACjB,SAAS;AAAA,YACX;AAAA,YACA,SAAS,MAAM,aAAa,IAAI;AAAA,YAChC,WAAW,CAACD,OAAM,kBAAkBA,IAAGC,IAAG,IAAI;AAAA,YAC9C,SAAS,CAACD,OAAM;AACd,+BAAiBC,EAAC;AAClB,cAAAD,GAAE,cAAc,MAAM,cAAc;AACpC,cAAAA,GAAE,cAAc,MAAM,YAAY;AAAA,YACpC;AAAA,YACA,QAAQ,CAACA,OAAM;AACb,cAAAA,GAAE,cAAc,MAAM,cAAc;AACpC,cAAAA,GAAE,cAAc,MAAM,YAAY;AAAA,YACpC;AAAA,YACA,cAAc,CAACA,OAAM;AACnB,cAAAA,GAAE,cAAc,MAAM,cAAc;AACpC,cAAAA,GAAE,cACC,iBAA8B,oCAAoC,EAClE,QAAQ,CAAC,QAAS,IAAI,MAAM,UAAU,GAAI;AAAA,YAC/C;AAAA,YACA,cAAc,CAACA,OAAM;AACnB,cAAAA,GAAE,cAAc,MAAM,cAAc;AACpC,cAAAA,GAAE,cACC,iBAA8B,oCAAoC,EAClE,QAAQ,CAAC,QAAS,IAAI,MAAM,UAAU,KAAM;AAAA,YACjD;AAAA,YAEC;AAAA,mBAAK,WACJ;AAAA,gBAAC;AAAA;AAAA,kBACC,iBAAa;AAAA,kBACb,OAAM;AAAA,kBACN,cAAY,oBAAoB,KAAK,QAAQ;AAAA,kBAC7C,UAAU;AAAA,kBACV,SAAS,CAACA,OAAM;AACd,oBAAAA,GAAE,gBAAgB;AAClB,gCAAY,IAAI;AAAA,kBAClB;AAAA,kBACA,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,KAAK;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,iBAAiB;AAAA,oBACjB,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,WAAW;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,kBAClB;AAAA,kBACD;AAAA;AAAA,cAED;AAAA,cAED,KAAK,WACJ;AAAA,gBAAC;AAAA;AAAA,kBACC,mBAAe;AAAA,kBACf,OAAM;AAAA,kBACN,cAAY,UAAU,KAAK,QAAQ;AAAA,kBACnC,UAAU;AAAA,kBACV,SAAS,CAACA,OAAM;AACd,oBAAAA,GAAE,gBAAgB;AAClB,uCAAmB,KAAK,WAAW,IAAI;AAAA,kBACzC;AAAA,kBACA,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,KAAK;AAAA,oBACL,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,iBAAiB;AAAA,oBACjB,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,WAAW;AAAA,oBACX,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,kBAClB;AAAA,kBACA,cAAc,CAACA,OAAM;AACnB,oBAAAA,GAAE,cAAc,MAAM,UAAU;AAChC,oBAAAA,GAAE,cAAc,MAAM,kBAAkB;AAAA,kBAC1C;AAAA,kBACA,cAAc,CAACA,OAAM;AACnB,oBAAAA,GAAE,cAAc,MAAM,kBAAkB;AAAA,kBAC1C;AAAA,kBACD;AAAA;AAAA,cAED;AAAA,cAEF;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK,KAAK;AAAA,kBACV,KAAK,KAAK;AAAA,kBACV,SAAQ;AAAA,kBACR,UAAS;AAAA,kBACT,OAAO,EAAE,OAAO,QAAQ,QAAQ,SAAS,WAAW,SAAS,SAAS,QAAQ;AAAA;AAAA,cAChF;AAAA,cACC,KAAK,WAAW,oBAAoB,KAAK,WACxC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,cAAY,UAAU,KAAK,QAAQ;AAAA,kBACnC,SAAS,CAACA,OAAMA,GAAE,gBAAgB;AAAA,kBAClC,WAAW,CAACA,OAAM;AAEhB,oBAAAA,GAAE,gBAAgB;AAClB,wBAAIA,GAAE,QAAQ,UAAU;AACtB,yCAAmB,IAAI;AACvB,+BAAS,QAAQC,EAAC,GAAG,MAAM;AAAA,oBAC7B;AAAA,kBACF;AAAA,kBACA,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,iBAAiB;AAAA,oBACjB,SAAS;AAAA,oBACT,eAAe;AAAA,oBACf,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,KAAK;AAAA,oBACL,SAAS;AAAA,kBACX;AAAA,kBAEA;AAAA,iEAAC,SAAI,OAAO,EAAE,OAAO,SAAS,UAAU,QAAQ,YAAY,KAAK,WAAW,SAAS,GAAG,gCAExF;AAAA,oBACA,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,MAAM,GACxC;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,WAAS;AAAA,0BACT,SAAS,CAACD,OAAM;AACd,4BAAAA,GAAE,gBAAgB;AAClB,+CAAmB,IAAI;AACvB,yCAAa,IAAI;AAAA,0BACnB;AAAA,0BACA,OAAO;AAAA,4BACL,SAAS;AAAA,4BACT,iBAAiB;AAAA,4BACjB,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,cAAc;AAAA,4BACd,UAAU;AAAA,4BACV,YAAY;AAAA,4BACZ,QAAQ;AAAA,4BACR,YAAY;AAAA,0BACd;AAAA,0BACD;AAAA;AAAA,sBAED;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,CAACA,OAAM;AACd,4BAAAA,GAAE,gBAAgB;AAClB,+CAAmB,IAAI;AACvB,qCAAS,QAAQC,EAAC,GAAG,MAAM;AAAA,0BAC7B;AAAA,0BACA,OAAO;AAAA,4BACL,SAAS;AAAA,4BACT,iBAAiB;AAAA,4BACjB,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,cAAc;AAAA,4BACd,UAAU;AAAA,4BACV,YAAY;AAAA,4BACZ,QAAQ;AAAA,4BACR,YAAY;AAAA,0BACd;AAAA,0BACD;AAAA;AAAA,sBAED;AAAA,uBACF;AAAA;AAAA;AAAA,cACF;AAAA,cAEF;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,cAAc;AAAA,oBACd,YAAY;AAAA,kBACd;AAAA,kBACA,OAAO,KAAK;AAAA,kBAEX,eAAK;AAAA;AAAA,cACR;AAAA;AAAA;AAAA,UAxNK,KAAK,WAAW,KAAK;AAAA,QAyN5B,CACD;AAAA;AAAA,IACH;AAAA,IAED,MAAM,SAAS,gBAAgB,6CAAC,SAAI,KAAK,aAAa,eAAY,QAAO,OAAO,EAAE,QAAQ,MAAM,GAAG;AAAA,KACtG;AAEJ;;;AZnCQ,IAAAC,sBAAA;AAvUR,IAAM,aAAa;AAInB,SAAS,WAAW,QAAuE;AACzF,QAAM,SAAS,IAAI,gBAAgB,EAAE,QAAQ,OAAO,OAAO,CAAC;AAC5D,MAAI,OAAO,aAAc,QAAO,IAAI,gBAAgB,OAAO,YAAY;AACvE,SAAO;AACT;AAEO,SAAS,aAAa,EAAE,QAAQ,SAAS,UAAU,aAAa,GAAsB;AAC3F,QAAM,SAAS,eAAe;AAC9B,QAAM,SAAS,cAAc,eAAe,CAAC;AAC7C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAsB,CAAC,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,EAAE;AAGjD,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,CAAC;AAE1C,QAAM,CAAC,SAAS,UAAU,QAAI,wBAA+C,CAAC,CAAC;AAC/E,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAqB,CAAC,CAAC;AAIjE,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,wBAA2B,CAAC,CAAC;AAC3E,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAsB,CAAC,CAAC;AAKlE,QAAM,CAAC,SAAS,UAAU,QAAI,wBAA2B,IAAI;AAC7D,QAAM,CAAC,YAAY,aAAa,QAAI,wBAA6B,CAAC,CAAC;AACnE,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAqB,CAAC,CAAC;AAC3D,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAwB,IAAI;AAChE,QAAM,sBAAkB,sBAAyB,IAAI;AACrD,QAAM,gBAAY,sBAA8B,IAAI;AAEpD,QAAM,qBAAiB,2BAAY,YAAkC;AACnE,UAAM,QAAQ,MAAM,OAAO,aAAa;AACxC,WAAO,QAAQ,EAAE,eAAe,YAAY,MAAM,IAAI,CAAC;AAAA,EACzD,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,iBAAa;AAAA,IACjB,OAAO,WAAoB;AACzB,iBAAW,IAAI;AACf,UAAI;AACF,cAAM,SAAS,WAAW,MAAM;AAChC,eAAO,IAAI,SAAS,UAAU;AAC9B,YAAI,OAAQ,QAAO,IAAI,UAAU,MAAM;AACvC,cAAM,WAAW,MAAM;AAAA,UACrB,OAAO,YAAY,YAAY,OAAO,SAAS;AAAA,UAC/C,EAAE,SAAS,MAAM,eAAe,EAAE;AAAA,QACpC;AACA,YAAI,SAAS,IAAI;AACf,mBAAS,eAAe,MAAM,SAAS,KAAK,CAAC,CAAC;AAC9C,sBAAY,CAAC;AAAA,QACf;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,0BAA0B,KAAK;AAAA,MAC/C,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,cAAc;AAAA,EACzB;AAEA,+BAAU,MAAM;AACd,QAAI,QAAQ;AACV,iBAAW;AACX,qBAAe,EAAE;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,QAAQ,UAAU,CAAC;AAEvB,QAAM,wBAAoB,sBAAO,KAAK;AACtC,+BAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX,wBAAkB,UAAU;AAC5B;AAAA,IACF;AAEA,QAAI,CAAC,kBAAkB,SAAS;AAC9B,wBAAkB,UAAU;AAC5B;AAAA,IACF;AACA,UAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAW,eAAe,MAAS;AAAA,IACrC,GAAG,GAAG;AACN,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,aAAa,QAAQ,UAAU,CAAC;AAIpC,QAAM,aAAa,CAAC,UAA2B;AAC7C,QAAI,CAAC,SAAS,MAAM,WAAW,EAAG;AAClC,UAAM,SAAS,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC,UAAU;AAAA,MAC9C;AAAA,MACA,YAAY,IAAI,gBAAgB,IAAI;AAAA,IACtC,EAAE;AACF,eAAW,MAAM;AACjB,qBAAiB,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC;AACvD,uBAAmB,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;AACzC,qBAAiB,OAAO,IAAI,MAAM,aAAa,CAAC;AAChD,kBAAc,IAAI;AAAA,EACpB;AAEA,QAAM,mBAAe,2BAAY,MAAM;AACrC,eAAW,CAAC,SAAS;AACnB,WAAK,QAAQ,CAACC,OAAM,IAAI,gBAAgBA,GAAE,UAAU,CAAC;AACrD,aAAO,CAAC;AAAA,IACV,CAAC;AACD,qBAAiB,CAAC,CAAC;AACnB,uBAAmB,CAAC,CAAC;AACrB,qBAAiB,CAAC,CAAC;AACnB,kBAAc,IAAI;AAAA,EACpB,GAAG,CAAC,CAAC;AAGL,+BAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX,mBAAa;AACb,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,QAAQ,YAAY,CAAC;AAEzB,QAAM,YAAY,YAAY;AAC5B,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,UAAM,SAAuB;AAAA,MAC3B,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,cAAc,OAAO;AAAA,MACrB;AAAA,IACF;AAIA,UAAM,WAAW,QAAQ,IAAI,CAAC,GAAGC,OAAM,gBAAgBA,EAAC,KAAK,CAAC,CAAC;AAC/D,UAAM,WAAW,QAAQ,IAAI,CAAC,GAAGA,OAAM,cAAcA,EAAC,KAAK,aAAa;AACxE,aAASA,KAAI,GAAGA,KAAI,QAAQ,QAAQA,MAAK;AACvC,YAAM,WAAmC,CAAC;AAC1C,aAAO,QAAQ,CAACC,IAAGC,OAAM;AACvB,cAAM,QAAQ,cAAcF,EAAC,IAAIE,EAAC,GAAG,KAAK;AAC1C,YAAI,MAAO,UAASD,GAAE,IAAI,IAAI;AAAA,MAChC,CAAC;AACD,UAAI;AACF,cAAM,SAAS,MAAM,UAAU,QAAQ,QAAQD,EAAC,EAAE,MAAM,UAAU,QAAW,SAASA,EAAC,GAAG,CAAC,SAAS;AAClG,mBAASA,EAAC,IAAI,EAAE,KAAK;AACrB,2BAAiB,CAAC,GAAG,QAAQ,CAAC;AAAA,QAChC,CAAC;AACD,iBAASA,EAAC,IAAI,OAAO;AACrB,iBAASA,EAAC,IAAI,EAAE,MAAM,OAAO;AAAA,MAC/B,SAAS,OAAO;AACd,cAAM,UAAU,iBAAiB,kBAAkB,MAAM,UAAU;AACnE,YAAI,iBAAiB,gBAAiB,UAASA,EAAC,IAAI,MAAM;AAC1D,iBAASA,EAAC,IAAI,EAAE,MAAM,UAAU,OAAO,QAAQ;AAC/C,gBAAQ,MAAM,kBAAkB,KAAK;AAAA,MACvC;AACA,yBAAmB,CAAC,GAAG,QAAQ,CAAC;AAChC,uBAAiB,CAAC,GAAG,QAAQ,CAAC;AAAA,IAChC;AACA,QAAI;AACF,UAAI,SAAS,MAAM,CAACG,OAAMA,GAAE,SAAS,MAAM,GAAG;AAC5C,qBAAa;AAAA,MACf,OAAO;AAIL,gBAAQ,QAAQ,CAACJ,IAAGC,OAAM;AACxB,cAAI,SAASA,EAAC,EAAE,SAAS,OAAQ,KAAI,gBAAgBD,GAAE,UAAU;AAAA,QACnE,CAAC;AACD,cAAM,OAAO,mBAAmB,SAAS,eAAe,UAAU,QAAQ;AAC1E,mBAAW,KAAK,IAAI;AACpB,yBAAiB,KAAK,MAAM;AAC5B,2BAAmB,KAAK,QAAQ;AAChC,yBAAiB,KAAK,QAAQ;AAC9B,cAAM,WAAW,KAAK,KAAK;AAC3B;AAAA,UACE,GAAG,QAAQ,OAAO,QAAQ,MAAM;AAAA,QAClC;AAAA,MACF;AACA,YAAM,WAAW,eAAe,MAAS;AAAA,IAC3C,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,YAAY,CAAC,SAAoB;AACrC,eAAW,IAAI;AACf,kBAAc,MAAM;AACpB,kBAAc,CAAC,OAAO,IAAI,CAACE,OAAM,KAAK,WAAWA,GAAE,IAAI,KAAK,EAAE,CAAC,CAAC;AAChE,kBAAc,IAAI;AAAA,EACpB;AAEA,QAAM,WAAW,YAAY;AAC3B,QAAI,CAAC,SAAS,QAAS;AACvB,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,QAAI;AAGF,YAAM,OAAO,eAAe,YAAY,WAAW,CAAC,KAAK,CAAC,CAAC;AAC3D,YAAM,SAAS,WAAW,MAAM;AAChC,YAAM,WAAW,MAAM;AAAA,QACrB,OAAO,YAAY,YAAY,mBAAmB,QAAQ,OAAO,IAAI,MAAM,OAAO,SAAS;AAAA,QAC3F;AAAA,UACE,QAAQ;AAAA,UACR,MAAM,KAAK,UAAU,IAAI;AAAA,UACzB,SAAS,EAAE,GAAI,MAAM,eAAe,GAAI,gBAAgB,mBAAmB;AAAA,QAC7E;AAAA,MACF;AACA,UAAI,SAAS,IAAI;AACf,mBAAW,IAAI;AACf,cAAM,WAAW,eAAe,MAAS;AAAA,MAC3C,OAAO;AACL,sBAAc,yBAAyB;AAAA,MACzC;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,4BAA4B,KAAK;AAC/C,oBAAc,yBAAyB;AAAA,IACzC,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAKA,QAAM,eAAe,OAAO,SAA2B;AACrD,QAAI,CAAC,QAAQ,CAAC,SAAS,QAAS;AAChC,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAClB,QAAI;AACF,YAAM,SAAuB;AAAA,QAC3B,WAAW,OAAO;AAAA,QAClB,QAAQ,OAAO;AAAA,QACf,cAAc,OAAO;AAAA,QACrB;AAAA,MACF;AAEA,YAAM,EAAE,KAAK,IAAI,MAAM,UAAU,QAAQ,MAAM,QAAW,QAAQ,SAAS,CAAC,GAAG,MAAM;AAAA,MAAC,CAAC;AAEvF,iBAAW,IAAI;AACf,YAAM,WAAW,eAAe,MAAS;AAAA,IAC3C,SAAS,OAAO;AACd,cAAQ,MAAM,4BAA4B,KAAK;AAC/C;AAAA,QACE,iBAAiB,kBAAkB,4BAA4B,MAAM,OAAO,KAAK;AAAA,MACnF;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAClB,UAAI,gBAAgB,QAAS,iBAAgB,QAAQ,QAAQ;AAAA,IAC/D;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,SAAoB;AACtC,QAAI,cAAc;AAChB,mBAAa,IAAI;AAAA,IACnB,OAAO;AACL,eAAS,KAAK,GAAG;AAAA,IACnB;AACA,YAAQ;AAAA,EACV;AAKA,QAAM,aAAa,CAAC,SAAoB;AACtC,UAAM,EAAE,QAAQ,IAAI;AACpB,QAAI,CAAC,QAAS;AACd,KAAC,YAAY;AACX,UAAI;AACF,cAAM,SAAS,WAAW,MAAM;AAChC,cAAM,WAAW,MAAM;AAAA,UACrB,OAAO,YAAY,YAAY,mBAAmB,OAAO,IAAI,MAAM,OAAO,SAAS;AAAA,UACnF;AAAA,YACE,QAAQ;AAAA,YACR,SAAS,MAAM,eAAe;AAAA,UAChC;AAAA,QACF;AACA,YAAI,SAAS,IAAI;AACf,gBAAM,WAAW,eAAe,MAAS;AAAA,QAC3C,OAAO;AACL,kBAAQ,MAAM,2BAA2B,SAAS,UAAU;AAAA,QAC9D;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,2BAA2B,KAAK;AAAA,MAChD;AAAA,IACF,GAAG;AAAA,EACL;AAEA,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA,SAAS;AAAA,MAET;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,iBAAiB;AAAA,YACjB,cAAc;AAAA,YACd,WACE;AAAA,YACF,UAAU;AAAA,YACV,OAAO;AAAA,YACP,WAAW;AAAA,YACX,SAAS;AAAA,YACT,eAAe;AAAA,YACf,UAAU;AAAA,UACZ;AAAA,UACA,SAAS,CAACG,OAAMA,GAAE,gBAAgB;AAAA,UAGlC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,cAAc;AAAA,kBACd,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,gBAClB;AAAA,gBAEA;AAAA,+DAAC,QAAG,OAAO,EAAE,QAAQ,GAAG,UAAU,QAAQ,YAAY,KAAK,OAAO,OAAO,GAAG,2BAAa;AAAA,kBACzF;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAS;AAAA,sBACT,OAAO;AAAA,wBACL,YAAY;AAAA,wBACZ,QAAQ;AAAA,wBACR,UAAU;AAAA,wBACV,QAAQ;AAAA,wBACR,OAAO;AAAA,wBACP,SAAS;AAAA,wBACT,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,SAAS;AAAA,wBACT,YAAY;AAAA,wBACZ,gBAAgB;AAAA,wBAChB,cAAc;AAAA,sBAChB;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA;AAAA;AAAA,YACF;AAAA,YAGA,6CAAC,SAAI,KAAK,WAAW,OAAO,EAAE,SAAS,QAAQ,WAAW,QAAQ,MAAM,EAAE,GACvE,kBAAQ,SAAS,IAChB;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,gBAAgB;AAAA,gBAChB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV,UAAU;AAAA;AAAA,YACZ,IACE,UACF;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,gBAAgB;AAAA,gBAChB;AAAA,gBACA;AAAA,gBACA,UAAU,MAAM,WAAW,IAAI;AAAA,gBAC/B,QAAQ;AAAA,gBACR,gBAAgB;AAAA,gBAChB;AAAA;AAAA,YACF,IAEA,8EACE;AAAA,2DAAC,uBAAoB,WAAsB,iBAAiB,YAAY;AAAA,cACxE;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,gBAAgB;AAAA,kBAChB,cAAc;AAAA,kBACd,aAAa;AAAA,kBACb,cAAc;AAAA,kBACd;AAAA,kBACA;AAAA,kBACA,kBAAkB;AAAA;AAAA,cACpB;AAAA,eACF,GAEJ;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AF/YU,IAAAC,sBAAA;AAtCH,SAAS,iBAAiB,OAOhB;AACf,QAAM,EAAE,OAAO,UAAU,SAAS,IAAI;AACtC,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAS,KAAK;AAExD,QAAM,UAAU,WAAW,KAAK;AAChC,QAAM,WAAW,YAAY,KAAK;AAElC,QAAM,mBAAmB,CAAC,SAAmB;AAC3C,QAAI,CAAC,QAAS;AACd,aAAS,mBAAmB,SAAS,IAAI,CAAC;AAAA,EAC5C;AAEA,QAAM,eAAe,CAAC,QAAgB;AACpC,aAAS,mBAAmB,IAAI,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC;AACxD,qBAAiB,KAAK;AAAA,EACxB;AAEA,QAAM,aAAkC;AAAA,IACtC,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,QAAQ,WAAW,gBAAgB;AAAA,IACnC,YAAY;AAAA,EACd;AAEA,SACE,8CAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GACzB;AAAA,YACC,6CAAC,SAAI,OAAO,EAAE,cAAc,MAAM,GAChC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,OAAO;AAAA,UACL,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA;AAAA,IACF,GACF,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,cAAc;AAAA,UACd,OAAO;AAAA,UACP,UAAU;AAAA,UACV,QAAQ,WAAW,YAAY;AAAA,QACjC;AAAA,QACA,SAAS,MAAM,CAAC,YAAY,iBAAiB,IAAI;AAAA,QAClD;AAAA;AAAA,IAED;AAAA,IAGD,SACC,8CAAC,SAAI,OAAO,EAAE,cAAc,MAAM,GAChC;AAAA,mDAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,OAAO,QAAQ,YAAY,KAAK,cAAc,MAAM,GAAG,kBAEvF;AAAA,MACA,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,MAAM,GACxC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,SAAS,MAAM,iBAAiB,KAAK;AAAA,YACrC,OAAO;AAAA,cACL,GAAG;AAAA,cACH,iBAAiB,aAAa,QAAQ,YAAY;AAAA,cAClD,OAAO,aAAa,QAAQ,UAAU;AAAA,cACtC,aAAa,aAAa,QAAQ,YAAY;AAAA,cAC9C,SAAS,WAAW,MAAM;AAAA,YAC5B;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,SAAS,MAAM,iBAAiB,OAAO;AAAA,YACvC,OAAO;AAAA,cACL,GAAG;AAAA,cACH,iBAAiB,aAAa,UAAU,YAAY;AAAA,cACpD,OAAO,aAAa,UAAU,UAAU;AAAA,cACxC,aAAa,aAAa,UAAU,YAAY;AAAA,cAChD,SAAS,WAAW,MAAM;AAAA,YAC5B;AAAA,YACD;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,IAGF,8CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,MAAM,GACxC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,iBAAiB,IAAI;AAAA,UACpC,UAAU;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ,WAAW,gBAAgB;AAAA,YACnC,SAAS,WAAW,MAAM;AAAA,YAC1B,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,MAEC,SACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,SAAS,EAAE;AAAA,UAC1B,UAAU;AAAA,UACV,OAAO;AAAA,YACL,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ,WAAW,gBAAgB;AAAA,YACnC,SAAS,WAAW,MAAM;AAAA,YAC1B,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM,iBAAiB,KAAK;AAAA,QACrC,UAAU;AAAA;AAAA,IACZ;AAAA,KACF;AAEJ;;;AetKA,IAAAC,iBAA4C;;;ACWrC,IAAM,wBAAwB,oBAAI,IAAI;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,SAAS,aACd,OACqB;AACrB,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAYO,SAAS,eAAe,OAMX;AAClB,MAAI,CAAC,MAAM,WAAW,CAAC,MAAM,WAAW;AACtC,WAAO,MAAM;AAAA,EACf;AACA,QAAM,QAAoB;AAAA,IACxB,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,KAAK,MAAM;AAAA,EACb;AACA,MAAI,OAAO,MAAM,sBAAsB,UAAU;AAC/C,UAAM,oBAAoB,MAAM;AAAA,EAClC;AACA,MAAI,MAAM,UAAU;AAClB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,QAAQ,GAAG;AACnD,UAAI,MAAM,UAAa,MAAM,GAAI;AACjC,UAAI,sBAAsB,IAAI,CAAC,EAAG;AAClC,YAAM,CAAC,IAAI;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAmBO,SAAS,oBACd,OACA,MACiB;AACjB,QAAM,WAAwD,EAAE,GAAI,MAAM,YAAY,CAAC,EAAG;AAC1F,MAAI,OAAO,MAAM,UAAU,SAAU,UAAS,QAAQ,MAAM;AAC5D,MAAI,OAAO,MAAM,WAAW,SAAU,UAAS,SAAS,MAAM;AAC9D,SAAO,eAAe;AAAA,IACpB,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,KAAK,mBAAmB,WAAW,MAAM,GAAG,GAAG,IAAI;AAAA,IACnD,mBAAmB,MAAM;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAMO,SAAS,iBACd,OACA,MACiB;AACjB,QAAM,aAAa,aAAa,KAAK,IAAI,MAAM,MAAM;AACrD,QAAM,UAAU,WAAW,OAAO,eAAe,WAAW,aAAa,EAAE;AAC3E,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,MAAM,mBAAmB,SAAS,IAAI;AAC5C,SAAO,aAAa,KAAK,IAAI,EAAE,GAAG,OAAO,IAAI,IAAI;AACnD;AAOO,SAAS,iBACd,OACA,MACiB;AACjB,QAAM,aAAa,aAAa,KAAK,IAAI,MAAM,MAAM;AACrD,QAAM,UAAU,WAAW,OAAO,eAAe,WAAW,aAAa,EAAE;AAC3E,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,MAAM,mBAAmB,SAAS,IAAI;AAC5C,SAAO,aAAa,KAAK,IAAI,EAAE,GAAG,OAAO,IAAI,IAAI;AACnD;AAOO,SAAS,eACd,OACA,WACA,YACiB;AACjB,MAAI,CAAC,aAAa,KAAK,EAAG,QAAO;AACjC,MAAI,sBAAsB,IAAI,SAAS,EAAG,QAAO;AACjD,SAAO,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,WAAW;AAC7C;;;AC5IA,IAAAC,gBAAoF;;;ACFpF,IAAAC,gBAAsD;AAEtD,IAAI,IAAI;AAAA,EACP,GAAG;AAAA,EACH,GAAG;AAAA,EACH,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACP;AANA,IAMG,IAAI,CAACC,IAAGC,IAAGC,OAAM,KAAK,IAAI,KAAK,IAAIF,IAAGC,EAAC,GAAGC,EAAC;AAN9C,IAMiD,IAAI,IAAIF,OAAMA,GAAE,OAAO,CAACA,OAAMA,MAAK,OAAOA,MAAK,QAAQ,EAAE,KAAK,GAAG;AANlH,IAMqH,IAAI,CAACA,IAAGC,OAAMD,OAAMC,MAAKD,GAAE,UAAUC,GAAE,SAASD,GAAE,WAAWC,GAAE,UAAUD,GAAE,MAAMC,GAAE,KAAKD,GAAE,MAAMC,GAAE,KAAKD,GAAE,SAASC,GAAE;AACzO,SAAS,EAAED,IAAGC,IAAGC,IAAGC,IAAG;AACtB,MAAIC,KAAI,EAAEJ,IAAGE,IAAGC,EAAC;AACjB,SAAOH,GAAE,UAAUI,GAAE,SAASA,GAAE,QAAQH,KAAID,GAAE,WAAWI,GAAE,QAAQA,GAAE,SAASH,KAAIG,GAAE,IAAIA,GAAE,SAASD,OAAMC,GAAE,SAASD,KAAIC,GAAE,GAAGA,GAAE,QAAQA,GAAE,SAASH,KAAIG,GAAE,IAAIA,GAAE,QAAQF,OAAME,GAAE,QAAQF,KAAIE,GAAE,GAAGA,GAAE,SAASA,GAAE,QAAQH,KAAID,GAAE,SAAS,MAAM,EAAEI,IAAGF,IAAGC,EAAC,IAAIC;AACvP;AACA,SAAS,EAAEJ,IAAGC,IAAGC,IAAG;AACnB,MAAIC,KAAI,EAAEH,IAAGC,IAAGC,EAAC;AACjB,SAAOC,GAAE,KAAKF,KAAIE,GAAE,SAAS,GAAGA,GAAE,KAAKD,KAAIC,GAAE,UAAU,GAAGH,GAAE,SAAS,MAAM,EAAEG,IAAGF,IAAGC,EAAC,IAAIC;AACzF;AACA,SAAS,EAAEH,IAAGC,IAAGC,IAAG;AACnB,SAAOF,GAAE,SAAS,MAAM;AAAA,IACvB,GAAG;AAAA,IACH,GAAGA;AAAA,IACH,MAAM;AAAA,EACP,IAAI;AAAA,IACH,MAAM;AAAA,IACN,GAAGA,GAAE,IAAIA,GAAE,IAAIC,KAAI,MAAM;AAAA,IACzB,GAAGD,GAAE,IAAIA,GAAE,IAAIE,KAAI,MAAM;AAAA,IACzB,OAAOF,GAAE,QAAQA,GAAE,QAAQC,KAAI,MAAM;AAAA,IACrC,QAAQD,GAAE,SAASA,GAAE,SAASE,KAAI,MAAM;AAAA,EACzC;AACD;AACA,SAAS,EAAEF,IAAGC,IAAGC,IAAG;AACnB,SAAO,CAACF,GAAE,QAAQA,GAAE,SAAS,OAAO;AAAA,IACnC,GAAG;AAAA,IACH,GAAGA;AAAA,IACH,MAAM;AAAA,EACP,IAAI;AAAA,IACH,MAAM;AAAA,IACN,GAAGA,GAAE,IAAIA,GAAE,IAAIC,KAAI,MAAM;AAAA,IACzB,GAAGD,GAAE,IAAIA,GAAE,IAAIE,KAAI,MAAM;AAAA,IACzB,OAAOF,GAAE,QAAQA,GAAE,QAAQC,KAAI,MAAM;AAAA,IACrC,QAAQD,GAAE,SAASA,GAAE,SAASE,KAAI,MAAM;AAAA,EACzC;AACD;AACA,SAAS,EAAEF,IAAGC,IAAGC,IAAGC,IAAGC,IAAGC,KAAI,GAAGC,KAAI,GAAGC,KAAIJ,IAAGK,KAAIJ,IAAG;AACrD,MAAIK,KAAI,EAAE,GAAGT,GAAE,GAAGU,KAAI,KAAK,IAAIL,IAAGF,EAAC,GAAGQ,KAAI,KAAK,IAAIL,IAAGF,EAAC,GAAGQ,KAAI,KAAK,IAAIL,IAAGJ,EAAC,GAAGU,KAAI,KAAK,IAAIL,IAAGJ,EAAC;AAC/F,EAAAH,OAAMA,KAAI,KAAKS,KAAIJ,KAAIA,KAAIL,KAAIS,IAAGC,KAAID,KAAIT,IAAGW,KAAIL,KAAIN,OAAMU,KAAIN,KAAIA,KAAIJ,KAAIU,IAAGD,KAAIC,KAAIV,IAAGY,KAAIL,KAAIP,MAAKQ,GAAE,IAAI,MAAMA,GAAE,SAAS,KAAK,IAAIA,GAAE,SAASA,GAAE,GAAGE,EAAC,GAAGF,GAAE,IAAI,IAAIA,GAAE,IAAI,MAAMA,GAAE,QAAQ,KAAK,IAAIA,GAAE,QAAQA,GAAE,GAAGC,EAAC,GAAGD,GAAE,IAAI;AAC5N,MAAIK,KAAIX,MAAKM,GAAE,IAAIA,GAAE;AACrB,EAAAK,KAAI,MAAML,GAAE,IAAI,KAAK,IAAIA,GAAE,GAAGN,KAAIO,EAAC,GAAGD,GAAE,SAASK;AACjD,MAAIC,KAAIX,MAAKK,GAAE,IAAIA,GAAE;AACrB,MAAIM,KAAI,MAAMN,GAAE,IAAI,KAAK,IAAIA,GAAE,GAAGL,KAAIO,EAAC,GAAGF,GAAE,UAAUM,KAAIN,GAAE,QAAQC,QAAOR,OAAM,QAAQA,MAAK,UAAUO,GAAE,KAAKC,KAAID,GAAE,QAAQA,GAAE,QAAQC,KAAID,GAAE,SAASE,QAAOT,OAAM,QAAQA,MAAK,UAAUO,GAAE,KAAKE,KAAIF,GAAE,SAASA,GAAE,SAASE,KAAIF,GAAE,QAAQG,QAAOV,OAAM,QAAQA,MAAK,UAAUO,GAAE,KAAKG,KAAIH,GAAE,QAAQA,GAAE,QAAQG,KAAIH,GAAE,SAASI,QAAOX,OAAM,QAAQA,MAAK,UAAUO,GAAE,KAAKI,KAAIJ,GAAE,SAASA,GAAE,SAASI,KAAIZ,IAAG;AACtY,QAAID,KAAIS,GAAE,QAAQA,GAAE;AACpB,QAAIT,KAAIC,IAAG;AACV,UAAID,KAAI,KAAK,IAAIS,GAAE,QAAQR,IAAGU,EAAC;AAC/B,OAACT,OAAM,QAAQA,MAAK,UAAUO,GAAE,KAAKT,KAAIS,GAAE,SAASA,GAAE,SAAST;AAAA,IAChE,WAAWA,KAAIC,IAAG;AACjB,UAAID,KAAI,KAAK,IAAIS,GAAE,SAASR,IAAGS,EAAC;AAChC,OAACR,OAAM,QAAQA,MAAK,UAAUO,GAAE,KAAKT,KAAIS,GAAE,QAAQA,GAAE,QAAQT;AAAA,IAC9D;AAAA,EACD;AACA,SAAOS;AACR;AACA,SAAS,EAAET,IAAGC,IAAGC,IAAGC,IAAG;AACtB,MAAIC,KAAI,EAAE,GAAGJ,GAAE;AACf,SAAOC,OAAM,cAAcE,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,OAAOC,GAAE,KAAKF,IAAGE,GAAE,SAASF,MAAKC,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,MAAMC,GAAE,SAASF,KAAIC,OAAM,SAASC,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKD,OAAM,iBAAiBE,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,OAAOC,GAAE,KAAKF,IAAGE,GAAE,SAASF,MAAKC,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,MAAMC,GAAE,SAASF,KAAIC,OAAM,SAASC,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKD,OAAM,YAAYE,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,OAAOC,GAAE,KAAKF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,MAAMC,GAAE,UAAUF,KAAIC,OAAM,SAASC,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKD,OAAM,gBAAgBE,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,OAAOC,GAAE,KAAKF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,QAAQC,GAAE,KAAKF,IAAGE,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKC,OAAM,MAAMC,GAAE,UAAUF,KAAIC,OAAM,SAASC,GAAE,SAASF,IAAGE,GAAE,UAAUF,MAAKE;AAC3tC;AAGA,IAAI,IAAI;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AACV;AAHA,IAGG,IAAI;AAtEP;AAmEA,IAGU,KAAI,mBAAgB,cAAAH,cAAE;AAAA,EAAlB;AAAA;AA0Bb,wCAAe;AACf,2CAAkB;AAClB,uCAAc;AACd,kCAAS;AAAA,MACR,cAAc;AAAA,MACd,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU;AAAA,IACX;AACA,4CAAe,cAAAC,WAAE;AACjB,wCAAW,cAAAA,WAAE;AACb;AACA,4CAAmB;AACnB,sCAAa,MAAM,GAAG;AACtB,iCAAQ;AAAA,MACP,cAAc;AAAA,MACd,qBAAqB;AAAA,IACtB;AAiCA,6CAAoB,CAACF,OAAM;AAC1B,UAAI,EAAE,MAAMC,IAAG,UAAUC,GAAE,IAAI,KAAK,OAAOC,KAAI,KAAK,OAAO;AAC3D,UAAI,CAACF,GAAG;AACR,UAAIG,KAAI,EAAEH,IAAGE,GAAE,OAAOA,GAAE,MAAM;AAC9B,UAAID,GAAG;AACP,MAAAF,GAAE,cAAcA,GAAE,eAAe,GAAG,KAAK,YAAY,GAAG,KAAK,aAAa,QAAQ,MAAM,EAAE,eAAe,KAAG,CAAC;AAC7G,UAAIK,KAAIL,GAAE,OAAO,QAAQ,KAAKM,KAAI,CAAC,CAACD,IAAGE,KAAIP,GAAE,SAASQ,KAAIR,GAAE,SAASS,KAAIL,GAAE,GAAGO,KAAIP,GAAE;AACpF,UAAIC,IAAG;AACN,YAAIJ,KAAID,GAAE,UAAUG,GAAE,GAAGD,KAAIF,GAAE,UAAUG,GAAE,GAAGG,KAAI,GAAGI,KAAI;AACzD,QAAAL,OAAM,QAAQA,MAAK,OAAOC,KAAIL,MAAKG,GAAE,IAAIA,GAAE,QAAQM,KAAIR,KAAIE,GAAE,GAAGK,KAAIL,GAAE,GAAGO,KAAIP,GAAE,IAAIA,GAAE,UAAUC,OAAM,QAAQA,OAAM,OAAOC,KAAIL,MAAKG,GAAE,IAAIA,GAAE,QAAQM,KAAIR,MAAKE,GAAE,IAAIA,GAAE,SAASK,KAAIL,GAAE,GAAGO,KAAIP,GAAE,KAAKC,OAAM,QAAQA,MAAK,OAAOC,KAAIL,KAAIG,GAAE,GAAGM,KAAIR,MAAKE,GAAE,IAAIA,GAAE,SAASK,KAAIL,GAAE,IAAIA,GAAE,OAAOO,KAAIP,GAAE,MAAMC,OAAM,QAAQA,MAAK,SAASC,KAAIL,KAAIG,GAAE,GAAGM,KAAIR,KAAIE,GAAE,GAAGK,KAAIL,GAAE,IAAIA,GAAE,OAAOO,KAAIP,GAAE,IAAIA,GAAE,SAASG,KAAIE,KAAIN,GAAE,IAAIG,IAAGE,KAAIG,KAAIR,GAAE,IAAIO;AAAA,MAC/Z;AACA,WAAK,SAAS;AAAA,QACb,cAAcH;AAAA,QACd,cAAcC;AAAA,QACd,YAAYC;AAAA,QACZ,YAAYE;AAAA,QACZ,SAASX,GAAE;AAAA,QACX,SAASA,GAAE;AAAA,QACX,UAAUM;AAAA,QACV,KAAKD;AAAA,MACN,GAAG,KAAK,kBAAkB,MAAI,KAAK,SAAS,EAAE,cAAc,KAAG,CAAC;AAAA,IACjE;AACA,kDAAyB,CAACL,OAAM;AAC/B,UAAI,EAAE,MAAMC,IAAG,UAAUC,IAAG,QAAQC,IAAG,eAAeC,IAAG,UAAUC,GAAE,IAAI,KAAK,OAAOC,KAAI,KAAK,OAAO;AACrG,UAAIJ,MAAKC,MAAKC,MAAKH,GAAG;AACtB,MAAAD,GAAE,cAAcA,GAAE,eAAe,GAAG,KAAK,YAAY,GAAG,KAAK,aAAa,QAAQ,MAAM,EAAE,eAAe,KAAG,CAAC;AAC7G,UAAIO,KAAIP,GAAE,UAAUM,GAAE,GAAGE,KAAIR,GAAE,UAAUM,GAAE,GAAGK,KAAI;AAAA,QACjD,MAAM;AAAA,QACN,GAAGJ;AAAA,QACH,GAAGC;AAAA,QACH,OAAO;AAAA,QACP,QAAQ;AAAA,MACT;AACA,WAAK,SAAS;AAAA,QACb,cAAcR,GAAE;AAAA,QAChB,cAAcA,GAAE;AAAA,QAChB,YAAYO;AAAA,QACZ,YAAYC;AAAA,QACZ,SAASR,GAAE;AAAA,QACX,SAASA,GAAE;AAAA,QACX,UAAU;AAAA,MACX,GAAG,KAAK,kBAAkB,MAAIK,GAAE,EAAEM,IAAGL,GAAE,OAAOA,GAAE,MAAM,GAAG,EAAEK,IAAGL,GAAE,OAAOA,GAAE,MAAM,CAAC,GAAG,KAAK,SAAS;AAAA,QAChG,cAAc;AAAA,QACd,qBAAqB;AAAA,MACtB,CAAC;AAAA,IACF;AACA,4CAAmB,CAACN,OAAM;AACzB,UAAI,EAAE,MAAMC,IAAG,UAAUC,IAAG,UAAUC,IAAG,aAAaC,GAAE,IAAI,KAAK,OAAOC,KAAI,KAAK,OAAO;AACxF,UAAIH,MAAK,CAACD,MAAK,CAAC,KAAK,gBAAiB;AACtC,MAAAD,GAAE,cAAcA,GAAE,eAAe,GAAG,KAAK,gBAAgB,KAAK,cAAc,MAAII,MAAKA,GAAEJ,EAAC;AACxF,UAAI,EAAE,QAAQO,GAAE,IAAI;AACpB,MAAAA,GAAE,UAAUP,GAAE,SAASO,GAAE,UAAUP,GAAE;AACrC,UAAIQ;AACJ,MAAAA,KAAID,GAAE,WAAW,KAAK,WAAW,IAAI,KAAK,SAAS,GAAG,EAAEN,IAAGO,EAAC,KAAKL,GAAE,EAAEK,IAAGH,GAAE,OAAOA,GAAE,MAAM,GAAG,EAAEG,IAAGH,GAAE,OAAOA,GAAE,MAAM,CAAC;AAAA,IACpH;AACA,8CAAqB,CAACL,OAAM;AAC3B,UAAI,EAAE,MAAMC,IAAG,UAAUC,IAAG,UAAUC,IAAG,YAAYE,GAAE,IAAI,KAAK;AAChE,UAAIH,GAAG;AACP,UAAII,KAAIN,GAAE,KAAKQ,KAAI;AACnB,UAAI,CAACP,GAAG;AACR,UAAIU,KAAI,KAAK,OAAO,GAAGC,KAAI,KAAK,cAAcD,EAAC,GAAGE,MAAK,UAAU,SAAS,MAAM,KAAK,IAAIb,GAAE,UAAUA,GAAE,WAAW,GAAE,iBAAiBA,GAAE,WAAW,GAAE,kBAAkB,GAAE;AACxK,UAAIM,OAAM,eAAeM,GAAE,KAAKC,IAAGL,KAAI,QAAMF,OAAM,gBAAgBM,GAAE,KAAKC,IAAGL,KAAI,QAAMF,OAAM,aAAaM,GAAE,KAAKC,IAAGL,KAAI,QAAMF,OAAM,gBAAgBM,GAAE,KAAKC,IAAGL,KAAI,OAAKA,IAAG;AACzK,QAAAR,GAAE,cAAcA,GAAE,eAAe,GAAGY,GAAE,IAAI,EAAEA,GAAE,GAAG,GAAGD,GAAE,QAAQC,GAAE,KAAK,GAAGA,GAAE,IAAI,EAAEA,GAAE,GAAG,GAAGD,GAAE,SAASC,GAAE,MAAM;AAC3G,YAAIX,KAAI,EAAEW,IAAGD,GAAE,OAAOA,GAAE,MAAM,GAAGT,KAAI,EAAEU,IAAGD,GAAE,OAAOA,GAAE,MAAM;AAC3D,QAAAR,GAAEF,IAAGC,EAAC,GAAGG,MAAKA,GAAEJ,IAAGC,EAAC;AAAA,MACrB;AAAA,IACD;AACA,4CAAmB,CAACF,IAAGC,OAAM;AAC5B,UAAI,EAAE,QAAQC,KAAI,GAAG,MAAMC,IAAG,UAAUC,IAAG,UAAUC,KAAI,GAAG,WAAWG,KAAI,GAAG,UAAUK,IAAG,WAAWC,IAAG,UAAUC,IAAG,YAAYC,GAAE,IAAI,KAAK,OAAO,IAAI,KAAK,OAAO;AACpK,UAAIZ,MAAK,CAACD,GAAG;AACb,UAAIH,GAAE,QAAQ,aAAaA,GAAE,QAAQ,eAAeA,GAAE,QAAQ,eAAeA,GAAE,QAAQ,aAAc,CAAAA,GAAE,gBAAgB,GAAGA,GAAE,eAAe;AAAA,UACtI;AACL,UAAI,KAAK,UAAU,SAAS,MAAM,KAAK,IAAIA,GAAE,UAAUA,GAAE,WAAW,GAAE,iBAAiBA,GAAE,WAAW,GAAE,kBAAkB,GAAE,WAAW,IAAI,EAAE,EAAE,EAAEG,IAAG,EAAE,OAAO,EAAE,MAAM,GAAGH,GAAE,KAAK,GAAGC,EAAC,GAAGC,IAAGD,IAAG,EAAE,OAAO,EAAE,QAAQI,IAAGG,IAAGK,IAAGC,EAAC;AACvN,UAAI,CAAC,EAAEX,IAAG,CAAC,GAAG;AACb,YAAIH,KAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM;AAC9B,QAAAe,GAAE,GAAGf,EAAC,GAAGgB,MAAKA,GAAE,GAAGhB,EAAC;AAAA,MACrB;AAAA,IACD;AACA,4CAAmB,CAACA,OAAM;AACzB,UAAI,EAAE,MAAMC,IAAG,UAAUC,IAAG,YAAYC,IAAG,WAAWC,GAAE,IAAI,KAAK,OAAOC,KAAI,KAAK,OAAO;AACxF,WAAK,cAAc,GAAG,EAAEH,MAAK,CAACD,OAAM,KAAK,oBAAoB,KAAK,kBAAkB,OAAI,KAAK,cAAc,OAAIG,MAAKA,GAAEJ,EAAC,GAAGG,MAAKA,GAAE,EAAEF,IAAGI,GAAE,OAAOA,GAAE,MAAM,GAAG,EAAEJ,IAAGI,GAAE,OAAOA,GAAE,MAAM,CAAC,GAAG,KAAK,SAAS;AAAA,QACjM,cAAc;AAAA,QACd,qBAAqB;AAAA,MACtB,CAAC;AAAA,IACF;AACA,uCAAc,MAAM;AACnB,WAAK,aAAa,SAAS,SAAS,GAAG,CAAC;AAAA,IACzC;AAAA;AAAA,EA/IA,IAAI,WAAW;AACd,WAAO;AAAA,EACR;AAAA,EAsBA,SAAS;AACR,QAAIL,KAAI,KAAK,SAAS;AACtB,QAAI,CAACA,GAAG,QAAO;AAAA,MACd,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,IACT;AACA,QAAI,EAAE,GAAGC,IAAG,GAAGC,IAAG,OAAOC,IAAG,QAAQC,GAAE,IAAIJ,GAAE,sBAAsB;AAClE,WAAO;AAAA,MACN,GAAGC;AAAA,MACH,GAAGC;AAAA,MACH,OAAOC;AAAA,MACP,QAAQC;AAAA,IACT;AAAA,EACD;AAAA,EACA,mBAAmBJ,IAAG;AACrB,QAAI,EAAE,MAAMC,IAAG,YAAYC,GAAE,IAAI,KAAK;AACtC,QAAIA,MAAK,CAACF,GAAE,QAAQC,IAAG;AACtB,UAAI,EAAE,OAAOD,IAAG,QAAQG,GAAE,IAAI,KAAK,OAAO;AAC1C,MAAAH,MAAKG,MAAKD,GAAE,EAAED,IAAGD,IAAGG,EAAC,GAAG,EAAEF,IAAGD,IAAGG,EAAC,CAAC;AAAA,IACnC;AAAA,EACD;AAAA,EACA,uBAAuB;AACtB,SAAK,kBAAkB,KAAK,eAAe,WAAW,GAAG,KAAK,cAAc;AAAA,EAC7E;AAAA,EACA,cAAc;AACb,SAAK,iBAAL,KAAK,gBAAkB,KAAK,SAAS,iBAAiB,eAAe,KAAK,kBAAkB,CAAC,GAAG,KAAK,SAAS,iBAAiB,aAAa,KAAK,kBAAkB,CAAC,GAAG,KAAK,SAAS,iBAAiB,iBAAiB,KAAK,kBAAkB,CAAC,GAAG;AAAA,EACnP;AAAA,EACA,gBAAgB;AACf,SAAK,iBAAL,KAAK,gBAAkB,KAAK,SAAS,oBAAoB,eAAe,KAAK,kBAAkB,CAAC,GAAG,KAAK,SAAS,oBAAoB,aAAa,KAAK,kBAAkB,CAAC,GAAG,KAAK,SAAS,oBAAoB,iBAAiB,KAAK,kBAAkB,CAAC,GAAG;AAAA,EAC5P;AAAA,EAyFA,eAAe;AACd,QAAI,EAAE,MAAMH,GAAE,IAAI,KAAK;AACvB,QAAIA,GAAG,QAAO;AAAA,MACb,KAAK,GAAGA,GAAE,CAAC,GAAGA,GAAE,IAAI;AAAA,MACpB,MAAM,GAAGA,GAAE,CAAC,GAAGA,GAAE,IAAI;AAAA,MACrB,OAAO,GAAGA,GAAE,KAAK,GAAGA,GAAE,IAAI;AAAA,MAC1B,QAAQ,GAAGA,GAAE,MAAM,GAAGA,GAAE,IAAI;AAAA,IAC7B;AAAA,EACD;AAAA,EACA,WAAW;AACV,QAAI,EAAE,QAAQA,GAAE,IAAI,MAAMC,KAAI,KAAK,OAAO,GAAGC,KAAI,KAAK,cAAcD,EAAC,GAAGE,KAAIH,GAAE,UAAUA,GAAE,cAAcK,KAAIL,GAAE,UAAUA,GAAE;AAC1H,WAAOE,GAAE,IAAI,EAAEF,GAAE,aAAaG,IAAG,GAAGF,GAAE,QAAQC,GAAE,KAAK,GAAGA,GAAE,IAAI,EAAEF,GAAE,aAAaK,IAAG,GAAGJ,GAAE,SAASC,GAAE,MAAM,GAAGA;AAAA,EAC5G;AAAA,EACA,eAAeF,IAAGC,IAAGC,IAAGC,IAAG;AAC1B,QAAI,EAAE,QAAQC,GAAE,IAAI,MAAMC,KAAID,GAAE,UAAUJ,GAAE,GAAGM,KAAIF,GAAE,UAAUJ,GAAE,GAAGO;AACpE,IAAAA,KAAIJ,MAAKF,KAAIA,OAAM,QAAQA,OAAM,OAAOA,OAAM,OAAOK,KAAIF,GAAE;AAC3D,QAAII;AACJ,WAAOA,KAAIN,MAAKD,KAAIA,OAAM,QAAQA,OAAM,OAAOA,OAAM,OAAOI,KAAID,GAAE,YAAYI,KAAID,KAAI,OAAO,OAAOA,KAAI,OAAO;AAAA,EAChH;AAAA,EACA,qBAAqBP,IAAGC,IAAGC,KAAI,GAAGC,KAAI,GAAG;AACxC,QAAIC,KAAI,KAAK,IAAIF,IAAGF,GAAE,KAAK,GAAGK,KAAI,KAAK,IAAIF,IAAGH,GAAE,MAAM;AACtD,WAAO,CAACC,MAAK,CAACG,MAAK,CAACC,KAAI,CAACD,IAAGC,EAAC,IAAIJ,KAAI,IAAIG,KAAI,CAACA,IAAGA,KAAIH,EAAC,IAAI,CAACI,KAAIJ,IAAGI,EAAC,IAAIA,KAAI,CAACA,KAAIJ,IAAGI,EAAC,IAAI,CAACD,IAAGA,KAAIH,EAAC;AAAA,EAClG;AAAA,EACA,aAAa;AACZ,QAAI,EAAE,QAAQD,GAAE,IAAI,MAAM,EAAE,QAAQC,KAAI,GAAG,UAAUC,IAAG,WAAWC,GAAE,IAAI,KAAK,OAAOE,KAAI,KAAK,OAAO,GAAG,CAACC,IAAGE,EAAC,IAAI,KAAK,qBAAqBH,IAAGJ,IAAG,KAAK,MAAM,UAAU,KAAK,MAAM,SAAS,GAAGQ,KAAI,KAAK,cAAcJ,EAAC,GAAGK,KAAI,KAAK,eAAeL,IAAGL,GAAE,KAAKM,IAAGE,EAAC,GAAGI,KAAIZ,GAAE,OAAOU,IAAGG,KAAIb,GAAE,UAAUA,GAAE,cAAcc,KAAId,GAAE,UAAUA,GAAE;AACnU,KAACM,MAAKM,OAAM,QAAQA,OAAM,OAAOA,OAAM,UAAUC,KAAI,KAAK,IAAIA,IAAG,CAACP,EAAC,KAAKE,MAAKI,OAAM,QAAQA,OAAM,OAAOA,OAAM,UAAUE,KAAI,KAAK,IAAIA,IAAG,CAACN,EAAC;AAC1I,QAAIO,KAAI;AAAA,MACP,MAAM;AAAA,MACN,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,IACT;AACA,IAAAL,OAAM,QAAQK,GAAE,IAAIf,GAAE,YAAYe,GAAE,QAAQF,IAAGZ,MAAKc,GAAE,SAASA,GAAE,QAAQd,IAAGc,GAAE,IAAIf,GAAE,aAAae,GAAE,WAAWA,GAAE,SAAS,KAAK,IAAID,EAAC,GAAGC,GAAE,IAAIf,GAAE,aAAae,GAAE,WAAWL,OAAM,QAAQK,GAAE,IAAIf,GAAE,YAAYe,GAAE,IAAIf,GAAE,YAAYe,GAAE,QAAQF,IAAGZ,KAAIc,GAAE,SAASA,GAAE,QAAQd,KAAIc,GAAE,SAASD,MAAKJ,OAAM,QAAQK,GAAE,IAAIf,GAAE,aAAaa,IAAGE,GAAE,IAAIf,GAAE,YAAYe,GAAE,QAAQ,KAAK,IAAIF,EAAC,GAAGZ,KAAIc,GAAE,SAASA,GAAE,QAAQd,KAAIc,GAAE,SAASD,MAAKJ,OAAM,SAASK,GAAE,IAAIf,GAAE,aAAaa,IAAGE,GAAE,QAAQ,KAAK,IAAIF,EAAC,GAAGZ,MAAKc,GAAE,SAASA,GAAE,QAAQd,IAAGc,GAAE,IAAIf,GAAE,aAAae,GAAE,WAAWA,GAAE,SAAS,KAAK,IAAID,EAAC,GAAGC,GAAE,IAAIf,GAAE,aAAac;AAChkB,QAAIE,KAAI,EAAED,IAAGd,IAAGS,IAAGL,GAAE,OAAOA,GAAE,QAAQC,IAAGE,IAAGN,IAAGC,EAAC;AAChD,WAAOF,MAAK,GAAE,OAAO,QAAQW,EAAC,IAAI,KAAKH,KAAIO,KAAI,GAAE,MAAM,QAAQJ,EAAC,IAAI,MAAMH,GAAE,IAAIO,GAAE,GAAGP,GAAE,QAAQO,GAAE,SAAS,GAAE,MAAM,QAAQJ,EAAC,IAAI,OAAOH,GAAE,IAAIO,GAAE,GAAGP,GAAE,SAASO,GAAE,SAASP,GAAE,IAAI,EAAEA,GAAE,GAAG,GAAGJ,GAAE,QAAQI,GAAE,KAAK,GAAGA,GAAE,IAAI,EAAEA,GAAE,GAAG,GAAGJ,GAAE,SAASI,GAAE,MAAM,GAAGA;AAAA,EAClP;AAAA,EACA,sBAAsB;AACrB,QAAI,EAAE,YAAYR,KAAI,GAAE,aAAa,YAAY,UAAUC,IAAG,QAAQC,IAAG,sBAAsBC,IAAG,cAAcC,IAAG,MAAMC,GAAE,IAAI,KAAK,OAAOE,KAAI,KAAK,aAAa;AACjK,QAAIF,GAAG,QAAuB,8BAAAN,QAAE,cAAc,OAAO;AAAA,MACpD,OAAOQ;AAAA,MACP,WAAW;AAAA,MACX,eAAe,KAAK;AAAA,MACpB,cAAcP,GAAE;AAAA,MAChB,UAAU;AAAA,MACV,WAAW,KAAK;AAAA,MAChB,MAAM;AAAA,IACP,GAAG,CAACC,MAAK,CAACC,MAAqB,8BAAAH,QAAE,cAAc,OAAO;AAAA,MACrD,WAAW;AAAA,MACX,SAAS,KAAK;AAAA,IACf,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MACzC,WAAW;AAAA,MACX,YAAY;AAAA,IACb,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,IACb,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,IACb,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,IACb,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAcC,GAAE;AAAA,MAChB,WAAW,CAACD,OAAM,KAAK,iBAAiBA,IAAG,IAAI;AAAA,MAC/C,MAAM;AAAA,IACP,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAcC,GAAE;AAAA,MAChB,WAAW,CAACD,OAAM,KAAK,iBAAiBA,IAAG,GAAG;AAAA,MAC9C,MAAM;AAAA,IACP,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAcC,GAAE;AAAA,MAChB,WAAW,CAACD,OAAM,KAAK,iBAAiBA,IAAG,IAAI;AAAA,MAC/C,MAAM;AAAA,IACP,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAcC,GAAE;AAAA,MAChB,WAAW,CAACD,OAAM,KAAK,iBAAiBA,IAAG,GAAG;AAAA,MAC9C,MAAM;AAAA,IACP,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAcC,GAAE;AAAA,MAChB,WAAW,CAACD,OAAM,KAAK,iBAAiBA,IAAG,IAAI;AAAA,MAC/C,MAAM;AAAA,IACP,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAcC,GAAE;AAAA,MAChB,WAAW,CAACD,OAAM,KAAK,iBAAiBA,IAAG,GAAG;AAAA,MAC9C,MAAM;AAAA,IACP,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAcC,GAAE;AAAA,MAChB,WAAW,CAACD,OAAM,KAAK,iBAAiBA,IAAG,IAAI;AAAA,MAC/C,MAAM;AAAA,IACP,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO;AAAA,MAC1C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,cAAcC,GAAE;AAAA,MAChB,WAAW,CAACD,OAAM,KAAK,iBAAiBA,IAAG,GAAG;AAAA,MAC9C,MAAM;AAAA,IACP,CAAC,CAAC,GAAGI,MAAqB,8BAAAJ,QAAE,cAAc,OAAO;AAAA,MAChD,WAAW;AAAA,MACX,eAAe,CAACA,OAAMA,GAAE,gBAAgB;AAAA,IACzC,GAAGI,GAAE,KAAK,KAAK,CAAC,GAAGC,MAAqB,8BAAAL,QAAE,cAAc,cAAAA,QAAE,UAAU,MAAsB,8BAAAA,QAAE,cAAc,OAAO,EAAE,WAAW,+BAA+B,CAAC,GAAmB,8BAAAA,QAAE,cAAc,OAAO,EAAE,WAAW,+BAA+B,CAAC,CAAC,CAAC;AAAA,EACxP;AAAA,EACA,cAAcA,IAAG;AAChB,WAAO,EAAE;AAAA,MACR,GAAG;AAAA,MACH,GAAG,KAAK,MAAM,QAAQ,CAAC;AAAA,IACxB,GAAGA,GAAE,OAAOA,GAAE,MAAM;AAAA,EACrB;AAAA,EACA,SAAS;AACR,QAAI,EAAE,QAAQC,IAAG,UAAUC,IAAG,cAAcC,IAAG,WAAWC,IAAG,MAAME,IAAG,UAAUC,IAAG,QAAQC,IAAG,OAAOC,IAAG,cAAcC,GAAE,IAAI,KAAK,OAAO,EAAE,cAAcC,IAAG,qBAAqBC,GAAE,IAAI,KAAK,OAAOC,KAAIP,KAAI,KAAK,oBAAoB,IAAI,MAAMQ,KAAI,EAAE,aAAaV,IAAGO,MAAK,qBAAqBJ,MAAK,uBAAuBC,MAAK,qBAAqBI,MAAK,uBAAuBN,MAAKL,MAAK,2BAA2BK,MAAKH,MAAK,4BAA4BG,MAAKI,MAAK,6BAA6B,CAAC,KAAK,eAAeJ,MAAK,CAACA,GAAE,SAAS,CAACA,GAAE,UAAU,6BAA6BH,MAAK,uBAAuB;AAC7kB,WAAuB,8BAAAH,QAAE,cAAc,OAAO;AAAA,MAC7C,KAAK,KAAK;AAAA,MACV,WAAWc;AAAA,MACX,OAAOL;AAAA,IACR,GAAmB,8BAAAT,QAAE,cAAc,OAAO;AAAA,MACzC,KAAK,KAAK;AAAA,MACV,WAAW;AAAA,MACX,eAAe,KAAK;AAAA,IACrB,GAAGE,EAAC,GAAGI,KAAoB,8BAAAN,QAAE,cAAc,OAAO;AAAA,MACjD,WAAW;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,IACT,GAAmB,8BAAAA,QAAE,cAAc,QAAQ,MAAsB,8BAAAA,QAAE,cAAc,QAAQ,EAAE,IAAI,QAAQ,KAAK,UAAU,GAAG,GAAmB,8BAAAA,QAAE,cAAc,QAAQ;AAAA,MACnK,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,IACP,CAAC,GAAGG,KAAoB,8BAAAH,QAAE,cAAc,WAAW;AAAA,MAClD,IAAI,GAAGM,GAAE,IAAIA,GAAE,QAAQ,CAAC,GAAGA,GAAE,IAAI;AAAA,MACjC,IAAI,GAAGA,GAAE,IAAIA,GAAE,SAAS,CAAC,GAAGA,GAAE,IAAI;AAAA,MAClC,IAAI,GAAGA,GAAE,QAAQ,CAAC,GAAGA,GAAE,IAAI;AAAA,MAC3B,IAAI,GAAGA,GAAE,SAAS,CAAC,GAAGA,GAAE,IAAI;AAAA,MAC5B,MAAM;AAAA,IACP,CAAC,IAAoB,8BAAAN,QAAE,cAAc,QAAQ;AAAA,MAC5C,GAAG,GAAGM,GAAE,CAAC,GAAGA,GAAE,IAAI;AAAA,MAClB,GAAG,GAAGA,GAAE,CAAC,GAAGA,GAAE,IAAI;AAAA,MAClB,OAAO,GAAGA,GAAE,KAAK,GAAGA,GAAE,IAAI;AAAA,MAC1B,QAAQ,GAAGA,GAAE,MAAM,GAAGA,GAAE,IAAI;AAAA,MAC5B,MAAM;AAAA,IACP,CAAC,CAAC,CAAC,GAAmB,8BAAAN,QAAE,cAAc,QAAQ;AAAA,MAC7C,MAAM;AAAA,MACN,aAAa;AAAA,MACb,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM,aAAa,KAAK,UAAU;AAAA,IACnC,CAAC,CAAC,IAAI,QAAQa,EAAC;AAAA,EAChB;AACD,GA7UC,cADa,IACN,SAAQ,CAAC,KAAK,GAAG,IACxB,cAFa,IAEN,SAAQ,CAAC,KAAK,GAAG,IACxB,cAHa,IAGN,UAAS;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,IACA,cATa,IASN,aAAY,IACnB,cAVa,IAUN,mBAAkB,KACzB,cAXa,IAWN,kBAAiB,MACxB,cAZa,IAYN,gBAAe,EAAE,YAAY;AAAA,EACnC,UAAU;AAAA,EACV,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AACd,EAAE,IAtBW;AAHd,IAiVG,IAAI,KAAK,KAAK;;;ACnZQ,SAAR,YAA6B,KAAK,EAAE,SAAS,IAAI,CAAC,GAAG;AAC1D,MAAI,CAAC,OAAO,OAAO,aAAa,YAAa;AAE7C,QAAM,OAAO,SAAS,QAAQ,SAAS,qBAAqB,MAAM,EAAE,CAAC;AACrE,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,OAAO;AAEb,MAAI,aAAa,OAAO;AACtB,QAAI,KAAK,YAAY;AACnB,WAAK,aAAa,OAAO,KAAK,UAAU;AAAA,IAC1C,OAAO;AACL,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF,OAAO;AACL,SAAK,YAAY,KAAK;AAAA,EACxB;AAEA,MAAI,MAAM,YAAY;AACpB,UAAM,WAAW,UAAU;AAAA,EAC7B,OAAO;AACL,UAAM,YAAY,SAAS,eAAe,GAAG,CAAC;AAAA,EAChD;AACF;;;ACvB8B,YAAY,40LAAg1L;;;AHkJ53L,IAAAI,sBAAA;AA1IR,IAAM,iBAAiE;AAAA,EACrE,EAAE,OAAO,QAAQ,OAAO,OAAU;AAAA,EAClC,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,EACzB,EAAE,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,EAC7B,EAAE,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,EAC7B,EAAE,OAAO,QAAQ,OAAO,KAAK,EAAE;AACjC;AAEA,SAAS,aAAa,cAAsB,eAAuB,QAA8B;AAC/F,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,QAAQ,GAAG;AAAA,EAC1D;AACA,SAAO;AAAA,IACL,EAAe,EAAE,MAAM,KAAK,OAAO,GAAG,GAAG,QAAQ,cAAc,aAAa;AAAA,IAC5E;AAAA,IACA;AAAA,EACF;AACF;AAGA,SAAS,kBAAkB,MAAgB,cAAsB,eAAoC;AACnG,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAI,KAAK,OAAO,eAAgB;AAAA,IAChC,GAAI,KAAK,MAAM,gBAAiB;AAAA,IAChC,OAAQ,KAAK,QAAQ,eAAgB;AAAA,IACrC,QAAS,KAAK,SAAS,gBAAiB;AAAA,EAC1C;AACF;AAOO,SAAS,WAAW,OAQH;AACtB,QAAM,EAAE,QAAQ,UAAU,aAAa,SAAS,QAAQ,IAAI;AAC5D,QAAM,CAAC,MAAM,OAAO,QAAI,wBAAkC,MAAS;AACnE,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA6B,MAAS;AAGlE,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,kBAAc,sBAAiD,IAAI;AAEzE,+BAAU,MAAM;AACd,QAAI,QAAQ;AACV,cAAQ,MAAS;AACjB,gBAAU,MAAS;AACnB,qBAAe,KAAK;AACpB,kBAAY,UAAU;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,CAAC;AAErB,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,kBAAkB,CAACC,OAAwC;AAC/D,UAAM,EAAE,cAAc,cAAc,IAAIA,GAAE;AAC1C,QAAI,gBAAgB,KAAK,iBAAiB,EAAG;AAC7C,gBAAY,UAAU,EAAE,OAAO,cAAc,QAAQ,cAAc;AACnE,mBAAe,IAAI;AACnB;AAAA,MACE,cACI,kBAAkB,aAAa,cAAc,aAAa,IAC1D,aAAa,cAAc,eAAe,MAAS;AAAA,IACzD;AAAA,EACF;AAEA,QAAM,qBAAqB,CAAC,SAA6B;AACvD,cAAU,IAAI;AACd,UAAM,OAAO,YAAY;AACzB,QAAI,KAAM,SAAQ,aAAa,KAAK,OAAO,KAAK,QAAQ,IAAI,CAAC;AAAA,EAC/D;AAEA,QAAM,cAAc,MAAM;AACxB,UAAM,OAAO,YAAY;AACzB,QAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,KAAK,SAAS,KAAK,KAAK,UAAU,EAAG;AAG3E,UAAM,OAAO,KAAK,IAAI,KAAK,IAAK,KAAK,IAAI,MAAO,KAAK,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC;AAC9E,UAAM,MAAM,KAAK,IAAI,KAAK,IAAK,KAAK,IAAI,MAAO,KAAK,QAAQ,CAAC,GAAG,KAAK,SAAS,CAAC;AAC/E,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA,OAAO,KAAK,IAAK,KAAK,QAAQ,MAAO,KAAK,OAAO,KAAK,QAAQ,IAAI;AAAA,MAClE,QAAQ,KAAK,IAAK,KAAK,SAAS,MAAO,KAAK,QAAQ,KAAK,SAAS,GAAG;AAAA,IACvE,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,CAAC,YAA0C;AAAA,IAC3D,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ,gBAAgB,SAAS,YAAY;AAAA,IAC7C,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,iBAAiB,SAAS,YAAY;AAAA,IACtC,OAAO,SAAS,UAAU;AAAA,EAC5B;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA,SAAS;AAAA,MAET;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,iBAAiB;AAAA,YACjB,cAAc;AAAA,YACd,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,YACP,SAAS;AAAA,YACT,eAAe;AAAA,YACf,UAAU;AAAA,UACZ;AAAA,UACA,SAAS,CAACA,OAAMA,GAAE,gBAAgB;AAAA,UAElC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,gBAAgB;AAAA,kBAChB,SAAS;AAAA,kBACT,cAAc;AAAA,gBAChB;AAAA,gBAEA;AAAA,+DAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,YAAY,IAAI,GAAG,wBAAU;AAAA,kBAC7D;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,cAAW;AAAA,sBACX,OAAO;AAAA,wBACL,QAAQ;AAAA,wBACR,YAAY;AAAA,wBACZ,UAAU;AAAA,wBACV,QAAQ;AAAA,wBACR,OAAO;AAAA,wBACP,YAAY;AAAA,sBACd;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA;AAAA;AAAA,YACF;AAAA,YAEA,6CAAC,SAAI,OAAO,EAAE,SAAS,aAAa,SAAS,QAAQ,KAAK,OAAO,UAAU,OAAO,GAC/E,yBAAe,IAAI,CAAC,WACnB;AAAA,cAAC;AAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,SAAS,MAAM,mBAAmB,OAAO,KAAK;AAAA,gBAC9C,OAAO,UAAU,WAAW,OAAO,KAAK;AAAA,gBAEvC,iBAAO;AAAA;AAAA,cALH,OAAO;AAAA,YAMd,CACD,GACH;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,SAAS;AAAA,kBACT,gBAAgB;AAAA,kBAChB,UAAU;AAAA,kBACV,WAAW;AAAA,gBACb;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA,UAAU,CAAC,GAAG,gBAAgB,QAAQ,WAAW;AAAA,oBACjD;AAAA,oBACA,eAAa;AAAA,oBAEb;AAAA,sBAAC;AAAA;AAAA,wBACC,KAAK;AAAA,wBACL,QAAQ;AAAA,wBACR,SAAS,MAAM,eAAe,KAAK;AAAA,wBACnC,KAAI;AAAA,wBACJ,OAAO,EAAE,UAAU,QAAQ,WAAW,QAAQ,SAAS,QAAQ;AAAA;AAAA,oBACjE;AAAA;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,gBAAgB;AAAA,kBAChB,KAAK;AAAA,kBACL,SAAS;AAAA,gBACX;AAAA,gBAEA;AAAA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,iBAAiB;AAAA,wBACjB,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,QAAQ;AAAA,wBACR,YAAY;AAAA,sBACd;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA,kBACA;AAAA,oBAAC;AAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU,CAAC,eAAe,CAAC,QAAQ,KAAK,SAAS,KAAK,KAAK,UAAU;AAAA,sBACrE,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,iBAAiB;AAAA,wBACjB,OAAO;AAAA,wBACP,QAAQ;AAAA,wBACR,cAAc;AAAA,wBACd,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,QAAQ;AAAA,wBACR,YAAY;AAAA,sBACd;AAAA,sBACD;AAAA;AAAA,kBAED;AAAA;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;AF5KU,IAAAC,uBAAA;AAjEH,SAAS,uBAAuB,OAOtB;AACf,QAAM,EAAE,OAAO,UAAU,SAAS,IAAI;AACtC,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,KAAK;AACxD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,SAAS,cAAc,eAAe,CAAC;AAE7C,QAAM,WAAW,aAAa,KAAK;AACnC,QAAM,YAAY,WAAW,MAAM,MAAM,OAAO,UAAU,WAAW,QAAQ;AAC7E,QAAM,UAAU,WAAW,SAAS;AACpC,QAAM,WAAW,YAAY,SAAS;AAKtC,QAAM,mBAAmB,CAAC,SAAmB;AAC3C,QAAI,CAAC,QAAS;AACd,aAAS,iBAAiB,OAAO,IAAI,CAAC;AAAA,EACxC;AAEA,QAAM,kBAAkB,CAAC,SAAmB;AAC1C,aAAS,iBAAiB,OAAO,IAAI,CAAC;AACtC,kBAAc,KAAK;AAAA,EACrB;AAEA,QAAM,mBAAmB,CAAC,WAAmB,eAAuB;AAClE,aAAS,eAAe,OAAO,WAAW,UAAU,CAAC;AAAA,EACvD;AAEA,QAAM,mBAAmB,CAAC,SAAoB;AAC5C,aAAS,oBAAoB,MAAM,QAAQ,CAAC;AAC5C,qBAAiB,KAAK;AAAA,EACxB;AAEA,QAAM,aAAkC;AAAA,IACtC,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,QAAQ,WAAW,gBAAgB;AAAA,IACnC,YAAY;AAAA,EACd;AAEA,QAAM,aAAkC;AAAA,IACtC,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,SAAS;AAAA,EACX;AAEA,SACE,+CAAC,SAAI,OAAO,EAAE,OAAO,OAAO,GACzB;AAAA,cACC,8CAAC,SAAI,OAAO,EAAE,cAAc,MAAM,GAChC;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,OAAO;AAAA,UACL,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA;AAAA,IACF,GACF,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,cAAc;AAAA,UACd,OAAO;AAAA,UACP,UAAU;AAAA,UACV,QAAQ,WAAW,YAAY;AAAA,QACjC;AAAA,QACA,SAAS,MAAM,CAAC,YAAY,iBAAiB,IAAI;AAAA,QAClD;AAAA;AAAA,IAED;AAAA,IAGD,WACC,+CAAC,SAAI,OAAO,EAAE,cAAc,MAAM,GAChC;AAAA,oDAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,OAAO,QAAQ,YAAY,KAAK,cAAc,MAAM,GAAG,kBAEvF;AAAA,MACA,+CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,MAAM,GACxC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,SAAS,MAAM,iBAAiB,KAAK;AAAA,YACrC,OAAO;AAAA,cACL,GAAG;AAAA,cACH,iBAAiB,aAAa,QAAQ,YAAY;AAAA,cAClD,OAAO,aAAa,QAAQ,UAAU;AAAA,cACtC,aAAa,aAAa,QAAQ,YAAY;AAAA,cAC9C,SAAS,WAAW,MAAM;AAAA,YAC5B;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,SAAS,MAAM,iBAAiB,OAAO;AAAA,YACvC,OAAO;AAAA,cACL,GAAG;AAAA,cACH,iBAAiB,aAAa,UAAU,YAAY;AAAA,cACpD,OAAO,aAAa,UAAU,UAAU;AAAA,cACxC,aAAa,aAAa,UAAU,YAAY;AAAA,cAChD,SAAS,WAAW,MAAM;AAAA,YAC5B;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,UAAU;AAAA,YACV,SAAS,MAAM,cAAc,IAAI;AAAA,YACjC,OAAO;AAAA,cACL,GAAG;AAAA,cACH,iBAAiB,aAAa,WAAW,YAAY;AAAA,cACrD,OAAO,aAAa,WAAW,UAAU;AAAA,cACzC,aAAa,aAAa,WAAW,YAAY;AAAA,cACjD,SAAS,WAAW,MAAM;AAAA,YAC5B;AAAA,YACD;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,IAGD,WACC,+CAAC,SAAI,OAAO,EAAE,cAAc,MAAM,GAC/B;AAAA,OAAC,YACA,8CAAC,SAAI,OAAO,EAAE,UAAU,QAAQ,OAAO,WAAW,cAAc,MAAM,GAAG,sDAEzE;AAAA,MAED,OAAO,IAAI,CAACC,OAAM;AACjB,cAAM,UACJ,YAAY,OAAO,MAAMA,GAAE,IAAI,MAAM,WAAY,MAAMA,GAAE,IAAI,IAAe;AAC9E,eACE,+CAAC,SAAiB,OAAO,EAAE,cAAc,MAAM,GAC7C;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,YAAY;AAAA,gBACZ,cAAc;AAAA,cAChB;AAAA,cAEC;AAAA,gBAAAA,GAAE;AAAA,gBACFA,GAAE,WAAW,OAAO;AAAA;AAAA;AAAA,UACvB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,YAAY,CAAC;AAAA,cACvB,aAAa,CAAC,WAAW,4BAA4B;AAAA,cACrD,UAAU,CAACC,OAAM,iBAAiBD,GAAE,MAAMC,GAAE,OAAO,KAAK;AAAA,cACxD,OAAO,EAAE,GAAG,YAAY,SAAS,YAAY,CAAC,WAAW,MAAM,EAAE;AAAA;AAAA,UACnE;AAAA,aAnBQD,GAAE,IAoBZ;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,IAGF,+CAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,MAAM,GACxC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,iBAAiB,IAAI;AAAA,UACpC,UAAU;AAAA,UACV,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ,WAAW,gBAAgB;AAAA,YACnC,SAAS,WAAW,MAAM;AAAA,YAC1B,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,MAEC,WACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,SAAS,EAAE;AAAA,UAC1B,UAAU;AAAA,UACV,OAAO;AAAA,YACL,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,QAAQ,WAAW,gBAAgB;AAAA,YACnC,SAAS,WAAW,MAAM;AAAA,YAC1B,YAAY;AAAA,UACd;AAAA,UACD;AAAA;AAAA,MAED;AAAA,OAEJ;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM,iBAAiB,KAAK;AAAA,QACrC,UAAU,MAAM;AAAA,QAAC;AAAA,QACjB,cAAc;AAAA;AAAA,IAChB;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,aAAa,YAAY,SAAS;AAAA,QAClC,SAAS;AAAA,QACT,SAAS,MAAM,cAAc,KAAK;AAAA;AAAA,IACpC;AAAA,KACF;AAEJ;;;AM3QA,IAAAE,iBAAoD;AACpD,sBAAyC;AAgIhC,IAAAC,uBAAA;AA3HT,IAAM,qBAAqB;AAUpB,SAAS,cAAc,UAA8B,eAA2C;AACrG,QAAM,SAAS,YAAY;AAC3B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,oBACd,UACA,iBACc;AACd,QAAM,eAAe,YAAY;AACjC,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,mBAAuC;AAC9C,aAAO,2BAAW,6BAAa,GAAG;AACpC;AAYA,SAAS,yBAAmD;AAC1D,MAAI;AACF,eAAO,2BAAU,EAAE;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAeO,SAAS,iBAAiB,SAA6B,UAA+B,CAAC,GAAgB;AAC5G,SAAO;AAAA,IACL,WAAW,QAAQ,aAAa;AAAA,IAChC,QAAQ,cAAc,QAAQ,QAAQ,QAAQ,MAAM;AAAA,IACpD,cAAc,QAAQ;AAAA,IACtB,cAAc,oBAAoB,QAAQ,cAAc,QAAQ,YAAY;AAAA,IAC5E,gBAAgB,QAAQ;AAAA,EAC1B;AACF;AAqBO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AACF,GAGG;AACD,QAAM,gBAAgB,iBAAiB;AACvC,QAAM,sBAAsB,uBAAuB;AACnD,QAAM,aAAS;AAAA,IACb,MAAM,iBAAiB,SAAS,EAAE,QAAQ,eAAe,cAAc,oBAAoB,CAAC;AAAA,IAC5F,CAAC,SAAS,eAAe,mBAAmB;AAAA,EAC9C;AAEA,SAAO,8CAAC,uBAAoB,QAAiB,UAAS;AACxD;;;ACpDmB,IAAAC,uBAAA;AAhBZ,SAAS,kBAAkB,SAA6B;AAC7D,QAAM,WAAW,QAAQ,qBAAqB;AAE9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW;AAAA,MACT,YAAY;AAAA;AAAA,QAEV,MAAM,CAAC,UAAe;AACpB,gBAAM,EAAE,UAAU,MAAM,OAAO,OAAO,UAAU,UAAU,GAAG,IAAI;AAGjE,gBAAM,gBAAgB,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK;AAChD,gBAAM,eAAe,SAAS,KAAK,CAACC,OAAcA,GAAE,KAAK,aAAa,CAAC;AAEvE,cAAI,CAAC,cAAc;AACjB,mBAAO,+EAAG,UAAS;AAAA,UACrB;AAEA,iBACE,8CAAC,uBAAoB,SACnB;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO,OAAO,SAAS;AAAA,gBACvB,QAAQ,MAAM,+EAAE;AAAA,cAClB;AAAA,cACA;AAAA,cACA,IAAI,MAAM;AAAA,cACV,OAAO,SAAS;AAAA,cAChB;AAAA,cACA;AAAA;AAAA,UACF,GACF;AAAA,QAEJ;AAAA;AAAA;AAAA;AAAA,QAIA,YAAY,CAAC,UAAe;AAC1B,gBAAM,EAAE,MAAM,OAAO,OAAO,UAAU,UAAU,GAAG,IAAI;AACvD,iBACE,8CAAC,uBAAoB,SACnB;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,OAAO,SAAS;AAAA,cACvB;AAAA,cACA,IAAI,MAAM;AAAA,cACV,OAAO,SAAS;AAAA,cAChB;AAAA,cACA;AAAA;AAAA,UACF,GACF;AAAA,QAEJ;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAIA,iBAAiB;AAAA,MACf,YAAY,CAAC,EAAE,MAAM,MACnB,OAAO,UAAU,WAAW,EAAE,KAAK,OAAO,KAAK,GAAG,IAAI;AAAA,IAC1D;AAAA,EACF;AACF;;;AChHO,SAAS,cAAc,KAAa,QAAsC;AAC/E,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,MAAI,OAAO,aAAa,YAAY,OAAO,aAAa,QAAS,QAAO;AACxE,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,QAAI,MAAM,QAAW;AACnB,aAAO,aAAa,IAAI,GAAG,OAAO,CAAC,CAAC;AAAA,IACtC;AAAA,EACF;AACA,SAAO,OAAO,SAAS;AACzB;;;AC6FI,IAAAC,uBAAA;AAlFJ,IAAM,iBAAiB,oBAAI,IAAI,CAAC,aAAa,aAAa,OAAO,CAAC;AAUlE,SAAS,YAAY,KAAa,cAA+B;AAC/D,MAAI,CAAC,OAAO,CAAC,aAAc,QAAO;AAClC,MAAI;AACJ,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,IAAI,GAAG;AACpB,WAAO,IAAI,IAAI,YAAY;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,KAAK,OAAQ,QAAO;AAC1C,MAAI,OAAO,aAAa,UAAU;AAIhC,UAAM,iBAAiB,KAAK,aAAa,WAAW,eAAe,IAAI,KAAK,QAAQ;AACpF,QAAI,CAAC,kBAAkB,OAAO,aAAa,QAAS,QAAO;AAAA,EAC7D;AACA,SAAO;AACT;AAOO,SAAS,cACd,OACA,SACY;AACZ,QAAM,eAAe,SAAS;AAC9B,QAAM,YAAY,SAAS;AAE3B,QAAM,WAAW,CAAC,WAA2B;AAC3C,UAAM,YAAY,YAAY,QAAQ,YAAY;AAClD,WAAO,aAAa,YAAY,cAAc,WAAW,SAAS,IAAI;AAAA,EACxE;AAEA,MAAI,SAAS,KAAM,QAAO,EAAE,KAAK,IAAI,KAAK,GAAG;AAE7C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,EAAE,KAAK,SAAS,KAAK,GAAG,KAAK,GAAG;AAAA,EACzC;AAEA,QAAM,QAAoB;AAAA,IACxB,KAAK,SAAS,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM,EAAE;AAAA,IAC5D,KAAK,OAAO,MAAM,QAAQ,WAAW,MAAM,MAAM;AAAA,EACnD;AACA,MAAI,OAAO,MAAM,UAAU,SAAU,OAAM,QAAQ,MAAM;AACzD,MAAI,OAAO,MAAM,WAAW,SAAU,OAAM,SAAS,MAAM;AAC3D,SAAO;AACT;AAOO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAI2E;AACzE,QAAM,QAAQ,cAAc,OAAO,EAAE,cAAc,UAAU,CAAC;AAC9D,MAAI,CAAC,MAAM,IAAK,QAAO;AACvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK,MAAM;AAAA,MACX,KAAK,OAAO,MAAM;AAAA,MACjB,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,MAC1D,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,MAC7D,GAAG;AAAA;AAAA,EACN;AAEJ;AASA,SAAS,oBACP,OACA,QACmD;AACnD,MAAI,CAAC,aAAa,KAAK,EAAG,QAAO,CAAC;AAClC,QAAM,MAAyD,CAAC;AAChE,MAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,SAAS,MAAO;AAC1B,YAAM,MAAM,MAAM,MAAM,IAAI;AAC5B,UAAI,QAAQ,UAAa,QAAQ,GAAI;AACrC,UAAI,KAAK,EAAE,MAAM,MAAM,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,IACvE;AAAA,EACF,OAAO;AACL,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,UAAI,MAAM,MAAO;AACjB,UAAI,sBAAsB,IAAI,CAAC,EAAG;AAClC,UAAI,OAAO,MAAM,YAAY,MAAM,GAAI;AACvC,UAAI,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAAC;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOwB;AACtB,QAAM,QAAQ,cAAc,OAAO,EAAE,cAAc,UAAU,CAAC;AAC9D,MAAI,CAAC,MAAM,IAAK,QAAO;AAEvB,QAAM,SAAS,oBAAoB,OAAO,MAAM;AAEhD,SACE,+CAAC,YAAO,WACN;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,MAAM;AAAA,QACX,KAAK,MAAM;AAAA,QACV,GAAI,MAAM,UAAU,SAAY,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;AAAA,QAC1D,GAAI,MAAM,WAAW,SAAY,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA;AAAA,IAChE;AAAA,IACC,OAAO,SAAS,KACf,8CAAC,gBAAW,WAAW,kBACpB,iBAAO,IAAI,CAACC,OACX,8CAAC,UAAkB,cAAYA,GAAE,MAC9B,UAAAA,GAAE,SADMA,GAAE,IAEb,CACD,GACH;AAAA,KAEJ;AAEJ;;;AC/Ge,IAAAC,uBAAA;AAxDf,IAAM,oBAA0C,EAAE,OAAO,MAAM,QAAQ,KAAK,QAAQ,OAAO;AAG3F,IAAM,yBAAyB;AAE/B,IAAM,mBAAkC;AAAA,EACtC,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,UAAU;AACZ;AAeO,SAAS,uBACd,SACwC;AACxC,QAAM;AAAA,IACJ,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB,IAAI;AAEJ,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA;AAAA;AAAA,MAGN,OAAO,EAAE,MAAM,YAAY,OAAO,WAAW;AAAA,IAC/C;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IACA,QAAQ,CAAC,EAAE,MAAM,MAA2C;AAC1D,YAAM,EAAE,IAAI,IAAI,cAAc,SAAS,MAAM,EAAE,aAAa,CAAC;AAC7D,UAAI,CAAC,KAAK;AACR,eAAO,8CAAC,SAAI,OAAO,kBAAmB,uBAAY;AAAA,MACpD;AACA,aACE;AAAA,QAAC;AAAA;AAAA,UACC,OAAO,SAAS;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,EACF;AACF;","names":["import_react","n","import_react","import_react","f","f","c","i","r","import_react","import_jsx_runtime","e","import_react","i","c","s","f","r","l","import_jsx_runtime","r","c","e","f","import_jsx_runtime","p","i","import_jsx_runtime","e","import_react","import_jsx_runtime","t","e","i","import_jsx_runtime","p","i","f","c","s","e","import_jsx_runtime","import_react","import_react","import_react","e","t","n","r","i","a","o","s","c","l","u","d","f","p","m","h","g","import_jsx_runtime","e","import_jsx_runtime","f","e","import_react","import_jsx_runtime","import_jsx_runtime","p","import_jsx_runtime","f","import_jsx_runtime"]}
|