@burdenoff/microfe-workspaces 2026.624.2 → 2026.625.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 (45) hide show
  1. package/dist/WorkspacesRoutes.js +64 -63
  2. package/dist/WorkspacesRoutes.js.map +1 -1
  3. package/dist/components/CreateWorkspaceDialog.js.map +1 -1
  4. package/dist/components/MemberListItem.js +7 -6
  5. package/dist/components/MemberListItem.js.map +1 -1
  6. package/dist/components/ProjectCard.js +13 -12
  7. package/dist/components/ProjectCard.js.map +1 -1
  8. package/dist/components/WorkspaceCard.js +8 -7
  9. package/dist/components/WorkspaceCard.js.map +1 -1
  10. package/dist/components/WorkspaceContextPathSync.js +34 -0
  11. package/dist/components/WorkspaceContextPathSync.js.map +1 -0
  12. package/dist/pages/ActivityListPage.js +67 -55
  13. package/dist/pages/ActivityListPage.js.map +1 -1
  14. package/dist/pages/CreateWorkspacePage.js +5 -4
  15. package/dist/pages/CreateWorkspacePage.js.map +1 -1
  16. package/dist/pages/InviteAcceptancePage.js +45 -36
  17. package/dist/pages/InviteAcceptancePage.js.map +1 -1
  18. package/dist/pages/MembersListPage.js +2 -2
  19. package/dist/pages/MembersListPage.js.map +1 -1
  20. package/dist/pages/PendingInvitesPage.js +68 -67
  21. package/dist/pages/PendingInvitesPage.js.map +1 -1
  22. package/dist/pages/ProjectDetailPage.js +333 -302
  23. package/dist/pages/ProjectDetailPage.js.map +1 -1
  24. package/dist/pages/ProjectMembersPage.js +4 -4
  25. package/dist/pages/ProjectMembersPage.js.map +1 -1
  26. package/dist/pages/ProjectsListPage.js +234 -226
  27. package/dist/pages/ProjectsListPage.js.map +1 -1
  28. package/dist/pages/WorkspaceDetailPage.js +196 -178
  29. package/dist/pages/WorkspaceDetailPage.js.map +1 -1
  30. package/dist/pages/WorkspaceInvitePage.js +372 -353
  31. package/dist/pages/WorkspaceInvitePage.js.map +1 -1
  32. package/dist/pages/WorkspaceSettingsPage.js +98 -90
  33. package/dist/pages/WorkspaceSettingsPage.js.map +1 -1
  34. package/dist/pages/WorkspacesListPage.js +132 -121
  35. package/dist/pages/WorkspacesListPage.js.map +1 -1
  36. package/dist/pages/dashboard/WidgetWrapper.js +7 -6
  37. package/dist/pages/dashboard/WidgetWrapper.js.map +1 -1
  38. package/dist/pages/dashboard/widgets/GroupsWidget.js.map +1 -1
  39. package/dist/pages/dashboard/widgets/MembersWidget.js +1 -1
  40. package/dist/pages/dashboard/widgets/MembersWidget.js.map +1 -1
  41. package/dist/pages/dashboard/widgets/WelcomeWidget.js +45 -37
  42. package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -1
  43. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js +2 -2
  44. package/dist/pages/dashboard/widgets/WorkflowStatsWidget.js.map +1 -1
  45. package/package.json +2 -2
@@ -14,7 +14,7 @@ import { useMemo as s, useRef as ue, useState as c } from "react";
14
14
  import { AlertCircle as l, ArrowLeft as de, CheckCircle2 as u, Download as fe, Loader2 as d, Mail as pe, RefreshCw as me, Send as he, Upload as ge, UserPlus as _e, XCircle as f } from "lucide-react";
15
15
  import { PermissionProvider as ve } from "@burdenoff/fe-libs/shared/providers/shell";
16
16
  import { Fragment as ye, jsx as p, jsxs as m } from "react/jsx-runtime";
17
- import { AlertDialog as be, AlertDialogAction as xe, AlertDialogCancel as Se, AlertDialogContent as Ce, AlertDialogDescription as we, AlertDialogFooter as Te, AlertDialogHeader as Ee, AlertDialogTitle as De, Badge as h, Button as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b, Checkbox as x, Input as Oe, ResponsiveTable as ke, Skeleton as S, Tabs as Ae, TabsContent as je, TabsList as Me, TabsTrigger as Ne, Tooltip as C, TooltipContent as w, TooltipProvider as Pe, TooltipTrigger as T } from "@burdenoff/fe-libs/ui";
17
+ import { AlertDialog as be, AlertDialogAction as xe, AlertDialogCancel as Se, AlertDialogContent as Ce, AlertDialogDescription as we, AlertDialogFooter as Te, AlertDialogHeader as Ee, AlertDialogTitle as De, Badge as h, Button as g, CardContent as _, CardHeader as v, CardTitle as y, Checkbox as b, GlassCard as x, Input as Oe, ResponsiveTable as ke, Skeleton as S, Tabs as Ae, TabsContent as je, TabsList as Me, TabsTrigger as Ne, Tooltip as C, TooltipContent as w, TooltipProvider as Pe, TooltipTrigger as T } from "@burdenoff/fe-libs/ui";
18
18
  import { useNavigate as Fe, useParams as Ie } from "react-router-dom";
19
19
  import { useI18n as Le } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
20
20
  //#region src/pages/WorkspaceInvitePage.tsx
