@burdenoff/microfe-cosmicintersection 2026.827.1 → 2026.830.2

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 (70) hide show
  1. package/dist/cosmicintersection/components/ActionMenu.d.ts +1 -1
  2. package/dist/cosmicintersection/components/ActionMenu.d.ts.map +1 -1
  3. package/dist/cosmicintersection/components/ActionMenu.js +51 -54
  4. package/dist/cosmicintersection/components/ActionMenu.js.map +1 -1
  5. package/dist/cosmicintersection/components/EntityFormShell.d.ts +1 -1
  6. package/dist/cosmicintersection/components/EntityFormShell.d.ts.map +1 -1
  7. package/dist/cosmicintersection/components/EntityFormShell.js +29 -27
  8. package/dist/cosmicintersection/components/EntityFormShell.js.map +1 -1
  9. package/dist/cosmicintersection/components/ErrorState.d.ts +1 -1
  10. package/dist/cosmicintersection/components/ErrorState.d.ts.map +1 -1
  11. package/dist/cosmicintersection/components/ErrorState.js +19 -17
  12. package/dist/cosmicintersection/components/ErrorState.js.map +1 -1
  13. package/dist/cosmicintersection/components/FileUploadField.d.ts.map +1 -1
  14. package/dist/cosmicintersection/components/FileUploadField.js +61 -60
  15. package/dist/cosmicintersection/components/FileUploadField.js.map +1 -1
  16. package/dist/cosmicintersection/components/LoadingState.d.ts +1 -1
  17. package/dist/cosmicintersection/components/LoadingState.d.ts.map +1 -1
  18. package/dist/cosmicintersection/components/LoadingState.js +15 -13
  19. package/dist/cosmicintersection/components/LoadingState.js.map +1 -1
  20. package/dist/cosmicintersection/components/PageLayout.d.ts.map +1 -1
  21. package/dist/cosmicintersection/components/PageLayout.js +28 -27
  22. package/dist/cosmicintersection/components/PageLayout.js.map +1 -1
  23. package/dist/cosmicintersection/components/Pagination.d.ts.map +1 -1
  24. package/dist/cosmicintersection/components/Pagination.js +38 -35
  25. package/dist/cosmicintersection/components/Pagination.js.map +1 -1
  26. package/dist/cosmicintersection/components/StatusBadge.d.ts.map +1 -1
  27. package/dist/cosmicintersection/components/StatusBadge.js +30 -9
  28. package/dist/cosmicintersection/components/StatusBadge.js.map +1 -1
  29. package/dist/cosmicintersection/pages/access/AccessPage.d.ts.map +1 -1
  30. package/dist/cosmicintersection/pages/access/AccessPage.js +147 -146
  31. package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -1
  32. package/dist/cosmicintersection/pages/analyses/AnalysesPage.d.ts.map +1 -1
  33. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +260 -259
  34. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -1
  35. package/dist/cosmicintersection/pages/collections/CollectionsPage.d.ts.map +1 -1
  36. package/dist/cosmicintersection/pages/collections/CollectionsPage.js +63 -62
  37. package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -1
  38. package/dist/cosmicintersection/pages/dashboard/DashboardPage.d.ts.map +1 -1
  39. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +132 -131
  40. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -1
  41. package/dist/cosmicintersection/pages/datasets/DatasetsPage.d.ts.map +1 -1
  42. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +178 -177
  43. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -1
  44. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.d.ts.map +1 -1
  45. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js +138 -145
  46. package/dist/cosmicintersection/pages/discovery/DiscoveryPage.js.map +1 -1
  47. package/dist/cosmicintersection/pages/lineage/LineagePage.d.ts.map +1 -1
  48. package/dist/cosmicintersection/pages/lineage/LineagePage.js +78 -88
  49. package/dist/cosmicintersection/pages/lineage/LineagePage.js.map +1 -1
  50. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.d.ts.map +1 -1
  51. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +125 -124
  52. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -1
  53. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.d.ts.map +1 -1
  54. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +152 -151
  55. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -1
  56. package/dist/cosmicintersection/pages/releases/ReleasesPage.d.ts.map +1 -1
  57. package/dist/cosmicintersection/pages/releases/ReleasesPage.js +175 -174
  58. package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -1
  59. package/dist/cosmicintersection/pages/runs/RunsPage.d.ts.map +1 -1
  60. package/dist/cosmicintersection/pages/runs/RunsPage.js +197 -188
  61. package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -1
  62. package/dist/cosmicintersection/pages/sources/SourcesPage.d.ts.map +1 -1
  63. package/dist/cosmicintersection/pages/sources/SourcesPage.js +65 -64
  64. package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -1
  65. package/dist/dev/main.d.ts.map +1 -1
  66. package/dist/shared/hooks/useTr.d.ts +12 -0
  67. package/dist/shared/hooks/useTr.d.ts.map +1 -0
  68. package/dist/shared/hooks/useTr.js +16 -0
  69. package/dist/shared/hooks/useTr.js.map +1 -0
  70. package/package.json +1 -1
@@ -1,20 +1,21 @@
1
1
  import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
2
2
  import { notify as t } from "../../lib/toast.js";
3
3
  import { useCosArchiveNotebookMutation as n, useCosNotebooksQuery as r } from "../../api/cosmicApi.js";
