@burdenoff/microfe-cosmicintersection 2026.525.1 → 2026.704.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 (120) hide show
  1. package/dist/cosmicintersection/CosmicIntersectionRoot.js +38 -113
  2. package/dist/cosmicintersection/CosmicIntersectionRoot.js.map +1 -1
  3. package/dist/cosmicintersection/CosmicIntersectionRoutes.js +110 -44
  4. package/dist/cosmicintersection/CosmicIntersectionRoutes.js.map +1 -1
  5. package/dist/cosmicintersection/api/cosmicApi.js +918 -0
  6. package/dist/cosmicintersection/api/cosmicApi.js.map +1 -0
  7. package/dist/cosmicintersection/components/ActionMenu.js +106 -0
  8. package/dist/cosmicintersection/components/ActionMenu.js.map +1 -0
  9. package/dist/cosmicintersection/components/ActivityFeedPanel.js +68 -0
  10. package/dist/cosmicintersection/components/ActivityFeedPanel.js.map +1 -0
  11. package/dist/cosmicintersection/components/DiscussionPanel.js +57 -0
  12. package/dist/cosmicintersection/components/DiscussionPanel.js.map +1 -0
  13. package/dist/cosmicintersection/components/EmptyState.js +35 -0
  14. package/dist/cosmicintersection/components/EmptyState.js.map +1 -0
  15. package/dist/cosmicintersection/components/EntityFormShell.js +57 -0
  16. package/dist/cosmicintersection/components/EntityFormShell.js.map +1 -0
  17. package/dist/cosmicintersection/components/EntityTagsField.js +77 -0
  18. package/dist/cosmicintersection/components/EntityTagsField.js.map +1 -0
  19. package/dist/cosmicintersection/components/ErrorState.js +40 -0
  20. package/dist/cosmicintersection/components/ErrorState.js.map +1 -0
  21. package/dist/cosmicintersection/components/FileUploadField.js +146 -0
  22. package/dist/cosmicintersection/components/FileUploadField.js.map +1 -0
  23. package/dist/cosmicintersection/components/LoadingState.js +23 -0
  24. package/dist/cosmicintersection/components/LoadingState.js.map +1 -0
  25. package/dist/cosmicintersection/components/PageLayout.js +46 -0
  26. package/dist/cosmicintersection/components/PageLayout.js.map +1 -0
  27. package/dist/cosmicintersection/components/Pagination.js +65 -0
  28. package/dist/cosmicintersection/components/Pagination.js.map +1 -0
  29. package/dist/cosmicintersection/components/SafeLink.js +35 -0
  30. package/dist/cosmicintersection/components/SafeLink.js.map +1 -0
  31. package/dist/cosmicintersection/components/StatusBadge.js +53 -0
  32. package/dist/cosmicintersection/components/StatusBadge.js.map +1 -0
  33. package/dist/cosmicintersection/components/index.js +13 -0
  34. package/dist/cosmicintersection/context/CosmicIntersectionContext.js +46 -0
  35. package/dist/cosmicintersection/context/CosmicIntersectionContext.js.map +1 -0
  36. package/dist/cosmicintersection/index.js +0 -2
  37. package/dist/cosmicintersection/lib/mutationResult.js +12 -0
  38. package/dist/cosmicintersection/lib/mutationResult.js.map +1 -0
  39. package/dist/cosmicintersection/lib/toast.js +36 -0
  40. package/dist/cosmicintersection/lib/toast.js.map +1 -0
  41. package/dist/cosmicintersection/pages/access/AccessPage.js +347 -0
  42. package/dist/cosmicintersection/pages/access/AccessPage.js.map +1 -0
  43. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js +484 -0
  44. package/dist/cosmicintersection/pages/analyses/AnalysesPage.js.map +1 -0
  45. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js +177 -0
  46. package/dist/cosmicintersection/pages/collections/CollectionDetailPage.js.map +1 -0
  47. package/dist/cosmicintersection/pages/collections/CollectionFormPage.js +143 -0
  48. package/dist/cosmicintersection/pages/collections/CollectionFormPage.js.map +1 -0
  49. package/dist/cosmicintersection/pages/collections/CollectionsPage.js +112 -0
  50. package/dist/cosmicintersection/pages/collections/CollectionsPage.js.map +1 -0
  51. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js +246 -0
  52. package/dist/cosmicintersection/pages/dashboard/DashboardPage.js.map +1 -0
  53. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js +480 -0
  54. package/dist/cosmicintersection/pages/datasets/DatasetDetailPage.js.map +1 -0
  55. package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js +218 -0
  56. package/dist/cosmicintersection/pages/datasets/DatasetFormPage.js.map +1 -0
  57. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js +252 -0
  58. package/dist/cosmicintersection/pages/datasets/DatasetsPage.js.map +1 -0
  59. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js +402 -0
  60. package/dist/cosmicintersection/pages/notebooks/NotebookDetailPage.js.map +1 -0
  61. package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.js +313 -0
  62. package/dist/cosmicintersection/pages/notebooks/NotebookFormPage.js.map +1 -0
  63. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js +203 -0
  64. package/dist/cosmicintersection/pages/notebooks/NotebooksPage.js.map +1 -0
  65. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js +244 -0
  66. package/dist/cosmicintersection/pages/pipelines/PipelineDetailPage.js.map +1 -0
  67. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js +210 -0
  68. package/dist/cosmicintersection/pages/pipelines/PipelineFormPage.js.map +1 -0
  69. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js +193 -0
  70. package/dist/cosmicintersection/pages/pipelines/PipelinesPage.js.map +1 -0
  71. package/dist/cosmicintersection/pages/releases/ReleaseFormPage.js +184 -0
  72. package/dist/cosmicintersection/pages/releases/ReleaseFormPage.js.map +1 -0
  73. package/dist/cosmicintersection/pages/releases/ReleasesPage.js +418 -0
  74. package/dist/cosmicintersection/pages/releases/ReleasesPage.js.map +1 -0
  75. package/dist/cosmicintersection/pages/runs/RunDetailPage.js +380 -0
  76. package/dist/cosmicintersection/pages/runs/RunDetailPage.js.map +1 -0
  77. package/dist/cosmicintersection/pages/runs/RunsPage.js +165 -0
  78. package/dist/cosmicintersection/pages/runs/RunsPage.js.map +1 -0
  79. package/dist/cosmicintersection/pages/sources/SourceDetailPage.js +205 -0
  80. package/dist/cosmicintersection/pages/sources/SourceDetailPage.js.map +1 -0
  81. package/dist/cosmicintersection/pages/sources/SourceFormPage.js +229 -0
  82. package/dist/cosmicintersection/pages/sources/SourceFormPage.js.map +1 -0
  83. package/dist/cosmicintersection/pages/sources/SourcesPage.js +223 -0
  84. package/dist/cosmicintersection/pages/sources/SourcesPage.js.map +1 -0
  85. package/dist/cosmicintersection/utils/cn.js +10 -0
  86. package/dist/cosmicintersection/utils/cn.js.map +1 -0
  87. package/dist/index.js +2 -4
  88. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  89. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  90. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
  91. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  92. package/package.json +2 -1
  93. package/dist/cosmicintersection/pages/AiDiscoveryPage.js +0 -363
  94. package/dist/cosmicintersection/pages/AiDiscoveryPage.js.map +0 -1
  95. package/dist/cosmicintersection/pages/DashboardPage.js +0 -306
  96. package/dist/cosmicintersection/pages/DashboardPage.js.map +0 -1
  97. package/dist/cosmicintersection/pages/SpaceScienceCitizenPage.js +0 -287
  98. package/dist/cosmicintersection/pages/SpaceScienceCitizenPage.js.map +0 -1
  99. package/dist/cosmicintersection/pages/SpaceScienceDataPage.js +0 -385
  100. package/dist/cosmicintersection/pages/SpaceScienceDataPage.js.map +0 -1
  101. package/dist/cosmicintersection/pages/SpaceScienceDataPage1.js +0 -420
  102. package/dist/cosmicintersection/pages/SpaceScienceDataPage1.js.map +0 -1
  103. package/dist/cosmicintersection/pages/SpaceScienceLearningPage.js +0 -309
  104. package/dist/cosmicintersection/pages/SpaceScienceLearningPage.js.map +0 -1
  105. package/dist/cosmicintersection/pages/SpaceScienceLearningPage1.js +0 -361
  106. package/dist/cosmicintersection/pages/SpaceScienceLearningPage1.js.map +0 -1
  107. package/dist/cosmicintersection/pages/SpaceSciencePage.js +0 -194
  108. package/dist/cosmicintersection/pages/SpaceSciencePage.js.map +0 -1
  109. package/dist/cosmicintersection/pages/SpaceScienceResearchPage.js +0 -290
  110. package/dist/cosmicintersection/pages/SpaceScienceResearchPage.js.map +0 -1
  111. package/dist/cosmicintersection/pages/SpaceScienceSimulationPage.js +0 -279
  112. package/dist/cosmicintersection/pages/SpaceScienceSimulationPage.js.map +0 -1
  113. package/dist/cosmicintersection/providers/CosmicIntersectionProvider.js +0 -27
  114. package/dist/cosmicintersection/providers/CosmicIntersectionProvider.js.map +0 -1
  115. package/dist/cosmicintersection/store/cosmicintersectionStore.js +0 -478
  116. package/dist/cosmicintersection/store/cosmicintersectionStore.js.map +0 -1
  117. package/dist/cosmicintersection/utils/i18n.js +0 -15
  118. package/dist/cosmicintersection/utils/i18n.js.map +0 -1
  119. package/dist/cosmicintersection/utils/navigation.js +0 -8
  120. package/dist/cosmicintersection/utils/navigation.js.map +0 -1
