@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.
- package/dist/communication.d.ts +11 -8
- package/dist/communication.d.ts.map +1 -1
- package/dist/communication.js +20 -15
- package/dist/communication.js.map +1 -1
- package/dist/evidence.d.ts +1 -1
- package/dist/evidence.js +1 -1
- package/dist/evidence.js.map +1 -1
- package/dist/styles.css +2 -4
- package/dist/styles.layered.css +2 -4
- package/package.json +3 -3
package/dist/communication.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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":"AACA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAsB,KAAK,WAAW,EAAC,KAAK,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACjH,OAAO,
|
|
1
|
+
{"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../src/communication.tsx"],"names":[],"mappings":"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"}
|
package/dist/communication.js
CHANGED
|
@@ -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
|
|
96
|
-
|
|
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: "
|
|
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
|
|
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
|
-
|
|
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(
|
|
133
|
-
|
|
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
|
|
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
|
|
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"]}
|
package/dist/evidence.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
138
|
+
packageVersion: "1.45.0",
|
|
139
139
|
surface: "web",
|
|
140
140
|
components: activeWebEntries.map(derivedClaim),
|
|
141
141
|
};
|
package/dist/evidence.js.map
CHANGED
|
@@ -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
|
|
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; }
|
package/dist/styles.layered.css
CHANGED
|
@@ -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
|
|
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.
|
|
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.
|
|
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.
|
|
664
|
+
"@hjmds/design-contracts": "1.45.0"
|
|
665
665
|
},
|
|
666
666
|
"peerDependenciesMeta": {
|
|
667
667
|
"@number-flow/react": {
|