@burdenoff/microfe-admin 2026.624.1 → 2026.625.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.
Files changed (47) hide show
  1. package/dist/admin/components/DataTable.js +5 -5
  2. package/dist/admin/components/DataTable.js.map +1 -1
  3. package/dist/admin/components/MetricCard.js +40 -37
  4. package/dist/admin/components/MetricCard.js.map +1 -1
  5. package/dist/admin/components/PageLayout.js +28 -22
  6. package/dist/admin/components/PageLayout.js.map +1 -1
  7. package/dist/admin/components/ui.js +45 -38
  8. package/dist/admin/components/ui.js.map +1 -1
  9. package/dist/admin/pages/AuditLogsPage.js +2 -0
  10. package/dist/admin/pages/AuditLogsPage.js.map +1 -1
  11. package/dist/admin/pages/BillingPage.js +51 -43
  12. package/dist/admin/pages/BillingPage.js.map +1 -1
  13. package/dist/admin/pages/CommunicationsPage.js +3 -0
  14. package/dist/admin/pages/CommunicationsPage.js.map +1 -1
  15. package/dist/admin/pages/ContentPagesPage.js +2 -0
  16. package/dist/admin/pages/ContentPagesPage.js.map +1 -1
  17. package/dist/admin/pages/DashboardPage.js +7 -4
  18. package/dist/admin/pages/DashboardPage.js.map +1 -1
  19. package/dist/admin/pages/FeatureFlagsPage.js +2 -0
  20. package/dist/admin/pages/FeatureFlagsPage.js.map +1 -1
  21. package/dist/admin/pages/OrganizationsListPage.js +2 -0
  22. package/dist/admin/pages/OrganizationsListPage.js.map +1 -1
  23. package/dist/admin/pages/ProductsPage.js +3 -0
  24. package/dist/admin/pages/ProductsPage.js.map +1 -1
  25. package/dist/admin/pages/ReferralsPage.js +4 -0
  26. package/dist/admin/pages/ReferralsPage.js.map +1 -1
  27. package/dist/admin/pages/RolesPermissionsPage.js +3 -0
  28. package/dist/admin/pages/RolesPermissionsPage.js.map +1 -1
  29. package/dist/admin/pages/SREPage.js +4 -0
  30. package/dist/admin/pages/SREPage.js.map +1 -1
  31. package/dist/admin/pages/SandboxSettingsPage.js +1 -0
  32. package/dist/admin/pages/SandboxSettingsPage.js.map +1 -1
  33. package/dist/admin/pages/SettingsPage.js +139 -127
  34. package/dist/admin/pages/SettingsPage.js.map +1 -1
  35. package/dist/admin/pages/SyncFailuresPage.js +3 -0
  36. package/dist/admin/pages/SyncFailuresPage.js.map +1 -1
  37. package/dist/admin/pages/TenantsListPage.js +2 -0
  38. package/dist/admin/pages/TenantsListPage.js.map +1 -1
  39. package/dist/admin/pages/UsersListPage.js +2 -0
  40. package/dist/admin/pages/UsersListPage.js.map +1 -1
  41. package/dist/admin/pages/WaitlistPage.js +2 -0
  42. package/dist/admin/pages/WaitlistPage.js.map +1 -1
  43. package/dist/admin/pages/WorkflowsPage.js +3 -0
  44. package/dist/admin/pages/WorkflowsPage.js.map +1 -1
  45. package/dist/admin/pages/WorkspacesListPage.js +1 -0
  46. package/dist/admin/pages/WorkspacesListPage.js.map +1 -1
  47. package/package.json +2 -2
@@ -6,157 +6,165 @@ import { PermissionGuard as d } from "../components/PermissionGuard.js";
6
6
  import "../components/index.js";
7
7
  import { Bell as f, Database as p, Globe as m, Key as h, Settings as g, Shield as _ } from "lucide-react";
8
8
  import { jsx as v, jsxs as y } from "react/jsx-runtime";
9
- import { useI18n as b } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
9
+ import { EmphasisPanel as b, ShowMore as x } from "@burdenoff/fe-libs/ui";
10
+ import { useI18n as S } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
10
11
  //#region src/admin/pages/SettingsPage.tsx
