@burdenoff/microfe-cosmicintersection 2026.830.2 → 2026.1030.1

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 (109) hide show
  1. package/dist/cosmicintersection/CosmicIntersectionRoutes.d.ts +1 -1
  2. package/dist/cosmicintersection/CosmicIntersectionRoutes.d.ts.map +1 -1
  3. package/dist/cosmicintersection/api/cosmicApi.d.ts +48 -48
  4. package/dist/cosmicintersection/api/cosmicApi.d.ts.map +1 -1
  5. package/dist/cosmicintersection/components/ActionMenu.d.ts +1 -1
  6. package/dist/cosmicintersection/components/ActionMenu.d.ts.map +1 -1
  7. package/dist/cosmicintersection/components/ActivityFeedPanel.d.ts +1 -1
  8. package/dist/cosmicintersection/components/ActivityFeedPanel.d.ts.map +1 -1
  9. package/dist/cosmicintersection/components/DiscussionPanel.d.ts +1 -1
  10. package/dist/cosmicintersection/components/DiscussionPanel.d.ts.map +1 -1
  11. package/dist/cosmicintersection/components/EmptyState.d.ts +1 -1
  12. package/dist/cosmicintersection/components/EmptyState.d.ts.map +1 -1
  13. package/dist/cosmicintersection/components/EntityFormShell.d.ts +1 -1
  14. package/dist/cosmicintersection/components/EntityFormShell.d.ts.map +1 -1
  15. package/dist/cosmicintersection/components/EntityTagsField.d.ts +1 -1
  16. package/dist/cosmicintersection/components/EntityTagsField.d.ts.map +1 -1
  17. package/dist/cosmicintersection/components/ErrorState.d.ts +1 -1
  18. package/dist/cosmicintersection/components/ErrorState.d.ts.map +1 -1
  19. package/dist/cosmicintersection/components/FacetPanel.d.ts +1 -1
  20. package/dist/cosmicintersection/components/FacetPanel.d.ts.map +1 -1
  21. package/dist/cosmicintersection/components/FileUploadField.d.ts +2 -2
  22. package/dist/cosmicintersection/components/FileUploadField.d.ts.map +1 -1
  23. package/dist/cosmicintersection/components/FileUploadField.js +1 -0
  24. package/dist/cosmicintersection/components/FileUploadField.js.map +1 -1
  25. package/dist/cosmicintersection/components/LineageGraph.d.ts +1 -1
  26. package/dist/cosmicintersection/components/LineageGraph.d.ts.map +1 -1
  27. package/dist/cosmicintersection/components/LoadingState.d.ts +1 -1
  28. package/dist/cosmicintersection/components/LoadingState.d.ts.map +1 -1
  29. package/dist/cosmicintersection/components/PageLayout.d.ts +1 -1
  30. package/dist/cosmicintersection/components/PageLayout.d.ts.map +1 -1
  31. package/dist/cosmicintersection/components/Pagination.d.ts +1 -1
  32. package/dist/cosmicintersection/components/Pagination.d.ts.map +1 -1
  33. package/dist/cosmicintersection/components/ResultsChart.d.ts +1 -1
  34. package/dist/cosmicintersection/components/ResultsChart.d.ts.map +1 -1
  35. package/dist/cosmicintersection/components/SafeLink.d.ts +1 -1
  36. package/dist/cosmicintersection/components/SafeLink.d.ts.map +1 -1
  37. package/dist/cosmicintersection/components/StatusBadge.d.ts +1 -1
  38. package/dist/cosmicintersection/components/StatusBadge.d.ts.map +1 -1
  39. package/dist/cosmicintersection/components/StepDAG.d.ts +1 -1
  40. package/dist/cosmicintersection/components/StepDAG.d.ts.map +1 -1
  41. package/dist/cosmicintersection/context/CosmicIntersectionContext.d.ts +1 -1
  42. package/dist/cosmicintersection/context/CosmicIntersectionContext.d.ts.map +1 -1
  43. package/dist/cosmicintersection/lib/useSelectedRecord.d.ts +20 -0
  44. package/dist/cosmicintersection/lib/useSelectedRecord.d.ts.map +1 -0
  45. package/dist/cosmicintersection/lib/useSelectedRecord.js +19 -0
  46. package/dist/cosmicintersection/lib/useSelectedRecord.js.map +1 -0
  47. package/dist/cosmicintersection/pages/access/AccessPage.d.ts +1 -1
  48. package/dist/cosmicintersection/pages/access/AccessPage.d.ts.map +1 -1
  49. package/dist/cosmicintersection/pages/access/AccessPage.js +239 -226
  50. package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -1
  51. package/dist/cosmicintersection/pages/analyses/AnalysesPage.d.ts +1 -1
  52. package/dist/cosmicintersection/pages/analyses/AnalysesPage.d.ts.map +1 -1
  53. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +196 -195
  54. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -1
  55. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.d.ts +1 -1
  56. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.d.ts.map +1 -1
  57. package/dist/cosmicintersection/pages/collections/CollectionFormPage.d.ts +1 -1
  58. package/dist/cosmicintersection/pages/collections/CollectionFormPage.d.ts.map +1 -1
  59. package/dist/cosmicintersection/pages/collections/CollectionsPage.d.ts +1 -1
  60. package/dist/cosmicintersection/pages/collections/CollectionsPage.d.ts.map +1 -1
  61. package/dist/cosmicintersection/pages/dashboard/DashboardPage.d.ts +1 -1
  62. package/dist/cosmicintersection/pages/dashboard/DashboardPage.d.ts.map +1 -1
  63. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.d.ts +1 -1
  64. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.d.ts.map +1 -1
  65. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +188 -175
  66. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -1
  67. package/dist/cosmicintersection/pages/datasets/DatasetFormPage.d.ts +1 -1
  68. package/dist/cosmicintersection/pages/datasets/DatasetFormPage.d.ts.map +1 -1
  69. package/dist/cosmicintersection/pages/datasets/DatasetsPage.d.ts +1 -1
  70. package/dist/cosmicintersection/pages/datasets/DatasetsPage.d.ts.map +1 -1
  71. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.d.ts +1 -1
  72. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.d.ts.map +1 -1
  73. package/dist/cosmicintersection/pages/lineage/LineagePage.d.ts +1 -1
  74. package/dist/cosmicintersection/pages/lineage/LineagePage.d.ts.map +1 -1
  75. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.d.ts +1 -1
  76. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.d.ts.map +1 -1
  77. package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.d.ts +1 -1
  78. package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.d.ts.map +1 -1
  79. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.d.ts +1 -1
  80. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.d.ts.map +1 -1
  81. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.d.ts +1 -1
  82. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.d.ts.map +1 -1
  83. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.d.ts +1 -1
  84. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.d.ts.map +1 -1
  85. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.d.ts +1 -1
  86. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.d.ts.map +1 -1
  87. package/dist/cosmicintersection/pages/releases/ReleaseFormPage.d.ts +1 -1
  88. package/dist/cosmicintersection/pages/releases/ReleaseFormPage.d.ts.map +1 -1
  89. package/dist/cosmicintersection/pages/releases/ReleasesPage.d.ts +1 -1
  90. package/dist/cosmicintersection/pages/releases/ReleasesPage.d.ts.map +1 -1
  91. package/dist/cosmicintersection/pages/releases/ReleasesPage.js +202 -201
  92. package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -1
  93. package/dist/cosmicintersection/pages/runs/RunDetailPage.d.ts +1 -1
  94. package/dist/cosmicintersection/pages/runs/RunDetailPage.d.ts.map +1 -1
  95. package/dist/cosmicintersection/pages/runs/RunsPage.d.ts +1 -1
  96. package/dist/cosmicintersection/pages/runs/RunsPage.d.ts.map +1 -1
  97. package/dist/cosmicintersection/pages/sources/SourceDetailPage.d.ts +1 -1
  98. package/dist/cosmicintersection/pages/sources/SourceDetailPage.d.ts.map +1 -1
  99. package/dist/cosmicintersection/pages/sources/SourceFormPage.d.ts +1 -1
  100. package/dist/cosmicintersection/pages/sources/SourceFormPage.d.ts.map +1 -1
  101. package/dist/cosmicintersection/pages/sources/SourcesPage.d.ts +1 -1
  102. package/dist/cosmicintersection/pages/sources/SourcesPage.d.ts.map +1 -1
  103. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +96 -17
  104. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
  105. package/dist/utils/pageContext.d.ts +33 -7
  106. package/dist/utils/pageContext.d.ts.map +1 -1
  107. package/dist/utils/pageContext.js +75 -33
  108. package/dist/utils/pageContext.js.map +1 -1
  109. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"ReleasesPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/releases/ReleasesPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { BookOpen, Database, ExternalLink, NotebookPen, Plus, Rocket } from 'lucide-react';\nimport {\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosDatasetsQuery,\n useCosNotebooksQuery,\n useCosPublishReleaseMutation,\n useCosReleasesQuery,\n type CosRelease,\n type CosReleaseStatus,\n} from '../../api/cosmicApi';\nimport {\n DiscussionPanel,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n SafeLink,\n StatusBadge,\n formatEnumLabel,\n usePagination,\n} from '../../components';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\nimport { useTr } from '../../../shared/hooks/useTr';\n\nconst ALL = 'ALL';\n\nconst RELEASE_STATUSES: CosReleaseStatus[] = ['DRAFT', 'UNDER_REVIEW', 'PUBLISHED', 'RETRACTED'];\n\n/** A release can be published only while it is still in a pre-publication state. */\nfunction canPublish(status: CosReleaseStatus): boolean {\n return status === 'DRAFT' || status === 'UNDER_REVIEW';\n}\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return '—';\n }\n return parsed.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nfunction doiUrl(doi: string): string {\n const trimmed = doi.trim();\n return /^https?:\\/\\//i.test(trimmed)\n ? trimmed\n : `https://doi.org/${trimmed.replace(/^doi:/i, '')}`;\n}\n\nexport default function ReleasesPage() {\n const { navigate } = useCosmicIntersection();\n const tr = useTr();\n const [statusFilter, setStatusFilter] = useState<string>(ALL);\n const pagination = usePagination({ pageSize: 20, resetKey: statusFilter });\n\n const { data, loading, error, refetch } = useCosReleasesQuery({\n status: statusFilter === ALL ? undefined : (statusFilter as CosReleaseStatus),\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const [publishRelease, { loading: publishing }] = useCosPublishReleaseMutation();\n\n const releases = useMemo(() => data?.cosListReleases.items ?? [], [data]);\n const pageInfo = data?.cosListReleases.pageInfo;\n\n // Resolve the release's linked dataset/notebook UUIDs to human names so the\n // detail dialog can render navigable buttons instead of raw ids.\n const datasetsQuery = useCosDatasetsQuery({ pagination: { limit: 100, offset: 0 } });\n const notebooksQuery = useCosNotebooksQuery({ pagination: { limit: 100, offset: 0 } });\n const datasetNameById = useMemo(() => {\n const map = new Map<string, string>();\n for (const dataset of datasetsQuery.data?.cosListDatasets.items ?? []) {\n map.set(dataset.id, dataset.name);\n }\n return map;\n }, [datasetsQuery.data]);\n const notebookTitleById = useMemo(() => {\n const map = new Map<string, string>();\n for (const notebook of notebooksQuery.data?.cosListNotebooks.items ?? []) {\n map.set(notebook.id, notebook.title);\n }\n return map;\n }, [notebooksQuery.data]);\n\n // Detail (View) dialog — rendered from row data, no extra fetch needed.\n const [detail, setDetail] = useState<CosRelease | null>(null);\n\n // Close the dialog before navigating to a linked entity.\n const goToLinked = (path: string) => {\n setDetail(null);\n navigate(path);\n };\n\n // Publish dialog — captures an optional DOI before transitioning the release.\n const [publishTarget, setPublishTarget] = useState<CosRelease | null>(null);\n const [doiDraft, setDoiDraft] = useState('');\n\n const openPublish = (release: CosRelease) => {\n setDoiDraft(release.doi ?? '');\n setPublishTarget(release);\n };\n\n const submitPublish = async () => {\n if (!publishTarget) {\n return;\n }\n const doi = doiDraft.trim();\n const response = await publishRelease({\n variables: { id: publishTarget.id, doi: doi || undefined },\n });\n if (response.data?.cosPublishRelease?.id) {\n notify.success(\n tr('cosmicintersection.pages.releases.publishSuccess', 'Release published'),\n tr(\n 'cosmicintersection.pages.releases.publishSuccessDescription',\n '“{{name}}” is now public.',\n { name: publishTarget.title }\n )\n );\n setPublishTarget(null);\n setDoiDraft('');\n await refetch();\n }\n };\n\n const newButton = (\n <Button type=\"button\" onClick={() => navigate('releases/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.releases.create', 'New release')}\n </Button>\n );\n\n const renderBody = () => {\n if (loading) {\n return (\n <LoadingState\n variant=\"rows\"\n rows={6}\n label={tr('cosmicintersection.pages.releases.loading', 'Loading releases…')}\n />\n );\n }\n if (error) {\n return <ErrorState message={error.message} onRetry={() => void refetch()} />;\n }\n if (releases.length === 0) {\n const filtered = statusFilter !== ALL;\n return (\n <EmptyState\n icon={Rocket}\n title={\n filtered\n ? tr(\n 'cosmicintersection.pages.releases.emptyFilterTitle',\n 'No releases match this filter'\n )\n : tr('cosmicintersection.pages.releases.emptyTitle', 'No releases yet')\n }\n description={\n filtered\n ? tr(\n 'cosmicintersection.pages.releases.emptyFilterDescription',\n 'Try clearing the status filter to see more releases.'\n )\n : tr(\n 'cosmicintersection.pages.releases.emptyDescription',\n 'Package datasets and notebooks into a citable, versioned release for publication.'\n )\n }\n action={filtered ? undefined : newButton}\n />\n );\n }\n\n return (\n <>\n {/* Desktop table */}\n <div className=\"hidden rounded-card border border-border-default bg-bg-elevated md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Title</TableHead>\n <TableHead>Version</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>DOI</TableHead>\n <TableHead>Authors</TableHead>\n <TableHead>Published</TableHead>\n <TableHead>License</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {releases.map((release) => (\n <TableRow key={release.id}>\n <TableCell>\n <button\n type=\"button\"\n onClick={() => setDetail(release)}\n className=\"text-left font-medium text-text-primary underline-offset-2 hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border-focus\"\n >\n {release.title}\n </button>\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {release.version || '—'}\n </TableCell>\n <TableCell>\n <StatusBadge status={release.status} />\n </TableCell>\n <TableCell className=\"max-w-[14rem]\">\n {release.doi ? (\n <SafeLink\n href={doiUrl(release.doi)}\n className=\"inline-flex items-center gap-1 truncate text-sm text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"block truncate text-sm text-text-secondary\"\n >\n <span className=\"truncate\">{release.doi}</span>\n <ExternalLink className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />\n </SafeLink>\n ) : (\n <span className=\"text-sm text-text-secondary\">—</span>\n )}\n </TableCell>\n <TableCell className=\"max-w-[14rem]\">\n {release.authors.length === 0 ? (\n <span className=\"text-sm text-text-secondary\">—</span>\n ) : (\n <span className=\"line-clamp-1 text-sm text-text-secondary\">\n {release.authors.join(', ')}\n </span>\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {formatDate(release.publishedAt)}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {release.license || '—'}\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={`Actions for ${release.title}`}\n onView={() => setDetail(release)}\n extraItems={\n canPublish(release.status)\n ? [\n {\n key: 'publish',\n label: tr('cosmicintersection.pages.releases.publish', 'Publish'),\n icon: Rocket,\n onSelect: () => openPublish(release),\n },\n ]\n : []\n }\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {/* Mobile card list */}\n <ul className=\"space-y-3 md:hidden\">\n {releases.map((release) => (\n <li\n key={release.id}\n className=\"rounded-card border border-border-default bg-bg-elevated\"\n >\n <div className=\"flex items-start justify-between gap-2 p-4\">\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setDetail(release)}\n className=\"truncate text-left font-medium text-text-primary underline-offset-2 hover:underline\"\n >\n {release.title}\n </button>\n <StatusBadge status={release.status} />\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary\">\n <span>{release.version || 'v—'}</span>\n {release.license ? <span>{release.license}</span> : null}\n <span>{formatDate(release.publishedAt)}</span>\n </div>\n {release.authors.length > 0 ? (\n <p className=\"line-clamp-1 text-xs text-text-secondary\">\n {release.authors.join(', ')}\n </p>\n ) : null}\n {release.doi ? (\n <SafeLink\n href={doiUrl(release.doi)}\n className=\"inline-flex items-center gap-1 text-xs text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"block truncate text-xs text-text-secondary\"\n >\n <span className=\"truncate\">DOI: {release.doi}</span>\n <ExternalLink className=\"size-3 shrink-0\" aria-hidden=\"true\" />\n </SafeLink>\n ) : null}\n </div>\n <ActionMenu\n ariaLabel={`Actions for ${release.title}`}\n onView={() => setDetail(release)}\n extraItems={\n canPublish(release.status)\n ? [\n {\n key: 'publish',\n label: tr('cosmicintersection.pages.releases.publish', 'Publish'),\n icon: Rocket,\n onSelect: () => openPublish(release),\n },\n ]\n : []\n }\n />\n </div>\n </li>\n ))}\n </ul>\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={releases.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel={tr('cosmicintersection.pages.releases.itemLabel', 'releases')}\n loading={loading}\n />\n </>\n );\n };\n\n return (\n <PageLayout\n title={tr('cosmicintersection.pages.releases.title', 'Releases')}\n description={tr(\n 'cosmicintersection.pages.releases.description',\n 'Citable, versioned publications that bundle datasets and notebooks for the community.'\n )}\n actions={newButton}\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"w-full max-w-[14rem]\">\n <Select value={statusFilter} onValueChange={setStatusFilter}>\n <SelectTrigger aria-label=\"Filter by status\">\n <SelectValue placeholder=\"All statuses\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All statuses</SelectItem>\n {RELEASE_STATUSES.map((status) => (\n <SelectItem key={status} value={status}>\n {formatEnumLabel(status)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {renderBody()}\n </div>\n\n {/* View / detail dialog */}\n <Dialog open={detail !== null} onOpenChange={(open) => (open ? undefined : setDetail(null))}>\n <DialogContent className=\"max-h-[85vh] max-w-lg overflow-y-auto\">\n {detail ? (\n <>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <BookOpen className=\"size-5 text-text-secondary\" aria-hidden=\"true\" />\n {detail.title}\n </DialogTitle>\n <DialogDescription>\n Version {detail.version || '—'} · <StatusBadge status={detail.status} />\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 text-sm\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Abstract\n </p>\n <p className=\"mt-1 whitespace-pre-wrap text-text-primary\">\n {detail.abstract?.trim() || 'No abstract provided.'}\n </p>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Authors\n </p>\n <p className=\"mt-1 text-text-primary\">\n {detail.authors.length ? detail.authors.join(', ') : '—'}\n </p>\n </div>\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n License\n </p>\n <p className=\"mt-1 text-text-primary\">{detail.license || '—'}</p>\n </div>\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Published\n </p>\n <p className=\"mt-1 text-text-primary\">{formatDate(detail.publishedAt)}</p>\n </div>\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n DOI\n </p>\n <p className=\"mt-1\">\n {detail.doi ? (\n <SafeLink\n href={doiUrl(detail.doi)}\n className=\"inline-flex items-center gap-1 text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"text-text-secondary\"\n >\n {detail.doi}\n <ExternalLink className=\"size-3.5\" aria-hidden=\"true\" />\n </SafeLink>\n ) : (\n <span className=\"text-text-secondary\">Not assigned</span>\n )}\n </p>\n </div>\n </div>\n\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Datasets ({detail.datasetIds.length})\n </p>\n <div className=\"mt-1 flex flex-wrap gap-1.5\">\n {detail.datasetIds.length === 0 ? (\n <span className=\"text-text-secondary\">None linked.</span>\n ) : (\n detail.datasetIds.map((datasetId) => {\n const name = datasetNameById.get(datasetId);\n return (\n <Button\n key={datasetId}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-auto gap-1 px-2 py-1\"\n onClick={() => goToLinked(`datasets/${datasetId}`)}\n >\n <Database className=\"size-3.5\" aria-hidden=\"true\" />\n <span className={name ? '' : 'font-mono text-xs'}>\n {name ?? datasetId}\n </span>\n </Button>\n );\n })\n )}\n </div>\n </div>\n\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Notebook\n </p>\n <div className=\"mt-1\">\n {detail.notebookId ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-auto gap-1 px-2 py-1\"\n onClick={() => goToLinked(`notebooks/${detail.notebookId}`)}\n >\n <NotebookPen className=\"size-3.5\" aria-hidden=\"true\" />\n <span\n className={\n notebookTitleById.get(detail.notebookId) ? '' : 'font-mono text-xs'\n }\n >\n {notebookTitleById.get(detail.notebookId) ?? detail.notebookId}\n </span>\n </Button>\n ) : (\n <span className=\"text-text-secondary\">None linked.</span>\n )}\n </div>\n </div>\n\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Discussion\n </p>\n <div className=\"mt-2\">\n <DiscussionPanel\n entityType=\"cosmicintersection-release\"\n entityId={detail.id}\n title={detail.title}\n widgetKey=\"release-discussion\"\n />\n </div>\n </div>\n </div>\n\n <DialogFooter>\n {canPublish(detail.status) ? (\n <Button\n type=\"button\"\n onClick={() => {\n const target = detail;\n setDetail(null);\n openPublish(target);\n }}\n >\n <Rocket className=\"size-4\" />\n Publish\n </Button>\n ) : null}\n <DialogClose asChild>\n <Button type=\"button\" variant=\"outline\">\n Close\n </Button>\n </DialogClose>\n </DialogFooter>\n </>\n ) : null}\n </DialogContent>\n </Dialog>\n\n {/* Publish dialog */}\n <Dialog\n open={publishTarget !== null}\n onOpenChange={(open) => (open || publishing ? undefined : setPublishTarget(null))}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>\n {tr('cosmicintersection.pages.releases.publishRelease', 'Publish release')}\n </DialogTitle>\n <DialogDescription>\n {publishTarget\n ? tr(\n 'cosmicintersection.pages.releases.publishDescription',\n 'Publish “{{name}}” to make it publicly citable. You can attach a DOI now or later.',\n { name: publishTarget.title }\n )\n : ''}\n </DialogDescription>\n </DialogHeader>\n\n {publishTarget ? (\n <dl className=\"grid grid-cols-3 gap-x-4 gap-y-3 rounded-card border border-border-default bg-bg-sunken p-3\">\n <div className=\"col-span-2 min-w-0\">\n <dt className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Authors\n </dt>\n <dd\n className=\"mt-0.5 truncate text-sm text-text-primary\"\n title={publishTarget.authors.join(', ')}\n >\n {publishTarget.authors.length ? publishTarget.authors.join(', ') : '—'}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Datasets\n </dt>\n <dd className=\"mt-0.5 text-sm tabular-nums text-text-primary\">\n {publishTarget.datasetIds.length}\n </dd>\n </div>\n <div className=\"col-span-3 min-w-0\">\n <dt className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n License\n </dt>\n <dd className=\"mt-0.5 truncate text-sm text-text-primary\">\n {publishTarget.license || '—'}\n </dd>\n </div>\n </dl>\n ) : null}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"release-doi\">\n {tr('cosmicintersection.pages.releases.doiOptional', 'DOI (optional)')}\n </Label>\n <Input\n id=\"release-doi\"\n value={doiDraft}\n onChange={(event) => setDoiDraft(event.target.value)}\n placeholder=\"10.1234/cosmic.2026.0001\"\n />\n <p className=\"text-xs text-text-secondary\">\n {tr(\n 'cosmicintersection.pages.releases.doiHint',\n 'A Digital Object Identifier makes the release permanently referenceable.'\n )}\n </p>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setPublishTarget(null)}\n disabled={publishing}\n >\n {tr('cosmicintersection.common.cancel', 'Cancel')}\n </Button>\n <Button type=\"button\" onClick={() => void submitPublish()} disabled={publishing}>\n <Rocket className=\"size-4\" />\n {publishing\n ? tr('cosmicintersection.pages.releases.publishing', 'Publishing…')\n : tr('cosmicintersection.pages.releases.publishRelease', 'Publish release')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ReleasesPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/releases/ReleasesPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { BookOpen, Database, ExternalLink, NotebookPen, Plus, Rocket } from 'lucide-react';\nimport {\n Button,\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosDatasetsQuery,\n useCosNotebooksQuery,\n useCosPublishReleaseMutation,\n useCosReleasesQuery,\n type CosRelease,\n type CosReleaseStatus,\n} from '../../api/cosmicApi';\nimport {\n DiscussionPanel,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n SafeLink,\n StatusBadge,\n formatEnumLabel,\n usePagination,\n} from '../../components';\nimport { ActionMenu } from '../../components/ActionMenu';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\nimport { useSelectedRecord } from '../../lib/useSelectedRecord';\nimport { useTr } from '../../../shared/hooks/useTr';\n\nconst ALL = 'ALL';\n\nconst RELEASE_STATUSES: CosReleaseStatus[] = ['DRAFT', 'UNDER_REVIEW', 'PUBLISHED', 'RETRACTED'];\n\n/** A release can be published only while it is still in a pre-publication state. */\nfunction canPublish(status: CosReleaseStatus): boolean {\n return status === 'DRAFT' || status === 'UNDER_REVIEW';\n}\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return '—';\n }\n return parsed.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nfunction doiUrl(doi: string): string {\n const trimmed = doi.trim();\n return /^https?:\\/\\//i.test(trimmed)\n ? trimmed\n : `https://doi.org/${trimmed.replace(/^doi:/i, '')}`;\n}\n\nexport default function ReleasesPage() {\n const { navigate } = useCosmicIntersection();\n const tr = useTr();\n const [statusFilter, setStatusFilter] = useState<string>(ALL);\n const pagination = usePagination({ pageSize: 20, resetKey: statusFilter });\n\n const { data, loading, error, refetch } = useCosReleasesQuery({\n status: statusFilter === ALL ? undefined : (statusFilter as CosReleaseStatus),\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n\n const [publishRelease, { loading: publishing }] = useCosPublishReleaseMutation();\n\n const releases = useMemo(() => data?.cosListReleases.items ?? [], [data]);\n const pageInfo = data?.cosListReleases.pageInfo;\n\n // Resolve the release's linked dataset/notebook UUIDs to human names so the\n // detail dialog can render navigable buttons instead of raw ids.\n const datasetsQuery = useCosDatasetsQuery({ pagination: { limit: 100, offset: 0 } });\n const notebooksQuery = useCosNotebooksQuery({ pagination: { limit: 100, offset: 0 } });\n const datasetNameById = useMemo(() => {\n const map = new Map<string, string>();\n for (const dataset of datasetsQuery.data?.cosListDatasets.items ?? []) {\n map.set(dataset.id, dataset.name);\n }\n return map;\n }, [datasetsQuery.data]);\n const notebookTitleById = useMemo(() => {\n const map = new Map<string, string>();\n for (const notebook of notebooksQuery.data?.cosListNotebooks.items ?? []) {\n map.set(notebook.id, notebook.title);\n }\n return map;\n }, [notebooksQuery.data]);\n\n // Detail (View) dialog — rendered from row data, no extra fetch needed. The\n // open release lives in `?id=` so the assistant's page context can resolve\n // \"this release\" (COSMIC_RELEASE) and the dialog is linkable.\n const { selectedId: detailId, select: selectDetail } = useSelectedRecord();\n const detail = useMemo(\n () => (detailId ? (releases.find((release) => release.id === detailId) ?? null) : null),\n [releases, detailId]\n );\n const setDetail = (release: CosRelease | null) => selectDetail(release ? release.id : null);\n\n // Close the dialog before navigating to a linked entity.\n const goToLinked = (path: string) => {\n setDetail(null);\n navigate(path);\n };\n\n // Publish dialog — captures an optional DOI before transitioning the release.\n const [publishTarget, setPublishTarget] = useState<CosRelease | null>(null);\n const [doiDraft, setDoiDraft] = useState('');\n\n const openPublish = (release: CosRelease) => {\n setDoiDraft(release.doi ?? '');\n setPublishTarget(release);\n };\n\n const submitPublish = async () => {\n if (!publishTarget) {\n return;\n }\n const doi = doiDraft.trim();\n const response = await publishRelease({\n variables: { id: publishTarget.id, doi: doi || undefined },\n });\n if (response.data?.cosPublishRelease?.id) {\n notify.success(\n tr('cosmicintersection.pages.releases.publishSuccess', 'Release published'),\n tr(\n 'cosmicintersection.pages.releases.publishSuccessDescription',\n '“{{name}}” is now public.',\n { name: publishTarget.title }\n )\n );\n setPublishTarget(null);\n setDoiDraft('');\n await refetch();\n }\n };\n\n const newButton = (\n <Button type=\"button\" onClick={() => navigate('releases/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.releases.create', 'New release')}\n </Button>\n );\n\n const renderBody = () => {\n if (loading) {\n return (\n <LoadingState\n variant=\"rows\"\n rows={6}\n label={tr('cosmicintersection.pages.releases.loading', 'Loading releases…')}\n />\n );\n }\n if (error) {\n return <ErrorState message={error.message} onRetry={() => void refetch()} />;\n }\n if (releases.length === 0) {\n const filtered = statusFilter !== ALL;\n return (\n <EmptyState\n icon={Rocket}\n title={\n filtered\n ? tr(\n 'cosmicintersection.pages.releases.emptyFilterTitle',\n 'No releases match this filter'\n )\n : tr('cosmicintersection.pages.releases.emptyTitle', 'No releases yet')\n }\n description={\n filtered\n ? tr(\n 'cosmicintersection.pages.releases.emptyFilterDescription',\n 'Try clearing the status filter to see more releases.'\n )\n : tr(\n 'cosmicintersection.pages.releases.emptyDescription',\n 'Package datasets and notebooks into a citable, versioned release for publication.'\n )\n }\n action={filtered ? undefined : newButton}\n />\n );\n }\n\n return (\n <>\n {/* Desktop table */}\n <div className=\"hidden rounded-card border border-border-default bg-bg-elevated md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Title</TableHead>\n <TableHead>Version</TableHead>\n <TableHead>Status</TableHead>\n <TableHead>DOI</TableHead>\n <TableHead>Authors</TableHead>\n <TableHead>Published</TableHead>\n <TableHead>License</TableHead>\n <TableHead className=\"text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {releases.map((release) => (\n <TableRow key={release.id}>\n <TableCell>\n <button\n type=\"button\"\n onClick={() => setDetail(release)}\n className=\"text-left font-medium text-text-primary underline-offset-2 hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border-focus\"\n >\n {release.title}\n </button>\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {release.version || '—'}\n </TableCell>\n <TableCell>\n <StatusBadge status={release.status} />\n </TableCell>\n <TableCell className=\"max-w-[14rem]\">\n {release.doi ? (\n <SafeLink\n href={doiUrl(release.doi)}\n className=\"inline-flex items-center gap-1 truncate text-sm text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"block truncate text-sm text-text-secondary\"\n >\n <span className=\"truncate\">{release.doi}</span>\n <ExternalLink className=\"size-3.5 shrink-0\" aria-hidden=\"true\" />\n </SafeLink>\n ) : (\n <span className=\"text-sm text-text-secondary\">—</span>\n )}\n </TableCell>\n <TableCell className=\"max-w-[14rem]\">\n {release.authors.length === 0 ? (\n <span className=\"text-sm text-text-secondary\">—</span>\n ) : (\n <span className=\"line-clamp-1 text-sm text-text-secondary\">\n {release.authors.join(', ')}\n </span>\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {formatDate(release.publishedAt)}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-sm text-text-secondary\">\n {release.license || '—'}\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={`Actions for ${release.title}`}\n onView={() => setDetail(release)}\n extraItems={\n canPublish(release.status)\n ? [\n {\n key: 'publish',\n label: tr('cosmicintersection.pages.releases.publish', 'Publish'),\n icon: Rocket,\n onSelect: () => openPublish(release),\n },\n ]\n : []\n }\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {/* Mobile card list */}\n <ul className=\"space-y-3 md:hidden\">\n {releases.map((release) => (\n <li\n key={release.id}\n className=\"rounded-card border border-border-default bg-bg-elevated\"\n >\n <div className=\"flex items-start justify-between gap-2 p-4\">\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => setDetail(release)}\n className=\"truncate text-left font-medium text-text-primary underline-offset-2 hover:underline\"\n >\n {release.title}\n </button>\n <StatusBadge status={release.status} />\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary\">\n <span>{release.version || 'v—'}</span>\n {release.license ? <span>{release.license}</span> : null}\n <span>{formatDate(release.publishedAt)}</span>\n </div>\n {release.authors.length > 0 ? (\n <p className=\"line-clamp-1 text-xs text-text-secondary\">\n {release.authors.join(', ')}\n </p>\n ) : null}\n {release.doi ? (\n <SafeLink\n href={doiUrl(release.doi)}\n className=\"inline-flex items-center gap-1 text-xs text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"block truncate text-xs text-text-secondary\"\n >\n <span className=\"truncate\">DOI: {release.doi}</span>\n <ExternalLink className=\"size-3 shrink-0\" aria-hidden=\"true\" />\n </SafeLink>\n ) : null}\n </div>\n <ActionMenu\n ariaLabel={`Actions for ${release.title}`}\n onView={() => setDetail(release)}\n extraItems={\n canPublish(release.status)\n ? [\n {\n key: 'publish',\n label: tr('cosmicintersection.pages.releases.publish', 'Publish'),\n icon: Rocket,\n onSelect: () => openPublish(release),\n },\n ]\n : []\n }\n />\n </div>\n </li>\n ))}\n </ul>\n\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={releases.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel={tr('cosmicintersection.pages.releases.itemLabel', 'releases')}\n loading={loading}\n />\n </>\n );\n };\n\n return (\n <PageLayout\n title={tr('cosmicintersection.pages.releases.title', 'Releases')}\n description={tr(\n 'cosmicintersection.pages.releases.description',\n 'Citable, versioned publications that bundle datasets and notebooks for the community.'\n )}\n actions={newButton}\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"w-full max-w-[14rem]\">\n <Select value={statusFilter} onValueChange={setStatusFilter}>\n <SelectTrigger aria-label=\"Filter by status\">\n <SelectValue placeholder=\"All statuses\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All statuses</SelectItem>\n {RELEASE_STATUSES.map((status) => (\n <SelectItem key={status} value={status}>\n {formatEnumLabel(status)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n\n {renderBody()}\n </div>\n\n {/* View / detail dialog */}\n <Dialog open={detail !== null} onOpenChange={(open) => (open ? undefined : setDetail(null))}>\n <DialogContent className=\"max-h-[85vh] max-w-lg overflow-y-auto\">\n {detail ? (\n <>\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <BookOpen className=\"size-5 text-text-secondary\" aria-hidden=\"true\" />\n {detail.title}\n </DialogTitle>\n <DialogDescription>\n Version {detail.version || '—'} · <StatusBadge status={detail.status} />\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4 text-sm\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Abstract\n </p>\n <p className=\"mt-1 whitespace-pre-wrap text-text-primary\">\n {detail.abstract?.trim() || 'No abstract provided.'}\n </p>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Authors\n </p>\n <p className=\"mt-1 text-text-primary\">\n {detail.authors.length ? detail.authors.join(', ') : '—'}\n </p>\n </div>\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n License\n </p>\n <p className=\"mt-1 text-text-primary\">{detail.license || '—'}</p>\n </div>\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Published\n </p>\n <p className=\"mt-1 text-text-primary\">{formatDate(detail.publishedAt)}</p>\n </div>\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n DOI\n </p>\n <p className=\"mt-1\">\n {detail.doi ? (\n <SafeLink\n href={doiUrl(detail.doi)}\n className=\"inline-flex items-center gap-1 text-text-primary underline-offset-2 hover:underline\"\n fallbackClassName=\"text-text-secondary\"\n >\n {detail.doi}\n <ExternalLink className=\"size-3.5\" aria-hidden=\"true\" />\n </SafeLink>\n ) : (\n <span className=\"text-text-secondary\">Not assigned</span>\n )}\n </p>\n </div>\n </div>\n\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Datasets ({detail.datasetIds.length})\n </p>\n <div className=\"mt-1 flex flex-wrap gap-1.5\">\n {detail.datasetIds.length === 0 ? (\n <span className=\"text-text-secondary\">None linked.</span>\n ) : (\n detail.datasetIds.map((datasetId) => {\n const name = datasetNameById.get(datasetId);\n return (\n <Button\n key={datasetId}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-auto gap-1 px-2 py-1\"\n onClick={() => goToLinked(`datasets/${datasetId}`)}\n >\n <Database className=\"size-3.5\" aria-hidden=\"true\" />\n <span className={name ? '' : 'font-mono text-xs'}>\n {name ?? datasetId}\n </span>\n </Button>\n );\n })\n )}\n </div>\n </div>\n\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Notebook\n </p>\n <div className=\"mt-1\">\n {detail.notebookId ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-auto gap-1 px-2 py-1\"\n onClick={() => goToLinked(`notebooks/${detail.notebookId}`)}\n >\n <NotebookPen className=\"size-3.5\" aria-hidden=\"true\" />\n <span\n className={\n notebookTitleById.get(detail.notebookId) ? '' : 'font-mono text-xs'\n }\n >\n {notebookTitleById.get(detail.notebookId) ?? detail.notebookId}\n </span>\n </Button>\n ) : (\n <span className=\"text-text-secondary\">None linked.</span>\n )}\n </div>\n </div>\n\n <div>\n <p className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Discussion\n </p>\n <div className=\"mt-2\">\n <DiscussionPanel\n entityType=\"cosmicintersection-release\"\n entityId={detail.id}\n title={detail.title}\n widgetKey=\"release-discussion\"\n />\n </div>\n </div>\n </div>\n\n <DialogFooter>\n {canPublish(detail.status) ? (\n <Button\n type=\"button\"\n onClick={() => {\n const target = detail;\n setDetail(null);\n openPublish(target);\n }}\n >\n <Rocket className=\"size-4\" />\n Publish\n </Button>\n ) : null}\n <DialogClose asChild>\n <Button type=\"button\" variant=\"outline\">\n Close\n </Button>\n </DialogClose>\n </DialogFooter>\n </>\n ) : null}\n </DialogContent>\n </Dialog>\n\n {/* Publish dialog */}\n <Dialog\n open={publishTarget !== null}\n onOpenChange={(open) => (open || publishing ? undefined : setPublishTarget(null))}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>\n {tr('cosmicintersection.pages.releases.publishRelease', 'Publish release')}\n </DialogTitle>\n <DialogDescription>\n {publishTarget\n ? tr(\n 'cosmicintersection.pages.releases.publishDescription',\n 'Publish “{{name}}” to make it publicly citable. You can attach a DOI now or later.',\n { name: publishTarget.title }\n )\n : ''}\n </DialogDescription>\n </DialogHeader>\n\n {publishTarget ? (\n <dl className=\"grid grid-cols-3 gap-x-4 gap-y-3 rounded-card border border-border-default bg-bg-sunken p-3\">\n <div className=\"col-span-2 min-w-0\">\n <dt className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Authors\n </dt>\n <dd\n className=\"mt-0.5 truncate text-sm text-text-primary\"\n title={publishTarget.authors.join(', ')}\n >\n {publishTarget.authors.length ? publishTarget.authors.join(', ') : '—'}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n Datasets\n </dt>\n <dd className=\"mt-0.5 text-sm tabular-nums text-text-primary\">\n {publishTarget.datasetIds.length}\n </dd>\n </div>\n <div className=\"col-span-3 min-w-0\">\n <dt className=\"text-xs font-medium uppercase tracking-wide text-text-secondary\">\n License\n </dt>\n <dd className=\"mt-0.5 truncate text-sm text-text-primary\">\n {publishTarget.license || '—'}\n </dd>\n </div>\n </dl>\n ) : null}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"release-doi\">\n {tr('cosmicintersection.pages.releases.doiOptional', 'DOI (optional)')}\n </Label>\n <Input\n id=\"release-doi\"\n value={doiDraft}\n onChange={(event) => setDoiDraft(event.target.value)}\n placeholder=\"10.1234/cosmic.2026.0001\"\n />\n <p className=\"text-xs text-text-secondary\">\n {tr(\n 'cosmicintersection.pages.releases.doiHint',\n 'A Digital Object Identifier makes the release permanently referenceable.'\n )}\n </p>\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setPublishTarget(null)}\n disabled={publishing}\n >\n {tr('cosmicintersection.common.cancel', 'Cancel')}\n </Button>\n <Button type=\"button\" onClick={() => void submitPublish()} disabled={publishing}>\n <Rocket className=\"size-4\" />\n {publishing\n ? tr('cosmicintersection.pages.releases.publishing', 'Publishing…')\n : tr('cosmicintersection.pages.releases.publishRelease', 'Publish release')}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export default function RunDetailPage(): import("react/jsx-runtime").JSX.Element;
