@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 +1 @@
1
- {"version":3,"file":"ExportRoot.d.ts","sourceRoot":"","sources":["../../src/export/ExportRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAMhC,OAAO,KAAK,EAAW,eAAe,EAAE,MAAM,SAAS,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAiG1C,CAAC"}
1
+ {"version":3,"file":"ExportRoot.d.ts","sourceRoot":"","sources":["../../src/export/ExportRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAOhC,OAAO,KAAK,EAAW,eAAe,EAAE,MAAM,SAAS,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAkG1C,CAAC"}
@@ -1,75 +1,80 @@
1
1
  import { ExportProvider as e } from "./providers/ExportProvider.js";
2
- import { ExportRoutes as t } from "./ExportRoutes.js";
3
- import { useEffect as n } from "react";
4
- import { Clock as r, Download as i, FileBox as a, Plus as o } from "lucide-react";
5
- import { FeatureFlagProvider as s } from "@burdenoff/fe-libs/shared/feature-flags";
6
- import { PermissionProvider as c } from "@burdenoff/fe-libs/shared/providers/shell";
7
- import { jsx as l } from "react/jsx-runtime";
2
+ import { useTr as t } from "./hooks/useTr.js";
3
+ import { ExportRoutes as n } from "./ExportRoutes.js";
4
+ import { useEffect as r } from "react";
5
+ import { Clock as i, Download as a, FileBox as o, Plus as s } from "lucide-react";
6
+ import { FeatureFlagProvider as c } from "@burdenoff/fe-libs/shared/feature-flags";
7
+ import { PermissionProvider as l } from "@burdenoff/fe-libs/shared/providers/shell";
8
+ import { jsx as u } from "react/jsx-runtime";
8
9
  //#region src/export/ExportRoot.tsx
9
- var u = (u) => {
10
- let { registerNavItems: d, registerFooterItems: f, basePath: p = "/", workspaceId: m } = u, h = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
11
- return n(() => {
12
- if (d) return d({
10
+ var d = (d) => {
11
+ let { registerNavItems: f, registerFooterItems: p, basePath: m = "/", workspaceId: h } = d, g = t(), _ = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
12
+ return r(() => {
13
+ if (f) return f({
13
14
  id: "export",
14
- label: "Export",
15
- path: p,
16
- icon: /* @__PURE__ */ l(i, { size: 20 }),
15
+ label: g("export.nav.root", "Export"),
16
+ path: m,
17
+ icon: /* @__PURE__ */ u(a, { size: 20 }),
17
18
  order: 75,
18
19
  group: "workspace",
19
20
  children: [
20
21
  {
21
22
  id: "export-dashboard",
22
- label: "Dashboard",
23
- path: p,
24
- icon: /* @__PURE__ */ l(a, { size: 16 }),
23
+ label: g("export.nav.dashboard", "Dashboard"),
24
+ path: m,
25
+ icon: /* @__PURE__ */ u(o, { size: 16 }),
25
26
  order: 10
26
27
  },
27
28
  {
28
29
  id: "export-new",
29
- label: "New Export",
30
- path: h(p, "new"),
31
- icon: /* @__PURE__ */ l(o, { size: 16 }),
30
+ label: g("export.nav.newExport", "New Export"),
31
+ path: _(m, "new"),
32
+ icon: /* @__PURE__ */ u(s, { size: 16 }),
32
33
  order: 20
33
34
  },
34
35
  {
35
36
  id: "export-history",
36
- label: "History",
37
- path: h(p, "history"),
38
- icon: /* @__PURE__ */ l(r, { size: 16 }),
37
+ label: g("export.nav.history", "History"),
38
+ path: _(m, "history"),
39
+ icon: /* @__PURE__ */ u(i, { size: 16 }),
39
40
  order: 30
40
41
  },
41
42
  {
42
43
  id: "export-templates",
43
- label: "Templates",
44
- path: h(p, "templates"),
45
- icon: /* @__PURE__ */ l(a, { size: 16 }),
44
+ label: g("export.nav.templates", "Templates"),
45
+ path: _(m, "templates"),
46
+ icon: /* @__PURE__ */ u(o, { size: 16 }),
46
47
  order: 40
47
48
  }
48
49
  ]
49
50
  });
50
- }, [d, p]), n(() => {
51
- if (f) return f([{
51
+ }, [
52
+ f,
53
+ m,
54
+ g
55
+ ]), r(() => {
56
+ if (p) return p([{
52
57
  id: "export-status",
53
- label: "Export Ready",
58
+ label: g("export.nav.footerStatus", "Export Ready"),
54
59
  type: "status",
55
60
  order: 10,
56
61
  section: "left"
57
62
  }]);
58
- }, [f]), /* @__PURE__ */ l(s, {
59
- workspaceId: m ?? null,
63
+ }, [p, g]), /* @__PURE__ */ u(c, {
64
+ workspaceId: h ?? null,
60
65
  gateway: "global",
61
66
  defaultEnabled: !0,
62
- children: /* @__PURE__ */ l(c, {
63
- scopeId: m ?? null,
67
+ children: /* @__PURE__ */ u(l, {
68
+ scopeId: h ?? null,
64
69
  gateway: "workspace",
65
- children: /* @__PURE__ */ l(e, {
66
- ...u,
67
- children: /* @__PURE__ */ l(t, {})
70
+ children: /* @__PURE__ */ u(e, {
71
+ ...d,
72
+ children: /* @__PURE__ */ u(n, {})
68
73
  })
69
74
  })
70
75
  });
71
76
  };
72
77
  //#endregion
73
- export { u as ExportRoot };
78
+ export { d as ExportRoot };
74
79
 
75
80
  //# sourceMappingURL=ExportRoot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExportRoot.js","names":[],"sources":["../../src/export/ExportRoot.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect } from \"react\";\nimport { Download, Plus, Clock, FileBox } from \"lucide-react\";\nimport { FeatureFlagProvider } from \"@burdenoff/fe-libs/shared/feature-flags\";\nimport { PermissionProvider } from \"@burdenoff/fe-libs/shared/providers/shell\";\nimport { ExportProvider } from \"./providers/ExportProvider\";\nimport type { NavItem, ExportRootProps } from \"./types\";\nimport { ExportRoutes } from \"./ExportRoutes\";\n\n/**\n * Root component for the Export microfrontend.\n *\n * This is the main entry point that host applications import and render.\n * It sets up the necessary providers and renders the internal routing.\n * Automatically registers navigation items with the shell if registration functions are provided.\n *\n * @example\n * ```tsx\n * import { ExportRoot, type ExportRootProps } from '@burdenoff/micro-fe/export';\n *\n * function App() {\n * const props: ExportRootProps = {\n * basePath: '/export',\n * navigate: (path) => router.push(path),\n * currentUser: { id: '1', email: 'user@example.com', firstName: 'John', lastName: 'Doe' },\n * workspaceId: 'ws-123',\n * apiGatewayUrl: 'https://api.example.com',\n * authToken: 'token',\n * registerNavItems: (items) => { return () => {}; },\n * };\n *\n * return <ExportRoot {...props} />;\n * }\n * ```\n */\nexport const ExportRoot: FC<ExportRootProps> = (props) => {\n const {\n registerNavItems,\n registerFooterItems,\n basePath = \"/\",\n workspaceId,\n } = props;\n\n // Helper to join paths correctly, avoiding double slashes\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with the shell\n useEffect(() => {\n if (!registerNavItems) return;\n\n // Create a parent \"Export\" item with children for dropdown behavior\n const exportNavItem: NavItem = {\n id: \"export\",\n label: \"Export\",\n path: basePath,\n icon: <Download size={20} />,\n order: 75,\n group: \"workspace\",\n children: [\n {\n id: \"export-dashboard\",\n label: \"Dashboard\",\n path: basePath,\n icon: <FileBox size={16} />,\n order: 10,\n },\n {\n id: \"export-new\",\n label: \"New Export\",\n path: joinPath(basePath, \"new\"),\n icon: <Plus size={16} />,\n order: 20,\n },\n {\n id: \"export-history\",\n label: \"History\",\n path: joinPath(basePath, \"history\"),\n icon: <Clock size={16} />,\n order: 30,\n },\n {\n id: \"export-templates\",\n label: \"Templates\",\n path: joinPath(basePath, \"templates\"),\n icon: <FileBox size={16} />,\n order: 40,\n },\n ],\n };\n\n // Register and get cleanup function\n const cleanup = registerNavItems(exportNavItem);\n\n // Return cleanup function to unregister on unmount\n return cleanup;\n }, [registerNavItems, basePath]);\n\n // Register footer items\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: \"export-status\",\n label: \"Export Ready\",\n type: \"status\" as const,\n order: 10,\n section: \"left\" as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems]);\n\n return (\n <FeatureFlagProvider\n workspaceId={workspaceId ?? null}\n gateway=\"global\"\n defaultEnabled={true}\n >\n <PermissionProvider scopeId={workspaceId ?? null} gateway=\"workspace\">\n <ExportProvider {...props}>\n <ExportRoutes />\n </ExportProvider>\n </PermissionProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;AAmCA,IAAa,KAAmC,MAAU;CACxD,IAAM,EACJ,qBACA,wBACA,cAAW,KACX,mBACE,GAGE,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AAyEtD,QApEA,QAAgB;AACT,QA8CL,QAHgB,EAxCe;GAC7B,IAAI;GACJ,OAAO;GACP,MAAM;GACN,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;GAC5B,OAAO;GACP,OAAO;GACP,UAAU;IACR;KACE,IAAI;KACJ,OAAO;KACP,MAAM;KACN,MAAM,kBAAC,GAAD,EAAS,MAAM,IAAM,CAAA;KAC3B,OAAO;KACR;IACD;KACE,IAAI;KACJ,OAAO;KACP,MAAM,EAAS,GAAU,MAAM;KAC/B,MAAM,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;KACxB,OAAO;KACR;IACD;KACE,IAAI;KACJ,OAAO;KACP,MAAM,EAAS,GAAU,UAAU;KACnC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;KACzB,OAAO;KACR;IACD;KACE,IAAI;KACJ,OAAO;KACP,MAAM,EAAS,GAAU,YAAY;KACrC,MAAM,kBAAC,GAAD,EAAS,MAAM,IAAM,CAAA;KAC3B,OAAO;KACR;IACF;GACF,CAG8C;IAI9C,CAAC,GAAkB,EAAS,CAAC,EAGhC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,EAAoB,CAAC,EAGvB,kBAAC,GAAD;EACE,aAAa,KAAe;EAC5B,SAAQ;EACR,gBAAgB;YAEhB,kBAAC,GAAD;GAAoB,SAAS,KAAe;GAAM,SAAQ;aACxD,kBAAC,GAAD;IAAgB,GAAI;cAClB,kBAAC,GAAD,EAAgB,CAAA;IACD,CAAA;GACE,CAAA;EACD,CAAA"}
1
+ {"version":3,"file":"ExportRoot.js","names":[],"sources":["../../src/export/ExportRoot.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect } from \"react\";\nimport { Download, Plus, Clock, FileBox } from \"lucide-react\";\nimport { FeatureFlagProvider } from \"@burdenoff/fe-libs/shared/feature-flags\";\nimport { PermissionProvider } from \"@burdenoff/fe-libs/shared/providers/shell\";\nimport { ExportProvider } from \"./providers/ExportProvider\";\nimport { useTr } from \"./hooks/useTr\";\nimport type { NavItem, ExportRootProps } from \"./types\";\nimport { ExportRoutes } from \"./ExportRoutes\";\n\n/**\n * Root component for the Export microfrontend.\n *\n * This is the main entry point that host applications import and render.\n * It sets up the necessary providers and renders the internal routing.\n * Automatically registers navigation items with the shell if registration functions are provided.\n *\n * @example\n * ```tsx\n * import { ExportRoot, type ExportRootProps } from '@burdenoff/micro-fe/export';\n *\n * function App() {\n * const props: ExportRootProps = {\n * basePath: '/export',\n * navigate: (path) => router.push(path),\n * currentUser: { id: '1', email: 'user@example.com', firstName: 'John', lastName: 'Doe' },\n * workspaceId: 'ws-123',\n * apiGatewayUrl: 'https://api.example.com',\n * authToken: 'token',\n * registerNavItems: (items) => { return () => {}; },\n * };\n *\n * return <ExportRoot {...props} />;\n * }\n * ```\n */\nexport const ExportRoot: FC<ExportRootProps> = (props) => {\n const {\n registerNavItems,\n registerFooterItems,\n basePath = \"/\",\n workspaceId,\n } = props;\n const tr = useTr();\n\n // Helper to join paths correctly, avoiding double slashes\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with the shell\n useEffect(() => {\n if (!registerNavItems) return;\n\n // Create a parent \"Export\" item with children for dropdown behavior\n const exportNavItem: NavItem = {\n id: \"export\",\n label: tr(\"export.nav.root\", \"Export\"),\n path: basePath,\n icon: <Download size={20} />,\n order: 75,\n group: \"workspace\",\n children: [\n {\n id: \"export-dashboard\",\n label: tr(\"export.nav.dashboard\", \"Dashboard\"),\n path: basePath,\n icon: <FileBox size={16} />,\n order: 10,\n },\n {\n id: \"export-new\",\n label: tr(\"export.nav.newExport\", \"New Export\"),\n path: joinPath(basePath, \"new\"),\n icon: <Plus size={16} />,\n order: 20,\n },\n {\n id: \"export-history\",\n label: tr(\"export.nav.history\", \"History\"),\n path: joinPath(basePath, \"history\"),\n icon: <Clock size={16} />,\n order: 30,\n },\n {\n id: \"export-templates\",\n label: tr(\"export.nav.templates\", \"Templates\"),\n path: joinPath(basePath, \"templates\"),\n icon: <FileBox size={16} />,\n order: 40,\n },\n ],\n };\n\n // Register and get cleanup function\n const cleanup = registerNavItems(exportNavItem);\n\n // Return cleanup function to unregister on unmount\n return cleanup;\n }, [registerNavItems, basePath, tr]);\n\n // Register footer items\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: \"export-status\",\n label: tr(\"export.nav.footerStatus\", \"Export Ready\"),\n type: \"status\" as const,\n order: 10,\n section: \"left\" as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems, tr]);\n\n return (\n <FeatureFlagProvider\n workspaceId={workspaceId ?? null}\n gateway=\"global\"\n defaultEnabled={true}\n >\n <PermissionProvider scopeId={workspaceId ?? null} gateway=\"workspace\">\n <ExportProvider {...props}>\n <ExportRoutes />\n </ExportProvider>\n </PermissionProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;;AAoCA,IAAa,KAAmC,MAAU;CACxD,IAAM,EACJ,qBACA,wBACA,cAAW,KACX,mBACE,GACE,IAAK,GAAO,EAGZ,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AAyEtD,QApEA,QAAgB;AACT,QA8CL,QAHgB,EAxCe;GAC7B,IAAI;GACJ,OAAO,EAAG,mBAAmB,SAAS;GACtC,MAAM;GACN,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;GAC5B,OAAO;GACP,OAAO;GACP,UAAU;IACR;KACE,IAAI;KACJ,OAAO,EAAG,wBAAwB,YAAY;KAC9C,MAAM;KACN,MAAM,kBAAC,GAAD,EAAS,MAAM,IAAM,CAAA;KAC3B,OAAO;KACR;IACD;KACE,IAAI;KACJ,OAAO,EAAG,wBAAwB,aAAa;KAC/C,MAAM,EAAS,GAAU,MAAM;KAC/B,MAAM,kBAAC,GAAD,EAAM,MAAM,IAAM,CAAA;KACxB,OAAO;KACR;IACD;KACE,IAAI;KACJ,OAAO,EAAG,sBAAsB,UAAU;KAC1C,MAAM,EAAS,GAAU,UAAU;KACnC,MAAM,kBAAC,GAAD,EAAO,MAAM,IAAM,CAAA;KACzB,OAAO;KACR;IACD;KACE,IAAI;KACJ,OAAO,EAAG,wBAAwB,YAAY;KAC9C,MAAM,EAAS,GAAU,YAAY;KACrC,MAAM,kBAAC,GAAD,EAAS,MAAM,IAAM,CAAA;KAC3B,OAAO;KACR;IACF;GACF,CAG8C;IAI9C;EAAC;EAAkB;EAAU;EAAG,CAAC,EAGpC,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO,EAAG,2BAA2B,eAAe;GACpD,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,GAAqB,EAAG,CAAC,EAG3B,kBAAC,GAAD;EACE,aAAa,KAAe;EAC5B,SAAQ;EACR,gBAAgB;YAEhB,kBAAC,GAAD;GAAoB,SAAS,KAAe;GAAM,SAAQ;aACxD,kBAAC,GAAD;IAAgB,GAAI;cAClB,kBAAC,GAAD,EAAgB,CAAA;IACD,CAAA;GACE,CAAA;EACD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExportRoutes.d.ts","sourceRoot":"","sources":["../../src/export/ExportRoutes.tsx"],"names":[],"mappings":"AA+IA;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,gCAoC3B"}
1
+ {"version":3,"file":"ExportRoutes.d.ts","sourceRoot":"","sources":["../../src/export/ExportRoutes.tsx"],"names":[],"mappings":"AA0KA;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,gCAoC3B"}
@@ -1,18 +1,47 @@
1
- import { ExportLandingPage as e } from "./pages/ExportLandingPage.js";
2
- import { Component as t, Suspense as n, lazy as r } from "react";
3
- import { AlertTriangle as i, Loader2 as a, RefreshCw as o } from "lucide-react";
4
- import { FeatureGate as s } from "@burdenoff/fe-libs/shared/feature-flags";
5
- import { Navigate as c, Route as l, Routes as u } from "react-router";
6
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
1
+ import { useTr as e } from "./hooks/useTr.js";
2
+ import { ExportLandingPage as t } from "./pages/ExportLandingPage.js";
3
+ import { Component as n, Suspense as r, lazy as i } from "react";
4
+ import { AlertTriangle as a, Loader2 as o, RefreshCw as s } from "lucide-react";
5
+ import { FeatureGate as c } from "@burdenoff/fe-libs/shared/feature-flags";
6
+ import { Navigate as l, Route as u, Routes as d } from "react-router";
7
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
7
8
  //#region src/export/ExportRoutes.tsx
8
- var p = r(() => import("./pages/CreateExportPage.js").then((e) => ({ default: e.CreateExportPage }))), m = r(() => import("./pages/ExportHistoryPage.js").then((e) => ({ default: e.ExportHistoryPage }))), h = r(() => import("./pages/ExportDetailPage.js").then((e) => ({ default: e.ExportDetailPage }))), g = r(() => import("./pages/ExportTemplatesPage.js").then((e) => ({ default: e.ExportTemplatesPage }))), _ = r(() => import("./pages/TemplateDetailPage.js").then((e) => ({ default: e.TemplateDetailPage })));
9
- function v() {
10
- return /* @__PURE__ */ d("div", {
9
+ var m = i(() => import("./pages/CreateExportPage.js").then((e) => ({ default: e.CreateExportPage }))), h = i(() => import("./pages/ExportHistoryPage.js").then((e) => ({ default: e.ExportHistoryPage }))), g = i(() => import("./pages/ExportDetailPage.js").then((e) => ({ default: e.ExportDetailPage }))), _ = i(() => import("./pages/ExportTemplatesPage.js").then((e) => ({ default: e.ExportTemplatesPage }))), v = i(() => import("./pages/TemplateDetailPage.js").then((e) => ({ default: e.TemplateDetailPage })));
10
+ function y() {
11
+ return /* @__PURE__ */ f("div", {
11
12
  className: "flex items-center justify-center min-h-[400px]",
12
- children: /* @__PURE__ */ d(a, { className: "size-8 animate-spin text-primary" })
13
+ children: /* @__PURE__ */ f(o, { className: "size-8 animate-spin text-primary" })
14
+ });
15
+ }
16
+ function b({ error: t, onRetry: n }) {
17
+ let r = e();
18
+ return /* @__PURE__ */ p("div", {
19
+ className: "flex flex-col items-center justify-center min-h-[400px] gap-4 text-center p-6",
20
+ children: [
21
+ /* @__PURE__ */ f("div", {
22
+ className: "p-3 rounded-full bg-status-error-bg/10",
23
+ children: /* @__PURE__ */ f(a, { className: "size-8 text-status-error-text" })
24
+ }),
25
+ /* @__PURE__ */ p("div", {
26
+ className: "space-y-2",
27
+ children: [/* @__PURE__ */ f("h3", {
28
+ className: "text-lg font-semibold text-text-primary",
29
+ children: r("export.routes.error.title", "Failed to load page")
30
+ }), /* @__PURE__ */ f("p", {
31
+ className: "text-sm text-text-secondary max-w-md",
32
+ children: t?.message || r("export.routes.error.description", "The page chunk could not be loaded. This may be due to a network issue.")
33
+ })]
34
+ }),
35
+ /* @__PURE__ */ p("button", {
36
+ type: "button",
37
+ onClick: n,
38
+ className: "inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-md bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90 transition-colors",
39
+ children: [/* @__PURE__ */ f(s, { className: "size-4" }), r("export.routes.error.retry", "Try Again")]
40
+ })
41
+ ]
13
42
  });
14
43
  }
15
- var y = class extends t {
44
+ var x = class extends n {
16
45
  constructor(e) {
17
46
  super(e), this.state = {
18
47
  hasError: !1,
@@ -35,97 +64,77 @@ var y = class extends t {
35
64
  });
36
65
  };
37
66
  render() {
38
- return this.state.hasError ? /* @__PURE__ */ f("div", {
39
- className: "flex flex-col items-center justify-center min-h-[400px] gap-4 text-center p-6",
40
- children: [
41
- /* @__PURE__ */ d("div", {
42
- className: "p-3 rounded-full bg-status-error-bg/10",
43
- children: /* @__PURE__ */ d(i, { className: "size-8 text-status-error-text" })
44
- }),
45
- /* @__PURE__ */ f("div", {
46
- className: "space-y-2",
47
- children: [/* @__PURE__ */ d("h3", {
48
- className: "text-lg font-semibold text-text-primary",
49
- children: "Failed to load page"
50
- }), /* @__PURE__ */ d("p", {
51
- className: "text-sm text-text-secondary max-w-md",
52
- children: this.state.error?.message || "The page chunk could not be loaded. This may be due to a network issue."
53
- })]
54
- }),
55
- /* @__PURE__ */ f("button", {
56
- type: "button",
57
- onClick: this.handleRetry,
58
- className: "inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-md bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90 transition-colors",
59
- children: [/* @__PURE__ */ d(o, { className: "size-4" }), "Try Again"]
60
- })
61
- ]
67
+ return this.state.hasError ? /* @__PURE__ */ f(b, {
68
+ error: this.state.error,
69
+ onRetry: this.handleRetry
62
70
  }) : this.props.children;
63
71
  }
64
72
  };
65
- function b() {
66
- return /* @__PURE__ */ f("div", {
73
+ function S() {
74
+ let t = e();
75
+ return /* @__PURE__ */ p("div", {
67
76
  className: "flex flex-col items-center justify-center min-h-[400px] gap-4 text-center p-6",
68
- children: [/* @__PURE__ */ d("div", {
77
+ children: [/* @__PURE__ */ f("div", {
69
78
  className: "p-3 rounded-full bg-bg-sunken",
70
- children: /* @__PURE__ */ d("svg", {
79
+ children: /* @__PURE__ */ f("svg", {
71
80
  className: "size-8 text-text-secondary",
72
81
  fill: "none",
73
82
  viewBox: "0 0 24 24",
74
83
  stroke: "currentColor",
75
84
  strokeWidth: 1.5,
76
- children: /* @__PURE__ */ d("path", {
85
+ children: /* @__PURE__ */ f("path", {
77
86
  strokeLinecap: "round",
78
87
  strokeLinejoin: "round",
79
88
  d: "M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"
80
89
  })
81
90
  })
82
- }), /* @__PURE__ */ f("div", {
91
+ }), /* @__PURE__ */ p("div", {
83
92
  className: "space-y-2",
84
- children: [/* @__PURE__ */ d("h3", {
93
+ children: [/* @__PURE__ */ f("h3", {
85
94
  className: "text-lg font-semibold text-text-primary",
86
- children: "Data Export Unavailable"
87
- }), /* @__PURE__ */ d("p", {
95
+ children: t("export.routes.disabled.title", "Data Export Unavailable")
96
+ }), /* @__PURE__ */ f("p", {
88
97
  className: "text-sm text-text-secondary max-w-md",
89
- children: "The Data Export feature is currently disabled for this workspace. Contact your administrator to enable it."
98
+ children: t("export.routes.disabled.description", "The Data Export feature is currently disabled for this workspace. Contact your administrator to enable it.")
90
99
  })]
91
100
  })]
92
101
  });
93
102
  }
94
- function x() {
95
- return /* @__PURE__ */ d(y, { children: /* @__PURE__ */ d(s, {
103
+ function C() {
104
+ return /* @__PURE__ */ f(x, { children: /* @__PURE__ */ f(c, {
96
105
  flag: "workspaces.export",
97
106
  defaultValue: !0,
98
- fallback: /* @__PURE__ */ d(b, {}),
99
- children: /* @__PURE__ */ d(n, {
100
- fallback: /* @__PURE__ */ d(v, {}),
101
- children: /* @__PURE__ */ f(u, { children: [
102
- /* @__PURE__ */ d(l, {
107
+ fallback: /* @__PURE__ */ f(S, {}),
108
+ children: /* @__PURE__ */ f(r, {
109
+ fallback: /* @__PURE__ */ f(y, {}),
110
+ children: /* @__PURE__ */ p(d, { children: [
111
+ /* @__PURE__ */ f(u, {
103
112
  index: !0,
104
- element: /* @__PURE__ */ d(e, {})
113
+ element: /* @__PURE__ */ f(t, {})
105
114
  }),
106
- /* @__PURE__ */ d(l, {
115
+ /* @__PURE__ */ f(u, {
107
116
  path: "new",
108
- element: /* @__PURE__ */ d(p, {})
117
+ element: /* @__PURE__ */ f(m, {})
109
118
  }),
110
- /* @__PURE__ */ d(l, {
119
+ /* @__PURE__ */ f(u, {
111
120
  path: "history",
112
- element: /* @__PURE__ */ d(m, {})
121
+ element: /* @__PURE__ */ f(h, {})
113
122
  }),
114
- /* @__PURE__ */ d(l, {
123
+ /* @__PURE__ */ f(u, {
115
124
  path: ":jobId",
116
- element: /* @__PURE__ */ d(h, {})
125
+ element: /* @__PURE__ */ f(g, {})
117
126
  }),
118
- /* @__PURE__ */ d(l, {
127
+ /* @__PURE__ */ f(u, {
119
128
  path: "templates",
120
- element: /* @__PURE__ */ d(g, {})
129
+ element: /* @__PURE__ */ f(_, {})
121
130
  }),
122
- /* @__PURE__ */ d(l, {
131
+ /* @__PURE__ */ f(u, {
123
132
  path: "templates/:templateId",
124
- element: /* @__PURE__ */ d(_, {})
133
+ element: /* @__PURE__ */ f(v, {})
125
134
  }),
126
- /* @__PURE__ */ d(l, {
135
+ /* @__PURE__ */ f(u, {
127
136
  path: "*",
128
- element: /* @__PURE__ */ d(c, {
137
+ element: /* @__PURE__ */ f(l, {
129
138
  to: "",
130
139
  replace: !0
131
140
  })
@@ -135,6 +144,6 @@ function x() {
135
144
  }) });
136
145
  }
137
146
  //#endregion
138
- export { x as ExportRoutes };
147
+ export { C as ExportRoutes };
139
148
 
140
149
  //# sourceMappingURL=ExportRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExportRoutes.js","names":[],"sources":["../../src/export/ExportRoutes.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n Component,\n type ReactNode,\n type ErrorInfo,\n} from \"react\";\nimport { Navigate, Route, Routes } from \"react-router\";\nimport { Loader2, AlertTriangle, RefreshCw } from \"lucide-react\";\nimport { FeatureGate } from \"@burdenoff/fe-libs/shared/feature-flags\";\n\n// Eager loaded - primary landing page\nimport { ExportLandingPage } from \"./pages/ExportLandingPage\";\n\n// Lazy loaded pages\nconst CreateExportPage = lazy(() =>\n import(\"./pages/CreateExportPage\").then((m) => ({\n default: m.CreateExportPage,\n })),\n);\nconst ExportHistoryPage = lazy(() =>\n import(\"./pages/ExportHistoryPage\").then((m) => ({\n default: m.ExportHistoryPage,\n })),\n);\nconst ExportDetailPage = lazy(() =>\n import(\"./pages/ExportDetailPage\").then((m) => ({\n default: m.ExportDetailPage,\n })),\n);\nconst ExportTemplatesPage = lazy(() =>\n import(\"./pages/ExportTemplatesPage\").then((m) => ({\n default: m.ExportTemplatesPage,\n })),\n);\nconst TemplateDetailPage = lazy(() =>\n import(\"./pages/TemplateDetailPage\").then((m) => ({\n default: m.TemplateDetailPage,\n })),\n);\n\n/**\n * Loading fallback for lazy-loaded pages\n */\nfunction PageLoader() {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <Loader2 className=\"size-8 animate-spin text-primary\" />\n </div>\n );\n}\n\n/**\n * Error boundary for lazy-loaded page chunks.\n * Catches chunk-load failures and renders a retry UI instead of an infinite spinner.\n */\nclass LazyErrorBoundary extends Component<\n { children: ReactNode },\n { hasError: boolean; error: Error | null }\n> {\n constructor(props: { children: ReactNode }) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"[Export] Lazy page load failed:\", error, errorInfo);\n }\n\n handleRetry = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render() {\n if (this.state.hasError) {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] gap-4 text-center p-6\">\n <div className=\"p-3 rounded-full bg-status-error-bg/10\">\n <AlertTriangle className=\"size-8 text-status-error-text\" />\n </div>\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold text-text-primary\">\n Failed to load page\n </h3>\n <p className=\"text-sm text-text-secondary max-w-md\">\n {this.state.error?.message ||\n \"The page chunk could not be loaded. This may be due to a network issue.\"}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={this.handleRetry}\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-md bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <RefreshCw className=\"size-4\" />\n Try Again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n/**\n * Fallback shown when the Export feature flag is OFF.\n */\nfunction ExportDisabledFallback() {\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] gap-4 text-center p-6\">\n <div className=\"p-3 rounded-full bg-bg-sunken\">\n <svg\n className=\"size-8 text-text-secondary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\"\n />\n </svg>\n </div>\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold text-text-primary\">\n Data Export Unavailable\n </h3>\n <p className=\"text-sm text-text-secondary max-w-md\">\n The Data Export feature is currently disabled for this workspace.\n Contact your administrator to enable it.\n </p>\n </div>\n </div>\n );\n}\n\n/**\n * Internal router for the Export microfrontend.\n * This component handles routing within the microfrontend using React Router v7.\n *\n * Routes (relative to basePath, e.g., /export):\n * - / → Export dashboard page\n * - /new → Create new export job\n * - /history → Export history list\n * - /:jobId → Export job detail page\n * - /templates → Export templates list\n * - /templates/:templateId → Template detail page\n */\nexport function ExportRoutes() {\n return (\n <LazyErrorBoundary>\n <FeatureGate\n flag=\"workspaces.export\"\n defaultValue={true}\n fallback={<ExportDisabledFallback />}\n >\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Tabbed landing - default route (eager loaded) */}\n <Route index element={<ExportLandingPage />} />\n\n {/* Create new export (lazy loaded) */}\n <Route path=\"new\" element={<CreateExportPage />} />\n\n {/* Export history (lazy loaded) */}\n <Route path=\"history\" element={<ExportHistoryPage />} />\n\n {/* Export job detail (lazy loaded) */}\n <Route path=\":jobId\" element={<ExportDetailPage />} />\n\n {/* Templates (lazy loaded) */}\n <Route path=\"templates\" element={<ExportTemplatesPage />} />\n <Route\n path=\"templates/:templateId\"\n element={<TemplateDetailPage />}\n />\n\n {/* Catch-all route - redirect to dashboard */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n </FeatureGate>\n </LazyErrorBoundary>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ExportRoutes.js","names":[],"sources":["../../src/export/ExportRoutes.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n Component,\n type ReactNode,\n type ErrorInfo,\n} from \"react\";\nimport { Navigate, Route, Routes } from \"react-router\";\nimport { Loader2, AlertTriangle, RefreshCw } from \"lucide-react\";\nimport { FeatureGate } from \"@burdenoff/fe-libs/shared/feature-flags\";\nimport { useTr } from \"./hooks/useTr\";\n\n// Eager loaded - primary landing page\nimport { ExportLandingPage } from \"./pages/ExportLandingPage\";\n\n// Lazy loaded pages\nconst CreateExportPage = lazy(() =>\n import(\"./pages/CreateExportPage\").then((m) => ({\n default: m.CreateExportPage,\n })),\n);\nconst ExportHistoryPage = lazy(() =>\n import(\"./pages/ExportHistoryPage\").then((m) => ({\n default: m.ExportHistoryPage,\n })),\n);\nconst ExportDetailPage = lazy(() =>\n import(\"./pages/ExportDetailPage\").then((m) => ({\n default: m.ExportDetailPage,\n })),\n);\nconst ExportTemplatesPage = lazy(() =>\n import(\"./pages/ExportTemplatesPage\").then((m) => ({\n default: m.ExportTemplatesPage,\n })),\n);\nconst TemplateDetailPage = lazy(() =>\n import(\"./pages/TemplateDetailPage\").then((m) => ({\n default: m.TemplateDetailPage,\n })),\n);\n\n/**\n * Loading fallback for lazy-loaded pages\n */\nfunction PageLoader() {\n return (\n <div className=\"flex items-center justify-center min-h-[400px]\">\n <Loader2 className=\"size-8 animate-spin text-primary\" />\n </div>\n );\n}\n\n/**\n * Translated error UI rendered by LazyErrorBoundary.\n * Extracted as a function component so it can use the `useTr` hook.\n */\nfunction LazyErrorFallback({\n error,\n onRetry,\n}: {\n error: Error | null;\n onRetry: () => void;\n}) {\n const tr = useTr();\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] gap-4 text-center p-6\">\n <div className=\"p-3 rounded-full bg-status-error-bg/10\">\n <AlertTriangle className=\"size-8 text-status-error-text\" />\n </div>\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold text-text-primary\">\n {tr(\"export.routes.error.title\", \"Failed to load page\")}\n </h3>\n <p className=\"text-sm text-text-secondary max-w-md\">\n {error?.message ||\n tr(\n \"export.routes.error.description\",\n \"The page chunk could not be loaded. This may be due to a network issue.\",\n )}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-md bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90 transition-colors\"\n >\n <RefreshCw className=\"size-4\" />\n {tr(\"export.routes.error.retry\", \"Try Again\")}\n </button>\n </div>\n );\n}\n\n/**\n * Error boundary for lazy-loaded page chunks.\n * Catches chunk-load failures and renders a retry UI instead of an infinite spinner.\n */\nclass LazyErrorBoundary extends Component<\n { children: ReactNode },\n { hasError: boolean; error: Error | null }\n> {\n constructor(props: { children: ReactNode }) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"[Export] Lazy page load failed:\", error, errorInfo);\n }\n\n handleRetry = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render() {\n if (this.state.hasError) {\n return (\n <LazyErrorFallback\n error={this.state.error}\n onRetry={this.handleRetry}\n />\n );\n }\n\n return this.props.children;\n }\n}\n\n/**\n * Fallback shown when the Export feature flag is OFF.\n */\nfunction ExportDisabledFallback() {\n const tr = useTr();\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[400px] gap-4 text-center p-6\">\n <div className=\"p-3 rounded-full bg-bg-sunken\">\n <svg\n className=\"size-8 text-text-secondary\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\"\n />\n </svg>\n </div>\n <div className=\"space-y-2\">\n <h3 className=\"text-lg font-semibold text-text-primary\">\n {tr(\"export.routes.disabled.title\", \"Data Export Unavailable\")}\n </h3>\n <p className=\"text-sm text-text-secondary max-w-md\">\n {tr(\n \"export.routes.disabled.description\",\n \"The Data Export feature is currently disabled for this workspace. Contact your administrator to enable it.\",\n )}\n </p>\n </div>\n </div>\n );\n}\n\n/**\n * Internal router for the Export microfrontend.\n * This component handles routing within the microfrontend using React Router v7.\n *\n * Routes (relative to basePath, e.g., /export):\n * - / → Export dashboard page\n * - /new → Create new export job\n * - /history → Export history list\n * - /:jobId → Export job detail page\n * - /templates → Export templates list\n * - /templates/:templateId → Template detail page\n */\nexport function ExportRoutes() {\n return (\n <LazyErrorBoundary>\n <FeatureGate\n flag=\"workspaces.export\"\n defaultValue={true}\n fallback={<ExportDisabledFallback />}\n >\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Tabbed landing - default route (eager loaded) */}\n <Route index element={<ExportLandingPage />} />\n\n {/* Create new export (lazy loaded) */}\n <Route path=\"new\" element={<CreateExportPage />} />\n\n {/* Export history (lazy loaded) */}\n <Route path=\"history\" element={<ExportHistoryPage />} />\n\n {/* Export job detail (lazy loaded) */}\n <Route path=\":jobId\" element={<ExportDetailPage />} />\n\n {/* Templates (lazy loaded) */}\n <Route path=\"templates\" element={<ExportTemplatesPage />} />\n <Route\n path=\"templates/:templateId\"\n element={<TemplateDetailPage />}\n />\n\n {/* Catch-all route - redirect to dashboard */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n </FeatureGate>\n </LazyErrorBoundary>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExportProgressBar.d.ts","sourceRoot":"","sources":["../../../src/export/components/ExportProgressBar.tsx"],"names":[],"mappings":"AAEA,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B;AAQD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,SAAS,EACT,SAAgB,EAChB,IAAW,GACZ,EAAE,sBAAsB,+BAiCxB"}
1
+ {"version":3,"file":"ExportProgressBar.d.ts","sourceRoot":"","sources":["../../../src/export/components/ExportProgressBar.tsx"],"names":[],"mappings":"AAGA,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B;AAQD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,SAAS,EACT,SAAgB,EAChB,IAAW,GACZ,EAAE,sBAAsB,+BAkCxB"}
@@ -1,34 +1,35 @@
1
- import { cn as e } from "../utils/cn.js";
2
- import { jsx as t, jsxs as n } from "react/jsx-runtime";
1
+ import { useTr as e } from "../hooks/useTr.js";
2
+ import { cn as t } from "../utils/cn.js";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
3
4
  //#region src/export/components/ExportProgressBar.tsx
4
- var r = {
5
+ var i = {
5
6
  sm: "h-1.5",
6
7
  md: "h-2.5",
7
8
  lg: "h-4"
8
9
  };
9
- function i({ progress: i, className: a, showLabel: o = !0, size: s = "md" }) {
10
- let c = Math.min(100, Math.max(0, i));
11
- return /* @__PURE__ */ n("div", {
12
- className: e("w-full", a),
13
- children: [o && /* @__PURE__ */ n("div", {
10
+ function a({ progress: a, className: o, showLabel: s = !0, size: c = "md" }) {
11
+ let l = e(), u = Math.min(100, Math.max(0, a));
12
+ return /* @__PURE__ */ r("div", {
13
+ className: t("w-full", o),
14
+ children: [s && /* @__PURE__ */ r("div", {
14
15
  className: "flex items-center justify-between mb-1",
15
- children: [/* @__PURE__ */ t("span", {
16
+ children: [/* @__PURE__ */ n("span", {
16
17
  className: "text-xs font-medium text-text-secondary",
17
- children: "Progress"
18
- }), /* @__PURE__ */ n("span", {
18
+ children: l("export.progress.label", "Progress")
19
+ }), /* @__PURE__ */ r("span", {
19
20
  className: "text-xs font-semibold text-text-primary",
20
- children: [Math.round(c), "%"]
21
+ children: [Math.round(u), "%"]
21
22
  })]
22
- }), /* @__PURE__ */ t("div", {
23
- className: e("w-full bg-bg-sunken rounded-full overflow-hidden", r[s]),
24
- children: /* @__PURE__ */ t("div", {
25
- className: e("h-full rounded-full transition-all duration-500 ease-out", c === 100 ? "bg-status-success-bg" : "bg-action-primary-bg bg-gradient-to-r from-primary to-primary/80"),
26
- style: { width: `${c}%` }
23
+ }), /* @__PURE__ */ n("div", {
24
+ className: t("w-full bg-bg-sunken rounded-full overflow-hidden", i[c]),
25
+ children: /* @__PURE__ */ n("div", {
26
+ className: t("h-full rounded-full transition-all duration-500 ease-out", u === 100 ? "bg-status-success-bg" : "bg-action-primary-bg bg-gradient-to-r from-primary to-primary/80"),
27
+ style: { width: `${u}%` }
27
28
  })
28
29
  })]
29
30
  });
30
31
  }
31
32
  //#endregion
32
- export { i as ExportProgressBar };
33
+ export { a as ExportProgressBar };
33
34
 
34
35
  //# sourceMappingURL=ExportProgressBar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExportProgressBar.js","names":[],"sources":["../../../src/export/components/ExportProgressBar.tsx"],"sourcesContent":["import { cn } from \"../utils/cn\";\n\ninterface ExportProgressBarProps {\n progress: number;\n className?: string;\n showLabel?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"h-1.5\",\n md: \"h-2.5\",\n lg: \"h-4\",\n};\n\n/**\n * ExportProgressBar - Shows export progress percentage\n */\nexport function ExportProgressBar({\n progress,\n className,\n showLabel = true,\n size = \"md\",\n}: ExportProgressBarProps) {\n const clampedProgress = Math.min(100, Math.max(0, progress));\n\n return (\n <div className={cn(\"w-full\", className)}>\n {showLabel && (\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-medium text-text-secondary\">\n Progress\n </span>\n <span className=\"text-xs font-semibold text-text-primary\">\n {Math.round(clampedProgress)}%\n </span>\n </div>\n )}\n <div\n className={cn(\n \"w-full bg-bg-sunken rounded-full overflow-hidden\",\n sizeClasses[size],\n )}\n >\n <div\n className={cn(\n \"h-full rounded-full transition-all duration-500 ease-out\",\n clampedProgress === 100\n ? \"bg-status-success-bg\"\n : \"bg-action-primary-bg bg-gradient-to-r from-primary to-primary/80\",\n )}\n style={{ width: `${clampedProgress}%` }}\n />\n </div>\n </div>\n );\n}\n"],"mappings":";;;AASA,IAAM,IAAc;CAClB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAKD,SAAgB,EAAkB,EAChC,aACA,cACA,eAAY,IACZ,UAAO,QACkB;CACzB,IAAM,IAAkB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,EAAS,CAAC;AAE5D,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,UAAU,EAAU;YAAvC,CACG,KACC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IAAM,WAAU;cAA0C;IAEnD,CAAA,EACP,kBAAC,QAAD;IAAM,WAAU;cAAhB,CACG,KAAK,MAAM,EAAgB,EAAC,IACxB;MACH;MAER,kBAAC,OAAD;GACE,WAAW,EACT,oDACA,EAAY,GACb;aAED,kBAAC,OAAD;IACE,WAAW,EACT,4DACA,MAAoB,MAChB,yBACA,mEACL;IACD,OAAO,EAAE,OAAO,GAAG,EAAgB,IAAI;IACvC,CAAA;GACE,CAAA,CACF"}
1
+ {"version":3,"file":"ExportProgressBar.js","names":[],"sources":["../../../src/export/components/ExportProgressBar.tsx"],"sourcesContent":["import { useTr } from \"../hooks/useTr\";\nimport { cn } from \"../utils/cn\";\n\ninterface ExportProgressBarProps {\n progress: number;\n className?: string;\n showLabel?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"h-1.5\",\n md: \"h-2.5\",\n lg: \"h-4\",\n};\n\n/**\n * ExportProgressBar - Shows export progress percentage\n */\nexport function ExportProgressBar({\n progress,\n className,\n showLabel = true,\n size = \"md\",\n}: ExportProgressBarProps) {\n const tr = useTr();\n const clampedProgress = Math.min(100, Math.max(0, progress));\n\n return (\n <div className={cn(\"w-full\", className)}>\n {showLabel && (\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-xs font-medium text-text-secondary\">\n {tr(\"export.progress.label\", \"Progress\")}\n </span>\n <span className=\"text-xs font-semibold text-text-primary\">\n {Math.round(clampedProgress)}%\n </span>\n </div>\n )}\n <div\n className={cn(\n \"w-full bg-bg-sunken rounded-full overflow-hidden\",\n sizeClasses[size],\n )}\n >\n <div\n className={cn(\n \"h-full rounded-full transition-all duration-500 ease-out\",\n clampedProgress === 100\n ? \"bg-status-success-bg\"\n : \"bg-action-primary-bg bg-gradient-to-r from-primary to-primary/80\",\n )}\n style={{ width: `${clampedProgress}%` }}\n />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;AAUA,IAAM,IAAc;CAClB,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAKD,SAAgB,EAAkB,EAChC,aACA,cACA,eAAY,IACZ,UAAO,QACkB;CACzB,IAAM,IAAK,GAAO,EACZ,IAAkB,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,EAAS,CAAC;AAE5D,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,UAAU,EAAU;YAAvC,CACG,KACC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IAAM,WAAU;cACb,EAAG,yBAAyB,WAAW;IACnC,CAAA,EACP,kBAAC,QAAD;IAAM,WAAU;cAAhB,CACG,KAAK,MAAM,EAAgB,EAAC,IACxB;MACH;MAER,kBAAC,OAAD;GACE,WAAW,EACT,oDACA,EAAY,GACb;aAED,kBAAC,OAAD;IACE,WAAW,EACT,4DACA,MAAoB,MAChB,yBACA,mEACL;IACD,OAAO,EAAE,OAAO,GAAG,EAAgB,IAAI;IACvC,CAAA;GACE,CAAA,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ExportStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/export/components/ExportStatusBadge.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGhD,UAAU,sBAAsB;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,SAAS,GACV,EAAE,sBAAsB,+BAiCxB"}
1
+ {"version":3,"file":"ExportStatusBadge.d.ts","sourceRoot":"","sources":["../../../src/export/components/ExportStatusBadge.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,UAAU,sBAAsB;IAC9B,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,SAAS,GACV,EAAE,sBAAsB,+BAgCxB"}
@@ -1,10 +1,9 @@
1
- import { cn as e } from "../utils/cn.js";
2
- import { getStatusDisplayName as t } from "../constants/enums.js";
3
- import { tWithFallback as n } from "../utils/i18n.js";
1
+ import { useTr as e } from "../hooks/useTr.js";
2
+ import { cn as t } from "../utils/cn.js";
3
+ import { getStatusDisplayName as n } from "../constants/enums.js";
4
4
  import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
- import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
6
5
  //#region src/export/components/ExportStatusBadge.tsx
7
- var o = {
6
+ var a = {
8
7
  CREATED: "bg-status-info-bg-subtle text-status-info-text",
9
8
  QUEUED: "bg-status-warning-bg-subtle text-status-warning-text",
10
9
  RUNNING: "bg-status-info-bg-subtle text-status-info-text motion-safe:animate-vc-glow-pulse",
@@ -14,26 +13,26 @@ var o = {
14
13
  EXPIRED: "bg-accent-orange-subtle text-accent-orange",
15
14
  DELETED: "bg-bg-sunken text-text-tertiary"
16
15
  };
17
- function s({ status: s, className: c }) {
18
- let { t: l } = a(), u = (e, t) => n(l, e, t), d = {
19
- CREATED: u("export.shared.status.created", "Created"),
20
- QUEUED: u("export.shared.status.queued", "Queued"),
21
- RUNNING: u("export.shared.status.running", "Running"),
22
- COMPLETED: u("export.shared.status.completed", "Completed"),
23
- FAILED: u("export.shared.status.failed", "Failed"),
24
- CANCELLED: u("export.shared.status.cancelled", "Cancelled"),
25
- EXPIRED: u("export.shared.status.expired", "Expired"),
26
- DELETED: u("export.shared.status.deleted", "Deleted")
27
- }[s] ?? t(s);
16
+ function o({ status: o, className: s }) {
17
+ let c = e(), l = {
18
+ CREATED: c("export.shared.status.created", "Created"),
19
+ QUEUED: c("export.shared.status.queued", "Queued"),
20
+ RUNNING: c("export.shared.status.running", "Running"),
21
+ COMPLETED: c("export.shared.status.completed", "Completed"),
22
+ FAILED: c("export.shared.status.failed", "Failed"),
23
+ CANCELLED: c("export.shared.status.cancelled", "Cancelled"),
24
+ EXPIRED: c("export.shared.status.expired", "Expired"),
25
+ DELETED: c("export.shared.status.deleted", "Deleted")
26
+ }[o] ?? n(o);
28
27
  return /* @__PURE__ */ i("span", {
29
- className: e("inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium", o[s], c),
30
- children: [s === "RUNNING" && /* @__PURE__ */ i("span", {
28
+ className: t("inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium", a[o], s),
29
+ children: [o === "RUNNING" && /* @__PURE__ */ i("span", {
31
30
  className: "relative flex size-2",
32
31
  children: [/* @__PURE__ */ r("span", { className: "animate-ping absolute inline-flex h-full w-full rounded-full bg-accent-blue opacity-75" }), /* @__PURE__ */ r("span", { className: "relative inline-flex rounded-full size-2 bg-accent-blue" })]
33
- }), d]
32
+ }), l]
34
33
  });
35
34
  }
36
35
  //#endregion
37
- export { s as ExportStatusBadge };
36
+ export { o as ExportStatusBadge };
38
37
 
39
38
  //# sourceMappingURL=ExportStatusBadge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExportStatusBadge.js","names":[],"sources":["../../../src/export/components/ExportStatusBadge.tsx"],"sourcesContent":["import { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { cn } from \"../utils/cn\";\nimport { getStatusDisplayName } from \"../constants/enums\";\nimport type { ExportJobStatus } from \"../types\";\nimport { tWithFallback } from \"../utils/i18n\";\n\ninterface ExportStatusBadgeProps {\n status: ExportJobStatus;\n className?: string;\n}\n\nconst statusStyles: Record<ExportJobStatus, string> = {\n CREATED: \"bg-status-info-bg-subtle text-status-info-text\",\n QUEUED: \"bg-status-warning-bg-subtle text-status-warning-text\",\n RUNNING:\n \"bg-status-info-bg-subtle text-status-info-text motion-safe:animate-vc-glow-pulse\",\n COMPLETED: \"bg-status-success-bg-subtle text-status-success-text\",\n FAILED: \"bg-status-error-bg-subtle text-status-error-text\",\n CANCELLED: \"bg-bg-sunken text-text-secondary\",\n EXPIRED: \"bg-accent-orange-subtle text-accent-orange\",\n DELETED: \"bg-bg-sunken text-text-tertiary\",\n};\n\n/**\n * ExportStatusBadge - Renders a colored badge for export job status\n */\nexport function ExportStatusBadge({\n status,\n className,\n}: ExportStatusBadgeProps) {\n const { t } = useI18n();\n const tr = (key: string, fallback: string) => tWithFallback(t, key, fallback);\n\n const statusLabel =\n {\n CREATED: tr(\"export.shared.status.created\", \"Created\"),\n QUEUED: tr(\"export.shared.status.queued\", \"Queued\"),\n RUNNING: tr(\"export.shared.status.running\", \"Running\"),\n COMPLETED: tr(\"export.shared.status.completed\", \"Completed\"),\n FAILED: tr(\"export.shared.status.failed\", \"Failed\"),\n CANCELLED: tr(\"export.shared.status.cancelled\", \"Cancelled\"),\n EXPIRED: tr(\"export.shared.status.expired\", \"Expired\"),\n DELETED: tr(\"export.shared.status.deleted\", \"Deleted\"),\n }[status] ?? getStatusDisplayName(status);\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium\",\n statusStyles[status],\n className,\n )}\n >\n {status === \"RUNNING\" && (\n <span className=\"relative flex size-2\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-accent-blue opacity-75\" />\n <span className=\"relative inline-flex rounded-full size-2 bg-accent-blue\" />\n </span>\n )}\n {statusLabel}\n </span>\n );\n}\n"],"mappings":";;;;;;AAWA,IAAM,IAAgD;CACpD,SAAS;CACT,QAAQ;CACR,SACE;CACF,WAAW;CACX,QAAQ;CACR,WAAW;CACX,SAAS;CACT,SAAS;CACV;AAKD,SAAgB,EAAkB,EAChC,WACA,gBACyB;CACzB,IAAM,EAAE,SAAM,GAAS,EACjB,KAAM,GAAa,MAAqB,EAAc,GAAG,GAAK,EAAS,EAEvE,IACJ;EACE,SAAS,EAAG,gCAAgC,UAAU;EACtD,QAAQ,EAAG,+BAA+B,SAAS;EACnD,SAAS,EAAG,gCAAgC,UAAU;EACtD,WAAW,EAAG,kCAAkC,YAAY;EAC5D,QAAQ,EAAG,+BAA+B,SAAS;EACnD,WAAW,EAAG,kCAAkC,YAAY;EAC5D,SAAS,EAAG,gCAAgC,UAAU;EACtD,SAAS,EAAG,gCAAgC,UAAU;EACvD,CAAC,MAAW,EAAqB,EAAO;AAE3C,QACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAa,IACb,EACD;YALH,CAOG,MAAW,aACV,kBAAC,QAAD;GAAM,WAAU;aAAhB,CACE,kBAAC,QAAD,EAAM,WAAU,0FAA2F,CAAA,EAC3G,kBAAC,QAAD,EAAM,WAAU,2DAA4D,CAAA,CACvE;MAER,EACI"}
1
+ {"version":3,"file":"ExportStatusBadge.js","names":[],"sources":["../../../src/export/components/ExportStatusBadge.tsx"],"sourcesContent":["import { cn } from \"../utils/cn\";\nimport { getStatusDisplayName } from \"../constants/enums\";\nimport { useTr } from \"../hooks/useTr\";\nimport type { ExportJobStatus } from \"../types\";\n\ninterface ExportStatusBadgeProps {\n status: ExportJobStatus;\n className?: string;\n}\n\nconst statusStyles: Record<ExportJobStatus, string> = {\n CREATED: \"bg-status-info-bg-subtle text-status-info-text\",\n QUEUED: \"bg-status-warning-bg-subtle text-status-warning-text\",\n RUNNING:\n \"bg-status-info-bg-subtle text-status-info-text motion-safe:animate-vc-glow-pulse\",\n COMPLETED: \"bg-status-success-bg-subtle text-status-success-text\",\n FAILED: \"bg-status-error-bg-subtle text-status-error-text\",\n CANCELLED: \"bg-bg-sunken text-text-secondary\",\n EXPIRED: \"bg-accent-orange-subtle text-accent-orange\",\n DELETED: \"bg-bg-sunken text-text-tertiary\",\n};\n\n/**\n * ExportStatusBadge - Renders a colored badge for export job status\n */\nexport function ExportStatusBadge({\n status,\n className,\n}: ExportStatusBadgeProps) {\n const tr = useTr();\n\n const statusLabel =\n {\n CREATED: tr(\"export.shared.status.created\", \"Created\"),\n QUEUED: tr(\"export.shared.status.queued\", \"Queued\"),\n RUNNING: tr(\"export.shared.status.running\", \"Running\"),\n COMPLETED: tr(\"export.shared.status.completed\", \"Completed\"),\n FAILED: tr(\"export.shared.status.failed\", \"Failed\"),\n CANCELLED: tr(\"export.shared.status.cancelled\", \"Cancelled\"),\n EXPIRED: tr(\"export.shared.status.expired\", \"Expired\"),\n DELETED: tr(\"export.shared.status.deleted\", \"Deleted\"),\n }[status] ?? getStatusDisplayName(status);\n\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium\",\n statusStyles[status],\n className,\n )}\n >\n {status === \"RUNNING\" && (\n <span className=\"relative flex size-2\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-accent-blue opacity-75\" />\n <span className=\"relative inline-flex rounded-full size-2 bg-accent-blue\" />\n </span>\n )}\n {statusLabel}\n </span>\n );\n}\n"],"mappings":";;;;;AAUA,IAAM,IAAgD;CACpD,SAAS;CACT,QAAQ;CACR,SACE;CACF,WAAW;CACX,QAAQ;CACR,WAAW;CACX,SAAS;CACT,SAAS;CACV;AAKD,SAAgB,EAAkB,EAChC,WACA,gBACyB;CACzB,IAAM,IAAK,GAAO,EAEZ,IACJ;EACE,SAAS,EAAG,gCAAgC,UAAU;EACtD,QAAQ,EAAG,+BAA+B,SAAS;EACnD,SAAS,EAAG,gCAAgC,UAAU;EACtD,WAAW,EAAG,kCAAkC,YAAY;EAC5D,QAAQ,EAAG,+BAA+B,SAAS;EACnD,WAAW,EAAG,kCAAkC,YAAY;EAC5D,SAAS,EAAG,gCAAgC,UAAU;EACtD,SAAS,EAAG,gCAAgC,UAAU;EACvD,CAAC,MAAW,EAAqB,EAAO;AAE3C,QACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAa,IACb,EACD;YALH,CAOG,MAAW,aACV,kBAAC,QAAD;GAAM,WAAU;aAAhB,CACE,kBAAC,QAAD,EAAM,WAAU,0FAA2F,CAAA,EAC3G,kBAAC,QAAD,EAAM,WAAU,2DAA4D,CAAA,CACvE;MAER,EACI"}
@@ -0,0 +1,19 @@
1
+ import { TranslationParams } from '../utils/i18n';
2
+
3
+ /**
4
+ * useTr — translation hook with fallback semantics.
5
+ *
6
+ * Wraps `useI18n().t()` so that when a key has no translation (i.e. the
7
+ * provider returns the key itself), the caller's English fallback is used
8
+ * instead. This keeps consumer call sites consistent and avoids leaking
9
+ * untranslated keys into the UI.
10
+ *
11
+ * Supports optional interpolation params using `{{key}}` placeholders.
12
+ *
13
+ * @example
14
+ * const tr = useTr();
15
+ * return <h1>{tr('export.dashboard.title', 'Export')}</h1>;
16
+ * return <p>{tr('export.dashboard.activeCount', '{{count}} active exports', { count: 5 })}</p>;
17
+ */
18
+ export declare function useTr(): (key: string, fallback: string, params?: TranslationParams) => string;
19
+ //# sourceMappingURL=useTr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTr.d.ts","sourceRoot":"","sources":["../../../src/export/hooks/useTr.ts"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE5E;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,KAAK,IAAI,CACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,iBAAiB,KACvB,MAAM,CAUV"}
@@ -0,0 +1,15 @@
1
+ import { interpolateFallback as e } from "../utils/i18n.js";
2
+ import { useCallback as t } from "react";
3
+ import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
4
+ //#region src/export/hooks/useTr.ts
5
+ function r() {
6
+ let { t: r } = n();
7
+ return t((t, n, i) => {
8
+ let a = r(t);
9
+ return e(a === t ? n : a, i);
10
+ }, [r]);
11
+ }
12
+ //#endregion
13
+ export { r as useTr };
14
+
15
+ //# sourceMappingURL=useTr.js.map