@stapel/workspaces-react 0.16.0 → 0.19.0

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 (128) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +39 -8
  3. package/dist/api/generated/schema.d.ts +187 -60
  4. package/dist/api/generated/schema.d.ts.map +1 -1
  5. package/dist/default/ActiveWorkspace.d.ts +43 -0
  6. package/dist/default/ActiveWorkspace.d.ts.map +1 -0
  7. package/dist/default/ActiveWorkspace.js +33 -0
  8. package/dist/default/ActiveWorkspace.js.map +1 -0
  9. package/dist/default/AuditTrailPane.d.ts +12 -0
  10. package/dist/default/AuditTrailPane.d.ts.map +1 -0
  11. package/dist/default/AuditTrailPane.js +154 -0
  12. package/dist/default/AuditTrailPane.js.map +1 -0
  13. package/dist/default/InvitationsPane.d.ts +19 -0
  14. package/dist/default/InvitationsPane.d.ts.map +1 -0
  15. package/dist/default/InvitationsPane.js +217 -0
  16. package/dist/default/InvitationsPane.js.map +1 -0
  17. package/dist/default/InviteAcceptPage.d.ts +7 -0
  18. package/dist/default/InviteAcceptPage.d.ts.map +1 -1
  19. package/dist/default/InviteAcceptPage.js +74 -38
  20. package/dist/default/InviteAcceptPage.js.map +1 -1
  21. package/dist/default/MembersManager.d.ts +12 -4
  22. package/dist/default/MembersManager.d.ts.map +1 -1
  23. package/dist/default/MembersManager.js +320 -84
  24. package/dist/default/MembersManager.js.map +1 -1
  25. package/dist/default/RoleSelectField.d.ts +64 -0
  26. package/dist/default/RoleSelectField.d.ts.map +1 -0
  27. package/dist/default/RoleSelectField.js +78 -0
  28. package/dist/default/RoleSelectField.js.map +1 -0
  29. package/dist/default/WorkspaceSettings.d.ts +7 -1
  30. package/dist/default/WorkspaceSettings.d.ts.map +1 -1
  31. package/dist/default/WorkspaceSettings.js +203 -45
  32. package/dist/default/WorkspaceSettings.js.map +1 -1
  33. package/dist/default/WorkspacesPage.d.ts +13 -0
  34. package/dist/default/WorkspacesPage.d.ts.map +1 -0
  35. package/dist/default/WorkspacesPage.js +108 -0
  36. package/dist/default/WorkspacesPage.js.map +1 -0
  37. package/dist/default/index.d.ts +28 -7
  38. package/dist/default/index.d.ts.map +1 -1
  39. package/dist/default/index.js +24 -7
  40. package/dist/default/index.js.map +1 -1
  41. package/dist/default/parts.d.ts +104 -0
  42. package/dist/default/parts.d.ts.map +1 -0
  43. package/dist/default/parts.js +140 -0
  44. package/dist/default/parts.js.map +1 -0
  45. package/dist/headless/Members.d.ts +59 -14
  46. package/dist/headless/Members.d.ts.map +1 -1
  47. package/dist/headless/Members.js +35 -10
  48. package/dist/headless/Members.js.map +1 -1
  49. package/dist/headless/RoleSelect.d.ts +9 -3
  50. package/dist/headless/RoleSelect.d.ts.map +1 -1
  51. package/dist/headless/RoleSelect.js +3 -2
  52. package/dist/headless/RoleSelect.js.map +1 -1
  53. package/dist/i18n/es.d.ts +11 -12
  54. package/dist/i18n/es.d.ts.map +1 -1
  55. package/dist/i18n/es.js +267 -14
  56. package/dist/i18n/es.js.map +1 -1
  57. package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -1
  58. package/dist/i18n/generated/errors.es.gen.js +5 -0
  59. package/dist/i18n/generated/errors.es.gen.js.map +1 -1
  60. package/dist/i18n/generated/errors.gen.d.ts +30 -0
  61. package/dist/i18n/generated/errors.gen.d.ts.map +1 -1
  62. package/dist/i18n/generated/errors.gen.js +15 -0
  63. package/dist/i18n/generated/errors.gen.js.map +1 -1
  64. package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -1
  65. package/dist/i18n/generated/errors.ru.gen.js +5 -0
  66. package/dist/i18n/generated/errors.ru.gen.js.map +1 -1
  67. package/dist/i18n/keys.d.ts +209 -1
  68. package/dist/i18n/keys.d.ts.map +1 -1
  69. package/dist/i18n/keys.js +410 -4
  70. package/dist/i18n/keys.js.map +1 -1
  71. package/dist/i18n/ru.d.ts +7 -2
  72. package/dist/i18n/ru.d.ts.map +1 -1
  73. package/dist/i18n/ru.js +209 -4
  74. package/dist/i18n/ru.js.map +1 -1
  75. package/dist/index.d.ts +2 -2
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +6 -2
  78. package/dist/index.js.map +1 -1
  79. package/dist/model/format.d.ts +56 -0
  80. package/dist/model/format.d.ts.map +1 -0
  81. package/dist/model/format.js +125 -0
  82. package/dist/model/format.js.map +1 -0
  83. package/dist/model/mandate.d.ts +23 -1
  84. package/dist/model/mandate.d.ts.map +1 -1
  85. package/dist/model/mandate.js +24 -0
  86. package/dist/model/mandate.js.map +1 -1
  87. package/dist/model/selection.d.ts +15 -0
  88. package/dist/model/selection.d.ts.map +1 -1
  89. package/dist/model/selection.js +18 -1
  90. package/dist/model/selection.js.map +1 -1
  91. package/dist/nav/manifest.d.ts +45 -0
  92. package/dist/nav/manifest.d.ts.map +1 -0
  93. package/dist/nav/manifest.js +77 -0
  94. package/dist/nav/manifest.js.map +1 -0
  95. package/llms.txt +11 -10
  96. package/manifest.json +282 -69
  97. package/package.json +18 -12
  98. package/src/analytics/generated/events.json +1 -1
  99. package/src/api/generated/schema.ts +187 -60
  100. package/src/default/ActiveWorkspace.tsx +97 -0
  101. package/src/default/AuditTrailPane.tsx +309 -0
  102. package/src/default/InvitationsPane.tsx +501 -0
  103. package/src/default/InviteAcceptPage.tsx +187 -90
  104. package/src/default/MembersManager.tsx +832 -222
  105. package/src/default/RoleSelectField.tsx +187 -0
  106. package/src/default/WorkspaceSettings.tsx +540 -125
  107. package/src/default/WorkspacesPage.tsx +387 -0
  108. package/src/default/index.ts +28 -7
  109. package/src/default/parts.tsx +308 -0
  110. package/src/headless/Members.tsx +84 -16
  111. package/src/headless/RoleSelect.tsx +12 -5
  112. package/src/i18n/es.ts +326 -14
  113. package/src/i18n/generated/errors.es.gen.ts +5 -0
  114. package/src/i18n/generated/errors.gen.ts +15 -0
  115. package/src/i18n/generated/errors.json +37 -0
  116. package/src/i18n/generated/errors.ru.gen.ts +5 -0
  117. package/src/i18n/keys.ts +462 -5
  118. package/src/i18n/ru.ts +259 -5
  119. package/src/index.ts +6 -1
  120. package/src/model/format.ts +158 -0
  121. package/src/model/mandate.ts +26 -1
  122. package/src/model/selection.tsx +19 -1
  123. package/src/nav/manifest.ts +120 -0
  124. package/dist/default/ErrorAlert.d.ts +0 -8
  125. package/dist/default/ErrorAlert.d.ts.map +0 -1
  126. package/dist/default/ErrorAlert.js +0 -30
  127. package/dist/default/ErrorAlert.js.map +0 -1
  128. package/src/default/ErrorAlert.tsx +0 -47
