@openrails/contentkit-ui 0.104.0-rc.2 → 0.104.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/client/contents.d.ts +2 -0
  2. package/dist/client/contents.js +68 -58
  3. package/dist/client/contents.js.map +1 -1
  4. package/dist/client/generated/error-codes.d.ts +1 -1
  5. package/dist/client/generated/error-codes.js +4 -0
  6. package/dist/client/generated/error-codes.js.map +1 -1
  7. package/dist/client/generated/routes.d.ts +2 -2
  8. package/dist/client/generated/routes.js +7 -2
  9. package/dist/client/generated/routes.js.map +1 -1
  10. package/dist/components/admin/reader-content-editor.js +1 -1
  11. package/dist/components/admin/reader-content-editor.js.map +1 -1
  12. package/dist/components/social/poll.js +57 -48
  13. package/dist/components/social/poll.js.map +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/locales/de.js +1 -0
  16. package/dist/locales/de.js.map +1 -1
  17. package/dist/locales/en.d.ts +1 -0
  18. package/dist/locales/en.js +1 -0
  19. package/dist/locales/en.js.map +1 -1
  20. package/dist/locales/es.js +1 -0
  21. package/dist/locales/es.js.map +1 -1
  22. package/dist/locales/ja.js +1 -0
  23. package/dist/locales/ja.js.map +1 -1
  24. package/dist/locales/ko.js +1 -0
  25. package/dist/locales/ko.js.map +1 -1
  26. package/dist/locales/zh.js +1 -0
  27. package/dist/locales/zh.js.map +1 -1
  28. package/dist/react/contents.js +1 -1
  29. package/dist/react/contents.js.map +1 -1
  30. package/dist/react/use-engagement.js +32 -31
  31. package/dist/react/use-engagement.js.map +1 -1
  32. package/dist/react/versions.d.ts +3 -1
  33. package/dist/react/versions.js +62 -60
  34. package/dist/react/versions.js.map +1 -1
  35. package/dist/styles.css +1 -1
  36. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"reader-content-editor.js","names":[],"sources":["../../../src/components/admin/reader-content-editor.tsx"],"sourcesContent":["import { useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { parseAttributes } from \"../../client/group-fields.js\";\nimport { toContentKitError } from \"../../client/errors.js\";\nimport type { CatalogText, Content, ContentModel, FileInfo, GroupCard, Listing, Membership, NewEntity, RefBody, Rule } from \"../../client/generated/wire.js\";\nimport { stem } from \"../../client/media/client.js\";\nimport { ruleFor } from \"../../client/media/rules.js\";\nimport { isProcessing, pageRemoved } from \"../../client/media/windows.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { useContent } from \"../../react/contents.js\";\nimport { useErrorReporter, useGuarded } from \"../../react/context.js\";\nimport { useMediaFolder } from \"../../react/folder.js\";\nimport { useContentGroups } from \"../../react/groups.js\";\nimport { useEditorCrop } from \"../../react/crop.js\";\nimport { usePageNotices } from \"../../react/page-notices.js\";\nimport { useContentScope } from \"../../react/use-resource.js\";\nimport { Badge } from \"#ckui/ui/badge\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Input } from \"#ckui/ui/input\";\nimport { Label } from \"#ckui/ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"#ckui/ui/select\";\nimport { Textarea } from \"#ckui/ui/textarea\";\nimport { AttributeFields, formOf } from \"../groups/fields.js\";\nimport { EntityChips } from \"../groups/entity-chips.js\";\nimport { labelOf } from \"../groups/parts.js\";\nimport { ImageCropDialog } from \"../image-crop-dialog.js\";\nimport { MediaFolderEditor, positionalName } from \"../media-folder-editor.js\";\nimport { useDraft } from \"../../react/use-draft.js\";\nimport { RuleFields, cleanRule, complete, VersionsEditor, versionLabel } from \"../content/editors.js\";\nimport { OfferFields } from \"../content/offer-fields.js\";\nimport { ErrorLine, contentError, useAction } from \"../social/parts.js\";\nimport { localInput } from \"../social/bans.js\";\nimport { EditorSaveContext, readerMediaReady, useEditorSaveCoordinator } from \"../content/editor-save.js\";\nimport { ReaderManifestEditor } from \"./reader-manifest.js\";\nimport { PageNotices } from \"./page-notices.js\";\nimport { LoadFailed, Rows, useConfirm } from \"./shell.js\";\nimport { contentStatus, type ContentEditorProps } from \"./content-manager.js\";\nimport { fileTitle } from \"./bulk-drafts.js\";\n\nconst NO_REF: RefBody = { kind: \"\", id: \"\" };\nconst blank = (): CatalogText => ({ title: \"\", slug: \"\", description: \"\", body: \"\" });\nconst editableText = (item: Content | null, language: string): CatalogText =>\n item?.text?.[language] ??\n (item?.language === language ? { title: item.title, slug: item.slug, description: item.description, body: item.body } : blank());\nconst textOf = (text: CatalogText): CatalogText => ({\n ...text,\n title: text.title.trim(),\n description: text.description?.trim(),\n});\nclass ValidationError extends Error {}\n\n// Without a visible title, label names the section for assistive technology.\nfunction Panel({ title, label, children, className = \"\" }: { title?: ReactNode; label?: string; children: ReactNode; className?: string }) {\n return (\n <section aria-label={title ? undefined : label} className={`grid min-w-0 content-start gap-4 rounded-xl border border-border bg-card p-4 ${className}`}>\n {title && <h2 className=\"text-base font-semibold\">{title}</h2>}\n {children}\n </section>\n );\n}\n\n/** A reader work, its files and associations are one editing session. */\nexport function ReaderContentEditor(p: ContentEditorProps & { model: ContentModel }) {\n const { client, scope } = useContentScope(p.client);\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const guarded = useGuarded();\n const report = useErrorReporter(p.onError);\n const model = p.model,\n spec = model.kinds[p.kind]!;\n const offered = p.languages?.map((l) => (typeof l === \"string\" ? { value: l, label: l } : l));\n const languages = offered?.length ? offered : model.languages.map((l) => ({ value: l, label: l }));\n const languageKey = languages.map((l) => l.value).join(\"|\");\n const [language, setLanguage] = useState(languages[0]?.value ?? \"en\");\n const [chosen, setChosen] = useState(\"\");\n const ed = useContent(p.id, p.kind, language, { client, version: chosen || undefined });\n const [created, setCreated] = useState<Content | null>(null);\n const item = ed.content ?? created;\n const owned = useRef({ item, scope, alive: true });\n owned.current.item = item;\n useEffect(() => {\n const owner = owned.current;\n owner.alive = true;\n return () => {\n owner.alive = false;\n };\n }, []);\n const current = () => owned.current.alive && owned.current.scope === scope;\n const creating = useRef<Promise<Content> | null>(null);\n const [allocating, setAllocating] = useState(false);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<unknown>();\n const [notice, setNotice] = useState(\"\");\n const publication = useDraft(useMemo(() => ({ at: item?.publish_at ? localInput(new Date(item.publish_at)) : \"\" }), [item?.publish_at]));\n const publishAt = publication.value.at;\n const setPublishAt = (at: string) => publication.edit({ at });\n const [versionsOpened, setVersionsOpened] = useState(false);\n const [toolsOpened, setToolsOpened] = useState<string[]>([]);\n const [toolsExpanded, setToolsExpanded] = useState(false);\n // A page tile picked as the thumbnail's source, and the cover upload being cropped.\n const [page, setPage] = useState<FileInfo | null>(null);\n const [thumb, setThumb] = useState<{ path: string; aspect: string } | null>(null);\n const versions = useMemo(() => [...(item?.versions ?? [])].sort((a, b) => a.position - b.position), [item?.versions]);\n const version = versions.find((v) => v.id === chosen) ?? versions[0];\n useEffect(() => {\n if (toolsExpanded && version) setToolsOpened((ids) => (ids.includes(version.id) ? ids : [...ids, version.id]));\n }, [toolsExpanded, version]);\n const membership = useContentGroups(item?.id, { language, client });\n const names = useMemo(() => new Map(membership.entities), [membership.entities]);\n const [picked, setPicked] = useState<ReadonlyMap<string, GroupCard>>(new Map());\n const cards = useMemo(() => new Map([...picked, ...names]), [names, picked]);\n const groupKinds = useMemo(() => spec.entities ?? [], [spec.entities]);\n const texts = useDraft(useMemo(() => Object.fromEntries(languageKey.split(\"|\").map((l) => [l, editableText(item, l)])), [item, languageKey]));\n const details = useDraft(\n useMemo(\n () => ({\n listing: item?.listing ?? (\"listed\" as Listing),\n comments: item?.comments ?? \"open\",\n attributes: formOf(spec.attributes ?? {}, item?.attributes ?? {}),\n access: item?.access ?? ({ level: \"public\" } as Rule),\n }),\n [item?.listing, item?.comments, item?.attributes, item?.access, spec.attributes],\n ),\n );\n const associations = useDraft(\n useMemo(\n () => ({\n memberships: membership.memberships.filter((a) => groupKinds.includes(membership.entities.get(a.group_id ?? \"\")?.kind ?? \"\")),\n create: [] as NewEntity[],\n }),\n [membership.memberships, membership.entities, groupKinds],\n ),\n );\n // A scoped kind's new names wait for exactly one linked or new scope entity.\n const scopeMissing = (kind: string, memberships: readonly Membership[], create: readonly NewEntity[]) => {\n const by = model.entity_kinds[kind]?.scoped_by;\n if (!by) return undefined;\n const linked = new Set(memberships.filter((a) => cards.get(a.group_id ?? \"\")?.kind === by).map((a) => a.group_id));\n return linked.size + create.filter((c) => c.kind === by).length === 1 ? undefined : labelOf(p.labels, by);\n };\n const coordinator = useEditorSaveCoordinator();\n const latest = useRef({ texts, details, associations, language });\n latest.current = { texts, details, associations, language };\n // Starting entities (e.g. a series' \"new gallery\") join a new item's draft once, when they resolve.\n const started = useRef(false);\n useEffect(() => {\n if (started.current || p.id || !p.entities?.length) return;\n started.current = true;\n const usable = p.entities.filter((g) => groupKinds.includes(g.kind));\n if (!usable.length) return;\n setPicked((all) => new Map([...all, ...usable.map((g) => [g.id, g] as const)]));\n latest.current.associations.edit((d) => ({\n ...d,\n memberships: [...d.memberships, ...usable.filter((g) => !d.memberships.some((a) => a.group_id === g.id)).map((g) => ({ group_id: g.id }))],\n }));\n }, [p.id, p.entities, groupKinds]);\n const text = texts.value[language] ?? blank();\n const editText = (patch: Partial<CatalogText>) => texts.edit((all) => ({ ...all, [language]: { ...(all[language] ?? blank()), ...patch } }));\n const fail = (e: unknown) => {\n if (!current()) return;\n setError(e instanceof ValidationError ? e.message : e);\n if (!(e instanceof ValidationError)) report(toContentKitError(e), \"content.save\");\n };\n const ensure = async (suggested?: string): Promise<Content> => {\n if (owned.current.item) return owned.current.item;\n if (creating.current) return creating.current;\n setAllocating(true);\n const l = latest.current.language;\n const before = latest.current.texts.get()[l] ?? blank();\n const title = before.title.trim() || fileTitle(suggested ?? \"\") || t(\"readerEditor.untitled\");\n if (!before.title.trim()) latest.current.texts.edit((all) => ({ ...all, [l]: { ...(all[l] ?? blank()), title } }));\n const input = { kind: p.kind, text: { [l]: { ...before, title } }, owner_group_id: p.ownerGroup };\n creating.current = ed\n .create(input)\n .then((content) => {\n owned.current.item = content;\n if (current()) {\n setCreated(content);\n p.onCreated?.(content);\n }\n return content;\n })\n .finally(() => {\n creating.current = null;\n if (current()) setAllocating(false);\n });\n return creating.current;\n };\n const ref = useMemo(() => (item && version ? { kind: p.kind, id: item.id, version: version.id } : null), [p.kind, item, version]);\n const cover = useAction(\"content.save\", p.onError);\n const offer = useAction(\"offer.save\", p.onError);\n const actions = useAction(\"content.save\", p.onError);\n const folder = useMediaFolder(ref, { commit: version?.live ? \"manual\" : \"auto\", client, onError: p.onError });\n const folderRef = useRef(folder);\n folderRef.current = folder;\n const files = folder.read.read?.files ?? [];\n const notices = usePageNotices(item?.id, version?.id, { client });\n const reloadNotices = notices.reload;\n // A ZIP's pages appear after its commit. Media polling alone does not\n // refresh the notices when extraction changes the manifest.\n const mediaKey = ref && folder.read.read ? JSON.stringify([ref.id, ref.version,\n files.filter((file) => file.upload).map((file) => [file.path, file.size, file.staged, file.pending, file.failed]),\n ]) : null;\n useEffect(() => {\n if (mediaKey) reloadNotices();\n }, [mediaKey, reloadNotices]);\n const pages = folder.groups.filter((g) => g.rule?.page).flatMap((g) => g.files.filter((f) => !pageRemoved(f)));\n useEffect(() => {\n if (page && !pages.some((f) => f.path === page.path)) setPage(null);\n }, [page, pages]);\n const rules = folder.groups.flatMap((g) => (g.rule ? [g.rule] : []));\n const coverFile = version?.cover?.image ? files.find((f) => f.upload && !ruleFor(rules, f.path)?.page && stem(f.path).split(\"/\").at(-1) === version.cover?.image) : undefined;\n const coverCrop = useEditorCrop(ref ?? NO_REF, thumb?.path, { client, onError: p.onError, onSaved: () => setThumb(null) });\n const editThumbnail = (path: string) => setThumb({ path, aspect: ruleFor(rules, path)?.aspect ?? \"\" });\n const mediaFailed = !!folder.error || folder.queue.items.some((q) => q.status === \"failed\") || files.some((f) => f.failed);\n const processing = files.some(isProcessing);\n const selectedPages = pages.length;\n const filesPending = folder.busy || allocating || processing || folder.read.loading || cover.pending;\n const publishingBlocked =\n filesPending ||\n mediaFailed ||\n !!folder.read.error ||\n selectedPages === 0 ||\n coordinator.pending ||\n offer.pending;\n const add = (input: Iterable<File>) => {\n const added = [...input];\n if (!added.length) return;\n folder.add(added);\n void ensure(added.find((f) => /\\.zip$/i.test(f.name))?.name ?? added[0]?.name).catch(fail);\n };\n const dirty =\n publication.dirty.length > 0 ||\n texts.dirty.length > 0 ||\n details.dirty.length > 0 ||\n associations.dirty.length > 0 ||\n coordinator.dirty;\n // Queued files of a live edition count as edits until a save commits them.\n const unsaved = dirty || folder.pending.length > 0 || folder.queue.items.some((q) => q.status === \"uploaded\");\n useEffect(() => {\n if (!dirty && !folder.busy) return;\n const ask = (event: BeforeUnloadEvent) => {\n event.preventDefault();\n event.returnValue = \"\";\n };\n addEventListener(\"beforeunload\", ask);\n return () => removeEventListener(\"beforeunload\", ask);\n }, [dirty, folder.busy]);\n const save = async (publish: boolean) => {\n if (saving) return;\n setError(undefined);\n setNotice(\"\");\n const state = latest.current;\n const active = state.texts.get()[state.language];\n if (!active?.title.trim()) return setError(t(\"contentManager.titleRequired\"));\n const problem = coordinator.problem();\n if (problem) return setError(t(\"readerEditor.fixSection\", { section: problem }));\n if (!complete(state.details.get().access) || (state.details.get().access.level === \"tier\" && !state.details.get().access.tiers?.length))\n return setError(t(\"readerEditor.accessRequired\"));\n let attributes: Record<string, unknown>;\n try {\n attributes = parseAttributes(spec.attributes ?? {}, state.details.get().attributes);\n } catch (e) {\n return fail(e);\n }\n if (publish && publishingBlocked) return setError(t(\"readerEditor.filesNotReady\"));\n setSaving(true);\n const settleTexts = state.texts.checkpoint(),\n settleDetails = state.details.checkpoint(),\n settleAssociations = state.associations.checkpoint();\n const changedText = state.texts.dirty.slice();\n const snapshotTexts = { ...state.texts.get() };\n const snapshotDetails = state.details.get();\n const snapshotAssociations = state.associations.get().memberships.slice();\n const snapshotCreate = state.associations.get().create.slice();\n const waiting = (c: NewEntity) => !!scopeMissing(c.kind, snapshotAssociations, snapshotCreate);\n let cleanAssociations = true;\n try {\n let content = await ensure();\n if (!current()) return;\n if (membership.error) throw membership.error;\n await guarded(async () => {\n for (const key of changedText) {\n const l = String(key);\n const next = snapshotTexts[l];\n if (!next?.title.trim()) throw new ValidationError(t(\"contentManager.titleRequired\"));\n content = await client.contents.putText(content.id, l, textOf(next));\n if (!current()) return;\n }\n // Text writes advance the content revision. Fetch the current record\n // before the revision-checked details write, never reuse a stale one.\n content = await client.contents.get(content.id, language);\n if (!current()) return;\n content = await client.contents.update(content.id, {\n listing: snapshotDetails.listing,\n comments: snapshotDetails.comments,\n attributes,\n access: cleanRule(snapshotDetails.access),\n revision: content.revision,\n });\n if (!current()) return;\n if (state.associations.dirty.length) {\n const targetVersion = content.versions.find((v) => v.id === version?.id) ?? content.versions[0];\n const memberships = snapshotAssociations.map((a) => {\n const kind = cards.get(a.group_id ?? \"\")?.kind;\n return kind && model.entity_kinds[kind]?.version_level && !a.version_id ? { ...a, version_id: targetVersion?.id } : a;\n });\n const saved = await client.entities.setOfContent(content.id, { kinds: [...groupKinds], memberships, create: snapshotCreate.filter((c) => !waiting(c)) }, language);\n setPicked((all) => new Map([...all, ...saved.entities.map((g) => [g.id, g] as const)]));\n cleanAssociations = settleAssociations({\n memberships: saved.memberships.filter((a) => groupKinds.includes(saved.entities.find((g) => g.id === a.group_id)?.kind ?? \"\")),\n create: snapshotCreate.filter(waiting),\n });\n }\n });\n if (!current()) return;\n // A live edition queues changes for one commit; a draft adds files as\n // uploads finish. Saving metadata never interrupts a running upload.\n const currentFolder = folderRef.current;\n if (!currentFolder.busy && (currentFolder.pending.length || currentFolder.queue.items.some((q) => q.status === \"uploaded\"))) await currentFolder.commit();\n const blocked = await coordinator.save(current);\n if (blocked) throw new ValidationError(t(\"readerEditor.fixSection\", { section: blocked }));\n if (!current()) return;\n const cleanTexts = settleTexts(Object.fromEntries(languages.map((l) => [l.value, content.text?.[l.value] ?? snapshotTexts[l.value] ?? blank()])));\n const cleanDetails = settleDetails({\n listing: content.listing,\n comments: content.comments,\n attributes: formOf(spec.attributes ?? {}, content.attributes),\n access: content.access,\n });\n if (publish) {\n if (!cleanTexts || !cleanDetails || !cleanAssociations) throw new ValidationError(t(\"readerEditor.changedDuringSave\"));\n const fresh = folderRef.current;\n if (!ref || fresh.busy || fresh.error || fresh.queue.items.some((q) => q.status === \"failed\") || !(await readerMediaReady(client, ref)))\n throw new ValidationError(t(\"readerEditor.filesNotReady\"));\n const edition = version ? await client.contents.version(content.id, version.id, language) : null;\n if (edition?.state !== \"published\") throw new ValidationError(t(\"readerEditor.versionDraft\"));\n if (!current()) return;\n const settlePublication = publication.checkpoint();\n const published = await guarded(() => client.contents.publish(content.id, publishAt ? new Date(publishAt).toISOString() : undefined));\n settlePublication({ at: published.publish_at ? localInput(new Date(published.publish_at)) : \"\" });\n setNotice(t(\"contentManager.publishedNotice\"));\n } else setNotice(t(\"pollEditor.saved\"));\n } catch (e) {\n fail(e);\n } finally {\n if (current()) setSaving(false);\n }\n };\n\n const customCover = async (file: File) => {\n const content = await ensure(file.name);\n const v = content.versions.find((v) => v.id === version?.id) ?? content.versions[0];\n if (!v || !current()) return;\n const target = { kind: p.kind, id: content.id, version: v.id };\n const up = await client.media.uploadNamed(target, file, { path: await client.media.presetPath(p.kind, \"cover\", file) });\n if (current()) await client.contents.setCover(content.id, v.id, up.name);\n };\n // The thumbnail is the version's cover: a copy of the chosen page, then cropped.\n // Cover uploads are server-named, so the copy takes a fresh i-{uuid} name.\n const setThumbnail = async (file: FileInfo) => {\n if (!ref || !item || !version) return;\n const ext = /\\.[^./]+$/.exec(file.path)?.[0] ?? \"\";\n const path = await client.media.presetPath(p.kind, \"cover\", new File([], `i-${crypto.randomUUID()}${ext}`, { type: file.type }));\n await client.media.commit(ref, [{ op: \"copy\", from: { id: item.id, version: version.id, path: file.path }, to: path }]);\n if (!current()) return;\n await client.contents.setCover(item.id, version.id, stem(path).split(\"/\").at(-1)!);\n if (current()) editThumbnail(path);\n };\n const { confirm, dialog } = useConfirm();\n const remove = async () => {\n if (\n !item ||\n !(await confirm({\n title: t(\"contentManager.deleteTitle\", { title: item.title }),\n description: t(\"contentManager.deleteBody\"),\n confirm: t(\"contentManager.delete\"),\n }))\n )\n return;\n await actions.run(async () => {\n folder.discard();\n await client.contents.remove(item.id);\n if (current()) p.onDeleted?.(item);\n });\n };\n if (p.id && !item) return ed.error ? <LoadFailed error={ed.error} message={t(\"contentManager.loadFailed\")} retry={ed.reload} /> : <Rows />;\n const status = item ? contentStatus(item) : \"draft\";\n const primaryVersion = version?.id;\n const changeDetails = (patch: Partial<typeof details.value>) => details.edit((d) => ({ ...d, ...patch }));\n const versionChoices = versions.map((v) => ({ id: v.id, label: versionLabel(v, (l) => languages.find((x) => x.value === l)?.label ?? l, p.labels) }));\n return (\n <EditorSaveContext.Provider value={coordinator.context}>\n <div className=\"grid gap-5 text-base\" data-ckui=\"reader-content-editor\">\n <div className=\"sticky top-0 z-10 flex flex-wrap items-center gap-3 rounded-xl border border-border bg-background/95 p-4 shadow-sm\">\n <button\n type=\"button\"\n className=\"h-20 shrink-0 overflow-hidden rounded-md border border-border bg-muted disabled:cursor-default\"\n style={{ aspectRatio: 0.7071 }}\n disabled={!coverFile || saving}\n title={t(\"readerEditor.thumbnail\")}\n aria-label={t(\"readerEditor.editThumbnail\")}\n onClick={() => coverFile && editThumbnail(coverFile.path)}\n data-ckui=\"editor-thumbnail\"\n >\n {version?.cover?.url && <img src={version.cover.url} alt=\"\" className=\"size-full object-cover\" />}\n </button>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"sr-only\">{text.title || t(\"readerEditor.new\")}</h1>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Badge variant={item?.live ? \"default\" : \"outline\"}>{t(`contentManager.${status}`)}</Badge>\n {version && <span>{t(\"contentEditor.pageCount\", { count: folder.read.read ? selectedPages : version.pages ?? 0 })}</span>}\n {allocating && <span role=\"status\">{t(\"common.saving\")}</span>}\n </div>\n </div>\n {item && p.contentHref?.(item) && (\n <a href={p.contentHref(item)} className=\"text-sm underline\" {...(item.live ? {} : { target: \"_blank\", rel: \"noopener\" })}>\n {t(item.live ? \"contentManager.view\" : \"readerEditor.preview\")}\n </a>\n )}\n {item && !unsaved && !saving ? (\n <span role=\"status\" className=\"text-sm text-muted-foreground\" data-ckui=\"editor-saved\">\n {t(\"readerEditor.allSaved\")}\n </span>\n ) : (\n <Button disabled={saving || allocating || !unsaved} onClick={() => void save(false)}>\n {saving ? t(\"common.saving\") : t(item?.live ? \"readerEditor.saveChanges\" : \"readerEditor.saveDraft\")}\n </Button>\n )}\n {!item?.live && (\n <Button variant=\"outline\" disabled={saving || publishingBlocked} onClick={() => void save(true)}>\n {publishAt ? t(\"readerEditor.schedule\") : t(\"contentManager.publish\")}\n </Button>\n )}\n </div>\n {error != null && <ErrorLine>{typeof error === \"string\" ? error : contentError(m, toContentKitError(error))}</ErrorLine>}\n {notice && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {notice}\n </p>\n )}\n <fieldset disabled={saving} className=\"grid min-w-0 items-start gap-5 xl:grid-cols-[minmax(0,1fr)_minmax(18rem,24rem)]\">\n <div className=\"grid min-w-0 gap-5\">\n <Panel label={t(\"readerEditor.details\")}>\n <div className=\"grid gap-4 sm:grid-cols-[minmax(0,1fr)_10rem]\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-title`}>{t(\"contentManager.itemTitle\")}</Label>\n <Input id={`${ids}-title`} required maxLength={300} value={text.title} onChange={(e) => editText({ title: e.target.value })} />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-language`}>{t(\"contentManager.language\")}</Label>\n <Select value={language} onValueChange={(l) => l && setLanguage(l)}>\n <SelectTrigger id={`${ids}-language`}>\n <SelectValue>{languages.find((l) => l.value === language)?.label ?? language}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {languages.map((l) => (\n <SelectItem key={l.value} value={l.value}>\n {l.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-description`}>{t(\"readerEditor.headerText\")}</Label>\n <Textarea id={`${ids}-description`} rows={3} value={text.description ?? \"\"} onChange={(e) => editText({ description: e.target.value })} />\n </div>\n <AttributeFields\n declared={spec.attributes ?? {}}\n form={details.value.attributes}\n onChange={(name, value) => changeDetails({ attributes: { ...details.value.attributes, [name]: value } })}\n labels={p.labels}\n />\n </Panel>\n <Panel title={t(\"readerEditor.files\")}>\n {versions.length > 1 && (\n <Select value={primaryVersion ?? \"\"} onValueChange={(v) => v && setChosen(v)} disabled={folder.busy || folder.pending.length > 0}>\n <SelectTrigger aria-label={t(\"contentEditor.versions\")}>\n <SelectValue>{versionChoices.find((v) => v.id === primaryVersion)?.label}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {versionChoices.map((v) => (\n <SelectItem key={v.id} value={v.id}>\n {v.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n <p className=\"text-sm text-muted-foreground\">{t(\"readerEditor.fileHelp\")}</p>\n {page && (\n <div className=\"flex flex-wrap items-center gap-2 text-sm\" data-ckui=\"selected-page\">\n <span className=\"text-muted-foreground\">\n {t(\"readerEditor.pageSelected\", { name: positionalName(pages.findIndex((f) => f.path === page.path) + 1, pages.length, page.path) })}\n </span>\n <Button size=\"sm\" variant=\"secondary\" disabled={cover.pending || saving} onClick={() => void cover.run(() => setThumbnail(page))}>\n {t(\"readerEditor.setThumbnail\")}\n </Button>\n </div>\n )}\n <MediaFolderEditor\n folder={{ ...folder, add }}\n label={false}\n layout=\"grid\"\n disabled={saving}\n inputLabel={t(\"readerEditor.files\")}\n selectedPage={page?.path ?? null}\n onSelectPage={setPage}\n />\n {folder.read.error && <LoadFailed error={folder.read.error} message={t(\"contentManager.loadFailed\")} retry={folder.read.reload} />}\n {(mediaFailed || filesPending || (!folder.read.error && selectedPages === 0)) && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {mediaFailed ? t(\"readerEditor.filesFailed\") : filesPending ? t(\"readerEditor.processing\") : t(\"readerEditor.addPages\")}\n </p>\n )}\n {item && version && <PageNotices content={item.id} version={version.id} client={client} onError={p.onError} />}\n </Panel>\n {item && (\n <details className=\"rounded-xl border border-border bg-card p-4\" onToggle={(e) => e.currentTarget.open && setVersionsOpened(true)}>\n <summary className=\"cursor-pointer font-medium\">{t(\"readerEditor.versions\")}</summary>\n {versionsOpened && (\n <VersionsEditor content={item} media={false} activeVersion={primaryVersion} client={client} labels={p.labels} onError={p.onError} />\n )}\n </details>\n )}\n {item && version && (\n <details className=\"rounded-xl border border-border bg-card p-4\" onToggle={(e) => setToolsExpanded(e.currentTarget.open)}>\n <summary className=\"cursor-pointer font-medium\">{t(\"readerEditor.readerTools\")}</summary>\n {toolsOpened\n .filter((id) => versions.some((v) => v.id === id))\n .map((id) => (\n <div key={id} hidden={id !== version.id}>\n <ReaderManifestEditor content={item.id} version={id} client={client} onError={p.onError} />\n </div>\n ))}\n </details>\n )}\n </div>\n <aside className=\"grid min-w-0 gap-5\">\n <Panel title={t(\"readerEditor.entities\")}>\n {membership.error && <ErrorLine error={membership.error} />}\n {groupKinds.map((kind) => {\n const rows = associations.value.memberships.map((a, index) => ({ a, index })).filter(({ a }) => cards.get(a.group_id ?? \"\")?.kind === kind);\n return (\n <EntityChips\n key={kind}\n kind={kind}\n label={labelOf(p.labels, kind)}\n memberships={rows.map(({ a }) => a)}\n cards={cards}\n spec={model.entity_kinds[kind] ?? {}}\n labels={p.labels}\n versions={versionChoices}\n versionLabel={(id) => versionChoices.find((v) => v.id === id)?.label ?? id}\n language={language}\n management={p.management}\n client={client}\n disabled={!!item && membership.loading}\n created={associations.value.create.filter((c) => c.kind === kind).map((c) => c.name)}\n needsScope={scopeMissing(kind, associations.value.memberships, associations.value.create)}\n onCreatedChange={(names) => associations.edit((d) => ({ ...d, create: [...d.create.filter((c) => c.kind !== kind), ...names.map((name) => ({ kind, name, language }))] }))}\n onChange={(i, patch) => associations.edit((d) => ({ ...d, memberships: d.memberships.map((x, j) => (j === rows[i]!.index ? { ...x, ...patch } : x)) }))}\n onRemove={(i) => associations.edit((d) => ({ ...d, memberships: d.memberships.filter((_, j) => j !== rows[i]!.index) }))}\n onAdd={(card) => {\n setPicked((all) => new Map(all).set(card.id, card));\n associations.edit((d) => ({\n ...d,\n memberships: [...d.memberships, { group_id: card.id, ...(model.entity_kinds[kind]?.version_level && version ? { version_id: version.id } : {}) }],\n }));\n }}\n />\n );\n })}\n </Panel>\n <Panel title={t(\"contentManager.cover\")}>\n <p className=\"text-sm text-muted-foreground\">{t(\"readerEditor.thumbnailHelp\")}</p>\n <label className=\"inline-flex cursor-pointer justify-center rounded-md border border-border px-3 py-2 text-sm font-medium hover:bg-muted\">\n {t(\"contentManager.addCover\")}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"sr-only\"\n aria-label={t(\"contentManager.cover\")}\n disabled={cover.pending || saving}\n onChange={(e) => {\n const file = e.target.files?.[0];\n e.target.value = \"\";\n if (file) void cover.run(() => customCover(file));\n }}\n />\n </label>\n <ErrorLine error={cover.error} />\n </Panel>\n <Panel title={t(\"contentEditor.accessTitle\")}>\n <RuleFields\n value={details.value.access}\n onChange={(access) => changeDetails({ access })}\n model={model}\n kind={p.kind}\n owner={item?.owner_group_id ?? p.ownerGroup}\n labels={p.labels}\n client={client}\n />\n {item && (details.value.access.level === \"ppv\" || details.value.access.level === \"group_ppv\" || item.offer) && (\n <OfferFields\n offer={item.offer}\n pending={offer.pending}\n onSell={(terms) => offer.run(() => client.offers.sell({ content: item.id }, terms))}\n onWithdraw={() => void offer.run(() => client.offers.withdraw({ content: item.id }))}\n />\n )}\n <ErrorLine error={offer.error} />\n </Panel>\n <Panel title={t(\"readerEditor.publication\")}>\n {!item?.live && (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-publish`}>{t(\"contentManager.publishAt\")}</Label>\n <Input id={`${ids}-publish`} type=\"datetime-local\" value={publishAt} onChange={(e) => setPublishAt(e.target.value)} />\n </div>\n )}\n <Label htmlFor={`${ids}-listing`}>{t(\"contentEditor.listing\")}</Label>\n <Select value={details.value.listing} onValueChange={(listing) => listing && changeDetails({ listing: listing as Listing })}>\n <SelectTrigger id={`${ids}-listing`}>\n <SelectValue>{t(`contentEditor.listing_${details.value.listing}`)}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {([\"listed\", \"members\", \"unlisted\"] as const).map((value) => (\n <SelectItem key={value} value={value}>\n {t(`contentEditor.listing_${value}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Label htmlFor={`${ids}-comments`}>{t(\"contentEditor.comments\")}</Label>\n <Select value={details.value.comments} onValueChange={(comments) => comments && changeDetails({ comments })}>\n <SelectTrigger id={`${ids}-comments`}>\n <SelectValue>{t(`contentEditor.comments_${details.value.comments as \"open\" | \"closed\" | \"hidden\"}`)}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {([\"open\", \"closed\", \"hidden\"] as const).map((value) => (\n <SelectItem key={value} value={value}>\n {t(`contentEditor.comments_${value}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {item?.state === \"published\" && (\n <Button variant=\"outline\" disabled={actions.pending} onClick={() => void actions.run(() => client.contents.unpublish(item.id))}>\n {t(\"contentManager.unpublish\")}\n </Button>\n )}\n {item && (\n <Button variant=\"destructive\" disabled={actions.pending} onClick={() => void remove()}>\n {t(\"contentManager.delete\")}\n </Button>\n )}\n <ErrorLine error={actions.error} />\n </Panel>\n </aside>\n </fieldset>\n {dialog}\n <ImageCropDialog\n open={!!thumb}\n onOpenChange={(open) => !open && coverCrop.status !== \"saving\" && setThumb(null)}\n source={\"source\" in coverCrop ? (coverCrop.source ?? null) : null}\n aspect={thumb?.aspect ?? \"\"}\n rotatable={false}\n initialEdit={\"edit\" in coverCrop ? coverCrop.edit : null}\n title={t(\"readerEditor.thumbnail\")}\n confirmLabel={t(\"readerEditor.setThumbnail\")}\n busy={coverCrop.status === \"saving\"}\n error={coverCrop.status === \"error\" ? contentError(m, coverCrop.error) : undefined}\n onConfirm={(edit) => void coverCrop.save(edit)}\n />\n </div>\n </EditorSaveContext.Provider>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"reader-content-editor.js","names":[],"sources":["../../../src/components/admin/reader-content-editor.tsx"],"sourcesContent":["import { useEffect, useId, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { parseAttributes } from \"../../client/group-fields.js\";\nimport { toContentKitError } from \"../../client/errors.js\";\nimport type { CatalogText, Content, ContentModel, FileInfo, GroupCard, Listing, Membership, NewEntity, RefBody, Rule } from \"../../client/generated/wire.js\";\nimport { stem } from \"../../client/media/client.js\";\nimport { ruleFor } from \"../../client/media/rules.js\";\nimport { isProcessing, pageRemoved } from \"../../client/media/windows.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { useContent } from \"../../react/contents.js\";\nimport { useErrorReporter, useGuarded } from \"../../react/context.js\";\nimport { useMediaFolder } from \"../../react/folder.js\";\nimport { useContentGroups } from \"../../react/groups.js\";\nimport { useEditorCrop } from \"../../react/crop.js\";\nimport { usePageNotices } from \"../../react/page-notices.js\";\nimport { useContentScope } from \"../../react/use-resource.js\";\nimport { Badge } from \"#ckui/ui/badge\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Input } from \"#ckui/ui/input\";\nimport { Label } from \"#ckui/ui/label\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"#ckui/ui/select\";\nimport { Textarea } from \"#ckui/ui/textarea\";\nimport { AttributeFields, formOf } from \"../groups/fields.js\";\nimport { EntityChips } from \"../groups/entity-chips.js\";\nimport { labelOf } from \"../groups/parts.js\";\nimport { ImageCropDialog } from \"../image-crop-dialog.js\";\nimport { MediaFolderEditor, positionalName } from \"../media-folder-editor.js\";\nimport { useDraft } from \"../../react/use-draft.js\";\nimport { RuleFields, cleanRule, complete, VersionsEditor, versionLabel } from \"../content/editors.js\";\nimport { OfferFields } from \"../content/offer-fields.js\";\nimport { ErrorLine, contentError, useAction } from \"../social/parts.js\";\nimport { localInput } from \"../social/bans.js\";\nimport { EditorSaveContext, readerMediaReady, useEditorSaveCoordinator } from \"../content/editor-save.js\";\nimport { ReaderManifestEditor } from \"./reader-manifest.js\";\nimport { PageNotices } from \"./page-notices.js\";\nimport { LoadFailed, Rows, useConfirm } from \"./shell.js\";\nimport { contentStatus, type ContentEditorProps } from \"./content-manager.js\";\nimport { fileTitle } from \"./bulk-drafts.js\";\n\nconst NO_REF: RefBody = { kind: \"\", id: \"\" };\nconst blank = (): CatalogText => ({ title: \"\", slug: \"\", description: \"\", body: \"\" });\nconst editableText = (item: Content | null, language: string): CatalogText =>\n item?.text?.[language] ??\n (item?.language === language ? { title: item.title, slug: item.slug, description: item.description, body: item.body } : blank());\nconst textOf = (text: CatalogText): CatalogText => ({\n ...text,\n title: text.title.trim(),\n description: text.description?.trim(),\n});\nclass ValidationError extends Error {}\n\n// Without a visible title, label names the section for assistive technology.\nfunction Panel({ title, label, children, className = \"\" }: { title?: ReactNode; label?: string; children: ReactNode; className?: string }) {\n return (\n <section aria-label={title ? undefined : label} className={`grid min-w-0 content-start gap-4 rounded-xl border border-border bg-card p-4 ${className}`}>\n {title && <h2 className=\"text-base font-semibold\">{title}</h2>}\n {children}\n </section>\n );\n}\n\n/** A reader work, its files and associations are one editing session. */\nexport function ReaderContentEditor(p: ContentEditorProps & { model: ContentModel }) {\n const { client, scope } = useContentScope(p.client);\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const guarded = useGuarded();\n const report = useErrorReporter(p.onError);\n const model = p.model,\n spec = model.kinds[p.kind]!;\n const offered = p.languages?.map((l) => (typeof l === \"string\" ? { value: l, label: l } : l));\n const languages = offered?.length ? offered : model.languages.map((l) => ({ value: l, label: l }));\n const languageKey = languages.map((l) => l.value).join(\"|\");\n const [language, setLanguage] = useState(languages[0]?.value ?? \"en\");\n const [chosen, setChosen] = useState(\"\");\n const ed = useContent(p.id, p.kind, language, { client, version: chosen || undefined });\n const [created, setCreated] = useState<Content | null>(null);\n const item = ed.content ?? created;\n const owned = useRef({ item, scope, alive: true });\n owned.current.item = item;\n useEffect(() => {\n const owner = owned.current;\n owner.alive = true;\n return () => {\n owner.alive = false;\n };\n }, []);\n const current = () => owned.current.alive && owned.current.scope === scope;\n const creating = useRef<Promise<Content> | null>(null);\n const [allocating, setAllocating] = useState(false);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<unknown>();\n const [notice, setNotice] = useState(\"\");\n const publication = useDraft(useMemo(() => ({ at: item?.publish_at ? localInput(new Date(item.publish_at)) : \"\" }), [item?.publish_at]));\n const publishAt = publication.value.at;\n const setPublishAt = (at: string) => publication.edit({ at });\n const [versionsOpened, setVersionsOpened] = useState(false);\n const [toolsOpened, setToolsOpened] = useState<string[]>([]);\n const [toolsExpanded, setToolsExpanded] = useState(false);\n // A page tile picked as the thumbnail's source, and the cover upload being cropped.\n const [page, setPage] = useState<FileInfo | null>(null);\n const [thumb, setThumb] = useState<{ path: string; aspect: string } | null>(null);\n const versions = useMemo(() => [...(item?.versions ?? [])].sort((a, b) => a.position - b.position), [item?.versions]);\n const version = versions.find((v) => v.id === chosen) ?? versions[0];\n useEffect(() => {\n if (toolsExpanded && version) setToolsOpened((ids) => (ids.includes(version.id) ? ids : [...ids, version.id]));\n }, [toolsExpanded, version]);\n const membership = useContentGroups(item?.id, { language, client });\n const names = useMemo(() => new Map(membership.entities), [membership.entities]);\n const [picked, setPicked] = useState<ReadonlyMap<string, GroupCard>>(new Map());\n const cards = useMemo(() => new Map([...picked, ...names]), [names, picked]);\n const groupKinds = useMemo(() => spec.entities ?? [], [spec.entities]);\n const texts = useDraft(useMemo(() => Object.fromEntries(languageKey.split(\"|\").map((l) => [l, editableText(item, l)])), [item, languageKey]));\n const details = useDraft(\n useMemo(\n () => ({\n listing: item?.listing ?? (\"listed\" as Listing),\n comments: item?.comments ?? \"open\",\n attributes: formOf(spec.attributes ?? {}, item?.attributes ?? {}),\n access: item?.access ?? ({ level: \"public\" } as Rule),\n }),\n [item?.listing, item?.comments, item?.attributes, item?.access, spec.attributes],\n ),\n );\n const associations = useDraft(\n useMemo(\n () => ({\n memberships: membership.memberships.filter((a) => groupKinds.includes(membership.entities.get(a.group_id ?? \"\")?.kind ?? \"\")),\n create: [] as NewEntity[],\n }),\n [membership.memberships, membership.entities, groupKinds],\n ),\n );\n // A scoped kind's new names wait for exactly one linked or new scope entity.\n const scopeMissing = (kind: string, memberships: readonly Membership[], create: readonly NewEntity[]) => {\n const by = model.entity_kinds[kind]?.scoped_by;\n if (!by) return undefined;\n const linked = new Set(memberships.filter((a) => cards.get(a.group_id ?? \"\")?.kind === by).map((a) => a.group_id));\n return linked.size + create.filter((c) => c.kind === by).length === 1 ? undefined : labelOf(p.labels, by);\n };\n const coordinator = useEditorSaveCoordinator();\n const latest = useRef({ texts, details, associations, language });\n latest.current = { texts, details, associations, language };\n // Starting entities (e.g. a series' \"new gallery\") join a new item's draft once, when they resolve.\n const started = useRef(false);\n useEffect(() => {\n if (started.current || p.id || !p.entities?.length) return;\n started.current = true;\n const usable = p.entities.filter((g) => groupKinds.includes(g.kind));\n if (!usable.length) return;\n setPicked((all) => new Map([...all, ...usable.map((g) => [g.id, g] as const)]));\n latest.current.associations.edit((d) => ({\n ...d,\n memberships: [...d.memberships, ...usable.filter((g) => !d.memberships.some((a) => a.group_id === g.id)).map((g) => ({ group_id: g.id }))],\n }));\n }, [p.id, p.entities, groupKinds]);\n const text = texts.value[language] ?? blank();\n const editText = (patch: Partial<CatalogText>) => texts.edit((all) => ({ ...all, [language]: { ...(all[language] ?? blank()), ...patch } }));\n const fail = (e: unknown) => {\n if (!current()) return;\n setError(e instanceof ValidationError ? e.message : e);\n if (!(e instanceof ValidationError)) report(toContentKitError(e), \"content.save\");\n };\n const ensure = async (suggested?: string): Promise<Content> => {\n if (owned.current.item) return owned.current.item;\n if (creating.current) return creating.current;\n setAllocating(true);\n const l = latest.current.language;\n const before = latest.current.texts.get()[l] ?? blank();\n const title = before.title.trim() || fileTitle(suggested ?? \"\") || t(\"readerEditor.untitled\");\n if (!before.title.trim()) latest.current.texts.edit((all) => ({ ...all, [l]: { ...(all[l] ?? blank()), title } }));\n const input = { kind: p.kind, text: { [l]: { ...before, title } }, owner_group_id: p.ownerGroup };\n creating.current = ed\n .create(input)\n .then((content) => {\n owned.current.item = content;\n if (current()) {\n setCreated(content);\n p.onCreated?.(content);\n }\n return content;\n })\n .finally(() => {\n creating.current = null;\n if (current()) setAllocating(false);\n });\n return creating.current;\n };\n const ref = useMemo(() => (item && version ? { kind: p.kind, id: item.id, version: version.id } : null), [p.kind, item, version]);\n const cover = useAction(\"content.save\", p.onError);\n const offer = useAction(\"offer.save\", p.onError);\n const actions = useAction(\"content.save\", p.onError);\n const folder = useMediaFolder(ref, { commit: version?.live ? \"manual\" : \"auto\", client, onError: p.onError });\n const folderRef = useRef(folder);\n folderRef.current = folder;\n const files = folder.read.read?.files ?? [];\n const notices = usePageNotices(item?.id, version?.id, { client });\n const reloadNotices = notices.reload;\n // A ZIP's pages appear after its commit. Media polling alone does not\n // refresh the notices when extraction changes the manifest.\n const mediaKey = ref && folder.read.read ? JSON.stringify([ref.id, ref.version,\n files.filter((file) => file.upload).map((file) => [file.path, file.size, file.staged, file.pending, file.failed]),\n ]) : null;\n useEffect(() => {\n if (mediaKey) reloadNotices();\n }, [mediaKey, reloadNotices]);\n const pages = folder.groups.filter((g) => g.rule?.page).flatMap((g) => g.files.filter((f) => !pageRemoved(f)));\n useEffect(() => {\n if (page && !pages.some((f) => f.path === page.path)) setPage(null);\n }, [page, pages]);\n const rules = folder.groups.flatMap((g) => (g.rule ? [g.rule] : []));\n const coverFile = version?.cover?.image ? files.find((f) => f.upload && !ruleFor(rules, f.path)?.page && stem(f.path).split(\"/\").at(-1) === version.cover?.image) : undefined;\n const coverCrop = useEditorCrop(ref ?? NO_REF, thumb?.path, { client, onError: p.onError, onSaved: () => setThumb(null) });\n const editThumbnail = (path: string) => setThumb({ path, aspect: ruleFor(rules, path)?.aspect ?? \"\" });\n const mediaFailed = !!folder.error || folder.queue.items.some((q) => q.status === \"failed\") || files.some((f) => f.failed);\n const processing = files.some(isProcessing);\n const selectedPages = pages.length;\n const filesPending = folder.busy || allocating || processing || folder.read.loading || cover.pending;\n const publishingBlocked =\n filesPending ||\n mediaFailed ||\n !!folder.read.error ||\n selectedPages === 0 ||\n coordinator.pending ||\n offer.pending;\n const add = (input: Iterable<File>) => {\n const added = [...input];\n if (!added.length) return;\n folder.add(added);\n void ensure(added.find((f) => /\\.zip$/i.test(f.name))?.name ?? added[0]?.name).catch(fail);\n };\n const dirty =\n publication.dirty.length > 0 ||\n texts.dirty.length > 0 ||\n details.dirty.length > 0 ||\n associations.dirty.length > 0 ||\n coordinator.dirty;\n // Queued files of a live edition count as edits until a save commits them.\n const unsaved = dirty || folder.pending.length > 0 || folder.queue.items.some((q) => q.status === \"uploaded\");\n useEffect(() => {\n if (!dirty && !folder.busy) return;\n const ask = (event: BeforeUnloadEvent) => {\n event.preventDefault();\n event.returnValue = \"\";\n };\n addEventListener(\"beforeunload\", ask);\n return () => removeEventListener(\"beforeunload\", ask);\n }, [dirty, folder.busy]);\n const save = async (publish: boolean) => {\n if (saving) return;\n setError(undefined);\n setNotice(\"\");\n const state = latest.current;\n const active = state.texts.get()[state.language];\n if (!active?.title.trim()) return setError(t(\"contentManager.titleRequired\"));\n const problem = coordinator.problem();\n if (problem) return setError(t(\"readerEditor.fixSection\", { section: problem }));\n if (!complete(state.details.get().access) || (state.details.get().access.level === \"tier\" && !state.details.get().access.tiers?.length))\n return setError(t(\"readerEditor.accessRequired\"));\n let attributes: Record<string, unknown>;\n try {\n attributes = parseAttributes(spec.attributes ?? {}, state.details.get().attributes);\n } catch (e) {\n return fail(e);\n }\n if (publish && publishingBlocked) return setError(t(\"readerEditor.filesNotReady\"));\n setSaving(true);\n const settleTexts = state.texts.checkpoint(),\n settleDetails = state.details.checkpoint(),\n settleAssociations = state.associations.checkpoint();\n const changedText = state.texts.dirty.slice();\n const snapshotTexts = { ...state.texts.get() };\n const snapshotDetails = state.details.get();\n const snapshotAssociations = state.associations.get().memberships.slice();\n const snapshotCreate = state.associations.get().create.slice();\n const waiting = (c: NewEntity) => !!scopeMissing(c.kind, snapshotAssociations, snapshotCreate);\n let cleanAssociations = true;\n try {\n let content = await ensure();\n if (!current()) return;\n if (membership.error) throw membership.error;\n await guarded(async () => {\n for (const key of changedText) {\n const l = String(key);\n const next = snapshotTexts[l];\n if (!next?.title.trim()) throw new ValidationError(t(\"contentManager.titleRequired\"));\n content = await client.contents.putText(content.id, l, textOf(next));\n if (!current()) return;\n }\n // Text writes advance the content revision. Fetch the current record\n // before the revision-checked details write, never reuse a stale one.\n content = await client.contents.get(content.id, language);\n if (!current()) return;\n content = await client.contents.update(content.id, {\n listing: snapshotDetails.listing,\n comments: snapshotDetails.comments,\n attributes,\n access: cleanRule(snapshotDetails.access),\n revision: content.revision,\n });\n if (!current()) return;\n if (state.associations.dirty.length) {\n const targetVersion = content.versions.find((v) => v.id === version?.id) ?? content.versions[0];\n const memberships = snapshotAssociations.map((a) => {\n const kind = cards.get(a.group_id ?? \"\")?.kind;\n return kind && model.entity_kinds[kind]?.version_level && !a.version_id ? { ...a, version_id: targetVersion?.id } : a;\n });\n const saved = await client.entities.setOfContent(content.id, { kinds: [...groupKinds], memberships, create: snapshotCreate.filter((c) => !waiting(c)) }, language);\n setPicked((all) => new Map([...all, ...saved.entities.map((g) => [g.id, g] as const)]));\n cleanAssociations = settleAssociations({\n memberships: saved.memberships.filter((a) => groupKinds.includes(saved.entities.find((g) => g.id === a.group_id)?.kind ?? \"\")),\n create: snapshotCreate.filter(waiting),\n });\n }\n });\n if (!current()) return;\n // A live edition queues changes for one commit; a draft adds files as\n // uploads finish. Saving metadata never interrupts a running upload.\n const currentFolder = folderRef.current;\n if (!currentFolder.busy && (currentFolder.pending.length || currentFolder.queue.items.some((q) => q.status === \"uploaded\"))) await currentFolder.commit();\n const blocked = await coordinator.save(current);\n if (blocked) throw new ValidationError(t(\"readerEditor.fixSection\", { section: blocked }));\n if (!current()) return;\n const cleanTexts = settleTexts(Object.fromEntries(languages.map((l) => [l.value, content.text?.[l.value] ?? snapshotTexts[l.value] ?? blank()])));\n const cleanDetails = settleDetails({\n listing: content.listing,\n comments: content.comments,\n attributes: formOf(spec.attributes ?? {}, content.attributes),\n access: content.access,\n });\n if (publish) {\n if (!cleanTexts || !cleanDetails || !cleanAssociations) throw new ValidationError(t(\"readerEditor.changedDuringSave\"));\n const fresh = folderRef.current;\n if (!ref || fresh.busy || fresh.error || fresh.queue.items.some((q) => q.status === \"failed\") || !(await readerMediaReady(client, ref)))\n throw new ValidationError(t(\"readerEditor.filesNotReady\"));\n const edition = version ? await client.contents.version(content.id, version.id, language) : null;\n if (edition?.state !== \"published\") throw new ValidationError(t(\"readerEditor.versionDraft\"));\n if (!current()) return;\n const settlePublication = publication.checkpoint();\n const published = await guarded(() => client.contents.publishWhenReady(content.id, publishAt ? new Date(publishAt).toISOString() : undefined));\n settlePublication({ at: published.publish_at ? localInput(new Date(published.publish_at)) : \"\" });\n setNotice(t(\"contentManager.publishedNotice\"));\n } else setNotice(t(\"pollEditor.saved\"));\n } catch (e) {\n fail(e);\n } finally {\n if (current()) setSaving(false);\n }\n };\n\n const customCover = async (file: File) => {\n const content = await ensure(file.name);\n const v = content.versions.find((v) => v.id === version?.id) ?? content.versions[0];\n if (!v || !current()) return;\n const target = { kind: p.kind, id: content.id, version: v.id };\n const up = await client.media.uploadNamed(target, file, { path: await client.media.presetPath(p.kind, \"cover\", file) });\n if (current()) await client.contents.setCover(content.id, v.id, up.name);\n };\n // The thumbnail is the version's cover: a copy of the chosen page, then cropped.\n // Cover uploads are server-named, so the copy takes a fresh i-{uuid} name.\n const setThumbnail = async (file: FileInfo) => {\n if (!ref || !item || !version) return;\n const ext = /\\.[^./]+$/.exec(file.path)?.[0] ?? \"\";\n const path = await client.media.presetPath(p.kind, \"cover\", new File([], `i-${crypto.randomUUID()}${ext}`, { type: file.type }));\n await client.media.commit(ref, [{ op: \"copy\", from: { id: item.id, version: version.id, path: file.path }, to: path }]);\n if (!current()) return;\n await client.contents.setCover(item.id, version.id, stem(path).split(\"/\").at(-1)!);\n if (current()) editThumbnail(path);\n };\n const { confirm, dialog } = useConfirm();\n const remove = async () => {\n if (\n !item ||\n !(await confirm({\n title: t(\"contentManager.deleteTitle\", { title: item.title }),\n description: t(\"contentManager.deleteBody\"),\n confirm: t(\"contentManager.delete\"),\n }))\n )\n return;\n await actions.run(async () => {\n folder.discard();\n await client.contents.remove(item.id);\n if (current()) p.onDeleted?.(item);\n });\n };\n if (p.id && !item) return ed.error ? <LoadFailed error={ed.error} message={t(\"contentManager.loadFailed\")} retry={ed.reload} /> : <Rows />;\n const status = item ? contentStatus(item) : \"draft\";\n const primaryVersion = version?.id;\n const changeDetails = (patch: Partial<typeof details.value>) => details.edit((d) => ({ ...d, ...patch }));\n const versionChoices = versions.map((v) => ({ id: v.id, label: versionLabel(v, (l) => languages.find((x) => x.value === l)?.label ?? l, p.labels) }));\n return (\n <EditorSaveContext.Provider value={coordinator.context}>\n <div className=\"grid gap-5 text-base\" data-ckui=\"reader-content-editor\">\n <div className=\"sticky top-0 z-10 flex flex-wrap items-center gap-3 rounded-xl border border-border bg-background/95 p-4 shadow-sm\">\n <button\n type=\"button\"\n className=\"h-20 shrink-0 overflow-hidden rounded-md border border-border bg-muted disabled:cursor-default\"\n style={{ aspectRatio: 0.7071 }}\n disabled={!coverFile || saving}\n title={t(\"readerEditor.thumbnail\")}\n aria-label={t(\"readerEditor.editThumbnail\")}\n onClick={() => coverFile && editThumbnail(coverFile.path)}\n data-ckui=\"editor-thumbnail\"\n >\n {version?.cover?.url && <img src={version.cover.url} alt=\"\" className=\"size-full object-cover\" />}\n </button>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"sr-only\">{text.title || t(\"readerEditor.new\")}</h1>\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Badge variant={item?.live ? \"default\" : \"outline\"}>{t(`contentManager.${status}`)}</Badge>\n {version && <span>{t(\"contentEditor.pageCount\", { count: folder.read.read ? selectedPages : version.pages ?? 0 })}</span>}\n {allocating && <span role=\"status\">{t(\"common.saving\")}</span>}\n </div>\n </div>\n {item && p.contentHref?.(item) && (\n <a href={p.contentHref(item)} className=\"text-sm underline\" {...(item.live ? {} : { target: \"_blank\", rel: \"noopener\" })}>\n {t(item.live ? \"contentManager.view\" : \"readerEditor.preview\")}\n </a>\n )}\n {item && !unsaved && !saving ? (\n <span role=\"status\" className=\"text-sm text-muted-foreground\" data-ckui=\"editor-saved\">\n {t(\"readerEditor.allSaved\")}\n </span>\n ) : (\n <Button disabled={saving || allocating || !unsaved} onClick={() => void save(false)}>\n {saving ? t(\"common.saving\") : t(item?.live ? \"readerEditor.saveChanges\" : \"readerEditor.saveDraft\")}\n </Button>\n )}\n {!item?.live && (\n <Button variant=\"outline\" disabled={saving || publishingBlocked} onClick={() => void save(true)}>\n {publishAt ? t(\"readerEditor.schedule\") : t(\"contentManager.publish\")}\n </Button>\n )}\n </div>\n {error != null && <ErrorLine>{typeof error === \"string\" ? error : contentError(m, toContentKitError(error))}</ErrorLine>}\n {notice && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {notice}\n </p>\n )}\n <fieldset disabled={saving} className=\"grid min-w-0 items-start gap-5 xl:grid-cols-[minmax(0,1fr)_minmax(18rem,24rem)]\">\n <div className=\"grid min-w-0 gap-5\">\n <Panel label={t(\"readerEditor.details\")}>\n <div className=\"grid gap-4 sm:grid-cols-[minmax(0,1fr)_10rem]\">\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-title`}>{t(\"contentManager.itemTitle\")}</Label>\n <Input id={`${ids}-title`} required maxLength={300} value={text.title} onChange={(e) => editText({ title: e.target.value })} />\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-language`}>{t(\"contentManager.language\")}</Label>\n <Select value={language} onValueChange={(l) => l && setLanguage(l)}>\n <SelectTrigger id={`${ids}-language`}>\n <SelectValue>{languages.find((l) => l.value === language)?.label ?? language}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {languages.map((l) => (\n <SelectItem key={l.value} value={l.value}>\n {l.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-description`}>{t(\"readerEditor.headerText\")}</Label>\n <Textarea id={`${ids}-description`} rows={3} value={text.description ?? \"\"} onChange={(e) => editText({ description: e.target.value })} />\n </div>\n <AttributeFields\n declared={spec.attributes ?? {}}\n form={details.value.attributes}\n onChange={(name, value) => changeDetails({ attributes: { ...details.value.attributes, [name]: value } })}\n labels={p.labels}\n />\n </Panel>\n <Panel title={t(\"readerEditor.files\")}>\n {versions.length > 1 && (\n <Select value={primaryVersion ?? \"\"} onValueChange={(v) => v && setChosen(v)} disabled={folder.busy || folder.pending.length > 0}>\n <SelectTrigger aria-label={t(\"contentEditor.versions\")}>\n <SelectValue>{versionChoices.find((v) => v.id === primaryVersion)?.label}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {versionChoices.map((v) => (\n <SelectItem key={v.id} value={v.id}>\n {v.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n <p className=\"text-sm text-muted-foreground\">{t(\"readerEditor.fileHelp\")}</p>\n {page && (\n <div className=\"flex flex-wrap items-center gap-2 text-sm\" data-ckui=\"selected-page\">\n <span className=\"text-muted-foreground\">\n {t(\"readerEditor.pageSelected\", { name: positionalName(pages.findIndex((f) => f.path === page.path) + 1, pages.length, page.path) })}\n </span>\n <Button size=\"sm\" variant=\"secondary\" disabled={cover.pending || saving} onClick={() => void cover.run(() => setThumbnail(page))}>\n {t(\"readerEditor.setThumbnail\")}\n </Button>\n </div>\n )}\n <MediaFolderEditor\n folder={{ ...folder, add }}\n label={false}\n layout=\"grid\"\n disabled={saving}\n inputLabel={t(\"readerEditor.files\")}\n selectedPage={page?.path ?? null}\n onSelectPage={setPage}\n />\n {folder.read.error && <LoadFailed error={folder.read.error} message={t(\"contentManager.loadFailed\")} retry={folder.read.reload} />}\n {(mediaFailed || filesPending || (!folder.read.error && selectedPages === 0)) && (\n <p role=\"status\" className=\"text-sm text-muted-foreground\">\n {mediaFailed ? t(\"readerEditor.filesFailed\") : filesPending ? t(\"readerEditor.processing\") : t(\"readerEditor.addPages\")}\n </p>\n )}\n {item && version && <PageNotices content={item.id} version={version.id} client={client} onError={p.onError} />}\n </Panel>\n {item && (\n <details className=\"rounded-xl border border-border bg-card p-4\" onToggle={(e) => e.currentTarget.open && setVersionsOpened(true)}>\n <summary className=\"cursor-pointer font-medium\">{t(\"readerEditor.versions\")}</summary>\n {versionsOpened && (\n <VersionsEditor content={item} media={false} activeVersion={primaryVersion} client={client} labels={p.labels} onError={p.onError} />\n )}\n </details>\n )}\n {item && version && (\n <details className=\"rounded-xl border border-border bg-card p-4\" onToggle={(e) => setToolsExpanded(e.currentTarget.open)}>\n <summary className=\"cursor-pointer font-medium\">{t(\"readerEditor.readerTools\")}</summary>\n {toolsOpened\n .filter((id) => versions.some((v) => v.id === id))\n .map((id) => (\n <div key={id} hidden={id !== version.id}>\n <ReaderManifestEditor content={item.id} version={id} client={client} onError={p.onError} />\n </div>\n ))}\n </details>\n )}\n </div>\n <aside className=\"grid min-w-0 gap-5\">\n <Panel title={t(\"readerEditor.entities\")}>\n {membership.error && <ErrorLine error={membership.error} />}\n {groupKinds.map((kind) => {\n const rows = associations.value.memberships.map((a, index) => ({ a, index })).filter(({ a }) => cards.get(a.group_id ?? \"\")?.kind === kind);\n return (\n <EntityChips\n key={kind}\n kind={kind}\n label={labelOf(p.labels, kind)}\n memberships={rows.map(({ a }) => a)}\n cards={cards}\n spec={model.entity_kinds[kind] ?? {}}\n labels={p.labels}\n versions={versionChoices}\n versionLabel={(id) => versionChoices.find((v) => v.id === id)?.label ?? id}\n language={language}\n management={p.management}\n client={client}\n disabled={!!item && membership.loading}\n created={associations.value.create.filter((c) => c.kind === kind).map((c) => c.name)}\n needsScope={scopeMissing(kind, associations.value.memberships, associations.value.create)}\n onCreatedChange={(names) => associations.edit((d) => ({ ...d, create: [...d.create.filter((c) => c.kind !== kind), ...names.map((name) => ({ kind, name, language }))] }))}\n onChange={(i, patch) => associations.edit((d) => ({ ...d, memberships: d.memberships.map((x, j) => (j === rows[i]!.index ? { ...x, ...patch } : x)) }))}\n onRemove={(i) => associations.edit((d) => ({ ...d, memberships: d.memberships.filter((_, j) => j !== rows[i]!.index) }))}\n onAdd={(card) => {\n setPicked((all) => new Map(all).set(card.id, card));\n associations.edit((d) => ({\n ...d,\n memberships: [...d.memberships, { group_id: card.id, ...(model.entity_kinds[kind]?.version_level && version ? { version_id: version.id } : {}) }],\n }));\n }}\n />\n );\n })}\n </Panel>\n <Panel title={t(\"contentManager.cover\")}>\n <p className=\"text-sm text-muted-foreground\">{t(\"readerEditor.thumbnailHelp\")}</p>\n <label className=\"inline-flex cursor-pointer justify-center rounded-md border border-border px-3 py-2 text-sm font-medium hover:bg-muted\">\n {t(\"contentManager.addCover\")}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"sr-only\"\n aria-label={t(\"contentManager.cover\")}\n disabled={cover.pending || saving}\n onChange={(e) => {\n const file = e.target.files?.[0];\n e.target.value = \"\";\n if (file) void cover.run(() => customCover(file));\n }}\n />\n </label>\n <ErrorLine error={cover.error} />\n </Panel>\n <Panel title={t(\"contentEditor.accessTitle\")}>\n <RuleFields\n value={details.value.access}\n onChange={(access) => changeDetails({ access })}\n model={model}\n kind={p.kind}\n owner={item?.owner_group_id ?? p.ownerGroup}\n labels={p.labels}\n client={client}\n />\n {item && (details.value.access.level === \"ppv\" || details.value.access.level === \"group_ppv\" || item.offer) && (\n <OfferFields\n offer={item.offer}\n pending={offer.pending}\n onSell={(terms) => offer.run(() => client.offers.sell({ content: item.id }, terms))}\n onWithdraw={() => void offer.run(() => client.offers.withdraw({ content: item.id }))}\n />\n )}\n <ErrorLine error={offer.error} />\n </Panel>\n <Panel title={t(\"readerEditor.publication\")}>\n {!item?.live && (\n <div className=\"grid gap-1.5\">\n <Label htmlFor={`${ids}-publish`}>{t(\"contentManager.publishAt\")}</Label>\n <Input id={`${ids}-publish`} type=\"datetime-local\" value={publishAt} onChange={(e) => setPublishAt(e.target.value)} />\n </div>\n )}\n <Label htmlFor={`${ids}-listing`}>{t(\"contentEditor.listing\")}</Label>\n <Select value={details.value.listing} onValueChange={(listing) => listing && changeDetails({ listing: listing as Listing })}>\n <SelectTrigger id={`${ids}-listing`}>\n <SelectValue>{t(`contentEditor.listing_${details.value.listing}`)}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {([\"listed\", \"members\", \"unlisted\"] as const).map((value) => (\n <SelectItem key={value} value={value}>\n {t(`contentEditor.listing_${value}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Label htmlFor={`${ids}-comments`}>{t(\"contentEditor.comments\")}</Label>\n <Select value={details.value.comments} onValueChange={(comments) => comments && changeDetails({ comments })}>\n <SelectTrigger id={`${ids}-comments`}>\n <SelectValue>{t(`contentEditor.comments_${details.value.comments as \"open\" | \"closed\" | \"hidden\"}`)}</SelectValue>\n </SelectTrigger>\n <SelectContent>\n {([\"open\", \"closed\", \"hidden\"] as const).map((value) => (\n <SelectItem key={value} value={value}>\n {t(`contentEditor.comments_${value}`)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n {item?.state === \"published\" && (\n <Button variant=\"outline\" disabled={actions.pending} onClick={() => void actions.run(() => client.contents.unpublish(item.id))}>\n {t(\"contentManager.unpublish\")}\n </Button>\n )}\n {item && (\n <Button variant=\"destructive\" disabled={actions.pending} onClick={() => void remove()}>\n {t(\"contentManager.delete\")}\n </Button>\n )}\n <ErrorLine error={actions.error} />\n </Panel>\n </aside>\n </fieldset>\n {dialog}\n <ImageCropDialog\n open={!!thumb}\n onOpenChange={(open) => !open && coverCrop.status !== \"saving\" && setThumb(null)}\n source={\"source\" in coverCrop ? (coverCrop.source ?? null) : null}\n aspect={thumb?.aspect ?? \"\"}\n rotatable={false}\n initialEdit={\"edit\" in coverCrop ? coverCrop.edit : null}\n title={t(\"readerEditor.thumbnail\")}\n confirmLabel={t(\"readerEditor.setThumbnail\")}\n busy={coverCrop.status === \"saving\"}\n error={coverCrop.status === \"error\" ? contentError(m, coverCrop.error) : undefined}\n onConfirm={(edit) => void coverCrop.save(edit)}\n />\n </div>\n </EditorSaveContext.Provider>\n );\n}\n"],"mappings":"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"}
@@ -21,7 +21,7 @@ function x(c) {
21
21
  client: c.client
22
22
  }), T = i(c.onError), [E, D] = m(null), { config: O } = o({ client: c.client }), k = c.onSignIn ?? b?.onSignIn, A = b?.viewer === null && O?.anonymous.votes === !1, j = (e) => /* @__PURE__ */ g(n, {
23
23
  appearance: c.appearance,
24
- className: v("grid gap-3 rounded-xl border border-border bg-card p-4 text-sm text-card-foreground", c.className),
24
+ className: v("grid content-start gap-3 rounded-xl border border-border bg-card p-4 text-sm text-card-foreground", c.className),
25
25
  "data-ckui": "poll",
26
26
  children: e
27
27
  });
