@burdenoff/microfe-cosmicintersection 2026.704.2 → 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 (50) hide show
  1. package/dist/cosmicintersection/CosmicIntersectionRoutes.js +39 -27
  2. package/dist/cosmicintersection/CosmicIntersectionRoutes.js.map +1 -1
  3. package/dist/cosmicintersection/api/cosmicApi.js +6 -0
  4. package/dist/cosmicintersection/api/cosmicApi.js.map +1 -1
  5. package/dist/cosmicintersection/components/FacetPanel.js +66 -0
  6. package/dist/cosmicintersection/components/FacetPanel.js.map +1 -0
  7. package/dist/cosmicintersection/components/LineageGraph.js +388 -0
  8. package/dist/cosmicintersection/components/LineageGraph.js.map +1 -0
  9. package/dist/cosmicintersection/components/ResultsChart.js +329 -0
  10. package/dist/cosmicintersection/components/ResultsChart.js.map +1 -0
  11. package/dist/cosmicintersection/components/StepDAG.js +104 -0
  12. package/dist/cosmicintersection/components/StepDAG.js.map +1 -0
  13. package/dist/cosmicintersection/pages/access/AccessPage.js +207 -155
  14. package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -1
  15. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +325 -165
  16. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -1
  17. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js +138 -93
  18. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js.map +1 -1
  19. package/dist/cosmicintersection/pages/collections/CollectionFormPage.js.map +1 -1
  20. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +26 -15
  21. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -1
  22. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +345 -219
  23. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -1
  24. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +321 -163
  25. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -1
  26. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js +358 -0
  27. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js.map +1 -0
  28. package/dist/cosmicintersection/pages/lineage/LineagePage.js +171 -0
  29. package/dist/cosmicintersection/pages/lineage/LineagePage.js.map +1 -0
  30. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js +232 -162
  31. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js.map +1 -1
  32. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +143 -82
  33. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -1
  34. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js +286 -142
  35. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js.map +1 -1
  36. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js +305 -103
  37. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js.map +1 -1
  38. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +183 -79
  39. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -1
  40. package/dist/cosmicintersection/pages/releases/ReleasesPage.js +262 -170
  41. package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -1
  42. package/dist/cosmicintersection/pages/runs/RunDetailPage.js +179 -136
  43. package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -1
  44. package/dist/cosmicintersection/pages/runs/RunsPage.js +124 -47
  45. package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -1
  46. package/dist/cosmicintersection/pages/sources/SourceDetailPage.js +114 -85
  47. package/dist/cosmicintersection/pages/sources/SourceDetailPage.js.map +1 -1
  48. package/dist/cosmicintersection/pages/sources/SourcesPage.js +263 -152
  49. package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -1
  50. package/package.json +1 -1
@@ -1,24 +1,25 @@
1
1
  import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
2
2
  import { notify as t } from "../../lib/toast.js";
3
- import { useCosAddSchemaFieldMutation as n, useCosArchiveDatasetMutation as r, useCosDatasetQuery as i, useCosPublishDatasetMutation as a, useCosUpdateDatasetMutation as ee } from "../../api/cosmicApi.js";
4
- import te from "../../components/ActionMenu.js";
5
- import o from "../../components/EmptyState.js";
6
- import ne from "../../components/ErrorState.js";
7
- import re from "../../components/LoadingState.js";
8
- import ie from "../../components/ActivityFeedPanel.js";
9
- import ae from "../../components/DiscussionPanel.js";
10
- import oe from "../../components/EntityTagsField.js";
11
- import { useFileDownloadUrl as s } from "../../components/FileUploadField.js";
12
- import c from "../../components/PageLayout.js";
13
- import l, { formatEnumLabel as u } from "../../components/StatusBadge.js";
3
+ import { useCosAddSchemaFieldMutation as n, useCosAnalysesQuery as r, useCosArchiveDatasetMutation as i, useCosDatasetQuery as ee, useCosNotebooksQuery as te, useCosPublishDatasetMutation as ne, useCosReleasesQuery as re, useCosRunsQuery as ie, useCosUpdateDatasetMutation as ae } from "../../api/cosmicApi.js";
4
+ import oe from "../../components/ActionMenu.js";
5
+ import a from "../../components/EmptyState.js";
6
+ import se from "../../components/ErrorState.js";
7
+ import o from "../../components/LoadingState.js";
8
+ import ce from "../../components/ActivityFeedPanel.js";
9
+ import le from "../../components/DiscussionPanel.js";
10
+ import ue from "../../components/EntityTagsField.js";
11
+ import { useFileDownloadUrl as de } from "../../components/FileUploadField.js";
12
+ import s from "../../components/PageLayout.js";
13
+ import c, { formatEnumLabel as l } from "../../components/StatusBadge.js";
14
14
  import "../../components/index.js";
