@burdenoff/microfe-export 2026.801.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 (51) hide show
  1. package/dist/export/ExportRoot.d.ts.map +1 -1
  2. package/dist/export/ExportRoot.js +41 -36
  3. package/dist/export/ExportRoot.js.map +1 -1
  4. package/dist/export/ExportRoutes.d.ts.map +1 -1
  5. package/dist/export/ExportRoutes.js +75 -66
  6. package/dist/export/ExportRoutes.js.map +1 -1
  7. package/dist/export/components/ExportProgressBar.d.ts.map +1 -1
  8. package/dist/export/components/ExportProgressBar.js +19 -18
  9. package/dist/export/components/ExportProgressBar.js.map +1 -1
  10. package/dist/export/components/ExportStatusBadge.d.ts.map +1 -1
  11. package/dist/export/components/ExportStatusBadge.js +19 -20
  12. package/dist/export/components/ExportStatusBadge.js.map +1 -1
  13. package/dist/export/hooks/useTr.d.ts +19 -0
  14. package/dist/export/hooks/useTr.d.ts.map +1 -0
  15. package/dist/export/hooks/useTr.js +15 -0
  16. package/dist/export/hooks/useTr.js.map +1 -0
  17. package/dist/export/index.d.ts +1 -0
  18. package/dist/export/index.d.ts.map +1 -1
  19. package/dist/export/index.js +1 -0
  20. package/dist/export/pages/CreateExportPage.d.ts +4 -0
  21. package/dist/export/pages/CreateExportPage.d.ts.map +1 -1
  22. package/dist/export/pages/CreateExportPage.js +271 -283
  23. package/dist/export/pages/CreateExportPage.js.map +1 -1
  24. package/dist/export/pages/ExportDashboardPage.d.ts.map +1 -1
  25. package/dist/export/pages/ExportDashboardPage.js +71 -72
  26. package/dist/export/pages/ExportDashboardPage.js.map +1 -1
  27. package/dist/export/pages/ExportDetailPage.d.ts.map +1 -1
  28. package/dist/export/pages/ExportDetailPage.js +171 -173
  29. package/dist/export/pages/ExportDetailPage.js.map +1 -1
  30. package/dist/export/pages/ExportHistoryPage.d.ts.map +1 -1
  31. package/dist/export/pages/ExportHistoryPage.js +110 -111
  32. package/dist/export/pages/ExportHistoryPage.js.map +1 -1
  33. package/dist/export/pages/ExportLandingPage.d.ts.map +1 -1
  34. package/dist/export/pages/ExportLandingPage.js +28 -27
  35. package/dist/export/pages/ExportLandingPage.js.map +1 -1
  36. package/dist/export/pages/ExportTemplatesPage.d.ts.map +1 -1
  37. package/dist/export/pages/ExportTemplatesPage.js +115 -116
  38. package/dist/export/pages/ExportTemplatesPage.js.map +1 -1
  39. package/dist/export/pages/TemplateDetailPage.d.ts.map +1 -1
  40. package/dist/export/pages/TemplateDetailPage.js +122 -118
  41. package/dist/export/pages/TemplateDetailPage.js.map +1 -1
  42. package/dist/export/utils/i18n.d.ts +18 -2
  43. package/dist/export/utils/i18n.d.ts.map +1 -1
  44. package/dist/export/utils/i18n.js +2 -9
  45. package/dist/export/utils/i18n.js.map +1 -1
  46. package/dist/index.js +2 -1
  47. package/dist/translations/en.d.ts +454 -0
  48. package/dist/translations/en.d.ts.map +1 -0
  49. package/dist/translations/en.js +417 -0
  50. package/dist/translations/en.js.map +1 -0
  51. package/package.json +2 -2
@@ -1,18 +1,19 @@
1
1
  import { useExport as e } from "../providers/ExportProvider.js";