4
- import i from "../../components/ActionMenu.js";
5
- import a from "../../components/EmptyState.js";
6
- import o from "../../components/ErrorState.js";
7
- import s from "../../components/LoadingState.js";
8
- import c from "../../components/PageLayout.js";
9
- import l, { usePagination as u } from "../../components/Pagination.js";
10
- import d from "../../components/StatusBadge.js";
4
+ import { useTr as i } from "../../../shared/hooks/useTr.js";
5
+ import a from "../../components/ActionMenu.js";
6
+ import o from "../../components/EmptyState.js";
7
+ import s from "../../components/ErrorState.js";
8
+ import c from "../../components/LoadingState.js";
9
+ import l from "../../components/PageLayout.js";
10
+ import u, { usePagination as d } from "../../components/Pagination.js";
11
+ import f from "../../components/StatusBadge.js";
11
12
  import "../../components/index.js";
12
- import { useState as f } from "react";
13
- import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
14
- import { NotebookText as g, Plus as _, Share2 as v } from "lucide-react";
15
- import { Badge as y, Button as b, Select as x, SelectContent as S, SelectItem as C, SelectTrigger as w, SelectValue as T, Table as E, TableBody as D, TableCell as O, TableHead as k, TableHeader as A, TableRow as j } from "@burdenoff/fe-libs/ui";
13
+ import { useState as p } from "react";
14
+ import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
15
+ import { NotebookText as _, Plus as v, Share2 as y } from "lucide-react";
16
+ import { Badge as b, Button as x, Select as S, SelectContent as C, SelectItem as w, SelectTrigger as T, SelectValue as E, Table as D, TableBody as O, TableCell as k, TableHead as A, TableHeader as j, TableRow as M } from "@burdenoff/fe-libs/ui";
16
17
  //#region src/cosmicintersection/pages/notebooks/NotebooksPage.tsx