@@ -1,101 +1,337 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  /**
3
- * `<MembersManager/>` — default skin for the "members & roles" settings
4
- * screen (owner directive: workspace settings — name/members/roles/
5
- * invites). Built entirely on this pair's EXISTING `Members` headless
6
- * wrapper (`useMembers`/`useInviteMembers`/`useUpdateMemberRole`/
7
- * `useRemoveMember`) — no new backend surface.
3
+ * `<MembersManager/>` — the default skin for "who is in this workspace":
4
+ * the roster, an invite, a role change, a name correction, a removal, and a
5
+ * page walk that actually reaches the second page.
8
6
  *
9
- * Roles come from the EFFECTIVE registry via the `RoleSelect` headless
10
- * (GET /roles, org-program §A2) — not a hardcoded builtin four: a deployment
11
- * that overlays `STAPEL_WORKSPACES["ROLES"]` (e.g. a `secretary`) sees its
12
- * roles here with `workspaces.role.<key>` labels (client-bundle merge,
13
- * raw-name fallback). `owner` is offered only in the member-row select (the
14
- * backend enforces "only an owner grants owner" and last-owner protection);
15
- * the invite dialog filters it out, as before.
7
+ * Roles come from the EFFECTIVE registry via `<RoleSelectField/>` (GET /roles,
8
+ * org-program §A2) — never a hardcoded builtin four: a deployment that
9
+ * overlays `STAPEL_WORKSPACES["ROLES"]` (e.g. a `secretary`) sees its roles
10
+ * here, labelled by `workspaces.role.<key>` where a bundle carries one and
11
+ * title-cased from the key where it does not. `owner` is offered only on an
12
+ * existing member's row (the backend enforces "only an owner grants owner"
13
+ * and last-owner protection); the invite dialog leaves it out.
14
+ *
15
+ * ## What a row's controls are allowed to claim
16
+ *
17
+ * A control that offers an action the caller's situation makes impossible is
18
+ * a lie the backend then has to tell. Two such rows exist here, and the
19
+ * members contract answers only one of them:
20
+ *
21
+ * - **The last owner.** Answerable: `MemberResponse.role` is on every row and
22
+ * the page envelope says whether the page IS the roster
23
+ * (`MembersBag.rosterComplete`). With the whole roster in hand, "exactly
24
+ * one row holds `owner`" is a fact, so "Remove" on that row is switched off
25
+ * with the reason printed beside it. On any page of a longer roster nothing
26
+ * is claimed — a count of a page is not a count of the roster.
27
+ * - **The caller's own row.** Answerable only by the SERVER. This pair has no
28
+ * caller identity to compare `user_id` against (`@stapel/core`'s session
29
+ * exposes a STATUS, never a subject; the mandate axis resolves to
30
+ * `anonymous`/`guest`/`member`, never to a user id), and `my_role ===
31
+ * "owner"` does not make the caller the user in `owner_id` once more than
32
+ * one membership can hold the role — guessing would grey out somebody
33
+ * else's row. So the row is gated on `MemberResponse.is_self`, the
34
+ * server-derived flag (stapel-workspaces 0.30.0), and on nothing else: a
35
+ * build talking to a backend that does not send it claims nothing rather
36
+ * than guessing. See {@link isSelf}.
37
+ *
38
+ * `is_self` gates TWO controls, not one. `MemberPasswordResetView` refuses
39
+ * the caller's own row with the byte-identical 404 it gives for a stranger —
40
+ * correct on the server (one refusal shape, nothing to learn from the
41
+ * difference) and invisible to a client without this flag: an ungated "Reset
42
+ * password" on your own row comes back with a 404 that reads as "this member
43
+ * has been removed". Both controls therefore ask {@link isSelf} first.
44
+ *
45
+ * ## Two-factor evidence
46
+ *
47
+ * `MemberResponse.mfa_compliant` is true / false / **null**, and null is a
48
+ * state of its own — nobody has asked yet (WORK-01). Under a `require_mfa`
49
+ * policy those members are the ones an administrator acts on, so the column
50
+ * prints three different things and never folds the unknown into a "no".
16
51
  */
17
52
  import { useState } from "react";