2
- import { useCancelExportJob as t, useDeleteExportJob as n, useExportJob as r, useExportJobProgress as ee, useRetryExportJob as te } from "../hooks/useExportQueries.js";
3
- import { cn as i } from "../utils/cn.js";
4
- import { getArchiveFormatDisplayName as ne, getFormatDisplayName as re } from "../constants/enums.js";
5
- import { ExportStatusBadge as a } from "../components/ExportStatusBadge.js";
6
- import { ExportProgressBar as o } from "../components/ExportProgressBar.js";
7
- import { PageLayout as s, PageSection as c } from "../components/PageLayout.js";
8
- import { nativeImpact as l, nativeNotify as u } from "../../utils/nativeBridge.js";
9
- import { useState as d } from "react";
10
- import { AlertCircle as f, ArrowLeft as p, CheckCircle2 as m, Clock as h, Download as g, FileDown as ie, FileText as ae, HardDrive as _, Loader2 as v, RotateCcw as y, Trash2 as b, XCircle as x } from "lucide-react";
11
- import { useNavigate as S, useParams as oe } from "react-router";
12
- import { jsx as C, jsxs as w } from "react/jsx-runtime";
13
- import { CTAOverflowMenu as T, GlassCard as E, IllustratedEmptyState as D, NextSteps as O } from "@burdenoff/fe-libs/ui";
2
+ import { useTr as t } from "../hooks/useTr.js";
3
+ import { useCancelExportJob as n, useDeleteExportJob as r, useExportJob as ee, useExportJobProgress as i, useRetryExportJob as a } from "../hooks/useExportQueries.js";
4
+ import { cn as o } from "../utils/cn.js";
5
+ import { getArchiveFormatDisplayName as s, getFormatDisplayName as c } from "../constants/enums.js";
6
+ import { ExportStatusBadge as te } from "../components/ExportStatusBadge.js";
7
+ import { ExportProgressBar as ne } from "../components/ExportProgressBar.js";
8
+ import { PageLayout as l, PageSection as re } from "../components/PageLayout.js";
9
+ import { nativeImpact as ie, nativeNotify as u } from "../../utils/nativeBridge.js";
10
+ import { useState as ae } from "react";
11
+ import { AlertCircle as oe, ArrowLeft as d, CheckCircle2 as f, Clock as p, Download as m, FileDown as h, FileText as g, HardDrive as se, Loader2 as _, RotateCcw as v, Trash2 as y, XCircle as ce } from "lucide-react";
12
+ import { useNavigate as le, useParams as ue } from "react-router";
13
+ import { jsx as b, jsxs as x } from "react/jsx-runtime";
14
+ import { CTAOverflowMenu as S, GlassCard as C, IllustratedEmptyState as w, NextSteps as T } from "@burdenoff/fe-libs/ui";
14
15
  //#region src/export/pages/ExportDetailPage.tsx
