@burdenoff/microfe-organization 2026.625.3 → 2026.731.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 (29) hide show
  1. package/dist/organization-management/modules/members/pages/InviteMemberPage.js +58 -53
  2. package/dist/organization-management/modules/members/pages/InviteMemberPage.js.map +1 -1
  3. package/dist/organization-management/modules/members/pages/InvitePeoplePage.js +47 -40
  4. package/dist/organization-management/modules/members/pages/InvitePeoplePage.js.map +1 -1
  5. package/dist/organization-management/modules/members/pages/MemberDetailPage.js +72 -68
  6. package/dist/organization-management/modules/members/pages/MemberDetailPage.js.map +1 -1
  7. package/dist/organization-management/modules/members/pages/MembersListPage.js +216 -208
  8. package/dist/organization-management/modules/members/pages/MembersListPage.js.map +1 -1
  9. package/dist/organization-management/modules/members/pages/MyInvitesPage.js +164 -158
  10. package/dist/organization-management/modules/members/pages/MyInvitesPage.js.map +1 -1
  11. package/dist/organization-management/modules/members/pages/OrganizationInviteAcceptancePage.js +132 -128
  12. package/dist/organization-management/modules/members/pages/OrganizationInviteAcceptancePage.js.map +1 -1
  13. package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js +42 -37
  14. package/dist/organization-management/modules/organizations/pages/OrganizationCreatePage.js.map +1 -1
  15. package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js +310 -258
  16. package/dist/organization-management/modules/organizations/pages/OrganizationDetailPage.js.map +1 -1
  17. package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js +52 -47
  18. package/dist/organization-management/modules/organizations/pages/OrganizationEditPage.js.map +1 -1
  19. package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js +66 -59
  20. package/dist/organization-management/modules/organizations/pages/OrganizationsListPage.js.map +1 -1
  21. package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js +43 -38
  22. package/dist/organization-management/modules/workspaces/pages/WorkspaceCreatePage.js.map +1 -1
  23. package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js +315 -258
  24. package/dist/organization-management/modules/workspaces/pages/WorkspaceDetailPage.js.map +1 -1
  25. package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js +50 -45
  26. package/dist/organization-management/modules/workspaces/pages/WorkspaceEditPage.js.map +1 -1
  27. package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js +246 -238
  28. package/dist/organization-management/modules/workspaces/pages/WorkspacesListPage.js.map +1 -1
  29. package/package.json +7 -7
@@ -7,134 +7,138 @@ import { MemberRoleBadge as a } from "../components/MemberRoleBadge.js";
7
7
  import { useMember as o } from "../hooks/useMembers.js";
8
8
  import { useMemo as s } from "react";
9
9
  import { ArrowLeft as c, Shield as l } from "lucide-react";
10
- import { EmphasisPanel as u, GlassCard as d } from "@burdenoff/fe-libs/ui";
11
- import { usePermissions as f } from "@burdenoff/fe-libs/shared/providers/shell";
12
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
13
- import { useParams as h } from "react-router-dom";
14
- import { buildActorFallback as g, useActorProfiles as _ } from "@burdenoff/fe-libs/shared";
10
+ import { EmphasisPanel as u, GlassCard as d, PagePurpose as f } from "@burdenoff/fe-libs/ui";
11
+ import { usePermissions as p } from "@burdenoff/fe-libs/shared/providers/shell";
12
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
13
+ import { useParams as g } from "react-router-dom";
14
+ import { buildActorFallback as _, useActorProfiles as v } from "@burdenoff/fe-libs/shared";
15
15
  //#region src/organization-management/modules/members/pages/MemberDetailPage.tsx