18
- import { Button, Card, Empty, Input, Modal, Popconfirm, Select, Table, Typography } from "antd";
19
- import { loadedRowsOrEmpty, matchList, useErrorDisplay, useT } from "@stapel/core";
53
+ import { Button, Card, Flex, Input, Typography, theme as antdTheme } from "antd";
54
+ import { actionAvailable, actionBlocked, firstBlock, useT, useTPlural, } from "@stapel/core";
55
+ import { EmptyState, ErrorAlert, GatedButton, LoadList, SkinConfirm, SkinDialog, SkinTheme, } from "@stapel/tokens-antd/skin";
56
+ import { spacing } from "@stapel/tokens";
20
57
  import { Members } from "../headless/Members.js";
21
- import { RoleSelect } from "../headless/RoleSelect.js";
58
+ import { useResetMemberPassword } from "../model/mutations.js";
59
+ import { ActiveWorkspaceBoundary } from "./ActiveWorkspace.js";
60
+ import { useWorkspaceFormat } from "../model/format.js";
22
61
  import { WORKSPACES_I18N_KEYS } from "../i18n/keys.js";
23
- import { ErrorAlert } from "./ErrorAlert.js";
62
+ import { AnchorPager, Muted, PersonLine, RowActions, StatusTag } from "./parts.js";
63
+ import { RoleSelectField } from "./RoleSelectField.js";
24
64
  const DEFAULT_INVITE_ROLE = "member";
