@echothink-ui/identity 0.1.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.
- package/README.md +5 -0
- package/dist/components/AccessReviewPanel.d.ts +9 -0
- package/dist/components/AccountMenu.d.ts +8 -0
- package/dist/components/ApprovalPolicyEditor.d.ts +8 -0
- package/dist/components/AuditTrail.d.ts +6 -0
- package/dist/components/GroupPicker.d.ts +12 -0
- package/dist/components/IdentityCard.d.ts +14 -0
- package/dist/components/InviteUserPanel.d.ts +14 -0
- package/dist/components/OrganizationSwitcher.d.ts +9 -0
- package/dist/components/PermissionMatrix.d.ts +10 -0
- package/dist/components/PolicyRuleViewer.d.ts +6 -0
- package/dist/components/RoleBadge.d.ts +6 -0
- package/dist/components/SessionStatus.d.ts +9 -0
- package/dist/components/TeamList.d.ts +13 -0
- package/dist/components/UserPicker.d.ts +12 -0
- package/dist/components/types.d.ts +77 -0
- package/dist/index.cjs +1629 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +2238 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +1610 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
- package/src/components/AccessReviewPanel.tsx +169 -0
- package/src/components/AccountMenu.tsx +144 -0
- package/src/components/ApprovalPolicyEditor.tsx +131 -0
- package/src/components/AuditTrail.tsx +105 -0
- package/src/components/GroupPicker.tsx +175 -0
- package/src/components/IdentityCard.tsx +78 -0
- package/src/components/InviteUserPanel.tsx +162 -0
- package/src/components/OrganizationSwitcher.test.tsx +59 -0
- package/src/components/OrganizationSwitcher.tsx +161 -0
- package/src/components/PermissionMatrix.test.tsx +96 -0
- package/src/components/PermissionMatrix.tsx +271 -0
- package/src/components/PolicyRuleViewer.test.tsx +29 -0
- package/src/components/PolicyRuleViewer.tsx +78 -0
- package/src/components/RoleBadge.test.tsx +35 -0
- package/src/components/RoleBadge.tsx +38 -0
- package/src/components/SessionStatus.test.tsx +40 -0
- package/src/components/SessionStatus.tsx +194 -0
- package/src/components/TeamList.test.tsx +48 -0
- package/src/components/TeamList.tsx +98 -0
- package/src/components/UserPicker.test.tsx +52 -0
- package/src/components/UserPicker.tsx +174 -0
- package/src/components/types.ts +89 -0
- package/src/index.tsx +35 -0
- package/src/styles.css +2578 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/components/IdentityCard.tsx","../src/components/RoleBadge.tsx","../src/components/UserPicker.tsx","../src/components/GroupPicker.tsx","../src/components/TeamList.tsx","../src/components/PermissionMatrix.tsx","../src/components/AccessReviewPanel.tsx","../src/components/InviteUserPanel.tsx","../src/components/OrganizationSwitcher.tsx","../src/components/AccountMenu.tsx","../src/components/SessionStatus.tsx","../src/components/AuditTrail.tsx","../src/components/PolicyRuleViewer.tsx","../src/components/ApprovalPolicyEditor.tsx"],"sourcesContent":["import \"./styles.css\";\n\nexport * from \"./components/types\";\nexport * from \"./components/IdentityCard\";\nexport * from \"./components/UserPicker\";\nexport * from \"./components/GroupPicker\";\nexport * from \"./components/TeamList\";\nexport * from \"./components/RoleBadge\";\nexport * from \"./components/PermissionMatrix\";\nexport * from \"./components/AccessReviewPanel\";\nexport * from \"./components/InviteUserPanel\";\nexport * from \"./components/OrganizationSwitcher\";\nexport * from \"./components/AccountMenu\";\nexport * from \"./components/SessionStatus\";\nexport * from \"./components/AuditTrail\";\nexport * from \"./components/PolicyRuleViewer\";\nexport * from \"./components/ApprovalPolicyEditor\";\n\nexport const IdentityComponentNames = [\n \"IdentityCard\",\n \"UserPicker\",\n \"GroupPicker\",\n \"TeamList\",\n \"RoleBadge\",\n \"PermissionMatrix\",\n \"AccessReviewPanel\",\n \"InviteUserPanel\",\n \"OrganizationSwitcher\",\n \"AccountMenu\",\n \"SessionStatus\",\n \"AuditTrail\",\n \"PolicyRuleViewer\",\n \"ApprovalPolicyEditor\"\n] as const;\nexport type IdentityComponentName = (typeof IdentityComponentNames)[number];\n","import {\n ActionGroup,\n Badge,\n StatusDot,\n Surface,\n type EthAction,\n type EthOperationalStatus,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport { RoleBadge } from \"./RoleBadge\";\n\nexport interface IdentityCardProps extends Omit<SurfaceComponentProps, \"children\" | \"actions\"> {\n identity: {\n id: string;\n label: string;\n email?: string;\n avatar?: string;\n role?: string;\n kind: \"user\" | \"service-account\" | \"group\";\n status?: EthOperationalStatus;\n };\n actions?: EthAction[];\n}\n\nexport function IdentityCard({ identity, actions, className, ...props }: IdentityCardProps) {\n return (\n <Surface\n {...props}\n className={[\"eth-identity-card\", `eth-identity-card--${identity.kind}`, className]\n .filter(Boolean)\n .join(\" \")}\n data-eth-component=\"IdentityCard\"\n >\n <div className=\"eth-identity-card__body\">\n <Avatar label={identity.label} src={identity.avatar} />\n <div className=\"eth-identity-card__main\">\n <h3>{identity.label}</h3>\n {identity.email ? <p>{identity.email}</p> : null}\n <div className=\"eth-identity-card__meta\">\n <Badge severity=\"neutral\">{formatIdentityKind(identity.kind)}</Badge>\n {identity.role ? <RoleBadge role={identity.role} /> : null}\n {identity.status ? (\n <StatusDot status={identity.status} label={formatIdentityStatus(identity.status)} />\n ) : null}\n </div>\n </div>\n <ActionGroup actions={actions} />\n </div>\n </Surface>\n );\n}\n\nfunction Avatar({ label, src }: { label: string; src?: string }) {\n if (src) return <img className=\"eth-identity-card__avatar\" src={src} alt=\"\" aria-hidden=\"true\" />;\n return (\n <span className=\"eth-identity-card__avatar\" aria-hidden=\"true\">\n {initials(label)}\n </span>\n );\n}\n\nfunction initials(label: string) {\n return label\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]?.toUpperCase())\n .join(\"\");\n}\n\nfunction formatIdentityKind(kind: IdentityCardProps[\"identity\"][\"kind\"]) {\n if (kind === \"service-account\") return \"service account\";\n return kind;\n}\n\nfunction formatIdentityStatus(status: NonNullable<IdentityCardProps[\"identity\"][\"status\"]>) {\n return status.replace(/-/g, \" \");\n}\n","import type { HTMLAttributes } from \"react\";\nimport { Badge, type EthSeverity } from \"@echothink-ui/core\";\n\nexport interface RoleBadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\" | \"role\"> {\n role: string;\n tier?: \"admin\" | \"editor\" | \"viewer\" | \"custom\";\n}\n\nexport function RoleBadge({\n role,\n tier = \"custom\",\n className,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n title,\n ...props\n}: RoleBadgeProps) {\n return (\n <span\n {...props}\n aria-label={ariaLabel ?? (ariaLabelledBy ? undefined : `Role: ${role}`)}\n aria-labelledby={ariaLabelledBy}\n className={[\"eth-identity-role-badge\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"RoleBadge\"\n data-tier={tier}\n title={title ?? role}\n >\n <Badge severity={severityForTier(tier)}>{role}</Badge>\n </span>\n );\n}\n\nfunction severityForTier(tier: NonNullable<RoleBadgeProps[\"tier\"]>): EthSeverity {\n if (tier === \"admin\") return \"danger\";\n if (tier === \"editor\") return \"warning\";\n if (tier === \"viewer\") return \"info\";\n return \"neutral\";\n}\n","import * as React from \"react\";\nimport { Tag, TextInput, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport type { IdentityRef } from \"./types\";\n\nexport interface UserPickerProps\n extends Omit<SurfaceComponentProps, \"children\" | \"onChange\" | \"value\"> {\n value: string[];\n onChange?: (value: string[]) => void;\n onSearch?: (query: string) => void;\n suggestions?: IdentityRef[];\n multiple?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n}\n\nexport function UserPicker({\n value,\n onChange,\n onSearch,\n suggestions = [],\n multiple = true,\n defaultOpen = false,\n disabled = false,\n loading = false,\n className\n}: UserPickerProps) {\n const [query, setQuery] = React.useState(\"\");\n const [open, setOpen] = React.useState(defaultOpen);\n const searchRef = React.useRef<HTMLInputElement>(null);\n const selected = value.map(\n (id) => suggestions.find((item) => item.id === id) ?? { id, label: id }\n );\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const visibleSuggestions = normalizedQuery\n ? suggestions.filter((suggestion) =>\n [suggestion.label, suggestion.email, suggestion.role, suggestion.kind]\n .filter((field): field is string => typeof field === \"string\")\n .some((field) => field.toLocaleLowerCase().includes(normalizedQuery))\n )\n : suggestions;\n const selectedLabel = selected.length\n ? `${selected.length} selected`\n : multiple\n ? \"No users selected\"\n : \"No user selected\";\n const triggerLabel = multiple ? \"Add users\" : selected.length ? \"Change user\" : \"Choose user\";\n\n const toggle = (id: string) => {\n if (disabled || loading) return;\n\n if (!multiple) {\n onChange?.([id]);\n setOpen(false);\n return;\n }\n\n onChange?.(value.includes(id) ? value.filter((item) => item !== id) : [...value, id]);\n };\n\n return (\n <div\n className={[\"eth-identity-user-picker\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"UserPicker\"\n data-disabled={disabled || loading ? \"true\" : undefined}\n data-open={open ? \"true\" : undefined}\n >\n <div className=\"eth-identity-user-picker__control\">\n <div className=\"eth-identity-user-picker__chips\" aria-label=\"Selected users\">\n {selected.length ? (\n selected.map((item) => (\n <Tag\n key={item.id}\n removable={!disabled && !loading}\n onRemove={() => onChange?.(value.filter((id) => id !== item.id))}\n >\n {item.label}\n </Tag>\n ))\n ) : (\n <span className=\"eth-identity-user-picker__placeholder\">\n {multiple ? \"Select users\" : \"Select a user\"}\n </span>\n )}\n </div>\n <details\n open={open}\n className=\"eth-popover eth-identity-user-picker__popover\"\n onToggle={(event) => {\n const nextOpen = event.currentTarget.open;\n setOpen(nextOpen);\n\n if (nextOpen) window.setTimeout(() => searchRef.current?.focus(), 0);\n }}\n >\n <summary\n aria-label={`${triggerLabel}. ${selectedLabel}`}\n aria-disabled={disabled || loading ? true : undefined}\n tabIndex={disabled || loading ? -1 : undefined}\n onClick={(event) => {\n if (disabled || loading) event.preventDefault();\n }}\n >\n <span className=\"eth-identity-user-picker__trigger\">\n <span>{triggerLabel}</span>\n <span className=\"eth-identity-user-picker__count\">{selectedLabel}</span>\n <span className=\"eth-identity-user-picker__chevron\" aria-hidden=\"true\" />\n </span>\n </summary>\n <div className=\"eth-popover__content eth-identity-user-picker__content\">\n <TextInput\n ref={searchRef}\n type=\"search\"\n labelText=\"Search users\"\n hideLabel\n placeholder=\"Search users\"\n value={query}\n disabled={disabled || loading}\n onChange={(event) => {\n setQuery(event.currentTarget.value);\n onSearch?.(event.currentTarget.value);\n }}\n />\n <div\n className=\"eth-identity-user-picker__suggestions\"\n role=\"listbox\"\n aria-label=\"User suggestions\"\n aria-multiselectable={multiple ? true : undefined}\n >\n {loading ? (\n <div className=\"eth-identity-user-picker__empty\" role=\"status\">\n Loading users...\n </div>\n ) : visibleSuggestions.length ? (\n visibleSuggestions.map((suggestion) => {\n const isSelected = value.includes(suggestion.id);\n const meta =\n suggestion.email ??\n suggestion.role ??\n (suggestion.kind === \"service-account\" ? \"Service account\" : undefined);\n\n return (\n <button\n key={suggestion.id}\n type=\"button\"\n className=\"eth-identity-user-picker__option\"\n role=\"option\"\n aria-selected={isSelected}\n disabled={disabled || loading}\n onClick={() => toggle(suggestion.id)}\n >\n <span className=\"eth-identity-user-picker__option-main\">\n <span className=\"eth-identity-user-picker__option-label\">\n {suggestion.label}\n </span>\n {meta ? (\n <span className=\"eth-identity-user-picker__option-meta\">{meta}</span>\n ) : null}\n </span>\n <span className=\"eth-identity-user-picker__option-check\" aria-hidden=\"true\" />\n </button>\n );\n })\n ) : (\n <div className=\"eth-identity-user-picker__empty\" role=\"status\">\n {query ? \"No matching users\" : \"No users available\"}\n </div>\n )}\n </div>\n </div>\n </details>\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nimport { Tag, TextInput, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport type { IdentityRef } from \"./types\";\n\nexport interface GroupPickerProps extends Omit<\n SurfaceComponentProps,\n \"children\" | \"onChange\" | \"value\"\n> {\n value: string[];\n onChange?: (value: string[]) => void;\n onSearch?: (query: string) => void;\n suggestions?: IdentityRef[];\n multiple?: boolean;\n defaultOpen?: boolean;\n disabled?: boolean;\n}\n\nexport function GroupPicker({\n value,\n onChange,\n onSearch,\n suggestions = [],\n multiple = true,\n defaultOpen = false,\n disabled = false,\n loading = false,\n className\n}: GroupPickerProps) {\n const [query, setQuery] = React.useState(\"\");\n const [open, setOpen] = React.useState(defaultOpen);\n const searchRef = React.useRef<HTMLInputElement>(null);\n const selected = value.map(\n (id) => suggestions.find((item) => item.id === id) ?? { id, label: id }\n );\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const visibleSuggestions = normalizedQuery\n ? suggestions.filter((suggestion) =>\n [suggestion.label, suggestion.email, suggestion.role, suggestion.kind]\n .filter((field): field is string => typeof field === \"string\")\n .some((field) => field.toLocaleLowerCase().includes(normalizedQuery))\n )\n : suggestions;\n const selectedLabel = selected.length\n ? `${selected.length} selected`\n : multiple\n ? \"No groups selected\"\n : \"No group selected\";\n const triggerLabel = multiple ? \"Add groups\" : selected.length ? \"Change group\" : \"Choose group\";\n\n const toggle = (id: string) => {\n if (disabled || loading) return;\n\n if (!multiple) {\n onChange?.([id]);\n setOpen(false);\n return;\n }\n\n onChange?.(value.includes(id) ? value.filter((item) => item !== id) : [...value, id]);\n };\n\n return (\n <div\n className={[\"eth-identity-group-picker\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"GroupPicker\"\n data-disabled={disabled || loading ? \"true\" : undefined}\n data-open={open ? \"true\" : undefined}\n >\n <div className=\"eth-identity-group-picker__control\">\n <div className=\"eth-identity-group-picker__chips\" aria-label=\"Selected groups\">\n {selected.length ? (\n selected.map((item) => (\n <Tag\n key={item.id}\n removable={!disabled && !loading}\n onRemove={() => onChange?.(value.filter((id) => id !== item.id))}\n >\n {item.label}\n </Tag>\n ))\n ) : (\n <span className=\"eth-identity-group-picker__placeholder\">\n {multiple ? \"Select groups\" : \"Select a group\"}\n </span>\n )}\n </div>\n <details\n open={open}\n className=\"eth-popover eth-identity-group-picker__popover\"\n onToggle={(event) => {\n const nextOpen = event.currentTarget.open;\n setOpen(nextOpen);\n\n if (nextOpen) window.setTimeout(() => searchRef.current?.focus(), 0);\n }}\n >\n <summary\n aria-label={`${triggerLabel}. ${selectedLabel}`}\n aria-disabled={disabled || loading ? true : undefined}\n onClick={(event) => {\n if (disabled || loading) event.preventDefault();\n }}\n >\n <span className=\"eth-identity-group-picker__trigger\">\n <span>{triggerLabel}</span>\n <span className=\"eth-identity-group-picker__count\">{selectedLabel}</span>\n <span className=\"eth-identity-group-picker__chevron\" aria-hidden=\"true\" />\n </span>\n </summary>\n <div className=\"eth-popover__content eth-identity-group-picker__content\">\n <TextInput\n ref={searchRef}\n type=\"search\"\n placeholder=\"Search groups\"\n value={query}\n disabled={disabled || loading}\n onChange={(event) => {\n setQuery(event.currentTarget.value);\n onSearch?.(event.currentTarget.value);\n }}\n />\n <div\n className=\"eth-identity-group-picker__suggestions\"\n role=\"listbox\"\n aria-label=\"Group suggestions\"\n aria-multiselectable={multiple ? true : undefined}\n >\n {loading ? (\n <div className=\"eth-identity-group-picker__empty\" role=\"status\">\n Loading groups...\n </div>\n ) : visibleSuggestions.length ? (\n visibleSuggestions.map((suggestion) => {\n const isSelected = value.includes(suggestion.id);\n const meta =\n suggestion.role ??\n suggestion.email ??\n (suggestion.kind === \"group\" ? \"Group\" : undefined);\n\n return (\n <button\n key={suggestion.id}\n type=\"button\"\n className=\"eth-identity-group-picker__option\"\n role=\"option\"\n aria-selected={isSelected}\n onClick={() => toggle(suggestion.id)}\n >\n <span className=\"eth-identity-group-picker__option-main\">\n <span className=\"eth-identity-group-picker__option-label\">\n {suggestion.label}\n </span>\n {meta ? (\n <span className=\"eth-identity-group-picker__option-meta\">{meta}</span>\n ) : null}\n </span>\n <span\n className=\"eth-identity-group-picker__option-check\"\n aria-hidden=\"true\"\n />\n </button>\n );\n })\n ) : (\n <div className=\"eth-identity-group-picker__empty\" role=\"status\">\n {query ? \"No matching groups\" : \"No groups available\"}\n </div>\n )}\n </div>\n </div>\n </details>\n </div>\n </div>\n );\n}\n","import { Badge, Button, Surface, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport type { IdentityRef } from \"./types\";\n\nexport interface TeamListTeam {\n id: string;\n label: string;\n memberCount: number;\n lead?: IdentityRef;\n}\n\nexport interface TeamListProps extends Omit<SurfaceComponentProps, \"children\" | \"onSelect\"> {\n teams: TeamListTeam[];\n onSelect?: (id: string) => void;\n}\n\nexport function TeamList({ teams, onSelect, title, className, ...props }: TeamListProps) {\n const listLabel = typeof title === \"string\" && title.trim() ? title : \"Teams\";\n const totalMembers = teams.reduce((total, team) => total + team.memberCount, 0);\n\n return (\n <Surface\n {...props}\n title={title}\n className={[\"eth-identity-team-list\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"TeamList\"\n >\n {teams.length ? (\n <>\n <dl className=\"eth-identity-team-list__summary\" aria-label=\"Team summary\">\n <div>\n <dt>Teams</dt>\n <dd>{teams.length}</dd>\n </div>\n <div>\n <dt>Members</dt>\n <dd>{totalMembers}</dd>\n </div>\n </dl>\n <div className=\"eth-identity-team-list__items\" role=\"list\" aria-label={listLabel}>\n {teams.map((team) => (\n <article key={team.id} className=\"eth-identity-team-list__item\" role=\"listitem\">\n <span className=\"eth-identity-team-list__avatar\" aria-hidden=\"true\">\n {initials(team.label)}\n </span>\n <div className=\"eth-identity-team-list__main\">\n <div className=\"eth-identity-team-list__heading\">\n <h3>{team.label}</h3>\n <Badge severity=\"neutral\">{formatMemberCount(team.memberCount)}</Badge>\n </div>\n <dl\n className=\"eth-identity-team-list__meta\"\n aria-label={`${team.label} membership summary`}\n >\n <div>\n <dt>Lead</dt>\n <dd>{team.lead?.label ?? \"Unassigned\"}</dd>\n </div>\n </dl>\n </div>\n {onSelect ? (\n <Button\n type=\"button\"\n intent=\"secondary\"\n density=\"compact\"\n aria-label={`Open ${team.label} team`}\n onClick={() => onSelect(team.id)}\n >\n Open\n </Button>\n ) : null}\n </article>\n ))}\n </div>\n </>\n ) : (\n <div className=\"eth-identity-team-list__empty\" role=\"status\">\n <h3>No teams available</h3>\n <p>Add teams to see membership summaries.</p>\n </div>\n )}\n </Surface>\n );\n}\n\nfunction formatMemberCount(count: number) {\n return `${count} ${count === 1 ? \"member\" : \"members\"}`;\n}\n\nfunction initials(label: string) {\n const value = label\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]?.toUpperCase())\n .join(\"\");\n\n return value || \"TM\";\n}\n","import {\n Badge,\n EmptyState,\n Select,\n Surface,\n type EthSeverity,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport type * as React from \"react\";\nimport type { IdentitySubject, PermissionAction, PermissionValue } from \"./types\";\n\nexport interface PermissionMatrixProps\n extends Omit<SurfaceComponentProps, \"children\" | \"onChange\"> {\n subjects: IdentitySubject[];\n actions: PermissionAction[];\n assignments: Record<string, Record<string, PermissionValue>>;\n onChange?: (subjectId: string, actionId: string, value: PermissionValue) => void;\n mode?: \"read\" | \"edit\";\n}\n\nexport function PermissionMatrix({\n subjects,\n actions,\n assignments,\n onChange,\n mode = \"read\",\n title,\n description,\n metadata,\n className,\n \"aria-label\": ariaLabel,\n ...props\n}: PermissionMatrixProps) {\n const groups = groupActions(actions);\n const permissionCounts = countPermissionValues(subjects, actions, assignments);\n const resourceCount = countResources(actions);\n const tableLabel = ariaLabel ?? matrixLabelForTitle(title);\n const matrixMetadata = [\n { label: \"Subjects\", value: countLabel(subjects.length, \"subject\") },\n { label: \"Actions\", value: countLabel(actions.length, \"action\") },\n { label: \"Resources\", value: countLabel(resourceCount, \"resource\") },\n ...(metadata ?? [])\n ];\n\n return (\n <Surface\n {...props}\n title={title}\n description={description}\n metadata={matrixMetadata}\n className={[\"eth-identity-permission-matrix\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"PermissionMatrix\"\n >\n {subjects.length > 0 && actions.length > 0 ? (\n <>\n <div className=\"eth-identity-permission-matrix__summary\" aria-label=\"Permission summary\">\n <SummaryItem value={permissionCounts.allow} label=\"Allowed\" tone=\"allow\" />\n <SummaryItem value={permissionCounts.deny} label=\"Denied\" tone=\"deny\" />\n <SummaryItem value={permissionCounts.inherit} label=\"Inherited\" tone=\"inherit\" />\n <span className=\"eth-identity-permission-matrix__mode\">\n {mode === \"edit\" ? \"Editable\" : \"Read only\"}\n </span>\n </div>\n <div className=\"eth-identity-permission-matrix__table-wrap\">\n <table aria-label={tableLabel} className=\"eth-identity-permission-matrix__table\">\n <caption className=\"eth-identity-permission-matrix__caption\">\n Permission assignments across subjects, resources, scopes, and actions.\n </caption>\n <thead>\n <tr>\n <th\n scope=\"col\"\n rowSpan={2}\n className={[\n \"eth-identity-permission-matrix__subject-col\",\n \"eth-identity-permission-matrix__subject-heading\"\n ].join(\" \")}\n >\n Subject\n </th>\n {groups.map((group) => (\n <th key={group.label} scope=\"colgroup\" colSpan={group.actions.length}>\n {group.label}\n </th>\n ))}\n </tr>\n <tr>\n {groups.flatMap((group) =>\n group.actions.map((action) => (\n <th key={action.id} scope=\"col\">\n <span className=\"eth-identity-permission-matrix__action-label\">\n {action.label}\n </span>\n {action.resource || action.scope ? (\n <span className=\"eth-identity-permission-matrix__action-meta\">\n {action.resource ? <span>{action.resource}</span> : null}\n {action.scope ? <span>{action.scope}</span> : null}\n </span>\n ) : null}\n </th>\n ))\n )}\n </tr>\n </thead>\n <tbody>\n {subjects.map((subject) => {\n const subjectMeta = formatSubjectMeta(subject);\n\n return (\n <tr key={subject.id}>\n <th scope=\"row\" className=\"eth-identity-permission-matrix__subject\">\n <span className=\"eth-identity-permission-matrix__subject-label\">\n {subject.label}\n </span>\n {subjectMeta ? <small>{subjectMeta}</small> : null}\n </th>\n {actions.map((action) => {\n const value = assignments[subject.id]?.[action.id] ?? \"inherit\";\n const valueLabel = labelForPermission(value);\n\n return (\n <td\n key={action.id}\n className=\"eth-identity-permission-matrix__cell\"\n data-permission={value}\n data-permission-value={value}\n title={`${subject.label} / ${action.label}: ${valueLabel}`}\n >\n {mode === \"edit\" ? (\n <Select\n aria-label={`${subject.label} ${action.label} permission`}\n className={[\n \"eth-identity-permission-matrix__select\",\n `eth-identity-permission-matrix__select--${value}`\n ].join(\" \")}\n density=\"compact\"\n disabled={!onChange}\n value={value}\n options={permissionOptions}\n onChange={(event) =>\n onChange?.(\n subject.id,\n action.id,\n event.currentTarget.value as PermissionValue\n )\n }\n />\n ) : (\n <Badge\n severity={severityForPermission(value)}\n aria-label={`${subject.label} ${action.label}: ${valueLabel}`}\n className={[\n \"eth-identity-permission-matrix__badge\",\n `eth-identity-permission-matrix__badge--${value}`\n ].join(\" \")}\n >\n <span\n className=\"eth-identity-permission-matrix__status-mark\"\n aria-hidden=\"true\"\n />\n {valueLabel}\n </Badge>\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </>\n ) : (\n <EmptyState\n title=\"No permissions configured\"\n description=\"Add at least one subject and one action to render the permission matrix.\"\n />\n )}\n </Surface>\n );\n}\n\nfunction SummaryItem({\n value,\n label,\n tone\n}: {\n value: number;\n label: string;\n tone: PermissionValue;\n}) {\n return (\n <span\n className={`eth-identity-permission-matrix__summary-item eth-identity-permission-matrix__summary-item--${tone}`}\n >\n <strong>{value}</strong>\n {label}\n </span>\n );\n}\n\nconst permissionOptions: Array<{ value: PermissionValue; label: string }> = [\n { value: \"inherit\", label: \"Inherit\" },\n { value: \"allow\", label: \"Allow\" },\n { value: \"deny\", label: \"Deny\" }\n];\n\nfunction groupActions(actions: PermissionAction[]) {\n const labels = Array.from(new Set(actions.map((action) => action.group ?? \"Permissions\")));\n return labels.map((label) => ({\n label,\n actions: actions.filter((action) => (action.group ?? \"Permissions\") === label)\n }));\n}\n\nfunction severityForPermission(value: PermissionValue): EthSeverity {\n if (value === \"allow\") return \"success\";\n if (value === \"deny\") return \"danger\";\n return \"neutral\";\n}\n\nfunction labelForPermission(value: PermissionValue) {\n return permissionOptions.find((option) => option.value === value)?.label ?? value;\n}\n\nfunction countPermissionValues(\n subjects: IdentitySubject[],\n actions: PermissionAction[],\n assignments: Record<string, Record<string, PermissionValue>>\n) {\n return subjects.reduce(\n (counts, subject) => {\n actions.forEach((action) => {\n const value = assignments[subject.id]?.[action.id] ?? \"inherit\";\n counts[value] += 1;\n });\n return counts;\n },\n { allow: 0, deny: 0, inherit: 0 } satisfies Record<PermissionValue, number>\n );\n}\n\nfunction countResources(actions: PermissionAction[]) {\n return new Set(actions.map((action) => action.resource ?? action.group ?? action.label)).size;\n}\n\nfunction countLabel(value: number, noun: string) {\n return `${value} ${value === 1 ? noun : `${noun}s`}`;\n}\n\nfunction formatSubjectKind(kind: string) {\n return kind.replace(/-/g, \" \");\n}\n\nfunction formatSubjectMeta(subject: IdentitySubject) {\n return [formatSubjectKind(subject.kind), subject.role, subject.description]\n .filter(Boolean)\n .join(\" / \");\n}\n\nfunction nodeToText(node: React.ReactNode, fallback: string) {\n if (typeof node === \"string\") return node;\n if (typeof node === \"number\") return String(node);\n return fallback;\n}\n\nfunction matrixLabelForTitle(title: React.ReactNode) {\n const label = nodeToText(title, \"Permission\");\n return label.toLowerCase().includes(\"matrix\") ? label : `${label} matrix`;\n}\n","import {\n Badge,\n Button,\n EmptyState,\n Surface,\n type EthSeverity,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport type { AccessFinding, AccessReviewSubject } from \"./types\";\n\nexport interface AccessReviewPanelProps extends Omit<SurfaceComponentProps, \"children\"> {\n subjects: AccessReviewSubject[];\n findings: AccessFinding[];\n onApprove?: (subjectId: string, resourceId: string) => void;\n onRevoke?: (subjectId: string, resourceId: string) => void;\n}\n\nexport function AccessReviewPanel({\n subjects,\n findings,\n onApprove,\n onRevoke,\n title,\n className,\n ...props\n}: AccessReviewPanelProps) {\n return (\n <Surface\n {...props}\n title={title}\n className={[\"eth-identity-access-review\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"AccessReviewPanel\"\n >\n {subjects.map((subject) => {\n const subjectFindings = findings.filter((finding) => finding.subjectId === subject.id);\n const subjectMeta = [subject.kind, subject.role].filter(Boolean).join(\" / \");\n\n return (\n <section key={subject.id} className=\"eth-identity-access-review__subject\">\n <header className=\"eth-identity-access-review__subject-header\">\n <div className=\"eth-identity-access-review__identity\">\n <span className=\"eth-identity-access-review__avatar\" aria-hidden=\"true\">\n {initialsForSubject(subject.label)}\n </span>\n <div className=\"eth-identity-access-review__identity-main\">\n <h3>{subject.label}</h3>\n {subject.email ? <p>{subject.email}</p> : null}\n {subjectMeta ? <small>{subjectMeta}</small> : null}\n </div>\n </div>\n <div\n className=\"eth-identity-access-review__findings\"\n aria-label={`${subject.label} access findings`}\n >\n {subjectFindings.length ? (\n subjectFindings.map((finding) => (\n <Badge key={finding.id} severity={severityForFinding(finding.severity)}>\n {finding.reason}\n </Badge>\n ))\n ) : (\n <Badge severity=\"neutral\">No findings</Badge>\n )}\n </div>\n </header>\n <div className=\"eth-identity-access-review__table-wrap\">\n <table className=\"eth-identity-access-review__table\">\n <thead>\n <tr>\n <th scope=\"col\">Resource</th>\n <th scope=\"col\">Permissions</th>\n <th scope=\"col\">Last used</th>\n <th scope=\"col\">Decision</th>\n </tr>\n </thead>\n <tbody>\n {subject.accessTo.length ? (\n subject.accessTo.map((resource) => (\n <tr key={resource.resourceId}>\n <th scope=\"row\">{resource.resourceLabel}</th>\n <td>\n {resource.permissions.length ? (\n <span className=\"eth-identity-access-review__permissions\">\n {resource.permissions.map((permission) => (\n <Badge key={permission} severity=\"neutral\">\n {permission}\n </Badge>\n ))}\n </span>\n ) : (\n <span className=\"eth-identity-access-review__muted\">\n No permissions\n </span>\n )}\n </td>\n <td>\n <span\n className={\n resource.lastUsedAt ? undefined : \"eth-identity-access-review__muted\"\n }\n >\n {resource.lastUsedAt ?? \"Never\"}\n </span>\n </td>\n <td>\n <div className=\"eth-identity-access-review__decision-actions\">\n <Button\n type=\"button\"\n intent=\"success\"\n density=\"compact\"\n disabled={!onApprove}\n aria-label={`Approve ${subject.label} access to ${resource.resourceLabel}`}\n onClick={() => onApprove?.(subject.id, resource.resourceId)}\n >\n Approve\n </Button>\n <Button\n type=\"button\"\n intent=\"danger\"\n density=\"compact\"\n disabled={!onRevoke}\n aria-label={`Revoke ${subject.label} access to ${resource.resourceLabel}`}\n onClick={() => onRevoke?.(subject.id, resource.resourceId)}\n >\n Revoke\n </Button>\n </div>\n </td>\n </tr>\n ))\n ) : (\n <tr>\n <td colSpan={4} className=\"eth-identity-access-review__empty-cell\">\n No resource access assigned.\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </section>\n );\n })}\n {!subjects.length ? (\n <EmptyState\n title=\"No access to review\"\n description=\"Subjects with assigned resources will appear here when a review is ready.\"\n />\n ) : null}\n </Surface>\n );\n}\n\nfunction initialsForSubject(label: string) {\n return (\n label\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part.charAt(0).toUpperCase())\n .join(\"\") || \"ID\"\n );\n}\n\nfunction severityForFinding(severity: AccessFinding[\"severity\"]): EthSeverity {\n if (severity === \"critical\" || severity === \"error\") return \"danger\";\n if (severity === \"warning\") return \"warning\";\n return \"info\";\n}\n","import * as React from \"react\";\nimport {\n Button,\n FormField,\n Select,\n Surface,\n TextInput,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\n\nexport type InviteRole = string | { id: string; label: string };\n\nexport interface InviteUserPanelProps extends Omit<SurfaceComponentProps, \"children\"> {\n roles: InviteRole[];\n onInvite?: (email: string, role: string) => void;\n defaultEmail?: string;\n defaultRole?: string;\n inviteLabel?: React.ReactNode;\n}\n\nfunction isValidInviteEmail(email: string) {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n}\n\nexport function InviteUserPanel({\n roles,\n onInvite,\n title = \"Invite user\",\n description = \"Send a workspace invitation and assign the recipient's initial access role.\",\n defaultEmail = \"\",\n defaultRole,\n inviteLabel = \"Send invite\",\n className,\n ...props\n}: InviteUserPanelProps) {\n const options = React.useMemo(\n () =>\n roles.map((role) =>\n typeof role === \"string\"\n ? { value: role, label: role }\n : { value: role.id, label: role.label }\n ),\n [roles]\n );\n const preferredRole = options.some((option) => option.value === defaultRole)\n ? defaultRole\n : options[0]?.value;\n const [email, setEmail] = React.useState(defaultEmail);\n const [emailTouched, setEmailTouched] = React.useState(false);\n const [role, setRole] = React.useState(preferredRole ?? \"\");\n const [roleTouched, setRoleTouched] = React.useState(false);\n const baseId = React.useId();\n const emailId = `${baseId}-email`;\n const roleId = `${baseId}-role`;\n const trimmedEmail = email.trim();\n const emailIsValid = isValidInviteEmail(trimmedEmail);\n const selectedRole = options.find((option) => option.value === role);\n const emailError = emailTouched\n ? trimmedEmail\n ? emailIsValid\n ? undefined\n : \"Enter a valid email address.\"\n : \"Email is required.\"\n : undefined;\n const roleError = roleTouched && !role ? \"Select a role.\" : undefined;\n const canInvite = Boolean(onInvite && emailIsValid && role);\n const inviteStatus = onInvite\n ? canInvite\n ? \"Ready to send\"\n : \"Needs required fields\"\n : \"Unavailable\";\n\n React.useEffect(() => {\n if (!options.some((option) => option.value === role)) {\n setRole(preferredRole ?? \"\");\n }\n }, [options, preferredRole, role]);\n\n return (\n <Surface\n {...props}\n title={title}\n description={description}\n className={[\"eth-identity-invite-user\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"InviteUserPanel\"\n >\n <form\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n setEmailTouched(true);\n setRoleTouched(true);\n if (emailIsValid && role) onInvite?.(trimmedEmail, role);\n }}\n >\n <div className=\"eth-identity-invite-user__layout\">\n <div className=\"eth-identity-invite-user__fields\">\n <FormField\n id={emailId}\n label=\"Email\"\n helperText=\"Use the recipient's managed workspace email address.\"\n error={emailError}\n required\n >\n <TextInput\n id={emailId}\n type=\"email\"\n value={email}\n placeholder=\"name@company.com\"\n autoComplete=\"email\"\n onBlur={() => setEmailTouched(true)}\n onChange={(event) => setEmail(event.currentTarget.value)}\n />\n </FormField>\n <FormField\n id={roleId}\n label=\"Role\"\n helperText=\"Choose the initial permission set for this invite.\"\n error={roleError}\n required\n >\n <Select\n id={roleId}\n value={role}\n options={options}\n disabled={!options.length}\n onBlur={() => setRoleTouched(true)}\n onChange={(event) => {\n setRoleTouched(true);\n setRole(event.currentTarget.value);\n }}\n />\n </FormField>\n </div>\n <div className=\"eth-identity-invite-user__summary\" aria-live=\"polite\">\n <span className=\"eth-identity-invite-user__summary-label\">Invitation summary</span>\n <dl>\n <div>\n <dt>Recipient</dt>\n <dd>{trimmedEmail || \"Waiting for email\"}</dd>\n </div>\n <div>\n <dt>Initial role</dt>\n <dd>{selectedRole?.label ?? \"No role selected\"}</dd>\n </div>\n <div>\n <dt>Status</dt>\n <dd>{inviteStatus}</dd>\n </div>\n </dl>\n </div>\n </div>\n <div className=\"eth-identity-invite-user__actions\">\n <Button type=\"submit\" disabled={!canInvite}>\n {inviteLabel}\n </Button>\n <p>Access can be reviewed after the recipient accepts the invitation.</p>\n </div>\n </form>\n </Surface>\n );\n}\n","import * as React from \"react\";\nimport { StatusDot, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport type { OrganizationRef } from \"./types\";\n\nexport interface OrganizationSwitcherProps extends Omit<SurfaceComponentProps, \"children\"> {\n organizations: OrganizationRef[];\n activeId?: string;\n defaultOpen?: boolean;\n onSwitch?: (id: string) => void;\n}\n\nexport function OrganizationSwitcher({\n organizations,\n activeId,\n defaultOpen = false,\n onSwitch,\n className\n}: OrganizationSwitcherProps) {\n const [open, setOpen] = React.useState(defaultOpen);\n const [selectedId, setSelectedId] = React.useState(activeId ?? organizations[0]?.id);\n const detailsRef = React.useRef<HTMLDetailsElement>(null);\n const listRef = React.useRef<HTMLDivElement>(null);\n const active =\n organizations.find((organization) => organization.id === (activeId ?? selectedId)) ??\n organizations[0];\n const triggerLabel = active\n ? `Switch organization, current organization ${active.label}`\n : \"Switch organization\";\n\n React.useEffect(() => {\n if (activeId !== undefined) setSelectedId(activeId);\n }, [activeId]);\n\n React.useEffect(() => {\n if (!organizations.some((organization) => organization.id === selectedId)) {\n setSelectedId(organizations[0]?.id);\n }\n }, [organizations, selectedId]);\n\n const closeMenu = React.useCallback(() => {\n setOpen(false);\n detailsRef.current?.querySelector(\"summary\")?.focus();\n }, []);\n\n const selectOrganization = (organization: OrganizationRef) => {\n if (activeId === undefined) setSelectedId(organization.id);\n onSwitch?.(organization.id);\n closeMenu();\n };\n\n return (\n <div\n className={[\"eth-identity-organization-switcher\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"OrganizationSwitcher\"\n >\n <details\n ref={detailsRef}\n className=\"eth-popover\"\n open={open}\n onToggle={(event) => {\n const nextOpen = event.currentTarget.open;\n setOpen(nextOpen);\n if (nextOpen) window.setTimeout(() => listRef.current?.focus(), 0);\n }}\n >\n <summary aria-haspopup=\"menu\" aria-expanded={open} aria-label={triggerLabel}>\n <span className=\"eth-identity-organization-switcher__trigger\">\n <span className=\"eth-identity-organization-switcher__avatar\" aria-hidden=\"true\">\n {active ? initials(active.label) : \"ORG\"}\n </span>\n <span className=\"eth-identity-organization-switcher__copy\">\n <span className=\"eth-identity-organization-switcher__label\">\n {active?.label ?? \"Select organization\"}\n </span>\n <span className=\"eth-identity-organization-switcher__meta\">\n {active?.description ?? `${organizations.length} organizations`}\n </span>\n </span>\n {active?.status ? (\n <StatusDot status={active.status} label={formatStatus(active.status)} />\n ) : null}\n <span className=\"eth-identity-organization-switcher__chevron\" aria-hidden=\"true\" />\n </span>\n </summary>\n <div\n ref={listRef}\n tabIndex={-1}\n className=\"eth-identity-organization-switcher__list\"\n role=\"menu\"\n aria-label=\"Organizations\"\n onKeyDown={(event) => {\n if (event.key === \"Escape\") closeMenu();\n }}\n >\n {organizations.length ? (\n organizations.map((organization) => {\n const selected = organization.id === active?.id;\n\n return (\n <button\n key={organization.id}\n type=\"button\"\n className=\"eth-identity-organization-switcher__option\"\n role=\"menuitemradio\"\n aria-checked={selected}\n aria-current={selected ? \"true\" : undefined}\n onClick={() => selectOrganization(organization)}\n >\n <span className=\"eth-identity-organization-switcher__option-main\">\n <span className=\"eth-identity-organization-switcher__option-label\">\n {organization.label}\n </span>\n {organization.description ? (\n <span className=\"eth-identity-organization-switcher__option-meta\">\n {organization.description}\n </span>\n ) : null}\n </span>\n <span className=\"eth-identity-organization-switcher__option-state\">\n {organization.status ? (\n <StatusDot\n status={organization.status}\n label={formatStatus(organization.status)}\n />\n ) : null}\n <span\n className=\"eth-identity-organization-switcher__option-check\"\n aria-hidden=\"true\"\n />\n </span>\n </button>\n );\n })\n ) : (\n <div className=\"eth-identity-organization-switcher__empty\" role=\"none\">\n No organizations available\n </div>\n )}\n </div>\n </details>\n </div>\n );\n}\n\nfunction initials(label: string) {\n const value = label\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]?.toUpperCase())\n .join(\"\");\n\n return value || \"ORG\";\n}\n\nfunction formatStatus(status: string) {\n return status\n .split(\"-\")\n .map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)\n .join(\" \");\n}\n","import * as React from \"react\";\nimport { StatusDot, type EthAction, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport { RoleBadge } from \"./RoleBadge\";\nimport type { IdentityRef } from \"./types\";\n\nexport interface AccountMenuProps extends Omit<SurfaceComponentProps, \"children\" | \"actions\"> {\n user: IdentityRef;\n actions: EthAction[];\n defaultOpen?: boolean;\n}\n\nexport function AccountMenu({ user, actions, defaultOpen = false, className }: AccountMenuProps) {\n const [open, setOpen] = React.useState(defaultOpen);\n const detailsRef = React.useRef<HTMLDetailsElement>(null);\n const contentRef = React.useRef<HTMLDivElement>(null);\n const userDescriptor = user.email ?? user.role ?? user.kind;\n\n const closeMenu = React.useCallback(() => {\n setOpen(false);\n detailsRef.current?.querySelector(\"summary\")?.focus();\n }, []);\n\n return (\n <div\n className={[\"eth-identity-account-menu\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"AccountMenu\"\n >\n <details\n ref={detailsRef}\n className=\"eth-popover\"\n open={open}\n onToggle={(event) => {\n const nextOpen = event.currentTarget.open;\n setOpen(nextOpen);\n if (nextOpen) window.setTimeout(() => contentRef.current?.focus(), 0);\n }}\n >\n <summary\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={`Account menu for ${user.label}`}\n >\n <span className=\"eth-identity-account-menu__trigger\">\n <Avatar label={user.label} src={user.avatar} />\n <span className=\"eth-identity-account-menu__trigger-copy\">\n <span className=\"eth-identity-account-menu__trigger-label\">{user.label}</span>\n {userDescriptor ? (\n <span className=\"eth-identity-account-menu__trigger-meta\">{userDescriptor}</span>\n ) : null}\n </span>\n <span className=\"eth-identity-account-menu__chevron\" aria-hidden=\"true\" />\n </span>\n </summary>\n <div\n ref={contentRef}\n tabIndex={-1}\n className=\"eth-identity-account-menu__content\"\n onKeyDown={(event) => {\n if (event.key === \"Escape\") closeMenu();\n }}\n >\n <div className=\"eth-identity-account-menu__profile\">\n <Avatar label={user.label} src={user.avatar} />\n <div className=\"eth-identity-account-menu__profile-copy\">\n <strong>{user.label}</strong>\n {user.email ? <p>{user.email}</p> : null}\n <div className=\"eth-identity-account-menu__meta\">\n {user.role ? <RoleBadge role={user.role} /> : null}\n {user.status ? <StatusDot status={user.status} label={user.status} /> : null}\n </div>\n </div>\n </div>\n <div\n className=\"eth-identity-account-menu__actions\"\n role=\"menu\"\n aria-label={`Actions for ${user.label}`}\n >\n {actions.map((action) => (\n <AccountMenuAction key={action.id} action={action} onClose={closeMenu} />\n ))}\n </div>\n </div>\n </details>\n </div>\n );\n}\n\nfunction AccountMenuAction({ action, onClose }: { action: EthAction; onClose: () => void }) {\n const className = [\n \"eth-identity-account-menu__action\",\n action.intent === \"danger\" ? \"eth-identity-account-menu__action--danger\" : null\n ]\n .filter(Boolean)\n .join(\" \");\n\n if (action.href && !action.disabled) {\n return (\n <a\n className={className}\n href={action.href}\n role=\"menuitem\"\n onClick={() => {\n action.onSelect?.();\n onClose();\n }}\n >\n {action.label}\n </a>\n );\n }\n\n return (\n <button\n className={className}\n type=\"button\"\n disabled={action.disabled}\n role=\"menuitem\"\n onClick={() => {\n action.onSelect?.();\n onClose();\n }}\n >\n {action.label}\n </button>\n );\n}\n\nfunction Avatar({ label, src }: { label: string; src?: string }) {\n if (src) return <img className=\"eth-identity-account-menu__avatar\" src={src} alt=\"\" />;\n return (\n <span className=\"eth-identity-account-menu__avatar\" aria-hidden=\"true\">\n {initials(label)}\n </span>\n );\n}\n\nfunction initials(label: string) {\n return label\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]?.toUpperCase())\n .join(\"\");\n}\n","import {\n Badge,\n Surface,\n type EthOperationalStatus,\n type EthSeverity,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\n\nconst EXPIRING_SOON_MS = 24 * 60 * 60 * 1000;\n\nexport interface SessionStatusProps extends Omit<SurfaceComponentProps, \"children\"> {\n session: {\n expiresAt: string;\n mfaEnabled: boolean;\n lastIp?: string;\n };\n}\n\nexport function SessionStatus({\n session,\n title,\n description,\n className,\n severity,\n status,\n ...props\n}: SessionStatusProps) {\n const expires = new Date(session.expiresAt);\n const hasValidExpiration = Number.isFinite(expires.valueOf());\n const expiresAt = hasValidExpiration ? expires.getTime() : null;\n const now = Date.now();\n const expired = expiresAt !== null && expiresAt < now;\n const expiringSoon = expiresAt !== null && !expired && expiresAt - now <= EXPIRING_SOON_MS;\n const needsReview = !session.mfaEnabled || expiringSoon || !hasValidExpiration;\n const tone: EthSeverity = expired ? \"danger\" : needsReview ? \"warning\" : \"success\";\n const resolvedStatus: EthOperationalStatus =\n status ?? (expired ? \"stale\" : needsReview ? \"warning\" : \"active\");\n const sessionState = expired ? \"Expired\" : expiringSoon ? \"Expiring soon\" : \"Active\";\n const summaryTitle = summaryTitleForSession({ expired, needsReview });\n const summaryDetail = summaryForSession({\n expired,\n expiringSoon,\n hasValidExpiration,\n mfaEnabled: session.mfaEnabled\n });\n const summaryClassName = [\n \"eth-identity-session-status__summary\",\n `eth-identity-session-status__summary--${tone}`\n ].join(\" \");\n\n return (\n <Surface\n {...props}\n title={title === undefined ? \"Session security\" : title}\n description={\n description === undefined\n ? \"Authentication freshness and recent access signal.\"\n : description\n }\n severity={severity}\n status={resolvedStatus}\n className={[\"eth-identity-session-status\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"SessionStatus\"\n >\n <div className={summaryClassName}>\n <span className=\"eth-identity-session-status__summary-mark\" aria-hidden=\"true\" />\n <div className=\"eth-identity-session-status__summary-copy\">\n <strong>{summaryTitle}</strong>\n <span>{summaryDetail}</span>\n </div>\n </div>\n <dl aria-label=\"Session details\">\n <div>\n <dt>Session</dt>\n <dd className=\"eth-identity-session-status__value\">\n <span className=\"eth-identity-session-status__value-main\">\n <Badge severity={tone}>{sessionState}</Badge>\n </span>\n <span className=\"eth-identity-session-status__detail\">\n {expired ? \"Credentials are no longer valid.\" : \"Authenticated session lifecycle.\"}\n </span>\n </dd>\n </div>\n <div>\n <dt>Expires</dt>\n <dd className=\"eth-identity-session-status__value\">\n <span className=\"eth-identity-session-status__value-main\">\n {hasValidExpiration ? (\n <time\n aria-label=\"Session expiration\"\n dateTime={session.expiresAt}\n title={session.expiresAt}\n >\n {formatSessionDate(expires)}\n </time>\n ) : (\n <span>Unknown</span>\n )}\n </span>\n <span className=\"eth-identity-session-status__detail\">\n {expirationDetail({ expired, expiringSoon, hasValidExpiration })}\n </span>\n </dd>\n </div>\n <div>\n <dt>MFA</dt>\n <dd className=\"eth-identity-session-status__value\">\n <span className=\"eth-identity-session-status__value-main\">\n <Badge severity={session.mfaEnabled ? \"success\" : \"warning\"}>\n {session.mfaEnabled ? \"Enabled\" : \"Disabled\"}\n </Badge>\n </span>\n <span className=\"eth-identity-session-status__detail\">\n {session.mfaEnabled\n ? \"Second factor challenge is enforced.\"\n : \"No second factor is enforced for this session.\"}\n </span>\n </dd>\n </div>\n <div>\n <dt>Last IP</dt>\n <dd className=\"eth-identity-session-status__value\">\n <span className=\"eth-identity-session-status__value-main\">\n {session.lastIp ? (\n <code className=\"eth-identity-session-status__code\">{session.lastIp}</code>\n ) : (\n <span className=\"eth-identity-session-status__muted\">Not recorded</span>\n )}\n </span>\n <span className=\"eth-identity-session-status__detail\">\n Latest network signal captured for the session.\n </span>\n </dd>\n </div>\n </dl>\n </Surface>\n );\n}\n\nfunction formatSessionDate(value: Date) {\n return new Intl.DateTimeFormat(undefined, {\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n month: \"short\",\n timeZoneName: \"short\",\n year: \"numeric\"\n }).format(value);\n}\n\nfunction summaryTitleForSession({\n expired,\n needsReview\n}: {\n expired: boolean;\n needsReview: boolean;\n}) {\n if (expired) return \"Session expired\";\n if (needsReview) return \"Review required\";\n return \"Session active\";\n}\n\nfunction summaryForSession({\n expired,\n expiringSoon,\n hasValidExpiration,\n mfaEnabled\n}: {\n expired: boolean;\n expiringSoon: boolean;\n hasValidExpiration: boolean;\n mfaEnabled: boolean;\n}) {\n if (!hasValidExpiration) return \"Expiration could not be verified from the provided timestamp.\";\n if (expired) return \"Access should be refreshed or revoked before more work continues.\";\n if (!mfaEnabled) return \"MFA is disabled, so this session needs security review.\";\n if (expiringSoon) return \"The session is valid but expires within the next 24 hours.\";\n return \"MFA is enabled and the session remains within its validity window.\";\n}\n\nfunction expirationDetail({\n expired,\n expiringSoon,\n hasValidExpiration\n}: {\n expired: boolean;\n expiringSoon: boolean;\n hasValidExpiration: boolean;\n}) {\n if (!hasValidExpiration) return \"Timestamp could not be parsed.\";\n if (expired) return \"Past the identity provider expiry.\";\n if (expiringSoon) return \"Expires within 24 hours.\";\n return \"Valid until scheduled expiry.\";\n}\n","import { Badge, EmptyState, Surface, type EthSeverity, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport { DataTable, type DataColumn } from \"@echothink-ui/data\";\nimport type { AuditTrailEntry } from \"./types\";\n\nexport interface AuditTrailProps extends Omit<SurfaceComponentProps, \"children\"> {\n entries: AuditTrailEntry[];\n}\n\ntype AuditTrailRow = Record<string, unknown> & AuditTrailEntry;\n\nexport function AuditTrail({\n entries,\n title = \"Audit trail\",\n subtitle,\n description = \"Identity and access audit history ordered by latest event.\",\n density = \"compact\",\n metadata,\n className,\n role,\n \"aria-label\": ariaLabel,\n ...props\n}: AuditTrailProps) {\n const rows: AuditTrailRow[] = entries.map((entry) => ({ ...entry }));\n const successCount = entries.filter((entry) => entry.outcome === \"success\").length;\n const failureCount = entries.length - successCount;\n const resolvedSubtitle = subtitle ?? `${entries.length} ${entries.length === 1 ? \"event\" : \"events\"}`;\n const resolvedMetadata =\n metadata ?? [\n { label: \"Events\", value: entries.length },\n { label: \"Successful\", value: successCount },\n { label: \"Failures\", value: failureCount }\n ];\n const columns: DataColumn<AuditTrailRow>[] = [\n {\n key: \"timestamp\",\n header: \"Time\",\n width: \"8.5rem\",\n render: (row) => (\n <time className=\"eth-identity-audit-trail__time\">{row.timestamp}</time>\n )\n },\n {\n key: \"actor\",\n header: \"Actor\",\n width: \"9rem\",\n render: (row) => <span className=\"eth-identity-audit-trail__actor\">{row.actor}</span>\n },\n {\n key: \"action\",\n header: \"Action\",\n width: \"11rem\",\n render: (row) => <span className=\"eth-identity-audit-trail__action\">{row.action}</span>\n },\n {\n key: \"resource\",\n header: \"Resource\",\n render: (row) => <span className=\"eth-identity-audit-trail__resource\">{row.resource}</span>\n },\n {\n key: \"outcome\",\n header: \"Outcome\",\n width: \"8rem\",\n render: (row) => (\n <span className=\"eth-identity-audit-trail__outcome\">\n <Badge severity={outcomeSeverity(row.outcome)}>{outcomeLabel(row.outcome)}</Badge>\n </span>\n )\n }\n ];\n\n return (\n <Surface\n {...props}\n title={title}\n subtitle={resolvedSubtitle}\n description={description}\n density={density}\n metadata={resolvedMetadata}\n className={[\"eth-identity-audit-trail\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"AuditTrail\"\n role={role ?? \"region\"}\n aria-label={ariaLabel ?? (typeof title === \"string\" ? title : \"Audit trail\")}\n >\n <DataTable\n rows={rows}\n columns={columns}\n density={density}\n emptyState={\n <EmptyState\n title=\"No audit events\"\n description=\"Identity and access events will appear here when they are recorded.\"\n />\n }\n />\n </Surface>\n );\n}\n\nfunction outcomeSeverity(outcome: AuditTrailEntry[\"outcome\"]): EthSeverity {\n return outcome === \"success\" ? \"success\" : \"danger\";\n}\n\nfunction outcomeLabel(outcome: AuditTrailEntry[\"outcome\"]) {\n return outcome === \"success\" ? \"Success\" : \"Failure\";\n}\n","import { Badge, Surface, type SurfaceComponentProps } from \"@echothink-ui/core\";\nimport type { PolicyRule } from \"./types\";\n\nexport interface PolicyRuleViewerProps extends Omit<SurfaceComponentProps, \"children\"> {\n rule: PolicyRule;\n}\n\nfunction effectLabel(effect: PolicyRule[\"effect\"]) {\n return effect === \"allow\" ? \"Allow\" : \"Deny\";\n}\n\nfunction renderRuleValues(values: string[], label: string) {\n if (!values.length) {\n return <span className=\"eth-identity-policy-rule-viewer__empty\">Not specified</span>;\n }\n\n return (\n <ul className=\"eth-identity-policy-rule-viewer__values\" aria-label={`${label} list`}>\n {values.map((value) => (\n <li key={value}>\n <code>{value}</code>\n </li>\n ))}\n </ul>\n );\n}\n\nexport function PolicyRuleViewer({ rule, title, className, ...props }: PolicyRuleViewerProps) {\n const effect = effectLabel(rule.effect);\n\n return (\n <Surface\n {...props}\n title={title ?? `Policy rule ${rule.id}`}\n className={[\"eth-identity-policy-rule-viewer\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"PolicyRuleViewer\"\n >\n <dl className=\"eth-identity-policy-rule-viewer__facet-list\">\n <div\n className=\"eth-identity-policy-rule-viewer__facet eth-identity-policy-rule-viewer__facet--effect\"\n >\n <dt>Effect</dt>\n <dd>\n <Badge\n aria-label={`Rule effect: ${effect}`}\n className=\"eth-identity-policy-rule-viewer__effect\"\n severity={rule.effect === \"allow\" ? \"success\" : \"danger\"}\n >\n {effect}\n </Badge>\n </dd>\n </div>\n <div>\n <dt>Subjects</dt>\n <dd>{renderRuleValues(rule.subjects, \"Subjects\")}</dd>\n </div>\n <div>\n <dt>Actions</dt>\n <dd>{renderRuleValues(rule.actions, \"Actions\")}</dd>\n </div>\n <div>\n <dt>Resources</dt>\n <dd>{renderRuleValues(rule.resources, \"Resources\")}</dd>\n </div>\n {rule.conditions ? (\n <div>\n <dt>Conditions</dt>\n <dd>\n <code className=\"eth-identity-policy-rule-viewer__condition\">\n {rule.conditions}\n </code>\n </dd>\n </div>\n ) : null}\n </dl>\n </Surface>\n );\n}\n","import { useId } from \"react\";\nimport {\n Badge,\n FormField,\n NumberInput,\n Surface,\n Tag,\n TextInput,\n Textarea,\n type SurfaceComponentProps\n} from \"@echothink-ui/core\";\nimport { RuleBuilder, type RuleDefinition } from \"@echothink-ui/forms\";\nimport type { ApprovalPolicy, ApprovalPolicySchema } from \"./types\";\n\nexport interface ApprovalPolicyEditorProps extends Omit<\n SurfaceComponentProps,\n \"children\" | \"onChange\"\n> {\n policy: ApprovalPolicy;\n schema: ApprovalPolicySchema;\n onChange?: (policy: ApprovalPolicy) => void;\n}\n\nexport function ApprovalPolicyEditor({\n policy,\n schema,\n onChange,\n title,\n description,\n actions,\n className,\n ...props\n}: ApprovalPolicyEditorProps) {\n const generatedId = useId().replace(/[^a-zA-Z0-9_-]/g, \"\");\n const policyDomId = `eth-identity-policy-${String(policy.id ?? generatedId).replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n const variables = schema.variables ?? Object.keys(schema.properties ?? {});\n const rules = policy.rules ?? [];\n const approvers = policy.approvers ?? [];\n const requiredApprovals = policy.requiredApprovals ?? 1;\n const update = (patch: Partial<ApprovalPolicy>) => onChange?.({ ...policy, ...patch });\n\n return (\n <Surface\n {...props}\n title={title ?? \"Approval policy\"}\n description={\n description ??\n schema.description ??\n \"Configure approval thresholds, reviewers, and workflow rules for governed actions.\"\n }\n actions={actions ?? policy.actions}\n className={[\"eth-identity-approval-policy-editor\", className].filter(Boolean).join(\" \")}\n data-eth-component=\"ApprovalPolicyEditor\"\n >\n <div className=\"eth-identity-approval-policy-editor__layout\">\n <div className=\"eth-identity-approval-policy-editor__fields\">\n <FormField id={`${policyDomId}-name`} label=\"Policy name\" required>\n <TextInput\n id={`${policyDomId}-name`}\n value={policy.name ?? \"\"}\n onChange={(event) => update({ name: event.currentTarget.value })}\n />\n </FormField>\n <FormField id={`${policyDomId}-description`} label=\"Description\">\n <Textarea\n id={`${policyDomId}-description`}\n value={policy.description ?? \"\"}\n onChange={(event) => update({ description: event.currentTarget.value })}\n />\n </FormField>\n <FormField\n id={`${policyDomId}-required`}\n label=\"Required approvals\"\n helperText=\"Minimum number of reviewers who must approve before the workflow can continue.\"\n >\n <NumberInput\n id={`${policyDomId}-required`}\n min={1}\n value={requiredApprovals}\n onChange={(event) => update({ requiredApprovals: Number(event.currentTarget.value) })}\n />\n </FormField>\n </div>\n\n <aside\n className=\"eth-identity-approval-policy-editor__summary\"\n aria-label=\"Approval policy summary\"\n >\n <div className=\"eth-identity-approval-policy-editor__summary-header\">\n <h3>Workflow gates</h3>\n <Badge severity={rules.length ? \"success\" : \"warning\"}>\n {rules.length ? \"Configured\" : \"Needs rules\"}\n </Badge>\n </div>\n <dl className=\"eth-identity-approval-policy-editor__summary-grid\">\n <div>\n <dt>Required approvals</dt>\n <dd>{requiredApprovals}</dd>\n </div>\n <div>\n <dt>Rules</dt>\n <dd>{rules.length}</dd>\n </div>\n <div>\n <dt>Approvers</dt>\n <dd>{approvers.length ? approvers.length : \"Unassigned\"}</dd>\n </div>\n </dl>\n <div className=\"eth-identity-approval-policy-editor__approvers\">\n <span>Reviewer pool</span>\n {approvers.length ? (\n <div className=\"eth-identity-approval-policy-editor__approver-list\">\n {approvers.map((approver) => (\n <Tag key={approver.id}>{approver.label}</Tag>\n ))}\n </div>\n ) : (\n <p>No approvers assigned to this policy.</p>\n )}\n </div>\n </aside>\n </div>\n <RuleBuilder\n className=\"eth-identity-approval-policy-editor__rules\"\n rules={rules as RuleDefinition[]}\n variables={variables}\n onChange={(nextRules) => update({ rules: nextRules })}\n />\n </Surface>\n );\n}\n"],"mappings":"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","names":["import_core","import_jsx_runtime","import_core","import_jsx_runtime","React","import_core","import_jsx_runtime","import_core","import_jsx_runtime","initials","import_core","import_jsx_runtime","import_core","import_jsx_runtime","React","import_core","import_jsx_runtime","role","React","import_core","import_jsx_runtime","initials","React","import_core","import_jsx_runtime","Avatar","initials","import_core","import_jsx_runtime","import_core","import_jsx_runtime","import_core","import_jsx_runtime","import_core","import_jsx_runtime"]}
|