11
- function x() {
12
- let { canManageSettings: x, isLoading: S } = e(), { t: C } = b(), w = (e, t, n) => u(C, e, t, n), T = [
12
+ function C() {
13
+ let { canManageSettings: C, isLoading: w } = e(), { t: T } = S(), E = (e, t, n) => u(T, e, t, n), D = [
13
14
  {
14
15
  key: "newTenantSignups",
15
- label: w("admin.settings.notifications.items.newTenantSignups.label", "New tenant signups"),
16
- description: w("admin.settings.notifications.items.newTenantSignups.description", "Get notified when new tenants register")
16
+ label: E("admin.settings.notifications.items.newTenantSignups.label", "New tenant signups"),
17
+ description: E("admin.settings.notifications.items.newTenantSignups.description", "Get notified when new tenants register")
17
18
  },
18
19
  {
19
20
  key: "paymentFailures",
20
- label: w("admin.settings.notifications.items.paymentFailures.label", "Payment failures"),
21
- description: w("admin.settings.notifications.items.paymentFailures.description", "Alert when payments fail")
21
+ label: E("admin.settings.notifications.items.paymentFailures.label", "Payment failures"),
22
+ description: E("admin.settings.notifications.items.paymentFailures.description", "Alert when payments fail")
22
23
  },
23
24
  {
24
25
  key: "criticalTickets",
25
- label: w("admin.settings.notifications.items.criticalTickets.label", "Critical tickets"),
26
- description: w("admin.settings.notifications.items.criticalTickets.description", "Notify on critical support tickets")
26
+ label: E("admin.settings.notifications.items.criticalTickets.label", "Critical tickets"),
27
+ description: E("admin.settings.notifications.items.criticalTickets.description", "Notify on critical support tickets")
27
28
  },
28
29
  {
29
30
  key: "systemAlerts",
30
- label: w("admin.settings.notifications.items.systemAlerts.label", "System alerts"),
31
- description: w("admin.settings.notifications.items.systemAlerts.description", "Infrastructure and health alerts")
31
+ label: E("admin.settings.notifications.items.systemAlerts.label", "System alerts"),
32
+ description: E("admin.settings.notifications.items.systemAlerts.description", "Infrastructure and health alerts")
32
33
  }
33
34
  ];
34
35
  return /* @__PURE__ */ v(d, {
35
- allowed: x,
36
- isLoading: S,
37
- pageTitle: w("admin.settings.title", "Settings"),
38
- denyMessage: w("admin.settings.denyMessage", "You don't have permission to manage platform settings."),
36
+ allowed: C,
37
+ isLoading: w,
38
+ pageTitle: E("admin.settings.title", "Settings"),
39
+ denyMessage: E("admin.settings.denyMessage", "You don't have permission to manage platform settings."),
39
40
  children: /* @__PURE__ */ v(l, {
40
- title: w("admin.settings.title", "Settings"),
41
- description: w("admin.settings.description", "Configure platform settings and preferences"),
41
+ title: E("admin.settings.title", "Settings"),
42
+ gradientWord: E("admin.settings.title", "Settings"),
43
+ description: E("admin.settings.description", "Configure platform settings and preferences"),
42
44
  children: /* @__PURE__ */ y("div", {
43
45
  className: "grid gap-6 lg:grid-cols-3",
44
46
  children: [/* @__PURE__ */ y("div", {
45
47
  className: "space-y-6 lg:col-span-2",
46
48
  children: [
47
- /* @__PURE__ */ y(n, { children: [/* @__PURE__ */ y(a, { children: [/* @__PURE__ */ y("div", {
48
- className: "flex items-center gap-2",
49
- children: [/* @__PURE__ */ v(g, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
50
- className: "text-lg",
51
- children: w("admin.settings.general.title", "General")
52
- })]
53
- }), /* @__PURE__ */ v(i, { children: w("admin.settings.general.description", "Basic platform configuration") })] }), /* @__PURE__ */ y(r, {
54
- className: "space-y-4",
55
- children: [
56
- /* @__PURE__ */ y("div", {
57
- className: "grid gap-4 sm:grid-cols-2",
58
- children: [/* @__PURE__ */ y("div", {
59
- className: "space-y-2",
60
- children: [/* @__PURE__ */ v("label", {
61
- className: "text-sm font-medium",
62
- children: w("admin.settings.general.platformName", "Platform Name")
63
- }), /* @__PURE__ */ v(s, { defaultValue: "Burdenoff Admin" })]
64
- }), /* @__PURE__ */ y("div", {
65
- className: "space-y-2",
66
- children: [/* @__PURE__ */ v("label", {
67
- className: "text-sm font-medium",
68
- children: w("admin.settings.general.supportEmail", "Support Email")
69
- }), /* @__PURE__ */ v(s, {
70
- defaultValue: "support@burdenoff.com",
71
- type: "email"
72
- })]
49
+ /* @__PURE__ */ v(b, {
50
+ className: "p-0",
51
+ children: /* @__PURE__ */ y(n, {
52
+ className: "border-0 bg-transparent shadow-none hover:border-0",
53
+ children: [/* @__PURE__ */ y(a, { children: [/* @__PURE__ */ y("div", {
54
+ className: "flex items-center gap-2",
55
+ children: [/* @__PURE__ */ v(g, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
56
+ className: "text-lg",
57
+ children: E("admin.settings.general.title", "General")
73
58
  })]
74
- }),
75
- /* @__PURE__ */ y("div", {
76
- className: "space-y-2",
77
- children: [/* @__PURE__ */ v("label", {
78
- className: "text-sm font-medium",
79
- children: w("admin.settings.general.defaultTimezone", "Default Timezone")
80
- }), /* @__PURE__ */ y("select", {
81
- className: "h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
82
- children: [
83
- /* @__PURE__ */ v("option", {
84
- value: "UTC",
85
- children: "UTC"
86
- }),
87
- /* @__PURE__ */ v("option", {
88
- value: "America/New_York",
89
- children: w("admin.settings.general.timezones.eastern", "Eastern Time (ET)")
90
- }),
91
- /* @__PURE__ */ v("option", {
92
- value: "America/Los_Angeles",
93
- children: w("admin.settings.general.timezones.pacific", "Pacific Time (PT)")
94
- }),
95
- /* @__PURE__ */ v("option", {
96
- value: "Europe/London",
97
- children: w("admin.settings.general.timezones.london", "London (GMT)")
98
- }),
99
- /* @__PURE__ */ v("option", {
100
- value: "Asia/Kolkata",
101
- children: w("admin.settings.general.timezones.india", "India (IST)")
102
- })
103
- ]
104
- })]
105
- }),
106
- /* @__PURE__ */ v("div", {
107
- className: "flex justify-end",
108
- children: /* @__PURE__ */ v(t, { children: w("admin.settings.general.saveChanges", "Save Changes") })
109
- })
110
- ]
111
- })] }),
59
+ }), /* @__PURE__ */ v(i, { children: E("admin.settings.general.description", "Basic platform configuration") })] }), /* @__PURE__ */ y(r, {
60
+ className: "space-y-4",
61
+ children: [
62
+ /* @__PURE__ */ y("div", {
63
+ className: "grid gap-4 sm:grid-cols-2",
64
+ children: [/* @__PURE__ */ y("div", {
65
+ className: "space-y-2",
66
+ children: [/* @__PURE__ */ v("label", {
67
+ className: "text-sm font-medium",
68
+ children: E("admin.settings.general.platformName", "Platform Name")
69
+ }), /* @__PURE__ */ v(s, { defaultValue: "Burdenoff Admin" })]
70
+ }), /* @__PURE__ */ y("div", {
71
+ className: "space-y-2",
72
+ children: [/* @__PURE__ */ v("label", {
73
+ className: "text-sm font-medium",
74
+ children: E("admin.settings.general.supportEmail", "Support Email")
75
+ }), /* @__PURE__ */ v(s, {
76
+ defaultValue: "support@burdenoff.com",
77
+ type: "email"
78
+ })]
79
+ })]
80
+ }),
81
+ /* @__PURE__ */ y("div", {
82
+ className: "space-y-2",
83
+ children: [/* @__PURE__ */ v("label", {
84
+ className: "text-sm font-medium",
85
+ children: E("admin.settings.general.defaultTimezone", "Default Timezone")
86
+ }), /* @__PURE__ */ y("select", {
87
+ className: "h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
88
+ children: [
89
+ /* @__PURE__ */ v("option", {
90
+ value: "UTC",
91
+ children: "UTC"
92
+ }),
93
+ /* @__PURE__ */ v("option", {
94
+ value: "America/New_York",
95
+ children: E("admin.settings.general.timezones.eastern", "Eastern Time (ET)")
96
+ }),
97
+ /* @__PURE__ */ v("option", {
98
+ value: "America/Los_Angeles",
99
+ children: E("admin.settings.general.timezones.pacific", "Pacific Time (PT)")
100
+ }),
101
+ /* @__PURE__ */ v("option", {
102
+ value: "Europe/London",
103
+ children: E("admin.settings.general.timezones.london", "London (GMT)")
104
+ }),
105
+ /* @__PURE__ */ v("option", {
106
+ value: "Asia/Kolkata",
107
+ children: E("admin.settings.general.timezones.india", "India (IST)")
108
+ })
109
+ ]
110
+ })]
111
+ }),
112
+ /* @__PURE__ */ v("div", {
113
+ className: "flex justify-end",
114
+ children: /* @__PURE__ */ v(t, { children: E("admin.settings.general.saveChanges", "Save Changes") })
115
+ })
116
+ ]
117
+ })]
118
+ })
119
+ }),
112
120
  /* @__PURE__ */ y(n, { children: [/* @__PURE__ */ y(a, { children: [/* @__PURE__ */ y("div", {
113
121
  className: "flex items-center gap-2",
114
122
  children: [/* @__PURE__ */ v(_, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
115
123
  className: "text-lg",
116
- children: w("admin.settings.security.title", "Security")
124
+ children: E("admin.settings.security.title", "Security")
117
125
  })]
118
- }), /* @__PURE__ */ v(i, { children: w("admin.settings.security.description", "Security and authentication settings") })] }), /* @__PURE__ */ y(r, {
126
+ }), /* @__PURE__ */ v(i, { children: E("admin.settings.security.description", "Security and authentication settings") })] }), /* @__PURE__ */ y(r, {
119
127
  className: "space-y-4",
120
128
  children: [
121
129
  /* @__PURE__ */ y("div", {
122
130
  className: "flex items-center justify-between rounded-lg border border-border-subtle p-4",
123
131
  children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
124
132
  className: "font-medium",
125
- children: w("admin.settings.security.twoFactor.title", "Two-Factor Authentication")
133
+ children: E("admin.settings.security.twoFactor.title", "Two-Factor Authentication")
126
134
  }), /* @__PURE__ */ v("div", {
127
135
  className: "text-sm text-text-secondary",
128
- children: w("admin.settings.security.twoFactor.description", "Require 2FA for all admin accounts")
136
+ children: E("admin.settings.security.twoFactor.description", "Require 2FA for all admin accounts")
129
137
  })] }), /* @__PURE__ */ v(t, {
130
138
  variant: "outline",
131
- children: w("admin.settings.security.twoFactor.configure", "Configure")
139
+ children: E("admin.settings.security.twoFactor.configure", "Configure")
132
140
  })]
133
141
  }),
134
142
  /* @__PURE__ */ y("div", {
135
143
  className: "flex items-center justify-between rounded-lg border border-border-subtle p-4",
136
144
  children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
137
145
  className: "font-medium",
138
- children: w("admin.settings.security.sessionTimeout.title", "Session Timeout")
146
+ children: E("admin.settings.security.sessionTimeout.title", "Session Timeout")
139
147
  }), /* @__PURE__ */ v("div", {
140
148
  className: "text-sm text-text-secondary",
141
- children: w("admin.settings.security.sessionTimeout.description", "Auto-logout after inactivity")
149
+ children: E("admin.settings.security.sessionTimeout.description", "Auto-logout after inactivity")
142
150
  })] }), /* @__PURE__ */ y("select", {
143
151
  className: "h-9 rounded-md border border-border-default bg-bg-surface px-3 text-sm",
144
152
  children: [
145
153
  /* @__PURE__ */ v("option", {
146
154
  value: "15",
147
- children: w("admin.settings.security.sessionTimeout.options.15m", "15 minutes")
155
+ children: E("admin.settings.security.sessionTimeout.options.15m", "15 minutes")
148
156
  }),
149
157
  /* @__PURE__ */ v("option", {
150
158
  value: "30",
151
- children: w("admin.settings.security.sessionTimeout.options.30m", "30 minutes")
159
+ children: E("admin.settings.security.sessionTimeout.options.30m", "30 minutes")
152
160
  }),
153
161
  /* @__PURE__ */ v("option", {
154
162
  value: "60",
155
- children: w("admin.settings.security.sessionTimeout.options.1h", "1 hour")
163
+ children: E("admin.settings.security.sessionTimeout.options.1h", "1 hour")
156
164
  }),
157
165
  /* @__PURE__ */ v("option", {
158
166
  value: "480",
159
- children: w("admin.settings.security.sessionTimeout.options.8h", "8 hours")
167
+ children: E("admin.settings.security.sessionTimeout.options.8h", "8 hours")
160
168
  })
161
169
  ]
162
170
  })]
@@ -165,13 +173,13 @@ function x() {
165
173
  className: "flex items-center justify-between rounded-lg border border-border-subtle p-4",
166
174
  children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
167
175
  className: "font-medium",
168
- children: w("admin.settings.security.ipAllowlist.title", "IP Allowlist")
176
+ children: E("admin.settings.security.ipAllowlist.title", "IP Allowlist")
169
177
  }), /* @__PURE__ */ v("div", {
170
178
  className: "text-sm text-text-secondary",
171
- children: w("admin.settings.security.ipAllowlist.description", "Restrict access to specific IPs")
179
+ children: E("admin.settings.security.ipAllowlist.description", "Restrict access to specific IPs")
172
180
  })] }), /* @__PURE__ */ v(t, {
173
181
  variant: "outline",
174
- children: w("admin.settings.security.ipAllowlist.manage", "Manage")
182
+ children: E("admin.settings.security.ipAllowlist.manage", "Manage")
175
183
  })]
176
184
  })