65
+ /** The system-protected role the backend's last-owner rule is about. */
66
+ const OWNER_ROLE = "owner";
67
+ /** The suspension the `require_mfa` sweep writes. Any other reason is shown
68
+ * as the plain "suspended" tag — this pair does not invent copy for a value
69
+ * the backend has not documented. */
70
+ const SUSPENDED_NO_MFA = "no_mfa";
71
+ const FIRST_PAGE = { anchor: undefined, direction: undefined, index: 1 };
72
+ /** A shape good enough to send: the backend answers `error.400.invalid_email`
73
+ * per address after a round trip, and finding out one at a time is the defect
74
+ * this closes. Deliberately loose — address validation belongs to the server;
75
+ * this only catches what is obviously not an address. */
76
+ function looksLikeEmail(value) {
77
+ return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
78
+ }
79
+ function splitEmails(text) {
80
+ return text
81
+ .split(/[,\s]+/)
82
+ .map((value) => value.trim())
83
+ .filter((value) => value.length > 0);
84
+ }
25
85
  export function MembersManager(props) {
86
+ return (_jsx(SkinTheme, { "data-testid": "members-manager", children: _jsx(ActiveWorkspaceBoundary, { workspaceId: props.workspaceId, testId: "members-manager-workspace", children: (workspaceId) => (_jsx(Roster, { workspaceId: workspaceId, canManage: props.canManage ?? true })) }) }));
87
+ }
88
+ /** The roster once the workspace is known — the walk and the filter live here
89
+ * because the cursor belongs to this screen's state, not to the bag's. */
90
+ function Roster(props) {
91
+ const [walk, setWalk] = useState(FIRST_PAGE);
92
+ const [search, setSearch] = useState("");
93
+ const params = {
94
+ ...(walk.anchor !== undefined ? { anchor: walk.anchor } : {}),
95
+ ...(walk.direction !== undefined ? { direction: walk.direction } : {}),
96
+ ...(search.trim() !== "" ? { search: search.trim() } : {}),
97
+ };
98
+ return (_jsx(Members, { workspaceId: props.workspaceId, params: params, children: (bag) => (_jsx(RosterCard, { bag: bag, workspaceId: props.workspaceId, canManage: props.canManage, walk: walk, search: search, onSearch: (value) => {
99
+ // A new filter is a new walk: an anchor from the old one points
100
+ // into a list that no longer exists.
101
+ setSearch(value);
102
+ setWalk(FIRST_PAGE);
103
+ }, onWalk: setWalk })) }));
104
+ }
105
+ function RosterCard(props) {
26
106
  const t = useT();
27
- // Never the raw `.message` — for a response with no error envelope that
28
- // is the transport's own "Request failed with status 500" (owner report
29
- // 2026-08-09). `useErrorText` folds any thrown value into the one dialect.
30
- const errorDisplay = useErrorDisplay(WORKSPACES_I18N_KEYS.unknownError);
31
- const canManage = props.canManage ?? true;
107
+ const tPlural = useTPlural();
108
+ const { bag, canManage } = props;
32
109
  const [inviteOpen, setInviteOpen] = useState(false);
33
- const [emailsText, setEmailsText] = useState("");
34
- const [inviteRole, setInviteRole] = useState(DEFAULT_INVITE_ROLE);
35
- return (_jsx(RoleSelect, { children: (rolesBag) => (_jsx(Members, { workspaceId: props.workspaceId, children: ({ state, writeError, invite, isInviting, updateRole, remove, refetch }) => {
36
- const { labelFor } = rolesBag;
37
- // The registry read is a SEPARATE load from the roster's, and it
38
- // gets its own sentence below rather than silently producing an
39
- // empty picker — a role menu with nothing in it and a role menu
40
- // that could not be fetched look identical to a person.
41
- const rolesFailed = rolesBag.state.status === "failed";
42
- const rolesLoading = rolesBag.state.status === "loading";
43
- const roleOptions = loadedRowsOrEmpty(rolesBag.state).map((r) => ({
44
- value: r.role,
45
- label: labelFor(r.role),
46
- }));
47
- const inviteRoleOptions = roleOptions.filter((o) => o.value !== "owner");
48
- function openInvite() {
49
- setEmailsText("");
50
- setInviteRole(DEFAULT_INVITE_ROLE);
51
- setInviteOpen(true);
52
- }
53
- function submitInvite() {
54
- const emails = emailsText
55
- .split(/[,\s]+/)
56
- .map((e) => e.trim())
57
- .filter((e) => e.length > 0);
58
- if (emails.length === 0)
59
- return;
60
- invite({ emails, role: inviteRole });
110
+ const [removing, setRemoving] = useState(null);
111
+ const [renaming, setRenaming] = useState(null);
112
+ const [resetting, setResetting] = useState(null);
113
+ const page = bag.page;
114
+ const rosterEmpty = bag.state.status === "ready" && bag.state.data.length === 0;
115
+ const showSearch = !rosterEmpty || props.search.trim() !== "";
116
+ return (_jsxs(Card, { "data-testid": "members-manager-card", children: [_jsxs(Flex, { justify: "space-between", align: "flex-start", gap: spacing["4"], wrap: true, children: [_jsxs(Flex, { vertical: true, gap: spacing["1"], children: [_jsx(Typography.Title, { level: 4, style: { marginTop: 0, marginBottom: 0 }, children: t(WORKSPACES_I18N_KEYS.membersTitle) }), _jsx(Typography.Text, { type: "secondary", children: t(WORKSPACES_I18N_KEYS.membersSubtitle) }), page !== null && (_jsx(Muted, { testId: "members-count", children: tPlural(WORKSPACES_I18N_KEYS.membersCount, { count: page.count }) }))] }), canManage && !rosterEmpty && (_jsx(Button, { type: "primary", onClick: () => setInviteOpen(true), "data-analytics": "none", "data-analytics-reason": "local-ui-open-invite-dialog", "data-testid": "members-invite-open", children: t(WORKSPACES_I18N_KEYS.membersInvite) }))] }), !canManage && (_jsx("div", { style: { marginTop: spacing["2"] }, children: _jsx(Muted, { testId: "members-read-only", children: t(WORKSPACES_I18N_KEYS.membersBlockedReadOnly) }) })), showSearch && (_jsx("div", { style: { marginTop: spacing["4"] }, children: _jsx(Input, { value: props.search, onChange: (event) => props.onSearch(event.target.value), placeholder: t(WORKSPACES_I18N_KEYS.membersSearchPlaceholder), "aria-label": t(WORKSPACES_I18N_KEYS.membersSearchPlaceholder), allowClear: true, "data-testid": "members-search" }) })), _jsx(ErrorAlert, { thrown: bag.writeError, style: { marginTop: spacing["3"] }, testId: "members-write-error" }), _jsx("div", { style: { marginTop: spacing["4"] }, children: _jsx(LoadList, { state: bag.state, testId: "members-list", onRetry: bag.refetch, empty: _jsx(EmptyState, { title: t(WORKSPACES_I18N_KEYS.membersEmpty), testId: "members-list-empty", ...(canManage
117
+ ? {
118
+ action: (_jsx(Button, { type: "primary", onClick: () => setInviteOpen(true), "data-analytics": "none", "data-analytics-reason": "local-ui-open-invite-dialog", "data-testid": "members-invite-open", children: t(WORKSPACES_I18N_KEYS.membersInvite) })),
119
+ }
120
+ : {}) }), children: (members) => (_jsx("div", { role: "list", "data-testid": "members-rows", children: members.map((member) => (_jsx(MemberRow, { member: member, rows: members, bag: bag, canManage: canManage, onRename: () => setRenaming(member), onRemove: () => setRemoving(member), onResetPassword: () => setResetting(member) }, member.id))) })) }) }), page !== null && (_jsx(AnchorPager, { hasPrev: page.hasPrev, hasNext: page.hasNext, prevLabel: t(WORKSPACES_I18N_KEYS.pagerPrev), nextLabel: t(WORKSPACES_I18N_KEYS.pagerNext), position: t(WORKSPACES_I18N_KEYS.pagerPosition, { page: props.walk.index }), testId: "members-pager", onPrev: () => props.onWalk({
121
+ anchor: page.prevAnchor ?? undefined,
122
+ direction: "prev",
123
+ index: Math.max(1, props.walk.index - 1),
124
+ }), onNext: () => props.onWalk({
125
+ anchor: page.nextAnchor ?? undefined,
126
+ direction: "next",
127
+ index: props.walk.index + 1,
128
+ }) })), _jsx(InviteDialog, { open: inviteOpen, onClose: () => setInviteOpen(false), isInviting: bag.isInviting, onInvite: (body) => {
129
+ bag.invite(body);
61
130
  setInviteOpen(false);
62
- }
63
- const columns = [
131
+ } }), _jsx(RenameDialog, { member: renaming, onClose: () => setRenaming(null), isRenaming: bag.isRenaming, onRename: (displayName) => {
132
+ if (renaming === null)
133
+ return;
134
+ bag.rename({ userId: renaming.user_id, displayName });
135
+ setRenaming(null);
136
+ } }), _jsx(PasswordResetDialog, { workspaceId: props.workspaceId, member: resetting, onClose: () => setResetting(null) }), _jsx(SkinConfirm, { open: removing !== null, danger: true, title: t(WORKSPACES_I18N_KEYS.membersRemoveConfirm), body: t(WORKSPACES_I18N_KEYS.membersRemoveConfirmBody, {
137
+ member: removing?.display_name ?? removing?.email ?? "",
138
+ }), confirmLabel: t(WORKSPACES_I18N_KEYS.membersRemove), cancelLabel: t(WORKSPACES_I18N_KEYS.cancel), confirming: bag.isRemoving, onConfirm: () => {
139
+ if (removing !== null)
140
+ bag.remove(removing.user_id);
141
+ setRemoving(null);
142
+ }, onCancel: () => setRemoving(null), "data-testid": "members-remove-confirm" })] }));
143
+ }
144
+ /**
145
+ * Is this row the READER? The server's answer (`MemberResponse.is_self`,
146
+ * stapel-workspaces 0.30.0) and only the server's.
147
+ *
148
+ * The field is OPTIONAL in the contract, and the `=== true` is the whole
149
+ * point of reading it that way: a deployment on an older backend sends
150
+ * nothing, and the absence must read as "the server did not say" — never as
151
+ * "no". A comparison against a session id would be the client re-deriving an
152
+ * identity it does not hold, which is the shape of the `my_role` defect
153
+ * `can_delete` was added to close.
154
+ */
155
+ function isSelf(member) {
156
+ return member.is_self === true;
157
+ }
158
+ /**
159
+ * Whether removing THIS member is offerable. Two rules, in the order a person
160
+ * would be told them; everything else is the backend's to refuse.
161
+ */
162
+ function removeAvailability(member, rows, rosterComplete) {
163
+ if (isSelf(member)) {
164
+ return actionBlocked(WORKSPACES_I18N_KEYS.membersRemoveBlockedSelf);
165
+ }
166
+ if (!rosterComplete || member.role !== OWNER_ROLE)
167
+ return actionAvailable();
168
+ const owners = rows.filter((row) => row.role === OWNER_ROLE).length;
169
+ return owners <= 1
170
+ ? actionBlocked(WORKSPACES_I18N_KEYS.membersRemoveBlockedLastOwner)
171
+ : actionAvailable();
172
+ }
173
+ /**
174
+ * Whether "Reset password" is offerable on THIS row. One rule, and it is the
175
+ * server's: `MemberPasswordResetView` refuses the caller's own row with the
176
+ * byte-identical 404 it gives for a stranger ("Yourself is not in the set
177
+ * this endpoint acts on"), so an ungated button here would read the backend's
178
+ * correct refusal as "this member has been removed" and say so to an admin
179
+ * looking at their own name. Everything else — the owner-target rule, the
180
+ * privileged-account refusal, the step-up — the backend answers, and this
181
+ * screen states rather than predicts.
182
+ */
183
+ function resetPasswordAvailability(member) {
184
+ return isSelf(member)
185
+ ? actionBlocked(WORKSPACES_I18N_KEYS.membersResetBlockedSelf)
186
+ : actionAvailable();
187
+ }
188
+ function MemberRow(props) {
189
+ const t = useT();
190
+ const format = useWorkspaceFormat();
191
+ const { token } = antdTheme.useToken();
192
+ const { member, bag, canManage } = props;
193
+ const lastSeen = format.relative(member.last_accessed_at);
194
+ const joined = format.date(member.accepted_at ?? member.invited_at);
195
+ const tags = (_jsxs(_Fragment, { children: [member.suspended_at !== null && member.suspended_at !== undefined && (_jsx(StatusTag, { tone: "danger", testId: "member-suspended", children: t(WORKSPACES_I18N_KEYS.membersSuspended) })), member.provisioned === true && (_jsx(StatusTag, { tone: "neutral", children: t(WORKSPACES_I18N_KEYS.membersProvisioned) })), _jsx(MfaTag, { compliant: member.mfa_compliant ?? null })] }));
196
+ return (_jsxs("div", { role: "listitem", "data-testid": `member-row-${member.user_id}`, style: {
197
+ display: "flex",
198
+ flexWrap: "wrap",
199
+ alignItems: "center",
200
+ justifyContent: "space-between",
201
+ gap: spacing["3"],
202
+ paddingTop: spacing["3"],
203
+ paddingBottom: spacing["3"],
204
+ borderBottom: `1px solid ${token.colorSplit}`,
205
+ }, children: [_jsx(PersonLine, { name: member.display_name ?? null, email: member.email, tags: tags, caption: _jsxs(_Fragment, { children: [joined !== null && t(WORKSPACES_I18N_KEYS.membersJoined, { date: joined }), joined !== null && " · ", lastSeen === null
206
+ ? t(WORKSPACES_I18N_KEYS.membersLastSeenNever)
207
+ : t(WORKSPACES_I18N_KEYS.membersLastSeen, { date: lastSeen }), member.suspension_reason === SUSPENDED_NO_MFA && (_jsxs(_Fragment, { children: [" \u00B7 ", t(WORKSPACES_I18N_KEYS.membersSuspendedNoMfa)] }))] }) }), _jsx(Flex, { gap: spacing["3"], align: "center", wrap: true, children: _jsx("div", { style: { minWidth: "10rem" }, children: _jsx(RoleSelectField, { value: member.role, size: "small", label: t(WORKSPACES_I18N_KEYS.membersRolePickerLabel, {
208
+ member: member.display_name ?? member.email ?? member.role,
209
+ }), disabled: !canManage, onChange: (role) => bag.updateRole({ userId: member.user_id, role }), testId: `member-role-${member.user_id}` }) }) }), canManage && (_jsx(RowActions, { testId: `member-blocked-${member.user_id}`, actions: [
64
210
  {
65
- title: "Email",
66
- dataIndex: "email",
67
- key: "email",
68
- render: (value) => value ?? "—",
211
+ key: "rename",
212
+ gate: actionAvailable(),
213
+ label: t(WORKSPACES_I18N_KEYS.membersRename),
214
+ onClick: props.onRename,
215
+ testId: `member-rename-${member.user_id}`,
69
216
  },
70
217
  {
71
- title: t(WORKSPACES_I18N_KEYS.membersInviteRoleLabel),
72
- key: "role",
73
- render: (_, member) => canManage ? (_jsx(Select, { value: member.role, style: { width: 160 }, loading: rolesLoading, onChange: (next) => updateRole({ userId: member.user_id, role: next }),
74
- // A member's CURRENT role may be missing from the
75
- // registry options (a deployment removed an overlay
76
- // role) — antd shows the raw value then, which matches
77
- // labelFor's raw-name fallback contract.
78
- options: roleOptions })) : (_jsx("span", { children: labelFor(member.role) })),
218
+ key: "reset",
219
+ gate: resetPasswordAvailability(member),
220
+ label: t(WORKSPACES_I18N_KEYS.membersResetPassword),
221
+ onClick: props.onResetPassword,
222
+ testId: `member-reset-password-${member.user_id}`,
79
223
  },
80
- ...(canManage
81
- ? [
82
- {
83
- title: "",
84
- key: "actions",
85
- render: (_, member) => (_jsx(Popconfirm, { title: t(WORKSPACES_I18N_KEYS.membersRemoveConfirm), onConfirm: () => remove(member.user_id), children: _jsx(Button, { danger: true, type: "link", children: t(WORKSPACES_I18N_KEYS.membersRemove) }) })),
86
- },
87
- ]
88
- : []),
89
- ];
90
- return (_jsxs(Card, { "data-testid": "members-manager", children: [_jsxs("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "flex-start", gap: 16 }, children: [_jsxs("div", { children: [_jsx(Typography.Title, { level: 4, style: { marginTop: 0 }, children: t(WORKSPACES_I18N_KEYS.membersTitle) }), _jsx(Typography.Text, { type: "secondary", children: t(WORKSPACES_I18N_KEYS.membersSubtitle) })] }), canManage && (_jsx(Button, { type: "primary", onClick: openInvite, "data-analytics": "none", "data-analytics-reason": "local-ui-open-invite-dialog", children: t(WORKSPACES_I18N_KEYS.membersInvite) }))] }), writeError !== null && (_jsx(ErrorAlert, { error: errorDisplay(writeError), style: { marginTop: 12 } })), rolesFailed && (_jsx(ErrorAlert, { testId: "members-roles-error", error: { message: t(WORKSPACES_I18N_KEYS.rolesLoadFailed), detail: undefined }, style: { marginTop: 12 } })), matchList(state, {
91
- loading: () => (_jsx(Table, { style: { marginTop: 16 }, size: "small", loading: true, rowKey: (member) => member.id, dataSource: [], columns: columns, pagination: false })),
92
- // An antd Table with no rows renders "No data". On a failed
93
- // read that is the empty-state lie with a built-in
94
- // illustration, so the table does not get rendered at all.
95
- failed: (error) => (_jsxs("div", { style: { marginTop: 16 }, "data-testid": "members-list-error", children: [_jsx(ErrorAlert, { error: errorDisplay(error) }), _jsx(Button, { style: { marginTop: 12 }, onClick: refetch, "data-analytics": "none", "data-analytics-reason": "local-ui-refetch-after-a-stated-read-failure", children: t(WORKSPACES_I18N_KEYS.retry) })] })),
96
- empty: () => (_jsx(Empty, { style: { marginTop: 16 }, "data-testid": "members-list-empty", description: t(WORKSPACES_I18N_KEYS.membersEmpty) })),
97
- ready: (members) => (_jsx(Table, { style: { marginTop: 16 }, size: "small", rowKey: (member) => member.id, dataSource: [...members], columns: columns, pagination: false })),
98
- }), _jsx(Modal, { title: t(WORKSPACES_I18N_KEYS.membersInviteDialogTitle), open: inviteOpen, onCancel: () => setInviteOpen(false), onOk: submitInvite, okButtonProps: { loading: isInviting, disabled: emailsText.trim().length === 0 }, children: _jsxs("div", { style: { display: "grid", gap: 12 }, children: [_jsxs("div", { children: [_jsx(Typography.Text, { children: t(WORKSPACES_I18N_KEYS.membersInviteEmailsLabel) }), _jsx(Input, { value: emailsText, onChange: (e) => setEmailsText(e.target.value), placeholder: t(WORKSPACES_I18N_KEYS.membersInviteEmailsPlaceholder) })] }), _jsxs("div", { children: [_jsx(Typography.Text, { children: t(WORKSPACES_I18N_KEYS.membersInviteRoleLabel) }), _jsx(Select, { value: inviteRole, onChange: setInviteRole, style: { width: "100%" }, loading: rolesLoading, options: inviteRoleOptions })] })] }) })] }));
99
- } })) }));
224
+ {
225
+ key: "remove",
226
+ gate: removeAvailability(member, props.rows, bag.rosterComplete),
227
+ label: t(WORKSPACES_I18N_KEYS.membersRemove),
228
+ onClick: props.onRemove,
229
+ danger: true,
230
+ testId: `member-remove-${member.user_id}`,
231
+ },
232
+ ] }))] }));
233
+ }
234
+ /** Three states, never two: confirmed, missing, and nobody has asked. */
235
+ function MfaTag(props) {
236
+ const t = useT();
237
+ if (props.compliant === true) {
238
+ return (_jsx(StatusTag, { tone: "success", testId: "member-mfa", children: `${t(WORKSPACES_I18N_KEYS.membersMfaLabel)}: ${t(WORKSPACES_I18N_KEYS.membersMfaCompliant)}` }));
239
+ }
240
+ if (props.compliant === false) {
241
+ return (_jsx(StatusTag, { tone: "warning", testId: "member-mfa", children: `${t(WORKSPACES_I18N_KEYS.membersMfaLabel)}: ${t(WORKSPACES_I18N_KEYS.membersMfaNoncompliant)}` }));
242
+ }
243
+ return (_jsx(StatusTag, { tone: "neutral", testId: "member-mfa", children: `${t(WORKSPACES_I18N_KEYS.membersMfaLabel)}: ${t(WORKSPACES_I18N_KEYS.membersMfaUnknown)}` }));
244
+ }
245
+ /**
246
+ * The invite dialog — a bottom sheet on a phone, a centred modal on
247
+ * tablet/desktop, because that is what `SkinDialog` is (owner ruling
248
+ * 2026-08-24, stated once in `@stapel/tokens-antd/skin`).
249
+ */
250
+ function InviteDialog(props) {
251
+ const t = useT();
252
+ const [emailsText, setEmailsText] = useState("");
253
+ const [role, setRole] = useState(DEFAULT_INVITE_ROLE);
254
+ const [displayName, setDisplayName] = useState("");
255
+ const emails = splitEmails(emailsText);
256
+ const firstBad = emails.find((email) => !looksLikeEmail(email));
257
+ // Ordered the way it would be explained out loud: the thing that is empty
258
+ // first, the thing that is wrong second.
259
+ const gate = firstBlock(emails.length === 0
260
+ ? actionBlocked(WORKSPACES_I18N_KEYS.membersInviteBlockedNoEmails)
261
+ : actionAvailable(), firstBad !== undefined
262
+ ? actionBlocked(WORKSPACES_I18N_KEYS.membersInviteBlockedBadEmail, {
263
+ email: firstBad,
264
+ })
265
+ : actionAvailable());
266
+ return (_jsx(SkinDialog, { open: props.open, onClose: props.onClose, title: t(WORKSPACES_I18N_KEYS.membersInviteDialogTitle), dismissLabel: t(WORKSPACES_I18N_KEYS.dialogClose), "data-testid": "members-invite-dialog", footer: _jsx(GatedButton, { gate: gate, type: "primary", loading: props.isInviting, onClick: () => {
267
+ props.onInvite({
268
+ emails: [...emails],
269
+ role,
270
+ ...(displayName.trim() !== "" ? { display_name: displayName.trim() } : {}),
271
+ });
272
+ setEmailsText("");
273
+ setDisplayName("");
274
+ setRole(DEFAULT_INVITE_ROLE);
275
+ }, testId: "members-invite-submit", "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", children: t(WORKSPACES_I18N_KEYS.membersInviteSubmit) }), children: _jsxs(Flex, { vertical: true, gap: spacing["3"], children: [_jsxs(Flex, { vertical: true, gap: spacing["1"], children: [_jsx(Typography.Text, { children: t(WORKSPACES_I18N_KEYS.membersInviteEmailsLabel) }), _jsx(Input, { value: emailsText, onChange: (event) => setEmailsText(event.target.value), placeholder: t(WORKSPACES_I18N_KEYS.membersInviteEmailsPlaceholder), "aria-label": t(WORKSPACES_I18N_KEYS.membersInviteEmailsLabel) })] }), _jsxs(Flex, { vertical: true, gap: spacing["1"], children: [_jsx(Typography.Text, { children: t(WORKSPACES_I18N_KEYS.membersInviteNameLabel) }), _jsx(Input, { value: displayName, onChange: (event) => setDisplayName(event.target.value), placeholder: t(WORKSPACES_I18N_KEYS.membersInviteNamePlaceholder), "aria-label": t(WORKSPACES_I18N_KEYS.membersInviteNameLabel) })] }), _jsx(RoleSelectField, { value: role, onChange: setRole, excludeOwner: true, showLabel: true, label: t(WORKSPACES_I18N_KEYS.membersInviteRoleLabel), testId: "members-invite-role" })] }) }));
276
+ }
277
+ /**
278
+ * The name correction an owner/admin applies without waiting for the person
279
+ * themselves. It writes the CANONICAL name (stapel-profiles), which the hint
280
+ * under the field says out loud — a workspace-local note is what people
281
+ * expect from a field in a workspace screen, and this is not one.
282
+ */
283
+ function RenameDialog(props) {
284
+ const t = useT();
285
+ const current = props.member?.display_name ?? "";
286
+ const [value, setValue] = useState(current);
287
+ const [editingId, setEditingId] = useState(null);
288
+ // Seed the field from the row the dialog was opened for, without an effect:
289
+ // a different member in the same mounted dialog is a different edit.
290
+ if (props.member !== null && editingId !== props.member.id) {
291
+ setEditingId(props.member.id);
292
+ setValue(props.member.display_name ?? "");
293
+ }
294
+ const gate = value.trim() === current.trim()
295
+ ? actionBlocked(WORKSPACES_I18N_KEYS.membersRenameBlockedUnchanged)
296
+ : actionAvailable();
297
+ return (_jsx(SkinDialog, { open: props.member !== null, onClose: props.onClose, title: t(WORKSPACES_I18N_KEYS.membersRenameDialogTitle), dismissLabel: t(WORKSPACES_I18N_KEYS.dialogClose), "data-testid": "members-rename-dialog", footer: _jsx(GatedButton, { gate: gate, type: "primary", loading: props.isRenaming, onClick: () => props.onRename(value.trim() === "" ? null : value.trim()), testId: "members-rename-submit", "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", children: t(WORKSPACES_I18N_KEYS.membersRenameSubmit) }), children: _jsxs(Flex, { vertical: true, gap: spacing["2"], children: [_jsx(Typography.Text, { children: t(WORKSPACES_I18N_KEYS.membersRenameLabel) }), _jsx(Input, { value: value, onChange: (event) => setValue(event.target.value), placeholder: t(WORKSPACES_I18N_KEYS.membersRenamePlaceholder), "aria-label": t(WORKSPACES_I18N_KEYS.membersRenameLabel), "data-testid": "members-rename-input" }), _jsx(Muted, { children: t(WORKSPACES_I18N_KEYS.membersRenameHint) })] }) }));
298
+ }
299
+ /**
300
+ * Reset a member's password on the organization's order — an account takeover
301
+ * performed on purpose, so the dialog states every part of it before the
302
+ * click and once more after.
303
+ *
304
+ * Three things this surface has to get right, all of them the backend's own
305
+ * rules stated on the glass rather than re-derived:
306
+ *
307
+ * - **The step-up is announced, not discovered.** The capability is declared
308
+ * `high`, so `@requires_verification(scope="sensitive")` will demand a
309
+ * fresh confirmation; core's client drives the challenge and replays the
310
+ * call. A person who reads "you will be asked to confirm" before pressing
311
+ * the button experiences a step, not a refusal.
312
+ * - **The generated password is shown ONCE.** It comes back only when the
313
+ * request omitted one, is never re-fetchable, and the hook deliberately
314
+ * keeps it out of the query cache (`gcTime: 0`). Closing the dialog resets
315
+ * the mutation, so the credential leaves the screen with it.
316
+ * - **`notified: false` is said out loud.** It means the account had no
317
+ * channel to be told on, which makes the admin the only person who can
318
+ * tell them — silence there is how a reset becomes indistinguishable from
319
+ * a takeover.
320
+ */
321
+ function PasswordResetDialog(props) {
322
+ const t = useT();
323
+ const reset = useResetMemberPassword(props.workspaceId);
324
+ const { member } = props;
325
+ const who = member?.display_name ?? member?.email ?? "";
326
+ const result = reset.data;
327
+ const close = () => {
328
+ // The result carries a live credential: it goes when the dialog goes.
329
+ reset.reset();
330
+ props.onClose();
331
+ };
332
+ return (_jsx(SkinDialog, { open: member !== null, onClose: close, title: t(WORKSPACES_I18N_KEYS.membersResetDialogTitle, { member: who }), dismissLabel: t(WORKSPACES_I18N_KEYS.dialogClose), "data-testid": "members-reset-dialog", footer: result === undefined ? (_jsx(Button, { type: "primary", danger: true, loading: reset.isPending, onClick: () => {
333
+ if (member !== null)
334
+ reset.mutate({ userId: member.user_id });
335
+ }, "data-testid": "members-reset-submit", "data-analytics": "none", "data-analytics-reason": "business action \u2014 host app wraps with its own tracked()", children: t(WORKSPACES_I18N_KEYS.membersResetSubmit) })) : (_jsx(Button, { type: "primary", onClick: close, "data-testid": "members-reset-done", "data-analytics": "none", "data-analytics-reason": "local-ui-close-dialog", children: t(WORKSPACES_I18N_KEYS.dialogClose) })), children: _jsx(Flex, { vertical: true, gap: spacing["3"], children: result === undefined ? (_jsxs(_Fragment, { children: [_jsx(Typography.Text, { children: t(WORKSPACES_I18N_KEYS.membersResetDialogBody) }), _jsx(Muted, { testId: "members-reset-stepup", children: t(WORKSPACES_I18N_KEYS.membersResetStepUp) }), _jsx(ErrorAlert, { thrown: reset.error, testId: "members-reset-error" })] })) : (_jsxs(Flex, { vertical: true, gap: spacing["2"], "data-testid": "members-reset-result", children: [_jsx(Typography.Text, { children: t(WORKSPACES_I18N_KEYS.membersResetDone, { member: who }) }), typeof result.generated_password === "string" && (_jsxs(_Fragment, { children: [_jsx(Typography.Text, { children: t(WORKSPACES_I18N_KEYS.membersResetGenerated) }), _jsx(Typography.Text, { code: true, "data-testid": "members-reset-password", children: result.generated_password }), _jsx(Muted, { children: t(WORKSPACES_I18N_KEYS.membersResetGeneratedHint) })] })), result.notified === false && (_jsx(Muted, { testId: "members-reset-not-notified", children: t(WORKSPACES_I18N_KEYS.membersResetNotNotified) }))] })) }) }));
100
336
  }
