@burdenoff/microfe-export 2026.625.1 → 2026.626.1

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.
@@ -7,7 +7,7 @@ import { useI18n as a } from "@burdenoff/fe-libs/shared/providers/shell/I18nProv
7
7
  var o = {
8
8
  CREATED: "bg-status-info-bg-subtle text-status-info-text",
9
9
  QUEUED: "bg-status-warning-bg-subtle text-status-warning-text",
10
- RUNNING: "bg-status-info-bg-subtle text-status-info-text animate-pulse",
10
+ RUNNING: "bg-status-info-bg-subtle text-status-info-text motion-safe:animate-vc-glow-pulse",
11
11
  COMPLETED: "bg-status-success-bg-subtle text-status-success-text",
12
12
  FAILED: "bg-status-error-bg-subtle text-status-error-text",
13
13
  CANCELLED: "bg-bg-sunken text-text-secondary",
@@ -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: \"bg-status-info-bg-subtle text-status-info-text animate-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,SAAS;CACT,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 { 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,8 +1,8 @@
1
1
  import { cn as e } from "../utils/cn.js";
2
2
  import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
- import { EmptyState as r } from "@burdenoff/fe-libs/ui";
3
+ import "@burdenoff/fe-libs/ui";
4
4
  //#region src/export/components/PageLayout.tsx
5
- var i = {
5
+ var r = {
6
6
  sm: "max-w-screen-sm",
7
7
  md: "max-w-screen-md",
8
8
  lg: "max-w-screen-lg",
@@ -11,11 +11,11 @@ var i = {
11
11
  "3xl": "max-w-[1600px]",
12
12
  full: "max-w-full"
13
13
  };
14
- function a({ children: r, title: a, subtitle: o, icon: s, headerActions: c, headerContent: l, maxWidth: u = "xl", showHeader: d = !0, className: f, contentClassName: p }) {
14
+ function i({ children: i, title: a, subtitle: o, icon: s, headerActions: c, headerContent: l, maxWidth: u = "xl", showHeader: d = !0, className: f, contentClassName: p }) {
15
15
  return /* @__PURE__ */ t("div", {
16
16
  className: e("min-h-full w-full", "px-4 sm:px-6 lg:px-8 xl:px-12", "py-6 sm:py-8 lg:py-10", "animate-in fade-in-0 slide-in-from-bottom-4 duration-500", f),
17
17
  children: /* @__PURE__ */ n("div", {
18
- className: e("mx-auto w-full", i[u], p),
18
+ className: e("mx-auto w-full", r[u], p),
19
19
  children: [d && (a || c) && /* @__PURE__ */ n("header", {
20
20
  className: "mb-6 sm:mb-8",
21
21
  children: [/* @__PURE__ */ n("div", {
@@ -45,12 +45,12 @@ function a({ children: r, title: a, subtitle: o, icon: s, headerActions: c, head
45
45
  })]
46
46
  }), /* @__PURE__ */ t("div", {
47
47
  className: "space-y-6",
48
- children: r
48
+ children: i
49
49
  })]
50
50
  })
51
51
  });
52
52
  }
53
- function o({ children: r, title: i, description: a, actions: o, className: s, ...c }) {
53
+ function a({ children: r, title: i, description: a, actions: o, className: s, ...c }) {
54
54
  return /* @__PURE__ */ n("section", {
55
55
  className: e("space-y-4", s),
56
56
  ...c,
@@ -69,18 +69,7 @@ function o({ children: r, title: i, description: a, actions: o, className: s, ..
69
69
  }), r]
70
70
  });
71
71
  }
72
- function s({ icon: e, title: n, description: i, action: a, className: o }) {
73
- return /* @__PURE__ */ t("div", {
74
- className: o,
75
- children: /* @__PURE__ */ t(r, {
76
- icon: e,
77
- title: n,
78
- description: i,
79
- action: a
80
- })
81
- });
82
- }
83
72
  //#endregion
84
- export { s as EmptyState, a as PageLayout, o as PageSection };
73
+ export { i as PageLayout, a as PageSection };
85
74
 
86
75
  //# sourceMappingURL=PageLayout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/export/components/PageLayout.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { EmptyState as CanonicalEmptyState } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"../utils/cn\";\n\ninterface PageLayoutProps {\n children: ReactNode;\n /** Page title */\n title?: string;\n /** Page subtitle/description */\n subtitle?: string;\n /** Icon component to display next to title */\n icon?: ReactNode;\n /** Actions to display in header (buttons, etc.) */\n headerActions?: ReactNode;\n /** Additional header content below title */\n headerContent?: ReactNode;\n /** Maximum width of content: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full' */\n maxWidth?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"full\";\n /** Whether to show the header section */\n showHeader?: boolean;\n /** Additional CSS classes for the container */\n className?: string;\n /** Additional CSS classes for the content area */\n contentClassName?: string;\n}\n\nconst maxWidthClasses = {\n sm: \"max-w-screen-sm\", // 640px\n md: \"max-w-screen-md\", // 768px\n lg: \"max-w-screen-lg\", // 1024px\n xl: \"max-w-screen-xl\", // 1280px\n \"2xl\": \"max-w-screen-2xl\", // 1536px\n \"3xl\": \"max-w-[1600px]\",\n full: \"max-w-full\",\n};\n\n/**\n * PageLayout - A consistent page wrapper with responsive design\n *\n * Features:\n * - Proper max-width constraints\n * - Responsive padding\n * - Animated entrance\n * - Consistent header styling\n */\nexport function PageLayout({\n children,\n title,\n subtitle,\n icon,\n headerActions,\n headerContent,\n maxWidth = \"xl\",\n showHeader = true,\n className,\n contentClassName,\n}: PageLayoutProps) {\n return (\n <div\n className={cn(\n // Base styles - full width container with padding\n \"min-h-full w-full\",\n // Responsive horizontal padding\n \"px-4 sm:px-6 lg:px-8 xl:px-12\",\n // Responsive vertical padding\n \"py-6 sm:py-8 lg:py-10\",\n // Entrance animation\n \"animate-in fade-in-0 slide-in-from-bottom-4 duration-500\",\n className,\n )}\n >\n {/* Max-width constrained content container */}\n <div\n className={cn(\n \"mx-auto w-full\",\n maxWidthClasses[maxWidth],\n contentClassName,\n )}\n >\n {/* Page Header */}\n {showHeader && (title || headerActions) && (\n <header className=\"mb-6 sm:mb-8\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n {/* Title Section */}\n <div className=\"space-y-1\">\n {(title || icon) && (\n <div className=\"flex items-center gap-3\">\n {icon && (\n <div className=\"flex-shrink-0 p-2.5 rounded-xl bg-action-primary-bg/10 text-primary\">\n {icon}\n </div>\n )}\n {title && (\n <h1 className=\"text-2xl sm:text-3xl font-bold tracking-tight text-text-primary\">\n {title}\n </h1>\n )}\n </div>\n )}\n {subtitle && (\n <p className=\"text-sm sm:text-base text-text-secondary max-w-2xl\">\n {subtitle}\n </p>\n )}\n </div>\n\n {/* Header Actions */}\n {headerActions && (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {headerActions}\n </div>\n )}\n </div>\n\n {/* Additional Header Content */}\n {headerContent && <div className=\"mt-4\">{headerContent}</div>}\n </header>\n )}\n\n {/* Page content — must not use a <main> landmark here because the\n host shell (AppShellLayout) already renders one; nesting <main>\n elements is invalid HTML and an a11y violation. */}\n <div className=\"space-y-6\">{children}</div>\n </div>\n </div>\n );\n}\n\n/**\n * PageSection - A section within a page with consistent spacing\n */\nexport function PageSection({\n children,\n title,\n description,\n actions,\n className,\n ...rest\n}: {\n children: ReactNode;\n title?: string;\n description?: string;\n actions?: ReactNode;\n className?: string;\n} & React.HTMLAttributes<HTMLElement>) {\n return (\n <section className={cn(\"space-y-4\", className)} {...rest}>\n {(title || actions) && (\n <div className=\"flex items-center justify-between\">\n <div>\n {title && (\n <h2 className=\"text-lg font-semibold text-text-primary\">{title}</h2>\n )}\n {description && (\n <p className=\"text-sm text-text-secondary\">{description}</p>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )}\n {children}\n </section>\n );\n}\n\n/**\n * Local wrapper around the canonical `EmptyState` from `@burdenoff/fe-libs/ui`.\n * Keeps the existing microfe-export call sites stable while routing all\n * empty-state rendering through the shared primitive.\n */\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n}: {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}) {\n return (\n <div className={className}>\n <CanonicalEmptyState\n icon={icon}\n title={title}\n description={description}\n action={action}\n />\n </div>\n );\n}\n"],"mappings":";;;;AA0BA,IAAM,IAAkB;CACtB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,OAAO;CACP,MAAM;CACP;AAWD,SAAgB,EAAW,EACzB,aACA,UACA,aACA,SACA,kBACA,kBACA,cAAW,MACX,gBAAa,IACb,cACA,uBACkB;AAClB,QACE,kBAAC,OAAD;EACE,WAAW,EAET,qBAEA,iCAEA,yBAEA,4DACA,EACD;YAGD,kBAAC,OAAD;GACE,WAAW,EACT,kBACA,EAAgB,IAChB,EACD;aALH,CAQG,MAAe,KAAS,MACvB,kBAAC,UAAD;IAAQ,WAAU;cAAlB,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CAEE,kBAAC,OAAD;MAAK,WAAU;gBAAf,EACI,KAAS,MACT,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,KACC,kBAAC,OAAD;QAAK,WAAU;kBACZ;QACG,CAAA,EAEP,KACC,kBAAC,MAAD;QAAI,WAAU;kBACX;QACE,CAAA,CAEH;UAEP,KACC,kBAAC,KAAD;OAAG,WAAU;iBACV;OACC,CAAA,CAEF;SAGL,KACC,kBAAC,OAAD;MAAK,WAAU;gBACZ;MACG,CAAA,CAEJ;QAGL,KAAiB,kBAAC,OAAD;KAAK,WAAU;eAAQ;KAAoB,CAAA,CACtD;OAMX,kBAAC,OAAD;IAAK,WAAU;IAAa;IAAe,CAAA,CACvC;;EACF,CAAA;;AAOV,SAAgB,EAAY,EAC1B,aACA,UACA,gBACA,YACA,cACA,GAAG,KAOkC;AACrC,QACE,kBAAC,WAAD;EAAS,WAAW,EAAG,aAAa,EAAU;EAAE,GAAI;YAApD,EACI,KAAS,MACT,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACG,KACC,kBAAC,MAAD;IAAI,WAAU;cAA2C;IAAW,CAAA,EAErE,KACC,kBAAC,KAAD;IAAG,WAAU;cAA+B;IAAgB,CAAA,CAE1D,EAAA,CAAA,EACL,KAAW,kBAAC,OAAD;IAAK,WAAU;cAA2B;IAAc,CAAA,CAChE;MAEP,EACO;;;AASd,SAAgB,EAAW,EACzB,SACA,UACA,gBACA,WACA,gBAOC;AACD,QACE,kBAAC,OAAD;EAAgB;YACd,kBAAC,GAAD;GACQ;GACC;GACM;GACL;GACR,CAAA;EACE,CAAA"}
1
+ {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/export/components/PageLayout.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { EmptyState as CanonicalEmptyState } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"../utils/cn\";\n\ninterface PageLayoutProps {\n children: ReactNode;\n /** Page title */\n title?: string;\n /** Page subtitle/description */\n subtitle?: string;\n /** Icon component to display next to title */\n icon?: ReactNode;\n /** Actions to display in header (buttons, etc.) */\n headerActions?: ReactNode;\n /** Additional header content below title */\n headerContent?: ReactNode;\n /** Maximum width of content: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full' */\n maxWidth?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"full\";\n /** Whether to show the header section */\n showHeader?: boolean;\n /** Additional CSS classes for the container */\n className?: string;\n /** Additional CSS classes for the content area */\n contentClassName?: string;\n}\n\nconst maxWidthClasses = {\n sm: \"max-w-screen-sm\", // 640px\n md: \"max-w-screen-md\", // 768px\n lg: \"max-w-screen-lg\", // 1024px\n xl: \"max-w-screen-xl\", // 1280px\n \"2xl\": \"max-w-screen-2xl\", // 1536px\n \"3xl\": \"max-w-[1600px]\",\n full: \"max-w-full\",\n};\n\n/**\n * PageLayout - A consistent page wrapper with responsive design\n *\n * Features:\n * - Proper max-width constraints\n * - Responsive padding\n * - Animated entrance\n * - Consistent header styling\n */\nexport function PageLayout({\n children,\n title,\n subtitle,\n icon,\n headerActions,\n headerContent,\n maxWidth = \"xl\",\n showHeader = true,\n className,\n contentClassName,\n}: PageLayoutProps) {\n return (\n <div\n className={cn(\n // Base styles - full width container with padding\n \"min-h-full w-full\",\n // Responsive horizontal padding\n \"px-4 sm:px-6 lg:px-8 xl:px-12\",\n // Responsive vertical padding\n \"py-6 sm:py-8 lg:py-10\",\n // Entrance animation\n \"animate-in fade-in-0 slide-in-from-bottom-4 duration-500\",\n className,\n )}\n >\n {/* Max-width constrained content container */}\n <div\n className={cn(\n \"mx-auto w-full\",\n maxWidthClasses[maxWidth],\n contentClassName,\n )}\n >\n {/* Page Header */}\n {showHeader && (title || headerActions) && (\n <header className=\"mb-6 sm:mb-8\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n {/* Title Section */}\n <div className=\"space-y-1\">\n {(title || icon) && (\n <div className=\"flex items-center gap-3\">\n {icon && (\n <div className=\"flex-shrink-0 p-2.5 rounded-xl bg-action-primary-bg/10 text-primary\">\n {icon}\n </div>\n )}\n {title && (\n <h1 className=\"text-2xl sm:text-3xl font-bold tracking-tight text-text-primary\">\n {title}\n </h1>\n )}\n </div>\n )}\n {subtitle && (\n <p className=\"text-sm sm:text-base text-text-secondary max-w-2xl\">\n {subtitle}\n </p>\n )}\n </div>\n\n {/* Header Actions */}\n {headerActions && (\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {headerActions}\n </div>\n )}\n </div>\n\n {/* Additional Header Content */}\n {headerContent && <div className=\"mt-4\">{headerContent}</div>}\n </header>\n )}\n\n {/* Page content — must not use a <main> landmark here because the\n host shell (AppShellLayout) already renders one; nesting <main>\n elements is invalid HTML and an a11y violation. */}\n <div className=\"space-y-6\">{children}</div>\n </div>\n </div>\n );\n}\n\n/**\n * PageSection - A section within a page with consistent spacing\n */\nexport function PageSection({\n children,\n title,\n description,\n actions,\n className,\n ...rest\n}: {\n children: ReactNode;\n title?: string;\n description?: string;\n actions?: ReactNode;\n className?: string;\n} & React.HTMLAttributes<HTMLElement>) {\n return (\n <section className={cn(\"space-y-4\", className)} {...rest}>\n {(title || actions) && (\n <div className=\"flex items-center justify-between\">\n <div>\n {title && (\n <h2 className=\"text-lg font-semibold text-text-primary\">{title}</h2>\n )}\n {description && (\n <p className=\"text-sm text-text-secondary\">{description}</p>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )}\n {children}\n </section>\n );\n}\n\n/**\n * Local wrapper around the canonical `EmptyState` from `@burdenoff/fe-libs/ui`.\n * Keeps the existing microfe-export call sites stable while routing all\n * empty-state rendering through the shared primitive.\n */\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n}: {\n icon?: ReactNode;\n title: string;\n description?: string;\n action?: ReactNode;\n className?: string;\n}) {\n return (\n <div className={className}>\n <CanonicalEmptyState\n icon={icon}\n title={title}\n description={description}\n action={action}\n />\n </div>\n );\n}\n"],"mappings":";;;;AA0BA,IAAM,IAAkB;CACtB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,OAAO;CACP,MAAM;CACP;AAWD,SAAgB,EAAW,EACzB,aACA,UACA,aACA,SACA,kBACA,kBACA,cAAW,MACX,gBAAa,IACb,cACA,uBACkB;AAClB,QACE,kBAAC,OAAD;EACE,WAAW,EAET,qBAEA,iCAEA,yBAEA,4DACA,EACD;YAGD,kBAAC,OAAD;GACE,WAAW,EACT,kBACA,EAAgB,IAChB,EACD;aALH,CAQG,MAAe,KAAS,MACvB,kBAAC,UAAD;IAAQ,WAAU;cAAlB,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CAEE,kBAAC,OAAD;MAAK,WAAU;gBAAf,EACI,KAAS,MACT,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,KACC,kBAAC,OAAD;QAAK,WAAU;kBACZ;QACG,CAAA,EAEP,KACC,kBAAC,MAAD;QAAI,WAAU;kBACX;QACE,CAAA,CAEH;UAEP,KACC,kBAAC,KAAD;OAAG,WAAU;iBACV;OACC,CAAA,CAEF;SAGL,KACC,kBAAC,OAAD;MAAK,WAAU;gBACZ;MACG,CAAA,CAEJ;QAGL,KAAiB,kBAAC,OAAD;KAAK,WAAU;eAAQ;KAAoB,CAAA,CACtD;OAMX,kBAAC,OAAD;IAAK,WAAU;IAAa;IAAe,CAAA,CACvC;;EACF,CAAA;;AAOV,SAAgB,EAAY,EAC1B,aACA,UACA,gBACA,YACA,cACA,GAAG,KAOkC;AACrC,QACE,kBAAC,WAAD;EAAS,WAAW,EAAG,aAAa,EAAU;EAAE,GAAI;YAApD,EACI,KAAS,MACT,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACG,KACC,kBAAC,MAAD;IAAI,WAAU;cAA2C;IAAW,CAAA,EAErE,KACC,kBAAC,KAAD;IAAG,WAAU;cAA+B;IAAgB,CAAA,CAE1D,EAAA,CAAA,EACL,KAAW,kBAAC,OAAD;IAAK,WAAU;cAA2B;IAAc,CAAA,CAChE;MAEP,EACO"}
@@ -5,18 +5,18 @@ import { getFormatDisplayName as a } from "../constants/enums.js";
5
5
  import { tWithFallback as ee } from "../utils/i18n.js";
6
6
  import { PageLayout as te } from "../components/PageLayout.js";
7
7
  import { isExportEntityDisabled as o } from "../utils/disabledModules.js";
8
- import { useEffect as ne, useRef as s, useState as c } from "react";
8
+ import { useEffect as s, useRef as ne, useState as c } from "react";
9
9
  import { ArrowLeft as l, ArrowRight as u, Building2 as d, CalendarRange as re, CheckCircle2 as f, Download as p, FileJson as m, FileSpreadsheet as h, Loader2 as g, Lock as ie, Package as ae, User as _, Users as v } from "lucide-react";
10
10
  import { usePermission as y } from "@burdenoff/fe-libs/shared/providers/shell";
11
11
  import { useSearchParams as oe } from "react-router-dom";
12
12
  import { jsx as b, jsxs as x } from "react/jsx-runtime";
13
- import { useI18n as se } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
14
- import { EmphasisPanel as S, ShowMore as C } from "@burdenoff/fe-libs/ui";
13
+ import { useI18n as S } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
14
+ import { EmphasisPanel as se, IllustratedEmptyState as ce, PagePurpose as le, ShowMore as C } from "@burdenoff/fe-libs/ui";
15
15
  //#region src/export/pages/CreateExportPage.tsx
16
- var w = ["CSV", "JSON"], ce = {
16
+ var w = ["CSV", "JSON"], T = {
17
17
  CSV: h,
18
18
  JSON: m
19
- }, le = [
19
+ }, E = [
20
20
  {
21
21
  value: "INDIVIDUAL",
22
22
  label: "My Data Only",
@@ -36,50 +36,50 @@ var w = ["CSV", "JSON"], ce = {
36
36
  Icon: d
37
37
  }
38
38
  ];
39
- function T() {
40
- let { basePath: d = "/", navigate: m, organizationId: h } = e(), { t: _ } = se(), v = (e, t, n) => ee(_, e, t, n), { createJob: T, isPending: E } = n(), { data: D } = t(), { data: O } = r(), [k] = oe(), ue = y("export:workspace:admin"), de = y("export:org:admin"), [A, j] = c("entities"), [M, N] = c([]), [P, F] = c(""), [I, L] = c("CSV"), [R, z] = c("INDIVIDUAL"), [B, V] = c(k.get("templateId") ?? void 0), [H, fe] = c(""), [U, pe] = c(""), [W, G] = c(null), K = s(null);
41
- ne(() => {
42
- let e = k.get("templateId");
43
- if (!e || !O?.length || K.current === e) return;
44
- let t = O.find((t) => t.id === e);
39
+ function D() {
40
+ let { basePath: d = "/", navigate: m, organizationId: h } = e(), { t: _ } = S(), v = (e, t, n) => ee(_, e, t, n), { createJob: D, isPending: O } = n(), { data: ue } = t(), { data: k } = r(), [A] = oe(), de = y("export:workspace:admin"), fe = y("export:org:admin"), [j, M] = c("entities"), [N, P] = c([]), [F, I] = c(""), [L, R] = c("CSV"), [z, B] = c("INDIVIDUAL"), [V, H] = c(A.get("templateId") ?? void 0), [U, pe] = c(""), [W, me] = c(""), [G, K] = c(null), q = ne(null);
41
+ s(() => {
42
+ let e = A.get("templateId");
43
+ if (!e || !k?.length || q.current === e) return;
44
+ let t = k.find((t) => t.id === e);
45
45
  if (!t) return;
46
- K.current = e, V(t.id), N((t.entityTypes ?? []).filter((e) => !o(e)));
46
+ q.current = e, H(t.id), P((t.entityTypes ?? []).filter((e) => !o(e)));
47
47
  let n = t.format?.toUpperCase();
48
- n && w.includes(n) && L(n), t.name && F(t.name);
49
- }, [k, O]);
50
- let q = () => {
51
- A === "options" ? j("entities") : A === "review" ? j("options") : m?.(d);
52
- }, me = () => {
53
- if (A === "entities") {
54
- if (M.length === 0) {
55
- G(v("export.create.errors.selectEntity", "Please select at least one entity type to export"));
48
+ n && w.includes(n) && R(n), t.name && I(t.name);
49
+ }, [A, k]);
50
+ let he = () => {
51
+ j === "options" ? M("entities") : j === "review" ? M("options") : m?.(d);
52
+ }, ge = () => {
53
+ if (j === "entities") {
54
+ if (N.length === 0) {
55
+ K(v("export.create.errors.selectEntity", "Please select at least one entity type to export"));
56
56
  return;
57
57
  }
58
- G(null), j("options");
59
- } else if (A === "options") {
60
- if (!P.trim()) {
61
- G(v("export.create.errors.exportNameRequired", "Please provide a name for this export"));
58
+ K(null), M("options");
59
+ } else if (j === "options") {
60
+ if (!F.trim()) {
61
+ K(v("export.create.errors.exportNameRequired", "Please provide a name for this export"));
62
62
  return;
63
63
  }
64
- G(null), j("review");
64
+ K(null), M("review");
65
65
  }
66
- }, he = async () => {
66
+ }, _e = async () => {
67
67
  try {
68
- G(null), await T({
69
- name: P,
70
- entityTypes: M,
71
- format: I,
72
- exportScope: R,
73
- organizationId: R === "ORG_ADMIN" ? h : void 0,
74
- templateId: B,
75
- dateRangeStart: H ? new Date(H).toISOString() : null,
76
- dateRangeEnd: U ? new Date(U).toISOString() : null
68
+ K(null), await D({
69
+ name: F,
70
+ entityTypes: N,
71
+ format: L,
72
+ exportScope: z,
73
+ organizationId: z === "ORG_ADMIN" ? h : void 0,
74
+ templateId: V,
75
+ dateRangeStart: U ? new Date(U).toISOString() : null,
76
+ dateRangeEnd: W ? new Date(W).toISOString() : null
77
77
  }), m?.(d);
78
78
  } catch (e) {
79
- G(e instanceof Error ? e.message : v("export.create.errors.createFailed", "Failed to create export"));
79
+ K(e instanceof Error ? e.message : v("export.create.errors.createFailed", "Failed to create export"));
80
80
  }
81
- }, ge = (e) => {
82
- o(e) || N((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]);
81
+ }, ve = (e) => {
82
+ o(e) || P((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]);
83
83
  }, J = (e) => {
84
84
  switch (e) {
85
85
  case "INDIVIDUAL": return v("export.create.scope.individual.label", "My Data Only");
@@ -87,7 +87,7 @@ function T() {
87
87
  case "ORG_ADMIN": return v("export.create.scope.orgAdmin.label", "All Organization Data");
88
88
  default: return e;
89
89
  }
90
- }, _e = (e) => {
90
+ }, ye = (e) => {
91
91
  switch (e) {
92
92
  case "INDIVIDUAL": return v("export.create.scope.individual.description", "Export data you personally created across selected modules.");
93
93
  case "WORKSPACE_ADMIN": return v("export.create.scope.workspaceAdmin.description", "Export all data in this workspace regardless of who created it. Requires workspace admin access.");
@@ -127,11 +127,11 @@ function T() {
127
127
  label: v("export.create.entities.calendar.label", "Calendar Events"),
128
128
  description: v("export.create.entities.calendar.description", "Events and bookings")
129
129
  }
130
- }, X = D.filter((e) => e.enabled !== !1), Z = X.filter((e) => !o(e.entityType)), Q = X.filter((e) => o(e.entityType)), $ = (e, t) => {
131
- let n = !t && M.includes(e.entityType);
130
+ }, X = ue.filter((e) => e.enabled !== !1), Z = X.filter((e) => !o(e.entityType)), Q = X.filter((e) => o(e.entityType)), $ = (e, t) => {
131
+ let n = !t && N.includes(e.entityType);
132
132
  return /* @__PURE__ */ x("button", {
133
133
  type: "button",
134
- onClick: () => ge(e.entityType),
134
+ onClick: () => ve(e.entityType),
135
135
  disabled: t,
136
136
  "aria-disabled": t,
137
137
  title: t ? v("export.create.select.unavailableHint", "Export for this product isn't available yet") : void 0,
@@ -189,6 +189,10 @@ function T() {
189
189
  })]
190
190
  })
191
191
  }),
192
+ /* @__PURE__ */ b(le, {
193
+ icon: /* @__PURE__ */ b(p, { size: 16 }),
194
+ children: v("export.create.purpose", "Build a one-off export in three steps: pick which data to include, choose a format and scope, then review and start it. The export runs in the background and produces a downloadable ZIP you can grab from History when it finishes.")
195
+ }),
192
196
  /* @__PURE__ */ b("div", {
193
197
  className: "flex items-center gap-2 justify-center flex-wrap",
194
198
  children: [
@@ -201,7 +205,7 @@ function T() {
201
205
  size: 18,
202
206
  className: "text-text-secondary"
203
207
  }), /* @__PURE__ */ x("div", {
204
- className: i("flex items-center gap-2 px-4 py-2.5 rounded-lg text-sm font-medium border-2 transition-all duration-200", A === e ? "bg-action-primary-bg text-action-primary-text border-primary shadow-[var(--shadow-pop)]" : "bg-bg-sunken/50 text-text-secondary border-border-seam"),
208
+ className: i("flex items-center gap-2 px-4 py-2.5 rounded-lg text-sm font-medium border-2 transition-all duration-200", j === e ? "bg-action-primary-bg text-action-primary-text border-primary shadow-[var(--shadow-pop)]" : "bg-bg-sunken/50 text-text-secondary border-border-seam"),
205
209
  children: [/* @__PURE__ */ b("div", {
206
210
  className: "flex items-center justify-center size-6 rounded-full bg-bg-surface/20 font-bold",
207
211
  children: t + 1
@@ -212,11 +216,11 @@ function T() {
212
216
  })]
213
217
  }, e))
214
218
  }),
215
- W && /* @__PURE__ */ b("div", {
219
+ G && /* @__PURE__ */ b("div", {
216
220
  className: "border-2 border-border-default rounded-xl bg-status-error-bg-subtle p-4 text-status-error-text text-sm",
217
- children: W
221
+ children: G
218
222
  }),
219
- A === "entities" && /* @__PURE__ */ x("div", {
223
+ j === "entities" && /* @__PURE__ */ x("div", {
220
224
  className: "space-y-4",
221
225
  children: [
222
226
  /* @__PURE__ */ b("h2", {
@@ -227,9 +231,10 @@ function T() {
227
231
  className: "text-sm text-text-secondary",
228
232
  children: v("export.create.select.description", "Choose which entity types to include in your export.")
229
233
  }),
230
- X.length === 0 ? /* @__PURE__ */ b("div", {
231
- className: "border-2 border-border-subtle rounded-xl bg-bg-sunken/30 p-6 text-sm text-text-secondary",
232
- children: v("export.create.select.empty", "No exportable entity types are configured for this workspace yet.")
234
+ X.length === 0 ? /* @__PURE__ */ b(ce, {
235
+ illustration: "empty-data",
236
+ title: v("export.create.select.emptyTitle", "Nothing to export yet"),
237
+ description: v("export.create.select.empty", "No exportable entity types are configured for this workspace yet. Once your workspace has data in supported modules, they'll show up here to select.")
233
238
  }) : /* @__PURE__ */ x("div", {
234
239
  className: "space-y-6",
235
240
  children: [Z.length > 0 && /* @__PURE__ */ b("div", {
@@ -255,7 +260,7 @@ function T() {
255
260
  })
256
261
  ]
257
262
  }),
258
- A === "options" && /* @__PURE__ */ b("div", {
263
+ j === "options" && /* @__PURE__ */ b("div", {
259
264
  className: "space-y-6",
260
265
  children: /* @__PURE__ */ x("div", {
261
266
  className: "border border-border-seam rounded-xl p-6 space-y-5 bg-bg-surface",
@@ -269,13 +274,13 @@ function T() {
269
274
  children: v("export.create.options.scope", "Export Scope")
270
275
  }), /* @__PURE__ */ b("div", {
271
276
  className: "grid grid-cols-1 sm:grid-cols-3 gap-3",
272
- children: le.map(({ value: e, Icon: t }) => {
273
- let n = e === "WORKSPACE_ADMIN" && !ue || e === "ORG_ADMIN" && !de;
277
+ children: E.map(({ value: e, Icon: t }) => {
278
+ let n = e === "WORKSPACE_ADMIN" && !de || e === "ORG_ADMIN" && !fe;
274
279
  return /* @__PURE__ */ x("button", {
275
280
  type: "button",
276
- onClick: () => !n && z(e),
281
+ onClick: () => !n && B(e),
277
282
  disabled: n,
278
- className: i("text-left border-2 rounded-xl p-4 transition-all duration-200", R === e ? "border-primary bg-action-primary-bg/5 shadow-md" : n ? "border-border-subtle/30 opacity-50 cursor-not-allowed" : "border-border-subtle/50 hover:border-primary/30 hover:shadow-sm"),
283
+ className: i("text-left border-2 rounded-xl p-4 transition-all duration-200", z === e ? "border-primary bg-action-primary-bg/5 shadow-md" : n ? "border-border-subtle/30 opacity-50 cursor-not-allowed" : "border-border-subtle/50 hover:border-primary/30 hover:shadow-sm"),
279
284
  title: n ? e === "WORKSPACE_ADMIN" ? "Workspace admin access required" : "Organization admin access required" : void 0,
280
285
  children: [
281
286
  /* @__PURE__ */ x("div", {
@@ -283,9 +288,9 @@ function T() {
283
288
  children: [
284
289
  /* @__PURE__ */ b(t, {
285
290
  size: 18,
286
- className: R === e ? "text-primary" : n ? "text-text-secondary/50" : "text-text-secondary"
291
+ className: z === e ? "text-primary" : n ? "text-text-secondary/50" : "text-text-secondary"
287
292
  }),
288
- R === e && /* @__PURE__ */ b(f, {
293
+ z === e && /* @__PURE__ */ b(f, {
289
294
  size: 16,
290
295
  className: "text-primary"
291
296
  }),
@@ -301,7 +306,7 @@ function T() {
301
306
  }),
302
307
  /* @__PURE__ */ b("p", {
303
308
  className: "text-xs text-text-secondary mt-1",
304
- children: _e(e)
309
+ children: ye(e)
305
310
  })
306
311
  ]
307
312
  }, e);
@@ -322,8 +327,8 @@ function T() {
322
327
  type: "text",
323
328
  id: "exportName",
324
329
  "aria-label": v("export.create.options.name", "Export Name"),
325
- value: P,
326
- onChange: (e) => F(e.target.value),
330
+ value: F,
331
+ onChange: (e) => I(e.target.value),
327
332
  className: "w-full px-4 py-2.5 border-2 border-border-subtle rounded-lg bg-bg-surface focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary transition-all duration-200",
328
333
  placeholder: v("export.create.options.namePlaceholder", "e.g., Monthly User Export")
329
334
  })] }),
@@ -333,14 +338,14 @@ function T() {
333
338
  }), /* @__PURE__ */ b("div", {
334
339
  className: "grid grid-cols-2 gap-3",
335
340
  children: w.map((e) => {
336
- let t = ce[e];
341
+ let t = T[e];
337
342
  return /* @__PURE__ */ x("button", {
338
343
  type: "button",
339
- onClick: () => L(e),
340
- className: i("flex items-center gap-3 border-2 rounded-lg p-3 transition-all duration-200", I === e ? "border-primary bg-action-primary-bg/5" : "border-border-subtle/50 hover:border-primary/30"),
344
+ onClick: () => R(e),
345
+ className: i("flex items-center gap-3 border-2 rounded-lg p-3 transition-all duration-200", L === e ? "border-primary bg-action-primary-bg/5" : "border-border-subtle/50 hover:border-primary/30"),
341
346
  children: [/* @__PURE__ */ b(t, {
342
347
  size: 18,
343
- className: I === e ? "text-primary" : "text-text-secondary"
348
+ className: L === e ? "text-primary" : "text-text-secondary"
344
349
  }), /* @__PURE__ */ b("span", {
345
350
  className: "font-medium text-sm",
346
351
  children: a(e)
@@ -402,8 +407,8 @@ function T() {
402
407
  type: "date",
403
408
  id: "dateFrom",
404
409
  "aria-label": v("export.create.options.dateFrom", "From"),
405
- value: H,
406
- onChange: (e) => fe(e.target.value),
410
+ value: U,
411
+ onChange: (e) => pe(e.target.value),
407
412
  className: "w-full px-3 py-2 border-2 border-border-subtle rounded-lg bg-bg-surface focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary text-sm"
408
413
  })] }), /* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("label", {
409
414
  htmlFor: "dateTo",
@@ -413,9 +418,9 @@ function T() {
413
418
  type: "date",
414
419
  id: "dateTo",
415
420
  "aria-label": v("export.create.options.dateTo", "To"),
416
- value: U,
417
- min: H,
418
- onChange: (e) => pe(e.target.value),
421
+ value: W,
422
+ min: U,
423
+ onChange: (e) => me(e.target.value),
419
424
  className: "w-full px-3 py-2 border-2 border-border-subtle rounded-lg bg-bg-surface focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary text-sm"
420
425
  })] })]
421
426
  }),
@@ -433,14 +438,14 @@ function T() {
433
438
  children: v("export.create.shared.optional", "(optional)")
434
439
  })
435
440
  ]
436
- }), O.length > 0 ? /* @__PURE__ */ x("select", {
437
- value: B ?? "",
438
- onChange: (e) => V(e.target.value || void 0),
441
+ }), k.length > 0 ? /* @__PURE__ */ x("select", {
442
+ value: V ?? "",
443
+ onChange: (e) => H(e.target.value || void 0),
439
444
  className: "w-full px-3 py-2 border-2 border-border-subtle rounded-lg bg-bg-surface focus:outline-none focus:ring-2 focus:ring-primary/20 focus:border-primary",
440
445
  children: [/* @__PURE__ */ b("option", {
441
446
  value: "",
442
447
  children: v("export.create.options.noTemplate", "No template")
443
- }), O.map((e) => /* @__PURE__ */ b("option", {
448
+ }), k.map((e) => /* @__PURE__ */ b("option", {
444
449
  value: e.id,
445
450
  children: e.name
446
451
  }, e.id))]
@@ -464,9 +469,9 @@ function T() {
464
469
  ]
465
470
  })
466
471
  }),
467
- A === "review" && /* @__PURE__ */ b("div", {
472
+ j === "review" && /* @__PURE__ */ b("div", {
468
473
  className: "space-y-6",
469
- children: /* @__PURE__ */ x(S, {
474
+ children: /* @__PURE__ */ x(se, {
470
475
  className: "p-6 space-y-4",
471
476
  children: [/* @__PURE__ */ x("h2", {
472
477
  className: "text-lg font-bold flex items-center gap-2",
@@ -479,31 +484,31 @@ function T() {
479
484
  children: [
480
485
  {
481
486
  label: v("export.create.review.fields.name", "Name"),
482
- value: P
487
+ value: F
483
488
  },
484
489
  {
485
490
  label: v("export.create.review.fields.scope", "Scope"),
486
- value: J(R)
491
+ value: J(z)
487
492
  },
488
493
  {
489
494
  label: v("export.create.review.fields.entityTypes", "Entity Types"),
490
- value: M.join(", ")
495
+ value: N.join(", ")
491
496
  },
492
497
  {
493
498
  label: v("export.create.review.fields.format", "Format"),
494
- value: a(I)
499
+ value: a(L)
495
500
  },
496
501
  {
497
502
  label: v("export.create.review.fields.archive", "Archive"),
498
503
  value: "ZIP"
499
504
  },
500
- ...H || U ? [{
505
+ ...U || W ? [{
501
506
  label: v("export.create.review.fields.dateRange", "Date Range"),
502
- value: [H || "—", U || "—"].join(" → ")
507
+ value: [U || "—", W || "—"].join(" → ")
503
508
  }] : [],
504
- ...B ? [{
509
+ ...V ? [{
505
510
  label: v("export.create.review.fields.template", "Template"),
506
- value: O.find((e) => e.id === B)?.name ?? B
511
+ value: k.find((e) => e.id === V)?.name ?? V
507
512
  }] : []
508
513
  ].map(({ label: e, value: t }) => /* @__PURE__ */ x("div", {
509
514
  className: "flex flex-col sm:flex-row sm:justify-between gap-1",
@@ -522,21 +527,21 @@ function T() {
522
527
  className: "flex flex-col sm:flex-row gap-3 pt-2",
523
528
  children: [/* @__PURE__ */ b("button", {
524
529
  type: "button",
525
- onClick: q,
530
+ onClick: he,
526
531
  className: "px-6 py-3 border-2 border-border-subtle/50 rounded-lg hover:bg-accent hover:border-primary/30 transition-all duration-200 font-medium",
527
- children: A === "entities" ? v("export.create.actions.cancel", "Cancel") : v("export.create.actions.back", "Back")
528
- }), A === "review" ? /* @__PURE__ */ x("button", {
532
+ children: j === "entities" ? v("export.create.actions.cancel", "Cancel") : v("export.create.actions.back", "Back")
533
+ }), j === "review" ? /* @__PURE__ */ x("button", {
529
534
  type: "button",
530
- onClick: he,
531
- disabled: E,
535
+ onClick: _e,
536
+ disabled: O,
532
537
  className: "flex-1 inline-flex items-center justify-center gap-2 px-6 py-3 bg-action-primary-bg text-action-primary-text rounded-lg hover:bg-action-primary-bg/90 transition-all duration-200 font-bold shadow-lg disabled:opacity-50 disabled:cursor-not-allowed",
533
- children: [E ? /* @__PURE__ */ b(g, {
538
+ children: [O ? /* @__PURE__ */ b(g, {
534
539
  size: 18,
535
540
  className: "animate-spin"
536
541
  }) : /* @__PURE__ */ b(p, { size: 18 }), v("export.create.actions.startExport", "Start Export")]
537
542
  }) : /* @__PURE__ */ x("button", {
538
543
  type: "button",
539
- onClick: me,
544
+ onClick: ge,
540
545
  className: "flex-1 inline-flex items-center justify-center gap-2 px-6 py-3 bg-action-primary-bg text-action-primary-text rounded-lg hover:bg-action-primary-bg/90 transition-all duration-200 font-bold shadow-lg",
541
546
  children: [v("export.create.actions.next", "Next"), /* @__PURE__ */ b(u, { size: 18 })]
542
547
  })]
@@ -545,6 +550,6 @@ function T() {
545
550
  });
546
551
  }
547
552
  //#endregion
548
- export { T as CreateExportPage };
553
+ export { D as CreateExportPage };
549
554
 
550
555
  //# sourceMappingURL=CreateExportPage.js.map