177
185
  ]
@@ -180,28 +188,32 @@ function x() {
180
188
  className: "flex items-center gap-2",
181
189
  children: [/* @__PURE__ */ v(f, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
182
190
  className: "text-lg",
183
- children: w("admin.settings.notifications.title", "Notifications")
191
+ children: E("admin.settings.notifications.title", "Notifications")
184
192
  })]
185
- }), /* @__PURE__ */ v(i, { children: w("admin.settings.notifications.description", "Configure notification preferences") })] }), /* @__PURE__ */ v(r, {
186
- className: "space-y-4",
187
- children: T.map((e) => /* @__PURE__ */ y("div", {
188
- className: "flex items-center justify-between rounded-lg border border-border-subtle p-4",
189
- children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
190
- className: "font-medium",
191
- children: e.label
192
- }), /* @__PURE__ */ v("div", {
193
- className: "text-sm text-text-secondary",
194
- children: e.description
195
- })] }), /* @__PURE__ */ y("label", {
196
- className: "relative inline-flex cursor-pointer items-center",
197
- children: [/* @__PURE__ */ v("input", {
198
- type: "checkbox",
199
- defaultChecked: !0,
200
- className: "peer sr-only"
201
- }), /* @__PURE__ */ v("div", { className: "peer h-6 w-11 rounded-full bg-bg-sunken after:absolute after:left-[2px] after:top-0.5 after:h-5 after:w-5 after:rounded-full after:bg-bg-surface after:transition-all peer-checked:bg-action-primary-bg peer-checked:after:translate-x-full peer-focus:ring-2 peer-focus:ring-[var(--color-focus-ring)]" })]
202
- })]
203
- }, e.key))
204
- })] })
193
+ }), /* @__PURE__ */ v(i, { children: E("admin.settings.notifications.description", "Configure notification preferences") })] }), /* @__PURE__ */ v(r, { children: /* @__PURE__ */ v(x, {
194
+ collapsedHeight: 180,
195
+ label: "More notification settings",
196
+ children: /* @__PURE__ */ v("div", {
197
+ className: "space-y-4",
198
+ children: D.map((e) => /* @__PURE__ */ y("div", {
199
+ className: "flex items-center justify-between rounded-lg border border-border-seam p-4",
200
+ children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
201
+ className: "font-medium",
202
+ children: e.label
203
+ }), /* @__PURE__ */ v("div", {
204
+ className: "text-sm text-text-secondary",
205
+ children: e.description
206
+ })] }), /* @__PURE__ */ y("label", {
207
+ className: "relative inline-flex cursor-pointer items-center",
208
+ children: [/* @__PURE__ */ v("input", {
209
+ type: "checkbox",
210
+ defaultChecked: !0,
211
+ className: "peer sr-only"
212
+ }), /* @__PURE__ */ v("div", { className: "peer h-6 w-11 rounded-full bg-bg-sunken after:absolute after:left-[2px] after:top-0.5 after:h-5 after:w-5 after:rounded-full after:bg-bg-surface after:transition-all peer-checked:bg-action-primary-bg peer-checked:after:translate-x-full peer-focus:ring-2 peer-focus:ring-[var(--color-focus-ring)]" })]
213
+ })]
214
+ }, e.key))
215
+ })
216
+ }) })] })
205
217
  ]