@@ -60,7 +60,7 @@ function x(c) {
60
60
  loading: "lazy"
61
61
  }),
62
62
  /* @__PURE__ */ g("h3", {
63
- className: "text-base font-semibold",
63
+ className: "border-b border-border pb-2 text-base font-semibold",
64
64
  id: `poll-${M.id}`,
65
65
  children: M.question
66
66
  }),
@@ -94,12 +94,18 @@ function x(c) {
94
94
  ] }));
95
95
  }
96
96
  function S({ poll: e, results: n, canVote: r, onVote: i }) {
97
- let o = t(), { t: s } = o, c = [...e.options].sort((e, t) => e.position - t.position), l = c.some((e) => e.image_url), u = e.total_votes || c.reduce((e, t) => e + t.vote_count, 0), d = Math.max(1, ...c.map((e) => e.vote_count));
97
+ let a = t(), { t: o } = a, s = [...e.options].sort((e, t) => e.position - t.position), c = s.some((e) => e.image_url), l = e.total_votes || s.reduce((e, t) => e + t.vote_count, 0), d = Math.max(1, ...s.map((e) => e.vote_count));
98
98
  return /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g("ul", {
99
- className: v("grid gap-2", l && "grid-cols-2"),
99
+ className: v("grid gap-3", c && "grid-cols-2"),
100
100
  "aria-labelledby": `poll-${e.id}`,
101
- children: c.map((t) => {
102
- let c = e.my_option === t.id, l = u ? Math.round(t.vote_count / u * 100) : 0, f = /* @__PURE__ */ _(h, { children: [
101
+ children: s.map((t) => {
102
+ let s = e.my_option === t.id, c = l ? Math.round(t.vote_count / l * 100) : 0, u = r ? () => i(t.id) : void 0, f = n && !u ? {
103
+ role: "meter",
104
+ "aria-valuemin": 0,
105
+ "aria-valuemax": 100,
106
+ "aria-valuenow": c,
107
+ "aria-label": t.label
108
+ } : {}, p = /* @__PURE__ */ _(h, { children: [
103
109
  t.image_url && /* @__PURE__ */ g("img", {
104
110
  src: t.image_url,
105
111
  alt: "",
@@ -107,58 +113,61 @@ function S({ poll: e, results: n, canVote: r, onVote: i }) {
107
113
  loading: "lazy"
108
114
  }),
109
115
  /* @__PURE__ */ _("span", {
110
- className: "relative flex w-full items-center gap-2",
111
- children: [n && /* @__PURE__ */ g("span", {
112
- "aria-hidden": !0,
113
- className: v("absolute inset-y-0 start-0 rounded-md transition-[width] duration-500 motion-reduce:transition-none", c ? "bg-primary/25" : "bg-muted"),
114
- style: { width: `${t.vote_count / d * 100}%` }
115
- }), /* @__PURE__ */ _("span", {
116
- className: "relative flex min-w-0 flex-1 items-center gap-2 px-2 py-1.5",
117
- children: [
118
- c && /* @__PURE__ */ g(b, {
119
- icon: y,
120
- strokeWidth: 2.5,
121
- className: "size-4 shrink-0 text-primary",
122
- "aria-label": s("poll.yourVote")
123
- }),
124
- /* @__PURE__ */ g("span", {
125
- className: "min-w-0 flex-1 break-words text-start",
126
- children: t.label
127
- }),
128
- n && /* @__PURE__ */ _("span", {
129
- className: "shrink-0 tabular-nums font-medium",
130
- children: [l, "%"]
131
- })
132
- ]
133
- })]
116
+ className: "flex w-full items-baseline gap-2",
117
+ children: [
118
+ s && /* @__PURE__ */ g(b, {
119
+ icon: y,
120
+ strokeWidth: 2.5,
121
+ className: "size-4 shrink-0 self-center text-primary",
122
+ "aria-label": o("poll.yourVote")
123
+ }),
124
+ /* @__PURE__ */ g("span", {
125
+ className: "min-w-0 flex-1 break-words text-start font-medium",
126
+ children: t.label
127
+ }),
128
+ n && /* @__PURE__ */ _("span", {
129
+ className: "shrink-0 text-xs tabular-nums text-muted-foreground",
130
+ children: [
131
+ /* @__PURE__ */ _("span", {
132
+ className: "font-semibold text-foreground",
133
+ children: [c, "%"]
134
+ }),
135
+ " · ",
136
+ a.plural("poll.votes", t.vote_count)
137
+ ]
138
+ })
139
+ ]
134
140
  }),
135
141
  n && /* @__PURE__ */ g("span", {
136
- className: "sr-only",
137
- children: o.plural("poll.votes", t.vote_count)
142
+ "aria-hidden": !0,
143
+ className: "block h-2 w-full overflow-hidden rounded-full bg-muted",
144
+ children: /* @__PURE__ */ g("span", {
145
+ className: v("block h-full rounded-full transition-[width] duration-500 motion-reduce:transition-none", s ? "bg-primary" : "bg-foreground/40"),
146
+ style: { width: `${t.vote_count / d * 100}%` }
147
+ })
138
148
  })
139
149
  ] });
140
150
  return /* @__PURE__ */ g("li", {
141
151
  "data-option": t.id,
142
- "data-mine": c || void 0,
143
- children: r ? /* @__PURE__ */ g(a, {
144
- variant: "outline",
145
- className: "h-auto w-full flex-col items-stretch gap-1.5 p-1 whitespace-normal",
146
- onClick: () => i(t.id),
147
- children: f
152
+ "data-mine": s || void 0,
153
+ ...f,
154
+ children: u ? /* @__PURE__ */ g("button", {
155
+ type: "button",
156
+ className: "grid w-full gap-1.5 rounded-md p-1.5 text-start hover:bg-muted/60 focus-visible:outline-2 focus-visible:outline-ring",
157
+ onClick: u,
158
+ children: p
148
159
  }) : /* @__PURE__ */ g("div", {
149
- className: "grid gap-1.5 rounded-md border border-border p-1",
150
- role: "meter",
151
- "aria-valuemin": 0,
152
- "aria-valuemax": 100,
153
- "aria-valuenow": l,
154
- "aria-label": t.label,
155
- children: f
160
+ className: "grid gap-1.5 p-1.5",
161
+ children: p
156
162
  })
157
163
  }, t.id);
158
164
  })
159
- }), n && /* @__PURE__ */ g("p", {
160
- className: "text-xs text-muted-foreground",
161
- children: o.plural("poll.votes", u)
165
+ }), /* @__PURE__ */ _("p", {
166
+ className: "flex justify-between gap-2 border-t border-border pt-2 text-xs tabular-nums text-muted-foreground",
167
+ children: [/* @__PURE__ */ g("time", {
168
+ dateTime: e.live_at,
169
+ children: u(a, e.live_at, !1)
170
+ }), n && /* @__PURE__ */ g("span", { children: a.plural("poll.votes", l) })]
162
171
  })] });
163
172
  }
164
173
  function C({ poll: e, pending: n, maxLength: r, results: i, onAnswer: o }) {
@@ -1 +1 @@
1
- {"version":3,"file":"poll.js","names":[],"sources":["../../../src/components/social/poll.tsx"],"sourcesContent":["import { Tick02Icon } from \"@hugeicons/core-free-icons\";\nimport { HugeiconsIcon } from \"@hugeicons/react\";\nimport { cn } from \"cn\";\nimport { useContext, useId, useState, type ReactNode } from \"react\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport { toContentKitError, type ContentKitError } from \"../../client/errors.js\";\nimport type { Poll as PollData } from \"../../client/generated/wire.js\";\nimport type { ContentKitUiAppearance } from \"../../appearance.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { ContentKitContext, useErrorReporter, type ContentKitErrorHandler } from \"../../react/context.js\";\nimport { useContentConfig } from \"../../react/config.js\";\nimport { usePoll } from \"../../react/polls.js\";\nimport { ContentKitUiRoot } from \"../../scope.js\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Skeleton } from \"#ckui/ui/skeleton\";\nimport { Textarea } from \"#ckui/ui/textarea\";\nimport { ErrorLine, formatDate } from \"./parts.js\";\n\nexport interface PollProps {\n /** A poll id, or the poll the host already has; none shows the newest live poll (in language). */\n poll?: string | PollData;\n language?: string;\n /** When results show: once the visitor voted (default), or always. A closed poll always shows them. */\n results?: \"voted\" | \"always\";\n /** Asks a signed-out visitor to sign in where the server takes no anonymous votes (default the provider's). */\n onSignIn?: () => void;\n /** Shown when there is no live poll; default nothing. */\n empty?: ReactNode;\n /** Longest free-text answer. Default 280. */\n maxLength?: number;\n client?: ContentKitClient;\n onError?: ContentKitErrorHandler;\n className?: string;\n appearance?: ContentKitUiAppearance;\n}\n\n/**\n * A poll: vote (at once, final) and results scaled to the leading option, or a\n * free-text answer and its groups. Question and option images, the closing\n * date and the closed state come from the poll. Signed out, visitors vote\n * where the server allows it (`Config.anonymous.votes`) and are asked to sign\n * in elsewhere; free-text answers always need a signed-in visitor.\n */\nexport function Poll(p: PollProps) {\n const m = useMessages();\n const { t } = m;\n const ctx = useContext(ContentKitContext);\n const id = typeof p.poll === \"string\" ? p.poll : p.poll?.id;\n const r = usePoll(id ?? null, { initial: typeof p.poll === \"object\" ? p.poll : undefined, language: p.language, client: p.client });\n const report = useErrorReporter(p.onError);\n const [error, setError] = useState<ContentKitError | null>(null);\n const { config } = useContentConfig({ client: p.client });\n const signIn = p.onSignIn ?? ctx?.onSignIn;\n const signedOut = ctx?.viewer === null;\n // Signed out where the server takes no anonymous votes.\n const mustSignIn = signedOut && config?.anonymous.votes === false;\n const root = (children: ReactNode) => (\n <ContentKitUiRoot appearance={p.appearance} className={cn(\"grid gap-3 rounded-xl border border-border bg-card p-4 text-sm text-card-foreground\", p.className)} data-ckui=\"poll\">\n {children}\n </ContentKitUiRoot>\n );\n if (r.loading && !r.poll) {\n return root(\n <div className=\"grid gap-2\" aria-busy>\n <Skeleton className=\"h-5 w-2/3\" />\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-9 w-full\" />\n </div>,\n );\n }\n if (r.error && !r.poll) {\n return root(\n <div className=\"grid justify-items-start gap-2\">\n <ErrorLine>{t(\"poll.loadFailed\")}</ErrorLine>\n <Button size=\"sm\" variant=\"outline\" onClick={r.reload}>\n {t(\"common.retry\")}\n </Button>\n </div>,\n );\n }\n const poll = r.poll;\n if (!poll) return p.empty ? <>{p.empty}</> : null;\n\n const fail = (e: unknown, op: \"poll.vote\" | \"poll.answer\") => {\n const err = toContentKitError(e);\n if (err.code === \"unauthorized\" && signIn) return signIn();\n setError(err);\n report(err, op);\n };\n const vote = (option: string) => {\n if (mustSignIn) return signIn?.();\n setError(null);\n r.vote(option).catch((e) => fail(e, \"poll.vote\"));\n };\n const header = (\n <>\n {poll.image_url && <img src={poll.image_url} alt=\"\" className=\"aspect-video w-full rounded-lg object-cover\" loading=\"lazy\" />}\n <h3 className=\"text-base font-semibold\" id={`poll-${poll.id}`}>\n {poll.question}\n </h3>\n {poll.closed ? (\n <p className=\"text-muted-foreground\">{t(\"poll.closed\")}</p>\n ) : (\n poll.closes_at && <p className=\"text-muted-foreground\">{t(\"poll.closes\", { date: formatDate(m, poll.closes_at) })}</p>\n )}\n </>\n );\n return root(\n <>\n {header}\n {poll.kind === \"free_text\" ? (\n <FreeText poll={poll} pending={r.pending} maxLength={p.maxLength ?? 280} results={p.results} onAnswer={(text) =>\n r.answer(text).then(\n () => true,\n (e) => (fail(e, \"poll.answer\"), false),\n )\n }\n />\n ) : (\n <Choices poll={poll} results={p.results === \"always\" || poll.voted || poll.closed} canVote={!poll.voted && !poll.closed && !r.pending && (!mustSignIn || !!signIn)} onVote={vote} />\n )}\n <ErrorLine error={error} />\n {!poll.voted && !poll.closed && mustSignIn && poll.kind !== \"free_text\" && <p className=\"text-xs text-muted-foreground\">{t(\"poll.signIn\")}</p>}\n </>,\n );\n}\n\nfunction Choices({ poll, results, canVote, onVote }: { poll: PollData; results: boolean; canVote: boolean; onVote: (option: string) => void }) {\n const m = useMessages();\n const { t } = m;\n const options = [...poll.options].sort((a, b) => a.position - b.position);\n const images = options.some((o) => o.image_url);\n const total = poll.total_votes || options.reduce((n, o) => n + o.vote_count, 0);\n const lead = Math.max(1, ...options.map((o) => o.vote_count));\n return (\n <>\n <ul className={cn(\"grid gap-2\", images && \"grid-cols-2\")} aria-labelledby={`poll-${poll.id}`}>\n {options.map((o) => {\n const mine = poll.my_option === o.id;\n const percent = total ? Math.round((o.vote_count / total) * 100) : 0;\n const body = (\n <>\n {o.image_url && <img src={o.image_url} alt=\"\" className=\"aspect-[4/3] w-full rounded-md bg-muted object-contain\" loading=\"lazy\" />}\n <span className=\"relative flex w-full items-center gap-2\">\n {results && (\n <span\n aria-hidden\n className={cn(\"absolute inset-y-0 start-0 rounded-md transition-[width] duration-500 motion-reduce:transition-none\", mine ? \"bg-primary/25\" : \"bg-muted\")}\n style={{ width: `${(o.vote_count / lead) * 100}%` }}\n />\n )}\n <span className=\"relative flex min-w-0 flex-1 items-center gap-2 px-2 py-1.5\">\n {mine && <HugeiconsIcon icon={Tick02Icon} strokeWidth={2.5} className=\"size-4 shrink-0 text-primary\" aria-label={t(\"poll.yourVote\")} />}\n <span className=\"min-w-0 flex-1 break-words text-start\">{o.label}</span>\n {results && <span className=\"shrink-0 tabular-nums font-medium\">{percent}%</span>}\n </span>\n </span>\n {results && <span className=\"sr-only\">{m.plural(\"poll.votes\", o.vote_count)}</span>}\n </>\n );\n return (\n <li key={o.id} data-option={o.id} data-mine={mine || undefined}>\n {canVote ? (\n <Button variant=\"outline\" className=\"h-auto w-full flex-col items-stretch gap-1.5 p-1 whitespace-normal\" onClick={() => onVote(o.id)}>\n {body}\n </Button>\n ) : (\n <div\n className=\"grid gap-1.5 rounded-md border border-border p-1\"\n role=\"meter\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={percent}\n aria-label={o.label}\n >\n {body}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n {results && <p className=\"text-xs text-muted-foreground\">{m.plural(\"poll.votes\", total)}</p>}\n </>\n );\n}\n\nfunction FreeText({ poll, pending, maxLength, results, onAnswer }: { poll: PollData; pending: boolean; maxLength: number; results?: \"voted\" | \"always\"; onAnswer: (text: string) => Promise<boolean> }) {\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const mine = poll.my_answer;\n const [editing, setEditing] = useState(false);\n const [text, setText] = useState(mine?.text ?? \"\");\n const open = !poll.closed;\n const groups = [...(poll.groups ?? [])].sort((a, b) => b.count - a.count);\n const lead = Math.max(1, ...groups.map((g) => g.count));\n const showGroups = groups.length > 0 && (!!mine || poll.closed || results === \"always\");\n return (\n <>\n {open && (!mine || editing) ? (\n <form\n className=\"grid gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n if (!text.trim()) return;\n void onAnswer(text.trim()).then((ok) => ok && setEditing(false));\n }}\n >\n <label htmlFor={`${ids}-answer`} className=\"sr-only\">\n {t(\"poll.answerPlaceholder\")}\n </label>\n <Textarea id={`${ids}-answer`} rows={2} maxLength={maxLength} placeholder={t(\"poll.answerPlaceholder\")} value={text} disabled={pending} onChange={(e) => setText(e.target.value)} />\n <div className=\"flex justify-end gap-2\">\n {editing && (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setEditing(false)}>\n {t(\"common.cancel\")}\n </Button>\n )}\n <Button type=\"submit\" size=\"sm\" disabled={pending || !text.trim()}>\n {t(mine ? \"poll.updateAnswer\" : \"poll.answer\")}\n </Button>\n </div>\n </form>\n ) : (\n mine && (\n <div className=\"grid gap-1 rounded-md bg-muted p-3\">\n <p className=\"text-xs text-muted-foreground\">{t(\"poll.yourAnswer\")}</p>\n <p className=\"break-words whitespace-pre-wrap\">{mine.text}</p>\n {open && (\n <Button\n variant=\"link\"\n size=\"xs\"\n className=\"justify-self-start px-0\"\n onClick={() => {\n setText(mine.text);\n setEditing(true);\n }}\n >\n {t(\"poll.editAnswer\")}\n </Button>\n )}\n </div>\n )\n )}\n {showGroups && (\n <>\n <ul className=\"grid gap-2\" aria-labelledby={`poll-${poll.id}`}>\n {groups.map((g) => (\n <li key={g.id} className=\"relative flex items-center gap-2 rounded-md px-2 py-1.5\">\n <span aria-hidden className=\"absolute inset-y-0 start-0 rounded-md bg-muted\" style={{ width: `${(g.count / lead) * 100}%` }} />\n <span className=\"relative min-w-0 flex-1 break-words\">{g.label}</span>\n <span className=\"relative tabular-nums text-muted-foreground\">{m.plural(\"poll.answers\", g.count)}</span>\n </li>\n ))}\n </ul>\n {poll.answer_count !== undefined && <p className=\"text-xs text-muted-foreground\">{m.plural(\"poll.answers\", poll.answer_count)}</p>}\n </>\n )}\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"poll.js","names":[],"sources":["../../../src/components/social/poll.tsx"],"sourcesContent":["import { Tick02Icon } from \"@hugeicons/core-free-icons\";\nimport { HugeiconsIcon } from \"@hugeicons/react\";\nimport { cn } from \"cn\";\nimport { useContext, useId, useState, type ReactNode } from \"react\";\nimport type { ContentKitClient } from \"../../client/client.js\";\nimport { toContentKitError, type ContentKitError } from \"../../client/errors.js\";\nimport type { Poll as PollData } from \"../../client/generated/wire.js\";\nimport type { ContentKitUiAppearance } from \"../../appearance.js\";\nimport { useMessages } from \"../../i18n/context.js\";\nimport { ContentKitContext, useErrorReporter, type ContentKitErrorHandler } from \"../../react/context.js\";\nimport { useContentConfig } from \"../../react/config.js\";\nimport { usePoll } from \"../../react/polls.js\";\nimport { ContentKitUiRoot } from \"../../scope.js\";\nimport { Button } from \"#ckui/ui/button\";\nimport { Skeleton } from \"#ckui/ui/skeleton\";\nimport { Textarea } from \"#ckui/ui/textarea\";\nimport { ErrorLine, formatDate } from \"./parts.js\";\n\nexport interface PollProps {\n /** A poll id, or the poll the host already has; none shows the newest live poll (in language). */\n poll?: string | PollData;\n language?: string;\n /** When results show: once the visitor voted (default), or always. A closed poll always shows them. */\n results?: \"voted\" | \"always\";\n /** Asks a signed-out visitor to sign in where the server takes no anonymous votes (default the provider's). */\n onSignIn?: () => void;\n /** Shown when there is no live poll; default nothing. */\n empty?: ReactNode;\n /** Longest free-text answer. Default 280. */\n maxLength?: number;\n client?: ContentKitClient;\n onError?: ContentKitErrorHandler;\n className?: string;\n appearance?: ContentKitUiAppearance;\n}\n\n/**\n * A poll: vote (at once, final) and results scaled to the leading option, or a\n * free-text answer and its groups. Question and option images, the closing\n * date and the closed state come from the poll. Signed out, visitors vote\n * where the server allows it (`Config.anonymous.votes`) and are asked to sign\n * in elsewhere; free-text answers always need a signed-in visitor.\n */\nexport function Poll(p: PollProps) {\n const m = useMessages();\n const { t } = m;\n const ctx = useContext(ContentKitContext);\n const id = typeof p.poll === \"string\" ? p.poll : p.poll?.id;\n const r = usePoll(id ?? null, { initial: typeof p.poll === \"object\" ? p.poll : undefined, language: p.language, client: p.client });\n const report = useErrorReporter(p.onError);\n const [error, setError] = useState<ContentKitError | null>(null);\n const { config } = useContentConfig({ client: p.client });\n const signIn = p.onSignIn ?? ctx?.onSignIn;\n const signedOut = ctx?.viewer === null;\n // Signed out where the server takes no anonymous votes.\n const mustSignIn = signedOut && config?.anonymous.votes === false;\n const root = (children: ReactNode) => (\n <ContentKitUiRoot appearance={p.appearance} className={cn(\"grid content-start gap-3 rounded-xl border border-border bg-card p-4 text-sm text-card-foreground\", p.className)} data-ckui=\"poll\">\n {children}\n </ContentKitUiRoot>\n );\n if (r.loading && !r.poll) {\n return root(\n <div className=\"grid gap-2\" aria-busy>\n <Skeleton className=\"h-5 w-2/3\" />\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-9 w-full\" />\n </div>,\n );\n }\n if (r.error && !r.poll) {\n return root(\n <div className=\"grid justify-items-start gap-2\">\n <ErrorLine>{t(\"poll.loadFailed\")}</ErrorLine>\n <Button size=\"sm\" variant=\"outline\" onClick={r.reload}>\n {t(\"common.retry\")}\n </Button>\n </div>,\n );\n }\n const poll = r.poll;\n if (!poll) return p.empty ? <>{p.empty}</> : null;\n\n const fail = (e: unknown, op: \"poll.vote\" | \"poll.answer\") => {\n const err = toContentKitError(e);\n if (err.code === \"unauthorized\" && signIn) return signIn();\n setError(err);\n report(err, op);\n };\n const vote = (option: string) => {\n if (mustSignIn) return signIn?.();\n setError(null);\n r.vote(option).catch((e) => fail(e, \"poll.vote\"));\n };\n const header = (\n <>\n {poll.image_url && <img src={poll.image_url} alt=\"\" className=\"aspect-video w-full rounded-lg object-cover\" loading=\"lazy\" />}\n <h3 className=\"border-b border-border pb-2 text-base font-semibold\" id={`poll-${poll.id}`}>\n {poll.question}\n </h3>\n {poll.closed ? (\n <p className=\"text-muted-foreground\">{t(\"poll.closed\")}</p>\n ) : (\n poll.closes_at && <p className=\"text-muted-foreground\">{t(\"poll.closes\", { date: formatDate(m, poll.closes_at) })}</p>\n )}\n </>\n );\n return root(\n <>\n {header}\n {poll.kind === \"free_text\" ? (\n <FreeText poll={poll} pending={r.pending} maxLength={p.maxLength ?? 280} results={p.results} onAnswer={(text) =>\n r.answer(text).then(\n () => true,\n (e) => (fail(e, \"poll.answer\"), false),\n )\n }\n />\n ) : (\n <Choices\n poll={poll}\n results={p.results === \"always\" || poll.voted || poll.closed}\n canVote={!poll.voted && !poll.closed && !r.pending && (!mustSignIn || !!signIn)}\n onVote={vote}\n />\n )}\n <ErrorLine error={error} />\n {!poll.voted && !poll.closed && mustSignIn && poll.kind !== \"free_text\" && <p className=\"text-xs text-muted-foreground\">{t(\"poll.signIn\")}</p>}\n </>,\n );\n}\n\nfunction Choices({ poll, results, canVote, onVote }: { poll: PollData; results: boolean; canVote: boolean; onVote: (option: string) => void }) {\n const m = useMessages();\n const { t } = m;\n const options = [...poll.options].sort((a, b) => a.position - b.position);\n const images = options.some((o) => o.image_url);\n const total = poll.total_votes || options.reduce((n, o) => n + o.vote_count, 0);\n // Bars scale to the leading option, which spans the full width.\n const lead = Math.max(1, ...options.map((o) => o.vote_count));\n return (\n <>\n <ul className={cn(\"grid gap-3\", images && \"grid-cols-2\")} aria-labelledby={`poll-${poll.id}`}>\n {options.map((o) => {\n const mine = poll.my_option === o.id;\n const percent = total ? Math.round((o.vote_count / total) * 100) : 0;\n const choose = canVote ? () => onVote(o.id) : undefined;\n const meter = results && !choose ? { role: \"meter\", \"aria-valuemin\": 0, \"aria-valuemax\": 100, \"aria-valuenow\": percent, \"aria-label\": o.label } : {};\n const body = (\n <>\n {o.image_url && <img src={o.image_url} alt=\"\" className=\"aspect-[4/3] w-full rounded-md bg-muted object-contain\" loading=\"lazy\" />}\n <span className=\"flex w-full items-baseline gap-2\">\n {mine && <HugeiconsIcon icon={Tick02Icon} strokeWidth={2.5} className=\"size-4 shrink-0 self-center text-primary\" aria-label={t(\"poll.yourVote\")} />}\n <span className=\"min-w-0 flex-1 break-words text-start font-medium\">{o.label}</span>\n {results && (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">\n <span className=\"font-semibold text-foreground\">{percent}%</span> · {m.plural(\"poll.votes\", o.vote_count)}\n </span>\n )}\n </span>\n {results && (\n <span aria-hidden className=\"block h-2 w-full overflow-hidden rounded-full bg-muted\">\n <span className={cn(\"block h-full rounded-full transition-[width] duration-500 motion-reduce:transition-none\", mine ? \"bg-primary\" : \"bg-foreground/40\")} style={{ width: `${(o.vote_count / lead) * 100}%` }} />\n </span>\n )}\n </>\n );\n return (\n <li key={o.id} data-option={o.id} data-mine={mine || undefined} {...meter}>\n {choose ? (\n <button type=\"button\" className=\"grid w-full gap-1.5 rounded-md p-1.5 text-start hover:bg-muted/60 focus-visible:outline-2 focus-visible:outline-ring\" onClick={choose}>\n {body}\n </button>\n ) : (\n <div className=\"grid gap-1.5 p-1.5\">{body}</div>\n )}\n </li>\n );\n })}\n </ul>\n <p className=\"flex justify-between gap-2 border-t border-border pt-2 text-xs tabular-nums text-muted-foreground\">\n <time dateTime={poll.live_at}>{formatDate(m, poll.live_at, false)}</time>\n {results && <span>{m.plural(\"poll.votes\", total)}</span>}\n </p>\n </>\n );\n}\n\nfunction FreeText({ poll, pending, maxLength, results, onAnswer }: { poll: PollData; pending: boolean; maxLength: number; results?: \"voted\" | \"always\"; onAnswer: (text: string) => Promise<boolean> }) {\n const m = useMessages();\n const { t } = m;\n const ids = useId();\n const mine = poll.my_answer;\n const [editing, setEditing] = useState(false);\n const [text, setText] = useState(mine?.text ?? \"\");\n const open = !poll.closed;\n const groups = [...(poll.groups ?? [])].sort((a, b) => b.count - a.count);\n const lead = Math.max(1, ...groups.map((g) => g.count));\n const showGroups = groups.length > 0 && (!!mine || poll.closed || results === \"always\");\n return (\n <>\n {open && (!mine || editing) ? (\n <form\n className=\"grid gap-2\"\n onSubmit={(e) => {\n e.preventDefault();\n if (!text.trim()) return;\n void onAnswer(text.trim()).then((ok) => ok && setEditing(false));\n }}\n >\n <label htmlFor={`${ids}-answer`} className=\"sr-only\">\n {t(\"poll.answerPlaceholder\")}\n </label>\n <Textarea id={`${ids}-answer`} rows={2} maxLength={maxLength} placeholder={t(\"poll.answerPlaceholder\")} value={text} disabled={pending} onChange={(e) => setText(e.target.value)} />\n <div className=\"flex justify-end gap-2\">\n {editing && (\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={() => setEditing(false)}>\n {t(\"common.cancel\")}\n </Button>\n )}\n <Button type=\"submit\" size=\"sm\" disabled={pending || !text.trim()}>\n {t(mine ? \"poll.updateAnswer\" : \"poll.answer\")}\n </Button>\n </div>\n </form>\n ) : (\n mine && (\n <div className=\"grid gap-1 rounded-md bg-muted p-3\">\n <p className=\"text-xs text-muted-foreground\">{t(\"poll.yourAnswer\")}</p>\n <p className=\"break-words whitespace-pre-wrap\">{mine.text}</p>\n {open && (\n <Button\n variant=\"link\"\n size=\"xs\"\n className=\"justify-self-start px-0\"\n onClick={() => {\n setText(mine.text);\n setEditing(true);\n }}\n >\n {t(\"poll.editAnswer\")}\n </Button>\n )}\n </div>\n )\n )}\n {showGroups && (\n <>\n <ul className=\"grid gap-2\" aria-labelledby={`poll-${poll.id}`}>\n {groups.map((g) => (\n <li key={g.id} className=\"relative flex items-center gap-2 rounded-md px-2 py-1.5\">\n <span aria-hidden className=\"absolute inset-y-0 start-0 rounded-md bg-muted\" style={{ width: `${(g.count / lead) * 100}%` }} />\n <span className=\"relative min-w-0 flex-1 break-words\">{g.label}</span>\n <span className=\"relative tabular-nums text-muted-foreground\">{m.plural(\"poll.answers\", g.count)}</span>\n </li>\n ))}\n </ul>\n {poll.answer_count !== undefined && <p className=\"text-xs text-muted-foreground\">{m.plural(\"poll.answers\", poll.answer_count)}</p>}\n </>\n )}\n </>\n );\n}\n"],"mappings":"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"}