101
337
  //# sourceMappingURL=MembersManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MembersManager.js","sourceRoot":"","sources":["../../src/default/MembersManager.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MembersManager.js","sourceRoot":"","sources":["../../src/default/MembersManager.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * `<RoleSelectField/>` — the default skin for {@link RoleSelect} (§54: every
3
+ * headless primitive gets an AntD default).
4
+ *
5
+ * The visual pass photographed the role story as five bullet points: no
6
+ * control, no current value, nothing focusable, and a deployment role
7
+ * (`secretary`) printed lowercase beside title-cased builtin ones. This is
8
+ * that primitive drawn as what it is — a real `<Select>` with an accessible
9
+ * name, the effective registry behind it, and the role's RANK as the caption
10
+ * in the menu, because "admin outranks member" is the fact a person picking a
11
+ * role is actually reasoning about.
12
+ *
13
+ * The three non-ready states are not a select at all:
14
+ * - loading — the control is there and busy, so the layout does not jump.
15
+ * - failed — NO picker. An enabled `<Select options={[]}/>` offers a choice
16
+ * that does not exist; the reason is printed instead (the registry read is
17
+ * a separate load from whatever list the caller is drawing).
18
+ * - empty — a registry with no roles is not a picker either.
19
+ */
20
+ import type { ReactElement } from "react";
21
+ export interface RoleSelectFieldProps {
22
+ /** The registry key currently chosen. Kept as the VALUE even when the
23
+ * registry has no label for it — a deployment that removed an overlay role
24
+ * must still show what the member actually holds. */
25
+ readonly value: string;
26
+ readonly onChange: (role: string) => void;
27
+ /**
28
+ * The control's accessible name. Required, not optional: a roster renders
29
+ * one of these per row, and "combobox, combobox, combobox" is what a screen
30
+ * reader says when the name is left to the layout.
31
+ */
32
+ readonly label: string;
33
+ /** Draw the name above the control as well. Off in a table cell, where the
34
+ * column header is the visible label. */
35
+ readonly showLabel?: boolean;
36
+ /** Leave `owner` out of the menu — the invite path, where the backend
37
+ * enforces "only an owner grants owner" anyway. */
38
+ readonly excludeOwner?: boolean;
39
+ readonly size?: "small" | "middle" | "large";
40
+ /** Forwarded straight to the control by a caller that has already stated
41
+ * its own reason beside it (a gate, a read-only roster). */
42
+ readonly disabled?: boolean;
43
+ readonly "aria-describedby"?: string | undefined;
44
+ readonly testId?: string | undefined;
45
+ }
46
+ /**
47
+ * Role key → the word for it, with no registry read behind it.
48
+ *
49
+ * `RoleSelect`'s own `labelFor` is a bundle lookup that never touches the
50
+ * query, but mounting `<RoleSelect>` to reach it also fires GET /roles — which
51
+ * on the PUBLIC invitation page is a call an anonymous reader cannot make.
52
+ * A caption that only needs a word asks for a word.
53
+ */
54
+ export declare function useRoleLabel(): (role: string) => string;
55
+ /**
56
+ * A role as a WORD, where there is nothing to pick — an invitation's granted
57
+ * role, a read-only roster. The same label resolution as the field, so one
58
+ * screen never calls `admin` "Admin" while its neighbour prints `admin`.
59
+ */
60
+ export declare function RoleLabel(props: {
61
+ readonly role: string;
62
+ }): ReactElement;
63
+ export declare function RoleSelectField(props: RoleSelectFieldProps): ReactElement;
64
+ //# sourceMappingURL=RoleSelectField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RoleSelectField.d.ts","sourceRoot":"","sources":["../../src/default/RoleSelectField.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAa1C,MAAM,WAAW,oBAAoB;IACnC;;yDAEqD;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;6CACyC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B;uDACmD;IACnD,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC7C;gEAC4D;IAC5D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAMvD;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAGxE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,YAAY,CAsGzE"}