206
218
  }), /* @__PURE__ */ y("div", {
207
219
  className: "space-y-6",
@@ -210,41 +222,41 @@ function x() {
210
222
  className: "flex items-center gap-2",
211
223
  children: [/* @__PURE__ */ v(h, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
212
224
  className: "text-lg",
213
- children: w("admin.settings.apiKeys.title", "API Keys")
225
+ children: E("admin.settings.apiKeys.title", "API Keys")
214
226
  })]
215
227
  }) }), /* @__PURE__ */ y(r, {
216
228
  className: "space-y-3",
217
229
  children: [/* @__PURE__ */ v("p", {
218
230
  className: "text-sm text-text-secondary",
219
- children: w("admin.settings.apiKeys.description", "Manage API keys for programmatic access to the admin API.")
231
+ children: E("admin.settings.apiKeys.description", "Manage API keys for programmatic access to the admin API.")
220
232
  }), /* @__PURE__ */ v(t, {
221
233
  variant: "outline",
222
234
  className: "w-full",
223
- children: w("admin.settings.apiKeys.manage", "Manage API Keys")
235
+ children: E("admin.settings.apiKeys.manage", "Manage API Keys")
224
236
  })]
225
237
  })] }),
226
238
  /* @__PURE__ */ y(n, { children: [/* @__PURE__ */ v(a, { children: /* @__PURE__ */ y("div", {
227
239
  className: "flex items-center gap-2",
228
240
  children: [/* @__PURE__ */ v(m, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
229
241
  className: "text-lg",
230
- children: w("admin.settings.integrations.title", "Integrations")
242
+ children: E("admin.settings.integrations.title", "Integrations")
231
243
  })]
232
244
  }) }), /* @__PURE__ */ y(r, {
233
245
  className: "space-y-3",
234
246
  children: [/* @__PURE__ */ v("p", {
235
247
  className: "text-sm text-text-secondary",
236
- children: w("admin.settings.integrations.description", "Connect third-party services and tools.")
248
+ children: E("admin.settings.integrations.description", "Connect third-party services and tools.")
237
249
  }), /* @__PURE__ */ v(t, {
238
250
  variant: "outline",
239
251
  className: "w-full",
240
- children: w("admin.settings.integrations.view", "View Integrations")
252
+ children: E("admin.settings.integrations.view", "View Integrations")
241
253
  })]
242
254
  })] }),
