@burdenoff/microfe-organization 2026.1026.1 → 2026.1101.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 (172) hide show
  1. package/dist/generated/global-operations.js +57 -58
  2. package/dist/generated/global-operations.js.map +1 -1
  3. package/dist/generated/global-types.js +1 -2
  4. package/dist/generated/global-types.js.map +1 -1
  5. package/dist/node_modules/sonner/dist/index.js +2 -3
  6. package/dist/node_modules/sonner/dist/index.js.map +1 -1
  7. package/dist/node_modules/zod/v4/classic/errors.js +44 -0
  8. package/dist/node_modules/zod/v4/classic/errors.js.map +1 -0
  9. package/dist/node_modules/zod/v4/classic/parse.js +7 -0
  10. package/dist/node_modules/zod/v4/classic/parse.js.map +1 -0
  11. package/dist/node_modules/zod/v4/classic/schemas.js +652 -0
  12. package/dist/node_modules/zod/v4/classic/schemas.js.map +1 -0
  13. package/dist/node_modules/zod/v4/core/api.js +429 -0
  14. package/dist/node_modules/zod/v4/core/api.js.map +1 -0
  15. package/dist/node_modules/zod/v4/core/checks.js +143 -0
  16. package/dist/node_modules/zod/v4/core/checks.js.map +1 -0
  17. package/dist/node_modules/zod/v4/core/core.js +84 -0
  18. package/dist/node_modules/zod/v4/core/core.js.map +1 -0
  19. package/dist/node_modules/zod/v4/core/doc.js +29 -0
  20. package/dist/node_modules/zod/v4/core/doc.js.map +1 -0
  21. package/dist/node_modules/zod/v4/core/errors.js +90 -0
  22. package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
  23. package/dist/node_modules/zod/v4/core/json-schema-processors.js +285 -0
  24. package/dist/node_modules/zod/v4/core/json-schema-processors.js.map +1 -0
  25. package/dist/node_modules/zod/v4/core/memoizer.js +188 -0
  26. package/dist/node_modules/zod/v4/core/memoizer.js.map +1 -0
  27. package/dist/node_modules/zod/v4/core/parse.js +159 -0
  28. package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
  29. package/dist/node_modules/zod/v4/core/regexes.js +34 -0
  30. package/dist/node_modules/zod/v4/core/regexes.js.map +1 -0
  31. package/dist/node_modules/zod/v4/core/registries.js +41 -0
  32. package/dist/node_modules/zod/v4/core/registries.js.map +1 -0
  33. package/dist/node_modules/zod/v4/core/schemas.js +979 -0
  34. package/dist/node_modules/zod/v4/core/schemas.js.map +1 -0
  35. package/dist/node_modules/zod/v4/core/to-json-schema.js +330 -0
  36. package/dist/node_modules/zod/v4/core/to-json-schema.js.map +1 -0
  37. package/dist/node_modules/zod/v4/core/util.js +417 -0
  38. package/dist/node_modules/zod/v4/core/util.js.map +1 -0
  39. package/dist/node_modules/zod/v4/core/versions.js +9 -0
  40. package/dist/node_modules/zod/v4/core/versions.js.map +1 -0
  41. package/dist/node_modules/zod/v4/locales/en.js +96 -0
  42. package/dist/node_modules/zod/v4/locales/en.js.map +1 -0
  43. package/dist/organization-management/AdminOrganizationRoot.js +13 -10
  44. package/dist/organization-management/AdminOrganizationRoot.js.map +1 -1
  45. package/dist/organization-management/AdminOrganizationRoutes.js +8 -9
  46. package/dist/organization-management/AdminOrganizationRoutes.js.map +1 -1
  47. package/dist/organization-management/UserOrganizationRoot.js +13 -10
  48. package/dist/organization-management/UserOrganizationRoot.js.map +1 -1
  49. package/dist/organization-management/UserOrganizationRoutes.js +1 -2
  50. package/dist/organization-management/UserOrganizationRoutes.js.map +1 -1
  51. package/dist/organization-management/constants/permissions.js +1 -2
  52. package/dist/organization-management/constants/permissions.js.map +1 -1
  53. package/dist/organization-management/hooks/useOrganizationEventEmitter.js +1 -2
  54. package/dist/organization-management/hooks/useOrganizationEventEmitter.js.map +1 -1
  55. package/dist/organization-management/hooks/useOrganizationPageView.js +1 -2
  56. package/dist/organization-management/hooks/useOrganizationPageView.js.map +1 -1
  57. package/dist/organization-management/modules/members/components/BulkInviteForm.js +3 -3
  58. package/dist/organization-management/modules/members/components/BulkInviteForm.js.map +1 -1
  59. package/dist/organization-management/modules/members/components/InviteMemberForm.js +1 -2
  60. package/dist/organization-management/modules/members/components/InviteMemberForm.js.map +1 -1
  61. package/dist/organization-management/modules/members/components/InviteStatusBadge.js +1 -2
  62. package/dist/organization-management/modules/members/components/InviteStatusBadge.js.map +1 -1
  63. package/dist/organization-management/modules/members/components/MemberRoleBadge.js +1 -2
  64. package/dist/organization-management/modules/members/components/MemberRoleBadge.js.map +1 -1
  65. package/dist/organization-management/modules/members/components/MyInviteCard.js +5 -6
  66. package/dist/organization-management/modules/members/components/MyInviteCard.js.map +1 -1
  67. package/dist/organization-management/modules/members/components/PendingInvitesList.js +8 -9
  68. package/dist/organization-management/modules/members/components/PendingInvitesList.js.map +1 -1
  69. package/dist/organization-management/modules/members/hooks/useInvites.js +2 -3
  70. package/dist/organization-management/modules/members/hooks/useInvites.js.map +1 -1
  71. package/dist/organization-management/modules/members/hooks/useMembers.js +1 -2
  72. package/dist/organization-management/modules/members/hooks/useMembers.js.map +1 -1
  73. package/dist/organization-management/modules/members/hooks/useWorkspaceInvites.js +1 -2
  74. package/dist/organization-management/modules/members/hooks/useWorkspaceInvites.js.map +1 -1
  75. package/dist/organization-management/modules/members/pages/InviteMemberPage.js +16 -17
  76. package/dist/organization-management/modules/members/pages/InviteMemberPage.js.map +1 -1
  77. package/dist/organization-management/modules/members/pages/InvitePeoplePage.js +14 -15
  78. package/dist/organization-management/modules/members/pages/InvitePeoplePage.js.map +1 -1
  79. package/dist/organization-management/modules/members/pages/MemberDetailPage.js +18 -19
  80. package/dist/organization-management/modules/members/pages/MemberDetailPage.js.map +1 -1
  81. package/dist/organization-management/modules/members/pages/MembersListPage.js +142 -143
  82. package/dist/organization-management/modules/members/pages/MembersListPage.js.map +1 -1
  83. package/dist/organization-management/modules/members/pages/MyInvitesPage.js +168 -169
  84. package/dist/organization-management/modules/members/pages/MyInvitesPage.js.map +1 -1
  85. package/dist/organization-management/modules/members/pages/OrganizationInviteAcceptancePage.js +13 -14
  86. package/dist/organization-management/modules/members/pages/OrganizationInviteAcceptancePage.js.map +1 -1
  87. package/dist/organization-management/modules/members/utils/bulkInviteCsv.js +4 -10
  88. package/dist/organization-management/modules/members/utils/bulkInviteCsv.js.map +1 -1
  89. package/dist/organization-management/modules/members/utils/workspaceInvitationDisplay.js +1 -2
  90. package/dist/organization-management/modules/members/utils/workspaceInvitationDisplay.js.map +1 -1
  91. package/dist/organization-management/modules/organizations/components/OrganizationForm.js +14 -15
  92. package/dist/organization-management/modules/organizations/components/OrganizationForm.js.map +1 -1
  93. package/dist/organization-management/modules/organizations/components/OrganizationStatusBadge.js +1 -2
  94. package/dist/organization-management/modules/organizations/components/OrganizationStatusBadge.js.map +1 -1
  95. package/dist/organization-management/modules/organizations/hooks/useOrganizations.js +2 -3
  96. package/dist/organization-management/modules/organizations/hooks/useOrganizations.js.map +1 -1
  97. package/dist/organization-management/modules/organizations/hooks/useOrgsWithPermission.js +22 -21
  98. package/dist/organization-management/modules/organizations/hooks/useOrgsWithPermission.js.map +1 -1
  99. package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js +18 -19
  100. package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js.map +1 -1
  101. package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js +29 -30
  102. package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js.map +1 -1
  103. package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js +14 -15
  104. package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js.map +1 -1
  105. package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js +33 -34
  106. package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js.map +1 -1
  107. package/dist/organization-management/modules/organizations/schemas/index.js +11 -12
  108. package/dist/organization-management/modules/organizations/schemas/index.js.map +1 -1
  109. package/dist/organization-management/modules/workspaces/components/AddWorkspaceMemberDialog.js +16 -24
  110. package/dist/organization-management/modules/workspaces/components/AddWorkspaceMemberDialog.js.map +1 -1
  111. package/dist/organization-management/modules/workspaces/components/WorkspaceCard.js +5 -6
  112. package/dist/organization-management/modules/workspaces/components/WorkspaceCard.js.map +1 -1
  113. package/dist/organization-management/modules/workspaces/components/WorkspaceForm.js +31 -32
  114. package/dist/organization-management/modules/workspaces/components/WorkspaceForm.js.map +1 -1
  115. package/dist/organization-management/modules/workspaces/components/WorkspaceStatusBadge.js +1 -2
  116. package/dist/organization-management/modules/workspaces/components/WorkspaceStatusBadge.js.map +1 -1
  117. package/dist/organization-management/modules/workspaces/hooks/useWorkspaceMembers.js +1 -2
  118. package/dist/organization-management/modules/workspaces/hooks/useWorkspaceMembers.js.map +1 -1
  119. package/dist/organization-management/modules/workspaces/hooks/useWorkspaces.js +11 -12
  120. package/dist/organization-management/modules/workspaces/hooks/useWorkspaces.js.map +1 -1
  121. package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js +18 -19
  122. package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js.map +1 -1
  123. package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js +43 -44
  124. package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js.map +1 -1
  125. package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js +19 -20
  126. package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js.map +1 -1
  127. package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js +240 -241
  128. package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js.map +1 -1
  129. package/dist/organization-management/modules/workspaces/schemas/index.js +6 -7
  130. package/dist/organization-management/modules/workspaces/schemas/index.js.map +1 -1
  131. package/dist/organization-management/providers/OrgConsoleProvider.js +1 -2
  132. package/dist/organization-management/providers/OrgConsoleProvider.js.map +1 -1
  133. package/dist/organization-management/providers/OrgScopedPermissions.js +1 -2
  134. package/dist/organization-management/providers/OrgScopedPermissions.js.map +1 -1
  135. package/dist/organization-management/shared/components/dialog/ConfirmDialog.js +1 -2
  136. package/dist/organization-management/shared/components/dialog/ConfirmDialog.js.map +1 -1
  137. package/dist/organization-management/shared/components/dialog/ConfirmDialogView.js +1 -2
  138. package/dist/organization-management/shared/components/dialog/ConfirmDialogView.js.map +1 -1
  139. package/dist/organization-management/shared/components/feedback/ErrorState.js +1 -2
  140. package/dist/organization-management/shared/components/feedback/ErrorState.js.map +1 -1
  141. package/dist/organization-management/shared/components/feedback/LoadingState.js +1 -2
  142. package/dist/organization-management/shared/components/feedback/LoadingState.js.map +1 -1
  143. package/dist/organization-management/shared/components/input/SearchInput.js +1 -2
  144. package/dist/organization-management/shared/components/input/SearchInput.js.map +1 -1
  145. package/dist/organization-management/shared/components/input/SelectionCheckbox.js +1 -2
  146. package/dist/organization-management/shared/components/input/SelectionCheckbox.js.map +1 -1
  147. package/dist/organization-management/shared/hooks/useDebouncedValue.js +1 -2
  148. package/dist/organization-management/shared/hooks/useDebouncedValue.js.map +1 -1
  149. package/dist/organization-management/shared/hooks/useTr.js +1 -2
  150. package/dist/organization-management/shared/hooks/useTr.js.map +1 -1
  151. package/dist/organization-management/shared/logger.js +1 -2
  152. package/dist/organization-management/shared/logger.js.map +1 -1
  153. package/dist/organization-management/shared/recaptcha.js +1 -2
  154. package/dist/organization-management/shared/recaptcha.js.map +1 -1
  155. package/dist/organization-management/shared/types/graphql.js +1 -2
  156. package/dist/organization-management/shared/types/graphql.js.map +1 -1
  157. package/dist/utils/nativeBridge.js +1 -2
  158. package/package.json +7 -6
  159. package/dist/node_modules/zod/v3/ZodError.js +0 -82
  160. package/dist/node_modules/zod/v3/ZodError.js.map +0 -1
  161. package/dist/node_modules/zod/v3/errors.js +0 -10
  162. package/dist/node_modules/zod/v3/errors.js.map +0 -1
  163. package/dist/node_modules/zod/v3/helpers/errorUtil.js +0 -9
  164. package/dist/node_modules/zod/v3/helpers/errorUtil.js.map +0 -1
  165. package/dist/node_modules/zod/v3/helpers/parseUtil.js +0 -93
  166. package/dist/node_modules/zod/v3/helpers/parseUtil.js.map +0 -1
  167. package/dist/node_modules/zod/v3/helpers/util.js +0 -76
  168. package/dist/node_modules/zod/v3/helpers/util.js.map +0 -1
  169. package/dist/node_modules/zod/v3/locales/en.js +0 -62
  170. package/dist/node_modules/zod/v3/locales/en.js.map +0 -1
  171. package/dist/node_modules/zod/v3/types.js +0 -2441
  172. package/dist/node_modules/zod/v3/types.js.map +0 -1
