@burdenoff/microfe-cosmicintersection 2026.704.1 → 2026.704.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/cosmicintersection/CosmicIntersectionRoutes.js +45 -25
  2. package/dist/cosmicintersection/CosmicIntersectionRoutes.js.map +1 -1
  3. package/dist/cosmicintersection/api/cosmicApi.js +137 -66
  4. package/dist/cosmicintersection/api/cosmicApi.js.map +1 -1
  5. package/dist/cosmicintersection/components/ActivityFeedPanel.js +68 -0
  6. package/dist/cosmicintersection/components/ActivityFeedPanel.js.map +1 -0
  7. package/dist/cosmicintersection/components/DiscussionPanel.js +57 -0
  8. package/dist/cosmicintersection/components/DiscussionPanel.js.map +1 -0
  9. package/dist/cosmicintersection/components/FacetPanel.js +66 -0
  10. package/dist/cosmicintersection/components/FacetPanel.js.map +1 -0
  11. package/dist/cosmicintersection/components/LineageGraph.js +388 -0
  12. package/dist/cosmicintersection/components/LineageGraph.js.map +1 -0
  13. package/dist/cosmicintersection/components/ResultsChart.js +329 -0
  14. package/dist/cosmicintersection/components/ResultsChart.js.map +1 -0
  15. package/dist/cosmicintersection/components/StepDAG.js +104 -0
  16. package/dist/cosmicintersection/components/StepDAG.js.map +1 -0
  17. package/dist/cosmicintersection/components/index.js +5 -3
  18. package/dist/cosmicintersection/pages/access/AccessPage.js +220 -161
  19. package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -1
  20. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +332 -172
  21. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -1
  22. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js +167 -109
  23. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js.map +1 -1
  24. package/dist/cosmicintersection/pages/collections/CollectionFormPage.js +87 -61
  25. package/dist/cosmicintersection/pages/collections/CollectionFormPage.js.map +1 -1
  26. package/dist/cosmicintersection/pages/collections/CollectionsPage.js +51 -42
  27. package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -1
  28. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +31 -18
  29. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -1
  30. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +330 -184
  31. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -1
  32. package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js +7 -7
  33. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +321 -163
  34. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -1
  35. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js +358 -0
  36. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js.map +1 -0
  37. package/dist/cosmicintersection/pages/lineage/LineagePage.js +171 -0
  38. package/dist/cosmicintersection/pages/lineage/LineagePage.js.map +1 -0
  39. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js +339 -260
  40. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js.map +1 -1
  41. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +143 -82
  42. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -1
  43. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js +286 -142
  44. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js.map +1 -1
  45. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js +305 -103
  46. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js.map +1 -1
  47. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +183 -79
  48. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -1
  49. package/dist/cosmicintersection/pages/releases/ReleasesPage.js +346 -204
  50. package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -1
  51. package/dist/cosmicintersection/pages/runs/RunDetailPage.js +184 -136
  52. package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -1
  53. package/dist/cosmicintersection/pages/runs/RunsPage.js +182 -120
  54. package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -1
  55. package/dist/cosmicintersection/pages/sources/SourceDetailPage.js +234 -0
  56. package/dist/cosmicintersection/pages/sources/SourceDetailPage.js.map +1 -0
  57. package/dist/cosmicintersection/pages/sources/SourcesPage.js +250 -133
  58. package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -1
  59. package/package.json +1 -1
@@ -1,30 +1,31 @@
1
1
  import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
2
2
  import { notify as t } from "../../lib/toast.js";
3
- import { useCosPublishReleaseMutation as n, useCosReleasesQuery as r } from "../../api/cosmicApi.js";
4
- import i from "../../components/ActionMenu.js";
5
- import ee from "../../components/EmptyState.js";
6
- import te from "../../components/ErrorState.js";
7
- import ne from "../../components/LoadingState.js";
8
- import re from "../../components/PageLayout.js";
9
- import a, { usePagination as o } from "../../components/Pagination.js";
10
- import s from "../../components/SafeLink.js";
11
- import c, { formatEnumLabel as l } from "../../components/StatusBadge.js";
3
+ import { useCosDatasetsQuery as ee, useCosNotebooksQuery as n, useCosPublishReleaseMutation as te, useCosReleasesQuery as ne } from "../../api/cosmicApi.js";
4
+ import r from "../../components/ActionMenu.js";
5
+ import re from "../../components/EmptyState.js";
6
+ import ie from "../../components/ErrorState.js";
7
+ import ae from "../../components/LoadingState.js";
8
+ import i from "../../components/SafeLink.js";
9
+ import a from "../../components/DiscussionPanel.js";
10
+ import oe from "../../components/PageLayout.js";
11
+ import se, { usePagination as ce } from "../../components/Pagination.js";
12
+ import o, { formatEnumLabel as le } from "../../components/StatusBadge.js";
12
13
  import "../../components/index.js";