243
255
  /* @__PURE__ */ y(n, { children: [/* @__PURE__ */ v(a, { children: /* @__PURE__ */ y("div", {
244
256
  className: "flex items-center gap-2",
245
257
  children: [/* @__PURE__ */ v(p, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
246
258
  className: "text-lg",
247
- children: w("admin.settings.data.title", "Data")
259
+ children: E("admin.settings.data.title", "Data")
248
260
  })]
249
261
  }) }), /* @__PURE__ */ y(r, {
250
262
  className: "space-y-3",
@@ -252,18 +264,18 @@ function x() {
252
264
  /* @__PURE__ */ v(t, {
253
265
  variant: "outline",
254
266
  className: "w-full justify-start",
255
- children: w("admin.settings.data.export", "Export Data")
267
+ children: E("admin.settings.data.export", "Export Data")
256
268
  }),
257
269
  /* @__PURE__ */ v(t, {
258
270
  variant: "outline",
259
271
  className: "w-full justify-start",
260
- children: w("admin.settings.data.auditLogs", "Audit Logs")
272
+ children: E("admin.settings.data.auditLogs", "Audit Logs")
261
273
  }),
262
274
  /* @__PURE__ */ v(c, {}),
263
275
  /* @__PURE__ */ v(t, {
264
276
  variant: "outline",
265
277
  className: "w-full justify-start text-status-error-text",
266
- children: w("admin.settings.data.dangerZone", "Danger Zone")
278
+ children: E("admin.settings.data.dangerZone", "Danger Zone")
267
279
  })
268
280
  ]
269
281
  })] })