@@ -0,0 +1,246 @@
1
+ import { useCosmicIntersection as e } from "../../context/CosmicIntersectionContext.js";
2
+ import { useCosDatasetsQuery as t, useCosNotebooksQuery as n, useCosPipelinesQuery as r, useCosReleasesQuery as i, useCosRunsQuery as a, useCosSourcesQuery as o } from "../../api/cosmicApi.js";
3
+ import s from "../../components/EmptyState.js";
4
+ import c from "../../components/PageLayout.js";
5
+ import l from "../../components/StatusBadge.js";
6
+ import "../../components/index.js";
7
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
8
+ import { Boxes as f, Database as p, FileText as m, NotebookPen as h, Plus as g, Radar as _, Rocket as v, Workflow as y } from "lucide-react";
9
+ import { Button as b } from "@burdenoff/fe-libs/ui";
10
+ //#region src/cosmicintersection/pages/dashboard/DashboardPage.tsx
11
+ var x = 50;
12
+ function S(e) {
13
+ if (!e) return "—";
14
+ let t = new Date(e);
15
+ return Number.isNaN(t.getTime()) ? "—" : t.toLocaleString();
16
+ }
17
+ function C(e) {
18
+ if (!e) return "—";
19
+ let t = e.items.length;
20
+ return e.pageInfo?.hasMore ? `${t}+` : String(t);
21
+ }
22
+ function w({ label: e, count: t, icon: n, loading: r, onClick: i }) {
23
+ return /* @__PURE__ */ d("button", {
24
+ type: "button",
25
+ onClick: i,
26
+ className: "flex flex-col gap-2 rounded-card border border-border-default bg-bg-elevated p-4 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
27
+ children: [/* @__PURE__ */ d("div", {
28
+ className: "flex items-center justify-between",
29
+ children: [/* @__PURE__ */ u("span", {
30
+ className: "text-sm font-medium text-text-secondary",
31
+ children: e
32
+ }), /* @__PURE__ */ u(n, {
33
+ className: "size-5 text-text-secondary",
34
+ "aria-hidden": "true"
35
+ })]
36
+ }), /* @__PURE__ */ u("span", {
37
+ className: "text-2xl font-semibold tabular-nums text-text-primary",
38
+ children: r ? "…" : t
39
+ })]
40
+ });
41
+ }
42
+ function T() {
43
+ let { navigate: T } = e(), E = t({ pagination: {
44
+ limit: x,
45
+ offset: 0
46
+ } }), D = o({ pagination: {
47
+ limit: x,
48
+ offset: 0
49
+ } }), O = r({ pagination: {
50
+ limit: x,
51
+ offset: 0
52
+ } }), k = a({ pagination: {
53
+ limit: x,
54
+ offset: 0
55
+ } }), A = n({ pagination: {
56
+ limit: x,
57
+ offset: 0
58
+ } }), j = i({ pagination: {
59
+ limit: x,
60
+ offset: 0
61
+ } }), M = i({
62
+ status: "PUBLISHED",
63
+ pagination: {
64
+ limit: 5,
65
+ offset: 0
66
+ }
67
+ }), N = (k.data?.cosListRuns?.items ?? []).slice(0, 6), P = M.data?.cosListReleases?.items ?? [];
68
+ return /* @__PURE__ */ u(c, {
69
+ title: "CosmicIntersection",
70
+ description: "A federation workspace for science data — sources, datasets, pipelines, notebooks and releases in one place.",
71
+ actions: /* @__PURE__ */ d(b, {
72
+ type: "button",
73
+ onClick: () => T("datasets/create"),
74
+ children: [/* @__PURE__ */ u(g, { className: "size-4" }), "New dataset"]
75
+ }),
76
+ children: /* @__PURE__ */ d("div", {
77
+ className: "space-y-6",
78
+ children: [
79
+ /* @__PURE__ */ d("div", {
80
+ className: "grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6",
81
+ children: [
82
+ /* @__PURE__ */ u(w, {
83
+ label: "Datasets",
84
+ icon: p,
85
+ loading: E.loading,
86
+ count: C(E.data?.cosListDatasets),
87
+ onClick: () => T("datasets")
88
+ }),
89
+ /* @__PURE__ */ u(w, {
90
+ label: "Sources",
91
+ icon: _,
92
+ loading: D.loading,
93
+ count: C(D.data?.cosListSources),
94
+ onClick: () => T("sources")
95
+ }),
96
+ /* @__PURE__ */ u(w, {
97
+ label: "Pipelines",
98
+ icon: y,
99
+ loading: O.loading,
100
+ count: C(O.data?.cosListPipelines),
101
+ onClick: () => T("pipelines")
102
+ }),
103
+ /* @__PURE__ */ u(w, {
104
+ label: "Runs",
105
+ icon: f,
106
+ loading: k.loading,
107
+ count: C(k.data?.cosListRuns),
108
+ onClick: () => T("runs")
109
+ }),
110
+ /* @__PURE__ */ u(w, {
111
+ label: "Notebooks",
112
+ icon: h,
113
+ loading: A.loading,
114
+ count: C(A.data?.cosListNotebooks),
115
+ onClick: () => T("notebooks")
116
+ }),
117
+ /* @__PURE__ */ u(w, {
118
+ label: "Releases",
119
+ icon: m,
120
+ loading: j.loading,
121
+ count: C(j.data?.cosListReleases),
122
+ onClick: () => T("releases")
123
+ })
124
+ ]
125
+ }),
126
+ /* @__PURE__ */ d("div", {
127
+ className: "rounded-card border border-border-default bg-bg-elevated p-5",
128
+ children: [/* @__PURE__ */ u("h2", {
129
+ className: "text-sm font-semibold text-text-primary",
130
+ children: "Quick actions"
131
+ }), /* @__PURE__ */ d("div", {
132
+ className: "mt-3 flex flex-wrap gap-2",
133
+ children: [
134
+ /* @__PURE__ */ d(b, {
135
+ type: "button",
136
+ variant: "outline",
137
+ onClick: () => T("datasets/create"),
138
+ children: [/* @__PURE__ */ u(p, { className: "size-4" }), "Register dataset"]
139
+ }),
140
+ /* @__PURE__ */ d(b, {
141
+ type: "button",
142
+ variant: "outline",
143
+ onClick: () => T("sources/create"),
144
+ children: [/* @__PURE__ */ u(_, { className: "size-4" }), "Connect source"]
145
+ }),
146
+ /* @__PURE__ */ d(b, {
147
+ type: "button",
148
+ variant: "outline",
149
+ onClick: () => T("pipelines/create"),
150
+ children: [/* @__PURE__ */ u(y, { className: "size-4" }), "Create pipeline"]
151
+ })
152
+ ]
153
+ })]
154
+ }),
155
+ /* @__PURE__ */ d("div", {
156
+ className: "grid grid-cols-1 gap-6 lg:grid-cols-2",
157
+ children: [/* @__PURE__ */ d("section", {
158
+ className: "space-y-3",
159
+ children: [/* @__PURE__ */ d("div", {
160
+ className: "flex items-center justify-between",
161
+ children: [/* @__PURE__ */ u("h2", {
162
+ className: "text-lg font-semibold text-text-primary",
163
+ children: "Recent runs"
164
+ }), /* @__PURE__ */ u("button", {
165
+ type: "button",
166
+ onClick: () => T("runs"),
167
+ className: "text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline",
168
+ children: "View all"
169
+ })]
170
+ }), k.loading ? /* @__PURE__ */ u("div", {
171
+ className: "space-y-2",
172
+ children: Array.from({ length: 3 }).map((e, t) => /* @__PURE__ */ u("div", { className: "h-14 animate-pulse rounded-card bg-bg-sunken" }, t))
173
+ }) : N.length === 0 ? /* @__PURE__ */ u(s, {
174
+ icon: f,
175
+ title: "No pipeline runs yet.",
176
+ description: "Start a pipeline run to see execution history here."
177
+ }) : /* @__PURE__ */ u("ul", {
178
+ className: "space-y-2",
179
+ children: N.map((e) => /* @__PURE__ */ u("li", { children: /* @__PURE__ */ d("button", {
180
+ type: "button",
181
+ onClick: () => T(`runs/${e.id}`),
182
+ className: "flex w-full items-center justify-between gap-3 rounded-card border border-border-default bg-bg-elevated px-4 py-3 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken",
183
+ children: [/* @__PURE__ */ d("div", {
184
+ className: "min-w-0",
185
+ children: [/* @__PURE__ */ d("p", {
186
+ className: "font-medium text-text-primary",
187
+ children: ["Run #", e.runNumber]
188
+ }), /* @__PURE__ */ u("p", {
189
+ className: "text-xs text-text-secondary",
190
+ children: e.startedAt ? `Started ${S(e.startedAt)}` : "Not started"
191
+ })]
192
+ }), /* @__PURE__ */ u(l, { status: e.status })]
193
+ }) }, e.id))
194
+ })]
195
+ }), /* @__PURE__ */ d("section", {
196
+ className: "space-y-3",
197
+ children: [/* @__PURE__ */ d("div", {
198
+ className: "flex items-center justify-between",
199
+ children: [/* @__PURE__ */ u("h2", {
200
+ className: "text-lg font-semibold text-text-primary",
201
+ children: "Recently published"
202
+ }), /* @__PURE__ */ u("button", {
203
+ type: "button",
204
+ onClick: () => T("releases"),
205
+ className: "text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline",
206
+ children: "View all"
207
+ })]
208
+ }), M.loading ? /* @__PURE__ */ u("div", {
209
+ className: "space-y-2",
210
+ children: Array.from({ length: 3 }).map((e, t) => /* @__PURE__ */ u("div", { className: "h-14 animate-pulse rounded-card bg-bg-sunken" }, t))
211
+ }) : P.length === 0 ? /* @__PURE__ */ u(s, {
212
+ icon: v,
213
+ title: "No published releases yet.",
214
+ description: "Publish a release to share datasets and notebooks with a citable version."
215
+ }) : /* @__PURE__ */ u("ul", {
216
+ className: "space-y-2",
217
+ children: P.map((e) => /* @__PURE__ */ u("li", { children: /* @__PURE__ */ d("button", {
218
+ type: "button",
219
+ onClick: () => T("releases"),
220
+ className: "flex w-full items-center justify-between gap-3 rounded-card border border-border-default bg-bg-elevated px-4 py-3 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken",
221
+ children: [/* @__PURE__ */ d("div", {
222
+ className: "min-w-0",
223
+ children: [/* @__PURE__ */ u("p", {
224
+ className: "truncate font-medium text-text-primary",
225
+ children: e.title
226
+ }), /* @__PURE__ */ d("p", {
227
+ className: "text-xs text-text-secondary",
228
+ children: [
229
+ "v",
230
+ e.version,
231
+ e.publishedAt ? ` · Published ${S(e.publishedAt)}` : ""
232
+ ]
233
+ })]
234
+ }), /* @__PURE__ */ u(l, { status: e.status })]
235
+ }) }, e.id))
236
+ })]
237
+ })]
238
+ })
239
+ ]
240
+ })
241
+ });
242
+ }
243
+ //#endregion
244
+ export { T as default };
245
+
246
+ //# sourceMappingURL=DashboardPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../../src/cosmicintersection/pages/dashboard/DashboardPage.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\nimport {\n Boxes,\n Database,\n FileText,\n NotebookPen,\n Plus,\n Radar,\n Rocket,\n Workflow,\n} from 'lucide-react';\nimport { Button } from '@burdenoff/fe-libs/ui';\n\nimport {\n useCosDatasetsQuery,\n useCosNotebooksQuery,\n useCosPipelinesQuery,\n useCosReleasesQuery,\n useCosRunsQuery,\n useCosSourcesQuery,\n type CosConnection,\n} from '../../api/cosmicApi';\nimport { EmptyState, PageLayout, StatusBadge } from '../../components';\nimport { useCosmicIntersection } from '../../context/CosmicIntersectionContext';\n\nconst TILE_LIMIT = 50;\n\nfunction formatDateTime(raw: string | null | undefined): string {\n if (!raw) {\n return '—';\n }\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? '—' : date.toLocaleString();\n}\n\n/** \"13\" or \"50+\" — the honest count of the page we fetched, never a fabricated total. */\nfunction connectionCount<T>(connection: CosConnection<T> | undefined): string {\n if (!connection) {\n return '—';\n }\n const loaded = connection.items.length;\n return connection.pageInfo?.hasMore ? `${loaded}+` : String(loaded);\n}\n\ninterface SummaryTileProps {\n label: string;\n count: string;\n icon: LucideIcon;\n loading: boolean;\n onClick: () => void;\n}\n\nfunction SummaryTile({ label, count, icon: Icon, loading, onClick }: SummaryTileProps) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex flex-col gap-2 rounded-card border border-border-default bg-bg-elevated p-4 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus\"\n >\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-text-secondary\">{label}</span>\n <Icon className=\"size-5 text-text-secondary\" aria-hidden=\"true\" />\n </div>\n <span className=\"text-2xl font-semibold tabular-nums text-text-primary\">\n {loading ? '…' : count}\n </span>\n </button>\n );\n}\n\nexport default function DashboardPage() {\n const { navigate } = useCosmicIntersection();\n\n const datasetsQuery = useCosDatasetsQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const sourcesQuery = useCosSourcesQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const pipelinesQuery = useCosPipelinesQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const runsQuery = useCosRunsQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const notebooksQuery = useCosNotebooksQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const releasesQuery = useCosReleasesQuery({ pagination: { limit: TILE_LIMIT, offset: 0 } });\n const publishedQuery = useCosReleasesQuery({\n status: 'PUBLISHED',\n pagination: { limit: 5, offset: 0 },\n });\n\n const recentRuns = (runsQuery.data?.cosListRuns?.items ?? []).slice(0, 6);\n const publishedReleases = publishedQuery.data?.cosListReleases?.items ?? [];\n\n return (\n <PageLayout\n title=\"CosmicIntersection\"\n description=\"A federation workspace for science data — sources, datasets, pipelines, notebooks and releases in one place.\"\n actions={\n <Button type=\"button\" onClick={() => navigate('datasets/create')}>\n <Plus className=\"size-4\" />\n New dataset\n </Button>\n }\n >\n <div className=\"space-y-6\">\n {/* Summary tiles */}\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6\">\n <SummaryTile\n label=\"Datasets\"\n icon={Database}\n loading={datasetsQuery.loading}\n count={connectionCount(datasetsQuery.data?.cosListDatasets)}\n onClick={() => navigate('datasets')}\n />\n <SummaryTile\n label=\"Sources\"\n icon={Radar}\n loading={sourcesQuery.loading}\n count={connectionCount(sourcesQuery.data?.cosListSources)}\n onClick={() => navigate('sources')}\n />\n <SummaryTile\n label=\"Pipelines\"\n icon={Workflow}\n loading={pipelinesQuery.loading}\n count={connectionCount(pipelinesQuery.data?.cosListPipelines)}\n onClick={() => navigate('pipelines')}\n />\n <SummaryTile\n label=\"Runs\"\n icon={Boxes}\n loading={runsQuery.loading}\n count={connectionCount(runsQuery.data?.cosListRuns)}\n onClick={() => navigate('runs')}\n />\n <SummaryTile\n label=\"Notebooks\"\n icon={NotebookPen}\n loading={notebooksQuery.loading}\n count={connectionCount(notebooksQuery.data?.cosListNotebooks)}\n onClick={() => navigate('notebooks')}\n />\n <SummaryTile\n label=\"Releases\"\n icon={FileText}\n loading={releasesQuery.loading}\n count={connectionCount(releasesQuery.data?.cosListReleases)}\n onClick={() => navigate('releases')}\n />\n </div>\n\n {/* Quick actions */}\n <div className=\"rounded-card border border-border-default bg-bg-elevated p-5\">\n <h2 className=\"text-sm font-semibold text-text-primary\">Quick actions</h2>\n <div className=\"mt-3 flex flex-wrap gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('datasets/create')}>\n <Database className=\"size-4\" />\n Register dataset\n </Button>\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('sources/create')}>\n <Radar className=\"size-4\" />\n Connect source\n </Button>\n <Button type=\"button\" variant=\"outline\" onClick={() => navigate('pipelines/create')}>\n <Workflow className=\"size-4\" />\n Create pipeline\n </Button>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n {/* Recent runs */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Recent runs</h2>\n <button\n type=\"button\"\n onClick={() => navigate('runs')}\n className=\"text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline\"\n >\n View all\n </button>\n </div>\n {runsQuery.loading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"h-14 animate-pulse rounded-card bg-bg-sunken\" />\n ))}\n </div>\n ) : recentRuns.length === 0 ? (\n <EmptyState\n icon={Boxes}\n title=\"No pipeline runs yet.\"\n description=\"Start a pipeline run to see execution history here.\"\n />\n ) : (\n <ul className=\"space-y-2\">\n {recentRuns.map((run) => (\n <li key={run.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`runs/${run.id}`)}\n className=\"flex w-full items-center justify-between gap-3 rounded-card border border-border-default bg-bg-elevated px-4 py-3 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken\"\n >\n <div className=\"min-w-0\">\n <p className=\"font-medium text-text-primary\">Run #{run.runNumber}</p>\n <p className=\"text-xs text-text-secondary\">\n {run.startedAt\n ? `Started ${formatDateTime(run.startedAt)}`\n : 'Not started'}\n </p>\n </div>\n <StatusBadge status={run.status} />\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n {/* Recently published releases */}\n <section className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Recently published</h2>\n <button\n type=\"button\"\n onClick={() => navigate('releases')}\n className=\"text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline\"\n >\n View all\n </button>\n </div>\n {publishedQuery.loading ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"h-14 animate-pulse rounded-card bg-bg-sunken\" />\n ))}\n </div>\n ) : publishedReleases.length === 0 ? (\n <EmptyState\n icon={Rocket}\n title=\"No published releases yet.\"\n description=\"Publish a release to share datasets and notebooks with a citable version.\"\n />\n ) : (\n <ul className=\"space-y-2\">\n {publishedReleases.map((release) => (\n <li key={release.id}>\n <button\n type=\"button\"\n onClick={() => navigate('releases')}\n className=\"flex w-full items-center justify-between gap-3 rounded-card border border-border-default bg-bg-elevated px-4 py-3 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken\"\n >\n <div className=\"min-w-0\">\n <p className=\"truncate font-medium text-text-primary\">{release.title}</p>\n <p className=\"text-xs text-text-secondary\">\n v{release.version}\n {release.publishedAt\n ? ` · Published ${formatDateTime(release.publishedAt)}`\n : ''}\n </p>\n </div>\n <StatusBadge status={release.status} />\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;;;AAyBA,IAAM,IAAa;AAEnB,SAAS,EAAe,GAAwC;AAC9D,KAAI,CAAC,EACH,QAAO;CAET,IAAM,IAAO,IAAI,KAAK,EAAI;AAC1B,QAAO,OAAO,MAAM,EAAK,SAAS,CAAC,GAAG,MAAM,EAAK,gBAAgB;;AAInE,SAAS,EAAmB,GAAkD;AAC5E,KAAI,CAAC,EACH,QAAO;CAET,IAAM,IAAS,EAAW,MAAM;AAChC,QAAO,EAAW,UAAU,UAAU,GAAG,EAAO,KAAK,OAAO,EAAO;;AAWrE,SAAS,EAAY,EAAE,UAAO,UAAO,MAAM,GAAM,YAAS,cAA6B;AACrF,QACE,kBAAC,UAAD;EACE,MAAK;EACI;EACT,WAAU;YAHZ,CAKE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IAAM,WAAU;cAA2C;IAAa,CAAA,EACxE,kBAAC,GAAD;IAAM,WAAU;IAA6B,eAAY;IAAS,CAAA,CAC9D;MACN,kBAAC,QAAD;GAAM,WAAU;aACb,IAAU,MAAM;GACZ,CAAA,CACA;;;AAIb,SAAwB,IAAgB;CACtC,IAAM,EAAE,gBAAa,GAAuB,EAEtC,IAAgB,EAAoB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;EAAG,EAAE,CAAC,EACrF,IAAe,EAAmB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;EAAG,EAAE,CAAC,EACnF,IAAiB,EAAqB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;EAAG,EAAE,CAAC,EACvF,IAAY,EAAgB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;EAAG,EAAE,CAAC,EAC7E,IAAiB,EAAqB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;EAAG,EAAE,CAAC,EACvF,IAAgB,EAAoB,EAAE,YAAY;EAAE,OAAO;EAAY,QAAQ;EAAG,EAAE,CAAC,EACrF,IAAiB,EAAoB;EACzC,QAAQ;EACR,YAAY;GAAE,OAAO;GAAG,QAAQ;GAAG;EACpC,CAAC,EAEI,KAAc,EAAU,MAAM,aAAa,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,EACnE,IAAoB,EAAe,MAAM,iBAAiB,SAAS,EAAE;AAE3E,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,GAAD;GAAQ,MAAK;GAAS,eAAe,EAAS,kBAAkB;aAAhE,CACE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,EAAA,cAEpB;;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf;IAEE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAc;OACvB,OAAO,EAAgB,EAAc,MAAM,gBAAgB;OAC3D,eAAe,EAAS,WAAW;OACnC,CAAA;MACF,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAa;OACtB,OAAO,EAAgB,EAAa,MAAM,eAAe;OACzD,eAAe,EAAS,UAAU;OAClC,CAAA;MACF,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAe;OACxB,OAAO,EAAgB,EAAe,MAAM,iBAAiB;OAC7D,eAAe,EAAS,YAAY;OACpC,CAAA;MACF,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAU;OACnB,OAAO,EAAgB,EAAU,MAAM,YAAY;OACnD,eAAe,EAAS,OAAO;OAC/B,CAAA;MACF,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAe;OACxB,OAAO,EAAgB,EAAe,MAAM,iBAAiB;OAC7D,eAAe,EAAS,YAAY;OACpC,CAAA;MACF,kBAAC,GAAD;OACE,OAAM;OACN,MAAM;OACN,SAAS,EAAc;OACvB,OAAO,EAAgB,EAAc,MAAM,gBAAgB;OAC3D,eAAe,EAAS,WAAW;OACnC,CAAA;MACE;;IAGN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,MAAD;MAAI,WAAU;gBAA0C;MAAkB,CAAA,EAC1E,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,GAAD;QAAQ,MAAK;QAAS,SAAQ;QAAU,eAAe,EAAS,kBAAkB;kBAAlF,CACE,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA,EAAA,mBAExB;;OACT,kBAAC,GAAD;QAAQ,MAAK;QAAS,SAAQ;QAAU,eAAe,EAAS,iBAAiB;kBAAjF,CACE,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA,EAAA,iBAErB;;OACT,kBAAC,GAAD;QAAQ,MAAK;QAAS,SAAQ;QAAU,eAAe,EAAS,mBAAmB;kBAAnF,CACE,kBAAC,GAAD,EAAU,WAAU,UAAW,CAAA,EAAA,kBAExB;;OACL;QACF;;IAEN,kBAAC,OAAD;KAAK,WAAU;eAAf,CAEE,kBAAC,WAAD;MAAS,WAAU;gBAAnB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,MAAD;QAAI,WAAU;kBAA0C;QAAgB,CAAA,EACxE,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAS,OAAO;QAC/B,WAAU;kBACX;QAEQ,CAAA,CACL;UACL,EAAU,UACT,kBAAC,OAAD;OAAK,WAAU;iBACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,OAAD,EAAiB,WAAU,gDAAiD,EAAlE,EAAkE,CAC5E;OACE,CAAA,GACJ,EAAW,WAAW,IACxB,kBAAC,GAAD;OACE,MAAM;OACN,OAAM;OACN,aAAY;OACZ,CAAA,GAEF,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAW,KAAK,MACf,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAS,QAAQ,EAAI,KAAK;QACzC,WAAU;kBAHZ,CAKE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,KAAD;UAAG,WAAU;oBAAb,CAA6C,SAAM,EAAI,UAAc;aACrE,kBAAC,KAAD;UAAG,WAAU;oBACV,EAAI,YACD,WAAW,EAAe,EAAI,UAAU,KACxC;UACF,CAAA,CACA;YACN,kBAAC,GAAD,EAAa,QAAQ,EAAI,QAAU,CAAA,CAC5B;WACN,EAhBI,EAAI,GAgBR,CACL;OACC,CAAA,CAEC;SAGV,kBAAC,WAAD;MAAS,WAAU;gBAAnB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,MAAD;QAAI,WAAU;kBAA0C;QAAuB,CAAA,EAC/E,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAS,WAAW;QACnC,WAAU;kBACX;QAEQ,CAAA,CACL;UACL,EAAe,UACd,kBAAC,OAAD;OAAK,WAAU;iBACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,OAAD,EAAiB,WAAU,gDAAiD,EAAlE,EAAkE,CAC5E;OACE,CAAA,GACJ,EAAkB,WAAW,IAC/B,kBAAC,GAAD;OACE,MAAM;OACN,OAAM;OACN,aAAY;OACZ,CAAA,GAEF,kBAAC,MAAD;OAAI,WAAU;iBACX,EAAkB,KAAK,MACtB,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAS,WAAW;QACnC,WAAU;kBAHZ,CAKE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,KAAD;UAAG,WAAU;oBAA0C,EAAQ;UAAU,CAAA,EACzE,kBAAC,KAAD;UAAG,WAAU;oBAAb;WAA2C;WACvC,EAAQ;WACT,EAAQ,cACL,gBAAgB,EAAe,EAAQ,YAAY,KACnD;WACF;YACA;YACN,kBAAC,GAAD,EAAa,QAAQ,EAAQ,QAAU,CAAA,CAChC;WACN,EAjBI,EAAQ,GAiBZ,CACL;OACC,CAAA,CAEC;QACN;;IACF;;EACK,CAAA"}