1
+ export default function RunDetailPage(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=RunDetailPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RunDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/runs/RunDetailPage.tsx"],"names":[],"mappings":"AAoKA,MAAM,CAAC,OAAO,UAAU,aAAa,4CAmlBpC"}
1
+ {"version":3,"file":"RunDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/runs/RunDetailPage.tsx"],"names":[],"mappings":"AAoKA,MAAM,CAAC,OAAO,UAAU,aAAa,gCAmlBpC"}
@@ -1,2 +1,2 @@
1
- export default function RunsPage(): import("react/jsx-runtime").JSX.Element;
1
+ export default function RunsPage(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=RunsPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RunsPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/runs/RunsPage.tsx"],"names":[],"mappings":"AA0DA,MAAM,CAAC,OAAO,UAAU,QAAQ,4CA+O/B"}
1
+ {"version":3,"file":"RunsPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/runs/RunsPage.tsx"],"names":[],"mappings":"AA0DA,MAAM,CAAC,OAAO,UAAU,QAAQ,gCA+O/B"}
@@ -1,2 +1,2 @@
1
- export default function SourceDetailPage(): import("react/jsx-runtime").JSX.Element;
1
+ export default function SourceDetailPage(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=SourceDetailPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SourceDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/sources/SourceDetailPage.tsx"],"names":[],"mappings":"AAoEA,MAAM,CAAC,OAAO,UAAU,gBAAgB,4CAoPvC"}
1
+ {"version":3,"file":"SourceDetailPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/sources/SourceDetailPage.tsx"],"names":[],"mappings":"AAoEA,MAAM,CAAC,OAAO,UAAU,gBAAgB,gCAoPvC"}
@@ -1,2 +1,2 @@
1
- export default function SourceFormPage(): import("react/jsx-runtime").JSX.Element;
1
+ export default function SourceFormPage(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=SourceFormPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SourceFormPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/sources/SourceFormPage.tsx"],"names":[],"mappings":"AAqEA,MAAM,CAAC,OAAO,UAAU,cAAc,4CAyMrC"}
1
+ {"version":3,"file":"SourceFormPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/sources/SourceFormPage.tsx"],"names":[],"mappings":"AAqEA,MAAM,CAAC,OAAO,UAAU,cAAc,gCAyMrC"}
@@ -1,2 +1,2 @@
1
- export default function SourcesPage(): import("react/jsx-runtime").JSX.Element;
1
+ export default function SourcesPage(): import("react").JSX.Element;
2
2
  //# sourceMappingURL=SourcesPage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SourcesPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/sources/SourcesPage.tsx"],"names":[],"mappings":"AAmGA,MAAM,CAAC,OAAO,UAAU,WAAW,4CA0YlC"}