@@ -137,7 +137,7 @@ function We({ selectedRoleIds: e, onRoleToggle: t, selectedProjectIds: n, onProj
137
137
  children: [/* @__PURE__ */ p("span", {
138
138
  className: "min-w-0 flex-1 truncate",
139
139
  children: n.name
140
- }), /* @__PURE__ */ p(x, {
140
+ }), /* @__PURE__ */ p(b, {
141
141
  checked: r,
142
142
  disabled: o,
143
143
  onCheckedChange: (e) => t(n.id, !!e),
@@ -207,7 +207,7 @@ function We({ selectedRoleIds: e, onRoleToggle: t, selectedProjectIds: n, onProj
207
207
  children: e.status
208
208
  })]
209
209
  })]
210
- }), /* @__PURE__ */ p(x, {
210
+ }), /* @__PURE__ */ p(b, {
211
211
  checked: t,
212
212
  disabled: o,
213
213
  onCheckedChange: (t) => r(e.id, !!t),
@@ -220,7 +220,7 @@ function We({ selectedRoleIds: e, onRoleToggle: t, selectedProjectIds: n, onProj
220
220
  });
221
221
  }
222
222
  function O() {
223
- let { workspaceId: ve } = Ie(), { t: x } = Le(), C = Fe(), { basePath: w = "/workspaces", workspaceId: Pe } = e(), { withCurrentSearch: T } = n(), O = ve || Pe || "";
223
+ let { workspaceId: ve } = Ie(), { t: b } = Le(), C = Fe(), { basePath: w = "/workspaces", workspaceId: Pe } = e(), { withCurrentSearch: T } = n(), O = ve || Pe || "";
224
224
  i("workspaces.invite", { workspaceId: O || void 0 });
225
225
  let { canInviteMember: Ge, isLoading: Ke } = ae(), { data: qe, isLoading: Je, error: Ye } = t(O), { data: k = [], isLoading: Xe } = oe(O), { data: A, isLoading: Ze } = se({ archived: !1 }, { limit: 100 }, O), { data: Qe, isLoading: $e, isFetching: j, error: et, refetch: tt } = a(O, "PENDING", { limit: 50 }, { retry: !1 }), M = s(() => (A?.items ?? []).filter((e) => !e.archived), [A?.items]), [nt, rt] = c("single"), [N, it] = c(""), [P, at] = c([]), [F, ot] = c([]), [st, I] = c(null), [ct, lt] = c(null), [ut, L] = c(null), [dt, R] = c(null), [z, B] = c(null), [V, H] = c([]), [ft, pt] = c(null), [mt, U] = c(!1), [W, ht] = c(!1), gt = ue(null), [G, K] = c(null), { mutateAsync: _t, isPending: q } = o(O), { mutateAsync: vt, isPending: yt } = ee(), { mutate: bt, isPending: J } = ne(O), { mutate: xt, isPending: Y } = te(O), [St, X] = c(null), Z = Qe?.items ?? [], Ct = q || yt || W, wt = s(() => k.filter((e) => P.includes(e.id)).map((e) => e.name), [k, P]), Tt = s(() => M.filter((e) => F.includes(e.id)).map((e) => e.name), [M, F]), Q = s(() => V.filter((e) => e.errors.length === 0 && e.status.kind !== "invited"), [V]), $ = s(() => V.filter((e) => e.errors.length > 0), [V]);
226
226
  if (!O) return /* @__PURE__ */ p("div", {
@@ -230,18 +230,18 @@ function O() {
230
230
  children: [
231
231
  /* @__PURE__ */ p("h1", {
232
232
  className: "text-2xl font-bold",
233
- children: r(x, "workspaceInvite.noWorkspaceTitle", "Select a workspace first")
233
+ children: r(b, "workspaceInvite.noWorkspaceTitle", "Select a workspace first")
234
234
  }),
235
235
  /* @__PURE__ */ p("p", {
236
236
  className: "mt-2 text-text-secondary",
237
- children: r(x, "workspaceInvite.noWorkspaceDescription", "Choose a current workspace from the header or open a workspace detail page before inviting members.")
237
+ children: r(b, "workspaceInvite.noWorkspaceDescription", "Choose a current workspace from the header or open a workspace detail page before inviting members.")
238
238
  }),
239
239
  /* @__PURE__ */ p("div", {
240
240
  className: "mt-4",
241
241
  children: /* @__PURE__ */ p(g, {
242
242
  onClick: () => C(T(`${w}/list`)),
243
243
  variant: "outline",
244
- children: r(x, "workspaceInvite.backToWorkspaces", "Back to Workspaces")
244
+ children: r(b, "workspaceInvite.backToWorkspaces", "Back to Workspaces")
245
245
  })
246
246
  })
247
247
  ]
@@ -261,10 +261,10 @@ function O() {
261
261
  className: "space-y-2 text-center",
262
262
  children: [/* @__PURE__ */ p("h2", {
263
263
  className: "text-lg font-semibold",
264
- children: r(x, "workspaceInvite.accessDenied", "Access Denied")
264
+ children: r(b, "workspaceInvite.accessDenied", "Access Denied")
265
265
  }), /* @__PURE__ */ p("p", {
266
266
  className: "text-sm text-text-secondary",
267
- children: r(x, "workspaceInvite.accessDeniedDescription", "You don't have permission to invite members into this workspace.")
267
+ children: r(b, "workspaceInvite.accessDeniedDescription", "You don't have permission to invite members into this workspace.")
268
268
  })]
269
269
  })
270
270
  });
@@ -274,10 +274,10 @@ function O() {
274
274
  variant: "ghost",
275
275
  onClick: () => C(T(`${w}/list`)),
276
276
  className: "gap-2",
277
- children: [/* @__PURE__ */ p(de, { size: 18 }), r(x, "workspaceInvite.backToWorkspaces", "Back to Workspaces")]
277
+ children: [/* @__PURE__ */ p(de, { size: 18 }), r(b, "workspaceInvite.backToWorkspaces", "Back to Workspaces")]
278
278
  }), /* @__PURE__ */ p("div", {
279
279
  className: "rounded-xl border bg-bg-surface p-8 text-center text-status-error-text",
280
- children: r(x, "workspaceInvite.workspaceLoadError", "Unable to load workspace invite details.")
280
+ children: r(b, "workspaceInvite.workspaceLoadError", "Unable to load workspace invite details.")
281
281
  })]
282
282
  });
283
283
  let Et = (e, t) => {
@@ -391,7 +391,7 @@ function O() {
391
391
  variant: "ghost",
392
392
  onClick: () => C(T(`${w}/${O}`)),
393
393
  className: "-ml-2 mb-2 gap-2",
394
- children: [/* @__PURE__ */ p(de, { size: 18 }), r(x, "workspaceInvite.backToWorkspace", "Back to Workspace")]
394
+ children: [/* @__PURE__ */ p(de, { size: 18 }), r(b, "workspaceInvite.backToWorkspace", "Back to Workspace")]
395
395
  }),
396
396
  /* @__PURE__ */ m("div", {
397
397
  className: "flex items-center gap-2",
@@ -400,7 +400,7 @@ function O() {
400
400
  size: 24
401
401
  }), /* @__PURE__ */ p("h1", {
402
402
  className: "text-2xl font-bold sm:text-3xl",
403
- children: r(x, "workspaceInvite.title", "Invite Members")
403
+ children: r(b, "workspaceInvite.title", "Invite Members")
404
404
  })]