13
- import { useMemo as u, useState as d } from "react";
14
- import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
15
- import { BookOpen as ie, ExternalLink as h, Plus as ae, Rocket as g } from "lucide-react";
16
- import { Badge as _, Button as v, Dialog as y, DialogClose as b, DialogContent as x, DialogDescription as S, DialogFooter as C, DialogHeader as w, DialogTitle as T, Input as oe, Label as se, Select as ce, SelectContent as le, SelectItem as E, SelectTrigger as ue, SelectValue as de, Table as D, TableBody as fe, TableCell as O, TableHead as k, TableHeader as pe, TableRow as A } from "@burdenoff/fe-libs/ui";
14
+ import { useMemo as s, useState as c } from "react";
15
+ import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
16
+ import { BookOpen as ue, Database as de, ExternalLink as f, NotebookPen as p, Plus as m, Rocket as h } from "lucide-react";
17
+ import { Button as g, Dialog as _, DialogClose as fe, DialogContent as v, DialogDescription as y, DialogFooter as b, DialogHeader as x, DialogTitle as S, Input as pe, Label as me, Select as he, SelectContent as ge, SelectItem as C, SelectTrigger as _e, SelectValue as ve, Table as ye, TableBody as be, TableCell as w, TableHead as T, TableHeader as E, TableRow as D } from "@burdenoff/fe-libs/ui";
17
18
  //#region src/cosmicintersection/pages/releases/ReleasesPage.tsx