@@ -274,6 +286,6 @@ function x() {
274
286
  });
275
287
  }
276
288
  //#endregion
277
- export { x as SettingsPage };
289
+ export { C as SettingsPage };
278
290
 
279
291
  //# sourceMappingURL=SettingsPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../src/admin/pages/SettingsPage.tsx"],"sourcesContent":["import { Settings, Shield, Key, Bell, Globe, Database } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n PageLayout,\n Card,\n CardHeader,\n CardTitle,\n CardContent,\n CardDescription,\n Button,\n Input,\n Separator,\n PermissionGuard,\n} from '../components';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport { tWithFallback } from '../utils/i18n';\n\n/**\n * Settings page\n */\nexport function SettingsPage() {\n const { canManageSettings, isLoading: permissionsLoading } = useAdminPermissions();\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n\n const notificationSettings = [\n {\n key: 'newTenantSignups',\n label: tr('admin.settings.notifications.items.newTenantSignups.label', 'New tenant signups'),\n description: tr(\n 'admin.settings.notifications.items.newTenantSignups.description',\n 'Get notified when new tenants register'\n ),\n },\n {\n key: 'paymentFailures',\n label: tr('admin.settings.notifications.items.paymentFailures.label', 'Payment failures'),\n description: tr(\n 'admin.settings.notifications.items.paymentFailures.description',\n 'Alert when payments fail'\n ),\n },\n {\n key: 'criticalTickets',\n label: tr('admin.settings.notifications.items.criticalTickets.label', 'Critical tickets'),\n description: tr(\n 'admin.settings.notifications.items.criticalTickets.description',\n 'Notify on critical support tickets'\n ),\n },\n {\n key: 'systemAlerts',\n label: tr('admin.settings.notifications.items.systemAlerts.label', 'System alerts'),\n description: tr(\n 'admin.settings.notifications.items.systemAlerts.description',\n 'Infrastructure and health alerts'\n ),\n },\n ];\n\n return (\n <PermissionGuard\n allowed={canManageSettings}\n isLoading={permissionsLoading}\n pageTitle={tr('admin.settings.title', 'Settings')}\n denyMessage={tr(\n 'admin.settings.denyMessage',\n \"You don't have permission to manage platform settings.\"\n )}\n >\n <PageLayout\n title={tr('admin.settings.title', 'Settings')}\n description={tr(\n 'admin.settings.description',\n 'Configure platform settings and preferences'\n )}\n >\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Main settings */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* General */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Settings className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.general.title', 'General')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr('admin.settings.general.description', 'Basic platform configuration')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.platformName', 'Platform Name')}\n </label>\n <Input defaultValue=\"Burdenoff Admin\" />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.supportEmail', 'Support Email')}\n </label>\n <Input defaultValue=\"support@burdenoff.com\" type=\"email\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.defaultTimezone', 'Default Timezone')}\n </label>\n <select className=\"h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\">\n <option value=\"UTC\">UTC</option>\n <option value=\"America/New_York\">\n {tr('admin.settings.general.timezones.eastern', 'Eastern Time (ET)')}\n </option>\n <option value=\"America/Los_Angeles\">\n {tr('admin.settings.general.timezones.pacific', 'Pacific Time (PT)')}\n </option>\n <option value=\"Europe/London\">\n {tr('admin.settings.general.timezones.london', 'London (GMT)')}\n </option>\n <option value=\"Asia/Kolkata\">\n {tr('admin.settings.general.timezones.india', 'India (IST)')}\n </option>\n </select>\n </div>\n <div className=\"flex justify-end\">\n <Button>{tr('admin.settings.general.saveChanges', 'Save Changes')}</Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Security */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.security.title', 'Security')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.security.description',\n 'Security and authentication settings'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.twoFactor.title', 'Two-Factor Authentication')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.twoFactor.description',\n 'Require 2FA for all admin accounts'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.twoFactor.configure', 'Configure')}\n </Button>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.sessionTimeout.title', 'Session Timeout')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.sessionTimeout.description',\n 'Auto-logout after inactivity'\n )}\n </div>\n </div>\n <select className=\"h-9 rounded-md border border-border-default bg-bg-surface px-3 text-sm\">\n <option value=\"15\">\n {tr('admin.settings.security.sessionTimeout.options.15m', '15 minutes')}\n </option>\n <option value=\"30\">\n {tr('admin.settings.security.sessionTimeout.options.30m', '30 minutes')}\n </option>\n <option value=\"60\">\n {tr('admin.settings.security.sessionTimeout.options.1h', '1 hour')}\n </option>\n <option value=\"480\">\n {tr('admin.settings.security.sessionTimeout.options.8h', '8 hours')}\n </option>\n </select>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.ipAllowlist.title', 'IP Allowlist')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.ipAllowlist.description',\n 'Restrict access to specific IPs'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.ipAllowlist.manage', 'Manage')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Notifications */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Bell className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.notifications.title', 'Notifications')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.notifications.description',\n 'Configure notification preferences'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {notificationSettings.map((item) => (\n <div\n key={item.key}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\"\n >\n <div>\n <div className=\"font-medium\">{item.label}</div>\n <div className=\"text-sm text-text-secondary\">{item.description}</div>\n </div>\n <label className=\"relative inline-flex cursor-pointer items-center\">\n <input type=\"checkbox\" defaultChecked className=\"peer sr-only\" />\n <div className=\"peer h-6 w-11 rounded-full bg-bg-sunken after:absolute after:left-[2px] after:top-0.5 after:h-5 after:w-5 after:rounded-full after:bg-bg-surface after:transition-all peer-checked:bg-action-primary-bg peer-checked:after:translate-x-full peer-focus:ring-2 peer-focus:ring-[var(--color-focus-ring)]\" />\n </label>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* API Keys */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Key className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.apiKeys.title', 'API Keys')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.apiKeys.description',\n 'Manage API keys for programmatic access to the admin API.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.apiKeys.manage', 'Manage API Keys')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Integrations */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Globe className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.integrations.title', 'Integrations')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.integrations.description',\n 'Connect third-party services and tools.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.integrations.view', 'View Integrations')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Data Management */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Database className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.data.title', 'Data')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.export', 'Export Data')}\n </Button>\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.auditLogs', 'Audit Logs')}\n </Button>\n <Separator />\n <Button variant=\"outline\" className=\"w-full justify-start text-status-error-text\">\n {tr('admin.settings.data.dangerZone', 'Danger Zone')}\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../src/admin/pages/SettingsPage.tsx"],"sourcesContent":["import { Settings, Shield, Key, Bell, Globe, Database } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { EmphasisPanel, ShowMore } from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n Card,\n CardHeader,\n CardTitle,\n CardContent,\n CardDescription,\n Button,\n Input,\n Separator,\n PermissionGuard,\n} from '../components';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport { tWithFallback } from '../utils/i18n';\n\n/**\n * Settings page\n */\nexport function SettingsPage() {\n const { canManageSettings, isLoading: permissionsLoading } = useAdminPermissions();\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n\n const notificationSettings = [\n {\n key: 'newTenantSignups',\n label: tr('admin.settings.notifications.items.newTenantSignups.label', 'New tenant signups'),\n description: tr(\n 'admin.settings.notifications.items.newTenantSignups.description',\n 'Get notified when new tenants register'\n ),\n },\n {\n key: 'paymentFailures',\n label: tr('admin.settings.notifications.items.paymentFailures.label', 'Payment failures'),\n description: tr(\n 'admin.settings.notifications.items.paymentFailures.description',\n 'Alert when payments fail'\n ),\n },\n {\n key: 'criticalTickets',\n label: tr('admin.settings.notifications.items.criticalTickets.label', 'Critical tickets'),\n description: tr(\n 'admin.settings.notifications.items.criticalTickets.description',\n 'Notify on critical support tickets'\n ),\n },\n {\n key: 'systemAlerts',\n label: tr('admin.settings.notifications.items.systemAlerts.label', 'System alerts'),\n description: tr(\n 'admin.settings.notifications.items.systemAlerts.description',\n 'Infrastructure and health alerts'\n ),\n },\n ];\n\n return (\n <PermissionGuard\n allowed={canManageSettings}\n isLoading={permissionsLoading}\n pageTitle={tr('admin.settings.title', 'Settings')}\n denyMessage={tr(\n 'admin.settings.denyMessage',\n \"You don't have permission to manage platform settings.\"\n )}\n >\n <PageLayout\n title={tr('admin.settings.title', 'Settings')}\n gradientWord={tr('admin.settings.title', 'Settings')}\n description={tr(\n 'admin.settings.description',\n 'Configure platform settings and preferences'\n )}\n >\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Main settings */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* General — primary settings zone (emphasis) */}\n <EmphasisPanel className=\"p-0\">\n <Card className=\"border-0 bg-transparent shadow-none hover:border-0\">\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Settings className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.general.title', 'General')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr('admin.settings.general.description', 'Basic platform configuration')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.platformName', 'Platform Name')}\n </label>\n <Input defaultValue=\"Burdenoff Admin\" />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.supportEmail', 'Support Email')}\n </label>\n <Input defaultValue=\"support@burdenoff.com\" type=\"email\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.defaultTimezone', 'Default Timezone')}\n </label>\n <select className=\"h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\">\n <option value=\"UTC\">UTC</option>\n <option value=\"America/New_York\">\n {tr('admin.settings.general.timezones.eastern', 'Eastern Time (ET)')}\n </option>\n <option value=\"America/Los_Angeles\">\n {tr('admin.settings.general.timezones.pacific', 'Pacific Time (PT)')}\n </option>\n <option value=\"Europe/London\">\n {tr('admin.settings.general.timezones.london', 'London (GMT)')}\n </option>\n <option value=\"Asia/Kolkata\">\n {tr('admin.settings.general.timezones.india', 'India (IST)')}\n </option>\n </select>\n </div>\n <div className=\"flex justify-end\">\n <Button>{tr('admin.settings.general.saveChanges', 'Save Changes')}</Button>\n </div>\n </CardContent>\n </Card>\n </EmphasisPanel>\n\n {/* Security */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.security.title', 'Security')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.security.description',\n 'Security and authentication settings'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.twoFactor.title', 'Two-Factor Authentication')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.twoFactor.description',\n 'Require 2FA for all admin accounts'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.twoFactor.configure', 'Configure')}\n </Button>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.sessionTimeout.title', 'Session Timeout')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.sessionTimeout.description',\n 'Auto-logout after inactivity'\n )}\n </div>\n </div>\n <select className=\"h-9 rounded-md border border-border-default bg-bg-surface px-3 text-sm\">\n <option value=\"15\">\n {tr('admin.settings.security.sessionTimeout.options.15m', '15 minutes')}\n </option>\n <option value=\"30\">\n {tr('admin.settings.security.sessionTimeout.options.30m', '30 minutes')}\n </option>\n <option value=\"60\">\n {tr('admin.settings.security.sessionTimeout.options.1h', '1 hour')}\n </option>\n <option value=\"480\">\n {tr('admin.settings.security.sessionTimeout.options.8h', '8 hours')}\n </option>\n </select>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.ipAllowlist.title', 'IP Allowlist')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.ipAllowlist.description',\n 'Restrict access to specific IPs'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.ipAllowlist.manage', 'Manage')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Notifications */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Bell className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.notifications.title', 'Notifications')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.notifications.description',\n 'Configure notification preferences'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <ShowMore collapsedHeight={180} label=\"More notification settings\">\n <div className=\"space-y-4\">\n {notificationSettings.map((item) => (\n <div\n key={item.key}\n className=\"flex items-center justify-between rounded-lg border border-border-seam p-4\"\n >\n <div>\n <div className=\"font-medium\">{item.label}</div>\n <div className=\"text-sm text-text-secondary\">{item.description}</div>\n </div>\n <label className=\"relative inline-flex cursor-pointer items-center\">\n <input type=\"checkbox\" defaultChecked className=\"peer sr-only\" />\n <div className=\"peer h-6 w-11 rounded-full bg-bg-sunken after:absolute after:left-[2px] after:top-0.5 after:h-5 after:w-5 after:rounded-full after:bg-bg-surface after:transition-all peer-checked:bg-action-primary-bg peer-checked:after:translate-x-full peer-focus:ring-2 peer-focus:ring-[var(--color-focus-ring)]\" />\n </label>\n </div>\n ))}\n </div>\n </ShowMore>\n </CardContent>\n </Card>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* API Keys */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Key className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.apiKeys.title', 'API Keys')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.apiKeys.description',\n 'Manage API keys for programmatic access to the admin API.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.apiKeys.manage', 'Manage API Keys')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Integrations */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Globe className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.integrations.title', 'Integrations')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.integrations.description',\n 'Connect third-party services and tools.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.integrations.view', 'View Integrations')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Data Management */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Database className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.data.title', 'Data')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.export', 'Export Data')}\n </Button>\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.auditLogs', 'Audit Logs')}\n </Button>\n <Separator />\n <Button variant=\"outline\" className=\"w-full justify-start text-status-error-text\">\n {tr('admin.settings.data.dangerZone', 'Danger Zone')}\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n"],"mappings":"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"}