16
- function v() {
17
- let v = t(), { organizationId: y, userId: b } = h(), { navigate: x, basePath: S = "/organizations", apiGatewayUrl: C, authToken: w } = e(), { hasPermission: T, isLoading: E } = f(), { member: D, loading: O, error: k } = o(y, b), A = _(s(() => b ? [{
18
- actorId: b,
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 ? [{
18
+ actorId: x,
19
19
  actorType: "user"
20
- }] : [], [b]), {
21
- apiGatewayUrl: C,
22
- authToken: w,
23
- orgId: y
24
- }), j = b && D ? A[D.userId] ?? g({
25
- actorId: D.userId,
20
+ }] : [], [x]), {
21
+ apiGatewayUrl: w,
22
+ authToken: T,
23
+ orgId: b
24
+ }), M = x && O ? j[O.userId] ?? _({
25
+ actorId: O.userId,
26
26
  actorType: "user"
27
27
  }) : null;
28
- return E ? /* @__PURE__ */ p("div", {
28
+ return D ? /* @__PURE__ */ m("div", {
29
29
  className: "min-h-full bg-[var(--color-bg-canvas)] p-6",
30
- children: /* @__PURE__ */ p(n, { message: v("common.loadingPermissions", "Loading permissions...") })
31
- }) : T(i.MEMBER_READ) ? O ? /* @__PURE__ */ p("div", {
30
+ children: /* @__PURE__ */ m(n, { message: y("common.loadingPermissions", "Loading permissions...") })
31
+ }) : E(i.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__ */ p(n, { message: v("members.detail.loading", "Loading member...") })
34
- }) : k || !D ? /* @__PURE__ */ p("div", {
33
+ children: /* @__PURE__ */ m(n, { message: y("members.detail.loading", "Loading member...") })
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__ */ p(r, {
37
- message: k?.message || v("members.detail.notFound", "Member not found"),
36
+ children: /* @__PURE__ */ m(r, {
37
+ message: A?.message || y("members.detail.notFound", "Member not found"),
38
38
  action: {
39
- label: v("common.goBack", "Go Back"),
40
- onClick: () => x(`${S}/${y}/members`)
39
+ label: y("common.goBack", "Go Back"),
40
+ onClick: () => S(`${C}/${b}/members`)
41
41
  }
42
42
  })
43
- }) : /* @__PURE__ */ m("div", {
43
+ }) : /* @__PURE__ */ h("div", {
44
44
  className: "min-h-full bg-[var(--color-bg-canvas)] px-4 py-6 sm:px-6 animate-in fade-in duration-200",
45
- children: [/* @__PURE__ */ m("div", {
45
+ children: [/* @__PURE__ */ h("div", {
46
46
  className: "mb-6",
47
- children: [/* @__PURE__ */ m("button", {
47
+ children: [/* @__PURE__ */ h("button", {
48
48
  type: "button",
49
- onClick: () => x(`${S}/${y}/members`),
49
+ onClick: () => S(`${C}/${b}/members`),
50
50
  className: "inline-flex items-center gap-2 text-[var(--color-text-secondary)] hover:text-[var(--color-text-primary)] transition-all duration-200 mb-4",
51
- children: [/* @__PURE__ */ p(c, { size: 20 }), v("members.detail.backToMembers", "Back to Members")]
52
- }), /* @__PURE__ */ m(u, {
51
+ children: [/* @__PURE__ */ m(c, { size: 20 }), y("members.detail.backToMembers", "Back to Members")]
52
+ }), /* @__PURE__ */ h(u, {
53
53
  className: "flex items-start gap-4",
54
- children: [/* @__PURE__ */ p("div", {
54
+ children: [/* @__PURE__ */ m("div", {
55
55
  className: "size-16 rounded-full bg-[var(--color-status-info-muted)] flex items-center justify-center",
56
- children: /* @__PURE__ */ p(l, {
56
+ children: /* @__PURE__ */ m(l, {
57
57
  size: 32,
58
58
  className: "text-[var(--color-status-info)]"
59
59
  })
60
- }), /* @__PURE__ */ m("div", { children: [
61
- /* @__PURE__ */ p("h1", {
60
+ }), /* @__PURE__ */ h("div", { children: [
61
+ /* @__PURE__ */ m("h1", {
62
62
  className: "text-3xl font-bold text-[var(--color-text-primary)]",
63
- children: j?.displayName ?? v("members.detail.titlePrefix", "Member")
63
+ children: M?.displayName ?? y("members.detail.titlePrefix", "Member")
64
64
  }),
65
- j?.email ? /* @__PURE__ */ p("p", {
65
+ M?.email ? /* @__PURE__ */ m("p", {
66
66
  className: "text-[var(--color-text-secondary)] mt-1 break-all",
67
- children: j.email
67
+ children: M.email
68
68
  }) : null,
69
- /* @__PURE__ */ p("p", {
69
+ /* @__PURE__ */ m("p", {
70
70
  className: "text-[var(--color-text-secondary)] mt-1",
71
- children: D.role
71
+ children: O.role
72
+ }),
73
+ /* @__PURE__ */ m(f, {
74
+ className: "mt-3 max-w-2xl",
75
+ children: y("members.detail.purpose", "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.")
72
76
  }),
73
- /* @__PURE__ */ m("details", {
77
+ /* @__PURE__ */ h("details", {
74
78
  className: "mt-2 text-xs text-[var(--color-text-secondary)]",
75
- children: [/* @__PURE__ */ p("summary", {
79
+ children: [/* @__PURE__ */ m("summary", {
76
80
  className: "cursor-pointer",
77
- children: v("members.detail.showIds", "Show technical IDs")
78
- }), /* @__PURE__ */ m("dl", {
81
+ children: y("members.detail.showIds", "Show technical IDs")
82
+ }), /* @__PURE__ */ h("dl", {
79
83
  className: "mt-1 grid grid-cols-[auto_1fr] gap-x-3 gap-y-1",
80
84
  children: [
81
- /* @__PURE__ */ p("dt", { children: v("members.detail.userId", "User ID") }),
82
- /* @__PURE__ */ p("dd", {
85
+ /* @__PURE__ */ m("dt", { children: y("members.detail.userId", "User ID") }),
86
+ /* @__PURE__ */ m("dd", {
83
87
  className: "break-all font-mono",
84
- children: D.userId
88
+ children: O.userId
85
89
  }),
86
- /* @__PURE__ */ p("dt", { children: v("members.list.memberId", "Member ID") }),
87
- /* @__PURE__ */ p("dd", {
90
+ /* @__PURE__ */ m("dt", { children: y("members.list.memberId", "Member ID") }),
91
+ /* @__PURE__ */ m("dd", {
88
92
  className: "break-all font-mono",
89
- children: D.id
93
+ children: O.id
90
94
  })
91
95
  ]
92
96
  })]
93
97
  })
94
98
  ] })]
95
99
  })]
96
- }), /* @__PURE__ */ m(d, {
100
+ }), /* @__PURE__ */ h(d, {
97
101
  treatment: "plain",
98
102
  className: "border-border-seam p-6",
99
- children: [/* @__PURE__ */ p("h2", {
103
+ children: [/* @__PURE__ */ m("h2", {
100
104
  className: "text-lg font-semibold text-[var(--color-text-primary)] mb-4",
101
- children: v("members.detail.info", "Member Information")
102
- }), /* @__PURE__ */ m("div", {
105
+ children: y("members.detail.info", "Member Information")
106
+ }), /* @__PURE__ */ h("div", {
103
107
  className: "space-y-4",
104
108
  children: [
105
- /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
109
+ /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
106
110
  className: "text-sm text-[var(--color-text-secondary)]",
107
- children: v("members.list.column.role", "Role")
108
- }), /* @__PURE__ */ p("div", {
111
+ children: y("members.list.column.role", "Role")
112
+ }), /* @__PURE__ */ m("div", {
109
113
  className: "mt-1",
110
- children: /* @__PURE__ */ p(a, { role: D.role })
114
+ children: /* @__PURE__ */ m(a, { role: O.role })
111
115
  })] }),
112
- D.invitedBy && /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
116
+ O.invitedBy && /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
113
117
  className: "text-sm text-[var(--color-text-secondary)]",
114
- children: v("members.detail.invitedBy", "Invited By")
115
- }), /* @__PURE__ */ p("p", {
118
+ children: y("members.detail.invitedBy", "Invited By")
119
+ }), /* @__PURE__ */ m("p", {
116
120
  className: "text-[var(--color-text-primary)] font-medium",
117
- children: D.invitedBy
121
+ children: O.invitedBy
118
122
  })] }),
119
- D.joinedAt && /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
123
+ O.joinedAt && /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
120
124
  className: "text-sm text-[var(--color-text-secondary)]",
121
- children: v("members.detail.joinedAt", "Joined At")
122
- }), /* @__PURE__ */ p("p", {
125
+ children: y("members.detail.joinedAt", "Joined At")
126
+ }), /* @__PURE__ */ m("p", {
123
127
  className: "text-[var(--color-text-primary)] font-medium",
124
- children: new Date(D.joinedAt).toLocaleString()
128
+ children: new Date(O.joinedAt).toLocaleString()
125
129
  })] })
126
130
  ]
127
131
  })]
128
132
  })]
129
- }) : /* @__PURE__ */ p("div", {
133
+ }) : /* @__PURE__ */ m("div", {
130
134
  className: "min-h-full bg-[var(--color-bg-canvas)] p-6",
131
- children: /* @__PURE__ */ p("div", {
135
+ children: /* @__PURE__ */ m("div", {
132
136
  className: "p-8 text-center text-[var(--color-text-secondary)]",
133
- children: v("members.detail.noPermission", "You don't have permission to view member details.")
137
+ children: y("members.detail.noPermission", "You don't have permission to view member details.")
134
138
  })
135
139
  });
136
140
  }
137
141
  //#endregion
138
- export { v as MemberDetailPage };
142
+ export { y as MemberDetailPage };
139
143
 
140
144
  //# 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-dom';\nimport { ArrowLeft, Shield } from 'lucide-react';\nimport { EmphasisPanel, GlassCard } 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 <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":[],"sources":["../../../../../src/organization-management/modules/members/pages/MemberDetailPage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useParams } from 'react-router-dom';\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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"}