@hjmds/react 1.44.0 → 1.45.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.
@@ -61,7 +61,7 @@ export type ChatRoomProfileProps = Readonly<{
61
61
  /** The product picks/uploads the image and returns its persistent URL; null means cancellation. */
62
62
  onPickPhoto?: () => Promise<string | null>;
63
63
  presentation?: "centered" | "inline";
64
- title?: string;
64
+ title: string;
65
65
  back?: Exit;
66
66
  /** Live count under the name field (KakaoTalk 0/20); the product owns the limit its server accepts and the locale. */
67
67
  nameCharacterCount?: CharacterCountOptions;
@@ -116,7 +116,15 @@ export type ChatRoomActionsProps = Readonly<{
116
116
  deleteRoom?: ChatRoomConfirmation;
117
117
  disabled?: boolean;
118
118
  }>;
119
- export declare function ChatRoomActions({ leave, deleteHistory, deleteRoom, disabled }: ChatRoomActionsProps): import("react").JSX.Element;
119
+ export declare function ChatRoomActions({ leave, deleteHistory, deleteRoom, disabled }: ChatRoomActionsProps): import("react").JSX.Element | null;
120
+ /** `pressed` makes the tile a toggle (mute): its surface and the product icon show the current state. */
121
+ export type ChatRoomTool = Readonly<{
122
+ id: string;
123
+ label: string;
124
+ icon?: ReactNode;
125
+ pressed?: boolean;
126
+ onPress: () => void | Promise<void>;
127
+ }>;
120
128
  export type ChatRoomDetailsProps = Readonly<{
121
129
  profile: ChatRoomProfileValue;
122
130
  back?: Exit;
@@ -124,12 +132,7 @@ export type ChatRoomDetailsProps = Readonly<{
124
132
  memberCountLabel: string;
125
133
  edit?: Exit;
126
134
  /** Search, shared media, invite and notification settings use product-owned routes. */
127
- tools?: readonly Readonly<{
128
- id: string;
129
- label: string;
130
- icon?: ReactNode;
131
- onPress: () => void | Promise<void>;
132
- }>[];
135
+ tools?: readonly ChatRoomTool[];
133
136
  members: ChatRoomMembersProps;
134
137
  actions?: ChatRoomActionsProps;
135
138
  errorLabel: string;
@@ -1 +1 @@
1
- {"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useEffect, useRef, useState } from "react";
4
4
  import { validateReplyTarget } from "@hjmds/design-contracts/communication";
5
- import { ChatMessage, MessageComposer } from "./screens.js";
5
+ import { ChatMessage, MessageComposer, ScreenLayout } from "./screens.js";
6
6
  import { SearchScreen } from "./screen-flows.js";
7
7
  import { Button, IconButton } from "./actions.js";
8
8
  import { Icon } from "./supplemental-display.js";
@@ -14,7 +14,6 @@ import { Avatar } from "./advanced-display.js";
14
14
  import { ListRow } from "./display.js";
15
15
  import { AlertDialog, Menu } from "./overlays.js";
16
16
  import { TextField, SearchField } from "./forms.js";
17
- import { TopBar } from "./top-bar.js";
18
17
  import { Checkbox } from "./selection.js";
19
18
  export function ReplyMessage({ messageId, onReply, replyLabel, replyDisabled = false, swipeAction = "reply", ...message }) {
20
19
  if (!messageId.trim())
@@ -92,12 +91,12 @@ export function ChatRoomProfile({ value, onValueChange, onSave, onPickPhoto, dis
92
91
  const identity = value.name.trim() ? { name: value.name, alt: labels.photo } : { decorative: true, renderFallback: () => _jsx(Icon, { name: "users", tone: "secondary" }) };
93
92
  const avatar = (accessory) => _jsx(Avatar, { ...photoOf(value.photoUrl), size: chatRoomRecipe.heroAvatar, ...identity, ...(accessory ? { accessory } : {}) });
94
93
  const inline = presentation === "inline";
95
- return _jsxs(Stack, { gap: "md", children: [_jsx(TopBar, { ...(title ? { title } : {}), ...(back ? { exit: { kind: "back", label: back.label, onClick: back.onPress } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: blocked || submitDisabled || !canSubmitChatRoom(value), loading: save.pending, onClick: () => void save.run("save", () => onSave(value)), children: labels.save }) }), _jsxs(Stack, { axis: inline ? "inline" : "block", align: "center", gap: "md", children: [_jsxs(Stack, { align: "center", gap: "xs", children: [onPickPhoto ? _jsx("button", { type: "button", className: "hjm-chat-room__photo", "aria-label": labels.changePhoto, "aria-busy": photo.pending, disabled: blocked, onClick: () => void photo.run("photo", async () => { const url = await onPickPhoto(); if (url !== null && mounted.current)
96
- latest.current.onValueChange({ ...latest.current.value, photoUrl: url }); }), children: avatar(_jsx("span", { className: "hjm-chat-room__badge", children: _jsx(Icon, { name: "edit", size: "xs" }) })) }) : avatar(), onPickPhoto && value.photoUrl && !inline ? _jsx(Button, { tone: "ghost", size: "small", disabled: blocked, onClick: () => patch({ photoUrl: null }), children: labels.removePhoto }) : null] }), _jsx(Stack, { gap: "xs", layoutStyle: inline ? { flex: 1, minWidth: 0 } : { alignSelf: "stretch" }, children: _jsx(TextField, { label: labels.name, value: value.name, onValueChange: name => patch({ name }), disabled: blocked, ...(nameCharacterCount ? { characterCount: nameCharacterCount } : {}) }) })] }), onPickPhoto && value.photoUrl && inline ? _jsx(Button, { tone: "ghost", size: "small", disabled: blocked, layoutStyle: { alignSelf: "flex-start" }, onClick: () => patch({ photoUrl: null }), children: labels.removePhoto }) : null, _jsx(TextField, { label: labels.description, value: value.description, onValueChange: description => patch({ description }), disabled: blocked }), photo.failed ? _jsx(Text, { role: "alert", tone: "danger", children: labels.photoError }) : null, save.failed ? _jsx(Text, { role: "alert", tone: "danger", children: labels.error }) : null, typeof children === "function" ? children(blocked) : children] });
94
+ return _jsx(ScreenLayout, { title: title, ...(back ? { exit: { kind: "back", label: back.label, onClick: back.onPress } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: blocked || submitDisabled || !canSubmitChatRoom(value), loading: save.pending, onClick: () => void save.run("save", () => onSave(value)), children: labels.save }), children: _jsxs(Stack, { gap: "md", children: [_jsxs(Stack, { axis: inline ? "inline" : "block", align: "center", gap: "md", children: [_jsxs(Stack, { align: "center", gap: "xs", children: [onPickPhoto ? _jsx("button", { type: "button", className: "hjm-chat-room__photo", "aria-label": labels.changePhoto, "aria-busy": photo.pending, disabled: blocked, onClick: () => void photo.run("photo", async () => { const url = await onPickPhoto(); if (url !== null && mounted.current)
95
+ latest.current.onValueChange({ ...latest.current.value, photoUrl: url }); }), children: avatar(_jsx("span", { className: "hjm-chat-room__badge", children: _jsx(Icon, { name: "edit", size: "xs" }) })) }) : avatar(), onPickPhoto && value.photoUrl && !inline ? _jsx(Button, { tone: "ghost", size: "small", disabled: blocked, onClick: () => patch({ photoUrl: null }), children: labels.removePhoto }) : null] }), _jsx(Stack, { gap: "xs", layoutStyle: inline ? { flex: 1, minWidth: 0 } : { alignSelf: "stretch" }, children: _jsx(TextField, { label: labels.name, value: value.name, onValueChange: name => patch({ name }), disabled: blocked, ...(nameCharacterCount ? { characterCount: nameCharacterCount } : {}) }) })] }), onPickPhoto && value.photoUrl && inline ? _jsx(Button, { tone: "ghost", size: "small", disabled: blocked, layoutStyle: { alignSelf: "flex-start" }, onClick: () => patch({ photoUrl: null }), children: labels.removePhoto }) : null, _jsx(TextField, { label: labels.description, value: value.description, onValueChange: description => patch({ description }), disabled: blocked }), photo.failed ? _jsx(Text, { role: "alert", tone: "danger", children: labels.photoError }) : null, save.failed ? _jsx(Text, { role: "alert", tone: "danger", children: labels.error }) : null, typeof children === "function" ? children(blocked) : children] }) });
97
96
  }
98
97
  export function ChatRoomMembers({ members, title, emptyLabel, countLabel, onSelectionChange, disabled = false, invite, renderActions, memberActions }) {
99
98
  const leading = (member) => _jsx(Avatar, { size: chatRoomRecipe.memberAvatar, ...photoOf(member.photoUrl), name: member.name, decorative: true });
100
- return _jsxs(Stack, { gap: "xs", children: [_jsxs("div", { className: "hjm-chat-room__heading", children: [_jsx(Text, { variant: "label", children: title }), countLabel ? _jsx(Text, { variant: "label", tone: "muted", children: countLabel }) : null] }), invite ? _jsx(ListRow, { title: invite.label, tone: "brand", leading: _jsx("span", { className: "hjm-chat-room__add", children: _jsx(Icon, { name: "add", size: "sm" }) }), disabled: disabled, onClick: invite.onPress }) : null, members.length === 0 ? _jsx(Text, { tone: "muted", children: emptyLabel }) : members.map(member => onSelectionChange ?
99
+ return _jsxs(Stack, { gap: "xs", children: [_jsxs("div", { className: "hjm-chat-room__heading", children: [_jsx(Text, { variant: "label", children: title }), countLabel ? _jsx(Text, { variant: "label", tone: "brand", children: countLabel }) : null] }), invite ? _jsx(ListRow, { title: invite.label, tone: "brand", leading: _jsx("span", { className: "hjm-chat-room__add", children: _jsx(Icon, { name: "add", size: "sm" }) }), disabled: disabled, onClick: invite.onPress }) : null, members.length === 0 ? _jsx(Text, { tone: "muted", children: emptyLabel }) : members.map(member => onSelectionChange ?
101
100
  _jsx(Checkbox, { presentation: "plain", label: member.name, ...(member.detail ? { description: member.detail } : {}), renderLeading: () => leading(member), checked: member.selected === true, disabled: disabled || member.disabled === true, onCheckedChange: selected => onSelectionChange(member.id, selected), layoutStyle: { width: "100%" } }, member.id) :
102
101
  _jsx(ListRow, { title: member.name, ...(member.detail ? { description: member.detail } : {}), leading: leading(member), ...(member.role ? { trailing: _jsx(Text, { variant: "caption", tone: "brand", children: member.role }) } : {}), trailingAction: _jsxs(_Fragment, { children: [memberActions ? _jsx(RoomActionList, { actions: memberActions.items(member), disabled: disabled, menu: { label: memberActions.label(member), dismissLabel: memberActions.dismissLabel } }) : null, renderActions?.(member)] }) }, member.id))] });
103
102
  }
@@ -112,35 +111,41 @@ function MemberPicker({ members, title, emptyLabel, search, selection, onSelecti
112
111
  // A product that searches its server owns the query and the result list; otherwise names are filtered here.
113
112
  const remote = search.onQueryChange !== undefined, query = remote ? search.query ?? "" : localQuery;
114
113
  const selected = selectedChatRoomMembers(members);
115
- return _jsxs(Stack, { gap: "sm", children: [_jsx(SearchField, { placeholder: search.label, "aria-label": search.label, clearLabel: search.clearLabel, loading: search.searching === true, value: query, onValueChange: remote ? search.onQueryChange : setLocalQuery }), _jsx(SelectedMembers, { members: selected, labels: selection, onRemove: id => onSelectionChange(id, false), disabled: disabled }), _jsx(ChatRoomMembers, { members: remote ? members : filterChatRoomMembers(members, query), title: title, countLabel: selection.count(selected.length), emptyLabel: emptyLabel, onSelectionChange: onSelectionChange, disabled: disabled })] });
114
+ return _jsxs(Stack, { gap: "sm", children: [_jsx(SearchField, { placeholder: search.label, "aria-label": search.label, clearLabel: search.clearLabel, loading: search.searching === true, value: query, onValueChange: remote ? search.onQueryChange : setLocalQuery }), _jsx(SelectedMembers, { members: selected, labels: selection, onRemove: id => onSelectionChange(id, false), disabled: disabled }), _jsx(ChatRoomMembers, { members: remote ? members : filterChatRoomMembers(members, query), title: title, ...(selected.length > 0 ? { countLabel: selection.count(selected.length) } : {}), emptyLabel: emptyLabel, onSelectionChange: onSelectionChange, disabled: disabled })] });
116
115
  }
117
116
  export function ChatRoomCreate({ members, onSelectionChange, membersLabel, emptyMembersLabel, onCreate, disabled = false, nextLabel, backLabel, title, search, selection, onCancel, ...profile }) {
118
117
  const [stage, setStage] = useState("members");
119
118
  const selected = selectedChatRoomMembers(members), ids = selected.map(member => member.id);
120
119
  if (stage === "members")
121
- return _jsxs(Stack, { gap: "md", children: [_jsx(TopBar, { title: title, ...(onCancel ? { exit: { kind: "close", label: backLabel, onClick: onCancel } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: disabled || ids.length === 0, onClick: () => setStage("profile"), children: nextLabel }) }), _jsx(MemberPicker, { members: members, title: membersLabel, emptyLabel: emptyMembersLabel, search: search, selection: selection, onSelectionChange: onSelectionChange, disabled: disabled })] });
120
+ return _jsx(ScreenLayout, { title: title, ...(onCancel ? { exit: { kind: "close", label: backLabel, onClick: onCancel } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: disabled || ids.length === 0, onClick: () => setStage("profile"), children: nextLabel }), children: _jsx(MemberPicker, { members: members, title: membersLabel, emptyLabel: emptyMembersLabel, search: search, selection: selection, onSelectionChange: onSelectionChange, disabled: disabled }) });
122
121
  return _jsx(ChatRoomProfile, { ...profile, presentation: "inline", title: title, back: { label: backLabel, onPress: () => setStage("members") }, disabled: disabled, onSave: value => { if (!canSubmitChatRoom(value, ids))
123
122
  return; return onCreate(value, ids); }, submitDisabled: !canSubmitChatRoom(profile.value, ids), children: blocked => _jsx(ChatRoomMembers, { members: selected, title: membersLabel, countLabel: selection.count(selected.length), emptyLabel: emptyMembersLabel, disabled: blocked }) });
124
123
  }
125
124
  export function ChatRoomActions({ leave, deleteHistory, deleteRoom, disabled = false }) {
126
- return _jsx(RoomActionList, { actions: [deleteHistory, leave, deleteRoom].filter((item) => Boolean(item)).map(item => ({ ...item, destructive: true })), disabled: disabled });
125
+ const [active, setActive] = useState(null);
126
+ // Exits are full-width buttons; local history deletion is secondary, leaving or deleting the room is danger.
127
+ const items = [[deleteHistory, "secondary"], [leave, "danger"], [deleteRoom, "danger"]].filter((item) => Boolean(item[0]));
128
+ if (items.length === 0)
129
+ return null;
130
+ return _jsxs(Stack, { gap: "xs", children: [items.map(([item, tone]) => _jsx(Button, { tone: tone, disabled: disabled || active !== null, layoutStyle: { alignSelf: "stretch" }, onClick: () => setActive({ ...item, destructive: true }), children: item.label }, item.label)), active ? _jsx(RoomConfirmDialog, { action: active, onClose: () => setActive(null) }) : null] });
131
+ }
132
+ function RoomConfirmDialog({ action, onClose }) {
133
+ return _jsx(AlertDialog, { open: true, onOpenChange: open => { if (!open)
134
+ onClose(); }, request: { mode: "confirm", tone: action.destructive ? "danger" : "attention", title: action.title, description: action.description, confirmLabel: action.confirmLabel, cancelLabel: action.cancelLabel, fallbackErrorMessage: action.errorLabel, onConfirm: action.onConfirm } });
127
135
  }
128
136
  function RoomActionList({ actions, disabled = false, menu }) {
129
137
  const [active, setActive] = useState(null);
130
138
  if (actions.length === 0)
131
139
  return null;
132
- const dialog = active ? _jsx(AlertDialog, { open: true, onOpenChange: open => { if (!open)
133
- setActive(null); }, request: { mode: "confirm", tone: active.destructive ? "danger" : "attention", title: active.title, description: active.description, confirmLabel: active.confirmLabel, cancelLabel: active.cancelLabel, fallbackErrorMessage: active.errorLabel, onConfirm: active.onConfirm } }) : null;
134
- if (menu)
135
- return _jsxs(_Fragment, { children: [_jsx(Menu, { label: menu.label, trigger: _jsx(IconButton, { label: menu.label, tone: "ghost", children: _jsx(Icon, { name: "more" }) }), presentation: "anchored", align: "end", disabled: disabled || active !== null, dismissLabel: menu.dismissLabel, items: actions.map((action, index) => ({ id: String(index), label: action.label, ...(action.destructive ? { tone: "danger" } : {}) })), onActionAfterDismiss: id => setActive(actions[Number(id)] ?? null) }), dialog] });
136
- return _jsxs(Stack, { gap: "xxs", children: [actions.map((action, index) => _jsx(ListRow, { title: action.label, tone: action.destructive ? "danger" : "default", disabled: disabled || active !== null, onClick: () => setActive(action) }, index)), dialog] });
140
+ const dialog = active ? _jsx(RoomConfirmDialog, { action: active, onClose: () => setActive(null) }) : null;
141
+ return _jsxs(_Fragment, { children: [_jsx(Menu, { label: menu.label, trigger: _jsx(IconButton, { label: menu.label, tone: "ghost", children: _jsx(Icon, { name: "more" }) }), presentation: "anchored", align: "end", disabled: disabled || active !== null, dismissLabel: menu.dismissLabel, items: actions.map((action, index) => ({ id: String(index), label: action.label, ...(action.destructive ? { tone: "danger" } : {}) })), onActionAfterDismiss: id => setActive(actions[Number(id)] ?? null) }), dialog] });
137
142
  }
138
143
  export function ChatRoomDetails({ profile, back, photoLabel, memberCountLabel, edit, tools = [], members, actions, errorLabel }) {
139
144
  const action = useCompositionAction();
140
- return _jsxs("div", { className: "hjm-chat-room", children: [_jsx(TopBar, { surface: "transparent", ...(back ? { exit: { kind: "back", label: back.label, onClick: back.onPress } } : {}), actions: edit ? _jsx(Button, { tone: "ghost", onClick: edit.onPress, children: edit.label }) : null }), _jsxs(Stack, { gap: "lg", children: [_jsxs(Stack, { align: "center", gap: "sm", children: [_jsx(Avatar, { ...photoOf(profile.photoUrl), size: chatRoomRecipe.heroAvatar, alt: photoLabel, name: profile.name }), _jsxs(Stack, { align: "center", gap: "xxs", children: [_jsx(Text, { variant: "title", className: "hjm-chat-room__name", children: profile.name }), _jsx(Text, { tone: "muted", children: memberCountLabel })] })] }), tools.length > 0 ? _jsx("div", { className: "hjm-chat-room__tools", children: tools.map(tool => _jsx("button", { type: "button", className: "hjm-chat-room__tool", disabled: action.pending, "aria-busy": action.active === tool.id, onClick: () => void action.run(tool.id, tool.onPress), children: _jsxs(Stack, { align: "center", gap: "xs", children: [tool.icon, _jsx(Text, { variant: "caption", tone: "brand", children: tool.label })] }) }, tool.id)) }) : null, action.failed ? _jsx(Text, { role: "alert", tone: "danger", children: errorLabel }) : null, profile.description ? _jsx("div", { className: "hjm-chat-room__group", children: _jsx(Text, { children: profile.description }) }) : null, _jsx("div", { className: "hjm-chat-room__group", children: _jsx(ChatRoomMembers, { ...members }) }), actions ? _jsx("div", { className: "hjm-chat-room__group", "data-flush": "true", children: _jsx(ChatRoomActions, { ...actions }) }) : null] })] });
145
+ return _jsx(ScreenLayout, { title: profile.name, titleVisibility: "hidden", ...(back ? { exit: { kind: "back", label: back.label, onClick: back.onPress } } : {}), actions: edit ? _jsx(Button, { tone: "ghost", onClick: edit.onPress, children: edit.label }) : null, children: _jsxs(Stack, { gap: "lg", children: [_jsxs(Stack, { align: "center", gap: "sm", children: [_jsx(Avatar, { ...photoOf(profile.photoUrl), size: chatRoomRecipe.heroAvatar, alt: photoLabel, name: profile.name }), _jsxs(Stack, { align: "center", gap: "xxs", children: [_jsx(Text, { variant: "title", className: "hjm-chat-room__name", children: profile.name }), _jsx(Text, { tone: "muted", children: memberCountLabel })] })] }), tools.length > 0 ? _jsx("div", { className: "hjm-chat-room__tools", children: tools.map(tool => _jsx("button", { type: "button", className: "hjm-chat-room__tool", disabled: action.pending, "aria-busy": action.active === tool.id, ...(tool.pressed === undefined ? {} : { "aria-pressed": tool.pressed }), onClick: () => void action.run(tool.id, tool.onPress), children: _jsxs(Stack, { align: "center", gap: "xs", children: [tool.icon, _jsx(Text, { variant: "caption", tone: "brand", children: tool.label })] }) }, tool.id)) }) : null, action.failed ? _jsx(Text, { role: "alert", tone: "danger", children: errorLabel }) : null, profile.description ? _jsx(Text, { children: profile.description }) : null, _jsx(ChatRoomMembers, { ...members }), actions ? _jsx(ChatRoomActions, { ...actions }) : null] }) });
141
146
  }
142
147
  export function ChatRoomInvite({ members, title, membersLabel, emptyLabel, onSelectionChange, onInvite, search, selection, back, confirmLabel, errorLabel, disabled = false }) {
143
148
  const action = useCompositionAction(disabled), ids = selectedChatRoomMembers(members).map(member => member.id), blocked = disabled || action.pending;
144
- return _jsxs(Stack, { gap: "md", children: [_jsx(TopBar, { title: title, ...(back ? { exit: { kind: "close", label: back.label, onClick: back.onPress } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: blocked || ids.length === 0, loading: action.pending, onClick: () => void action.run("invite", () => onInvite(ids)), children: confirmLabel }) }), _jsx(MemberPicker, { members: members, title: membersLabel, emptyLabel: emptyLabel, search: search, selection: selection, onSelectionChange: onSelectionChange, disabled: blocked }), action.failed ? _jsx(Text, { role: "alert", tone: "danger", children: errorLabel }) : null] });
149
+ return _jsx(ScreenLayout, { title: title, ...(back ? { exit: { kind: "close", label: back.label, onClick: back.onPress } } : {}), actions: _jsx(Button, { tone: "ghost", disabled: blocked || ids.length === 0, loading: action.pending, onClick: () => void action.run("invite", () => onInvite(ids)), children: confirmLabel }), children: _jsxs(Stack, { gap: "md", children: [_jsx(MemberPicker, { members: members, title: membersLabel, emptyLabel: emptyLabel, search: search, selection: selection, onSelectionChange: onSelectionChange, disabled: blocked }), action.failed ? _jsx(Text, { role: "alert", tone: "danger", children: errorLabel }) : null] }) });
145
150
  }
146
151
  //# sourceMappingURL=communication.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"communication.js","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport { useEffect,useRef,useState,type ReactNode } from \"react\";\nimport { validateReplyTarget,type ReplyTarget,type SearchResponse } from \"@hjmds/design-contracts/communication\";\nimport { ChatMessage,MessageComposer,type ChatMessageProps,type MessageComposerProps } from \"./screens.js\";\nimport { SearchScreen,type SearchRecentQueries } from \"./screen-flows.js\";\nimport { Button,IconButton } from \"./actions.js\";\nimport { Icon } from \"./supplemental-display.js\";\nimport { Stack,Text } from \"./layout.js\";\nimport { useCompositionAction } from \"./internal/use-composition-action.js\";\nimport { canSubmitChatRoom,filterChatRoomMembers,selectedChatRoomMembers,type ChatRoomProfileValue,type ChatRoomMember,type ChatRoomConfirmation,type ChatRoomMemberActions,type ChatRoomMemberSearch,type ChatRoomSelectionLabels } from \"@hjmds/design-contracts/communication\";\nimport { chatRoomRecipe,resolveSearchCommit } from \"@hjmds/design-contracts/screen-patterns\";\nimport type { CharacterCountOptions } from \"@hjmds/design-contracts/character-count\";\nimport { Avatar } from \"./advanced-display.js\";\nimport { ListRow } from \"./display.js\";\nimport { AlertDialog,Menu } from \"./overlays.js\";\nimport { TextField,SearchField } from \"./forms.js\";\nimport { TopBar } from \"./top-bar.js\";\nimport { Checkbox } from \"./selection.js\";\n\nexport type ReplyMessageProps = Omit<ChatMessageProps,\"replyAction\"|\"timestampPresentation\"> & Readonly<{\n messageId: string; onReply: (messageId:string)=>void; replyLabel: string; replyDisabled?: boolean;\n /** A drag has one owner: reply, or time reveal. Accessible reply stays available in either mode. */\n swipeAction?: \"reply\"|\"timestamp\";\n}>;\nexport function ReplyMessage({messageId,onReply,replyLabel,replyDisabled=false,swipeAction=\"reply\",...message}:ReplyMessageProps){\n if(!messageId.trim())throw new TypeError(\"Reply message requires the actual message ID\");\n return <ChatMessage {...message} timestampPresentation={swipeAction===\"timestamp\"?\"swipe\":\"always\"} replyAction={{label:replyLabel,onPress:()=>onReply(messageId),disabled:replyDisabled}}/>;\n}\nexport type ReplyComposerProps=Omit<MessageComposerProps,\"onSend\"|\"replyTo\"|\"pending\"|\"error\"> & Readonly<{\n replyTarget: ReplyTarget|null; onReplyCancel:()=>void; cancelReplyLabel:string; errorLabel:string;\n /** Resolve only after the actual send acknowledgement. The controlled draft is never cleared here. */\n onSend:(value:string,context:Readonly<{replyToId:string|null}>)=>void|Promise<void>;\n}>;\nexport function ReplyComposer({replyTarget,onReplyCancel,cancelReplyLabel,errorLabel,onSend,...composer}:ReplyComposerProps){\n validateReplyTarget(replyTarget);const action=useCompositionAction(composer.disabled);\n return <Stack gap=\"sm\"><MessageComposer {...composer} pending={action.pending}\n {...(replyTarget?{replyTo:{author:replyTarget.author,excerpt:replyTarget.excerpt,cancelLabel:cancelReplyLabel,onCancel:onReplyCancel}}:{})}\n onSend={value=>{const id=replyTarget?.id??null;void action.run(\"send\",()=>onSend(value,{replyToId:id}));}}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{errorLabel}</Text>:null}</Stack>;\n}\nexport type ExpandableSearchProps<T>=Readonly<{\n expanded:boolean;onExpandedChange:(expanded:boolean)=>void;query:string;onQueryChange:(query:string)=>void;\n onSearch:(query:string,context:Readonly<{signal:AbortSignal}>)=>Promise<SearchResponse<T>>;\n renderResult:(result:T)=>ReactNode;onSubmit?:(query:string)=>void;recentQueries?:SearchRecentQueries;debounceMs?:number;disabled?:boolean;\n labels:Readonly<{title:string;open:string;cancel:string;query:string;clear:string;searching:string;error:string;commit:(query:string)=>string;suggestionCount:(count:number)=>string}>;\n}>;\nexport function ExpandableSearch<T>(props:ExpandableSearchProps<T>){\n const [snapshot,setSnapshot]=useState<Readonly<{query:string;response:SearchResponse<T>}>|null>(null),[pending,setPending]=useState(false),[failed,setFailed]=useState(false),[committed,setCommitted]=useState(\"\");\n const latest=useRef(props);latest.current=props;const generation=useRef(0),controller=useRef<AbortController|null>(null);\n const host=useRef<HTMLDivElement>(null),opener=useRef<HTMLButtonElement>(null),restore=useRef(false);\n useEffect(()=>{if(!props.expanded){controller.current?.abort();generation.current++;setPending(false);setCommitted(\"\");}},[props.expanded]);\n useEffect(()=>()=>{generation.current++;controller.current?.abort();},[]);\n useEffect(()=>{if(props.expanded)host.current?.querySelector(\"input\")?.focus();else if(restore.current){opener.current?.focus();restore.current=false;}},[props.expanded]);\n const search=(query:string,{signal}:Readonly<{signal:AbortSignal}>)=>{\n controller.current?.abort();const token=++generation.current,request=new AbortController();controller.current=request;\n const abort=()=>request.abort();signal.addEventListener(\"abort\",abort,{once:true});if(signal.aborted)request.abort();\n // Some adapters ignore abort; generation and current-query checks still prevent stale UI writes.\n const valid=()=>!request.signal.aborted&&token===generation.current&&latest.current.expanded&&latest.current.query===query;\n if(!query.trim()){setSnapshot(null);setPending(false);setFailed(false);signal.removeEventListener(\"abort\",abort);return;}\n setPending(true);setFailed(false);\n const execute=latest.current.onSearch;\n void Promise.resolve().then(()=>request.signal.aborted?null:execute(query,{signal:request.signal})).then(response=>{if(valid()&&response)setSnapshot({query,response});},()=>{if(valid())setFailed(true);}).finally(()=>{signal.removeEventListener(\"abort\",abort);if(valid())setPending(false);});\n };\n const cancel=()=>{controller.current?.abort();generation.current++;setPending(false);restore.current=true;props.onExpandedChange(false);};\n const commit=(query:string)=>{const normalized=resolveSearchCommit(query);if(normalized===null)return;setCommitted(normalized);props.onSubmit?.(normalized);};\n const current=snapshot?.query===props.query?snapshot.response:null;\n // Opening and closing are tool actions: a search icon at the area's end, and the search screen's own header-leading\n // close exit. A full-width primary \"Expand\" button and a text \"Close\" button read as product actions (2026-10-17 review).\n return <Stack ref={host} gap=\"sm\">{!props.expanded?<IconButton ref={opener} label={props.labels.open} tone=\"ghost\" disabled={props.disabled===true} layoutStyle={{alignSelf:\"flex-end\"}} onClick={()=>props.onExpandedChange(true)}><Icon name=\"search\" /></IconButton>:<>\n <SearchScreen title={props.labels.title} titleVisibility=\"hidden\" exit={{kind:\"close\",label:props.labels.cancel,onClick:cancel}} queryLabel={props.labels.query} queryClearLabel={props.labels.clear} query={props.query} onQueryChange={props.onQueryChange} onSearch={search}\n {...(props.debounceMs===undefined?{}:{debounceMs:props.debounceMs})} {...(props.recentQueries?{recentQueries:props.recentQueries}:{})}\n committedQuery={committed} onSubmit={commit} searching={pending} searchingLabel={props.labels.searching}\n suggestions={{items:current?.suggestions??[],commitLabel:props.labels.commit,countLabel:props.labels.suggestionCount}}>\n {current?props.renderResult(current.result):null}\n </SearchScreen>{failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{props.labels.error}</Text>:null}</>}</Stack>;\n}\n\n/*\n Room management (2026-10-23 redesign, chatRoomRecipe). Function and placement follow the compared Telegram, KakaoTalk\n and WhatsApp screens; color, type and spacing stay HJM tokens and the product theme.\n*/\ntype Exit=Readonly<{label:string;onPress:()=>void}>;\nconst photoOf=(url?:string|null)=>url?{src:url}:{};\n\nexport type ChatRoomProfileProps = Readonly<{\n value: ChatRoomProfileValue; onValueChange: (value: ChatRoomProfileValue) => void;\n onSave: (value: ChatRoomProfileValue) => void | Promise<void>;\n /** The product picks/uploads the image and returns its persistent URL; null means cancellation. */\n onPickPhoto?: () => Promise<string | null>;\n presentation?:\"centered\"|\"inline\"; title?:string; back?:Exit;\n /** Live count under the name field (KakaoTalk 0/20); the product owns the limit its server accepts and the locale. */\n nameCharacterCount?: CharacterCountOptions;\n disabled?: boolean; submitDisabled?: boolean; children?: ReactNode | ((disabled: boolean) => ReactNode);\n labels: Readonly<{ name: string; description: string; photo: string; changePhoto: string; removePhoto: string; save: string; error: string; photoError: string }>;\n}>;\nexport function ChatRoomProfile({value,onValueChange,onSave,onPickPhoto,disabled=false,submitDisabled=false,presentation=\"centered\",title,back,nameCharacterCount,children,labels}:ChatRoomProfileProps){\n // Photo upload and save fail for different reasons, so each keeps its own state and message.\n const save=useCompositionAction(disabled),photo=useCompositionAction(disabled);const blocked=disabled||save.pending||photo.pending;\n const latest=useRef({value,onValueChange});latest.current={value,onValueChange};\n const mounted=useRef(true);useEffect(()=>{mounted.current=true;return()=>{mounted.current=false;};},[]);\n const patch=(change:Partial<ChatRoomProfileValue>)=>onValueChange({...value,...change});\n // A new room has no identity yet; its photo slot is decorative until a name exists.\n const identity=value.name.trim()?{name:value.name,alt:labels.photo}:{decorative:true as const,renderFallback:()=><Icon name=\"users\" tone=\"secondary\"/>};\n const avatar=(accessory?:ReactNode)=><Avatar {...photoOf(value.photoUrl)} size={chatRoomRecipe.heroAvatar} {...identity} {...(accessory?{accessory}:{})}/>;\n const inline=presentation===\"inline\";\n return <Stack gap=\"md\">\n <TopBar {...(title?{title}:{})} {...(back?{exit:{kind:\"back\" as const,label:back.label,onClick:back.onPress}}:{})} actions={<Button tone=\"ghost\" disabled={blocked||submitDisabled||!canSubmitChatRoom(value)} loading={save.pending} onClick={()=>void save.run(\"save\",()=>onSave(value))}>{labels.save}</Button>}/>\n <Stack axis={inline?\"inline\":\"block\"} align=\"center\" gap=\"md\">\n <Stack align=\"center\" gap=\"xs\">{onPickPhoto?<button type=\"button\" className=\"hjm-chat-room__photo\" aria-label={labels.changePhoto} aria-busy={photo.pending} disabled={blocked} onClick={()=>void photo.run(\"photo\",async()=>{const url=await onPickPhoto();if(url!==null&&mounted.current)latest.current.onValueChange({...latest.current.value,photoUrl:url});})}>{avatar(<span className=\"hjm-chat-room__badge\"><Icon name=\"edit\" size=\"xs\"/></span>)}</button>:avatar()}\n {onPickPhoto&&value.photoUrl&&!inline?<Button tone=\"ghost\" size=\"small\" disabled={blocked} onClick={()=>patch({photoUrl:null})}>{labels.removePhoto}</Button>:null}</Stack>\n <Stack gap=\"xs\" layoutStyle={inline?{flex:1,minWidth:0}:{alignSelf:\"stretch\"}}><TextField label={labels.name} value={value.name} onValueChange={name=>patch({name})} disabled={blocked} {...(nameCharacterCount?{characterCount:nameCharacterCount}:{})}/></Stack></Stack>\n {onPickPhoto&&value.photoUrl&&inline?<Button tone=\"ghost\" size=\"small\" disabled={blocked} layoutStyle={{alignSelf:\"flex-start\"}} onClick={()=>patch({photoUrl:null})}>{labels.removePhoto}</Button>:null}\n <TextField label={labels.description} value={value.description} onValueChange={description=>patch({description})} disabled={blocked}/>\n {photo.failed?<Text role=\"alert\" tone=\"danger\">{labels.photoError}</Text>:null}\n {save.failed?<Text role=\"alert\" tone=\"danger\">{labels.error}</Text>:null}\n {typeof children===\"function\"?children(blocked):children}\n </Stack>;\n}\n\nexport type ChatRoomMembersProps = Readonly<{\n members: readonly ChatRoomMember[]; title: string; emptyLabel: string;\n /** Shown beside the title (\"3\"); the product formats it. */\n countLabel?: string;\n onSelectionChange?: (id:string,selected:boolean)=>void; disabled?:boolean;\n /** Row above the list that opens the product's invite route (Telegram \"Add Members\"). Omit without permission. */\n invite?: Exit;\n /** Omit actions without permission. The product owns roles and server authorization. */\n renderActions?: (member:ChatRoomMember)=>ReactNode;\n memberActions?: ChatRoomMemberActions;\n}>;\nexport function ChatRoomMembers({members,title,emptyLabel,countLabel,onSelectionChange,disabled=false,invite,renderActions,memberActions}:ChatRoomMembersProps){\n const leading=(member:ChatRoomMember)=><Avatar size={chatRoomRecipe.memberAvatar} {...photoOf(member.photoUrl)} name={member.name} decorative/>;\n return <Stack gap=\"xs\"><div className=\"hjm-chat-room__heading\"><Text variant=\"label\">{title}</Text>{countLabel?<Text variant=\"label\" tone=\"muted\">{countLabel}</Text>:null}</div>\n {invite?<ListRow title={invite.label} tone=\"brand\" leading={<span className=\"hjm-chat-room__add\"><Icon name=\"add\" size=\"sm\"/></span>} disabled={disabled} onClick={invite.onPress}/>:null}\n {members.length===0?<Text tone=\"muted\">{emptyLabel}</Text>:members.map(member=>onSelectionChange?\n <Checkbox key={member.id} presentation=\"plain\" label={member.name} {...(member.detail?{description:member.detail}:{})} renderLeading={()=>leading(member)} checked={member.selected===true} disabled={disabled||member.disabled===true} onCheckedChange={selected=>onSelectionChange(member.id,selected)} layoutStyle={{width:\"100%\"}}/>:\n <ListRow key={member.id} title={member.name} {...(member.detail?{description:member.detail}:{})} leading={leading(member)} {...(member.role?{trailing:<Text variant=\"caption\" tone=\"brand\">{member.role}</Text>}:{})}\n trailingAction={<>{memberActions?<RoomActionList actions={memberActions.items(member)} disabled={disabled} menu={{label:memberActions.label(member),dismissLabel:memberActions.dismissLabel}}/>:null}{renderActions?.(member)}</>}/> )}</Stack>;\n}\n\n/** People picked so far, kept visible above the list while the search narrows it; tapping one deselects it. */\nfunction SelectedMembers({members,labels,onRemove,disabled}:{members:readonly ChatRoomMember[];labels:ChatRoomSelectionLabels;onRemove:(id:string)=>void;disabled:boolean}){\n if(members.length===0)return null;\n return <ul className=\"hjm-chat-room__selected\" aria-label={labels.count(members.length)}>{members.map(member=><li key={member.id}>\n <button type=\"button\" className=\"hjm-chat-room__selected-item\" aria-label={labels.remove(member)} disabled={disabled} onClick={()=>onRemove(member.id)}>\n <Avatar size={chatRoomRecipe.selectedAvatar} {...photoOf(member.photoUrl)} name={member.name} decorative accessory={<span className=\"hjm-chat-room__badge\" data-tone=\"neutral\"><Icon name=\"close\" size=\"xs\"/></span>}/>\n <Text variant=\"caption\" className=\"hjm-chat-room__selected-name\">{member.name}</Text></button></li>)}</ul>;\n}\ntype MemberPickerProps=Readonly<{members:readonly ChatRoomMember[];title:string;emptyLabel:string;search:ChatRoomMemberSearch;selection:ChatRoomSelectionLabels;onSelectionChange:(id:string,selected:boolean)=>void;disabled:boolean}>;\nfunction MemberPicker({members,title,emptyLabel,search,selection,onSelectionChange,disabled}:MemberPickerProps){\n const [localQuery,setLocalQuery]=useState(\"\");\n // A product that searches its server owns the query and the result list; otherwise names are filtered here.\n const remote=search.onQueryChange!==undefined,query=remote?search.query??\"\":localQuery;\n const selected=selectedChatRoomMembers(members);\n return <Stack gap=\"sm\">\n <SearchField placeholder={search.label} aria-label={search.label} clearLabel={search.clearLabel} loading={search.searching===true} value={query} onValueChange={remote?search.onQueryChange!:setLocalQuery}/>\n <SelectedMembers members={selected} labels={selection} onRemove={id=>onSelectionChange(id,false)} disabled={disabled}/>\n <ChatRoomMembers members={remote?members:filterChatRoomMembers(members,query)} title={title} countLabel={selection.count(selected.length)} emptyLabel={emptyLabel} onSelectionChange={onSelectionChange} disabled={disabled}/></Stack>;\n}\n\nexport type ChatRoomCreateProps = Omit<ChatRoomProfileProps,\"onSave\"|\"children\"|\"title\"|\"back\"|\"presentation\"> & Readonly<{\n members: readonly ChatRoomMember[]; onSelectionChange:(id:string,selected:boolean)=>void;\n membersLabel:string; emptyMembersLabel:string; nextLabel:string; backLabel:string; title:string;\n search:ChatRoomMemberSearch; selection:ChatRoomSelectionLabels; onCancel?:()=>void;\n onCreate:(value:ChatRoomProfileValue,memberIds:readonly string[])=>void|Promise<void>;\n}>;\nexport function ChatRoomCreate({members,onSelectionChange,membersLabel,emptyMembersLabel,onCreate,disabled=false,nextLabel,backLabel,title,search,selection,onCancel,...profile}:ChatRoomCreateProps){\n const [stage,setStage]=useState<\"members\"|\"profile\">(\"members\");\n const selected=selectedChatRoomMembers(members),ids=selected.map(member=>member.id);\n if(stage===\"members\")return <Stack gap=\"md\"><TopBar title={title} {...(onCancel?{exit:{kind:\"close\" as const,label:backLabel,onClick:onCancel}}:{})}\n actions={<Button tone=\"ghost\" disabled={disabled||ids.length===0} onClick={()=>setStage(\"profile\")}>{nextLabel}</Button>}/>\n <MemberPicker members={members} title={membersLabel} emptyLabel={emptyMembersLabel} search={search} selection={selection} onSelectionChange={onSelectionChange} disabled={disabled}/></Stack>;\n return <ChatRoomProfile {...profile} presentation=\"inline\" title={title} back={{label:backLabel,onPress:()=>setStage(\"members\")}} disabled={disabled} onSave={value=>{if(!canSubmitChatRoom(value,ids))return;return onCreate(value,ids);}} submitDisabled={!canSubmitChatRoom(profile.value,ids)}>\n {blocked=><ChatRoomMembers members={selected} title={membersLabel} countLabel={selection.count(selected.length)} emptyLabel={emptyMembersLabel} disabled={blocked}/>}\n </ChatRoomProfile>;\n}\n\nexport type ChatRoomActionsProps = Readonly<{\n /** Local history deletion and membership exit are deliberately separate actions. */\n leave?:ChatRoomConfirmation; deleteHistory?:ChatRoomConfirmation; deleteRoom?:ChatRoomConfirmation;\n disabled?:boolean;\n}>;\nexport function ChatRoomActions({leave,deleteHistory,deleteRoom,disabled=false}:ChatRoomActionsProps){\n return <RoomActionList actions={[deleteHistory,leave,deleteRoom].filter((item):item is ChatRoomConfirmation=>Boolean(item)).map(item=>({...item,destructive:true}))} disabled={disabled}/>;\n}\nfunction RoomActionList({actions,disabled=false,menu}:{actions:readonly ChatRoomConfirmation[];disabled?:boolean;menu?:Readonly<{label:string;dismissLabel:string}>}){\n const [active,setActive]=useState<ChatRoomConfirmation|null>(null);\n if(actions.length===0)return null;\n const dialog=active?<AlertDialog open onOpenChange={open=>{if(!open)setActive(null);}} request={{mode:\"confirm\",tone:active.destructive?\"danger\":\"attention\",title:active.title,description:active.description,confirmLabel:active.confirmLabel,cancelLabel:active.cancelLabel,fallbackErrorMessage:active.errorLabel,onConfirm:active.onConfirm}}/>:null;\n if(menu)return <><Menu label={menu.label} trigger={<IconButton label={menu.label} tone=\"ghost\"><Icon name=\"more\"/></IconButton>} presentation=\"anchored\" align=\"end\" disabled={disabled||active!==null} dismissLabel={menu.dismissLabel} items={actions.map((action,index)=>({id:String(index),label:action.label,...(action.destructive?{tone:\"danger\" as const}:{})}))} onActionAfterDismiss={id=>setActive(actions[Number(id)]??null)}/>{dialog}</>;\n return <Stack gap=\"xxs\">{actions.map((action,index)=><ListRow key={index} title={action.label} tone={action.destructive?\"danger\":\"default\"} disabled={disabled||active!==null} onClick={()=>setActive(action)}/>)}{dialog}</Stack>;\n}\n\nexport type ChatRoomDetailsProps = Readonly<{\n profile: ChatRoomProfileValue; back?:Exit; photoLabel:string; memberCountLabel:string;\n edit?:Exit;\n /** Search, shared media, invite and notification settings use product-owned routes. */\n tools?:readonly Readonly<{id:string;label:string;icon?:ReactNode;onPress:()=>void|Promise<void>}>[];\n members:ChatRoomMembersProps; actions?:ChatRoomActionsProps; errorLabel:string;\n}>;\nexport function ChatRoomDetails({profile,back,photoLabel,memberCountLabel,edit,tools=[],members,actions,errorLabel}:ChatRoomDetailsProps){\n const action=useCompositionAction();\n return <div className=\"hjm-chat-room\"><TopBar surface=\"transparent\" {...(back?{exit:{kind:\"back\" as const,label:back.label,onClick:back.onPress}}:{})} actions={edit?<Button tone=\"ghost\" onClick={edit.onPress}>{edit.label}</Button>:null}/>\n <Stack gap=\"lg\"><Stack align=\"center\" gap=\"sm\">\n <Avatar {...photoOf(profile.photoUrl)} size={chatRoomRecipe.heroAvatar} alt={photoLabel} name={profile.name}/>\n <Stack align=\"center\" gap=\"xxs\"><Text variant=\"title\" className=\"hjm-chat-room__name\">{profile.name}</Text><Text tone=\"muted\">{memberCountLabel}</Text></Stack>\n </Stack>{tools.length>0?<div className=\"hjm-chat-room__tools\">{tools.map(tool=><button key={tool.id} type=\"button\" className=\"hjm-chat-room__tool\" disabled={action.pending} aria-busy={action.active===tool.id} onClick={()=>void action.run(tool.id,tool.onPress)}><Stack align=\"center\" gap=\"xs\">{tool.icon}<Text variant=\"caption\" tone=\"brand\">{tool.label}</Text></Stack></button>)}</div>:null}\n {action.failed?<Text role=\"alert\" tone=\"danger\">{errorLabel}</Text>:null}\n {profile.description?<div className=\"hjm-chat-room__group\"><Text>{profile.description}</Text></div>:null}\n <div className=\"hjm-chat-room__group\"><ChatRoomMembers {...members}/></div>{actions?<div className=\"hjm-chat-room__group\" data-flush=\"true\"><ChatRoomActions {...actions}/></div>:null}</Stack></div>;\n}\n\nexport type ChatRoomInviteProps = Readonly<{\n members: readonly ChatRoomMember[]; title: string; membersLabel: string; emptyLabel: string;\n onSelectionChange:(id:string,selected:boolean)=>void;\n onInvite:(memberIds:readonly string[])=>void|Promise<void>;\n search:ChatRoomMemberSearch; selection:ChatRoomSelectionLabels;\n back?:Exit; confirmLabel:string; errorLabel:string; disabled?:boolean;\n}>;\nexport function ChatRoomInvite({members,title,membersLabel,emptyLabel,onSelectionChange,onInvite,search,selection,back,confirmLabel,errorLabel,disabled=false}:ChatRoomInviteProps){\n const action=useCompositionAction(disabled),ids=selectedChatRoomMembers(members).map(member=>member.id),blocked=disabled||action.pending;\n return <Stack gap=\"md\"><TopBar title={title} {...(back?{exit:{kind:\"close\" as const,label:back.label,onClick:back.onPress}}:{})}\n actions={<Button tone=\"ghost\" disabled={blocked||ids.length===0} loading={action.pending} onClick={()=>void action.run(\"invite\",()=>onInvite(ids))}>{confirmLabel}</Button>}/>\n <MemberPicker members={members} title={membersLabel} emptyLabel={emptyLabel} search={search} selection={selection} onSelectionChange={onSelectionChange} disabled={blocked}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\">{errorLabel}</Text>:null}</Stack>;\n}\n"]}
1
+ {"version":3,"file":"communication.js","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,OAAO,EAAE,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAiB,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAuC,MAAM,uCAAuC,CAAC;AACjH,OAAO,EAAE,WAAW,EAAC,eAAe,EAAC,YAAY,EAAkD,MAAM,cAAc,CAAC;AACxH,OAAO,EAAE,YAAY,EAA2B,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAC,UAAU,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAE,KAAK,EAAC,IAAI,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAC,qBAAqB,EAAC,uBAAuB,EAA4J,MAAM,uCAAuC,CAAC;AAClR,OAAO,EAAE,cAAc,EAAC,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAE7F,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAC,IAAI,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,SAAS,EAAC,WAAW,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAO1C,MAAM,UAAU,YAAY,CAAC,EAAC,SAAS,EAAC,OAAO,EAAC,UAAU,EAAC,aAAa,GAAC,KAAK,EAAC,WAAW,GAAC,OAAO,EAAC,GAAG,OAAO,EAAmB;IAC/H,IAAG,CAAC,SAAS,CAAC,IAAI,EAAE;QAAC,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;IACzF,OAAO,KAAC,WAAW,OAAK,OAAO,EAAE,qBAAqB,EAAE,WAAW,KAAG,WAAW,CAAA,CAAC,CAAA,OAAO,CAAA,CAAC,CAAA,QAAQ,EAAE,WAAW,EAAE,EAAC,KAAK,EAAC,UAAU,EAAC,OAAO,EAAC,GAAE,EAAE,CAAA,OAAO,CAAC,SAAS,CAAC,EAAC,QAAQ,EAAC,aAAa,EAAC,GAAG,CAAC;AAC9L,CAAC;AAMD,MAAM,UAAU,aAAa,CAAC,EAAC,WAAW,EAAC,aAAa,EAAC,gBAAgB,EAAC,UAAU,EAAC,MAAM,EAAC,GAAG,QAAQ,EAAoB;IAC1H,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAAA,MAAM,MAAM,GAAC,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtF,OAAO,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,aAAC,KAAC,eAAe,OAAK,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,KACzE,CAAC,WAAW,CAAA,CAAC,CAAA,EAAC,OAAO,EAAC,EAAC,MAAM,EAAC,WAAW,CAAC,MAAM,EAAC,OAAO,EAAC,WAAW,CAAC,OAAO,EAAC,WAAW,EAAC,gBAAgB,EAAC,QAAQ,EAAC,aAAa,EAAC,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAC1I,MAAM,EAAE,KAAK,CAAA,EAAE,GAAC,MAAM,EAAE,GAAC,WAAW,EAAE,EAAE,IAAE,IAAI,CAAC,CAAA,KAAK,MAAM,CAAC,GAAG,CAAC,MAAM,EAAC,GAAE,EAAE,CAAA,MAAM,CAAC,KAAK,EAAC,EAAC,SAAS,EAAC,EAAE,EAAC,CAAC,CAAC,CAAC,CAAA,CAAC,GAAG,EAC3G,MAAM,CAAC,MAAM,CAAA,CAAC,CAAA,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAE,EAAC,SAAS,EAAC,QAAQ,EAAC,YAAG,UAAU,GAAQ,CAAA,CAAC,CAAA,IAAI,IAAS,CAAC;AAChH,CAAC;AAOD,MAAM,UAAU,gBAAgB,CAAI,KAA8B;IACjE,MAAM,CAAC,QAAQ,EAAC,WAAW,CAAC,GAAC,QAAQ,CAA2D,IAAI,CAAC,EAAC,CAAC,OAAO,EAAC,UAAU,CAAC,GAAC,QAAQ,CAAC,KAAK,CAAC,EAAC,CAAC,MAAM,EAAC,SAAS,CAAC,GAAC,QAAQ,CAAC,KAAK,CAAC,EAAC,CAAC,SAAS,EAAC,YAAY,CAAC,GAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpN,MAAM,MAAM,GAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAAA,MAAM,CAAC,OAAO,GAAC,KAAK,CAAC;IAAA,MAAM,UAAU,GAAC,MAAM,CAAC,CAAC,CAAC,EAAC,UAAU,GAAC,MAAM,CAAuB,IAAI,CAAC,CAAC;IACzH,MAAM,IAAI,GAAC,MAAM,CAAiB,IAAI,CAAC,EAAC,MAAM,GAAC,MAAM,CAAoB,IAAI,CAAC,EAAC,OAAO,GAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrG,SAAS,CAAC,GAAE,EAAE,GAAC,IAAG,CAAC,KAAK,CAAC,QAAQ,EAAC,CAAC;QAAA,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAAA,UAAU,CAAC,OAAO,EAAE,CAAC;QAAA,UAAU,CAAC,KAAK,CAAC,CAAC;QAAA,YAAY,CAAC,EAAE,CAAC,CAAC;IAAA,CAAC,CAAA,CAAC,EAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC5I,SAAS,CAAC,GAAE,EAAE,CAAA,GAAE,EAAE,GAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAA,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA,CAAC,EAAC,EAAE,CAAC,CAAC;IAC1E,SAAS,CAAC,GAAE,EAAE,GAAC,IAAG,KAAK,CAAC,QAAQ;QAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;SAAK,IAAG,OAAO,CAAC,OAAO,EAAC,CAAC;QAAA,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAAA,OAAO,CAAC,OAAO,GAAC,KAAK,CAAC;IAAA,CAAC,CAAA,CAAC,EAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3K,MAAM,MAAM,GAAC,CAAC,KAAY,EAAC,EAAC,MAAM,EAAgC,EAAC,EAAE;QACpE,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAAA,MAAM,KAAK,GAAC,EAAE,UAAU,CAAC,OAAO,EAAC,OAAO,GAAC,IAAI,eAAe,EAAE,CAAC;QAAA,UAAU,CAAC,OAAO,GAAC,OAAO,CAAC;QACtH,MAAM,KAAK,GAAC,GAAE,EAAE,CAAA,OAAO,CAAC,KAAK,EAAE,CAAC;QAAA,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAC,KAAK,EAAC,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,CAAC;QAAA,IAAG,MAAM,CAAC,OAAO;YAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrH,iGAAiG;QACjG,MAAM,KAAK,GAAC,GAAE,EAAE,CAAA,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAE,KAAK,KAAG,UAAU,CAAC,OAAO,IAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAE,MAAM,CAAC,OAAO,CAAC,KAAK,KAAG,KAAK,CAAC;QAC3H,IAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAC,CAAC;YAAA,WAAW,CAAC,IAAI,CAAC,CAAC;YAAA,UAAU,CAAC,KAAK,CAAC,CAAC;YAAA,SAAS,CAAC,KAAK,CAAC,CAAC;YAAA,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAC,KAAK,CAAC,CAAC;YAAA,OAAO;QAAA,CAAC;QACzH,UAAU,CAAC,IAAI,CAAC,CAAC;QAAA,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,OAAO,GAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;QACtC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAE,EAAE,CAAA,OAAO,CAAC,MAAM,CAAC,OAAO,CAAA,CAAC,CAAA,IAAI,CAAA,CAAC,CAAA,OAAO,CAAC,KAAK,EAAC,EAAC,MAAM,EAAC,OAAO,CAAC,MAAM,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAA,EAAE,GAAC,IAAG,KAAK,EAAE,IAAE,QAAQ;YAAC,WAAW,CAAC,EAAC,KAAK,EAAC,QAAQ,EAAC,CAAC,CAAC,CAAA,CAAC,EAAC,GAAE,EAAE,GAAC,IAAG,KAAK,EAAE;YAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,OAAO,CAAC,GAAE,EAAE,GAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAC,KAAK,CAAC,CAAC,CAAA,IAAG,KAAK,EAAE;YAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC;IACpS,CAAC,CAAC;IACF,MAAM,MAAM,GAAC,GAAE,EAAE,GAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA,UAAU,CAAC,OAAO,EAAE,CAAC,CAAA,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA,OAAO,CAAC,OAAO,GAAC,IAAI,CAAC,CAAA,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA,CAAC,CAAC;IAC1I,MAAM,MAAM,GAAC,CAAC,KAAY,EAAC,EAAE,GAAC,MAAM,UAAU,GAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAA,IAAG,UAAU,KAAG,IAAI;QAAC,OAAO,CAAA,YAAY,CAAC,UAAU,CAAC,CAAC,CAAA,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA,CAAC,CAAC;IAC9J,MAAM,OAAO,GAAC,QAAQ,EAAE,KAAK,KAAG,KAAK,CAAC,KAAK,CAAA,CAAC,CAAA,QAAQ,CAAC,QAAQ,CAAA,CAAC,CAAA,IAAI,CAAC;IACnE,oHAAoH;IACpH,0HAA0H;IAC1H,OAAO,KAAC,KAAK,IAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAC,IAAI,YAAE,CAAC,KAAK,CAAC,QAAQ,CAAA,CAAC,CAAA,KAAC,UAAU,IAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,KAAG,IAAI,EAAE,WAAW,EAAE,EAAC,SAAS,EAAC,UAAU,EAAC,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAE,KAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,GAAG,GAAa,CAAA,CAAC,CAAA,8BACxQ,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,EAAC,QAAQ,EAAC,IAAI,EAAE,EAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAC,OAAO,EAAC,MAAM,EAAC,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,KAC1Q,CAAC,KAAK,CAAC,UAAU,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,UAAU,EAAC,KAAK,CAAC,UAAU,EAAC,CAAC,KAAM,CAAC,KAAK,CAAC,aAAa,CAAA,CAAC,CAAA,EAAC,aAAa,EAAC,KAAK,CAAC,aAAa,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EACrI,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EACvG,WAAW,EAAE,EAAC,KAAK,EAAC,OAAO,EAAE,WAAW,IAAE,EAAE,EAAC,WAAW,EAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAC,UAAU,EAAC,KAAK,CAAC,MAAM,CAAC,eAAe,EAAC,YACpH,OAAO,CAAA,CAAC,CAAA,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA,CAAC,CAAA,IAAI,GACjC,EAAC,MAAM,CAAA,CAAC,CAAA,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAE,EAAC,SAAS,EAAC,QAAQ,EAAC,YAAG,KAAK,CAAC,MAAM,CAAC,KAAK,GAAQ,CAAA,CAAC,CAAA,IAAI,IAAI,GAAS,CAAC;AACpI,CAAC;AAOD,MAAM,OAAO,GAAC,CAAC,GAAgB,EAAC,EAAE,CAAA,GAAG,CAAA,CAAC,CAAA,EAAC,GAAG,EAAC,GAAG,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC;AAanD,MAAM,UAAU,eAAe,CAAC,EAAC,KAAK,EAAC,aAAa,EAAC,MAAM,EAAC,WAAW,EAAC,QAAQ,GAAC,KAAK,EAAC,cAAc,GAAC,KAAK,EAAC,YAAY,GAAC,UAAU,EAAC,KAAK,EAAC,IAAI,EAAC,kBAAkB,EAAC,QAAQ,EAAC,MAAM,EAAsB;IACtM,6FAA6F;IAC7F,MAAM,IAAI,GAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAC,KAAK,GAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAAA,MAAM,OAAO,GAAC,QAAQ,IAAE,IAAI,CAAC,OAAO,IAAE,KAAK,CAAC,OAAO,CAAC;IACnI,MAAM,MAAM,GAAC,MAAM,CAAC,EAAC,KAAK,EAAC,aAAa,EAAC,CAAC,CAAC;IAAA,MAAM,CAAC,OAAO,GAAC,EAAC,KAAK,EAAC,aAAa,EAAC,CAAC;IAChF,MAAM,OAAO,GAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAAA,SAAS,CAAC,GAAE,EAAE,GAAC,OAAO,CAAC,OAAO,GAAC,IAAI,CAAC,CAAA,OAAM,GAAE,EAAE,GAAC,OAAO,CAAC,OAAO,GAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAA,CAAC,EAAC,EAAE,CAAC,CAAC;IACxG,MAAM,KAAK,GAAC,CAAC,MAAoC,EAAC,EAAE,CAAA,aAAa,CAAC,EAAC,GAAG,KAAK,EAAC,GAAG,MAAM,EAAC,CAAC,CAAC;IACxF,oFAAoF;IACpF,MAAM,QAAQ,GAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA,CAAC,CAAA,EAAC,IAAI,EAAC,KAAK,CAAC,IAAI,EAAC,GAAG,EAAC,MAAM,CAAC,KAAK,EAAC,CAAA,CAAC,CAAA,EAAC,UAAU,EAAC,IAAa,EAAC,cAAc,EAAC,GAAE,EAAE,CAAA,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,WAAW,GAAE,EAAC,CAAC;IACxJ,MAAM,MAAM,GAAC,CAAC,SAAoB,EAAC,EAAE,CAAA,KAAC,MAAM,OAAK,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,UAAU,KAAM,QAAQ,KAAM,CAAC,SAAS,CAAA,CAAC,CAAA,EAAC,SAAS,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,GAAG,CAAC;IAC3J,MAAM,MAAM,GAAC,YAAY,KAAG,QAAQ,CAAC;IACrC,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,KAAM,CAAC,IAAI,CAAA,CAAC,CAAA,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,MAAe,EAAC,KAAK,EAAC,IAAI,CAAC,KAAK,EAAC,OAAO,EAAC,IAAI,CAAC,OAAO,EAAC,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAE,OAAO,EAAE,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAE,OAAO,IAAE,cAAc,IAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAC,GAAE,EAAE,CAAA,MAAM,CAAC,KAAK,CAAC,CAAC,YAAG,MAAM,CAAC,IAAI,GAAU,YAAE,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,aACtU,MAAC,KAAK,IAAC,IAAI,EAAE,MAAM,CAAA,CAAC,CAAA,QAAQ,CAAA,CAAC,CAAA,OAAO,EAAE,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,aAC7D,MAAC,KAAK,IAAC,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,aAAE,WAAW,CAAA,CAAC,CAAA,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,sBAAsB,gBAAa,MAAM,CAAC,WAAW,eAAa,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,EAAC,KAAK,IAAE,EAAE,GAAC,MAAM,GAAG,GAAC,MAAM,WAAW,EAAE,CAAC,CAAA,IAAG,GAAG,KAAG,IAAI,IAAE,OAAO,CAAC,OAAO;wCAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,CAAC,CAAC,CAAA,CAAC,CAAC,YAAG,MAAM,CAAC,eAAM,SAAS,EAAC,sBAAsB,YAAC,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,GAAE,GAAO,CAAC,GAAU,CAAA,CAAC,CAAA,MAAM,EAAE,EAC1c,WAAW,IAAE,KAAK,CAAC,QAAQ,IAAE,CAAC,MAAM,CAAA,CAAC,CAAA,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,KAAK,CAAC,EAAC,QAAQ,EAAC,IAAI,EAAC,CAAC,YAAG,MAAM,CAAC,WAAW,GAAU,CAAA,CAAC,CAAA,IAAI,IAAS,EAC3K,KAAC,KAAK,IAAC,GAAG,EAAC,IAAI,EAAC,WAAW,EAAE,MAAM,CAAA,CAAC,CAAA,EAAC,IAAI,EAAC,CAAC,EAAC,QAAQ,EAAC,CAAC,EAAC,CAAA,CAAC,CAAA,EAAC,SAAS,EAAC,SAAS,EAAC,YAAE,KAAC,SAAS,IAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,CAAA,EAAE,CAAA,KAAK,CAAC,EAAC,IAAI,EAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,KAAM,CAAC,kBAAkB,CAAA,CAAC,CAAA,EAAC,cAAc,EAAC,kBAAkB,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,GAAG,GAAQ,IAAQ,EACzQ,WAAW,IAAE,KAAK,CAAC,QAAQ,IAAE,MAAM,CAAA,CAAC,CAAA,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,EAAC,SAAS,EAAC,YAAY,EAAC,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,KAAK,CAAC,EAAC,QAAQ,EAAC,IAAI,EAAC,CAAC,YAAG,MAAM,CAAC,WAAW,GAAU,CAAA,CAAC,CAAA,IAAI,EACxM,KAAC,SAAS,IAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAA,EAAE,CAAA,KAAK,CAAC,EAAC,WAAW,EAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,GAAG,EACrI,KAAK,CAAC,MAAM,CAAA,CAAC,CAAA,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,QAAQ,YAAE,MAAM,CAAC,UAAU,GAAQ,CAAA,CAAC,CAAA,IAAI,EAC7E,IAAI,CAAC,MAAM,CAAA,CAAC,CAAA,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,QAAQ,YAAE,MAAM,CAAC,KAAK,GAAQ,CAAA,CAAC,CAAA,IAAI,EACvE,OAAO,QAAQ,KAAG,UAAU,CAAA,CAAC,CAAA,QAAQ,CAAC,OAAO,CAAC,CAAA,CAAC,CAAA,QAAQ,IAChD,GAAe,CAAC;AACzB,CAAC;AAaD,MAAM,UAAU,eAAe,CAAC,EAAC,OAAO,EAAC,KAAK,EAAC,UAAU,EAAC,UAAU,EAAC,iBAAiB,EAAC,QAAQ,GAAC,KAAK,EAAC,MAAM,EAAC,aAAa,EAAC,aAAa,EAAsB;IAC7J,MAAM,OAAO,GAAC,CAAC,MAAqB,EAAC,EAAE,CAAA,KAAC,MAAM,IAAC,IAAI,EAAE,cAAc,CAAC,YAAY,KAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,SAAE,CAAC;IAChJ,OAAO,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,aAAC,eAAK,SAAS,EAAC,wBAAwB,aAAC,KAAC,IAAI,IAAC,OAAO,EAAC,OAAO,YAAE,KAAK,GAAQ,EAAC,UAAU,CAAA,CAAC,CAAA,KAAC,IAAI,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,OAAO,YAAE,UAAU,GAAQ,CAAA,CAAC,CAAA,IAAI,IAAO,EAChL,MAAM,CAAA,CAAC,CAAA,KAAC,OAAO,IAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,eAAM,SAAS,EAAC,oBAAoB,YAAC,KAAC,IAAI,IAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,GAAE,GAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,CAAA,CAAC,CAAA,IAAI,EACxL,OAAO,CAAC,MAAM,KAAG,CAAC,CAAA,CAAC,CAAA,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,YAAE,UAAU,GAAQ,CAAA,CAAC,CAAA,OAAO,CAAC,GAAG,CAAC,MAAM,CAAA,EAAE,CAAA,iBAAiB,CAAA,CAAC;gBACjG,KAAC,QAAQ,IAAiB,YAAY,EAAC,OAAO,EAAC,KAAK,EAAE,MAAM,CAAC,IAAI,KAAM,CAAC,MAAM,CAAC,MAAM,CAAA,CAAC,CAAA,EAAC,WAAW,EAAC,MAAM,CAAC,MAAM,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAE,aAAa,EAAE,GAAE,EAAE,CAAA,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,KAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,IAAE,MAAM,CAAC,QAAQ,KAAG,IAAI,EAAE,eAAe,EAAE,QAAQ,CAAA,EAAE,CAAA,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,EAAC,KAAK,EAAC,MAAM,EAAC,IAAtT,MAAM,CAAC,EAAE,CAAgT,CAAA,CAAC;gBACzU,KAAC,OAAO,IAAiB,KAAK,EAAE,MAAM,CAAC,IAAI,KAAM,CAAC,MAAM,CAAC,MAAM,CAAA,CAAC,CAAA,EAAC,WAAW,EAAC,MAAM,CAAC,MAAM,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,KAAM,CAAC,MAAM,CAAC,IAAI,CAAA,CAAC,CAAA,EAAC,QAAQ,EAAC,KAAC,IAAI,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,OAAO,YAAE,MAAM,CAAC,IAAI,GAAQ,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EACpN,cAAc,EAAE,8BAAG,aAAa,CAAA,CAAC,CAAA,KAAC,cAAc,IAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAC,KAAK,EAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,EAAC,YAAY,EAAC,aAAa,CAAC,YAAY,EAAC,GAAG,CAAA,CAAC,CAAA,IAAI,EAAE,aAAa,EAAE,CAAC,MAAM,CAAC,IAAI,IADnN,MAAM,CAAC,EAAE,CAC6M,CAAE,IAAS,CAAC;AACjP,CAAC;AAED,+GAA+G;AAC/G,SAAS,eAAe,CAAC,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,QAAQ,EAAgH;IACzK,IAAG,OAAO,CAAC,MAAM,KAAG,CAAC;QAAC,OAAO,IAAI,CAAC;IAClC,OAAO,aAAI,SAAS,EAAC,yBAAyB,gBAAa,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAA,EAAE,CAAA,uBAC9G,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,8BAA8B,gBAAa,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,aACtJ,KAAC,MAAM,IAAC,IAAI,EAAE,cAAc,CAAC,cAAc,KAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,QAAC,SAAS,EAAE,eAAM,SAAS,EAAC,sBAAsB,eAAW,SAAS,YAAC,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,GAAE,GAAO,GAAG,EACvN,KAAC,IAAI,IAAC,OAAO,EAAC,SAAS,EAAC,SAAS,EAAC,8BAA8B,YAAE,MAAM,CAAC,IAAI,GAAQ,IAAS,IAHyB,MAAM,CAAC,EAAE,CAG7B,CAAC,GAAM,CAAC;AAC5G,CAAC;AAED,SAAS,YAAY,CAAC,EAAC,OAAO,EAAC,KAAK,EAAC,UAAU,EAAC,MAAM,EAAC,SAAS,EAAC,iBAAiB,EAAC,QAAQ,EAAmB;IAC7G,MAAM,CAAC,UAAU,EAAC,aAAa,CAAC,GAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9C,4GAA4G;IAC5G,MAAM,MAAM,GAAC,MAAM,CAAC,aAAa,KAAG,SAAS,EAAC,KAAK,GAAC,MAAM,CAAA,CAAC,CAAA,MAAM,CAAC,KAAK,IAAE,EAAE,CAAA,CAAC,CAAA,UAAU,CAAC;IACvF,MAAM,QAAQ,GAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,aACtB,KAAC,WAAW,IAAC,WAAW,EAAE,MAAM,CAAC,KAAK,gBAAc,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,KAAG,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,CAAA,CAAC,CAAA,MAAM,CAAC,aAAc,CAAA,CAAC,CAAA,aAAa,GAAG,EAC7M,KAAC,eAAe,IAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAA,EAAE,CAAA,iBAAiB,CAAC,EAAE,EAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,EACvH,KAAC,eAAe,IAAC,OAAO,EAAE,MAAM,CAAA,CAAC,CAAA,OAAO,CAAA,CAAC,CAAA,qBAAqB,CAAC,OAAO,EAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,KAAM,CAAC,QAAQ,CAAC,MAAM,GAAC,CAAC,CAAA,CAAC,CAAA,EAAC,UAAU,EAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAQ,CAAC;AACpQ,CAAC;AAQD,MAAM,UAAU,cAAc,CAAC,EAAC,OAAO,EAAC,iBAAiB,EAAC,YAAY,EAAC,iBAAiB,EAAC,QAAQ,EAAC,QAAQ,GAAC,KAAK,EAAC,SAAS,EAAC,SAAS,EAAC,KAAK,EAAC,MAAM,EAAC,SAAS,EAAC,QAAQ,EAAC,GAAG,OAAO,EAAqB;IACnM,MAAM,CAAC,KAAK,EAAC,QAAQ,CAAC,GAAC,QAAQ,CAAsB,SAAS,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAC,uBAAuB,CAAC,OAAO,CAAC,EAAC,GAAG,GAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAA,EAAE,CAAA,MAAM,CAAC,EAAE,CAAC,CAAC;IACpF,IAAG,KAAK,KAAG,SAAS;QAAC,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,KAAM,CAAC,QAAQ,CAAA,CAAC,CAAA,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,OAAgB,EAAC,KAAK,EAAC,SAAS,EAAC,OAAO,EAAC,QAAQ,EAAC,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EACzI,OAAO,EAAE,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAE,QAAQ,IAAE,GAAG,CAAC,MAAM,KAAG,CAAC,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,QAAQ,CAAC,SAAS,CAAC,YAAG,SAAS,GAAU,YACxH,KAAC,YAAY,IAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAe,CAAC;IACrM,OAAO,KAAC,eAAe,OAAK,OAAO,EAAE,YAAY,EAAC,QAAQ,EAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAC,KAAK,EAAC,SAAS,EAAC,OAAO,EAAC,GAAE,EAAE,CAAA,QAAQ,CAAC,SAAS,CAAC,EAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAA,EAAE,GAAC,IAAG,CAAC,iBAAiB,CAAC,KAAK,EAAC,GAAG,CAAC;YAAC,OAAO,CAAA,OAAO,QAAQ,CAAC,KAAK,EAAC,GAAG,CAAC,CAAC,CAAA,CAAC,EAAE,cAAc,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAC,GAAG,CAAC,YAChS,OAAO,CAAA,EAAE,CAAA,KAAC,eAAe,IAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,GAAG,GAClJ,CAAC;AACpB,CAAC;AAOD,MAAM,UAAU,eAAe,CAAC,EAAC,KAAK,EAAC,aAAa,EAAC,UAAU,EAAC,QAAQ,GAAC,KAAK,EAAsB;IACnG,MAAM,CAAC,MAAM,EAAC,SAAS,CAAC,GAAC,QAAQ,CAA4B,IAAI,CAAC,CAAC;IACnE,6GAA6G;IAC7G,MAAM,KAAK,GAAE,CAAC,CAAC,aAAa,EAAC,WAAW,CAAC,EAAC,CAAC,KAAK,EAAC,QAAQ,CAAC,EAAC,CAAC,UAAU,EAAC,QAAQ,CAAC,CAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAA8D,EAAE,CAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1L,IAAG,KAAK,CAAC,MAAM,KAAG,CAAC;QAAC,OAAO,IAAI,CAAC;IAChC,OAAO,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,aAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAC,IAAI,CAAC,EAAC,EAAE,CAAA,KAAC,MAAM,IAAkB,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,IAAE,MAAM,KAAG,IAAI,EAAE,WAAW,EAAE,EAAC,SAAS,EAAC,SAAS,EAAC,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,SAAS,CAAC,EAAC,GAAG,IAAI,EAAC,WAAW,EAAC,IAAI,EAAC,CAAC,YAAG,IAAI,CAAC,KAAK,IAA9J,IAAI,CAAC,KAAK,CAA8J,CAAC,EACtO,MAAM,CAAA,CAAC,CAAA,KAAC,iBAAiB,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,SAAS,CAAC,IAAI,CAAC,GAAG,CAAA,CAAC,CAAA,IAAI,IAAS,CAAC;AAC1F,CAAC;AACD,SAAS,iBAAiB,CAAC,EAAC,MAAM,EAAC,OAAO,EAAgD;IACzF,OAAO,KAAC,WAAW,IAAC,IAAI,QAAC,YAAY,EAAE,IAAI,CAAA,EAAE,GAAC,IAAG,CAAC,IAAI;YAAC,OAAO,EAAE,CAAC,CAAA,CAAC,EAAE,OAAO,EAAE,EAAC,IAAI,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,CAAC,WAAW,CAAA,CAAC,CAAA,QAAQ,CAAA,CAAC,CAAA,WAAW,EAAC,KAAK,EAAC,MAAM,CAAC,KAAK,EAAC,WAAW,EAAC,MAAM,CAAC,WAAW,EAAC,YAAY,EAAC,MAAM,CAAC,YAAY,EAAC,WAAW,EAAC,MAAM,CAAC,WAAW,EAAC,oBAAoB,EAAC,MAAM,CAAC,UAAU,EAAC,SAAS,EAAC,MAAM,CAAC,SAAS,EAAC,GAAG,CAAC;AACnU,CAAC;AACD,SAAS,cAAc,CAAC,EAAC,OAAO,EAAC,QAAQ,GAAC,KAAK,EAAC,IAAI,EAA+G;IAClK,MAAM,CAAC,MAAM,EAAC,SAAS,CAAC,GAAC,QAAQ,CAA4B,IAAI,CAAC,CAAC;IACnE,IAAG,OAAO,CAAC,MAAM,KAAG,CAAC;QAAC,OAAO,IAAI,CAAC;IAClC,MAAM,MAAM,GAAC,MAAM,CAAA,CAAC,CAAA,KAAC,iBAAiB,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,SAAS,CAAC,IAAI,CAAC,GAAG,CAAA,CAAC,CAAA,IAAI,CAAC;IAC5F,OAAO,8BAAE,KAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAC,UAAU,IAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAC,OAAO,YAAC,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,GAAE,GAAa,EAAE,YAAY,EAAC,UAAU,EAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAE,QAAQ,IAAE,MAAM,KAAG,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAC,KAAK,EAAC,EAAE,CAAA,CAAC,EAAC,EAAE,EAAC,MAAM,CAAC,KAAK,CAAC,EAAC,KAAK,EAAC,MAAM,CAAC,KAAK,EAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAA,CAAC,CAAA,EAAC,IAAI,EAAC,QAAiB,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,EAAE,CAAA,EAAE,CAAA,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAE,IAAI,CAAC,GAAG,EAAC,MAAM,IAAI,CAAC;AAChb,CAAC;AAWD,MAAM,UAAU,eAAe,CAAC,EAAC,OAAO,EAAC,IAAI,EAAC,UAAU,EAAC,gBAAgB,EAAC,IAAI,EAAC,KAAK,GAAC,EAAE,EAAC,OAAO,EAAC,OAAO,EAAC,UAAU,EAAsB;IACvI,MAAM,MAAM,GAAC,oBAAoB,EAAE,CAAC;IACpC,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,eAAe,EAAC,QAAQ,KAAK,CAAC,IAAI,CAAA,CAAC,CAAA,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,MAAe,EAAC,KAAK,EAAC,IAAI,CAAC,KAAK,EAAC,OAAO,EAAC,IAAI,CAAC,OAAO,EAAC,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAA,CAAC,CAAA,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,YAAG,IAAI,CAAC,KAAK,GAAU,CAAA,CAAC,CAAA,IAAI,YAC1O,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,aAAC,MAAC,KAAK,IAAC,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,aAC9C,KAAC,MAAM,OAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,GAAG,EAC9G,MAAC,KAAK,IAAC,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,KAAK,aAAC,KAAC,IAAI,IAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,qBAAqB,YAAE,OAAO,CAAC,IAAI,GAAQ,EAAA,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,YAAE,gBAAgB,GAAQ,IAAQ,IACvJ,EAAC,KAAK,CAAC,MAAM,GAAC,CAAC,CAAA,CAAC,CAAA,cAAK,SAAS,EAAC,sBAAsB,YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAA,EAAE,CAAA,iBAAsB,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,qBAAqB,EAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,eAAa,MAAM,CAAC,MAAM,KAAG,IAAI,CAAC,EAAE,KAAM,CAAC,IAAI,CAAC,OAAO,KAAG,SAAS,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,EAAC,cAAc,EAAC,IAAI,CAAC,OAAO,EAAC,CAAC,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAC,IAAI,CAAC,OAAO,CAAC,YAAE,MAAC,KAAK,IAAC,KAAK,EAAC,QAAQ,EAAC,GAAG,EAAC,IAAI,aAAE,IAAI,CAAC,IAAI,EAAC,KAAC,IAAI,IAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,OAAO,YAAE,IAAI,CAAC,KAAK,GAAQ,IAAQ,IAApV,IAAI,CAAC,EAAE,CAAsV,CAAC,GAAO,CAAA,CAAC,CAAA,IAAI,EACrc,MAAM,CAAC,MAAM,CAAA,CAAC,CAAA,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,QAAQ,YAAE,UAAU,GAAQ,CAAA,CAAC,CAAA,IAAI,EACvE,OAAO,CAAC,WAAW,CAAA,CAAC,CAAA,KAAC,IAAI,cAAE,OAAO,CAAC,WAAW,GAAQ,CAAA,CAAC,CAAA,IAAI,EAC5D,KAAC,eAAe,OAAK,OAAO,GAAG,EAAC,OAAO,CAAA,CAAC,CAAA,KAAC,eAAe,OAAK,OAAO,GAAG,CAAA,CAAC,CAAA,IAAI,IAAS,GAAe,CAAC;AACtG,CAAC;AASD,MAAM,UAAU,cAAc,CAAC,EAAC,OAAO,EAAC,KAAK,EAAC,YAAY,EAAC,UAAU,EAAC,iBAAiB,EAAC,QAAQ,EAAC,MAAM,EAAC,SAAS,EAAC,IAAI,EAAC,YAAY,EAAC,UAAU,EAAC,QAAQ,GAAC,KAAK,EAAqB;IACjL,MAAM,MAAM,GAAC,oBAAoB,CAAC,QAAQ,CAAC,EAAC,GAAG,GAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAA,EAAE,CAAA,MAAM,CAAC,EAAE,CAAC,EAAC,OAAO,GAAC,QAAQ,IAAE,MAAM,CAAC,OAAO,CAAC;IACzI,OAAO,KAAC,YAAY,IAAC,KAAK,EAAE,KAAK,KAAM,CAAC,IAAI,CAAA,CAAC,CAAA,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,OAAgB,EAAC,KAAK,EAAC,IAAI,CAAC,KAAK,EAAC,OAAO,EAAC,IAAI,CAAC,OAAO,EAAC,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EACrH,OAAO,EAAE,KAAC,MAAM,IAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAE,OAAO,IAAE,GAAG,CAAC,MAAM,KAAG,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,GAAE,EAAE,CAAA,KAAK,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAC,GAAE,EAAE,CAAA,QAAQ,CAAC,GAAG,CAAC,CAAC,YAAG,YAAY,GAAU,YAAE,MAAC,KAAK,IAAC,GAAG,EAAC,IAAI,aAC5L,KAAC,YAAY,IAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,OAAO,GAAG,EAC5K,MAAM,CAAC,MAAM,CAAA,CAAC,CAAA,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,QAAQ,YAAE,UAAU,GAAQ,CAAA,CAAC,CAAA,IAAI,IAAS,GAAe,CAAC;AAClG,CAAC","sourcesContent":["\"use client\";\nimport { useEffect,useRef,useState,type ReactNode } from \"react\";\nimport { validateReplyTarget,type ReplyTarget,type SearchResponse } from \"@hjmds/design-contracts/communication\";\nimport { ChatMessage,MessageComposer,ScreenLayout,type ChatMessageProps,type MessageComposerProps } from \"./screens.js\";\nimport { SearchScreen,type SearchRecentQueries } from \"./screen-flows.js\";\nimport { Button,IconButton } from \"./actions.js\";\nimport { Icon } from \"./supplemental-display.js\";\nimport { Stack,Text } from \"./layout.js\";\nimport { useCompositionAction } from \"./internal/use-composition-action.js\";\nimport { canSubmitChatRoom,filterChatRoomMembers,selectedChatRoomMembers,type ChatRoomProfileValue,type ChatRoomMember,type ChatRoomConfirmation,type ChatRoomMemberActions,type ChatRoomMemberSearch,type ChatRoomSelectionLabels } from \"@hjmds/design-contracts/communication\";\nimport { chatRoomRecipe,resolveSearchCommit } from \"@hjmds/design-contracts/screen-patterns\";\nimport type { CharacterCountOptions } from \"@hjmds/design-contracts/character-count\";\nimport { Avatar } from \"./advanced-display.js\";\nimport { ListRow } from \"./display.js\";\nimport { AlertDialog,Menu } from \"./overlays.js\";\nimport { TextField,SearchField } from \"./forms.js\";\nimport { Checkbox } from \"./selection.js\";\n\nexport type ReplyMessageProps = Omit<ChatMessageProps,\"replyAction\"|\"timestampPresentation\"> & Readonly<{\n messageId: string; onReply: (messageId:string)=>void; replyLabel: string; replyDisabled?: boolean;\n /** A drag has one owner: reply, or time reveal. Accessible reply stays available in either mode. */\n swipeAction?: \"reply\"|\"timestamp\";\n}>;\nexport function ReplyMessage({messageId,onReply,replyLabel,replyDisabled=false,swipeAction=\"reply\",...message}:ReplyMessageProps){\n if(!messageId.trim())throw new TypeError(\"Reply message requires the actual message ID\");\n return <ChatMessage {...message} timestampPresentation={swipeAction===\"timestamp\"?\"swipe\":\"always\"} replyAction={{label:replyLabel,onPress:()=>onReply(messageId),disabled:replyDisabled}}/>;\n}\nexport type ReplyComposerProps=Omit<MessageComposerProps,\"onSend\"|\"replyTo\"|\"pending\"|\"error\"> & Readonly<{\n replyTarget: ReplyTarget|null; onReplyCancel:()=>void; cancelReplyLabel:string; errorLabel:string;\n /** Resolve only after the actual send acknowledgement. The controlled draft is never cleared here. */\n onSend:(value:string,context:Readonly<{replyToId:string|null}>)=>void|Promise<void>;\n}>;\nexport function ReplyComposer({replyTarget,onReplyCancel,cancelReplyLabel,errorLabel,onSend,...composer}:ReplyComposerProps){\n validateReplyTarget(replyTarget);const action=useCompositionAction(composer.disabled);\n return <Stack gap=\"sm\"><MessageComposer {...composer} pending={action.pending}\n {...(replyTarget?{replyTo:{author:replyTarget.author,excerpt:replyTarget.excerpt,cancelLabel:cancelReplyLabel,onCancel:onReplyCancel}}:{})}\n onSend={value=>{const id=replyTarget?.id??null;void action.run(\"send\",()=>onSend(value,{replyToId:id}));}}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{errorLabel}</Text>:null}</Stack>;\n}\nexport type ExpandableSearchProps<T>=Readonly<{\n expanded:boolean;onExpandedChange:(expanded:boolean)=>void;query:string;onQueryChange:(query:string)=>void;\n onSearch:(query:string,context:Readonly<{signal:AbortSignal}>)=>Promise<SearchResponse<T>>;\n renderResult:(result:T)=>ReactNode;onSubmit?:(query:string)=>void;recentQueries?:SearchRecentQueries;debounceMs?:number;disabled?:boolean;\n labels:Readonly<{title:string;open:string;cancel:string;query:string;clear:string;searching:string;error:string;commit:(query:string)=>string;suggestionCount:(count:number)=>string}>;\n}>;\nexport function ExpandableSearch<T>(props:ExpandableSearchProps<T>){\n const [snapshot,setSnapshot]=useState<Readonly<{query:string;response:SearchResponse<T>}>|null>(null),[pending,setPending]=useState(false),[failed,setFailed]=useState(false),[committed,setCommitted]=useState(\"\");\n const latest=useRef(props);latest.current=props;const generation=useRef(0),controller=useRef<AbortController|null>(null);\n const host=useRef<HTMLDivElement>(null),opener=useRef<HTMLButtonElement>(null),restore=useRef(false);\n useEffect(()=>{if(!props.expanded){controller.current?.abort();generation.current++;setPending(false);setCommitted(\"\");}},[props.expanded]);\n useEffect(()=>()=>{generation.current++;controller.current?.abort();},[]);\n useEffect(()=>{if(props.expanded)host.current?.querySelector(\"input\")?.focus();else if(restore.current){opener.current?.focus();restore.current=false;}},[props.expanded]);\n const search=(query:string,{signal}:Readonly<{signal:AbortSignal}>)=>{\n controller.current?.abort();const token=++generation.current,request=new AbortController();controller.current=request;\n const abort=()=>request.abort();signal.addEventListener(\"abort\",abort,{once:true});if(signal.aborted)request.abort();\n // Some adapters ignore abort; generation and current-query checks still prevent stale UI writes.\n const valid=()=>!request.signal.aborted&&token===generation.current&&latest.current.expanded&&latest.current.query===query;\n if(!query.trim()){setSnapshot(null);setPending(false);setFailed(false);signal.removeEventListener(\"abort\",abort);return;}\n setPending(true);setFailed(false);\n const execute=latest.current.onSearch;\n void Promise.resolve().then(()=>request.signal.aborted?null:execute(query,{signal:request.signal})).then(response=>{if(valid()&&response)setSnapshot({query,response});},()=>{if(valid())setFailed(true);}).finally(()=>{signal.removeEventListener(\"abort\",abort);if(valid())setPending(false);});\n };\n const cancel=()=>{controller.current?.abort();generation.current++;setPending(false);restore.current=true;props.onExpandedChange(false);};\n const commit=(query:string)=>{const normalized=resolveSearchCommit(query);if(normalized===null)return;setCommitted(normalized);props.onSubmit?.(normalized);};\n const current=snapshot?.query===props.query?snapshot.response:null;\n // Opening and closing are tool actions: a search icon at the area's end, and the search screen's own header-leading\n // close exit. A full-width primary \"Expand\" button and a text \"Close\" button read as product actions (2026-10-17 review).\n return <Stack ref={host} gap=\"sm\">{!props.expanded?<IconButton ref={opener} label={props.labels.open} tone=\"ghost\" disabled={props.disabled===true} layoutStyle={{alignSelf:\"flex-end\"}} onClick={()=>props.onExpandedChange(true)}><Icon name=\"search\" /></IconButton>:<>\n <SearchScreen title={props.labels.title} titleVisibility=\"hidden\" exit={{kind:\"close\",label:props.labels.cancel,onClick:cancel}} queryLabel={props.labels.query} queryClearLabel={props.labels.clear} query={props.query} onQueryChange={props.onQueryChange} onSearch={search}\n {...(props.debounceMs===undefined?{}:{debounceMs:props.debounceMs})} {...(props.recentQueries?{recentQueries:props.recentQueries}:{})}\n committedQuery={committed} onSubmit={commit} searching={pending} searchingLabel={props.labels.searching}\n suggestions={{items:current?.suggestions??[],commitLabel:props.labels.commit,countLabel:props.labels.suggestionCount}}>\n {current?props.renderResult(current.result):null}\n </SearchScreen>{failed?<Text role=\"alert\" tone=\"danger\" style={{textAlign:\"center\"}}>{props.labels.error}</Text>:null}</>}</Stack>;\n}\n\n/*\n Room management (2026-10-23 redesign, chatRoomRecipe). Function and placement follow the compared Telegram, KakaoTalk\n and WhatsApp screens; color, type and spacing stay HJM tokens and the product theme.\n*/\ntype Exit=Readonly<{label:string;onPress:()=>void}>;\nconst photoOf=(url?:string|null)=>url?{src:url}:{};\n\nexport type ChatRoomProfileProps = Readonly<{\n value: ChatRoomProfileValue; onValueChange: (value: ChatRoomProfileValue) => void;\n onSave: (value: ChatRoomProfileValue) => void | Promise<void>;\n /** The product picks/uploads the image and returns its persistent URL; null means cancellation. */\n onPickPhoto?: () => Promise<string | null>;\n presentation?:\"centered\"|\"inline\"; title:string; back?:Exit;\n /** Live count under the name field (KakaoTalk 0/20); the product owns the limit its server accepts and the locale. */\n nameCharacterCount?: CharacterCountOptions;\n disabled?: boolean; submitDisabled?: boolean; children?: ReactNode | ((disabled: boolean) => ReactNode);\n labels: Readonly<{ name: string; description: string; photo: string; changePhoto: string; removePhoto: string; save: string; error: string; photoError: string }>;\n}>;\nexport function ChatRoomProfile({value,onValueChange,onSave,onPickPhoto,disabled=false,submitDisabled=false,presentation=\"centered\",title,back,nameCharacterCount,children,labels}:ChatRoomProfileProps){\n // Photo upload and save fail for different reasons, so each keeps its own state and message.\n const save=useCompositionAction(disabled),photo=useCompositionAction(disabled);const blocked=disabled||save.pending||photo.pending;\n const latest=useRef({value,onValueChange});latest.current={value,onValueChange};\n const mounted=useRef(true);useEffect(()=>{mounted.current=true;return()=>{mounted.current=false;};},[]);\n const patch=(change:Partial<ChatRoomProfileValue>)=>onValueChange({...value,...change});\n // A new room has no identity yet; its photo slot is decorative until a name exists.\n const identity=value.name.trim()?{name:value.name,alt:labels.photo}:{decorative:true as const,renderFallback:()=><Icon name=\"users\" tone=\"secondary\"/>};\n const avatar=(accessory?:ReactNode)=><Avatar {...photoOf(value.photoUrl)} size={chatRoomRecipe.heroAvatar} {...identity} {...(accessory?{accessory}:{})}/>;\n const inline=presentation===\"inline\";\n return <ScreenLayout title={title} {...(back?{exit:{kind:\"back\" as const,label:back.label,onClick:back.onPress}}:{})} actions={<Button tone=\"ghost\" disabled={blocked||submitDisabled||!canSubmitChatRoom(value)} loading={save.pending} onClick={()=>void save.run(\"save\",()=>onSave(value))}>{labels.save}</Button>}><Stack gap=\"md\">\n <Stack axis={inline?\"inline\":\"block\"} align=\"center\" gap=\"md\">\n <Stack align=\"center\" gap=\"xs\">{onPickPhoto?<button type=\"button\" className=\"hjm-chat-room__photo\" aria-label={labels.changePhoto} aria-busy={photo.pending} disabled={blocked} onClick={()=>void photo.run(\"photo\",async()=>{const url=await onPickPhoto();if(url!==null&&mounted.current)latest.current.onValueChange({...latest.current.value,photoUrl:url});})}>{avatar(<span className=\"hjm-chat-room__badge\"><Icon name=\"edit\" size=\"xs\"/></span>)}</button>:avatar()}\n {onPickPhoto&&value.photoUrl&&!inline?<Button tone=\"ghost\" size=\"small\" disabled={blocked} onClick={()=>patch({photoUrl:null})}>{labels.removePhoto}</Button>:null}</Stack>\n <Stack gap=\"xs\" layoutStyle={inline?{flex:1,minWidth:0}:{alignSelf:\"stretch\"}}><TextField label={labels.name} value={value.name} onValueChange={name=>patch({name})} disabled={blocked} {...(nameCharacterCount?{characterCount:nameCharacterCount}:{})}/></Stack></Stack>\n {onPickPhoto&&value.photoUrl&&inline?<Button tone=\"ghost\" size=\"small\" disabled={blocked} layoutStyle={{alignSelf:\"flex-start\"}} onClick={()=>patch({photoUrl:null})}>{labels.removePhoto}</Button>:null}\n <TextField label={labels.description} value={value.description} onValueChange={description=>patch({description})} disabled={blocked}/>\n {photo.failed?<Text role=\"alert\" tone=\"danger\">{labels.photoError}</Text>:null}\n {save.failed?<Text role=\"alert\" tone=\"danger\">{labels.error}</Text>:null}\n {typeof children===\"function\"?children(blocked):children}\n </Stack></ScreenLayout>;\n}\n\nexport type ChatRoomMembersProps = Readonly<{\n members: readonly ChatRoomMember[]; title: string; emptyLabel: string;\n /** Shown beside the title (\"3\"); the product formats it. */\n countLabel?: string;\n onSelectionChange?: (id:string,selected:boolean)=>void; disabled?:boolean;\n /** Row above the list that opens the product's invite route (Telegram \"Add Members\"). Omit without permission. */\n invite?: Exit;\n /** Omit actions without permission. The product owns roles and server authorization. */\n renderActions?: (member:ChatRoomMember)=>ReactNode;\n memberActions?: ChatRoomMemberActions;\n}>;\nexport function ChatRoomMembers({members,title,emptyLabel,countLabel,onSelectionChange,disabled=false,invite,renderActions,memberActions}:ChatRoomMembersProps){\n const leading=(member:ChatRoomMember)=><Avatar size={chatRoomRecipe.memberAvatar} {...photoOf(member.photoUrl)} name={member.name} decorative/>;\n return <Stack gap=\"xs\"><div className=\"hjm-chat-room__heading\"><Text variant=\"label\">{title}</Text>{countLabel?<Text variant=\"label\" tone=\"brand\">{countLabel}</Text>:null}</div>\n {invite?<ListRow title={invite.label} tone=\"brand\" leading={<span className=\"hjm-chat-room__add\"><Icon name=\"add\" size=\"sm\"/></span>} disabled={disabled} onClick={invite.onPress}/>:null}\n {members.length===0?<Text tone=\"muted\">{emptyLabel}</Text>:members.map(member=>onSelectionChange?\n <Checkbox key={member.id} presentation=\"plain\" label={member.name} {...(member.detail?{description:member.detail}:{})} renderLeading={()=>leading(member)} checked={member.selected===true} disabled={disabled||member.disabled===true} onCheckedChange={selected=>onSelectionChange(member.id,selected)} layoutStyle={{width:\"100%\"}}/>:\n <ListRow key={member.id} title={member.name} {...(member.detail?{description:member.detail}:{})} leading={leading(member)} {...(member.role?{trailing:<Text variant=\"caption\" tone=\"brand\">{member.role}</Text>}:{})}\n trailingAction={<>{memberActions?<RoomActionList actions={memberActions.items(member)} disabled={disabled} menu={{label:memberActions.label(member),dismissLabel:memberActions.dismissLabel}}/>:null}{renderActions?.(member)}</>}/> )}</Stack>;\n}\n\n/** People picked so far, kept visible above the list while the search narrows it; tapping one deselects it. */\nfunction SelectedMembers({members,labels,onRemove,disabled}:{members:readonly ChatRoomMember[];labels:ChatRoomSelectionLabels;onRemove:(id:string)=>void;disabled:boolean}){\n if(members.length===0)return null;\n return <ul className=\"hjm-chat-room__selected\" aria-label={labels.count(members.length)}>{members.map(member=><li key={member.id}>\n <button type=\"button\" className=\"hjm-chat-room__selected-item\" aria-label={labels.remove(member)} disabled={disabled} onClick={()=>onRemove(member.id)}>\n <Avatar size={chatRoomRecipe.selectedAvatar} {...photoOf(member.photoUrl)} name={member.name} decorative accessory={<span className=\"hjm-chat-room__badge\" data-tone=\"neutral\"><Icon name=\"close\" size=\"xs\"/></span>}/>\n <Text variant=\"caption\" className=\"hjm-chat-room__selected-name\">{member.name}</Text></button></li>)}</ul>;\n}\ntype MemberPickerProps=Readonly<{members:readonly ChatRoomMember[];title:string;emptyLabel:string;search:ChatRoomMemberSearch;selection:ChatRoomSelectionLabels;onSelectionChange:(id:string,selected:boolean)=>void;disabled:boolean}>;\nfunction MemberPicker({members,title,emptyLabel,search,selection,onSelectionChange,disabled}:MemberPickerProps){\n const [localQuery,setLocalQuery]=useState(\"\");\n // A product that searches its server owns the query and the result list; otherwise names are filtered here.\n const remote=search.onQueryChange!==undefined,query=remote?search.query??\"\":localQuery;\n const selected=selectedChatRoomMembers(members);\n return <Stack gap=\"sm\">\n <SearchField placeholder={search.label} aria-label={search.label} clearLabel={search.clearLabel} loading={search.searching===true} value={query} onValueChange={remote?search.onQueryChange!:setLocalQuery}/>\n <SelectedMembers members={selected} labels={selection} onRemove={id=>onSelectionChange(id,false)} disabled={disabled}/>\n <ChatRoomMembers members={remote?members:filterChatRoomMembers(members,query)} title={title} {...(selected.length>0?{countLabel:selection.count(selected.length)}:{})} emptyLabel={emptyLabel} onSelectionChange={onSelectionChange} disabled={disabled}/></Stack>;\n}\n\nexport type ChatRoomCreateProps = Omit<ChatRoomProfileProps,\"onSave\"|\"children\"|\"title\"|\"back\"|\"presentation\"> & Readonly<{\n members: readonly ChatRoomMember[]; onSelectionChange:(id:string,selected:boolean)=>void;\n membersLabel:string; emptyMembersLabel:string; nextLabel:string; backLabel:string; title:string;\n search:ChatRoomMemberSearch; selection:ChatRoomSelectionLabels; onCancel?:()=>void;\n onCreate:(value:ChatRoomProfileValue,memberIds:readonly string[])=>void|Promise<void>;\n}>;\nexport function ChatRoomCreate({members,onSelectionChange,membersLabel,emptyMembersLabel,onCreate,disabled=false,nextLabel,backLabel,title,search,selection,onCancel,...profile}:ChatRoomCreateProps){\n const [stage,setStage]=useState<\"members\"|\"profile\">(\"members\");\n const selected=selectedChatRoomMembers(members),ids=selected.map(member=>member.id);\n if(stage===\"members\")return <ScreenLayout title={title} {...(onCancel?{exit:{kind:\"close\" as const,label:backLabel,onClick:onCancel}}:{})}\n actions={<Button tone=\"ghost\" disabled={disabled||ids.length===0} onClick={()=>setStage(\"profile\")}>{nextLabel}</Button>}>\n <MemberPicker members={members} title={membersLabel} emptyLabel={emptyMembersLabel} search={search} selection={selection} onSelectionChange={onSelectionChange} disabled={disabled}/></ScreenLayout>;\n return <ChatRoomProfile {...profile} presentation=\"inline\" title={title} back={{label:backLabel,onPress:()=>setStage(\"members\")}} disabled={disabled} onSave={value=>{if(!canSubmitChatRoom(value,ids))return;return onCreate(value,ids);}} submitDisabled={!canSubmitChatRoom(profile.value,ids)}>\n {blocked=><ChatRoomMembers members={selected} title={membersLabel} countLabel={selection.count(selected.length)} emptyLabel={emptyMembersLabel} disabled={blocked}/>}\n </ChatRoomProfile>;\n}\n\nexport type ChatRoomActionsProps = Readonly<{\n /** Local history deletion and membership exit are deliberately separate actions. */\n leave?:ChatRoomConfirmation; deleteHistory?:ChatRoomConfirmation; deleteRoom?:ChatRoomConfirmation;\n disabled?:boolean;\n}>;\nexport function ChatRoomActions({leave,deleteHistory,deleteRoom,disabled=false}:ChatRoomActionsProps){\n const [active,setActive]=useState<ChatRoomConfirmation|null>(null);\n // Exits are full-width buttons; local history deletion is secondary, leaving or deleting the room is danger.\n const items=([[deleteHistory,\"secondary\"],[leave,\"danger\"],[deleteRoom,\"danger\"]] as const).filter((item):item is readonly [ChatRoomConfirmation,\"secondary\"|\"danger\"]=>Boolean(item[0]));\n if(items.length===0)return null;\n return <Stack gap=\"xs\">{items.map(([item,tone])=><Button key={item.label} tone={tone} disabled={disabled||active!==null} layoutStyle={{alignSelf:\"stretch\"}} onClick={()=>setActive({...item,destructive:true})}>{item.label}</Button>)}\n {active?<RoomConfirmDialog action={active} onClose={()=>setActive(null)}/>:null}</Stack>;\n}\nfunction RoomConfirmDialog({action,onClose}:{action:ChatRoomConfirmation;onClose:()=>void}){\n return <AlertDialog open onOpenChange={open=>{if(!open)onClose();}} request={{mode:\"confirm\",tone:action.destructive?\"danger\":\"attention\",title:action.title,description:action.description,confirmLabel:action.confirmLabel,cancelLabel:action.cancelLabel,fallbackErrorMessage:action.errorLabel,onConfirm:action.onConfirm}}/>;\n}\nfunction RoomActionList({actions,disabled=false,menu}:{actions:readonly ChatRoomConfirmation[];disabled?:boolean;menu:Readonly<{label:string;dismissLabel:string}>}){\n const [active,setActive]=useState<ChatRoomConfirmation|null>(null);\n if(actions.length===0)return null;\n const dialog=active?<RoomConfirmDialog action={active} onClose={()=>setActive(null)}/>:null;\n return <><Menu label={menu.label} trigger={<IconButton label={menu.label} tone=\"ghost\"><Icon name=\"more\"/></IconButton>} presentation=\"anchored\" align=\"end\" disabled={disabled||active!==null} dismissLabel={menu.dismissLabel} items={actions.map((action,index)=>({id:String(index),label:action.label,...(action.destructive?{tone:\"danger\" as const}:{})}))} onActionAfterDismiss={id=>setActive(actions[Number(id)]??null)}/>{dialog}</>;\n}\n\n/** `pressed` makes the tile a toggle (mute): its surface and the product icon show the current state. */\nexport type ChatRoomTool = Readonly<{id:string;label:string;icon?:ReactNode;pressed?:boolean;onPress:()=>void|Promise<void>}>;\nexport type ChatRoomDetailsProps = Readonly<{\n profile: ChatRoomProfileValue; back?:Exit; photoLabel:string; memberCountLabel:string;\n edit?:Exit;\n /** Search, shared media, invite and notification settings use product-owned routes. */\n tools?:readonly ChatRoomTool[];\n members:ChatRoomMembersProps; actions?:ChatRoomActionsProps; errorLabel:string;\n}>;\nexport function ChatRoomDetails({profile,back,photoLabel,memberCountLabel,edit,tools=[],members,actions,errorLabel}:ChatRoomDetailsProps){\n const action=useCompositionAction();\n return <ScreenLayout title={profile.name} titleVisibility=\"hidden\" {...(back?{exit:{kind:\"back\" as const,label:back.label,onClick:back.onPress}}:{})} actions={edit?<Button tone=\"ghost\" onClick={edit.onPress}>{edit.label}</Button>:null}>\n <Stack gap=\"lg\"><Stack align=\"center\" gap=\"sm\">\n <Avatar {...photoOf(profile.photoUrl)} size={chatRoomRecipe.heroAvatar} alt={photoLabel} name={profile.name}/>\n <Stack align=\"center\" gap=\"xxs\"><Text variant=\"title\" className=\"hjm-chat-room__name\">{profile.name}</Text><Text tone=\"muted\">{memberCountLabel}</Text></Stack>\n </Stack>{tools.length>0?<div className=\"hjm-chat-room__tools\">{tools.map(tool=><button key={tool.id} type=\"button\" className=\"hjm-chat-room__tool\" disabled={action.pending} aria-busy={action.active===tool.id} {...(tool.pressed===undefined?{}:{\"aria-pressed\":tool.pressed})} onClick={()=>void action.run(tool.id,tool.onPress)}><Stack align=\"center\" gap=\"xs\">{tool.icon}<Text variant=\"caption\" tone=\"brand\">{tool.label}</Text></Stack></button>)}</div>:null}\n {action.failed?<Text role=\"alert\" tone=\"danger\">{errorLabel}</Text>:null}\n {profile.description?<Text>{profile.description}</Text>:null}\n <ChatRoomMembers {...members}/>{actions?<ChatRoomActions {...actions}/>:null}</Stack></ScreenLayout>;\n}\n\nexport type ChatRoomInviteProps = Readonly<{\n members: readonly ChatRoomMember[]; title: string; membersLabel: string; emptyLabel: string;\n onSelectionChange:(id:string,selected:boolean)=>void;\n onInvite:(memberIds:readonly string[])=>void|Promise<void>;\n search:ChatRoomMemberSearch; selection:ChatRoomSelectionLabels;\n back?:Exit; confirmLabel:string; errorLabel:string; disabled?:boolean;\n}>;\nexport function ChatRoomInvite({members,title,membersLabel,emptyLabel,onSelectionChange,onInvite,search,selection,back,confirmLabel,errorLabel,disabled=false}:ChatRoomInviteProps){\n const action=useCompositionAction(disabled),ids=selectedChatRoomMembers(members).map(member=>member.id),blocked=disabled||action.pending;\n return <ScreenLayout title={title} {...(back?{exit:{kind:\"close\" as const,label:back.label,onClick:back.onPress}}:{})}\n actions={<Button tone=\"ghost\" disabled={blocked||ids.length===0} loading={action.pending} onClick={()=>void action.run(\"invite\",()=>onInvite(ids))}>{confirmLabel}</Button>}><Stack gap=\"md\">\n <MemberPicker members={members} title={membersLabel} emptyLabel={emptyLabel} search={search} selection={selection} onSelectionChange={onSelectionChange} disabled={blocked}/>\n {action.failed?<Text role=\"alert\" tone=\"danger\">{errorLabel}</Text>:null}</Stack></ScreenLayout>;\n}\n"]}
@@ -34,7 +34,7 @@ export type ReactRendererEvidenceManifest = Readonly<{
34
34
  export declare const reactRendererEvidence: {
35
35
  readonly schemaVersion: 2;
36
36
  readonly packageName: "@hjmds/react";
37
- readonly packageVersion: "1.44.0";
37
+ readonly packageVersion: "1.45.0";
38
38
  readonly surface: "web";
39
39
  readonly components: Readonly<{
40
40
  /** Canonical component id from the design-contracts catalog. */
package/dist/evidence.js CHANGED
@@ -135,7 +135,7 @@ const activeWebEntries = componentCatalog.filter((entry) => {
135
135
  export const reactRendererEvidence = {
136
136
  schemaVersion: reactRendererEvidenceSchemaVersion,
137
137
  packageName: "@hjmds/react",
138
- packageVersion: "1.44.0",
138
+ packageVersion: "1.45.0",
139
139
  surface: "web",
140
140
  components: activeWebEntries.map(derivedClaim),
141
141
  };
@@ -1 +1 @@
1
- {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ShowcaseScenarioId } from \"@hjmds/design-contracts/showcase\";\nimport { getRequiredShowcaseEvidence } from \"@hjmds/design-contracts/showcase\";\nimport { componentCatalog, componentIdOf, getComponentSurfaceStatus, type ComponentCatalogEntry } from \"@hjmds/design-contracts/catalog\";\nimport { publicExportEntries } from \"./public-exports.generated.js\";\n\nexport const reactRendererEvidenceSchemaVersion = 2 as const;\n\nexport type ReactRendererEvidenceScenario = Exclude<ShowcaseScenarioId, \"contract\" | \"native-actions\">;\n\nexport type ReactRendererEvidenceComponent = Readonly<{\n /** Canonical component id from the design-contracts catalog. */\n componentId: string;\n /** Public symbols that implement this contract on the declared subpath. */\n exportNames: readonly string[];\n /** Granular @hjmds/react export used by consumers. */\n subpath: `./${string}`;\n /** Scenarios supported by automated first-party renderer evidence. */\n scenarios: readonly ReactRendererEvidenceScenario[];\n /** Repository-local executable proof for every claimed scenario. */\n proofs: readonly Readonly<{\n scenarios: readonly ReactRendererEvidenceScenario[];\n file: `test/${string}.test.tsx`;\n caseId: string;\n }>[];\n}>;\n\nexport type ReactRendererEvidenceManifest = Readonly<{\n schemaVersion: typeof reactRendererEvidenceSchemaVersion;\n packageName: \"@hjmds/react\";\n packageVersion: string;\n surface: \"web\";\n components: readonly ReactRendererEvidenceComponent[];\n}>;\n\nconst defaultProofFile = \"test/default-render.ssr.test.tsx\" as const;\nconst matrixProofFile = \"test/scenario-matrix.browser.test.tsx\" as const;\nconst stableCoreProofFile = \"test/stable-core.browser.test.tsx\" as const;\n\ntype ProofFile = `test/${string}.test.tsx`;\n\n/**\n * Scenarios a component does not pass yet. Each entry is promotion debt that\n * the generated evidence projection reports; remove it when the component is\n * fixed and the matrix case passes. Stable surfaces cannot carry a gap\n * (scripts/check-workspace-sync.mjs).\n */\nconst webScenarioGaps: Readonly<Record<string, readonly ReactRendererEvidenceScenario[]>> = {};\n\n/**\n * Proofs that live outside the shared default/matrix files: keyboard behavior in a dedicated browser test,\n * long copy proven inside a portal by the component's own test, or a whole matrix run in a component file.\n * Everything else about a claim derives from the catalog row (2026-10-18 registration input).\n */\ntype ClaimExtras = Readonly<{\n /** Extra proofs; their scenarios are removed from the shared matrix proof. */\n proofs?: readonly Readonly<{ scenarios: readonly ReactRendererEvidenceScenario[]; file: ProofFile }>[];\n /** Hooks or helpers published beside the component symbols on the same subpath. */\n exportNames?: readonly string[];\n}>;\n\nconst keyboard = (file: ProofFile = stableCoreProofFile): ClaimExtras => ({ proofs: [{ scenarios: [\"keyboard\"], file }] });\nconst keyboardAndLongCopy = (file: ProofFile): ClaimExtras => ({ proofs: [{ scenarios: [\"keyboard\", \"long-copy\"], file }] });\n\nconst claimExtras: Readonly<Record<string, ClaimExtras>> = {\n \"time-picker\": keyboard(\"test/time-picker.browser.test.tsx\"),\n \"design-system-provider\": { exportNames: [\"useHjmTheme\"] },\n layout: keyboard(),\n link: keyboard(),\n field: keyboard(),\n \"search-field\": keyboard(),\n \"password-field\": keyboard(),\n \"otp-field\": keyboard(),\n \"number-field\": keyboard(),\n slider: keyboard(),\n form: keyboard(\"test/form.keyboard.browser.test.tsx\"),\n \"date-picker\": keyboard(),\n calendar: keyboard(\"test/calendar.browser.test.tsx\"),\n \"file-picker\": keyboard(\"test/file-picker.keyboard.browser.test.tsx\"),\n checkbox: keyboard(),\n \"checkbox-group\": keyboard(),\n \"radio-group\": keyboard(),\n switch: keyboard(),\n \"segmented-control\": keyboard(),\n chip: keyboard(),\n tabs: keyboard(\"test/tabs.keyboard.browser.test.tsx\"),\n breadcrumb: keyboard(\"test/page-navigation.browser.test.tsx\"),\n pagination: keyboard(\"test/pagination.keyboard.browser.test.tsx\"),\n popover: keyboardAndLongCopy(\"test/popover.browser.test.tsx\"),\n \"side-panel\": keyboardAndLongCopy(\"test/side-panel.browser.test.tsx\"),\n splitter: keyboard(\"test/splitter.browser.test.tsx\"),\n tour: keyboardAndLongCopy(\"test/tour.browser.test.tsx\"),\n tree: keyboard(\"test/tree.browser.test.tsx\"),\n \"transfer-list\": keyboard(\"test/transfer-list.browser.test.tsx\"),\n mentions: keyboard(\"test/mentions.browser.test.tsx\"),\n \"command-palette\": keyboardAndLongCopy(\"test/command-palette.browser.test.tsx\"),\n agreement: keyboard(\"test/agreement.keyboard.browser.test.tsx\"),\n \"toggle-group\": keyboard(),\n \"tags-input\": keyboard(),\n \"skip-nav\": keyboardAndLongCopy(\"test/skip-nav.browser.test.tsx\"),\n sidebar: keyboard(\"test/sidebar.browser.test.tsx\"),\n \"date-range-picker\": keyboard(\"test/date-range.keyboard.browser.test.tsx\"),\n \"auth-provider-button\": keyboard(),\n \"data-table\": keyboard(\"test/data-table.keyboard.browser.test.tsx\"),\n collapsible: keyboard(\"test/collapsible.keyboard.browser.test.tsx\"),\n \"context-menu\": keyboardAndLongCopy(\"test/context-menu.interactions.browser.test.tsx\"),\n menubar: keyboard(\"test/menubar.keyboard.browser.test.tsx\"),\n anchor: keyboard(\"test/anchor.browser.test.tsx\"),\n \"bottom-navigation\": keyboard(\"test/bottom-navigation.keyboard.browser.test.tsx\"),\n \"load-more\": keyboard(\"test/load-more.interactions.browser.test.tsx\"),\n carousel: keyboard(\"test/carousel.browser.test.tsx\"),\n \"floating-action-button\": keyboard(),\n accordion: keyboard(\"test/accordion.keyboard.browser.test.tsx\"),\n \"upload-item\": keyboard(\"test/upload-item.browser.test.tsx\"),\n // ThinkingOrb runs its whole environment matrix in its own file (canvas timing), not in scenario-matrix.\n \"thinking-orb\": { proofs: [{ scenarios: [\"dark\", \"large-text\", \"rtl\", \"reduced-motion\", \"accessibility\"], file: \"test/thinking-orb.browser.test.tsx\" }] },\n \"color-picker\": keyboard(\"test/web-additions.browser.test.tsx\"),\n // SSR proves semantics but cannot catch the close-only row seen in BurnTok.\n // Keep real geometry evidence attached without promoting catalog maturity.\n toast: {\n exportNames: [\"useToast\"],\n proofs: [\n { scenarios: [\"keyboard\"], file: stableCoreProofFile },\n { scenarios: [\"dark\", \"long-copy\", \"large-text\", \"rtl\"], file: \"test/toast-layout.browser.test.tsx\" },\n ],\n },\n select: keyboard(),\n combobox: keyboard(),\n dialog: keyboard(\"test/advanced.browser.test.tsx\"),\n \"alert-dialog\": keyboardAndLongCopy(\"test/alert-dialog.keyboard.browser.test.tsx\"),\n sheet: keyboardAndLongCopy(\"test/sheet-layout.browser.test.tsx\"),\n tooltip: keyboard(\"test/tooltip.browser.test.tsx\"),\n menu: keyboardAndLongCopy(\"test/menu.keyboard.browser.test.tsx\"),\n};\n\nconst exportEntries: Readonly<Record<string, readonly `./${string}`[] | undefined>> = publicExportEntries;\n\n/**\n * One claim per active Web row of the catalog. The subpath is the symbol's canonical granular entry, the export\n * names are the row's own symbol plus the companions published on that entry, and the scenarios are the row's\n * required Web evidence minus recorded gaps. Keyboard is never implied: it comes only from a dedicated proof.\n */\nfunction derivedClaim(entry: ComponentCatalogEntry): ReactRendererEvidenceComponent {\n const componentId = componentIdOf(entry);\n const extras = claimExtras[componentId] ?? {};\n const symbols = entry.name === \"DesignSystemProvider\" ? [\"HjmProvider\"] : [entry.name, ...(entry.companions ?? [])];\n // A row whose own name is not a symbol (Chart) claims through its first published companion.\n const subpath = symbols.map((symbol) => exportEntries[symbol]?.[0]).find((entry) => entry !== undefined);\n if (!subpath) throw new Error(`${entry.name} has no granular @hjmds/react export to claim evidence on`);\n const exportNames = [\n ...symbols.filter((symbol) => exportEntries[symbol]?.includes(subpath)),\n ...(extras.exportNames ?? []),\n ];\n const required = getRequiredShowcaseEvidence(entry).find((evidence) => evidence.surface === \"web\")?.scenarios ?? [];\n const gaps = webScenarioGaps[componentId] ?? [];\n const extraProofs = extras.proofs ?? [];\n const proven = new Set(extraProofs.flatMap((proof) => proof.scenarios));\n const matrix = required.filter((scenario): scenario is ReactRendererEvidenceScenario =>\n scenario !== \"default\" && scenario !== \"keyboard\" && scenario !== \"native-actions\" && scenario !== \"contract\"\n && !gaps.includes(scenario as ReactRendererEvidenceScenario) && !proven.has(scenario as ReactRendererEvidenceScenario));\n const proofs = [\n { scenarios: [\"default\" as const], file: defaultProofFile, caseId: componentId },\n ...(matrix.length === 0 ? [] : [{ scenarios: matrix, file: matrixProofFile, caseId: componentId }]),\n ...extraProofs.map((proof) => ({ ...proof, caseId: componentId })),\n ];\n return {\n componentId,\n exportNames,\n subpath,\n scenarios: proofs.flatMap((proof) => proof.scenarios),\n proofs,\n };\n}\n\nconst activeWebEntries: readonly ComponentCatalogEntry[] = componentCatalog.filter((entry) => {\n const status = getComponentSurfaceStatus(entry, \"web\");\n return status === \"stable\" || status === \"beta\";\n});\n\n/**\n * First-party Web renderer claims. Scenario axes remain fail-closed: the\n * default scenario is an SSR render, the environment and accessibility\n * scenarios are computed-style assertions in scenario-matrix.browser.\n * Keyboard and cross-platform parity remain fail-closed until dedicated\n * interaction or paired-renderer proofs are mapped one-to-one.\n */\nexport const reactRendererEvidence = {\n schemaVersion: reactRendererEvidenceSchemaVersion,\n packageName: \"@hjmds/react\",\n packageVersion: \"1.44.0\",\n surface: \"web\",\n components: activeWebEntries.map(derivedClaim),\n} as const satisfies ReactRendererEvidenceManifest;\n"]}
1
+ {"version":3,"file":"evidence.js","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ShowcaseScenarioId } from \"@hjmds/design-contracts/showcase\";\nimport { getRequiredShowcaseEvidence } from \"@hjmds/design-contracts/showcase\";\nimport { componentCatalog, componentIdOf, getComponentSurfaceStatus, type ComponentCatalogEntry } from \"@hjmds/design-contracts/catalog\";\nimport { publicExportEntries } from \"./public-exports.generated.js\";\n\nexport const reactRendererEvidenceSchemaVersion = 2 as const;\n\nexport type ReactRendererEvidenceScenario = Exclude<ShowcaseScenarioId, \"contract\" | \"native-actions\">;\n\nexport type ReactRendererEvidenceComponent = Readonly<{\n /** Canonical component id from the design-contracts catalog. */\n componentId: string;\n /** Public symbols that implement this contract on the declared subpath. */\n exportNames: readonly string[];\n /** Granular @hjmds/react export used by consumers. */\n subpath: `./${string}`;\n /** Scenarios supported by automated first-party renderer evidence. */\n scenarios: readonly ReactRendererEvidenceScenario[];\n /** Repository-local executable proof for every claimed scenario. */\n proofs: readonly Readonly<{\n scenarios: readonly ReactRendererEvidenceScenario[];\n file: `test/${string}.test.tsx`;\n caseId: string;\n }>[];\n}>;\n\nexport type ReactRendererEvidenceManifest = Readonly<{\n schemaVersion: typeof reactRendererEvidenceSchemaVersion;\n packageName: \"@hjmds/react\";\n packageVersion: string;\n surface: \"web\";\n components: readonly ReactRendererEvidenceComponent[];\n}>;\n\nconst defaultProofFile = \"test/default-render.ssr.test.tsx\" as const;\nconst matrixProofFile = \"test/scenario-matrix.browser.test.tsx\" as const;\nconst stableCoreProofFile = \"test/stable-core.browser.test.tsx\" as const;\n\ntype ProofFile = `test/${string}.test.tsx`;\n\n/**\n * Scenarios a component does not pass yet. Each entry is promotion debt that\n * the generated evidence projection reports; remove it when the component is\n * fixed and the matrix case passes. Stable surfaces cannot carry a gap\n * (scripts/check-workspace-sync.mjs).\n */\nconst webScenarioGaps: Readonly<Record<string, readonly ReactRendererEvidenceScenario[]>> = {};\n\n/**\n * Proofs that live outside the shared default/matrix files: keyboard behavior in a dedicated browser test,\n * long copy proven inside a portal by the component's own test, or a whole matrix run in a component file.\n * Everything else about a claim derives from the catalog row (2026-10-18 registration input).\n */\ntype ClaimExtras = Readonly<{\n /** Extra proofs; their scenarios are removed from the shared matrix proof. */\n proofs?: readonly Readonly<{ scenarios: readonly ReactRendererEvidenceScenario[]; file: ProofFile }>[];\n /** Hooks or helpers published beside the component symbols on the same subpath. */\n exportNames?: readonly string[];\n}>;\n\nconst keyboard = (file: ProofFile = stableCoreProofFile): ClaimExtras => ({ proofs: [{ scenarios: [\"keyboard\"], file }] });\nconst keyboardAndLongCopy = (file: ProofFile): ClaimExtras => ({ proofs: [{ scenarios: [\"keyboard\", \"long-copy\"], file }] });\n\nconst claimExtras: Readonly<Record<string, ClaimExtras>> = {\n \"time-picker\": keyboard(\"test/time-picker.browser.test.tsx\"),\n \"design-system-provider\": { exportNames: [\"useHjmTheme\"] },\n layout: keyboard(),\n link: keyboard(),\n field: keyboard(),\n \"search-field\": keyboard(),\n \"password-field\": keyboard(),\n \"otp-field\": keyboard(),\n \"number-field\": keyboard(),\n slider: keyboard(),\n form: keyboard(\"test/form.keyboard.browser.test.tsx\"),\n \"date-picker\": keyboard(),\n calendar: keyboard(\"test/calendar.browser.test.tsx\"),\n \"file-picker\": keyboard(\"test/file-picker.keyboard.browser.test.tsx\"),\n checkbox: keyboard(),\n \"checkbox-group\": keyboard(),\n \"radio-group\": keyboard(),\n switch: keyboard(),\n \"segmented-control\": keyboard(),\n chip: keyboard(),\n tabs: keyboard(\"test/tabs.keyboard.browser.test.tsx\"),\n breadcrumb: keyboard(\"test/page-navigation.browser.test.tsx\"),\n pagination: keyboard(\"test/pagination.keyboard.browser.test.tsx\"),\n popover: keyboardAndLongCopy(\"test/popover.browser.test.tsx\"),\n \"side-panel\": keyboardAndLongCopy(\"test/side-panel.browser.test.tsx\"),\n splitter: keyboard(\"test/splitter.browser.test.tsx\"),\n tour: keyboardAndLongCopy(\"test/tour.browser.test.tsx\"),\n tree: keyboard(\"test/tree.browser.test.tsx\"),\n \"transfer-list\": keyboard(\"test/transfer-list.browser.test.tsx\"),\n mentions: keyboard(\"test/mentions.browser.test.tsx\"),\n \"command-palette\": keyboardAndLongCopy(\"test/command-palette.browser.test.tsx\"),\n agreement: keyboard(\"test/agreement.keyboard.browser.test.tsx\"),\n \"toggle-group\": keyboard(),\n \"tags-input\": keyboard(),\n \"skip-nav\": keyboardAndLongCopy(\"test/skip-nav.browser.test.tsx\"),\n sidebar: keyboard(\"test/sidebar.browser.test.tsx\"),\n \"date-range-picker\": keyboard(\"test/date-range.keyboard.browser.test.tsx\"),\n \"auth-provider-button\": keyboard(),\n \"data-table\": keyboard(\"test/data-table.keyboard.browser.test.tsx\"),\n collapsible: keyboard(\"test/collapsible.keyboard.browser.test.tsx\"),\n \"context-menu\": keyboardAndLongCopy(\"test/context-menu.interactions.browser.test.tsx\"),\n menubar: keyboard(\"test/menubar.keyboard.browser.test.tsx\"),\n anchor: keyboard(\"test/anchor.browser.test.tsx\"),\n \"bottom-navigation\": keyboard(\"test/bottom-navigation.keyboard.browser.test.tsx\"),\n \"load-more\": keyboard(\"test/load-more.interactions.browser.test.tsx\"),\n carousel: keyboard(\"test/carousel.browser.test.tsx\"),\n \"floating-action-button\": keyboard(),\n accordion: keyboard(\"test/accordion.keyboard.browser.test.tsx\"),\n \"upload-item\": keyboard(\"test/upload-item.browser.test.tsx\"),\n // ThinkingOrb runs its whole environment matrix in its own file (canvas timing), not in scenario-matrix.\n \"thinking-orb\": { proofs: [{ scenarios: [\"dark\", \"large-text\", \"rtl\", \"reduced-motion\", \"accessibility\"], file: \"test/thinking-orb.browser.test.tsx\" }] },\n \"color-picker\": keyboard(\"test/web-additions.browser.test.tsx\"),\n // SSR proves semantics but cannot catch the close-only row seen in BurnTok.\n // Keep real geometry evidence attached without promoting catalog maturity.\n toast: {\n exportNames: [\"useToast\"],\n proofs: [\n { scenarios: [\"keyboard\"], file: stableCoreProofFile },\n { scenarios: [\"dark\", \"long-copy\", \"large-text\", \"rtl\"], file: \"test/toast-layout.browser.test.tsx\" },\n ],\n },\n select: keyboard(),\n combobox: keyboard(),\n dialog: keyboard(\"test/advanced.browser.test.tsx\"),\n \"alert-dialog\": keyboardAndLongCopy(\"test/alert-dialog.keyboard.browser.test.tsx\"),\n sheet: keyboardAndLongCopy(\"test/sheet-layout.browser.test.tsx\"),\n tooltip: keyboard(\"test/tooltip.browser.test.tsx\"),\n menu: keyboardAndLongCopy(\"test/menu.keyboard.browser.test.tsx\"),\n};\n\nconst exportEntries: Readonly<Record<string, readonly `./${string}`[] | undefined>> = publicExportEntries;\n\n/**\n * One claim per active Web row of the catalog. The subpath is the symbol's canonical granular entry, the export\n * names are the row's own symbol plus the companions published on that entry, and the scenarios are the row's\n * required Web evidence minus recorded gaps. Keyboard is never implied: it comes only from a dedicated proof.\n */\nfunction derivedClaim(entry: ComponentCatalogEntry): ReactRendererEvidenceComponent {\n const componentId = componentIdOf(entry);\n const extras = claimExtras[componentId] ?? {};\n const symbols = entry.name === \"DesignSystemProvider\" ? [\"HjmProvider\"] : [entry.name, ...(entry.companions ?? [])];\n // A row whose own name is not a symbol (Chart) claims through its first published companion.\n const subpath = symbols.map((symbol) => exportEntries[symbol]?.[0]).find((entry) => entry !== undefined);\n if (!subpath) throw new Error(`${entry.name} has no granular @hjmds/react export to claim evidence on`);\n const exportNames = [\n ...symbols.filter((symbol) => exportEntries[symbol]?.includes(subpath)),\n ...(extras.exportNames ?? []),\n ];\n const required = getRequiredShowcaseEvidence(entry).find((evidence) => evidence.surface === \"web\")?.scenarios ?? [];\n const gaps = webScenarioGaps[componentId] ?? [];\n const extraProofs = extras.proofs ?? [];\n const proven = new Set(extraProofs.flatMap((proof) => proof.scenarios));\n const matrix = required.filter((scenario): scenario is ReactRendererEvidenceScenario =>\n scenario !== \"default\" && scenario !== \"keyboard\" && scenario !== \"native-actions\" && scenario !== \"contract\"\n && !gaps.includes(scenario as ReactRendererEvidenceScenario) && !proven.has(scenario as ReactRendererEvidenceScenario));\n const proofs = [\n { scenarios: [\"default\" as const], file: defaultProofFile, caseId: componentId },\n ...(matrix.length === 0 ? [] : [{ scenarios: matrix, file: matrixProofFile, caseId: componentId }]),\n ...extraProofs.map((proof) => ({ ...proof, caseId: componentId })),\n ];\n return {\n componentId,\n exportNames,\n subpath,\n scenarios: proofs.flatMap((proof) => proof.scenarios),\n proofs,\n };\n}\n\nconst activeWebEntries: readonly ComponentCatalogEntry[] = componentCatalog.filter((entry) => {\n const status = getComponentSurfaceStatus(entry, \"web\");\n return status === \"stable\" || status === \"beta\";\n});\n\n/**\n * First-party Web renderer claims. Scenario axes remain fail-closed: the\n * default scenario is an SSR render, the environment and accessibility\n * scenarios are computed-style assertions in scenario-matrix.browser.\n * Keyboard and cross-platform parity remain fail-closed until dedicated\n * interaction or paired-renderer proofs are mapped one-to-one.\n */\nexport const reactRendererEvidence = {\n schemaVersion: reactRendererEvidenceSchemaVersion,\n packageName: \"@hjmds/react\",\n packageVersion: \"1.45.0\",\n surface: \"web\",\n components: activeWebEntries.map(derivedClaim),\n} as const satisfies ReactRendererEvidenceManifest;\n"]}
package/dist/styles.css CHANGED
@@ -3973,13 +3973,11 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3973
3973
  .hjm-data-table__table tr[aria-selected="true"] > :is(td, th) { background-color: var(--hjm-color-surface-selected); }
3974
3974
 
3975
3975
  /* Room management (chatRoomRecipe): Telegram/KakaoTalk/WhatsApp hierarchy; canvas and surfaces follow the HJM/product theme. */
3976
- .hjm-chat-room { background:var(--hjm-color-bg); padding:var(--hjm-space-md); }
3977
3976
  .hjm-chat-room__name { text-align:center; overflow-wrap:anywhere; }
3978
- .hjm-chat-room__group { background:var(--hjm-color-surface); padding:var(--hjm-space-md); border-radius:var(--hjm-radius-lg); }
3979
- .hjm-chat-room__group[data-flush="true"] { padding-block:var(--hjm-space-xxs); }
3980
3977
  .hjm-chat-room__heading { display:flex; align-items:baseline; gap:var(--hjm-space-xxs); }
3981
3978
  .hjm-chat-room__tools { display:flex; gap:var(--hjm-space-xs); }
3982
- .hjm-chat-room__tool { flex:1; min-width:0; min-height:64px; border:0; border-radius:var(--hjm-radius-md); padding:var(--hjm-space-xs); background:var(--hjm-color-surface); color:var(--hjm-color-content-brand); cursor:pointer; }
3979
+ .hjm-chat-room__tool { flex:1; min-width:0; min-height:64px; border-radius:var(--hjm-radius-md); padding:var(--hjm-space-xs); background:var(--hjm-color-surface); border:0; color:var(--hjm-color-content-brand); cursor:pointer; }
3980
+ .hjm-chat-room__tool[aria-pressed="true"] { background:var(--hjm-color-surface-selected); border-color:transparent; }
3983
3981
  .hjm-chat-room__tool:disabled { cursor:default; opacity:.6; }
3984
3982
  .hjm-chat-room__add { display:inline-flex; align-items:center; justify-content:center; inline-size:40px; block-size:40px; border-radius:50%; background:color-mix(in srgb,var(--hjm-color-content-brand) 12%,transparent); color:var(--hjm-color-content-brand); }
3985
3983
  .hjm-chat-room__photo { display:block; padding:0; border:0; background:transparent; border-radius:50%; cursor:pointer; color:inherit; }
@@ -3974,13 +3974,11 @@ button.hjm-chat-message__media-item:focus-visible { outline: 2px solid var(--hjm
3974
3974
  .hjm-data-table__table tr[aria-selected="true"] > :is(td, th) { background-color: var(--hjm-color-surface-selected); }
3975
3975
 
3976
3976
  /* Room management (chatRoomRecipe): Telegram/KakaoTalk/WhatsApp hierarchy; canvas and surfaces follow the HJM/product theme. */
3977
- .hjm-chat-room { background:var(--hjm-color-bg); padding:var(--hjm-space-md); }
3978
3977
  .hjm-chat-room__name { text-align:center; overflow-wrap:anywhere; }
3979
- .hjm-chat-room__group { background:var(--hjm-color-surface); padding:var(--hjm-space-md); border-radius:var(--hjm-radius-lg); }
3980
- .hjm-chat-room__group[data-flush="true"] { padding-block:var(--hjm-space-xxs); }
3981
3978
  .hjm-chat-room__heading { display:flex; align-items:baseline; gap:var(--hjm-space-xxs); }
3982
3979
  .hjm-chat-room__tools { display:flex; gap:var(--hjm-space-xs); }
3983
- .hjm-chat-room__tool { flex:1; min-width:0; min-height:64px; border:0; border-radius:var(--hjm-radius-md); padding:var(--hjm-space-xs); background:var(--hjm-color-surface); color:var(--hjm-color-content-brand); cursor:pointer; }
3980
+ .hjm-chat-room__tool { flex:1; min-width:0; min-height:64px; border-radius:var(--hjm-radius-md); padding:var(--hjm-space-xs); background:var(--hjm-color-surface); border:0; color:var(--hjm-color-content-brand); cursor:pointer; }
3981
+ .hjm-chat-room__tool[aria-pressed="true"] { background:var(--hjm-color-surface-selected); border-color:transparent; }
3984
3982
  .hjm-chat-room__tool:disabled { cursor:default; opacity:.6; }
3985
3983
  .hjm-chat-room__add { display:inline-flex; align-items:center; justify-content:center; inline-size:40px; block-size:40px; border-radius:50%; background:color-mix(in srgb,var(--hjm-color-content-brand) 12%,transparent); color:var(--hjm-color-content-brand); }
3986
3984
  .hjm-chat-room__photo { display:block; padding:0; border:0; background:transparent; border-radius:50%; cursor:pointer; color:inherit; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hjmds/react",
3
- "version": "1.44.0",
3
+ "version": "1.45.0",
4
4
  "description": "Accessible React 19 renderers for HJM design contracts.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -623,7 +623,7 @@
623
623
  "THIRD_PARTY_NOTICES.md"
624
624
  ],
625
625
  "peerDependencies": {
626
- "@hjmds/design-contracts": ">=1.44.0 <1.45.0",
626
+ "@hjmds/design-contracts": ">=1.45.0 <1.46.0",
627
627
  "react": ">=19.0.0",
628
628
  "react-dom": ">=19.0.0",
629
629
  "@number-flow/react": "0.6.2",
@@ -661,7 +661,7 @@
661
661
  "@blobatar/react": "2.7.0",
662
662
  "lucide-react": "1.59.0",
663
663
  "vite": "8.3.4",
664
- "@hjmds/design-contracts": "1.44.0"
664
+ "@hjmds/design-contracts": "1.45.0"
665
665
  },
666
666
  "peerDependenciesMeta": {
667
667
  "@number-flow/react": {