15
- import { useState as d } from "react";
16
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
17
- import { useParams as se } from "react-router-dom";
18
- import { Boxes as ce, Columns3 as m, Database as le, Download as ue, History as de, MessagesSquare as fe, Pencil as pe, Plus as h, Radar as me } from "lucide-react";
19
- import { Badge as g, Button as _, Checkbox as he, Dialog as ge, DialogContent as _e, DialogDescription as ve, DialogFooter as ye, DialogHeader as be, DialogTitle as xe, Input as v, Label as y, Select as Se, SelectContent as Ce, SelectItem as we, SelectTrigger as Te, SelectValue as Ee, Table as De, TableBody as Oe, TableCell as b, TableHead as x, TableHeader as S, TableRow as C, Textarea as w } from "@burdenoff/fe-libs/ui";
15
+ import fe, { buildDatasetLineage as pe } from "../../components/LineageGraph.js";
16
+ import { useMemo as me, useState as u } from "react";
17
+ import { Fragment as he, jsx as d, jsxs as f } from "react/jsx-runtime";
18
+ import { useParams as ge } from "react-router-dom";
19
+ import { ArrowRight as _e, Boxes as ve, Columns3 as p, Database as ye, Download as be, GitBranch as xe, History as Se, MessagesSquare as Ce, Pencil as we, Plus as Te, Radar as Ee, Share2 as De } from "lucide-react";
20
+ import { Badge as m, Button as h, Checkbox as Oe, Dialog as ke, DialogContent as Ae, DialogDescription as je, DialogFooter as Me, DialogHeader as Ne, DialogTitle as Pe, Input as g, Label as _, Select as Fe, SelectContent as Ie, SelectItem as Le, SelectTrigger as Re, SelectValue as ze, Table as Be, TableBody as Ve, TableCell as v, TableHead as y, TableHeader as He, TableRow as b, Textarea as Ue } from "@burdenoff/fe-libs/ui";
20
21
  //#region src/cosmicintersection/pages/datasets/DatasetDetailPage.tsx