15
- function k(e) {
16
+ function E(e) {
16
17
  if (e === 0) return "0 B";
17
18
  let t = 1024, n = [
18
19
  "B",
@@ -23,170 +24,170 @@ function k(e) {
23
24
  ], r = Math.floor(Math.log(e) / Math.log(t));
24
25
  return `${parseFloat((e / t ** +r).toFixed(2))} ${n[r]}`;
25
26
  }
26
- var A = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
27
- function j() {
28
- let { jobId: j } = oe(), { basePath: M = "/", navigate: N } = e(), P = S(), F = () => {
29
- window.history.length > 1 ? P(-1) : N?.(M);
30
- }, { data: I, isLoading: L } = r(j), { data: R } = ee(j), [z, B] = d(null), { cancelJob: se, isPending: V } = t(), { deleteJob: H, isPending: U } = n(), { retryJob: W, isPending: G } = te(), K = R ?? I ?? null, q = K?.status === "CREATED" || K?.status === "QUEUED" || K?.status === "RUNNING", J = K?.status === "COMPLETED", ce = K?.status === "FAILED", Y = K?.status === "FAILED" || K?.status === "CANCELLED" || K?.status === "EXPIRED", le = async () => {
31
- j && B("cancel");
32
- }, ue = async () => {
33
- j && (l("medium"), B("delete"));
34
- }, de = async () => {
35
- if (!(!j || !z)) {
27
+ var D = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
28
+ function O() {
29
+ let { jobId: O } = ue(), { basePath: k = "/", navigate: A } = e(), j = le(), M = t(), N = () => {
30
+ window.history.length > 1 ? j(-1) : A?.(k);
31
+ }, { data: P, isLoading: F } = ee(O), { data: I } = i(O), [L, R] = ae(null), { cancelJob: z, isPending: B } = n(), { deleteJob: V, isPending: H } = r(), { retryJob: U, isPending: W } = a(), G = I ?? P ?? null, K = G?.status === "CREATED" || G?.status === "QUEUED" || G?.status === "RUNNING", q = G?.status === "COMPLETED", J = G?.status === "FAILED", Y = G?.status === "FAILED" || G?.status === "CANCELLED" || G?.status === "EXPIRED", de = async () => {
32
+ O && R("cancel");
33
+ }, fe = async () => {
34
+ O && (ie("medium"), R("delete"));
35
+ }, pe = async () => {
36
+ if (!(!O || !L)) {
36
37
  try {
37
- z === "cancel" ? await se(j) : (await H(j), N?.(M)), u("success");
38
+ L === "cancel" ? await z(O) : (await V(O), A?.(k)), u("success");
38
39
  } catch {
39
40
  u("error");
40
41
  }
41
- B(null);
42
+ R(null);
42
43
  }
43
44
  }, X = async () => {
44
- if (!j) return;
45
- let e = await W(j);
46
- e?.id && N?.(A(M, e.id));
47
- }, Z = K?.parts.find((e) => e.downloadUrl);
48
- if (L) return /* @__PURE__ */ w("div", {
45
+ if (!O) return;
46
+ let e = await U(O);
47
+ e?.id && A?.(D(k, e.id));
48
+ }, Z = G?.parts.find((e) => e.downloadUrl);
49
+ if (F) return /* @__PURE__ */ x("div", {
49
50
  className: "flex flex-col items-center justify-center py-20",
50
- children: [/* @__PURE__ */ C(v, {
51
+ children: [/* @__PURE__ */ b(_, {
51
52
  size: 48,
52
53
  className: "animate-spin text-primary"
53
- }), /* @__PURE__ */ C("span", {
54
+ }), /* @__PURE__ */ b("span", {
54
55
  className: "mt-6 text-sm font-medium text-text-secondary",
55
- children: "Loading export details…"
56
+ children: M("export.detail.loading", "Loading export details…")
56
57
  })]
57
58
  });
58
- if (!K) return /* @__PURE__ */ w(s, {
59
+ if (!G) return /* @__PURE__ */ x(l, {
59
60
  showHeader: !1,
60
- children: [/* @__PURE__ */ w("div", {
61
+ children: [/* @__PURE__ */ x("div", {
61
62
  className: "flex items-center gap-3 mb-6",
62
- children: [/* @__PURE__ */ C("button", {
63
+ children: [/* @__PURE__ */ b("button", {
63
64
  type: "button",
64
- onClick: F,
65
- "aria-label": "Go back",
65
+ onClick: N,
66
+ "aria-label": M("export.detail.actions.back", "Go back"),
66
67
  className: "p-2.5 hover:bg-accent rounded-lg transition-all duration-200",
67
- children: /* @__PURE__ */ C(p, { size: 20 })
68
- }), /* @__PURE__ */ C("h1", {
68
+ children: /* @__PURE__ */ b(d, { size: 20 })
69
+ }), /* @__PURE__ */ b("h1", {
69
70
  className: "text-xl font-bold",
70
- children: "Export Not Found"
71
+ children: M("export.detail.notFound.title", "Export Not Found")
71
72
  })]
72
- }), /* @__PURE__ */ C(D, {
73
+ }), /* @__PURE__ */ b(w, {
73
74
  illustration: "empty-data",
74
- title: "Export not found",
75
- description: "The export job you are looking for does not exist or has been deleted.",
76
- action: /* @__PURE__ */ w("button", {
75
+ title: M("export.detail.notFound.heading", "Export not found"),
76
+ description: M("export.detail.notFound.description", "The export job you are looking for does not exist or has been deleted."),
77
+ action: /* @__PURE__ */ x("button", {
77
78
  type: "button",
78
- onClick: F,
79
+ onClick: N,
79
80
  className: "inline-flex items-center gap-2 px-6 py-3 bg-action-primary-bg text-action-primary-text rounded-lg hover:bg-action-primary-bg/90 transition-colors font-medium",
80
- children: [/* @__PURE__ */ C(p, { size: 18 }), "Back to Dashboard"]
81
+ children: [/* @__PURE__ */ b(d, { size: 18 }), M("export.detail.actions.backToDashboard", "Back to Dashboard")]
81
82
  })
82
83
  })]
83
84
  });
84
85
  let Q = Z ? {
85
- label: "Download",
86
- icon: /* @__PURE__ */ C(g, { size: 16 }),
86
+ label: M("export.detail.actions.download", "Download"),
87
+ icon: /* @__PURE__ */ b(m, { size: 16 }),
87
88
  onSelect: () => {
88
89
  Z.downloadUrl && window.location.assign(Z.downloadUrl);
89
90
  }
90
91
  } : Y ? {
91
- label: "Retry Export",
92
- icon: /* @__PURE__ */ C(y, { size: 16 }),
93
- disabled: G,
92
+ label: M("export.detail.actions.retry", "Retry Export"),
93
+ icon: /* @__PURE__ */ b(v, { size: 16 }),
94
+ disabled: W,
94
95
  onSelect: () => {
95
96
  X();
96
97
  }
97
98
  } : void 0, $ = [];
98
99
  Y && Z && $.push({
99
- label: "Retry Export",
100
- icon: /* @__PURE__ */ C(y, { size: 16 }),
101
- disabled: G,
100
+ label: M("export.detail.actions.retry", "Retry Export"),
101
+ icon: /* @__PURE__ */ b(v, { size: 16 }),
102
+ disabled: W,
102
103
  onSelect: () => {
103
104
  X();
104
105
  }
105
- }), q && $.push({
106
- label: "Cancel Export",
107
- icon: /* @__PURE__ */ C(x, { size: 16 }),
108
- disabled: V,
106
+ }), K && $.push({
107
+ label: M("export.detail.actions.cancel", "Cancel Export"),
108
+ icon: /* @__PURE__ */ b(ce, { size: 16 }),
109
+ disabled: B,
109
110
  onSelect: () => {
110
- le();
111
+ de();
111
112
  }
112
- }), q || $.push({
113
- label: "Delete Export",
114
- icon: /* @__PURE__ */ C(b, { size: 16 }),
113
+ }), K || $.push({
114
+ label: M("export.detail.actions.delete", "Delete Export"),
115
+ icon: /* @__PURE__ */ b(y, { size: 16 }),
115
116
  intent: "destructive",
116
- disabled: U,
117
+ disabled: H,
117
118
  onSelect: () => {
118
- ue();
119
+ fe();
119
120
  }
120
121
  });
121
- let fe = [
122
+ let me = [
122
123
  {
123
124
  id: "download",
124
- label: "Download your export",
125
- description: "Grab the generated files below before their download links expire.",
126
- icon: /* @__PURE__ */ C(g, { size: 16 }),
125
+ label: M("export.detail.nextSteps.download.label", "Download your export"),
126
+ description: M("export.detail.nextSteps.download.description", "Grab the generated files below before their download links expire."),
127
+ icon: /* @__PURE__ */ b(m, { size: 16 }),
127
128
  onClick: () => {
128
129
  Z?.downloadUrl && window.location.assign(Z.downloadUrl);
129
130
  },
130
- done: J
131
+ done: q
131
132
  },
132
133
  ...Y ? [{
133
134
  id: "retry",
134
- label: "Retry this export",
135
- description: "This export didn't finish — start a fresh run with the same settings.",
136
- icon: /* @__PURE__ */ C(y, { size: 16 }),
135
+ label: M("export.detail.nextSteps.retry.label", "Retry this export"),
136
+ description: M("export.detail.nextSteps.retry.description", "This export didn't finish — start a fresh run with the same settings."),
137
+ icon: /* @__PURE__ */ b(v, { size: 16 }),
137
138
  onClick: () => {
138
139
  X();
139
140
  }
140
141
  }] : [],
141
142
  {
142
143
  id: "history",
143
- label: "Back to History",
144
- description: "See all your exports and track other jobs in progress.",
145
- icon: /* @__PURE__ */ C(h, { size: 16 }),
146
- onClick: () => N?.(M)
144
+ label: M("export.detail.nextSteps.history.label", "Back to History"),
145
+ description: M("export.detail.nextSteps.history.description", "See all your exports and track other jobs in progress."),
146
+ icon: /* @__PURE__ */ b(p, { size: 16 }),
147
+ onClick: () => A?.(k)
147
148
  }
148
149
  ];
149
- return /* @__PURE__ */ w(s, {
150
+ return /* @__PURE__ */ x(l, {
150
151
  showHeader: !1,
151
152
  children: [
152
- /* @__PURE__ */ C("div", {
153
+ /* @__PURE__ */ b("div", {
153
154
  className: "relative overflow-hidden rounded-xl bg-accent-wash border border-border-seam p-6 shadow-[var(--shadow-pop)]",
154
- children: /* @__PURE__ */ w("div", {
155
+ children: /* @__PURE__ */ x("div", {
155
156
  className: "relative z-10 flex flex-col sm:flex-row sm:items-center gap-4",
156
157
  children: [
157
- /* @__PURE__ */ C("button", {
158
+ /* @__PURE__ */ b("button", {
158
159
  type: "button",
159
- onClick: F,
160
- "aria-label": "Go back",
160
+ onClick: N,
161
+ "aria-label": M("export.detail.actions.back", "Go back"),
161
162
  className: "p-2.5 hover:bg-accent rounded-lg transition-colors duration-200 self-start focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40",
162
- children: /* @__PURE__ */ C(p, { size: 20 })
163
+ children: /* @__PURE__ */ b(d, { size: 20 })
163
164
  }),
164
- /* @__PURE__ */ w("div", {
165
+ /* @__PURE__ */ x("div", {
165
166
  className: "flex items-center gap-3 flex-1 min-w-0",
166
167
  children: [
167
- /* @__PURE__ */ C("div", {
168
+ /* @__PURE__ */ b("div", {
168
169
  className: "p-2.5 rounded-lg bg-action-primary-bg/10",
169
- children: /* @__PURE__ */ C(g, {
170
+ children: /* @__PURE__ */ b(m, {
170
171
  size: 24,
171
172
  className: "text-primary"
172
173
  })
173
174
  }),
174
- /* @__PURE__ */ w("div", {
175
+ /* @__PURE__ */ x("div", {
175
176
  className: "flex-1 min-w-0",
176
- children: [/* @__PURE__ */ C("h1", {
177
+ children: [/* @__PURE__ */ b("h1", {
177
178
  className: "text-xl sm:text-2xl font-bold truncate",
178
- children: K.name
179
- }), /* @__PURE__ */ C("p", {
179
+ children: G.name
180
+ }), /* @__PURE__ */ b("p", {
180
181
  className: "text-sm text-text-secondary mt-1",
181
- children: K.entityTypes.join(", ")
182
+ children: G.entityTypes.join(", ")
182
183
  })]
183
184
  }),
184
- /* @__PURE__ */ C(a, { status: K.status })
185
+ /* @__PURE__ */ b(te, { status: G.status })
185
186
  ]
186
187
  }),
187
- (Q || $.length > 0) && /* @__PURE__ */ C("div", {
188
+ (Q || $.length > 0) && /* @__PURE__ */ b("div", {
188
189
  className: "flex-shrink-0",
189
- children: /* @__PURE__ */ C(T, {
190
+ children: /* @__PURE__ */ b(S, {
190
191
  primary: Q,
191
192
  actions: $
192
193
  })
@@ -194,170 +195,167 @@ function j() {
194
195
  ]
195
196
  })
196
197
  }),
197
- (K.status === "RUNNING" || K.status === "QUEUED") && /* @__PURE__ */ w("div", {
198
+ (G.status === "RUNNING" || G.status === "QUEUED") && /* @__PURE__ */ x("div", {
198
199
  className: "border border-border-seam rounded-xl bg-status-info-bg-subtle p-6",
199
- children: [/* @__PURE__ */ C(o, {
200
- progress: K.progress,
200
+ children: [/* @__PURE__ */ b(ne, {
201
+ progress: G.progress,
201
202
  size: "lg"
202
- }), K.processedEntities != null && K.totalEntities != null && /* @__PURE__ */ w("p", {
203
+ }), G.processedEntities != null && G.totalEntities != null && /* @__PURE__ */ b("p", {
203
204
  className: "text-sm text-text-secondary mt-2",
204
- children: [
205
- K.processedEntities.toLocaleString(),
206
- " /",
207
- " ",
208
- K.totalEntities.toLocaleString(),
209
- " entities processed"
210
- ]
205
+ children: M("export.detail.progress.entitiesProcessed", "{{processed}} / {{total}} entities processed", {
206
+ processed: G.processedEntities.toLocaleString(),
207
+ total: G.totalEntities.toLocaleString()
208
+ })
211
209
  })]
212
210
  }),
213
- ce && K.errorMessage && /* @__PURE__ */ w("div", {
211
+ J && G.errorMessage && /* @__PURE__ */ x("div", {
214
212
  className: "border-2 border-border-default rounded-xl bg-status-error-bg-subtle p-6 flex items-start gap-4",
215
- children: [/* @__PURE__ */ C(f, {
213
+ children: [/* @__PURE__ */ b(oe, {
216
214
  size: 24,
217
215
  className: "text-status-error-text flex-shrink-0 mt-0.5"
218
- }), /* @__PURE__ */ w("div", { children: [/* @__PURE__ */ C("h3", {
216
+ }), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("h3", {
219
217
  className: "font-semibold text-status-error-text mb-1",
220
- children: "Export Failed"
221
- }), /* @__PURE__ */ C("p", {
218
+ children: M("export.detail.error.title", "Export Failed")
219
+ }), /* @__PURE__ */ b("p", {
222
220
  className: "text-sm text-status-error-text",
223
- children: K.errorMessage
221
+ children: G.errorMessage
224
222
  })] })]
225
223
  }),
226
- /* @__PURE__ */ C("div", {
224
+ /* @__PURE__ */ b("div", {
227
225
  className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4",
228
226
  children: [
229
227
  {
230
- icon: /* @__PURE__ */ C(ae, { size: 18 }),
231
- label: "Format",
232
- value: re(K.format)
228
+ icon: /* @__PURE__ */ b(g, { size: 18 }),
229
+ label: M("export.detail.info.format", "Format"),
230
+ value: c(G.format)
233
231
  },
234
232
  {
235
- icon: /* @__PURE__ */ C(_, { size: 18 }),
236
- label: "Archive",
237
- value: ne(K.archiveFormat)
233
+ icon: /* @__PURE__ */ b(se, { size: 18 }),
234
+ label: M("export.detail.info.archive", "Archive"),
235
+ value: s(G.archiveFormat)
238
236
  },
239
237
  {
240
- icon: /* @__PURE__ */ C(g, { size: 18 }),
241
- label: "Total Size",
242
- value: K.totalSizeBytes == null ? "-" : k(K.totalSizeBytes)
238
+ icon: /* @__PURE__ */ b(m, { size: 18 }),
239
+ label: M("export.detail.info.totalSize", "Total Size"),
240
+ value: G.totalSizeBytes == null ? "-" : E(G.totalSizeBytes)
243
241
  },
244
242
  {
245
- icon: /* @__PURE__ */ C(h, { size: 18 }),
246
- label: "Created",
247
- value: new Date(K.createdAt).toLocaleDateString()
243
+ icon: /* @__PURE__ */ b(p, { size: 18 }),
244
+ label: M("export.detail.info.created", "Created"),
245
+ value: new Date(G.createdAt).toLocaleDateString()
248
246
  }
249
- ].map((e) => /* @__PURE__ */ w(E, {
247
+ ].map((e) => /* @__PURE__ */ x(C, {
250
248
  treatment: "metric",
251
249
  className: "p-4 border-border-seam",
252
- children: [/* @__PURE__ */ w("div", {
250
+ children: [/* @__PURE__ */ x("div", {
253
251
  className: "flex items-center gap-2 text-text-secondary mb-1",
254
- children: [e.icon, /* @__PURE__ */ C("span", {
252
+ children: [e.icon, /* @__PURE__ */ b("span", {
255
253
  className: "text-xs font-medium",
256
254
  children: e.label
257
255
  })]
258
- }), /* @__PURE__ */ C("p", {
256
+ }), /* @__PURE__ */ b("p", {
259
257
  className: "font-bold text-lg tabular-nums",
260
258
  children: e.value
261
259
  })]
262
260
  }, e.label))
263
261
  }),
264
- /* @__PURE__ */ C(O, {
265
- storageKey: `export-detail-${K.id}`,
266
- title: "What's next",
267
- steps: fe
262
+ /* @__PURE__ */ b(T, {
263
+ storageKey: `export-detail-${G.id}`,
264
+ title: M("export.detail.nextSteps.title", "What's next"),
265
+ steps: me
268
266
  }),
269
- K.parts.length > 0 && /* @__PURE__ */ C(c, {
270
- title: "Export Parts",
271
- description: `${K.parts.length} file(s) generated`,
272
- children: /* @__PURE__ */ C("div", {
267
+ G.parts.length > 0 && /* @__PURE__ */ b(re, {
268
+ title: M("export.detail.parts.title", "Export Parts"),
269
+ description: M("export.detail.parts.description", "{{count}} file(s) generated", { count: G.parts.length }),
270
+ children: /* @__PURE__ */ b("div", {
273
271
  className: "space-y-2",
274
- children: K.parts.map((e) => /* @__PURE__ */ w("div", {
275
- className: i("border border-border-seam rounded-xl p-4 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 bg-bg-surface", "hover:border-primary/40 transition-colors duration-200"),
276
- children: [/* @__PURE__ */ w("div", {
272
+ children: G.parts.map((e) => /* @__PURE__ */ x("div", {
273
+ className: o("border border-border-seam rounded-xl p-4 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 bg-bg-surface", "hover:border-primary/40 transition-colors duration-200"),
274
+ children: [/* @__PURE__ */ x("div", {
277
275
  className: "flex items-center gap-3 min-w-0",
278
- children: [/* @__PURE__ */ C(ie, {
276
+ children: [/* @__PURE__ */ b(h, {
279
277
  size: 20,
280
278
  className: "text-primary flex-shrink-0"
281
- }), /* @__PURE__ */ w("div", {
279
+ }), /* @__PURE__ */ x("div", {
282
280
  className: "min-w-0",
283
- children: [/* @__PURE__ */ C("p", {
281
+ children: [/* @__PURE__ */ b("p", {
284
282
  className: "font-medium truncate",
285
283
  children: e.fileName
286
- }), /* @__PURE__ */ w("p", {
284
+ }), /* @__PURE__ */ x("p", {
287
285
  className: "text-sm text-text-secondary",
288
286
  children: [
289
287
  e.entityTypes.join(", "),
290
288
  " ·",
291
289
  " ",
292
- k(e.sizeBytes),
293
- e.downloadExpiresAt && ` · expires ${new Date(e.downloadExpiresAt).toLocaleDateString()}`
290
+ E(e.sizeBytes),
291
+ e.downloadExpiresAt && ` · ${M("export.detail.parts.expires", "expires {{date}}", { date: new Date(e.downloadExpiresAt).toLocaleDateString() })}`
294
292
  ]
295
293
  })]
296
294
  })]
297
- }), /* @__PURE__ */ C("div", {
295
+ }), /* @__PURE__ */ b("div", {
298
296
  className: "flex items-center gap-2 flex-shrink-0",
299
- children: e.downloadUrl ? /* @__PURE__ */ w("a", {
297
+ children: e.downloadUrl ? /* @__PURE__ */ x("a", {
300
298
  href: e.downloadUrl,
301
299
  className: "inline-flex items-center gap-2 px-3 py-1.5 bg-action-primary-bg text-action-primary-text rounded-lg hover:bg-action-primary-bg/90 transition-colors text-sm font-medium",
302
- children: [/* @__PURE__ */ C(g, { size: 14 }), "Download"]
303
- }) : /* @__PURE__ */ w("span", {
300
+ children: [/* @__PURE__ */ b(m, { size: 14 }), M("export.detail.parts.download", "Download")]
301
+ }) : /* @__PURE__ */ x("span", {
304
302
  className: "inline-flex items-center gap-1.5 text-sm text-text-secondary",
305
- children: [/* @__PURE__ */ C(h, { size: 14 }), "Pending"]
303
+ children: [/* @__PURE__ */ b(p, { size: 14 }), M("export.detail.parts.pending", "Pending")]
306
304
  })
307
305
  })]
308
306
  }, e.id))
309
307
  })
310
308
  }),
311
- J && K.parts.length === 0 && /* @__PURE__ */ w("div", {
309
+ q && G.parts.length === 0 && /* @__PURE__ */ x("div", {
312
310
  className: "border-2 border-border-default rounded-xl bg-status-success-bg-subtle p-6 text-center",
313
311
  children: [
314
- /* @__PURE__ */ C(m, {
312
+ /* @__PURE__ */ b(f, {
315
313
  size: 48,
316
314
  className: "text-status-success-text mx-auto mb-3"
317
315
  }),
318
- /* @__PURE__ */ C("h3", {
316
+ /* @__PURE__ */ b("h3", {
319
317
  className: "text-lg font-bold text-status-success-text mb-1",
320
- children: "Export Complete"
318
+ children: M("export.detail.complete.title", "Export Complete")
321
319
  }),
322
- /* @__PURE__ */ C("p", {
320
+ /* @__PURE__ */ b("p", {
323
321
  className: "text-sm text-status-success-text",
324
- children: "Your export has completed but no download parts are available yet."
322
+ children: M("export.detail.complete.noParts", "Your export has completed but no download parts are available yet.")
325
323
  })
326
324
  ]
327
325
  }),
328
- z && /* @__PURE__ */ C("div", {
326
+ L && /* @__PURE__ */ b("div", {
329
327
  role: "dialog",
330
328
  "aria-modal": "true",
331
329
  "aria-labelledby": "export-confirm-title",
332
330
  className: "fixed inset-0 z-50 flex items-center justify-center bg-bg-surface/80 backdrop-blur-sm p-4",
333
- children: /* @__PURE__ */ w("div", {
331
+ children: /* @__PURE__ */ x("div", {
334
332
  className: "w-full max-w-md rounded-xl border-2 border-border-subtle bg-bg-surface p-6 shadow-xl",
335
333
  children: [
336
- /* @__PURE__ */ C("h2", {
334
+ /* @__PURE__ */ b("h2", {
337
335
  id: "export-confirm-title",
338
336
  className: "text-lg font-bold",
339
- children: z === "cancel" ? "Cancel export?" : "Delete export?"
337
+ children: L === "cancel" ? M("export.detail.confirm.cancel.title", "Cancel export?") : M("export.detail.confirm.delete.title", "Delete export?")
340
338
  }),
341
- /* @__PURE__ */ C("p", {
339
+ /* @__PURE__ */ b("p", {
342
340
  className: "mt-2 text-sm text-text-secondary",
343
- children: z === "cancel" ? "This stops the running export job. You can retry it later if needed." : "This removes the export job from history. This action cannot be undone."
341
+ children: L === "cancel" ? M("export.detail.confirm.cancel.description", "This stops the running export job. You can retry it later if needed.") : M("export.detail.confirm.delete.description", "This removes the export job from history. This action cannot be undone.")
344
342
  }),
345
- /* @__PURE__ */ w("div", {
343
+ /* @__PURE__ */ x("div", {
346
344
  className: "mt-6 flex flex-col-reverse sm:flex-row sm:justify-end gap-3",
347
- children: [/* @__PURE__ */ C("button", {
345
+ children: [/* @__PURE__ */ b("button", {
348
346
  type: "button",
349
- onClick: () => B(null),
347
+ onClick: () => R(null),
350
348
  className: "px-4 py-2 rounded-lg border-2 border-border-subtle hover:bg-accent transition-colors font-medium",
351
- children: "Keep Export"
352
- }), /* @__PURE__ */ w("button", {
349
+ children: M("export.detail.confirm.keep", "Keep Export")
350
+ }), /* @__PURE__ */ x("button", {
353
351
  type: "button",
354
- onClick: de,
355
- disabled: V || U,
352
+ onClick: pe,
353
+ disabled: B || H,
356
354
  className: "inline-flex items-center justify-center gap-2 px-4 py-2 rounded-lg bg-status-error-bg text-status-error-text hover:bg-status-error-bg/90 transition-colors font-medium disabled:opacity-50",
357
- children: [V || U ? /* @__PURE__ */ C(v, {
355
+ children: [B || H ? /* @__PURE__ */ b(_, {
358
356
  size: 16,
359
357
  className: "animate-spin"
360
- }) : null, z === "cancel" ? "Cancel Export" : "Delete Export"]
358
+ }) : null, L === "cancel" ? M("export.detail.actions.cancel", "Cancel Export") : M("export.detail.actions.delete", "Delete Export")]
361
359
  })]
362
360
  })
363
361
  ]
@@ -367,6 +365,6 @@ function j() {
367
365
  });
368
366
  }
369
367
  //#endregion
370
- export { j as ExportDetailPage };
368
+ export { O as ExportDetailPage };
371
369
 
372
370
  //# sourceMappingURL=ExportDetailPage.js.map