17
- var M = [
18
+ var N = [
18
19
  {
19
20
  value: "DRAFT",
20
21
  label: "Draft"
@@ -31,8 +32,8 @@ var M = [
31
32
  value: "ARCHIVED",
32
33
  label: "Archived"
33
34
  }
34
- ], N = "ALL";
35
- function P(e) {
35
+ ], P = "ALL";
36
+ function F(e) {
36
37
  if (!e) return "—";
37
38
  let t = new Date(e);
38
39
  return Number.isNaN(t.getTime()) ? "—" : t.toLocaleDateString(void 0, {
@@ -41,170 +42,170 @@ function P(e) {
41
42
  day: "numeric"
42
43
  });
43
44
  }
44
- function F() {
45
- let { navigate: F } = e(), [I, L] = f(void 0), R = u({
45
+ function I() {
46
+ let { navigate: I } = e(), L = i(), [R, z] = p(void 0), B = d({
46
47
  pageSize: 50,
47
- resetKey: I
48
- }), { data: z, loading: B, error: V, refetch: H } = r({
49
- status: I,
48
+ resetKey: R
49
+ }), { data: V, loading: H, error: U, refetch: W } = r({
50
+ status: R,
50
51
  pagination: {
51
- limit: R.limit,
52
- offset: R.offset
52
+ limit: B.limit,
53
+ offset: B.offset
53
54
  }
54
- }), [U] = n(), W = z?.cosListNotebooks.items ?? [], G = z?.cosListNotebooks.pageInfo, K = async (e) => {
55
- let n = await U({ variables: { id: e.id } });
55
+ }), [G] = n(), K = V?.cosListNotebooks.items ?? [], q = V?.cosListNotebooks.pageInfo, J = async (e) => {
56
+ let n = await G({ variables: { id: e.id } });
56
57
  if (n.error) throw Error(n.error.message);
57
- if (!n.data?.cosArchiveNotebook) throw t.error("Could not archive notebook", "The server did not confirm the change."), Error("Archive not confirmed");
58
- await H(), t.success("Notebook archived", `“${e.title}” was archived.`);
59
- };
60
- return /* @__PURE__ */ m(c, {
61
- title: "Notebooks",
62
- description: "Computational notebooks for running analyses over federated science datasets.",
63
- actions: /* @__PURE__ */ h(b, {
64
- type: "button",
65
- onClick: () => F("notebooks/create"),
66
- children: [/* @__PURE__ */ m(_, { className: "size-4" }), "New notebook"]
67
- }),
68
- children: /* @__PURE__ */ h("div", {
58
+ if (!n.data?.cosArchiveNotebook) throw t.error(L("cosmicintersection.pages.notebooks.archiveError", "Could not archive notebook"), L("cosmicintersection.pages.notebooks.archiveErrorDescription", "The server did not confirm the change.")), Error("Archive not confirmed");
59
+ await W(), t.success(L("cosmicintersection.pages.notebooks.archiveSuccess", "Notebook archived"), L("cosmicintersection.pages.notebooks.archiveSuccessDescription", "“{{name}}” was archived.", { name: e.title }));
60
+ }, Y = /* @__PURE__ */ g(x, {
61
+ type: "button",
62
+ onClick: () => I("notebooks/create"),
63
+ children: [/* @__PURE__ */ h(v, { className: "size-4" }), L("cosmicintersection.pages.notebooks.create", "New notebook")]
64
+ });
65
+ return /* @__PURE__ */ h(l, {
66
+ title: L("cosmicintersection.pages.notebooks.title", "Notebooks"),
67
+ description: L("cosmicintersection.pages.notebooks.description", "Computational notebooks for running analyses over federated science datasets."),
68
+ actions: Y,
69
+ children: /* @__PURE__ */ g("div", {
69
70
  className: "space-y-4",
70
71
  children: [
71
- /* @__PURE__ */ h("div", {
72
+ /* @__PURE__ */ g("div", {
72
73
  className: "flex flex-wrap items-center gap-3",
73
- children: [/* @__PURE__ */ m("label", {
74
+ children: [/* @__PURE__ */ h("label", {
74
75
  className: "text-sm text-text-secondary",
75
76
  htmlFor: "notebook-status-filter",
76
77
  children: "Status"
77
- }), /* @__PURE__ */ h(x, {
78
- value: I ?? N,
79
- onValueChange: (e) => L(e === N ? void 0 : e),
80
- children: [/* @__PURE__ */ m(w, {
78
+ }), /* @__PURE__ */ g(S, {
79
+ value: R ?? P,
80
+ onValueChange: (e) => z(e === P ? void 0 : e),
81
+ children: [/* @__PURE__ */ h(T, {
81
82
  id: "notebook-status-filter",
82
83
  className: "w-48",
83
84
  "aria-label": "Filter by status",
84
- children: /* @__PURE__ */ m(T, {})
85
- }), /* @__PURE__ */ h(S, { children: [/* @__PURE__ */ m(C, {
86
- value: N,
85
+ children: /* @__PURE__ */ h(E, {})
86
+ }), /* @__PURE__ */ g(C, { children: [/* @__PURE__ */ h(w, {
87
+ value: P,
87
88
  children: "All statuses"
88
- }), M.map((e) => /* @__PURE__ */ m(C, {
89
+ }), N.map((e) => /* @__PURE__ */ h(w, {
89
90
  value: e.value,
90
91
  children: e.label
91
92
  }, e.value))] })]
92
93
  })]
93
94
  }),
94
- B ? /* @__PURE__ */ m(s, {
95
+ H ? /* @__PURE__ */ h(c, {
95
96
  variant: "rows",
96
97
  rows: 6,
97
- label: "Loading notebooks…"
98
- }) : V ? /* @__PURE__ */ m(o, {
99
- message: "We could not load your notebooks. Please try again.",
100
- onRetry: () => void H()
101
- }) : W.length === 0 ? /* @__PURE__ */ m(a, {
102
- icon: g,
103
- title: I ? "No notebooks match this filter." : "No notebooks yet.",
104
- description: I ? "Try a different status filter." : "Create your first notebook to start analysing federated datasets.",
105
- action: I ? void 0 : /* @__PURE__ */ h(b, {
98
+ label: L("cosmicintersection.pages.notebooks.loading", "Loading notebooks…")
99
+ }) : U ? /* @__PURE__ */ h(s, {
100
+ message: L("cosmicintersection.pages.notebooks.error", "We could not load your notebooks. Please try again."),
101
+ onRetry: () => void W()
102
+ }) : K.length === 0 ? /* @__PURE__ */ h(o, {
103
+ icon: _,
104
+ title: R ? L("cosmicintersection.pages.notebooks.emptyFilterTitle", "No notebooks match this filter.") : L("cosmicintersection.pages.notebooks.emptyTitle", "No notebooks yet."),
105
+ description: R ? L("cosmicintersection.pages.notebooks.emptyFilterDescription", "Try a different status filter.") : L("cosmicintersection.pages.notebooks.emptyDescription", "Create your first notebook to start analysing federated datasets."),
106
+ action: R ? void 0 : /* @__PURE__ */ g(x, {
106
107
  type: "button",
107
- onClick: () => F("notebooks/create"),
108
- children: [/* @__PURE__ */ m(_, { className: "size-4" }), "New notebook"]
108
+ onClick: () => I("notebooks/create"),
109
+ children: [/* @__PURE__ */ h(v, { className: "size-4" }), L("cosmicintersection.pages.notebooks.create", "New notebook")]
109
110
  })
110
- }) : /* @__PURE__ */ h(p, { children: [/* @__PURE__ */ m("div", {
111
+ }) : /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h("div", {
111
112
  className: "hidden rounded-card border border-border-default bg-bg-elevated md:block",
112
- children: /* @__PURE__ */ h(E, { children: [/* @__PURE__ */ m(A, { children: /* @__PURE__ */ h(j, { children: [
113
- /* @__PURE__ */ m(k, { children: "Title" }),
114
- /* @__PURE__ */ m(k, { children: "Status" }),
115
- /* @__PURE__ */ m(k, { children: "Runtime" }),
116
- /* @__PURE__ */ m(k, {
113
+ children: /* @__PURE__ */ g(D, { children: [/* @__PURE__ */ h(j, { children: /* @__PURE__ */ g(M, { children: [
114
+ /* @__PURE__ */ h(A, { children: "Title" }),
115
+ /* @__PURE__ */ h(A, { children: "Status" }),
116
+ /* @__PURE__ */ h(A, { children: "Runtime" }),
117
+ /* @__PURE__ */ h(A, {
117
118
  className: "text-right",
118
119
  children: "Datasets"
119
120
  }),
120
- /* @__PURE__ */ m(k, { children: "Sharing" }),
121
- /* @__PURE__ */ m(k, { children: "Tags" }),
122
- /* @__PURE__ */ m(k, { children: "Updated" }),
123
- /* @__PURE__ */ m(k, {
121
+ /* @__PURE__ */ h(A, { children: "Sharing" }),
122
+ /* @__PURE__ */ h(A, { children: "Tags" }),
123
+ /* @__PURE__ */ h(A, { children: "Updated" }),
124
+ /* @__PURE__ */ h(A, {
124
125
  className: "w-12 text-right",
125
126
  children: "Actions"
126
127
  })
127
- ] }) }), /* @__PURE__ */ m(D, { children: W.map((e) => /* @__PURE__ */ h(j, {
128
+ ] }) }), /* @__PURE__ */ h(O, { children: K.map((e) => /* @__PURE__ */ g(M, {
128
129
  className: "cursor-pointer",
129
- onClick: () => F(`notebooks/${e.id}`),
130
+ onClick: () => I(`notebooks/${e.id}`),
130
131
  children: [
131
- /* @__PURE__ */ m(O, {
132
+ /* @__PURE__ */ h(k, {
132
133
  className: "font-medium text-text-primary",
133
134
  children: e.title
134
135
  }),
135
- /* @__PURE__ */ m(O, { children: /* @__PURE__ */ m(d, { status: e.status }) }),
136
- /* @__PURE__ */ m(O, {
136
+ /* @__PURE__ */ h(k, { children: /* @__PURE__ */ h(f, { status: e.status }) }),
137
+ /* @__PURE__ */ h(k, {
137
138
  className: "text-text-secondary",
138
139
  children: e.runtime ?? "—"
139
140
  }),
140
- /* @__PURE__ */ m(O, {
141
+ /* @__PURE__ */ h(k, {
141
142
  className: "text-right tabular-nums text-text-secondary",
142
143
  children: e.datasetIds.length
143
144
  }),
144
- /* @__PURE__ */ m(O, { children: e.isShared ? /* @__PURE__ */ h(y, {
145
+ /* @__PURE__ */ h(k, { children: e.isShared ? /* @__PURE__ */ g(b, {
145
146
  variant: "secondary",
146
147
  className: "gap-1",
147
- children: [/* @__PURE__ */ m(v, {
148
+ children: [/* @__PURE__ */ h(y, {
148
149
  className: "size-3",
149
150
  "aria-hidden": "true"
150
- }), "Shared"]
151
- }) : /* @__PURE__ */ m("span", {
151
+ }), L("cosmicintersection.common.shared", "Shared")]
152
+ }) : /* @__PURE__ */ h("span", {
152
153
  className: "text-text-secondary",
153
- children: "Private"
154
+ children: L("cosmicintersection.common.private", "Private")
154
155
  }) }),
155
- /* @__PURE__ */ m(O, { children: e.tags.length > 0 ? /* @__PURE__ */ h("div", {
156
+ /* @__PURE__ */ h(k, { children: e.tags.length > 0 ? /* @__PURE__ */ g("div", {
156
157
  className: "flex flex-wrap gap-1",
157
- children: [e.tags.slice(0, 3).map((e) => /* @__PURE__ */ m(y, {
158
+ children: [e.tags.slice(0, 3).map((e) => /* @__PURE__ */ h(b, {
158
159
  variant: "outline",
159
160
  children: e
160
- }, e)), e.tags.length > 3 ? /* @__PURE__ */ h("span", {
161
+ }, e)), e.tags.length > 3 ? /* @__PURE__ */ g("span", {
161
162
  className: "text-xs text-text-secondary",
162
163
  children: ["+", e.tags.length - 3]
163
164
  }) : null]
164
- }) : /* @__PURE__ */ m("span", {
165
+ }) : /* @__PURE__ */ h("span", {
165
166
  className: "text-text-secondary",
166
167
  children: "—"
167
168
  }) }),
168
- /* @__PURE__ */ m(O, {
169
+ /* @__PURE__ */ h(k, {
169
170
  className: "whitespace-nowrap text-text-secondary",
170
- children: P(e.updatedAt)
171
+ children: F(e.updatedAt)
171
172
  }),
172
- /* @__PURE__ */ m(O, {
173
+ /* @__PURE__ */ h(k, {
173
174
  className: "text-right",
174
- children: /* @__PURE__ */ m(i, {
175
+ children: /* @__PURE__ */ h(a, {
175
176
  ariaLabel: `Actions for ${e.title}`,
176
177
  entityName: e.title,
177
- onView: () => F(`notebooks/${e.id}`),
178
- onEdit: () => F(`notebooks/${e.id}/edit`),
179
- onDelete: e.status === "ARCHIVED" ? void 0 : () => K(e),
180
- deleteLabel: "Archive notebook"
178
+ onView: () => I(`notebooks/${e.id}`),
179
+ onEdit: () => I(`notebooks/${e.id}/edit`),
180
+ onDelete: e.status === "ARCHIVED" ? void 0 : () => J(e),
181
+ deleteLabel: L("cosmicintersection.pages.notebooks.archive", "Archive notebook")
181
182
  })
182
183
  })
183
184
  ]
184
185
  }, e.id)) })] })
185
- }), /* @__PURE__ */ m("ul", {
186
+ }), /* @__PURE__ */ h("ul", {
186
187
  className: "space-y-3 md:hidden",
187
- children: W.map((e) => /* @__PURE__ */ m("li", {
188
+ children: K.map((e) => /* @__PURE__ */ h("li", {
188
189
  className: "rounded-card border border-border-default bg-bg-elevated",
189
- children: /* @__PURE__ */ h("div", {
190
+ children: /* @__PURE__ */ g("div", {
190
191
  className: "flex items-start justify-between gap-2 p-4",
191
- children: [/* @__PURE__ */ h("button", {
192
+ children: [/* @__PURE__ */ g("button", {
192
193
  type: "button",
193
- onClick: () => F(`notebooks/${e.id}`),
194
+ onClick: () => I(`notebooks/${e.id}`),
194
195
  className: "min-w-0 flex-1 space-y-2 text-left",
195
196
  children: [
196
- /* @__PURE__ */ h("div", {
197
+ /* @__PURE__ */ g("div", {
197
198
  className: "flex flex-wrap items-center gap-2",
198
- children: [/* @__PURE__ */ m("span", {
199
+ children: [/* @__PURE__ */ h("span", {
199
200
  className: "truncate font-medium text-text-primary",
200
201
  children: e.title
201
- }), /* @__PURE__ */ m(d, { status: e.status })]
202
+ }), /* @__PURE__ */ h(f, { status: e.status })]
202
203
  }),
203
- /* @__PURE__ */ h("div", {
204
+ /* @__PURE__ */ g("div", {
204
205
  className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary",
205
206
  children: [
206
- /* @__PURE__ */ h("span", { children: ["Runtime: ", e.runtime ?? "—"] }),
207
- /* @__PURE__ */ h("span", {
207
+ /* @__PURE__ */ g("span", { children: ["Runtime: ", e.runtime ?? "—"] }),
208
+ /* @__PURE__ */ g("span", {
208
209
  className: "tabular-nums",
209
210
  children: [
210
211
  e.datasetIds.length,
@@ -212,53 +213,53 @@ function F() {
212
213
  e.datasetIds.length === 1 ? "" : "s"
213
214
  ]
214
215
  }),
215
- e.isShared ? /* @__PURE__ */ h("span", {
216
+ e.isShared ? /* @__PURE__ */ g("span", {
216
217
  className: "inline-flex items-center gap-1",
217
- children: [/* @__PURE__ */ m(v, {
218
+ children: [/* @__PURE__ */ h(y, {
218
219
  className: "size-3",
219
220
  "aria-hidden": "true"
220
- }), "Shared"]
221
- }) : /* @__PURE__ */ m("span", { children: "Private" }),
222
- /* @__PURE__ */ h("span", { children: ["Updated ", P(e.updatedAt)] })
221
+ }), L("cosmicintersection.common.shared", "Shared")]
222
+ }) : /* @__PURE__ */ h("span", { children: L("cosmicintersection.common.private", "Private") }),
223
+ /* @__PURE__ */ g("span", { children: ["Updated ", F(e.updatedAt)] })
223
224
  ]
224
225
  }),
225
- e.tags.length > 0 ? /* @__PURE__ */ h("div", {
226
+ e.tags.length > 0 ? /* @__PURE__ */ g("div", {
226
227
  className: "flex flex-wrap gap-1",
227
- children: [e.tags.slice(0, 4).map((e) => /* @__PURE__ */ m(y, {
228
+ children: [e.tags.slice(0, 4).map((e) => /* @__PURE__ */ h(b, {
228
229
  variant: "outline",
229
230
  children: e
230
- }, e)), e.tags.length > 4 ? /* @__PURE__ */ h("span", {
231
+ }, e)), e.tags.length > 4 ? /* @__PURE__ */ g("span", {
231
232
  className: "text-xs text-text-secondary",
232
233
  children: ["+", e.tags.length - 4]
233
234
  }) : null]
234
235
  }) : null
235
236
  ]
236
- }), /* @__PURE__ */ m(i, {
237
+ }), /* @__PURE__ */ h(a, {
237
238
  ariaLabel: `Actions for ${e.title}`,
238
239
  entityName: e.title,
239
- onView: () => F(`notebooks/${e.id}`),
240
- onEdit: () => F(`notebooks/${e.id}/edit`),
241
- onDelete: e.status === "ARCHIVED" ? void 0 : () => K(e),
242
- deleteLabel: "Archive notebook"
240
+ onView: () => I(`notebooks/${e.id}`),
241
+ onEdit: () => I(`notebooks/${e.id}/edit`),
242
+ onDelete: e.status === "ARCHIVED" ? void 0 : () => J(e),
243
+ deleteLabel: L("cosmicintersection.pages.notebooks.archive", "Archive notebook")
243
244
  })]
244
245
  })
245
246
  }, e.id))
246
247
  })] }),
247
- !B && !V && W.length > 0 ? /* @__PURE__ */ m(l, {
248
- offset: R.offset,
249
- limit: R.limit,
250
- loadedCount: W.length,
251
- hasMore: G?.hasMore ?? !1,
252
- onPrev: R.prevPage,
253
- onNext: R.nextPage,
254
- itemLabel: "notebooks",
255
- loading: B
248
+ !H && !U && K.length > 0 ? /* @__PURE__ */ h(u, {
249
+ offset: B.offset,
250
+ limit: B.limit,
251
+ loadedCount: K.length,
252
+ hasMore: q?.hasMore ?? !1,
253
+ onPrev: B.prevPage,
254
+ onNext: B.nextPage,
255
+ itemLabel: L("cosmicintersection.pages.notebooks.itemLabel", "notebooks"),
256
+ loading: H
256
257
  }) : null
257
258
  ]
258
259
  })
259
260
  });
260
261
  }
261
262
  //#endregion
262
- export { F as default };
263
+ export { I as default };
263
264
 
264
265
  //# sourceMappingURL=NotebooksPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NotebooksPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/notebooks/NotebooksPage.tsx"],"sourcesContent":["/**\n * NotebooksPage — paginated list of analysis notebooks.\n *\n * Notebooks are computational documents (title, runtime, environment, linked\n * datasets) that scientists run analyses inside. This surface lists them from\n * `cosListNotebooks` with a status filter, per-row View / Edit / Archive\n * actions, and offset pagination. Every value here comes from the backend —\n * there is no fabricated data.\n */\nimport { useState } from 'react';\nimport { NotebookText, Plus, Share2 } from 'lucide-react';\nimport {\n Badge,\n Button,\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 useCosArchiveNotebookMutation,\n useCosNotebooksQuery,\n type CosNotebook,\n type CosNotebookStatus,\n} from '../../api/cosmicApi';\nimport {\n ActionMenu,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n StatusBadge,\n usePagination,\n} from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\n\nconst STATUS_OPTIONS: { value: CosNotebookStatus; label: string }[] = [\n { value: 'DRAFT', label: 'Draft' },\n { value: 'RUNNING', label: 'Running' },\n { value: 'PUBLISHED', label: 'Published' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst ALL = 'ALL';\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return '—';\n }\n return date.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nexport default function NotebooksPage() {\n const { navigate } = useCosmicIntersection();\n const [statusFilter, setStatusFilter] = useState<CosNotebookStatus | undefined>(undefined);\n const pagination = usePagination({ pageSize: 50, resetKey: statusFilter });\n\n const { data, loading, error, refetch } = useCosNotebooksQuery({\n status: statusFilter,\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n const [archiveNotebook] = useCosArchiveNotebookMutation();\n\n const notebooks = data?.cosListNotebooks.items ?? [];\n const pageInfo = data?.cosListNotebooks.pageInfo;\n\n const handleArchive = async (notebook: CosNotebook) => {\n const response = await archiveNotebook({ variables: { id: notebook.id } });\n if (response.error) {\n // onError already surfaced the toast; rethrow so the confirm dialog stays open.\n throw new Error(response.error.message);\n }\n if (!response.data?.cosArchiveNotebook) {\n notify.error('Could not archive notebook', 'The server did not confirm the change.');\n throw new Error('Archive not confirmed');\n }\n await refetch();\n notify.success('Notebook archived', `“${notebook.title}” was archived.`);\n };\n\n const actions = (\n <Button type=\"button\" onClick={() => navigate('notebooks/create')}>\n <Plus className=\"size-4\" />\n New notebook\n </Button>\n );\n\n return (\n <PageLayout\n title=\"Notebooks\"\n description=\"Computational notebooks for running analyses over federated science datasets.\"\n actions={actions}\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"text-sm text-text-secondary\" htmlFor=\"notebook-status-filter\">\n Status\n </label>\n <Select\n value={statusFilter ?? ALL}\n onValueChange={(value) =>\n setStatusFilter(value === ALL ? undefined : (value as CosNotebookStatus))\n }\n >\n <SelectTrigger\n id=\"notebook-status-filter\"\n className=\"w-48\"\n aria-label=\"Filter by status\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All statuses</SelectItem>\n {STATUS_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {loading ? (\n <LoadingState variant=\"rows\" rows={6} label=\"Loading notebooks…\" />\n ) : error ? (\n <ErrorState\n message=\"We could not load your notebooks. Please try again.\"\n onRetry={() => void refetch()}\n />\n ) : notebooks.length === 0 ? (\n <EmptyState\n icon={NotebookText}\n title={statusFilter ? 'No notebooks match this filter.' : 'No notebooks yet.'}\n description={\n statusFilter\n ? 'Try a different status filter.'\n : 'Create your first notebook to start analysing federated datasets.'\n }\n action={\n statusFilter ? undefined : (\n <Button type=\"button\" onClick={() => navigate('notebooks/create')}>\n <Plus className=\"size-4\" />\n New notebook\n </Button>\n )\n }\n />\n ) : (\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>Status</TableHead>\n <TableHead>Runtime</TableHead>\n <TableHead className=\"text-right\">Datasets</TableHead>\n <TableHead>Sharing</TableHead>\n <TableHead>Tags</TableHead>\n <TableHead>Updated</TableHead>\n <TableHead className=\"w-12 text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {notebooks.map((notebook) => (\n <TableRow\n key={notebook.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`notebooks/${notebook.id}`)}\n >\n <TableCell className=\"font-medium text-text-primary\">\n {notebook.title}\n </TableCell>\n <TableCell>\n <StatusBadge status={notebook.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {notebook.runtime ?? '—'}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-secondary\">\n {notebook.datasetIds.length}\n </TableCell>\n <TableCell>\n {notebook.isShared ? (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Share2 className=\"size-3\" aria-hidden=\"true\" />\n Shared\n </Badge>\n ) : (\n <span className=\"text-text-secondary\">Private</span>\n )}\n </TableCell>\n <TableCell>\n {notebook.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {notebook.tags.slice(0, 3).map((tag) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n {notebook.tags.length > 3 ? (\n <span className=\"text-xs text-text-secondary\">\n +{notebook.tags.length - 3}\n </span>\n ) : null}\n </div>\n ) : (\n <span className=\"text-text-secondary\">—</span>\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-text-secondary\">\n {formatDate(notebook.updatedAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={`Actions for ${notebook.title}`}\n entityName={notebook.title}\n onView={() => navigate(`notebooks/${notebook.id}`)}\n onEdit={() => navigate(`notebooks/${notebook.id}/edit`)}\n onDelete={\n notebook.status === 'ARCHIVED'\n ? undefined\n : () => handleArchive(notebook)\n }\n deleteLabel=\"Archive notebook\"\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 {notebooks.map((notebook) => (\n <li\n key={notebook.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 <button\n type=\"button\"\n onClick={() => navigate(`notebooks/${notebook.id}`)}\n className=\"min-w-0 flex-1 space-y-2 text-left\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate font-medium text-text-primary\">\n {notebook.title}\n </span>\n <StatusBadge status={notebook.status} />\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary\">\n <span>Runtime: {notebook.runtime ?? '—'}</span>\n <span className=\"tabular-nums\">\n {notebook.datasetIds.length} dataset\n {notebook.datasetIds.length === 1 ? '' : 's'}\n </span>\n {notebook.isShared ? (\n <span className=\"inline-flex items-center gap-1\">\n <Share2 className=\"size-3\" aria-hidden=\"true\" />\n Shared\n </span>\n ) : (\n <span>Private</span>\n )}\n <span>Updated {formatDate(notebook.updatedAt)}</span>\n </div>\n {notebook.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {notebook.tags.slice(0, 4).map((tag) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n {notebook.tags.length > 4 ? (\n <span className=\"text-xs text-text-secondary\">\n +{notebook.tags.length - 4}\n </span>\n ) : null}\n </div>\n ) : null}\n </button>\n <ActionMenu\n ariaLabel={`Actions for ${notebook.title}`}\n entityName={notebook.title}\n onView={() => navigate(`notebooks/${notebook.id}`)}\n onEdit={() => navigate(`notebooks/${notebook.id}/edit`)}\n onDelete={\n notebook.status === 'ARCHIVED' ? undefined : () => handleArchive(notebook)\n }\n deleteLabel=\"Archive notebook\"\n />\n </div>\n </li>\n ))}\n </ul>\n </>\n )}\n\n {!loading && !error && notebooks.length > 0 ? (\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={notebooks.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"notebooks\"\n loading={loading}\n />\n ) : null}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"NotebooksPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/notebooks/NotebooksPage.tsx"],"sourcesContent":["/**\n * NotebooksPage — paginated list of analysis notebooks.\n *\n * Notebooks are computational documents (title, runtime, environment, linked\n * datasets) that scientists run analyses inside. This surface lists them from\n * `cosListNotebooks` with a status filter, per-row View / Edit / Archive\n * actions, and offset pagination. Every value here comes from the backend —\n * there is no fabricated data.\n */\nimport { useState } from 'react';\nimport { NotebookText, Plus, Share2 } from 'lucide-react';\nimport {\n Badge,\n Button,\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 useCosArchiveNotebookMutation,\n useCosNotebooksQuery,\n type CosNotebook,\n type CosNotebookStatus,\n} from '../../api/cosmicApi';\nimport {\n ActionMenu,\n EmptyState,\n ErrorState,\n LoadingState,\n PageLayout,\n Pagination,\n StatusBadge,\n usePagination,\n} from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\nimport { notify } from '../../lib/toast';\nimport { useTr } from '../../../shared/hooks/useTr';\n\nconst STATUS_OPTIONS: { value: CosNotebookStatus; label: string }[] = [\n { value: 'DRAFT', label: 'Draft' },\n { value: 'RUNNING', label: 'Running' },\n { value: 'PUBLISHED', label: 'Published' },\n { value: 'ARCHIVED', label: 'Archived' },\n];\n\nconst ALL = 'ALL';\n\nfunction formatDate(value?: string | null): string {\n if (!value) {\n return '—';\n }\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return '—';\n }\n return date.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n}\n\nexport default function NotebooksPage() {\n const { navigate } = useCosmicIntersection();\n const tr = useTr();\n const [statusFilter, setStatusFilter] = useState<CosNotebookStatus | undefined>(undefined);\n const pagination = usePagination({ pageSize: 50, resetKey: statusFilter });\n\n const { data, loading, error, refetch } = useCosNotebooksQuery({\n status: statusFilter,\n pagination: { limit: pagination.limit, offset: pagination.offset },\n });\n const [archiveNotebook] = useCosArchiveNotebookMutation();\n\n const notebooks = data?.cosListNotebooks.items ?? [];\n const pageInfo = data?.cosListNotebooks.pageInfo;\n\n const handleArchive = async (notebook: CosNotebook) => {\n const response = await archiveNotebook({ variables: { id: notebook.id } });\n if (response.error) {\n // onError already surfaced the toast; rethrow so the confirm dialog stays open.\n throw new Error(response.error.message);\n }\n if (!response.data?.cosArchiveNotebook) {\n notify.error(\n tr('cosmicintersection.pages.notebooks.archiveError', 'Could not archive notebook'),\n tr(\n 'cosmicintersection.pages.notebooks.archiveErrorDescription',\n 'The server did not confirm the change.'\n )\n );\n throw new Error('Archive not confirmed');\n }\n await refetch();\n notify.success(\n tr('cosmicintersection.pages.notebooks.archiveSuccess', 'Notebook archived'),\n tr(\n 'cosmicintersection.pages.notebooks.archiveSuccessDescription',\n '“{{name}}” was archived.',\n { name: notebook.title }\n )\n );\n };\n\n const actions = (\n <Button type=\"button\" onClick={() => navigate('notebooks/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.notebooks.create', 'New notebook')}\n </Button>\n );\n\n return (\n <PageLayout\n title={tr('cosmicintersection.pages.notebooks.title', 'Notebooks')}\n description={tr(\n 'cosmicintersection.pages.notebooks.description',\n 'Computational notebooks for running analyses over federated science datasets.'\n )}\n actions={actions}\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <label className=\"text-sm text-text-secondary\" htmlFor=\"notebook-status-filter\">\n Status\n </label>\n <Select\n value={statusFilter ?? ALL}\n onValueChange={(value) =>\n setStatusFilter(value === ALL ? undefined : (value as CosNotebookStatus))\n }\n >\n <SelectTrigger\n id=\"notebook-status-filter\"\n className=\"w-48\"\n aria-label=\"Filter by status\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={ALL}>All statuses</SelectItem>\n {STATUS_OPTIONS.map((option) => (\n <SelectItem key={option.value} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {loading ? (\n <LoadingState\n variant=\"rows\"\n rows={6}\n label={tr('cosmicintersection.pages.notebooks.loading', 'Loading notebooks…')}\n />\n ) : error ? (\n <ErrorState\n message={tr(\n 'cosmicintersection.pages.notebooks.error',\n 'We could not load your notebooks. Please try again.'\n )}\n onRetry={() => void refetch()}\n />\n ) : notebooks.length === 0 ? (\n <EmptyState\n icon={NotebookText}\n title={\n statusFilter\n ? tr(\n 'cosmicintersection.pages.notebooks.emptyFilterTitle',\n 'No notebooks match this filter.'\n )\n : tr('cosmicintersection.pages.notebooks.emptyTitle', 'No notebooks yet.')\n }\n description={\n statusFilter\n ? tr(\n 'cosmicintersection.pages.notebooks.emptyFilterDescription',\n 'Try a different status filter.'\n )\n : tr(\n 'cosmicintersection.pages.notebooks.emptyDescription',\n 'Create your first notebook to start analysing federated datasets.'\n )\n }\n action={\n statusFilter ? undefined : (\n <Button type=\"button\" onClick={() => navigate('notebooks/create')}>\n <Plus className=\"size-4\" />\n {tr('cosmicintersection.pages.notebooks.create', 'New notebook')}\n </Button>\n )\n }\n />\n ) : (\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>Status</TableHead>\n <TableHead>Runtime</TableHead>\n <TableHead className=\"text-right\">Datasets</TableHead>\n <TableHead>Sharing</TableHead>\n <TableHead>Tags</TableHead>\n <TableHead>Updated</TableHead>\n <TableHead className=\"w-12 text-right\">Actions</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {notebooks.map((notebook) => (\n <TableRow\n key={notebook.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`notebooks/${notebook.id}`)}\n >\n <TableCell className=\"font-medium text-text-primary\">\n {notebook.title}\n </TableCell>\n <TableCell>\n <StatusBadge status={notebook.status} />\n </TableCell>\n <TableCell className=\"text-text-secondary\">\n {notebook.runtime ?? '—'}\n </TableCell>\n <TableCell className=\"text-right tabular-nums text-text-secondary\">\n {notebook.datasetIds.length}\n </TableCell>\n <TableCell>\n {notebook.isShared ? (\n <Badge variant=\"secondary\" className=\"gap-1\">\n <Share2 className=\"size-3\" aria-hidden=\"true\" />\n {tr('cosmicintersection.common.shared', 'Shared')}\n </Badge>\n ) : (\n <span className=\"text-text-secondary\">\n {tr('cosmicintersection.common.private', 'Private')}\n </span>\n )}\n </TableCell>\n <TableCell>\n {notebook.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {notebook.tags.slice(0, 3).map((tag) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n {notebook.tags.length > 3 ? (\n <span className=\"text-xs text-text-secondary\">\n +{notebook.tags.length - 3}\n </span>\n ) : null}\n </div>\n ) : (\n <span className=\"text-text-secondary\">—</span>\n )}\n </TableCell>\n <TableCell className=\"whitespace-nowrap text-text-secondary\">\n {formatDate(notebook.updatedAt)}\n </TableCell>\n <TableCell className=\"text-right\">\n <ActionMenu\n ariaLabel={`Actions for ${notebook.title}`}\n entityName={notebook.title}\n onView={() => navigate(`notebooks/${notebook.id}`)}\n onEdit={() => navigate(`notebooks/${notebook.id}/edit`)}\n onDelete={\n notebook.status === 'ARCHIVED'\n ? undefined\n : () => handleArchive(notebook)\n }\n deleteLabel={tr(\n 'cosmicintersection.pages.notebooks.archive',\n 'Archive notebook'\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 {notebooks.map((notebook) => (\n <li\n key={notebook.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 <button\n type=\"button\"\n onClick={() => navigate(`notebooks/${notebook.id}`)}\n className=\"min-w-0 flex-1 space-y-2 text-left\"\n >\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"truncate font-medium text-text-primary\">\n {notebook.title}\n </span>\n <StatusBadge status={notebook.status} />\n </div>\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-text-secondary\">\n <span>Runtime: {notebook.runtime ?? '—'}</span>\n <span className=\"tabular-nums\">\n {notebook.datasetIds.length} dataset\n {notebook.datasetIds.length === 1 ? '' : 's'}\n </span>\n {notebook.isShared ? (\n <span className=\"inline-flex items-center gap-1\">\n <Share2 className=\"size-3\" aria-hidden=\"true\" />\n {tr('cosmicintersection.common.shared', 'Shared')}\n </span>\n ) : (\n <span>{tr('cosmicintersection.common.private', 'Private')}</span>\n )}\n <span>Updated {formatDate(notebook.updatedAt)}</span>\n </div>\n {notebook.tags.length > 0 ? (\n <div className=\"flex flex-wrap gap-1\">\n {notebook.tags.slice(0, 4).map((tag) => (\n <Badge key={tag} variant=\"outline\">\n {tag}\n </Badge>\n ))}\n {notebook.tags.length > 4 ? (\n <span className=\"text-xs text-text-secondary\">\n +{notebook.tags.length - 4}\n </span>\n ) : null}\n </div>\n ) : null}\n </button>\n <ActionMenu\n ariaLabel={`Actions for ${notebook.title}`}\n entityName={notebook.title}\n onView={() => navigate(`notebooks/${notebook.id}`)}\n onEdit={() => navigate(`notebooks/${notebook.id}/edit`)}\n onDelete={\n notebook.status === 'ARCHIVED' ? undefined : () => handleArchive(notebook)\n }\n deleteLabel={tr(\n 'cosmicintersection.pages.notebooks.archive',\n 'Archive notebook'\n )}\n />\n </div>\n </li>\n ))}\n </ul>\n </>\n )}\n\n {!loading && !error && notebooks.length > 0 ? (\n <Pagination\n offset={pagination.offset}\n limit={pagination.limit}\n loadedCount={notebooks.length}\n hasMore={pageInfo?.hasMore ?? false}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel={tr('cosmicintersection.pages.notebooks.itemLabel', 'notebooks')}\n loading={loading}\n />\n ) : null}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PipelinesPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/pipelines/PipelinesPage.tsx"],"names":[],"mappings":"AAkDA,MAAM,CAAC,OAAO,UAAU,aAAa,4CA8SpC"}
1
+ {"version":3,"file":"PipelinesPage.d.ts","sourceRoot":"","sources":["../../../../src/cosmicintersection/pages/pipelines/PipelinesPage.tsx"],"names":[],"mappings":"AAmDA,MAAM,CAAC,OAAO,UAAU,aAAa,4CA0XpC"}