@@ -1,29 +1,29 @@
1
- import { useOrgConsole as e } from "../../../providers/OrgConsoleProvider.js";
2
- import { toast as t } from "../../../../node_modules/sonner/dist/index.js";
1
+ import { toast as e } from "../../../../node_modules/sonner/dist/index.js";
2
+ import { useOrgConsole as t } from "../../../providers/OrgConsoleProvider.js";
3
3
  import { useInviteMember as n } from "../hooks/useInvites.js";
4
- import { useTr as r } from "../../../shared/hooks/useTr.js";
5
- import { LoadingState as i } from "../../../shared/components/feedback/LoadingState.js";
6
- import { PERMISSIONS as a } from "../../../constants/permissions.js";
7
- import { InviteMemberForm as o } from "../components/InviteMemberForm.js";
8
- import { BulkInviteForm as s } from "../components/BulkInviteForm.js";
9
- import { PendingInvitesList as c } from "../components/PendingInvitesList.js";
4
+ import { InviteMemberForm as r } from "../components/InviteMemberForm.js";
5
+ import { BulkInviteForm as i } from "../components/BulkInviteForm.js";
6
+ import { PendingInvitesList as a } from "../components/PendingInvitesList.js";
7
+ import { LoadingState as o } from "../../../shared/components/feedback/LoadingState.js";
8
+ import { PERMISSIONS as s } from "../../../constants/permissions.js";
9
+ import { useTr as c } from "../../../shared/hooks/useTr.js";
10
10
  import { useState as l } from "react";
11
11
  import { ArrowLeft as u, UserPlus as d } from "lucide-react";
12
12
  import { GlassCard as f, PagePurpose as p, ShowMore as m } from "@burdenoff/fe-libs/ui";
13
13
  import { usePermissions as h } from "@burdenoff/fe-libs/shared/providers/shell";
14
14
  import { jsx as g, jsxs as _ } from "react/jsx-runtime";
15
15
  import { useParams as v } from "react-router";