405
405
  }),
406
406
  /* @__PURE__ */ m("p", {
@@ -409,294 +409,293 @@ function O() {
409
409
  qe.name,
410
410
  " —",
411
411
  " ",
412
- r(x, "workspaceInvite.subtitle", "Invite people into this workspace and optionally grant project access.")
412
+ r(b, "workspaceInvite.subtitle", "Invite people into this workspace and optionally grant project access.")
413
413
  ]
414
414
  })
415
415
  ] })
416
416
  }),
417
- /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, { children: r(x, "workspaceInvite.setupTitle", "Access to grant on acceptance") }) }), /* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(We, {
418
- selectedRoleIds: P,
419
- onRoleToggle: Et,
420
- selectedProjectIds: F,
421
- onProjectToggle: Dt,
422
- availableRoles: k,
423
- availableProjects: M,
424
- isLoadingRoles: Xe,
425
- isLoadingProjects: Ze,
426
- disabled: Ct
427
- }) })] }),
428
- /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, { children: "Selection summary" }) }), /* @__PURE__ */ m(v, {
429
- className: "grid gap-4 md:grid-cols-2",
430
- children: [/* @__PURE__ */ m("div", {
431
- className: "space-y-2 rounded-lg border p-4",
417
+ /* @__PURE__ */ m(x, {
418
+ treatment: "plain",
419
+ className: "border-border-seam",
420
+ children: [/* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(y, { children: r(b, "workspaceInvite.setupTitle", "Access to grant on acceptance") }) }), /* @__PURE__ */ p(_, { children: /* @__PURE__ */ p(We, {
421
+ selectedRoleIds: P,
422
+ onRoleToggle: Et,
423
+ selectedProjectIds: F,
424
+ onProjectToggle: Dt,
425
+ availableRoles: k,
426
+ availableProjects: M,
427
+ isLoadingRoles: Xe,
428
+ isLoadingProjects: Ze,
429
+ disabled: Ct
430
+ }) })]
431
+ }),
432
+ /* @__PURE__ */ m(x, {
433
+ treatment: "metric",
434
+ className: "border-border-seam",
435
+ children: [/* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(y, { children: "Selection summary" }) }), /* @__PURE__ */ m(_, {
436
+ className: "grid gap-4 md:grid-cols-2",
432
437
  children: [/* @__PURE__ */ m("div", {
433
- className: "flex items-center justify-between gap-2",
434
- children: [/* @__PURE__ */ p("p", {
435
- className: "text-sm font-medium",
436
- children: "Roles"
437
- }), /* @__PURE__ */ p(h, {
438
- variant: "secondary",
439
- children: wt.length
438
+ className: "space-y-2 rounded-lg border border-border-seam bg-bg-surface p-4",
439
+ children: [/* @__PURE__ */ m("div", {
440
+ className: "flex items-center justify-between gap-2",
441
+ children: [/* @__PURE__ */ p("p", {
442
+ className: "text-sm font-medium",
443
+ children: "Roles"
444
+ }), /* @__PURE__ */ p(h, {
445
+ variant: "secondary",
446
+ className: "tabular-nums",
447
+ children: wt.length
448
+ })]
449
+ }), /* @__PURE__ */ p("p", {
450
+ className: "text-sm text-text-muted",
451
+ children: He(wt, "No roles selected")
440
452
  })]
441
- }), /* @__PURE__ */ p("p", {
442
- className: "text-sm text-text-secondary",
443
- children: He(wt, "No roles selected")
444
- })]
445
- }), /* @__PURE__ */ m("div", {
446
- className: "space-y-2 rounded-lg border p-4",
447
- children: [/* @__PURE__ */ m("div", {
448
- className: "flex items-center justify-between gap-2",
449
- children: [/* @__PURE__ */ p("p", {
450
- className: "text-sm font-medium",
451
- children: "Projects"
452
- }), /* @__PURE__ */ p(h, {
453
- variant: "secondary",
454
- children: Tt.length
453
+ }), /* @__PURE__ */ m("div", {
454
+ className: "space-y-2 rounded-lg border border-border-seam bg-bg-surface p-4",
455
+ children: [/* @__PURE__ */ m("div", {
456
+ className: "flex items-center justify-between gap-2",
457
+ children: [/* @__PURE__ */ p("p", {
458
+ className: "text-sm font-medium",
459
+ children: "Projects"
460
+ }), /* @__PURE__ */ p(h, {
461
+ variant: "secondary",
462
+ className: "tabular-nums",
463
+ children: Tt.length
464
+ })]
465
+ }), /* @__PURE__ */ p("p", {
466
+ className: "text-sm text-text-muted",
467
+ children: He(Tt, "No project access will be granted automatically")
455
468
  })]
456
- }), /* @__PURE__ */ p("p", {
457
- className: "text-sm text-text-secondary",
458
- children: He(Tt, "No project access will be granted automatically")
459
469
  })]
460
470
  })]
461
- })] }),
462
- /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, { children: r(x, "workspaceInvite.sendTitle", "Send invitations") }) }), /* @__PURE__ */ p(v, { children: /* @__PURE__ */ m(Ae, {
463
- value: nt,
464
- onValueChange: (e) => rt(e),
465
- className: "space-y-5",
466
- children: [
467
- /* @__PURE__ */ m(Me, { children: [/* @__PURE__ */ p(Ne, {
468
- value: "single",
469
- children: r(x, "workspaceInvite.modeSingle", "Single")
470
- }), /* @__PURE__ */ p(Ne, {
471
- value: "bulk",
472
- children: r(x, "workspaceInvite.modeBulk", "Bulk CSV")
473
- })] }),
474
- /* @__PURE__ */ m(je, {
475
- value: "single",
476
- className: "space-y-4",
477
- children: [
478
- st ? /* @__PURE__ */ m("div", {
479
- className: "flex items-center gap-2 rounded-md border border-status-error-border/20 bg-status-error-bg/10 p-3 text-sm text-status-error-text",
480
- children: [/* @__PURE__ */ p(l, { className: "size-4 shrink-0" }), /* @__PURE__ */ p("span", { children: st })]
481
- }) : null,
482
- ct ? /* @__PURE__ */ m("div", {
483
- className: "flex items-center gap-2 rounded-md border border-green-500/20 bg-green-500/10 p-3 text-sm text-green-700 dark:text-green-400",
484
- children: [/* @__PURE__ */ p(u, { className: "size-4 shrink-0" }), /* @__PURE__ */ p("span", { children: ct })]
485
- }) : null,
486
- /* @__PURE__ */ m("form", {
487
- onSubmit: Ot,
488
- className: "space-y-4",
489
- children: [/* @__PURE__ */ m("div", {
490
- className: "space-y-2",
491
- children: [/* @__PURE__ */ p("label", {
492
- htmlFor: "workspace-invite-email",
493
- className: "text-sm font-medium",
494
- children: r(x, "workspaceInvite.emailLabel", "Email Address")
495
- }), /* @__PURE__ */ p(Oe, {
496
- id: "workspace-invite-email",
497
- type: "email",
498
- placeholder: "member@example.com",
499
- value: N,
500
- onChange: (e) => it(e.target.value),
501
- disabled: q
471
+ }),
472
+ /* @__PURE__ */ m(x, {
473
+ treatment: "plain",
474
+ className: "border-border-seam",
475
+ children: [/* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(y, { children: r(b, "workspaceInvite.sendTitle", "Send invitations") }) }), /* @__PURE__ */ p(_, { children: /* @__PURE__ */ m(Ae, {
476
+ value: nt,
477
+ onValueChange: (e) => rt(e),
478
+ className: "space-y-5",
479
+ children: [
480
+ /* @__PURE__ */ m(Me, { children: [/* @__PURE__ */ p(Ne, {
481
+ value: "single",
482
+ children: r(b, "workspaceInvite.modeSingle", "Single")
483
+ }), /* @__PURE__ */ p(Ne, {
484
+ value: "bulk",
485
+ children: r(b, "workspaceInvite.modeBulk", "Bulk CSV")
486
+ })] }),
487
+ /* @__PURE__ */ m(je, {
488
+ value: "single",
489
+ className: "space-y-4",
490
+ children: [
491
+ st ? /* @__PURE__ */ m("div", {
492
+ className: "flex items-center gap-2 rounded-md border border-status-error-border/20 bg-status-error-bg/10 p-3 text-sm text-status-error-text",
493
+ children: [/* @__PURE__ */ p(l, { className: "size-4 shrink-0" }), /* @__PURE__ */ p("span", { children: st })]
494
+ }) : null,
495
+ ct ? /* @__PURE__ */ m("div", {
496
+ className: "flex items-center gap-2 rounded-md border border-green-500/20 bg-green-500/10 p-3 text-sm text-green-700 dark:text-green-400",
497
+ children: [/* @__PURE__ */ p(u, { className: "size-4 shrink-0" }), /* @__PURE__ */ p("span", { children: ct })]
498
+ }) : null,
499
+ /* @__PURE__ */ m("form", {
500
+ onSubmit: Ot,
501
+ className: "space-y-4",
502
+ children: [/* @__PURE__ */ m("div", {
503
+ className: "space-y-2",
504
+ children: [/* @__PURE__ */ p("label", {
505
+ htmlFor: "workspace-invite-email",
506
+ className: "text-sm font-medium",
507
+ children: r(b, "workspaceInvite.emailLabel", "Email Address")
508
+ }), /* @__PURE__ */ p(Oe, {
509
+ id: "workspace-invite-email",
510
+ type: "email",
511
+ placeholder: "member@example.com",
512
+ value: N,
513
+ onChange: (e) => it(e.target.value),
514
+ disabled: q
515
+ })]
516
+ }), /* @__PURE__ */ p("div", {
517
+ className: "flex justify-end",
518
+ children: /* @__PURE__ */ m(g, {
519
+ type: "submit",
520
+ disabled: q,
521
+ className: "gap-2",
522
+ children: [q ? /* @__PURE__ */ p(d, { className: "size-4 animate-spin" }) : /* @__PURE__ */ p(he, { className: "size-4" }), r(b, "workspaceInvite.sendSingleButton", "Send Invitation")]
523
+ })
502
524
  })]
503
- }), /* @__PURE__ */ p("div", {
504
- className: "flex justify-end",
505
- children: /* @__PURE__ */ m(g, {
506
- type: "submit",
507
- disabled: q,
525
+ })
526
+ ]
527
+ }),
528
+ /* @__PURE__ */ m(je, {
529
+ value: "bulk",
530
+ className: "space-y-5",
531
+ children: [
532
+ ut ? /* @__PURE__ */ m("div", {
533
+ className: "flex items-center gap-2 rounded-md border border-status-error-border/20 bg-status-error-bg/10 p-3 text-sm text-status-error-text",
534
+ children: [/* @__PURE__ */ p(l, { className: "size-4 shrink-0" }), /* @__PURE__ */ p("span", { children: ut })]
535
+ }) : null,
536
+ dt ? /* @__PURE__ */ m("div", {
537
+ className: "flex items-center gap-2 rounded-md border border-green-500/20 bg-green-500/10 p-3 text-sm text-green-700 dark:text-green-400",
538
+ children: [/* @__PURE__ */ p(u, { className: "size-4 shrink-0" }), /* @__PURE__ */ p("span", { children: dt })]
539
+ }) : null,
540
+ /* @__PURE__ */ m("div", {
541
+ className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
542
+ children: [/* @__PURE__ */ m("div", {
543
+ className: "space-y-1",
544
+ children: [
545
+ /* @__PURE__ */ p("p", {
546
+ className: "text-sm text-text-secondary",
547
+ children: r(b, "workspaceInvite.bulkDescription", "Upload a CSV with one email column. All valid rows will receive the currently selected roles and projects.")
548
+ }),
549
+ /* @__PURE__ */ m("div", {
550
+ className: "rounded-md border bg-bg-sunken/30 px-3 py-2 text-xs text-text-secondary",
551
+ children: [/* @__PURE__ */ p("p", {
552
+ className: "font-medium text-text-primary",
553
+ children: "Sample format"
554
+ }), /* @__PURE__ */ m("pre", {
555
+ className: "mt-1 whitespace-pre-wrap",
556
+ children: [
557
+ "email",
558
+ "\n",
559
+ "alice@example.com",
560
+ "\n",
561
+ "bob@example.com"
562
+ ]
563
+ })]
564
+ }),
565
+ (A?.total ?? 0) > M.length ? /* @__PURE__ */ m("p", {
566
+ className: "text-xs text-text-secondary",
567
+ children: [
568
+ "Showing the first ",
569
+ M.length,
570
+ " active projects. Narrow the workspace project list if you need to invite into more."
571
+ ]
572
+ }) : null
573
+ ]
574
+ }), /* @__PURE__ */ m(g, {
575
+ type: "button",
576
+ variant: "outline",
577
+ onClick: ce,
508
578
  className: "gap-2",
509
- children: [q ? /* @__PURE__ */ p(d, { className: "size-4 animate-spin" }) : /* @__PURE__ */ p(he, { className: "size-4" }), r(x, "workspaceInvite.sendSingleButton", "Send Invitation")]
510
- })
511
- })]
512
- })
513
- ]
514
- }),
515
- /* @__PURE__ */ m(je, {
516
- value: "bulk",
517
- className: "space-y-5",
518
- children: [
519
- ut ? /* @__PURE__ */ m("div", {
520
- className: "flex items-center gap-2 rounded-md border border-status-error-border/20 bg-status-error-bg/10 p-3 text-sm text-status-error-text",
521
- children: [/* @__PURE__ */ p(l, { className: "size-4 shrink-0" }), /* @__PURE__ */ p("span", { children: ut })]
522
- }) : null,
523
- dt ? /* @__PURE__ */ m("div", {
524
- className: "flex items-center gap-2 rounded-md border border-green-500/20 bg-green-500/10 p-3 text-sm text-green-700 dark:text-green-400",
525
- children: [/* @__PURE__ */ p(u, { className: "size-4 shrink-0" }), /* @__PURE__ */ p("span", { children: dt })]
526
- }) : null,
527
- /* @__PURE__ */ m("div", {
528
- className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
529
- children: [/* @__PURE__ */ m("div", {
530
- className: "space-y-1",
579
+ children: [/* @__PURE__ */ p(fe, { size: 16 }), r(b, "workspaceInvite.downloadTemplate", "Download template")]
580
+ })]
581
+ }),
582
+ /* @__PURE__ */ m("div", {
583
+ onDragOver: (e) => {
584
+ e.preventDefault(), U(!0);
585
+ },
586
+ onDragLeave: () => U(!1),
587
+ onDrop: (e) => {
588
+ e.preventDefault(), U(!1);
589
+ let t = e.dataTransfer.files?.[0];
590
+ t ? kt(t) : L("Please upload a .csv file.");
591
+ },
592
+ className: `flex flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed p-8 transition-colors ${mt ? "border-primary bg-action-primary-bg/5" : "border-border-subtle bg-bg-surface"}`,
531
593
  children: [
532
- /* @__PURE__ */ p("p", {
533
- className: "text-sm text-text-secondary",
534
- children: r(x, "workspaceInvite.bulkDescription", "Upload a CSV with one email column. All valid rows will receive the currently selected roles and projects.")
594
+ /* @__PURE__ */ p(ge, {
595
+ size: 28,
596
+ className: "text-text-secondary"
535
597
  }),
536
598
  /* @__PURE__ */ m("div", {
537
- className: "rounded-md border bg-bg-sunken/30 px-3 py-2 text-xs text-text-secondary",
599
+ className: "text-center",
538
600
  children: [/* @__PURE__ */ p("p", {
539
- className: "font-medium text-text-primary",
540
- children: "Sample format"
541
- }), /* @__PURE__ */ m("pre", {
542
- className: "mt-1 whitespace-pre-wrap",
543
- children: [
544
- "email",
545
- "\n",
546
- "alice@example.com",
547
- "\n",
548
- "bob@example.com"
549
- ]
601
+ className: "text-sm font-medium",
602
+ children: ft || "Drop a CSV file here or click to browse"
603
+ }), /* @__PURE__ */ p("p", {
604
+ className: "mt-1 text-xs text-text-secondary",
605
+ children: "CSV files only. Required column: email."
550
606
  })]
551
607
  }),
552
- (A?.total ?? 0) > M.length ? /* @__PURE__ */ m("p", {
553
- className: "text-xs text-text-secondary",
554
- children: [
555
- "Showing the first ",
556
- M.length,
557
- " active projects. Narrow the workspace project list if you need to invite into more."
558
- ]
559
- }) : null
608
+ /* @__PURE__ */ p("input", {
609
+ ref: gt,
610
+ type: "file",
611
+ accept: ".csv,text/csv",
612
+ onChange: (e) => {
613
+ let t = e.target.files?.[0];
614
+ t && kt(t), e.target.value = "";
615
+ },
616
+ className: "hidden",
617
+ "aria-label": "Choose CSV file"
618
+ }),
619
+ /* @__PURE__ */ p(g, {
620
+ type: "button",
621
+ onClick: () => gt.current?.click(),
622
+ children: r(b, "workspaceInvite.chooseFile", "Choose file")
623
+ })
560
624
  ]
561
- }), /* @__PURE__ */ m(g, {
562
- type: "button",
563
- variant: "outline",
564
- onClick: ce,
565
- className: "gap-2",
566
- children: [/* @__PURE__ */ p(fe, { size: 16 }), r(x, "workspaceInvite.downloadTemplate", "Download template")]
567
- })]
568
- }),
569
- /* @__PURE__ */ m("div", {
570
- onDragOver: (e) => {
571
- e.preventDefault(), U(!0);
572
- },
573
- onDragLeave: () => U(!1),
574
- onDrop: (e) => {
575
- e.preventDefault(), U(!1);
576
- let t = e.dataTransfer.files?.[0];
577
- t ? kt(t) : L("Please upload a .csv file.");
578
- },
579
- className: `flex flex-col items-center justify-center gap-3 rounded-xl border-2 border-dashed p-8 transition-colors ${mt ? "border-primary bg-action-primary-bg/5" : "border-border-subtle bg-bg-surface"}`,
580
- children: [
581
- /* @__PURE__ */ p(ge, {
582
- size: 28,
583
- className: "text-text-secondary"
584
- }),
625
+ }),
626
+ V.length > 0 ? /* @__PURE__ */ m(ye, { children: [
585
627
  /* @__PURE__ */ m("div", {
586
- className: "text-center",
587
- children: [/* @__PURE__ */ p("p", {
588
- className: "text-sm font-medium",
589
- children: ft || "Drop a CSV file here or click to browse"
590
- }), /* @__PURE__ */ p("p", {
591
- className: "mt-1 text-xs text-text-secondary",
592
- children: "CSV files only. Required column: email."
593
- })]
594
- }),
595
- /* @__PURE__ */ p("input", {
596
- ref: gt,
597
- type: "file",
598
- accept: ".csv,text/csv",
599
- onChange: (e) => {
600
- let t = e.target.files?.[0];
601
- t && kt(t), e.target.value = "";
602
- },
603
- className: "hidden",
604
- "aria-label": "Choose CSV file"
628
+ className: "flex flex-wrap gap-4 text-xs text-text-secondary",
629
+ children: [
630
+ /* @__PURE__ */ m("span", { children: ["Total rows: ", V.length] }),
631
+ /* @__PURE__ */ m("span", { children: ["Ready: ", Q.length] }),
632
+ /* @__PURE__ */ m("span", { children: ["With errors: ", $.length] }),
633
+ $.length > 0 ? /* @__PURE__ */ p(h, {
634
+ variant: "destructive",
635
+ children: "Invalid rows will be skipped"
636
+ }) : null
637
+ ]
605
638
  }),
606
- /* @__PURE__ */ p(g, {
607
- type: "button",
608
- onClick: () => gt.current?.click(),
609
- children: r(x, "workspaceInvite.chooseFile", "Choose file")
639
+ $.length > 0 ? /* @__PURE__ */ m("div", {
640
+ className: "rounded-md border border-status-error-border/20 bg-status-error-bg/10 px-3 py-2 text-sm text-status-error-text",
641
+ children: [
642
+ $.length,
643
+ " row",
644
+ $.length === 1 ? "" : "s",
645
+ " need attention. Only valid rows can be invited."
646
+ ]
647
+ }) : null,
648
+ /* @__PURE__ */ p("div", {
649
+ className: "overflow-hidden rounded-xl border",
650
+ children: /* @__PURE__ */ p(ke, {
651
+ columns: ze,
652
+ data: V,
653
+ rowKey: (e) => `${e.rowNumber}-${e.email}`
654
+ })
610
655
  })
611
- ]
612
- }),
613
- V.length > 0 ? /* @__PURE__ */ m(ye, { children: [
614
- /* @__PURE__ */ m("div", {
615
- className: "flex flex-wrap gap-4 text-xs text-text-secondary",
616
- children: [
617
- /* @__PURE__ */ m("span", { children: ["Total rows: ", V.length] }),
618
- /* @__PURE__ */ m("span", { children: ["Ready: ", Q.length] }),
619
- /* @__PURE__ */ m("span", { children: ["With errors: ", $.length] }),
620
- $.length > 0 ? /* @__PURE__ */ p(h, {
621
- variant: "destructive",
622
- children: "Invalid rows will be skipped"
623
- }) : null
624
- ]
656
+ ] }) : /* @__PURE__ */ p("div", {
657
+ className: "rounded-xl border border-dashed p-6 text-center text-sm text-text-secondary",
658
+ children: "Upload a CSV to preview invite rows here before sending."
625
659
  }),
626
- $.length > 0 ? /* @__PURE__ */ m("div", {
627
- className: "rounded-md border border-status-error-border/20 bg-status-error-bg/10 px-3 py-2 text-sm text-status-error-text",
628
- children: [
629
- $.length,
630
- " row",
631
- $.length === 1 ? "" : "s",
632
- " need attention. Only valid rows can be invited."
633
- ]
634
- }) : null,
635
660
  /* @__PURE__ */ p("div", {
636
- className: "overflow-hidden rounded-xl border",
637
- children: /* @__PURE__ */ p(ke, {
638
- columns: ze,
639
- data: V,
640
- rowKey: (e) => `${e.rowNumber}-${e.email}`
661
+ className: "flex justify-end",
662
+ children: /* @__PURE__ */ m(g, {
663
+ type: "button",
664
+ onClick: At,
665
+ disabled: Q.length === 0 || yt || W,
666
+ className: "gap-2",
667
+ children: [yt || W ? /* @__PURE__ */ p(d, { className: "size-4 animate-spin" }) : /* @__PURE__ */ p(he, { className: "size-4" }), r(b, "workspaceInvite.sendBulkButton", "Send Bulk Invites")]
641
668
  })
642
669
  })
643
- ] }) : /* @__PURE__ */ p("div", {
644
- className: "rounded-xl border border-dashed p-6 text-center text-sm text-text-secondary",
645
- children: "Upload a CSV to preview invite rows here before sending."
646
- }),
647
- /* @__PURE__ */ p("div", {
648
- className: "flex justify-end",
649
- children: /* @__PURE__ */ m(g, {
650
- type: "button",
651
- onClick: At,
652
- disabled: Q.length === 0 || yt || W,
653
- className: "gap-2",
654
- children: [yt || W ? /* @__PURE__ */ p(d, { className: "size-4 animate-spin" }) : /* @__PURE__ */ p(he, { className: "size-4" }), r(x, "workspaceInvite.sendBulkButton", "Send Bulk Invites")]
655
- })
656
- })
657
- ]
658
- })
659
- ]
660
- }) })] }),
661
- /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ m(b, {
662
- className: "flex items-center gap-2",
663
- children: [
664
- /* @__PURE__ */ p(pe, { className: "size-5 text-primary" }),
665
- r(x, "workspaceInvite.pendingTitle", "Pending Invitations"),
666
- /* @__PURE__ */ p(h, {
667
- variant: "secondary",
668
- children: Z.length
669
- })
670
- ]
671
- }) }), /* @__PURE__ */ m(v, { children: [z ? /* @__PURE__ */ m("div", {
672
- className: `mb-4 flex items-center gap-2 rounded-md border p-3 text-sm ${z.tone === "success" ? "border-green-500/20 bg-green-500/10 text-green-700 dark:text-green-400" : "border-status-error-border/20 bg-status-error-bg/10 text-status-error-text"}`,
673
- children: [z.tone === "success" ? /* @__PURE__ */ p(u, { className: "size-4 shrink-0" }) : /* @__PURE__ */ p(l, { className: "size-4 shrink-0" }), /* @__PURE__ */ p("span", { children: z.message })]
674
- }) : null, $e ? /* @__PURE__ */ m("div", {
675
- className: "space-y-3",
676
- children: [/* @__PURE__ */ p(S, { className: "h-20 w-full" }), /* @__PURE__ */ p(S, { className: "h-20 w-full" })]
677
- }) : et && Z.length === 0 ? /* @__PURE__ */ m("div", {
678
- role: "alert",
679
- className: "space-y-3 rounded-md border border-status-error-border/20 bg-status-error-bg/10 p-3 text-sm text-status-error-text",
680
- children: [/* @__PURE__ */ p("p", { children: r(x, "workspaceInvite.pendingLoadFailed", "Failed to load pending invitations for this workspace.") }), /* @__PURE__ */ p(g, {
681
- type: "button",
682
- variant: "outline",
683
- size: "sm",
684
- className: "w-fit",
685
- disabled: j,
686
- onClick: () => {
687
- tt();
688
- },
689
- children: j ? r(x, "workspaceInvite.retrying", "Retrying…") : r(x, "workspaceInvite.tryAgain", "Try again")
690
- })]
691
- }) : Z.length === 0 ? /* @__PURE__ */ p("p", {
692
- className: "text-sm text-text-secondary",
693
- children: r(x, "workspaceInvite.pendingEmpty", "No pending invitations for this workspace.")
694
- }) : /* @__PURE__ */ m("div", {
695
- className: "space-y-3",
696
- children: [et ? /* @__PURE__ */ m("div", {
670
+ ]
671
+ })
672
+ ]
673
+ }) })]
674
+ }),
675
+ /* @__PURE__ */ m(x, {
676
+ treatment: "plain",
677
+ className: "border-border-seam",
678
+ children: [/* @__PURE__ */ p(v, { children: /* @__PURE__ */ m(y, {
679
+ className: "flex items-center gap-2",
680
+ children: [
681
+ /* @__PURE__ */ p(pe, { className: "size-5 text-primary" }),
682
+ r(b, "workspaceInvite.pendingTitle", "Pending Invitations"),
683
+ /* @__PURE__ */ p(h, {
684
+ variant: "secondary",
685
+ className: "tabular-nums",
686
+ children: Z.length
687
+ })
688
+ ]
689
+ }) }), /* @__PURE__ */ m(_, { children: [z ? /* @__PURE__ */ m("div", {
690
+ className: `mb-4 flex items-center gap-2 rounded-md border p-3 text-sm ${z.tone === "success" ? "border-green-500/20 bg-green-500/10 text-green-700 dark:text-green-400" : "border-status-error-border/20 bg-status-error-bg/10 text-status-error-text"}`,
691
+ children: [z.tone === "success" ? /* @__PURE__ */ p(u, { className: "size-4 shrink-0" }) : /* @__PURE__ */ p(l, { className: "size-4 shrink-0" }), /* @__PURE__ */ p("span", { children: z.message })]
692
+ }) : null, $e ? /* @__PURE__ */ m("div", {
693
+ className: "space-y-3",
694
+ children: [/* @__PURE__ */ p(S, { className: "h-20 w-full" }), /* @__PURE__ */ p(S, { className: "h-20 w-full" })]
695
+ }) : et && Z.length === 0 ? /* @__PURE__ */ m("div", {
697
696
  role: "alert",
698
- className: "flex flex-wrap items-center justify-between gap-3 rounded-md border border-status-error-border/20 bg-status-error-bg/10 p-3 text-sm text-status-error-text",
699
- children: [/* @__PURE__ */ p("span", { children: r(x, "workspaceInvite.pendingStaleWarning", "Pending invitations may be outdated. Try again to refresh this list.") }), /* @__PURE__ */ p(g, {
697
+ className: "space-y-3 rounded-md border border-status-error-border/20 bg-status-error-bg/10 p-3 text-sm text-status-error-text",
698
+ children: [/* @__PURE__ */ p("p", { children: r(b, "workspaceInvite.pendingLoadFailed", "Failed to load pending invitations for this workspace.") }), /* @__PURE__ */ p(g, {
700
699
  type: "button",
701
700
  variant: "outline",
702
701
  size: "sm",
@@ -705,86 +704,106 @@ function O() {
705
704
  onClick: () => {
706
705
  tt();
707
706
  },
708
- children: j ? r(x, "workspaceInvite.retrying", "Retrying…") : r(x, "workspaceInvite.tryAgain", "Try again")
707
+ children: j ? r(b, "workspaceInvite.retrying", "Retrying…") : r(b, "workspaceInvite.tryAgain", "Try again")
709
708
  })]
710
- }) : null, Z.map((e) => {
711
- let t = ie(e), n = re(e), r = St === e.id && (J || Y);
712
- return /* @__PURE__ */ p("div", {
713
- className: "rounded-lg border p-4",
714
- children: /* @__PURE__ */ m("div", {
715
- className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between",
716
- children: [/* @__PURE__ */ m("div", {
717
- className: "space-y-3",
718
- children: [
719
- /* @__PURE__ */ m("div", {
720
- className: "flex flex-wrap items-center gap-2",
721
- children: [/* @__PURE__ */ p("p", {
722
- className: "font-semibold",
723
- children: e.email
724
- }), /* @__PURE__ */ p(h, {
725
- variant: "outline",
726
- children: e.status
727
- })]
728
- }),
729
- /* @__PURE__ */ m("div", {
730
- className: "grid gap-3 text-sm text-text-secondary sm:grid-cols-2",
731
- children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
732
- className: "font-medium text-text-primary",
733
- children: "Received"
734
- }), /* @__PURE__ */ p("p", { children: Ve(e.createdAt) ?? "—" })] }), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
735
- className: "font-medium text-text-primary",
736
- children: "Expires"
737
- }), /* @__PURE__ */ p("p", { children: Ve(e.expiresAt) ?? "—" })] })]
738
- }),
739
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
740
- className: "mb-2 text-sm font-medium text-text-primary",
741
- children: "Roles"
742
- }), /* @__PURE__ */ p("div", {
743
- className: "flex flex-wrap gap-2",
744
- children: t.length > 0 ? t.map((t, n) => /* @__PURE__ */ p(h, {
745
- variant: "outline",
746
- children: t
747
- }, `${e.id}-${e.roleIds[n] ?? t}`)) : /* @__PURE__ */ p("span", {
748
- className: "text-sm text-text-secondary",
749
- children: "No roles selected"
750
- })
751
- })] }),
752
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
753
- className: "mb-2 text-sm font-medium text-text-primary",
754
- children: "Projects"
755
- }), /* @__PURE__ */ p("div", {
756
- className: "flex flex-wrap gap-2",
757
- children: n.length > 0 ? n.map((t, n) => /* @__PURE__ */ p(h, {
758
- variant: "secondary",
759
- children: t
760
- }, `${e.id}-project-${t}-${n}`)) : /* @__PURE__ */ p("span", {
761
- className: "text-sm text-text-secondary",
762
- children: "No project access will be granted automatically"
763
- })
764
- })] })
765
- ]
766
- }), /* @__PURE__ */ m("div", {
767
- className: "flex gap-2",
768
- children: [/* @__PURE__ */ m(g, {
769
- type: "button",
770
- variant: "outline",
771
- disabled: J || Y,
772
- onClick: () => jt(e),
773
- className: "gap-2",
774
- children: [r && J ? /* @__PURE__ */ p(me, { className: "size-4 animate-spin" }) : /* @__PURE__ */ p(me, { className: "size-4" }), "Resend"]
775
- }), /* @__PURE__ */ m(g, {
776
- type: "button",
777
- variant: "outline",
778
- disabled: J || Y,
779
- onClick: () => K(e),
780
- className: "gap-2",
781
- children: [r && Y ? /* @__PURE__ */ p(d, { className: "size-4 animate-spin" }) : /* @__PURE__ */ p(f, { className: "size-4" }), "Cancel"]
709
+ }) : Z.length === 0 ? /* @__PURE__ */ p("p", {
710
+ className: "text-sm text-text-secondary",
711
+ children: r(b, "workspaceInvite.pendingEmpty", "No pending invitations for this workspace.")
712
+ }) : /* @__PURE__ */ m("div", {
713
+ className: "space-y-3",
714
+ children: [et ? /* @__PURE__ */ m("div", {
715
+ role: "alert",
716
+ className: "flex flex-wrap items-center justify-between gap-3 rounded-md border border-status-error-border/20 bg-status-error-bg/10 p-3 text-sm text-status-error-text",
717
+ children: [/* @__PURE__ */ p("span", { children: r(b, "workspaceInvite.pendingStaleWarning", "Pending invitations may be outdated. Try again to refresh this list.") }), /* @__PURE__ */ p(g, {
718
+ type: "button",
719
+ variant: "outline",
720
+ size: "sm",
721
+ className: "w-fit",
722
+ disabled: j,
723
+ onClick: () => {
724
+ tt();
725
+ },
726
+ children: j ? r(b, "workspaceInvite.retrying", "Retrying…") : r(b, "workspaceInvite.tryAgain", "Try again")
727
+ })]
728
+ }) : null, Z.map((e) => {
729
+ let t = ie(e), n = re(e), r = St === e.id && (J || Y);
730
+ return /* @__PURE__ */ p("div", {
731
+ className: "rounded-lg border p-4",
732
+ children: /* @__PURE__ */ m("div", {
733
+ className: "flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between",
734
+ children: [/* @__PURE__ */ m("div", {
735
+ className: "space-y-3",
736
+ children: [
737
+ /* @__PURE__ */ m("div", {
738
+ className: "flex flex-wrap items-center gap-2",
739
+ children: [/* @__PURE__ */ p("p", {
740
+ className: "font-semibold",
741
+ children: e.email
742
+ }), /* @__PURE__ */ p(h, {
743
+ variant: "outline",
744
+ children: e.status
745
+ })]
746
+ }),
747
+ /* @__PURE__ */ m("div", {
748
+ className: "grid gap-3 text-sm text-text-secondary sm:grid-cols-2",
749
+ children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
750
+ className: "font-medium text-text-primary",
751
+ children: "Received"
752
+ }), /* @__PURE__ */ p("p", { children: Ve(e.createdAt) ?? "—" })] }), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
753
+ className: "font-medium text-text-primary",
754
+ children: "Expires"
755
+ }), /* @__PURE__ */ p("p", { children: Ve(e.expiresAt) ?? "—" })] })]
756
+ }),
757
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
758
+ className: "mb-2 text-sm font-medium text-text-primary",
759
+ children: "Roles"
760
+ }), /* @__PURE__ */ p("div", {
761
+ className: "flex flex-wrap gap-2",
762
+ children: t.length > 0 ? t.map((t, n) => /* @__PURE__ */ p(h, {
763
+ variant: "outline",
764
+ children: t
765
+ }, `${e.id}-${e.roleIds[n] ?? t}`)) : /* @__PURE__ */ p("span", {
766
+ className: "text-sm text-text-secondary",
767
+ children: "No roles selected"
768
+ })
769
+ })] }),
770
+ /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
771
+ className: "mb-2 text-sm font-medium text-text-primary",
772
+ children: "Projects"
773
+ }), /* @__PURE__ */ p("div", {
774
+ className: "flex flex-wrap gap-2",
775
+ children: n.length > 0 ? n.map((t, n) => /* @__PURE__ */ p(h, {
776
+ variant: "secondary",
777
+ children: t
778
+ }, `${e.id}-project-${t}-${n}`)) : /* @__PURE__ */ p("span", {
779
+ className: "text-sm text-text-secondary",
780
+ children: "No project access will be granted automatically"
781
+ })
782
+ })] })
783
+ ]
784
+ }), /* @__PURE__ */ m("div", {
785
+ className: "flex gap-2",
786
+ children: [/* @__PURE__ */ m(g, {
787
+ type: "button",
788
+ variant: "outline",
789
+ disabled: J || Y,
790
+ onClick: () => jt(e),
791
+ className: "gap-2",
792
+ children: [r && J ? /* @__PURE__ */ p(me, { className: "size-4 animate-spin" }) : /* @__PURE__ */ p(me, { className: "size-4" }), "Resend"]
793
+ }), /* @__PURE__ */ m(g, {
794
+ type: "button",
795
+ variant: "outline",
796
+ disabled: J || Y,
797
+ onClick: () => K(e),
798
+ className: "gap-2",
799
+ children: [r && Y ? /* @__PURE__ */ p(d, { className: "size-4 animate-spin" }) : /* @__PURE__ */ p(f, { className: "size-4" }), "Cancel"]
800
+ })]
782
801
  })]
783
- })]
784
- })
785
- }, e.id);
786
- })]
787
- })] })] })
802
+ })
803
+ }, e.id);
804
+ })]
805
+ })] })]
806
+ })
788
807
  ]
789
808
  })] });
790
809
  }