18
- var j = "ALL", M = [
19
+ var O = "ALL", k = [
19
20
  "DRAFT",
20
21
  "UNDER_REVIEW",
21
22
  "PUBLISHED",
22
23
  "RETRACTED"
23
24
  ];
24
- function N(e) {
25
+ function A(e) {
25
26
  return e === "DRAFT" || e === "UNDER_REVIEW";
26
27
  }
27
- function P(e) {
28
+ function j(e) {
28
29
  if (!e) return "—";
29
30
  let t = new Date(e);
30
31
  return Number.isNaN(t.getTime()) ? "—" : t.toLocaleDateString(void 0, {
@@ -33,283 +34,391 @@ function P(e) {
33
34
  day: "numeric"
34
35
  });
35
36
  }
36
- function F(e) {
37
+ function M(e) {
37
38
  let t = e.trim();
38
39
  return /^https?:\/\//i.test(t) ? t : `https://doi.org/${t.replace(/^doi:/i, "")}`;
39
40
  }
40
- function I() {
41
- let { navigate: I } = e(), [L, R] = d(j), z = o({
41
+ function N() {
42
+ let { navigate: N } = e(), [P, xe] = c(O), F = ce({
42
43
  pageSize: 20,
43
- resetKey: L
44
- }), { data: B, loading: V, error: H, refetch: U } = r({
45
- status: L === j ? void 0 : L,
44
+ resetKey: P
45
+ }), { data: I, loading: L, error: R, refetch: z } = ne({
46
+ status: P === O ? void 0 : P,
46
47
  pagination: {
47
- limit: z.limit,
48
- offset: z.offset
48
+ limit: F.limit,
49
+ offset: F.offset
49
50
  }
50
- }), [me, { loading: W }] = n(), G = u(() => B?.cosListReleases.items ?? [], [B]), he = B?.cosListReleases.pageInfo, [K, q] = d(null), [J, Y] = d(null), [X, Z] = d(""), Q = (e) => {
51
+ }), [Se, { loading: B }] = te(), V = s(() => I?.cosListReleases.items ?? [], [I]), Ce = I?.cosListReleases.pageInfo, H = ee({ pagination: {
52
+ limit: 100,
53
+ offset: 0
54
+ } }), U = n({ pagination: {
55
+ limit: 100,
56
+ offset: 0
57
+ } }), we = s(() => {
58
+ let e = /* @__PURE__ */ new Map();
59
+ for (let t of H.data?.cosListDatasets.items ?? []) e.set(t.id, t.name);
60
+ return e;
61
+ }, [H.data]), W = s(() => {
62
+ let e = /* @__PURE__ */ new Map();
63
+ for (let t of U.data?.cosListNotebooks.items ?? []) e.set(t.id, t.title);
64
+ return e;
65
+ }, [U.data]), [G, K] = c(null), q = (e) => {
66
+ K(null), N(e);
67
+ }, [J, Y] = c(null), [X, Z] = c(""), Q = (e) => {
51
68
  Z(e.doi ?? ""), Y(e);
52
- }, ge = async () => {
69
+ }, Te = async () => {
53
70
  if (!J) return;
54
71
  let e = X.trim();
55
- (await me({ variables: {
72
+ (await Se({ variables: {
56
73
  id: J.id,
57
74
  doi: e || void 0
58
- } })).data?.cosPublishRelease?.id && (t.success("Release published", `“${J.title}” is now public.`), Y(null), Z(""), await U());
59
- }, $ = /* @__PURE__ */ m(v, {
75
+ } })).data?.cosPublishRelease?.id && (t.success("Release published", `“${J.title}” is now public.`), Y(null), Z(""), await z());
76
+ }, $ = /* @__PURE__ */ d(g, {
60
77
  type: "button",
61
- onClick: () => I("releases/create"),
62
- children: [/* @__PURE__ */ p(ae, { className: "size-4" }), "New release"]
78
+ onClick: () => N("releases/create"),
79
+ children: [/* @__PURE__ */ u(m, { className: "size-4" }), "New release"]
63
80
  });
64
- return /* @__PURE__ */ m(re, {
81
+ return /* @__PURE__ */ d(oe, {
65
82
  title: "Releases",
66
83
  description: "Citable, versioned publications that bundle datasets and notebooks for the community.",
67
84
  actions: $,
68
85
  children: [
69
- /* @__PURE__ */ m("div", {
86
+ /* @__PURE__ */ d("div", {
70
87
  className: "space-y-4",
71
- children: [/* @__PURE__ */ p("div", {
88
+ children: [/* @__PURE__ */ u("div", {
72
89
  className: "flex flex-wrap items-center gap-3",
73
- children: /* @__PURE__ */ p("div", {
90
+ children: /* @__PURE__ */ u("div", {
74
91
  className: "w-full max-w-[14rem]",
75
- children: /* @__PURE__ */ m(ce, {
76
- value: L,
77
- onValueChange: R,
78
- children: [/* @__PURE__ */ p(ue, {
92
+ children: /* @__PURE__ */ d(he, {
93
+ value: P,
94
+ onValueChange: xe,
95
+ children: [/* @__PURE__ */ u(_e, {
79
96
  "aria-label": "Filter by status",
80
- children: /* @__PURE__ */ p(de, { placeholder: "All statuses" })
81
- }), /* @__PURE__ */ m(le, { children: [/* @__PURE__ */ p(E, {
82
- value: j,
97
+ children: /* @__PURE__ */ u(ve, { placeholder: "All statuses" })
98
+ }), /* @__PURE__ */ d(ge, { children: [/* @__PURE__ */ u(C, {
99
+ value: O,
83
100
  children: "All statuses"
84
- }), M.map((e) => /* @__PURE__ */ p(E, {
101
+ }), k.map((e) => /* @__PURE__ */ u(C, {
85
102
  value: e,
86
- children: l(e)
103
+ children: le(e)
87
104
  }, e))] })]
88
105
  })
89
106
  })
90
107
  }), (() => {
91
- if (V) return /* @__PURE__ */ p(ne, {
108
+ if (L) return /* @__PURE__ */ u(ae, {
92
109
  variant: "rows",
93
110
  rows: 6,
94
111
  label: "Loading releases…"
95
112
  });
96
- if (H) return /* @__PURE__ */ p(te, {
97
- message: H.message,
98
- onRetry: () => void U()
113
+ if (R) return /* @__PURE__ */ u(ie, {
114
+ message: R.message,
115
+ onRetry: () => void z()
99
116
  });
100
- if (G.length === 0) {
101
- let e = L !== j;
102
- return /* @__PURE__ */ p(ee, {
103
- icon: g,
117
+ if (V.length === 0) {
118
+ let e = P !== O;
119
+ return /* @__PURE__ */ u(re, {
120
+ icon: h,
104
121
  title: e ? "No releases match this filter" : "No releases yet",
105
122
  description: e ? "Try clearing the status filter to see more releases." : "Package datasets and notebooks into a citable, versioned release for publication.",
106
123
  action: e ? void 0 : $
107
124
  });
108
125
  }
109
- return /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("div", {
110
- className: "overflow-x-auto rounded-card border border-border-default bg-bg-elevated",
111
- children: /* @__PURE__ */ m(D, { children: [/* @__PURE__ */ p(pe, { children: /* @__PURE__ */ m(A, { children: [
112
- /* @__PURE__ */ p(k, { children: "Title" }),
113
- /* @__PURE__ */ p(k, { children: "Version" }),
114
- /* @__PURE__ */ p(k, { children: "Status" }),
115
- /* @__PURE__ */ p(k, { children: "DOI" }),
116
- /* @__PURE__ */ p(k, { children: "Authors" }),
117
- /* @__PURE__ */ p(k, { children: "Published" }),
118
- /* @__PURE__ */ p(k, { children: "License" }),
119
- /* @__PURE__ */ p(k, {
120
- className: "text-right",
121
- children: "Actions"
122
- })
123
- ] }) }), /* @__PURE__ */ p(fe, { children: G.map((e) => /* @__PURE__ */ m(A, { children: [
124
- /* @__PURE__ */ p(O, { children: /* @__PURE__ */ p("button", {
125
- type: "button",
126
- onClick: () => q(e),
127
- 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",
128
- children: e.title
129
- }) }),
130
- /* @__PURE__ */ p(O, {
131
- className: "whitespace-nowrap text-sm text-text-secondary",
132
- children: e.version || "—"
133
- }),
134
- /* @__PURE__ */ p(O, { children: /* @__PURE__ */ p(c, { status: e.status }) }),
135
- /* @__PURE__ */ p(O, {
136
- className: "max-w-[14rem]",
137
- children: e.doi ? /* @__PURE__ */ m(s, {
138
- href: F(e.doi),
139
- className: "inline-flex items-center gap-1 truncate text-sm text-text-primary underline-offset-2 hover:underline",
140
- fallbackClassName: "block truncate text-sm text-text-secondary",
141
- children: [/* @__PURE__ */ p("span", {
142
- className: "truncate",
143
- children: e.doi
144
- }), /* @__PURE__ */ p(h, {
145
- className: "size-3.5 shrink-0",
146
- "aria-hidden": "true"
147
- })]
148
- }) : /* @__PURE__ */ p("span", {
149
- className: "text-sm text-text-secondary",
150
- children: "—"
126
+ return /* @__PURE__ */ d(l, { children: [
127
+ /* @__PURE__ */ u("div", {
128
+ className: "hidden rounded-card border border-border-default bg-bg-elevated md:block",
129
+ children: /* @__PURE__ */ d(ye, { children: [/* @__PURE__ */ u(E, { children: /* @__PURE__ */ d(D, { children: [
130
+ /* @__PURE__ */ u(T, { children: "Title" }),
131
+ /* @__PURE__ */ u(T, { children: "Version" }),
132
+ /* @__PURE__ */ u(T, { children: "Status" }),
133
+ /* @__PURE__ */ u(T, { children: "DOI" }),
134
+ /* @__PURE__ */ u(T, { children: "Authors" }),
135
+ /* @__PURE__ */ u(T, { children: "Published" }),
136
+ /* @__PURE__ */ u(T, { children: "License" }),
137
+ /* @__PURE__ */ u(T, {
138
+ className: "text-right",
139
+ children: "Actions"
151
140
  })
152
- }),
153
- /* @__PURE__ */ p(O, {
154
- className: "max-w-[14rem]",
155
- children: e.authors.length === 0 ? /* @__PURE__ */ p("span", {
156
- className: "text-sm text-text-secondary",
157
- children: "—"
158
- }) : /* @__PURE__ */ p("span", {
159
- className: "line-clamp-1 text-sm text-text-secondary",
160
- children: e.authors.join(", ")
141
+ ] }) }), /* @__PURE__ */ u(be, { children: V.map((e) => /* @__PURE__ */ d(D, { children: [
142
+ /* @__PURE__ */ u(w, { children: /* @__PURE__ */ u("button", {
143
+ type: "button",
144
+ onClick: () => K(e),
145
+ 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",
146
+ children: e.title
147
+ }) }),
148
+ /* @__PURE__ */ u(w, {
149
+ className: "whitespace-nowrap text-sm text-text-secondary",
150
+ children: e.version || "—"
151
+ }),
152
+ /* @__PURE__ */ u(w, { children: /* @__PURE__ */ u(o, { status: e.status }) }),
153
+ /* @__PURE__ */ u(w, {
154
+ className: "max-w-[14rem]",
155
+ children: e.doi ? /* @__PURE__ */ d(i, {
156
+ href: M(e.doi),
157
+ className: "inline-flex items-center gap-1 truncate text-sm text-text-primary underline-offset-2 hover:underline",
158
+ fallbackClassName: "block truncate text-sm text-text-secondary",
159
+ children: [/* @__PURE__ */ u("span", {
160
+ className: "truncate",
161
+ children: e.doi
162
+ }), /* @__PURE__ */ u(f, {
163
+ className: "size-3.5 shrink-0",
164
+ "aria-hidden": "true"
165
+ })]
166
+ }) : /* @__PURE__ */ u("span", {
167
+ className: "text-sm text-text-secondary",
168
+ children: "—"
169
+ })
170
+ }),
171
+ /* @__PURE__ */ u(w, {
172
+ className: "max-w-[14rem]",
173
+ children: e.authors.length === 0 ? /* @__PURE__ */ u("span", {
174
+ className: "text-sm text-text-secondary",
175
+ children: "—"
176
+ }) : /* @__PURE__ */ u("span", {
177
+ className: "line-clamp-1 text-sm text-text-secondary",
178
+ children: e.authors.join(", ")
179
+ })
180
+ }),
181
+ /* @__PURE__ */ u(w, {
182
+ className: "whitespace-nowrap text-sm text-text-secondary",
183
+ children: j(e.publishedAt)
184
+ }),
185
+ /* @__PURE__ */ u(w, {
186
+ className: "whitespace-nowrap text-sm text-text-secondary",
187
+ children: e.license || "—"
188
+ }),
189
+ /* @__PURE__ */ u(w, {
190
+ className: "text-right",
191
+ children: /* @__PURE__ */ u(r, {
192
+ ariaLabel: `Actions for ${e.title}`,
193
+ onView: () => K(e),
194
+ extraItems: A(e.status) ? [{
195
+ key: "publish",
196
+ label: "Publish",
197
+ icon: h,
198
+ onSelect: () => Q(e)
199
+ }] : []
200
+ })
161
201
  })
162
- }),
163
- /* @__PURE__ */ p(O, {
164
- className: "whitespace-nowrap text-sm text-text-secondary",
165
- children: P(e.publishedAt)
166
- }),
167
- /* @__PURE__ */ p(O, {
168
- className: "whitespace-nowrap text-sm text-text-secondary",
169
- children: e.license || "—"
170
- }),
171
- /* @__PURE__ */ p(O, {
172
- className: "text-right",
173
- children: /* @__PURE__ */ p(i, {
174
- ariaLabel: `Actions for ${e.title}`,
175
- onView: () => q(e),
176
- extraItems: N(e.status) ? [{
177
- key: "publish",
178
- label: "Publish",
179
- icon: g,
180
- onSelect: () => Q(e)
181
- }] : []
202
+ ] }, e.id)) })] })
203
+ }),
204
+ /* @__PURE__ */ u("ul", {
205
+ className: "space-y-3 md:hidden",
206
+ children: V.map((e) => /* @__PURE__ */ u("li", {
207
+ className: "rounded-card border border-border-default bg-bg-elevated",
208
+ children: /* @__PURE__ */ d("div", {
209
+ className: "flex items-start justify-between gap-2 p-4",
210
+ children: [/* @__PURE__ */ d("div", {
211
+ className: "min-w-0 flex-1 space-y-2",
212
+ children: [
213
+ /* @__PURE__ */ d("div", {
214
+ className: "flex flex-wrap items-center gap-2",
215
+ children: [/* @__PURE__ */ u("button", {
216
+ type: "button",
217
+ onClick: () => K(e),
218
+ className: "truncate text-left font-medium text-text-primary underline-offset-2 hover:underline",
219
+ children: e.title
220
+ }), /* @__PURE__ */ u(o, { status: e.status })]
221
+ }),
222
+ /* @__PURE__ */ d("div", {
223
+ className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary",
224
+ children: [
225
+ /* @__PURE__ */ u("span", { children: e.version || "v—" }),
226
+ e.license ? /* @__PURE__ */ u("span", { children: e.license }) : null,
227
+ /* @__PURE__ */ u("span", { children: j(e.publishedAt) })
228
+ ]
229
+ }),
230
+ e.authors.length > 0 ? /* @__PURE__ */ u("p", {
231
+ className: "line-clamp-1 text-xs text-text-secondary",
232
+ children: e.authors.join(", ")
233
+ }) : null,
234
+ e.doi ? /* @__PURE__ */ d(i, {
235
+ href: M(e.doi),
236
+ className: "inline-flex items-center gap-1 text-xs text-text-primary underline-offset-2 hover:underline",
237
+ fallbackClassName: "block truncate text-xs text-text-secondary",
238
+ children: [/* @__PURE__ */ d("span", {
239
+ className: "truncate",
240
+ children: ["DOI: ", e.doi]
241
+ }), /* @__PURE__ */ u(f, {
242
+ className: "size-3 shrink-0",
243
+ "aria-hidden": "true"
244
+ })]
245
+ }) : null
246
+ ]
247
+ }), /* @__PURE__ */ u(r, {
248
+ ariaLabel: `Actions for ${e.title}`,
249
+ onView: () => K(e),
250
+ extraItems: A(e.status) ? [{
251
+ key: "publish",
252
+ label: "Publish",
253
+ icon: h,
254
+ onSelect: () => Q(e)
255
+ }] : []
256
+ })]
182
257
  })
183
- })
184
- ] }, e.id)) })] })
185
- }), /* @__PURE__ */ p(a, {
186
- offset: z.offset,
187
- limit: z.limit,
188
- loadedCount: G.length,
189
- hasMore: he?.hasMore ?? !1,
190
- onPrev: z.prevPage,
191
- onNext: z.nextPage,
192
- itemLabel: "releases",
193
- loading: V
194
- })] });
258
+ }, e.id))
259
+ }),
260
+ /* @__PURE__ */ u(se, {
261
+ offset: F.offset,
262
+ limit: F.limit,
263
+ loadedCount: V.length,
264
+ hasMore: Ce?.hasMore ?? !1,
265
+ onPrev: F.prevPage,
266
+ onNext: F.nextPage,
267
+ itemLabel: "releases",
268
+ loading: L
269
+ })
270
+ ] });
195
271
  })()]
196
272
  }),
197
- /* @__PURE__ */ p(y, {
198
- open: K !== null,
199
- onOpenChange: (e) => e ? void 0 : q(null),
200
- children: /* @__PURE__ */ p(x, {
201
- className: "max-w-lg",
202
- children: K ? /* @__PURE__ */ m(f, { children: [
203
- /* @__PURE__ */ m(w, { children: [/* @__PURE__ */ m(T, {
273
+ /* @__PURE__ */ u(_, {
274
+ open: G !== null,
275
+ onOpenChange: (e) => e ? void 0 : K(null),
276
+ children: /* @__PURE__ */ u(v, {
277
+ className: "max-h-[85vh] max-w-lg overflow-y-auto",
278
+ children: G ? /* @__PURE__ */ d(l, { children: [
279
+ /* @__PURE__ */ d(x, { children: [/* @__PURE__ */ d(S, {
204
280
  className: "flex items-center gap-2",
205
- children: [/* @__PURE__ */ p(ie, {
281
+ children: [/* @__PURE__ */ u(ue, {
206
282
  className: "size-5 text-text-secondary",
207
283
  "aria-hidden": "true"
208
- }), K.title]
209
- }), /* @__PURE__ */ m(S, { children: [
284
+ }), G.title]
285
+ }), /* @__PURE__ */ d(y, { children: [
210
286
  "Version ",
211
- K.version || "—",
287
+ G.version || "—",
212
288
  " · ",
213
- /* @__PURE__ */ p(c, { status: K.status })
289
+ /* @__PURE__ */ u(o, { status: G.status })
214
290
  ] })] }),
215
- /* @__PURE__ */ m("div", {
291
+ /* @__PURE__ */ d("div", {
216
292
  className: "space-y-4 text-sm",
217
293
  children: [
218
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
294
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
219
295
  className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
220
296
  children: "Abstract"
221
- }), /* @__PURE__ */ p("p", {
297
+ }), /* @__PURE__ */ u("p", {
222
298
  className: "mt-1 whitespace-pre-wrap text-text-primary",
223
- children: K.abstract?.trim() || "No abstract provided."
299
+ children: G.abstract?.trim() || "No abstract provided."
224
300
  })] }),
225
- /* @__PURE__ */ m("div", {
301
+ /* @__PURE__ */ d("div", {
226
302
  className: "grid grid-cols-2 gap-4",
227
303
  children: [
228
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
304
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
229
305
  className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
230
306
  children: "Authors"
231
- }), /* @__PURE__ */ p("p", {
307
+ }), /* @__PURE__ */ u("p", {
232
308
  className: "mt-1 text-text-primary",
233
- children: K.authors.length ? K.authors.join(", ") : "—"
309
+ children: G.authors.length ? G.authors.join(", ") : "—"
234
310
  })] }),
235
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
311
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
236
312
  className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
237
313
  children: "License"
238
- }), /* @__PURE__ */ p("p", {
314
+ }), /* @__PURE__ */ u("p", {
239
315
  className: "mt-1 text-text-primary",
240
- children: K.license || "—"
316
+ children: G.license || "—"
241
317
  })] }),
242
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
318
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
243
319
  className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
244
320
  children: "Published"
245
- }), /* @__PURE__ */ p("p", {
321
+ }), /* @__PURE__ */ u("p", {
246
322
  className: "mt-1 text-text-primary",
247
- children: P(K.publishedAt)
323
+ children: j(G.publishedAt)
248
324
  })] }),
249
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
325
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
250
326
  className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
251
327
  children: "DOI"
252
- }), /* @__PURE__ */ p("p", {
328
+ }), /* @__PURE__ */ u("p", {
253
329
  className: "mt-1",
254
- children: K.doi ? /* @__PURE__ */ m(s, {
255
- href: F(K.doi),
330
+ children: G.doi ? /* @__PURE__ */ d(i, {
331
+ href: M(G.doi),
256
332
  className: "inline-flex items-center gap-1 text-text-primary underline-offset-2 hover:underline",
257
333
  fallbackClassName: "text-text-secondary",
258
- children: [K.doi, /* @__PURE__ */ p(h, {
334
+ children: [G.doi, /* @__PURE__ */ u(f, {
259
335
  className: "size-3.5",
260
336
  "aria-hidden": "true"
261
337
  })]
262
- }) : /* @__PURE__ */ p("span", {
338
+ }) : /* @__PURE__ */ u("span", {
263
339
  className: "text-text-secondary",
264
340
  children: "Not assigned"
265
341
  })
266
342
  })] })
267
343
  ]
268
344
  }),
269
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ m("p", {
345
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ d("p", {
270
346
  className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
271
347
  children: [
272
348
  "Datasets (",
273
- K.datasetIds.length,
349
+ G.datasetIds.length,
274
350
  ")"
275
351
  ]
276
- }), /* @__PURE__ */ p("div", {
277
- className: "mt-1 flex flex-wrap gap-1",
278
- children: K.datasetIds.length === 0 ? /* @__PURE__ */ p("span", {
352
+ }), /* @__PURE__ */ u("div", {
353
+ className: "mt-1 flex flex-wrap gap-1.5",
354
+ children: G.datasetIds.length === 0 ? /* @__PURE__ */ u("span", {
279
355
  className: "text-text-secondary",
280
356
  children: "None linked."
281
- }) : K.datasetIds.map((e) => /* @__PURE__ */ p(_, {
282
- variant: "outline",
283
- className: "font-mono text-xs",
284
- children: e
285
- }, e))
357
+ }) : G.datasetIds.map((e) => {
358
+ let t = we.get(e);
359
+ return /* @__PURE__ */ d(g, {
360
+ type: "button",
361
+ variant: "outline",
362
+ size: "sm",
363
+ className: "h-auto gap-1 px-2 py-1",
364
+ onClick: () => q(`datasets/${e}`),
365
+ children: [/* @__PURE__ */ u(de, {
366
+ className: "size-3.5",
367
+ "aria-hidden": "true"
368
+ }), /* @__PURE__ */ u("span", {
369
+ className: t ? "" : "font-mono text-xs",
370
+ children: t ?? e
371
+ })]
372
+ }, e);
373
+ })
286
374
  })] }),
287
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
375
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
288
376
  className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
289
377
  children: "Notebook"
290
- }), /* @__PURE__ */ p("p", {
378
+ }), /* @__PURE__ */ u("div", {
291
379
  className: "mt-1",
292
- children: K.notebookId ? /* @__PURE__ */ p(_, {
380
+ children: G.notebookId ? /* @__PURE__ */ d(g, {
381
+ type: "button",
293
382
  variant: "outline",
294
- className: "font-mono text-xs",
295
- children: K.notebookId
296
- }) : /* @__PURE__ */ p("span", {
383
+ size: "sm",
384
+ className: "h-auto gap-1 px-2 py-1",
385
+ onClick: () => q(`notebooks/${G.notebookId}`),
386
+ children: [/* @__PURE__ */ u(p, {
387
+ className: "size-3.5",
388
+ "aria-hidden": "true"
389
+ }), /* @__PURE__ */ u("span", {
390
+ className: W.get(G.notebookId) ? "" : "font-mono text-xs",
391
+ children: W.get(G.notebookId) ?? G.notebookId
392
+ })]
393
+ }) : /* @__PURE__ */ u("span", {
297
394
  className: "text-text-secondary",
298
395
  children: "None linked."
299
396
  })
397
+ })] }),
398
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("p", {
399
+ className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
400
+ children: "Discussion"
401
+ }), /* @__PURE__ */ u("div", {
402
+ className: "mt-2",
403
+ children: /* @__PURE__ */ u(a, {
404
+ entityType: "cosmicintersection-release",
405
+ entityId: G.id,
406
+ title: G.title,
407
+ widgetKey: "release-discussion"
408
+ })
300
409
  })] })
301
410
  ]
302
411
  }),
303
- /* @__PURE__ */ m(C, { children: [N(K.status) ? /* @__PURE__ */ m(v, {
412
+ /* @__PURE__ */ d(b, { children: [A(G.status) ? /* @__PURE__ */ d(g, {
304
413
  type: "button",
305
414
  onClick: () => {
306
- let e = K;
307
- q(null), Q(e);
415
+ let e = G;
416
+ K(null), Q(e);
308
417
  },
309
- children: [/* @__PURE__ */ p(g, { className: "size-4" }), "Publish"]
310
- }) : null, /* @__PURE__ */ p(b, {
418
+ children: [/* @__PURE__ */ u(h, { className: "size-4" }), "Publish"]
419
+ }) : null, /* @__PURE__ */ u(fe, {
311
420
  asChild: !0,
312
- children: /* @__PURE__ */ p(v, {
421
+ children: /* @__PURE__ */ u(g, {
313
422
  type: "button",
314
423
  variant: "outline",
315
424
  children: "Close"
@@ -318,43 +427,76 @@ function I() {
318
427
  ] }) : null
319
428
  })
320
429
  }),
321
- /* @__PURE__ */ p(y, {
430
+ /* @__PURE__ */ u(_, {
322
431
  open: J !== null,
323
- onOpenChange: (e) => e || W ? void 0 : Y(null),
324
- children: /* @__PURE__ */ m(x, {
432
+ onOpenChange: (e) => e || B ? void 0 : Y(null),
433
+ children: /* @__PURE__ */ d(v, {
325
434
  className: "max-w-md",
326
435
  children: [
327
- /* @__PURE__ */ m(w, { children: [/* @__PURE__ */ p(T, { children: "Publish release" }), /* @__PURE__ */ p(S, { children: J ? `Publish “${J.title}” to make it publicly citable. You can attach a DOI now or later.` : "" })] }),
328
- /* @__PURE__ */ m("div", {
436
+ /* @__PURE__ */ d(x, { children: [/* @__PURE__ */ u(S, { children: "Publish release" }), /* @__PURE__ */ u(y, { children: J ? `Publish “${J.title}” to make it publicly citable. You can attach a DOI now or later.` : "" })] }),
437
+ J ? /* @__PURE__ */ d("dl", {
438
+ className: "grid grid-cols-3 gap-x-4 gap-y-3 rounded-card border border-border-default bg-bg-sunken p-3",
439
+ children: [
440
+ /* @__PURE__ */ d("div", {
441
+ className: "col-span-2 min-w-0",
442
+ children: [/* @__PURE__ */ u("dt", {
443
+ className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
444
+ children: "Authors"
445
+ }), /* @__PURE__ */ u("dd", {
446
+ className: "mt-0.5 truncate text-sm text-text-primary",
447
+ title: J.authors.join(", "),
448
+ children: J.authors.length ? J.authors.join(", ") : "—"
449
+ })]
450
+ }),
451
+ /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("dt", {
452
+ className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
453
+ children: "Datasets"
454
+ }), /* @__PURE__ */ u("dd", {
455
+ className: "mt-0.5 text-sm tabular-nums text-text-primary",
456
+ children: J.datasetIds.length
457
+ })] }),
458
+ /* @__PURE__ */ d("div", {
459
+ className: "col-span-3 min-w-0",
460
+ children: [/* @__PURE__ */ u("dt", {
461
+ className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
462
+ children: "License"
463
+ }), /* @__PURE__ */ u("dd", {
464
+ className: "mt-0.5 truncate text-sm text-text-primary",
465
+ children: J.license || "—"
466
+ })]
467
+ })
468
+ ]
469
+ }) : null,
470
+ /* @__PURE__ */ d("div", {
329
471
  className: "space-y-2",
330
472
  children: [
331
- /* @__PURE__ */ p(se, {
473
+ /* @__PURE__ */ u(me, {
332
474
  htmlFor: "release-doi",
333
475
  children: "DOI (optional)"
334
476
  }),
335
- /* @__PURE__ */ p(oe, {
477
+ /* @__PURE__ */ u(pe, {
336
478
  id: "release-doi",
337
479
  value: X,
338
480
  onChange: (e) => Z(e.target.value),
339
481
  placeholder: "10.1234/cosmic.2026.0001"
340
482
  }),
341
- /* @__PURE__ */ p("p", {
483
+ /* @__PURE__ */ u("p", {
342
484
  className: "text-xs text-text-secondary",
343
485
  children: "A Digital Object Identifier makes the release permanently referenceable."
344
486
  })
345
487
  ]
346
488
  }),
347
- /* @__PURE__ */ m(C, { children: [/* @__PURE__ */ p(v, {
489
+ /* @__PURE__ */ d(b, { children: [/* @__PURE__ */ u(g, {
348
490
  type: "button",
349
491
  variant: "outline",
350
492
  onClick: () => Y(null),
351
- disabled: W,
493
+ disabled: B,
352
494
  children: "Cancel"
353
- }), /* @__PURE__ */ m(v, {
495
+ }), /* @__PURE__ */ d(g, {
354
496
  type: "button",
355
- onClick: () => void ge(),
356
- disabled: W,
357
- children: [/* @__PURE__ */ p(g, { className: "size-4" }), W ? "Publishing…" : "Publish release"]
497
+ onClick: () => void Te(),
498
+ disabled: B,
499
+ children: [/* @__PURE__ */ u(h, { className: "size-4" }), B ? "Publishing…" : "Publish release"]
358
500
  })] })
359
501
  ]
360
502
  })
@@ -363,6 +505,6 @@ function I() {
363
505
  });
364
506
  }
365
507
  //#endregion
366
- export { I as default };
508
+ export { N as default };
367
509
 
368
510
  //# sourceMappingURL=ReleasesPage.js.map