21
- var T = [
22
+ var We = [
22
23
  "STRING",
23
24
  "INTEGER",
24
25
  "FLOAT",
@@ -30,7 +31,7 @@ var T = [
30
31
  "IMAGE_REF",
31
32
  "JSON"
32
33
  ];
33
- function ke(e) {
34
+ function Ge(e) {
34
35
  if (!e) return "—";
35
36
  let t = Number(e);
36
37
  if (!Number.isFinite(t) || t <= 0) return "—";
@@ -45,436 +46,561 @@ function ke(e) {
45
46
  for (; r >= 1024 && i < n.length - 1;) r /= 1024, i += 1;
46
47
  return `${r >= 10 || i === 0 ? Math.round(r) : r.toFixed(1)} ${n[i]}`;
47
48
  }
48
- function E(e) {
49
+ function x(e) {
49
50
  if (!e) return "—";
50
51
  let t = new Date(e);
51
52
  return Number.isNaN(t.getTime()) ? "—" : t.toLocaleString();
52
53
  }
53
- function D({ label: e, value: t }) {
54
- return /* @__PURE__ */ p("div", {
54
+ function S({ label: e, value: t }) {
55
+ return /* @__PURE__ */ f("div", {
55
56
  className: "rounded-card border border-border-default bg-bg-elevated p-4",
56
- children: [/* @__PURE__ */ f("p", {
57
+ children: [/* @__PURE__ */ d("p", {
57
58
  className: "text-xs font-medium uppercase tracking-wide text-text-secondary",
58
59
  children: e
59
- }), /* @__PURE__ */ f("div", {
60
+ }), /* @__PURE__ */ d("div", {
60
61
  className: "mt-1 text-sm text-text-primary",
61
62
  children: t
62
63
  })]
63
64
  });
64
65
  }
65
- function O() {
66
- let { id: O = "" } = se(), { navigate: k } = e(), { data: Ae, loading: je, error: Me, refetch: A } = i(O), j = Ae?.cosDataset ?? null, M = s(j?.file?.id).data?.getFileDownloadUrl ?? null, [Ne, { loading: N }] = a(), [Pe] = r(), [Fe, { loading: P }] = ee(), [Ie, { loading: F }] = n(), [I, L] = d([]), [Le, Re] = d(null), R = j ? `${j.id}:${j.updatedAt}` : null;
67
- R && R !== Le && (Re(R), L(j?.tags ?? []));
68
- let ze = j != null && (I.length !== j.tags.length || I.some((e, t) => e !== j.tags[t])), [Be, Ve] = d(!1), [z, B] = d(""), [V, H] = d("STRING"), [U, W] = d(""), [G, K] = d(""), [q, J] = d(""), [Y, X] = d(!0), He = () => {
69
- B(""), H("STRING"), W(""), K(""), J(""), X(!0);
70
- }, Z = (e) => {
71
- Ve(e), e || He();
66
+ function C() {
67
+ let { id: C = "" } = ge(), { navigate: w } = e(), { data: T, loading: Ke, error: qe, refetch: E } = ee(C), D = T?.cosDataset ?? null, O = de(D?.file?.id).data?.getFileDownloadUrl ?? null, [Je, { loading: Ye }] = ne(), [Xe] = i(), [Ze, { loading: k }] = ae(), [Qe, { loading: A }] = n(), j = r({ datasetId: C }), M = ie({ pagination: {
68
+ limit: 100,
69
+ offset: 0
70
+ } }), N = te({ pagination: {
71
+ limit: 100,
72
+ offset: 0
73
+ } }), P = re({ pagination: {
74
+ limit: 100,
75
+ offset: 0
76
+ } }), F = T?.cosDataset ?? null, I = me(() => {
77
+ if (!F) return {
78
+ nodes: [],
79
+ edges: []
80
+ };
81
+ let e = /* @__PURE__ */ new Map();
82
+ F.source && e.set(F.source.id, F.source);
83
+ let t = /* @__PURE__ */ new Map();
84
+ F.collection && t.set(F.collection.id, F.collection);
85
+ let n = {
86
+ datasetsById: new Map([[F.id, F]]),
87
+ sourcesById: e,
88
+ collectionsById: t,
89
+ runs: (M.data?.cosListRuns?.items ?? []).filter((e) => e.datasetId === F.id),
90
+ notebooks: (N.data?.cosListNotebooks?.items ?? []).filter((e) => e.datasetIds.includes(F.id)),
91
+ analyses: j.data?.cosListAnalyses ?? [],
92
+ releases: (P.data?.cosListReleases?.items ?? []).filter((e) => e.datasetIds.includes(F.id))
93
+ };
94
+ return pe(F.id, n);
95
+ }, [
96
+ F,
97
+ M.data,
98
+ N.data,
99
+ j.data,
100
+ P.data
101
+ ]), $e = M.loading || N.loading || j.loading || P.loading, [L, R] = u([]), [et, tt] = u(null), z = D ? `${D.id}:${D.updatedAt}` : null;
102
+ z && z !== et && (tt(z), R(D?.tags ?? []));
103
+ let nt = D != null && (L.length !== D.tags.length || L.some((e, t) => e !== D.tags[t])), [rt, it] = u(!1), [B, V] = u(""), [H, U] = u("STRING"), [W, G] = u(""), [K, q] = u(""), [J, Y] = u(""), [X, Z] = u(!0), at = () => {
104
+ V(""), U("STRING"), G(""), q(""), Y(""), Z(!0);
105
+ }, Q = (e) => {
106
+ it(e), e || at();
72
107
  };
73
- if (je) return /* @__PURE__ */ f(c, {
108
+ if (Ke) return /* @__PURE__ */ d(s, {
74
109
  title: "Dataset",
75
110
  backPath: "datasets",
76
- children: /* @__PURE__ */ f(re, { label: "Loading dataset…" })
111
+ children: /* @__PURE__ */ d(o, { label: "Loading dataset…" })
77
112
  });
78
- if (Me) return /* @__PURE__ */ f(c, {
113
+ if (qe) return /* @__PURE__ */ d(s, {
79
114
  title: "Dataset",
80
115
  backPath: "datasets",
81
- children: /* @__PURE__ */ f(ne, {
116
+ children: /* @__PURE__ */ d(se, {
82
117
  message: "We could not load this dataset.",
83
- onRetry: () => void A()
118
+ onRetry: () => void E()
84
119
  })
85
120
  });
86
- if (!j) return /* @__PURE__ */ f(c, {
121
+ if (!D) return /* @__PURE__ */ d(s, {
87
122
  title: "Dataset",
88
123
  backPath: "datasets",
89
- children: /* @__PURE__ */ f(o, {
90
- icon: le,
124
+ children: /* @__PURE__ */ d(a, {
125
+ icon: ye,
91
126
  title: "Dataset not found.",
92
127
  description: "This dataset may have been removed or is outside your current scope.",
93
- action: /* @__PURE__ */ f(_, {
128
+ action: /* @__PURE__ */ d(h, {
94
129
  type: "button",
95
- onClick: () => k("datasets"),
130
+ onClick: () => w("datasets"),
96
131
  children: "Back to datasets"
97
132
  })
98
133
  })
99
134
  });
100
- let Q = [...j.schemaFields ?? []].sort((e, t) => e.position - t.position), Ue = j.status !== "AVAILABLE" && j.status !== "ARCHIVED", $ = async () => {
101
- (await Ne({ variables: { id: j.id } })).data?.cosPublishDataset && (t.success("Dataset published", `“${j.name}” is now available.`), await A());
102
- }, We = async () => {
103
- let e = await Pe({ variables: { id: j.id } });
135
+ let $ = [...D.schemaFields ?? []].sort((e, t) => e.position - t.position), ot = D.status !== "AVAILABLE" && D.status !== "ARCHIVED", st = async () => {
136
+ (await Je({ variables: { id: D.id } })).data?.cosPublishDataset && (t.success("Dataset published", `“${D.name}” is now available.`), await E());
137
+ }, ct = async () => {
138
+ let e = await Xe({ variables: { id: D.id } });
104
139
  if (e.error) throw Error(e.error.message);
105
140
  if (!e.data?.cosArchiveDataset) throw t.error("Could not archive dataset", "The server did not confirm the change."), Error("Archive not confirmed");
106
- t.success("Dataset archived"), k("datasets");
107
- }, Ge = async () => {
108
- (await Fe({ variables: {
109
- id: j.id,
110
- input: { tags: I }
111
- } })).data?.cosUpdateDataset && (t.success("Tags updated"), await A());
112
- }, Ke = async () => {
113
- if (!z.trim()) {
141
+ t.success("Dataset archived"), w("datasets");
142
+ }, lt = async () => {
143
+ (await Ze({ variables: {
144
+ id: D.id,
145
+ input: { tags: L }
146
+ } })).data?.cosUpdateDataset && (t.success("Tags updated"), await E());
147
+ }, ut = async () => {
148
+ if (!B.trim()) {
114
149
  t.error("Field name is required");
115
150
  return;
116
151
  }
117
- (await Ie({ variables: { input: {
118
- datasetId: j.id,
119
- name: z.trim(),
120
- fieldType: V,
121
- unit: U.trim() || void 0,
122
- description: G.trim() || void 0,
123
- provenance: q.trim() || void 0,
124
- nullable: Y
125
- } } })).data?.cosAddSchemaField && (t.success("Schema field added"), Z(!1), await A());
152
+ (await Qe({ variables: { input: {
153
+ datasetId: D.id,
154
+ name: B.trim(),
155
+ fieldType: H,
156
+ unit: W.trim() || void 0,
157
+ description: K.trim() || void 0,
158
+ provenance: J.trim() || void 0,
159
+ nullable: X
160
+ } } })).data?.cosAddSchemaField && (t.success("Schema field added"), Q(!1), await E());
126
161
  };
127
- return /* @__PURE__ */ p(c, {
128
- title: j.name,
129
- description: j.description ?? void 0,
162
+ return /* @__PURE__ */ f(s, {
163
+ title: D.name,
164
+ description: D.description ?? void 0,
130
165
  backPath: "datasets",
131
- actions: /* @__PURE__ */ p("div", {
132
- className: "flex items-center gap-2",
166
+ actions: /* @__PURE__ */ f("div", {
167
+ className: "flex flex-wrap items-center justify-end gap-2",
133
168
  children: [
134
- /* @__PURE__ */ p(_, {
169
+ /* @__PURE__ */ f(h, {
135
170
  type: "button",
136
171
  variant: "outline",
137
- onClick: () => k(`datasets/${j.id}/edit`),
138
- children: [/* @__PURE__ */ f(pe, { className: "size-4" }), "Edit"]
172
+ onClick: () => w(`datasets/${D.id}/edit`),
173
+ children: [/* @__PURE__ */ d(we, { className: "size-4" }), "Edit"]
139
174
  }),
140
- Ue ? /* @__PURE__ */ f(_, {
175
+ ot ? /* @__PURE__ */ d(h, {
141
176
  type: "button",
142
- onClick: () => void $(),
143
- disabled: N,
144
- children: N ? "Publishing…" : "Publish"
177
+ onClick: () => void st(),
178
+ disabled: Ye,
179
+ children: Ye ? "Publishing…" : "Publish"
145
180
  }) : null,
146
- /* @__PURE__ */ f(te, {
147
- ariaLabel: `Actions for ${j.name}`,
148
- entityName: j.name,
149
- onDelete: () => We(),
181
+ /* @__PURE__ */ d(oe, {
182
+ ariaLabel: `Actions for ${D.name}`,
183
+ entityName: D.name,
184
+ onDelete: () => ct(),
150
185
  deleteLabel: "Archive dataset"
151
186
  })
152
187
  ]
153
188
  }),
154
- children: [/* @__PURE__ */ p("div", {
189
+ children: [/* @__PURE__ */ f("div", {
155
190
  className: "space-y-6",
156
191
  children: [
157
- /* @__PURE__ */ p("div", {
192
+ /* @__PURE__ */ f("div", {
158
193
  className: "flex flex-wrap items-center gap-2",
159
194
  children: [
160
- /* @__PURE__ */ f(l, { status: j.status }),
161
- /* @__PURE__ */ f(l, {
162
- status: j.accessLevel,
163
- label: u(j.accessLevel)
195
+ /* @__PURE__ */ d(c, { status: D.status }),
196
+ /* @__PURE__ */ d(c, {
197
+ status: D.accessLevel,
198
+ label: l(D.accessLevel)
164
199
  }),
165
- j.lineageCaptured ? /* @__PURE__ */ f(g, {
166
- variant: "secondary",
167
- children: "Lineage captured"
168
- }) : null,
169
- /* @__PURE__ */ p(g, {
170
- variant: "secondary",
171
- children: ["v", j.version]
200
+ /* @__PURE__ */ f("span", {
201
+ className: "inline-flex items-center gap-1.5 rounded-full border border-border-default bg-bg-elevated px-2.5 py-0.5 text-xs font-medium",
202
+ title: "Current dataset version",
203
+ children: [
204
+ /* @__PURE__ */ d(xe, {
205
+ className: "size-3.5 text-text-tertiary",
206
+ "aria-hidden": "true"
207
+ }),
208
+ /* @__PURE__ */ f("span", {
209
+ className: "text-text-primary",
210
+ children: ["v", D.version]
211
+ }),
212
+ /* @__PURE__ */ d("span", {
213
+ className: "text-text-tertiary",
214
+ children: "· current"
215
+ })
216
+ ]
172
217
  })
173
218
  ]
174
219
  }),
175
- /* @__PURE__ */ p("div", {
220
+ /* @__PURE__ */ f("div", {
176
221
  className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4",
177
222
  children: [
178
- /* @__PURE__ */ f(D, {
223
+ /* @__PURE__ */ d(S, {
179
224
  label: "Source",
180
- value: j.source ? /* @__PURE__ */ p("button", {
225
+ value: D.source ? /* @__PURE__ */ f("button", {
181
226
  type: "button",
182
- onClick: () => k(`sources/${j.source?.id}`),
227
+ onClick: () => w(`sources/${D.source?.id}`),
183
228
  className: "inline-flex items-center gap-1.5 text-text-primary underline-offset-2 hover:underline",
184
- children: [/* @__PURE__ */ f(me, {
229
+ children: [/* @__PURE__ */ d(Ee, {
185
230
  className: "size-4 text-text-secondary",
186
231
  "aria-hidden": "true"
187
- }), j.source.name]
188
- }) : /* @__PURE__ */ f("span", {
232
+ }), D.source.name]
233
+ }) : /* @__PURE__ */ d("span", {
189
234
  className: "text-text-secondary",
190
235
  children: "Not linked"
191
236
  })
192
237
  }),
193
- /* @__PURE__ */ f(D, {
238
+ /* @__PURE__ */ d(S, {
194
239
  label: "Collection",
195
- value: j.collection ? /* @__PURE__ */ p("button", {
240
+ value: D.collection ? /* @__PURE__ */ f("button", {
196
241
  type: "button",
197
- onClick: () => k(`collections/${j.collection?.id}`),
242
+ onClick: () => w(`collections/${D.collection?.id}`),
198
243
  className: "inline-flex items-center gap-1.5 text-text-primary underline-offset-2 hover:underline",
199
- children: [/* @__PURE__ */ f(ce, {
244
+ children: [/* @__PURE__ */ d(ve, {
200
245
  className: "size-4 text-text-secondary",
201
246
  "aria-hidden": "true"
202
- }), j.collection.name]
203
- }) : /* @__PURE__ */ f("span", {
247
+ }), D.collection.name]
248
+ }) : /* @__PURE__ */ d("span", {
204
249
  className: "text-text-secondary",
205
250
  children: "Not in a collection"
206
251
  })
207
252
  }),
208
- /* @__PURE__ */ f(D, {
253
+ /* @__PURE__ */ d(S, {
209
254
  label: "Format",
210
- value: /* @__PURE__ */ f("span", { children: j.format || "Not specified" })
255
+ value: /* @__PURE__ */ d("span", { children: D.format || "Not specified" })
211
256
  }),
212
- /* @__PURE__ */ f(D, {
257
+ /* @__PURE__ */ d(S, {
213
258
  label: "Size",
214
- value: /* @__PURE__ */ p("span", {
259
+ value: /* @__PURE__ */ f("span", {
215
260
  className: "tabular-nums",
216
- children: [ke(j.sizeBytes), Number(j.rowCount) > 0 ? /* @__PURE__ */ p("span", {
261
+ children: [Ge(D.sizeBytes), Number(D.rowCount) > 0 ? /* @__PURE__ */ f("span", {
217
262
  className: "text-text-secondary",
218
263
  children: [
219
264
  " ",
220
265
  "· ",
221
- Number(j.rowCount).toLocaleString(),
266
+ Number(D.rowCount).toLocaleString(),
222
267
  " rows"
223
268
  ]
224
269
  }) : null]
225
270
  })
226
271
  }),
227
- /* @__PURE__ */ f(D, {
272
+ /* @__PURE__ */ d(S, {
228
273
  label: "Ingested",
229
- value: /* @__PURE__ */ f("span", { children: E(j.ingestedAt) })
274
+ value: /* @__PURE__ */ d("span", { children: x(D.ingestedAt) })
230
275
  }),
231
- /* @__PURE__ */ f(D, {
276
+ /* @__PURE__ */ d(S, {
232
277
  label: "Created",
233
- value: /* @__PURE__ */ f("span", { children: E(j.createdAt) })
278
+ value: /* @__PURE__ */ d("span", { children: x(D.createdAt) })
234
279
  }),
235
- /* @__PURE__ */ f(D, {
280
+ /* @__PURE__ */ d(S, {
236
281
  label: "Updated",
237
- value: /* @__PURE__ */ f("span", { children: E(j.updatedAt) })
282
+ value: /* @__PURE__ */ d("span", { children: x(D.updatedAt) })
238
283
  }),
239
- /* @__PURE__ */ f(D, {
284
+ /* @__PURE__ */ d(S, {
240
285
  label: "Artifact",
241
- value: j.file ? M ? /* @__PURE__ */ p("a", {
242
- href: M,
286
+ value: D.file ? O ? /* @__PURE__ */ f("a", {
287
+ href: O,
243
288
  target: "_blank",
244
289
  rel: "noopener noreferrer",
245
290
  className: "inline-flex items-center gap-1.5 text-text-primary underline-offset-2 hover:underline",
246
- children: [/* @__PURE__ */ f(ue, {
291
+ children: [/* @__PURE__ */ d(be, {
247
292
  className: "size-4",
248
293
  "aria-hidden": "true"
249
294
  }), "Download file"]
250
- }) : /* @__PURE__ */ f("span", {
295
+ }) : /* @__PURE__ */ d("span", {
251
296
  className: "text-text-secondary",
252
297
  children: "Resolving link…"
253
- }) : /* @__PURE__ */ f("span", {
298
+ }) : /* @__PURE__ */ d("span", {
254
299
  className: "text-text-secondary",
255
300
  children: "No file attached"
256
301
  })
257
302
  })
258
303
  ]
259
304
  }),
260
- /* @__PURE__ */ p("section", {
305
+ /* @__PURE__ */ f("section", {
261
306
  className: "space-y-3",
262
- children: [/* @__PURE__ */ p("div", {
307
+ children: [/* @__PURE__ */ f("div", {
263
308
  className: "flex items-center justify-between gap-3",
264
- children: [/* @__PURE__ */ p("div", {
309
+ children: [/* @__PURE__ */ f("div", {
265
310
  className: "flex items-center gap-2",
266
- children: [/* @__PURE__ */ f(m, {
311
+ children: [/* @__PURE__ */ d(De, {
267
312
  className: "size-5 text-text-secondary",
268
313
  "aria-hidden": "true"
269
- }), /* @__PURE__ */ f("h2", {
314
+ }), /* @__PURE__ */ d("h2", {
315
+ className: "text-lg font-semibold text-text-primary",
316
+ children: "Lineage"
317
+ })]
318
+ }), /* @__PURE__ */ f("button", {
319
+ type: "button",
320
+ onClick: () => w(`lineage/${D.id}`),
321
+ className: "inline-flex items-center gap-1 rounded-button text-sm font-medium text-text-link underline-offset-2 hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-border-focus",
322
+ children: ["View full lineage", /* @__PURE__ */ d(_e, {
323
+ className: "size-4",
324
+ "aria-hidden": "true"
325
+ })]
326
+ })]
327
+ }), $e && I.nodes.length <= 1 ? /* @__PURE__ */ d(o, { label: "Building lineage…" }) : I.nodes.length <= 1 ? /* @__PURE__ */ d("div", {
328
+ className: "rounded-card border border-dashed border-border-default bg-bg-sunken p-6 text-sm text-text-secondary",
329
+ children: "No upstream or downstream provenance is linked to this dataset yet. Connect a source, run a pipeline, attach a notebook, or publish a release to build its lineage."
330
+ }) : /* @__PURE__ */ d(fe, {
331
+ model: I,
332
+ mode: "compact",
333
+ onNavigate: w
334
+ })]
335
+ }),
336
+ /* @__PURE__ */ f("section", {
337
+ className: "space-y-3",
338
+ children: [/* @__PURE__ */ f("div", {
339
+ className: "flex items-center justify-between gap-3",
340
+ children: [/* @__PURE__ */ f("div", {
341
+ className: "flex items-center gap-2",
342
+ children: [/* @__PURE__ */ d(p, {
343
+ className: "size-5 text-text-secondary",
344
+ "aria-hidden": "true"
345
+ }), /* @__PURE__ */ d("h2", {
270
346
  className: "text-lg font-semibold text-text-primary",
271
347
  children: "Schema fields"
272
348
  })]
273
- }), /* @__PURE__ */ p(_, {
349
+ }), /* @__PURE__ */ f(h, {
274
350
  type: "button",
275
351
  variant: "outline",
276
352
  size: "sm",
277
- onClick: () => Z(!0),
278
- children: [/* @__PURE__ */ f(h, { className: "size-4" }), "Add field"]
353
+ onClick: () => Q(!0),
354
+ children: [/* @__PURE__ */ d(Te, { className: "size-4" }), "Add field"]
279
355
  })]
280
- }), Q.length === 0 ? /* @__PURE__ */ f(o, {
281
- icon: m,
356
+ }), $.length === 0 ? /* @__PURE__ */ d(a, {
357
+ icon: p,
282
358
  title: "No schema fields yet.",
283
359
  description: "Describe the columns in this dataset so consumers know what each field means."
284
- }) : /* @__PURE__ */ f("div", {
285
- className: "rounded-card border border-border-default bg-bg-elevated",
286
- children: /* @__PURE__ */ p(De, { children: [/* @__PURE__ */ f(S, { children: /* @__PURE__ */ p(C, { children: [
287
- /* @__PURE__ */ f(x, { children: "Name" }),
288
- /* @__PURE__ */ f(x, { children: "Type" }),
289
- /* @__PURE__ */ f(x, { children: "Unit" }),
290
- /* @__PURE__ */ f(x, { children: "Nullable" }),
291
- /* @__PURE__ */ f(x, { children: "Provenance" })
292
- ] }) }), /* @__PURE__ */ f(Oe, { children: Q.map((e) => /* @__PURE__ */ p(C, { children: [
293
- /* @__PURE__ */ p(b, { children: [/* @__PURE__ */ f("span", {
360
+ }) : /* @__PURE__ */ f(he, { children: [/* @__PURE__ */ d("div", {
361
+ className: "hidden rounded-card border border-border-default bg-bg-elevated md:block",
362
+ children: /* @__PURE__ */ f(Be, { children: [/* @__PURE__ */ d(He, { children: /* @__PURE__ */ f(b, { children: [
363
+ /* @__PURE__ */ d(y, { children: "Name" }),
364
+ /* @__PURE__ */ d(y, { children: "Type" }),
365
+ /* @__PURE__ */ d(y, { children: "Unit" }),
366
+ /* @__PURE__ */ d(y, { children: "Nullable" }),
367
+ /* @__PURE__ */ d(y, { children: "Provenance" })
368
+ ] }) }), /* @__PURE__ */ d(Ve, { children: $.map((e) => /* @__PURE__ */ f(b, { children: [
369
+ /* @__PURE__ */ f(v, { children: [/* @__PURE__ */ d("span", {
294
370
  className: "font-medium text-text-primary",
295
371
  children: e.name
296
- }), e.description ? /* @__PURE__ */ f("p", {
372
+ }), e.description ? /* @__PURE__ */ d("p", {
297
373
  className: "mt-0.5 line-clamp-1 max-w-xs text-xs text-text-secondary",
298
374
  children: e.description
299
375
  }) : null] }),
300
- /* @__PURE__ */ f(b, { children: /* @__PURE__ */ f(g, {
376
+ /* @__PURE__ */ d(v, { children: /* @__PURE__ */ d(m, {
301
377
  variant: "secondary",
302
- children: u(e.fieldType)
378
+ children: l(e.fieldType)
303
379
  }) }),
304
- /* @__PURE__ */ f(b, {
380
+ /* @__PURE__ */ d(v, {
305
381
  className: "text-sm text-text-secondary",
306
382
  children: e.unit || "—"
307
383
  }),
308
- /* @__PURE__ */ f(b, {
384
+ /* @__PURE__ */ d(v, {
309
385
  className: "text-sm text-text-secondary",
310
386
  children: e.nullable ? "Yes" : "No"
311
387
  }),
312
- /* @__PURE__ */ f(b, {
388
+ /* @__PURE__ */ d(v, {
313
389
  className: "text-sm text-text-secondary",
314
390
  children: e.provenance || "—"
315
391
  })
316
392
  ] }, e.id)) })] })
317
- })]
393
+ }), /* @__PURE__ */ d("div", {
394
+ className: "space-y-2 md:hidden",
395
+ children: $.map((e) => /* @__PURE__ */ f("div", {
396
+ className: "rounded-card border border-border-default bg-bg-elevated p-3",
397
+ children: [
398
+ /* @__PURE__ */ f("div", {
399
+ className: "flex items-start justify-between gap-2",
400
+ children: [/* @__PURE__ */ d("span", {
401
+ className: "font-medium text-text-primary",
402
+ children: e.name
403
+ }), /* @__PURE__ */ d(m, {
404
+ variant: "secondary",
405
+ children: l(e.fieldType)
406
+ })]
407
+ }),
408
+ e.description ? /* @__PURE__ */ d("p", {
409
+ className: "mt-1 text-xs text-text-secondary",
410
+ children: e.description
411
+ }) : null,
412
+ /* @__PURE__ */ f("dl", {
413
+ className: "mt-2 grid grid-cols-2 gap-2 text-xs",
414
+ children: [
415
+ /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("dt", {
416
+ className: "text-text-tertiary",
417
+ children: "Unit"
418
+ }), /* @__PURE__ */ d("dd", {
419
+ className: "text-text-secondary",
420
+ children: e.unit || "—"
421
+ })] }),
422
+ /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("dt", {
423
+ className: "text-text-tertiary",
424
+ children: "Nullable"
425
+ }), /* @__PURE__ */ d("dd", {
426
+ className: "text-text-secondary",
427
+ children: e.nullable ? "Yes" : "No"
428
+ })] }),
429
+ /* @__PURE__ */ f("div", {
430
+ className: "col-span-2",
431
+ children: [/* @__PURE__ */ d("dt", {
432
+ className: "text-text-tertiary",
433
+ children: "Provenance"
434
+ }), /* @__PURE__ */ d("dd", {
435
+ className: "text-text-secondary",
436
+ children: e.provenance || "—"
437
+ })]
438
+ })
439
+ ]
440
+ })
441
+ ]
442
+ }, e.id))
443
+ })] })]
318
444
  }),
319
- /* @__PURE__ */ p("section", {
445
+ /* @__PURE__ */ f("section", {
320
446
  className: "space-y-3 rounded-card border border-border-default bg-bg-elevated p-5",
321
- children: [/* @__PURE__ */ f(oe, {
322
- value: I,
323
- onChange: L,
447
+ children: [/* @__PURE__ */ d(ue, {
448
+ value: L,
449
+ onChange: R,
324
450
  label: "Dataset tags"
325
- }), ze ? /* @__PURE__ */ f("div", {
451
+ }), nt ? /* @__PURE__ */ d("div", {
326
452
  className: "flex justify-end",
327
- children: /* @__PURE__ */ f(_, {
453
+ children: /* @__PURE__ */ d(h, {
328
454
  type: "button",
329
455
  size: "sm",
330
- onClick: () => void Ge(),
331
- disabled: P,
332
- children: P ? "Saving…" : "Save tags"
456
+ onClick: () => void lt(),
457
+ disabled: k,
458
+ children: k ? "Saving…" : "Save tags"
333
459
  })
334
460
  }) : null]
335
461
  }),
336
- /* @__PURE__ */ p("section", {
462
+ /* @__PURE__ */ f("section", {
337
463
  className: "space-y-3",
338
- children: [/* @__PURE__ */ p("div", {
464
+ children: [/* @__PURE__ */ f("div", {
339
465
  className: "flex items-center gap-2",
340
- children: [/* @__PURE__ */ f(de, {
466
+ children: [/* @__PURE__ */ d(Se, {
341
467
  className: "size-5 text-text-secondary",
342
468
  "aria-hidden": "true"
343
- }), /* @__PURE__ */ f("h2", {
469
+ }), /* @__PURE__ */ d("h2", {
344
470
  className: "text-lg font-semibold text-text-primary",
345
471
  children: "Activity"
346
472
  })]
347
- }), /* @__PURE__ */ f(ie, {
348
- resourceId: j.id,
473
+ }), /* @__PURE__ */ d(ce, {
474
+ resourceId: D.id,
349
475
  resourceType: "cosmicintersection-dataset"
350
476
  })]
351
477
  }),
352
- /* @__PURE__ */ p("section", {
478
+ /* @__PURE__ */ f("section", {
353
479
  className: "space-y-3",
354
- children: [/* @__PURE__ */ p("div", {
480
+ children: [/* @__PURE__ */ f("div", {
355
481
  className: "flex items-center gap-2",
356
- children: [/* @__PURE__ */ f(fe, {
482
+ children: [/* @__PURE__ */ d(Ce, {
357
483
  className: "size-5 text-text-secondary",
358
484
  "aria-hidden": "true"
359
- }), /* @__PURE__ */ f("h2", {
485
+ }), /* @__PURE__ */ d("h2", {
360
486
  className: "text-lg font-semibold text-text-primary",
361
487
  children: "Discussion"
362
488
  })]
363
- }), /* @__PURE__ */ f(ae, {
489
+ }), /* @__PURE__ */ d(le, {
364
490
  entityType: "cosmicintersection-dataset",
365
- entityId: j.id,
366
- title: j.name,
491
+ entityId: D.id,
492
+ title: D.name,
367
493
  widgetKey: "dataset-discussion"
368
494
  })]
369
495
  })
370
496
  ]
371
- }), /* @__PURE__ */ f(ge, {
372
- open: Be,
373
- onOpenChange: Z,
374
- children: /* @__PURE__ */ p(_e, { children: [
375
- /* @__PURE__ */ p(be, { children: [/* @__PURE__ */ f(xe, { children: "Add schema field" }), /* @__PURE__ */ p(ve, { children: [
497
+ }), /* @__PURE__ */ d(ke, {
498
+ open: rt,
499
+ onOpenChange: Q,
500
+ children: /* @__PURE__ */ f(Ae, { children: [
501
+ /* @__PURE__ */ f(Ne, { children: [/* @__PURE__ */ d(Pe, { children: "Add schema field" }), /* @__PURE__ */ f(je, { children: [
376
502
  "Document a column in “",
377
- j.name,
503
+ D.name,
378
504
  "” — its type, unit and provenance."
379
505
  ] })] }),
380
- /* @__PURE__ */ p("div", {
506
+ /* @__PURE__ */ f("div", {
381
507
  className: "space-y-4",
382
508
  children: [
383
- /* @__PURE__ */ p("div", {
509
+ /* @__PURE__ */ f("div", {
384
510
  className: "space-y-1.5",
385
- children: [/* @__PURE__ */ f(y, {
511
+ children: [/* @__PURE__ */ d(_, {
386
512
  htmlFor: "cos-field-name",
387
513
  children: "Name"
388
- }), /* @__PURE__ */ f(v, {
514
+ }), /* @__PURE__ */ d(g, {
389
515
  id: "cos-field-name",
390
- value: z,
391
- onChange: (e) => B(e.target.value),
516
+ value: B,
517
+ onChange: (e) => V(e.target.value),
392
518
  placeholder: "e.g. right_ascension",
393
519
  required: !0
394
520
  })]
395
521
  }),
396
- /* @__PURE__ */ p("div", {
522
+ /* @__PURE__ */ f("div", {
397
523
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
398
- children: [/* @__PURE__ */ p("div", {
524
+ children: [/* @__PURE__ */ f("div", {
399
525
  className: "space-y-1.5",
400
- children: [/* @__PURE__ */ f(y, {
526
+ children: [/* @__PURE__ */ d(_, {
401
527
  htmlFor: "cos-field-type",
402
528
  children: "Type"
403
- }), /* @__PURE__ */ p(Se, {
404
- value: V,
405
- onValueChange: (e) => H(e),
406
- children: [/* @__PURE__ */ f(Te, {
529
+ }), /* @__PURE__ */ f(Fe, {
530
+ value: H,
531
+ onValueChange: (e) => U(e),
532
+ children: [/* @__PURE__ */ d(Re, {
407
533
  id: "cos-field-type",
408
534
  "aria-label": "Field type",
409
- children: /* @__PURE__ */ f(Ee, {})
410
- }), /* @__PURE__ */ f(Ce, { children: T.map((e) => /* @__PURE__ */ f(we, {
535
+ children: /* @__PURE__ */ d(ze, {})
536
+ }), /* @__PURE__ */ d(Ie, { children: We.map((e) => /* @__PURE__ */ d(Le, {
411
537
  value: e,
412
- children: u(e)
538
+ children: l(e)
413
539
  }, e)) })]
414
540
  })]
415
- }), /* @__PURE__ */ p("div", {
541
+ }), /* @__PURE__ */ f("div", {
416
542
  className: "space-y-1.5",
417
- children: [/* @__PURE__ */ f(y, {
543
+ children: [/* @__PURE__ */ d(_, {
418
544
  htmlFor: "cos-field-unit",
419
545
  children: "Unit"
420
- }), /* @__PURE__ */ f(v, {
546
+ }), /* @__PURE__ */ d(g, {
421
547
  id: "cos-field-unit",
422
- value: U,
423
- onChange: (e) => W(e.target.value),
548
+ value: W,
549
+ onChange: (e) => G(e.target.value),
424
550
  placeholder: "e.g. deg, mag, Jy"
425
551
  })]
426
552
  })]
427
553
  }),
428
- /* @__PURE__ */ p("div", {
554
+ /* @__PURE__ */ f("div", {
429
555
  className: "space-y-1.5",
430
- children: [/* @__PURE__ */ f(y, {
556
+ children: [/* @__PURE__ */ d(_, {
431
557
  htmlFor: "cos-field-desc",
432
558
  children: "Description"
433
- }), /* @__PURE__ */ f(w, {
559
+ }), /* @__PURE__ */ d(Ue, {
434
560
  id: "cos-field-desc",
435
- value: G,
436
- onChange: (e) => K(e.target.value),
561
+ value: K,
562
+ onChange: (e) => q(e.target.value),
437
563
  rows: 2
438
564
  })]
439
565
  }),
440
- /* @__PURE__ */ p("div", {
566
+ /* @__PURE__ */ f("div", {
441
567
  className: "space-y-1.5",
442
- children: [/* @__PURE__ */ f(y, {
568
+ children: [/* @__PURE__ */ d(_, {
443
569
  htmlFor: "cos-field-prov",
444
570
  children: "Provenance"
445
- }), /* @__PURE__ */ f(v, {
571
+ }), /* @__PURE__ */ d(g, {
446
572
  id: "cos-field-prov",
447
- value: q,
448
- onChange: (e) => J(e.target.value),
573
+ value: J,
574
+ onChange: (e) => Y(e.target.value),
449
575
  placeholder: "Where this field comes from"
450
576
  })]
451
577
  }),
452
- /* @__PURE__ */ p("label", {
578
+ /* @__PURE__ */ f("label", {
453
579
  className: "flex items-center gap-2 text-sm text-text-primary",
454
- children: [/* @__PURE__ */ f(he, {
455
- checked: Y,
456
- onCheckedChange: (e) => X(e === !0)
580
+ children: [/* @__PURE__ */ d(Oe, {
581
+ checked: X,
582
+ onCheckedChange: (e) => Z(e === !0)
457
583
  }), "Nullable (may contain empty values)"]
458
584
  })
459
585
  ]
460
586
  }),
461
- /* @__PURE__ */ p(ye, { children: [/* @__PURE__ */ f(_, {
587
+ /* @__PURE__ */ f(Me, { children: [/* @__PURE__ */ d(h, {
462
588
  type: "button",
463
589
  variant: "outline",
464
- onClick: () => Z(!1),
465
- disabled: F,
590
+ onClick: () => Q(!1),
591
+ disabled: A,
466
592
  children: "Cancel"
467
- }), /* @__PURE__ */ f(_, {
593
+ }), /* @__PURE__ */ d(h, {
468
594
  type: "button",
469
- onClick: () => void Ke(),
470
- disabled: F,
471
- children: F ? "Adding…" : "Add field"
595
+ onClick: () => void ut(),
596
+ disabled: A,
597
+ children: A ? "Adding…" : "Add field"
472
598
  })] })
473
599
  ] })
474
600
  })]
475
601
  });
476
602
  }
477
603
  //#endregion
478
- export { O as default };
604
+ export { C as default };
479
605
 
480
606
  //# sourceMappingURL=DatasetDetailPage.js.map