1
+ {"version":3,"file":"SourcesPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/sources/SourcesPage.tsx"],"names":[],"mappings":"AAmGA,MAAM,CAAC,OAAO,UAAU,WAAW,gCA0YlC"}
@@ -227,8 +227,8 @@ var e = (e, t) => {
227
227
  return a = o, (...e) => a(re(...e));
228
228
  }, O = [], k = (e) => {
229
229
  let t = (t) => t[e] || O;
230
- return t.isThemeGetter = !0, t;
231
- }, A = /^\[(?:(\w[\w-]*):)?(.+)\]$/i, j = /^\((?:(\w[\w-]*):)?(.+)\)$/i, M = /^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/, N = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/, ie = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/, ae = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/, oe = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/, P = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/, F = (e) => M.test(e), I = (e) => !!e && !Number.isNaN(Number(e)), L = (e) => !!e && Number.isInteger(Number(e)), se = (e) => e.endsWith("%") && I(e.slice(0, -1)), R = (e) => N.test(e), ce = () => !0, z = (e) => ie.test(e) && !ae.test(e), B = () => !1, V = (e) => oe.test(e), le = (e) => P.test(e), ue = (e) => !H(e) && !G(e), de = (e) => e.startsWith("@container") && (e[10] === "/" && e[11] !== void 0 || e[11] === "s" && e[16] !== void 0 && e.startsWith("-size/", 10) || e[11] === "n" && e[18] !== void 0 && e.startsWith("-normal/", 10)), fe = (e) => J(e, Q, B), H = (e) => A.test(e), U = (e) => J(e, $, z), pe = (e) => J(e, Ce, I), me = (e) => J(e, Te, ce), he = (e) => J(e, we, B), ge = (e) => J(e, X, B), _e = (e) => J(e, Z, le), W = (e) => J(e, Ee, V), G = (e) => j.test(e), K = (e) => Y(e, $), ve = (e) => Y(e, we), ye = (e) => Y(e, X), be = (e) => Y(e, Q), xe = (e) => Y(e, Z), q = (e) => Y(e, Ee, !0), Se = (e) => Y(e, Te, !0), J = (e, t, n) => {
230
+ return t.isThemeGetter = !0, t.themeKey = e, t;
231
+ }, A = /^\[(?:(\w[\w-]*):)?(.+)\]$/i, j = /^\((?:(\w[\w-]*):)?(.+)\)$/i, M = /^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/, N = /^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/, ie = /\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/, ae = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix|color|light-dark)\(.+\)$/, oe = /^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/, P = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/, F = (e) => M.test(e), I = (e) => !!e && !Number.isNaN(Number(e)), L = (e) => !!e && Number.isInteger(Number(e)), se = (e) => e.endsWith("%") && I(e.slice(0, -1)), R = (e) => N.test(e), ce = () => !0, z = (e) => ie.test(e) && !ae.test(e), B = () => !1, V = (e) => oe.test(e), le = (e) => P.test(e), ue = (e) => !H(e) && !G(e), de = (e) => e.startsWith("@container") && (e[10] === "/" && e[11] !== void 0 || e[11] === "s" && e[16] !== void 0 && e.startsWith("-size/", 10) || e[11] === "n" && e[18] !== void 0 && e.startsWith("-normal/", 10)), fe = (e) => J(e, Q, B), H = (e) => A.test(e), U = (e) => J(e, $, z), pe = (e) => J(e, Ce, I), me = (e) => J(e, Te, ce), he = (e) => J(e, we, B), ge = (e) => J(e, X, B), _e = (e) => J(e, Z, le), W = (e) => J(e, Ee, V), G = (e) => j.test(e), K = (e) => Y(e, $), ve = (e) => Y(e, we), ye = (e) => Y(e, X), be = (e) => Y(e, Q), xe = (e) => Y(e, Z), q = (e) => Y(e, Ee, !0), Se = (e) => Y(e, Te, !0), J = (e, t, n) => {
232
232
  let r = A.exec(e);
233
233
  return r ? r[1] ? t(r[1]) : n(r[2]) : !1;
234
234
  }, Y = (e, t, n = !1) => {
@@ -343,6 +343,7 @@ var e = (e, t) => {
343
343
  "fit",
344
344
  ...C()
345
345
  ], j = () => [
346
+ s,
346
347
  F,
347
348
  "screen",
348
349
  "full",
@@ -538,6 +539,7 @@ var e = (e, t) => {
538
539
  "container-named": [de],
539
540
  columns: [{ columns: [
540
541
  I,
542
+ "auto",
541
543
  H,
542
544
  G,
543
545
  s
@@ -786,6 +788,7 @@ var e = (e, t) => {
786
788
  "max-h": [{ "max-h": [
787
789
  "screen",
788
790
  "lh",
791
+ "none",
789
792
  ...A()
790
793
  ] }],
791
794
  "font-size": [{ text: [
@@ -837,7 +840,11 @@ var e = (e, t) => {
837
840
  G,
838
841
  pe
839
842
  ] }],
840
- leading: [{ leading: [a, ...C()] }],
843
+ leading: [{ leading: [
844
+ "none",
845
+ a,
846
+ ...C()
847
+ ] }],
841
848
  "list-image": [{ "list-image": [
842
849
  "none",
843
850
  G,
@@ -989,6 +996,7 @@ var e = (e, t) => {
989
996
  H
990
997
  ],
991
998
  conic: [
999
+ "",
992
1000
  L,
993
1001
  G,
994
1002
  H
@@ -1075,6 +1083,7 @@ var e = (e, t) => {
1075
1083
  "outline-color": [{ outline: N() }],
1076
1084
  shadow: [{ shadow: [
1077
1085
  "",
1086
+ "inner",
1078
1087
  "none",
1079
1088
  u,
1080
1089
  q,
@@ -1542,8 +1551,18 @@ var e = (e, t) => {
1542
1551
  "bottom",
1543
1552
  "left"
1544
1553
  ],
1545
- "inset-x": ["right", "left"],
1546
- "inset-y": ["top", "bottom"],
1554
+ "inset-x": [
1555
+ "start",
1556
+ "end",
1557
+ "right",
1558
+ "left"
1559
+ ],
1560
+ "inset-y": [
1561
+ "inset-bs",
1562
+ "inset-be",
1563
+ "top",
1564
+ "bottom"
1565
+ ],
1547
1566
  flex: [
1548
1567
  "basis",
1549
1568
  "grow",
@@ -1562,8 +1581,18 @@ var e = (e, t) => {
1562
1581
  "pb",
1563
1582
  "pl"
1564
1583
  ],
1565
- px: ["pr", "pl"],
1566
- py: ["pt", "pb"],
1584
+ px: [
1585
+ "ps",
1586
+ "pe",
1587
+ "pr",
1588
+ "pl"
1589
+ ],
1590
+ py: [
1591
+ "pbs",
1592
+ "pbe",
1593
+ "pt",
1594
+ "pb"
1595
+ ],
1567
1596
  m: [
1568
1597
  "mx",
1569
1598
  "my",
@@ -1576,8 +1605,18 @@ var e = (e, t) => {
1576
1605
  "mb",
1577
1606
  "ml"
1578
1607
  ],
1579
- mx: ["mr", "ml"],
1580
- my: ["mt", "mb"],
1608
+ mx: [
1609
+ "ms",
1610
+ "me",
1611
+ "mr",
1612
+ "ml"
1613
+ ],
1614
+ my: [
1615
+ "mbs",
1616
+ "mbe",
1617
+ "mt",
1618
+ "mb"
1619
+ ],
1581
1620
  size: ["w", "h"],
1582
1621
  "font-size": ["leading"],
1583
1622
  "fvn-normal": [
@@ -1628,8 +1667,18 @@ var e = (e, t) => {
1628
1667
  "border-w-b",
1629
1668
  "border-w-l"
1630
1669
  ],
1631
- "border-w-x": ["border-w-r", "border-w-l"],
1632
- "border-w-y": ["border-w-t", "border-w-b"],
1670
+ "border-w-x": [
1671
+ "border-w-s",
1672
+ "border-w-e",
1673
+ "border-w-r",
1674
+ "border-w-l"
1675
+ ],
1676
+ "border-w-y": [
1677
+ "border-w-bs",
1678
+ "border-w-be",
1679
+ "border-w-t",
1680
+ "border-w-b"
1681
+ ],
1633
1682
  "border-color": [
1634
1683
  "border-color-x",
1635
1684
  "border-color-y",
@@ -1642,8 +1691,18 @@ var e = (e, t) => {
1642
1691
  "border-color-b",
1643
1692
  "border-color-l"
1644
1693
  ],
1645
- "border-color-x": ["border-color-r", "border-color-l"],
1646
- "border-color-y": ["border-color-t", "border-color-b"],
1694
+ "border-color-x": [
1695
+ "border-color-s",
1696
+ "border-color-e",
1697
+ "border-color-r",
1698
+ "border-color-l"
1699
+ ],
1700
+ "border-color-y": [
1701
+ "border-color-bs",
1702
+ "border-color-be",
1703
+ "border-color-t",
1704
+ "border-color-b"
1705
+ ],
1647
1706
  translate: [
1648
1707
  "translate-x",
1649
1708
  "translate-y",
@@ -1667,8 +1726,18 @@ var e = (e, t) => {
1667
1726
  "scroll-mb",
1668
1727
  "scroll-ml"
1669
1728
  ],
1670
- "scroll-mx": ["scroll-mr", "scroll-ml"],
1671
- "scroll-my": ["scroll-mt", "scroll-mb"],
1729
+ "scroll-mx": [
1730
+ "scroll-ms",
1731
+ "scroll-me",
1732
+ "scroll-mr",
1733
+ "scroll-ml"
1734
+ ],
1735
+ "scroll-my": [
1736
+ "scroll-mbs",
1737
+ "scroll-mbe",
1738
+ "scroll-mt",
1739
+ "scroll-mb"
1740
+ ],
1672
1741
  "scroll-p": [
1673
1742
  "scroll-px",
1674
1743
  "scroll-py",
@@ -1681,8 +1750,18 @@ var e = (e, t) => {
1681
1750
  "scroll-pb",
1682
1751
  "scroll-pl"
1683
1752
  ],
1684
- "scroll-px": ["scroll-pr", "scroll-pl"],
1685
- "scroll-py": ["scroll-pt", "scroll-pb"],
1753
+ "scroll-px": [
1754
+ "scroll-ps",
1755
+ "scroll-pe",
1756
+ "scroll-pr",
1757
+ "scroll-pl"
1758
+ ],
1759
+ "scroll-py": [
1760
+ "scroll-pbs",
1761
+ "scroll-pbe",
1762
+ "scroll-pt",
1763
+ "scroll-pb"
1764
+ ],
1686
1765
  touch: [
1687
1766
  "touch-x",
1688
1767
  "touch-y",