16
- //#region src/organization-management/modules/members/pages/InviteMemberPage.tsx
16
+ // src/organization-management/modules/members/pages/InviteMemberPage.tsx
17
17
  function y() {
18
- let y = r(), { organizationId: b } = v(), { navigate: x, basePath: S = "/organizations" } = e(), { hasPermission: C, isLoading: w } = h(), { inviteMember: T, loading: E, error: D } = n(), [O, k] = l("single"), A = async (e) => {
19
- await T(e), t.success(`${y("members.invite.success", "Invitation sent to")} ${e.email}`);
18
+ let y = c(), { organizationId: b } = v(), { navigate: x, basePath: S = "/organizations" } = t(), { hasPermission: C, isLoading: w } = h(), { inviteMember: T, loading: E, error: D } = n(), [O, k] = l("single"), A = async (t) => {
19
+ await T(t), e.success(`${y("members.invite.success", "Invitation sent to")} ${t.email}`);
20
20
  }, j = () => {
21
21
  x(`${S}/${b}/members`);
22
22
  };
23
23
  return w ? /* @__PURE__ */ g("div", {
24
24
  className: "min-h-full bg-[var(--color-bg-canvas)] p-6",
25
- children: /* @__PURE__ */ g(i, { message: y("common.loadingPermissions", "Loading permissions...") })
26
- }) : C(a.MEMBER_INVITE) ? /* @__PURE__ */ g("div", {
25
+ children: /* @__PURE__ */ g(o, { message: y("common.loadingPermissions", "Loading permissions...") })
26
+ }) : C(s.MEMBER_INVITE) ? /* @__PURE__ */ g("div", {
27
27
  className: "min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6",
28
28
  children: /* @__PURE__ */ _("div", {
29
29
  className: "mx-auto max-w-3xl space-y-8",
@@ -90,12 +90,12 @@ function y() {
90
90
  children: D.message.includes("CONFLICT") ? y("members.invite.error.conflict", "An invite already exists for this email address.") : D.message.includes("already a member") ? y("members.invite.error.alreadyMember", "This user is already a member of the organization.") : D.message
91
91
  })
92
92
  }),
93
- O === "single" ? /* @__PURE__ */ g(o, {
93
+ O === "single" ? /* @__PURE__ */ g(r, {
94
94
  organizationId: b,
95
95
  onSubmit: A,
96
96
  onCancel: j,
97
97
  loading: E
98
- }) : /* @__PURE__ */ g(s, {
98
+ }) : /* @__PURE__ */ g(i, {
99
99
  organizationId: b,
100
100
  inviteMember: T,
101
101
  onCancel: j,
@@ -108,7 +108,7 @@ function y() {
108
108
  className: "border-border-seam p-6",
109
109
  children: /* @__PURE__ */ g(m, {
110
110
  collapsedHeight: 260,
111
- children: /* @__PURE__ */ g(c, { organizationId: b })
111
+ children: /* @__PURE__ */ g(a, { organizationId: b })
112
112
  })
113
113
  })
114
114
  ]
@@ -121,7 +121,6 @@ function y() {
121
121
  })
122
122
  });
123
123
  }
124
- //#endregion
125
124
  export { y as InviteMemberPage };
126
125
 
127
126
  //# sourceMappingURL=InviteMemberPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InviteMemberPage.js","names":[],"sources":["../../../../../src/organization-management/modules/members/pages/InviteMemberPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useParams } from 'react-router';\nimport { ArrowLeft, UserPlus } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { GlassCard, PagePurpose, ShowMore } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useInviteMember } from '../hooks/useInvites';\nimport { InviteMemberForm } from '../components/InviteMemberForm';\nimport { BulkInviteForm } from '../components/BulkInviteForm';\nimport { PendingInvitesList } from '../components/PendingInvitesList';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { PERMISSIONS } from '../../../constants/permissions';\nimport { useTr } from '../../../shared/hooks/useTr';\n\ntype InviteMode = 'single' | 'bulk';\n\n/**\n * Invite Member Page\n * Email-based invite form with pending invites list below\n */\nexport function InviteMemberPage() {\n const tr = useTr();\n const { organizationId } = useParams<{ organizationId: string }>();\n const { navigate, basePath = '/organizations' } = useOrgConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const { inviteMember, loading, error } = useInviteMember();\n const [mode, setMode] = useState<InviteMode>('single');\n\n const handleSubmit = async (data: {\n organizationId: string;\n email: string;\n message?: string;\n }) => {\n await inviteMember(data);\n toast.success(`${tr('members.invite.success', 'Invitation sent to')} ${data.email}`);\n };\n\n const handleCancel = () => {\n navigate(`${basePath}/${organizationId}/members`);\n };\n\n if (permissionsLoading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <LoadingState message={tr('common.loadingPermissions', 'Loading permissions...')} />\n </div>\n );\n }\n\n if (!hasPermission(PERMISSIONS.MEMBER_INVITE)) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <div className=\"p-8 text-center text-[var(--color-text-secondary)]\">\n {tr('members.invite.noPermission', \"You don't have permission to invite members.\")}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6\">\n <div className=\"mx-auto max-w-3xl space-y-8\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"rounded-lg p-2 transition-colors hover:bg-[var(--color-bg-subtle)]\"\n aria-label={tr('members.invite.backToMembers', 'Back to members')}\n >\n <ArrowLeft size={20} className=\"text-[var(--color-text-secondary)]\" />\n </button>\n <div className=\"flex items-center gap-2\">\n <UserPlus size={24} className=\"text-[var(--color-text-primary)]\" />\n <h1 className=\"text-2xl font-bold text-[var(--color-text-primary)]\">\n {tr('members.invite.title', 'Invite Member')}\n </h1>\n </div>\n </div>\n\n <PagePurpose className=\"max-w-2xl\">\n {tr(\n 'members.invite.purpose',\n 'Send someone an invitation to join this organization. Invite one person by email, or upload a CSV to invite a whole team at once — invitees accept from their own account and instantly gain access to the organization.'\n )}\n </PagePurpose>\n\n {/* Mode toggle */}\n <div\n className=\"inline-flex rounded-lg border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] p-1\"\n role=\"tablist\"\n aria-label={tr('members.invite.modeToggle', 'Invite mode')}\n >\n {(['single', 'bulk'] as const).map((m) => {\n const isActive = mode === m;\n const label =\n m === 'single'\n ? tr('members.invite.modeSingle', 'Single')\n : tr('members.invite.modeBulk', 'Bulk (CSV)');\n return (\n <button\n key={m}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n onClick={() => setMode(m)}\n className={`min-h-9 rounded-md px-4 py-1.5 text-sm font-medium transition-colors ${\n isActive\n ? 'bg-[var(--color-action-primary-bg)] text-[var(--color-action-primary-text)]'\n : 'text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]'\n }`}\n >\n {label}\n </button>\n );\n })}\n </div>\n\n {/* Invite Form Card */}\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-6\">\n <h2 className=\"text-lg font-semibold text-[var(--color-text-primary)] mb-4\">\n {mode === 'single'\n ? tr('members.invite.send', 'Send Invite')\n : tr('members.bulkInvite.title', 'Bulk Invite from CSV')}\n </h2>\n <p className=\"text-sm text-[var(--color-text-muted)] mb-6\">\n {mode === 'single'\n ? tr(\n 'members.invite.description',\n 'Enter the email address of the person you want to invite. They will receive an email notification and can accept or decline from their account.'\n )\n : tr(\n 'members.bulkInvite.pageDescription',\n 'Upload a CSV to invite many people at once. Download the template below to see the expected format.'\n )}\n </p>\n\n {mode === 'single' && error && (\n <div className=\"mb-4 rounded-lg border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bgSubtle)] p-3\">\n <p className=\"text-sm text-[var(--color-status-error-text)]\">\n {error.message.includes('CONFLICT')\n ? tr(\n 'members.invite.error.conflict',\n 'An invite already exists for this email address.'\n )\n : error.message.includes('already a member')\n ? tr(\n 'members.invite.error.alreadyMember',\n 'This user is already a member of the organization.'\n )\n : error.message}\n </p>\n </div>\n )}\n\n {mode === 'single' ? (\n <InviteMemberForm\n organizationId={organizationId!}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n loading={loading}\n />\n ) : (\n <BulkInviteForm\n organizationId={organizationId!}\n inviteMember={inviteMember}\n onCancel={handleCancel}\n loading={loading}\n />\n )}\n </GlassCard>\n\n {/* Pending Invites */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <ShowMore collapsedHeight={260}>\n <PendingInvitesList organizationId={organizationId!} />\n </ShowMore>\n </GlassCard>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"InviteMemberPage.js","names":["InviteMemberPage","tr","useTr","useParams","useOrgConsole","permissionsLoading","usePermissions","useInviteMember","mode","setMode","useState","handleSubmit","inviteMember","data","toast","handleCancel","basePath","organizationId","LoadingState","hasPermission","PERMISSIONS","ArrowLeft","UserPlus","PagePurpose","isActive","m","label","GlassCard","error","InviteMemberForm","BulkInviteForm","ShowMore","PendingInvitesList"],"sources":["../../../../../src/organization-management/modules/members/pages/InviteMemberPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useParams } from 'react-router';\nimport { ArrowLeft, UserPlus } from 'lucide-react';\nimport { toast } from 'sonner';\nimport { GlassCard, PagePurpose, ShowMore } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useInviteMember } from '../hooks/useInvites';\nimport { InviteMemberForm } from '../components/InviteMemberForm';\nimport { BulkInviteForm } from '../components/BulkInviteForm';\nimport { PendingInvitesList } from '../components/PendingInvitesList';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { PERMISSIONS } from '../../../constants/permissions';\nimport { useTr } from '../../../shared/hooks/useTr';\n\ntype InviteMode = 'single' | 'bulk';\n\n/**\n * Invite Member Page\n * Email-based invite form with pending invites list below\n */\nexport function InviteMemberPage() {\n const tr = useTr();\n const { organizationId } = useParams<{ organizationId: string }>();\n const { navigate, basePath = '/organizations' } = useOrgConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const { inviteMember, loading, error } = useInviteMember();\n const [mode, setMode] = useState<InviteMode>('single');\n\n const handleSubmit = async (data: {\n organizationId: string;\n email: string;\n message?: string;\n }) => {\n await inviteMember(data);\n toast.success(`${tr('members.invite.success', 'Invitation sent to')} ${data.email}`);\n };\n\n const handleCancel = () => {\n navigate(`${basePath}/${organizationId}/members`);\n };\n\n if (permissionsLoading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <LoadingState message={tr('common.loadingPermissions', 'Loading permissions...')} />\n </div>\n );\n }\n\n if (!hasPermission(PERMISSIONS.MEMBER_INVITE)) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <div className=\"p-8 text-center text-[var(--color-text-secondary)]\">\n {tr('members.invite.noPermission', \"You don't have permission to invite members.\")}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6\">\n <div className=\"mx-auto max-w-3xl space-y-8\">\n {/* Header */}\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"rounded-lg p-2 transition-colors hover:bg-[var(--color-bg-subtle)]\"\n aria-label={tr('members.invite.backToMembers', 'Back to members')}\n >\n <ArrowLeft size={20} className=\"text-[var(--color-text-secondary)]\" />\n </button>\n <div className=\"flex items-center gap-2\">\n <UserPlus size={24} className=\"text-[var(--color-text-primary)]\" />\n <h1 className=\"text-2xl font-bold text-[var(--color-text-primary)]\">\n {tr('members.invite.title', 'Invite Member')}\n </h1>\n </div>\n </div>\n\n <PagePurpose className=\"max-w-2xl\">\n {tr(\n 'members.invite.purpose',\n 'Send someone an invitation to join this organization. Invite one person by email, or upload a CSV to invite a whole team at once — invitees accept from their own account and instantly gain access to the organization.'\n )}\n </PagePurpose>\n\n {/* Mode toggle */}\n <div\n className=\"inline-flex rounded-lg border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] p-1\"\n role=\"tablist\"\n aria-label={tr('members.invite.modeToggle', 'Invite mode')}\n >\n {(['single', 'bulk'] as const).map((m) => {\n const isActive = mode === m;\n const label =\n m === 'single'\n ? tr('members.invite.modeSingle', 'Single')\n : tr('members.invite.modeBulk', 'Bulk (CSV)');\n return (\n <button\n key={m}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n onClick={() => setMode(m)}\n className={`min-h-9 rounded-md px-4 py-1.5 text-sm font-medium transition-colors ${\n isActive\n ? 'bg-[var(--color-action-primary-bg)] text-[var(--color-action-primary-text)]'\n : 'text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)]'\n }`}\n >\n {label}\n </button>\n );\n })}\n </div>\n\n {/* Invite Form Card */}\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-6\">\n <h2 className=\"text-lg font-semibold text-[var(--color-text-primary)] mb-4\">\n {mode === 'single'\n ? tr('members.invite.send', 'Send Invite')\n : tr('members.bulkInvite.title', 'Bulk Invite from CSV')}\n </h2>\n <p className=\"text-sm text-[var(--color-text-muted)] mb-6\">\n {mode === 'single'\n ? tr(\n 'members.invite.description',\n 'Enter the email address of the person you want to invite. They will receive an email notification and can accept or decline from their account.'\n )\n : tr(\n 'members.bulkInvite.pageDescription',\n 'Upload a CSV to invite many people at once. Download the template below to see the expected format.'\n )}\n </p>\n\n {mode === 'single' && error && (\n <div className=\"mb-4 rounded-lg border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bgSubtle)] p-3\">\n <p className=\"text-sm text-[var(--color-status-error-text)]\">\n {error.message.includes('CONFLICT')\n ? tr(\n 'members.invite.error.conflict',\n 'An invite already exists for this email address.'\n )\n : error.message.includes('already a member')\n ? tr(\n 'members.invite.error.alreadyMember',\n 'This user is already a member of the organization.'\n )\n : error.message}\n </p>\n </div>\n )}\n\n {mode === 'single' ? (\n <InviteMemberForm\n organizationId={organizationId!}\n onSubmit={handleSubmit}\n onCancel={handleCancel}\n loading={loading}\n />\n ) : (\n <BulkInviteForm\n organizationId={organizationId!}\n inviteMember={inviteMember}\n onCancel={handleCancel}\n loading={loading}\n />\n )}\n </GlassCard>\n\n {/* Pending Invites */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <ShowMore collapsedHeight={260}>\n <PendingInvitesList organizationId={organizationId!} />\n </ShowMore>\n </GlassCard>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,31 +1,31 @@
1
1
  import { useOrgConsole as e } from "../../../providers/OrgConsoleProvider.js";
2
2
  import { useMyOrganizations as t } from "../../organizations/hooks/useOrganizations.js";
3
- import { useTr as n } from "../../../shared/hooks/useTr.js";
3
+ import { useOrgsWithPermission as n } from "../../organizations/hooks/useOrgsWithPermission.js";
4
4
  import { LoadingState as r } from "../../../shared/components/feedback/LoadingState.js";
5
5
  import { ErrorState as i } from "../../../shared/components/feedback/ErrorState.js";
6
- import { useOrganizationPageView as a } from "../../../hooks/useOrganizationPageView.js";
7
- import { useOrgsWithPermission as o } from "../../organizations/hooks/useOrgsWithPermission.js";
6
+ import { useTr as a } from "../../../shared/hooks/useTr.js";
7
+ import { useOrganizationPageView as o } from "../../../hooks/useOrganizationPageView.js";
8
8
  import { useEffect as s, useMemo as c, useState as l } from "react";
9
9
  import { Building as u, ChevronRight as d, UserPlus as f } from "lucide-react";
10
10
  import { GlassCard as p, IllustratedEmptyState as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
11
11
  import { jsx as g, jsxs as _ } from "react/jsx-runtime";
12
- //#region src/organization-management/modules/members/pages/InvitePeoplePage.tsx
12
+ // src/organization-management/modules/members/pages/InvitePeoplePage.tsx
13
13
  function v() {
14
- a("organizations.invite-people");
15
- let v = n(), { navigate: y, basePath: b = "/organizations" } = e(), { organizations: x, loading: S, error: C } = t(100, 0), { allowedIds: w, loading: T, isError: E } = o(c(() => x.map((e) => e.id), [x]), "member", "create"), D = c(() => x.filter((e) => w.has(e.id)), [x, w]), [O, k] = l(!1);
14
+ o("organizations.invite-people");
15
+ let v = a(), { navigate: y, basePath: b = "/organizations" } = e(), { organizations: x, loading: S, error: C } = t(100, 0), w = c(() => x.map((e) => e.id), [x]), { allowedIds: T, loading: E, isError: D } = n(w, "member", "create"), O = c(() => x.filter((e) => T.has(e.id)), [x, T]), [k, A] = l(!1);
16
16
  return s(() => {
17
- O || S || T || D.length === 1 && (k(!0), y(`${b}/${D[0].id}/members/invite`));
17
+ k || S || E || O.length === 1 && (A(!0), y(`${b}/${O[0].id}/members/invite`));
18
18
  }, [
19
- O,
19
+ k,
20
20
  S,
21
- T,
22
- D,
21
+ E,
22
+ O,
23
23
  y,
24
24
  b
25
- ]), S || T ? /* @__PURE__ */ g("div", {
25
+ ]), S || E ? /* @__PURE__ */ g("div", {
26
26
  className: "min-h-full bg-[var(--color-bg-canvas)] p-6",
27
27
  children: /* @__PURE__ */ g(r, { message: v("common.loading", "Loading...") })
28
- }) : C || E ? /* @__PURE__ */ g("div", {
28
+ }) : C || D ? /* @__PURE__ */ g("div", {
29
29
  className: "min-h-full bg-[var(--color-bg-canvas)] p-6",
30
30
  children: /* @__PURE__ */ g(i, { message: C?.message || v("members.invitePeople.error", "Failed to load organizations for invite.") })
31
31
  }) : /* @__PURE__ */ g("div", {
@@ -52,7 +52,7 @@ function v() {
52
52
  children: v("members.invitePeople.purpose", "This is the quickest way to bring a new person on board — choose which organization to invite them into, then send the invite. They will get an invitation they can accept to join and start collaborating.")
53
53
  })
54
54
  ] })]