@@ -162,6 +162,7 @@ function N() {
162
162
  denyMessage: "Only super-admins can view cross-layer sync failures.",
163
163
  children: /* @__PURE__ */ E(s, {
164
164
  title: "Sync Failures",
165
+ gradientWord: "Failures",
165
166
  description: "Cross-layer sync operations (global → workspace) that did not complete. Automatic retries run in the background; use the manual retry once the underlying issue is fixed.",
166
167
  actions: /* @__PURE__ */ E(r, {
167
168
  variant: "outline",
@@ -175,6 +176,7 @@ function N() {
175
176
  /* @__PURE__ */ E(d, { children: [
176
177
  /* @__PURE__ */ T(u, {
177
178
  title: "Pending",
179
+ hero: !0,
178
180
  value: $?.pending ?? 0,
179
181
  icon: /* @__PURE__ */ T(re, { className: "h-5 w-5" }),
180
182
  subtitle: "Waiting for first retry",
@@ -231,6 +233,7 @@ function N() {
231
233
  loading: U,
232
234
  onRowClick: (e) => z((t) => t === e.id ? null : e.id),
233
235
  emptyState: /* @__PURE__ */ T(o, {
236
+ illustration: "empty-data",
234
237
  icon: /* @__PURE__ */ T(x, { className: "h-8 w-8" }),
235
238
  title: "No sync failures",
236
239
  description: P === "PERMANENTLY_FAILED" ? "Nothing has exhausted automatic retries." : "No outbox entries match the current filter."