55
- }), D.length === 0 ? /* @__PURE__ */ g(p, {
55
+ }), O.length === 0 ? /* @__PURE__ */ g(p, {
56
56
  treatment: "glass",
57
57
  glow: !0,
58
58
  className: "border-border-seam p-6",
@@ -63,7 +63,7 @@ function v() {
63
63
  })
64
64
  }) : /* @__PURE__ */ g("ul", {
65
65
  className: "divide-y divide-[var(--color-border-seam)] overflow-hidden rounded-card border border-border-seam bg-bg-surface shadow-elevation-1",
66
- children: D.map((e) => /* @__PURE__ */ g("li", { children: /* @__PURE__ */ _("button", {
66
+ children: O.map((e) => /* @__PURE__ */ g("li", { children: /* @__PURE__ */ _("button", {
67
67
  type: "button",
68
68
  onClick: () => y(`${b}/${e.id}/members/invite`),
69
69
  className: "flex w-full items-center justify-between gap-4 px-5 py-4 text-left transition-colors hover:bg-[var(--color-bg-subtle)]",
@@ -95,7 +95,6 @@ function v() {
95
95
  })
96
96
  });
97
97
  }
98
- //#endregion
99
98
  export { v as InvitePeoplePage };
100
99
 
101
100
  //# sourceMappingURL=InvitePeoplePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"InvitePeoplePage.js","names":[],"sources":["../../../../../src/organization-management/modules/members/pages/InvitePeoplePage.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { Building, ChevronRight, UserPlus } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useMyOrganizations } from '../../organizations/hooks/useOrganizations';\nimport { useOrgsWithPermission } from '../../organizations/hooks/useOrgsWithPermission';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { ErrorState } from '../../../shared/components/feedback/ErrorState';\nimport { useTr } from '../../../shared/hooks/useTr';\nimport { useOrganizationPageView } from '../../../hooks/useOrganizationPageView';\n\n/**\n * InvitePeoplePage\n *\n * Globally-reachable entry point (sidebar nav item) for inviting users.\n * Lists the orgs the current user can invite into, then deep-links into\n * each org's existing `members/invite` page so the invite flow itself\n * remains a single source of truth.\n *\n * If the user has exactly one org with invite permission, redirect\n * straight to that org's invite page — saves a click for the common case.\n */\nexport function InvitePeoplePage() {\n useOrganizationPageView('organizations.invite-people');\n const tr = useTr();\n const { navigate, basePath = '/organizations' } = useOrgConsole();\n const { organizations, loading, error } = useMyOrganizations(100, 0);\n\n const orgIds = useMemo(() => organizations.map((o) => o.id), [organizations]);\n const {\n allowedIds,\n loading: permLoading,\n isError: permError,\n } = useOrgsWithPermission(orgIds, 'member', 'create');\n\n const invitable = useMemo(\n () => organizations.filter((o) => allowedIds.has(o.id)),\n [organizations, allowedIds]\n );\n\n const [autoRedirected, setAutoRedirected] = useState(false);\n useEffect(() => {\n if (autoRedirected) return;\n if (loading || permLoading) return;\n if (invitable.length === 1) {\n setAutoRedirected(true);\n navigate(`${basePath}/${invitable[0].id}/members/invite`);\n }\n }, [autoRedirected, loading, permLoading, invitable, navigate, basePath]);\n\n if (loading || permLoading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <LoadingState message={tr('common.loading', 'Loading...')} />\n </div>\n );\n }\n\n if (error || permError) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <ErrorState\n message={\n error?.message ||\n tr('members.invitePeople.error', 'Failed to load organizations for invite.')\n }\n />\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6 animate-in fade-in duration-200\">\n <div className=\"mx-auto max-w-3xl space-y-6\">\n <div className=\"flex items-center gap-3\">\n <UserPlus size={24} className=\"text-[var(--color-text-primary)]\" aria-hidden=\"true\" />\n <div>\n <h1 className=\"text-2xl font-bold text-[var(--color-text-primary)]\">\n {tr('members.invitePeople.title', 'Invite People')}\n </h1>\n <p className=\"mt-1 text-sm text-[var(--color-text-secondary)]\">\n {tr(\n 'members.invitePeople.subtitle',\n 'Pick an organization to send an invite into. You can also invite from any organization or workspace detail page.'\n )}\n </p>\n <PagePurpose className=\"mt-2 max-w-2xl\">\n {tr(\n 'members.invitePeople.purpose',\n 'This is the quickest way to bring a new person on board — choose which organization to invite them into, then send the invite. They will get an invitation they can accept to join and start collaborating.'\n )}\n </PagePurpose>\n </div>\n </div>\n\n {invitable.length === 0 ? (\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-6\">\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title={tr('members.invitePeople.emptyTitle', 'No organizations where you can invite')}\n description={tr(\n 'members.invitePeople.emptyDescription',\n \"You don't currently have permission to invite members into any organization. Ask an organization admin to grant you invite access.\"\n )}\n />\n </GlassCard>\n ) : (\n <ul className=\"divide-y divide-[var(--color-border-seam)] overflow-hidden rounded-card border border-border-seam bg-bg-surface shadow-elevation-1\">\n {invitable.map((org) => (\n <li key={org.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${org.id}/members/invite`)}\n className=\"flex w-full items-center justify-between gap-4 px-5 py-4 text-left transition-colors hover:bg-[var(--color-bg-subtle)]\"\n >\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex size-10 items-center justify-center rounded-lg bg-[var(--color-status-info-bgSubtle)] text-[var(--color-status-info-text)]\">\n <Building size={20} aria-hidden=\"true\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold text-[var(--color-text-primary)]\">\n {org.name}\n </p>\n <p className=\"truncate font-mono text-xs text-[var(--color-text-secondary)]\">\n /{org.slug}\n </p>\n </div>\n </div>\n <ChevronRight\n size={18}\n className=\"shrink-0 text-[var(--color-text-secondary)]\"\n aria-hidden=\"true\"\n />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAsBA,SAAgB,IAAmB;AACjC,GAAwB,8BAA8B;CACtD,IAAM,IAAK,GAAO,EACZ,EAAE,aAAU,cAAW,qBAAqB,GAAe,EAC3D,EAAE,kBAAe,YAAS,aAAU,EAAmB,KAAK,EAAE,EAG9D,EACJ,eACA,SAAS,GACT,SAAS,MACP,EALW,QAAc,EAAc,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,EAAc,CAAC,EAK3C,UAAU,SAAS,EAE/C,IAAY,QACV,EAAc,QAAQ,MAAM,EAAW,IAAI,EAAE,GAAG,CAAC,EACvD,CAAC,GAAe,EAAW,CAC5B,EAEK,CAAC,GAAgB,KAAqB,EAAS,GAAM;AA+B3D,QA9BA,QAAgB;AACV,OACA,KAAW,KACX,EAAU,WAAW,MACvB,EAAkB,GAAK,EACvB,EAAS,GAAG,EAAS,GAAG,EAAU,GAAG,GAAG,iBAAiB;IAE1D;EAAC;EAAgB;EAAS;EAAa;EAAW;EAAU;EAAS,CAAC,EAErE,KAAW,IAEX,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD,EAAc,SAAS,EAAG,kBAAkB,aAAa,EAAI,CAAA;EACzD,CAAA,GAIN,KAAS,IAET,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD,EACE,SACE,GAAO,WACP,EAAG,8BAA8B,2CAA2C,EAE9E,CAAA;EACE,CAAA,GAKR,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAU,MAAM;KAAI,WAAU;KAAmC,eAAY;KAAS,CAAA,EACtF,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAG,8BAA8B,gBAAgB;MAC/C,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBACV,EACC,iCACA,mHACD;MACC,CAAA;KACJ,kBAAC,GAAD;MAAa,WAAU;gBACpB,EACC,gCACA,8MACD;MACW,CAAA;KACV,EAAA,CAAA,CACF;OAEL,EAAU,WAAW,IACpB,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAC1C,kBAAC,GAAD;KACE,cAAa;KACb,OAAO,EAAG,mCAAmC,wCAAwC;KACrF,aAAa,EACX,yCACA,qIACD;KACD,CAAA;IACQ,CAAA,GAEZ,kBAAC,MAAD;IAAI,WAAU;cACX,EAAU,KAAK,MACd,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;KACE,MAAK;KACL,eAAe,EAAS,GAAG,EAAS,GAAG,EAAI,GAAG,iBAAiB;KAC/D,WAAU;eAHZ,CAKE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,GAAD;QAAU,MAAM;QAAI,eAAY;QAAS,CAAA;OACrC,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACV,EAAI;QACH,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAAb,CAA6E,KACzE,EAAI,KACJ;UACA;SACF;SACN,kBAAC,GAAD;MACE,MAAM;MACN,WAAU;MACV,eAAY;MACZ,CAAA,CACK;QACN,EAzBI,EAAI,GAyBR,CACL;IACC,CAAA,CAEH;;EACF,CAAA"}
1
+ {"version":3,"file":"InvitePeoplePage.js","names":["InvitePeoplePage","tr","useTr","useOrgConsole","useMyOrganizations","orgIds","useMemo","organizations","o","permLoading","permError","useOrgsWithPermission","invitable","allowedIds","autoRedirected","setAutoRedirected","useState","useEffect","loading","navigate","basePath","LoadingState","error","ErrorState","UserPlus","PagePurpose","GlassCard","IllustratedEmptyState","org","Building","ChevronRight"],"sources":["../../../../../src/organization-management/modules/members/pages/InvitePeoplePage.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { Building, ChevronRight, UserPlus } from 'lucide-react';\nimport { GlassCard, IllustratedEmptyState, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useMyOrganizations } from '../../organizations/hooks/useOrganizations';\nimport { useOrgsWithPermission } from '../../organizations/hooks/useOrgsWithPermission';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { ErrorState } from '../../../shared/components/feedback/ErrorState';\nimport { useTr } from '../../../shared/hooks/useTr';\nimport { useOrganizationPageView } from '../../../hooks/useOrganizationPageView';\n\n/**\n * InvitePeoplePage\n *\n * Globally-reachable entry point (sidebar nav item) for inviting users.\n * Lists the orgs the current user can invite into, then deep-links into\n * each org's existing `members/invite` page so the invite flow itself\n * remains a single source of truth.\n *\n * If the user has exactly one org with invite permission, redirect\n * straight to that org's invite page — saves a click for the common case.\n */\nexport function InvitePeoplePage() {\n useOrganizationPageView('organizations.invite-people');\n const tr = useTr();\n const { navigate, basePath = '/organizations' } = useOrgConsole();\n const { organizations, loading, error } = useMyOrganizations(100, 0);\n\n const orgIds = useMemo(() => organizations.map((o) => o.id), [organizations]);\n const {\n allowedIds,\n loading: permLoading,\n isError: permError,\n } = useOrgsWithPermission(orgIds, 'member', 'create');\n\n const invitable = useMemo(\n () => organizations.filter((o) => allowedIds.has(o.id)),\n [organizations, allowedIds]\n );\n\n const [autoRedirected, setAutoRedirected] = useState(false);\n useEffect(() => {\n if (autoRedirected) return;\n if (loading || permLoading) return;\n if (invitable.length === 1) {\n setAutoRedirected(true);\n navigate(`${basePath}/${invitable[0].id}/members/invite`);\n }\n }, [autoRedirected, loading, permLoading, invitable, navigate, basePath]);\n\n if (loading || permLoading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <LoadingState message={tr('common.loading', 'Loading...')} />\n </div>\n );\n }\n\n if (error || permError) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <ErrorState\n message={\n error?.message ||\n tr('members.invitePeople.error', 'Failed to load organizations for invite.')\n }\n />\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6 animate-in fade-in duration-200\">\n <div className=\"mx-auto max-w-3xl space-y-6\">\n <div className=\"flex items-center gap-3\">\n <UserPlus size={24} className=\"text-[var(--color-text-primary)]\" aria-hidden=\"true\" />\n <div>\n <h1 className=\"text-2xl font-bold text-[var(--color-text-primary)]\">\n {tr('members.invitePeople.title', 'Invite People')}\n </h1>\n <p className=\"mt-1 text-sm text-[var(--color-text-secondary)]\">\n {tr(\n 'members.invitePeople.subtitle',\n 'Pick an organization to send an invite into. You can also invite from any organization or workspace detail page.'\n )}\n </p>\n <PagePurpose className=\"mt-2 max-w-2xl\">\n {tr(\n 'members.invitePeople.purpose',\n 'This is the quickest way to bring a new person on board — choose which organization to invite them into, then send the invite. They will get an invitation they can accept to join and start collaborating.'\n )}\n </PagePurpose>\n </div>\n </div>\n\n {invitable.length === 0 ? (\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam p-6\">\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title={tr('members.invitePeople.emptyTitle', 'No organizations where you can invite')}\n description={tr(\n 'members.invitePeople.emptyDescription',\n \"You don't currently have permission to invite members into any organization. Ask an organization admin to grant you invite access.\"\n )}\n />\n </GlassCard>\n ) : (\n <ul className=\"divide-y divide-[var(--color-border-seam)] overflow-hidden rounded-card border border-border-seam bg-bg-surface shadow-elevation-1\">\n {invitable.map((org) => (\n <li key={org.id}>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${org.id}/members/invite`)}\n className=\"flex w-full items-center justify-between gap-4 px-5 py-4 text-left transition-colors hover:bg-[var(--color-bg-subtle)]\"\n >\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex size-10 items-center justify-center rounded-lg bg-[var(--color-status-info-bgSubtle)] text-[var(--color-status-info-text)]\">\n <Building size={20} aria-hidden=\"true\" />\n </div>\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-semibold text-[var(--color-text-primary)]\">\n {org.name}\n </p>\n <p className=\"truncate font-mono text-xs text-[var(--color-text-secondary)]\">\n /{org.slug}\n </p>\n </div>\n </div>\n <ChevronRight\n size={18}\n className=\"shrink-0 text-[var(--color-text-secondary)]\"\n aria-hidden=\"true\"\n />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { useOrgConsole as e } from "../../../providers/OrgConsoleProvider.js";
2
- import { useTr as t } from "../../../shared/hooks/useTr.js";
3
- import { LoadingState as n } from "../../../shared/components/feedback/LoadingState.js";
4
- import { ErrorState as r } from "../../../shared/components/feedback/ErrorState.js";
5
- import { PERMISSIONS as i } from "../../../constants/permissions.js";
6
- import { MemberRoleBadge as a } from "../components/MemberRoleBadge.js";
7
- import { useMember as o } from "../hooks/useMembers.js";
2
+ import { useMember as t } from "../hooks/useMembers.js";
3
+ import { MemberRoleBadge as n } from "../components/MemberRoleBadge.js";
4
+ import { LoadingState as r } from "../../../shared/components/feedback/LoadingState.js";
5
+ import { ErrorState as i } from "../../../shared/components/feedback/ErrorState.js";
6
+ import { PERMISSIONS as a } from "../../../constants/permissions.js";
7
+ import { useTr as o } from "../../../shared/hooks/useTr.js";
8
8
  import { useMemo as s } from "react";
9
9
  import { ArrowLeft as c, Shield as l } from "lucide-react";
10
10
  import { EmphasisPanel as u, GlassCard as d, PagePurpose as f } from "@burdenoff/fe-libs/ui";
@@ -12,28 +12,28 @@ import { usePermissions as p } from "@burdenoff/fe-libs/shared/providers/shell";
12
12
  import { jsx as m, jsxs as h } from "react/jsx-runtime";
13
13
  import { useParams as g } from "react-router";
14
14
  import { buildActorFallback as _, useActorProfiles as v } from "@burdenoff/fe-libs/shared";
15
- //#region src/organization-management/modules/members/pages/MemberDetailPage.tsx
15
+ // src/organization-management/modules/members/pages/MemberDetailPage.tsx
16
16
  function y() {
17
- let y = t(), { organizationId: b, userId: x } = g(), { navigate: S, basePath: C = "/organizations", apiGatewayUrl: w, authToken: T } = e(), { hasPermission: E, isLoading: D } = p(), { member: O, loading: k, error: A } = o(b, x), j = v(s(() => x ? [{
17
+ let y = o(), { organizationId: b, userId: x } = g(), { navigate: S, basePath: C = "/organizations", apiGatewayUrl: w, authToken: T } = e(), { hasPermission: E, isLoading: D } = p(), { member: O, loading: k, error: A } = t(b, x), j = s(() => x ? [{
18
18
  actorId: x,
19
19
  actorType: "user"
20
- }] : [], [x]), {
20
+ }] : [], [x]), M = v(j, {
21
21
  apiGatewayUrl: w,
22
22
  authToken: T,
23
23
  orgId: b
24
- }), M = x && O ? j[O.userId] ?? _({
24
+ }), N = x && O ? M[O.userId] ?? _({
25
25
  actorId: O.userId,
26
26
  actorType: "user"
27
27
  }) : null;
28
28
  return D ? /* @__PURE__ */ m("div", {
29
29
  className: "min-h-full bg-[var(--color-bg-canvas)] p-6",
30
- children: /* @__PURE__ */ m(n, { message: y("common.loadingPermissions", "Loading permissions...") })
31
- }) : E(i.MEMBER_READ) ? k ? /* @__PURE__ */ m("div", {
30
+ children: /* @__PURE__ */ m(r, { message: y("common.loadingPermissions", "Loading permissions...") })
31
+ }) : E(a.MEMBER_READ) ? k ? /* @__PURE__ */ m("div", {
32
32
  className: "min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6",
33
- children: /* @__PURE__ */ m(n, { message: y("members.detail.loading", "Loading member...") })
33
+ children: /* @__PURE__ */ m(r, { message: y("members.detail.loading", "Loading member...") })
34
34
  }) : A || !O ? /* @__PURE__ */ m("div", {
35
35
  className: "min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6",
36
- children: /* @__PURE__ */ m(r, {
36
+ children: /* @__PURE__ */ m(i, {
37
37
  message: A?.message || y("members.detail.notFound", "Member not found"),
38
38
  action: {
39
39
  label: y("common.goBack", "Go Back"),
@@ -60,11 +60,11 @@ function y() {
60
60
  }), /* @__PURE__ */ h("div", { children: [
61
61
  /* @__PURE__ */ m("h1", {
62
62
  className: "text-3xl font-bold text-[var(--color-text-primary)]",
63
- children: M?.displayName ?? y("members.detail.titlePrefix", "Member")
63
+ children: N?.displayName ?? y("members.detail.titlePrefix", "Member")
64
64
  }),
65
- M?.email ? /* @__PURE__ */ m("p", {
65
+ N?.email ? /* @__PURE__ */ m("p", {
66
66
  className: "text-[var(--color-text-secondary)] mt-1 break-all",
67
- children: M.email
67
+ children: N.email
68
68
  }) : null,
69
69
  /* @__PURE__ */ m("p", {
70
70
  className: "text-[var(--color-text-secondary)] mt-1",
@@ -111,7 +111,7 @@ function y() {
111
111
  children: y("members.list.column.role", "Role")
112
112
  }), /* @__PURE__ */ m("div", {
113
113
  className: "mt-1",
114
- children: /* @__PURE__ */ m(a, { role: O.role })
114
+ children: /* @__PURE__ */ m(n, { role: O.role })
115
115
  })] }),
116
116
  O.invitedBy && /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
117
117
  className: "text-sm text-[var(--color-text-secondary)]",
@@ -138,7 +138,6 @@ function y() {
138
138
  })
139
139
  });
140
140
  }
141
- //#endregion
142
141
  export { y as MemberDetailPage };
143
142
 
144
143
  //# sourceMappingURL=MemberDetailPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MemberDetailPage.js","names":[],"sources":["../../../../../src/organization-management/modules/members/pages/MemberDetailPage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useParams } from 'react-router';\nimport { ArrowLeft, Shield } from 'lucide-react';\nimport { EmphasisPanel, GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { buildActorFallback, useActorProfiles, type ActorInput } from '@burdenoff/fe-libs/shared';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useMember } from '../hooks/useMembers';\nimport { MemberRoleBadge } from '../components/MemberRoleBadge';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { ErrorState } from '../../../shared/components/feedback/ErrorState';\nimport { PERMISSIONS } from '../../../constants/permissions';\nimport { useTr } from '../../../shared/hooks/useTr';\n\n/**\n * Member Detail Page\n * Simplified version showing available member fields\n */\nexport function MemberDetailPage() {\n const tr = useTr();\n const { organizationId, userId } = useParams<{ organizationId: string; userId: string }>();\n const { navigate, basePath = '/organizations', apiGatewayUrl, authToken } = useOrgConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const { member, loading, error } = useMember(organizationId!, userId!);\n\n const memberActors = useMemo<ActorInput[]>(\n () => (userId ? [{ actorId: userId, actorType: 'user' }] : []),\n [userId]\n );\n const profileMap = useActorProfiles(memberActors, {\n apiGatewayUrl,\n authToken,\n orgId: organizationId,\n });\n const memberProfile =\n userId && member\n ? (profileMap[member.userId] ??\n buildActorFallback({ actorId: member.userId, actorType: 'user' }))\n : null;\n\n if (permissionsLoading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <LoadingState message={tr('common.loadingPermissions', 'Loading permissions...')} />\n </div>\n );\n }\n\n if (!hasPermission(PERMISSIONS.MEMBER_READ)) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <div className=\"p-8 text-center text-[var(--color-text-secondary)]\">\n {tr('members.detail.noPermission', \"You don't have permission to view member details.\")}\n </div>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6\">\n <LoadingState message={tr('members.detail.loading', 'Loading member...')} />\n </div>\n );\n }\n\n if (error || !member) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6\">\n <ErrorState\n message={error?.message || tr('members.detail.notFound', 'Member not found')}\n action={{\n label: tr('common.goBack', 'Go Back'),\n onClick: () => navigate(`${basePath}/${organizationId}/members`),\n }}\n />\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6 animate-in fade-in duration-200\">\n {/* Header */}\n <div className=\"mb-6\">\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${organizationId}/members`)}\n className=\"inline-flex items-center gap-2 text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] transition-all duration-200 mb-4\"\n >\n <ArrowLeft size={20} />\n {tr('members.detail.backToMembers', 'Back to Members')}\n </button>\n\n <EmphasisPanel className=\"flex items-start gap-4\">\n <div className=\"size-16 rounded-full bg-[var(--color-status-info-muted)] flex items-center justify-center\">\n <Shield size={32} className=\"text-[var(--color-status-info)]\" />\n </div>\n <div>\n <h1 className=\"text-3xl font-bold text-[var(--color-text-primary)]\">\n {memberProfile?.displayName ?? tr('members.detail.titlePrefix', 'Member')}\n </h1>\n {memberProfile?.email ? (\n <p className=\"text-[var(--color-text-secondary)] mt-1 break-all\">\n {memberProfile.email}\n </p>\n ) : null}\n <p className=\"text-[var(--color-text-secondary)] mt-1\">{member.role}</p>\n <PagePurpose className=\"mt-3 max-w-2xl\">\n {tr(\n 'members.detail.purpose',\n \"This page shows one person's membership in the organization — their role, when they joined, and who invited them. Use it to confirm a member has the right level of access.\"\n )}\n </PagePurpose>\n <details className=\"mt-2 text-xs text-[var(--color-text-secondary)]\">\n <summary className=\"cursor-pointer\">\n {tr('members.detail.showIds', 'Show technical IDs')}\n </summary>\n <dl className=\"mt-1 grid grid-cols-[auto_1fr] gap-x-3 gap-y-1\">\n <dt>{tr('members.detail.userId', 'User ID')}</dt>\n <dd className=\"break-all font-mono\">{member.userId}</dd>\n <dt>{tr('members.list.memberId', 'Member ID')}</dt>\n <dd className=\"break-all font-mono\">{member.id}</dd>\n </dl>\n </details>\n </div>\n </EmphasisPanel>\n </div>\n\n {/* Details */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <h2 className=\"text-lg font-semibold text-[var(--color-text-primary)] mb-4\">\n {tr('members.detail.info', 'Member Information')}\n </h2>\n\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-[var(--color-text-secondary)]\">\n {tr('members.list.column.role', 'Role')}\n </p>\n <div className=\"mt-1\">\n <MemberRoleBadge role={member.role} />\n </div>\n </div>\n\n {member.invitedBy && (\n <div>\n <p className=\"text-sm text-[var(--color-text-secondary)]\">\n {tr('members.detail.invitedBy', 'Invited By')}\n </p>\n <p className=\"text-[var(--color-text-primary)] font-medium\">{member.invitedBy}</p>\n </div>\n )}\n\n {member.joinedAt && (\n <div>\n <p className=\"text-sm text-[var(--color-text-secondary)]\">\n {tr('members.detail.joinedAt', 'Joined At')}\n </p>\n <p className=\"text-[var(--color-text-primary)] font-medium\">\n {new Date(member.joinedAt).toLocaleString()}\n </p>\n </div>\n )}\n </div>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"MemberDetailPage.js","names":["MemberDetailPage","tr","useTr","useParams","useOrgConsole","permissionsLoading","usePermissions","useMember","organizationId","userId","memberActors","useMemo","profileMap","useActorProfiles","memberProfile","member","buildActorFallback","LoadingState","hasPermission","PERMISSIONS","loading","error","ErrorState","navigate","basePath","ArrowLeft","EmphasisPanel","Shield","PagePurpose","GlassCard","MemberRoleBadge"],"sources":["../../../../../src/organization-management/modules/members/pages/MemberDetailPage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useParams } from 'react-router';\nimport { ArrowLeft, Shield } from 'lucide-react';\nimport { EmphasisPanel, GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { buildActorFallback, useActorProfiles, type ActorInput } from '@burdenoff/fe-libs/shared';\nimport { useOrgConsole } from '../../../providers/OrgConsoleProvider';\nimport { useMember } from '../hooks/useMembers';\nimport { MemberRoleBadge } from '../components/MemberRoleBadge';\nimport { LoadingState } from '../../../shared/components/feedback/LoadingState';\nimport { ErrorState } from '../../../shared/components/feedback/ErrorState';\nimport { PERMISSIONS } from '../../../constants/permissions';\nimport { useTr } from '../../../shared/hooks/useTr';\n\n/**\n * Member Detail Page\n * Simplified version showing available member fields\n */\nexport function MemberDetailPage() {\n const tr = useTr();\n const { organizationId, userId } = useParams<{ organizationId: string; userId: string }>();\n const { navigate, basePath = '/organizations', apiGatewayUrl, authToken } = useOrgConsole();\n const { hasPermission, isLoading: permissionsLoading } = usePermissions();\n const { member, loading, error } = useMember(organizationId!, userId!);\n\n const memberActors = useMemo<ActorInput[]>(\n () => (userId ? [{ actorId: userId, actorType: 'user' }] : []),\n [userId]\n );\n const profileMap = useActorProfiles(memberActors, {\n apiGatewayUrl,\n authToken,\n orgId: organizationId,\n });\n const memberProfile =\n userId && member\n ? (profileMap[member.userId] ??\n buildActorFallback({ actorId: member.userId, actorType: 'user' }))\n : null;\n\n if (permissionsLoading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <LoadingState message={tr('common.loadingPermissions', 'Loading permissions...')} />\n </div>\n );\n }\n\n if (!hasPermission(PERMISSIONS.MEMBER_READ)) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] p-6\">\n <div className=\"p-8 text-center text-[var(--color-text-secondary)]\">\n {tr('members.detail.noPermission', \"You don't have permission to view member details.\")}\n </div>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6\">\n <LoadingState message={tr('members.detail.loading', 'Loading member...')} />\n </div>\n );\n }\n\n if (error || !member) {\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6\">\n <ErrorState\n message={error?.message || tr('members.detail.notFound', 'Member not found')}\n action={{\n label: tr('common.goBack', 'Go Back'),\n onClick: () => navigate(`${basePath}/${organizationId}/members`),\n }}\n />\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6 animate-in fade-in duration-200\">\n {/* Header */}\n <div className=\"mb-6\">\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${organizationId}/members`)}\n className=\"inline-flex items-center gap-2 text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] transition-all duration-200 mb-4\"\n >\n <ArrowLeft size={20} />\n {tr('members.detail.backToMembers', 'Back to Members')}\n </button>\n\n <EmphasisPanel className=\"flex items-start gap-4\">\n <div className=\"size-16 rounded-full bg-[var(--color-status-info-muted)] flex items-center justify-center\">\n <Shield size={32} className=\"text-[var(--color-status-info)]\" />\n </div>\n <div>\n <h1 className=\"text-3xl font-bold text-[var(--color-text-primary)]\">\n {memberProfile?.displayName ?? tr('members.detail.titlePrefix', 'Member')}\n </h1>\n {memberProfile?.email ? (\n <p className=\"text-[var(--color-text-secondary)] mt-1 break-all\">\n {memberProfile.email}\n </p>\n ) : null}\n <p className=\"text-[var(--color-text-secondary)] mt-1\">{member.role}</p>\n <PagePurpose className=\"mt-3 max-w-2xl\">\n {tr(\n 'members.detail.purpose',\n \"This page shows one person's membership in the organization — their role, when they joined, and who invited them. Use it to confirm a member has the right level of access.\"\n )}\n </PagePurpose>\n <details className=\"mt-2 text-xs text-[var(--color-text-secondary)]\">\n <summary className=\"cursor-pointer\">\n {tr('members.detail.showIds', 'Show technical IDs')}\n </summary>\n <dl className=\"mt-1 grid grid-cols-[auto_1fr] gap-x-3 gap-y-1\">\n <dt>{tr('members.detail.userId', 'User ID')}</dt>\n <dd className=\"break-all font-mono\">{member.userId}</dd>\n <dt>{tr('members.list.memberId', 'Member ID')}</dt>\n <dd className=\"break-all font-mono\">{member.id}</dd>\n </dl>\n </details>\n </div>\n </EmphasisPanel>\n </div>\n\n {/* Details */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <h2 className=\"text-lg font-semibold text-[var(--color-text-primary)] mb-4\">\n {tr('members.detail.info', 'Member Information')}\n </h2>\n\n <div className=\"space-y-4\">\n <div>\n <p className=\"text-sm text-[var(--color-text-secondary)]\">\n {tr('members.list.column.role', 'Role')}\n </p>\n <div className=\"mt-1\">\n <MemberRoleBadge role={member.role} />\n </div>\n </div>\n\n {member.invitedBy && (\n <div>\n <p className=\"text-sm text-[var(--color-text-secondary)]\">\n {tr('members.detail.invitedBy', 'Invited By')}\n </p>\n <p className=\"text-[var(--color-text-primary)] font-medium\">{member.invitedBy}</p>\n </div>\n )}\n\n {member.joinedAt && (\n <div>\n <p className=\"text-sm text-[var(--color-text-secondary)]\">\n {tr('members.detail.joinedAt', 'Joined At')}\n </p>\n <p className=\"text-[var(--color-text-primary)] font-medium\">\n {new Date(member.joinedAt).toLocaleString()}\n </p>\n </div>\n )}\n </div>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":"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"}